Exemplo n.º 1
0
 public virtual ComprehensionBinding VisitComprehensionBinding(ComprehensionBinding comprehensionBinding){
   if (comprehensionBinding == null) return null;
   comprehensionBinding.TargetVariableType = this.VisitTypeReference(comprehensionBinding.TargetVariableType);
   comprehensionBinding.TargetVariable = this.VisitTargetExpression(comprehensionBinding.TargetVariable);
   comprehensionBinding.AsTargetVariableType = this.VisitTypeReference(comprehensionBinding.AsTargetVariableType);
   comprehensionBinding.SourceEnumerable = this.VisitExpression(comprehensionBinding.SourceEnumerable);
   return comprehensionBinding;
 }
Exemplo n.º 2
0
    public virtual Differences VisitComprehensionBinding(ComprehensionBinding comprehensionBinding1, ComprehensionBinding comprehensionBinding2){
      Differences differences = new Differences(comprehensionBinding1, comprehensionBinding2);
      if (comprehensionBinding1 == null || comprehensionBinding2 == null){
        if (comprehensionBinding1 != comprehensionBinding2) differences.NumberOfDifferences++; else differences.NumberOfSimilarities++;
        return differences;
      }
      ComprehensionBinding changes = (ComprehensionBinding)comprehensionBinding2.Clone();
      ComprehensionBinding deletions = (ComprehensionBinding)comprehensionBinding2.Clone();
      ComprehensionBinding insertions = (ComprehensionBinding)comprehensionBinding2.Clone();

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

      if (comprehensionBinding1.Mode == comprehensionBinding2.Mode) differences.NumberOfSimilarities++; else differences.NumberOfDifferences++;

      diff = this.VisitExpression(comprehensionBinding1.SourceEnumerable, comprehensionBinding2.SourceEnumerable);
      if (diff == null){Debug.Assert(false); return differences;}
      changes.SourceEnumerable = diff.Changes as Expression;
      deletions.SourceEnumerable = diff.Deletions as Expression;
      insertions.SourceEnumerable = diff.Insertions as Expression;
      Debug.Assert(diff.Changes == changes.SourceEnumerable && diff.Deletions == deletions.SourceEnumerable && diff.Insertions == insertions.SourceEnumerable);
      differences.NumberOfDifferences += diff.NumberOfDifferences;
      differences.NumberOfSimilarities += diff.NumberOfSimilarities;

      diff = this.VisitExpression(comprehensionBinding1.TargetVariable, comprehensionBinding2.TargetVariable);
      if (diff == null){Debug.Assert(false); return differences;}
      changes.TargetVariable = diff.Changes as Expression;
      deletions.TargetVariable = diff.Deletions as Expression;
      insertions.TargetVariable = diff.Insertions as Expression;
      Debug.Assert(diff.Changes == changes.TargetVariable && diff.Deletions == deletions.TargetVariable && diff.Insertions == insertions.TargetVariable);
      differences.NumberOfDifferences += diff.NumberOfDifferences;
      differences.NumberOfSimilarities += diff.NumberOfSimilarities;

      diff = this.VisitTypeNode(comprehensionBinding1.TargetVariableType, comprehensionBinding2.TargetVariableType);
      if (diff == null){Debug.Assert(false); return differences;}
      changes.TargetVariableType = diff.Changes as TypeNode;
      deletions.TargetVariableType = diff.Deletions as TypeNode;
      insertions.TargetVariableType = diff.Insertions as TypeNode;
      //Debug.Assert(diff.Changes == changes.TargetVariableType && diff.Deletions == deletions.TargetVariableType && diff.Insertions == insertions.TargetVariableType);
      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;
    }
