Пример #1
0
        public override IPExpr VisitNamedTupleBody(PParser.NamedTupleBodyContext context)
        {
            if (context._values.Count > 8)
            {
                throw handler.TupleSizeMoreThanEight(context);
            }

            var fields = context._values.Select(Visit).ToArray();

            var entries = new NamedTupleEntry[fields.Length];
            var names   = new HashSet <string>();

            for (var i = 0; i < fields.Length; i++)
            {
                var entryName = context._names[i].GetText();
                if (names.Contains(entryName))
                {
                    throw handler.DuplicateNamedTupleEntry(context._names[i], entryName);
                }
                names.Add(entryName);
                entries[i] = new NamedTupleEntry {
                    Name = entryName, FieldNo = i, Type = fields[i].Type
                };
            }

            var type = new NamedTupleType(entries);

            return(new NamedTupleExpr(context, fields, type));
        }
Пример #2
0
            public override PLanguageType VisitNamedTupleType(PParser.NamedTupleTypeContext context)
            {
                HashSet <string> names = new HashSet <string>();

                PParser.IdenTypeContext[] namedTupleFields = context.idenTypeList().idenType();
                if (context.idenTypeList().idenType().Length > 8)
                {
                    throw handler.TupleSizeMoreThanEight(context);
                }

                NamedTupleEntry[] fields = new NamedTupleEntry[namedTupleFields.Length];
                for (int i = 0; i < namedTupleFields.Length; i++)
                {
                    PParser.IdenTypeContext field = namedTupleFields[i];
                    string fieldName = field.name.GetText();
                    if (names.Contains(fieldName))
                    {
                        throw handler.DuplicateNamedTupleEntry(field.name, fieldName);
                    }

                    names.Add(fieldName);
                    fields[i] = new NamedTupleEntry {
                        Name = fieldName, FieldNo = i, Type = Visit(field.type())
                    };
                }

                return(new NamedTupleType(fields));
            }
Пример #3
0
            public override PLanguageType VisitNamedTupleType(PParser.NamedTupleTypeContext context)
            {
                var names            = new HashSet <string>();
                var namedTupleFields = context.idenTypeList().idenType();
                var fields           = new NamedTupleEntry[namedTupleFields.Length];

                for (var i = 0; i < namedTupleFields.Length; i++)
                {
                    PParser.IdenTypeContext field = namedTupleFields[i];
                    string fieldName = field.name.GetText();
                    if (names.Contains(fieldName))
                    {
                        throw handler.DuplicateNamedTupleEntry(field.name, fieldName);
                    }

                    names.Add(fieldName);
                    fields[i] = new NamedTupleEntry {
                        Name = fieldName, Type = Visit(field.type())
                    };
                }

                return(new NamedTupleType(fields));
            }
Пример #4
0
 public NamedTupleAccessExpr(ParserRuleContext sourceLocation, IPExpr subExpr, NamedTupleEntry entry)
 {
     SourceLocation = sourceLocation;
     SubExpr        = subExpr;
     Entry          = entry;
 }