From 660166221c886f2e441575c936fa7f6ed60900a7 Mon Sep 17 00:00:00 2001 From: nub31 Date: Thu, 26 Feb 2026 19:04:40 +0100 Subject: [PATCH] ... --- compiler/Generator.cs | 10 +++--- compiler/Parser.cs | 27 ++++++---------- compiler/TypeChecker.cs | 70 +++++++++++++++-------------------------- examples/math/math.nub | 2 +- 4 files changed, 42 insertions(+), 67 deletions(-) diff --git a/compiler/Generator.cs b/compiler/Generator.cs index bee57dd..4e8a539 100644 --- a/compiler/Generator.cs +++ b/compiler/Generator.cs @@ -328,8 +328,8 @@ public class Generator TypedNodeExpressionStructLiteral expression => EmitExpressionStructLiteral(expression), TypedNodeExpressionEnumLiteral expression => EmitExpressionEnumLiteral(expression), TypedNodeExpressionMemberAccess expression => EmitExpressionMemberAccess(expression), - TypedNodeExpressionLocalIdent expression => expression.Value.Ident, - TypedNodeExpressionModuleIdent expression => EmitExpressionModuleIdent(expression), + TypedNodeExpressionLocalIdent expression => expression.Name, + TypedNodeExpressionGlobalIdent expression => EmitNodeExpressionGlobalIdent(expression), TypedNodeExpressionFuncCall expression => EmitExpressionFuncCall(expression), _ => throw new ArgumentOutOfRangeException(nameof(node), node, null) }; @@ -409,10 +409,10 @@ public class Generator return $"{target}.{expression.Name.Ident}"; } - private string EmitExpressionModuleIdent(TypedNodeExpressionModuleIdent expression) + private string EmitNodeExpressionGlobalIdent(TypedNodeExpressionGlobalIdent expression) { - if (!moduleGraph.TryResolveIdentifier(expression.Module.Ident, expression.Value.Ident, true, out var info)) - throw new UnreachableException($"Module graph does not have info about identifier {expression.Module.Ident}::{expression.Value.Ident}. This should have been caught earlier"); + if (!moduleGraph.TryResolveIdentifier(expression.Module, expression.Name, true, out var info)) + throw new UnreachableException($"Module graph does not have info about identifier {expression.Module}::{expression.Name}. This should have been caught earlier"); return info.MangledName; } diff --git a/compiler/Parser.cs b/compiler/Parser.cs index 0297470..a592e11 100644 --- a/compiler/Parser.cs +++ b/compiler/Parser.cs @@ -334,15 +334,14 @@ public class Parser } else if (TryExpectIdent(out var ident)) { - if (TryExpectSymbol(Symbol.ColonColon)) + List sections = [ident]; + + while (TryExpectSymbol(Symbol.ColonColon)) { - var name = ExpectIdent(); - expr = new NodeExpressionModuleIdent(TokensFrom(startIndex), ident, name); - } - else - { - expr = new NodeExpressionLocalIdent(TokensFrom(startIndex), ident); + sections.Add(ExpectIdent()); } + + expr = new NodeExpressionIdent(TokensFrom(startIndex), sections); } else if (TryExpectKeyword(Keyword.Struct)) { @@ -817,9 +816,9 @@ public class NodeExpressionBoolLiteral(List tokens, TokenBoolLiteral valu public TokenBoolLiteral Value { get; } = value; } -public class NodeExpressionStructLiteral(List tokens, NodeType? type, List initializers) : NodeExpression(tokens) +public class NodeExpressionStructLiteral(List tokens, NodeType type, List initializers) : NodeExpression(tokens) { - public NodeType? Type { get; } = type; + public NodeType Type { get; } = type; public List Initializers { get; } = initializers; public class Initializer(List tokens, TokenIdent name, NodeExpression value) : Node(tokens) @@ -849,15 +848,9 @@ public class NodeExpressionFuncCall(List tokens, NodeExpression target, L public List Parameters { get; } = parameters; } -public class NodeExpressionLocalIdent(List tokens, TokenIdent value) : NodeExpression(tokens) +public class NodeExpressionIdent(List tokens, List sections) : NodeExpression(tokens) { - public TokenIdent Value { get; } = value; -} - -public class NodeExpressionModuleIdent(List tokens, TokenIdent module, TokenIdent value) : NodeExpression(tokens) -{ - public TokenIdent Module { get; } = module; - public TokenIdent Value { get; } = value; + public List Sections { get; } = sections; } public class NodeExpressionBinary(List tokens, NodeExpression left, NodeExpressionBinary.Op operation, NodeExpression right) : NodeExpression(tokens) diff --git a/compiler/TypeChecker.cs b/compiler/TypeChecker.cs index fc5697e..6191c9a 100644 --- a/compiler/TypeChecker.cs +++ b/compiler/TypeChecker.cs @@ -171,8 +171,7 @@ public class TypeChecker NodeExpressionBinary expression => CheckExpressionBinary(expression), NodeExpressionUnary expression => CheckExpressionUnary(expression), NodeExpressionBoolLiteral expression => CheckExpressionBoolLiteral(expression), - NodeExpressionLocalIdent expression => CheckExpressionIdent(expression), - NodeExpressionModuleIdent expression => CheckExpressionModuleIdent(expression), + NodeExpressionIdent expression => CheckExpressionIdent(expression), NodeExpressionIntLiteral expression => CheckExpressionIntLiteral(expression), NodeExpressionMemberAccess expression => CheckExpressionMemberAccess(expression), NodeExpressionFuncCall expression => CheckExpressionFuncCall(expression), @@ -321,20 +320,29 @@ public class TypeChecker return new TypedNodeExpressionBoolLiteral(expression.Tokens, NubTypeBool.Instance, expression.Value); } - private TypedNodeExpressionLocalIdent CheckExpressionIdent(NodeExpressionLocalIdent expression) + private TypedNodeExpression CheckExpressionIdent(NodeExpressionIdent expression) { - var type = scope.GetIdentifierType(expression.Value.Ident); - if (type is null) - throw BasicError($"Identifier '{expression.Value.Ident}' is not declared", expression.Value); + if (expression.Sections.Count == 1) + { + var name = expression.Sections[0].Ident; - return new TypedNodeExpressionLocalIdent(expression.Tokens, type, expression.Value); - } + var localType = scope.GetIdentifierType(name); + if (localType is not null) + return new TypedNodeExpressionLocalIdent(expression.Tokens, localType, name); - private TypedNodeExpressionModuleIdent CheckExpressionModuleIdent(NodeExpressionModuleIdent expression) - { - var module = ResolveModule(expression.Module); - var info = ResolveModuleIdentifier(module, expression.Value); - return new TypedNodeExpressionModuleIdent(expression.Tokens, info.Type, expression.Module, expression.Value); + if (moduleGraph.TryResolveIdentifier(currentModule, name, true, out var ident)) + return new TypedNodeExpressionGlobalIdent(expression.Tokens, ident.Type, currentModule, name); + } + else if (expression.Sections.Count == 2) + { + var module = expression.Sections[0].Ident; + var name = expression.Sections[1].Ident; + + if (moduleGraph.TryResolveIdentifier(module, name, true, out var ident)) + return new TypedNodeExpressionGlobalIdent(expression.Tokens, ident.Type, module, name); + } + + throw BasicError($"Unknown identifier '{string.Join("::", expression.Sections.Select(x => x.Ident))}'", expression); } private TypedNodeExpressionIntLiteral CheckExpressionIntLiteral(NodeExpressionIntLiteral expression) @@ -510,14 +518,6 @@ public class TypeChecker return module; } - private Module.IdentifierInfo ResolveModuleIdentifier(Module module, TokenIdent name) - { - if (!module.TryResolveIdentifier(name.Ident, currentModule == module.Name, out var type)) - throw BasicError($"Identifier '{module.Name}::{name.Ident}' not found", name); - - return type; - } - private Module.TypeInfo ResolveModuleTypeInfo(Module module, TokenIdent name) { if (!module.TryResolveType(name.Ident, currentModule == module.Name, out var type)) @@ -526,24 +526,6 @@ public class TypeChecker return type; } - private Module.TypeInfoEnum ResolveModuleEnum(Module module, TokenIdent name) - { - var type = ResolveModuleTypeInfo(module, name); - if (type is not Module.TypeInfoEnum info) - throw BasicError($"'{module.Name}::{name.Ident}' is not an enum", name); - - return info; - } - - private Module.TypeInfoStruct ResolveModuleStruct(Module module, TokenIdent name) - { - var type = ResolveModuleTypeInfo(module, name); - if (type is not Module.TypeInfoStruct info) - throw BasicError($"'{module.Name}::{name.Ident}' is not a struct", name); - - return info; - } - private bool TryResolveEnumVariant(string moduleName, string enumName, string variantName, [NotNullWhen(true)] out NubType? result) { result = null; @@ -758,15 +740,15 @@ public class TypedNodeExpressionFuncCall(List tokens, NubType type, Typed public List Parameters { get; } = parameters; } -public class TypedNodeExpressionLocalIdent(List tokens, NubType type, TokenIdent value) : TypedNodeExpression(tokens, type) +public class TypedNodeExpressionLocalIdent(List tokens, NubType type, string value) : TypedNodeExpression(tokens, type) { - public TokenIdent Value { get; } = value; + public string Name { get; } = value; } -public class TypedNodeExpressionModuleIdent(List tokens, NubType type, TokenIdent module, TokenIdent value) : TypedNodeExpression(tokens, type) +public class TypedNodeExpressionGlobalIdent(List tokens, NubType type, string module, string value) : TypedNodeExpression(tokens, type) { - public TokenIdent Module { get; } = module; - public TokenIdent Value { get; } = value; + public string Module { get; } = module; + public string Name { get; } = value; } public class TypedNodeExpressionBinary(List tokens, NubType type, TypedNodeExpression left, TypedNodeExpressionBinary.Op operation, TypedNodeExpression right) : TypedNodeExpression(tokens, type) diff --git a/examples/math/math.nub b/examples/math/math.nub index e6f1dd2..3652799 100644 --- a/examples/math/math.nub +++ b/examples/math/math.nub @@ -40,7 +40,7 @@ export func add(a: i32 b: i32): i32 } } - return math::add_internal(a b) + return add_internal(a b) } func add_internal(a: i32 b: i32): i32