예제 #1
0
        public async Task <LocationOrLocationLinks> Handle(DefinitionParams request, CancellationToken token)
        {
            var(document, position) = _workspace.GetLogicalDocument(request);

            var goToDefinitionService = document.GetLanguageService <IGoToDefinitionService>();
            var definitions           = await goToDefinitionService.FindDefinitionsAsync(document, position, token);

            // TODO: Handle spans within embedded HLSL blocks; the TextSpan is currently relative to the start of the embedded block.

            var locations = new List <LocationOrLocationLink>();

            foreach (var definition in definitions)
            {
                var documentSpan = definition.SourceSpans[0];
                var sourceSpan   = documentSpan.SourceSpan;
                locations.Add(new Location
                {
                    Uri   = Helpers.ToUri(sourceSpan.File.FilePath),
                    Range = sourceSpan.IsInRootFile
                        ? Helpers.ToRange(document.SourceText, sourceSpan.Span)
                        : Helpers.ToRange(sourceSpan.File.Text, sourceSpan.Span)
                });
            }

            return(locations);
        }
        public async Task <LocationOrLocationLinks> Handle(DefinitionParams request, CancellationToken cancellationToken)
        {
            ScriptFile scriptFile =
                _workspaceService.GetFile(
                    request.TextDocument.Uri.ToString());

            SymbolReference foundSymbol =
                _symbolsService.FindSymbolAtLocation(
                    scriptFile,
                    (int)request.Position.Line + 1,
                    (int)request.Position.Character + 1);

            List <LocationOrLocationLink> definitionLocations = new List <LocationOrLocationLink>();

            if (foundSymbol != null)
            {
                SymbolReference foundDefinition = await _symbolsService.GetDefinitionOfSymbolAsync(
                    scriptFile,
                    foundSymbol);

                if (foundDefinition != null)
                {
                    definitionLocations.Add(
                        new LocationOrLocationLink(
                            new Location
                    {
                        Uri   = PathUtils.ToUri(foundDefinition.FilePath),
                        Range = GetRangeFromScriptRegion(foundDefinition.ScriptRegion)
                    }));
                }
            }

            return(new LocationOrLocationLinks(definitionLocations));
        }
