src/Server/TextDocument.php
public function references(
        ReferenceContext $context,
        TextDocumentIdentifier $textDocument,
        Position $position
    ): Promise {
        return coroutine(function () use ($textDocument, $position) {
            $document = yield $this->documentLoader->getOrLoad($textDocument->uri);
            $node = $document->getNodeAtPosition($position);
            if ($node === null) {
                return [];
            }
            $locations = [];
            // Variables always stay in the boundary of the file and need to be searched inside their function scope
            // by traversing the AST
            if (

            ($node instanceof Node\Expression\Variable && !($node->getParent()->getParent() instanceof Node\PropertyDeclaration))
                || $node instanceof Node\Parameter
                || $node instanceof Node\UseVariableName
            ) {
                if (isset($node->name) && $node->name instanceof Node\Expression) {
                    return null;
                }
                // Find function/method/closure scope
                $n = $node;

                $n = $n->getFirstAncestor(Node\Statement\FunctionDeclaration::class, Node\MethodDeclaration::class, Node\Expression\AnonymousFunctionCreationExpression::class, Node\SourceFileNode::class);

                if ($n === null) {
                    $n = $node->getFirstAncestor(Node\Statement\ExpressionStatement::class)->getParent();
                }

                foreach ($n->getDescendantNodes() as $descendantNode) {
                    if ($descendantNode instanceof Node\Expression\Variable &&
                        $descendantNode->getName() === $node->getName()
                    ) {
                        $locations[] = LocationFactory::fromNode($descendantNode);
                    }
                }
            } else {
                // Definition with a global FQN
                $fqn = DefinitionResolver::getDefinedFqn($node);

                // Wait until indexing finished
                if (!$this->index->isComplete()) {
                    yield waitForEvent($this->index, 'complete');
                }
                if ($fqn === null) {
                    $fqn = $this->definitionResolver->resolveReferenceNodeToFqn($node);
                    if ($fqn === null) {
                        return [];
                    }
                }
                $refDocumentPromises = [];
                foreach ($this->index->getReferenceUris($fqn) as $uri) {
                    $refDocumentPromises[] = $this->documentLoader->getOrLoad($uri);
                }
                $refDocuments = yield Promise\all($refDocumentPromises);
                foreach ($refDocuments as $document) {
                    $refs = $document->getReferenceNodesByFqn($fqn);
                    if ($refs !== null) {
                        foreach ($refs as $ref) {
                            $locations[] = LocationFactory::fromNode($ref);
                        }
                    }
                }
            }
            return $locations;
        });
    }
public function references(
        ReferenceContext $context,
        TextDocumentIdentifier $textDocument,
        Position $position
    ): Promise {
        return coroutine(function () use ($textDocument, $position) {
            $document = yield $this->documentLoader->getOrLoad($textDocument->uri);
            $node = $document->getNodeAtPosition($position);
            if ($node === null) {
                return [];
            }
            $locations = [];
            // Variables always stay in the boundary of the file and need to be searched inside their function scope
            // by traversing the AST
            if (

            ($node instanceof Node\Expression\Variable && !($node->getParent()->getParent() instanceof Node\PropertyDeclaration))
                || $node instanceof Node\Parameter
                || $node instanceof Node\UseVariableName
            ) {
                if (isset($node->name) && $node->name instanceof Node\Expression) {
                    return null;
                }
                // Find function/method/closure scope
                $n = $node;

                $n = $n->getFirstAncestor(Node\Statement\FunctionDeclaration::class, Node\MethodDeclaration::class, Node\Expression\AnonymousFunctionCreationExpression::class, Node\SourceFileNode::class);

                if ($n === null) {
                    $n = $node->getFirstAncestor(Node\Statement\ExpressionStatement::class)->getParent();
                }

                foreach ($n->getDescendantNodes() as $descendantNode) {
                    if ($descendantNode instanceof Node\Expression\Variable &&
                        $descendantNode->getName() === $node->getName()
                    ) {
                        $locations[] = LocationFactory::fromNode($descendantNode);
                    }
                }
            } else {
                // Definition with a global FQN
                $fqn = DefinitionResolver::getDefinedFqn($node);

                // Wait until indexing finished
                if (!$this->index->isComplete()) {
                    yield waitForEvent($this->index, 'complete');
                }
                if ($fqn === null) {
                    $fqn = $this->definitionResolver->resolveReferenceNodeToFqn($node);
                    if ($fqn === null) {
                        return [];
                    }
                }
                $refDocumentPromises = [];
                foreach ($this->index->getReferenceUris($fqn) as $uri) {
                    $refDocumentPromises[] = $this->documentLoader->getOrLoad($uri);
                }
                $refDocuments = yield Promise\all($refDocumentPromises);
                foreach ($refDocuments as $document) {
                    $refs = $document->getReferenceNodesByFqn($fqn);
                    if ($refs !== null) {
                        foreach ($refs as $ref) {
                            $locations[] = LocationFactory::fromNode($ref);
                        }
                    }
                }
            }
            return $locations;
        });
    }
