Skip to content

Commit dba05d4

Browse files
committed
Add package declaration in declarative part
1 parent 805ab71 commit dba05d4

File tree

7 files changed

+45
-1
lines changed

7 files changed

+45
-1
lines changed

vhdl_lang/src/analysis/declarative.rs

+7
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ impl Declaration {
4141
| SubprogramBody(_)
4242
| Use(_)
4343
| Package(_)
44+
| PackageDeclaration(_)
4445
| Configuration(_)
4546
| View(_)
4647
),
@@ -61,6 +62,7 @@ impl Declaration {
6162
| SubprogramBody(_)
6263
| Use(_)
6364
| Package(_)
65+
| PackageDeclaration(_)
6466
| View(_)
6567
),
6668
// LRM: package_body_declarative_item
@@ -86,6 +88,7 @@ impl Declaration {
8688
| SubprogramBody(_)
8789
| Use(_)
8890
| Package(_)
91+
| PackageDeclaration(_)
8992
),
9093
// LRM: package_declarative_item
9194
AnyEntKind::Design(Design::Package(..)) => matches!(
@@ -100,6 +103,7 @@ impl Declaration {
100103
| SubprogramInstantiation(_)
101104
| Use(_)
102105
| Package(_)
106+
| PackageDeclaration(_)
103107
| View(_)
104108
),
105109
_ => {
@@ -606,6 +610,9 @@ impl<'a, 't> AnalyzeContext<'a, 't> {
606610
scope.add(ent, diagnostics);
607611
}
608612
}
613+
Declaration::PackageDeclaration(..) => {
614+
// TODO
615+
}
609616
Declaration::Configuration(..) => {}
610617
Declaration::View(view) => {
611618
if let Some(view) = as_fatal(self.analyze_view_declaration(

vhdl_lang/src/analysis/names.rs

+1
Original file line numberDiff line numberDiff line change
@@ -1845,6 +1845,7 @@ impl Declaration {
18451845
Declaration::SubprogramBody(_) => "subprogram body",
18461846
Declaration::Use(_) => "use",
18471847
Declaration::Package(_) => "package instantiation",
1848+
Declaration::PackageDeclaration(_) => "package",
18481849
Declaration::Configuration(_) => "configuration",
18491850
Declaration::View(_) => "view",
18501851
}

vhdl_lang/src/ast.rs

+1
Original file line numberDiff line numberDiff line change
@@ -852,6 +852,7 @@ pub enum Declaration {
852852
SubprogramBody(SubprogramBody),
853853
Use(UseClause),
854854
Package(PackageInstantiation),
855+
PackageDeclaration(PackageDeclaration),
855856
Configuration(ConfigurationSpecification),
856857
View(ModeViewDeclaration),
857858
}

vhdl_lang/src/ast/search.rs

+4
Original file line numberDiff line numberDiff line change
@@ -1080,6 +1080,10 @@ impl Search for Declaration {
10801080
return_if_found!(package_instance.search(ctx, searcher));
10811081
}
10821082

1083+
Declaration::PackageDeclaration(ref package_instance) => {
1084+
return_if_found!(package_instance.search(ctx, searcher)); // @TODO
1085+
}
1086+
10831087
Declaration::Configuration(_) => {
10841088
// @TODO
10851089
}

vhdl_lang/src/named_entity.rs

+1
Original file line numberDiff line numberDiff line change
@@ -631,6 +631,7 @@ impl HasEntityId for Declaration {
631631
Declaration::SubprogramBody(body) => body.ent_id(),
632632
Declaration::SubprogramInstantiation(decl) => decl.ent_id(),
633633
Declaration::Package(pkg) => pkg.ent_id(),
634+
Declaration::PackageDeclaration(_) => None, // @TODO
634635
Declaration::Use(_) => None,
635636
Declaration::Configuration(_) => None,
636637
Declaration::View(decl) => decl.ent_id(),

vhdl_lang/src/syntax/declarative_part.rs

+8-1
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ use super::common::ParseResult;
1010
use super::component_declaration::parse_component_declaration;
1111
use super::configuration::parse_configuration_specification;
1212
use super::context::parse_use_clause;
13+
use super::design_unit::parse_package_declaration;
1314
use super::names::parse_selected_name;
1415
use super::object_declaration::{parse_file_declaration, parse_object_declaration};
1516
use super::subprogram::parse_subprogram;
@@ -104,7 +105,13 @@ pub fn parse_declarative_part(
104105
Type | Subtype => parse_type_declaration(ctx).map(Declaration::Type)?,
105106
Component => parse_component_declaration(ctx).map(Declaration::Component)?,
106107
Impure | Pure | Function | Procedure => parse_subprogram(ctx)?,
107-
Package => parse_package_instantiation(ctx).map(Declaration::Package)?,
108+
Package => {
109+
if ctx.stream.next_kinds_are(&[Package, Identifier, Is, New]) {
110+
parse_package_instantiation(ctx).map(Declaration::Package)?
111+
} else {
112+
parse_package_declaration(ctx).map(Declaration::PackageDeclaration)?
113+
}
114+
}
108115
For => {
109116
parse_configuration_specification(ctx).map(Declaration::Configuration)?
110117
}

vhdl_lang/src/syntax/design_unit.rs

+23
Original file line numberDiff line numberDiff line change
@@ -933,4 +933,27 @@ end entity y;
933933
assert_eq!(tok.kind, Context);
934934
assert_eq!(tok.pos, code.s1("context").pos());
935935
}
936+
937+
#[test]
938+
fn parse_package_declaration_in_declarative_part() {
939+
let code = Code::new(
940+
"\
941+
architecture arch of ent is
942+
package my_pkg is
943+
-- ...
944+
end package;
945+
begin
946+
end arch;
947+
",
948+
);
949+
let file = code.design_file();
950+
let (tokens, _) = &file.design_units[0];
951+
assert_eq!(tokens[0].kind, Architecture);
952+
assert_eq!(tokens[1].kind, Identifier);
953+
assert_eq!(tokens[5].kind, Package);
954+
assert_eq!(tokens[6].kind, Identifier);
955+
assert_eq!(tokens[7].kind, Is);
956+
assert_eq!(tokens[8].kind, End);
957+
assert_eq!(tokens[9].kind, Package);
958+
}
936959
}

0 commit comments

Comments
 (0)