Skip to content

Commit cf0b523

Browse files
committed
Started working on namespace support for enums and helper expressions
1 parent 6f21296 commit cf0b523

File tree

19 files changed

+74
-50
lines changed

19 files changed

+74
-50
lines changed

Diff for: src/ast/expr/enum_member.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
1-
use crate::source_files::Source;
1+
use crate::{name::Name, source_files::Source};
22

33
#[derive(Clone, Debug)]
44
pub struct EnumMemberLiteral {
5-
pub enum_name: String,
5+
pub enum_name: Name,
66
pub variant_name: String,
77
pub source: Source,
88
}

Diff for: src/ast/file.rs

+4-3
Original file line numberDiff line numberDiff line change
@@ -2,16 +2,17 @@ use super::{
22
enumeration::Enum, global_variable::GlobalVar, structure::Structure, type_alias::TypeAlias,
33
Function, HelperExpr, SettingsId,
44
};
5+
use crate::name::Name;
56
use indexmap::IndexMap;
67

78
#[derive(Clone, Debug)]
89
pub struct AstFile {
910
pub functions: Vec<Function>,
1011
pub structures: Vec<Structure>,
11-
pub type_aliases: IndexMap<String, TypeAlias>,
12+
pub type_aliases: IndexMap<Name, TypeAlias>,
1213
pub global_variables: Vec<GlobalVar>,
13-
pub enums: IndexMap<String, Enum>,
14-
pub helper_exprs: IndexMap<String, HelperExpr>,
14+
pub enums: IndexMap<Name, Enum>,
15+
pub helper_exprs: IndexMap<Name, HelperExpr>,
1516
pub settings: Option<SettingsId>,
1617
}
1718

Diff for: src/ast/named.rs

+2-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
1+
use crate::name::Name;
12
use std::fmt::Debug;
23

34
pub struct Named<T> {
4-
pub name: String,
5+
pub name: Name,
56
pub value: T,
67
}
78

Diff for: src/c/translation/mod.rs

+2-1
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ use crate::{
1010
ast::{self, AstFile},
1111
c::parser::{CTypedef, DeclarationSpecifiers, Declarator, ParseError},
1212
diagnostics::Diagnostics,
13+
name::Name,
1314
};
1415
use std::collections::HashMap;
1516

