1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
|
<?php
require_once 'abstract_weaver.class.php';
class CakePHPWeaver extends AbstractWeaver {
public function detectFramework($sourcetree_rootpath) {
//FIXME : there is other cases to cover
$entrypoint_path=$sourcetree_rootpath.'/app/webroot/index.php';
assert('is_readable($entrypoint_path)');
$entrypoint_ast=$this->parseAndWalk($entrypoint_path, null);
//echo $this->nodeDumper->dump($entrypoint_ast);
$magics=array('__FILE__' => $entrypoint_path);
$fw_props=$this->staticEvalDefine($entrypoint_ast, $magics);
if (!is_array($fw_props)) throw new Exception("No properties found in '$entrypoint_path'");
// print_r($fw_props);
$required=array('ROOT','APP_DIR','CAKE_CORE_INCLUDE_PATH','WEBROOT_DIR', 'WWW_ROOT');
$missing=array_diff($required, array_keys($fw_props));
// print_r($missing);
assert('count($missing)===0;');
return array_merge(array('entrypoint_path' => $entrypoint_path), $fw_props);
}
public function parseFrameworkConfig($fw_props) {
return array();
}
public function parseFrameworkCode($fw_props, $fw_conf, $cache_path) {
$filelist=$this->findAllFiles($fw_props['CAKE_CORE_INCLUDE_PATH'], '/(\.php|\.ctp)$/', '/^\.svn$/');
//print_r($filelist);
$env=$fw_props; //TODO : More things here ?
foreach ($filelist as $f) {
$cache_filepath=$cache_path . "/" . sha1($f) . "-" . substr(sha1(print_r($env,true)),-8,8) . ".ast";
// If the cache is already up to date, skip parsing
if ( $stat_cache=stat($cache_filepath) ) {
$stat_source=stat($f);
if ($stat_cache['mtime'] >= $stat_source['mtime'] ) continue;
}
$ast=$this->parseAndWalk($f, null, $env);
$this->serializeAST($ast, $f, $cache_filepath);
}
}
public function parseApplicationCode($fw_props, $fw_conf, $fw_extra, $cache_path) {
}
public function computePageList($fw_props, $fw_conf, $fw_extra, $app_extra) {
return array(
'page1' => array(),
'page2' => array(),
);
}
public function outputMappingFile($app_pages, $result_path) {
}
public function makePageFullAST($page, $page_props, $fw_props, $fw_conf, $fw_extra, $app_extra, $cache_path) {
}
public function analysePageAST($page_full_ast, $page, $page_props, $fw_props, $fw_conf, $fw_extra, $app_extra, $cache_path) {
}
public function throwDeadCode(&$page_annotated_ast) {
}
public function weaveCode($page_annotated_ast) {
return array(new PHPParser_Node_Stmt_Echo(array(new PHPParser_Node_Scalar_String("Hello World\n"))));
}
}
?>
|