This commit is contained in:
nub31
2025-11-03 12:52:17 +01:00
parent 40d500fddd
commit 085f7a1a6a
17 changed files with 368 additions and 190 deletions

View File

@@ -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;