Exemple #1
0
        /// <summary>
        /// コンストラクタ
        /// </summary>
        /// <param name="operation">IOperationインスタンス</param>
        /// <param name="container">イベントコンテナ</param>
        public Invocation(IInvocationOperation operation, EventContainer container) : base(container)
        {
            if (operation.Instance is null)
            {
                // 組み込み・クラスメンバ
                var nameSpace = $"{operation.TargetMethod.ContainingNamespace.Name}.";
                var className = $"{operation.TargetMethod.ContainingType}".Replace(nameSpace, string.Empty, System.StringComparison.CurrentCulture);
                Expressions.Add(new Expression(className, string.Empty));
            }
            else
            {
                // インスタンス
                var isLiteralOrBinary = false;
                if (operation.Instance is ILiteralOperation || operation.Instance is IBinaryOperation)
                {
                    isLiteralOrBinary = true;
                }

                var syntax = operation.Syntax as InvocationExpressionSyntax;
                if (isLiteralOrBinary && syntax.ArgumentList != null)
                {
                    Expressions.Add(new Expression(syntax.ArgumentList.OpenParenToken.Text, string.Empty));
                }

                Expressions.AddRange(OperationFactory.GetExpressionList(operation.Instance, container));

                if (isLiteralOrBinary && syntax.ArgumentList != null)
                {
                    Expressions.Add(new Expression(syntax.ArgumentList.CloseParenToken.Text, string.Empty));
                }
            }
            Expressions.Add(new Expression(".", string.Empty));

            // メソッドがローカルメソッドの場合はクリアする
            if (operation.TargetMethod.MethodKind == MethodKind.LocalFunction)
            {
                Expressions.Clear();
            }

            // メソッド名
            Expressions.Add(new Expression(operation.TargetMethod.Name, operation.TargetMethod.MethodKind.ToString()));

            // メソッドパラメータ
            Expressions.Add(new Expression("(", string.Empty));
            var isFirst = true;

            foreach (var arg in operation.Arguments)
            {
                if (!isFirst)
                {
                    Expressions.Add(new Expression(",", string.Empty));
                }
                Expressions.AddRange(OperationFactory.GetExpressionList(arg.Value, container));

                isFirst = false;
            }
            Expressions.Add(new Expression(")", string.Empty));
        }
Exemple #2
0
        public void ParseBody()
        {
            var blocks = new Blocks(Method).MethodBlocks.GetAllBlocks();

            foreach (var blockAnalyzer in blocks.Select(block => new BlockAnalyzer(block)))
            {
                Expressions.AddRange(blockAnalyzer.GenerateExpressions());
            }
        }
Exemple #3
0
 internal SqlClientArray(Type clrType, ProviderType sqlType, SqlExpression[] exprs, Expression sourceExpression)
     : base(SqlNodeType.ClientArray, clrType, sqlType, sourceExpression)
 {
     expressions = new List <SqlExpression>();
     if (exprs != null)
     {
         Expressions.AddRange(exprs);
     }
 }
        /// <summary>
        /// コンストラクタ
        /// </summary>
        /// <param name="operation">IOperationインスタンス</param>
        /// <param name="container">イベントコンテナ</param>
        public VariableDeclarator(IVariableDeclaratorOperation operation, EventContainer container) : base(container)
        {
            Expressions.Add(new Expression(operation.Symbol.Name, Expression.GetSymbolTypeName(operation.Symbol)));

            if (!(operation.Initializer is null))
            {
                Expressions.Add(new Expression("=", string.Empty));
                Expressions.AddRange(OperationFactory.GetExpressionList(operation.Initializer.Value, container));
            }
        }
 /// <summary>
 /// コンストラクタ
 /// </summary>
 /// <param name="operation">IOperationインスタンス</param>
 /// <param name="container">イベントコンテナ</param>
 public ArrayInitializer(IArrayInitializerOperation operation, EventContainer container) : base(container)
 {
     // 初期化要素
     Expressions.Add(new Expression("[", string.Empty));
     foreach (var element in operation.ElementValues)
     {
         Expressions.AddRange(OperationFactory.GetExpressionList(element, eventContainer));
         if (element != operation.ElementValues.Last())
         {
             Expressions.Add(new Expression(",", string.Empty));
         }
     }
     Expressions.Add(new Expression("]", string.Empty));
 }
