public override Location VisitBranch([NotNull] IBranchOperation operation, [CanBeNull] object argument)
            {
                switch (operation.BranchKind)
                {
                case BranchKind.Continue:
                {
                    return(VisitContinueStatement(operation));
                }

                case BranchKind.Break:
                {
                    return(VisitBreakStatement(operation));
                }

                case BranchKind.GoTo:
                {
                    return(VisitGoToStatement(operation));
                }

                default:
                {
                    return(base.VisitBranch(operation, argument));
                }
                }
            }
Exemple #2
0
        public override void VisitBranch(IBranchOperation operation)
        {
            var target     = operation.Target;
            var branchKind = operation.BranchKind;

            base.VisitBranch(operation);
        }
Exemple #3
0
 /// <summary>
 /// Initializes a new instance of the <see cref="CheckoutOperation"/> class.
 /// </summary>
 /// <param name="dataProvider">The data provider.</param>
 /// <param name="treeOperation">The tree opeartion.</param>
 /// <param name="commitOperation">The commit operation.</param>
 /// <param name="branchOperation">The branch operation.</param>
 public CheckoutOperation(
     IDataProvider dataProvider,
     ITreeOperation treeOperation,
     ICommitOperation commitOperation,
     IBranchOperation branchOperation)
     : this(dataProvider, treeOperation, commitOperation, branchOperation, NullLogger <CheckoutOperation> .Instance)
 {
 }
Exemple #4
0
 /// <summary>
 /// Initializes a new instance of the <see cref="CheckoutOperation"/> class.
 /// </summary>
 /// <param name="dataProvider">The data provider.</param>
 /// <param name="treeOperation">The tree operation.</param>
 /// <param name="commitOperation">The commit operation.</param>
 /// <param name="branchOperation">The branch operation.</param>
 /// <param name="logger">The logger factory.</param>
 public CheckoutOperation(
     IDataProvider dataProvider,
     ITreeOperation treeOperation,
     ICommitOperation commitOperation,
     IBranchOperation branchOperation,
     ILogger <CheckoutOperation> logger)
 {
     this.dataProvider    = dataProvider;
     this.treeOperation   = treeOperation;
     this.commitOperation = commitOperation;
     this.branchOperation = branchOperation;
     this.logger          = logger;
 }
Exemple #5
0
 static Program()
 {
     FileSystem        = new FileSystem();
     FileOperator      = new PhysicalFileOperator(FileSystem);
     DataProvider      = new LocalDataProvider(FileOperator);
     Diff              = new DiffOperation(DataProvider, new DiffProxy());
     TreeOperation     = new TreeOperation(DataProvider);
     CommitOperation   = new CommitOperation(DataProvider, TreeOperation);
     TagOperation      = new TagOperation(DataProvider);
     ResetOperation    = new ResetOperation(DataProvider);
     MergeOperation    = new MergeOperation(DataProvider, CommitOperation, TreeOperation, Diff);
     InitOperation     = new DefaultInitOperation(DataProvider);
     BranchOperation   = new BranchOperation(DataProvider);
     CheckoutOperation = new CheckoutOperation(DataProvider, TreeOperation, CommitOperation, BranchOperation);
     AddOperation      = new AddOperation(DataProvider);
     OidConverter      = DataProvider.GetOid;
 }
Exemple #6
0
        /// <summary>
        /// Gets either a loop or a switch operation that corresponds to the given branch operation.
        /// </summary>
        /// <param name="operation">The branch operation for which a corresponding operation is looked up</param>
        /// <returns>The corresponding operation or <c>null</c> in case not found (e.g. no loop or switch syntax, or the branch is not a break or continue)</returns>
        /// <exception cref="ArgumentNullException"><paramref name="operation"/> is null</exception>
        /// <exception cref="InvalidOperationException">The operation is a part of Control Flow Graph</exception>
        public static IOperation?GetCorrespondingOperation(this IBranchOperation operation)
        {
            if (operation == null)
            {
                throw new ArgumentNullException(nameof(operation));
            }

            if (operation.SemanticModel == null)
            {
                throw new InvalidOperationException(
                          CodeAnalysisResources.OperationMustNotBeControlFlowGraphPart
                          );
            }

            if (
                operation.BranchKind != BranchKind.Break &&
                operation.BranchKind != BranchKind.Continue
                )
            {
                return(null);
            }

            if (operation.Target == null)
            {
                return(null);
            }

            for (IOperation current = operation; current.Parent != null; current = current.Parent)
            {
                switch (current)
                {
                case ILoopOperation correspondingLoop
                    when operation.Target.Equals(correspondingLoop.ExitLabel) ||
                    operation.Target.Equals(correspondingLoop.ContinueLabel):
                    return(correspondingLoop);

                case ISwitchOperation correspondingSwitch
                    when operation.Target.Equals(correspondingSwitch.ExitLabel):
                    return(correspondingSwitch);
                }
            }

            return(null);
        }
        public override void VisitBranch(IBranchOperation operation)
        {
            Assert.Equal(OperationKind.Branch, operation.Kind);
            var target = operation.Target;

            switch (operation.BranchKind)
            {
            case BranchKind.Break:
            case BranchKind.Continue:
            case BranchKind.GoTo:
                break;

            default:
                Assert.False(true);
                break;
            }

            Assert.Empty(operation.Children);
        }
Exemple #8
0
 public override IOperation VisitBranch(IBranchOperation operation, object argument)
 {
     return(new BranchStatement(operation.Target, operation.BranchKind, ((Operation)operation).SemanticModel, operation.Syntax, operation.Type, operation.ConstantValue, operation.IsImplicit));
 }
Exemple #9
0
 public void Init()
 {
     dataProvider    = new Mock <IDataProvider>();
     branchOperation = new BranchOperation(dataProvider.Object);
 }
Exemple #10
0
 public virtual void VisitBranch(IBranchOperation operation)
 {
     DefaultVisit(operation);
 }
Exemple #11
0
 public override void VisitBranch([NotNull] IBranchOperation operation)
 {
     base.VisitBranch(operation);
 }
 public override void VisitBranch([NotNull] IBranchOperation operation)
 {
     IncrementStatementCount(operation);
 }
            private static Location VisitGoToStatement([NotNull] IBranchOperation operation)
            {
                var syntax = (GotoStatementSyntax)operation.Syntax;

                return(syntax.GotoKeyword.GetLocation());
            }
            private static Location VisitBreakStatement([NotNull] IBranchOperation operation)
            {
                var syntax = (BreakStatementSyntax)operation.Syntax;

                return(syntax.BreakKeyword.GetLocation());
            }
            private static Location VisitContinueStatement([NotNull] IBranchOperation operation)
            {
                var syntax = (ContinueStatementSyntax)operation.Syntax;

                return(syntax.ContinueKeyword.GetLocation());
            }
Exemple #16
0
 public override bool VisitBranch([NotNull] IBranchOperation operation1, [CanBeNull] IOperation argument)
 {
     return(argument is IBranchOperation operation2 && AreBaseOperationsEqual(operation1, operation2) &&
            AreSymbolsEqual(operation1.Target, operation2.Target) && operation1.BranchKind == operation2.BranchKind);
 }