Skip to content

Commit 780ffce

Browse files
authored
Add token span information to Symbol Documentation (#262)
* Add token span to AnyEnt and to symbols documentation * Remove leftover comment * Revert unnecessary change * Revert debug print
1 parent cb19f05 commit 780ffce

File tree

20 files changed

+245
-133
lines changed

20 files changed

+245
-133
lines changed

vhdl_lang/src/analysis/concurrent.rs

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

7-
// These fields are better explicit than .. since we are forced to consider if new fields should be searched
8-
97
use super::*;
108
use crate::analysis::names::ResolvedName;
119
use crate::ast::*;
@@ -49,6 +47,7 @@ impl<'a> AnalyzeContext<'a> {
4947
parent,
5048
AnyEntKind::Concurrent(statement.statement.item.label_typ()),
5149
Some(label.pos()),
50+
None,
5251
);
5352
statement.label.decl.set(ent.id());
5453
scope.add(ent, diagnostics);
@@ -60,6 +59,7 @@ impl<'a> AnalyzeContext<'a> {
6059
Related::None,
6160
AnyEntKind::Concurrent(statement.statement.item.label_typ()),
6261
None,
62+
None,
6363
);
6464
statement.label.decl.set(ent.id());
6565
}
@@ -136,7 +136,7 @@ impl<'a> AnalyzeContext<'a> {
136136
let typ = as_fatal(self.drange_type(scope, discrete_range, diagnostics))?;
137137
let nested = scope.nested();
138138
nested.add(
139-
index_name.define(self.arena, parent, AnyEntKind::LoopParameter(typ)),
139+
index_name.define(self.arena, parent, AnyEntKind::LoopParameter(typ), None),
140140
diagnostics,
141141
);
142142
self.analyze_generate_body(&nested, parent, body, diagnostics)?;
@@ -239,6 +239,7 @@ impl<'a> AnalyzeContext<'a> {
239239
self.arena,
240240
parent,
241241
AnyEntKind::Concurrent(Some(Concurrent::Generate)),
242+
None,
242243
);
243244
scope.add(ent, diagnostics);
244245
inner_parent = ent;

vhdl_lang/src/analysis/declarative.rs

Lines changed: 24 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -130,19 +130,21 @@ impl<'a> AnalyzeContext<'a> {
130130
let full_definiton =
131131
find_full_type_definition(type_decl.ident.name(), remaining);
132132

133-
let decl_pos = match full_definiton {
134-
Some(full_decl) => full_decl.ident.pos(),
133+
let (decl_pos, span) = match full_definiton {
134+
Some(full_decl) => {
135+
(full_decl.ident.pos(), Some(full_decl.span))
136+
}
135137
None => {
136138
let mut error = Diagnostic::error(
137139
type_decl.ident.pos(),
138140
format!(
139-
"Missing full type declaration of incomplete type '{}'",
140-
type_decl.ident.name()
141-
),
141+
"Missing full type declaration of incomplete type '{}'",
142+
type_decl.ident.name()
143+
),
142144
);
143145
error.add_related(type_decl.ident.pos(), "The full type declaration shall occur immediately within the same declarative part");
144146
diagnostics.push(error);
145-
type_decl.ident.pos()
147+
(type_decl.ident.pos(), None)
146148
}
147149
};
148150

@@ -155,6 +157,7 @@ impl<'a> AnalyzeContext<'a> {
155157
parent,
156158
AnyEntKind::Type(Type::Incomplete),
157159
Some(decl_pos),
160+
span,
158161
);
159162
reference.set_unique_reference(ent);
160163

@@ -213,7 +216,7 @@ impl<'a> AnalyzeContext<'a> {
213216
name,
214217
subtype_indication,
215218
signature,
216-
span: _,
219+
span,
217220
} = alias;
218221

219222
let resolved_name = self.name_resolve(scope, &name.pos, &mut name.item, diagnostics);
@@ -298,7 +301,7 @@ impl<'a> AnalyzeContext<'a> {
298301
}
299302
};
300303

301-
Ok(designator.define(self.arena, parent, kind))
304+
Ok(designator.define(self.arena, parent, kind, Some(*span)))
302305
}
303306

