Skip to content

Commit 6f21296

Browse files
committed
Finished adding namespace support for non-type-alias types
1 parent 2c5a70d commit 6f21296

File tree

7 files changed

+147
-119
lines changed

7 files changed

+147
-119
lines changed

Diff for: src/resolve/error.rs

+7
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ use crate::{
66
use itertools::Itertools;
77
use std::fmt::Display;
88

9+
#[derive(Clone, Debug)]
910
pub struct ResolveError {
1011
pub kind: ResolveErrorKind,
1112
pub source: Source,
@@ -39,6 +40,9 @@ pub enum ResolveErrorKind {
3940
UndeclaredType {
4041
name: String,
4142
},
43+
AmbiguousType {
44+
name: String,
45+
},
4246
NotEnoughArgumentsToFunction {
4347
name: String,
4448
},
@@ -211,6 +215,9 @@ impl Display for ResolveErrorKind {
211215
ResolveErrorKind::UndeclaredType { name } => {
212216
write!(f, "Undeclared type '{}'", name)?;
213217
}
218+
ResolveErrorKind::AmbiguousType { name } => {
219+
write!(f, "Ambiguous type '{}'", name)?;
220+
}
214221
ResolveErrorKind::NotEnoughArgumentsToFunction { name } => {
215222
write!(f, "Not enough arguments for call to function '{}'", name)?;
216223
}

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

+2-6
Original file line numberDiff line numberDiff line change
@@ -37,12 +37,8 @@ pub fn resolve_call_expr(
3737
let return_type = function.return_type.clone();
3838

3939
if let Some(required_ty) = &call.expected_to_return {
40-
let resolved_required_ty = resolve_type(
41-
ctx.type_search_ctx,
42-
ctx.resolved_ast.source_files,
43-
required_ty,
44-
&mut Default::default(),
45-
)?;
40+
let resolved_required_ty =
41+
resolve_type(ctx.type_search_ctx, required_ty, &mut Default::default())?;
4642

4743
if resolved_required_ty != return_type {
4844
return Err(ResolveErrorKind::FunctionMustReturnType {

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

+2-7
Original file line numberDiff line numberDiff line change
@@ -332,19 +332,14 @@ pub fn resolve_expr(
332332
result_type,
333333
} = &**info;
334334

335-
let resolved_type = resolve_type(
336-
ctx.type_search_ctx,
337-
ctx.resolved_ast.source_files,
338-
result_type,
339-
&mut Default::default(),
340-
)?;
335+
let resolved_type =
336+
resolve_type(ctx.type_search_ctx, result_type, &mut Default::default())?;
341337

342338
let mut resolved_args = Vec::with_capacity(args.len());
343339

344340
for (expected_arg_type, arg) in args {
345341
let preferred_type = resolve_type(
346342
ctx.type_search_ctx,
347-
ctx.resolved_ast.source_files,
348343
expected_arg_type,
349344
&mut Default::default(),
350345
)?;

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

+1-7
Original file line numberDiff line numberDiff line change
@@ -37,13 +37,7 @@ pub fn resolve_struct_literal_expr(
3737
conform_behavior: ConformBehavior,
3838
source: Source,
3939
) -> Result<TypedExpr, ResolveError> {
40-
let resolved_type = resolve_type(
41-
ctx.type_search_ctx,
42-
ctx.resolved_ast.source_files,
43-
ast_type,
44-
&mut Default::default(),
45-
)?;
46-
40+
let resolved_type = resolve_type(ctx.type_search_ctx, ast_type, &mut Default::default())?;
4741
let (struct_name, structure_ref) = get_core_structure_info(&resolved_type, source)?;
4842

4943
let structure_type =

Diff for: src/resolve/mod.rs

+24-85
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ use crate::{
2424
index_map_ext::IndexMapExt,
2525
name::{Name, ResolvedName},
2626
resolved::{self, Enum, TypedExpr, VariableStorage},
27-
source_files::{Source, SourceFiles},
27+
source_files::Source,
2828
tag::Tag,
2929
workspace::fs::FsNodeId,
3030
};
@@ -94,9 +94,12 @@ pub fn resolve<'a>(
9494
.get_owning_module(*real_file_id)
9595
.unwrap_or(*real_file_id);
9696

97-
let type_aliases = ctx
98-
.type_search_ctxs
99-
.get_or_insert_with(file_id, || TypeSearchCtx::default());
97+
let imported_namespaces =
98+
&ast_workspace.settings[file.settings.unwrap_or_default().0].imported_namespaces;
99+
100+
let type_aliases = ctx.type_search_ctxs.get_or_insert_with(file_id, || {
101+
TypeSearchCtx::new(imported_namespaces.clone(), source_files)
102+
});
100103

101104
for (alias_name, alias) in file.type_aliases.iter() {
102105
type_aliases.put_type_alias(alias_name.clone(), alias, alias.source)?;
@@ -117,7 +120,6 @@ pub fn resolve<'a>(
117120
for (enum_name, enum_definition) in file.enums.iter() {
118121
let resolved_type = resolve_enum_backing_type(
119122
type_search_ctx,
120-
source_files,
121123
enum_definition.backing_type.as_ref(),
122124
&mut used_aliases,
123125
enum_definition.source,
@@ -159,7 +161,6 @@ pub fn resolve<'a>(
159161
resolved::Field {
160162
resolved_type: resolve_type(
161163
type_search_ctx,
162-
source_files,
163164
&field.ast_type,
164165
&mut used_aliases,
165166
)?,
@@ -195,18 +196,10 @@ pub fn resolve<'a>(
195196
let type_search_ctx = ctx.type_search_ctxs.get_mut(&file_id).unwrap();
196197

197198
for (alias_name, alias) in file.type_aliases.iter() {
198-
let resolved_type = resolve_type_or_undeclared(
199-
type_search_ctx,
200-
source_files,
201-
&alias.value,
202-
&mut used_aliases,
203-
)?;
199+
let resolved_type =
200+
resolve_type_or_undeclared(type_search_ctx, &alias.value, &mut used_aliases)?;
204201

205-
type_search_ctx.put_type(
206-
&Name::plain(alias_name.clone()),
207-
resolved_type.kind,
208-
alias.source,
209-
)?;
202+
type_search_ctx.override_type(&Name::plain(alias_name.clone()), resolved_type.kind);
210203
}
211204
}
212205

@@ -223,12 +216,8 @@ pub fn resolve<'a>(
223216
.get_or_insert_with(file_id, || GlobalSearchCtx::new());
224217

225218
for global in file.global_variables.iter() {
226-
let resolved_type = resolve_type(
227-
type_search_ctx,
228-
source_files,
229-
&global.ast_type,
230-
&mut Default::default(),
231-
)?;
219+
let resolved_type =
220+
resolve_type(type_search_ctx, &global.ast_type, &mut Default::default())?;
232221

233222
let global_ref = resolved_ast.globals.insert(resolved::GlobalVar {
234223
name: global.name.clone(),
@@ -255,14 +244,9 @@ pub fn resolve<'a>(
255244

256245
let function_ref = resolved_ast.functions.insert(resolved::Function {
257246
name: name.clone(),
258-
parameters: resolve_parameters(
259-
type_search_ctx,
260-
source_files,
261-
&function.parameters,
262-
)?,
247+
parameters: resolve_parameters(type_search_ctx, &function.parameters)?,
263248
return_type: resolve_type(
264249
type_search_ctx,
265-
source_files,
266250
&function.return_type,
267251
&mut Default::default(),
268252
)?,
@@ -347,7 +331,6 @@ pub fn resolve<'a>(
347331
for parameter in ast_function.parameters.required.iter() {
348332
let resolved_type = resolve_type(
349333
type_search_ctx,
350-
source_files,
351334
&parameter.ast_type,
352335
&mut Default::default(),
353336
)?;
@@ -405,11 +388,10 @@ enum Initialized {
405388

406389
fn resolve_type_or_undeclared<'a>(
407390
type_search_ctx: &'a TypeSearchCtx<'_>,
408-
source_files: &SourceFiles,
409391
ast_type: &'a ast::Type,
410392
used_aliases_stack: &mut HashSet<ResolvedName>,
411393
) -> Result<resolved::Type, ResolveError> {
412-
match resolve_type(type_search_ctx, source_files, ast_type, used_aliases_stack) {
394+
match resolve_type(type_search_ctx, ast_type, used_aliases_stack) {
413395
Ok(inner) => Ok(inner),
414396
Err(_) if ast_type.kind.allow_indirect_undefined() => {
415397
Ok(resolved::TypeKind::Void.at(ast_type.source))
@@ -420,7 +402,6 @@ fn resolve_type_or_undeclared<'a>(
420402

421403
fn resolve_type<'a>(
422404
type_search_ctx: &'a TypeSearchCtx<'_>,
423-
source_files: &SourceFiles,
424405
ast_type: &'a ast::Type,
425406
used_aliases_stack: &mut HashSet<ResolvedName>,
426407
) -> Result<resolved::Type, ResolveError> {
@@ -429,51 +410,21 @@ fn resolve_type<'a>(
429410
ast::TypeKind::Integer(bits, sign) => Ok(resolved::TypeKind::Integer(*bits, *sign)),
430411
ast::TypeKind::CInteger(integer, sign) => Ok(resolved::TypeKind::CInteger(*integer, *sign)),
431412
ast::TypeKind::Pointer(inner) => {
432-
let inner = resolve_type_or_undeclared(
433-
type_search_ctx,
434-
source_files,
435-
inner,
436-
used_aliases_stack,
437-
)?;
413+
let inner = resolve_type_or_undeclared(type_search_ctx, inner, used_aliases_stack)?;
438414

439415
Ok(resolved::TypeKind::Pointer(Box::new(inner)))
440416
}
441417
ast::TypeKind::Void => Ok(resolved::TypeKind::Void),
442-
ast::TypeKind::Named(name) => {
443-
let resolved_name = ResolvedName::new(name);
444-
445-
if let Some(found) = type_search_ctx.find_type(&resolved_name) {
446-
Ok(found.clone())
447-
} else if let Some(definition) = type_search_ctx.find_alias(&resolved_name) {
448-
if used_aliases_stack.insert(resolved_name.clone()) {
449-
let inner = resolve_type(
450-
type_search_ctx,
451-
source_files,
452-
&definition.value,
453-
used_aliases_stack,
454-
);
455-
used_aliases_stack.remove(&resolved_name);
456-
inner.map(|ty| ty.kind)
457-
} else {
458-
Err(ResolveErrorKind::RecursiveTypeAlias {
459-
name: name.to_string(),
460-
}
461-
.at(definition.source))
462-
}
463-
} else {
464-
Err(ResolveErrorKind::UndeclaredType {
465-
name: name.to_string(),
466-
}
467-
.at(ast_type.source))
468-
}
469-
}
418+
ast::TypeKind::Named(name) => match type_search_ctx.find_type(name, used_aliases_stack) {
419+
Ok(found) => Ok(found.into_owned()),
420+
Err(err) => Err(err.into_resolve_error(name, ast_type.source)),
421+
},
470422
ast::TypeKind::Floating(size) => Ok(resolved::TypeKind::Floating(*size)),
471423
ast::TypeKind::AnonymousStruct(..) => todo!("resolve anonymous struct type"),
472424
ast::TypeKind::AnonymousUnion(..) => todo!("resolve anonymous union type"),
473425
ast::TypeKind::AnonymousEnum(anonymous_enum) => {
474426
let resolved_type = Box::new(resolve_enum_backing_type(
475427
type_search_ctx,
476-
source_files,
477428
anonymous_enum.backing_type.as_deref(),
478429
&mut Default::default(),
479430
ast_type.source,
@@ -490,12 +441,8 @@ fn resolve_type<'a>(
490441
ast::TypeKind::FixedArray(fixed_array) => {
491442
if let ast::ExprKind::Integer(integer) = &fixed_array.count.kind {
492443
if let Ok(size) = integer.value().try_into() {
493-
let inner = resolve_type(
494-
type_search_ctx,
495-
source_files,
496-
&fixed_array.ast_type,
497-
used_aliases_stack,
498-
)?;
444+
let inner =
445+
resolve_type(type_search_ctx, &fixed_array.ast_type, used_aliases_stack)?;
499446

500447
Ok(resolved::TypeKind::FixedArray(Box::new(
501448
resolved::FixedArray { size, inner },
@@ -511,12 +458,8 @@ fn resolve_type<'a>(
511458
let mut parameters = Vec::with_capacity(function_pointer.parameters.len());
512459

513460
for parameter in function_pointer.parameters.iter() {
514-
let resolved_type = resolve_type(
515-
type_search_ctx,
516-
source_files,
517-
&parameter.ast_type,
518-
used_aliases_stack,
519-
)?;
461+
let resolved_type =
462+
resolve_type(type_search_ctx, &parameter.ast_type, used_aliases_stack)?;
520463

521464
parameters.push(resolved::Parameter {
522465
name: parameter.name.clone(),
@@ -526,7 +469,6 @@ fn resolve_type<'a>(
526469

527470
let return_type = Box::new(resolve_type(
528471
type_search_ctx,
529-
source_files,
530472
&function_pointer.return_type,
531473
used_aliases_stack,
532474
)?);
@@ -545,7 +487,6 @@ fn resolve_type<'a>(
545487

546488
fn resolve_parameters(
547489
type_search_ctx: &TypeSearchCtx<'_>,
548-
source_files: &SourceFiles,
549490
parameters: &ast::Parameters,
550491
) -> Result<resolved::Parameters, ResolveError> {
551492
let mut required = Vec::with_capacity(parameters.required.len());
@@ -555,7 +496,6 @@ fn resolve_parameters(
555496
name: parameter.name.clone(),
556497
resolved_type: resolve_type(
557498
type_search_ctx,
558-
source_files,
559499
&parameter.ast_type,
560500
&mut Default::default(),
561501
)?,
@@ -589,13 +529,12 @@ fn ensure_initialized(
589529

590530
fn resolve_enum_backing_type(
591531
type_search_ctx: &TypeSearchCtx,
592-
source_files: &SourceFiles,
593532
backing_type: Option<impl Borrow<Type>>,
594533
used_aliases: &mut HashSet<ResolvedName>,
595534
source: Source,
596535
) -> Result<resolved::Type, ResolveError> {
597536
if let Some(backing_type) = backing_type.as_ref().map(Borrow::borrow) {
598-
resolve_type(type_search_ctx, source_files, backing_type, used_aliases)
537+
resolve_type(type_search_ctx, backing_type, used_aliases)
599538
} else {
600539
Ok(resolved::TypeKind::Integer(IntegerBits::Bits64, IntegerSign::Unsigned).at(source))
601540
}

Diff for: src/resolve/stmt.rs

-1
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,6 @@ pub fn resolve_stmt(
8787
ast::StmtKind::Declaration(declaration) => {
8888
let resolved_type = resolve_type(
8989
ctx.type_search_ctx,
90-
ctx.resolved_ast.source_files,
9190
&declaration.ast_type,
9291
&mut Default::default(),
9392
)?;

0 commit comments

Comments
 (0)