Clean up code for ambiguous references

This commit is contained in:
Anton Sviridov 2024-07-15 10:37:44 +01:00
parent 15d1ba2e94
commit ae4f454f08
3 changed files with 63 additions and 41 deletions

View File

@ -118,6 +118,12 @@
(#not-eq? @reference.either "var")
)
; class Binary<N extends Number> {...
; ^^^^^^
(type_bound
(type_identifier)* @reference.either
)
; for (MyType variable: variables) {...
; ^^^^^^
(enhanced_for_statement

View File

@ -599,13 +599,11 @@ impl<'a> LocalResolver<'a> {
continue;
}
// dbg!("References {:?}", &self.non_local_references_at_offsets);
match kind {
ReferenceKind::Global | ReferenceKind::Either => {
self.non_local_references_at_offsets.insert(offset);
}
ReferenceKind::Local => {}
_ => {}
}
references.push(RefCapture {
@ -762,63 +760,62 @@ impl<'a> LocalResolver<'a> {
}
}
fn make_local_reference(
&self,
reference: &Reference,
def_id: DefId,
) -> scip::types::Occurrence {
scip::types::Occurrence {
range: reference.node.scip_range(),
symbol: format_symbol(def_id.as_local_symbol()),
..Default::default()
}
}
fn resolve_references(&mut self) {
let mut ref_occurrences = vec![];
for (scope_ref, scope) in self.arena.iter() {
for reference in scope.references.iter() {
let def_id = if let Some(resolved) = reference.resolves_to {
resolved
} else if self
if !self
.skip_references_at_offsets
.contains(&reference.node.start_byte())
{
// See the comment on LocalResolver.definition_start_bytes
continue;
} else {
// if let Some(def) =
// self.find_def(scope_ref, reference.name, reference.node.start_byte())
// {
// def.id
// } else {
// dbg!(&reference.kind);
// dbg!(self.interner.resolve(reference.name));
// dbg!(
// self.interner.resolve(reference.name),
// reference.kind,
// reference.node.start_byte()
// );
match reference.kind {
ReferenceKind::Global => {
// without even looking for definition we emit a global reference here
ref_occurrences.push(self.make_global_reference(reference));
continue;
ReferenceKind::Local => {
if !self
.non_local_references_at_offsets
.contains(&reference.node.start_byte())
{
if let Some(def_id) = reference.resolves_to {
ref_occurrences
.push(self.make_local_reference(reference, def_id))
} else if let Some(def) = self.find_def(
scope_ref,
reference.name,
reference.node.start_byte(),
) {
ref_occurrences
.push(self.make_local_reference(reference, def.id));
}
}
}
ReferenceKind::Local | ReferenceKind::Either => {
ReferenceKind::Global => {
ref_occurrences.push(self.make_global_reference(reference))
}
ReferenceKind::Either => {
if let Some(def) = self.find_def(
scope_ref,
reference.name,
reference.node.start_byte(),
) {
def.id
ref_occurrences.push(self.make_local_reference(reference, def.id));
} else {
if ReferenceKind::Either == reference.kind {
ref_occurrences.push(self.make_global_reference(reference));
}
continue;
ref_occurrences.push(self.make_global_reference(reference))
}
}
}
// };
};
ref_occurrences.push(scip::types::Occurrence {
range: reference.node.scip_range(),
symbol: format_symbol(def_id.as_local_symbol()),
..Default::default()
});
}
}
}

View File

@ -24,8 +24,10 @@ expression: dumped
// ^^^ definition local 4
// ^^^^ definition local 5
return new Locals(this.chars + chars + text.getChars());
// ^^^^^^ reference Locals
// ^^^^^ reference local 3
// ^^^^ reference local 5
// ^^^^^^^^ reference getChars
}
public String getChars() {
@ -45,6 +47,7 @@ expression: dumped
private class Binary<N extends Number> {
// ^ definition local 7
// ^^^^^^ reference Number
final N val;
// ^ reference local 7
@ -63,6 +66,7 @@ expression: dumped
// ^ definition local 10
// ^ definition local 11
System.out.println(x + "," + y);
// ^^^^^^^ reference println
// ^ reference local 10
// ^ reference local 11
}
@ -92,6 +96,7 @@ expression: dumped
protected String toStringAttributes() {
return "text=" + getChars();
// ^^^^^^^^ reference getChars
}
public <T extends Container> List<T> fromArrayToList(T[] a) {
@ -101,7 +106,10 @@ expression: dumped
// ^ reference local 14
// ^ definition local 15
return Arrays.stream(a).collect(Collectors.toList());
// ^^^^^^ reference stream
// ^ reference local 15
// ^^^^^^^ reference collect
// ^^^^^^ reference toList
}
// ? in (wildcard) node doesn't have its own node and
@ -110,6 +118,7 @@ expression: dumped
// ^^^^^^^^^ reference local 1
// ^ definition local 16
System.out.println(a);
// ^^^^^^^ reference println
// ^ reference local 16
}
@ -121,9 +130,11 @@ expression: dumped
// ^ reference local 17
// ^ reference local 18
System.out.println(i);
// ^^^^^^^ reference println
// ^ reference local 18
}
System.out.println(r);
// ^^^^^^^ reference println
// ^ reference local 17
}
@ -158,23 +169,31 @@ expression: dumped
// ^^^^^^^ definition local 25
numbers.add(5);
// ^^^^^^^ reference local 25
// ^^^ reference add
numbers.add(9);
// ^^^^^^^ reference local 25
// ^^^ reference add
numbers.add(8);
// ^^^^^^^ reference local 25
// ^^^ reference add
numbers.add(1);
// ^^^^^^^ reference local 25
// ^^^ reference add
numbers.forEach((n) -> {
// ^^^^^^^ reference local 25
// ^^^^^^^ reference forEach
// ^ definition local 26
System.out.println(n);
// ^^^^^^^ reference println
// ^ reference local 26
});
for (Integer num : numbers) {
// ^^^^^^^ reference Integer
// ^^^ definition local 27
// ^^^^^^^ reference local 25
System.out.println(num);
// ^^^^^^^ reference println
// ^^^ reference local 27
}