public virtual Expression VisitConstructFlexArray(ConstructFlexArray consArr, ConstructFlexArray changes, ConstructFlexArray deletions, ConstructFlexArray insertions){
   this.UpdateSourceContext(consArr, changes);
   if (consArr == null) return changes;
   if (changes != null){
     if (deletions == null || insertions == null)
       Debug.Assert(false);
     else{
       consArr.ElementType = this.VisitTypeReference(consArr.ElementType, changes.ElementType);
       consArr.Initializers = this.VisitExpressionList(consArr.Initializers, changes.Initializers, deletions.Initializers, insertions.Initializers);
       consArr.Operands = this.VisitExpressionList(consArr.Operands, changes.Operands, deletions.Operands, insertions.Operands);
     }
   }else if (deletions != null)
     return null;
   return consArr;
 }
 public virtual Expression VisitConstructFlexArray(ConstructFlexArray consArr){
   if (consArr == null) return null;
   consArr.ElementType = this.VisitTypeReference(consArr.ElementType);
   consArr.Operands = this.VisitExpressionList(consArr.Operands);
   consArr.Initializers = this.VisitExpressionList(consArr.Initializers);
   return consArr;
 }
    public virtual Differences VisitConstructFlexArray(ConstructFlexArray consArr1, ConstructFlexArray consArr2){
      Differences differences = new Differences(consArr1, consArr2);
      if (consArr1 == null || consArr2 == null){
        if (consArr1 != consArr2) differences.NumberOfDifferences++; else differences.NumberOfSimilarities++;
        return differences;
      }
      ConstructFlexArray changes = (ConstructFlexArray)consArr2.Clone();
      ConstructFlexArray deletions = (ConstructFlexArray)consArr2.Clone();
      ConstructFlexArray insertions = (ConstructFlexArray)consArr2.Clone();

      Differences diff = this.VisitTypeNode(consArr1.ElementType, consArr2.ElementType);
      if (diff == null){Debug.Assert(false); return differences;}
      changes.ElementType = diff.Changes as TypeNode;
      deletions.ElementType = diff.Deletions as TypeNode;
      insertions.ElementType = diff.Insertions as TypeNode;
      //Debug.Assert(diff.Changes == changes.ElementType && diff.Deletions == deletions.ElementType && diff.Insertions == insertions.ElementType);
      differences.NumberOfDifferences += diff.NumberOfDifferences;
      differences.NumberOfSimilarities += diff.NumberOfSimilarities;

      ExpressionList exprChanges, exprDeletions, exprInsertions;
      diff = this.VisitExpressionList(consArr1.Initializers, consArr2.Initializers, out exprChanges, out exprDeletions, out exprInsertions);
      if (diff == null){Debug.Assert(false); return differences;}
      changes.Operands = exprChanges;
      deletions.Operands = exprDeletions;
      insertions.Operands = exprInsertions;
      differences.NumberOfDifferences += diff.NumberOfDifferences;
      differences.NumberOfSimilarities += diff.NumberOfSimilarities;

      diff = this.VisitExpressionList(consArr1.Operands, consArr2.Operands, out exprChanges, out exprDeletions, out exprInsertions);
      if (diff == null){Debug.Assert(false); return differences;}
      changes.Operands = exprChanges;
      deletions.Operands = exprDeletions;
      insertions.Operands = exprInsertions;
      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;
    }
Exemple #4
0
 public override Expression VisitConstructFlexArray(ConstructFlexArray consArr){
   if (consArr == null) return null;
   this.VisitResolvedTypeReference(consArr.ElementType, consArr.ElementTypeExpression);
   return base.VisitConstructFlexArray(consArr);
 }
Exemple #5
0
 public override Expression VisitConstructFlexArray(ConstructFlexArray consArr) {
   if (consArr == null) return null;
   TypeNode elemType = consArr.ElementType = this.VisitTypeReference(consArr.ElementType);
   consArr.Operands = this.VisitExpressionList(consArr.Operands);
   ExpressionList initializers = consArr.Initializers = this.VisitExpressionList(consArr.Initializers);
   for (int i = 0, n = initializers == null ? 0 : initializers.Count; i < n; i++)
     initializers[i] = this.typeSystem.ImplicitCoercion(initializers[i], elemType, this.TypeViewer);
   return consArr;
 }
