public override Expression VisitConstructTuple(ConstructTuple ct) { for (int i = 0, n = ct.Fields.Count; i < n; i++) { ct.Fields[i].Initializer = this.VisitExpression(ct.Fields[i].Initializer); } this.composers.Clear(); for (int i = 0, n = ct.Fields.Count; i < n; i++) { this.composers.Add(this.GetComposer(ct.Fields[i].Initializer)); } return((Expression)this.Compose(ct, this.composers)); }
public virtual Expression VisitConstructTuple(ConstructTuple consTuple, ConstructTuple changes, ConstructTuple deletions, ConstructTuple insertions){ this.UpdateSourceContext(consTuple, changes); if (consTuple == null) return changes; if (changes != null){ if (deletions == null || insertions == null) Debug.Assert(false); else{ consTuple.Fields = this.VisitFieldList(consTuple.Fields, changes.Fields, deletions.Fields, insertions.Fields); } }else if (deletions != null) return null; return consTuple; }
public virtual Differences VisitConstructTuple(ConstructTuple consTuple1, ConstructTuple consTuple2){ Differences differences = new Differences(consTuple1, consTuple2); if (consTuple1 == null || consTuple2 == null){ if (consTuple1 != consTuple2) differences.NumberOfDifferences++; else differences.NumberOfSimilarities++; return differences; } ConstructTuple changes = (ConstructTuple)consTuple2.Clone(); ConstructTuple deletions = (ConstructTuple)consTuple2.Clone(); ConstructTuple insertions = (ConstructTuple)consTuple2.Clone(); FieldList fieldChanges, fieldDeletions, fieldInsertions; Differences diff = this.VisitFieldList(consTuple1.Fields, consTuple2.Fields, out fieldChanges, out fieldDeletions, out fieldInsertions); if (diff == null){Debug.Assert(false); return differences;} changes.Fields = fieldChanges; deletions.Fields = fieldDeletions; insertions.Fields = fieldInsertions; differences.NumberOfDifferences += diff.NumberOfDifferences; differences.NumberOfSimilarities += diff.NumberOfSimilarities; if (differences.NumberOfDifferences == 0){ differences.Changes = null; differences.Deletions = null; differences.Insertions = null; }else{ differences.Changes = changes; differences.Deletions = deletions; differences.Insertions = insertions; } return differences; }
public virtual Expression VisitConstructTuple(ConstructTuple consTuple){ if (consTuple == null) return null; consTuple.Fields = this.VisitFieldList(consTuple.Fields); return consTuple; }
public override Expression VisitConstructTuple(ConstructTuple consTuple){ if (consTuple == null) return null; FieldList fields = consTuple.Fields; for (int i = 0, n = fields == null ? 0 : fields.Count; i < n; i++){ Field f = fields[i]; if (f == null) continue; Expression init = f.Initializer = this.VisitExpression(f.Initializer); if (init == null) continue; f.Type = init.Type; } consTuple.Type = TupleType.For(consTuple.Fields, this.currentType); return consTuple; }
public virtual void VisitConstructTuple(ConstructTuple consTuple) { if (consTuple == null) return; this.VisitFieldList(consTuple.Fields); }
public virtual Expression TupleCoercion(Expression source, TypeNode sourceType, TypeNode targetType, bool explicitCoercion, TypeViewer typeViewer){ TupleType sTuple = sourceType as TupleType; TupleType tTuple = targetType as TupleType; if (sTuple == null){ if (!explicitCoercion) return null; if (tTuple == null) return null; MemberList tMems = tTuple.Members; if (tMems == null || tMems.Count != 3) return null; ConstructTuple consTuple = new ConstructTuple(); consTuple.Type = tTuple; Field f = (Field)tMems[0].Clone(); consTuple.Fields = new FieldList(f); if (f.Type is TypeAlias) f.Initializer = this.ExplicitCoercion(source, f.Type, typeViewer); else f.Initializer = this.StandardExplicitCoercion(source, this.IsNonNullType(sourceType), sourceType, this.IsNonNullType(f.Type), f.Type, f.Type, typeViewer); if (f.Initializer == null) return null; return consTuple; } MemberList sMembers = sTuple.Members; if (sMembers == null) return null; int n = sMembers.Count; if (tTuple == null){ if (n == 3){ TypeUnion tUnion = targetType as TypeUnion; if (tUnion != null){ Method coercion = this.UserDefinedImplicitCoercionMethod(source, sourceType, targetType, true, typeViewer); if (coercion != null) return new MethodCall(new MemberBinding(null, coercion), new ExpressionList(this.ImplicitCoercion(source, coercion.Parameters[0].Type, typeViewer)), NodeType.Call, coercion.ReturnType, source.SourceContext); } Field sField = sMembers[0] as Field; if (sField == null || (!explicitCoercion && !this.ImplicitCoercionFromTo(sField.Type, targetType, typeViewer))) return null; if (!sField.IsAnonymous && targetType == SystemTypes.Object) return new BinaryExpression(source, new MemberBinding(null, sTuple), NodeType.Box, SystemTypes.Object); ConstructTuple cTuple = source as ConstructTuple; if (cTuple != null){ //TODO: give a warning source = cTuple.Fields[0].Initializer; }else{ MemberBinding mb = new MemberBinding(new UnaryExpression(source, NodeType.AddressOf), sField); mb.Type = sField.Type; source = mb; } if (explicitCoercion) return this.ExplicitCoercion(source, targetType, typeViewer); else return this.ImplicitCoercion(source, targetType, typeViewer); } if (targetType == SystemTypes.Object) return new BinaryExpression(source, new MemberBinding(null, sTuple), NodeType.Box, SystemTypes.Object); return null; } MemberList tMembers = tTuple.Members; if (sMembers == tMembers) return source; if (tMembers == null) return null; if (n != tMembers.Count) return null; n-=2; ConstructTuple consTup = source as ConstructTuple; if (consTup != null){ FieldList consFields = consTup.Fields; for (int i = 0; i < n; i++){ Field cField = consFields[i]; if (cField == null) continue; Field tField = tMembers[i] as Field; if (tField == null) return null; if (explicitCoercion) cField.Initializer = this.ExplicitCoercion(cField.Initializer, tField.Type, typeViewer); else{ if (!tField.IsAnonymous && tField.Name != null && (cField.IsAnonymous || cField.Name == null || cField.Name.UniqueIdKey != tField.Name.UniqueIdKey)) return null; cField.Initializer = this.ImplicitCoercion(cField.Initializer, tField.Type, typeViewer); } if (cField.Initializer == null) return null; cField.Type = tField.Type; } consTup.Type = tTuple; return consTup; } Local loc = new Local(sTuple); CoerceTuple cTup = new CoerceTuple(); cTup.OriginalTuple = source; cTup.Temp = loc; cTup.Type = tTuple; FieldList cFields = cTup.Fields = new FieldList(n); for (int i = 0; i < n; i++){ Field sField = sMembers[i] as Field; if (sField == null) return null; Field tField = tMembers[i] as Field; if (tField == null) return null; Field cField = new Field(); cField.Type = tField.Type; MemberBinding mb = new MemberBinding(loc, sField); if (explicitCoercion) cField.Initializer = this.ExplicitCoercion(mb, tField.Type, typeViewer); else{ if (!tField.IsAnonymous && tField.Name != null && (sField.IsAnonymous || sField.Name == null || sField.Name.UniqueIdKey != tField.Name.UniqueIdKey)) return null; cField.Initializer = this.ImplicitCoercion(mb, tField.Type, typeViewer); } if (cField.Initializer == null) return null; cFields.Add(cField); } return cTup; }
public override Expression VisitConstructTuple(ConstructTuple consTuple) { if (consTuple == null) return null; return base.VisitConstructTuple((ConstructTuple)consTuple.Clone()); }
public virtual Expression VisitConstructTuple(ConstructTuple consTuple1, ConstructTuple consTuple2) { if (consTuple1 == null) return null; if (consTuple2 == null) consTuple1.Fields = this.VisitFieldList(consTuple1.Fields, null); else consTuple1.Fields = this.VisitFieldList(consTuple1.Fields, consTuple2.Fields); return consTuple1; }
public override Expression VisitConstructTuple(ConstructTuple consTuple){ if (consTuple == null || consTuple.Type == null) return null; FieldList fields = consTuple.Fields; MemberList members = this.GetTypeView(consTuple.Type).Members; int n = fields == null ? 0 : fields.Count; StatementList statements = new StatementList(n+1); Block b = new Block(statements); Local loc = new Local(consTuple.Type); for (int i = 0; i < n; i++){ Field f = fields[i]; if (f == null) continue; Expression init = this.VisitExpression(f.Initializer); if (init == null) continue; f = members[i] as Field; if (f == null) continue; statements.Add(new AssignmentStatement(new MemberBinding(new UnaryExpression(loc, NodeType.AddressOf, loc.Type.GetReferenceType()), f), init)); } statements.Add(new ExpressionStatement(loc)); return new BlockExpression(b, consTuple.Type); }
public override Expression VisitConstructTuple(ConstructTuple ct) { for (int i = 0, n = ct.Fields.Count; i < n; i++) { ct.Fields[i].Initializer = this.VisitExpression(ct.Fields[i].Initializer); } this.composers.Clear(); for (int i = 0, n = ct.Fields.Count; i < n; i++) { this.composers.Add(this.GetComposer(ct.Fields[i].Initializer)); } return (Expression) this.Compose(ct, this.composers); }