Skip to content

Commit 729424e

Browse files
author
AztecBot
committed
[1 changes] feat: lsp rename/find-all-references for traits (noir-lang/noir#5409)
feat: lsp "go to definition" for modules (noir-lang/noir#5406) fix: lsp find struct reference in return locations and paths (noir-lang/noir#5404) feat: Sync from aztec-packages (noir-lang/noir#5408)
1 parent 10076d9 commit 729424e

29 files changed

Lines changed: 414 additions & 147 deletions

File tree

.noir-sync-commit

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
70ebf607e566a95ff7eb2c7a0eee7c36465ba5b4
1+
bf3a75a3f9c6926baaa1408767dd929de2f8a8f9

noir/noir-repo/acvm-repo/acvm_js/build.sh

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ function run_if_available {
2525
require_command jq
2626
require_command cargo
2727
require_command wasm-bindgen
28-
#require_command wasm-opt
28+
require_command wasm-opt
2929

3030
self_path=$(dirname "$(readlink -f "$0")")
3131
pname=$(cargo read-manifest | jq -r '.name')

noir/noir-repo/compiler/noirc_frontend/src/elaborator/expressions.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ use crate::{
2727
HirLiteral, HirStatement, Ident, IndexExpression, Literal, MemberAccessExpression,
2828
MethodCallExpression, PrefixExpression,
2929
},
30-
node_interner::{DefinitionKind, DependencyId, ExprId, FuncId},
30+
node_interner::{DefinitionKind, ExprId, FuncId, ReferenceId},
3131
token::Tokens,
3232
Kind, QuotedType, Shared, StructType, Type,
3333
};
@@ -432,8 +432,8 @@ impl<'context> Elaborator<'context> {
432432
struct_generics,
433433
});
434434

435-
let referenced = DependencyId::Struct(struct_type.borrow().id);
436-
let reference = DependencyId::Variable(Location::new(span, self.file));
435+
let referenced = ReferenceId::Struct(struct_type.borrow().id);
436+
let reference = ReferenceId::Variable(Location::new(span, self.file));
437437
self.interner.add_reference(referenced, reference);
438438

439439
(expr, Type::Struct(struct_type, generics))

noir/noir-repo/compiler/noirc_frontend/src/elaborator/mod.rs

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,8 @@ use crate::{
3030
SecondaryAttribute, StructId,
3131
},
3232
node_interner::{
33-
DefinitionId, DefinitionKind, DependencyId, ExprId, FuncId, GlobalId, TraitId, TypeAliasId,
33+
DefinitionId, DefinitionKind, DependencyId, ExprId, FuncId, GlobalId, ReferenceId, TraitId,
34+
TypeAliasId,
3435
},
3536
parser::TopLevelStatement,
3637
Shared, Type, TypeBindings, TypeVariable,
@@ -534,7 +535,7 @@ impl<'context> Elaborator<'context> {
534535
fn resolve_trait_by_path(&mut self, path: Path) -> Option<TraitId> {
535536
let path_resolver = StandardPathResolver::new(self.module_id());
536537

537-
let error = match path_resolver.resolve(self.def_maps, path.clone()) {
538+
let error = match path_resolver.resolve(self.def_maps, path.clone(), &mut None) {
538539
Ok(PathResolution { module_def_id: ModuleDefId::TraitId(trait_id), error }) => {
539540
if let Some(error) = error {
540541
self.push_err(error);
@@ -1407,7 +1408,8 @@ impl<'context> Elaborator<'context> {
14071408
self.file = trait_impl.file_id;
14081409
self.local_module = trait_impl.module_id;
14091410

1410-
trait_impl.trait_id = self.resolve_trait_by_path(trait_impl.trait_path.clone());
1411+
let trait_id = self.resolve_trait_by_path(trait_impl.trait_path.clone());
1412+
trait_impl.trait_id = trait_id;
14111413
let unresolved_type = &trait_impl.object_type;
14121414

14131415
self.add_generics(&trait_impl.generics);
@@ -1445,6 +1447,15 @@ impl<'context> Elaborator<'context> {
14451447
trait_impl.resolved_object_type = self.self_type.take();
14461448
trait_impl.impl_id = self.current_trait_impl.take();
14471449
self.generics.clear();
1450+
1451+
if let Some(trait_id) = trait_id {
1452+
let referenced = ReferenceId::Trait(trait_id);
1453+
let reference = ReferenceId::Variable(Location::new(
1454+
trait_impl.trait_path.last_segment().span(),
1455+
trait_impl.file_id,
1456+
));
1457+
self.interner.add_reference(referenced, reference);
1458+
}
14481459
}
14491460
}
14501461

noir/noir-repo/compiler/noirc_frontend/src/elaborator/patterns.rs

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ use crate::{
1515
stmt::HirPattern,
1616
},
1717
macros_api::{HirExpression, Ident, Path, Pattern},
18-
node_interner::{DefinitionId, DefinitionKind, DependencyId, ExprId, GlobalId, TraitImplKind},
18+
node_interner::{DefinitionId, DefinitionKind, ExprId, GlobalId, ReferenceId, TraitImplKind},
1919
Shared, StructType, Type, TypeBindings,
2020
};
2121

@@ -199,8 +199,8 @@ impl<'context> Elaborator<'context> {
199199
new_definitions,
200200
);
201201

202-
let referenced = DependencyId::Struct(struct_type.borrow().id);
203-
let reference = DependencyId::Variable(Location::new(name_span, self.file));
202+
let referenced = ReferenceId::Struct(struct_type.borrow().id);
203+
let reference = ReferenceId::Variable(Location::new(name_span, self.file));
204204
self.interner.add_reference(referenced, reference);
205205

206206
HirPattern::Struct(expected_type, fields, location)
@@ -446,8 +446,8 @@ impl<'context> Elaborator<'context> {
446446
self.interner.add_function_dependency(current_item, func_id);
447447
}
448448

449-
let variable = DependencyId::Variable(hir_ident.location);
450-
let function = DependencyId::Function(func_id);
449+
let variable = ReferenceId::Variable(hir_ident.location);
450+
let function = ReferenceId::Function(func_id);
451451
self.interner.add_reference(function, variable);
452452
}
453453
DefinitionKind::Global(global_id) => {
@@ -458,8 +458,8 @@ impl<'context> Elaborator<'context> {
458458
self.interner.add_global_dependency(current_item, global_id);
459459
}
460460

461-
let variable = DependencyId::Variable(hir_ident.location);
462-
let global = DependencyId::Global(global_id);
461+
let variable = ReferenceId::Variable(hir_ident.location);
462+
let global = ReferenceId::Global(global_id);
463463
self.interner.add_reference(global, variable);
464464
}
465465
DefinitionKind::GenericType(_) => {

noir/noir-repo/compiler/noirc_frontend/src/elaborator/scope.rs

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,12 @@
1-
use noirc_errors::Spanned;
1+
use noirc_errors::{Location, Spanned};
22

33
use crate::ast::ERROR_IDENT;
44
use crate::hir::def_map::{LocalModuleId, ModuleId};
55
use crate::hir::resolution::path_resolver::{PathResolver, StandardPathResolver};
66
use crate::hir::resolution::resolver::SELF_TYPE_NAME;
77
use crate::hir::scope::{Scope as GenericScope, ScopeTree as GenericScopeTree};
88
use crate::macros_api::Ident;
9+
use crate::node_interner::ReferenceId;
910
use crate::{
1011
hir::{
1112
def_map::{ModuleDefId, TryFromModuleDefId},
@@ -44,7 +45,20 @@ impl<'context> Elaborator<'context> {
4445

4546
pub(super) fn resolve_path(&mut self, path: Path) -> Result<ModuleDefId, ResolverError> {
4647
let resolver = StandardPathResolver::new(self.module_id());
47-
let path_resolution = resolver.resolve(self.def_maps, path)?;
48+
let path_resolution;
49+
50+
if self.interner.track_references {
51+
let mut references: Vec<ReferenceId> = Vec::new();
52+
path_resolution =
53+
resolver.resolve(self.def_maps, path.clone(), &mut Some(&mut references))?;
54+
55+
for (referenced, ident) in references.iter().zip(path.segments) {
56+
let reference = ReferenceId::Variable(Location::new(ident.span(), self.file));
57+
self.interner.add_reference(*referenced, reference);
58+
}
59+
} else {
60+
path_resolution = resolver.resolve(self.def_maps, path, &mut None)?;
61+
}
4862

4963
if let Some(error) = path_resolution.error {
5064
self.push_err(error);

noir/noir-repo/compiler/noirc_frontend/src/elaborator/types.rs

Lines changed: 7 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,8 @@ use crate::{
3131
UnaryOp, UnresolvedType, UnresolvedTypeData,
3232
},
3333
node_interner::{
34-
DefinitionKind, DependencyId, ExprId, GlobalId, TraitId, TraitImplKind, TraitMethodId,
34+
DefinitionKind, DependencyId, ExprId, GlobalId, ReferenceId, TraitId, TraitImplKind,
35+
TraitMethodId,
3536
},
3637
Generics, Kind, ResolvedGeneric, Type, TypeBinding, TypeVariable, TypeVariableKind,
3738
};
@@ -146,13 +147,17 @@ impl<'context> Elaborator<'context> {
146147
Resolved(id) => self.interner.get_quoted_type(id).clone(),
147148
};
148149

149-
if let Type::Struct(_, _) = resolved_type {
150+
if let Type::Struct(ref struct_type, _) = resolved_type {
150151
if let Some(unresolved_span) = typ.span {
151152
// Record the location of the type reference
152153
self.interner.push_type_ref_location(
153154
resolved_type.clone(),
154155
Location::new(unresolved_span, self.file),
155156
);
157+
158+
let referenced = ReferenceId::Struct(struct_type.borrow().id);
159+
let reference = ReferenceId::Variable(Location::new(unresolved_span, self.file));
160+
self.interner.add_reference(referenced, reference);
156161
}
157162
}
158163

@@ -244,8 +249,6 @@ impl<'context> Elaborator<'context> {
244249
return Type::Alias(alias, args);
245250
}
246251

247-
let last_segment = path.last_segment();
248-
249252
match self.lookup_struct_or_error(path) {
250253
Some(struct_type) => {
251254
if self.resolving_ids.contains(&struct_type.borrow().id) {
@@ -283,11 +286,6 @@ impl<'context> Elaborator<'context> {
283286
self.interner.add_type_dependency(current_item, dependency_id);
284287
}
285288

286-
let referenced = DependencyId::Struct(struct_type.borrow().id);
287-
let reference =
288-
DependencyId::Variable(Location::new(last_segment.span(), self.file));
289-
self.interner.add_reference(referenced, reference);
290-
291289
Type::Struct(struct_type, args)
292290
}
293291
None => Type::Error,

noir/noir-repo/compiler/noirc_frontend/src/hir/def_collector/dc_crate.rs

Lines changed: 32 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ use crate::hir::Context;
2020

2121
use crate::macros_api::{MacroError, MacroProcessor};
2222
use crate::node_interner::{
23-
DependencyId, FuncId, GlobalId, NodeInterner, StructId, TraitId, TraitImplId, TypeAliasId,
23+
FuncId, GlobalId, NodeInterner, ReferenceId, StructId, TraitId, TraitImplId, TypeAliasId,
2424
};
2525

2626
use crate::ast::{
@@ -330,7 +330,28 @@ impl DefCollector {
330330
// Resolve unresolved imports collected from the crate, one by one.
331331
for collected_import in std::mem::take(&mut def_collector.imports) {
332332
let module_id = collected_import.module_id;
333-
match resolve_import(crate_id, &collected_import, &context.def_maps) {
333+
let resolved_import = if context.def_interner.track_references {
334+
let mut references: Vec<ReferenceId> = Vec::new();
335+
let resolved_import = resolve_import(
336+
crate_id,
337+
&collected_import,
338+
&context.def_maps,
339+
&mut Some(&mut references),
340+
);
341+
342+
let current_def_map = context.def_maps.get(&crate_id).unwrap();
343+
let file_id = current_def_map.file_id(module_id);
344+
345+
for (referenced, ident) in references.iter().zip(&collected_import.path.segments) {
346+
let reference = ReferenceId::Variable(Location::new(ident.span(), file_id));
347+
context.def_interner.add_reference(*referenced, reference);
348+
}
349+
350+
resolved_import
351+
} else {
352+
resolve_import(crate_id, &collected_import, &context.def_maps, &mut None)
353+
};
354+
match resolved_import {
334355
Ok(resolved_import) => {
335356
if let Some(error) = resolved_import.error {
336357
errors.push((
@@ -491,12 +512,16 @@ fn add_import_reference(
491512

492513
match def_id {
493514
crate::macros_api::ModuleDefId::FunctionId(func_id) => {
494-
let variable = DependencyId::Variable(Location::new(name.span(), file_id));
495-
interner.add_reference(DependencyId::Function(func_id), variable);
515+
let variable = ReferenceId::Variable(Location::new(name.span(), file_id));
516+
interner.add_reference(ReferenceId::Function(func_id), variable);
496517
}
497518
crate::macros_api::ModuleDefId::TypeId(struct_id) => {
498-
let variable = DependencyId::Variable(Location::new(name.span(), file_id));
499-
interner.add_reference(DependencyId::Struct(struct_id), variable);
519+
let variable = ReferenceId::Variable(Location::new(name.span(), file_id));
520+
interner.add_reference(ReferenceId::Struct(struct_id), variable);
521+
}
522+
crate::macros_api::ModuleDefId::TraitId(trait_id) => {
523+
let variable = ReferenceId::Variable(Location::new(name.span(), file_id));
524+
interner.add_reference(ReferenceId::Trait(trait_id), variable);
500525
}
501526
_ => (),
502527
}
@@ -524,6 +549,7 @@ fn inject_prelude(
524549
&context.def_maps,
525550
ModuleId { krate: crate_id, local_id: crate_root },
526551
path,
552+
&mut None,
527553
) {
528554
assert!(error.is_none(), "Tried to add private item to prelude");
529555
let module_id = module_def_id.as_module().expect("std::prelude should be a module");

0 commit comments

Comments
 (0)