提交 71f01cbb 编写于 作者: F Fred Silberberg 提交者: GitHub

Merge pull request #19885 from 333fred/fix-syntax-nothing

Fix VB IUsingStatement.Declaration to not have null syntax.
......@@ -3,6 +3,7 @@
Imports System.Collections.Immutable
Imports Microsoft.CodeAnalysis.Semantics
Imports Microsoft.CodeAnalysis.VisualBasic.Symbols
Imports Microsoft.CodeAnalysis.VisualBasic.Syntax
Namespace Microsoft.CodeAnalysis.VisualBasic
......@@ -176,7 +177,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic
Private ReadOnly _syntax As SyntaxNode
Public Sub New(boundCaseBlock As BoundCaseBlock)
' `CaseElseClauseSyntax` is bound to `BoundCaseStatement` with an empty list of case clauses,
' `CaseElseClauseSyntax` is bound to `BoundCaseStatement` with an empty list of case clauses,
' so we explicitly create an IOperation node for Case-Else clause to differentiate it from Case clause.
Dim caseStatement = boundCaseBlock.CaseStatement
If caseStatement.CaseClauses.IsEmpty AndAlso caseStatement.Syntax.Kind() = SyntaxKind.CaseElseStatement Then
......@@ -1460,7 +1461,11 @@ Namespace Microsoft.CodeAnalysis.VisualBasic
Return s_variablesMappings.GetValue(
Me,
Function(BoundUsing)
Return New Variables(BoundUsing.ResourceList.As(Of IVariableDeclaration))
If BoundUsing.ResourceList.IsDefault Then
Return Nothing
End If
Dim usingStatementSyntax = DirectCast(Syntax, UsingBlockSyntax).UsingStatement
Return New Variables(BoundUsing.ResourceList.As(Of IVariableDeclaration), usingStatementSyntax)
End Function)
End Get
End Property
......@@ -1487,9 +1492,11 @@ Namespace Microsoft.CodeAnalysis.VisualBasic
Implements IVariableDeclarationStatement
Private ReadOnly _variables As ImmutableArray(Of IVariableDeclaration)
Private ReadOnly _syntax As SyntaxNode
Public Sub New(variables As ImmutableArray(Of IVariableDeclaration))
Public Sub New(variables As ImmutableArray(Of IVariableDeclaration), syntax As UsingStatementSyntax)
_variables = variables
_syntax = syntax
End Sub
Public Sub Accept(visitor As OperationVisitor) Implements IOperation.Accept
......@@ -1514,7 +1521,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic
Public ReadOnly Property Syntax As SyntaxNode Implements IOperation.Syntax
Get
Return Nothing
Return _syntax
End Get
End Property
......
......@@ -128,6 +128,7 @@
<Compile Include="FlowAnalysis\RegionAnalysisTestsWithStaticLocals.vb" />
<Compile Include="FlowAnalysis\StructureAnalysisTests.vb" />
<Compile Include="FlowAnalysis\TryLockUsingStatementTests.vb" />
<Compile Include="IOperation\IOperationTests_IUsingStatement.vb" />
<Compile Include="IOperation\IOperationTests_IVariableDeclaration.vb" />
<Compile Include="Resource.Designer.vb">
<AutoGen>True</AutoGen>
......
Imports Microsoft.CodeAnalysis.Semantics
Imports Microsoft.CodeAnalysis.VisualBasic.Syntax
Imports Roslyn.Test.Utilities
Namespace Microsoft.CodeAnalysis.VisualBasic.UnitTests.Semantics
Partial Public Class IOperationTests
Inherits SemanticModelTestBase
<Fact>
<WorkItem(19819, "https://github.com/dotnet/roslyn/issues/19819")>
Public Sub UsingDeclarationSyntaxNotNull()
Dim source = <compilation>
<file name="c.vb">
<![CDATA[
Imports System
Module Module1
Class C1
Implements IDisposable
Public Sub Dispose() Implements IDisposable.Dispose
Throw New NotImplementedException()
End Sub
End Class
Sub S1()
Using D1 as New C1()
End Using
End Sub
End Module
]]>
</file>
</compilation>
Dim comp = CreateCompilationWithMscorlibAndVBRuntime(source, parseOptions:=TestOptions.RegularWithIOperationFeature)
CompilationUtils.AssertNoDiagnostics(comp)
Dim tree = comp.SyntaxTrees.Single()
Dim node = tree.GetRoot().DescendantNodes().OfType(Of UsingBlockSyntax).Single()
Dim op = DirectCast(comp.GetSemanticModel(tree).GetOperationInternal(node), IUsingStatement)
Assert.NotNull(op.Declaration.Syntax)
Assert.Same(node.UsingStatement, op.Declaration.Syntax)
End Sub
<Fact>
<WorkItem(19887, "https://github.com/dotnet/roslyn/issues/19887")>
Public Sub UsingDeclarationIncompleteUsingNullDeclaration()
Dim source = <compilation>
<file name="c.vb">
<![CDATA[
Imports System
Module Module1
Class C1
Implements IDisposable
Public Sub Dispose() Implements IDisposable.Dispose
Throw New NotImplementedException()
End Sub
End Class
Sub S1()
Using
End Using
End Sub
End Module
]]>
</file>
</compilation>
Dim comp = CreateCompilationWithMscorlibAndVBRuntime(source, parseOptions:=TestOptions.RegularWithIOperationFeature)
CompilationUtils.AssertTheseDiagnostics(comp,
<expected>
BC30201: Expression expected.
Using
~
</expected>)
Dim tree = comp.SyntaxTrees.Single()
Dim node = tree.GetRoot().DescendantNodes().OfType(Of UsingBlockSyntax).Single()
Dim op = DirectCast(comp.GetSemanticModel(tree).GetOperationInternal(node), IUsingStatement)
Assert.Null(op.Declaration)
End Sub
<Fact>
<WorkItem(19887, "https://github.com/dotnet/roslyn/issues/19887")>
Public Sub UsingDeclarationExistingVariableNullDeclaration()
Dim source = <compilation>
<file name="c.vb">
<![CDATA[
Imports System
Module Module1
Class C1
Implements IDisposable
Public Sub Dispose() Implements IDisposable.Dispose
Throw New NotImplementedException()
End Sub
End Class
Sub S1()
Dim x = New C1()
Using x
End Using
End Sub
End Module
]]>
</file>
</compilation>
Dim comp = CreateCompilationWithMscorlibAndVBRuntime(source, parseOptions:=TestOptions.RegularWithIOperationFeature)
CompilationUtils.AssertNoDiagnostics(comp)
Dim tree = comp.SyntaxTrees.Single()
Dim node = tree.GetRoot().DescendantNodes().OfType(Of UsingBlockSyntax).Single()
Dim op = DirectCast(comp.GetSemanticModel(tree).GetOperationInternal(node), IUsingStatement)
Assert.Null(op.Declaration)
End Sub
End Class
End Namespace
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册