From d8b0858166055c47e3df5efedf2a395e7fb7cb69 Mon Sep 17 00:00:00 2001 From: Felix Becker Date: Fri, 14 Oct 2016 01:10:44 +0200 Subject: [PATCH] Add support for constants with define() --- src/PhpDocument.php | 5 +++++ src/Protocol/SymbolInformation.php | 24 ++++++++++++++++++------ 2 files changed, 23 insertions(+), 6 deletions(-) diff --git a/src/PhpDocument.php b/src/PhpDocument.php index fe9a1a2..b09719c 100644 --- a/src/PhpDocument.php +++ b/src/PhpDocument.php @@ -326,6 +326,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 461b430..8aa104d 100644 --- a/src/Protocol/SymbolInformation.php +++ b/src/Protocol/SymbolInformation.php @@ -58,13 +58,25 @@ class SymbolInformation Node\Stmt\PropertyProperty::class => SymbolKind::PROPERTY, 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);