@@ -32,7 +33,7 @@ pub fn declare_named_declaration(
3233

3334
if is_typedef {
3435
ast_file.type_aliases.insert(
35-
name.to_string(),
36+
Name::plain(name.clone()),
3637
ast::TypeAlias {
3738
value: ast_type.clone(),
3839
source: declarator.source,

Diff for: src/c/translation/types/enumeration.rs

+6-4
Original file line numberDiff line numberDiff line change
@@ -55,22 +55,24 @@ pub fn make_anonymous_enum(
5555
if let Some(definition_name) = &definition.name {
5656
let aka_value =
5757
ast::ExprKind::EnumMemberLiteral(Box::new(ast::EnumMemberLiteral {
58-
enum_name: format!("enum<{}>", definition_name),
58+
enum_name: Name::plain(format!("enum<{}>", definition_name)),
5959
variant_name: enumerator.name.clone(),
6060
source: enumerator.source,
6161
}))
6262
.at(enumerator.source);
6363

6464
ast_file.helper_exprs.try_insert(
65-
enumerator.name.clone(),
65+
Name::plain(enumerator.name.clone()),
6666
ast::HelperExpr {
6767
value: aka_value,
6868
source: enumerator.source,
6969
is_file_local_only: false,
7070
},
7171
|name| {
72-
ParseErrorKind::EnumMemberNameConflictsWithExistingSymbol { name }
73-
.at(enumerator.source)
72+
ParseErrorKind::EnumMemberNameConflictsWithExistingSymbol {
73+
name: name.to_string(),
74+
}
75+
.at(enumerator.source)
7476
},
7577
)?;
7678
}

Diff for: src/interpreter_env/mod.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -100,7 +100,7 @@ pub fn setup_build_system_interpreter_symbols(file: &mut AstFile) {
100100
});
101101

102102
file.enums.insert(
103-
"ProjectKind".into(),
103+
Name::plain("ProjectKind"),
104104
Enum {
105105
backing_type: Some(TypeKind::u64().at(source)),
106106
source,

Diff for: src/lower/mod.rs

+5-4
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ use crate::{
77
ast::{CInteger, IntegerBits, IntegerRigidity},
88
cli::BuildOptions,
99
ir::{self, BasicBlocks, Global, Literal, OverflowOperator, Value, ValueReference},
10+
name::ResolvedName,
1011
resolved::{
1112
self, Destination, DestinationKind, Expr, ExprKind, FloatOrInteger, FloatSize, Member,
1213
NumericMode, SignOrIndeterminate, StmtKind, StructureLiteral, UnaryMathOperation,
@@ -860,15 +861,15 @@ fn lower_expr(
860861
ExprKind::EnumMemberLiteral(enum_member_literal) => {
861862
let enum_definition = resolved_ast
862863
.enums
863-
.get(&enum_member_literal.enum_name)
864+
.get(&ResolvedName::new(&enum_member_literal.enum_name))
864865
.expect("referenced enum to exist for enum member literal");
865866

866867
let member = enum_definition
867868
.members
868869
.get(&enum_member_literal.variant_name)
869870
.ok_or_else(|| {
870871
LowerErrorKind::NoSuchEnumMember {
871-
enum_name: enum_member_literal.enum_name.clone(),
872+
enum_name: enum_member_literal.enum_name.to_string(),
872873
variant_name: enum_member_literal.variant_name.clone(),
873874
}
874875
.at(enum_member_literal.source)
@@ -885,7 +886,7 @@ fn lower_expr(
885886
let make_error = |_| {
886887
LowerErrorKind::CannotFit {
887888
value: value.to_string(),
888-
expected_type: enum_member_literal.enum_name.clone(),
889+
expected_type: enum_member_literal.enum_name.to_string(),
889890
}
890891
.at(enum_definition.source)
891892
};
@@ -917,7 +918,7 @@ fn lower_expr(
917918
}
918919
_ => {
919920
return Err(LowerErrorKind::EnumBackingTypeMustBeInteger {
920-
enum_name: enum_member_literal.enum_name.clone(),
921+
enum_name: enum_member_literal.enum_name.to_string(),
921922
}
922923
.at(enum_definition.source))
923924
}

Diff for: src/parser/parse_enum.rs

+2-1
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ use super::{annotation::Annotation, error::ParseError, Parser};
22
use crate::{
33
ast::{Enum, EnumMember, Named},
44
inflow::Inflow,
5+
name::Name,
56
token::{Token, TokenKind},
67
};
78
use indexmap::IndexMap;
@@ -54,7 +55,7 @@ impl<'a, I: Inflow<Token>> Parser<'a, I> {
5455
self.parse_token(TokenKind::CloseParen, Some("to close enum body"))?;
5556

5657
Ok(Named::<Enum> {
57-
name,
58+
name: Name::plain(name),
5859
value: Enum {
5960
backing_type: None,
6061
members,

Diff for: src/parser/parse_expr/primary/enum_member_literal.rs

+2-1
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ use super::Parser;
22
use crate::{
33
ast::{EnumMemberLiteral, Expr, ExprKind},
44
inflow::Inflow,
5+
name::Name,
56
parser::error::{ParseError, ParseErrorKind},
67
source_files::Source,
78
token::{Token, TokenKind},
@@ -10,7 +11,7 @@ use crate::{
1011
impl<'a, I: Inflow<Token>> Parser<'a, I> {
1112
pub fn parse_enum_member_literal(
1213
&mut self,
13-
enum_name: String,
14+
enum_name: Name,
1415
source: Source,
1516
) -> Result<Expr, ParseError> {
1617
// EnumName::EnumVariant

Diff for: src/parser/parse_expr/primary/mod.rs

-1
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,6 @@ impl<'a, I: Inflow<Token>> Parser<'a, I> {
8989
return Err(ParseErrorKind::GenericsNotSupportedHere.at(source));
9090
}
9191

92-
let name = into_plain_name(name, source)?;
9392
self.parse_enum_member_literal(name, source)
9493
}
9594
TokenKind::OpenCurly => {

Diff for: src/parser/parse_helper_expr.rs

+2-1
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ use super::{annotation::Annotation, error::ParseError, Parser};
22
use crate::{
33
ast::{HelperExpr, Named},
44
inflow::Inflow,
5+
name::Name,
56
token::{Token, TokenKind},
67
};
78

@@ -28,12 +29,12 @@ impl<'a, I: Inflow<Token>> Parser<'a, I> {
2829
let value = self.parse_expr()?;
2930

3031
Ok(Named::<HelperExpr> {
32+
name: Name::plain(name),
3133
value: HelperExpr {
3234
value,
3335
source,
3436
is_file_local_only: false,
3537
},
36-
name,
3738
})
3839
}
3940
}

Diff for: src/parser/parse_top_level.rs

+12-3
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,10 @@ impl<'a, I: Inflow<Token>> Parser<'a, I> {
6060
let source = alias.source;
6161

6262
ast_file.type_aliases.try_insert(name, alias, |name| {
63-
ParseErrorKind::TypeAliasHasMultipleDefinitions { name }.at(source)
63+
ParseErrorKind::TypeAliasHasMultipleDefinitions {
64+
name: name.to_string(),
65+
}
66+
.at(source)
6467
})?;
6568
}
6669
TokenKind::EnumKeyword => {
@@ -72,7 +75,10 @@ impl<'a, I: Inflow<Token>> Parser<'a, I> {
7275
let source = enum_definition.source;
7376

7477
ast_file.enums.try_insert(name, enum_definition, |name| {
75-
ParseErrorKind::EnumHasMultipleDefinitions { name }.at(source)
78+
ParseErrorKind::EnumHasMultipleDefinitions {
79+
name: name.to_string(),
80+
}
81+
.at(source)
7682
})?;
7783
}
7884
TokenKind::DefineKeyword => {
@@ -83,7 +89,10 @@ impl<'a, I: Inflow<Token>> Parser<'a, I> {
8389
let source = named_expr.source;
8490

8591
ast_file.helper_exprs.try_insert(name, named_expr, |name| {
86-
ParseErrorKind::DefineHasMultipleDefinitions { name }.at(source)
92+
ParseErrorKind::DefineHasMultipleDefinitions {
93+
name: name.to_string(),
94+
}
95+
.at(source)
8796
})?;
8897
}
8998
TokenKind::EndOfFile => {

Diff for: src/parser/parse_type_alias.rs

+2-1
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ use super::{annotation::Annotation, error::ParseError, Parser};
22
use crate::{
33
ast::{Named, TypeAlias},
44
inflow::Inflow,
5+
name::Name,
56
token::{Token, TokenKind},
67
};
78

@@ -28,7 +29,7 @@ impl<'a, I: Inflow<Token>> Parser<'a, I> {
2829
let becomes_type = self.parse_type(None::<&str>, Some("for type alias"))?;
2930

3031
Ok(Named::<TypeAlias> {
31-
name,
32+
name: Name::plain(name),
3233
value: TypeAlias {
3334
value: becomes_type,
3435
source,

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

+4-2
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ use crate::{
2828
ast::{
2929
self, CInteger, CIntegerAssumptions, ConformBehavior, Language, Settings, UnaryOperator,
3030
},
31+
name::ResolvedName,
3132
resolve::{
3233
ensure_initialized,
3334
error::ResolveErrorKind,
@@ -53,7 +54,7 @@ pub struct ResolveExprCtx<'a, 'b> {
5354
pub global_search_ctx: &'b GlobalSearchCtx,
5455
pub variable_search_ctx: VariableSearchCtx,
5556
pub resolved_function_ref: resolved::FunctionRef,
56-
pub helper_exprs: &'b IndexMap<String, &'a ast::HelperExpr>,
57+
pub helper_exprs: &'b IndexMap<ResolvedName, &'a ast::HelperExpr>,
5758
pub settings: &'b Settings,
5859
}
5960

@@ -315,7 +316,8 @@ pub fn resolve_expr(
315316
)),
316317
ast::ExprKind::EnumMemberLiteral(enum_member_literal) => {
317318
let resolved_type =
318-
resolved::TypeKind::Enum(enum_member_literal.enum_name.clone()).at(ast_expr.source);
319+
resolved::TypeKind::Enum(ResolvedName::new(&enum_member_literal.enum_name))
320+
.at(ast_expr.source);
319321

320322
Ok(TypedExpr::new(
321323
resolved_type,

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

+7-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
use super::{PreferredType, ResolveExprCtx};
22
use crate::{
3+
name::{Name, ResolvedName},
34
resolve::{
45
error::{ResolveError, ResolveErrorKind},
56
expr::resolve_expr,
@@ -51,7 +52,12 @@ pub fn resolve_variable_expr(
5152
source,
5253
),
5354
))
54-
} else if let Some(define) = ctx.helper_exprs.get(name) {
55+
} else if let Some(define) = ctx
56+
.helper_exprs
57+
// TODO: CLEANUP: PERFORMANCE: Once we have proper support for
58+
// namespaced helper expressions, this should be cleaned up
59+
.get(&ResolvedName::new(&Name::new(None::<&str>, name)))
60+
{
5561
let TypedExpr {
5662
resolved_type,
5763
expr,

Diff for: src/resolve/function_search_ctx.rs

+5-10
Original file line numberDiff line numberDiff line change
@@ -25,13 +25,7 @@ impl FunctionSearchCtx {
2525
}
2626

2727
pub fn find_function(&self, name: &Name) -> Result<resolved::FunctionRef, FindFunctionError> {
28-
eprintln!("warning: function call name resolution not fully implemented yet");
29-
30-
let resolved_name = if !name.namespace.is_empty() {
31-
ResolvedName::Project(format!("{}{}", name.namespace, name.basename).into_boxed_str())
32-
} else {
33-
ResolvedName::Project(name.basename.clone().into_boxed_str())
34-
};
28+
let resolved_name = ResolvedName::new(name);
3529

3630
if let Some(found) = self
3731
.available
@@ -45,9 +39,10 @@ impl FunctionSearchCtx {
4539
if name.namespace.is_empty() {
4640
let mut matches = self.imported_namespaces.iter().filter_map(|namespace| {
4741
self.available
48-
.get(&ResolvedName::Project(
49-
format!("{}/{}", namespace, name.basename).into_boxed_str(),
50-
))
42+
.get(&ResolvedName::new(&Name::new(
43+
Some(namespace.to_string()),
44+
name.basename.clone(),
45+
)))
5146
.and_then(|list| list.first())
5247
.copied()
5348
});

0 commit comments

Comments
 (0)