304307
pub(crate) fn analyze_declaration(
@@ -308,6 +311,7 @@ impl<'a> AnalyzeContext<'a> {
308311
decl: &mut Declaration,
309312
diagnostics: &mut dyn DiagnosticHandler,
310313
) -> FatalResult {
314+
let src_span = decl.span();
311315
match decl {
312316
Declaration::Alias(alias) => {
313317
if let Some(ent) =
@@ -323,6 +327,7 @@ impl<'a> AnalyzeContext<'a> {
323327
implicit.designator().clone(),
324328
AnyEntKind::Overloaded(Overloaded::Alias(implicit)),
325329
ent.decl_pos(),
330+
ent.src_span,
326331
);
327332
scope.add(impicit_alias, diagnostics);
328333
}
@@ -389,6 +394,7 @@ impl<'a> AnalyzeContext<'a> {
389394
},
390395
kind,
391396
Some(object_decl.ident.tree.pos().clone()),
397+
Some(src_span),
392398
);
393399
object_decl.ident.decl.set(object_ent.id());
394400

@@ -419,7 +425,8 @@ impl<'a> AnalyzeContext<'a> {
419425

420426
if let Some(subtype) = subtype {
421427
scope.add(
422-
self.arena.define(ident, parent, AnyEntKind::File(subtype)),
428+
self.arena
429+
.define(ident, parent, AnyEntKind::File(subtype), Some(src_span)),
423430
diagnostics,
424431
);
425432
}
@@ -430,6 +437,7 @@ impl<'a> AnalyzeContext<'a> {
430437
&mut component.ident,
431438
parent,
432439
AnyEntKind::Component(Region::default()),
440+
Some(src_span),
433441
);
434442
self.analyze_interface_list(
435443
&nested,
@@ -458,6 +466,7 @@ impl<'a> AnalyzeContext<'a> {
458466
&mut attr_decl.ident,
459467
parent,
460468
AnyEntKind::Attribute(typ),
469+
Some(src_span),
461470
),
462471
diagnostics,
463472
);
@@ -527,6 +536,7 @@ impl<'a> AnalyzeContext<'a> {
527536
FormalRegion::new_params(),
528537
None,
529538
))),
539+
Some(src_span),
530540
);
531541
let referenced_name = &mut instance.subprogram_name;
532542
if let Some(name) = as_fatal(self.name_resolve(
@@ -559,6 +569,7 @@ impl<'a> AnalyzeContext<'a> {
559569
&mut instance.ident,
560570
parent,
561571
AnyEntKind::Design(Design::PackageInstance(Region::default())),
572+
Some(src_span),
562573
);
563574

564575
if let Some(pkg_region) =
@@ -769,6 +780,7 @@ impl<'a> AnalyzeContext<'a> {
769780
&mut file_decl.ident,
770781
parent,
771782
AnyEntKind::InterfaceFile(file_type.type_mark().to_owned()),
783+
None,
772784
)
773785
}
774786
InterfaceDeclaration::Object(ref mut object_decl) => {
@@ -805,13 +817,15 @@ impl<'a> AnalyzeContext<'a> {
805817
subtype,
806818
has_default: object_decl.expression.is_some(),
807819
}),
820+
None,
808821
)
809822
}
810823
InterfaceDeclaration::Type(ref mut ident) => {
811824
let typ = TypeEnt::from_any(self.arena.define(
812825
ident,
813826
parent,
814827
AnyEntKind::Type(Type::Interface),
828+
None,
815829
))
816830
.unwrap();
817831

@@ -851,6 +865,7 @@ impl<'a> AnalyzeContext<'a> {
851865
&mut instance.ident,
852866
parent,
853867
AnyEntKind::Design(Design::InterfacePackageInstance(package_region)),
868+
None,
854869
)
855870
}
856871
};

vhdl_lang/src/analysis/design_unit.rs

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ use crate::analysis::names::ResolvedName;
99
use crate::ast::*;
1010
use crate::data::*;
1111
use crate::named_entity::*;
12+
use crate::HasTokenSpan;
1213
use analyze::*;
1314