예제 #3
0
        public override Task <LocationOrLocationLinks> Handle(DefinitionParams request, CancellationToken cancellationToken)
        {
            var context = this.compilationManager.GetCompilation(request.TextDocument.Uri);

            if (context is null)
            {
                return(Task.FromResult(new LocationOrLocationLinks()));
            }
            var result = this.symbolResolver.ResolveSymbol(request.TextDocument.Uri, request.Position);

            // No parent Symbol: ad hoc syntax matching
            if (result is null)
            {
                return(HandleUnboundSymbolLocationAsync(request, context));
            }
            // Declared symbols: go to definition
            else if (result.Symbol is DeclaredSymbol declaration)
            {
                return(HandleDeclaredDefinitionLocationAsync(request, result, declaration));
            }
            // Object property: currently only used for module param goto
            else if (result.Origin is ObjectPropertySyntax objectPropertySyntax)
            {
                return(HandleObjectPropertyLocationAsync(request, result, context));
            }
            // Used for module (name), variable or resource property access
            else if (result.Symbol is PropertySymbol)
            {
                return(HandlePropertyLocationAsync(request, result, context));
            }
            return(Task.FromResult(new LocationOrLocationLinks()));
        }
        public override Task <LocationOrLocationLinks> Handle(DefinitionParams request, CancellationToken cancellationToken)
        {
            DafnyDocument?document;

            if (!_documents.TryGetDocument(request.TextDocument, out document))
            {
                _logger.LogWarning("location requested for unloaded document {}", request.TextDocument.Uri);
                return(Task.FromResult(new LocationOrLocationLinks()));
            }
            ILocalizableSymbol?symbol;

            if (!document.SymbolTable.TryGetSymbolAt(request.Position, out symbol))
            {
                _logger.LogDebug("no symbol was found at {} in {}", request.Position, request.TextDocument);
                return(Task.FromResult(new LocationOrLocationLinks()));
            }
            var location = GetLspLocation(document, symbol);

            if (!location.HasValue)
            {
                _logger.LogDebug("failed to resolve the location of the symbol {} at {} in {}", symbol.Name, request.Position, request.TextDocument);
                return(Task.FromResult(new LocationOrLocationLinks()));
            }
            return(Task.FromResult <LocationOrLocationLinks>(new[] { location.Value }));
        }
        protected virtual PXFieldState[] GetSlot(string name, DefinitionParams definitionParams, Type[] tables)
        {
            Definition def = PXDatabase.GetSlot <Definition, DefinitionParams>(
                name, definitionParams, tables);

            return(def == null ? null : def.Fields);
        }
        public override async Task <LocationOrLocationLinks> Handle(DefinitionParams request, CancellationToken cancellationToken)
        {
            ScriptFile scriptFile = _workspaceService.GetFile(request.TextDocument.Uri);

            SymbolReference foundSymbol =
                SymbolsService.FindSymbolAtLocation(
                    scriptFile,
                    request.Position.Line + 1,
                    request.Position.Character + 1);

            List <LocationOrLocationLink> definitionLocations = new List <LocationOrLocationLink>();

            if (foundSymbol != null)
            {
                SymbolReference foundDefinition = await _symbolsService.GetDefinitionOfSymbolAsync(
                    scriptFile,
                    foundSymbol).ConfigureAwait(false);

                if (foundDefinition != null)
                {
                    definitionLocations.Add(
                        new LocationOrLocationLink(
                            new Location
                    {
                        Uri   = DocumentUri.From(foundDefinition.FilePath),
                        Range = GetRangeFromScriptRegion(foundDefinition.ScriptRegion)
                    }));
                }
            }

            return(new LocationOrLocationLinks(definitionLocations));
        }
예제 #7
0
        public Task <LocationOrLocationLinks> Handle(DefinitionParams request, CancellationToken cancellationToken)
        {
            var doc = bufferManager.GetBuffer(request.TextDocument.Uri.AbsolutePath);

            if (doc == null)
            {
                return(Task.FromResult <LocationOrLocationLinks>(null));
            }
            var identifier = doc.GetWordRangeAtPosition(request.Position);
            var symbol     = documentsManager.LookupSymbol(identifier);

            if (symbol == null || symbol.Source == null || symbol.Source.LocalPath.Contains("DaedalusBuiltins"))
            {
                return(Task.FromResult <LocationOrLocationLinks>(null));
            }

            var symbolStart = new Position(symbol.Line - 1, symbol.Column);
            var symbolEnd   = new Position(symbol.Line - 1, symbol.Column + symbol.Name.Length);

            var result = new LocationOrLocationLinks(new LocationOrLocationLink(new LocationLink
            {
                TargetRange          = new OmniSharp.Extensions.LanguageServer.Protocol.Models.Range(symbolStart, symbolEnd),
                TargetSelectionRange = new OmniSharp.Extensions.LanguageServer.Protocol.Models.Range(symbolStart, symbolEnd),
                TargetUri            = new Uri(symbol.Source.AbsoluteUri),
            }));

            return(Task.FromResult(result));
        }
예제 #8
0
        public override Task <LocationOrLocationLinks> Handle(DefinitionParams request, CancellationToken cancellationToken)
        {
            var result = this.symbolResolver.ResolveSymbol(request.TextDocument.Uri, request.Position);

            if (result == null)
            {
                return(Task.FromResult(new LocationOrLocationLinks()));
            }

            if (result.Symbol is PropertySymbol)
            {
                // TODO: Implement for PropertySymbol
                return(Task.FromResult(new LocationOrLocationLinks()));
            }

            if (result.Symbol is DeclaredSymbol declaration)
            {
                return(Task.FromResult(new LocationOrLocationLinks(new LocationOrLocationLink(new LocationLink
                {
                    // source of the link
                    OriginSelectionRange = result.Origin.ToRange(result.Context.LineStarts),
                    TargetUri = request.TextDocument.Uri,

                    // entire span of the variable
                    TargetRange = declaration.DeclaringSyntax.ToRange(result.Context.LineStarts),

                    // span of the variable name
                    TargetSelectionRange = declaration.NameSyntax.ToRange(result.Context.LineStarts)
                }))));
            }

            return(Task.FromResult(new LocationOrLocationLinks()));
        }
