提交 218761e0 编写于 作者: M Manish Vasani

Address some more review feedback

上级 ed08dc8c
......@@ -66,6 +66,8 @@ private IVariableDeclaration CreateVariableDeclarationInternal(BoundLocalDeclara
}
else
{
Debug.Fail($"Unexpected syntax kind: {syntax.Kind()}");
// There is no explicit syntax for the initializer, so we use the initializerValue's syntax and mark the operation as implicit.
initializerSyntax = initializerValue.Syntax;
isImplicit = true;
......
......@@ -145,28 +145,5 @@ public void TestParentOperations()
VerifyParentOperations(model);
}
[CompilerTrait(CompilerFeature.IOperation)]
[Fact]
public void TestGetOperationForVariableInitializer()
{
string source = @"
class Test
{
void M()
{
var x /*<bind>*/= 1/*</bind>*/;
System.Console.WriteLine(x);
}
}
";
string expectedOperationTree = @"
IVariableInitializer (OperationKind.VariableInitializer) (Syntax: '= 1')
ILiteralExpression (OperationKind.LiteralExpression, Type: System.Int32, Constant: 1) (Syntax: '1')
";
var expectedDiagnostics = DiagnosticDescription.None;
VerifyOperationTreeAndDiagnosticsForTest<EqualsValueClauseSyntax>(source, expectedOperationTree, expectedDiagnostics);
}
}
}
// Copyright (c) Microsoft. All Rights Reserved. Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
// 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;
......@@ -460,6 +460,29 @@ static void Main(string[] args)
VerifyOperationTreeAndDiagnosticsForTest<LocalDeclarationStatementSyntax>(source, expectedOperationTree, expectedDiagnostics);
}
[CompilerTrait(CompilerFeature.IOperation)]
[Fact]
public void TestGetOperationForVariableInitializer()
{
string source = @"
class Test
{
void M()
{
var x /*<bind>*/= 1/*</bind>*/;
System.Console.WriteLine(x);
}
}
";
string expectedOperationTree = @"
IVariableInitializer (OperationKind.VariableInitializer) (Syntax: '= 1')
ILiteralExpression (OperationKind.LiteralExpression, Type: System.Int32, Constant: 1) (Syntax: '1')
";
var expectedDiagnostics = DiagnosticDescription.None;
VerifyOperationTreeAndDiagnosticsForTest<EqualsValueClauseSyntax>(source, expectedOperationTree, expectedDiagnostics);
}
#endregion
#region Fixed Statements
......
......@@ -25,7 +25,7 @@ public static VariableDeclaration CreateVariableDeclaration(ImmutableArray<ILoca
public static IVariableInitializer CreateVariableInitializer(SyntaxNode syntax, IOperation initializerValue, SemanticModel semanticModel, bool isImplicit)
{
return new VariableInitializer(initializerValue, semanticModel, syntax, initializerValue.Type, constantValue: default, isImplicit: isImplicit);
return new VariableInitializer(initializerValue, semanticModel, syntax, type: null, constantValue: default, isImplicit: isImplicit);
}
public static IConditionalExpression CreateConditionalExpression(IOperation condition, IOperation whenTrue, IOperation whenFalse, ITypeSymbol resultType, SemanticModel semanticModel, SyntaxNode syntax, bool isImplicit)
......
......@@ -240,10 +240,14 @@ Namespace Microsoft.CodeAnalysis.Semantics
If declaration.InitializerOpt IsNot Nothing Then
Debug.Assert(TypeOf declaration.Syntax Is ModifiedIdentifierSyntax)
Dim initializerValue As IOperation = Create(declaration.InitializerOpt)
Dim variableDeclaratorSyntax = DirectCast(declaration.Syntax.Parent, VariableDeclaratorSyntax)
Dim initializerSyntax As SyntaxNode = If(declaration.InitializedByAsNew,
DirectCast(variableDeclaratorSyntax.AsClause, SyntaxNode),
variableDeclaratorSyntax.Initializer)
Dim variableDeclaratorSyntax = TryCast(declaration.Syntax.Parent, VariableDeclaratorSyntax)
Dim initializerSyntax As SyntaxNode = Nothing
If variableDeclaratorSyntax IsNot Nothing Then
initializerSyntax = If(declaration.InitializedByAsNew,
DirectCast(variableDeclaratorSyntax.AsClause, SyntaxNode),
variableDeclaratorSyntax.Initializer)
End If
Dim isImplicit As Boolean = False
If initializerSyntax Is Nothing Then
' There is no explicit syntax for the initializer, so we use the initializerValue's syntax and mark the operation as implicit.
......
......@@ -701,48 +701,5 @@ ICatchClause (Exception type: System.Exception) (OperationKind.CatchClause) (Syn
VerifyOperationTreeAndDiagnosticsForTest(Of CatchBlockSyntax)(source, expectedOperationTree, expectedDiagnostics)
End Sub
<CompilerTrait(CompilerFeature.IOperation)>
<Fact()>
Public Sub TestGetOperationForEqualsValueVariableInitializer()
Dim source = <![CDATA[
Class Test
Sub M()
Dim x = 1'BIND:"= 1"
End Sub
End Class]]>.Value
Dim expectedOperationTree = <![CDATA[
IVariableInitializer (OperationKind.VariableInitializer) (Syntax: '= 1')
ILiteralExpression (OperationKind.LiteralExpression, Type: System.Int32, Constant: 1) (Syntax: '1')
]]>.Value
Dim expectedDiagnostics = String.Empty
VerifyOperationTreeAndDiagnosticsForTest(Of EqualsValueSyntax)(source, expectedOperationTree, expectedDiagnostics)
End Sub
<CompilerTrait(CompilerFeature.IOperation)>
<Fact()>
Public Sub TestGetOperationForAsNewVariableInitializer()
Dim source = <![CDATA[
Class Test
Sub M()
Dim x As New Test'BIND:"As New Test"
End Sub
End Class]]>.Value
Dim expectedOperationTree = <![CDATA[
IVariableInitializer (OperationKind.VariableInitializer) (Syntax: 'As New Test')
IObjectCreationExpression (Constructor: Sub Test..ctor()) (OperationKind.ObjectCreationExpression, Type: Test) (Syntax: 'New Test')
Arguments(0)
Initializer:
null
]]>.Value
Dim expectedDiagnostics = String.Empty
VerifyOperationTreeAndDiagnosticsForTest(Of AsNewClauseSyntax)(source, expectedOperationTree, expectedDiagnostics)
End Sub
End Class
End Namespace
' Copyright (c) Microsoft. All Rights Reserved. Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
' 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
......@@ -146,6 +146,27 @@ BC30046: Method cannot have both a ParamArray and Optional parameters.
VerifyOperationTreeAndDiagnosticsForTest(Of EqualsValueSyntax)(source, expectedOperationTree, expectedDiagnostics)
End Sub
<CompilerTrait(CompilerFeature.IOperation)>
<Fact, WorkItem(17813, "https://github.com/dotnet/roslyn/issues/17813")>
Public Sub AsNewFieldInitializer()
Dim source = <![CDATA[
Class C
Dim x As New Object'BIND:"As New Object"
End Class]]>.Value
Dim expectedOperationTree = <![CDATA[
IFieldInitializer (Field: C.x As System.Object) (OperationKind.FieldInitializer) (Syntax: 'As New Object')
IObjectCreationExpression (Constructor: Sub System.Object..ctor()) (OperationKind.ObjectCreationExpression, Type: System.Object) (Syntax: 'New Object')
Arguments(0)
Initializer:
null
]]>.Value
Dim expectedDiagnostics = String.Empty
VerifyOperationTreeAndDiagnosticsForTest(Of AsNewClauseSyntax)(source, expectedOperationTree, expectedDiagnostics)
End Sub
<CompilerTrait(CompilerFeature.IOperation)>
<Fact(Skip:="https://github.com/dotnet/roslyn/issues/17813"), WorkItem(17813, "https://github.com/dotnet/roslyn/issues/17813")>
Public Sub MultipleFieldInitializers()
......
' Copyright (c) Microsoft. All Rights Reserved. Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
' 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.Semantics
......@@ -1727,6 +1727,190 @@ BC30203: Identifier expected.
VerifyOperationTreeAndDiagnosticsForTest(Of LocalDeclarationStatementSyntax)(source, expectedOperationTree, expectedDiagnostics)
End Sub
#End Region
#Region "Initializers"
<CompilerTrait(CompilerFeature.IOperation)>
<Fact()>
Public Sub TestGetOperationForEqualsValueVariableInitializer()
Dim source = <![CDATA[
Class Test
Sub M()
Dim x = 1'BIND:"= 1"
End Sub
End Class]]>.Value
Dim expectedOperationTree = <![CDATA[
IVariableInitializer (OperationKind.VariableInitializer) (Syntax: '= 1')
ILiteralExpression (OperationKind.LiteralExpression, Type: System.Int32, Constant: 1) (Syntax: '1')
]]>.Value
Dim expectedDiagnostics = String.Empty
VerifyOperationTreeAndDiagnosticsForTest(Of EqualsValueSyntax)(source, expectedOperationTree, expectedDiagnostics)
End Sub
<CompilerTrait(CompilerFeature.IOperation)>
<Fact()>
Public Sub TestGetOperationForEqualsValueVariableInitializerWithMultipleLocals()
Dim source = <![CDATA[
Class Test
Sub M()
Dim x, y = 1'BIND:"= 1"
End Sub
End Class]]>.Value
Dim expectedOperationTree = <![CDATA[
IVariableInitializer (OperationKind.VariableInitializer, IsInvalid) (Syntax: '= 1')
ILiteralExpression (OperationKind.LiteralExpression, Type: System.Int32, Constant: 1, IsInvalid) (Syntax: '1')
]]>.Value
Dim expectedDiagnostics = <![CDATA[
BC42024: Unused local variable: 'x'.
Dim x, y = 1'BIND:"= 1"
~
BC30671: Explicit initialization is not permitted with multiple variables declared with a single type specifier.
Dim x, y = 1'BIND:"= 1"
~~~~~~~~
]]>.Value
VerifyOperationTreeAndDiagnosticsForTest(Of EqualsValueSyntax)(source, expectedOperationTree, expectedDiagnostics)
End Sub
<CompilerTrait(CompilerFeature.IOperation)>
<Fact()>
Public Sub TestGetOperationForEqualsValueVariableDeclarationWithMultipleLocals()
Dim source = <![CDATA[
Class Test
Sub M()
Dim x, y = 1'BIND:"Dim x, y = 1"
End Sub
End Class]]>.Value
Dim expectedOperationTree = <![CDATA[
IVariableDeclarationStatement (2 declarations) (OperationKind.VariableDeclarationStatement, IsInvalid) (Syntax: 'Dim x, y = 1')
IVariableDeclaration (1 variables) (OperationKind.VariableDeclaration, IsInvalid) (Syntax: 'x')
Variables: Local_1: x As System.Object
Initializer:
null
IVariableDeclaration (1 variables) (OperationKind.VariableDeclaration, IsInvalid) (Syntax: 'y')
Variables: Local_1: y As System.Int32
Initializer:
IVariableInitializer (OperationKind.VariableInitializer, IsInvalid) (Syntax: '= 1')
ILiteralExpression (OperationKind.LiteralExpression, Type: System.Int32, Constant: 1, IsInvalid) (Syntax: '1')
]]>.Value
Dim expectedDiagnostics = <![CDATA[
BC42024: Unused local variable: 'x'.
Dim x, y = 1'BIND:"Dim x, y = 1"
~
BC30671: Explicit initialization is not permitted with multiple variables declared with a single type specifier.
Dim x, y = 1'BIND:"Dim x, y = 1"
~~~~~~~~
]]>.Value
VerifyOperationTreeAndDiagnosticsForTest(Of LocalDeclarationStatementSyntax)(source, expectedOperationTree, expectedDiagnostics)
End Sub
<CompilerTrait(CompilerFeature.IOperation)>
<Fact()>
Public Sub TestGetOperationForAsNewVariableInitializer()
Dim source = <![CDATA[
Class Test
Sub M()
Dim x As New Test'BIND:"As New Test"
End Sub
End Class]]>.Value
Dim expectedOperationTree = <![CDATA[
IVariableInitializer (OperationKind.VariableInitializer) (Syntax: 'As New Test')
IObjectCreationExpression (Constructor: Sub Test..ctor()) (OperationKind.ObjectCreationExpression, Type: Test) (Syntax: 'New Test')
Arguments(0)
Initializer:
null
]]>.Value
Dim expectedDiagnostics = String.Empty
VerifyOperationTreeAndDiagnosticsForTest(Of AsNewClauseSyntax)(source, expectedOperationTree, expectedDiagnostics)
End Sub
<CompilerTrait(CompilerFeature.IOperation)>
<Fact()>
Public Sub TestGetOperationForAsNewVariableDeclaration()
Dim source = <![CDATA[
Class Test
Sub M()
Dim x As New Test'BIND:"Dim x As New Test"
End Sub
End Class]]>.Value
Dim expectedOperationTree = <![CDATA[
IVariableDeclarationStatement (1 declarations) (OperationKind.VariableDeclarationStatement) (Syntax: 'Dim x As New Test')
IVariableDeclaration (1 variables) (OperationKind.VariableDeclaration) (Syntax: 'x')
Variables: Local_1: x As Test
Initializer:
IVariableInitializer (OperationKind.VariableInitializer) (Syntax: 'As New Test')
IObjectCreationExpression (Constructor: Sub Test..ctor()) (OperationKind.ObjectCreationExpression, Type: Test) (Syntax: 'New Test')
Arguments(0)
Initializer:
null
]]>.Value
Dim expectedDiagnostics = String.Empty
VerifyOperationTreeAndDiagnosticsForTest(Of LocalDeclarationStatementSyntax)(source, expectedOperationTree, expectedDiagnostics)
End Sub
<CompilerTrait(CompilerFeature.IOperation)>
<Fact()>
Public Sub TestGetOperationForAsNewVariableInitializerWithMultipleLocals()
Dim source = <![CDATA[
Class Test
Sub M()
Dim x, y As New Test'BIND:"As New Test"
End Sub
End Class]]>.Value
Dim expectedOperationTree = <![CDATA[
IVariableInitializer (OperationKind.VariableInitializer) (Syntax: 'As New Test')
IObjectCreationExpression (Constructor: Sub Test..ctor()) (OperationKind.ObjectCreationExpression, Type: Test) (Syntax: 'New Test')
Arguments(0)
Initializer:
null
]]>.Value
Dim expectedDiagnostics = String.Empty
VerifyOperationTreeAndDiagnosticsForTest(Of AsNewClauseSyntax)(source, expectedOperationTree, expectedDiagnostics)
End Sub
<CompilerTrait(CompilerFeature.IOperation)>
<Fact()>
Public Sub TestGetOperationForAsNewVariableDeclarationWithMultipleLocals()
Dim source = <![CDATA[
Class Test
Sub M()
Dim x, y As New Test'BIND:"x, y As New Test"
End Sub
End Class]]>.Value
Dim expectedOperationTree = <![CDATA[
IVariableDeclaration (2 variables) (OperationKind.VariableDeclaration) (Syntax: 'x, y As New Test')
Variables: Local_1: x As Test
Local_2: y As Test
Initializer:
IVariableInitializer (OperationKind.VariableInitializer) (Syntax: 'As New Test')
IObjectCreationExpression (Constructor: Sub Test..ctor()) (OperationKind.ObjectCreationExpression, Type: Test) (Syntax: 'New Test')
Arguments(0)
Initializer:
null
]]>.Value
Dim expectedDiagnostics = String.Empty
VerifyOperationTreeAndDiagnosticsForTest(Of VariableDeclaratorSyntax)(source, expectedOperationTree, expectedDiagnostics)
End Sub
#End Region
End Class
End Namespace
......@@ -75,6 +75,12 @@ private void LogCommonPropertiesAndNewLine(IOperation operation)
LogString(", ");
LogType(operation.Type);
}
else
{
// https://github.com/dotnet/roslyn/issues/22581 tracks enabling this assert
// Verify null type for non-Expression operations.
//Assert.Null(operation.Type);
}
// ConstantValue
if (operation.ConstantValue.HasValue)
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册