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; }
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; }
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; }
public override ComprehensionBinding VisitComprehensionBinding(ComprehensionBinding comprehensionBinding){ if (comprehensionBinding == null) return null; this.VisitResolvedTypeReference(comprehensionBinding.TargetVariableType, comprehensionBinding.TargetVariableTypeExpression); return base.VisitComprehensionBinding(comprehensionBinding); }
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; }
public override ComprehensionBinding VisitComprehensionBinding(ComprehensionBinding comprehensionBinding) { if (comprehensionBinding == null) return null; return base.VisitComprehensionBinding((ComprehensionBinding)comprehensionBinding.Clone()); }
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; }
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(); }