From d290266ed6f57474b078ae0988d710feb37f483b Mon Sep 17 00:00:00 2001 From: Manish Vasani Date: Fri, 1 Sep 2017 10:07:42 -0700 Subject: [PATCH] Changes as per the design team decision: 1) Use IDynamicInvocationExpression for VB late bound invocation and C# dynamic invocation. 2) Use IDynamicIndexerAccessExpression for C# dynamic indexer access; not used in VB. 3) Remove IDynamicObjectCreationExpression.MemberName property. 4) Add extension methods on IHasDynamicArgumentExpression to get optional argument name and ref kind for an argument at a given index. --- .../Operations/CSharpOperationFactory.cs | 7 +- ...nTests_IDynamicIndexerAccessExpression.cs} | 43 ++-- ...nTests_IDynamicObjectCreationExpression.cs | 16 +- ...tionTests_IParameterReferenceExpression.cs | 4 +- .../Generated/Operations.xml.Generated.cs | 134 ++++------ ....cs => IDynamicIndexerAccessExpression.cs} | 6 +- .../IDynamicInvocationExpression.cs | 4 +- .../IDynamicObjectCreationExpression.cs | 5 - .../IHasDynamicArgumentsExpression.cs | 10 - .../Portable/Operations/OperationCloner.cs | 8 +- .../Operations/OperationExtensions.cs | 81 ++++++ .../Core/Portable/Operations/OperationKind.cs | 4 +- .../Portable/Operations/OperationVisitor.cs | 4 +- .../Core/Portable/PublicAPI.Unshipped.txt | 39 ++- .../Operations/VisualBasicOperationFactory.vb | 13 +- ...ationTests_IDynamicInvocationExpression.vb | 241 +++++++++++++++++- ...sts_IDynamicPropertyReferenceExpression.vb | 241 ------------------ .../Compilation/OperationTreeVerifier.cs | 97 +++++-- .../Compilation/TestOperationWalker.cs | 27 +- 19 files changed, 526 insertions(+), 458 deletions(-) rename src/Compilers/CSharp/Test/Semantic/IOperation/{IOperationTests_IDynamicPropertyReferenceExpression.cs => IOperationTests_IDynamicIndexerAccessExpression.cs} (87%) rename src/Compilers/Core/Portable/Operations/{IDynamicPropertyReferenceExpression.cs => IDynamicIndexerAccessExpression.cs} (70%) delete mode 100644 src/Compilers/VisualBasic/Test/Semantic/IOperation/IOperationTests_IDynamicPropertyReferenceExpression.vb diff --git a/src/Compilers/CSharp/Portable/Operations/CSharpOperationFactory.cs b/src/Compilers/CSharp/Portable/Operations/CSharpOperationFactory.cs index 8916eb18c14..30680a6443e 100644 --- a/src/Compilers/CSharp/Portable/Operations/CSharpOperationFactory.cs +++ b/src/Compilers/CSharp/Portable/Operations/CSharpOperationFactory.cs @@ -500,7 +500,6 @@ private IObjectCreationExpression CreateBoundObjectCreationExpressionOperation(B private IDynamicObjectCreationExpression CreateBoundDynamicObjectCreationExpressionOperation(BoundDynamicObjectCreationExpression boundDynamicObjectCreationExpression) { - string name = boundDynamicObjectCreationExpression.Name; ImmutableArray applicableSymbols = StaticCast.From(boundDynamicObjectCreationExpression.ApplicableMethods); Lazy> arguments = new Lazy>(() => boundDynamicObjectCreationExpression.Arguments.SelectAsArray(n => Create(n))); ImmutableArray argumentNames = boundDynamicObjectCreationExpression.ArgumentNamesOpt.NullToEmpty(); @@ -510,7 +509,7 @@ private IDynamicObjectCreationExpression CreateBoundDynamicObjectCreationExpress ITypeSymbol type = boundDynamicObjectCreationExpression.Type; Optional constantValue = ConvertToOptional(boundDynamicObjectCreationExpression.ConstantValue); bool isImplicit = boundDynamicObjectCreationExpression.WasCompilerGenerated; - return new LazyDynamicObjectCreationExpression(name, applicableSymbols, arguments, argumentNames, argumentRefKinds, initializer, _semanticModel, syntax, type, constantValue, isImplicit); + return new LazyDynamicObjectCreationExpression(applicableSymbols, arguments, argumentNames, argumentRefKinds, initializer, _semanticModel, syntax, type, constantValue, isImplicit); } private IDynamicInvocationExpression CreateBoundDynamicInvocationExpressionOperation(BoundDynamicInvocation boundDynamicInvocation) @@ -527,7 +526,7 @@ private IDynamicInvocationExpression CreateBoundDynamicInvocationExpressionOpera return new LazyDynamicInvocationExpression(expression, applicableSymbols, arguments, argumentNames, argumentRefKinds, _semanticModel, syntax, type, constantValue, isImplicit); } - private IDynamicPropertyReferenceExpression CreateBoundDynamicIndexerAccessExpressionOperation(BoundDynamicIndexerAccess boundDynamicIndexerAccess) + private IDynamicIndexerAccessExpression CreateBoundDynamicIndexerAccessExpressionOperation(BoundDynamicIndexerAccess boundDynamicIndexerAccess) { Lazy expression = new Lazy(() => Create(boundDynamicIndexerAccess.ReceiverOpt)); ImmutableArray applicableSymbols = StaticCast.From(boundDynamicIndexerAccess.ApplicableIndexers); @@ -538,7 +537,7 @@ private IDynamicPropertyReferenceExpression CreateBoundDynamicIndexerAccessExpre ITypeSymbol type = boundDynamicIndexerAccess.Type; Optional constantValue = ConvertToOptional(boundDynamicIndexerAccess.ConstantValue); bool isImplicit = boundDynamicIndexerAccess.WasCompilerGenerated; - return new LazyDynamicPropertyReferenceExpression(expression, applicableSymbols, arguments, argumentNames, argumentRefKinds, _semanticModel, syntax, type, constantValue, isImplicit); + return new LazyDynamicIndexerAccessExpression(expression, applicableSymbols, arguments, argumentNames, argumentRefKinds, _semanticModel, syntax, type, constantValue, isImplicit); } private IObjectOrCollectionInitializerExpression CreateBoundObjectInitializerExpressionOperation(BoundObjectInitializerExpression boundObjectInitializerExpression) diff --git a/src/Compilers/CSharp/Test/Semantic/IOperation/IOperationTests_IDynamicPropertyReferenceExpression.cs b/src/Compilers/CSharp/Test/Semantic/IOperation/IOperationTests_IDynamicIndexerAccessExpression.cs similarity index 87% rename from src/Compilers/CSharp/Test/Semantic/IOperation/IOperationTests_IDynamicPropertyReferenceExpression.cs rename to src/Compilers/CSharp/Test/Semantic/IOperation/IOperationTests_IDynamicIndexerAccessExpression.cs index a85d2918d42..b359e3e8f25 100644 --- a/src/Compilers/CSharp/Test/Semantic/IOperation/IOperationTests_IDynamicPropertyReferenceExpression.cs +++ b/src/Compilers/CSharp/Test/Semantic/IOperation/IOperationTests_IDynamicIndexerAccessExpression.cs @@ -2,7 +2,6 @@ using Microsoft.CodeAnalysis.CSharp.Syntax; using Microsoft.CodeAnalysis.Test.Utilities; -using Roslyn.Test.Utilities; using Xunit; namespace Microsoft.CodeAnalysis.CSharp.UnitTests @@ -11,7 +10,7 @@ public partial class IOperationTests : SemanticModelTestBase { [CompilerTrait(CompilerFeature.IOperation)] [Fact] - public void DynamicPropertyReference_DynamicArgument() + public void DynamicIndexerAccessExpression_DynamicArgument() { string source = @" class C @@ -25,7 +24,7 @@ void M(C c, dynamic d) } "; string expectedOperationTree = @" -IDynamicPropertyReferenceExpression (OperationKind.DynamicPropertyReferenceExpression, Type: dynamic) (Syntax: 'c[d]') +IDynamicIndexerAccessExpression (OperationKind.DynamicIndexerAccessExpression, Type: dynamic) (Syntax: 'c[d]') Expression: IParameterReferenceExpression: c (OperationKind.ParameterReferenceExpression, Type: C) (Syntax: 'c') ApplicableSymbols(1): Symbol: System.Int32 C.this[System.Int32 i] { get; } @@ -41,7 +40,7 @@ void M(C c, dynamic d) [CompilerTrait(CompilerFeature.IOperation)] [Fact] - public void DynamicPropertyReference_MultipleApplicableSymbols() + public void DynamicIndexerAccessExpression_MultipleApplicableSymbols() { string source = @" class C @@ -57,7 +56,7 @@ void M(C c, dynamic d) } "; string expectedOperationTree = @" -IDynamicPropertyReferenceExpression (OperationKind.DynamicPropertyReferenceExpression, Type: dynamic) (Syntax: 'c[d]') +IDynamicIndexerAccessExpression (OperationKind.DynamicIndexerAccessExpression, Type: dynamic) (Syntax: 'c[d]') Expression: IParameterReferenceExpression: c (OperationKind.ParameterReferenceExpression, Type: C) (Syntax: 'c') ApplicableSymbols(2): Symbol: System.Int32 C.this[System.Int32 i] { get; } @@ -74,7 +73,7 @@ void M(C c, dynamic d) [CompilerTrait(CompilerFeature.IOperation)] [Fact] - public void DynamicPropertyReference_MultipleArgumentsAndApplicableSymbols() + public void DynamicIndexerAccessExpression_MultipleArgumentsAndApplicableSymbols() { string source = @" class C @@ -91,7 +90,7 @@ void M(C c, dynamic d) } "; string expectedOperationTree = @" -IDynamicPropertyReferenceExpression (OperationKind.DynamicPropertyReferenceExpression, Type: dynamic) (Syntax: 'c[d, ch]') +IDynamicIndexerAccessExpression (OperationKind.DynamicIndexerAccessExpression, Type: dynamic) (Syntax: 'c[d, ch]') Expression: IParameterReferenceExpression: c (OperationKind.ParameterReferenceExpression, Type: C) (Syntax: 'c') ApplicableSymbols(2): Symbol: System.Int32 C.this[System.Int32 i, System.Char ch] { get; } @@ -109,7 +108,7 @@ void M(C c, dynamic d) [CompilerTrait(CompilerFeature.IOperation)] [Fact] - public void DynamicPropertyReference_ArgumentNames() + public void DynamicIndexerAccessExpression_ArgumentNames() { string source = @" class C @@ -125,7 +124,7 @@ void M(C c, dynamic d, dynamic e) } "; string expectedOperationTree = @" -IDynamicPropertyReferenceExpression (OperationKind.DynamicPropertyReferenceExpression, Type: dynamic) (Syntax: 'c[i: d, ch: e]') +IDynamicIndexerAccessExpression (OperationKind.DynamicIndexerAccessExpression, Type: dynamic) (Syntax: 'c[i: d, ch: e]') Expression: IParameterReferenceExpression: c (OperationKind.ParameterReferenceExpression, Type: C) (Syntax: 'c') ApplicableSymbols(2): Symbol: System.Int32 C.this[System.Int32 i, System.Char ch] { get; } @@ -145,7 +144,7 @@ void M(C c, dynamic d, dynamic e) [CompilerTrait(CompilerFeature.IOperation)] [Fact] - public void DynamicPropertyReference_ArgumentRefKinds() + public void DynamicIndexerAccessExpression_ArgumentRefKinds() { string source = @" class C @@ -159,7 +158,7 @@ void M(C c, dynamic d, dynamic e) } "; string expectedOperationTree = @" -IDynamicPropertyReferenceExpression (OperationKind.DynamicPropertyReferenceExpression, Type: dynamic) (Syntax: 'c[i: d, ch: ref e]') +IDynamicIndexerAccessExpression (OperationKind.DynamicIndexerAccessExpression, Type: dynamic) (Syntax: 'c[i: d, ch: ref e]') Expression: IParameterReferenceExpression: c (OperationKind.ParameterReferenceExpression, Type: C) (Syntax: 'c') ApplicableSymbols(1): Symbol: System.Int32 C.this[System.Int32 i, ref dynamic ch] { get; } @@ -184,7 +183,7 @@ void M(C c, dynamic d, dynamic e) [CompilerTrait(CompilerFeature.IOperation)] [Fact] - public void DynamicPropertyReference_WithDynamicReceiver() + public void DynamicIndexerAccessExpression_WithDynamicReceiver() { string source = @" class C @@ -198,7 +197,7 @@ void M(dynamic d, int i) } "; string expectedOperationTree = @" -IDynamicPropertyReferenceExpression (OperationKind.DynamicPropertyReferenceExpression, Type: dynamic) (Syntax: 'd[i]') +IDynamicIndexerAccessExpression (OperationKind.DynamicIndexerAccessExpression, Type: dynamic) (Syntax: 'd[i]') Expression: IParameterReferenceExpression: d (OperationKind.ParameterReferenceExpression, Type: dynamic) (Syntax: 'd') ApplicableSymbols(0) Arguments(1): @@ -213,7 +212,7 @@ void M(dynamic d, int i) [CompilerTrait(CompilerFeature.IOperation)] [Fact] - public void DynamicPropertyReference_WithDynamicMemberReceiver() + public void DynamicIndexerAccessExpression_WithDynamicMemberReceiver() { string source = @" class C @@ -227,7 +226,7 @@ void M(dynamic c, int i) } "; string expectedOperationTree = @" -IDynamicPropertyReferenceExpression (OperationKind.DynamicPropertyReferenceExpression, Type: dynamic) (Syntax: 'c.M2[i]') +IDynamicIndexerAccessExpression (OperationKind.DynamicIndexerAccessExpression, Type: dynamic) (Syntax: 'c.M2[i]') Expression: IDynamicMemberReferenceExpression (Member Name: ""M2"", Containing Type: null) (OperationKind.DynamicMemberReferenceExpression, Type: dynamic) (Syntax: 'c.M2') Type Arguments(0) Instance Receiver: IParameterReferenceExpression: c (OperationKind.ParameterReferenceExpression, Type: dynamic) (Syntax: 'c') @@ -244,7 +243,7 @@ Type Arguments(0) [CompilerTrait(CompilerFeature.IOperation)] [Fact] - public void DynamicPropertyReference_WithDynamicTypedMemberReceiver() + public void DynamicIndexerAccessExpression_WithDynamicTypedMemberReceiver() { string source = @" class C @@ -258,7 +257,7 @@ void M(dynamic c, int i) } "; string expectedOperationTree = @" -IDynamicPropertyReferenceExpression (OperationKind.DynamicPropertyReferenceExpression, Type: dynamic) (Syntax: 'c.M2[i]') +IDynamicIndexerAccessExpression (OperationKind.DynamicIndexerAccessExpression, Type: dynamic) (Syntax: 'c.M2[i]') Expression: IDynamicMemberReferenceExpression (Member Name: ""M2"", Containing Type: null) (OperationKind.DynamicMemberReferenceExpression, Type: dynamic) (Syntax: 'c.M2') Type Arguments(0) Instance Receiver: IParameterReferenceExpression: c (OperationKind.ParameterReferenceExpression, Type: dynamic) (Syntax: 'c') @@ -279,7 +278,7 @@ Type Arguments(0) [CompilerTrait(CompilerFeature.IOperation)] [Fact] - public void DynamicPropertyReference_AllFields() + public void DynamicIndexerAccessExpression_AllFields() { string source = @" class C @@ -295,7 +294,7 @@ void M(C c, dynamic d) } "; string expectedOperationTree = @" -IDynamicPropertyReferenceExpression (OperationKind.DynamicPropertyReferenceExpression, Type: dynamic) (Syntax: 'c[ref i, c: d]') +IDynamicIndexerAccessExpression (OperationKind.DynamicIndexerAccessExpression, Type: dynamic) (Syntax: 'c[ref i, c: d]') Expression: IParameterReferenceExpression: c (OperationKind.ParameterReferenceExpression, Type: C) (Syntax: 'c') ApplicableSymbols(2): Symbol: System.Int32 C.this[ref System.Int32 i, System.Char c] { get; } @@ -324,7 +323,7 @@ void M(C c, dynamic d) [CompilerTrait(CompilerFeature.IOperation)] [Fact] - public void DynamicPropertyReference_ErrorBadDynamicMethodArgLambda() + public void DynamicIndexerAccessExpression_ErrorBadDynamicMethodArgLambda() { string source = @" using System; @@ -341,7 +340,7 @@ public void M(C c) } "; string expectedOperationTree = @" -IDynamicPropertyReferenceExpression (OperationKind.DynamicPropertyReferenceExpression, Type: dynamic, IsInvalid) (Syntax: 'c[delegate { }, y]') +IDynamicIndexerAccessExpression (OperationKind.DynamicIndexerAccessExpression, Type: dynamic, IsInvalid) (Syntax: 'c[delegate { }, y]') Expression: IParameterReferenceExpression: c (OperationKind.ParameterReferenceExpression, Type: C) (Syntax: 'c') ApplicableSymbols(1): Symbol: System.Int32 C.this[System.Action a, System.Action y] { get; } @@ -365,7 +364,7 @@ public void M(C c) [CompilerTrait(CompilerFeature.IOperation)] [Fact] - public void DynamicPropertyReference_OverloadResolutionFailure() + public void DynamicIndexerAccessExpression_OverloadResolutionFailure() { string source = @" using System; diff --git a/src/Compilers/CSharp/Test/Semantic/IOperation/IOperationTests_IDynamicObjectCreationExpression.cs b/src/Compilers/CSharp/Test/Semantic/IOperation/IOperationTests_IDynamicObjectCreationExpression.cs index 3e58cc4ccdb..37b936637cc 100644 --- a/src/Compilers/CSharp/Test/Semantic/IOperation/IOperationTests_IDynamicObjectCreationExpression.cs +++ b/src/Compilers/CSharp/Test/Semantic/IOperation/IOperationTests_IDynamicObjectCreationExpression.cs @@ -27,7 +27,7 @@ void M(dynamic d) } "; string expectedOperationTree = @" -IDynamicObjectCreationExpression (Name: C) (OperationKind.DynamicObjectCreationExpression, Type: C) (Syntax: 'new C(d)') +IDynamicObjectCreationExpression (OperationKind.DynamicObjectCreationExpression, Type: C) (Syntax: 'new C(d)') ApplicableSymbols(1): Symbol: C..ctor(System.Int32 i) Arguments(1): @@ -63,7 +63,7 @@ void M(dynamic d) } "; string expectedOperationTree = @" -IDynamicObjectCreationExpression (Name: C) (OperationKind.DynamicObjectCreationExpression, Type: C) (Syntax: 'new C(d)') +IDynamicObjectCreationExpression (OperationKind.DynamicObjectCreationExpression, Type: C) (Syntax: 'new C(d)') ApplicableSymbols(2): Symbol: C..ctor(System.Int32 i) Symbol: C..ctor(System.Int64 i) @@ -101,7 +101,7 @@ void M(dynamic d) } "; string expectedOperationTree = @" -IDynamicObjectCreationExpression (Name: C) (OperationKind.DynamicObjectCreationExpression, Type: C) (Syntax: 'new C(d, c)') +IDynamicObjectCreationExpression (OperationKind.DynamicObjectCreationExpression, Type: C) (Syntax: 'new C(d, c)') ApplicableSymbols(2): Symbol: C..ctor(System.Int32 i, System.Char c) Symbol: C..ctor(System.Int64 i, System.Char c) @@ -139,7 +139,7 @@ void M(dynamic d, dynamic e) } "; string expectedOperationTree = @" -IDynamicObjectCreationExpression (Name: C) (OperationKind.DynamicObjectCreationExpression, Type: C) (Syntax: 'new C(i: d, c: e)') +IDynamicObjectCreationExpression (OperationKind.DynamicObjectCreationExpression, Type: C) (Syntax: 'new C(i: d, c: e)') ApplicableSymbols(2): Symbol: C..ctor(System.Int32 i, System.Char c) Symbol: C..ctor(System.Int64 i, System.Char c) @@ -177,7 +177,7 @@ void M(object d, dynamic e) } "; string expectedOperationTree = @" -IDynamicObjectCreationExpression (Name: C) (OperationKind.DynamicObjectCreationExpression, Type: C) (Syntax: 'new C(ref d, out k, e)') +IDynamicObjectCreationExpression (OperationKind.DynamicObjectCreationExpression, Type: C) (Syntax: 'new C(ref d, out k, e)') ApplicableSymbols(1): Symbol: C..ctor(ref System.Object i, out System.Int32 j, System.Char c) Arguments(3): @@ -216,7 +216,7 @@ void M(dynamic d) } "; string expectedOperationTree = @" -IDynamicObjectCreationExpression (Name: C) (OperationKind.DynamicObjectCreationExpression, Type: C) (Syntax: 'new C(d) { X = 0 }') +IDynamicObjectCreationExpression (OperationKind.DynamicObjectCreationExpression, Type: C) (Syntax: 'new C(d) { X = 0 }') ApplicableSymbols(1): Symbol: C..ctor(System.Char c) Arguments(1): @@ -260,7 +260,7 @@ void M(dynamic d) } "; string expectedOperationTree = @" -IDynamicObjectCreationExpression (Name: C) (OperationKind.DynamicObjectCreationExpression, Type: C) (Syntax: 'new C(ref i ... ) { X = 0 }') +IDynamicObjectCreationExpression (OperationKind.DynamicObjectCreationExpression, Type: C) (Syntax: 'new C(ref i ... ) { X = 0 }') ApplicableSymbols(2): Symbol: C..ctor(ref System.Int32 i, System.Char c) Symbol: C..ctor(ref System.Int32 i, System.Int64 c) @@ -306,7 +306,7 @@ public C(Action a, Action y) } "; string expectedOperationTree = @" -IDynamicObjectCreationExpression (Name: C) (OperationKind.DynamicObjectCreationExpression, Type: C, IsInvalid) (Syntax: 'new C(delegate { }, y)') +IDynamicObjectCreationExpression (OperationKind.DynamicObjectCreationExpression, Type: C, IsInvalid) (Syntax: 'new C(delegate { }, y)') ApplicableSymbols(1): Symbol: C..ctor(System.Action a, System.Action y) Arguments(2): diff --git a/src/Compilers/CSharp/Test/Semantic/IOperation/IOperationTests_IParameterReferenceExpression.cs b/src/Compilers/CSharp/Test/Semantic/IOperation/IOperationTests_IParameterReferenceExpression.cs index 8b8f9838410..f477d37a77b 100644 --- a/src/Compilers/CSharp/Test/Semantic/IOperation/IOperationTests_IParameterReferenceExpression.cs +++ b/src/Compilers/CSharp/Test/Semantic/IOperation/IOperationTests_IParameterReferenceExpression.cs @@ -543,7 +543,7 @@ public void M(dynamic d, int x) IVariableDeclarationStatement (1 declarations) (OperationKind.VariableDeclarationStatement) (Syntax: 'var y /**/;') IVariableDeclaration (1 variables) (OperationKind.VariableDeclaration) (Syntax: 'var y /**/;') Variables: Local_1: dynamic y - Initializer: IDynamicPropertyReferenceExpression (OperationKind.DynamicPropertyReferenceExpression, Type: dynamic) (Syntax: 'd[x]') + Initializer: IDynamicIndexerAccessExpression (OperationKind.DynamicIndexerAccessExpression, Type: dynamic) (Syntax: 'd[x]') Expression: IParameterReferenceExpression: d (OperationKind.ParameterReferenceExpression, Type: dynamic) (Syntax: 'd') ApplicableSymbols(0) Arguments(1): @@ -629,7 +629,7 @@ public void M(dynamic x) } "; string expectedOperationTree = @" -IDynamicObjectCreationExpression (Name: Class) (OperationKind.DynamicObjectCreationExpression, Type: Class) (Syntax: 'new Class(x)') +IDynamicObjectCreationExpression (OperationKind.DynamicObjectCreationExpression, Type: Class) (Syntax: 'new Class(x)') ApplicableSymbols(2): Symbol: Class..ctor(Class x) Symbol: Class..ctor(System.String x) diff --git a/src/Compilers/Core/Portable/Generated/Operations.xml.Generated.cs b/src/Compilers/Core/Portable/Generated/Operations.xml.Generated.cs index f91c67a26cd..2e0718a4139 100644 --- a/src/Compilers/Core/Portable/Generated/Operations.xml.Generated.cs +++ b/src/Compilers/Core/Portable/Generated/Operations.xml.Generated.cs @@ -4507,34 +4507,18 @@ internal sealed partial class LazyTypeParameterObjectCreationExpression : BaseTy /// /// Represents a dynamically bound new/New expression. /// - internal abstract partial class BaseDynamicObjectCreationExpression : Operation, IHasDynamicArgumentsExpression, IDynamicObjectCreationExpression + internal abstract partial class HasDynamicArgumentsExpression : Operation, IHasDynamicArgumentsExpression { - public BaseDynamicObjectCreationExpression(string name, ImmutableArray applicableSymbols, ImmutableArray argumentNames, ImmutableArray argumentRefKinds, SemanticModel semanticModel, SyntaxNode syntax, ITypeSymbol type, Optional constantValue, bool isImplicit) : - base(OperationKind.DynamicObjectCreationExpression, semanticModel, syntax, type, constantValue, isImplicit) + protected HasDynamicArgumentsExpression(OperationKind operationKind, ImmutableArray applicableSymbols, ImmutableArray argumentNames, ImmutableArray argumentRefKinds, SemanticModel semanticModel, SyntaxNode syntax, ITypeSymbol type, Optional constantValue, bool isImplicit) : + base(operationKind, semanticModel, syntax, type, constantValue, isImplicit) { - MemberName = name; ApplicableSymbols = applicableSymbols; ArgumentNames = argumentNames; ArgumentRefKinds = argumentRefKinds; } + protected abstract ImmutableArray ArgumentsImpl { get; } - protected abstract IObjectOrCollectionInitializerExpression InitializerImpl { get; } - public override IEnumerable Children - { - get - { - foreach (var argument in Arguments) - { - yield return argument; - } - yield return Initializer; - } - } - /// - /// Name of the dynamically invoked member. - /// - public string MemberName { get; } /// /// List of applicable symbols that are dynamically bound. /// @@ -4551,6 +4535,30 @@ public override IEnumerable Children /// Dynamically bound arguments, excluding the instance argument. /// public ImmutableArray Arguments => Operation.SetParentOperation(ArgumentsImpl, this); + } + + /// + /// Represents a dynamically bound new/New expression. + /// + internal abstract partial class BaseDynamicObjectCreationExpression : HasDynamicArgumentsExpression, IDynamicObjectCreationExpression + { + public BaseDynamicObjectCreationExpression(ImmutableArray applicableSymbols, ImmutableArray argumentNames, ImmutableArray argumentRefKinds, SemanticModel semanticModel, SyntaxNode syntax, ITypeSymbol type, Optional constantValue, bool isImplicit) : + base(OperationKind.DynamicObjectCreationExpression, applicableSymbols, argumentNames, argumentRefKinds, semanticModel, syntax, type, constantValue, isImplicit) + { + } + protected abstract IObjectOrCollectionInitializerExpression InitializerImpl { get; } + + public override IEnumerable Children + { + get + { + foreach (var argument in Arguments) + { + yield return argument; + } + yield return Initializer; + } + } /// /// Object or collection initializer, if any. /// @@ -4570,8 +4578,8 @@ public override void Accept(OperationVisitor visitor) /// internal sealed partial class DynamicObjectCreationExpression : BaseDynamicObjectCreationExpression, IHasDynamicArgumentsExpression, IDynamicObjectCreationExpression { - public DynamicObjectCreationExpression(string name, ImmutableArray applicableSymbols, ImmutableArray arguments, ImmutableArray argumentNames, ImmutableArray argumentRefKinds, IObjectOrCollectionInitializerExpression initializer, SemanticModel semanticModel, SyntaxNode syntax, ITypeSymbol type, Optional constantValue, bool isImplicit) : - base(name, applicableSymbols, argumentNames, argumentRefKinds, semanticModel, syntax, type, constantValue, isImplicit) + public DynamicObjectCreationExpression(ImmutableArray applicableSymbols, ImmutableArray arguments, ImmutableArray argumentNames, ImmutableArray argumentRefKinds, IObjectOrCollectionInitializerExpression initializer, SemanticModel semanticModel, SyntaxNode syntax, ITypeSymbol type, Optional constantValue, bool isImplicit) : + base(applicableSymbols, argumentNames, argumentRefKinds, semanticModel, syntax, type, constantValue, isImplicit) { ArgumentsImpl = arguments; InitializerImpl = initializer; @@ -4587,8 +4595,8 @@ internal sealed partial class LazyDynamicObjectCreationExpression : BaseDynamicO { private readonly Lazy _lazyInitializer; private readonly Lazy> _lazyArguments; - public LazyDynamicObjectCreationExpression(string name, ImmutableArray applicableSymbols, Lazy> arguments, ImmutableArray argumentNames, ImmutableArray argumentRefKinds, Lazy initializer, SemanticModel semanticModel, SyntaxNode syntax, ITypeSymbol type, Optional constantValue, bool isImplicit) : - base(name, applicableSymbols, argumentNames, argumentRefKinds, semanticModel, syntax, type, constantValue, isImplicit) + public LazyDynamicObjectCreationExpression(ImmutableArray applicableSymbols, Lazy> arguments, ImmutableArray argumentNames, ImmutableArray argumentRefKinds, Lazy initializer, SemanticModel semanticModel, SyntaxNode syntax, ITypeSymbol type, Optional constantValue, bool isImplicit) : + base(applicableSymbols, argumentNames, argumentRefKinds, semanticModel, syntax, type, constantValue, isImplicit) { _lazyArguments = arguments ?? throw new System.ArgumentNullException(nameof(arguments)); _lazyInitializer = initializer ?? throw new System.ArgumentNullException(nameof(initializer)); @@ -4598,19 +4606,15 @@ internal sealed partial class LazyDynamicObjectCreationExpression : BaseDynamicO } /// - /// Represents a dynamically bound invocation expression. + /// Represents a dynamically bound invocation expression in C# and late bound invocation in VB. /// - internal abstract partial class BaseDynamicInvocationExpression : Operation, IHasDynamicArgumentsExpression, IDynamicInvocationExpression + internal abstract partial class BaseDynamicInvocationExpression : HasDynamicArgumentsExpression, IDynamicInvocationExpression { public BaseDynamicInvocationExpression(ImmutableArray applicableSymbols, ImmutableArray argumentNames, ImmutableArray argumentRefKinds, SemanticModel semanticModel, SyntaxNode syntax, ITypeSymbol type, Optional constantValue, bool isImplicit) : - base(OperationKind.DynamicInvocationExpression, semanticModel, syntax, type, constantValue, isImplicit) + base(OperationKind.DynamicInvocationExpression, applicableSymbols, argumentNames, argumentRefKinds, semanticModel, syntax, type, constantValue, isImplicit) { - ApplicableSymbols = applicableSymbols; - ArgumentNames = argumentNames; - ArgumentRefKinds = argumentRefKinds; } protected abstract IOperation ExpressionImpl { get; } - protected abstract ImmutableArray ArgumentsImpl { get; } public override IEnumerable Children { @@ -4624,25 +4628,9 @@ public override IEnumerable Children } } /// - /// Dynamically invoked expression, which could be a dynamic member access, dynamic delegate or an invalid expression. + /// Dynamically or late bound expression. /// public IOperation Expression => Operation.SetParentOperation(ExpressionImpl, this); - /// - /// List of applicable symbols that are dynamically bound. - /// - public ImmutableArray ApplicableSymbols { get; } - /// - /// Optional argument names for named arguments. - /// - public ImmutableArray ArgumentNames { get; } - /// - /// Optional argument ref kinds. - /// - public ImmutableArray ArgumentRefKinds { get; } - /// - /// Dynamically bound arguments, excluding the instance argument. - /// - public ImmutableArray Arguments => Operation.SetParentOperation(ArgumentsImpl, this); public override void Accept(OperationVisitor visitor) { visitor.VisitDynamicInvocationExpression(this); @@ -4654,7 +4642,7 @@ public override void Accept(OperationVisitor visitor) } /// - /// Represents a dynamically bound invocation expression. + /// Represents a dynamically bound invocation expression in C# and late bound invocation in VB. /// internal sealed partial class DynamicInvocationExpression : BaseDynamicInvocationExpression, IHasDynamicArgumentsExpression, IDynamicInvocationExpression { @@ -4669,7 +4657,7 @@ internal sealed partial class DynamicInvocationExpression : BaseDynamicInvocatio } /// - /// Represents a dynamically bound invocation expression. + /// Represents a dynamically bound invocation expression in C# and late bound invocation in VB. /// internal sealed partial class LazyDynamicInvocationExpression : BaseDynamicInvocationExpression, IHasDynamicArgumentsExpression, IDynamicInvocationExpression { @@ -4686,19 +4674,15 @@ internal sealed partial class LazyDynamicInvocationExpression : BaseDynamicInvoc } /// - /// Represents a dynamically referenced property or indexer expression. + /// Represents a dynamic indexer expression in C#. /// - internal abstract partial class BaseDynamicPropertyReferenceExpression : Operation, IHasDynamicArgumentsExpression, IDynamicPropertyReferenceExpression + internal abstract partial class BaseDynamicIndexerAccessExpression : HasDynamicArgumentsExpression, IDynamicIndexerAccessExpression { - public BaseDynamicPropertyReferenceExpression(ImmutableArray applicableSymbols, ImmutableArray argumentNames, ImmutableArray argumentRefKinds, SemanticModel semanticModel, SyntaxNode syntax, ITypeSymbol type, Optional constantValue, bool isImplicit) : - base(OperationKind.DynamicPropertyReferenceExpression, semanticModel, syntax, type, constantValue, isImplicit) + public BaseDynamicIndexerAccessExpression(ImmutableArray applicableSymbols, ImmutableArray argumentNames, ImmutableArray argumentRefKinds, SemanticModel semanticModel, SyntaxNode syntax, ITypeSymbol type, Optional constantValue, bool isImplicit) : + base(OperationKind.DynamicIndexerAccessExpression, applicableSymbols, argumentNames, argumentRefKinds, semanticModel, syntax, type, constantValue, isImplicit) { - ApplicableSymbols = applicableSymbols; - ArgumentNames = argumentNames; - ArgumentRefKinds = argumentRefKinds; } protected abstract IOperation ExpressionImpl { get; } - protected abstract ImmutableArray ArgumentsImpl { get; } public override IEnumerable Children { @@ -4712,41 +4696,25 @@ public override IEnumerable Children } } /// - /// Dynamically accessed property reference. + /// Dynamically indexed expression. /// public IOperation Expression => Operation.SetParentOperation(ExpressionImpl, this); - /// - /// List of applicable symbols that are dynamically bound. - /// - public ImmutableArray ApplicableSymbols { get; } - /// - /// Optional argument names for named arguments. - /// - public ImmutableArray ArgumentNames { get; } - /// - /// Optional argument ref kinds. - /// - public ImmutableArray ArgumentRefKinds { get; } - /// - /// Dynamically bound arguments, excluding the instance argument. - /// - public ImmutableArray Arguments => Operation.SetParentOperation(ArgumentsImpl, this); public override void Accept(OperationVisitor visitor) { - visitor.VisitDynamicPropertyReferenceExpression(this); + visitor.VisitDynamicIndexerAccessExpression(this); } public override TResult Accept(OperationVisitor visitor, TArgument argument) { - return visitor.VisitDynamicPropertyReferenceExpression(this, argument); + return visitor.VisitDynamicIndexerAccessExpression(this, argument); } } /// - /// Represents a dynamically referenced property or indexer expression. + /// Represents a dynamic indexer expression in C#. /// - internal sealed partial class DynamicPropertyReferenceExpression : BaseDynamicPropertyReferenceExpression, IHasDynamicArgumentsExpression, IDynamicPropertyReferenceExpression + internal sealed partial class DynamicIndexerAccessExpression : BaseDynamicIndexerAccessExpression, IHasDynamicArgumentsExpression, IDynamicIndexerAccessExpression { - public DynamicPropertyReferenceExpression(IOperation expression, ImmutableArray applicableSymbols, ImmutableArray arguments, ImmutableArray argumentNames, ImmutableArray argumentRefKinds, SemanticModel semanticModel, SyntaxNode syntax, ITypeSymbol type, Optional constantValue, bool isImplicit) : + public DynamicIndexerAccessExpression(IOperation expression, ImmutableArray applicableSymbols, ImmutableArray arguments, ImmutableArray argumentNames, ImmutableArray argumentRefKinds, SemanticModel semanticModel, SyntaxNode syntax, ITypeSymbol type, Optional constantValue, bool isImplicit) : base(applicableSymbols, argumentNames, argumentRefKinds, semanticModel, syntax, type, constantValue, isImplicit) { ExpressionImpl = expression; @@ -4757,13 +4725,13 @@ internal sealed partial class DynamicPropertyReferenceExpression : BaseDynamicPr } /// - /// Represents a dynamically referenced property or indexer expression. + /// Represents a dynamic indexer expression in C#. /// - internal sealed partial class LazyDynamicPropertyReferenceExpression : BaseDynamicPropertyReferenceExpression, IHasDynamicArgumentsExpression, IDynamicPropertyReferenceExpression + internal sealed partial class LazyDynamicIndexerAccessExpression : BaseDynamicIndexerAccessExpression, IHasDynamicArgumentsExpression, IDynamicIndexerAccessExpression { private readonly Lazy _lazyExpression; private readonly Lazy> _lazyArguments; - public LazyDynamicPropertyReferenceExpression(Lazy expression, ImmutableArray applicableSymbols, Lazy> arguments, ImmutableArray argumentNames, ImmutableArray argumentRefKinds, SemanticModel semanticModel, SyntaxNode syntax, ITypeSymbol type, Optional constantValue, bool isImplicit) : + public LazyDynamicIndexerAccessExpression(Lazy expression, ImmutableArray applicableSymbols, Lazy> arguments, ImmutableArray argumentNames, ImmutableArray argumentRefKinds, SemanticModel semanticModel, SyntaxNode syntax, ITypeSymbol type, Optional constantValue, bool isImplicit) : base(applicableSymbols, argumentNames, argumentRefKinds, semanticModel, syntax, type, constantValue, isImplicit) { _lazyExpression = expression ?? throw new System.ArgumentNullException(nameof(expression)); diff --git a/src/Compilers/Core/Portable/Operations/IDynamicPropertyReferenceExpression.cs b/src/Compilers/Core/Portable/Operations/IDynamicIndexerAccessExpression.cs similarity index 70% rename from src/Compilers/Core/Portable/Operations/IDynamicPropertyReferenceExpression.cs rename to src/Compilers/Core/Portable/Operations/IDynamicIndexerAccessExpression.cs index c833981559e..ffe7baa5693 100644 --- a/src/Compilers/Core/Portable/Operations/IDynamicPropertyReferenceExpression.cs +++ b/src/Compilers/Core/Portable/Operations/IDynamicIndexerAccessExpression.cs @@ -3,16 +3,16 @@ namespace Microsoft.CodeAnalysis.Semantics { /// - /// Represents a dynamically referenced property or indexer expression. + /// Represents a dynamic indexer expression in C#. /// /// /// This interface is reserved for implementation by its associated APIs. We reserve the right to /// change it in the future. /// - public interface IDynamicPropertyReferenceExpression : IHasDynamicArgumentsExpression + public interface IDynamicIndexerAccessExpression : IHasDynamicArgumentsExpression { /// - /// Dynamically accessed property reference. + /// Dynamically indexed expression. /// IOperation Expression { get; } } diff --git a/src/Compilers/Core/Portable/Operations/IDynamicInvocationExpression.cs b/src/Compilers/Core/Portable/Operations/IDynamicInvocationExpression.cs index d3dd4e59e9b..e4eaaeaa4ab 100644 --- a/src/Compilers/Core/Portable/Operations/IDynamicInvocationExpression.cs +++ b/src/Compilers/Core/Portable/Operations/IDynamicInvocationExpression.cs @@ -3,7 +3,7 @@ namespace Microsoft.CodeAnalysis.Semantics { /// - /// Represents a dynamically bound invocation expression. + /// Represents a dynamically bound invocation expression in C# and late bound invocation in VB. /// /// /// This interface is reserved for implementation by its associated APIs. We reserve the right to @@ -12,7 +12,7 @@ namespace Microsoft.CodeAnalysis.Semantics public interface IDynamicInvocationExpression : IHasDynamicArgumentsExpression { /// - /// Dynamically invoked expression, which could be a dynamic member access, dynamic delegate or an invalid expression. + /// Dynamically or late bound expression. /// IOperation Expression { get; } } diff --git a/src/Compilers/Core/Portable/Operations/IDynamicObjectCreationExpression.cs b/src/Compilers/Core/Portable/Operations/IDynamicObjectCreationExpression.cs index 1e29656bfb0..e0ebb01cf42 100644 --- a/src/Compilers/Core/Portable/Operations/IDynamicObjectCreationExpression.cs +++ b/src/Compilers/Core/Portable/Operations/IDynamicObjectCreationExpression.cs @@ -11,11 +11,6 @@ namespace Microsoft.CodeAnalysis.Semantics /// public interface IDynamicObjectCreationExpression : IHasDynamicArgumentsExpression { - /// - /// Name of the dynamically invoked member. - /// - string MemberName { get; } - /// /// Object or collection initializer, if any. /// diff --git a/src/Compilers/Core/Portable/Operations/IHasDynamicArgumentsExpression.cs b/src/Compilers/Core/Portable/Operations/IHasDynamicArgumentsExpression.cs index 53231f3a41b..2c4e3270eec 100644 --- a/src/Compilers/Core/Portable/Operations/IHasDynamicArgumentsExpression.cs +++ b/src/Compilers/Core/Portable/Operations/IHasDynamicArgumentsExpression.cs @@ -19,16 +19,6 @@ public interface IHasDynamicArgumentsExpression : IOperation /// Dynamically bound arguments, excluding the instance argument. /// ImmutableArray Arguments { get; } - - /// - /// Optional argument names for named arguments. - /// - ImmutableArray ArgumentNames { get; } - - /// - /// Optional argument ref kinds. - /// - ImmutableArray ArgumentRefKinds { get; } } } diff --git a/src/Compilers/Core/Portable/Operations/OperationCloner.cs b/src/Compilers/Core/Portable/Operations/OperationCloner.cs index 44dc02afd5d..0fbcadea054 100644 --- a/src/Compilers/Core/Portable/Operations/OperationCloner.cs +++ b/src/Compilers/Core/Portable/Operations/OperationCloner.cs @@ -396,17 +396,17 @@ public override IOperation VisitDynamicMemberReferenceExpression(IDynamicMemberR public override IOperation VisitDynamicObjectCreationExpression(IDynamicObjectCreationExpression operation, object argument) { - return new DynamicObjectCreationExpression(operation.MemberName, operation.ApplicableSymbols, VisitArray(operation.Arguments), operation.ArgumentNames, operation.ArgumentRefKinds, Visit(operation.Initializer), ((Operation)operation).SemanticModel, operation.Syntax, operation.Type, operation.ConstantValue, operation.IsImplicit); + return new DynamicObjectCreationExpression(operation.ApplicableSymbols, VisitArray(operation.Arguments), ((HasDynamicArgumentsExpression)operation).ArgumentNames, ((HasDynamicArgumentsExpression)operation).ArgumentRefKinds, Visit(operation.Initializer), ((Operation)operation).SemanticModel, operation.Syntax, operation.Type, operation.ConstantValue, operation.IsImplicit); } public override IOperation VisitDynamicInvocationExpression(IDynamicInvocationExpression operation, object argument) { - return new DynamicInvocationExpression(Visit(operation.Expression), operation.ApplicableSymbols, VisitArray(operation.Arguments), operation.ArgumentNames, operation.ArgumentRefKinds, ((Operation)operation).SemanticModel, operation.Syntax, operation.Type, operation.ConstantValue, operation.IsImplicit); + return new DynamicInvocationExpression(Visit(operation.Expression), operation.ApplicableSymbols, VisitArray(operation.Arguments), ((HasDynamicArgumentsExpression)operation).ArgumentNames, ((HasDynamicArgumentsExpression)operation).ArgumentRefKinds, ((Operation)operation).SemanticModel, operation.Syntax, operation.Type, operation.ConstantValue, operation.IsImplicit); } - public override IOperation VisitDynamicPropertyReferenceExpression(IDynamicPropertyReferenceExpression operation, object argument) + public override IOperation VisitDynamicIndexerAccessExpression(IDynamicIndexerAccessExpression operation, object argument) { - return new DynamicPropertyReferenceExpression(Visit(operation.Expression), operation.ApplicableSymbols, VisitArray(operation.Arguments), operation.ArgumentNames, operation.ArgumentRefKinds, ((Operation)operation).SemanticModel, operation.Syntax, operation.Type, operation.ConstantValue, operation.IsImplicit); + return new DynamicIndexerAccessExpression(Visit(operation.Expression), operation.ApplicableSymbols, VisitArray(operation.Arguments), ((HasDynamicArgumentsExpression)operation).ArgumentNames, ((HasDynamicArgumentsExpression)operation).ArgumentRefKinds, ((Operation)operation).SemanticModel, operation.Syntax, operation.Type, operation.ConstantValue, operation.IsImplicit); } public override IOperation VisitDefaultValueExpression(IDefaultValueExpression operation, object argument) diff --git a/src/Compilers/Core/Portable/Operations/OperationExtensions.cs b/src/Compilers/Core/Portable/Operations/OperationExtensions.cs index 70794cae0cd..d5b8068e707 100644 --- a/src/Compilers/Core/Portable/Operations/OperationExtensions.cs +++ b/src/Compilers/Core/Portable/Operations/OperationExtensions.cs @@ -17,6 +17,16 @@ public static partial class OperationExtensions /// public static bool HasErrors(this IOperation operation, Compilation compilation, CancellationToken cancellationToken = default(CancellationToken)) { + if (operation == null) + { + throw new ArgumentNullException(nameof(operation)); + } + + if (compilation == null) + { + throw new ArgumentNullException(nameof(compilation)); + } + // once we made sure every operation has Syntax, we will remove this condition if (operation.Syntax == null) { @@ -80,6 +90,11 @@ private static IEnumerable Descendants(IOperation operation, bool in public static IOperation GetRootOperation(this ISymbol symbol, CancellationToken cancellationToken = default(CancellationToken)) { + if (symbol == null) + { + throw new ArgumentNullException(nameof(symbol)); + } + var symbolWithOperation = symbol as ISymbolWithOperation; if (symbolWithOperation != null) { @@ -93,6 +108,11 @@ public static IOperation GetRootOperation(this ISymbol symbol, CancellationToken public static ImmutableArray GetDeclaredVariables(this IVariableDeclarationStatement declarationStatement) { + if (declarationStatement == null) + { + throw new ArgumentNullException(nameof(declarationStatement)); + } + var arrayBuilder = ArrayBuilder.GetInstance(); foreach (IVariableDeclaration group in declarationStatement.Declarations) { @@ -104,6 +124,67 @@ public static ImmutableArray GetDeclaredVariables(this IVariableDe return arrayBuilder.ToImmutableAndFree(); } + + /// + /// Get an optional argument name for a named argument to the given at the given . + /// + /// Dynamic or late bound expression. + /// Argument index. + public static string GetArgumentName(this IHasDynamicArgumentsExpression dynamicExpression, int index) + { + if (dynamicExpression == null) + { + throw new ArgumentNullException(nameof(dynamicExpression)); + } + + var expression = (HasDynamicArgumentsExpression)dynamicExpression; + if (expression.ArgumentNames.IsDefaultOrEmpty) + { + return null; + } + + if (index < 0 || index >= expression.ArgumentNames.Length) + { + throw new ArgumentOutOfRangeException(nameof(index)); + } + + return expression.ArgumentNames[index]; + } + + /// + /// Get an optional argument for an argument at the given to the given . + /// Returns a non-null argument for C#. + /// Always returns null for VB as cannot be specified for an the argument in VB. + /// + /// Dynamic or late bound expression. + /// Argument index. + public static RefKind? GetArgumentRefKind(this IHasDynamicArgumentsExpression dynamicExpression, int index) + { + if (dynamicExpression == null) + { + throw new ArgumentNullException(nameof(dynamicExpression)); + } + + var expression = (HasDynamicArgumentsExpression)dynamicExpression; + if (expression.ArgumentRefKinds.IsDefault) + { + // VB case, arguments cannot have RefKind. + return null; + } + + if (expression.ArgumentRefKinds.IsEmpty) + { + // C# case where no explicit RefKind was specified for any argument, hence all arguments have RefKind.None. + return RefKind.None; + } + + if (index < 0 || index >= expression.ArgumentRefKinds.Length) + { + throw new ArgumentOutOfRangeException(nameof(index)); + } + + return expression.ArgumentRefKinds[index]; + } } internal interface ISymbolWithOperation diff --git a/src/Compilers/Core/Portable/Operations/OperationKind.cs b/src/Compilers/Core/Portable/Operations/OperationKind.cs index 7899ccf53cf..ad86ec0a69f 100644 --- a/src/Compilers/Core/Portable/Operations/OperationKind.cs +++ b/src/Compilers/Core/Portable/Operations/OperationKind.cs @@ -143,8 +143,8 @@ public enum OperationKind DynamicMemberReferenceExpression = 0x126, /// Indicates an . DynamicInvocationExpression = 0x127, - /// Indicates an . - DynamicPropertyReferenceExpression = 0x128, + /// Indicates an . + DynamicIndexerAccessExpression = 0x128, // Expressions that occur only in C#. diff --git a/src/Compilers/Core/Portable/Operations/OperationVisitor.cs b/src/Compilers/Core/Portable/Operations/OperationVisitor.cs index 3dc6fa62d03..f057dc12f58 100644 --- a/src/Compilers/Core/Portable/Operations/OperationVisitor.cs +++ b/src/Compilers/Core/Portable/Operations/OperationVisitor.cs @@ -335,7 +335,7 @@ public virtual void VisitDynamicInvocationExpression(IDynamicInvocationExpressio DefaultVisit(operation); } - public virtual void VisitDynamicPropertyReferenceExpression(IDynamicPropertyReferenceExpression operation) + public virtual void VisitDynamicIndexerAccessExpression(IDynamicIndexerAccessExpression operation) { DefaultVisit(operation); } @@ -810,7 +810,7 @@ public virtual TResult VisitDynamicInvocationExpression(IDynamicInvocationExpres return DefaultVisit(operation, argument); } - public virtual TResult VisitDynamicPropertyReferenceExpression(IDynamicPropertyReferenceExpression operation, TArgument argument) + public virtual TResult VisitDynamicIndexerAccessExpression(IDynamicIndexerAccessExpression operation, TArgument argument) { return DefaultVisit(operation, argument); } diff --git a/src/Compilers/Core/Portable/PublicAPI.Unshipped.txt b/src/Compilers/Core/Portable/PublicAPI.Unshipped.txt index cb7cfbbd5a0..05a7912b3ae 100644 --- a/src/Compilers/Core/Portable/PublicAPI.Unshipped.txt +++ b/src/Compilers/Core/Portable/PublicAPI.Unshipped.txt @@ -49,6 +49,7 @@ Microsoft.CodeAnalysis.IOperation.Syntax.get -> Microsoft.CodeAnalysis.SyntaxNod Microsoft.CodeAnalysis.IOperation.Type.get -> Microsoft.CodeAnalysis.ITypeSymbol Microsoft.CodeAnalysis.OperationKind Microsoft.CodeAnalysis.OperationKind.AddressOfExpression = 515 -> Microsoft.CodeAnalysis.OperationKind +Microsoft.CodeAnalysis.OperationKind.AnonymousFunctionExpression = 273 -> Microsoft.CodeAnalysis.OperationKind Microsoft.CodeAnalysis.OperationKind.AnonymousObjectCreationExpression = 287 -> Microsoft.CodeAnalysis.OperationKind Microsoft.CodeAnalysis.OperationKind.Argument = 1031 -> Microsoft.CodeAnalysis.OperationKind Microsoft.CodeAnalysis.OperationKind.ArrayCreationExpression = 276 -> Microsoft.CodeAnalysis.OperationKind @@ -59,6 +60,7 @@ Microsoft.CodeAnalysis.OperationKind.BinaryOperatorExpression = 270 -> Microsoft Microsoft.CodeAnalysis.OperationKind.BlockStatement = 2 -> Microsoft.CodeAnalysis.OperationKind Microsoft.CodeAnalysis.OperationKind.BranchStatement = 8 -> Microsoft.CodeAnalysis.OperationKind Microsoft.CodeAnalysis.OperationKind.CatchClause = 1032 -> Microsoft.CodeAnalysis.OperationKind +Microsoft.CodeAnalysis.OperationKind.CoalesceExpression = 272 -> Microsoft.CodeAnalysis.OperationKind Microsoft.CodeAnalysis.OperationKind.CollectionElementInitializerExpression = 290 -> Microsoft.CodeAnalysis.OperationKind Microsoft.CodeAnalysis.OperationKind.CompoundAssignmentExpression = 281 -> Microsoft.CodeAnalysis.OperationKind Microsoft.CodeAnalysis.OperationKind.ConditionalAccessExpression = 284 -> Microsoft.CodeAnalysis.OperationKind @@ -72,7 +74,7 @@ Microsoft.CodeAnalysis.OperationKind.DefaultValueExpression = 512 -> Microsoft.C Microsoft.CodeAnalysis.OperationKind.DynamicInvocationExpression = 295 -> Microsoft.CodeAnalysis.OperationKind Microsoft.CodeAnalysis.OperationKind.DynamicMemberReferenceExpression = 294 -> Microsoft.CodeAnalysis.OperationKind Microsoft.CodeAnalysis.OperationKind.DynamicObjectCreationExpression = 293 -> Microsoft.CodeAnalysis.OperationKind -Microsoft.CodeAnalysis.OperationKind.DynamicPropertyReferenceExpression = 296 -> Microsoft.CodeAnalysis.OperationKind +Microsoft.CodeAnalysis.OperationKind.DynamicIndexerAccessExpression = 296 -> Microsoft.CodeAnalysis.OperationKind Microsoft.CodeAnalysis.OperationKind.EmptyStatement = 9 -> Microsoft.CodeAnalysis.OperationKind Microsoft.CodeAnalysis.OperationKind.EndStatement = 81 -> Microsoft.CodeAnalysis.OperationKind Microsoft.CodeAnalysis.OperationKind.EventAssignmentExpression = 283 -> Microsoft.CodeAnalysis.OperationKind @@ -93,7 +95,6 @@ Microsoft.CodeAnalysis.OperationKind.InvocationExpression = 259 -> Microsoft.Cod Microsoft.CodeAnalysis.OperationKind.IsPatternExpression = 517 -> Microsoft.CodeAnalysis.OperationKind Microsoft.CodeAnalysis.OperationKind.IsTypeExpression = 278 -> Microsoft.CodeAnalysis.OperationKind Microsoft.CodeAnalysis.OperationKind.LabelStatement = 7 -> Microsoft.CodeAnalysis.OperationKind -Microsoft.CodeAnalysis.OperationKind.AnonymousFunctionExpression = 273 -> Microsoft.CodeAnalysis.OperationKind Microsoft.CodeAnalysis.OperationKind.LiteralExpression = 257 -> Microsoft.CodeAnalysis.OperationKind Microsoft.CodeAnalysis.OperationKind.LocalFunctionStatement = 49 -> Microsoft.CodeAnalysis.OperationKind Microsoft.CodeAnalysis.OperationKind.LocalReferenceExpression = 261 -> Microsoft.CodeAnalysis.OperationKind @@ -103,7 +104,6 @@ Microsoft.CodeAnalysis.OperationKind.MemberInitializerExpression = 289 -> Micros Microsoft.CodeAnalysis.OperationKind.MethodBindingExpression = 265 -> Microsoft.CodeAnalysis.OperationKind Microsoft.CodeAnalysis.OperationKind.NameOfExpression = 291 -> Microsoft.CodeAnalysis.OperationKind Microsoft.CodeAnalysis.OperationKind.None = 0 -> Microsoft.CodeAnalysis.OperationKind -Microsoft.CodeAnalysis.OperationKind.CoalesceExpression = 272 -> Microsoft.CodeAnalysis.OperationKind Microsoft.CodeAnalysis.OperationKind.ObjectCreationExpression = 274 -> Microsoft.CodeAnalysis.OperationKind Microsoft.CodeAnalysis.OperationKind.ObjectOrCollectionInitializerExpression = 288 -> Microsoft.CodeAnalysis.OperationKind Microsoft.CodeAnalysis.OperationKind.OmittedArgumentExpression = 768 -> Microsoft.CodeAnalysis.OperationKind @@ -342,6 +342,9 @@ Microsoft.CodeAnalysis.Semantics.ConversionKind.OperatorMethod = 5 -> Microsoft. Microsoft.CodeAnalysis.Semantics.ConversionKind.TryCast = 2 -> Microsoft.CodeAnalysis.Semantics.ConversionKind Microsoft.CodeAnalysis.Semantics.IAddressOfExpression Microsoft.CodeAnalysis.Semantics.IAddressOfExpression.Reference.get -> Microsoft.CodeAnalysis.IOperation +Microsoft.CodeAnalysis.Semantics.IAnonymousFunctionExpression +Microsoft.CodeAnalysis.Semantics.IAnonymousFunctionExpression.Body.get -> Microsoft.CodeAnalysis.Semantics.IBlockStatement +Microsoft.CodeAnalysis.Semantics.IAnonymousFunctionExpression.Symbol.get -> Microsoft.CodeAnalysis.IMethodSymbol Microsoft.CodeAnalysis.Semantics.IAnonymousObjectCreationExpression Microsoft.CodeAnalysis.Semantics.IAnonymousObjectCreationExpression.Initializers.get -> System.Collections.Immutable.ImmutableArray Microsoft.CodeAnalysis.Semantics.IArgument @@ -382,6 +385,9 @@ Microsoft.CodeAnalysis.Semantics.ICatchClause.CaughtType.get -> Microsoft.CodeAn Microsoft.CodeAnalysis.Semantics.ICatchClause.ExceptionLocal.get -> Microsoft.CodeAnalysis.ILocalSymbol Microsoft.CodeAnalysis.Semantics.ICatchClause.Filter.get -> Microsoft.CodeAnalysis.IOperation Microsoft.CodeAnalysis.Semantics.ICatchClause.Handler.get -> Microsoft.CodeAnalysis.Semantics.IBlockStatement +Microsoft.CodeAnalysis.Semantics.ICoalesceExpression +Microsoft.CodeAnalysis.Semantics.ICoalesceExpression.Expression.get -> Microsoft.CodeAnalysis.IOperation +Microsoft.CodeAnalysis.Semantics.ICoalesceExpression.WhenNull.get -> Microsoft.CodeAnalysis.IOperation Microsoft.CodeAnalysis.Semantics.ICollectionElementInitializerExpression Microsoft.CodeAnalysis.Semantics.ICollectionElementInitializerExpression.AddMethod.get -> Microsoft.CodeAnalysis.IMethodSymbol Microsoft.CodeAnalysis.Semantics.ICollectionElementInitializerExpression.Arguments.get -> System.Collections.Immutable.ImmutableArray @@ -409,6 +415,8 @@ Microsoft.CodeAnalysis.Semantics.IDeclarationPattern Microsoft.CodeAnalysis.Semantics.IDeclarationPattern.DeclaredSymbol.get -> Microsoft.CodeAnalysis.ISymbol Microsoft.CodeAnalysis.Semantics.IDefaultCaseClause Microsoft.CodeAnalysis.Semantics.IDefaultValueExpression +Microsoft.CodeAnalysis.Semantics.IDynamicIndexerAccessExpression +Microsoft.CodeAnalysis.Semantics.IDynamicIndexerAccessExpression.Expression.get -> Microsoft.CodeAnalysis.IOperation Microsoft.CodeAnalysis.Semantics.IDynamicInvocationExpression Microsoft.CodeAnalysis.Semantics.IDynamicInvocationExpression.Expression.get -> Microsoft.CodeAnalysis.IOperation Microsoft.CodeAnalysis.Semantics.IDynamicMemberReferenceExpression @@ -418,9 +426,6 @@ Microsoft.CodeAnalysis.Semantics.IDynamicMemberReferenceExpression.MemberName.ge Microsoft.CodeAnalysis.Semantics.IDynamicMemberReferenceExpression.TypeArguments.get -> System.Collections.Immutable.ImmutableArray Microsoft.CodeAnalysis.Semantics.IDynamicObjectCreationExpression Microsoft.CodeAnalysis.Semantics.IDynamicObjectCreationExpression.Initializer.get -> Microsoft.CodeAnalysis.Semantics.IObjectOrCollectionInitializerExpression -Microsoft.CodeAnalysis.Semantics.IDynamicObjectCreationExpression.MemberName.get -> string -Microsoft.CodeAnalysis.Semantics.IDynamicPropertyReferenceExpression -Microsoft.CodeAnalysis.Semantics.IDynamicPropertyReferenceExpression.Expression.get -> Microsoft.CodeAnalysis.IOperation Microsoft.CodeAnalysis.Semantics.IEmptyStatement Microsoft.CodeAnalysis.Semantics.IEndStatement Microsoft.CodeAnalysis.Semantics.IEventAssignmentExpression @@ -451,8 +456,6 @@ Microsoft.CodeAnalysis.Semantics.IHasArgumentsExpression Microsoft.CodeAnalysis.Semantics.IHasArgumentsExpression.ArgumentsInEvaluationOrder.get -> System.Collections.Immutable.ImmutableArray Microsoft.CodeAnalysis.Semantics.IHasDynamicArgumentsExpression Microsoft.CodeAnalysis.Semantics.IHasDynamicArgumentsExpression.ApplicableSymbols.get -> System.Collections.Immutable.ImmutableArray -Microsoft.CodeAnalysis.Semantics.IHasDynamicArgumentsExpression.ArgumentNames.get -> System.Collections.Immutable.ImmutableArray -Microsoft.CodeAnalysis.Semantics.IHasDynamicArgumentsExpression.ArgumentRefKinds.get -> System.Collections.Immutable.ImmutableArray Microsoft.CodeAnalysis.Semantics.IHasDynamicArgumentsExpression.Arguments.get -> System.Collections.Immutable.ImmutableArray Microsoft.CodeAnalysis.Semantics.IHasOperatorMethodExpression Microsoft.CodeAnalysis.Semantics.IHasOperatorMethodExpression.OperatorMethod.get -> Microsoft.CodeAnalysis.IMethodSymbol @@ -490,9 +493,6 @@ Microsoft.CodeAnalysis.Semantics.IIsTypeExpression.Operand.get -> Microsoft.Code Microsoft.CodeAnalysis.Semantics.ILabelStatement Microsoft.CodeAnalysis.Semantics.ILabelStatement.Label.get -> Microsoft.CodeAnalysis.ILabelSymbol Microsoft.CodeAnalysis.Semantics.ILabelStatement.LabeledStatement.get -> Microsoft.CodeAnalysis.IOperation -Microsoft.CodeAnalysis.Semantics.IAnonymousFunctionExpression -Microsoft.CodeAnalysis.Semantics.IAnonymousFunctionExpression.Body.get -> Microsoft.CodeAnalysis.Semantics.IBlockStatement -Microsoft.CodeAnalysis.Semantics.IAnonymousFunctionExpression.Symbol.get -> Microsoft.CodeAnalysis.IMethodSymbol Microsoft.CodeAnalysis.Semantics.ILiteralExpression Microsoft.CodeAnalysis.Semantics.ILocalFunctionStatement Microsoft.CodeAnalysis.Semantics.ILocalFunctionStatement.Body.get -> Microsoft.CodeAnalysis.Semantics.IBlockStatement @@ -516,9 +516,6 @@ Microsoft.CodeAnalysis.Semantics.IMethodBindingExpression.IsVirtual.get -> bool Microsoft.CodeAnalysis.Semantics.IMethodBindingExpression.Method.get -> Microsoft.CodeAnalysis.IMethodSymbol Microsoft.CodeAnalysis.Semantics.INameOfExpression Microsoft.CodeAnalysis.Semantics.INameOfExpression.Argument.get -> Microsoft.CodeAnalysis.IOperation -Microsoft.CodeAnalysis.Semantics.ICoalesceExpression -Microsoft.CodeAnalysis.Semantics.ICoalesceExpression.Expression.get -> Microsoft.CodeAnalysis.IOperation -Microsoft.CodeAnalysis.Semantics.ICoalesceExpression.WhenNull.get -> Microsoft.CodeAnalysis.IOperation Microsoft.CodeAnalysis.Semantics.IObjectCreationExpression Microsoft.CodeAnalysis.Semantics.IObjectCreationExpression.Constructor.get -> Microsoft.CodeAnalysis.IMethodSymbol Microsoft.CodeAnalysis.Semantics.IObjectCreationExpression.Initializer.get -> Microsoft.CodeAnalysis.Semantics.IObjectOrCollectionInitializerExpression @@ -754,6 +751,8 @@ override Microsoft.CodeAnalysis.Semantics.OperationWalker.DefaultVisit(Microsoft override Microsoft.CodeAnalysis.Semantics.OperationWalker.Visit(Microsoft.CodeAnalysis.IOperation operation) -> void static Microsoft.CodeAnalysis.Semantics.OperationExtensions.Descendants(this Microsoft.CodeAnalysis.IOperation operation) -> System.Collections.Generic.IEnumerable static Microsoft.CodeAnalysis.Semantics.OperationExtensions.DescendantsAndSelf(this Microsoft.CodeAnalysis.IOperation operation) -> System.Collections.Generic.IEnumerable +static Microsoft.CodeAnalysis.Semantics.OperationExtensions.GetArgumentName(this Microsoft.CodeAnalysis.Semantics.IHasDynamicArgumentsExpression dynamicExpression, int index) -> string +static Microsoft.CodeAnalysis.Semantics.OperationExtensions.GetArgumentRefKind(this Microsoft.CodeAnalysis.Semantics.IHasDynamicArgumentsExpression dynamicExpression, int index) -> Microsoft.CodeAnalysis.RefKind? static Microsoft.CodeAnalysis.Semantics.OperationExtensions.GetDeclaredVariables(this Microsoft.CodeAnalysis.Semantics.IVariableDeclarationStatement declarationStatement) -> System.Collections.Immutable.ImmutableArray static Microsoft.CodeAnalysis.Semantics.OperationExtensions.GetRootOperation(this Microsoft.CodeAnalysis.ISymbol symbol, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> Microsoft.CodeAnalysis.IOperation static Microsoft.CodeAnalysis.Semantics.OperationExtensions.HasErrors(this Microsoft.CodeAnalysis.IOperation operation, Microsoft.CodeAnalysis.Compilation compilation, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> bool @@ -778,6 +777,7 @@ virtual Microsoft.CodeAnalysis.Diagnostics.CompilationStartAnalysisContext.Regis virtual Microsoft.CodeAnalysis.Semantics.OperationVisitor.DefaultVisit(Microsoft.CodeAnalysis.IOperation operation) -> void virtual Microsoft.CodeAnalysis.Semantics.OperationVisitor.Visit(Microsoft.CodeAnalysis.IOperation operation) -> void virtual Microsoft.CodeAnalysis.Semantics.OperationVisitor.VisitAddressOfExpression(Microsoft.CodeAnalysis.Semantics.IAddressOfExpression operation) -> void +virtual Microsoft.CodeAnalysis.Semantics.OperationVisitor.VisitAnonymousFunctionExpression(Microsoft.CodeAnalysis.Semantics.IAnonymousFunctionExpression operation) -> void virtual Microsoft.CodeAnalysis.Semantics.OperationVisitor.VisitAnonymousObjectCreationExpression(Microsoft.CodeAnalysis.Semantics.IAnonymousObjectCreationExpression operation) -> void virtual Microsoft.CodeAnalysis.Semantics.OperationVisitor.VisitArgument(Microsoft.CodeAnalysis.Semantics.IArgument operation) -> void virtual Microsoft.CodeAnalysis.Semantics.OperationVisitor.VisitArrayCreationExpression(Microsoft.CodeAnalysis.Semantics.IArrayCreationExpression operation) -> void @@ -788,6 +788,7 @@ virtual Microsoft.CodeAnalysis.Semantics.OperationVisitor.VisitBinaryOperatorExp virtual Microsoft.CodeAnalysis.Semantics.OperationVisitor.VisitBlockStatement(Microsoft.CodeAnalysis.Semantics.IBlockStatement operation) -> void virtual Microsoft.CodeAnalysis.Semantics.OperationVisitor.VisitBranchStatement(Microsoft.CodeAnalysis.Semantics.IBranchStatement operation) -> void virtual Microsoft.CodeAnalysis.Semantics.OperationVisitor.VisitCatchClause(Microsoft.CodeAnalysis.Semantics.ICatchClause operation) -> void +virtual Microsoft.CodeAnalysis.Semantics.OperationVisitor.VisitCoalesceExpression(Microsoft.CodeAnalysis.Semantics.ICoalesceExpression operation) -> void virtual Microsoft.CodeAnalysis.Semantics.OperationVisitor.VisitCollectionElementInitializerExpression(Microsoft.CodeAnalysis.Semantics.ICollectionElementInitializerExpression operation) -> void virtual Microsoft.CodeAnalysis.Semantics.OperationVisitor.VisitCompoundAssignmentExpression(Microsoft.CodeAnalysis.Semantics.ICompoundAssignmentExpression operation) -> void virtual Microsoft.CodeAnalysis.Semantics.OperationVisitor.VisitConditionalAccessExpression(Microsoft.CodeAnalysis.Semantics.IConditionalAccessExpression operation) -> void @@ -798,10 +799,10 @@ virtual Microsoft.CodeAnalysis.Semantics.OperationVisitor.VisitConversionExpress virtual Microsoft.CodeAnalysis.Semantics.OperationVisitor.VisitDeclarationPattern(Microsoft.CodeAnalysis.Semantics.IDeclarationPattern operation) -> void virtual Microsoft.CodeAnalysis.Semantics.OperationVisitor.VisitDefaultCaseClause(Microsoft.CodeAnalysis.Semantics.IDefaultCaseClause operation) -> void virtual Microsoft.CodeAnalysis.Semantics.OperationVisitor.VisitDefaultValueExpression(Microsoft.CodeAnalysis.Semantics.IDefaultValueExpression operation) -> void +virtual Microsoft.CodeAnalysis.Semantics.OperationVisitor.VisitDynamicIndexerAccessExpression(Microsoft.CodeAnalysis.Semantics.IDynamicIndexerAccessExpression operation) -> void virtual Microsoft.CodeAnalysis.Semantics.OperationVisitor.VisitDynamicInvocationExpression(Microsoft.CodeAnalysis.Semantics.IDynamicInvocationExpression operation) -> void virtual Microsoft.CodeAnalysis.Semantics.OperationVisitor.VisitDynamicMemberReferenceExpression(Microsoft.CodeAnalysis.Semantics.IDynamicMemberReferenceExpression operation) -> void virtual Microsoft.CodeAnalysis.Semantics.OperationVisitor.VisitDynamicObjectCreationExpression(Microsoft.CodeAnalysis.Semantics.IDynamicObjectCreationExpression operation) -> void -virtual Microsoft.CodeAnalysis.Semantics.OperationVisitor.VisitDynamicPropertyReferenceExpression(Microsoft.CodeAnalysis.Semantics.IDynamicPropertyReferenceExpression operation) -> void virtual Microsoft.CodeAnalysis.Semantics.OperationVisitor.VisitEmptyStatement(Microsoft.CodeAnalysis.Semantics.IEmptyStatement operation) -> void virtual Microsoft.CodeAnalysis.Semantics.OperationVisitor.VisitEndStatement(Microsoft.CodeAnalysis.Semantics.IEndStatement operation) -> void virtual Microsoft.CodeAnalysis.Semantics.OperationVisitor.VisitEventAssignmentExpression(Microsoft.CodeAnalysis.Semantics.IEventAssignmentExpression operation) -> void @@ -824,7 +825,6 @@ virtual Microsoft.CodeAnalysis.Semantics.OperationVisitor.VisitInvocationExpress virtual Microsoft.CodeAnalysis.Semantics.OperationVisitor.VisitIsPatternExpression(Microsoft.CodeAnalysis.Semantics.IIsPatternExpression operation) -> void virtual Microsoft.CodeAnalysis.Semantics.OperationVisitor.VisitIsTypeExpression(Microsoft.CodeAnalysis.Semantics.IIsTypeExpression operation) -> void virtual Microsoft.CodeAnalysis.Semantics.OperationVisitor.VisitLabelStatement(Microsoft.CodeAnalysis.Semantics.ILabelStatement operation) -> void -virtual Microsoft.CodeAnalysis.Semantics.OperationVisitor.VisitAnonymousFunctionExpression(Microsoft.CodeAnalysis.Semantics.IAnonymousFunctionExpression operation) -> void virtual Microsoft.CodeAnalysis.Semantics.OperationVisitor.VisitLiteralExpression(Microsoft.CodeAnalysis.Semantics.ILiteralExpression operation) -> void virtual Microsoft.CodeAnalysis.Semantics.OperationVisitor.VisitLocalFunctionStatement(Microsoft.CodeAnalysis.Semantics.ILocalFunctionStatement operation) -> void virtual Microsoft.CodeAnalysis.Semantics.OperationVisitor.VisitLocalReferenceExpression(Microsoft.CodeAnalysis.Semantics.ILocalReferenceExpression operation) -> void @@ -832,7 +832,6 @@ virtual Microsoft.CodeAnalysis.Semantics.OperationVisitor.VisitLockStatement(Mic virtual Microsoft.CodeAnalysis.Semantics.OperationVisitor.VisitMemberInitializerExpression(Microsoft.CodeAnalysis.Semantics.IMemberInitializerExpression operation) -> void virtual Microsoft.CodeAnalysis.Semantics.OperationVisitor.VisitMethodBindingExpression(Microsoft.CodeAnalysis.Semantics.IMethodBindingExpression operation) -> void virtual Microsoft.CodeAnalysis.Semantics.OperationVisitor.VisitNameOfExpression(Microsoft.CodeAnalysis.Semantics.INameOfExpression operation) -> void -virtual Microsoft.CodeAnalysis.Semantics.OperationVisitor.VisitCoalesceExpression(Microsoft.CodeAnalysis.Semantics.ICoalesceExpression operation) -> void virtual Microsoft.CodeAnalysis.Semantics.OperationVisitor.VisitObjectCreationExpression(Microsoft.CodeAnalysis.Semantics.IObjectCreationExpression operation) -> void virtual Microsoft.CodeAnalysis.Semantics.OperationVisitor.VisitObjectOrCollectionInitializerExpression(Microsoft.CodeAnalysis.Semantics.IObjectOrCollectionInitializerExpression operation) -> void virtual Microsoft.CodeAnalysis.Semantics.OperationVisitor.VisitOmittedArgumentExpression(Microsoft.CodeAnalysis.Semantics.IOmittedArgumentExpression operation) -> void @@ -869,6 +868,7 @@ virtual Microsoft.CodeAnalysis.Semantics.OperationVisitor.VisitYieldBreakStateme virtual Microsoft.CodeAnalysis.Semantics.OperationVisitor.DefaultVisit(Microsoft.CodeAnalysis.IOperation operation, TArgument argument) -> TResult virtual Microsoft.CodeAnalysis.Semantics.OperationVisitor.Visit(Microsoft.CodeAnalysis.IOperation operation, TArgument argument) -> TResult virtual Microsoft.CodeAnalysis.Semantics.OperationVisitor.VisitAddressOfExpression(Microsoft.CodeAnalysis.Semantics.IAddressOfExpression operation, TArgument argument) -> TResult +virtual Microsoft.CodeAnalysis.Semantics.OperationVisitor.VisitAnonymousFunctionExpression(Microsoft.CodeAnalysis.Semantics.IAnonymousFunctionExpression operation, TArgument argument) -> TResult virtual Microsoft.CodeAnalysis.Semantics.OperationVisitor.VisitAnonymousObjectCreationExpression(Microsoft.CodeAnalysis.Semantics.IAnonymousObjectCreationExpression operation, TArgument argument) -> TResult virtual Microsoft.CodeAnalysis.Semantics.OperationVisitor.VisitArgument(Microsoft.CodeAnalysis.Semantics.IArgument operation, TArgument argument) -> TResult virtual Microsoft.CodeAnalysis.Semantics.OperationVisitor.VisitArrayCreationExpression(Microsoft.CodeAnalysis.Semantics.IArrayCreationExpression operation, TArgument argument) -> TResult @@ -879,6 +879,7 @@ virtual Microsoft.CodeAnalysis.Semantics.OperationVisitor.Vi virtual Microsoft.CodeAnalysis.Semantics.OperationVisitor.VisitBlockStatement(Microsoft.CodeAnalysis.Semantics.IBlockStatement operation, TArgument argument) -> TResult virtual Microsoft.CodeAnalysis.Semantics.OperationVisitor.VisitBranchStatement(Microsoft.CodeAnalysis.Semantics.IBranchStatement operation, TArgument argument) -> TResult virtual Microsoft.CodeAnalysis.Semantics.OperationVisitor.VisitCatchClause(Microsoft.CodeAnalysis.Semantics.ICatchClause operation, TArgument argument) -> TResult +virtual Microsoft.CodeAnalysis.Semantics.OperationVisitor.VisitCoalesceExpression(Microsoft.CodeAnalysis.Semantics.ICoalesceExpression operation, TArgument argument) -> TResult virtual Microsoft.CodeAnalysis.Semantics.OperationVisitor.VisitCollectionElementInitializerExpression(Microsoft.CodeAnalysis.Semantics.ICollectionElementInitializerExpression operation, TArgument argument) -> TResult virtual Microsoft.CodeAnalysis.Semantics.OperationVisitor.VisitCompoundAssignmentExpression(Microsoft.CodeAnalysis.Semantics.ICompoundAssignmentExpression operation, TArgument argument) -> TResult virtual Microsoft.CodeAnalysis.Semantics.OperationVisitor.VisitConditionalAccessExpression(Microsoft.CodeAnalysis.Semantics.IConditionalAccessExpression operation, TArgument argument) -> TResult @@ -889,10 +890,10 @@ virtual Microsoft.CodeAnalysis.Semantics.OperationVisitor.Vi virtual Microsoft.CodeAnalysis.Semantics.OperationVisitor.VisitDeclarationPattern(Microsoft.CodeAnalysis.Semantics.IDeclarationPattern operation, TArgument argument) -> TResult virtual Microsoft.CodeAnalysis.Semantics.OperationVisitor.VisitDefaultCaseClause(Microsoft.CodeAnalysis.Semantics.IDefaultCaseClause operation, TArgument argument) -> TResult virtual Microsoft.CodeAnalysis.Semantics.OperationVisitor.VisitDefaultValueExpression(Microsoft.CodeAnalysis.Semantics.IDefaultValueExpression operation, TArgument argument) -> TResult +virtual Microsoft.CodeAnalysis.Semantics.OperationVisitor.VisitDynamicIndexerAccessExpression(Microsoft.CodeAnalysis.Semantics.IDynamicIndexerAccessExpression operation, TArgument argument) -> TResult virtual Microsoft.CodeAnalysis.Semantics.OperationVisitor.VisitDynamicInvocationExpression(Microsoft.CodeAnalysis.Semantics.IDynamicInvocationExpression operation, TArgument argument) -> TResult virtual Microsoft.CodeAnalysis.Semantics.OperationVisitor.VisitDynamicMemberReferenceExpression(Microsoft.CodeAnalysis.Semantics.IDynamicMemberReferenceExpression operation, TArgument argument) -> TResult virtual Microsoft.CodeAnalysis.Semantics.OperationVisitor.VisitDynamicObjectCreationExpression(Microsoft.CodeAnalysis.Semantics.IDynamicObjectCreationExpression operation, TArgument argument) -> TResult -virtual Microsoft.CodeAnalysis.Semantics.OperationVisitor.VisitDynamicPropertyReferenceExpression(Microsoft.CodeAnalysis.Semantics.IDynamicPropertyReferenceExpression operation, TArgument argument) -> TResult virtual Microsoft.CodeAnalysis.Semantics.OperationVisitor.VisitEmptyStatement(Microsoft.CodeAnalysis.Semantics.IEmptyStatement operation, TArgument argument) -> TResult virtual Microsoft.CodeAnalysis.Semantics.OperationVisitor.VisitEndStatement(Microsoft.CodeAnalysis.Semantics.IEndStatement operation, TArgument argument) -> TResult virtual Microsoft.CodeAnalysis.Semantics.OperationVisitor.VisitEventAssignmentExpression(Microsoft.CodeAnalysis.Semantics.IEventAssignmentExpression operation, TArgument argument) -> TResult @@ -915,7 +916,6 @@ virtual Microsoft.CodeAnalysis.Semantics.OperationVisitor.Vi virtual Microsoft.CodeAnalysis.Semantics.OperationVisitor.VisitIsPatternExpression(Microsoft.CodeAnalysis.Semantics.IIsPatternExpression operation, TArgument argument) -> TResult virtual Microsoft.CodeAnalysis.Semantics.OperationVisitor.VisitIsTypeExpression(Microsoft.CodeAnalysis.Semantics.IIsTypeExpression operation, TArgument argument) -> TResult virtual Microsoft.CodeAnalysis.Semantics.OperationVisitor.VisitLabelStatement(Microsoft.CodeAnalysis.Semantics.ILabelStatement operation, TArgument argument) -> TResult -virtual Microsoft.CodeAnalysis.Semantics.OperationVisitor.VisitAnonymousFunctionExpression(Microsoft.CodeAnalysis.Semantics.IAnonymousFunctionExpression operation, TArgument argument) -> TResult virtual Microsoft.CodeAnalysis.Semantics.OperationVisitor.VisitLiteralExpression(Microsoft.CodeAnalysis.Semantics.ILiteralExpression operation, TArgument argument) -> TResult virtual Microsoft.CodeAnalysis.Semantics.OperationVisitor.VisitLocalFunctionStatement(Microsoft.CodeAnalysis.Semantics.ILocalFunctionStatement operation, TArgument argument) -> TResult virtual Microsoft.CodeAnalysis.Semantics.OperationVisitor.VisitLocalReferenceExpression(Microsoft.CodeAnalysis.Semantics.ILocalReferenceExpression operation, TArgument argument) -> TResult @@ -923,7 +923,6 @@ virtual Microsoft.CodeAnalysis.Semantics.OperationVisitor.Vi virtual Microsoft.CodeAnalysis.Semantics.OperationVisitor.VisitMemberInitializerExpression(Microsoft.CodeAnalysis.Semantics.IMemberInitializerExpression operation, TArgument argument) -> TResult virtual Microsoft.CodeAnalysis.Semantics.OperationVisitor.VisitMethodBindingExpression(Microsoft.CodeAnalysis.Semantics.IMethodBindingExpression operation, TArgument argument) -> TResult virtual Microsoft.CodeAnalysis.Semantics.OperationVisitor.VisitNameOfExpression(Microsoft.CodeAnalysis.Semantics.INameOfExpression operation, TArgument argument) -> TResult -virtual Microsoft.CodeAnalysis.Semantics.OperationVisitor.VisitCoalesceExpression(Microsoft.CodeAnalysis.Semantics.ICoalesceExpression operation, TArgument argument) -> TResult virtual Microsoft.CodeAnalysis.Semantics.OperationVisitor.VisitObjectCreationExpression(Microsoft.CodeAnalysis.Semantics.IObjectCreationExpression operation, TArgument argument) -> TResult virtual Microsoft.CodeAnalysis.Semantics.OperationVisitor.VisitObjectOrCollectionInitializerExpression(Microsoft.CodeAnalysis.Semantics.IObjectOrCollectionInitializerExpression operation, TArgument argument) -> TResult virtual Microsoft.CodeAnalysis.Semantics.OperationVisitor.VisitOmittedArgumentExpression(Microsoft.CodeAnalysis.Semantics.IOmittedArgumentExpression operation, TArgument argument) -> TResult diff --git a/src/Compilers/VisualBasic/Portable/Operations/VisualBasicOperationFactory.vb b/src/Compilers/VisualBasic/Portable/Operations/VisualBasicOperationFactory.vb index fec0bac7580..e3271064fc3 100644 --- a/src/Compilers/VisualBasic/Portable/Operations/VisualBasicOperationFactory.vb +++ b/src/Compilers/VisualBasic/Portable/Operations/VisualBasicOperationFactory.vb @@ -569,11 +569,9 @@ Namespace Microsoft.CodeAnalysis.Semantics Private Function CreateBoundLateInvocationOperation(boundLateInvocation As BoundLateInvocation) As IOperation Dim expression As Lazy(Of IOperation) = New Lazy(Of IOperation)(Function() Create(boundLateInvocation.Member)) - - Dim isDynamicPropertyReference = boundLateInvocation.MethodOrPropertyGroupOpt?.Kind = BoundKind.PropertyGroup Dim applicableSymbols As ImmutableArray(Of ISymbol) If boundLateInvocation.MethodOrPropertyGroupOpt IsNot Nothing Then - applicableSymbols = If(isDynamicPropertyReference, + applicableSymbols = If(boundLateInvocation.MethodOrPropertyGroupOpt.Kind = BoundKind.PropertyGroup, DirectCast(boundLateInvocation.MethodOrPropertyGroupOpt, BoundPropertyGroup).Properties.As(Of ISymbol), DirectCast(boundLateInvocation.MethodOrPropertyGroupOpt, BoundMethodGroup).Methods.As(Of ISymbol)) Else @@ -585,16 +583,13 @@ Namespace Microsoft.CodeAnalysis.Semantics ImmutableArray(Of IOperation).Empty, boundLateInvocation.ArgumentsOpt.SelectAsArray(Function(n) Create(n))) End Function) - Dim argumentNames As ImmutableArray(Of String) = boundLateInvocation.ArgumentNamesOpt.NullToEmpty() - Dim argumentRefKinds As ImmutableArray(Of RefKind) = ImmutableArray(Of RefKind).Empty + Dim argumentNames As ImmutableArray(Of String) = boundLateInvocation.ArgumentNamesOpt + Dim argumentRefKinds As ImmutableArray(Of RefKind) = Nothing Dim syntax As SyntaxNode = boundLateInvocation.Syntax Dim type As ITypeSymbol = boundLateInvocation.Type Dim constantValue As [Optional](Of Object) = ConvertToOptional(boundLateInvocation.ConstantValueOpt) Dim isImplicit As Boolean = boundLateInvocation.WasCompilerGenerated - - Return If(isDynamicPropertyReference, - New LazyDynamicPropertyReferenceExpression(expression, applicableSymbols, arguments, argumentNames, argumentRefKinds, _semanticModel, syntax, type, constantValue, isImplicit), - DirectCast(New LazyDynamicInvocationExpression(expression, applicableSymbols, arguments, argumentNames, argumentRefKinds, _semanticModel, syntax, type, constantValue, isImplicit), IOperation)) + Return New LazyDynamicInvocationExpression(expression, applicableSymbols, arguments, argumentNames, argumentRefKinds, _semanticModel, syntax, type, constantValue, isImplicit) End Function Private Function CreateBoundObjectCreationExpressionOperation(boundObjectCreationExpression As BoundObjectCreationExpression) As IObjectCreationExpression diff --git a/src/Compilers/VisualBasic/Test/Semantic/IOperation/IOperationTests_IDynamicInvocationExpression.vb b/src/Compilers/VisualBasic/Test/Semantic/IOperation/IOperationTests_IDynamicInvocationExpression.vb index d6580e32204..5507f8e9b44 100644 --- a/src/Compilers/VisualBasic/Test/Semantic/IOperation/IOperationTests_IDynamicInvocationExpression.vb +++ b/src/Compilers/VisualBasic/Test/Semantic/IOperation/IOperationTests_IDynamicInvocationExpression.vb @@ -9,7 +9,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.UnitTests.Semantics Inherits SemanticModelTestBase - Public Sub DynamicInvocation_Basic() + Public Sub DynamicInvocationExpression_Basic() Dim source = - Public Sub DynamicInvocation_MultipleApplicableSymbols() + Public Sub DynamicInvocationExpression_MultipleApplicableSymbols() Dim source = - Public Sub DynamicInvocation_MultipleArgumentsAndApplicableSymbols() + Public Sub DynamicInvocationExpression_MultipleArgumentsAndApplicableSymbols() Dim source = - Public Sub DynamicInvocation_ArgumentNames() + Public Sub DynamicInvocationExpression_ArgumentNames() Dim source = - Public Sub DynamicInvocation_ArgumentRefKinds() + Public Sub DynamicInvocationExpression_ArgumentRefKinds() Dim source = - Public Sub DynamicInvocation_OverloadResolutionFailure() + Public Sub DynamicInvocationExpression_OverloadResolutionFailure() Dim source = .Value + VerifyOperationTreeAndDiagnosticsForTest(Of InvocationExpressionSyntax)(source, expectedOperationTree, expectedDiagnostics) + End Sub + + + Public Sub DynamicInvocationExpression_PropertyGroup_MultipleApplicableSymbols() + Dim source = .Value + + Dim expectedOperationTree = .Value + + Dim expectedDiagnostics = String.Empty + + VerifyOperationTreeAndDiagnosticsForTest(Of InvocationExpressionSyntax)(source, expectedOperationTree, expectedDiagnostics) + End Sub + + + + Public Sub DynamicInvocationExpression_PropertyGroup_MultipleArgumentsAndApplicableSymbols() + Dim source = .Value + + Dim expectedOperationTree = .Value + + Dim expectedDiagnostics = String.Empty + + VerifyOperationTreeAndDiagnosticsForTest(Of InvocationExpressionSyntax)(source, expectedOperationTree, expectedDiagnostics) + End Sub + + + + Public Sub DynamicInvocationExpression_PropertyGroup_ArgumentNames() + Dim source = .Value + + Dim expectedOperationTree = .Value + + Dim expectedDiagnostics = String.Empty + + VerifyOperationTreeAndDiagnosticsForTest(Of InvocationExpressionSyntax)(source, expectedOperationTree, expectedDiagnostics) + End Sub + + + + Public Sub DynamicInvocationExpression_PropertyGroup_ArgumentRefKinds() + Dim source = ByRef x2 As Object) As Integer + Get + Return 1 + End Get + End Property + + Default ReadOnly Property P1(x As String, ByRef x2 As Object) As Integer + Get + Return 1 + End Get + End Property +End Class]]>.Value + + Dim expectedOperationTree = .Value + + Dim expectedDiagnostics = ByRef x2 As Object) As Integer + ~~~~~ +BC30651: property parameters cannot be declared 'ByRef'. + Default ReadOnly Property P1(x As String, ByRef x2 As Object) As Integer + ~~~~~ +]]>.Value + + VerifyOperationTreeAndDiagnosticsForTest(Of InvocationExpressionSyntax)(source, expectedOperationTree, expectedDiagnostics) + End Sub + + + + Public Sub DynamicInvocationExpression_PropertyGroup_OverloadResolutionFailure() + Dim source = .Value + + Dim expectedOperationTree = .Value + + Dim expectedDiagnostics = .Value + VerifyOperationTreeAndDiagnosticsForTest(Of InvocationExpressionSyntax)(source, expectedOperationTree, expectedDiagnostics) End Sub End Class diff --git a/src/Compilers/VisualBasic/Test/Semantic/IOperation/IOperationTests_IDynamicPropertyReferenceExpression.vb b/src/Compilers/VisualBasic/Test/Semantic/IOperation/IOperationTests_IDynamicPropertyReferenceExpression.vb deleted file mode 100644 index b85a99d362c..00000000000 --- a/src/Compilers/VisualBasic/Test/Semantic/IOperation/IOperationTests_IDynamicPropertyReferenceExpression.vb +++ /dev/null @@ -1,241 +0,0 @@ -' Copyright (c) Microsoft. All Rights Reserved. Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -Imports Microsoft.CodeAnalysis.VisualBasic.Syntax -Imports Microsoft.CodeAnalysis.Test.Utilities - -Namespace Microsoft.CodeAnalysis.VisualBasic.UnitTests.Semantics - - Partial Public Class IOperationTests - Inherits SemanticModelTestBase - - - Public Sub DynamicPropertyReference_MultipleApplicableSymbols() - Dim source = .Value - - Dim expectedOperationTree = .Value - - Dim expectedDiagnostics = String.Empty - - VerifyOperationTreeAndDiagnosticsForTest(Of InvocationExpressionSyntax)(source, expectedOperationTree, expectedDiagnostics) - End Sub - - - - Public Sub DynamicPropertyReference_MultipleArgumentsAndApplicableSymbols() - Dim source = .Value - - Dim expectedOperationTree = .Value - - Dim expectedDiagnostics = String.Empty - - VerifyOperationTreeAndDiagnosticsForTest(Of InvocationExpressionSyntax)(source, expectedOperationTree, expectedDiagnostics) - End Sub - - - - Public Sub DynamicPropertyReference_ArgumentNames() - Dim source = .Value - - Dim expectedOperationTree = .Value - - Dim expectedDiagnostics = String.Empty - - VerifyOperationTreeAndDiagnosticsForTest(Of InvocationExpressionSyntax)(source, expectedOperationTree, expectedDiagnostics) - End Sub - - - - Public Sub DynamicPropertyReference_ArgumentRefKinds() - Dim source = ByRef x2 As Object) As Integer - Get - Return 1 - End Get - End Property - - Default ReadOnly Property P1(x As String, ByRef x2 As Object) As Integer - Get - Return 1 - End Get - End Property -End Class]]>.Value - - Dim expectedOperationTree = .Value - - Dim expectedDiagnostics = ByRef x2 As Object) As Integer - ~~~~~ -BC30651: property parameters cannot be declared 'ByRef'. - Default ReadOnly Property P1(x As String, ByRef x2 As Object) As Integer - ~~~~~ -]]>.Value - - VerifyOperationTreeAndDiagnosticsForTest(Of InvocationExpressionSyntax)(source, expectedOperationTree, expectedDiagnostics) - End Sub - - - - Public Sub DynamicPropertyReference_OverloadResolutionFailure() - Dim source = .Value - - Dim expectedOperationTree = .Value - - Dim expectedDiagnostics = .Value - - VerifyOperationTreeAndDiagnosticsForTest(Of InvocationExpressionSyntax)(source, expectedOperationTree, expectedDiagnostics) - End Sub - End Class -End Namespace - diff --git a/src/Test/Utilities/Portable/Compilation/OperationTreeVerifier.cs b/src/Test/Utilities/Portable/Compilation/OperationTreeVerifier.cs index 46dcd2b937f..a9baf9cb34d 100644 --- a/src/Test/Utilities/Portable/Compilation/OperationTreeVerifier.cs +++ b/src/Test/Utilities/Portable/Compilation/OperationTreeVerifier.cs @@ -261,12 +261,12 @@ private void Visit(IOperation operation, string header) Unindent(); } - private void VisitArrayCommon(IEnumerable list, string header, bool logElementCount, Action arrayElementVisitor) + private void VisitArrayCommon(ImmutableArray list, string header, bool logElementCount, Action arrayElementVisitor) { Debug.Assert(!string.IsNullOrEmpty(header)); Indent(); - if (!list.IsEmpty()) + if (!list.IsDefaultOrEmpty) { var elementCount = logElementCount ? $"({list.Count()})" : string.Empty; LogString($"{header}{elementCount}:"); @@ -307,23 +307,32 @@ internal void VisitRefKindArrayElement(RefKind element) LogNewLine(); } - private void VisitArray(IEnumerable list, string header, bool logElementCount) + private void VisitChildren(IOperation operation) + { + var children = operation.Children.WhereNotNull().ToImmutableArray(); + if (!children.IsEmpty|| operation.Kind != OperationKind.None) + { + VisitArray(children, "Children", logElementCount: true); + } + } + + private void VisitArray(ImmutableArray list, string header, bool logElementCount) where T: IOperation { VisitArrayCommon(list, header, logElementCount, VisitOperationArrayElement); } - private void VisitArray(IEnumerable list, string header, bool logElementCount) + private void VisitArray(ImmutableArray list, string header, bool logElementCount) { VisitArrayCommon(list, header, logElementCount, VisitSymbolArrayElement); } - private void VisitArray(IEnumerable list, string header, bool logElementCount) + private void VisitArray(ImmutableArray list, string header, bool logElementCount) { VisitArrayCommon(list, header, logElementCount, VisitStringArrayElement); } - private void VisitArray(IEnumerable list, string header, bool logElementCount) + private void VisitArray(ImmutableArray list, string header, bool logElementCount) { VisitArrayCommon(list, header, logElementCount, VisitRefKindArrayElement); } @@ -338,11 +347,7 @@ internal override void VisitNoneOperation(IOperation operation) LogString("IOperation: "); LogCommonPropertiesAndNewLine(operation); - var children = operation.Children.WhereNotNull(); - if (children.Any()) - { - VisitArray(children, "Children", logElementCount: true); - } + VisitChildren(operation); } public override void VisitBlockStatement(IBlockStatement operation) @@ -617,10 +622,61 @@ private void VisitArguments(IHasArgumentsExpression operation) private void VisitDynamicArguments(IHasDynamicArgumentsExpression operation) { - VisitArray(operation.ApplicableSymbols, "ApplicableSymbols", logElementCount: true); - VisitArray(operation.Arguments, "Arguments", logElementCount: true); - VisitArray(operation.ArgumentNames, "ArgumentNames", logElementCount: true); - VisitArray(operation.ArgumentRefKinds, "ArgumentRefKinds", logElementCount: true); + var dynamicOperation = (HasDynamicArgumentsExpression)operation; + VisitArray(dynamicOperation.ApplicableSymbols, "ApplicableSymbols", logElementCount: true); + VisitArray(dynamicOperation.Arguments, "Arguments", logElementCount: true); + VisitArray(dynamicOperation.ArgumentNames, "ArgumentNames", logElementCount: true); + VisitArray(dynamicOperation.ArgumentRefKinds, "ArgumentRefKinds", logElementCount: true); + + VerifyGetArgumentNamePublicApi(dynamicOperation, dynamicOperation.ArgumentNames); + VerifyGetArgumentRefKindPublicApi(dynamicOperation, dynamicOperation.ArgumentRefKinds); + } + + private static void VerifyGetArgumentNamePublicApi(IHasDynamicArgumentsExpression operation, ImmutableArray argumentNames) + { + var length = operation.Arguments.Length; + if (argumentNames.IsDefaultOrEmpty) + { + for (int i = 0; i < length; i++) + { + Assert.Null(operation.GetArgumentName(i)); + } + } + else + { + Assert.Equal(length, argumentNames.Length); + for (var i = 0; i < length; i++) + { + Assert.Equal(argumentNames[i], operation.GetArgumentName(i)); + } + } + } + + private static void VerifyGetArgumentRefKindPublicApi(IHasDynamicArgumentsExpression operation, ImmutableArray argumentRefKinds) + { + var length = operation.Arguments.Length; + if (argumentRefKinds.IsDefault) + { + for (int i = 0; i < length; i++) + { + Assert.Null(operation.GetArgumentRefKind(i)); + } + } + else if (argumentRefKinds.IsEmpty) + { + for (int i = 0; i < length; i++) + { + Assert.Equal(RefKind.None, operation.GetArgumentRefKind(i)); + } + } + else + { + Assert.Equal(length, argumentRefKinds.Length); + for (var i = 0; i < length; i++) + { + Assert.Equal(argumentRefKinds[i], operation.GetArgumentRefKind(i)); + } + } } public override void VisitArgument(IArgument operation) @@ -968,9 +1024,6 @@ public override void VisitAnonymousObjectCreationExpression(IAnonymousObjectCrea public override void VisitDynamicObjectCreationExpression(IDynamicObjectCreationExpression operation) { LogString(nameof(IDynamicObjectCreationExpression)); - - var name = operation.MemberName; - LogString($" (Name: {operation.MemberName})"); LogCommonPropertiesAndNewLine(operation); VisitDynamicArguments(operation); @@ -986,9 +1039,9 @@ public override void VisitDynamicInvocationExpression(IDynamicInvocationExpressi VisitDynamicArguments(operation); } - public override void VisitDynamicPropertyReferenceExpression(IDynamicPropertyReferenceExpression operation) + public override void VisitDynamicIndexerAccessExpression(IDynamicIndexerAccessExpression operation) { - LogString(nameof(IDynamicPropertyReferenceExpression)); + LogString(nameof(IDynamicIndexerAccessExpression)); LogCommonPropertiesAndNewLine(operation); Visit(operation.Expression, "Expression"); @@ -1180,7 +1233,7 @@ public override void VisitInvalidStatement(IInvalidStatement operation) LogString(nameof(IInvalidStatement)); LogCommonPropertiesAndNewLine(operation); - VisitArray(operation.Children, "Children", logElementCount: true); + VisitChildren(operation); } public override void VisitInvalidExpression(IInvalidExpression operation) @@ -1188,7 +1241,7 @@ public override void VisitInvalidExpression(IInvalidExpression operation) LogString(nameof(IInvalidExpression)); LogCommonPropertiesAndNewLine(operation); - VisitArray(operation.Children, "Children", logElementCount: true); + VisitChildren(operation); } public override void VisitIfStatement(IIfStatement operation) diff --git a/src/Test/Utilities/Portable/Compilation/TestOperationWalker.cs b/src/Test/Utilities/Portable/Compilation/TestOperationWalker.cs index d21b51cc1f8..97157b846cb 100644 --- a/src/Test/Utilities/Portable/Compilation/TestOperationWalker.cs +++ b/src/Test/Utilities/Portable/Compilation/TestOperationWalker.cs @@ -444,32 +444,33 @@ public override void VisitAnonymousObjectCreationExpression(IAnonymousObjectCrea base.VisitAnonymousObjectCreationExpression(operation); } + private void VisitDynamicArguments(IHasDynamicArgumentsExpression operation) + { + var dynamicOperation = (HasDynamicArgumentsExpression)operation; + var applicableSymbols = dynamicOperation.ApplicableSymbols; + var names = dynamicOperation.ArgumentNames; + var refKinds = dynamicOperation.ArgumentRefKinds; + } + public override void VisitDynamicObjectCreationExpression(IDynamicObjectCreationExpression operation) { - var name = operation.MemberName; - var applicableSymbols = operation.ApplicableSymbols; - var names = operation.ArgumentNames; - var refKinds = operation.ArgumentRefKinds; + VisitDynamicArguments(operation); base.VisitDynamicObjectCreationExpression(operation); } public override void VisitDynamicInvocationExpression(IDynamicInvocationExpression operation) { - var applicableSymbols = operation.ApplicableSymbols; - var names = operation.ArgumentNames; - var refKinds = operation.ArgumentRefKinds; + VisitDynamicArguments(operation); base.VisitDynamicInvocationExpression(operation); } - public override void VisitDynamicPropertyReferenceExpression(IDynamicPropertyReferenceExpression operation) + public override void VisitDynamicIndexerAccessExpression(IDynamicIndexerAccessExpression operation) { - var applicableSymbols = operation.ApplicableSymbols; - var names = operation.ArgumentNames; - var refKinds = operation.ArgumentRefKinds; - - base.VisitDynamicPropertyReferenceExpression(operation); + VisitDynamicArguments(operation); + + base.VisitDynamicIndexerAccessExpression(operation); } public override void VisitObjectOrCollectionInitializerExpression(IObjectOrCollectionInitializerExpression operation) -- GitLab