예제 #9
0
#pragma warning disable CS1998 // Async method lacks 'await' operators and will run synchronously
        public async Task <LocationOrLocationLinks> Handle(DefinitionParams request, CancellationToken cancellationToken)
        //#pragma warning restore CS1998 // Async method lacks 'await' operators and will run synchronously
        {
            List <LocationOrLocationLink> items = new List <LocationOrLocationLink>();

            (var code, var lines, var tree) = bufferManager.Get(request.TextDocument.Uri.ToString());
            int c = request.Position.Character;
            int l = request.Position.Line;

            router.Window.LogInfo("definition requested");
            if (lines == null || tree == null)
            {
                return(items);
            }

            string token = lines[l][c].ToString();

            if (lines[l][c].ToString().IsIdentifier())
            {
                for (int i = c + 1; i < lines[l].Length && lines[l][i].ToString().IsIdentifier(); i++)
                {
                    token += lines[l][i];
                }
                for (int i = c - 1; i >= 0 && lines[l][i].ToString().IsIdentifier(); i--)
                {
                    token = lines[l][i] + token;
                }
            }
            else
            {
                return(items);
            }
            if (token.IsKeyword())
            {
                return(items);
            }


            //Context startOfSearch = FindContextAtLine(l, tree);
            //if (startOfSearch == null) return items;

            var def = FindDefinition(token, tree);

            if (def == null)
            {
                return(items);
            }

            var start = DocumentHighlightHandler.GetPosition(code, def.Characters.Start);
            var end   = DocumentHighlightHandler.GetPosition(code, def.Characters.End);

            router.Window.LogInfo("definition provided " + def);

            return(new LocationOrLocationLinks(new Location()
            {
                Range = new Range(start, end), Uri = request.TextDocument.Uri
            }));
        }
 public Task <LocationOrLocationLinks> Handle(DefinitionParams request, CancellationToken cancellationToken)
 {
     if (sourceContainer.TryGetValue(request.TextDocument.Uri, out var sourceFile))
     {
         return(Task.Run(() => FindDefinition(sourceFile, Translator.Translate(request.Position))));
     }
     else
     {
         return(Task.FromResult(new LocationOrLocationLinks()));
     }
 }
        public async Task <LocationOrLocationLinks> Handle(DefinitionParams request, CancellationToken cancellationToken)
        {
            _router.Window.LogMessage(new LogMessageParams()
            {
                Type    = MessageType.Log,
                Message = "Go to definition request at line: " + (request.Position.Line + 1),
            });

            _threadManager.AssertBackgroundThread();

            var document = await Task.Factory.StartNew(
                () =>
            {
                _snapshotManager.TryResolveDocument(request.TextDocument.Uri.AbsolutePath, out var doc);
                return(doc);
            },
                CancellationToken.None,
                TaskCreationOptions.None,
                _threadManager.ForegroundScheduler);

            var syntaxTree = await document.GetSyntaxTreeAsync();

            var child = syntaxTree.Root.GetNodeAt((int)request.Position.Line, (int)request.Position.Character);

            if (child.Parent is MethodNode && (child is InputNode || child is OutputNode))
            {
                //var declaringTypeNode = FindDeclaringTypeNode(syntaxTree.Root, child.Content);
                var declaringTypeNode = syntaxTree.Root.Messages.SingleOrDefault(c => c.Name == child.Content).NameNode;
                if (declaringTypeNode != null)
                {
                    var declaringTypeNodeLocation = new LocationOrLocationLink(
                        new Location()
                    {
                        Range = new Range(
                            new Position(declaringTypeNode.StartLine, declaringTypeNode.StartCol),
                            new Position(declaringTypeNode.EndLine, declaringTypeNode.EndCol)),
                        Uri = request.TextDocument.Uri,
                    });
                    var locations = new LocationOrLocationLinks(declaringTypeNodeLocation);
                    return(locations);
                }
            }

            var emptyLocations = new LocationOrLocationLinks();

            return(emptyLocations);
        }
