Skip to content

Commit de9b2f8

Browse files
committed
Merge branch 'master' of https://github.com/kraigher/rust_hdl
2 parents 2ee456d + 7a49fed commit de9b2f8

File tree

6 files changed

+233
-352
lines changed

6 files changed

+233
-352
lines changed

vhdl_lang/src/analysis/declarative.rs

Lines changed: 32 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@ impl<'a> AnalyzeContext<'a> {
6565
Some(decl_pos),
6666
);
6767
entry.insert((ent.id(), type_decl.ident.pos().clone()));
68-
region.add_named_entity(ent, diagnostics);
68+
region.add_named_entity(Arc::new(ent), diagnostics);
6969
}
7070
Entry::Occupied(entry) => {
7171
let (_, decl_pos) = entry.get();
@@ -130,7 +130,7 @@ impl<'a> AnalyzeContext<'a> {
130130
resolved_name.and_then(|resolved| resolved.into_non_overloaded());
131131

132132
if let Some(named_entity) = named_entity {
133-
region.add_implicit_declarations(
133+
region.add_implicit_declaration_aliases(
134134
Some(&designator.pos),
135135
&named_entity,
136136
diagnostics,
@@ -251,37 +251,31 @@ impl<'a> AnalyzeContext<'a> {
251251
) -> FatalNullResult {
252252
match type_decl.def {
253253
TypeDefinition::Enumeration(ref enumeration) => {
254-
for literal in enumeration.iter() {
255-
parent.add(
256-
literal.clone().map_into(|lit| lit.into_designator()),
257-
NamedEntityKind::Overloaded,
258-
diagnostics,
259-
)
260-
}
254+
let mut implicit = Vec::with_capacity(enumeration.len());
261255

262-
let mut enum_region = Region::default();
263-
let mut ignored = Vec::new();
264256
for literal in enumeration.iter() {
265-
enum_region.add(
266-
literal.clone().map_into(|lit| lit.into_designator()),
257+
let literal_ent = NamedEntity::new(
258+
literal.item.clone().into_designator(),
267259
NamedEntityKind::Overloaded,
268-
// Ignore diagnostics as they will be given above
269-
&mut ignored,
270-
)
260+
Some(&literal.pos),
261+
);
262+
let literal_ent = Arc::new(literal_ent);
263+
implicit.push(literal_ent.clone());
264+
parent.add_named_entity(literal_ent, diagnostics);
271265
}
272266

273267
add_or_overwrite(
274268
parent,
275269
&type_decl.ident,
276-
NamedEntityKind::TypeDeclaration(Some(Arc::new(enum_region))),
270+
NamedEntityKind::TypeDeclaration(implicit),
277271
overwrite_id,
278272
diagnostics,
279273
);
280274
}
281275
TypeDefinition::ProtectedBody(ref mut body) => {
282276
body.type_reference.clear_reference();
283277

284-
match parent.lookup_extended(&type_decl.ident.item.clone().into()) {
278+
match parent.lookup_immediate(&type_decl.ident.item.clone().into()) {
285279
Some(visible) => {
286280
let is_ok = match visible.clone().into_non_overloaded() {
287281
Ok(ent) => {
@@ -326,7 +320,7 @@ impl<'a> AnalyzeContext<'a> {
326320
let id = add_or_overwrite(
327321
parent,
328322
&type_decl.ident,
329-
NamedEntityKind::TypeDeclaration(None),
323+
NamedEntityKind::TypeDeclaration(Vec::new()),
330324
overwrite_id,
331325
diagnostics,
332326
);
@@ -346,15 +340,12 @@ impl<'a> AnalyzeContext<'a> {
346340
}
347341
let region = region.without_parent();
348342

349-
parent.overwrite(
343+
parent.overwrite(NamedEntity::new_with_id(
344+
id,
350345
type_decl.ident.name().clone(),
351-
NamedEntity::new_with_id(
352-
id,
353-
type_decl.ident.name().clone(),
354-
NamedEntityKind::ProtectedType(Arc::new(region)),
355-
Some(type_decl.ident.pos()),
356-
),
357-
);
346+
NamedEntityKind::ProtectedType(Arc::new(region)),
347+
Some(type_decl.ident.pos()),
348+
));
358349
}
359350
TypeDefinition::Record(ref mut element_decls) => {
360351
let mut region = Region::default();
@@ -367,7 +358,7 @@ impl<'a> AnalyzeContext<'a> {
367358
add_or_overwrite(
368359
parent,
369360
&type_decl.ident,
370-
NamedEntityKind::TypeDeclaration(None),
361+
NamedEntityKind::TypeDeclaration(Vec::new()),
371362
overwrite_id,
372363
diagnostics,
373364
);
@@ -378,7 +369,7 @@ impl<'a> AnalyzeContext<'a> {
378369
add_or_overwrite(
379370
parent,
380371
&type_decl.ident,
381-
NamedEntityKind::TypeDeclaration(None),
372+
NamedEntityKind::TypeDeclaration(Vec::new()),
382373
overwrite_id,
383374
diagnostics,
384375
);
@@ -392,7 +383,7 @@ impl<'a> AnalyzeContext<'a> {
392383
add_or_overwrite(
393384
parent,
394385
&type_decl.ident,
395-
NamedEntityKind::TypeDeclaration(None),
386+
NamedEntityKind::TypeDeclaration(Vec::new()),
396387
overwrite_id,
397388
diagnostics,
398389
);
@@ -430,7 +421,7 @@ impl<'a> AnalyzeContext<'a> {
430421
add_or_overwrite(
431422
parent,
432423
&type_decl.ident,
433-
NamedEntityKind::TypeDeclaration(None),
424+
NamedEntityKind::TypeDeclaration(Vec::new()),
434425
overwrite_id,
435426
diagnostics,
436427
);
@@ -444,7 +435,7 @@ impl<'a> AnalyzeContext<'a> {
444435
add_or_overwrite(
445436
parent,
446437
&type_decl.ident,
447-
NamedEntityKind::TypeDeclaration(None),
438+
NamedEntityKind::TypeDeclaration(Vec::new()),
448439
overwrite_id,
449440
diagnostics,
450441
);
@@ -455,19 +446,20 @@ impl<'a> AnalyzeContext<'a> {
455446
err.add_to(diagnostics)?;
456447
}
457448

458-
let mut implicit = Region::default();
459-
for name in ["file_open", "file_close", "endfile"].iter() {
460-
implicit.add_implicit(
449+
let names = ["file_open", "file_close", "endfile"];
450+
let mut implicit = Vec::with_capacity(names.len());
451+
for name in names.iter() {
452+
let ent = NamedEntity::new(
461453
Designator::Identifier(self.symbol_utf8(name)),
462-
None,
463454
NamedEntityKind::Overloaded,
464-
diagnostics,
455+
None,
465456
);
457+
implicit.push(Arc::new(ent));
466458
}
467459
add_or_overwrite(
468460
parent,
469461
&type_decl.ident,
470-
NamedEntityKind::TypeDeclaration(Some(Arc::new(implicit))),
462+
NamedEntityKind::TypeDeclaration(implicit),
471463
overwrite_id,
472464
diagnostics,
473465
);
@@ -726,12 +718,12 @@ fn add_or_overwrite(
726718
) -> EntityId {
727719
if let Some(id) = old_id {
728720
let ent = NamedEntity::new_with_id(id, name.name().clone(), kind, Some(name.pos()));
729-
region.overwrite(name.name().clone(), ent);
721+
region.overwrite(ent);
730722
id
731723
} else {
732724
let ent = NamedEntity::new(name.name().clone(), kind, Some(&name.pos));
733725
let id = ent.id();
734-
region.add_named_entity(ent, diagnostics);
726+
region.add_named_entity(Arc::new(ent), diagnostics);
735727
id
736728
}
737729
}

vhdl_lang/src/analysis/design_unit.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -223,7 +223,7 @@ impl<'a> AnalyzeContext<'a> {
223223

224224
unit.entity_name.set_reference_pos(Some(entity.pos()));
225225

226-
let mut root_region = Region::extend(&entity.result().root_region, None);
226+
let mut root_region = Region::with_parent(&entity.result().root_region);
227227
self.analyze_context_clause(&mut root_region, &mut unit.context_clause, diagnostics)?;
228228
let mut region = Region::extend(&entity.result().region, Some(&root_region));
229229

@@ -266,7 +266,7 @@ impl<'a> AnalyzeContext<'a> {
266266

267267
unit.ident.set_reference_pos(Some(package.pos()));
268268
// @TODO make pattern of primary/secondary extension
269-
let mut root_region = Region::extend(&package.result().root_region, None);
269+
let mut root_region = Region::with_parent(&package.result().root_region);
270270
self.analyze_context_clause(&mut root_region, &mut unit.context_clause, diagnostics)?;
271271

272272
let mut region = Region::extend(&package.result().region, Some(&root_region));
@@ -617,7 +617,7 @@ impl<'a> AnalyzeContext<'a> {
617617

618618
pub enum UsedNames {
619619
/// A single name was used selected
620-
Single(VisibleDeclaration),
620+
Single(NamedEntities),
621621
/// All names within was selected
622622
/// @TODO add pos for where declaration was made visible into VisibleDeclaration
623623
AllWithin(SrcPos, Arc<NamedEntity>),

vhdl_lang/src/analysis/named_entity.rs

Lines changed: 12 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,8 @@ pub enum NamedEntityKind {
1919
Component,
2020
Attribute,
2121
Overloaded,
22-
// An optional region with implicit declarations
23-
TypeDeclaration(Option<Arc<Region<'static>>>),
22+
// An optional list of implicit declarations
23+
TypeDeclaration(Vec<Arc<NamedEntity>>),
2424
Subtype(Subtype),
2525
IncompleteType,
2626
InterfaceType,
@@ -130,7 +130,10 @@ impl ObjectClass {
130130
}
131131
}
132132

133-
pub type EntityId = usize;
133+
#[derive(Copy, Clone, PartialEq, Eq, Hash)]
134+
pub struct EntityId {
135+
id: usize,
136+
}
134137

135138
pub struct NamedEntity {
136139
/// An unique id of the entity
@@ -166,7 +169,7 @@ impl NamedEntity {
166169
}
167170
}
168171

169-
pub fn id(&self) -> usize {
172+
pub fn id(&self) -> EntityId {
170173
self.id
171174
}
172175

@@ -189,30 +192,13 @@ impl NamedEntity {
189192
}
190193

191194
pub fn is_overloaded(&self) -> bool {
192-
if let NamedEntityKind::Overloaded = self.kind {
195+
if let NamedEntityKind::Overloaded = self.as_actual().kind {
193196
true
194197
} else {
195198
false
196199
}
197200
}
198201

199-
/// Return a duplicate declaration of the previously declared named entity
200-
pub fn is_duplicate_of<'a>(&self, prev: &'a Self) -> bool {
201-
if self.is_overloaded() && prev.is_overloaded() {
202-
return false;
203-
}
204-
205-
match prev.kind {
206-
// Everything expect deferred combinations are forbidden
207-
NamedEntityKind::DeferredConstant if self.kind.is_non_deferred_constant() => {}
208-
_ => {
209-
return true;
210-
}
211-
}
212-
213-
false
214-
}
215-
216202
/// Strip aliases and return reference to actual named entity
217203
pub fn as_actual(&self) -> &NamedEntity {
218204
match self.kind() {
@@ -251,6 +237,8 @@ impl NamedEntity {
251237
static COUNTER: AtomicUsize = AtomicUsize::new(1);
252238

253239
// Using 64-bits we can create 5 * 10**9 ids per second for 100 years before wrapping
254-
pub fn new_id() -> usize {
255-
COUNTER.fetch_add(1, Ordering::Relaxed)
240+
pub fn new_id() -> EntityId {
241+
EntityId {
242+
id: COUNTER.fetch_add(1, Ordering::Relaxed),
243+
}
256244
}

0 commit comments

Comments
 (0)