Php-language-server: TypeError: ... in DefinitionResolver.php:444

Created on 7 Feb 2017  路  6Comments  路  Source: felixfbecker/php-language-server

This issue is similar to #252 but it happens inside the if ($expr instanceof Node\Expr\FuncCall) { logic.

This is the error I get in _DefinitionResolver.php_ when the server is parsing this file:

extensionHost.ts:282 [Extension Host] TypeError: Return value of LanguageServer\DefinitionResolver::resolveExpressionNodeToType() must implement interface phpDocumentor\Reflection\Type, null returned in /Users/bcarreco/.vscode/extensions/felixfbecker.php-intellisense-1.1.1/vendor/felixfbecker/language-server/src/DefinitionResolver.php:444

I was able to fix it by adding this code to that line:

            if (strtolower((string)$def) === 'null') {
                return new Types\Null_;
            }

final changed code:

        if ($expr instanceof Node\Expr\FuncCall) {
            // Find the function definition
            if ($expr->name instanceof Node\Expr) {
                // Cannot get type for dynamic function call
                return new Types\Mixed;
            }
            $fqn = (string)($expr->getAttribute('namespacedName') ?? $expr->name);
            $def = $this->index->getDefinition($fqn, true);
            if (strtolower((string)$def) === 'null') {
                return new Types\Null_;
            }
            if ($def !== null) {
                return $def->type;
            }
        }

Not sure that's the right approach but it fixed the problem.

bug

Most helpful comment

@carmanchris31, I was able to fix this by adding this check before the return $def->type;.

   if ( null === $def->type ) {
         return new Types\Mixed;
   }

The final logic should be something like this:

  if ($def !== null) {
         // CUSTOM.
         if ( null === $def->type ) {
              return new Types\Mixed;
         }
         // 
         return $def->type;
  }

All 6 comments

I've been experiencing this same issue.