1415
impl<'a> AnalyzeContext<'a> {
@@ -50,6 +51,7 @@ impl<'a> AnalyzeContext<'a> {
5051
self.work_library(),
5152
AnyEntKind::Design(Design::Entity(Visibility::default(), Region::default())),
5253
Some(unit.pos()),
54+
Some(unit.span()),
5355
);
5456

5557
unit.ident.decl.set(ent.id());
@@ -89,6 +91,7 @@ impl<'a> AnalyzeContext<'a> {
8991
unit: &mut ConfigurationDeclaration,
9092
diagnostics: &mut dyn DiagnosticHandler,
9193
) -> FatalResult {
94+
let src_span = unit.span();
9295
let root_region = Scope::default();
9396
self.add_implicit_context_clause(&root_region)?;
9497
self.analyze_context_clause(&root_region, &mut unit.context_clause, diagnostics)?;
@@ -117,6 +120,7 @@ impl<'a> AnalyzeContext<'a> {
117120
&mut unit.ident,
118121
self.work_library(),
119122
AnyEntKind::Design(Design::Configuration),
123+
Some(src_span),
120124
);
121125

122126
Ok(())
@@ -132,6 +136,7 @@ impl<'a> AnalyzeContext<'a> {
132136
self.work_library(),
133137
AnyEntKind::Design(Design::Package(Visibility::default(), Region::default())),
134138
Some(unit.pos()),
139+
Some(unit.span()),
135140
);
136141

137142
unit.ident.decl.set(ent.id());
@@ -178,6 +183,7 @@ impl<'a> AnalyzeContext<'a> {
178183
self.work_library(),
179184
AnyEntKind::Design(Design::PackageInstance(Region::default())),
180185
Some(unit.pos()),
186+
Some(unit.span()),
181187
);
182188

183189
unit.ident.decl.set(ent.id());
@@ -207,12 +213,14 @@ impl<'a> AnalyzeContext<'a> {
207213
let root_scope = Scope::default();
208214
self.add_implicit_context_clause(&root_scope)?;
209215
let scope = root_scope.nested();
216+
let src_span = unit.span();
210217
self.analyze_context_clause(&scope, &mut unit.items, diagnostics)?;
211218

212219
self.arena.define(
213220
&mut unit.ident,
214221
self.work_library(),
215222
AnyEntKind::Design(Design::Context(scope.into_region())),
223+
Some(src_span),
216224
);
217225

218226
Ok(())
@@ -223,6 +231,7 @@ impl<'a> AnalyzeContext<'a> {
223231
unit: &mut ArchitectureBody,
224232
diagnostics: &mut dyn DiagnosticHandler,
225233
) -> FatalResult {
234+
let src_span = unit.span();
226235
let primary = match self.lookup_in_library(
227236
self.work_library_name(),
228237
&unit.entity_name.item.pos,
@@ -257,6 +266,7 @@ impl<'a> AnalyzeContext<'a> {
257266
&mut unit.ident,
258267
primary.into(),
259268
AnyEntKind::Design(Design::Architecture(primary)),
269+
Some(src_span),
260270
);
261271

262272
root_scope.add(arch, diagnostics);
@@ -310,6 +320,7 @@ impl<'a> AnalyzeContext<'a> {
310320
Related::DeclaredBy(primary.into()),
311321
AnyEntKind::Design(Design::PackageBody),
312322
Some(unit.ident.tree.pos.clone()),
323+
Some(unit.span()),
313324
);
314325
unit.ident.decl.set(body.id());
315326

vhdl_lang/src/analysis/names.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -159,7 +159,7 @@ impl<'a> ResolvedName<'a> {
159159
AnyEntKind::Overloaded(_) => {
160160
return Err(
161161
"Internal error. Unreachable as overloaded is handled outside".to_owned(),
162-
)
162+
);
163163
}
164164
AnyEntKind::File(_)
165165
| AnyEntKind::InterfaceFile(_)
@@ -177,7 +177,7 @@ impl<'a> ResolvedName<'a> {
177177
return Err(format!(
178178
"{} cannot be selected from design unit",
179179
ent.kind().describe()
180-
))
180+
));
181181
}
182182
};
183183

@@ -217,7 +217,7 @@ impl<'a> ResolvedName<'a> {
217217
return Err(
218218
"Internal error. Unreachable as overloded is handled outside this function"
219219
.to_string(),
220-
)
220+
);
221221
}
222222
AnyEntKind::File(_)
223223
| AnyEntKind::InterfaceFile(_)
@@ -230,7 +230,7 @@ impl<'a> ResolvedName<'a> {
230230
return Err(format!(
231231
"{} should never be looked up from the current scope",
232232
ent.kind().describe()
233-
))
233+
));
234234
}
235235
};
236236

vhdl_lang/src/analysis/package_instance.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -274,6 +274,7 @@ impl<'a> AnalyzeContext<'a> {
274274
Related::InstanceOf(uninst),
275275
AnyEntKind::Library, // Will be immediately overwritten below
276276
decl_pos,
277+
uninst.src_span,
277278
);
278279
let kind = self.map_kind(Some(inst), mapping, uninst.kind())?;
279280
unsafe {

0 commit comments

Comments
 (0)