module php/reflect/version5/main
imports
php/reflect/version5/php5-environment
php/reflect/version5/function
php/reflect/version5/class
php/reflect/version5/interface
strategies
/**
* Creates a new php-environment and stores it.
* It is assumed that the given document is the main
* AST.
*
* @param Doc, the new to be added.
* @type Document-AST -> PHPEnvironment
*/
init-php5-environment(|doc) =
where(env := <new-php5-environment>)
; fill-php5-environment(|env,doc)
; <set-main-ast(|doc)> env
; set-php5-environment(|env)
; !env
/**
* Fills a given PHP5 environment with the information of
* the given AST. It stores this environment and returns the
* new environment.
*
* @param env The environment to be filled
* @param doc The documents AST to be analyzed
*/
fill-php5-environment(|env,doc) =
<collect-php5-functions(|env)> doc
; <collect-php5-classes(|env)> doc
; <collect-php5-interfaces(|env)> doc
; set-php5-environment(|env)
; !env
/**
* Collects the function declerations from the current AST.
* This does not include the functions declared within classes.
*
* @param PHPEnvironment
*/
collect-php5-functions(|env) =
collect-all-skip-classes(match-php5-function-decl)
; map({ast, fun:
?ast
; fun := <new-php5-function(|ast)>
; <add-function(|fun)> env
})
match-php5-function-decl =
match-function-decl
<+ ?FunctionDecl(_,_,_,MethodBody(_))
<+ ?FunctionDeclRef(_,_,_,MethodBody(_))
/**
* Collects the class declerations of the current AST.
*
* @param PHPEnvironment
*/
collect-php5-classes(|env) =
collect-all(match-php5-class-decl)
; map({ast, class:
?ast
; class := <new-php5-class(|ast)>
; <add-class(|class)> env
})
match-php5-class-decl =
match-class-decl
<+ ?Class(_,_,_,_,_)
/**
* Collects the interface declerations of the current AST.
*
* @param PHP5Environment
*/
collect-php5-interfaces(|env) =
collect-all(match-php5-interfaces-decl)
; map({ast, interface:
?ast
; interface := <new-php5-interface(|ast)>
; <add-interface(|interface)> env
})
match-php5-interfaces-decl =
?InterfaceDecl(_,_,_)
strategies
/**
* Returns the current environment if it is a PHP5
* environment.
*
* @type _ -> PHP5Environment
*/
get-php5-environment =
get-php-environment
;instanceof-PHP5Environment
/**
* Sets the current environment to a PHP5
* environment.
*
* @param env PHP5Environment
*/
set-php5-environment(|env) =
<instanceof-PHP5Environment> env
; set-php-environment(|env)