Fixed dereference resolution of Type.data.pointer values
This commit is contained in:
parent
f382a1b22d
commit
5a88f26980
@ -566,6 +566,13 @@ fn resolveDerefType(
|
|||||||
) !?TypeWithHandle {
|
) !?TypeWithHandle {
|
||||||
const deref_node = switch (deref.type.data) {
|
const deref_node = switch (deref.type.data) {
|
||||||
.other => |n| n,
|
.other => |n| n,
|
||||||
|
.pointer => |n| return TypeWithHandle{
|
||||||
|
.type = .{
|
||||||
|
.is_type_val = false,
|
||||||
|
.data = .{ .other = n },
|
||||||
|
},
|
||||||
|
.handle = deref.handle,
|
||||||
|
},
|
||||||
else => return null,
|
else => return null,
|
||||||
};
|
};
|
||||||
const tree = deref.handle.tree;
|
const tree = deref.handle.tree;
|
||||||
@ -1242,7 +1249,13 @@ pub fn getFieldAccessType(
|
|||||||
.unwrapped = try resolveDerefType(store, arena, current_type, &bound_type_params),
|
.unwrapped = try resolveDerefType(store, arena, current_type, &bound_type_params),
|
||||||
},
|
},
|
||||||
.identifier => {
|
.identifier => {
|
||||||
if (try lookupSymbolGlobal(store, arena, current_type.handle, tokenizer.buffer[tok.loc.start..tok.loc.end], source_index)) |child| {
|
if (try lookupSymbolGlobal(
|
||||||
|
store,
|
||||||
|
arena,
|
||||||
|
current_type.handle,
|
||||||
|
tokenizer.buffer[tok.loc.start..tok.loc.end],
|
||||||
|
source_index,
|
||||||
|
)) |child| {
|
||||||
current_type = (try child.resolveType(store, arena, &bound_type_params)) orelse return null;
|
current_type = (try child.resolveType(store, arena, &bound_type_params)) orelse return null;
|
||||||
} else return null;
|
} else return null;
|
||||||
},
|
},
|
||||||
@ -1278,11 +1291,20 @@ pub fn getFieldAccessType(
|
|||||||
tokenizer.buffer[after_period.loc.start..after_period.loc.end],
|
tokenizer.buffer[after_period.loc.start..after_period.loc.end],
|
||||||
!current_type.type.is_type_val,
|
!current_type.type.is_type_val,
|
||||||
)) |child| {
|
)) |child| {
|
||||||
current_type = (try child.resolveType(store, arena, &bound_type_params)) orelse return null;
|
current_type = (try child.resolveType(
|
||||||
|
store,
|
||||||
|
arena,
|
||||||
|
&bound_type_params,
|
||||||
|
)) orelse return null;
|
||||||
} else return null;
|
} else return null;
|
||||||
},
|
},
|
||||||
.question_mark => {
|
.question_mark => {
|
||||||
current_type = (try resolveUnwrapOptionalType(store, arena, current_type, &bound_type_params)) orelse return null;
|
current_type = (try resolveUnwrapOptionalType(
|
||||||
|
store,
|
||||||
|
arena,
|
||||||
|
current_type,
|
||||||
|
&bound_type_params,
|
||||||
|
)) orelse return null;
|
||||||
},
|
},
|
||||||
else => {
|
else => {
|
||||||
log.debug("Unrecognized token {} after period.", .{after_period.tag});
|
log.debug("Unrecognized token {} after period.", .{after_period.tag});
|
||||||
@ -1291,7 +1313,12 @@ pub fn getFieldAccessType(
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
.period_asterisk => {
|
.period_asterisk => {
|
||||||
current_type = (try resolveDerefType(store, arena, current_type, &bound_type_params)) orelse return null;
|
current_type = (try resolveDerefType(
|
||||||
|
store,
|
||||||
|
arena,
|
||||||
|
current_type,
|
||||||
|
&bound_type_params,
|
||||||
|
)) orelse return null;
|
||||||
},
|
},
|
||||||
.l_paren => {
|
.l_paren => {
|
||||||
const current_type_node = switch (current_type.type.data) {
|
const current_type_node = switch (current_type.type.data) {
|
||||||
|
@ -1141,8 +1141,8 @@ fn completeFieldAccess(
|
|||||||
var tokenizer = std.zig.Tokenizer.init(position.line[range.start..range.end]);
|
var tokenizer = std.zig.Tokenizer.init(position.line[range.start..range.end]);
|
||||||
if (try analysis.getFieldAccessType(&document_store, arena, handle, position.absolute_index, &tokenizer)) |result| {
|
if (try analysis.getFieldAccessType(&document_store, arena, handle, position.absolute_index, &tokenizer)) |result| {
|
||||||
try typeToCompletion(arena, &completions, result, handle, config);
|
try typeToCompletion(arena, &completions, result, handle, config);
|
||||||
}
|
|
||||||
truncateCompletions(completions.items, config.max_detail_length);
|
truncateCompletions(completions.items, config.max_detail_length);
|
||||||
|
}
|
||||||
|
|
||||||
try send(arena, types.Response{
|
try send(arena, types.Response{
|
||||||
.id = id,
|
.id = id,
|
||||||
|
Loading…
Reference in New Issue
Block a user