private DiffParser(Stream input, OperationVisitor visitor) { _visitor = visitor; var token = new StringBuilder(); int b; while ((b = input.ReadByte()) != -1) { if (b == 0) { HandleToken(token.ToString()); token.Length = 0; continue; } token.Append((char) b); } }
public override void Accept(OperationVisitor visitor) { visitor.VisitExpressionStatement(this); }
public override TResult Accept <TArgument, TResult>(OperationVisitor <TArgument, TResult> visitor, TArgument argument) { return(visitor.VisitNoneOperation(this, argument)); }
public override void Accept(OperationVisitor visitor) { visitor.VisitInvalidStatement(this); }
public override TResult Accept <TArgument, TResult>(OperationVisitor <TArgument, TResult> visitor, TArgument argument) { return(visitor.VisitVariableDeclarationStatement(this, argument)); }
void IOperation.Accept(OperationVisitor visitor) { visitor.VisitSingleValueCaseClause(this); }
void IOperation.Accept(OperationVisitor visitor) { visitor.VisitCatch(this); }
public override TResult Accept <TArgument, TResult>(OperationVisitor <TArgument, TResult> visitor, TArgument argument) => visitor.VisitExpressionStatement(this, argument);
public override void Accept(OperationVisitor visitor) => visitor.VisitBlock(this);
public override void Accept(OperationVisitor visitor) => visitor.DefaultVisit(this);
public override void Accept(OperationVisitor visitor) => visitor.VisitEmptyStatement(this);
TResult IOperation.Accept <TArgument, TResult>(OperationVisitor <TArgument, TResult> visitor, TArgument argument) => visitor.VisitBlockStatement(this, argument);
void IOperation.Accept(OperationVisitor visitor) => visitor.VisitBlockStatement(this);
private DataFlowAnalysisResult <TAnalysisResult, TAbstractAnalysisValue> Run(ControlFlowGraph cfg) { var resultBuilder = new DataFlowAnalysisResultBuilder <TAnalysisData>(); // Add each basic block to the result. foreach (var block in cfg.Blocks) { resultBuilder.Add(block); } var worklist = new Queue <BasicBlock>(); var entry = GetEntry(cfg); // Initialize the output of the initial block // with the default abstract value of the domain. UpdateOutput(resultBuilder, entry, AnalysisDomain.Bottom); // Add all successor blocks of the initial // block to be processed. EnqueueRange(worklist, GetSuccessors(entry)); while (worklist.Count > 0) { // Get the next block to process // and its associated result. var block = worklist.Dequeue(); // Get the outputs of all predecessor blocks of the current block. var inputs = GetPredecessors(block).Select(b => GetOutput(resultBuilder[b])); // Merge all the outputs to get the new input of the current block. var input = AnalysisDomain.Merge(inputs); // Flow the new input through the block to get a new output. var output = Flow(block, input); // Compare the previous output with the new output. var compare = AnalysisDomain.Compare(GetOutput(resultBuilder[block]), output); // The newly computed abstract values for each basic block // must be always greater or equal than the previous value // to ensure termination. Debug.Assert(compare <= 0, "The newly computed abstract value must be greater or equal than the previous one."); // Is old value < new value ? if (compare < 0) { // The newly computed value is greater than the previous value, // so we need to update the current block result's // input and output values with the new ones. UpdateInput(resultBuilder, block, input); UpdateOutput(resultBuilder, block, output); // Since the new output value is different than the previous one, // we need to propagate it to all the successor blocks of the current block. EnqueueRange(worklist, GetSuccessors(block)); } } return(resultBuilder.ToResult(ToResult, OperationVisitor.GetStateMap())); }
internal abstract void Accept(OperationVisitor visitor);
public override TResult Accept <TArgument, TResult>(OperationVisitor <TArgument, TResult> visitor, TArgument argument) => visitor.VisitBlock(this, argument);
public override TResult Accept <TArgument, TResult>(OperationVisitor <TArgument, TResult> visitor, TArgument argument) { // TODO: implement IOperation for pattern-matching constructs (https://github.com/dotnet/roslyn/issues/8699) return(visitor.VisitNoneOperation(this, argument)); }
public override void Accept(OperationVisitor visitor) { throw ExceptionUtilities.Unreachable; }
TResult IOperation.Accept <TArgument, TResult>(OperationVisitor <TArgument, TResult> visitor, TArgument argument) { return(visitor.VisitSingleValueCaseClause(this, argument)); }
public override TResult Accept <TArgument, TResult>(OperationVisitor <TArgument, TResult> visitor, TArgument argument) { throw ExceptionUtilities.Unreachable; }
TResult IOperation.Accept <TArgument, TResult>(OperationVisitor <TArgument, TResult> visitor, TArgument argument) { return(visitor.VisitCatch(this, argument)); }
public override void Accept(OperationVisitor visitor) { visitor.VisitYieldBreakStatement(this); }
public override void Accept(OperationVisitor visitor) { visitor.VisitVariableDeclarationStatement(this); }
public override void Accept(OperationVisitor visitor) { visitor.VisitWhileUntilLoopStatement(this); }
public override void Accept(OperationVisitor visitor) { visitor.VisitBranchStatement(this); }
public abstract void Accept(OperationVisitor visitor);
public override TResult Accept <TArgument, TResult>(OperationVisitor <TArgument, TResult> visitor, TArgument argument) { return(visitor.VisitBranchStatement(this, argument)); }
public override void Accept(OperationVisitor visitor) { visitor.VisitForEachLoopStatement(this); }
public override void Accept(OperationVisitor visitor) { visitor.VisitNoneOperation(this); }
public abstract TResult Accept <TArgument, TResult>(OperationVisitor <TArgument, TResult> visitor, TArgument argument);
public static void Parse(Stream input, OperationVisitor visitor) { new DiffParser(input, visitor); }
void IOperation.Accept(OperationVisitor visitor) { visitor.VisitSwitchCase(this); }
internal override void Accept(OperationVisitor visitor) { visitor.Visit(this); }
public override void Accept(OperationVisitor visitor) { // TODO: implement IOperation for pattern-matching constructs (https://github.com/dotnet/roslyn/issues/8699) visitor.VisitNoneOperation(this); }