Example #1
0
        private static AbstractExpression ReadBinaryOperator(IBinaryOperation op)
        {
            var context = CodeReaderContext.GetContextOrThrow();

            return(new BinaryExpression {
                Left = ReadExpression(op.LeftOperand),
                Right = ReadExpression(op.RightOperand),
                Type = context.CodeModel.TryGet <TypeMember>(op.Type),
                Operator = BinaryOperatorByOperatorKind[op.OperatorKind]
            });
        }
Example #2
0
        private static AbstractExpression ReadLiteral(ILiteralOperation op)
        {
            var context = CodeReaderContext.GetContextOrThrow();
            var type    = (op.Type != null
                ? context.FindMemberOrThrow <TypeMember>(binding: op.Type)
                : null);

            return(new ConstantExpression {
                Type = type,
                Value = op.ConstantValue.HasValue ? op.ConstantValue.Value : null
            });
        }
Example #3
0
        private static AbstractExpression ReadAssignmentValue(IAssignmentOperation op)
        {
            var context = CodeReaderContext.GetContextOrThrow();

            if (op.ConstantValue.HasValue)
            {
                return(context.GetConstantExpression(op.ConstantValue.Value));
            }
            else
            {
                return(ReadExpression(op.Value));
            }
        }
Example #4
0
        private static MethodMember FindMethodMember(CodeReaderContext context, IMethodSymbol symbol)
        {
            var member = context.CodeModel.TryGet <MethodMember>(symbol);

            if (member != null)
            {
                return(member);
            }

            if (symbol.ConstructedFrom != null)
            {
                return(context.CodeModel.Get <MethodMember>(symbol.ConstructedFrom));
            }

            throw new InvalidCodeModelException($"Method member '{symbol}' cannot be found in code model.");
        }
Example #5
0
        private static AbstractExpression ReadObjectCreation(IObjectCreationOperation op)
        {
            var context     = CodeReaderContext.GetContextOrThrow();
            var objectType  = context.CodeModel.Get <TypeMember>(op.Type);
            var initializer = ReadExpression(op.Initializer);

            return(new NewObjectExpression {
                Type = objectType,
                ConstructorCall = new MethodCallExpression {
                    Type = objectType,
                    Method = context.CodeModel.Get <ConstructorMember>(op.Constructor),
                    Arguments = op.Arguments.Select(ReadArgument).ToList()
                },
                ObjectInitializer = initializer as ObjectInitializerExpression,
                CollectionInitializer = initializer as CollectionInitializerExpression
            });
        }