Exemple #6
0
 public override Expression VisitConstructFlexArray(ConstructFlexArray consArr){
   if (consArr == null) return consArr;
   TypeNode et = consArr.ElementType = this.VisitTypeReference(consArr.ElementType);
   consArr.Operands = this.VisitExpressionList(consArr.Operands);
   consArr.Initializers = this.VisitExpressionList(consArr.Initializers);
   consArr.Type = SystemTypes.Object;
   if (et != null && !(et is TypeExpression)) //TODO: report such errors in Looker
     consArr.Type = SystemTypes.GenericList.GetTemplateInstance(this.currentType, et);
   return consArr;
 }
Exemple #7
0
 public virtual void VisitConstructFlexArray(ConstructFlexArray consArr)
 {
   if (consArr == null) return;
   this.VisitTypeReference(consArr.ElementType);
   this.VisitExpressionList(consArr.Operands);
   this.VisitExpressionList(consArr.Initializers);
 }
Exemple #8
0
 public override Expression VisitConstructFlexArray(ConstructFlexArray consArr)
 {
     if (consArr == null) return null;
     return base.VisitConstructFlexArray((ConstructFlexArray)consArr.Clone());
 }
 public virtual Expression VisitConstructFlexArray(ConstructFlexArray consArr1, ConstructFlexArray consArr2)
 {
     if (consArr1 == null) return null;
     if (consArr2 == null)
     {
         consArr1.ElementType = this.VisitTypeReference(consArr1.ElementType, null);
         consArr1.Operands = this.VisitExpressionList(consArr1.Operands, null);
         consArr1.Initializers = this.VisitExpressionList(consArr1.Initializers, null);
     }
     else
     {
         consArr1.ElementType = this.VisitTypeReference(consArr1.ElementType, consArr2.ElementType);
         consArr1.Operands = this.VisitExpressionList(consArr1.Operands, consArr2.Operands);
         consArr1.Initializers = this.VisitExpressionList(consArr1.Initializers, consArr2.Initializers);
     }
     return consArr1;
 }
Exemple #10
0
 public override Expression VisitConstructFlexArray(ConstructFlexArray consFlexArr){
   if (consFlexArr == null || consFlexArr.Type == null || consFlexArr.ElementType == null) return null;
   consFlexArr.Operands = this.VisitExpressionList(consFlexArr.Operands);
   ExpressionList initializers = consFlexArr.Initializers = this.VisitExpressionList(consFlexArr.Initializers);
   int initialCapacity = 0;
   int n = 0;
   if (consFlexArr.Operands != null && consFlexArr.Operands.Count > 0){
     Literal lit = consFlexArr.Operands[0] as Literal;
     if (lit != null && lit.Value is int)
       initialCapacity = (int)lit.Value;
   }else if (initializers != null)
     initialCapacity = (n = initializers.Count) * 2;
   InstanceInitializer cons = this.GetTypeView(consFlexArr.Type).GetConstructor(SystemTypes.Int32);
   if (cons == null){Debug.Assert(false); return null;}
   ExpressionList arguments = new ExpressionList(1);
   arguments.Add(new Literal(initialCapacity, SystemTypes.Int32));
   Construct consFlex = new Construct(new MemberBinding(null, cons), arguments);
   if (n == 0) return consFlex;
   StatementList statements = new StatementList(n+1);
   statements.Add(new ExpressionStatement(consFlex));
   Method add = this.GetTypeView(consFlexArr.Type).GetMethod(StandardIds.Add, consFlexArr.ElementType);
   for (int i = 0; i < n; i++){
     arguments = new ExpressionList(1);
     arguments.Add(initializers[i]);
     MethodCall call = new MethodCall(new MemberBinding(new Expression(NodeType.Dup), add), arguments);        
     statements.Add(new ExpressionStatement(call));
   }
   return new BlockExpression(new Block(statements), consFlexArr.Type);
 }