示例#1
0
 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));
 }
示例#2
0
 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;
    }
示例#4
0
 public virtual Expression VisitConstructTuple(ConstructTuple consTuple){
   if (consTuple == null) return null;
   consTuple.Fields = this.VisitFieldList(consTuple.Fields);
   return consTuple;
 } 
示例#5
0
 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;
 }
示例#6
0
 public virtual void VisitConstructTuple(ConstructTuple consTuple)
 {
   if (consTuple == null) return;
   this.VisitFieldList(consTuple.Fields);
 }
示例#7
0
 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;
 }
示例#8
0
 public override Expression VisitConstructTuple(ConstructTuple consTuple)
 {
     if (consTuple == null) return null;
     return base.VisitConstructTuple((ConstructTuple)consTuple.Clone());
 }
示例#9
0
 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;
 }
示例#10
0
 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);
 }
示例#11
0
 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);
 }