public function references ( ReferenceContext $ context , TextDocumentIdentifier $ textDocument , Position $ position ) : Promise { return coroutine ( function ( ) use ( $ textDocument , $ position ) { $ document = yield $ this -> documentLoader -> getOrLoad ( $ textDocument -> uri ) ; $ node = $ document -> getNodeAtPosition ( $ position ) ; if ( $ node === null ) { return [ ] ; } $ locations = [ ] ; // Variables always stay in the boundary of the file and need to be searched inside their function scope // by traversing the AST if ( ( $ node instanceof Node \ Expression \ Variable && ! ( $ node -> getParent ( ) -> getParent ( ) instanceof Node \ PropertyDeclaration ) ) || $ node instanceof Node \ Parameter || $ node instanceof Node \ UseVariableName ) { if ( isset ( $ node -> name ) && $ node -> name instanceof Node \ Expression ) { return null ; } // Find function/method/closure scope $ n = $ node ; $ n = $ n -> getFirstAncestor ( Node \ Statement \ FunctionDeclaration :: class , Node \ MethodDeclaration :: class , Node \ Expression \ AnonymousFunctionCreationExpression :: class , Node \ SourceFileNode :: class ) ; if ( $ n === null ) { $ n = $ node -> getFirstAncestor ( Node \ Statement \ ExpressionStatement :: class ) -> getParent ( ) ; } foreach ( $ n -> getDescendantNodes ( ) as $ descendantNode ) { if ( $ descendantNode instanceof Node \ Expression \ Variable && $ descendantNode -> getName ( ) === $ node -> getName ( ) ) { $ locations [ ] = LocationFactory :: fromNode ( $ descendantNode ) ; } } } else { // Definition with a global FQN $ fqn = DefinitionResolver :: getDefinedFqn ( $ node ) ; // Wait until indexing finished if ( ! $ this -> index -> isComplete ( ) ) { yield waitForEvent ( $ this -> index , 'complete' ) ; } if ( $ fqn === null ) { $ fqn = $ this -> definitionResolver -> resolveReferenceNodeToFqn ( $ node ) ; if ( $ fqn === null ) { return [ ] ; } } $ refDocumentPromises = [ ] ; foreach ( $ this -> index -> getReferenceUris ( $ fqn ) as $ uri ) { $ refDocumentPromises [ ] = $ this -> documentLoader -> getOrLoad ( $ uri ) ; } $ refDocuments = yield Promise \ all ( $ refDocumentPromises ) ; foreach ( $ refDocuments as $ document ) { $ refs = $ document -> getReferenceNodesByFqn ( $ fqn ) ; if ( $ refs !== null ) { foreach ( $ refs as $ ref ) { $ locations [ ] = LocationFactory :: fromNode ( $ ref ) ; } } } } return $ locations ; } ) ; }
The references request is sent from the client to the server to resolve project-wide references for the symbol
denoted by the given text document position.

@param ReferenceContext $context
@return Promise <Location[]>
The references request is sent from the client to the server to resolve project - wide references for the symbol denoted by the given text document position .