...
This commit is contained in:
@@ -20,37 +20,58 @@ internal class DefinitionHandler(WorkspaceManager workspaceManager) : Definition
|
||||
private LocationOrLocationLinks? HandleSync(DefinitionParams request, CancellationToken cancellationToken)
|
||||
{
|
||||
var uri = request.TextDocument.Uri;
|
||||
var compilationUnit = workspaceManager.GetCompilationUnit(uri);
|
||||
if (compilationUnit == null)
|
||||
{
|
||||
return null;
|
||||
}
|
||||
var topLevelNodes = workspaceManager.GetTopLevelNodes(uri.GetFileSystemPath());
|
||||
|
||||
var line = request.Position.Line;
|
||||
var character = request.Position.Character;
|
||||
|
||||
var node = compilationUnit.DeepestNodeAtPosition(line, character);
|
||||
var node = topLevelNodes.DeepestNodeAtPosition(line, character);
|
||||
|
||||
switch (node)
|
||||
{
|
||||
case VariableIdentifierNode variableIdentifierNode:
|
||||
{
|
||||
var function = compilationUnit.FunctionAtPosition(line, character);
|
||||
var funcNode = topLevelNodes.FunctionAtPosition(line, character);
|
||||
|
||||
var parameter = function?.Prototype.Parameters.FirstOrDefault(x => x.NameToken.Value == variableIdentifierNode.NameToken.Value);
|
||||
var parameter = funcNode?.Prototype.Parameters.FirstOrDefault(x => x.NameToken.Value == variableIdentifierNode.NameToken.Value);
|
||||
if (parameter != null)
|
||||
{
|
||||
return new LocationOrLocationLinks(parameter.ToLocation());
|
||||
return new LocationOrLocationLinks(parameter.NameToken.ToLocation());
|
||||
}
|
||||
|
||||
var variable = function?.Body?
|
||||
var variable = funcNode?.Body?
|
||||
.Descendants()
|
||||
.OfType<VariableDeclarationNode>()
|
||||
.FirstOrDefault(x => x.NameToken.Value == variableIdentifierNode.NameToken.Value);
|
||||
|
||||
if (variable != null)
|
||||
{
|
||||
return new LocationOrLocationLinks(variable.ToLocation());
|
||||
return new LocationOrLocationLinks(variable.NameToken.ToLocation());
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
case LocalFuncIdentifierNode localFuncIdentifierNode:
|
||||
{
|
||||
var funcNode = topLevelNodes.OfType<FuncNode>().FirstOrDefault(x => x.NameToken.Value == localFuncIdentifierNode.NameToken.Value);
|
||||
if (funcNode != null)
|
||||
{
|
||||
return new LocationOrLocationLinks(funcNode.NameToken.ToLocation());
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
case ModuleFuncIdentifierNode localFuncIdentifierNode:
|
||||
{
|
||||
var repository = workspaceManager.GetModuleRepository();
|
||||
if (!repository.TryGet(localFuncIdentifierNode.ModuleToken, out var module))
|
||||
{
|
||||
return null;
|
||||
}
|
||||
|
||||
if (module.TryResolveFunc(localFuncIdentifierNode.NameToken, out var func, out _))
|
||||
{
|
||||
return new LocationOrLocationLinks(func.NameToken.ToLocation());
|
||||
}
|
||||
|
||||
return null;
|
||||
|
||||
Reference in New Issue
Block a user