Exemple #6
0
        /// <summary>
        /// コンストラクタ
        /// </summary>
        /// <param name="operation">IOperationインスタンス</param>
        /// <param name="container">イベントコンテナ</param>
        public IsType(IIsTypeOperation operation, EventContainer container) : base(container)
        {
            var name = Expression.GetSymbolName(operation.TypeOperand, true);
            var type = Expression.GetSymbolTypeName(operation.TypeOperand);

            if (operation.TypeOperand.TypeKind == TypeKind.Class)
            {
                // 外部ファイル参照イベント発行
                RaiseOtherFileReferenced(operation.Syntax, operation.TypeOperand);
            }

            Expressions.AddRange(OperationFactory.GetExpressionList(operation.ValueOperand, container));
            Expressions.Add(new Expression("is", ""));
            Expressions.Add(new Expression(name, type));
        }
Exemple #7
0
        /// <summary>
        /// コンストラクタ
        /// </summary>
        /// <param name="operation">IOperationインスタンス</param>
        /// <param name="container">イベントコンテナ</param>
        public Binary(IBinaryOperation operation, EventContainer container) : base(container)
        {
            // 左辺
            OpenParentheses(operation.LeftOperand);
            Expressions.AddRange(OperationFactory.GetExpressionList(operation.LeftOperand, container));
            CloseParentheses(operation.LeftOperand);

            // 演算子
            Expressions.AddRange(Expression.GetOperationKindExpression(operation));

            // 右辺
            OpenParentheses(operation.RightOperand);
            Expressions.AddRange(OperationFactory.GetExpressionList(operation.RightOperand, container));
            CloseParentheses(operation.RightOperand);
        }
        /// <summary>
        /// コンストラクタ
        /// </summary>
        /// <param name="operation">IOperationインスタンス</param>
        /// <param name="container">イベントコンテナ</param>
        public ArrayElementReference(IArrayElementReferenceOperation operation, EventContainer container) : base(container)
        {
            // 型名
            Expressions.AddRange(OperationFactory.GetExpressionList(operation.ArrayReference, container));

            // 要素取得
            Expressions.Add(new Expression("[", string.Empty));
            for (var i = 0; i < operation.Indices.Length; i++)
            {
                Expressions.AddRange(OperationFactory.GetExpressionList(operation.Indices[i], container));
                if (i >= 0 && i < operation.Indices.Length - 1)
                {
                    Expressions.Add(new Expression(",", string.Empty));
                }
            }
            Expressions.Add(new Expression("]", string.Empty));
        }
