Skip to content

Commit 16d9e5e

Browse files
authored
Improved completions (#313)
This commit adds specific completions for selected names and attributes. It also extends the completion capabilities to entities, packages and package bodies (previously, this was only possible in architectures). Furthermore, all visible symbols from entities, packages and architectures are included for the generic completion provider. Previously, only symbols in the declarative part of architectures were includes.
1 parent a367577 commit 16d9e5e

40 files changed

+1717
-1048
lines changed

vhdl_lang/src/analysis/declarative.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ impl Declaration {
6464
| View(_)
6565
),
6666
// LRM: package_body_declarative_item
67-
AnyEntKind::Design(Design::PackageBody | Design::UninstPackage(..))
67+
AnyEntKind::Design(Design::PackageBody(..) | Design::UninstPackage(..))
6868
| AnyEntKind::Overloaded(
6969
Overloaded::SubprogramDecl(_)
7070
| Overloaded::Subprogram(_)
@@ -1173,11 +1173,11 @@ fn get_entity_class(ent: EntRef) -> Option<EntityClass> {
11731173
AnyEntKind::Library => None,
11741174
AnyEntKind::Design(des) => match des {
11751175
Design::Entity(_, _) => Some(EntityClass::Entity),
1176-
Design::Architecture(_) => Some(EntityClass::Architecture),
1176+
Design::Architecture(..) => Some(EntityClass::Architecture),
11771177
Design::Configuration => Some(EntityClass::Configuration),
11781178
Design::Package(_, _) => Some(EntityClass::Package),
11791179
// Should never be target of attribute
1180-
Design::PackageBody => None,
1180+
Design::PackageBody(..) => None,
11811181
Design::UninstPackage(_, _) => None,
11821182
Design::PackageInstance(_) => None,
11831183
Design::InterfacePackageInstance(_) => None,

vhdl_lang/src/analysis/design_unit.rs

Lines changed: 27 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -278,7 +278,11 @@ impl<'a, 't> AnalyzeContext<'a, 't> {
278278
self.ctx,
279279
&mut unit.ident,
280280
primary.into(),
281-
AnyEntKind::Design(Design::Architecture(primary)),
281+
AnyEntKind::Design(Design::Architecture(
282+
Visibility::default(),
283+
Region::default(),
284+
primary,
285+
)),
282286
src_span,
283287
Some(self.source()),
284288
);
@@ -294,6 +298,15 @@ impl<'a, 't> AnalyzeContext<'a, 't> {
294298
self.analyze_declarative_part(&scope, arch, &mut unit.decl, diagnostics)?;
295299
self.analyze_concurrent_part(&scope, arch, &mut unit.statements, diagnostics)?;
296300
scope.close(diagnostics);
301+
302+
let region = scope.into_region();
303+
let visibility = root_scope.into_visibility();
304+
305+
unsafe {
306+
arch.set_kind(AnyEntKind::Design(Design::Architecture(
307+
visibility, region, primary,
308+
)))
309+
}
297310
Ok(())
298311
}
299312

@@ -334,7 +347,10 @@ impl<'a, 't> AnalyzeContext<'a, 't> {
334347
unit.ident.name().clone().into(),
335348
Some(self.work_library()),
336349
Related::DeclaredBy(primary.into()),
337-
AnyEntKind::Design(Design::PackageBody),
350+
AnyEntKind::Design(Design::PackageBody(
351+
Visibility::default(),
352+
Region::default(),
353+
)),
338354
Some(unit.ident_pos(self.ctx).clone()),
339355
unit.span(),
340356
Some(self.source()),
@@ -355,6 +371,10 @@ impl<'a, 't> AnalyzeContext<'a, 't> {
355371

356372
self.analyze_declarative_part(&scope, body, &mut unit.decl, diagnostics)?;
357373
scope.close(diagnostics);
374+
let region = scope.into_region();
375+
let visibility = root_scope.into_visibility();
376+
377+
unsafe { body.set_kind(AnyEntKind::Design(Design::PackageBody(visibility, region))) }
358378
Ok(())
359379
}
360380

@@ -647,6 +667,11 @@ impl<'a, 't> AnalyzeContext<'a, 't> {
647667
"Use clause must be a selected name",
648668
ErrorCode::MismatchedKinds,
649669
);
670+
// We still want to resolve the name,
671+
// so that it is available for completion purposes.
672+
// We ignore the errors here, since there is already a diagnostic at that position.
673+
let mut empty_diag = Vec::new();
674+
let _ = self.name_resolve(scope, name.span(), &mut name.item, &mut empty_diag);
650675
continue;
651676
}
652677
}

vhdl_lang/src/analysis/root.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -475,7 +475,7 @@ impl DesignRoot {
475475
)
476476
}
477477
// Find all architectures which implement the entity
478-
AnyEntKind::Design(Design::Architecture(ent_of_arch)) => {
478+
AnyEntKind::Design(Design::Architecture(.., ent_of_arch)) => {
479479
ent_of_arch.id == ent_id
480480
}
481481
_ => false,

vhdl_lang/src/analysis/tests/util.rs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,10 @@ end architecture;"
8383

8484
for (library_name, codes) in self.libraries.iter() {
8585
for code in codes {
86-
root.add_design_file(library_name.clone(), code.design_file());
86+
root.add_design_file(
87+
library_name.clone(),
88+
code.design_file_diagnostics(&mut diagnostics),
89+
);
8790
}
8891
}
8992
root.analyze(&mut diagnostics);

0 commit comments

Comments
 (0)