Skip to content

Commit

Permalink
Add IOperation APIs for Dynamic invocations and indexer access
Browse files Browse the repository at this point in the history
  • Loading branch information
mavasani committed Aug 23, 2017
1 parent 2c9472d commit 2cf8641
Show file tree
Hide file tree
Showing 26 changed files with 2,232 additions and 264 deletions.
32 changes: 32 additions & 0 deletions src/Compilers/CSharp/Portable/Operations/CSharpOperationFactory.cs
Original file line number Diff line number Diff line change
Expand Up @@ -93,6 +93,10 @@ private IOperation CreateInternal(BoundNode boundNode)
return CreateBoundParameterOperation((BoundParameter)boundNode);
case BoundKind.Literal:
return CreateBoundLiteralOperation((BoundLiteral)boundNode);
case BoundKind.DynamicInvocation:
return CreateBoundDynamicInvocationExpressionOperation((BoundDynamicInvocation)boundNode);
case BoundKind.DynamicIndexerAccess:
return CreateBoundDynamicIndexerAccessExpressionOperation((BoundDynamicIndexerAccess)boundNode);
case BoundKind.ObjectCreationExpression:
return CreateBoundObjectCreationExpressionOperation((BoundObjectCreationExpression)boundNode);
case BoundKind.DynamicObjectCreationExpression:
Expand Down Expand Up @@ -509,6 +513,34 @@ private IDynamicObjectCreationExpression CreateBoundDynamicObjectCreationExpress
return new LazyDynamicObjectCreationExpression(name, applicableSymbols, arguments, argumentNames, argumentRefKinds, initializer, _semanticModel, syntax, type, constantValue, isImplicit);
}

private IDynamicInvocationExpression CreateBoundDynamicInvocationExpressionOperation(BoundDynamicInvocation boundDynamicInvocation)
{
Lazy<IOperation> expression = new Lazy<IOperation>(() => Create(boundDynamicInvocation.Expression));
ImmutableArray<ISymbol> applicableSymbols = StaticCast<ISymbol>.From(boundDynamicInvocation.ApplicableMethods);
Lazy<ImmutableArray<IOperation>> arguments = new Lazy<ImmutableArray<IOperation>>(() => boundDynamicInvocation.Arguments.SelectAsArray(n => Create(n)));
ImmutableArray<string> argumentNames = boundDynamicInvocation.ArgumentNamesOpt.NullToEmpty();
ImmutableArray<RefKind> argumentRefKinds = boundDynamicInvocation.ArgumentRefKindsOpt.NullToEmpty();
SyntaxNode syntax = boundDynamicInvocation.Syntax;
ITypeSymbol type = boundDynamicInvocation.Type;
Optional<object> constantValue = ConvertToOptional(boundDynamicInvocation.ConstantValue);
bool isImplicit = boundDynamicInvocation.WasCompilerGenerated;
return new LazyDynamicInvocationExpression(expression, applicableSymbols, arguments, argumentNames, argumentRefKinds, _semanticModel, syntax, type, constantValue, isImplicit);
}

private IDynamicPropertyReferenceExpression CreateBoundDynamicIndexerAccessExpressionOperation(BoundDynamicIndexerAccess boundDynamicIndexerAccess)
{
Lazy<IOperation> expression = new Lazy<IOperation>(() => Create(boundDynamicIndexerAccess.ReceiverOpt));
ImmutableArray<ISymbol> applicableSymbols = StaticCast<ISymbol>.From(boundDynamicIndexerAccess.ApplicableIndexers);
Lazy<ImmutableArray<IOperation>> arguments = new Lazy<ImmutableArray<IOperation>>(() => boundDynamicIndexerAccess.Arguments.SelectAsArray(n => Create(n)));
ImmutableArray<string> argumentNames = boundDynamicIndexerAccess.ArgumentNamesOpt.NullToEmpty();
ImmutableArray<RefKind> argumentRefKinds = boundDynamicIndexerAccess.ArgumentRefKindsOpt.NullToEmpty();
SyntaxNode syntax = boundDynamicIndexerAccess.Syntax;
ITypeSymbol type = boundDynamicIndexerAccess.Type;
Optional<object> constantValue = ConvertToOptional(boundDynamicIndexerAccess.ConstantValue);
bool isImplicit = boundDynamicIndexerAccess.WasCompilerGenerated;
return new LazyDynamicPropertyReferenceExpression(expression, applicableSymbols, arguments, argumentNames, argumentRefKinds, _semanticModel, syntax, type, constantValue, isImplicit);
}

private IObjectOrCollectionInitializerExpression CreateBoundObjectInitializerExpressionOperation(BoundObjectInitializerExpression boundObjectInitializerExpression)
{
Lazy<ImmutableArray<IOperation>> initializers = new Lazy<ImmutableArray<IOperation>>(() => BoundObjectCreationExpression.GetChildInitializers(boundObjectInitializerExpression).SelectAsArray(n => Create(n)));
Expand Down
Loading

0 comments on commit 2cf8641

Please sign in to comment.