1
0
mirror of https://github.com/danog/psalm.git synced 2024-12-02 09:37:59 +01:00
psalm/lib/FunctionChecker.php

106 lines
3.1 KiB
PHP
Raw Normal View History

2016-01-08 00:28:27 +01:00
<?php
2016-01-08 00:36:55 +01:00
namespace CodeInspector;
2016-01-08 00:28:27 +01:00
ini_set('xdebug.max_nesting_level', 500);
2016-01-08 00:36:55 +01:00
use \PhpParser;
2016-01-08 00:28:27 +01:00
class FunctionChecker implements StatementsSource
2016-01-08 00:28:27 +01:00
{
protected $_function;
protected $_aliased_classes = [];
protected $_namespace;
protected $_file_name;
2016-01-11 23:18:19 +01:00
protected $_is_static = false;
protected $_absolute_class;
protected $_statements_checker;
protected $_function_params = [];
protected $_function_return_types = [];
2016-01-08 00:28:27 +01:00
public function __construct(PhpParser\Node\FunctionLike $function, StatementsSource $source)
2016-01-08 00:28:27 +01:00
{
$this->_function = $function;
$this->_aliased_classes = $source->getAliasedClasses();
$this->_namespace = $source->getNamespace();
$this->_class_name = $source->getClassName();
$this->_class_extends = $source->getClassExtends();
$this->_file_name = $source->getFileName();
$this->_absolute_class = $source->getAbsoluteClass();
2016-01-11 20:21:29 +01:00
$this->_statements_checker = new StatementsChecker($this, substr($this->_file_name, -4) === '.php');
2016-01-08 00:28:27 +01:00
if ($function instanceof PhpParser\Node\Stmt\ClassMethod) {
$this->_statements_checker->registerMethod($function);
2016-01-11 23:18:19 +01:00
$this->_is_static = $function->isStatic();
2016-01-08 00:28:27 +01:00
}
}
2016-01-09 00:30:51 +01:00
public function check($extra_scope_vars = [])
2016-01-08 00:28:27 +01:00
{
if ($this->_function->stmts) {
$vars_in_scope = $extra_scope_vars;
$vars_possibly_in_scope = $extra_scope_vars;
foreach ($this->_function->params as $param) {
if ($param->type) {
if (is_object($param->type)) {
if (!in_array($param->type->parts[0], ['self', 'parent'])) {
ClassChecker::checkClassName($param->type, $this->_namespace, $this->_aliased_classes, $this->_file_name);
2016-01-09 00:30:51 +01:00
}
}
2016-01-11 17:38:02 +01:00
}
2016-01-11 17:05:24 +01:00
$vars_in_scope[$param->name] = true;
$vars_possibly_in_scope[$param->name] = true;
$this->_statements_checker->registerVariable($param->name, $param->getLine());
2016-01-11 15:27:34 +01:00
if ($param->type && is_object($param->type)) {
$vars_in_scope[$param->name] =
$param->type->parts === ['self'] ?
$this->_absolute_class :
ClassChecker::getAbsoluteClassFromName($param->type, $this->_namespace, $this->_aliased_classes);
2016-01-11 15:27:34 +01:00
}
}
2016-01-08 05:40:29 +01:00
$this->_statements_checker->check($this->_function->stmts, $vars_in_scope, $vars_possibly_in_scope);
2016-01-08 05:40:29 +01:00
}
2016-01-08 00:28:27 +01:00
}
public function getNamespace()
2016-01-08 00:28:27 +01:00
{
return $this->_namespace;
2016-01-08 00:28:27 +01:00
}
public function getAliasedClasses()
2016-01-08 00:28:27 +01:00
{
return $this->_aliased_classes;
2016-01-08 00:28:27 +01:00
}
public function getAbsoluteClass()
2016-01-08 00:28:27 +01:00
{
return $this->_absolute_class;
2016-01-08 00:28:27 +01:00
}
public function getClassName()
2016-01-08 00:28:27 +01:00
{
return $this->_class_name;
2016-01-08 00:28:27 +01:00
}
public function getClassExtends()
2016-01-08 00:28:27 +01:00
{
return $this->_class_extends;
2016-01-08 00:28:27 +01:00
}
public function getFileName()
2016-01-08 00:28:27 +01:00
{
return $this->_file_name;
2016-01-08 00:28:27 +01:00
}
public function isStatic()
2016-01-08 00:28:27 +01:00
{
return $this->_is_static;
2016-01-08 00:28:27 +01:00
}
}