Skip to content

Commit

Permalink
remove exitFunctions
Browse files Browse the repository at this point in the history
  • Loading branch information
orklah committed Nov 5, 2021
1 parent b783468 commit c990203
Show file tree
Hide file tree
Showing 15 changed files with 0 additions and 144 deletions.
8 changes: 0 additions & 8 deletions config.xsd
Expand Up @@ -16,14 +16,6 @@
<xs:element name="mockClasses" type="MockClassesType" minOccurs="0" maxOccurs="1" />
<xs:element name="stubs" type="StubsType" minOccurs="0" maxOccurs="1" />
<xs:element name="plugins" type="PluginsType" minOccurs="0" maxOccurs="1" />
<xs:element name="exitFunctions" type="ExitFunctionsType" minOccurs="0" maxOccurs="1">
<xs:annotation>
<!-- note: for PHPStorm to mark the attribute as deprecated the doc entry has to be *single line* and start with the word `deprecated` -->
<xs:documentation xml:lang="en">
Deprecated. Replaced by documenting never as a return type. It is going to be removed in Psalm 5.
</xs:documentation>
</xs:annotation>
</xs:element>
<xs:element name="forbiddenFunctions" type="ExitFunctionsType" minOccurs="0" maxOccurs="1" />
<xs:element name="issueHandlers" type="IssueHandlersType" minOccurs="0" maxOccurs="1" />
<xs:element name="ignoreExceptions" type="ExceptionsType" minOccurs="0" maxOccurs="1" />
Expand Down
14 changes: 0 additions & 14 deletions src/Psalm/Config.php
Expand Up @@ -488,13 +488,6 @@ class Config
/** @var ClassLoader|null */
private $composer_class_loader;

/**
* Custom functions that always exit
*
* @var array<lowercase-string, bool>
*/
public $exit_functions = [];

/**
* @var string
*/
Expand Down Expand Up @@ -1059,13 +1052,6 @@ private static function fromXmlAndPaths(
}
}

if (isset($config_xml->exitFunctions) && isset($config_xml->exitFunctions->function)) {
/** @var \SimpleXMLElement $exit_function */
foreach ($config_xml->exitFunctions->function as $exit_function) {
$config->exit_functions[strtolower((string) $exit_function['name'])] = true;
}
}