예제 #12
0
        public Task <LocationOrLocations> Handle(DefinitionParams request, CancellationToken cancellationToken)
        {
            var navigator = new Navigator(injectionWorkspace);
            var location  = navigator.GetDefinition(request.TextDocument.Uri,
                                                    (int)request.Position.Line + 1, (int)request.Position.Character + 1);

            if (location != null)
            {
                location.Range.Start.Line--;
                location.Range.Start.Character--;
                location.Range.End.Line--;
                location.Range.End.Character--;
                return(Task.FromResult(new LocationOrLocations(location)));
            }

            return(Task.FromResult(new LocationOrLocations(Array.Empty <Location>())));
        }
예제 #13
0
        public override Task <LocationOrLocationLinks> Handle(DefinitionParams request, CancellationToken cancellationToken)
        {
            var context = this.compilationManager.GetCompilation(request.TextDocument.Uri);

            if (context is null)
            {
                return(Task.FromResult(new LocationOrLocationLinks()));
            }

            var result = this.symbolResolver.ResolveSymbol(request.TextDocument.Uri, request.Position);

            // No parent Symbol: ad hoc syntax matching
            return(result switch
            {
                null => HandleUnboundSymbolLocationAsync(request, context),

                { Symbol : DeclaredSymbol declaration } => HandleDeclaredDefinitionLocationAsync(request, result, declaration),
예제 #14
0
        public async Task <LocationOrLocationLinks> Handle(DefinitionParams definitionParams, CancellationToken token)
        {
            var links = _languageServer.LastParse?.ScriptFromUri(definitionParams.TextDocument.Uri)?.GetDefinitionLinks();

            if (links == null)
            {
                return(new LocationOrLocationLinks());
            }

            links = links.Where(link => ((DocRange)link.OriginSelectionRange).IsInside(definitionParams.Position)).ToArray();
            LocationOrLocationLink[] items = new LocationOrLocationLink[links.Length];
            for (int i = 0; i < items.Length; i++)
            {
                items[i] = new LocationOrLocationLink(links[i]);
            }

            return(new LocationOrLocationLinks(items));
        }
예제 #15
0
        public async Task <LocationOrLocationLinks> Handle(DefinitionParams request, CancellationToken cancellationToken)
        {
            _log.LogInformation(string.Format(Resources.LoggingMessages.request_handle, _method));

            try
            {
                var uri     = request.TextDocument.Uri;
                var line    = (int)request.Position.Line + 1;
                var col     = (int)request.Position.Character + 1;
                var manager = _workspaceManager.GetFileRepository(request.TextDocument.Uri).SymbolTableManager;
                IDefinitionsProvider provider = new DefinitionsProvider(manager);
                return(await Task.Run(() => RunAndEvaluate(provider, uri, line, col), cancellationToken));
            }
            catch (Exception e)
            {
                HandleError(string.Format(Resources.LoggingMessages.request_error, _method), e);
                return(null);
            }
        }
예제 #16
0
        public Task <LocationOrLocationLinks> Handle(DefinitionParams request, CancellationToken cancellationToken)
        {
            var hash = Hash.StringHash(request.TextDocument.Uri.GetFileSystemPath());

            TreeSitter.FindDefinition(hash, request.Position.Line, request.Position.Character, out var defHash, out var origin, out var target, out var selection);

            if (defHash != 0)
            {
                LocationLink link = new LocationLink();
                link.TargetUri            = DocumentUri.FromFileSystemPath(hashNamer.hashToName[defHash]);
                link.OriginSelectionRange = ConvertRange(origin);
                link.TargetRange          = ConvertRange(target);
                link.TargetSelectionRange = ConvertRange(selection);
                LocationOrLocationLinks ll = new LocationOrLocationLinks(link);
                return(Task.FromResult(ll));
            }

            return(Task.FromResult(new LocationOrLocationLinks()));
        }
예제 #17
0
        public Task <LocationOrLocations> Handle(DefinitionParams request, CancellationToken cancellationToken)
        {
            try
            {
                var scriptFile = _projectManager.GetScriptForFilePath(request.TextDocument.Uri.ToFilePath());
                if (scriptFile == null)
                {
                    return(Task.FromResult <LocationOrLocations>(null));
                }

                var identifier = scriptFile.Node.GetDescendantNodeOfTypeAtPosition <IdentifierNode>(request.Position.ToPosition());
                if (identifier == null)
                {
                    return(Task.FromResult <LocationOrLocations>(null));
                }

                var symbol = identifier.GetDeclaredOrReferencedSymbol();
                if (symbol == null)
                {
                    return(Task.FromResult <LocationOrLocations>(null));
                }

                var definitionFile = symbol.Script.Definition.GetScriptFile();
                if (definitionFile == null)
                {
                    return(Task.FromResult <LocationOrLocations>(null));
                }

                return(Task.FromResult(new LocationOrLocations(new Location()
                {
                    Uri = PathUtilities.ToFileUri(symbol.Script.Definition.GetScriptFile().FilePath),
                    Range = symbol.Identifier.Range.ToRange()
                })));
            }
            catch (Exception e)
            {
                _logger.LogWarning(e, "Error while handling request.");
            }

            return(Task.FromResult <LocationOrLocations>(null));
        }
예제 #18
0
        public override Task <LocationOrLocationLinks> Handle(DefinitionParams request, CancellationToken cancellationToken)
        {
            var progress = ProgressManager.For(request, cancellationToken);
            var work     = ProgressManager.WorkDone(request, new WorkDoneProgressBegin
            {
                Title   = "Resolve symbol definition location",
                Message = "Begin resolving definition under caret"
            });

            var editorData = DResolverWrapper.CreateEditorData(request, cancellationToken);
            var results    = DResolverWrapper.ResolveHoveredCodeLoosely(editorData, out LooseResolution.NodeResolutionAttempt resolutionAttempt, out ISyntaxRegion syntaxRegion);

            var result = new LocationOrLocationLinks(
                results.Select(ExpressionTypeEvaluation.GetResultMember)
                .Select(node => ToLocationOrLocationLink(node, Capability.LinkSupport, syntaxRegion)));

            progress?.OnNext(new Container <LocationOrLocationLink>(result));
            work.OnCompleted();

            return(Task.FromResult(progress != null ? new LocationOrLocationLinks() : result));
        }
예제 #19
0
        public async Task <LocationOrLocations> Handle(DefinitionParams request, CancellationToken token)
        {
            var omnisharpRequest = new GotoDefinitionRequest()
            {
                FileName = FromUri(request.TextDocument.Uri),
                Column   = Convert.ToInt32(request.Position.Character),
                Line     = Convert.ToInt32(request.Position.Line)
            };

            var omnisharpResponse = await _definitionHandler.Handle(omnisharpRequest);

            if (string.IsNullOrWhiteSpace(omnisharpResponse.FileName))
            {
                return(new LocationOrLocations());
            }

            return(new LocationOrLocations(new Location()
            {
                Uri = ToUri(omnisharpResponse.FileName),
                Range = ToRange((omnisharpResponse.Column, omnisharpResponse.Line))
            }));
예제 #20
0
        public override async Task <LocationOrLocationLinks> Handle(DefinitionParams request, CancellationToken token)
        {
            var omnisharpRequest = new GotoDefinitionRequest()
            {
                FileName = FromUri(request.TextDocument.Uri),
                Column   = Convert.ToInt32(request.Position.Character),
                Line     = Convert.ToInt32(request.Position.Line)
            };

            var omnisharpResponse = await _definitionHandler.Handle(omnisharpRequest);

            if (omnisharpResponse.Definitions == null)
            {
                return(new LocationOrLocationLinks());
            }

            return(new LocationOrLocationLinks(omnisharpResponse.Definitions.Select <Definition, LocationOrLocationLink>(definition => new Location()
            {
                Uri = definition.Location.FileName,
                Range = ToRange(definition.Location.Range)
            })));
        }
예제 #21
0
        public override Task <LocationOrLocationLinks> Handle(DefinitionParams request, CancellationToken cancellationToken)
        {
            var node = Workspace.GetNodeAt(request.TextDocument.Uri, request.Position);

            Range range;

            switch (node)
            {
            case Reference @ref:
                range = @ref.Port.Span.ToRange();
                break;

            default:
                return(Task.FromResult(new LocationOrLocationLinks()));
            }

            return(Task.FromResult(new LocationOrLocationLinks(new LocationOrLocationLink(new Location
            {
                Uri = request.TextDocument.Uri,
                Range = range
            }))));
        }
예제 #22
0
        public async override Task <LocationOrLocationLinks> Handle(DefinitionParams request, CancellationToken cancellationToken)
        {
            var document = await documents.GetDocumentAsync(request.TextDocument);

            if (document == null)
            {
                logger.LogWarning("location requested for unloaded document {DocumentUri}", request.TextDocument.Uri);
                return(new LocationOrLocationLinks());
            }
            if (!document.SymbolTable.TryGetSymbolAt(request.Position, out var symbol))
            {
                logger.LogDebug("no symbol was found at {Position} in {Document}", request.Position, request.TextDocument);
                return(new LocationOrLocationLinks());
            }
            var location = GetLspLocation(document, symbol);

            if (location == null)
            {
                logger.LogDebug("failed to resolve the location of the symbol {SymbolName} at {Position} in {Document}",
                                symbol.Name, request.Position, request.TextDocument);
                return(new LocationOrLocationLinks());
            }
            return(new[] { location });
        }
예제 #23
0
        ILocationContainer IWorker.Definition(string absFilename, long line, long column)
        {
            var param = new DefinitionParams();

            return(CommonProcessingOfGoto(absFilename, line, column, param, (ITextDocumentPositionParams arg) => client_.Send.TextDocumentDefinition((DefinitionParams)arg)));
        }
        public async Task <LocationOrLocationLinks?> Handle(DefinitionParams request, CancellationToken cancellationToken)
#pragma warning restore CS8613 // Nullability of reference types in return type doesn't match implicitly implemented member.
        {
            _logger.LogInformation("Starting go-to-def endpoint request.");

            if (request is null)
            {
                _logger.LogWarning("Request is null.");
                throw new ArgumentNullException(nameof(request));
            }

            var documentSnapshot = await _projectSnapshotManagerDispatcher.RunOnDispatcherThreadAsync(() =>
            {
                var path = request.TextDocument.Uri.GetAbsoluteOrUNCPath();
                _documentResolver.TryResolveDocument(path, out var documentSnapshot);
                return(documentSnapshot);
            }, cancellationToken).ConfigureAwait(false);

            if (documentSnapshot is null)
            {
                _logger.LogWarning("Document snapshot is null for document.");
                return(null);
            }

            if (!FileKinds.IsComponent(documentSnapshot.FileKind))
            {
                _logger.LogInformation($"FileKind '{documentSnapshot.FileKind}' is not a component type.");
                return(null);
            }

            var codeDocument = await documentSnapshot.GetGeneratedOutputAsync().ConfigureAwait(false);

            if (codeDocument.IsUnsupported())
            {
                _logger.LogInformation("Generated document is unsupported.");
                return(null);
            }

            var originTagHelperBinding = await GetOriginTagHelperBindingAsync(documentSnapshot, codeDocument, request.Position, _logger).ConfigureAwait(false);

            if (originTagHelperBinding is null)
            {
                _logger.LogInformation("Origin TagHelper binding is null.");
                return(null);
            }

            var originTagDescriptor = originTagHelperBinding.Descriptors.FirstOrDefault(d => !d.IsAttributeDescriptor());

            if (originTagDescriptor is null)
            {
                _logger.LogInformation("Origin TagHelper descriptor is null.");
                return(null);
            }

            var originComponentDocumentSnapshot = await _componentSearchEngine.TryLocateComponentAsync(originTagDescriptor).ConfigureAwait(false);

            if (originComponentDocumentSnapshot is null)
            {
                _logger.LogInformation("Origin TagHelper document snapshot is null.");
                return(null);
            }

            _logger.LogInformation($"Definition found at file path: {originComponentDocumentSnapshot.FilePath}");

            var originComponentUri = new UriBuilder
            {
                Path   = originComponentDocumentSnapshot.FilePath,
                Scheme = Uri.UriSchemeFile,
                Host   = string.Empty,
            }.Uri;

            return(new LocationOrLocationLinks(new[]
            {
                new LocationOrLocationLink(new Location
                {
                    Uri = originComponentUri,
                    Range = new Range(new Position(0, 0), new Position(0, 0)),
                }),
            }));
        }
 public static Task <LocationOrLocationLinks> Definition(this ILanguageClientDocument mediator, DefinitionParams @params, CancellationToken cancellationToken = default)
 {
     return(mediator.SendRequest(@params, cancellationToken));
 }
예제 #26
0
 public abstract Task <LocationOrLocationLinks> Handle(DefinitionParams request, CancellationToken cancellationToken);
예제 #27
0
    public async Task <LocationOrLocationLinks> Handle(DefinitionParams request, CancellationToken cancellationToken)
    {
        var documentPath = DocumentUri.GetFileSystemPath(request.TextDocument.Uri);

        if (string.IsNullOrEmpty(documentPath))
        {
            return(new LocationOrLocationLinks());
        }
        var(rootScope, tc) = buffers.GetScope(documentPath);
        if (rootScope == null)
        {
            return(new LocationOrLocationLinks());
        }

        var pos   = (int)request.Position.Character;
        var line  = (int)request.Position.Line;
        var scope = GetCurrentScope(rootScope, (int)request.Position.Character, (int)request.Position.Line, documentPath);

        // System.Diagnostics.Debugger.Launch();


        var node = FindNode(scope, pos, line, documentPath);

        if (node == null)
        {
            return(new LocationOrLocationLinks());
        }


        switch (node)
        {
        case AST.VariableReference vr:
        {
            var ov = node.scope.GetVar(vr.variableName, node.token);
            Scope.VariableDefinition vd;
            if (!ov.IsOverloaded)
            {
                vd = ov.First;
            }
            else
            {
                vd = ov.variables[vr.overloadedIdx];
            }

            Token token = Token.Undefined;
            if (vd.isFunctionParameter)
            {
                var function = node.scope.function;
                var ts       = function.typeString.functionTypeString;
                var par      = ts.parameters[vd.parameterIdx];
                token = par.typeString.token;
            }
            else
            {
                token = vd.node.token;
            }
            var location = new Location()
            {
                Uri   = DocumentUri.FromFileSystemPath(token.filename),
                Range = new Range(
                    new Position(token.Line - 1, token.Pos - 1),
                    new Position(token.Line - 1, token.Pos - 1 + token.length)
                    )
            };
            return(new LocationOrLocationLinks(location));
        }

        case AST.CompoundLiteral cl:
        {
            var nd    = GetElementType(tc.GetNodeType(node));
            var tr    = tc.GetTypeRoot(nd);
            var token = tr.token;
            if (token != Token.Undefined)
            {
                var location = new Location()
                {
                    Uri   = DocumentUri.FromFileSystemPath(token.filename),
                    Range = new Range(
                        new Position(token.Line - 1, token.Pos - 1),
                        new Position(token.Line - 1, token.Pos - 1 + token.length)
                        )
                };
                return(new LocationOrLocationLinks(location));
            }
        }
        break;

        case AST.FieldAccess fa:
        {
            if (fa.kind == AST.FieldAccess.AccessKind.Struct)
            {
                var nd    = GetElementType(tc.GetNodeType(fa.left));
                var tr    = (AST.StructDeclaration)tc.GetTypeRoot(nd);
                var field = tr.GetField(fa.fieldName);
                var token = field.typeString.token;
                if (token != Token.Undefined)
                {
                    var location = new Location()
                    {
                        Uri   = DocumentUri.FromFileSystemPath(token.filename),
                        Range = new Range(
                            new Position(token.Line - 1, token.Pos - 1),
                            new Position(token.Line - 1, token.Pos - 1 + token.length)
                            )
                    };
                    return(new LocationOrLocationLinks(location));
                }
            }
        }
        break;

        case AST.TypeString ts:
        {
            var nd = GetElementType(tc.GetNodeType(ts));
            var tr = tc.GetTypeRoot(nd);

            if (tr != null && tr.token != Token.Undefined)
            {
                var token    = tr.token;
                var location = new Location()
                {
                    Uri   = DocumentUri.FromFileSystemPath(token.filename),
                    Range = new Range(
                        new Position(token.Line - 1, token.Pos - 1),
                        new Position(token.Line - 1, token.Pos - 1 + token.length)
                        )
                };
                return(new LocationOrLocationLinks(location));
            }
        }
        break;
        }
        return(new LocationOrLocationLinks());
    }
        public async Task <LocationOrLocationLinks> Handle(DefinitionParams request, CancellationToken cancellationToken)
        {
            if (request is null)
            {
                throw new ArgumentNullException(nameof(request));
            }

            var documentSnapshot = await Task.Factory.StartNew(() =>
            {
                var path = request.TextDocument.Uri.GetAbsoluteOrUNCPath();
                _documentResolver.TryResolveDocument(path, out var documentSnapshot);
                return(documentSnapshot);
            }, cancellationToken, TaskCreationOptions.None, _foregroundDispatcher.ForegroundScheduler).ConfigureAwait(false);

            if (documentSnapshot is null)
            {
                return(null);
            }

            if (!FileKinds.IsComponent(documentSnapshot.FileKind))
            {
                return(null);
            }

            var codeDocument = await documentSnapshot.GetGeneratedOutputAsync().ConfigureAwait(false);

            if (codeDocument.IsUnsupported())
            {
                return(null);
            }

            var originTagHelperBinding = await GetOriginTagHelperBindingAsync(documentSnapshot, codeDocument, request.Position).ConfigureAwait(false);

            if (originTagHelperBinding is null)
            {
                return(null);
            }

            var originTagDescriptor = originTagHelperBinding.Descriptors.FirstOrDefault(d => !d.IsAttributeDescriptor());

            if (originTagDescriptor is null)
            {
                return(null);
            }

            var originComponentDocumentSnapshot = await _componentSearchEngine.TryLocateComponentAsync(originTagDescriptor).ConfigureAwait(false);

            if (originComponentDocumentSnapshot is null)
            {
                return(null);
            }

            var originComponentUri = new UriBuilder
            {
                Path   = originComponentDocumentSnapshot.FilePath,
                Scheme = Uri.UriSchemeFile,
                Host   = string.Empty,
            }.Uri;

            return(new LocationOrLocationLinks(new[]
            {
                new LocationOrLocationLink(new Location
                {
                    Uri = originComponentUri,
                    Range = new Range(new Position(0, 0), new Position(0, 0)),
                }),
            }));
        }
예제 #29
0
 public static Task <LocationOrLocations> Definition(this ILanguageClientDocument mediator, DefinitionParams @params)
 {
     return(mediator.SendRequest <DefinitionParams, LocationOrLocations>(DocumentNames.Definition, @params));
 }
 public override Task <LocationOrLocationLinks> Handle(DefinitionParams request, CancellationToken cancellationToken) => _handler.Invoke(request, cancellationToken);