Skip to content

Commit ea5f6c9

Browse files
committed
Avoid pre-declaring labels unecessarily
1 parent 9695ad8 commit ea5f6c9

File tree

5 files changed

+33
-19
lines changed

5 files changed

+33
-19
lines changed

vhdl_lang/src/analysis/declarative.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1433,7 +1433,7 @@ impl<'a> AnalyzeContext<'a> {
14331433
.clone()
14341434
.into_designator(),
14351435
parent,
1436-
AnyEntKind::Label,
1436+
AnyEntKind::Overloaded(to_kind(Signature::new(FormalRegion::new_params(), None))),
14371437
Some(&subprogram.subpgm_designator().pos),
14381438
);
14391439

vhdl_lang/src/analysis/design_unit.rs

Lines changed: 26 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
// Copyright (c) 2019, Olof Kraigher olof.kraigher@gmail.com
66

77
use super::named_entity::*;
8+
use super::visibility::Visibility;
89
use super::*;
910
use crate::ast::*;
1011
use crate::data::*;
@@ -14,16 +15,15 @@ use region::*;
1415
impl<'a> AnalyzeContext<'a> {
1516
pub fn analyze_primary_unit(
1617
&self,
17-
ent: EntRef<'a>,
1818
unit: &mut AnyPrimaryUnit,
1919
diagnostics: &mut dyn DiagnosticHandler,
2020
) -> FatalResult {
2121
match unit {
22-
AnyPrimaryUnit::Entity(unit) => self.analyze_entity(ent, unit, diagnostics),
22+
AnyPrimaryUnit::Entity(unit) => self.analyze_entity(unit, diagnostics),
2323
AnyPrimaryUnit::Configuration(unit) => self.analyze_configuration(unit, diagnostics),
24-
AnyPrimaryUnit::Package(unit) => self.analyze_package(ent, unit, diagnostics),
24+
AnyPrimaryUnit::Package(unit) => self.analyze_package(unit, diagnostics),
2525
AnyPrimaryUnit::PackageInstance(unit) => {
26-
self.analyze_package_instance(ent, unit, diagnostics)
26+
self.analyze_package_instance(unit, diagnostics)
2727
}
2828
AnyPrimaryUnit::Context(unit) => self.analyze_context(unit, diagnostics),
2929
}
@@ -42,10 +42,17 @@ impl<'a> AnalyzeContext<'a> {
4242

4343
fn analyze_entity(
4444
&self,
45-
ent: EntRef<'a>,
4645
unit: &mut EntityDeclaration,
4746
diagnostics: &mut dyn DiagnosticHandler,
4847
) -> FatalResult {
48+
// Pre-define entity and overwrite it later
49+
let ent = self.arena.explicit(
50+
unit.name().clone(),
51+
self.work_library(),
52+
AnyEntKind::Design(Design::Entity(Visibility::default(), Region::default())),
53+
Some(unit.pos()),
54+
);
55+
4956
unit.ident.decl = Some(ent.id());
5057
let root_scope = Scope::default();
5158
self.add_implicit_context_clause(&root_scope)?;
@@ -123,10 +130,16 @@ impl<'a> AnalyzeContext<'a> {
123130

124131
fn analyze_package(
125132
&self,
126-
ent: EntRef<'a>,
127133
unit: &mut PackageDeclaration,
128134
diagnostics: &mut dyn DiagnosticHandler,
129135
) -> FatalResult {
136+
let ent = self.arena.explicit(
137+
unit.name().clone(),
138+
self.work_library(),
139+
AnyEntKind::Design(Design::Package(Visibility::default(), Region::default())),
140+
Some(unit.pos()),
141+
);
142+
130143
unit.ident.decl = Some(ent.id());
131144

132145
let root_scope = Scope::default();
@@ -165,10 +178,16 @@ impl<'a> AnalyzeContext<'a> {
165178

166179
fn analyze_package_instance(
167180
&self,
168-
ent: EntRef<'a>,
169181
unit: &mut PackageInstantiation,
170182
diagnostics: &mut dyn DiagnosticHandler,
171183
) -> FatalResult {
184+
let ent = self.arena.explicit(
185+
unit.name().clone(),
186+
self.work_library(),
187+
AnyEntKind::Design(Design::PackageInstance(Region::default())),
188+
Some(unit.pos()),
189+
);
190+
172191
unit.ident.decl = Some(ent.id());
173192
let root_scope = Scope::default();
174193
self.add_implicit_context_clause(&root_scope)?;

vhdl_lang/src/analysis/package_instance.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -270,7 +270,7 @@ impl<'a> AnalyzeContext<'a> {
270270
designator,
271271
parent.or(uninst.parent),
272272
Related::InstanceOf(uninst),
273-
AnyEntKind::Label,
273+
AnyEntKind::Label, // Will be immediately overwritten below
274274
decl_pos,
275275
);
276276
let kind = self.map_kind(Some(inst), mapping, uninst.kind())?;

vhdl_lang/src/analysis/root.rs

Lines changed: 1 addition & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -543,15 +543,7 @@ impl DesignRoot {
543543

544544
let result = match unit.deref_mut() {
545545
AnyDesignUnit::Primary(unit) => {
546-
// Pre-define entity and overwrite it later
547-
let ent = arena.explicit(
548-
unit.name().clone(),
549-
context.work_library(),
550-
AnyEntKind::Label,
551-
Some(unit.pos()),
552-
);
553-
554-
if let Err(err) = context.analyze_primary_unit(ent, unit, &mut diagnostics) {
546+
if let Err(err) = context.analyze_primary_unit(unit, &mut diagnostics) {
555547
has_circular_dependency = true;
556548
err.push_into(&mut diagnostics);
557549
};

vhdl_lang/src/analysis/standard.rs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -301,7 +301,10 @@ impl<'a> AnalyzeContext<'a> {
301301
let subpgm_ent = self.arena.implicit(
302302
implicit_of.into(),
303303
des,
304-
AnyEntKind::Label,
304+
AnyEntKind::Overloaded(Overloaded::SubprogramDecl(Signature::new(
305+
FormalRegion::new_params(),
306+
return_type,
307+
))),
305308
implicit_of.decl_pos(),
306309
);
307310

0 commit comments

Comments
 (0)