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); }
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)); }
public Exception MissingNamedTupleEntry(PParser.IdenContext location, NamedTupleType namedTuple) { return(IssueError(location, $"named tuple type {namedTuple.OriginalRepresentation} has no '{location.GetText()}' field")); }
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 }