mirror of
https://github.com/danog/psalm.git
synced 2024-11-30 04:39:00 +01:00
Fix #1417 - store root file path when scanning for manipulations
This commit is contained in:
parent
4ba15ec18d
commit
efbcf7dc5b
@ -96,12 +96,22 @@ class TemplateAnalyzer extends Psalm\Internal\Analyzer\FileAnalyzer
|
|||||||
|
|
||||||
$constructor_id = $class . '::__construct';
|
$constructor_id = $class . '::__construct';
|
||||||
|
|
||||||
$this->project_analyzer->getMethodMutations($constructor_id, $this_context);
|
$this->project_analyzer->getMethodMutations(
|
||||||
|
$constructor_id,
|
||||||
|
$this_context,
|
||||||
|
$this->getRootFilePath(),
|
||||||
|
$this->getRootFileName()
|
||||||
|
);
|
||||||
|
|
||||||
$this_context->vars_in_scope['$this'] = new Type\Union([new Type\Atomic\TNamedObject($class)]);
|
$this_context->vars_in_scope['$this'] = new Type\Union([new Type\Atomic\TNamedObject($class)]);
|
||||||
|
|
||||||
// check the actual method
|
// check the actual method
|
||||||
$this->project_analyzer->getMethodMutations($method_id, $this_context);
|
$this->project_analyzer->getMethodMutations(
|
||||||
|
$method_id,
|
||||||
|
$this_context,
|
||||||
|
$this->getRootFilePath(),
|
||||||
|
$this->getRootFileName()
|
||||||
|
);
|
||||||
|
|
||||||
$view_context = new Context();
|
$view_context = new Context();
|
||||||
$view_context->self = self::VIEW_CLASS;
|
$view_context->self = self::VIEW_CLASS;
|
||||||
|
@ -277,7 +277,12 @@ class FileAnalyzer extends SourceAnalyzer implements StatementsSource
|
|||||||
$class_analyzer_to_examine = $this->class_analyzers_to_analyze[strtolower($fq_class_name)];
|
$class_analyzer_to_examine = $this->class_analyzers_to_analyze[strtolower($fq_class_name)];
|
||||||
} else {
|
} else {
|
||||||
if (!$from_project_analyzer) {
|
if (!$from_project_analyzer) {
|
||||||
$this->project_analyzer->getMethodMutations($method_id, $this_context);
|
$this->project_analyzer->getMethodMutations(
|
||||||
|
$method_id,
|
||||||
|
$this_context,
|
||||||
|
$this->getRootFilePath(),
|
||||||
|
$this->getRootFileName()
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
return;
|
return;
|
||||||
|
@ -810,12 +810,18 @@ class ProjectAnalyzer
|
|||||||
*
|
*
|
||||||
* @return void
|
* @return void
|
||||||
*/
|
*/
|
||||||
public function getMethodMutations($original_method_id, Context $this_context)
|
public function getMethodMutations(
|
||||||
{
|
$original_method_id,
|
||||||
|
Context $this_context,
|
||||||
|
string $root_file_path,
|
||||||
|
string $root_file_name
|
||||||
|
) {
|
||||||
list($fq_class_name) = explode('::', $original_method_id);
|
list($fq_class_name) = explode('::', $original_method_id);
|
||||||
|
|
||||||
$file_analyzer = $this->getFileAnalyzerForClassLike($fq_class_name);
|
$file_analyzer = $this->getFileAnalyzerForClassLike($fq_class_name);
|
||||||
|
|
||||||
|
$file_analyzer->setRootFilePath($root_file_path, $root_file_name);
|
||||||
|
|
||||||
$appearing_method_id = $this->codebase->methods->getAppearingMethodId($original_method_id);
|
$appearing_method_id = $this->codebase->methods->getAppearingMethodId($original_method_id);
|
||||||
|
|
||||||
if (!$appearing_method_id) {
|
if (!$appearing_method_id) {
|
||||||
|
@ -88,7 +88,12 @@ class CallAnalyzer
|
|||||||
$context->initialized_methods[$method_id] = true;
|
$context->initialized_methods[$method_id] = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
$project_analyzer->getMethodMutations($method_id, $context);
|
$project_analyzer->getMethodMutations(
|
||||||
|
$method_id,
|
||||||
|
$context,
|
||||||
|
$source->getRootFilePath(),
|
||||||
|
$source->getRootFileName()
|
||||||
|
);
|
||||||
}
|
}
|
||||||
} elseif ($context->collect_initializations &&
|
} elseif ($context->collect_initializations &&
|
||||||
$context->self &&
|
$context->self &&
|
||||||
@ -186,7 +191,12 @@ class CallAnalyzer
|
|||||||
|
|
||||||
$old_self = $context->self;
|
$old_self = $context->self;
|
||||||
$context->self = $declaring_fq_class_name;
|
$context->self = $declaring_fq_class_name;
|
||||||
$project_analyzer->getMethodMutations($declaring_method_id, $context);
|
$project_analyzer->getMethodMutations(
|
||||||
|
$declaring_method_id,
|
||||||
|
$context,
|
||||||
|
$source->getRootFilePath(),
|
||||||
|
$source->getRootFileName()
|
||||||
|
);
|
||||||
$context->self = $old_self;
|
$context->self = $old_self;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -491,6 +491,54 @@ class IncludeTest extends TestCase
|
|||||||
'hoist_constants' => false,
|
'hoist_constants' => false,
|
||||||
'error_levels' => ['DuplicateClass', 'MissingPropertyType'],
|
'error_levels' => ['DuplicateClass', 'MissingPropertyType'],
|
||||||
],
|
],
|
||||||
|
'functionsDefined' => [
|
||||||
|
'files' => [
|
||||||
|
getcwd() . DIRECTORY_SEPARATOR . 'index.php' => '<?php
|
||||||
|
include "func.php";
|
||||||
|
include "Base.php";
|
||||||
|
include "Child.php";',
|
||||||
|
getcwd() . DIRECTORY_SEPARATOR . 'func.php' => '<?php
|
||||||
|
namespace ns;
|
||||||
|
|
||||||
|
function func(): void {}
|
||||||
|
|
||||||
|
define("ns\\cons", 0);
|
||||||
|
|
||||||
|
cons;',
|
||||||
|
getcwd() . DIRECTORY_SEPARATOR . 'Base.php' => '<?php
|
||||||
|
namespace ns;
|
||||||
|
|
||||||
|
func();
|
||||||
|
|
||||||
|
cons;
|
||||||
|
|
||||||
|
class Base {
|
||||||
|
public function __construct() {}
|
||||||
|
}',
|
||||||
|
getcwd() . DIRECTORY_SEPARATOR . 'Child.php' => '<?php
|
||||||
|
namespace ns;
|
||||||
|
|
||||||
|
func();
|
||||||
|
|
||||||
|
cons;
|
||||||
|
|
||||||
|
class Child extends Base {
|
||||||
|
/**
|
||||||
|
* @var int
|
||||||
|
*/
|
||||||
|
public $x;
|
||||||
|
|
||||||
|
public function __construct() {
|
||||||
|
parent::__construct();
|
||||||
|
|
||||||
|
$this->x = 5;
|
||||||
|
}
|
||||||
|
}',
|
||||||
|
],
|
||||||
|
'files_to_check' => [
|
||||||
|
getcwd() . DIRECTORY_SEPARATOR . 'index.php',
|
||||||
|
],
|
||||||
|
],
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -93,7 +93,12 @@ class MethodMutationTest extends TestCase
|
|||||||
$this->project_analyzer->getCodebase()->scanFiles();
|
$this->project_analyzer->getCodebase()->scanFiles();
|
||||||
$method_context = new Context();
|
$method_context = new Context();
|
||||||
$method_context->collect_mutations = true;
|
$method_context->collect_mutations = true;
|
||||||
$this->project_analyzer->getMethodMutations('FooController::barBar', $method_context);
|
$this->project_analyzer->getMethodMutations(
|
||||||
|
'FooController::barBar',
|
||||||
|
$method_context,
|
||||||
|
'somefile.php',
|
||||||
|
'somefile.php'
|
||||||
|
);
|
||||||
|
|
||||||
$this->assertSame('UserViewData', (string)$method_context->vars_in_scope['$this->user_viewdata']);
|
$this->assertSame('UserViewData', (string)$method_context->vars_in_scope['$this->user_viewdata']);
|
||||||
$this->assertSame('string', (string)$method_context->vars_in_scope['$this->user_viewdata->name']);
|
$this->assertSame('string', (string)$method_context->vars_in_scope['$this->user_viewdata->name']);
|
||||||
@ -131,7 +136,12 @@ class MethodMutationTest extends TestCase
|
|||||||
$this->project_analyzer->getCodebase()->scanFiles();
|
$this->project_analyzer->getCodebase()->scanFiles();
|
||||||
$method_context = new Context();
|
$method_context = new Context();
|
||||||
$method_context->collect_mutations = true;
|
$method_context->collect_mutations = true;
|
||||||
$this->project_analyzer->getMethodMutations('FooController::__construct', $method_context);
|
$this->project_analyzer->getMethodMutations(
|
||||||
|
'FooController::__construct',
|
||||||
|
$method_context,
|
||||||
|
'somefile.php',
|
||||||
|
'somefile.php'
|
||||||
|
);
|
||||||
|
|
||||||
$this->assertSame('Foo', (string)$method_context->vars_in_scope['$this->foo']);
|
$this->assertSame('Foo', (string)$method_context->vars_in_scope['$this->foo']);
|
||||||
}
|
}
|
||||||
@ -168,7 +178,12 @@ class MethodMutationTest extends TestCase
|
|||||||
$this->project_analyzer->getCodebase()->scanFiles();
|
$this->project_analyzer->getCodebase()->scanFiles();
|
||||||
$method_context = new Context();
|
$method_context = new Context();
|
||||||
$method_context->collect_mutations = true;
|
$method_context->collect_mutations = true;
|
||||||
$this->project_analyzer->getMethodMutations('FooController::__construct', $method_context);
|
$this->project_analyzer->getMethodMutations(
|
||||||
|
'FooController::__construct',
|
||||||
|
$method_context,
|
||||||
|
'somefile.php',
|
||||||
|
'somefile.php'
|
||||||
|
);
|
||||||
|
|
||||||
$this->assertSame('Foo', (string)$method_context->vars_in_scope['$this->foo']);
|
$this->assertSame('Foo', (string)$method_context->vars_in_scope['$this->foo']);
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user