Skip to content

Commit 3b75a89

Browse files
committed
Finished adding namespace support for enum types
1 parent cf0b523 commit 3b75a89

File tree

5 files changed

+41
-8
lines changed

5 files changed

+41
-8
lines changed

Diff for: src/lower/mod.rs

+1-2
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@ use crate::{
77
ast::{CInteger, IntegerBits, IntegerRigidity},
88
cli::BuildOptions,
99
ir::{self, BasicBlocks, Global, Literal, OverflowOperator, Value, ValueReference},
10-
name::ResolvedName,
1110
resolved::{
1211
self, Destination, DestinationKind, Expr, ExprKind, FloatOrInteger, FloatSize, Member,
1312
NumericMode, SignOrIndeterminate, StmtKind, StructureLiteral, UnaryMathOperation,
@@ -861,7 +860,7 @@ fn lower_expr(
861860
ExprKind::EnumMemberLiteral(enum_member_literal) => {
862861
let enum_definition = resolved_ast
863862
.enums
864-
.get(&ResolvedName::new(&enum_member_literal.enum_name))
863+
.get(&enum_member_literal.enum_name)
865864
.expect("referenced enum to exist for enum member literal");
866865

867866
let member = enum_definition

Diff for: src/parser/parse_enum.rs

+4-1
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ use crate::{
33
ast::{Enum, EnumMember, Named},
44
inflow::Inflow,
55
name::Name,
6+
parser::annotation::AnnotationKind,
67
token::{Token, TokenKind},
78
};
89
use indexmap::IndexMap;
@@ -13,12 +14,14 @@ impl<'a, I: Inflow<Token>> Parser<'a, I> {
1314
let source = self.source_here();
1415
assert!(self.input.advance().is_enum_keyword());
1516

17+
let mut namespace = None;
1618
let name = self.parse_identifier(Some("for enum name after 'enum' keyword"))?;
1719
self.ignore_newlines();
1820

1921
#[allow(clippy::never_loop, clippy::match_single_binding)]
2022
for annotation in annotations {
2123
match annotation.kind {
24+
AnnotationKind::Namespace(new_namespace) => namespace = Some(new_namespace),
2225
_ => return Err(self.unexpected_annotation(&annotation, Some("for enum"))),
2326
}
2427
}
@@ -55,7 +58,7 @@ impl<'a, I: Inflow<Token>> Parser<'a, I> {
5558
self.parse_token(TokenKind::CloseParen, Some("to close enum body"))?;
5659

5760
Ok(Named::<Enum> {
58-
name: Name::plain(name),
61+
name: Name::new(namespace, name),
5962
value: Enum {
6063
backing_type: None,
6164
members,

Diff for: src/resolve/error.rs

+7
Original file line numberDiff line numberDiff line change
@@ -156,6 +156,10 @@ pub enum ResolveErrorKind {
156156
CannotPerformOnUnspecializedInteger {
157157
operation: String,
158158
},
159+
StaticMemberOfTypeDoesNotExist {
160+
ty: String,
161+
member: String,
162+
},
159163
Other {
160164
message: String,
161165
},
@@ -405,6 +409,9 @@ impl Display for ResolveErrorKind {
405409
ResolveErrorKind::CannotPerformOnUnspecializedInteger { operation } => {
406410
write!(f, "Cannot {operation} unspecialized integers")?;
407411
}
412+
ResolveErrorKind::StaticMemberOfTypeDoesNotExist { ty, member } => {
413+
write!(f, "Static member '{member}' does not exist on type '{ty}'")?;
414+
}
408415
ResolveErrorKind::Other { message } => {
409416
write!(f, "{}", message)?;
410417
}

Diff for: src/resolve/expr/mod.rs

+21-4
Original file line numberDiff line numberDiff line change
@@ -315,14 +315,31 @@ pub fn resolve_expr(
315315
resolved::Expr::new(resolved::ExprKind::BooleanLiteral(*value), source),
316316
)),
317317
ast::ExprKind::EnumMemberLiteral(enum_member_literal) => {
318-
let resolved_type =
319-
resolved::TypeKind::Enum(ResolvedName::new(&enum_member_literal.enum_name))
320-
.at(ast_expr.source);
318+
let resolved_type = resolve_type(
319+
ctx.type_search_ctx,
320+
&ast::TypeKind::Named(enum_member_literal.enum_name.clone())
321+
.at(enum_member_literal.source),
322+
&mut Default::default(),
323+
)?;
324+
325+
let TypeKind::Enum(resolved_name) = &resolved_type.kind else {
326+
return Err(ResolveErrorKind::StaticMemberOfTypeDoesNotExist {
327+
ty: enum_member_literal.enum_name.to_string(),
328+
member: enum_member_literal.variant_name.clone(),
329+
}
330+
.at(source));
331+
};
332+
333+
let resolved_name = resolved_name.clone();
321334

322335
Ok(TypedExpr::new(
323336
resolved_type,
324337
resolved::Expr::new(
325-
resolved::ExprKind::EnumMemberLiteral(enum_member_literal.clone()),
338+
resolved::ExprKind::EnumMemberLiteral(Box::new(resolved::EnumMemberLiteral {
339+
enum_name: resolved_name,
340+
variant_name: enum_member_literal.variant_name.clone(),
341+
source,
342+
})),
326343
source,
327344
),
328345
))

Diff for: src/resolved/mod.rs

+8-1
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ mod variable_storage;
22

33
pub use self::variable_storage::VariableStorageKey;
44
pub use crate::ast::{
5-
CInteger, EnumMember, EnumMemberLiteral, FloatSize, IntegerBits, IntegerKnown, IntegerSign,
5+
CInteger, EnumMember, FloatSize, IntegerBits, IntegerKnown, IntegerSign,
66
ShortCircuitingBinaryOperator, UnaryMathOperator,
77
};
88
use crate::{
@@ -488,6 +488,13 @@ pub struct ArrayAccess {
488488
pub index: Expr,
489489
}
490490

491+
#[derive(Clone, Debug)]
492+
pub struct EnumMemberLiteral {
493+
pub enum_name: ResolvedName,
494+
pub variant_name: String,
495+
pub source: Source,
496+
}
497+
491498
#[derive(Clone, Debug)]
492499
pub struct Branch {
493500
pub condition: TypedExpr,

0 commit comments

Comments
 (0)