Exemplo n.º 3
0
    public override ComprehensionBinding VisitComprehensionBinding(ComprehensionBinding comprehensionBinding){
      comprehensionBinding.TargetVariableType = this.VisitTypeReference(comprehensionBinding.TargetVariableType);
      comprehensionBinding.TargetVariable = this.VisitTargetExpression(comprehensionBinding.TargetVariable);
      comprehensionBinding.AsTargetVariableType = this.VisitTypeReference(comprehensionBinding.AsTargetVariableType);
      Expression e = comprehensionBinding.SourceEnumerable = this.VisitExpression(comprehensionBinding.SourceEnumerable);
      //comprehensionBinding.Filter = this.VisitExpression(comprehensionBinding.Filter);

      if (e != null && e.NodeType == NodeType.AnonymousNestedFunction){
        AnonymousNestedFunction func = (AnonymousNestedFunction)e;
        Method invoker = func.Method;
        if (invoker != null){
          Expression ob = invoker.IsStatic ? null : new CurrentClosure(invoker, invoker.DeclaringType);
          e = new MethodCall(new MemberBinding(ob, invoker), null, NodeType.Call, invoker.ReturnType, e.SourceContext);
          func.Invocation = e;
          func.Type = invoker.ReturnType;
        }
      }
      if (comprehensionBinding.TargetVariableType == null){
        MemberBinding mb = comprehensionBinding.TargetVariable as MemberBinding;
        if (mb != null){
          Field f = mb.BoundMember as Field;
          if (f != null && e != null){
            TypeNode st = e.Type; //HACK
            while (st is TypeAlias) st = ((TypeAlias)st).AliasedType;
            if (st != e.Type)
              f.Type = this.typeSystem.GetStreamElementType(st, this.TypeViewer);
            else
              f.Type = this.typeSystem.GetStreamElementType(e, this.TypeViewer);
            mb.Type = f.Type;
            comprehensionBinding.TargetVariableType = f.Type;
          }
        }
      }
      return comprehensionBinding;
    }
Exemplo n.º 4
0
 public override ComprehensionBinding VisitComprehensionBinding(ComprehensionBinding comprehensionBinding){
   if (comprehensionBinding == null) return null;
   this.VisitResolvedTypeReference(comprehensionBinding.TargetVariableType, comprehensionBinding.TargetVariableTypeExpression);
   return base.VisitComprehensionBinding(comprehensionBinding);
 }
Exemplo n.º 5
0
	void Binding(out ComprehensionBinding binding) {
		binding = new ComprehensionBinding();
		TypeNode tn, dummy;
		Expression source;
		BlockScope newBlock;
		
		PType(out tn);
		binding.TargetVariableType = tn;
		newBlock = new BlockScope();
		newBlock.OuterScope = currentBlock;
		currentBlock = newBlock;
		
		Expect(23);
		Expect(54);
		Expect(22);
		PType(out dummy);
		Expect(24);
		Expect(49);
		string identName; 
		Ident(out identName);
		Identifier id = Identifier.For(identName);
		Field f = new Field(id);
		f.Type = tn;
		f.DeclaringType = currentBlock;
		currentBlock.Members.Add(f);
		MemberBinding mb = new MemberBinding(new ImplicitThis(),f);
		mb.Type = f.Type;
		binding.TargetVariable = mb;
		binding.ScopeForTemporaryVariables = currentBlock;
		
		Expect(50);
		Expect(23);
		Expr(out source);
		binding.SourceEnumerable = source;
		
	}
Exemplo n.º 6
0
 public override ComprehensionBinding VisitComprehensionBinding(ComprehensionBinding comprehensionBinding)
 {
     if (comprehensionBinding == null) return null;
     return base.VisitComprehensionBinding((ComprehensionBinding)comprehensionBinding.Clone());
 }
