public static TypeDefinitionNode Type(string name, params TypeLabel[] labels) { var node = new TypeDefinitionNode { Name = name }; foreach (var curr in labels) { node.Entries.Add(curr); } return(node); }
/// <summary> /// Declares a new type. /// </summary> private void declareType(TypeDefinitionNode node) { if (node.Name == "_") { Error(CompilerMessages.UnderscoreName); } var mainType = CreateType(node.Name, prepare: false); mainType.Kind = TypeEntityKind.Type; foreach (var curr in node.Entries) { var tagName = curr.Name; var labelType = CreateType(tagName, node.Name, isSealed: true, defaultCtor: false, prepare: false); labelType.Kind = TypeEntityKind.TypeLabel; var ctor = labelType.CreateConstructor(prepare: false); ctor.Kind = TypeContentsKind.AutoGenerated; if (curr.IsTagged) { var tagField = labelType.CreateField("Tag", curr.TagType, prepare: false); tagField.Kind = TypeContentsKind.UserDefined; var args = new HashList <FunctionArgument> { { "value", new FunctionArgument("value", curr.TagType) } }; var staticCtor = MainType.CreateMethod(tagName, tagName, new string[0], isStatic: true, prepare: false); staticCtor.Kind = TypeContentsKind.AutoGenerated; ctor.Arguments = staticCtor.Arguments = args; ctor.Body.Add( Expr.SetMember(Expr.This(), "Tag", Expr.Get("value")) ); staticCtor.Body.Add( Expr.New(tagName, Expr.Get("value")) ); } } }
/// <summary> /// type_def = "type" identifier INDENT type_stmt { type_stmt } DEDENT /// </summary> private TypeDefinitionNode parseTypeDef() { if (!check(LexemType.Type)) return null; var node = new TypeDefinitionNode(); node.Name = ensure(LexemType.Identifier, ParserMessages.TypeIdentifierExpected).Value; ensure(LexemType.Indent, ParserMessages.TypeIndentExpected); var field = bind(parseTypeStmt); node.Entries.Add(field); while (!check(LexemType.Dedent)) { ensure(LexemType.NewLine, ParserMessages.TypeSeparatorExpected); field = bind(parseTypeStmt); node.Entries.Add(field); } return node; }
private void Visit(TypeDefinitionNode node) { Console.WriteLine($"Define Type: {node.Name}"); Visit(node.TypeBody); }
/// <summary> /// Declares a new type. /// </summary> private void declareType(TypeDefinitionNode node) { if (node.Name == "_") Error(CompilerMessages.UnderscoreName); var mainType = CreateType(node.Name, prepare: false); mainType.Kind = TypeEntityKind.Type; foreach (var curr in node.Entries) { var tagName = curr.Name; var labelType = CreateType(tagName, node.Name, isSealed: true, defaultCtor: false, prepare: false); labelType.Kind = TypeEntityKind.TypeLabel; var ctor = labelType.CreateConstructor(prepare: false); ctor.Kind = TypeContentsKind.AutoGenerated; if (curr.IsTagged) { var tagField = labelType.CreateField("Tag", curr.TagType, prepare: false); tagField.Kind = TypeContentsKind.UserDefined; var args = new HashList<FunctionArgument> { { "value", new FunctionArgument("value", curr.TagType) } }; var staticCtor = MainType.CreateMethod(tagName, tagName, new string[0], isStatic: true, prepare: false); staticCtor.Kind = TypeContentsKind.AutoGenerated; ctor.Arguments = staticCtor.Arguments = args; ctor.Body.Add( Expr.SetMember(Expr.This(), "Tag", Expr.Get("value")) ); staticCtor.Body.Add( Expr.New(tagName, Expr.Get("value")) ); } } }