Exemple #9
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);
            }
        }
        /// <summary>
        /// プロパティ参照情報を追加する
        /// </summary>
        /// <param name="operation">IOperationインスタンス</param>
        /// <returns>追加した場合はtrue nullの場合はfalse</returns>
        private bool AddExpressions(IOperation operation)
        {
            // operationがnullの場合はfalseを返して終了
            if (operation == null)
            {
                return(false);
            }

            // プロパティ参照情報の追加
            if (operation is IPropertyReferenceOperation prop)
            {
                if (prop.Property.IsStatic)
                {
                    Expressions.Add(new Expression(prop.Property.ContainingSymbol.Name,
                                                   Expression.GetSymbolTypeName(prop.Property.ContainingSymbol)));
                    Expressions.Add(new Expression(".", string.Empty));

                    // 外部参照チェック
                    if (prop.Property.ContainingSymbol is INamedTypeSymbol)
                    {
                        // 外部ファイル参照イベント発行
                        RaiseOtherFileReferenced(prop.Syntax, prop.Property.ContainingSymbol);
                    }
                }

                // インスタンスプロパティの場合はthisを追加する
                if (prop.Instance is IInstanceReferenceOperation)
                {
                    Expressions.AddRange(OperationFactory.GetExpressionList(prop.Instance, eventContainer));
                    Expressions.Add(new Expression(".", string.Empty));
                }

                // プロパティ格納
                SetProperty(prop);
            }
            else
            {
                Expressions.AddRange(OperationFactory.GetExpressionList(operation, eventContainer));
            }

            return(true);
        }
        /// <summary>
        /// コンストラクタ
        /// </summary>
        /// <param name="operation">IOperationインスタンス</param>
        /// <param name="container">イベントコンテナ</param>
        public ArrayCreation(IArrayCreationOperation operation, EventContainer container) : base(container)
        {
            // newキーワード追加
            Expressions.Add(new Expression("new", NewKeywordTypeName));

            // 型
            var arrayTypeSymbol = operation.Type as IArrayTypeSymbol;
            var parts           = arrayTypeSymbol?.ElementType.ToDisplayParts(SymbolDisplayFormat.MinimallyQualifiedFormat);

            foreach (var part in parts)
            {
                // スペースの場合は型設定に含めない
                if (part.Kind == SymbolDisplayPartKind.Space)
                {
                    continue;
                }

                var name = Expression.GetSymbolName(part, true);
                var type = Expression.GetSymbolTypeName(part.Symbol);
                if (part.Kind == SymbolDisplayPartKind.ClassName)
                {
                    // 外部ファイル参照イベント発行
                    RaiseOtherFileReferenced(operation.Syntax, part.Symbol);
                }

                Expressions.Add(new Expression(name, type));
            }

            // 要素取得
            Expressions.Add(new Expression("[", string.Empty));
            for (var i = 0; i < operation.DimensionSizes.Length; i++)
            {
                Expressions.AddRange(OperationFactory.GetExpressionList(operation.DimensionSizes[i], container));
                if (i >= 0 && i < operation.DimensionSizes.Length - 1)
                {
                    Expressions.Add(new Expression(",", string.Empty));
                }
            }
            Expressions.Add(new Expression("]", string.Empty));
        }
        /// <summary>
        /// プロパティ格納
        /// </summary>
        /// <param name="prop">親プロパティ</param>
        private void SetProperty(IPropertyReferenceOperation prop)
        {
            if (prop.Property is IPropertySymbol propItem)
            {
                if (propItem.IsIndexer)
                {
                    // インデクサの場合
                    Expressions.AddRange(OperationFactory.GetExpressionList(prop.Instance, eventContainer));
                    Expressions.Add(new Expression("[", string.Empty));
                    foreach (var arg in prop.Arguments)
                    {
                        if (!arg.Equals(prop.Arguments.First()))
                        {
                            Expressions.Add(new Expression(",", string.Empty));
                        }
                        Expressions.AddRange(OperationFactory.GetExpressionList(arg, eventContainer));
                    }
                    Expressions.Add(new Expression("]", string.Empty));
                }
                else
                {
                    // ローカルの場合はインスタンスを追加する
                    if (prop.Instance is ILocalReferenceOperation)
                    {
                        Expressions.AddRange(OperationFactory.GetExpressionList(prop.Instance, eventContainer));
                        Expressions.Add(new Expression(".", string.Empty));
                    }

                    // それ以外のプロパティの場合
                    Expressions.Add(new Expression(propItem.Name, Expression.GetSymbolTypeName(propItem)));
                }
            }
            else
            {
                // プロパティ以外の場合
                Expressions.Add(new Expression(prop.Property.Name, Expression.GetSymbolTypeName(prop.Property)));
            }
        }
Exemple #13
0
 /// <summary>
 /// コンストラクタ
 /// </summary>
 /// <param name="operation">IOperationインスタンス</param>
 /// <param name="container">イベントコンテナ</param>
 public SimpleAssignment(ISimpleAssignmentOperation operation, EventContainer container) : base(container)
 {
     Expressions.AddRange(OperationFactory.GetExpressionList(operation.Target, container));
     Expressions.Add(new Expression("=", string.Empty));
     Expressions.AddRange(OperationFactory.GetExpressionList(operation.Value, container));
 }
        /// <summary>
        /// コンストラクタ
        /// </summary>
        /// <param name="operation">IOperationインスタンス</param>
        /// <param name="container">イベントコンテナ</param>
        public ObjectCreation(IObjectCreationOperation operation, EventContainer container) : base(container)
        {
            var node  = operation.Syntax;
            var parts = operation.Type.ToDisplayParts(SymbolDisplayFormat.MinimallyQualifiedFormat);

            if (!parts.Any())
            {
                return;
            }

            // newキーワード追加
            Expressions.Add(new Expression("new", NewKeywordTypeName));

            // クラス生成
            foreach (var part in parts)
            {
                // スペースの場合は型設定に含めない
                if (part.Kind == SymbolDisplayPartKind.Space)
                {
                    continue;
                }

                var name = Expression.GetSymbolName(part, true);
                var type = Expression.GetSymbolTypeName(part.Symbol);
                if (part.Kind == SymbolDisplayPartKind.ClassName)
                {
                    // 外部ファイル参照イベント発行
                    RaiseOtherFileReferenced(node, part.Symbol);
                }

                Expressions.Add(new Expression(name, type));
            }

            // パラメーター取得
            Expressions.Add(new Expression("(", string.Empty));
            var isFirst = true;

            foreach (var param in operation.Arguments)
            {
                if (!isFirst)
                {
                    Expressions.Add(new Expression(",", string.Empty));
                }
                Expressions.AddRange(OperationFactory.GetExpressionList(param, container));

                isFirst = false;
            }
            Expressions.Add(new Expression(")", string.Empty));

            // 初期値を追加
            if (operation.Initializer != null)
            {
                isFirst = true;
                Expressions.Add(new Expression("{", string.Empty));
                foreach (var intializer in operation.Initializer.Initializers)
                {
                    if (!isFirst)
                    {
                        Expressions.Add(new Expression(",", string.Empty));
                    }

                    switch (intializer)
                    {
                    case IInvocationOperation op:
                        if (op.Arguments.Count() > 1)
                        {
                            Expressions.Add(new Expression("{", string.Empty));
                        }

                        foreach (var arg in op.Arguments)
                        {
                            if (op.Arguments.IndexOf(arg) > 0)
                            {
                                Expressions.Add(new Expression(",", string.Empty));
                            }

                            Expressions.AddRange(OperationFactory.GetExpressionList(arg, container));
                        }

                        if (op.Arguments.Count() > 1)
                        {
                            Expressions.Add(new Expression("}", string.Empty));
                        }
                        break;

                    default:
                        Expressions.AddRange(OperationFactory.GetExpressionList(intializer, container));
                        break;
                    }


                    isFirst = false;
                }
                Expressions.Add(new Expression("}", string.Empty));
            }
        }
