Skip to content

Commit cb5eaf4

Browse files
authored
Merge pull request #371 from Schottkyc137/368-undefined-view-name
Analyze mode view elements
2 parents 4f9caed + 5ce6365 commit cb5eaf4

File tree

2 files changed

+82
-0
lines changed

2 files changed

+82
-0
lines changed

vhdl_lang/src/analysis/declarative.rs

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -675,6 +675,7 @@ impl<'a> AnalyzeContext<'a, '_> {
675675
name.decl.set_unique_reference(&record_element);
676676
unassociated.remove(&record_element);
677677
}
678+
self.analyze_mode_view_element(&mut element.mode, scope, diagnostics)?;
678679
}
679680
if !unassociated.is_empty() {
680681
diagnostics.add(
@@ -686,6 +687,34 @@ impl<'a> AnalyzeContext<'a, '_> {
686687
Ok(self.define(&mut view.ident, parent, AnyEntKind::View(typ), src_span))
687688
}
688689

690+
fn analyze_mode_view_element(
691+
&self,
692+
mode: &mut ElementMode,
693+
scope: &Scope<'a>,
694+
diagnostics: &mut dyn DiagnosticHandler,
695+
) -> EvalResult {
696+
match mode {
697+
ElementMode::Simple(_) => {}
698+
ElementMode::Record(name) | ElementMode::Array(name) => {
699+
let Some(resolved_name) =
700+
as_fatal(self.name_resolve(scope, name.span, &mut name.item, diagnostics))?
701+
else {
702+
return Ok(());
703+
};
704+
match resolved_name {
705+
ResolvedName::Final(ent) if matches!(ent.kind(), AnyEntKind::View(_)) => {}
706+
_ => {
707+
diagnostics.push(Diagnostic::mismatched_kinds(
708+
name.span.pos(self.ctx),
709+
"Expected view",
710+
));
711+
}
712+
}
713+
}
714+
}
715+
Ok(())
716+
}
717+
689718
fn find_deferred_constant_declaration(
690719
&self,
691720
scope: &Scope<'a>,

vhdl_lang/src/analysis/tests/view_declarations.rs

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -617,3 +617,56 @@ end entity;
617617
)],
618618
)
619619
}
620+
621+
#[test]
622+
fn undefined_name_for_nested_view() {
623+
let mut builder = LibraryBuilder::with_standard(VHDL2019);
624+
let code = builder.code(
625+
"libname",
626+
"\
627+
package test is
628+
type my_rec_t is record
629+
a : bit;
630+
end record;
631+
view invalid_view of my_rec_t is
632+
a : view undefined_view;
633+
end view;
634+
end package;
635+
",
636+
);
637+
check_diagnostics(
638+
builder.analyze(),
639+
vec![Diagnostic::new(
640+
code.s1("undefined_view"),
641+
"No declaration of 'undefined_view'",
642+
ErrorCode::Unresolved,
643+
)],
644+
)
645+
}
646+
647+
#[test]
648+
fn view_that_is_not_a_view() {
649+
let mut builder = LibraryBuilder::with_standard(VHDL2019);
650+
let code = builder.code(
651+
"libname",
652+
"\
653+
package test is
654+
constant some_constant : bit := '1';
655+
type my_rec_t is record
656+
a : bit;
657+
end record;
658+
view invalid_view of my_rec_t is
659+
a : view some_constant;
660+
end view;
661+
end package;
662+
",
663+
);
664+
check_diagnostics(
665+
builder.analyze(),
666+
vec![Diagnostic::new(
667+
code.s1("a : view some_constant;").s1("some_constant"),
668+
"Expected view",
669+
ErrorCode::MismatchedKinds,
670+
)],
671+
)
672+
}

0 commit comments

Comments
 (0)