Made lookupGlobalSymbol start the search from the innermost scope that contains the source index
This commit is contained in:
parent
04372999aa
commit
4bee4e662b
@ -2250,21 +2250,26 @@ pub fn iterateSymbolsGlobal(
|
||||
return try iterateSymbolsGlobalInternal(store, arena, handle, source_index, callback, context, &use_trail);
|
||||
}
|
||||
|
||||
pub fn innermostScope(handle: DocumentStore.Handle, source_index: usize) ast.Node.Index {
|
||||
var current = handle.document_scope.scopes[0].data.container;
|
||||
if (handle.document_scope.scopes.len == 1) return current;
|
||||
pub fn innermostBlockScopeIndex(handle: DocumentStore.Handle, source_index: usize) usize {
|
||||
if (handle.document_scope.scopes.len == 1) return 0;
|
||||
|
||||
for (handle.document_scope.scopes[1..]) |scope| {
|
||||
var current: usize = 0;
|
||||
for (handle.document_scope.scopes[1..]) |*scope, idx| {
|
||||
if (source_index >= scope.range.start and source_index <= scope.range.end) {
|
||||
switch (scope.data) {
|
||||
.container, .function, .block => |node| current = node,
|
||||
.container, .function, .block => |node| current = idx + 1,
|
||||
else => {},
|
||||
}
|
||||
}
|
||||
if (scope.range.start > source_index) break;
|
||||
}
|
||||
return current;
|
||||
}
|
||||
|
||||
pub fn innermostBlockScope(handle: DocumentStore.Handle, source_index: usize) ast.Node.Index {
|
||||
return handle.document_scope.scopes[innermostBlockScopeIndex(handle, source_index)].toNodeIndex().?;
|
||||
}
|
||||
|
||||
pub fn innermostContainer(handle: *DocumentStore.Handle, source_index: usize) TypeWithHandle {
|
||||
var current = handle.document_scope.scopes[0].data.container;
|
||||
if (handle.document_scope.scopes.len == 1) return TypeWithHandle.typeVal(.{ .node = current, .handle = handle });
|
||||
@ -2351,7 +2356,11 @@ fn lookupSymbolGlobalInternal(
|
||||
source_index: usize,
|
||||
use_trail: *std.ArrayList(*const ast.Node.Index),
|
||||
) error{OutOfMemory}!?DeclWithHandle {
|
||||
for (handle.document_scope.scopes) |scope| {
|
||||
const innermost_scope_idx = innermostBlockScopeIndex(handle.*, source_index);
|
||||
|
||||
var curr = innermost_scope_idx;
|
||||
while (curr >= 0) : (curr -= 1) {
|
||||
const scope = &handle.document_scope.scopes[curr];
|
||||
if (source_index >= scope.range.start and source_index <= scope.range.end) {
|
||||
if (scope.decls.getEntry(symbol)) |candidate| {
|
||||
switch (candidate.value) {
|
||||
@ -2366,13 +2375,10 @@ fn lookupSymbolGlobalInternal(
|
||||
.handle = handle,
|
||||
};
|
||||
}
|
||||
|
||||
if (try resolveUse(store, arena, scope.uses, symbol, handle, use_trail)) |result| return result;
|
||||
}
|
||||
|
||||
if (scope.range.start > source_index) return null;
|
||||
if (curr == 0) break;
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
@ -2521,6 +2527,13 @@ pub const Scope = struct {
|
||||
uses: []const *const ast.Node.Index,
|
||||
|
||||
data: Data,
|
||||
|
||||
pub fn toNodeIndex(self: Scope) ?ast.Node.Index {
|
||||
return switch (self.data) {
|
||||
.container, .function, .block => |idx| idx,
|
||||
else => null,
|
||||
};
|
||||
}
|
||||
};
|
||||
|
||||
pub fn makeDocumentScope(allocator: *std.mem.Allocator, tree: ast.Tree) !DocumentScope {
|
||||
|
@ -95,7 +95,7 @@ pub fn getSignatureInfo(
|
||||
absolute_index: usize,
|
||||
comptime data: type,
|
||||
) !?types.SignatureInformation {
|
||||
const innermost_block = analysis.innermostScope(handle.*, absolute_index);
|
||||
const innermost_block = analysis.innermostBlockScope(handle.*, absolute_index);
|
||||
const tree = handle.tree;
|
||||
const token_tags = tree.tokens.items(.tag);
|
||||
const token_starts = tree.tokens.items(.start);
|
||||
|
Loading…
Reference in New Issue
Block a user