Exemple #15
0
 /// <summary>
 /// コンストラクタ
 /// </summary>
 /// <param name="operation">IOperationインスタンス</param>
 /// <param name="container">イベントコンテナ</param>
 public IsPattern(IIsPatternOperation operation, EventContainer container) : base(container)
 {
     Expressions.AddRange(OperationFactory.GetExpressionList(operation.Value, container));
     Expressions.Add(new Expression("is", ""));
     Expressions.AddRange(OperationFactory.GetExpressionList(operation.Pattern, container));
 }
Exemple #16
0
 /// <summary>
 /// コンストラクタ
 /// </summary>
 /// <param name="operation">IOperationインスタンス</param>
 /// <param name="container">イベントコンテナ</param>
 public Argument(IArgumentOperation operation, EventContainer container) : base(container)
 {
     Expressions.AddRange(OperationFactory.GetExpressionList(operation.Value, container));
 }
Exemple #17
0
        /// <summary>
        /// コンストラクタ
        /// </summary>
        /// <param name="operation">IOperationインスタンス</param>
        /// <param name="container">イベントコンテナ</param>
        public CompoundAssignment(ICompoundAssignmentOperation operation, EventContainer container) : base(container)
        {
            // 対象インスタンス
            Expressions.AddRange(OperationFactory.GetExpressionList(operation.Target, container));

            var operatorName = string.Empty;

            switch (operation.OperatorKind)
            {
            case BinaryOperatorKind.Add:
                operatorName = "+";
                break;

            case BinaryOperatorKind.Subtract:
                operatorName = "-";
                break;

            case BinaryOperatorKind.Multiply:
                operatorName = "*";
                break;

            case BinaryOperatorKind.Divide:
                operatorName = "/";
                break;

            case BinaryOperatorKind.And:
                operatorName = "&&";
                break;

            case BinaryOperatorKind.ConditionalAnd:
                operatorName = "&";
                break;

            case BinaryOperatorKind.ConditionalOr:
                operatorName = "|";
                break;

            case BinaryOperatorKind.Equals:
                operatorName = "==";
                break;

            case BinaryOperatorKind.ExclusiveOr:
                operatorName = "^";
                break;

            case BinaryOperatorKind.GreaterThan:
                operatorName = ">";
                break;

            case BinaryOperatorKind.GreaterThanOrEqual:
                operatorName = ">=";
                break;

            case BinaryOperatorKind.LessThan:
                operatorName = "<";
                break;

            case BinaryOperatorKind.LessThanOrEqual:
                operatorName = "<=";
                break;

            case BinaryOperatorKind.NotEquals:
                operatorName = "!=";
                break;

            case BinaryOperatorKind.Or:
                operatorName = "||";
                break;
            }
            if (!string.IsNullOrEmpty(operatorName))
            {
                Expressions.Add(new Expression($"{operatorName}=", string.Empty));
            }

            // 値
            Expressions.AddRange(OperationFactory.GetExpressionList(operation.Value, container));
        }