Exemplo n.º 7
0
 public virtual ComprehensionBinding VisitComprehensionBinding(ComprehensionBinding comprehensionBinding1, ComprehensionBinding comprehensionBinding2)
 {
     if (comprehensionBinding1 == null) return null;
     if (comprehensionBinding2 == null)
     {
         comprehensionBinding1.TargetVariableType = this.VisitTypeReference(comprehensionBinding1.TargetVariableType, null);
         comprehensionBinding1.TargetVariable = this.VisitTargetExpression(comprehensionBinding1.TargetVariable, null);
         comprehensionBinding1.SourceEnumerable = this.VisitExpression(comprehensionBinding1.SourceEnumerable, null);
     }
     else
     {
         comprehensionBinding1.TargetVariableType = this.VisitTypeReference(comprehensionBinding1.TargetVariableType, comprehensionBinding2.TargetVariableType);
         comprehensionBinding1.TargetVariable = this.VisitTargetExpression(comprehensionBinding1.TargetVariable, comprehensionBinding2.TargetVariable);
         comprehensionBinding1.SourceEnumerable = this.VisitExpression(comprehensionBinding1.SourceEnumerable, comprehensionBinding2.SourceEnumerable);
     }
     return comprehensionBinding1;
 }
Exemplo n.º 8
0
        public override Expression VisitComprehension(Comprehension comprehension)
        {
            if (comprehension == null)
            {
                return(null);
            }
            if (this._string == null)
            {
                this._string = new StringBuilder();
            }

            if (comprehension.nonEnumerableTypeCtor != null)
            {
                // then this comprehension represents an expression of the form "new T{...}"
                this._string.Append("new");
                this.AddType(comprehension.Type);
                this._string.Append(",");
                this.Visit(comprehension.AddMethod);
                this._string.Append(",");
                this.Visit(comprehension.nonEnumerableTypeCtor);
                this._string.Append(",");
            }

            if (comprehension.IsDisplay)
            {
                this._string.Append("(|");
                TypeNode t = comprehension.nonEnumerableTypeCtor == null ? comprehension.Type : comprehension.TemporaryHackToHoldType;
                t = TypeNode.StripModifiers(t);
                Debug.Assert(t != null && t.TemplateArguments != null && t.TemplateArguments.Count == 1, "ContractSerializer: bad display");
                this.AddType(t.TemplateArguments[0]);
                this._string.Append(",");
                this.VisitExpressionList(comprehension.Elements);
                this._string.Append("|)");
            }
            else
            {
                if (comprehension.BindingsAndFilters == null)
                {
                    return(null);
                }
                this._string.Append("{|");
                for (int i = 0, n = comprehension.BindingsAndFilters.Count; i < n; i++)
                {
                    ComprehensionBinding b = comprehension.BindingsAndFilters[i] as ComprehensionBinding;
                    if (b != null)
                    {
                        this._string.Append("{");
                        this.AddType(b.TargetVariableType);
                        this._string.Append(",");
                        this.VisitExpression(b.TargetVariable);
                        this._string.Append(",");
                        this.VisitExpression(b.SourceEnumerable);
                        this._string.Append("}");
                    }
                    else
                    { // filter
                        this._string.Append("(");
                        this.VisitExpression(comprehension.BindingsAndFilters[i]);
                        this._string.Append(")");
                    }
                }
                this._string.Append(";");
                this.VisitExpression(comprehension.Elements[0]);
                if (comprehension.Elements.Count > 1)
                {
                    this._string.Append(";");
                    this.VisitExpression(comprehension.Elements[1]);
                }
                this._string.Append("|}");
            }
            return(comprehension);
        }
 private static string comprehensionbinding2str(ComprehensionBinding cb)
 {//int i in(0:10)
     StringBuilder sb = new StringBuilder();
     TypeExpression type = (TypeExpression)(cb.TargetVariableTypeExpression);
     String variable =((MemberBinding) cb.TargetVariable).BoundMember.ToString().Substring(1);
     Expression scope = cb.SourceEnumerable;
     ComprehensionBindingMode mode = cb.Mode;
     sb.Append(typeexp2str(type) + " " + variable + " " + mode2str(mode)+ " "+ scope2str(scope));
     return sb.ToString();
 }