Skip to content

Commit 7bd5165

Browse files
committed
Add anonymous designator for labels and implicit operators
1 parent b95355f commit 7bd5165

File tree

14 files changed

+200
-155
lines changed

14 files changed

+200
-155
lines changed

vhdl_lang/src/analysis/concurrent.rs

Lines changed: 22 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -20,11 +20,28 @@ impl<'a> AnalyzeContext<'a> {
2020
pub fn analyze_concurrent_part(
2121
&self,
2222
scope: &Scope<'a>,
23-
parent: Option<EntRef<'a>>,
23+
parent: EntRef<'a>,
2424
statements: &mut [LabeledConcurrentStatement],
2525
diagnostics: &mut dyn DiagnosticHandler,
2626
) -> FatalResult {
2727
for statement in statements.iter_mut() {
28+
let parent = if statement.statement.can_have_label() {
29+
if let Some(id) = statement.label.as_ref().and_then(|label| label.decl) {
30+
self.arena.get(id)
31+
} else {
32+
// Generate an anonymous label if it is not explicitly defined
33+
self.arena.alloc(
34+
Designator::Anonymous(scope.next_anonymous()),
35+
Some(parent),
36+
Related::None,
37+
AnyEntKind::Label,
38+
None,
39+
)
40+
}
41+
} else {
42+
parent
43+
};
44+
2845
self.analyze_concurrent_statement(scope, parent, statement, diagnostics)?;
2946
}
3047

@@ -34,7 +51,7 @@ impl<'a> AnalyzeContext<'a> {
3451
pub fn define_labels_for_concurrent_part(
3552
&self,
3653
scope: &Scope<'a>,
37-
parent: Option<EntRef<'a>>,
54+
parent: EntRef<'a>,
3855
statements: &mut [LabeledConcurrentStatement],
3956
diagnostics: &mut dyn DiagnosticHandler,
4057
) -> FatalResult {
@@ -53,17 +70,10 @@ impl<'a> AnalyzeContext<'a> {
5370
fn analyze_concurrent_statement(
5471
&self,
5572
scope: &Scope<'a>,
56-
parent: Option<EntRef<'a>>,
73+
parent: EntRef<'a>,
5774
statement: &mut LabeledConcurrentStatement,
5875
diagnostics: &mut dyn DiagnosticHandler,
5976
) -> FatalResult {
60-
// @TODO without label use orginal parent, should unlabeled statements be implicitly declared?
61-
let parent = if let Some(id) = statement.label.as_ref().and_then(|label| label.decl) {
62-
Some(self.arena.get(id))
63-
} else {
64-
parent
65-
};
66-
6777
match statement.statement {
6878
ConcurrentStatement::Block(ref mut block) => {
6979
if let Some(ref mut guard_condition) = block.guard_condition {
@@ -204,7 +214,7 @@ impl<'a> AnalyzeContext<'a> {
204214
fn analyze_generate_body(
205215
&self,
206216
scope: &Scope<'a>,
207-
parent: Option<EntRef<'a>>,
217+
parent: EntRef<'a>,
208218
body: &mut GenerateBody,
209219
diagnostics: &mut dyn DiagnosticHandler,
210220
) -> FatalResult {
@@ -219,7 +229,7 @@ impl<'a> AnalyzeContext<'a> {
219229
if let Some(label) = alternative_label {
220230
let ent = label.define(self.arena, parent, AnyEntKind::Label);
221231
scope.add(ent, diagnostics);
222-
inner_parent = Some(ent);
232+
inner_parent = ent;
223233
}
224234

225235
// Pre-declare labels

vhdl_lang/src/analysis/declarative.rs

Lines changed: 20 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ impl<'a> AnalyzeContext<'a> {
2323
pub fn analyze_declarative_part(
2424
&self,
2525
scope: &Scope<'a>,
26-
parent: Option<EntRef<'a>>,
26+
parent: EntRef<'a>,
2727
declarations: &mut [Declaration],
2828
diagnostics: &mut dyn DiagnosticHandler,
2929
) -> FatalResult {
@@ -116,7 +116,7 @@ impl<'a> AnalyzeContext<'a> {
116116
fn analyze_alias_declaration(
117117
&self,
118118
scope: &Scope<'a>,
119-
parent: Option<EntRef<'a>>,
119+
parent: EntRef<'a>,
120120
alias: &mut AliasDeclaration,
121121
diagnostics: &mut dyn DiagnosticHandler,
122122
) -> EvalResult<EntRef<'a>> {
@@ -220,7 +220,7 @@ impl<'a> AnalyzeContext<'a> {
220220
pub(crate) fn analyze_declaration(
221221
&self,
222222
scope: &Scope<'a>,
223-
parent: Option<EntRef<'a>>,
223+
parent: EntRef<'a>,
224224
decl: &mut Declaration,
225225
diagnostics: &mut dyn DiagnosticHandler,
226226
) -> FatalResult {
@@ -302,7 +302,7 @@ impl<'a> AnalyzeContext<'a> {
302302

303303
let object_ent = self.arena.alloc(
304304
object_decl.ident.tree.item.clone().into(),
305-
parent,
305+
Some(parent),
306306
if let Some(declared_by) = declared_by {
307307
Related::DeclaredBy(declared_by)
308308
} else {
@@ -358,16 +358,11 @@ impl<'a> AnalyzeContext<'a> {
358358
);
359359
self.analyze_interface_list(
360360
&nested,
361-
Some(ent),
361+
ent,
362362
&mut component.generic_list,
363363
diagnostics,
364364
)?;
365-
self.analyze_interface_list(
366-
&nested,
367-
Some(ent),
368-
&mut component.port_list,
369-
diagnostics,
370-
)?;
365+
self.analyze_interface_list(&nested, ent, &mut component.port_list, diagnostics)?;
371366

372367
let kind = AnyEntKind::Component(nested.into_region());
373368
unsafe {
@@ -509,20 +504,20 @@ impl<'a> AnalyzeContext<'a> {
509504

510505
self.define_labels_for_sequential_part(
511506
&subpgm_region,
512-
Some(subpgm_ent.into()),
507+
subpgm_ent.into(),
513508
&mut body.statements,
514509
diagnostics,
515510
)?;
516511
self.analyze_declarative_part(
517512
&subpgm_region,
518-
Some(subpgm_ent.into()),
513+
subpgm_ent.into(),
519514
&mut body.declarations,
520515
diagnostics,
521516
)?;
522517

523518
self.analyze_sequential_part(
524519
&subpgm_region,
525-
Some(subpgm_ent.into()),
520+
subpgm_ent.into(),
526521
&sroot,
527522
&mut body.statements,
528523
diagnostics,
@@ -608,7 +603,7 @@ impl<'a> AnalyzeContext<'a> {
608603
pub(crate) fn analyze_type_declaration(
609604
&self,
610605
scope: &Scope<'a>,
611-
parent: Option<EntRef<'a>>,
606+
parent: EntRef<'a>,
612607
type_decl: &mut TypeDeclaration,
613608
// Is the full type declaration of an incomplete type
614609
// Overwrite id when defining full type
@@ -639,7 +634,7 @@ impl<'a> AnalyzeContext<'a> {
639634
for literal in enumeration.iter_mut() {
640635
let literal_ent = self.arena.explicit(
641636
literal.tree.item.clone().into_designator(),
642-
Some(enum_type.into()),
637+
enum_type.into(),
643638
AnyEntKind::Overloaded(Overloaded::EnumLiteral(signature.clone())),
644639
Some(&literal.tree.pos),
645640
);
@@ -692,7 +687,7 @@ impl<'a> AnalyzeContext<'a> {
692687
let region = Scope::extend(ptype_region, Some(scope));
693688
self.analyze_declarative_part(
694689
&region,
695-
Some(ptype_body),
690+
ptype_body,
696691
&mut body.decl,
697692
diagnostics,
698693
)?;
@@ -749,7 +744,7 @@ impl<'a> AnalyzeContext<'a> {
749744
ProtectedTypeDeclarativeItem::Subprogram(ref mut subprogram) => {
750745
match self.subprogram_declaration(
751746
scope,
752-
Some(ptype),
747+
ptype,
753748
subprogram,
754749
Overloaded::SubprogramDecl,
755750
diagnostics,
@@ -800,7 +795,7 @@ impl<'a> AnalyzeContext<'a> {
800795
Ok(subtype) => {
801796
let elem = self.arena.define(
802797
&mut elem_decl.ident,
803-
Some(type_ent.into()),
798+
type_ent.into(),
804799
AnyEntKind::ElementDeclaration(subtype),
805800
);
806801
region.add(elem, diagnostics);
@@ -1112,7 +1107,7 @@ impl<'a> AnalyzeContext<'a> {
11121107
fn analyze_interface_declaration(
11131108
&self,
11141109
scope: &Scope<'a>,
1115-
parent: Option<EntRef<'a>>,
1110+
parent: EntRef<'a>,
11161111
decl: &mut InterfaceDeclaration,
11171112
diagnostics: &mut dyn DiagnosticHandler,
11181113
) -> AnalysisResult<EntRef<'a>> {
@@ -1213,7 +1208,7 @@ impl<'a> AnalyzeContext<'a> {
12131208
pub fn analyze_interface_list(
12141209
&self,
12151210
scope: &Scope<'a>,
1216-
parent: Option<EntRef<'a>>,
1211+
parent: EntRef<'a>,
12171212
declarations: &mut [InterfaceDeclaration],
12181213
diagnostics: &mut dyn DiagnosticHandler,
12191214
) -> FatalResult {
@@ -1233,7 +1228,7 @@ impl<'a> AnalyzeContext<'a> {
12331228
pub fn analyze_parameter_list(
12341229
&self,
12351230
scope: &Scope<'a>,
1236-
parent: Option<EntRef<'a>>,
1231+
parent: EntRef<'a>,
12371232
declarations: &mut [InterfaceDeclaration],
12381233
diagnostics: &mut dyn DiagnosticHandler,
12391234
) -> FatalResult<FormalRegion<'a>> {
@@ -1425,7 +1420,7 @@ impl<'a> AnalyzeContext<'a> {
14251420
fn subprogram_declaration(
14261421
&self,
14271422
scope: &Scope<'a>,
1428-
parent: Option<EntRef<'a>>,
1423+
parent: EntRef<'a>,
14291424
subprogram: &mut SubprogramDeclaration,
14301425
to_kind: impl Fn(Signature<'a>) -> Overloaded<'a>,
14311426
diagnostics: &mut dyn DiagnosticHandler,
@@ -1446,7 +1441,7 @@ impl<'a> AnalyzeContext<'a> {
14461441
SubprogramDeclaration::Function(fun) => {
14471442
let params = self.analyze_parameter_list(
14481443
&subpgm_region,
1449-
Some(ent),
1444+
ent,
14501445
&mut fun.parameter_list,
14511446
diagnostics,
14521447
);
@@ -1456,7 +1451,7 @@ impl<'a> AnalyzeContext<'a> {
14561451
SubprogramDeclaration::Procedure(procedure) => {
14571452
let params = self.analyze_parameter_list(
14581453
&subpgm_region,
1459-
Some(ent),
1454+
ent,
14601455
&mut procedure.parameter_list,
14611456
diagnostics,
14621457
);

vhdl_lang/src/analysis/design_unit.rs

Lines changed: 14 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -57,19 +57,19 @@ impl<'a> AnalyzeContext<'a> {
5757
primary_scope.make_potentially_visible(Some(unit.pos()), ent);
5858

5959
if let Some(ref mut list) = unit.generic_clause {
60-
self.analyze_interface_list(&primary_scope, Some(ent), list, diagnostics)?;
60+
self.analyze_interface_list(&primary_scope, ent, list, diagnostics)?;
6161
}
6262
if let Some(ref mut list) = unit.port_clause {
63-
self.analyze_interface_list(&primary_scope, Some(ent), list, diagnostics)?;
63+
self.analyze_interface_list(&primary_scope, ent, list, diagnostics)?;
6464
}
6565
self.define_labels_for_concurrent_part(
6666
&primary_scope,
67-
Some(ent),
67+
ent,
6868
&mut unit.statements,
6969
diagnostics,
7070
)?;
71-
self.analyze_declarative_part(&primary_scope, Some(ent), &mut unit.decl, diagnostics)?;
72-
self.analyze_concurrent_part(&primary_scope, Some(ent), &mut unit.statements, diagnostics)?;
71+
self.analyze_declarative_part(&primary_scope, ent, &mut unit.decl, diagnostics)?;
72+
self.analyze_concurrent_part(&primary_scope, ent, &mut unit.statements, diagnostics)?;
7373

7474
let region = primary_scope.into_region();
7575
let visibility = root_scope.into_visibility();
@@ -118,7 +118,7 @@ impl<'a> AnalyzeContext<'a> {
118118

119119
self.arena.define(
120120
&mut unit.ident,
121-
Some(self.work_library()),
121+
self.work_library(),
122122
AnyEntKind::Design(Design::Configuration),
123123
);
124124

@@ -143,9 +143,9 @@ impl<'a> AnalyzeContext<'a> {
143143
scope.make_potentially_visible(Some(unit.pos()), ent);
144144

145145
if let Some(ref mut list) = unit.generic_clause {
146-
self.analyze_interface_list(&scope, Some(ent), list, diagnostics)?;
146+
self.analyze_interface_list(&scope, ent, list, diagnostics)?;
147147
}
148-
self.analyze_declarative_part(&scope, Some(ent), &mut unit.decl, diagnostics)?;
148+
self.analyze_declarative_part(&scope, ent, &mut unit.decl, diagnostics)?;
149149

150150
if !self.has_package_body() {
151151
scope.close(diagnostics);
@@ -204,7 +204,7 @@ impl<'a> AnalyzeContext<'a> {
204204

205205
self.arena.define(
206206
&mut unit.ident,
207-
Some(self.work_library()),
207+
self.work_library(),
208208
AnyEntKind::Design(Design::Context(scope.into_region())),
209209
);
210210

@@ -249,21 +249,16 @@ impl<'a> AnalyzeContext<'a> {
249249

250250
let arch = self.arena.define(
251251
&mut unit.ident,
252-
Some(primary.into()),
252+
primary.into(),
253253
AnyEntKind::Design(Design::Architecture(primary)),
254254
);
255255

256256
// Architecture name is visible
257257
scope.make_potentially_visible(Some(unit.pos()), arch);
258258

259-
self.define_labels_for_concurrent_part(
260-
&scope,
261-
Some(arch),
262-
&mut unit.statements,
263-
diagnostics,
264-
)?;
265-
self.analyze_declarative_part(&scope, Some(arch), &mut unit.decl, diagnostics)?;
266-
self.analyze_concurrent_part(&scope, Some(arch), &mut unit.statements, diagnostics)?;
259+
self.define_labels_for_concurrent_part(&scope, arch, &mut unit.statements, diagnostics)?;
260+
self.analyze_declarative_part(&scope, arch, &mut unit.decl, diagnostics)?;
261+
self.analyze_concurrent_part(&scope, arch, &mut unit.statements, diagnostics)?;
267262
scope.close(diagnostics);
268263
Ok(())
269264
}
@@ -308,7 +303,7 @@ impl<'a> AnalyzeContext<'a> {
308303

309304
let scope = Scope::extend(region, Some(&root_scope));
310305

311-
self.analyze_declarative_part(&scope, Some(primary.into()), &mut unit.decl, diagnostics)?;
306+
self.analyze_declarative_part(&scope, primary.into(), &mut unit.decl, diagnostics)?;
312307
scope.close(diagnostics);
313308
Ok(())
314309
}

vhdl_lang/src/analysis/named_entity.rs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -191,7 +191,7 @@ impl Arena {
191191
pub fn define<'a, T: HasIdent>(
192192
&'a self,
193193
decl: &mut WithDecl<T>,
194-
parent: Option<EntRef<'a>>,
194+
parent: EntRef<'a>,
195195
kind: AnyEntKind<'a>,
196196
) -> EntRef<'a> {
197197
let ent = self.explicit(
@@ -207,13 +207,13 @@ impl Arena {
207207
pub fn explicit<'a>(
208208
&'a self,
209209
designator: impl Into<Designator>,
210-
parent: Option<EntRef<'a>>,
210+
parent: EntRef<'a>,
211211
kind: AnyEntKind<'a>,
212212
decl_pos: Option<&SrcPos>,
213213
) -> EntRef<'a> {
214214
self.alloc(
215215
designator.into(),
216-
parent,
216+
Some(parent),
217217
Related::None,
218218
kind,
219219
decl_pos.cloned(),
@@ -445,7 +445,7 @@ impl WithDecl<Ident> {
445445
pub fn define<'a>(
446446
&mut self,
447447
arena: &'a Arena,
448-
parent: Option<EntRef<'a>>,
448+
parent: EntRef<'a>,
449449
kind: AnyEntKind<'a>,
450450
) -> EntRef<'a> {
451451
let ent = arena.explicit(
@@ -463,7 +463,7 @@ impl WithDecl<WithPos<Designator>> {
463463
pub fn define<'a>(
464464
&mut self,
465465
arena: &'a Arena,
466-
parent: Option<EntRef<'a>>,
466+
parent: EntRef<'a>,
467467
kind: AnyEntKind<'a>,
468468
) -> EntRef<'a> {
469469
let ent = arena.explicit(self.tree.item.clone(), parent, kind, Some(&self.tree.pos));

0 commit comments

Comments
 (0)