diff --git a/src/PhpDocument.php b/src/PhpDocument.php index 00face9..f99b17d 100644 --- a/src/PhpDocument.php +++ b/src/PhpDocument.php @@ -350,6 +350,11 @@ class PhpDocument } return (string)$class->namespacedName . '::' . $node->name; } + } else if ($node instanceof Node\Expr\FuncCall && $node->name instanceof Node\Name && (string)$node->name === 'define') { + if (!isset($node->args[0]) || !($node->args[0]->value instanceof Node\Scalar\String_)) { + return null; + } + return (string)$node->args[0]->value->value; } } diff --git a/src/Protocol/SymbolInformation.php b/src/Protocol/SymbolInformation.php index ee88176..a8962c5 100644 --- a/src/Protocol/SymbolInformation.php +++ b/src/Protocol/SymbolInformation.php @@ -58,13 +58,25 @@ class SymbolInformation Node\Stmt\PropertyProperty::class => SymbolKind::FIELD, Node\Const_::class => SymbolKind::CONSTANT ]; - $class = get_class($node); - if (!isset($nodeSymbolKindMap[$class])) { - throw new Exception("Not a declaration node: $class"); - } $symbol = new self; - $symbol->kind = $nodeSymbolKindMap[$class]; - $symbol->name = (string)$node->name; + if ( + $node instanceof Node\Expr\FuncCall + && $node->name instanceof Node\Name + && (string)$node->name === 'define' + && isset($node->args[0]) + && $node->args[0]->value instanceof Node\Scalar\String_ + ) { + // define() constant + $symbol->kind = SymbolKind::CONSTANT; + $symbol->name = (string)$node->args[0]->value->value; + } else { + $class = get_class($node); + if (!isset($nodeSymbolKindMap[$class])) { + throw new Exception("Not a declaration node: $class"); + } + $symbol->kind = $nodeSymbolKindMap[$class]; + $symbol->name = (string)$node->name; + } $symbol->location = Location::fromNode($node); if ($fqn !== null) { $parts = preg_split('/(::|\\\\)/', $fqn);