Skip to content

Commit d02a768

Browse files
committed
Add up-levels of relative external name to AST
1 parent 82b45f0 commit d02a768

File tree

2 files changed

+11
-8
lines changed

2 files changed

+11
-8
lines changed

vhdl_lang/src/ast.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -117,7 +117,9 @@ pub enum ExternalObjectClass {
117117
pub enum ExternalPath {
118118
Package(WithPos<Name>),
119119
Absolute(WithPos<Name>),
120-
Relative(WithPos<Name>),
120+
121+
// usize field indicates the number of up-levels ('^')
122+
Relative(WithPos<Name>, usize),
121123
}
122124

123125
/// LRM 8.7 External names

vhdl_lang/src/syntax/names.rs

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -259,19 +259,20 @@ fn parse_inner_external_name(stream: &mut TokenStream) -> ParseResult<ExternalNa
259259
WithPos::from(ExternalPath::Absolute(path_name), path_pos)
260260
},
261261
Circ => {
262-
// @TODO Store number of '^' ("up-levels")
263262
stream.expect_kind(Dot)?;
263+
let mut up_levels = 1;
264264
while stream.skip_if_kind(Circ)? {
265265
stream.expect_kind(Dot)?;
266+
up_levels += 1;
266267
}
267268
let path_name = parse_name(stream)?;
268269
let path_pos = path_name.pos.clone().combine_into(&token);
269-
WithPos::from(ExternalPath::Relative(path_name), path_pos)
270+
WithPos::from(ExternalPath::Relative(path_name, up_levels), path_pos)
270271
},
271272
Identifier => {
272273
let path_name = parse_name_initial_token(stream, token)?;
273274
let path_pos = path_name.pos.clone();
274-
WithPos::from(ExternalPath::Relative(path_name), path_pos)
275+
WithPos::from(ExternalPath::Relative(path_name, 0), path_pos)
275276
}
276277
);
277278

@@ -831,7 +832,7 @@ mod tests {
831832
let external_name = ExternalName {
832833
class: ExternalObjectClass::Signal,
833834
path: WithPos::new(
834-
ExternalPath::Relative(code.s1("dut.foo").name()),
835+
ExternalPath::Relative(code.s1("dut.foo").name(), 0),
835836
code.s1("dut.foo").pos(),
836837
),
837838
subtype: code.s1("std_logic").subtype_indication(),
@@ -848,7 +849,7 @@ mod tests {
848849
let external_name = ExternalName {
849850
class: ExternalObjectClass::Signal,
850851
path: WithPos::new(
851-
ExternalPath::Relative(code.s1("dut.gen(0)").name()),
852+
ExternalPath::Relative(code.s1("dut.gen(0)").name(), 1),
852853
code.s1("^.dut.gen(0)").pos(),
853854
),
854855
subtype: code.s1("std_logic").subtype_indication(),
@@ -865,7 +866,7 @@ mod tests {
865866
let external_name = ExternalName {
866867
class: ExternalObjectClass::Signal,
867868
path: WithPos::new(
868-
ExternalPath::Relative(code.s1("dut.gen(0)").name()),
869+
ExternalPath::Relative(code.s1("dut.gen(0)").name(), 3),
869870
code.s1("^.^.^.dut.gen(0)").pos(),
870871
),
871872
subtype: code.s1("std_logic").subtype_indication(),
@@ -922,7 +923,7 @@ mod tests {
922923
let external_name = ExternalName {
923924
class,
924925
path: WithPos::new(
925-
ExternalPath::Relative(code.s1("dut.foo").name()),
926+
ExternalPath::Relative(code.s1("dut.foo").name(), 0),
926927
code.s1("dut.foo").pos(),
927928
),
928929
subtype: code.s1("std_logic").subtype_indication(),

0 commit comments

Comments
 (0)