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] }); }
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 }); }
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)); } }
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."); }
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 }); }
/* * 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); }
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}"); } }
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}"); } }