...
This commit is contained in:
@@ -25,24 +25,15 @@ internal class HoverHandler(WorkspaceManager workspaceManager) : HoverHandlerBas
|
||||
|
||||
private Hover? HandleSync(HoverParams request, CancellationToken cancellationToken)
|
||||
{
|
||||
var compilationUnit = workspaceManager.GetCompilationUnit(request.TextDocument.Uri);
|
||||
if (compilationUnit == null)
|
||||
{
|
||||
return null;
|
||||
}
|
||||
var topLevelNodes = workspaceManager.GetTopLevelNodes(request.TextDocument.Uri.GetFileSystemPath());
|
||||
|
||||
var moduleDecl = compilationUnit.OfType<ModuleNode>().FirstOrDefault();
|
||||
var moduleDecl = topLevelNodes.OfType<ModuleNode>().FirstOrDefault();
|
||||
if (moduleDecl == null)
|
||||
{
|
||||
return null;
|
||||
}
|
||||
|
||||
var moduleRepository = workspaceManager.GetModuleRepository();
|
||||
if (moduleRepository == null)
|
||||
{
|
||||
return null;
|
||||
}
|
||||
|
||||
if (!moduleRepository.TryGet(moduleDecl.NameToken, out var module))
|
||||
{
|
||||
return null;
|
||||
@@ -51,14 +42,14 @@ internal class HoverHandler(WorkspaceManager workspaceManager) : HoverHandlerBas
|
||||
var line = request.Position.Line;
|
||||
var character = request.Position.Character;
|
||||
|
||||
var hoveredNode = compilationUnit.DeepestNodeAtPosition(line, character);
|
||||
var hoveredNode = topLevelNodes.DeepestNodeAtPosition(line, character);
|
||||
|
||||
if (hoveredNode == null)
|
||||
{
|
||||
return null;
|
||||
}
|
||||
|
||||
var message = CreateMessage(hoveredNode, moduleRepository, module);
|
||||
var message = CreateMessage(hoveredNode, moduleRepository, module, line, character);
|
||||
if (message == null)
|
||||
{
|
||||
return null;
|
||||
@@ -74,7 +65,7 @@ internal class HoverHandler(WorkspaceManager workspaceManager) : HoverHandlerBas
|
||||
};
|
||||
}
|
||||
|
||||
private static string? CreateMessage(Node hoveredNode, ModuleRepository repository, ModuleRepository.Module currentModule)
|
||||
private static string? CreateMessage(Node hoveredNode, ModuleRepository repository, ModuleRepository.Module currentModule, int line, int character)
|
||||
{
|
||||
return hoveredNode switch
|
||||
{
|
||||
@@ -99,6 +90,7 @@ internal class HoverHandler(WorkspaceManager workspaceManager) : HoverHandlerBas
|
||||
U16LiteralNode u16LiteralNode => CreateLiteralMessage(u16LiteralNode.Type, u16LiteralNode.Value.ToString()),
|
||||
U32LiteralNode u32LiteralNode => CreateLiteralMessage(u32LiteralNode.Type, u32LiteralNode.Value.ToString()),
|
||||
U64LiteralNode u64LiteralNode => CreateLiteralMessage(u64LiteralNode.Type, u64LiteralNode.Value.ToString()),
|
||||
StructInitializerNode structInitializerNode => CreateStructInitializerMessage(structInitializerNode, line, character),
|
||||
// Expressions can have a generic fallback showing the resulting type
|
||||
ExpressionNode expressionNode => $"""
|
||||
**Expression** `{expressionNode.GetType().Name}`
|
||||
@@ -111,6 +103,41 @@ internal class HoverHandler(WorkspaceManager workspaceManager) : HoverHandlerBas
|
||||
};
|
||||
}
|
||||
|
||||
private static string CreateStructInitializerMessage(StructInitializerNode structInitializerNode, int line, int character)
|
||||
{
|
||||
var hoveredInitializerName = structInitializerNode
|
||||
.Initializers
|
||||
.Select(x => x.Key)
|
||||
.FirstOrDefault(x => x.ContainsPosition(line, character));
|
||||
|
||||
var structType = (NubStructType)structInitializerNode.Type;
|
||||
|
||||
if (hoveredInitializerName != null)
|
||||
{
|
||||
var field = structType.Fields.FirstOrDefault(x => x.Name == hoveredInitializerName.Value);
|
||||
if (field != null)
|
||||
{
|
||||
return $"""
|
||||
**Field** in `{structType}`
|
||||
```nub
|
||||
{hoveredInitializerName.Value}: {field.Type}
|
||||
```
|
||||
""";
|
||||
}
|
||||
else
|
||||
{
|
||||
return $"""
|
||||
**Field** in `{structType}`
|
||||
```nub
|
||||
// Field not found
|
||||
```
|
||||
""";
|
||||
}
|
||||
}
|
||||
|
||||
return $"**Struct initializer** `{structType}`";
|
||||
}
|
||||
|
||||
private static string CreateLiteralMessage(NubType type, string value)
|
||||
{
|
||||
return $"""
|
||||
|
||||
Reference in New Issue
Block a user