Example #6
0
        /*
         * Microsoft.CodeAnalysis.Operations. IAddressOfOperation
         * Microsoft.CodeAnalysis.Operations. IAnonymousFunctionOperation
         * Microsoft.CodeAnalysis.Operations. IAnonymousObjectCreationOperation
         * Microsoft.CodeAnalysis.Operations. IArgumentOperation
         * Microsoft.CodeAnalysis.Operations. IArrayCreationOperation
         * Microsoft.CodeAnalysis.Operations. IArrayElementReferenceOperation
         * Microsoft.CodeAnalysis.Operations. IArrayInitializerOperation
         * - Microsoft.CodeAnalysis.Operations. IAssignmentOperation
         * Microsoft.CodeAnalysis.Operations. IAwaitOperation
         * Microsoft.CodeAnalysis.Operations. IBinaryOperation
         * - Microsoft.CodeAnalysis.Operations. IBlockOperation
         * Microsoft.CodeAnalysis.Operations. IBranchOperation
         * Microsoft.CodeAnalysis.Operations. ICaseClauseOperation
         * Microsoft.CodeAnalysis.Operations. ICatchClauseOperation
         * Microsoft.CodeAnalysis.Operations. ICoalesceOperation
         * Microsoft.CodeAnalysis.Operations. ICollectionElementInitializerOperation
         * Microsoft.CodeAnalysis.Operations. ICompoundAssignmentOperation
         * Microsoft.CodeAnalysis.Operations. IConditionalAccessInstanceOperation
         * Microsoft.CodeAnalysis.Operations. IConditionalAccessOperation
         * Microsoft.CodeAnalysis.Operations. IConditionalOperation
         * Microsoft.CodeAnalysis.Operations. IConstantPatternOperation
         * Microsoft.CodeAnalysis.Operations. IConversionOperation
         * Microsoft.CodeAnalysis.Operations. IDeclarationExpressionOperation
         * Microsoft.CodeAnalysis.Operations. IDeclarationPatternOperation
         * Microsoft.CodeAnalysis.Operations. IDeconstructionAssignmentOperation
         * Microsoft.CodeAnalysis.Operations. IDefaultCaseClauseOperation
         * Microsoft.CodeAnalysis.Operations. IDefaultValueOperation
         * Microsoft.CodeAnalysis.Operations. IDelegateCreationOperation
         * Microsoft.CodeAnalysis.Operations. IDynamicIndexerAccessOperation
         * Microsoft.CodeAnalysis.Operations. IDynamicInvocationOperation
         * Microsoft.CodeAnalysis.Operations. IDynamicMemberReferenceOperation
         * Microsoft.CodeAnalysis.Operations. IDynamicObjectCreationOperation
         * Microsoft.CodeAnalysis.Operations. IEmptyOperation
         * Microsoft.CodeAnalysis.Operations. IEndOperation
         * Microsoft.CodeAnalysis.Operations. IEventAssignmentOperation
         * Microsoft.CodeAnalysis.Operations. IEventReferenceOperation
         * Microsoft.CodeAnalysis.Operations. IExpressionStatementOperation
         * Microsoft.CodeAnalysis.Operations. IFieldInitializerOperation
         * Microsoft.CodeAnalysis.Operations. IFieldReferenceOperation
         * Microsoft.CodeAnalysis.Operations. IFixedOperation
         * Microsoft.CodeAnalysis.Operations. IForEachLoopOperation
         * Microsoft.CodeAnalysis.Operations. IForLoopOperation
         * Microsoft.CodeAnalysis.Operations. IForToLoopOperation
         * Microsoft.CodeAnalysis.Operations. IIncrementOrDecrementOperation
         * Microsoft.CodeAnalysis.Operations. IInstanceReferenceOperation
         * Microsoft.CodeAnalysis.Operations. IInterpolatedStringContentOperation
         * Microsoft.CodeAnalysis.Operations. IInterpolatedStringOperation
         * Microsoft.CodeAnalysis.Operations. IInterpolatedStringTextOperation
         * Microsoft.CodeAnalysis.Operations. IInterpolationOperation
         * Microsoft.CodeAnalysis.Operations. IInvalidOperation
         * Microsoft.CodeAnalysis.Operations. IInvocationOperation
         * Microsoft.CodeAnalysis.Operations. IIsPatternOperation
         * Microsoft.CodeAnalysis.Operations. IIsTypeOperation
         * Microsoft.CodeAnalysis.Operations. ILabeledOperation
         * Microsoft.CodeAnalysis.Operations. ILiteralOperation
         * Microsoft.CodeAnalysis.Operations. ILocalFunctionOperation
         * Microsoft.CodeAnalysis.Operations. ILocalReferenceOperation
         * Microsoft.CodeAnalysis.Operations. ILockOperation
         * Microsoft.CodeAnalysis.Operations. ILoopOperation
         * Microsoft.CodeAnalysis.Operations. IMemberInitializerOperation
         * Microsoft.CodeAnalysis.Operations. IMemberReferenceOperation
         * Microsoft.CodeAnalysis.Operations. IMethodReferenceOperation
         * Microsoft.CodeAnalysis.Operations. INameOfOperation
         * Microsoft.CodeAnalysis.Operations. IObjectCreationOperation
         * Microsoft.CodeAnalysis.Operations. IObjectOrCollectionInitializerOperation
         * Microsoft.CodeAnalysis.Operations. IOmittedArgumentOperation
         * Microsoft.CodeAnalysis.Operations. IParameterInitializerOperation
         * Microsoft.CodeAnalysis.Operations. IParameterReferenceOperation
         * Microsoft.CodeAnalysis.Operations. IParenthesizedOperation
         * Microsoft.CodeAnalysis.Operations. IPatternCaseClauseOperation
         * Microsoft.CodeAnalysis.Operations. IPatternOperation
         * Microsoft.CodeAnalysis.Operations. IPlaceholderOperation
         * Microsoft.CodeAnalysis.Operations. IPointerIndirectionReferenceOperation
         * Microsoft.CodeAnalysis.Operations. IPropertyInitializerOperation
         * Microsoft.CodeAnalysis.Operations. IPropertyReferenceOperation
         * Microsoft.CodeAnalysis.Operations. IRaiseEventOperation
         * Microsoft.CodeAnalysis.Operations. IRangeCaseClauseOperation
         * Microsoft.CodeAnalysis.Operations. IRelationalCaseClauseOperation
         * Microsoft.CodeAnalysis.Operations. IReturnOperation
         * Microsoft.CodeAnalysis.Operations. ISimpleAssignmentOperation
         * Microsoft.CodeAnalysis.Operations. ISingleValueCaseClauseOperation
         * Microsoft.CodeAnalysis.Operations. ISizeOfOperation
         * Microsoft.CodeAnalysis.Operations. IStopOperation
         * Microsoft.CodeAnalysis.Operations. ISwitchCaseOperation
         * Microsoft.CodeAnalysis.Operations. ISwitchOperation
         * Microsoft.CodeAnalysis.Operations. ISymbolInitializerOperation
         * Microsoft.CodeAnalysis.Operations. IThrowOperation
         * Microsoft.CodeAnalysis.Operations. ITranslatedQueryOperation
         * Microsoft.CodeAnalysis.Operations. ITryOperation
         * Microsoft.CodeAnalysis.Operations. ITupleOperation
         * Microsoft.CodeAnalysis.Operations. ITypeOfOperation
         * Microsoft.CodeAnalysis.Operations. ITypeParameterObjectCreationOperation
         * Microsoft.CodeAnalysis.Operations. IUnaryOperation
         * Microsoft.CodeAnalysis.Operations. IUsingOperation
         * Microsoft.CodeAnalysis.Operations. IVariableDeclarationGroupOperation
         * Microsoft.CodeAnalysis.Operations. IVariableDeclarationOperation
         * Microsoft.CodeAnalysis.Operations. IVariableDeclaratorOperation
         * Microsoft.CodeAnalysis.Operations. IVariableInitializerOperation
         * Microsoft.CodeAnalysis.Operations. IWhileLoopOperation
         * Microsoft.CodeAnalysis.Operations. IWithOperation
         */

        private static AbstractStatement ReadBlock(IBlockOperation op)
        {
            var context = CodeReaderContext.GetContextOrThrow();
            var result  = new BlockStatement();

            using (context.PushState(new BlockContext(result)))
            {
                foreach (var childOp in op.Operations)
                {
                    if (!IsRedundantStatement(childOp))
                    {
                        result.Statements.Add(ReadStatement(childOp));
                    }
                }
            }

            return(result);
        }
