mirror of
https://github.com/danog/psalm.git
synced 2024-12-02 09:37:59 +01:00
When calling magic method clone node info
This commit is contained in:
parent
ae10e6c130
commit
96c4eeec98
@ -701,6 +701,8 @@ class MethodCallAnalyzer extends \Psalm\Internal\Analyzer\Statements\Expression\
|
||||
|
||||
$args = $stmt->args;
|
||||
|
||||
$old_node_data = null;
|
||||
|
||||
if (!$codebase->methods->methodExists(
|
||||
$method_id,
|
||||
$context->calling_method_id,
|
||||
@ -821,6 +823,9 @@ class MethodCallAnalyzer extends \Psalm\Internal\Analyzer\Statements\Expression\
|
||||
$args
|
||||
);
|
||||
|
||||
$old_node_data = $statements_analyzer->node_data;
|
||||
$statements_analyzer->node_data = clone $statements_analyzer->node_data;
|
||||
|
||||
$args = [
|
||||
new PhpParser\Node\Arg(new PhpParser\Node\Scalar\String_($method_name_lc)),
|
||||
new PhpParser\Node\Arg(new PhpParser\Node\Expr\Array_($array_values)),
|
||||
@ -1406,6 +1411,10 @@ class MethodCallAnalyzer extends \Psalm\Internal\Analyzer\Statements\Expression\
|
||||
}
|
||||
}
|
||||
|
||||
if ($old_node_data) {
|
||||
$statements_analyzer->node_data = $old_node_data;
|
||||
}
|
||||
|
||||
if (!$args && $lhs_var_id) {
|
||||
if ($config->memoize_method_calls) {
|
||||
$method_var_id = $lhs_var_id . '->' . $method_name_lc . '()';
|
||||
|
52
src/Psalm/spl_object_id.php
Normal file
52
src/Psalm/spl_object_id.php
Normal file
@ -0,0 +1,52 @@
|
||||
<?php declare(strict_types=1);
|
||||
|
||||
/**
|
||||
* PHP Polyfill for spl_object_id() for PHP <= 7.1
|
||||
* This file will be included even in releases which will analyze PHP 7.2,
|
||||
* there aren't any major compatibilities preventing analysis of PHP 7.2 from running in PHP 7.1.
|
||||
*/
|
||||
if (!function_exists('spl_object_id')) {
|
||||
if (function_exists('runkit_object_id') &&
|
||||
!(new ReflectionFunction('runkit_object_id'))->isUserDefined()) {
|
||||
/**
|
||||
* See https://github.com/runkit7/runkit_object_id for a faster native version for php <= 7.1
|
||||
*
|
||||
* @param object $object
|
||||
* @return int The object id
|
||||
*/
|
||||
function spl_object_id($object) : int
|
||||
{
|
||||
return runkit_object_id($object);
|
||||
}
|
||||
} elseif (PHP_INT_SIZE === 8) {
|
||||
/**
|
||||
* See https://github.com/runkit7/runkit_object_id for a faster native version for php <= 7.1
|
||||
*
|
||||
* @param object $object
|
||||
* @return int (The object id, XORed with a random number)
|
||||
*/
|
||||
function spl_object_id($object) : int
|
||||
{
|
||||
$hash = spl_object_hash($object);
|
||||
// Fit this into a php long (32-bit or 64-bit signed int).
|
||||
// The first 16 hex digits (64 bytes) vary, the last 16 don't.
|
||||
// Values are usually padded with 0s at the front.
|
||||
return intval(substr($hash, 1, 15), 16);
|
||||
}
|
||||
} else {
|
||||
/**
|
||||
* See https://github.com/runkit7/runkit_object_id for a faster native version for php <= 7.1
|
||||
*
|
||||
* @param object $object
|
||||
* @return int (The object id, XORed with a random number)
|
||||
*/
|
||||
function spl_object_id($object) : int
|
||||
{
|
||||
$hash = spl_object_hash($object);
|
||||
// Fit this into a php long (32-bit or 64-bit signed int).
|
||||
// The first 16 hex digits (64 bytes) vary, the last 16 don't.
|
||||
// Values are usually padded with 0s at the front.
|
||||
return intval(substr($hash, 9, 7), 16);
|
||||
}
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue
Block a user