/// <summary> /// Declares a new record. /// </summary> private void declareRecord(RecordDefinitionNode node) { if (node.Name == "_") { Error(CompilerMessages.UnderscoreName); } var recType = CreateType(node.Name, isSealed: true, prepare: false); recType.Kind = TypeEntityKind.Record; var recCtor = recType.CreateConstructor(prepare: false); recCtor.Kind = TypeContentsKind.AutoGenerated; foreach (var curr in node.Entries) { var field = recType.CreateField(curr.Name, curr.Type, prepare: false); field.Kind = TypeContentsKind.UserDefined; var argName = "_" + field.Name.ToLowerInvariant(); recCtor.Arguments.Add(argName, new FunctionArgument(argName, curr.Type)); recCtor.Body.Add( Expr.SetMember(Expr.This(), field.Name, Expr.Get(argName)) ); } }
public static RecordDefinitionNode Record(string name, params RecordField[] fields) { var node = new RecordDefinitionNode { Name = name }; foreach (var curr in fields) { node.Entries.Add(curr); } return(node); }
/// <summary> /// record_def = "record" identifier INDENT record_stmt { NL record_stmt } DEDENT /// </summary> private RecordDefinitionNode parseRecordDef() { if (!check(LexemType.Record)) return null; var node = new RecordDefinitionNode(); node.Name = ensure(LexemType.Identifier, ParserMessages.RecordIdentifierExpected).Value; ensure(LexemType.Indent, ParserMessages.RecordIndentExpected); var field = bind(parseRecordStmt); node.Entries.Add(field); while (!check(LexemType.Dedent)) { ensure(LexemType.NewLine, ParserMessages.RecordSeparatorExpected); field = bind(parseRecordStmt); node.Entries.Add(field); } return node; }
/// <summary> /// Declares a new record. /// </summary> private void declareRecord(RecordDefinitionNode node) { if (node.Name == "_") Error(CompilerMessages.UnderscoreName); var recType = CreateType(node.Name, isSealed: true, prepare: false); recType.Kind = TypeEntityKind.Record; var recCtor = recType.CreateConstructor(prepare: false); recCtor.Kind = TypeContentsKind.AutoGenerated; foreach (var curr in node.Entries) { var field = recType.CreateField(curr.Name, curr.Type, prepare: false); field.Kind = TypeContentsKind.UserDefined; var argName = "_" + field.Name.ToLowerInvariant(); recCtor.Arguments.Add(argName, new FunctionArgument(argName, curr.Type)); recCtor.Body.Add( Expr.SetMember(Expr.This(), field.Name, Expr.Get(argName)) ); } }