Example #7
0
        private static AbstractExpression ReadCollectionInitializer(IObjectOrCollectionInitializerOperation op)
        {
            var context = CodeReaderContext.GetContextOrThrow();
            var result  = new CollectionInitializerExpression {
                Items = op.Initializers.Select(readInitializer).ToList()
            };

            return(result);

            CollectionInitializerExpression.ItemInitializer readInitializer(IOperation initOp)
            {
                if (initOp is IInvocationOperation invocation)
                {
                    var item = new CollectionInitializerExpression.ItemInitializer();
                    item.ItemArguments.AddRange(invocation.Arguments.Select(arg => ReadExpression(arg.Value)));
                    return(item);
                }

                throw new CodeReadErrorException($"Unrecognized collection initializer: {initOp.Syntax}");
            }
        }
Example #8
0
        private static AbstractExpression ReadObjectInitializer(IObjectOrCollectionInitializerOperation op)
        {
            var context = CodeReaderContext.GetContextOrThrow();
            var result  = new ObjectInitializerExpression {
                PropertyValues = op.Initializers.Select(readInitializer).ToList()
            };

            return(result);

            NamedPropertyValue readInitializer(IOperation initOp)
            {
                if (initOp is IAssignmentOperation assignment &&
                    assignment.Target is IMemberReferenceOperation memberRef)
                {
                    var property = context.FindMemberOrThrow <AbstractMember>(memberRef.Member);
                    var value    = ReadAssignmentValue(assignment);

                    return(new NamedPropertyValue(property.Name, value));
                }

                throw new CodeReadErrorException($"Unrecognized object initializer: {initOp.Syntax}");
            }
        }