예제 #1
0
        public override void VisitIncrementOrDecrement(IIncrementOrDecrementOperation operation)
        {
            var operatorMethod = operation.OperatorMethod;
            var isPostFix      = operation.IsPostfix;

            base.VisitIncrementOrDecrement(operation);
        }
예제 #2
0
        private void OnCompilationStart(CompilationStartAnalysisContext compilationContext)
        {
            var restrictedInternalsVisibleToMap = GetRestrictedInternalsVisibleToMap(compilationContext.Compilation);
            if (restrictedInternalsVisibleToMap.IsEmpty)
            {
                return;
            }

            var namespaceToIsBannedMap = new ConcurrentDictionary<INamespaceSymbol, /*isBanned*/bool>();

            // Verify all explicit type name specifications in declarations and executable code.
            compilationContext.RegisterSyntaxNodeAction(
                context =>
                {
                    var name = (TNameSyntax)context.Node;
                    if (!IsInTypeOnlyContext(name) ||
                        name.Parent is TNameSyntax)
                    {
                        // Bail out if we are not in type only context or the parent is also a name
                        // which will be analyzed separately.
                        return;
                    }

                    var typeInfo = context.SemanticModel.GetTypeInfo(name, context.CancellationToken);
                    VerifySymbol(typeInfo.Type as INamedTypeSymbol, name,
                        context.ReportDiagnostic, restrictedInternalsVisibleToMap, namespaceToIsBannedMap);
                },
                NameSyntaxKinds);

            // Verify all member usages in executable code.
            compilationContext.RegisterOperationAction(
                context =>
                {
                    var symbol = context.Operation switch
                    {
                        IObjectCreationOperation objectCreation => objectCreation.Constructor,
                        IInvocationOperation invocation => invocation.TargetMethod,
                        IMemberReferenceOperation memberReference => memberReference.Member,
                        IConversionOperation conversion => conversion.OperatorMethod,
                        IUnaryOperation unary => unary.OperatorMethod,
                        IBinaryOperation binary => binary.OperatorMethod,
                        IIncrementOrDecrementOperation incrementOrDecrement => incrementOrDecrement.OperatorMethod,
                        _ => throw new NotImplementedException($"Unhandled OperationKind: {context.Operation.Kind}"),
                    };

                    VerifySymbol(symbol, context.Operation.Syntax,
                        context.ReportDiagnostic, restrictedInternalsVisibleToMap, namespaceToIsBannedMap);
                },
                OperationKind.ObjectCreation,
                OperationKind.Invocation,
                OperationKind.EventReference,
                OperationKind.FieldReference,
                OperationKind.MethodReference,
                OperationKind.PropertyReference,
                OperationKind.Conversion,
                OperationKind.UnaryOperator,
                OperationKind.BinaryOperator,
                OperationKind.Increment,
                OperationKind.Decrement);
        }
예제 #3
0
 public override bool VisitIncrementOrDecrement([NotNull] IIncrementOrDecrementOperation operation1,
                                                [CanBeNull] IOperation argument)
 {
     return(argument is IIncrementOrDecrementOperation operation2 && AreBaseOperationsEqual(operation1, operation2) &&
            AreSymbolsEqual(operation1.OperatorMethod, operation2.OperatorMethod) &&
            operation1.IsPostfix == operation2.IsPostfix && operation1.IsLifted == operation2.IsLifted &&
            operation1.IsChecked == operation2.IsChecked);
 }
예제 #4
0
        public override void VisitIncrementOrDecrement(IIncrementOrDecrementOperation operation)
        {
            Assert.Contains(operation.Kind, new[] { OperationKind.Increment, OperationKind.Decrement });
            var operatorMethod = operation.OperatorMethod;
            var isPostFix      = operation.IsPostfix;
            var isLifted       = operation.IsLifted;
            var isChecked      = operation.IsChecked;

            Assert.Same(operation.Target, operation.Children.Single());
        }
예제 #5
0
        /// <summary>
        /// コンストラクタ
        /// </summary>
        /// <param name="operation">IOperationインスタンス</param>
        /// <param name="container">イベントコンテナ</param>
        public Increment(IIncrementOrDecrementOperation operation, EventContainer container) : base(container)
        {
            var incrementOrDecrement = Expression.GetOperationKindExpression(operation);

            if (!operation.IsPostfix)
            {
                // インクリメント・デクリメント
                Expressions.AddRange(incrementOrDecrement);
            }

            // インクリメント・デクリメント対象インスタンス
            Expressions.AddRange(OperationFactory.GetExpressionList(operation.Target, container));

            if (operation.IsPostfix)
            {
                // インクリメント・デクリメント
                Expressions.AddRange(incrementOrDecrement);
            }
        }
            public override ValueContentAbstractValue ComputeValueForIncrementOrDecrementOperation(IIncrementOrDecrementOperation operation, ValueContentAbstractValue targetValue)
            {
                var incrementValue     = ValueContentAbstractValue.ContainsOneIntergralLiteralState;
                var incrementValueType = WellKnownTypeProvider.Compilation.GetSpecialType(SpecialType.System_Int32);
                var operationKind      = operation.Kind == OperationKind.Increment ? BinaryOperatorKind.Add : BinaryOperatorKind.Subtract;

                return(targetValue.MergeBinaryOperation(incrementValue, operationKind, operation.Target.Type, incrementValueType, operation.Type));
            }
예제 #7
0
        public override IOperation VisitIncrementOrDecrement(IIncrementOrDecrementOperation operation, object argument)
        {
            bool isDecrement = operation.Kind == OperationKind.Decrement;

            return(new IncrementExpression(isDecrement, operation.IsPostfix, operation.IsLifted, operation.IsChecked, Visit(operation.Target), operation.OperatorMethod, ((Operation)operation).SemanticModel, operation.Syntax, operation.Type, operation.ConstantValue, operation.IsImplicit));
        }
예제 #8
0
 public virtual void VisitIncrementOrDecrement(IIncrementOrDecrementOperation operation)
 {
     DefaultVisit(operation);
 }
 public override void VisitIncrementOrDecrement([NotNull] IIncrementOrDecrementOperation operation)
 {
     RegisterAssignment(operation.Target);
     base.VisitIncrementOrDecrement(operation);
 }
예제 #10
0
 public override void VisitIncrementOrDecrement([NotNull] IIncrementOrDecrementOperation operation)
 {
     base.VisitIncrementOrDecrement(operation);
 }
예제 #11
0
 public override Scope VisitIncrementOrDecrement(IIncrementOrDecrementOperation operation, Scope currentScope) =>
 operation.Target.Accept(this, currentScope);
예제 #12
0
 public override Scope VisitIncrementOrDecrement(IIncrementOrDecrementOperation operation, Scope currentScope)
 => currentScope;