WIP: dev #1

Draft
nub31 wants to merge 103 commits from dev into master
3 changed files with 24 additions and 15 deletions
Showing only changes of commit 3323d760e8 - Show all commits

View File

@@ -381,15 +381,10 @@ public class Parser
} }
else if (TryExpectKeyword(Keyword.Enum)) else if (TryExpectKeyword(Keyword.Enum))
{ {
var module = ExpectIdent(); var type = ParseType();
ExpectSymbol(Symbol.ColonColon);
var enumName = ExpectIdent();
ExpectSymbol(Symbol.ColonColon);
var variantName = ExpectIdent();
var value = ParseExpression(); var value = ParseExpression();
expr = new NodeExpressionEnumLiteral(TokensFrom(startIndex), module, enumName, variantName, value); expr = new NodeExpressionEnumLiteral(TokensFrom(startIndex), type, value);
} }
else else
{ {
@@ -846,11 +841,9 @@ public class NodeExpressionStructLiteral(List<Token> tokens, NodeType? type, Lis
} }
} }
public class NodeExpressionEnumLiteral(List<Token> tokens, TokenIdent module, TokenIdent enumName, TokenIdent variantName, NodeExpression value) : NodeExpression(tokens) public class NodeExpressionEnumLiteral(List<Token> tokens, NodeType type, NodeExpression value) : NodeExpression(tokens)
{ {
public TokenIdent Module { get; } = module; public NodeType Type { get; } = type;
public TokenIdent EnumName { get; } = enumName;
public TokenIdent VariantName { get; } = variantName;
public NodeExpression Value { get; } = value; public NodeExpression Value { get; } = value;
} }

View File

@@ -533,9 +533,21 @@ public class TypeChecker
private TypedNodeExpressionEnumLiteral CheckExpressionEnumLiteral(NodeExpressionEnumLiteral expression, NubType? expectedType) private TypedNodeExpressionEnumLiteral CheckExpressionEnumLiteral(NodeExpressionEnumLiteral expression, NubType? expectedType)
{ {
// todo(nub31): Infer type of enum variant var type = ResolveType(expression.Type);
var type = NubTypeEnumVariant.Get(NubTypeEnum.Get(expression.Module.Ident, expression.EnumName.Ident), expression.VariantName.Ident); if (type is not NubTypeEnumVariant variantType)
var value = CheckExpression(expression.Value, null); throw BasicError("Expected enum variant type", expression.Type);
if (!moduleGraph.TryResolveType(variantType.EnumType.Module, variantType.EnumType.Name, variantType.EnumType.Module == currentModule, out var info))
throw BasicError($"Type '{variantType.EnumType}' not found", expression.Type);
if (info is not Module.TypeInfoEnum enumInfo)
throw BasicError($"Type '{variantType.EnumType}' is not an enum", expression.Type);
var variant = enumInfo.Variants.FirstOrDefault(x => x.Name == variantType.Variant);
if (variant == null)
throw BasicError($"Enum '{variantType.EnumType}' does not have a variant named '{variantType.Variant}'", expression.Type);
var value = CheckExpression(expression.Value, variant.Type);
return new TypedNodeExpressionEnumLiteral(expression.Tokens, type, value); return new TypedNodeExpressionEnumLiteral(expression.Tokens, type, value);
} }

View File

@@ -29,7 +29,11 @@ export enum message {
export func add(a: i32 b: i32): i32 export func add(a: i32 b: i32): i32
{ {
let message: message = enum math::message::move struct color { r = 23 g = 46 b = 56 } let message: message = enum message::move {
r = 23
g = 46
b = 56
}
match message { match message {
quit q {} quit q {}