if (isset($config_xml->stubs) && isset($config_xml->stubs->file)) {
/** @var \SimpleXMLElement $stub_file */
foreach ($config_xml->stubs->file as $stub_file) {
Expand Down
Expand Up @@ -144,7 +144,6 @@ public static function verifyReturnType(
&& ScopeAnalyzer::getControlActions(
$function_stmts,
$type_provider,
$codebase->config->exit_functions,
[]
) !== [ScopeAnalyzer::ACTION_END]
&& !$inferred_yield_types
Expand All @@ -165,7 +164,6 @@ public static function verifyReturnType(
$control_actions = ScopeAnalyzer::getControlActions(
$function_stmts,
$type_provider,
$codebase->config->exit_functions,
[],
false
);
Expand Down
Expand Up @@ -23,8 +23,6 @@ class ReturnTypeCollector
* @return list<Type\Union> a list of return types
*
* @psalm-suppress ComplexMethod to be refactored
*
* TODO: This would probably benefit from using the list of exit_functions
*/
public static function getReturnTypes(
Codebase $codebase,
Expand Down
1 change: 0 additions & 1 deletion src/Psalm/Internal/Analyzer/FunctionLikeAnalyzer.php
Expand Up @@ -501,7 +501,6 @@ public function analyze(
$final_actions = ScopeAnalyzer::getControlActions(
$this->function->getStmts() ?: [],
null,
$codebase->config->exit_functions,
[]
);

Expand Down
37 changes: 0 additions & 37 deletions src/Psalm/Internal/Analyzer/ScopeAnalyzer.php
Expand Up @@ -12,7 +12,6 @@
use function array_values;
use function count;
use function in_array;
use function strtolower;

/**
* @internal
Expand Down Expand Up @@ -65,7 +64,6 @@ public static function doesEverBreak(array $stmts): bool

/**
* @param array<PhpParser\Node> $stmts
* @param array<lowercase-string, bool> $exit_functions
* @param list<'loop'|'switch'> $break_types
* @param bool $return_is_exit Exit and Throw statements are treated differently from return if this is false
*
Expand All @@ -76,7 +74,6 @@ public static function doesEverBreak(array $stmts): bool
public static function getControlActions(
array $stmts,
?\Psalm\Internal\Provider\NodeDataProvider $nodes,
array $exit_functions,
array $break_types,
bool $return_is_exit = true
): array {
Expand Down Expand Up @@ -107,32 +104,6 @@ public static function getControlActions(
return array_values(array_unique(array_merge($control_actions, [self::ACTION_END])));
}

if ($exit_functions) {
if ($stmt->expr instanceof PhpParser\Node\Expr\FuncCall
|| $stmt->expr instanceof PhpParser\Node\Expr\StaticCall
) {
if ($stmt->expr instanceof PhpParser\Node\Expr\FuncCall) {
/** @var string|null */
$resolved_name = $stmt->expr->name->getAttribute('resolvedName');

if ($resolved_name && isset($exit_functions[strtolower($resolved_name)])) {
return array_values(array_unique(array_merge($control_actions, [self::ACTION_END])));
}
} elseif ($stmt->expr->class instanceof PhpParser\Node\Name
&& $stmt->expr->name instanceof PhpParser\Node\Identifier
) {
/** @var string|null */
$resolved_class_name = $stmt->expr->class->getAttribute('resolvedName');

if ($resolved_class_name
&& isset($exit_functions[strtolower($resolved_class_name . '::' . $stmt->expr->name)])
) {
return array_values(array_unique(array_merge($control_actions, [self::ACTION_END])));
}
}
}
}

continue;
}

Expand Down Expand Up @@ -172,7 +143,6 @@ public static function getControlActions(
$if_statement_actions = self::getControlActions(
$stmt->stmts,
$nodes,
$exit_functions,
$break_types,
$return_is_exit
);
Expand All @@ -188,7 +158,6 @@ function ($action) {
? self::getControlActions(
$stmt->else->stmts,
$nodes,
$exit_functions,
$break_types,
$return_is_exit
) : [];
Expand All @@ -209,7 +178,6 @@ function ($action) {
$elseif_control_actions = self::getControlActions(
$elseif->stmts,
$nodes,
$exit_functions,
$break_types,
$return_is_exit
);
Expand Down Expand Up @@ -266,7 +234,6 @@ function ($action) {
$case_actions = self::getControlActions(
$case->stmts,
$nodes,
$exit_functions,
array_merge($break_types, ['switch']),
$return_is_exit
);
Expand Down Expand Up @@ -332,7 +299,6 @@ function ($action) {
$loop_actions = self::getControlActions(
$stmt->stmts,
$nodes,
$exit_functions,
array_merge($break_types, ['loop']),
$return_is_exit
);
Expand Down Expand Up @@ -391,7 +357,6 @@ function ($action) {
$try_statement_actions = self::getControlActions(
$stmt->stmts,
$nodes,
$exit_functions,
$break_types,
$return_is_exit
);
Expand All @@ -412,7 +377,6 @@ function ($action) {
$catch_actions = self::getControlActions(
$catch->stmts,
$nodes,
$exit_functions,
$break_types,
$return_is_exit
);
Expand Down Expand Up @@ -452,7 +416,6 @@ function ($action) {
$finally_statement_actions = self::getControlActions(
$stmt->finally->stmts,
$nodes,
$exit_functions,
$break_types,
$return_is_exit
);
Expand Down
Expand Up @@ -152,7 +152,6 @@ public static function analyze(
? ScopeAnalyzer::getControlActions(
$else->stmts,
$statements_analyzer->node_data,
$codebase->config->exit_functions,
[]
)
: [ScopeAnalyzer::ACTION_NONE];
Expand Down
Expand Up @@ -308,7 +308,6 @@ function (array $carry, Clause $clause): array {
$final_actions = ScopeAnalyzer::getControlActions(
$elseif->stmts,
$statements_analyzer->node_data,
$codebase->config->exit_functions,
[]
);
// has a return/throw at end
Expand Down
Expand Up @@ -69,7 +69,6 @@ public static function analyze(
$final_actions = ScopeAnalyzer::getControlActions(
$stmt->stmts,
$statements_analyzer->node_data,
$codebase->config->exit_functions,
[]
);

Expand Down
Expand Up @@ -76,7 +76,6 @@ public static function analyze(
$final_actions = ScopeAnalyzer::getControlActions(
$stmt->stmts,
null,
$codebase->config->exit_functions,
[]
);

Expand Down
2 changes: 0 additions & 2 deletions src/Psalm/Internal/Analyzer/Statements/Block/LoopAnalyzer.php
Expand Up @@ -3,7 +3,6 @@

use PhpParser;
use Psalm\CodeLocation;
use Psalm\Config;
use Psalm\Context;
use Psalm\Internal\Algebra;
use Psalm\Internal\Algebra\FormulaGenerator;
Expand Down Expand Up @@ -90,7 +89,6 @@ public static function analyze(
$final_actions = ScopeAnalyzer::getControlActions(
$stmts,
$statements_analyzer->node_data,
Config::getInstance()->exit_functions,
[]
);

Expand Down
Expand Up @@ -65,16 +65,13 @@ public static function analyze(

$case_action_map = [];

$config = \Psalm\Config::getInstance();

// create a map of case statement -> ultimate exit type
for ($i = count($stmt->cases) - 1; $i >= 0; --$i) {
$case = $stmt->cases[$i];

$case_actions = $case_action_map[$i] = ScopeAnalyzer::getControlActions(
$case->stmts,
$statements_analyzer->node_data,
$config->exit_functions,
['switch']
);

Expand Down
3 changes: 0 additions & 3 deletions src/Psalm/Internal/Analyzer/Statements/Block/TryAnalyzer.php
Expand Up @@ -49,7 +49,6 @@ public static function analyze(
$catch_actions[$i] = ScopeAnalyzer::getControlActions(
$catch->stmts,
$statements_analyzer->node_data,
$codebase->config->exit_functions,
[]
);
$all_catches_leave = $all_catches_leave && !in_array(ScopeAnalyzer::ACTION_NONE, $catch_actions[$i], true);
Expand Down Expand Up @@ -102,7 +101,6 @@ public static function analyze(
$try_block_control_actions = ScopeAnalyzer::getControlActions(
$stmt->stmts,
$statements_analyzer->node_data,
$codebase->config->exit_functions,
[]
);

Expand Down Expand Up @@ -358,7 +356,6 @@ function (string $fq_catch_class) use ($codebase): \Psalm\Type\Atomic\TNamedObje
$catch_actions[$i] = ScopeAnalyzer::getControlActions(
$catch->stmts,
$statements_analyzer->node_data,
$codebase->config->exit_functions,
[]
);

Expand Down
Expand Up @@ -282,7 +282,6 @@ public function start(PhpParser\Node\FunctionLike $stmt, bool $fake_method = fal
$final_actions = \Psalm\Internal\Analyzer\ScopeAnalyzer::getControlActions(
$function_stmt->stmts,
null,
$this->config->exit_functions,
[],
false
);
Expand Down
67 changes: 0 additions & 67 deletions tests/Config/ConfigTest.php
Expand Up @@ -860,73 +860,6 @@ class MyMockClass {}
$this->analyzeFile($file_path, new Context());
}

public function testExitFunctions(): void
{
$this->project_analyzer = $this->getProjectAnalyzerWithConfig(
TestConfig::loadFromXML(
dirname(__DIR__, 2),
'<?xml version="1.0"?>
<psalm>
<exitFunctions>
<function name="leave" />
<function name="Foo\namespacedLeave" />
<function name="Foo\Bar::staticLeave" />
</exitFunctions>
</psalm>'
)
);

$file_path = getcwd() . '/src/somefile.php';

$this->addFile(
$file_path,
'<?php
namespace {
function leave() : void {
exit();
}
function mightLeave() : string {
if (rand(0, 1)) {
leave();
} else {
return "here";
}
}
function mightLeaveWithNamespacedFunction() : string {
if (rand(0, 1)) {
\Foo\namespacedLeave();
} else {
return "here";
}
}
function mightLeaveWithStaticMethod() : string {
if (rand(0, 1)) {
Foo\Bar::staticLeave();
} else {
return "here";
}
}
}
namespace Foo {
function namespacedLeave() : void {
exit();
}
class Bar {
public static function staticLeave() : void {
exit();
}
}
}'
);

$this->analyzeFile($file_path, new Context());
}

public function testValidThrowInvalidCatch(): void
{
$this->expectExceptionMessage('InvalidCatch');
Expand Down

0 comments on commit c990203

Please sign in to comment.