Example #1
0
        /// <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))
                    );
            }
        }
Example #2
0
File: Expr.cs Project: taekun/lens
        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);
        }
Example #3
0
        /// <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;
        }
Example #4
0
        /// <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))
                );
            }
        }