Esempio n. 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));
        }
        public override IMember Create(ModuleFactory mf, IPythonType declaringType, IGlobalScope gs)
        {
            if (_namedTuple != null)
            {
                return(_namedTuple);
            }

            var itemTypes = ItemTypes.Select(mf.ConstructType).ToArray();

            _namedTuple = new NamedTupleType(Name, ItemNames, itemTypes, mf.Module, IndexSpan.ToSpan());
            return(_namedTuple);
        }
Esempio n. 3
0
        public override IPExpr VisitNamedTupleBody(PParser.NamedTupleBodyContext context)
        {
            var fields  = context._values.Select(Visit).ToArray();
            var entries = context._names.Zip(fields,
                                             (fieldName, value) => new NamedTupleEntry
            {
                Name = fieldName.GetText(),
                Type = value.Type
            })
                          .ToArray();
            var type = new NamedTupleType(entries);

            return(new NamedTupleExpr(context, fields, type));
        }
Esempio n. 4
0
 public Exception MissingNamedTupleEntry(PParser.IdenContext location,
                                         NamedTupleType namedTuple)
 {
     return(IssueError(location,
                       $"named tuple type {namedTuple.OriginalRepresentation} has no '{location.GetText()}' field"));
 }
Esempio n. 5
0
        protected override void WriteExpr(IPExpr expr)
        {
#pragma warning disable CCN0002 // Non exhaustive patterns in switch block
            switch (expr)
            {
                case null:
                    WriteParts("<<null>>");
                    break;

                case BinOpExpr binOpExpr:
                    WriteParts("(", binOpExpr.Lhs, ") ", WriteBinOp(binOpExpr.Operation), " (", binOpExpr.Rhs, ")");
                    break;

                case BoolLiteralExpr boolLiteralExpr:
                    WriteParts(boolLiteralExpr.Value);
                    break;

                case CastExpr castExpr:
                    WriteParts("(", castExpr.SubExpr, ") as ", castExpr.Type);
                    break;

                case CoerceExpr coerceExpr:
                    WriteParts("(", coerceExpr.SubExpr, ") to ", coerceExpr.Type);
                    break;

                case ContainsExpr containsKeyExpr:
                    WriteParts("(", containsKeyExpr.Item, ") in (", containsKeyExpr.Collection, ")");
                    break;

                case CloneExpr cloneExpr:
                    WriteParts("$Clone(", cloneExpr.Term, ")");
                    break;

                case CtorExpr ctorExpr:
                    WriteParts("new ", ctorExpr.Interface, "(", ctorExpr.Arguments, ")");
                    break;

                case DefaultExpr defaultExpr:
                    WriteParts("default(", defaultExpr.Type, ")");
                    break;

                case EnumElemRefExpr enumElemRefExpr:
                    WriteParts(enumElemRefExpr.Value);
                    break;

                case EventRefExpr eventRefExpr:
                    WriteParts(eventRefExpr.Value);
                    break;

                case FairNondetExpr _:
                    WriteParts("$$");
                    break;

                case FloatLiteralExpr floatLiteralExpr:
                    WriteParts(floatLiteralExpr.Value.ToString(CultureInfo.InvariantCulture));
                    break;

                case FunCallExpr funCallExpr:
                    WriteParts(funCallExpr.Function, "(", funCallExpr.Arguments, ")");
                    break;

                case IntLiteralExpr intLiteralExpr:
                    WriteParts(intLiteralExpr.Value.ToString());
                    break;

                case KeysExpr keysExpr:
                    WriteParts("keys(", keysExpr.Expr, ")");
                    break;

                case LinearAccessRefExpr linearAccessRefExpr:
                    WriteParts(linearAccessRefExpr.Variable.Name,
                        linearAccessRefExpr.LinearType.Equals(LinearType.Move) ? " move" : " swap");
                    break;

                case MapAccessExpr mapAccessExpr:
                    WriteParts("(", mapAccessExpr.MapExpr, ")[", mapAccessExpr.IndexExpr, "]");
                    break;
                case SetAccessExpr setAccessExpr:
                    WriteParts("(", setAccessExpr.SetExpr, ")[", setAccessExpr.IndexExpr, "]");
                    break;
                case NamedTupleAccessExpr namedTupleAccessExpr:
                    WriteParts("(", namedTupleAccessExpr.SubExpr, ").", namedTupleAccessExpr.FieldName);
                    break;

                case NamedTupleExpr namedTupleExpr:
                    NamedTupleType ntType = (NamedTupleType)namedTupleExpr.Type;
                    WriteParts("(");
                    string ntSep = "";
                    for (int i = 0; i < ntType.Fields.Count; i++)
                    {
                        WriteParts(ntSep, ntType.Fields[i].Name, " = ", namedTupleExpr.TupleFields[i]);
                        ntSep = ", ";
                    }

                    WriteParts(")");
                    break;

                case NondetExpr _:
                    WriteParts("$");
                    break;

                case NullLiteralExpr _:
                    WriteParts("null");
                    break;

                case SeqAccessExpr seqAccessExpr:
                    WriteParts("(", seqAccessExpr.SeqExpr, ")[", seqAccessExpr.IndexExpr, "]");
                    break;

                case SizeofExpr sizeofExpr:
                    WriteParts("sizeof(", sizeofExpr.Expr, ")");
                    break;

                case ThisRefExpr _:
                    WriteParts("this");
                    break;

                case TupleAccessExpr tupleAccessExpr:
                    WriteParts("(", tupleAccessExpr.SubExpr, ").", tupleAccessExpr.FieldNo);
                    break;

                case UnaryOpExpr unaryOpExpr:
                    WriteParts(WriteUnOp(unaryOpExpr.Operation), "(", unaryOpExpr.SubExpr, ")");
                    break;

                case UnnamedTupleExpr unnamedTupleExpr:
                    WriteParts("(", unnamedTupleExpr.TupleFields, ")");
                    break;

                case ValuesExpr valuesExpr:
                    WriteParts("values(", valuesExpr.Expr, ")");
                    break;

                case VariableAccessExpr variableAccessExpr:
                    WriteParts(variableAccessExpr.Variable.Name);
                    break;

                default:
                    throw new ArgumentOutOfRangeException(nameof(expr));
            }
#pragma warning restore CCN0002 // Non exhaustive patterns in switch block
        }