提交 ed668bc5 编写于 作者: M Manish Vasani

Add more unit tests

上级 5f6e036c
......@@ -1419,7 +1419,7 @@ internal partial class BoundDynamicIndexerAccess
{
protected override OperationKind ExpressionKind => OperationKind.None;
protected override ImmutableArray<IOperation> Children => this.Arguments.Add(this.ReceiverOpt).As<IOperation>();
protected override ImmutableArray<IOperation> Children => this.Arguments.Insert(0, this.ReceiverOpt).As<IOperation>();
public override void Accept(OperationVisitor visitor)
{
......@@ -1567,7 +1567,7 @@ internal partial class BoundPattern
internal partial class BoundDeclarationPattern
{
protected override ImmutableArray<IOperation> Children => ImmutableArray<IOperation>.Empty;
protected override ImmutableArray<IOperation> Children => ImmutableArray.Create<IOperation>(this.VariableAccess);
}
internal partial class BoundConstantPattern
......@@ -1584,8 +1584,6 @@ internal partial class BoundArgListOperator
{
protected override OperationKind ExpressionKind => OperationKind.None;
protected override ImmutableArray<IOperation> Children => this.Arguments.As<IOperation>();
public override void Accept(OperationVisitor visitor)
{
visitor.VisitNoneOperation(this);
......@@ -2101,6 +2099,8 @@ internal partial class BoundFixedLocalCollectionInitializer
{
protected override OperationKind ExpressionKind => OperationKind.None;
protected override ImmutableArray<IOperation> Children => ImmutableArray.Create<IOperation>(this.Expression);
public override void Accept(OperationVisitor visitor)
{
visitor.VisitNoneOperation(this);
......
......@@ -61,6 +61,7 @@
<Compile Include="Diagnostics\GetDiagnosticsTests.cs" />
<Compile Include="IOperation\IOperationTests_IArgument.cs" />
<Compile Include="IOperation\IOperationTests_IIfStatement.cs" />
<Compile Include="IOperation\IOperationTests_IFieldReferenceExpression.cs" />
<Compile Include="IOperation\IOperationTests_IParameterReferenceExpression.cs" />
<Compile Include="IOperation\IOperationTests_ISymbolInitializer.cs" />
<Compile Include="IOperation\IOperationTests_InvalidExpression.cs" />
......
// Copyright (c) Microsoft. All Rights Reserved. Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
using Microsoft.CodeAnalysis.CSharp.Syntax;
using Microsoft.CodeAnalysis.Test.Utilities;
using Roslyn.Test.Utilities;
using Xunit;
namespace Microsoft.CodeAnalysis.CSharp.UnitTests
{
public partial class IOperationTests : SemanticModelTestBase
{
[Fact, WorkItem(8884, "https://github.com/dotnet/roslyn/issues/8884")]
public void FieldReference_Attribute()
{
string source = @"
using System.Diagnostics;
class C
{
private const string field = nameof(field);
[/*<bind>*/Conditional(field)/*</bind>*/]
void M()
{
}
}
";
string expectedOperationTree = @"
IOperation: (OperationKind.None) (Syntax: 'Conditional(field)')
Children(1): IFieldReferenceExpression: System.String C.field (Static) (OperationKind.FieldReferenceExpression, Type: System.String, Constant: ""field"") (Syntax: 'field')
";
var expectedDiagnostics = DiagnosticDescription.None;
VerifyOperationTreeAndDiagnosticsForTest<AttributeSyntax>(source, expectedOperationTree, expectedDiagnostics);
}
}
}
\ No newline at end of file
// Copyright (c) Microsoft. All Rights Reserved. Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
using Microsoft.CodeAnalysis.CSharp.Syntax;
using Microsoft.CodeAnalysis.CSharp.Test.Utilities;
using Microsoft.CodeAnalysis.Test.Utilities;
using Roslyn.Test.Utilities;
using Xunit;
......@@ -137,7 +138,6 @@ public void M(List<Customer> customers)
IReturnStatement (OperationKind.ReturnStatement) (Syntax: 'cust.Name')
IPropertyReferenceExpression: System.String Customer.Name { get; set; } (OperationKind.PropertyReferenceExpression, Type: System.String) (Syntax: 'cust.Name')
Instance Receiver: IOperation: (OperationKind.None) (Syntax: 'cust')
Children(1): IParameterReferenceExpression: cust (OperationKind.ParameterReferenceExpression, Type: Customer) (Syntax: 'cust')
";
var expectedDiagnostics = DiagnosticDescription.None;
......@@ -380,8 +380,8 @@ public void M(dynamic d, int x)
IVariableDeclaration (1 variables) (OperationKind.VariableDeclaration) (Syntax: 'var y /*<bi ... *</bind>*/;')
Variables: Local_1: dynamic y
Initializer: IOperation: (OperationKind.None) (Syntax: 'd[x]')
Children(2): IParameterReferenceExpression: x (OperationKind.ParameterReferenceExpression, Type: System.Int32) (Syntax: 'x')
IParameterReferenceExpression: d (OperationKind.ParameterReferenceExpression, Type: dynamic) (Syntax: 'd')
Children(2): IParameterReferenceExpression: d (OperationKind.ParameterReferenceExpression, Type: dynamic) (Syntax: 'd')
IParameterReferenceExpression: x (OperationKind.ParameterReferenceExpression, Type: System.Int32) (Syntax: 'x')
";
var expectedDiagnostics = DiagnosticDescription.None;
......@@ -402,9 +402,9 @@ public void M(dynamic x, int y)
";
string expectedOperationTree = @"
IOperation: (OperationKind.None) (Syntax: 'x.M(y)')
Children(2): IParameterReferenceExpression: y (OperationKind.ParameterReferenceExpression, Type: System.Int32) (Syntax: 'y')
IOperation: (OperationKind.None) (Syntax: 'x.M')
Children(2): IOperation: (OperationKind.None) (Syntax: 'x.M')
Children(1): IParameterReferenceExpression: x (OperationKind.ParameterReferenceExpression, Type: dynamic) (Syntax: 'x')
IParameterReferenceExpression: y (OperationKind.ParameterReferenceExpression, Type: System.Int32) (Syntax: 'y')
";
var expectedDiagnostics = DiagnosticDescription.None;
......@@ -425,8 +425,8 @@ public void M(dynamic x, int y)
";
string expectedOperationTree = @"
IOperation: (OperationKind.None) (Syntax: 'x(y)')
Children(2): IParameterReferenceExpression: y (OperationKind.ParameterReferenceExpression, Type: System.Int32) (Syntax: 'y')
IParameterReferenceExpression: x (OperationKind.ParameterReferenceExpression, Type: dynamic) (Syntax: 'x')
Children(2): IParameterReferenceExpression: x (OperationKind.ParameterReferenceExpression, Type: dynamic) (Syntax: 'x')
IParameterReferenceExpression: y (OperationKind.ParameterReferenceExpression, Type: System.Int32) (Syntax: 'y')
";
var expectedDiagnostics = DiagnosticDescription.None;
......@@ -565,8 +565,7 @@ public void M(int x)
IOperation: (OperationKind.None) (Syntax: 'case var y ... break;')
Children(2): IOperation: (OperationKind.None) (Syntax: 'case var y ... (x >= 10):')
Children(2): IOperation: (OperationKind.None) (Syntax: 'var y')
Children(2): ILocalReferenceExpression: y (OperationKind.LocalReferenceExpression, Type: System.Int32) (Syntax: 'var y')
IOperation: (OperationKind.None) (Syntax: 'var')
Children(1): ILocalReferenceExpression: y (OperationKind.LocalReferenceExpression, Type: System.Int32) (Syntax: 'var y')
IBinaryOperatorExpression (BinaryOperationKind.IntegerGreaterThanOrEqual) (OperationKind.BinaryOperatorExpression, Type: System.Boolean) (Syntax: 'x >= 10')
Left: IParameterReferenceExpression: x (OperationKind.ParameterReferenceExpression, Type: System.Int32) (Syntax: 'x')
Right: ILiteralExpression (Text: 10) (OperationKind.LiteralExpression, Type: System.Int32, Constant: 10) (Syntax: '10')
......@@ -598,12 +597,11 @@ public void M(int x)
";
string expectedOperationTree = @"
IOperation: (OperationKind.None) (Syntax: 'switch (x) ... }')
Children(4): IParameterReferenceExpression: x (OperationKind.ParameterReferenceExpression, Type: System.Int32) (Syntax: 'x')
Children(3): IParameterReferenceExpression: x (OperationKind.ParameterReferenceExpression, Type: System.Int32) (Syntax: 'x')
IOperation: (OperationKind.None) (Syntax: 'case var y ... break;')
Children(2): IOperation: (OperationKind.None) (Syntax: 'case var y ... (x >= 10):')
Children(2): IOperation: (OperationKind.None) (Syntax: 'var y')
Children(2): ILocalReferenceExpression: y (OperationKind.LocalReferenceExpression, Type: System.Int32) (Syntax: 'var y')
IOperation: (OperationKind.None) (Syntax: 'var')
Children(1): ILocalReferenceExpression: y (OperationKind.LocalReferenceExpression, Type: System.Int32) (Syntax: 'var y')
IBinaryOperatorExpression (BinaryOperationKind.IntegerGreaterThanOrEqual) (OperationKind.BinaryOperatorExpression, Type: System.Boolean) (Syntax: 'x >= 10')
Left: IParameterReferenceExpression: x (OperationKind.ParameterReferenceExpression, Type: System.Int32) (Syntax: 'x')
Right: ILiteralExpression (Text: 10) (OperationKind.LiteralExpression, Type: System.Int32, Constant: 10) (Syntax: '10')
......@@ -612,12 +610,101 @@ public void M(int x)
Children(2): IOperation: (OperationKind.None) (Syntax: 'default:')
Children(1): IOperation: (OperationKind.None) (Syntax: 'default:')
IBranchStatement (BranchKind.Break) (OperationKind.BranchStatement) (Syntax: 'break;')
IOperation: (OperationKind.None) (Syntax: 'default:')
Children(1): IOperation: (OperationKind.None) (Syntax: 'default:')
";
var expectedDiagnostics = DiagnosticDescription.None;
VerifyOperationTreeAndDiagnosticsForTest<DefaultSwitchLabelSyntax>(source, expectedOperationTree, expectedDiagnostics);
}
[Fact, WorkItem(8884, "https://github.com/dotnet/roslyn/issues/8884")]
public void ParameterReference_UserDefinedLogicalConditionalOperator()
{
string source = @"
class A<T>
{
public static bool operator true(A<T> o) { return true; }
public static bool operator false(A<T> o) { return false; }
}
class B : A<object>
{
public static B operator &(B x, B y) { return x; }
}
class C : B
{
public static C operator |(C x, C y) { return x; }
}
class P
{
static void M(C x, C y)
{
if (/*<bind>*/x && y/*</bind>*/)
{
}
}
}
";
string expectedOperationTree = @"
IOperation: (OperationKind.None) (Syntax: 'x && y')
Children(2): IConversionExpression (ConversionKind.Cast, Implicit) (OperationKind.ConversionExpression, Type: B) (Syntax: 'x')
IParameterReferenceExpression: x (OperationKind.ParameterReferenceExpression, Type: C) (Syntax: 'x')
IConversionExpression (ConversionKind.Cast, Implicit) (OperationKind.ConversionExpression, Type: B) (Syntax: 'y')
IParameterReferenceExpression: y (OperationKind.ParameterReferenceExpression, Type: C) (Syntax: 'y')
";
var expectedDiagnostics = DiagnosticDescription.None;
VerifyOperationTreeAndDiagnosticsForTest<BinaryExpressionSyntax>(source, expectedOperationTree, expectedDiagnostics);
}
[Fact, WorkItem(8884, "https://github.com/dotnet/roslyn/issues/8884")]
public void ParameterReference_NoPiaObjectCreation()
{
var sources0 = @"
using System;
using System.Runtime.InteropServices;
[assembly: ImportedFromTypeLib(""_.dll"")]
[assembly: Guid(""f9c2d51d-4f44-45f0-9eda-c9d599b58257"")]
[ComImport()]
[Guid(""f9c2d51d-4f44-45f0-9eda-c9d599b58277"")]
[CoClass(typeof(C))]
public interface I
{
int P { get; set; }
}
[Guid(""f9c2d51d-4f44-45f0-9eda-c9d599b58278"")]
public class C
{
public C(object o)
{
}
}
";
var sources1 = @"
struct S
{
public I F(object x)
{
return /*<bind>*/new I(x)/*</bind>*/;
}
}
";
var compilation0 = CreateStandardCompilation(sources0);
compilation0.VerifyDiagnostics();
var compilation1 = CreateStandardCompilation(
sources1,
references: new[] { MscorlibRef, SystemRef, compilation0.EmitToImageReference(embedInteropTypes: true) });
string expectedOperationTree = @"
IOperation: (OperationKind.None) (Syntax: 'new I(x)')
";
var expectedDiagnostics = new DiagnosticDescription[] {
// (6,25): error CS1729: 'I' does not contain a constructor that takes 1 arguments
// return /*<bind>*/new I(x)/*</bind>*/;
Diagnostic(ErrorCode.ERR_BadCtorArgCount, "(x)").WithArguments("I", "1").WithLocation(6, 25)
};
VerifyOperationTreeAndDiagnosticsForTest<ObjectCreationExpressionSyntax>(compilation1, expectedOperationTree, expectedDiagnostics);
}
}
}
\ No newline at end of file
......@@ -1826,12 +1826,6 @@ Namespace Microsoft.CodeAnalysis.VisualBasic
Return OperationKind.None
End Function
Protected Overrides ReadOnly Property Children As ImmutableArray(Of IOperation)
Get
Return ImmutableArray.Create(Of IOperation)(Me.UnderlyingLValue)
End Get
End Property
Public Overrides Sub Accept(visitor As OperationVisitor)
visitor.VisitNoneOperation(Me)
End Sub
......@@ -1946,12 +1940,6 @@ Namespace Microsoft.CodeAnalysis.VisualBasic
Return OperationKind.None
End Function
Protected Overrides ReadOnly Property Children As ImmutableArray(Of IOperation)
Get
Return ImmutableArray.Create(Of IOperation)(Me.SourceType)
End Get
End Property
Public Overrides Sub Accept(visitor As OperationVisitor)
visitor.VisitNoneOperation(Me)
End Sub
......@@ -2458,12 +2446,6 @@ Namespace Microsoft.CodeAnalysis.VisualBasic
Return OperationKind.None
End Function
Protected Overrides ReadOnly Property Children As ImmutableArray(Of IOperation)
Get
Return ImmutableArray.Create(Of IOperation)(Me.OriginalArgument)
End Get
End Property
Public Overrides Sub Accept(visitor As OperationVisitor)
visitor.VisitNoneOperation(Me)
End Sub
......@@ -2988,12 +2970,6 @@ Namespace Microsoft.CodeAnalysis.VisualBasic
Return OperationKind.None
End Function
Protected Overrides ReadOnly Property Children As ImmutableArray(Of IOperation)
Get
Return ImmutableArray.Create(Of IOperation)(Me.Expression)
End Get
End Property
Public Overrides Sub Accept(visitor As OperationVisitor)
visitor.VisitNoneOperation(Me)
End Sub
......
......@@ -97,6 +97,7 @@
<Compile Include="Diagnostics\DiagnosticTests.vb" />
<Compile Include="Diagnostics\GetDiagnosticsTests.vb" />
<Compile Include="IOperation\IOperationTests_IArgument.vb" />
<Compile Include="IOperation\IOperationTests_IFieldReferenceExpression.vb" />
<Compile Include="IOperation\IOperationTests_IParameterReferenceExpression.vb" />
<Compile Include="IOperation\IOperationTests_InvalidStatement.vb" />
<Compile Include="IOperation\IOperationTests_InvalidExpression.vb" />
......
' 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.Semantics
Imports Microsoft.CodeAnalysis.Test.Utilities
Imports Microsoft.CodeAnalysis.VisualBasic.Syntax
Imports Roslyn.Test.Utilities
Namespace Microsoft.CodeAnalysis.VisualBasic.UnitTests.Semantics
Partial Public Class IOperationTests
Inherits SemanticModelTestBase
<Fact, WorkItem(8884, "https://github.com/dotnet/roslyn/issues/8884")>
Public Sub FieldReference_Attribute()
Dim source = <![CDATA[
Imports System.Diagnostics
Class C
Private Const field As String = NameOf(field)
<Conditional(field)>'BIND:"Conditional(field)"
Private Sub M()
End Sub
End Class]]>.Value
Dim expectedOperationTree = <![CDATA[
IOperation: (OperationKind.None) (Syntax: 'Conditional(field)')
Children(1): IFieldReferenceExpression: C.field As System.String (Static) (OperationKind.FieldReferenceExpression, Type: System.String, Constant: "field") (Syntax: 'field')
]]>.Value
Dim expectedDiagnostics = String.Empty
VerifyOperationTreeAndDiagnosticsForTest(Of AttributeSyntax)(source, expectedOperationTree, expectedDiagnostics)
End Sub
End Class
End Namespace
......@@ -100,6 +100,132 @@ IOperation: (OperationKind.None) (Syntax: 'From cust I ... t cust.Name')
VerifyOperationTreeAndDiagnosticsForTest(Of QueryExpressionSyntax)(source, expectedOperationTree, expectedDiagnostics)
End Sub
<Fact, WorkItem(8884, "https://github.com/dotnet/roslyn/issues/8884")>
Public Sub ParameterReference_QueryExpressionAggregateClause()
Dim source = <![CDATA[
Option Strict Off
Option Infer On
Imports System
Imports System.Collections
Imports System.Linq
Class C
Public Sub Method(x As Integer)
Console.WriteLine(Aggregate y In New Integer() {x} Into Count())'BIND:"Aggregate y In New Integer() {x} Into Count()"
End Sub
End Class]]>.Value
Dim expectedOperationTree = <![CDATA[
IOperation: (OperationKind.None) (Syntax: 'Aggregate y ... nto Count()')
Children(1): IOperation: (OperationKind.None) (Syntax: 'Aggregate y ... nto Count()')
Children(1): IOperation: (OperationKind.None) (Syntax: 'Count()')
Children(1): IOperation: (OperationKind.None) (Syntax: 'Count()')
Children(1): IInvocationExpression ( Function System.Collections.Generic.IEnumerable(Of System.Int32).Count() As System.Int32) (OperationKind.InvocationExpression, Type: System.Int32) (Syntax: 'Count()')
Instance Receiver: IConversionExpression (ConversionKind.Basic, Implicit) (OperationKind.ConversionExpression, Type: System.Collections.Generic.IEnumerable(Of System.Int32)) (Syntax: 'y In New Integer() {x}')
IOperation: (OperationKind.None) (Syntax: 'y In New Integer() {x}')
Children(1): IOperation: (OperationKind.None) (Syntax: 'New Integer() {x}')
Children(1): IArrayCreationExpression (Element Type: System.Int32) (OperationKind.ArrayCreationExpression, Type: System.Int32()) (Syntax: 'New Integer() {x}')
Dimension Sizes(1): ILiteralExpression (OperationKind.LiteralExpression, Type: System.Int32, Constant: 1) (Syntax: 'New Integer() {x}')
Initializer: IArrayInitializer (1 elements) (OperationKind.ArrayInitializer) (Syntax: '{x}')
Element Values(1): IParameterReferenceExpression: x (OperationKind.ParameterReferenceExpression, Type: System.Int32) (Syntax: 'x')
]]>.Value
Dim expectedDiagnostics = String.Empty
VerifyOperationTreeAndDiagnosticsForTest(Of QueryExpressionSyntax)(source, expectedOperationTree, expectedDiagnostics)
End Sub
<Fact, WorkItem(8884, "https://github.com/dotnet/roslyn/issues/8884")>
Public Sub ParameterReference_QueryExpressionOrderByClause()
Dim source = <![CDATA[
Option Strict Off
Option Infer On
Imports System
Imports System.Collections
Imports System.Linq
Class C
Public Sub Method(x As String())
Console.WriteLine(From y In x Order By y.Length)'BIND:"From y In x Order By y.Length"
End Sub
End Class]]>.Value
Dim expectedOperationTree = <![CDATA[
IConversionExpression (ConversionKind.Basic, Implicit) (OperationKind.ConversionExpression, Type: System.Object) (Syntax: 'From y In x ... By y.Length')
IOperation: (OperationKind.None) (Syntax: 'From y In x ... By y.Length')
Children(1): IOperation: (OperationKind.None) (Syntax: 'Order By y.Length')
Children(1): IOperation: (OperationKind.None) (Syntax: 'y.Length')
Children(1): IInvocationExpression ( Function System.Collections.Generic.IEnumerable(Of System.String).OrderBy(Of System.Int32)(keySelector As System.Func(Of System.String, System.Int32)) As System.Linq.IOrderedEnumerable(Of System.String)) (OperationKind.InvocationExpression, Type: System.Linq.IOrderedEnumerable(Of System.String)) (Syntax: 'y.Length')
Instance Receiver: IConversionExpression (ConversionKind.Basic, Implicit) (OperationKind.ConversionExpression, Type: System.Collections.Generic.IEnumerable(Of System.String)) (Syntax: 'y In x')
IOperation: (OperationKind.None) (Syntax: 'y In x')
Children(1): IOperation: (OperationKind.None) (Syntax: 'x')
Children(1): IParameterReferenceExpression: x (OperationKind.ParameterReferenceExpression, Type: System.String()) (Syntax: 'x')
Arguments(1): IArgument (ArgumentKind.DefaultValue, Matching Parameter: keySelector) (OperationKind.Argument) (Syntax: 'y.Length')
IConversionExpression (ConversionKind.Basic, Implicit) (OperationKind.ConversionExpression, Type: System.Func(Of System.String, System.Int32)) (Syntax: 'y.Length')
IOperation: (OperationKind.None) (Syntax: 'y.Length')
Children(1): IIndexedPropertyReferenceExpression: ReadOnly Property System.String.Length As System.Int32 (OperationKind.PropertyReferenceExpression, Type: System.Int32) (Syntax: 'y.Length')
Instance Receiver: IOperation: (OperationKind.None) (Syntax: 'y')
]]>.Value
Dim expectedDiagnostics = String.Empty
VerifyOperationTreeAndDiagnosticsForTest(Of QueryExpressionSyntax)(source, expectedOperationTree, expectedDiagnostics)
End Sub
<Fact, WorkItem(8884, "https://github.com/dotnet/roslyn/issues/8884")>
Public Sub ParameterReference_QueryExpressionGroupByClause()
Dim source = <![CDATA[
Option Strict Off
Option Infer On
Imports System
Imports System.Collections
Imports System.Linq
Class C
Public Sub Method(x As String())
Dim c = From y In x Group By w = x, z = y Into Count()'BIND:"From y In x Group By w = x, z = y Into Count()"
End Sub
End Class]]>.Value
Dim expectedOperationTree = <![CDATA[
IOperation: (OperationKind.None) (Syntax: 'From y In x ... nto Count()')
Children(1): IOperation: (OperationKind.None) (Syntax: 'Group By w ... nto Count()')
Children(1): IInvocationExpression ( Function System.Collections.Generic.IEnumerable(Of System.String).GroupBy(Of <anonymous type: Key w As System.String(), Key z As System.String>, <anonymous type: Key w As System.String(), Key z As System.String, Key Count As System.Int32>)(keySelector As System.Func(Of System.String, <anonymous type: Key w As System.String(), Key z As System.String>), resultSelector As System.Func(Of <anonymous type: Key w As System.String(), Key z As System.String>, System.Collections.Generic.IEnumerable(Of System.String), <anonymous type: Key w As System.String(), Key z As System.String, Key Count As System.Int32>)) As System.Collections.Generic.IEnumerable(Of <anonymous type: Key w As System.String(), Key z As System.String, Key Count As System.Int32>)) (OperationKind.InvocationExpression, Type: System.Collections.Generic.IEnumerable(Of <anonymous type: Key w As System.String(), Key z As System.String, Key Count As System.Int32>)) (Syntax: 'Group By w ... nto Count()')
Instance Receiver: IConversionExpression (ConversionKind.Basic, Implicit) (OperationKind.ConversionExpression, Type: System.Collections.Generic.IEnumerable(Of System.String)) (Syntax: 'y In x')
IOperation: (OperationKind.None) (Syntax: 'y In x')
Children(1): IOperation: (OperationKind.None) (Syntax: 'x')
Children(1): IParameterReferenceExpression: x (OperationKind.ParameterReferenceExpression, Type: System.String()) (Syntax: 'x')
Arguments(2): IArgument (ArgumentKind.DefaultValue, Matching Parameter: keySelector) (OperationKind.Argument) (Syntax: 'x')
IConversionExpression (ConversionKind.Basic, Implicit) (OperationKind.ConversionExpression, Type: System.Func(Of System.String, <anonymous type: Key w As System.String(), Key z As System.String>)) (Syntax: 'x')
IOperation: (OperationKind.None) (Syntax: 'x')
Children(1): IOperation: (OperationKind.None) (Syntax: 'Group By w ... nto Count()')
Children(2): IOperation: (OperationKind.None) (Syntax: 'w = x')
Children(1): IParameterReferenceExpression: x (OperationKind.ParameterReferenceExpression, Type: System.String()) (Syntax: 'x')
IOperation: (OperationKind.None) (Syntax: 'z = y')
Children(1): IOperation: (OperationKind.None) (Syntax: 'y')
IArgument (ArgumentKind.DefaultValue, Matching Parameter: resultSelector) (OperationKind.Argument) (Syntax: 'Group By w ... nto Count()')
IConversionExpression (ConversionKind.Basic, Implicit) (OperationKind.ConversionExpression, Type: System.Func(Of <anonymous type: Key w As System.String(), Key z As System.String>, System.Collections.Generic.IEnumerable(Of System.String), <anonymous type: Key w As System.String(), Key z As System.String, Key Count As System.Int32>)) (Syntax: 'Group By w ... nto Count()')
IOperation: (OperationKind.None) (Syntax: 'Group By w ... nto Count()')
Children(1): IOperation: (OperationKind.None) (Syntax: 'Group By w ... nto Count()')
Children(3): IOperation: (OperationKind.None) (Syntax: 'w')
IOperation: (OperationKind.None) (Syntax: 'z')
IOperation: (OperationKind.None) (Syntax: 'Count()')
Children(1): IOperation: (OperationKind.None) (Syntax: 'Count()')
Children(1): IInvocationExpression ( Function System.Collections.Generic.IEnumerable(Of System.String).Count() As System.Int32) (OperationKind.InvocationExpression, Type: System.Int32) (Syntax: 'Count()')
Instance Receiver: IParameterReferenceExpression: $VB$ItAnonymous (OperationKind.ParameterReferenceExpression, Type: System.Collections.Generic.IEnumerable(Of System.String)) (Syntax: 'Group By w ... nto Count()')
]]>.Value
Dim expectedDiagnostics = String.Empty
VerifyOperationTreeAndDiagnosticsForTest(Of QueryExpressionSyntax)(source, expectedOperationTree, expectedDiagnostics)
End Sub
<Fact(Skip:="https://github.com/dotnet/roslyn/issues/18781"), WorkItem(8884, "https://github.com/dotnet/roslyn/issues/8884")>
Public Sub ParameterReference_ObjectAndCollectionInitializer()
Dim source = <![CDATA[
......@@ -400,5 +526,106 @@ IBlockStatement (1 statements) (OperationKind.BlockStatement) (Syntax: 'Public S
VerifyOperationTreeAndDiagnosticsForTest(Of MethodBlockSyntax)(source, expectedOperationTree, expectedDiagnostics)
End Sub
<Fact, WorkItem(8884, "https://github.com/dotnet/roslyn/issues/8884")>
Public Sub ParameterReference_LateAddressOfOperator()
Dim source = <![CDATA[
Option Strict Off
Class Class1
Public Sub M(x As Object)
Dim y = AddressOf x.Method'BIND:"AddressOf x.Method"
End Sub
Public Sub M2(x As Boolean?)
End Sub
End Class]]>.Value
Dim expectedOperationTree = <![CDATA[
IOperation: (OperationKind.None) (Syntax: 'AddressOf x.Method')
Children(1): ILateBoundMemberReferenceExpression (Member name: Method) (OperationKind.LateBoundMemberReferenceExpression, Type: System.Object) (Syntax: 'x.Method')
Instance Receiver: IParameterReferenceExpression: x (OperationKind.ParameterReferenceExpression, Type: System.Object) (Syntax: 'x')
]]>.Value
Dim expectedDiagnostics = String.Empty
VerifyOperationTreeAndDiagnosticsForTest(Of UnaryExpressionSyntax)(source, expectedOperationTree, expectedDiagnostics)
End Sub
<Fact, WorkItem(8884, "https://github.com/dotnet/roslyn/issues/8884")>
Public Sub ParameterReference_NullableIsTrueOperator()
Dim source = <![CDATA[
Option Strict Off
Class Class1
Public Sub M(x As Boolean?)
If x Then'BIND:"If x Then"
End If
End Sub
End Class]]>.Value
Dim expectedOperationTree = <![CDATA[
IIfStatement (OperationKind.IfStatement) (Syntax: 'If x Then'B ... End If')
Condition: IOperation: (OperationKind.None) (Syntax: 'x')
Children(1): IParameterReferenceExpression: x (OperationKind.ParameterReferenceExpression, Type: System.Nullable(Of System.Boolean)) (Syntax: 'x')
IfTrue: IBlockStatement (0 statements) (OperationKind.BlockStatement) (Syntax: 'If x Then'B ... End If')
]]>.Value
Dim expectedDiagnostics = String.Empty
VerifyOperationTreeAndDiagnosticsForTest(Of MultiLineIfBlockSyntax)(source, expectedOperationTree, expectedDiagnostics)
End Sub
<Fact, WorkItem(8884, "https://github.com/dotnet/roslyn/issues/8884")>
Public Sub ParameterReference_NoPiaObjectCreation()
Dim sources0 = <compilation>
<file name="a.vb"><![CDATA[
Imports System.Runtime.InteropServices
<Assembly: ImportedFromTypeLib("_.dll")>
<Assembly: Guid("f9c2d51d-4f44-45f0-9eda-c9d599b58257")>
<ComImport()>
<Guid("f9c2d51d-4f44-45f0-9eda-c9d599b58277")>
<CoClass(GetType(C))>
Public Interface I
Property P As Integer
End Interface
<Guid("f9c2d51d-4f44-45f0-9eda-c9d599b58278")>
Public Class C
Public Sub New(o As Object)
End Sub
End Class
]]></file>
</compilation>
Dim sources1 = <compilation>
<file name="a.vb"><![CDATA[
Structure S
Function F(x as Object) As I
Return New I(x)'BIND:"New I(x)"
End Function
End Structure
]]></file>
</compilation>
Dim compilation0 = CreateCompilationWithMscorlib(sources0)
compilation0.AssertTheseDiagnostics()
' No errors for /r:_.dll
Dim compilation1 = CreateCompilationWithReferences(
sources1,
references:={MscorlibRef, SystemRef, compilation0.EmitToImageReference(embedInteropTypes:=True)})
Dim expectedOperationTree = <![CDATA[
IInvalidExpression (OperationKind.InvalidExpression, Type: I, IsInvalid) (Syntax: 'New I(x)')
Children(2): IParameterReferenceExpression: x (OperationKind.ParameterReferenceExpression, Type: System.Object) (Syntax: 'x')
IOperation: (OperationKind.None) (Syntax: 'New I(x)')
]]>.Value
Dim expectedDiagnostics = <![CDATA[
BC30516: Overload resolution failed because no accessible 'New' accepts this number of arguments.
Return New I(x)'BIND:"New I(x)"
~~~~~~~~
]]>.Value
VerifyOperationTreeAndDiagnosticsForTest(Of ObjectCreationExpressionSyntax)(compilation1, "a.vb", expectedOperationTree, expectedDiagnostics)
End Sub
End Class
End Namespace
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册