```TypeError: Return value of LanguageServer\DefinitionResolver::resolveExpressionNodeToType() must implement interface phpDocumentor\Reflection\Type, null returned in /Users/christopher_carman/.vscode/extensions/felixfbecker.php-intellisense-1.1.3/vendor/felixfbecker/language-server/src/DefinitionResolver.php:445
Stack trace:

0 /Users/christopher_carman/.vscode/extensions/felixfbecker.php-intellisense-1.1.3/vendor/felixfbecker/language-server/src/DefinitionResolver.php(239): LanguageServer\DefinitionResolver->resolveExpressionNodeToType(Object(PhpParser\Node\Expr\FuncCall))

1 /Users/christopher_carman/.vscode/extensions/felixfbecker.php-intellisense-1.1.3/vendor/felixfbecker/language-server/src/NodeVisitor/ReferencesCollector.php(38): LanguageServer\DefinitionResolver->resolveReferenceNodeToFqn(Object(PhpParser\Node\Expr\MethodCall))

2 /Users/christopher_carman/.vscode/extensions/felixfbecker.php-intellisense-1.1.3/vendor/nikic/php-parser/lib/PhpParser/NodeTraverser.php(108): LanguageServer\NodeVisitor\ReferencesCollector->enterNode(Object(PhpParser\Node\Expr\MethodCall))

3 /Users/christopher_carman/.vscode/extensions/felixfbecker.php-intellisense-1.1.3/vendor/nikic/php-parser/lib/PhpParser/NodeTraverser.php(171): PhpParser\NodeTraverser->traverseNode(Object(PhpParser\Node\Stmt\Return_))

4 /Users/christopher_carman/.vscode/extensions/felixfbecker.php-intellisense-1.1.3/vendor/nikic/php-parser/lib/PhpParser/NodeTraverser.php(101): PhpParser\NodeTraverser->traverseArray(Array)

5 /Users/christopher_carman/.vscode/extensions/felixfbecker.php-intellisense-1.1.3/vendor/nikic/php-parser/lib/PhpParser/NodeTraverser.php(120): PhpParser\NodeTraverser->traverseNode(Object(PhpParser\Node\Expr\Closure))

6 /Users/christopher_carman/.vscode/extensions/felixfbecker.php-intellisense-1.1.3/vendor/nikic/php-parser/lib/PhpParser/NodeTraverser.php(171): PhpParser\NodeTraverser->traverseNode(Object(PhpParser\Node\Arg))

7 /Users/christopher_carman/.vscode/extensions/felixfbecker.php-intellisense-1.1.3/vendor/nikic/php-parser/lib/PhpParser/NodeTraverser.php(101): PhpParser\NodeTraverser->traverseArray(Array)

8 /Users/christopher_carman/.vscode/extensions/felixfbecker.php-intellisense-1.1.3/vendor/nikic/php-parser/lib/PhpParser/NodeTraverser.php(171): PhpParser\NodeTraverser->traverseNode(Object(PhpParser\Node\Expr\MethodCall))

9 /Users/christopher_carman/.vscode/extensions/felixfbecker.php-intellisense-1.1.3/vendor/nikic/php-parser/lib/PhpParser/NodeTraverser.php(101): PhpParser\NodeTraverser->traverseArray(Array)

10 /Users/christopher_carman/.vscode/extensions/felixfbecker.php-intellisense-1.1.3/vendor/nikic/php-parser/lib/PhpParser/NodeTraverser.php(171): PhpParser\NodeTraverser->traverseNode(Object(PhpParser\Node\Stmt\ClassMethod))

11 /Users/christopher_carman/.vscode/extensions/felixfbecker.php-intellisense-1.1.3/vendor/nikic/php-parser/lib/PhpParser/NodeTraverser.php(101): PhpParser\NodeTraverser->traverseArray(Array)

12 /Users/christopher_carman/.vscode/extensions/felixfbecker.php-intellisense-1.1.3/vendor/nikic/php-parser/lib/PhpParser/NodeTraverser.php(171): PhpParser\NodeTraverser->traverseNode(Object(PhpParser\Node\Stmt\Class_))

13 /Users/christopher_carman/.vscode/extensions/felixfbecker.php-intellisense-1.1.3/vendor/nikic/php-parser/lib/PhpParser/NodeTraverser.php(85): PhpParser\NodeTraverser->traverseArray(Array)

14 /Users/christopher_carman/.vscode/extensions/felixfbecker.php-intellisense-1.1.3/vendor/felixfbecker/language-server/src/PhpDocument.php(205): PhpParser\NodeTraverser->traverse(Array)

15 /Users/christopher_carman/.vscode/extensions/felixfbecker.php-intellisense-1.1.3/vendor/felixfbecker/language-server/src/PhpDocument.php(119): LanguageServer\PhpDocument->updateContent('

16 /Users/christopher_carman/.vscode/extensions/felixfbecker.php-intellisense-1.1.3/vendor/felixfbecker/language-server/src/PhpDocumentLoader.php(134): LanguageServer\PhpDocument->__construct('file:///Users/c...', '

17 /Users/christopher_carman/.vscode/extensions/felixfbecker.php-intellisense-1.1.3/vendor/felixfbecker/language-server/src/PhpDocumentLoader.php(113): LanguageServer\PhpDocumentLoader->create('file:///Users/c...', '

18 [internal function]: LanguageServer\PhpDocumentLoader->LanguageServer{closure}()

19 /Users/christopher_carman/.vscode/extensions/felixfbecker.php-intellisense-1.1.3/vendor/sabre/event/lib/coroutine.php(70): Generator->send('

20 /Users/christopher_carman/.vscode/extensions/felixfbecker.php-intellisense-1.1.3/vendor/sabre/event/lib/Promise.php(242): SabreEvent{closure}('

21 /Users/christopher_carman/.vscode/extensions/felixfbecker.php-intellisense-1.1.3/vendor/sabre/event/lib/Loop/Loop.php(261): SabreEvent\Promise->SabreEvent{closure}()

22 /Users/christopher_carman/.vscode/extensions/felixfbecker.php-intellisense-1.1.3/vendor/sabre/event/lib/Loop/Loop.php(215): SabreEvent\Loop\Loop->runNextTicks()

23 /Users/christopher_carman/.vscode/extensions/felixfbecker.php-intellisense-1.1.3/vendor/sabre/event/lib/Loop/Loop.php(194): SabreEvent\Loop\Loop->tick(true)

24 /Users/christopher_carman/.vscode/extensions/felixfbecker.php-intellisense-1.1.3/vendor/sabre/event/lib/Loop/functions.php(122): SabreEvent\Loop\Loop->run()

25 /Users/christopher_carman/.vscode/extensions/felixfbecker.php-intellisense-1.1.3/vendor/felixfbecker/language-server/bin/php-language-server.php(102): SabreEvent\Loop\run()

26 {main}d.logExtensionHostMessage @ extensionHost.ts:282(anonymous function) @ extensionHost.ts:137emitTwo @ events.js:106emit @ events.js:191process.nextTick @ internal/child_process.js:744_combinedTickCallback @ internal/process/next_tick.js:67_tickCallback @ internal/process/next_tick.js:98

messageService.ts:126 The PHP Language Server server crashed 5 times in the last 3 minutes. The server will not be restarted.
```

Based on the stack trace, it appears that $def->type is null here: https://github.com/felixfbecker/php-language-server/blob/56bd465bf8012e6b8842439ade7683e639ce8f32/src/DefinitionResolver.php#L445

The file triggering the error appears to be this: https://github.com/laravel/lumen-framework/blob/v5.2.9/tests/FullApplicationTest.php

EDIT: Commented out the contents and indexing completed successfully. That seems to be the only problematic file. Strange.

@carmanchris31, I was able to fix this by adding this check before the return $def->type;.

   if ( null === $def->type ) {
         return new Types\Mixed;
   }

The final logic should be something like this:

  if ($def !== null) {
         // CUSTOM.
         if ( null === $def->type ) {
              return new Types\Mixed;
         }
         // 
         return $def->type;
  }

I had the same problem. Was able to fix it by:

if ($def !== null) { return $def->type ?: new Types\Mixed; }

Then it all work fine. No error lines in the developer's console.

@felixfbecker This bug occurs because define() nodes in the stubs file do not have a type set.
Also, this only seems to happen when the constant is used in an array that is used to initialize a class member.
You can successfuly reproduce the crash with the following code:

class Test {
    private $foo = [PHP_INT_MAX];
}

I would open a PR but I don't know how the stubs file is created.

Awesome find! The stuns file is generated in ComposerScripts.php, but the bug likely is in DefinitionResolver

Hi, shouldn't this bug be closed as the fix has already been merged?

Was this page helpful?
0 / 5 - 0 ratings