/
githubmirror
/
roslyn
Обзор
Документация
Войти
/
githubmirror
/
roslyn
Код
Запросы
0
Пакеты
0
Релизы
0
Аналитика
Безопасность
main
src/Compilers/VisualBasic/Test/Semantic/FlowAnalysis/RegionAnalysisTests.vb
10 033 строки
378 KB
Tomáš Matoušek
Refactoring of extension methods in source packages (#78620) - take 2 (#78894)
26 июн 2025, 18:42
Не верифицирован
26 июн 2025, 18:42
05fc006
Код
Авторство
О чём код?
' Licensed to the .NET Foundation under one or more agreements. ' The .NET Foundation licenses this file to you under the MIT license. ' See the LICENSE file in the project root for more information. Imports Microsoft.CodeAnalysis.Collections Imports Microsoft.CodeAnalysis.Test.Utilities Imports Microsoft.CodeAnalysis.VisualBasic.Syntax Imports Roslyn.Test.Utilities Namespace Microsoft.CodeAnalysis.VisualBasic.UnitTests Partial Public Class FlowAnalysisTests Inherits FlowTestBase <Fact()> Public Sub NullArgsToFlowAnalysisMethods() Dim compilation = CreateCompilationWithMscorlib40( <compilation name="TestEntryPoints01"> <file name="a.b"> class C public sub F() end sub end class </file> </compilation>) Dim semanticModel = compilation.GetSemanticModel(compilation.SyntaxTrees(0)) Dim statement = compilation.SyntaxTrees(0).GetCompilationUnitRoot().DescendantNodesAndSelf().OfType(Of StatementSyntax)().First() Assert.Throws(Of ArgumentNullException)(Sub() semanticModel.AnalyzeControlFlow(statement, Nothing)) Assert.Throws(Of ArgumentNullException)(Sub() semanticModel.AnalyzeControlFlow(Nothing, statement)) Assert.Throws(Of ArgumentNullException)(Sub() semanticModel.AnalyzeDataFlow(statement, Nothing)) Assert.Throws(Of ArgumentNullException)(Sub() semanticModel.AnalyzeDataFlow(Nothing, statement)) Assert.Throws(Of ArgumentNullException)(Sub() semanticModel.AnalyzeDataFlow(CType(Nothing, ExecutableStatementSyntax))) End Sub <Fact()> Public Sub TestEntryPoints01() Dim analysis = CompileAndAnalyzeControlFlow( <compilation name="TestEntryPoints01"> <file name="a.b"> class C public sub F() goto L1 ' 1 [| L1: |] goto L1 ' 2 end sub end class </file> </compilation>) Assert.Equal(1, analysis.EntryPoints.Count()) End Sub <Fact()> Public Sub ByRefExtensionMethod() Dim analysis = CompileAndAnalyzeDataFlow( <compilation> <file name="a.b"> Option Strict Off Imports System Imports System.Threading Imports System.Threading.Tasks Imports System.Runtime.CompilerServices Module Module1 Public Sub Main(args As String()) Dim s As String = "b" [|s.EM()|] Console.Write(s) End Sub <Extension()> Public Sub EM(ByRef c As String) c = "a" End Sub End Module Public Class Clazz End Class </file> </compilation>) Assert.True(analysis.Succeeded) Assert.Equal(Nothing, GetSymbolNamesJoined(analysis.AlwaysAssigned)) Assert.Equal("s", GetSymbolNamesJoined(analysis.DataFlowsIn)) Assert.Equal("s", GetSymbolNamesJoined(analysis.DataFlowsOut)) Assert.Equal("args, s", GetSymbolNamesJoined(analysis.DefinitelyAssignedOnEntry)) Assert.Equal("args, s", GetSymbolNamesJoined(analysis.DefinitelyAssignedOnExit)) Assert.Equal("s", GetSymbolNamesJoined(analysis.ReadInside)) Assert.Equal("s", GetSymbolNamesJoined(analysis.WrittenInside)) End Sub <WorkItem(768095, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/768095")> <Fact()> Public Sub Bug768095() Dim analysis = CompileAndAnalyzeDataFlow( <compilation> <file name="a.b"> Public Class RichTextBox2 Private Sub UndoRestorableItem(ByVal restorableItem As RestorableItem) With [|restorableItem|] End With End Sub Private Structure RestorableItem Public Property EditType As String Public Property Position As Integer Public Property Text As String End Structure End Class </file> </compilation>) Assert.False(analysis.Succeeded) End Sub <WorkItem(531223, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/531223")> <Fact()> Public Sub Bug17780a() Dim analysis = CompileAndAnalyzeDataFlow( <compilation> <file name="a.b"> Class Test Public Shared Sub Main() On Error GoTo [| 0 |] End Sub End Class </file> </compilation>) Assert.False(analysis.Succeeded) End Sub <WorkItem(531223, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/531223")> <Fact()> Public Sub Bug17780b() ' TODO: Rewrite the test when Yield is supported Dim analysis = CompileAndAnalyzeDataFlow( <compilation> <file name="a.b"> Imports System Imports System.Collections.Generic Friend Class SourceFileScope Public Iterator Function GetTypesToSearchIn() As IEnumerable(Of Object) Yield [| Nothing |] End Function End Class </file> </compilation>) Assert.True(analysis.Succeeded) End Sub <WorkItem(543362, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/543362")> <Fact()> Public Sub Bug11067() Dim analysis = CompileAndAnalyzeDataFlow( <compilation name="Bug11067"> <file name="a.b"> Class Test Public Shared Sub Main() Dim y(,) = New Integer(,) {{[|From|]}} End Sub End Class </file> </compilation>) Assert.True(analysis.Succeeded) End Sub <WorkItem(529967, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/529967")> <Fact()> Public Sub Bug14894a() Dim analysis = CompileAndAnalyzeDataFlow( <compilation> <file name="a.b"> Imports System Module Program Sub Main(args As String()) Dim o3 As Object = "hi" [| Dim col1 = {o3, o3} |] End Sub End Module </file> </compilation>) Assert.True(analysis.Succeeded) Assert.Equal("o3", GetSymbolNamesJoined(analysis.ReadInside)) Assert.Equal(Nothing, GetSymbolNamesJoined(analysis.ReadOutside)) Assert.Equal("args, o3", GetSymbolNamesJoined(analysis.WrittenOutside)) Assert.Equal("col1", GetSymbolNamesJoined(analysis.WrittenInside)) Assert.Equal("o3", GetSymbolNamesJoined(analysis.DataFlowsIn)) Assert.Equal(Nothing, GetSymbolNamesJoined(analysis.DataFlowsOut)) Assert.Equal("args, o3", GetSymbolNamesJoined(analysis.DefinitelyAssignedOnEntry)) Assert.Equal("args, o3, col1", GetSymbolNamesJoined(analysis.DefinitelyAssignedOnExit)) End Sub <WorkItem(529967, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/529967")> <Fact()> Public Sub Bug14894b() Dim analysis = CompileAndAnalyzeDataFlow( <compilation> <file name="a.b"> Imports System Module Program Sub Main(args As String()) Dim o3 As Object = "hi" Dim col1 = [| {o3, o3} |] End Sub End Module </file> </compilation>) Assert.True(analysis.Succeeded) Assert.Equal("o3", GetSymbolNamesJoined(analysis.DataFlowsIn)) Assert.Equal("args, o3", GetSymbolNamesJoined(analysis.DefinitelyAssignedOnEntry)) Assert.Equal("args, o3", GetSymbolNamesJoined(analysis.DefinitelyAssignedOnExit)) End Sub <WorkItem(544602, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/544602")> <Fact()> Public Sub Bug13053a() Dim analysis = CompileAndAnalyzeDataFlow( <compilation name="Bug13053a"> <file name="a.b"> Class Test Public Shared Sub Main() Dim i As Integer = 1 Dim o = New MyObject With { .A = [| i |] } End Sub End Class </file> </compilation>) Assert.True(analysis.Succeeded) End Sub <WorkItem(545069, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/545069")> <Fact()> Public Sub ParameterNameAsAnInvalidRegion() Dim analysis = CompileAndAnalyzeDataFlow( <compilation name="ParameterNameAsAnInvalidRegion"> <file name="a.b"> Module Module1 Sub S(par As Integer) S([| par |]:=12) End Sub End Module </file> </compilation>) Assert.False(analysis.Succeeded) End Sub <WorkItem(545443, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/545443")> <Fact()> Public Sub XmlNameInsideEndTag() Dim analysis = CompileAndAnalyzeDataFlow( <compilation name="XmlNameInsideEndTag"> <file name="a.b"> Module Module1 Sub S(par As Integer) Dim a = <tag> </ [| tag |] > End Sub End Module </file> </compilation>) Assert.False(analysis.Succeeded) End Sub <WorkItem(545077, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/545077")> <Fact()> Public Sub ExpressionsInAttributeValues() Dim analysis = CompileAndAnalyzeDataFlow( <compilation name="ExpressionsInAttributeValues"> <file name="a.b"> Imports System Imports System.Reflection <Assembly: System.Runtime.CompilerServices.InternalsVisibleToAttribute([| "Microsoft.CodeAnalysis.Workspaces, PublicKey=002400000480000094000000060200000024000052534131000400"& _ "000100010055e0217eb635f69281051f9a823e0c7edd90f28063eb6c7a742a19b4f6139778ee0af4"& _ "38f47aed3b6e9f99838aa8dba689c7a71ddb860c96d923830b57bbd5cd6119406ddb9b002cf1c723"& _ "bf272d6acbb7129e9d6dd5a5309c94e0ff4b2c884d45a55f475cd7dba59198086f61f5a8c8b5e601"& _ "c0edbf269733f6f578fc8579c2" |])> </file> </compilation>) Assert.False(analysis.Succeeded) End Sub <WorkItem(545077, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/545077")> <Fact()> Public Sub ExpressionsInAttributeValues2() Dim analysis = CompileAndAnalyzeDataFlow( <compilation name="ExpressionsInAttributeValues2"> <file name="a.b"> Imports System Imports System.Reflection Public Class MyAttribute Public Sub New(p As Object) End Sub End Class <MyAttribute(p:=Sub() [|Dim a As Integer = 1 While a < 110 a += 1 End While|] End Sub)> Module Program Sub Main(args As String()) End Sub End Module </file> </compilation>) Assert.False(analysis.Succeeded) End Sub <Fact()> Public Sub OptionalParameterDefaultValue() Dim analysis = CompileAndAnalyzeDataFlow( <compilation name="OptionalParameterDefaultValue"> <file name="a.b"> Class Test Public Shared Sub S(Optional x As Integer = [| 1 |]) End Sub End Class </file> </compilation>) Assert.False(analysis.Succeeded) End Sub <WorkItem(545432, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/545432")> <Fact()> Public Sub LowerBoundOfArrayDefinitionSize() Dim analysis = CompileAndAnalyzeDataFlow( <compilation name="LowerBoundOfArrayDefinitionSize"> <file name="a.b"> Class Test Public Shared Sub S(x As Integer) Dim newTypeArguments([|0|] To x - 1) As String End Sub End Class </file> </compilation>) Assert.False(analysis.Succeeded) End Sub <WorkItem(544602, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/544602")> <Fact()> Public Sub Bug13053b() Dim analysis = CompileAndAnalyzeDataFlow( <compilation name="Bug13053b"> <file name="a.b"> Imports System Class Test Public Shared Sub Main() Console.Write(GetXmlNamespace([| ns |])) End Sub End Class </file> </compilation>) Assert.True(analysis.Succeeded) End Sub <WorkItem(679765, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/679765")> <Fact()> Public Sub Bug679765a() Dim analysis = CompileAndAnalyzeDataFlow( <compilation name="Bug13053b"> <file name="a.b"> Imports System Class Test Public Shared Sub Main() Console.Write([| "A" |] + "B" + "C" + "D") End Sub End Class </file> </compilation>) Assert.True(analysis.Succeeded) End Sub <WorkItem(679765, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/679765")> <Fact()> Public Sub Bug679765b() Dim analysis = CompileAndAnalyzeDataFlow( <compilation name="Bug13053b"> <file name="a.b"> Imports System Class Test Public Shared Sub Main() Console.Write([| "A" + "B" + "C" + "D" |] ) End Sub End Class </file> </compilation>) Assert.True(analysis.Succeeded) End Sub <WorkItem(679765, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/679765")> <Fact()> Public Sub Bug679765c() Dim analysis = CompileAndAnalyzeDataFlow( <compilation name="Bug13053b"> <file name="a.b"> Imports System Class Test Public Shared Sub Main() Console.Write([| "A" + "B" + "C" |] + "D" ) End Sub End Class </file> </compilation>) Assert.True(analysis.Succeeded) End Sub <WorkItem(543570, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/543570")> <Fact()> Public Sub Bug11428() Dim analysis = CompileAndAnalyzeDataFlow( <compilation name="Bug11428"> <file name="a.b"> Module Program Sub Main(args As String()) End Sub End Module Class C Public Sub Goo() End Sub End Class Class M Inherits C Public r As Double Public Overrides Sub Goo() Return [|MyBase.Total|] * r End Sub End Class </file> </compilation>) Assert.True(analysis.Succeeded) End Sub <WorkItem(543581, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/543581")> <Fact()> Public Sub Bug11440a() Dim analysis = CompileAndAnalyzeDataFlow( <compilation name="Bug11440"> <file name="a.b"> Imports System Module Program Sub Main(args As String()) Dim lambda = Function(ByRef arg As Integer) Return Function(ByRef arg1 As Integer) GoTo Label Dim arg2 As Integer = 2 Label: Return [| arg2 * arg1 |] End Function End Function End Sub End Module </file> </compilation>) Assert.True(analysis.Succeeded) Assert.Equal(Nothing, GetSymbolNamesJoined(analysis.AlwaysAssigned)) Assert.Equal(Nothing, GetSymbolNamesJoined(analysis.Captured)) Assert.Equal("arg1, arg2", GetSymbolNamesJoined(analysis.DataFlowsIn)) Assert.Equal(Nothing, GetSymbolNamesJoined(analysis.DataFlowsOut)) Assert.Equal("args, lambda, arg, arg1", GetSymbolNamesJoined(analysis.DefinitelyAssignedOnEntry)) Assert.Equal("args, lambda, arg, arg1", GetSymbolNamesJoined(analysis.DefinitelyAssignedOnExit)) Assert.Equal("arg1, arg2", GetSymbolNamesJoined(analysis.ReadInside)) Assert.Equal("arg, arg1", GetSymbolNamesJoined(analysis.ReadOutside)) Assert.Equal(Nothing, GetSymbolNamesJoined(analysis.VariablesDeclared)) Assert.Equal(Nothing, GetSymbolNamesJoined(analysis.WrittenInside)) Assert.Equal("args, lambda, arg, arg1, arg2", GetSymbolNamesJoined(analysis.WrittenOutside)) End Sub <WorkItem(543581, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/543581")> <Fact()> Public Sub Bug11440b() Dim analysis = CompileAndAnalyzeDataFlow( <compilation name="Bug11440"> <file name="a.b"> Imports System Module Program Sub Main(args As String()) GoTo Label Dim arg2 As Integer = 2 Label: dim y = [| arg2 |] End Sub End Module </file> </compilation>) Assert.True(analysis.Succeeded) Assert.Equal(Nothing, GetSymbolNamesJoined(analysis.AlwaysAssigned)) Assert.Equal(Nothing, GetSymbolNamesJoined(analysis.Captured)) Assert.Equal("arg2", GetSymbolNamesJoined(analysis.DataFlowsIn)) Assert.Equal(Nothing, GetSymbolNamesJoined(analysis.DataFlowsOut)) Assert.Equal("args", GetSymbolNamesJoined(analysis.DefinitelyAssignedOnEntry)) Assert.Equal("args", GetSymbolNamesJoined(analysis.DefinitelyAssignedOnExit)) Assert.Equal("arg2", GetSymbolNamesJoined(analysis.ReadInside)) Assert.Equal(Nothing, GetSymbolNamesJoined(analysis.ReadOutside)) Assert.Equal(Nothing, GetSymbolNamesJoined(analysis.VariablesDeclared)) Assert.Equal(Nothing, GetSymbolNamesJoined(analysis.WrittenInside)) Assert.Equal("args, arg2, y", GetSymbolNamesJoined(analysis.WrittenOutside)) End Sub <WorkItem(544330, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/544330")> <Fact()> Public Sub Bug12609() Dim analysis = CompileAndAnalyzeDataFlow( <compilation name="Bug12609"> <file name="a.b"> Class A Sub Goo(Optional i As Integer = [|1|]) End Sub End Class </file> </compilation>) Assert.False(analysis.Succeeded) End Sub <WorkItem(542231, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/542231")> <Fact()> Public Sub TestUnreachableRegion() Dim analysis = CompileAndAnalyzeDataFlow( <compilation> <file name="a.b"> Class A Sub Goo() Dim i As Integer Return [| i = i + 1 |] Dim j As Integer = i End Sub End Class </file> </compilation>) Assert.True(analysis.Succeeded) Assert.Equal(Nothing, GetSymbolNamesJoined(analysis.DataFlowsIn)) Assert.Equal(Nothing, GetSymbolNamesJoined(analysis.DataFlowsOut)) Assert.Equal(Nothing, GetSymbolNamesJoined(analysis.DefinitelyAssignedOnEntry)) Assert.Equal(Nothing, GetSymbolNamesJoined(analysis.DefinitelyAssignedOnExit)) End Sub <WorkItem(542231, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/542231")> <Fact()> Public Sub TestUnreachableRegion2() Dim analysis = CompileAndAnalyzeDataFlow( <compilation> <file name="a.b"> Class A Sub Goo() Dim i As Integer = 0 Dim j As Integer = 0 Dim k As Integer = 0 Dim l As Integer = 0 GoTo l1 [| Console.WriteLine(i) j = 1 l1: Console.WriteLine(j) k = 1 GoTo l2 Console.WriteLine(k) l = 1 l3: Console.WriteLine(l) i = 1 |] l2: Console.WriteLine(i + j + k + l) GoTo l3 End Sub End Class </file> </compilation>) Assert.True(analysis.Succeeded) Assert.Equal("j, l", GetSymbolNamesJoined(analysis.DataFlowsIn)) Assert.Equal("i, k", GetSymbolNamesJoined(analysis.DataFlowsOut)) Assert.Equal(Nothing, GetSymbolNamesJoined(analysis.DefinitelyAssignedOnEntry)) Assert.Equal("Me, i, j, k, l", GetSymbolNamesJoined(analysis.DefinitelyAssignedOnExit)) End Sub <WorkItem(542231, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/542231")> <Fact()> Public Sub TestUnreachableRegionInExpression() Dim analysis = CompileAndAnalyzeDataFlow( <compilation> <file name="a.b"> Class A Function Goo() As Boolean Dim i As Boolean = True Dim j As Boolean = False dim ext as external = new external Return False AndAlso [| ((i = ext.M1(i)) Or (i = ext.M1(j))) |] End Function End Class </file> </compilation>, s_customIL) Assert.True(analysis.Succeeded) Assert.Equal(Nothing, GetSymbolNamesJoined(analysis.DataFlowsIn)) Assert.Equal(Nothing, GetSymbolNamesJoined(analysis.DataFlowsOut)) End Sub <WorkItem(545445, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/545445")> <Fact()> Public Sub ExpressionInside() Dim analysis = CompileAndAnalyzeDataFlow( <compilation name="Bug12609"> <file name="a.b"> Class A Sub Goo() Dim outputAuthoringDocument = <?xml version=[|"1.0"|]?> <wix:Wix> <wix:Fragment> <wix:DirectoryRef Id="VisualStudio11Extensions"> </wix:DirectoryRef> </wix:Fragment> </wix:Wix> End Sub End Class </file> </compilation>) Assert.False(analysis.Succeeded) End Sub <WorkItem(544201, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/544201")> <Fact()> Public Sub Bug12423a() Dim analysis = CompileAndAnalyzeDataFlow( <compilation name="Bug12423a"> <file name="a.b"> Class A Sub Goo() Dim x = { [| New B (abc) |] } End Sub End Class Class B Public Sub New(i As Integer) End Sub End Class </file> </compilation>) Assert.True(analysis.Succeeded) End Sub <WorkItem(544201, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/544201")> <Fact()> Public Sub Bug12423b() Dim analysis = CompileAndAnalyzeDataFlow( <compilation name="Bug12423b"> <file name="a.b"> Class A Sub Goo(i As Integer) Dim x = New B([| i |] ) { New B (abc) } End Sub End Class Class B Public Sub New(i As Integer) End Sub End Class </file> </compilation>) Assert.True(analysis.Succeeded) End Sub <Fact()> Public Sub TestDataFlowForValueTypes() ' WARNING: test matches the same test in C# (TestDataFlowForValueTypes) ' Keep the two tests in sync! Dim analysis = CompileAndAnalyzeDataFlow( <compilation name="TestDataFlowForValueTypes"> <file name="a.b"> Imports System Class Tst Shared Sub Tst() Dim a As S0 Dim b As S1 Dim c As S2 Dim d As S3 Dim e As E0 Dim f As E1 [| Console.WriteLine(a) Console.WriteLine(b) Console.WriteLine(c) Console.WriteLine(d) Console.WriteLine(e) Console.WriteLine(f) |] End Sub End Class Structure S0 End Structure Structure S1 Public s0 As S0 End Structure Structure S2 Public s0 As S0 Public s1 As Integer End Structure Structure S3 Public s0 As S0 Public s1 As Object End Structure Enum E0 End Enum Enum E1 V1 End Enum </file> </compilation>) Assert.Equal(Nothing, GetSymbolNamesJoined(analysis.AlwaysAssigned)) Assert.Equal(Nothing, GetSymbolNamesJoined(analysis.Captured)) Assert.Equal("c, d, e, f", GetSymbolNamesJoined(analysis.DataFlowsIn)) Assert.Equal(Nothing, GetSymbolNamesJoined(analysis.DataFlowsOut)) Assert.Equal(Nothing, GetSymbolNamesJoined(analysis.DefinitelyAssignedOnEntry)) Assert.Equal(Nothing, GetSymbolNamesJoined(analysis.DefinitelyAssignedOnExit)) Assert.Equal("a, b, c, d, e, f", GetSymbolNamesJoined(analysis.ReadInside)) Assert.Equal(Nothing, GetSymbolNamesJoined(analysis.ReadOutside)) Assert.Equal(Nothing, GetSymbolNamesJoined(analysis.VariablesDeclared)) Assert.Equal(Nothing, GetSymbolNamesJoined(analysis.WrittenInside)) Assert.Equal(Nothing, GetSymbolNamesJoined(analysis.WrittenOutside)) End Sub <WorkItem(768094, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/768094")> <Fact()> Public Sub Bug768094a() Dim program = <compilation> <file name="a.b"> <![CDATA[ class C public sub F1(dim x as integer) end sub ' During the search for the best function definition, this procedure ** is called to test how well the function passed as the first argument ** matches the request for a function with nArg arguments in a system ** that uses encoding enc. The value returned indicates how well the ** request is matched. A higher value indicates a better match. ** ** The returned value is always between 0 and 6, as follows: ** ** 0: Not a match, or if nArg<0 and the function is has no implementation. ** 1: A variable arguments function that prefers UTF-8 when a UTF-16 ** encoding is requested, or vice versa. ** 2: A variable arguments function that uses UTF-16BE when UTF-16LE is ** requested, or vice versa. ** 3: A variable arguments function using the same text encoding. ** 4: A function with the exact number of arguments requested that ** prefers UTF-8 when a UTF-16 encoding is requested, or vice versa. ** 5: [|A function|] with the exact number of arguments requested that ** prefers UTF-16LE when UTF-16BE is requested, or vice versa. ** 6: An exact match. ** */ public sub F(dim x as integer) end sub end class ]]> </file> </compilation> Dim startNodes As New List(Of VisualBasicSyntaxNode) Dim endNodes As New List(Of VisualBasicSyntaxNode) Dim comp = CompileAndGetModelAndSpan(program, startNodes, endNodes, Nothing, Nothing) Assert.Equal(3, startNodes.Count) Assert.Equal(SyntaxKind.ExpressionStatement, startNodes(2).Kind) Dim expr = DirectCast(startNodes(2), ExpressionStatementSyntax) Dim model = comp.GetSemanticModel(comp.SyntaxTrees(0)) Dim analysis = model.AnalyzeControlFlow(expr) ' NO THROW Assert.Equal(0, analysis.EntryPoints.Count()) End Sub <WorkItem(768094, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/768094")> <Fact()> Public Sub Bug768094b() Dim program = <compilation> <file name="a.b"> <![CDATA[ 'CONVERTED BY ROSLYN Imports System.Diagnostics Imports System.Text Imports i64 = System.Int64 Imports u8 = System.Byte Imports u16 = System.UInt16 Namespace Community.CsharpSqlite Partial Public Class Sqlite3 #If SQLITE_DEBUG Then /* ** Write a nice string representation of the contents of cell pMem ** into buffer zBuf, length nBuf. */ static StringBuilder zCsr = new StringBuilder( 100 ); static void sqlite3VdbeMemPrettyPrint( Mem pMem, StringBuilder zBuf ) { zBuf.Length = 0; zCsr.Length = 0; int f = pMem.flags; string[] encnames = new string[] { "(X)", "(8)", "(16LE)", "(16BE)" }; if ( ( f & MEM_Blob ) != 0 ) { int i; char c; if ( ( f & MEM_Dyn ) != 0 ) { c = 'z'; Debug.Assert( ( f & ( MEM_Static | MEM_Ephem ) ) == 0 ); } else if ( ( f & MEM_Static ) != 0 ) { c = 't'; Debug.Assert( ( f & ( MEM_Dyn | MEM_Ephem ) ) == 0 ); } else if ( ( f & MEM_Ephem ) != 0 ) { c = 'e'; Debug.Assert( ( f & ( MEM_Static | MEM_Dyn ) ) == 0 ); } else { c = 's'; } sqlite3_snprintf( 100, zCsr, "%c", c ); zBuf.Append( zCsr );//zCsr += sqlite3Strlen30(zCsr); sqlite3_snprintf( 100, zCsr, "%d[", pMem.n ); zBuf.Append( zCsr );//zCsr += sqlite3Strlen30(zCsr); for ( i = 0; i < 16 && i < pMem.n; i++ ) { sqlite3_snprintf( 100, zCsr, "%02X", ( (int)pMem.zBLOB[i] & 0xFF ) ); zBuf.Append( zCsr );//zCsr += sqlite3Strlen30(zCsr); } for ( i = 0; i < 16 && i < pMem.n; i++ ) { char z = (char)pMem.zBLOB[i]; if ( z < 32 || z > 126 ) zBuf.Append( '.' );//*zCsr++ = '.'; else zBuf.Append( z );//*zCsr++ = z; } sqlite3_snprintf( 100, zCsr, "]%s", encnames[pMem.enc] ); zBuf.Append( zCsr );//zCsr += sqlite3Strlen30(zCsr); if ( ( f & MEM_Zero ) != 0 ) { sqlite3_snprintf( 100, zCsr, "+%dz", pMem.u.nZero ); zBuf.Append( zCsr );//zCsr += sqlite3Strlen30(zCsr); } //*zCsr = '\0'; } else if ( ( f & MEM_Str ) != 0 ) { int j;//, k; zBuf.Append( ' ' ); if ( ( f & MEM_Dyn ) != 0 ) { zBuf.Append( 'z' ); Debug.Assert( ( f & ( MEM_Static | MEM_Ephem ) ) == 0 ); } else if ( ( f & MEM_Static ) != 0 ) { zBuf.Append( 't' ); Debug.Assert( ( f & ( MEM_Dyn | MEM_Ephem ) ) == 0 ); } else if ( ( f & MEM_Ephem ) != 0 ) { zBuf.Append( 's' ); //zBuf.Append( 'e' ); Debug.Assert( ( f & ( MEM_Static | MEM_Dyn ) ) == 0 ); } else { zBuf.Append( 's' ); } //k = 2; sqlite3_snprintf( 100, zCsr, "%d", pMem.n );//zBuf[k], "%d", pMem.n ); zBuf.Append( zCsr ); //k += sqlite3Strlen30( &zBuf[k] ); zBuf.Append( '[' );// zBuf[k++] = '['; for ( j = 0; j < 15 && j < pMem.n; j++ ) { u8 c = [|pMem.z|] != null ? (u8)pMem.z[j] : pMem.zBLOB[j]; if ( c >= 0x20 && c < 0x7f ) { zBuf.Append( (char)c );//zBuf[k++] = c; } else { zBuf.Append( '.' );//zBuf[k++] = '.'; } } zBuf.Append( ']' );//zBuf[k++] = ']'; sqlite3_snprintf( 100, zCsr, encnames[pMem.enc] );//& zBuf[k], encnames[pMem.enc] ); zBuf.Append( zCsr ); //k += sqlite3Strlen30( &zBuf[k] ); //zBuf[k++] = 0; } } #End If End Class End Namespace ]]> </file> </compilation> Dim startNodes As New List(Of VisualBasicSyntaxNode) Dim endNodes As New List(Of VisualBasicSyntaxNode) Dim comp = CompileAndGetModelAndSpan(program, startNodes, endNodes, Nothing, Nothing, parseOptions:= VisualBasicParseOptions.Default.WithPreprocessorSymbols( KeyValuePair.Create("SQLITE_DEBUG", CObj(True)))) Assert.Equal(4, startNodes.Count) Assert.Equal(SyntaxKind.DictionaryAccessExpression, startNodes(2).Kind) Dim expr = DirectCast(startNodes(2), MemberAccessExpressionSyntax) Dim model = comp.GetSemanticModel(comp.SyntaxTrees(0)) Dim analysis = model.AnalyzeDataFlow(expr) ' NO THROW analysis = model.AnalyzeDataFlow(expr.Expression) ' NO THROW analysis = model.AnalyzeDataFlow(expr.Name) ' NO THROW End Sub <WorkItem(768094, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/768094")> <Fact()> Public Sub Bug768094c() Dim program = <compilation> <file name="a.b"> <![CDATA[ Imports u32 = System.UInt32 Class Clazz u32 aFrameCksum([|2|]) = {0, 0} End Class ]]> </file> </compilation> Dim startNodes As New List(Of VisualBasicSyntaxNode) Dim endNodes As New List(Of VisualBasicSyntaxNode) Dim comp = CompileAndGetModelAndSpan(program, startNodes, endNodes, Nothing, Nothing) Assert.Equal(2, startNodes.Count) Assert.Equal(SyntaxKind.NumericLiteralExpression, startNodes(0).Kind) Dim expr = DirectCast(startNodes(0), ExpressionSyntax) Dim model = comp.GetSemanticModel(comp.SyntaxTrees(0)) Dim analysis = model.AnalyzeDataFlow(expr) ' NO THROW End Sub <WorkItem(768094, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/768094")> <Fact()> Public Sub Bug768094d() Dim program = <compilation> <file name="a.b"> <![CDATA[ Imports u32 = System.UInt32 Class Clazz u32 aFrameCksum([|2|]) End Class ]]> </file> </compilation> Dim startNodes As New List(Of VisualBasicSyntaxNode) Dim endNodes As New List(Of VisualBasicSyntaxNode) Dim comp = CompileAndGetModelAndSpan(program, startNodes, endNodes, Nothing, Nothing) Assert.Equal(2, startNodes.Count) Assert.Equal(SyntaxKind.NumericLiteralExpression, startNodes(0).Kind) Dim expr = DirectCast(startNodes(0), ExpressionSyntax) Dim model = comp.GetSemanticModel(comp.SyntaxTrees(0)) Dim analysis = model.AnalyzeDataFlow(expr) ' NO THROW End Sub <Fact()> Public Sub TestExitPoints01() Dim analysis = CompileAndAnalyzeControlFlow( <compilation name="TestExitPoints01"> <file name="a.b"> class C public sub F(dim x as integer) L1: ' 1 [| if x = 0 then goto L1 if x = 1 then goto L2 if x = 3 then goto L3 L3: |] L2: ' 2 end sub end class </file> </compilation>) Assert.Equal(2, analysis.ExitPoints.Count()) End Sub <Fact()> Public Sub TestRegionCompletesNormally01() Dim analysis = CompileAndAnalyzeControlFlow( <compilation name="TestRegionCompletesNormally01"> <file name="a.b"> class C public sub F(x as integer) [| goto L1 |] L1: end sub end class </file> </compilation>) Assert.True(analysis.StartPointIsReachable) Assert.False(analysis.EndPointIsReachable) End Sub <Fact()> Public Sub TestRegionCompletesNormally02() Dim analysis = CompileAndAnalyzeControlFlow( <compilation name="TestRegionCompletesNormally02"> <file name="a.b"> class C public sub F(x as integer) [| x = 2 |] end sub end class </file> </compilation>) Assert.True(analysis.StartPointIsReachable) Assert.True(analysis.EndPointIsReachable) End Sub <Fact()> Public Sub TestRegionCompletesNormally03() Dim analysis = CompileAndAnalyzeControlFlow( <compilation name="TestRegionCompletesNormally03"> <file name="a.b"> class C public sub F(x as integer) [| if x = 0 then return |] end sub end class </file> </compilation>) Assert.True(analysis.StartPointIsReachable) Assert.True(analysis.EndPointIsReachable) End Sub <WorkItem(543320, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/543320")> <Fact()> Public Sub Bug10987() Dim analysis = CompileAndAnalyzeDataFlow( <compilation name="Bug10987"> <file name="a.b"> Class Test Public Shared Sub Main() Dim y(1, 2) = [|New Integer|] End Sub End Class </file> </compilation>) Assert.Equal(Nothing, GetSymbolNamesJoined(analysis.VariablesDeclared)) Assert.Equal(Nothing, GetSymbolNamesJoined(analysis.AlwaysAssigned)) Assert.Equal(Nothing, GetSymbolNamesJoined(analysis.DataFlowsIn)) Assert.Equal(Nothing, GetSymbolNamesJoined(analysis.DataFlowsOut)) Assert.Equal(Nothing, GetSymbolNamesJoined(analysis.DefinitelyAssignedOnEntry)) Assert.Equal(Nothing, GetSymbolNamesJoined(analysis.DefinitelyAssignedOnExit)) Assert.Equal(Nothing, GetSymbolNamesJoined(analysis.ReadInside)) Assert.Equal(Nothing, GetSymbolNamesJoined(analysis.WrittenInside)) Assert.Equal(Nothing, GetSymbolNamesJoined(analysis.ReadOutside)) Assert.Equal("y", GetSymbolNamesJoined(analysis.WrittenOutside)) End Sub <Fact()> Public Sub TestExpressionInIfStatement() Dim dataFlowAnalysis = CompileAndAnalyzeDataFlow( <compilation name="TestExpressionInIfStatement"> <file name="a.b"> Module Program Sub Main() Dim x = 1 If 1 = [|x|] Then End If End Sub End Module </file> </compilation>) Assert.Equal("x", GetSymbolNamesJoined(dataFlowAnalysis.DataFlowsIn)) End Sub <Fact()> Public Sub CallingMethodsOnUninitializedStructs() Dim analysis = CompileAndAnalyzeDataFlow( <compilation name="CallingMethodsOnUninitializedStructs2"> <file name="a.b"> Public Structure XXX Public x As S(Of Object) Public y As S(Of String) End Structure Public Structure S(Of T) Public x As String Public Property y As T End Structure Public Class Test Public Shared Sub Main(args As String()) Dim s As XXX s.x = New S(Of Object)() [|s.x.y.ToString()|] Dim t As Object = s End Sub Public Shared Sub S1(ByRef arg As XXX) arg.x.x = "" arg.x.y = arg.x.x End Sub End Class </file> </compilation>) Assert.Equal(Nothing, GetSymbolNamesJoined(analysis.AlwaysAssigned)) Assert.Equal(Nothing, GetSymbolNamesJoined(analysis.Captured)) Assert.Equal(Nothing, GetSymbolNamesJoined(analysis.CapturedInside)) Assert.Equal(Nothing, GetSymbolNamesJoined(analysis.CapturedOutside)) Assert.Equal("s", GetSymbolNamesJoined(analysis.DataFlowsIn)) Assert.Equal(Nothing, GetSymbolNamesJoined(analysis.DataFlowsOut)) Assert.Equal("args", GetSymbolNamesJoined(analysis.DefinitelyAssignedOnEntry)) Assert.Equal("args", GetSymbolNamesJoined(analysis.DefinitelyAssignedOnExit)) Assert.Equal("s", GetSymbolNamesJoined(analysis.ReadInside)) Assert.Equal("s", GetSymbolNamesJoined(analysis.ReadOutside)) Assert.Equal(Nothing, GetSymbolNamesJoined(analysis.WrittenInside)) Assert.Equal("args, s, t", GetSymbolNamesJoined(analysis.WrittenOutside)) End Sub <WorkItem(542789, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/542789")> <Fact()> Public Sub Bug10172() Dim analysis = CompileAndAnalyzeControlAndDataFlow( <compilation name="Bug10172"> <file name="a.b"> Imports System Imports System.Collections.Generic Imports System.Linq Module Module1 Sub Main() Dim list = New Integer() {1, 2, 3, 4, 5, 6, 7, 8} Dim b = From i In list Where i > Function(i) As String [|Return i|] End Function.Invoke End Sub End Module </file> </compilation>) Assert.True(analysis.Item1.Succeeded) Assert.True(analysis.Item2.Succeeded) Assert.Equal(Nothing, GetSymbolNamesJoined(analysis.Item2.Captured)) Assert.Equal(Nothing, GetSymbolNamesJoined(analysis.Item2.CapturedInside)) Assert.Equal(Nothing, GetSymbolNamesJoined(analysis.Item2.CapturedOutside)) End Sub <WorkItem(1312, "https://github.com/dotnet/roslyn/issues/1312")> <Fact()> Public Sub Bug1312() Dim analysis = CompileAndAnalyzeDataFlow( <compilation name="Bug10172"> <file name="a.b"> Imports System Imports System.Collections.Generic Imports System.Linq Class C Function Z(f As Func(Of Integer)) As Integer Return 1 End Function Sub F() Dim result1 = From a In {1} From b In {2} Where Z(Function() a+b) Select a Dim result2 = From c In {1} From d In {2} Where Z(Function() [|c|]+d) > 0 Select c End Sub End Class</file> </compilation>) Assert.Equal("Me, c", GetSymbolNamesJoined(analysis.Captured)) Assert.Equal("c", GetSymbolNamesJoined(analysis.CapturedInside)) Assert.Equal("Me", GetSymbolNamesJoined(analysis.CapturedOutside)) End Sub <WorkItem(543645, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/543645")> <Fact()> Public Sub Bug11526() Dim analysis = CompileAndAnalyzeControlAndDataFlow( <compilation name="Bug10172"> <file name="a.b"> Imports System Imports System.Collections.Generic Imports System.Linq Module Module1 Sub Main() Dim x = True Dim y = DateTime.Now [| Try Catch ex as Exception when x orelse y = #12:00:00 AM# End Try |] End Sub End Module </file> </compilation>) Assert.True(analysis.Item1.Succeeded) Assert.True(analysis.Item2.Succeeded) End Sub <WorkItem(543111, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/543111")> <Fact()> Public Sub Bug10683a() Dim analysis = CompileAndAnalyzeDataFlow( <compilation name="Bug10683a"> <file name="a.b"> Imports System Imports System.Collections.Generic Imports System.Linq Module Module1 Sub Main() Dim x = New Integer() {} x.First([|Function(i As Integer, r As Integer) As Boolean Return True End Function|]) End Sub End Module </file> </compilation>) Assert.True(analysis.Succeeded) End Sub <Fact()> Public Sub TestArrayDeclaration01() Dim analysis = CompileAndAnalyzeControlAndDataFlow( <compilation name="TestArrayDeclaration01"> <file name="a.b"> Module Program Sub Main(args As String()) [| Dim x(5), y As Integer |] End Sub End Module </file> </compilation>) Dim controlFlowAnalysis = analysis.Item1 Dim dataFlowAnalysis = analysis.Item2 Assert.Equal(0, controlFlowAnalysis.ExitPoints.Count()) Assert.Equal(0, controlFlowAnalysis.EntryPoints.Count()) Assert.Equal("x", GetSymbolNamesJoined(dataFlowAnalysis.AlwaysAssigned)) Assert.Equal("x", GetSymbolNamesJoined(dataFlowAnalysis.WrittenInside)) Assert.Equal("x, y", GetSymbolNamesJoined(dataFlowAnalysis.VariablesDeclared)) Assert.Equal("args", GetSymbolNamesJoined(dataFlowAnalysis.DefinitelyAssignedOnEntry)) Assert.Equal("args, x", GetSymbolNamesJoined(dataFlowAnalysis.DefinitelyAssignedOnExit)) Assert.True(controlFlowAnalysis.EndPointIsReachable) End Sub <Fact()> Public Sub TestPreprocessorSymbol() Dim analysis = CompileAndAnalyzeControlAndDataFlow( <compilation name="TestPreprocessorSymbol"> <file name="a.b"> Module Program Sub Main() [| Console.WriteLine() #Const X = 1 Console.WriteLine() |] End Sub End Module </file> </compilation>) Dim controlFlowAnalysis = analysis.Item1 Dim dataFlowAnalysis = analysis.Item2 Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowAnalysis.VariablesDeclared)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowAnalysis.DefinitelyAssignedOnEntry)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowAnalysis.DefinitelyAssignedOnExit)) End Sub <Fact()> Public Sub TestArrayDeclaration02() Dim analysis = CompileAndAnalyzeControlAndDataFlow( <compilation name="TestArrayDeclaration02"> <file name="a.b"> Module Program Sub Main(args As String()) [|If True Then Dim x(5), y As Integer |] End Sub End Module </file> </compilation>) Dim controlFlowAnalysis = analysis.Item1 Dim dataFlowAnalysis = analysis.Item2 Assert.Equal(0, controlFlowAnalysis.ExitPoints.Count()) Assert.Equal(0, controlFlowAnalysis.EntryPoints.Count()) Assert.Equal("x", GetSymbolNamesJoined(dataFlowAnalysis.AlwaysAssigned)) Assert.Equal("x", GetSymbolNamesJoined(dataFlowAnalysis.WrittenInside)) Assert.Equal("x, y", GetSymbolNamesJoined(dataFlowAnalysis.VariablesDeclared)) Assert.Equal("args", GetSymbolNamesJoined(dataFlowAnalysis.DefinitelyAssignedOnEntry)) Assert.Equal("args, x", GetSymbolNamesJoined(dataFlowAnalysis.DefinitelyAssignedOnExit)) Assert.True(controlFlowAnalysis.EndPointIsReachable) End Sub <Fact()> Public Sub TestArrayDeclaration02_() Dim analysis = CompileAndAnalyzeControlAndDataFlow( <compilation name="TestArrayDeclaration02"> <file name="a.b"> Module Program Sub Main(args As String()) Dim b As Boolean = True [|If b Then Dim x(5), y As Integer |] End Sub End Module </file> </compilation>) Dim controlFlowAnalysis = analysis.Item1 Dim dataFlowAnalysis = analysis.Item2 Assert.Equal(0, controlFlowAnalysis.ExitPoints.Count()) Assert.Equal(0, controlFlowAnalysis.EntryPoints.Count()) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowAnalysis.AlwaysAssigned)) Assert.Equal("x", GetSymbolNamesJoined(dataFlowAnalysis.WrittenInside)) Assert.Equal("x, y", GetSymbolNamesJoined(dataFlowAnalysis.VariablesDeclared)) Assert.Equal("args, b", GetSymbolNamesJoined(dataFlowAnalysis.DefinitelyAssignedOnEntry)) Assert.Equal("args, b", GetSymbolNamesJoined(dataFlowAnalysis.DefinitelyAssignedOnExit)) Assert.True(controlFlowAnalysis.EndPointIsReachable) End Sub <Fact()> Public Sub TestVariablesWithSameName() Dim analysis = CompileAndAnalyzeControlAndDataFlow( <compilation name="TestVariablesWithSameName"> <file name="a.b"> Module Program Sub Main(args As String()) [|If True Then Dim x = 1 Else Dim x = 1 |] End Sub End Module </file> </compilation>) Dim controlFlowAnalysis = analysis.Item1 Dim dataFlowAnalysis = analysis.Item2 Assert.Equal(0, controlFlowAnalysis.ExitPoints.Count()) Assert.Equal(0, controlFlowAnalysis.EntryPoints.Count()) Assert.Equal("x", GetSymbolNamesJoined(dataFlowAnalysis.AlwaysAssigned)) Assert.Equal("x, x", GetSymbolNamesJoined(dataFlowAnalysis.WrittenInside)) Assert.Equal("x, x", GetSymbolNamesJoined(dataFlowAnalysis.VariablesDeclared)) Assert.Equal("args", GetSymbolNamesJoined(dataFlowAnalysis.DefinitelyAssignedOnEntry)) Assert.Equal("args, x", GetSymbolNamesJoined(dataFlowAnalysis.DefinitelyAssignedOnExit)) Assert.True(controlFlowAnalysis.EndPointIsReachable) End Sub <Fact()> Public Sub TestVariablesWithSameName2() Dim analysis = CompileAndAnalyzeControlAndDataFlow( <compilation name="TestVariablesWithSameName2"> <file name="a.b"> Module Program Sub Main(args As String()) Dim b As Boolean = false [|If b Then Dim x = 1 Else Dim x = 1 |] End Sub End Module </file> </compilation>) Dim controlFlowAnalysis = analysis.Item1 Dim dataFlowAnalysis = analysis.Item2 Assert.Equal(0, controlFlowAnalysis.ExitPoints.Count()) Assert.Equal(0, controlFlowAnalysis.EntryPoints.Count()) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowAnalysis.AlwaysAssigned)) Assert.Equal("x, x", GetSymbolNamesJoined(dataFlowAnalysis.WrittenInside)) Assert.Equal("x, x", GetSymbolNamesJoined(dataFlowAnalysis.VariablesDeclared)) Assert.Equal("args, b", GetSymbolNamesJoined(dataFlowAnalysis.DefinitelyAssignedOnEntry)) Assert.Equal("args, b", GetSymbolNamesJoined(dataFlowAnalysis.DefinitelyAssignedOnExit)) Assert.True(controlFlowAnalysis.EndPointIsReachable) End Sub <WorkItem(540454, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/540454")> <Fact()> Public Sub TestDataFlowAnalysisWithErrorsInStaticContext() Dim analysis = CompileAndAnalyzeControlAndDataFlow( <compilation name="TestDataFlowAnalysisWithErrorsInStaticContext"> <file name="a.b"> Class C Sub Goo() End Sub Shared Sub Bar() [| Goo() |] End Sub End Class </file> </compilation>) Dim dataFlowAnalysis = analysis.Item2 Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowAnalysis.AlwaysAssigned)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowAnalysis.Captured)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowAnalysis.CapturedInside)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowAnalysis.CapturedOutside)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowAnalysis.DataFlowsIn)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowAnalysis.DataFlowsOut)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowAnalysis.DefinitelyAssignedOnEntry)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowAnalysis.DefinitelyAssignedOnExit)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowAnalysis.ReadInside)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowAnalysis.ReadOutside)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowAnalysis.VariablesDeclared)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowAnalysis.WrittenInside)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowAnalysis.WrittenOutside)) End Sub <Fact()> Public Sub TestImplicitReturnVariable() Dim analysis = CompileAndAnalyzeControlAndDataFlow( <compilation name="TestImplicitReturnVariable"> <file name="a.b"> Module Program Function Goo() As Integer [| Goo = 1 |] End Function End Module </file> </compilation>) Dim controlFlowAnalysis = analysis.Item1 Dim dataFlowAnalysis = analysis.Item2 Assert.Equal(0, controlFlowAnalysis.ExitPoints.Count()) Assert.Equal(0, controlFlowAnalysis.EntryPoints.Count()) Assert.Equal("Goo", GetSymbolNamesJoined(dataFlowAnalysis.AlwaysAssigned)) Assert.Equal("Goo", GetSymbolNamesJoined(dataFlowAnalysis.WrittenInside)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowAnalysis.VariablesDeclared)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowAnalysis.DefinitelyAssignedOnEntry)) Assert.Equal("Goo", GetSymbolNamesJoined(dataFlowAnalysis.DefinitelyAssignedOnExit)) Assert.True(controlFlowAnalysis.EndPointIsReachable) End Sub <Fact()> Public Sub TestVariablesDeclared01() Dim analysis = CompileAndAnalyzeDataFlow( <compilation name="TestVariablesDeclared01"> <file name="a.b"> class C public sub F(x as integer) dim a as integer [| dim b as integer dim x as integer, y = 1 if true then dim z = "a" end if |] dim c as integer end sub end class</file> </compilation>) Assert.Equal("b, x, y, z", GetSymbolNamesJoined(analysis.VariablesDeclared)) Assert.Equal("Me, x", GetSymbolNamesJoined(analysis.DefinitelyAssignedOnEntry)) Assert.Equal("Me, x, y, z", GetSymbolNamesJoined(analysis.DefinitelyAssignedOnExit)) End Sub <Fact()> Public Sub TestIfElseBranch() Dim analysis = CompileAndAnalyzeDataFlow( <compilation name="TestIfElseBranch"> <file name="a.b"> Imports System Module Program Function Goo() As Integer Dim x, y, z [| If True x = 1 ElseIf True y = 1 Else z = 1 End If |] Console.WriteLine(x + y + z) End Function End Module </file> </compilation>) Assert.Equal(Nothing, GetSymbolNamesJoined(analysis.VariablesDeclared)) Assert.Equal("x", GetSymbolNamesJoined(analysis.AlwaysAssigned)) Assert.Equal("x", GetSymbolNamesJoined(analysis.DataFlowsOut)) Assert.Equal(Nothing, GetSymbolNamesJoined(analysis.DefinitelyAssignedOnEntry)) Assert.Equal("x", GetSymbolNamesJoined(analysis.DefinitelyAssignedOnExit)) End Sub <Fact()> Public Sub TestIfElseBranch_() Dim analysis = CompileAndAnalyzeDataFlow( <compilation name="TestIfElseBranch"> <file name="a.b"> Imports System Module Program Function Goo() As Integer Dim x, y, z Dim b As Boolean = True [| If b x = 1 ElseIf b y = 1 Else z = 1 End If |] Console.WriteLine(x + y + z) End Function End Module </file> </compilation>) Assert.Equal(Nothing, GetSymbolNamesJoined(analysis.VariablesDeclared)) Assert.Equal(Nothing, GetSymbolNamesJoined(analysis.AlwaysAssigned)) Assert.Equal("x, y, z", GetSymbolNamesJoined(analysis.DataFlowsOut)) Assert.Equal("b", GetSymbolNamesJoined(analysis.DefinitelyAssignedOnEntry)) Assert.Equal("b", GetSymbolNamesJoined(analysis.DefinitelyAssignedOnExit)) End Sub <Fact()> Public Sub TestIfElseBranchReachability01() Dim analysis = CompileAndAnalyzeControlFlow( <compilation name="TestIfElseBranchReachability01"> <file name="a.b"> Imports System Module Program Function Goo() As Integer Dim x, y If True Then x = 1 Else If True Then Return 1 Else [|Return 1|] Return x + y End Function End Module </file> </compilation>) Assert.Equal(1, analysis.ExitPoints.Count()) Assert.Equal(0, analysis.EntryPoints.Count()) Assert.False(analysis.StartPointIsReachable()) Assert.False(analysis.EndPointIsReachable()) End Sub <Fact()> Public Sub TestIfElseBranchReachability02() Dim analysis = CompileAndAnalyzeControlFlow( <compilation name="TestIfElseBranchReachability02"> <file name="a.b"> Imports System Module Program Function Goo() As Integer Dim x, y If True Then x = 1 Else [|If True Then Return 1 Else Return 1|] Return x + y End Function End Module </file> </compilation>) Assert.Equal(2, analysis.ExitPoints.Count()) Assert.Equal(0, analysis.EntryPoints.Count()) Assert.False(analysis.StartPointIsReachable()) Assert.False(analysis.EndPointIsReachable()) End Sub <Fact()> Public Sub TestIfElseBranchReachability03() Dim analysis = CompileAndAnalyzeControlFlow( <compilation name="TestIfElseBranchReachability03"> <file name="a.b"> Imports System Module Program Function Goo() As Integer Dim x, y [|If True Then x = 1 Else If True Then Return 1 Else Return 1|] Return x + y End Function End Module </file> </compilation>) Assert.Equal(2, analysis.ExitPoints.Count()) Assert.Equal(0, analysis.EntryPoints.Count()) Assert.True(analysis.StartPointIsReachable()) Assert.True(analysis.EndPointIsReachable()) End Sub <Fact()> Public Sub TestIfElseBranch01() Dim analysis = CompileAndAnalyzeDataFlow( <compilation name="TestIfElseBranch01"> <file name="a.b"> Imports System Module Program Function Goo() As Integer Dim x, y [|If True Then x = 1 Else y = 1|] Dim z = x + y End Function End Module </file> </compilation>) Assert.Equal("x", GetSymbolNamesJoined(analysis.AlwaysAssigned)) Assert.Equal(Nothing, GetSymbolNamesJoined(analysis.DataFlowsIn)) Assert.Equal("x", GetSymbolNamesJoined(analysis.DataFlowsOut)) Assert.Equal(Nothing, GetSymbolNamesJoined(analysis.DefinitelyAssignedOnEntry)) Assert.Equal("x", GetSymbolNamesJoined(analysis.DefinitelyAssignedOnExit)) Assert.Equal(Nothing, GetSymbolNamesJoined(analysis.ReadInside)) Assert.Equal("x, y", GetSymbolNamesJoined(analysis.WrittenInside)) End Sub <Fact()> Public Sub TestIfElseBranch01_() Dim analysis = CompileAndAnalyzeDataFlow( <compilation name="TestIfElseBranch01"> <file name="a.b"> Imports System Module Program Function Goo() As Integer Dim b As Boolean = True Dim x, y [|If b Then x = 1 Else y = 1|] Dim z = x + y End Function End Module </file> </compilation>) Assert.Equal(Nothing, GetSymbolNamesJoined(analysis.AlwaysAssigned)) Assert.Equal("b", GetSymbolNamesJoined(analysis.DataFlowsIn)) Assert.Equal("x, y", GetSymbolNamesJoined(analysis.DataFlowsOut)) Assert.Equal("b", GetSymbolNamesJoined(analysis.DefinitelyAssignedOnEntry)) Assert.Equal("b", GetSymbolNamesJoined(analysis.DefinitelyAssignedOnExit)) Assert.Equal("b", GetSymbolNamesJoined(analysis.ReadInside)) Assert.Equal("x, y", GetSymbolNamesJoined(analysis.WrittenInside)) End Sub <Fact()> Public Sub TestIfElseBranch02() Dim analysis = CompileAndAnalyzeDataFlow( <compilation name="TestIfElseBranch02"> <file name="a.b"> Imports System Module Program Function Goo() As Integer Dim x, y If True Then [|x = 1|] Else y = 1 Dim z = x + y End Function End Module </file> </compilation>) Assert.Equal("x", GetSymbolNamesJoined(analysis.AlwaysAssigned)) Assert.Equal(Nothing, GetSymbolNamesJoined(analysis.DataFlowsIn)) Assert.Equal("x", GetSymbolNamesJoined(analysis.DataFlowsOut)) Assert.Equal(Nothing, GetSymbolNamesJoined(analysis.DefinitelyAssignedOnEntry)) Assert.Equal("x", GetSymbolNamesJoined(analysis.DefinitelyAssignedOnExit)) Assert.Equal(Nothing, GetSymbolNamesJoined(analysis.ReadInside)) Assert.Equal("x", GetSymbolNamesJoined(analysis.WrittenInside)) End Sub <Fact()> Public Sub TestIfElseBranch03() Dim analysis = CompileAndAnalyzeDataFlow( <compilation name="TestIfElseBranch03"> <file name="a.b"> Imports System Module Program Function Goo() As Integer Dim x, y, z If True Then x = 1 Else [|y = 1|] Dim z = x + y End Function End Module </file> </compilation>) Assert.Equal("y", GetSymbolNamesJoined(analysis.AlwaysAssigned)) Assert.Equal(Nothing, GetSymbolNamesJoined(analysis.DataFlowsIn)) Assert.Equal(Nothing, GetSymbolNamesJoined(analysis.DataFlowsOut)) '' else clause is unreachable Assert.Equal(Nothing, GetSymbolNamesJoined(analysis.DefinitelyAssignedOnEntry)) Assert.Equal(Nothing, GetSymbolNamesJoined(analysis.DefinitelyAssignedOnExit)) Assert.Equal(Nothing, GetSymbolNamesJoined(analysis.ReadInside)) Assert.Equal("y", GetSymbolNamesJoined(analysis.WrittenInside)) End Sub <Fact()> Public Sub TestIfElseBranch03_() Dim analysis = CompileAndAnalyzeDataFlow( <compilation name="TestIfElseBranch03"> <file name="a.b"> Imports System Module Program Function Goo() As Integer Dim b As Boolean = True Dim x, y, z If b Then x = 1 Else [|y = 1|] Dim z = x + y End Function End Module </file> </compilation>) Assert.Equal("y", GetSymbolNamesJoined(analysis.AlwaysAssigned)) Assert.Equal(Nothing, GetSymbolNamesJoined(analysis.DataFlowsIn)) Assert.Equal("y", GetSymbolNamesJoined(analysis.DataFlowsOut)) Assert.Equal("b", GetSymbolNamesJoined(analysis.DefinitelyAssignedOnEntry)) Assert.Equal("b, y", GetSymbolNamesJoined(analysis.DefinitelyAssignedOnExit)) Assert.Equal(Nothing, GetSymbolNamesJoined(analysis.ReadInside)) Assert.Equal("y", GetSymbolNamesJoined(analysis.WrittenInside)) End Sub <Fact()> Public Sub TestIfElseBranch04() Dim analysis = CompileAndAnalyzeDataFlow( <compilation name="TestIfElseBranch04"> <file name="a.b"> Imports System Module Program Function Goo() As Integer Dim x, y, z If True Then x = 1 Else If True Then y = 1 Else [|z = 1|] Dim zz = z + x + y End Function End Module </file> </compilation>) Assert.Equal("z", GetSymbolNamesJoined(analysis.AlwaysAssigned)) Assert.Equal(Nothing, GetSymbolNamesJoined(analysis.DataFlowsIn)) Assert.Equal(Nothing, GetSymbolNamesJoined(analysis.DataFlowsOut)) '' else clause is unreachable Assert.Equal(Nothing, GetSymbolNamesJoined(analysis.DefinitelyAssignedOnEntry)) Assert.Equal(Nothing, GetSymbolNamesJoined(analysis.DefinitelyAssignedOnExit)) Assert.Equal(Nothing, GetSymbolNamesJoined(analysis.ReadInside)) Assert.Equal("z", GetSymbolNamesJoined(analysis.WrittenInside)) End Sub <Fact()> Public Sub TestIfElseBranch04_() Dim analysis = CompileAndAnalyzeDataFlow( <compilation name="TestIfElseBranch04"> <file name="a.b"> Imports System Module Program Function Goo() As Integer Dim b As Boolean = True Dim x, y, z If b Then x = 1 Else If b Then y = 1 Else [|z = 1|] Dim zz = z + x + y End Function End Module </file> </compilation>) Assert.Equal("z", GetSymbolNamesJoined(analysis.AlwaysAssigned)) Assert.Equal(Nothing, GetSymbolNamesJoined(analysis.DataFlowsIn)) Assert.Equal("z", GetSymbolNamesJoined(analysis.DataFlowsOut)) Assert.Equal("b", GetSymbolNamesJoined(analysis.DefinitelyAssignedOnEntry)) Assert.Equal("b, z", GetSymbolNamesJoined(analysis.DefinitelyAssignedOnExit)) Assert.Equal(Nothing, GetSymbolNamesJoined(analysis.ReadInside)) Assert.Equal("z", GetSymbolNamesJoined(analysis.WrittenInside)) End Sub <Fact()> Public Sub TestIfElseBranch05() Dim analysis = CompileAndAnalyzeDataFlow( <compilation name="TestIfElseBranch05"> <file name="a.b"> Imports System Module Program Function Goo() As Integer Dim x, y, z If True Then x = 1 Else [|If True Then y = 1 Else y = 1|] Dim zz = z + x + y End Function End Module </file> </compilation>) Assert.Equal("y", GetSymbolNamesJoined(analysis.AlwaysAssigned)) Assert.Equal(Nothing, GetSymbolNamesJoined(analysis.DataFlowsIn)) Assert.Equal(Nothing, GetSymbolNamesJoined(analysis.DataFlowsOut)) Assert.Equal(Nothing, GetSymbolNamesJoined(analysis.DefinitelyAssignedOnEntry)) Assert.Equal(Nothing, GetSymbolNamesJoined(analysis.DefinitelyAssignedOnExit)) Assert.Equal(Nothing, GetSymbolNamesJoined(analysis.ReadInside)) Assert.Equal("y", GetSymbolNamesJoined(analysis.WrittenInside)) End Sub <Fact()> Public Sub TestIfElseBranch05_() Dim analysis = CompileAndAnalyzeDataFlow( <compilation name="TestIfElseBranch05"> <file name="a.b"> Imports System Module Program Function Goo() As Integer Dim b As Boolean = True Dim x, y, z If b Then x = 1 Else [|If b Then y = 1 Else y = 1|] Dim zz = z + x + y End Function End Module </file> </compilation>) Assert.Equal("y", GetSymbolNamesJoined(analysis.AlwaysAssigned)) Assert.Equal("b", GetSymbolNamesJoined(analysis.DataFlowsIn)) Assert.Equal("y", GetSymbolNamesJoined(analysis.DataFlowsOut)) Assert.Equal("b", GetSymbolNamesJoined(analysis.DefinitelyAssignedOnEntry)) Assert.Equal("b, y", GetSymbolNamesJoined(analysis.DefinitelyAssignedOnExit)) Assert.Equal("b", GetSymbolNamesJoined(analysis.ReadInside)) Assert.Equal("y", GetSymbolNamesJoined(analysis.WrittenInside)) End Sub <Fact()> Public Sub TestVariablesInitializedWithSelfReference() Dim analysis = CompileAndAnalyzeDataFlow( <compilation name="TestVariablesInitializedWithSelfReference"> <file name="a.b"> class C public sub F(x as integer) [| dim x as integer = x dim y as integer, z as integer = 1 |] end sub end class</file> </compilation>) Assert.Equal("x, y, z", GetSymbolNamesJoined(analysis.VariablesDeclared)) Assert.Equal(Nothing, GetSymbolNamesJoined(analysis.DataFlowsOut)) Assert.Equal(Nothing, GetSymbolNamesJoined(analysis.DataFlowsIn)) Assert.Equal("Me, x", GetSymbolNamesJoined(analysis.DefinitelyAssignedOnEntry)) Assert.Equal("Me, x, x, z", GetSymbolNamesJoined(analysis.DefinitelyAssignedOnExit)) Assert.Equal("x, z", GetSymbolNamesJoined(analysis.AlwaysAssigned)) End Sub <Fact()> Public Sub TestVariablesDeclared02() Dim analysis = CompileAndAnalyzeDataFlow( <compilation name="TestVariablesDeclared02"> <file name="a.b"> class C public sub F(x as integer) [| dim a as integer dim b as integer dim x as integer, y as integer = 1 if true then dim z as string = "a" end if dim c as integer |] end sub end class</file> </compilation>) Assert.Equal("a, b, x, y, z, c", GetSymbolNamesJoined(analysis.VariablesDeclared)) Assert.Equal("Me, x", GetSymbolNamesJoined(analysis.DefinitelyAssignedOnEntry)) Assert.Equal("Me, x, y, z", GetSymbolNamesJoined(analysis.DefinitelyAssignedOnExit)) End Sub <Fact()> Public Sub AlwaysAssignedUnreachable() Dim analysis = CompileAndAnalyzeDataFlow( <compilation name="AlwaysAssignedUnreachable"> <file name="a.b"> class C Public Sub F(x As Integer) [| Dim y As Integer If x = 1 Then y = 2 Return Else y = 3 Throw New Exception End If Dim c As Integer |] End Sub end class</file> </compilation>) Assert.Equal("y", GetSymbolNamesJoined(analysis.AlwaysAssigned)) Assert.Equal("Me, x", GetSymbolNamesJoined(analysis.DefinitelyAssignedOnEntry)) Assert.Equal(Nothing, GetSymbolNamesJoined(analysis.DefinitelyAssignedOnExit)) End Sub <Fact()> Public Sub TestDataFlowLateCall() Dim analysis = CompileAndAnalyzeDataFlow( <compilation name="TestDataFlowLateCall"> <file name="a.b"> Option Strict Off Imports System Imports System.Collections.Generic Imports System.Linq Module Program Sub Main(args As String()) Dim o as object = 1 [| goo(o) |] End Sub Sub goo(x As String) End Sub Sub goo(Byref x As Integer) End Sub End Module </file> </compilation>) Assert.Equal("o", GetSymbolNamesJoined(analysis.DataFlowsIn)) Assert.Equal(Nothing, GetSymbolNamesJoined(analysis.DataFlowsOut)) Assert.Equal("args, o", GetSymbolNamesJoined(analysis.DefinitelyAssignedOnEntry)) Assert.Equal("args, o", GetSymbolNamesJoined(analysis.DefinitelyAssignedOnExit)) Assert.Equal("o", GetSymbolNamesJoined(analysis.ReadInside)) Assert.Equal(Nothing, GetSymbolNamesJoined(analysis.ReadOutside)) Assert.Equal("o", GetSymbolNamesJoined(analysis.WrittenInside)) Assert.Equal("args, o", GetSymbolNamesJoined(analysis.WrittenOutside)) End Sub <Fact()> Public Sub TestDataFlowLateCall001() Dim analysis = CompileAndAnalyzeDataFlow( <compilation name="TestDataFlowLateCall001"> <file name="a.b"> Option Strict Off Imports System Imports System.Collections.Generic Imports System.Linq Class Program shared Sub Main(args As String()) Dim o as object = 1 Dim oo as object = new Program [| oo.goo(o) |] End Sub Sub goo(x As String) End Sub Sub goo(Byref x As Integer) End Sub End Class </file> </compilation>) Assert.Equal("o, oo", GetSymbolNamesJoined(analysis.DataFlowsIn)) Assert.Equal(Nothing, GetSymbolNamesJoined(analysis.DataFlowsOut)) Assert.Equal("args, o, oo", GetSymbolNamesJoined(analysis.DefinitelyAssignedOnEntry)) Assert.Equal("args, o, oo", GetSymbolNamesJoined(analysis.DefinitelyAssignedOnExit)) Assert.Equal("o, oo", GetSymbolNamesJoined(analysis.ReadInside)) Assert.Equal(Nothing, GetSymbolNamesJoined(analysis.ReadOutside)) Assert.Equal("o", GetSymbolNamesJoined(analysis.WrittenInside)) Assert.Equal("args, o, oo", GetSymbolNamesJoined(analysis.WrittenOutside)) End Sub <Fact()> Public Sub TestDataFlowIndex() Dim analysis = CompileAndAnalyzeDataFlow( <compilation name="TestDataFlowsOut01"> <file name="a.b"> Option Strict Off Imports System Imports System.Collections.Generic Imports System.Linq Module Program Sub Main(args As String()) Dim o as object = 1 [| Dim oo = o(o) |] End Sub Sub goo(x As String) End Sub Sub goo(Byref x As Integer) End Sub End Module </file> </compilation>) Assert.Equal("o", GetSymbolNamesJoined(analysis.DataFlowsIn)) Assert.Equal(Nothing, GetSymbolNamesJoined(analysis.DataFlowsOut)) Assert.Equal("args, o", GetSymbolNamesJoined(analysis.DefinitelyAssignedOnEntry)) Assert.Equal("args, o, oo", GetSymbolNamesJoined(analysis.DefinitelyAssignedOnExit)) Assert.Equal("o", GetSymbolNamesJoined(analysis.ReadInside)) Assert.Equal(Nothing, GetSymbolNamesJoined(analysis.ReadOutside)) Assert.Equal("oo", GetSymbolNamesJoined(analysis.WrittenInside)) Assert.Equal("args, o", GetSymbolNamesJoined(analysis.WrittenOutside)) End Sub <Fact()> Public Sub UnassignedVariableFlowsOut01() Dim analysis = CompileAndAnalyzeDataFlow( <compilation name="UnassignedVariableFlowsOut01"> <file name="a.b"> class C public sub F() Dim i as Integer = 10 [| Dim j as Integer = j + i |] Console.Write(i) Console.Write(j) end sub end class</file> </compilation>) Assert.Equal("j", GetSymbolNamesJoined(analysis.VariablesDeclared)) Assert.Equal("i", GetSymbolNamesJoined(analysis.DataFlowsIn)) Assert.Equal("j", GetSymbolNamesJoined(analysis.DataFlowsOut)) Assert.Equal("Me, i", GetSymbolNamesJoined(analysis.DefinitelyAssignedOnEntry)) Assert.Equal("Me, i, j", GetSymbolNamesJoined(analysis.DefinitelyAssignedOnExit)) Assert.Equal("i, j", GetSymbolNamesJoined(analysis.ReadInside)) Assert.Equal("i, j", GetSymbolNamesJoined(analysis.ReadOutside)) Assert.Equal("j", GetSymbolNamesJoined(analysis.WrittenInside)) Assert.Equal("Me, i", GetSymbolNamesJoined(analysis.WrittenOutside)) End Sub <Fact()> Public Sub TestDataFlowsIn01() Dim analysis = CompileAndAnalyzeDataFlow( <compilation name="TestDataFlowsIn01"> <file name="a.b"> class C public sub F(x as integer) dim a as integer = 1, y as integer = 2 [| dim b as integer = a + x + 3 |] dim c as integer = a + 4 + y end sub end class</file> </compilation>) Assert.Equal("x, a", GetSymbolNamesJoined(analysis.DataFlowsIn)) Assert.Equal("Me, x, a, y", GetSymbolNamesJoined(analysis.DefinitelyAssignedOnEntry)) Assert.Equal("Me, x, a, y, b", GetSymbolNamesJoined(analysis.DefinitelyAssignedOnExit)) End Sub <Fact()> Public Sub TestDataFlowsIn02() Dim analysis = CompileAndAnalyzeDataFlow( <compilation name="TestDataFlowsIn02"> <file name="a.b"> class Program sub Test(of T as class, new)(byref t as T) [| dim t1 as T Test(t1) t = t1 |] System.Console.WriteLine(t1.ToString()) end sub end class </file> </compilation>) Assert.Equal("Me", GetSymbolNamesJoined(analysis.DataFlowsIn)) End Sub <Fact()> Public Sub TestDataFlowsIn03() Dim analysis = CompileAndAnalyzeDataFlow( <compilation name="TestDataFlowsIn03"> <file name="a.b"> class Program shared sub Main(args() as string) dim x as integer = 1 dim y as integer = 2 [| dim z as integer = x + y |] end sub end class </file> </compilation>) Assert.Equal("x, y", GetSymbolNamesJoined(analysis.DataFlowsIn)) Assert.Equal("args, x, y", GetSymbolNamesJoined(analysis.DefinitelyAssignedOnEntry)) Assert.Equal("args, x, y, z", GetSymbolNamesJoined(analysis.DefinitelyAssignedOnExit)) End Sub <Fact()> Public Sub TestDataFlowsOut01() Dim analysis = CompileAndAnalyzeDataFlow( <compilation name="TestDataFlowsOut01"> <file name="a.b"> class C public sub F(x as integer) dim a as integer = 1, y as integer [| if x = 1 then x = 2 y = x end if |] dim c as integer = a + 4 + x + y end sub end class</file> </compilation>) Assert.Equal("x, y", GetSymbolNamesJoined(analysis.DataFlowsOut)) Assert.Equal("Me, x, a", GetSymbolNamesJoined(analysis.DefinitelyAssignedOnEntry)) Assert.Equal("Me, x, a", GetSymbolNamesJoined(analysis.DefinitelyAssignedOnExit)) End Sub <Fact()> Public Sub TestDataFlowsOut02() Dim analysis = CompileAndAnalyzeDataFlow( <compilation name="TestDataFlowsOut02"> <file name="a.b"> class Program public sub Test(args() as string) [| dim s as integer = 10, i as integer = 1 dim b as integer = s + i |] System.Console.WriteLine(s) System.Console.WriteLine(i) end sub end class</file> </compilation>) Assert.Equal("s, i", GetSymbolNamesJoined(analysis.DataFlowsOut)) Assert.Equal("Me, args", GetSymbolNamesJoined(analysis.DefinitelyAssignedOnEntry)) Assert.Equal("Me, args, s, i, b", GetSymbolNamesJoined(analysis.DefinitelyAssignedOnExit)) End Sub <Fact()> Public Sub TestDataFlowsOut03() Dim analysis = CompileAndAnalyzeDataFlow( <compilation name="TestDataFlowsOut03"> <file name="a.b"> imports System.Text module Program sub Main() as string dim builder as StringBuilder = new StringBuilder() [| builder.Append("Hello") builder.Append("From") builder.Append("Roslyn") |] return builder.ToString() end sub end module</file> </compilation>) Assert.Equal(Nothing, GetSymbolNamesJoined(analysis.DataFlowsOut)) Assert.Equal("builder", GetSymbolNamesJoined(analysis.DefinitelyAssignedOnEntry)) Assert.Equal("builder", GetSymbolNamesJoined(analysis.DefinitelyAssignedOnExit)) End Sub <Fact()> Public Sub TestDataFlowsOut04() Dim analysisResults = CompileAndAnalyzeControlAndDataFlow( <compilation> <file name="a.b"><![CDATA[ Class C Sub F(ByRef x As Integer) [|x = 12|] End Sub End Class ]]></file> </compilation>) Dim controlFlowAnalysisResults = analysisResults.Item1 Dim dataFlowAnalysisResults = analysisResults.Item2 Assert.Equal(0, controlFlowAnalysisResults.EntryPoints.Count()) Assert.Equal(0, controlFlowAnalysisResults.ExitPoints.Count()) Assert.Equal(True, controlFlowAnalysisResults.StartPointIsReachable) Assert.Equal(True, controlFlowAnalysisResults.EndPointIsReachable) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowAnalysisResults.VariablesDeclared)) Assert.Equal("x", GetSymbolNamesJoined(dataFlowAnalysisResults.AlwaysAssigned)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowAnalysisResults.DataFlowsIn)) Assert.Equal("x", GetSymbolNamesJoined(dataFlowAnalysisResults.DataFlowsOut)) Assert.Equal("Me, x", GetSymbolNamesJoined(dataFlowAnalysisResults.DefinitelyAssignedOnEntry)) Assert.Equal("Me, x", GetSymbolNamesJoined(dataFlowAnalysisResults.DefinitelyAssignedOnExit)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowAnalysisResults.ReadInside)) Assert.Equal("x", GetSymbolNamesJoined(dataFlowAnalysisResults.ReadOutside)) Assert.Equal("x", GetSymbolNamesJoined(dataFlowAnalysisResults.WrittenInside)) Assert.Equal("Me, x", GetSymbolNamesJoined(dataFlowAnalysisResults.WrittenOutside)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowAnalysisResults.Captured)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowAnalysisResults.CapturedInside)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowAnalysisResults.CapturedOutside)) End Sub <Fact()> Public Sub TestDataFlowsOut06() Dim analysisResults = CompileAndAnalyzeControlAndDataFlow( <compilation> <file name="a.b"><![CDATA[ Class C Sub F(b As Boolean) Dim i As Integer = 1 While b [|i = i + 1|] End While End Sub End Class ]]></file> </compilation>) Dim controlFlowAnalysisResults = analysisResults.Item1 Dim dataFlowAnalysisResults = analysisResults.Item2 Assert.Equal(0, controlFlowAnalysisResults.EntryPoints.Count()) Assert.Equal(0, controlFlowAnalysisResults.ExitPoints.Count()) Assert.Equal(True, controlFlowAnalysisResults.StartPointIsReachable) Assert.Equal(True, controlFlowAnalysisResults.EndPointIsReachable) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowAnalysisResults.VariablesDeclared)) Assert.Equal("i", GetSymbolNamesJoined(dataFlowAnalysisResults.AlwaysAssigned)) Assert.Equal("i", GetSymbolNamesJoined(dataFlowAnalysisResults.DataFlowsIn)) Assert.Equal("i", GetSymbolNamesJoined(dataFlowAnalysisResults.DataFlowsOut)) Assert.Equal("Me, b, i", GetSymbolNamesJoined(dataFlowAnalysisResults.DefinitelyAssignedOnEntry)) Assert.Equal("Me, b, i", GetSymbolNamesJoined(dataFlowAnalysisResults.DefinitelyAssignedOnExit)) Assert.Equal("i", GetSymbolNamesJoined(dataFlowAnalysisResults.ReadInside)) Assert.Equal("b", GetSymbolNamesJoined(dataFlowAnalysisResults.ReadOutside)) Assert.Equal("i", GetSymbolNamesJoined(dataFlowAnalysisResults.WrittenInside)) Assert.Equal("Me, b, i", GetSymbolNamesJoined(dataFlowAnalysisResults.WrittenOutside)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowAnalysisResults.Captured)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowAnalysisResults.CapturedInside)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowAnalysisResults.CapturedOutside)) End Sub <Fact()> Public Sub TestDataFlowsOut07() Dim analysis = CompileAndAnalyzeDataFlow( <compilation name="TestDataFlowsOut07"> <file name="a.b"> class Program sub F(b as boolean) dim i as integer [| i = 2 goto [next] |] [next]: dim j as integer = i end sub end class</file> </compilation>) Assert.Equal("i", GetSymbolNamesJoined(analysis.DataFlowsOut)) Assert.Equal("Me, b", GetSymbolNamesJoined(analysis.DefinitelyAssignedOnEntry)) Assert.Equal(Nothing, GetSymbolNamesJoined(analysis.DefinitelyAssignedOnExit)) End Sub <Fact()> Public Sub TestDataFlowsOut08() Dim analysis = CompileAndAnalyzeDataFlow( <compilation name="TestDataFlowsOut08"> <file name="a.b"> Class Program Sub F() Dim i As Integer = 2 Try [| i = 1 |] Finally Dim j As Integer = i End Try End Sub End Class </file> </compilation>) Assert.Equal("i", GetSymbolNamesJoined(analysis.DataFlowsOut)) Assert.Equal("Me, i", GetSymbolNamesJoined(analysis.DefinitelyAssignedOnEntry)) Assert.Equal("Me, i", GetSymbolNamesJoined(analysis.DefinitelyAssignedOnExit)) End Sub <Fact()> Public Sub TestDataFlowsOut09() Dim analysis = CompileAndAnalyzeDataFlow( <compilation name="TestDataFlowsOut09"> <file name="a.b"> class Program sub Test(args() as string) dim i as integer dim s as string [|i = 10 s = args(0) + i.ToString()|] end sub end class</file> </compilation>) Assert.Equal(Nothing, GetSymbolNamesJoined(analysis.DataFlowsOut)) Assert.Equal("Me, args", GetSymbolNamesJoined(analysis.DefinitelyAssignedOnEntry)) Assert.Equal("Me, args, i, s", GetSymbolNamesJoined(analysis.DefinitelyAssignedOnExit)) End Sub <WorkItem(543492, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/543492")> <Fact()> Public Sub MeAndMyBaseReference1() Dim analysis = CompileAndAnalyzeDataFlow( <compilation name="MeIsWrittenOutside1"> <file name="a.b"> Imports System Public Class BaseClass Public Overridable Sub MyMeth() End Sub End Class Public Class MyClass : Inherits BaseClass Public Overrides Sub MyMeth() [|MyBase.MyMeth()|] End Sub End Class </file> </compilation>) Assert.Equal("Me", GetSymbolNamesJoined(analysis.WrittenOutside)) Assert.Equal("Me", GetSymbolNamesJoined(analysis.DataFlowsIn)) Assert.Equal("Me", GetSymbolNamesJoined(analysis.DefinitelyAssignedOnEntry)) Assert.Equal("Me", GetSymbolNamesJoined(analysis.DefinitelyAssignedOnExit)) End Sub <WorkItem(543492, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/543492")> <Fact()> Public Sub MeAndMyBaseReference2() Dim analysis = CompileAndAnalyzeDataFlow( <compilation name="MeIsWrittenOutside2"> <file name="a.b"> Imports System Public Class BaseClass Public Overridable Function MyMeth() As Boolean Return False End Function End Class Public Class MyClass1 : Inherits BaseClass Public Overrides Function MyMeth() As Boolean Return MyBase.MyMeth() End Function Public Sub OtherMeth() Dim f = Function() [|MyBase.MyMeth|] End Sub End Class </file> </compilation>) Assert.Equal("Me, f", GetSymbolNamesJoined(analysis.WrittenOutside)) Assert.Equal("Me", GetSymbolNamesJoined(analysis.DataFlowsIn)) Assert.Equal("Me, f", GetSymbolNamesJoined(analysis.DefinitelyAssignedOnEntry)) Assert.Equal("Me, f", GetSymbolNamesJoined(analysis.DefinitelyAssignedOnExit)) End Sub <Fact()> Public Sub TestDataFlowsOutExpression01() Dim analysis = CompileAndAnalyzeDataFlow( <compilation name="TestDataFlowsOutExpression01"> <file name="a.b"> class C public sub F(x as integer) dim a as integer = 1, y as integer dim tmp as integer = x [| x = 2 y = x |] temp += (a = 2) dim c as integer = a + 4 + x + y end sub end class</file> </compilation>) Assert.Equal("x, y", GetSymbolNamesJoined(analysis.DataFlowsOut)) Assert.Equal("Me, x, a, tmp", GetSymbolNamesJoined(analysis.DefinitelyAssignedOnEntry)) Assert.Equal("Me, x, a, y, tmp", GetSymbolNamesJoined(analysis.DefinitelyAssignedOnExit)) End Sub <Fact()> Public Sub TestAlwaysAssigned01() Dim analysis = CompileAndAnalyzeDataFlow( <compilation name="TestAlwaysAssigned01"> <file name="a.b"> class C public sub F(x as integer) dim a as integer = 1, y as integer= 1 [| if x = 2 then a = 3 else a = 4 end if x = 4 if x = 3 then y = 12 end if |] dim c as integer = a + 4 + y end sub end class</file> </compilation>) Assert.Equal("x, a", GetSymbolNamesJoined(analysis.AlwaysAssigned)) Assert.Equal("Me, x, a, y", GetSymbolNamesJoined(analysis.DefinitelyAssignedOnEntry)) Assert.Equal("Me, x, a, y", GetSymbolNamesJoined(analysis.DefinitelyAssignedOnExit)) End Sub <Fact()> Public Sub TestAlwaysAssigned03() Dim analysis = CompileAndAnalyzeDataFlow( <compilation name="TestAlwaysAssigned03"> <file name="a.b"> module C sub Main(args() as string) dim i as integer = [| int.Parse(args(0).ToString()) |] end sub end module</file> </compilation>) Assert.Equal(Nothing, GetSymbolNamesJoined(analysis.AlwaysAssigned)) End Sub <Fact()> Public Sub TestWrittenInside02() Dim analysis = CompileAndAnalyzeDataFlow( <compilation name="TestWrittenInside02"> <file name="a.b"> module C sub Main(args() as string) dim i as integer = [| int.Parse(args(0).ToString()) |] end sub end module</file> </compilation>) Assert.Equal(Nothing, GetSymbolNamesJoined(analysis.WrittenInside)) Assert.Equal("args", GetSymbolNamesJoined(analysis.DefinitelyAssignedOnEntry)) Assert.Equal("args", GetSymbolNamesJoined(analysis.DefinitelyAssignedOnExit)) End Sub <Fact()> Public Sub TestWrittenInside03() Dim analysis = CompileAndAnalyzeDataFlow( <compilation name="TestWrittenInside03"> <file name="a.b"> module C sub Main(args() as string) dim i as integer i = [| int.Parse(args(0).ToString()) |] end sub end module</file> </compilation>) Assert.Equal(Nothing, GetSymbolNamesJoined(analysis.WrittenInside)) Assert.Equal("args", GetSymbolNamesJoined(analysis.DefinitelyAssignedOnEntry)) Assert.Equal("args", GetSymbolNamesJoined(analysis.DefinitelyAssignedOnExit)) End Sub <Fact()> Public Sub TestAlwaysAssigned04() Dim analysis = CompileAndAnalyzeDataFlow( <compilation name="TestAlwaysAssigned04"> <file name="a.b"> module C sub Main(args() as string) dim i as integer i = [| int.Parse(args(0).ToString()) |] end sub end module</file> </compilation>) Assert.Equal(Nothing, GetSymbolNamesJoined(analysis.AlwaysAssigned)) Assert.Equal("args", GetSymbolNamesJoined(analysis.DefinitelyAssignedOnEntry)) Assert.Equal("args", GetSymbolNamesJoined(analysis.DefinitelyAssignedOnExit)) End Sub <Fact()> Public Sub TestAlwaysAssignedDuplicateVariables() Dim analysis = CompileAndAnalyzeDataFlow( <compilation name="TestAlwaysAssignedDuplicateVariables"> <file name="a.b"> class C public sub F(x as integer) [| dim a, a, b, b as integer b = 1 |] end sub end class</file> </compilation>) Assert.Equal("b", GetSymbolNamesJoined(analysis.AlwaysAssigned)) End Sub <Fact()> Public Sub TestAlwaysAssigned02_LocalConst() Dim analysis = CompileAndAnalyzeDataFlow( <compilation name="TestAlwaysAssigned02"> <file name="a.b"> class C public sub F(x as integer) [| const dim a as integer = 1 |] end sub end class</file> </compilation>) Assert.Equal("a", GetSymbolNamesJoined(analysis.AlwaysAssigned)) Assert.Equal("Me, x", GetSymbolNamesJoined(analysis.DefinitelyAssignedOnEntry)) Assert.Equal("Me, x, a", GetSymbolNamesJoined(analysis.DefinitelyAssignedOnExit)) End Sub <Fact()> Public Sub TestAccessedInsideOutside() Dim analysis = CompileAndAnalyzeDataFlow( <compilation name="TestAccessedInsideOutside"> <file name="a.b"> class C public sub F(x as integer) dim a, b, c, d, e, f, g, h, i as integer a = 1 b = a + x c = a + x [| d = c f = d e = d |] g = e i = g h = g end sub end class</file> </compilation>) Assert.Equal("c, d", GetSymbolNamesJoined(analysis.ReadInside)) Assert.Equal("d, e, f", GetSymbolNamesJoined(analysis.WrittenInside)) Assert.Equal("x, a, e, g", GetSymbolNamesJoined(analysis.ReadOutside)) Assert.Equal("Me, x, a, b, c, g, h, i", GetSymbolNamesJoined(analysis.WrittenOutside)) Assert.Equal("Me, x, a, b, c", GetSymbolNamesJoined(analysis.DefinitelyAssignedOnEntry)) Assert.Equal("Me, x, a, b, c, d, e, f", GetSymbolNamesJoined(analysis.DefinitelyAssignedOnExit)) End Sub <Fact()> Public Sub TestAlwaysAssignedViaPassingAsByRefParameter() Dim analysisResults = CompileAndAnalyzeControlAndDataFlow( <compilation> <file name="a.b"><![CDATA[ Class C Public Sub F(x As Integer) [| Dim a As Integer G(a)|] End Sub Sub G(ByRef x As Integer) x = 1 End Sub End Class ]]></file> </compilation>) Dim controlFlowAnalysisResults = analysisResults.Item1 Dim dataFlowAnalysisResults = analysisResults.Item2 Assert.Equal(0, controlFlowAnalysisResults.EntryPoints.Count()) Assert.Equal(0, controlFlowAnalysisResults.ExitPoints.Count()) Assert.Equal(True, controlFlowAnalysisResults.StartPointIsReachable) Assert.Equal(True, controlFlowAnalysisResults.EndPointIsReachable) Assert.Equal("a", GetSymbolNamesJoined(dataFlowAnalysisResults.VariablesDeclared)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowAnalysisResults.AlwaysAssigned)) Assert.Equal("Me", GetSymbolNamesJoined(dataFlowAnalysisResults.DataFlowsIn)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowAnalysisResults.DataFlowsOut)) Assert.Equal("Me, x", GetSymbolNamesJoined(dataFlowAnalysisResults.DefinitelyAssignedOnEntry)) Assert.Equal("Me, x, a", GetSymbolNamesJoined(dataFlowAnalysisResults.DefinitelyAssignedOnExit)) Assert.Equal("Me, a", GetSymbolNamesJoined(dataFlowAnalysisResults.ReadInside)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowAnalysisResults.ReadOutside)) Assert.Equal("a", GetSymbolNamesJoined(dataFlowAnalysisResults.WrittenInside)) Assert.Equal("Me, x", GetSymbolNamesJoined(dataFlowAnalysisResults.WrittenOutside)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowAnalysisResults.Captured)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowAnalysisResults.CapturedInside)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowAnalysisResults.CapturedOutside)) End Sub <Fact()> Public Sub TestRedimPreserveDataFlow() VerifyReDimDataFlowAnalysis( <![CDATA[ Dim x(2) As Integer [|ReDim Preserve x(3)|] ]]>, alwaysAssigned:={"x"}, captured:={}, dataFlowsIn:={"x"}, dataFlowsOut:={}, definitelyAssignedOnEntry:={"x"}, definitelyAssignedOnExit:={"x"}, readInside:={"x"}, readOutside:={}, variablesDeclared:={}, writtenInside:={"x"}, writtenOutside:={"x"}) End Sub <Fact()> Public Sub TestRedimDataFlow() VerifyReDimDataFlowAnalysis( <![CDATA[ Dim x(2) As Integer [|ReDim x(3)|] x(0) = 1 ]]>, alwaysAssigned:={"x"}, captured:={}, dataFlowsIn:={}, dataFlowsOut:={"x"}, definitelyAssignedOnEntry:={"x"}, definitelyAssignedOnExit:={"x"}, readInside:={}, readOutside:={"x"}, variablesDeclared:={}, writtenInside:={"x"}, writtenOutside:={"x"}) End Sub <WorkItem(542156, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/542156")> <Fact()> Public Sub TestRedimImplicitDataFlow() VerifyReDimDataFlowAnalysis( <![CDATA[ [|ReDim x(3)|] Dim y = x(0) ]]>, alwaysAssigned:={"x"}, captured:={}, dataFlowsIn:={}, dataFlowsOut:={"x"}, definitelyAssignedOnEntry:={}, definitelyAssignedOnExit:={"x"}, readInside:={}, readOutside:={"x"}, variablesDeclared:={}, writtenInside:={"x"}, writtenOutside:={"y"}) End Sub <WorkItem(542156, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/542156")> <Fact()> Public Sub TestRedimMultipleImplicitDataFlow() VerifyReDimDataFlowAnalysis( <![CDATA[ [|ReDim x(3, z), y(4, z)|] y = x System.Console.WriteLine(z) ]]>, alwaysAssigned:={"x", "y"}, captured:={}, dataFlowsIn:={"z"}, dataFlowsOut:={"x"}, definitelyAssignedOnEntry:={}, definitelyAssignedOnExit:={"x", "y"}, readInside:={"z"}, readOutside:={"x", "z"}, variablesDeclared:={}, writtenInside:={"x", "y"}, writtenOutside:={"y"}) End Sub #Region "Ternary Operator" <Fact()> Public Sub TestAlwaysAssignedWithTernaryOperator() Dim analysis = CompileAndAnalyzeDataFlow( <compilation name="TestAlwaysAssignedWithTernaryOperator"> <file name="a.b"> class C public sub F(x as integer) dim ext as External = New External dim a as boolean [|dim c as boolean = if(true,ext.M1(a),ext.M1(a))|] end sub end class </file> </compilation>, s_customIL) Assert.Equal("a, c", GetSymbolNamesJoined(analysis.AlwaysAssigned)) Assert.Equal("Me, x, ext", GetSymbolNamesJoined(analysis.DefinitelyAssignedOnEntry)) Assert.Equal("Me, x, ext, a, c", GetSymbolNamesJoined(analysis.DefinitelyAssignedOnExit)) End Sub <Fact()> Public Sub TestAlwaysAssignedWithTernaryOperator2() Dim analysis = CompileAndAnalyzeDataFlow( <compilation name="TestAlwaysAssignedWithTernaryOperator2"> <file name="a.b"> class C public sub F(x as integer) dim ext as External = New External dim a, b as boolean [|dim c as boolean = if(true,ext.M1(a),ext.M1(b))|] end sub end class </file> </compilation>, s_customIL) Assert.Equal("a, c", GetSymbolNamesJoined(analysis.AlwaysAssigned)) Assert.Equal("Me, x, ext", GetSymbolNamesJoined(analysis.DefinitelyAssignedOnEntry)) Assert.Equal("Me, x, ext, a, c", GetSymbolNamesJoined(analysis.DefinitelyAssignedOnExit)) End Sub <Fact()> Public Sub TestDeclarationWithSelfReferenceAndTernaryOperator() Dim analysisResults = CompileAndAnalyzeControlAndDataFlow( <compilation name="TestDeclarationWithSelfReferenceAndTernaryOperator"> <file name="a.b"> class C shared sub Main() [| dim x as integer = if(true, 1, x) |] end sub end class </file> </compilation>) Dim controlFlowAnalysisResults = analysisResults.Item1 Dim dataFlowAnalysisResults = analysisResults.Item2 Assert.Equal(0, controlFlowAnalysisResults.EntryPoints.Count()) Assert.Equal(0, controlFlowAnalysisResults.ExitPoints.Count()) Assert.True(controlFlowAnalysisResults.StartPointIsReachable) Assert.True(controlFlowAnalysisResults.EndPointIsReachable) Assert.Equal("x", GetSymbolNamesJoined(dataFlowAnalysisResults.VariablesDeclared)) Assert.Equal("x", GetSymbolNamesJoined(dataFlowAnalysisResults.AlwaysAssigned)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowAnalysisResults.DataFlowsIn)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowAnalysisResults.DataFlowsOut)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowAnalysisResults.DefinitelyAssignedOnEntry)) Assert.Equal("x", GetSymbolNamesJoined(dataFlowAnalysisResults.DefinitelyAssignedOnExit)) Assert.Equal("x", GetSymbolNamesJoined(dataFlowAnalysisResults.ReadInside)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowAnalysisResults.ReadOutside)) Assert.Equal("x", GetSymbolNamesJoined(dataFlowAnalysisResults.WrittenInside)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowAnalysisResults.WrittenOutside)) End Sub <Fact()> Public Sub TestDeclarationWithTernaryOperatorAndAssignment() Dim analysisResults = CompileAndAnalyzeControlAndDataFlow( <compilation name="TestDeclarationWithTernaryOperatorAndAssignment"> <file name="a.b"> class C shared sub Main() dim x, y as boolean dim ext as external = new external [| y = if(true, 1, ext.M1(x)) |] end sub end class </file> </compilation>, s_customIL) Dim controlFlowAnalysisResults = analysisResults.Item1 Dim dataFlowAnalysisResults = analysisResults.Item2 Assert.Equal(0, controlFlowAnalysisResults.EntryPoints.Count()) Assert.Equal(0, controlFlowAnalysisResults.ExitPoints.Count()) Assert.True(controlFlowAnalysisResults.StartPointIsReachable) Assert.True(controlFlowAnalysisResults.EndPointIsReachable) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowAnalysisResults.VariablesDeclared)) Assert.Equal("y", GetSymbolNamesJoined(dataFlowAnalysisResults.AlwaysAssigned)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowAnalysisResults.DataFlowsIn)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowAnalysisResults.DataFlowsOut)) Assert.Equal("ext", GetSymbolNamesJoined(dataFlowAnalysisResults.DefinitelyAssignedOnEntry)) Assert.Equal("y, ext", GetSymbolNamesJoined(dataFlowAnalysisResults.DefinitelyAssignedOnExit)) Assert.Equal("ext", GetSymbolNamesJoined(dataFlowAnalysisResults.ReadInside)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowAnalysisResults.ReadOutside)) Assert.Equal("x, y", GetSymbolNamesJoined(dataFlowAnalysisResults.WrittenInside)) Assert.Equal("ext", GetSymbolNamesJoined(dataFlowAnalysisResults.WrittenOutside)) End Sub <Fact()> Public Sub TestTernaryExpressionWithAssignments() Dim analysisResults = CompileAndAnalyzeControlAndDataFlow( <compilation name="TestTernaryExpressionWithAssignments"> <file name="a.b"> class C shared sub Main() dim x as boolean = true dim y as integer [| dim z as integer y = if(x, 1, 2) z = y |] y.ToString() end sub end class </file> </compilation>) Dim dataFlowAnalysisResults = analysisResults.Item2 Assert.Equal("z", GetSymbolNamesJoined(dataFlowAnalysisResults.VariablesDeclared)) Assert.Equal("y, z", GetSymbolNamesJoined(dataFlowAnalysisResults.AlwaysAssigned)) Assert.Equal("x", GetSymbolNamesJoined(dataFlowAnalysisResults.DataFlowsIn)) Assert.Equal("y", GetSymbolNamesJoined(dataFlowAnalysisResults.DataFlowsOut)) Assert.Equal("x", GetSymbolNamesJoined(dataFlowAnalysisResults.DefinitelyAssignedOnEntry)) Assert.Equal("x, y, z", GetSymbolNamesJoined(dataFlowAnalysisResults.DefinitelyAssignedOnExit)) Assert.Equal("x, y", GetSymbolNamesJoined(dataFlowAnalysisResults.ReadInside)) Assert.Equal("y", GetSymbolNamesJoined(dataFlowAnalysisResults.ReadOutside)) Assert.Equal("y, z", GetSymbolNamesJoined(dataFlowAnalysisResults.WrittenInside)) Assert.Equal("x, y", GetSymbolNamesJoined(dataFlowAnalysisResults.WrittenOutside)) End Sub <Fact()> Public Sub TestBranchOfTernaryOperator() Dim dataFlowAnalysisResults = CompileAndAnalyzeDataFlow( <compilation name="TestBranchOfTernaryOperator"> <file name="a.b"> class C shared sub Main() dim x as boolean = true dim y as boolean = if(x,[|x|],true) end sub end class </file> </compilation>) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowAnalysisResults.VariablesDeclared)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowAnalysisResults.AlwaysAssigned)) Assert.Equal("x", GetSymbolNamesJoined(dataFlowAnalysisResults.DataFlowsIn)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowAnalysisResults.DataFlowsOut)) Assert.Equal("x", GetSymbolNamesJoined(dataFlowAnalysisResults.DefinitelyAssignedOnEntry)) Assert.Equal("x", GetSymbolNamesJoined(dataFlowAnalysisResults.DefinitelyAssignedOnExit)) Assert.Equal("x", GetSymbolNamesJoined(dataFlowAnalysisResults.ReadInside)) Assert.Equal("x", GetSymbolNamesJoined(dataFlowAnalysisResults.ReadOutside)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowAnalysisResults.WrittenInside)) Assert.Equal("x, y", GetSymbolNamesJoined(dataFlowAnalysisResults.WrittenOutside)) End Sub <Fact()> Public Sub TestAssignmentExpressionAsBranchOfTernaryOperator() Dim dataFlowAnalysisResults = CompileAndAnalyzeDataFlow( <compilation> <file name="a.b"> class C shared sub Main() dim x as boolean dim ext as external = new external dim y as boolean = if(true,[|ext.M1(x)|],x) end sub end class </file> </compilation>, s_customIL) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowAnalysisResults.VariablesDeclared)) Assert.Equal("x", GetSymbolNamesJoined(dataFlowAnalysisResults.AlwaysAssigned)) Assert.Equal("ext", GetSymbolNamesJoined(dataFlowAnalysisResults.DataFlowsIn)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowAnalysisResults.DataFlowsOut)) Assert.Equal("ext", GetSymbolNamesJoined(dataFlowAnalysisResults.DefinitelyAssignedOnEntry)) Assert.Equal("x, ext", GetSymbolNamesJoined(dataFlowAnalysisResults.DefinitelyAssignedOnExit)) Assert.Equal("ext", GetSymbolNamesJoined(dataFlowAnalysisResults.ReadInside)) Assert.Equal("x", GetSymbolNamesJoined(dataFlowAnalysisResults.ReadOutside)) Assert.Equal("x", GetSymbolNamesJoined(dataFlowAnalysisResults.WrittenInside)) Assert.Equal("ext, y", GetSymbolNamesJoined(dataFlowAnalysisResults.WrittenOutside)) End Sub <Fact()> Public Sub TestTernaryConditional01() Dim dataFlowAnalysisResults = CompileAndAnalyzeDataFlow( <compilation name="TestTernaryConditional01"> <file name="a.b"> class C shared sub Main() dim x, y, z as boolean dim ext as external = new external dim zz as boolean = if([|ext.M1(x)|],ext.M1(y),ext.M1(z)) end sub end class </file> </compilation>, s_customIL) Assert.Equal("x", GetSymbolNamesJoined(dataFlowAnalysisResults.AlwaysAssigned)) Assert.Equal("ext", GetSymbolNamesJoined(dataFlowAnalysisResults.DataFlowsIn)) Assert.Equal("ext", GetSymbolNamesJoined(dataFlowAnalysisResults.DefinitelyAssignedOnEntry)) Assert.Equal("x, ext", GetSymbolNamesJoined(dataFlowAnalysisResults.DefinitelyAssignedOnExit)) Assert.Equal("ext", GetSymbolNamesJoined(dataFlowAnalysisResults.ReadInside)) Assert.Equal("x", GetSymbolNamesJoined(dataFlowAnalysisResults.WrittenInside)) End Sub <Fact()> Public Sub TestTernaryConditional02() Dim dataFlowAnalysisResults = CompileAndAnalyzeDataFlow( <compilation name="TestTernaryConditional02"> <file name="a.b"> class C shared sub Main() dim x, y, z as boolean dim ext as external = new external dim zz as boolean = if(ext.M1(x),[|ext.M1(y)|],ext.M1(z)) end sub end class </file> </compilation>, s_customIL) Assert.Equal("y", GetSymbolNamesJoined(dataFlowAnalysisResults.AlwaysAssigned)) Assert.Equal("ext", GetSymbolNamesJoined(dataFlowAnalysisResults.DataFlowsIn)) Assert.Equal("x, ext", GetSymbolNamesJoined(dataFlowAnalysisResults.DefinitelyAssignedOnEntry)) Assert.Equal("x, y, ext", GetSymbolNamesJoined(dataFlowAnalysisResults.DefinitelyAssignedOnExit)) Assert.Equal("ext", GetSymbolNamesJoined(dataFlowAnalysisResults.ReadInside)) Assert.Equal("y", GetSymbolNamesJoined(dataFlowAnalysisResults.WrittenInside)) End Sub <Fact()> Public Sub TestTernaryConditional03() Dim dataFlowAnalysisResults = CompileAndAnalyzeDataFlow( <compilation name="TestTernaryConditional03"> <file name="a.b"> class C shared sub Main() dim x, y, z as boolean dim ext as external = new external dim zz as boolean = if(ext.M1(x),ext.M1(y),[|ext.M1(z)|]) end sub end class </file> </compilation>, s_customIL) Assert.Equal("z", GetSymbolNamesJoined(dataFlowAnalysisResults.AlwaysAssigned)) Assert.Equal("ext", GetSymbolNamesJoined(dataFlowAnalysisResults.DataFlowsIn)) Assert.Equal("x, ext", GetSymbolNamesJoined(dataFlowAnalysisResults.DefinitelyAssignedOnEntry)) Assert.Equal("x, z, ext", GetSymbolNamesJoined(dataFlowAnalysisResults.DefinitelyAssignedOnExit)) Assert.Equal("ext", GetSymbolNamesJoined(dataFlowAnalysisResults.ReadInside)) Assert.Equal("z", GetSymbolNamesJoined(dataFlowAnalysisResults.WrittenInside)) End Sub <Fact()> Public Sub TestTernaryConditional04() Dim dataFlowAnalysisResults = CompileAndAnalyzeDataFlow( <compilation name="TestTernaryConditional04"> <file name="a.b"> class C shared sub Main() dim x, y, z as boolean dim ext as external = new external dim zz as boolean = [|if(ext.M1(x),ext.M1(y),ext.M1(z))|] end sub end class </file> </compilation>, s_customIL) Assert.Equal("x", GetSymbolNamesJoined(dataFlowAnalysisResults.AlwaysAssigned)) Assert.Equal("ext", GetSymbolNamesJoined(dataFlowAnalysisResults.DataFlowsIn)) Assert.Equal("ext", GetSymbolNamesJoined(dataFlowAnalysisResults.DefinitelyAssignedOnEntry)) Assert.Equal("x, ext", GetSymbolNamesJoined(dataFlowAnalysisResults.DefinitelyAssignedOnExit)) Assert.Equal("ext", GetSymbolNamesJoined(dataFlowAnalysisResults.ReadInside)) Assert.Equal("x, y, z", GetSymbolNamesJoined(dataFlowAnalysisResults.WrittenInside)) End Sub <Fact()> Public Sub TestTernaryConditional05() Dim dataFlowAnalysisResults = CompileAndAnalyzeDataFlow( <compilation name="TestTernaryConditional05"> <file name="a.b"> class C shared sub Main() dim x, y as boolean dim ext as external = new external dim zz as boolean = [|if(ext.M1(x),ext.M1(y),ext.M1(y))|] end sub end class </file> </compilation>, s_customIL) Assert.Equal("x, y", GetSymbolNamesJoined(dataFlowAnalysisResults.AlwaysAssigned)) Assert.Equal("ext", GetSymbolNamesJoined(dataFlowAnalysisResults.DataFlowsIn)) Assert.Equal("ext", GetSymbolNamesJoined(dataFlowAnalysisResults.DefinitelyAssignedOnEntry)) Assert.Equal("x, y, ext", GetSymbolNamesJoined(dataFlowAnalysisResults.DefinitelyAssignedOnExit)) Assert.Equal("ext", GetSymbolNamesJoined(dataFlowAnalysisResults.ReadInside)) Assert.Equal("x, y", GetSymbolNamesJoined(dataFlowAnalysisResults.WrittenInside)) End Sub #End Region <Fact()> Public Sub TestDeclarationWithSelfReference() Dim analysisResults = CompileAndAnalyzeControlAndDataFlow( <compilation name="TestDeclarationWithSelfReference"> <file name="a.b"> class C shared sub Main() [| dim x as integer = x |] end sub end class </file> </compilation>) Dim controlFlowAnalysisResults = analysisResults.Item1 Dim dataFlowAnalysisResults = analysisResults.Item2 Assert.Equal(0, controlFlowAnalysisResults.EntryPoints.Count()) Assert.Equal(0, controlFlowAnalysisResults.ExitPoints.Count()) Assert.True(controlFlowAnalysisResults.StartPointIsReachable) Assert.True(controlFlowAnalysisResults.EndPointIsReachable) Assert.Equal("x", GetSymbolNamesJoined(dataFlowAnalysisResults.VariablesDeclared)) Assert.Equal("x", GetSymbolNamesJoined(dataFlowAnalysisResults.AlwaysAssigned)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowAnalysisResults.DataFlowsIn)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowAnalysisResults.DataFlowsOut)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowAnalysisResults.DefinitelyAssignedOnEntry)) Assert.Equal("x", GetSymbolNamesJoined(dataFlowAnalysisResults.DefinitelyAssignedOnExit)) Assert.Equal("x", GetSymbolNamesJoined(dataFlowAnalysisResults.ReadInside)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowAnalysisResults.ReadOutside)) Assert.Equal("x", GetSymbolNamesJoined(dataFlowAnalysisResults.WrittenInside)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowAnalysisResults.WrittenOutside)) End Sub <Fact()> Public Sub TestIfStatementWithAssignments() Dim analysisResults = CompileAndAnalyzeControlAndDataFlow( <compilation name="TestIfStatementWithAssignments"> <file name="a.b"> class C shared sub Main() dim x as boolean = true dim y as integer [| if x then y = 1 else y = 2 end if |] y.ToString() end sub end class </file> </compilation>) Dim controlFlowAnalysisResults = analysisResults.Item1 Dim dataFlowAnalysisResults = analysisResults.Item2 Assert.Equal(0, controlFlowAnalysisResults.EntryPoints.Count()) Assert.Equal(0, controlFlowAnalysisResults.ExitPoints.Count()) Assert.True(controlFlowAnalysisResults.StartPointIsReachable) Assert.True(controlFlowAnalysisResults.EndPointIsReachable) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowAnalysisResults.VariablesDeclared)) Assert.Equal("y", GetSymbolNamesJoined(dataFlowAnalysisResults.AlwaysAssigned)) Assert.Equal("x", GetSymbolNamesJoined(dataFlowAnalysisResults.DataFlowsIn)) Assert.Equal("y", GetSymbolNamesJoined(dataFlowAnalysisResults.DataFlowsOut)) Assert.Equal("x", GetSymbolNamesJoined(dataFlowAnalysisResults.DefinitelyAssignedOnEntry)) Assert.Equal("x, y", GetSymbolNamesJoined(dataFlowAnalysisResults.DefinitelyAssignedOnExit)) Assert.Equal("x", GetSymbolNamesJoined(dataFlowAnalysisResults.ReadInside)) Assert.Equal("y", GetSymbolNamesJoined(dataFlowAnalysisResults.ReadOutside)) Assert.Equal("y", GetSymbolNamesJoined(dataFlowAnalysisResults.WrittenInside)) Assert.Equal("x, y", GetSymbolNamesJoined(dataFlowAnalysisResults.WrittenOutside)) End Sub <Fact()> Public Sub TestIfStatementWithConstantCondition() Dim analysisResults = CompileAndAnalyzeControlAndDataFlow( <compilation name="TestIfStatementWithConstantCondition"> <file name="a.b"> class C shared sub Main() dim x as boolean = true dim y as integer [| if true then y = x end if |] y.ToString() end sub end class </file> </compilation>) Dim controlFlowAnalysisResults = analysisResults.Item1 Dim dataFlowAnalysisResults = analysisResults.Item2 Assert.Equal(0, controlFlowAnalysisResults.EntryPoints.Count()) Assert.Equal(0, controlFlowAnalysisResults.ExitPoints.Count()) Assert.True(controlFlowAnalysisResults.StartPointIsReachable) Assert.True(controlFlowAnalysisResults.EndPointIsReachable) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowAnalysisResults.VariablesDeclared)) Assert.Equal("y", GetSymbolNamesJoined(dataFlowAnalysisResults.AlwaysAssigned)) Assert.Equal("x", GetSymbolNamesJoined(dataFlowAnalysisResults.DataFlowsIn)) Assert.Equal("y", GetSymbolNamesJoined(dataFlowAnalysisResults.DataFlowsOut)) Assert.Equal("x", GetSymbolNamesJoined(dataFlowAnalysisResults.DefinitelyAssignedOnEntry)) Assert.Equal("x, y", GetSymbolNamesJoined(dataFlowAnalysisResults.DefinitelyAssignedOnExit)) Assert.Equal("x", GetSymbolNamesJoined(dataFlowAnalysisResults.ReadInside)) Assert.Equal("y", GetSymbolNamesJoined(dataFlowAnalysisResults.ReadOutside)) Assert.Equal("y", GetSymbolNamesJoined(dataFlowAnalysisResults.WrittenInside)) Assert.Equal("x, y", GetSymbolNamesJoined(dataFlowAnalysisResults.WrittenOutside)) End Sub <Fact()> Public Sub TestIfStatementWithNonConstantCondition() Dim analysisResults = CompileAndAnalyzeControlAndDataFlow( <compilation name="TestIfStatementWithNonConstantCondition"> <file name="a.b"> class C shared sub Main() dim x as boolean = true dim y as integer [| if true or x then y = x end if |] y.ToString() end sub end class </file> </compilation>) Dim controlFlowAnalysisResults = analysisResults.Item1 Dim dataFlowAnalysisResults = analysisResults.Item2 Assert.Equal(0, controlFlowAnalysisResults.EntryPoints.Count()) Assert.Equal(0, controlFlowAnalysisResults.ExitPoints.Count()) Assert.True(controlFlowAnalysisResults.StartPointIsReachable) Assert.True(controlFlowAnalysisResults.EndPointIsReachable) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowAnalysisResults.VariablesDeclared)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowAnalysisResults.AlwaysAssigned)) Assert.Equal("x", GetSymbolNamesJoined(dataFlowAnalysisResults.DataFlowsIn)) Assert.Equal("y", GetSymbolNamesJoined(dataFlowAnalysisResults.DataFlowsOut)) Assert.Equal("x", GetSymbolNamesJoined(dataFlowAnalysisResults.DefinitelyAssignedOnEntry)) Assert.Equal("x", GetSymbolNamesJoined(dataFlowAnalysisResults.DefinitelyAssignedOnExit)) Assert.Equal("x", GetSymbolNamesJoined(dataFlowAnalysisResults.ReadInside)) Assert.Equal("y", GetSymbolNamesJoined(dataFlowAnalysisResults.ReadOutside)) Assert.Equal("y", GetSymbolNamesJoined(dataFlowAnalysisResults.WrittenInside)) Assert.Equal("x, y", GetSymbolNamesJoined(dataFlowAnalysisResults.WrittenOutside)) End Sub <Fact()> Public Sub TestSingleVariableSelection() Dim dataFlowAnalysisResults = CompileAndAnalyzeDataFlow( <compilation name="TestSingleVariableSelection"> <file name="a.b"> class C shared sub Main() dim x as boolean = true dim y as boolean = x or [| x |] end sub end class </file> </compilation>) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowAnalysisResults.VariablesDeclared)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowAnalysisResults.AlwaysAssigned)) Assert.Equal("x", GetSymbolNamesJoined(dataFlowAnalysisResults.DataFlowsIn)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowAnalysisResults.DataFlowsOut)) Assert.Equal("x", GetSymbolNamesJoined(dataFlowAnalysisResults.DefinitelyAssignedOnEntry)) Assert.Equal("x", GetSymbolNamesJoined(dataFlowAnalysisResults.DefinitelyAssignedOnExit)) Assert.Equal("x", GetSymbolNamesJoined(dataFlowAnalysisResults.ReadInside)) Assert.Equal("x", GetSymbolNamesJoined(dataFlowAnalysisResults.ReadOutside)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowAnalysisResults.WrittenInside)) Assert.Equal("x, y", GetSymbolNamesJoined(dataFlowAnalysisResults.WrittenOutside)) End Sub <Fact()> Public Sub TestParenthesizedExpressionSelection() Dim dataFlowAnalysisResults = CompileAndAnalyzeDataFlow( <compilation name="TestParenthesizedExpressionSelection"> <file name="a.b"> class C shared sub Main() dim x as boolean = true dim y as boolean = x or [|(x = x) |] orelse x end sub end class </file> </compilation>) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowAnalysisResults.VariablesDeclared)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowAnalysisResults.AlwaysAssigned)) ' In C# '=' is an assignment while in VB it is a comparison. Assert.Equal("x", GetSymbolNamesJoined(dataFlowAnalysisResults.DataFlowsIn)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowAnalysisResults.DataFlowsOut)) 'C# flows out because this is an assignment expression. In VB this is an equality test. Assert.Equal("x", GetSymbolNamesJoined(dataFlowAnalysisResults.DefinitelyAssignedOnEntry)) Assert.Equal("x", GetSymbolNamesJoined(dataFlowAnalysisResults.DefinitelyAssignedOnExit)) Assert.Equal("x", GetSymbolNamesJoined(dataFlowAnalysisResults.ReadInside)) Assert.Equal("x", GetSymbolNamesJoined(dataFlowAnalysisResults.ReadOutside)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowAnalysisResults.WrittenInside)) 'C# this is an assignment. In VB, this is a comparison so no assignment. Assert.Equal("x, y", GetSymbolNamesJoined(dataFlowAnalysisResults.WrittenOutside)) End Sub <Fact()> Public Sub TestRefArgumentSelection() Dim analysisResults = CompileAndAnalyzeControlAndDataFlow( <compilation name="TestRefArgumentSelection"> <file name="a.b"> class C shared sub Main() dim x as integer = 0 [| Goo( x ) |] System.Console.WriteLine(x) end sub shared sub Goo(byref x as integer) end sub end class </file> </compilation>) Dim controlFlowAnalysisResults = analysisResults.Item1 Dim dataFlowAnalysisResults = analysisResults.Item2 Assert.Equal(0, controlFlowAnalysisResults.EntryPoints.Count()) Assert.Equal(0, controlFlowAnalysisResults.ExitPoints.Count()) Assert.True(controlFlowAnalysisResults.StartPointIsReachable) Assert.True(controlFlowAnalysisResults.EndPointIsReachable) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowAnalysisResults.VariablesDeclared)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowAnalysisResults.AlwaysAssigned)) Assert.Equal("x", GetSymbolNamesJoined(dataFlowAnalysisResults.DataFlowsIn)) Assert.Equal("x", GetSymbolNamesJoined(dataFlowAnalysisResults.DataFlowsOut)) Assert.Equal("x", GetSymbolNamesJoined(dataFlowAnalysisResults.DefinitelyAssignedOnEntry)) Assert.Equal("x", GetSymbolNamesJoined(dataFlowAnalysisResults.DefinitelyAssignedOnExit)) Assert.Equal("x", GetSymbolNamesJoined(dataFlowAnalysisResults.ReadInside)) Assert.Equal("x", GetSymbolNamesJoined(dataFlowAnalysisResults.ReadOutside)) Assert.Equal("x", GetSymbolNamesJoined(dataFlowAnalysisResults.WrittenInside)) Assert.Equal("x", GetSymbolNamesJoined(dataFlowAnalysisResults.WrittenOutside)) End Sub <WorkItem(541891, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/541891")> <Fact()> Public Sub TestRefArgumentSelection02() Dim dataFlowAnalysisResults = CompileAndAnalyzeDataFlow( <compilation name="TestRefArgumentSelection02"> <file name="a.b"> class C Sub Main() Dim x As UInteger System.Console.WriteLine([|Goo(x)|]) End Sub Function Goo(ByRef x As ULong) x = 123 Return x + 1 End Function end class </file> </compilation>) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowAnalysisResults.VariablesDeclared)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowAnalysisResults.AlwaysAssigned)) Assert.Equal("Me, x", GetSymbolNamesJoined(dataFlowAnalysisResults.DataFlowsIn)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowAnalysisResults.DataFlowsOut)) Assert.Equal("Me", GetSymbolNamesJoined(dataFlowAnalysisResults.DefinitelyAssignedOnEntry)) Assert.Equal("Me, x", GetSymbolNamesJoined(dataFlowAnalysisResults.DefinitelyAssignedOnExit)) Assert.Equal("Me, x", GetSymbolNamesJoined(dataFlowAnalysisResults.ReadInside)) Assert.Equal("x", GetSymbolNamesJoined(dataFlowAnalysisResults.WrittenInside)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowAnalysisResults.ReadOutside)) Assert.Equal("Me", GetSymbolNamesJoined(dataFlowAnalysisResults.WrittenOutside)) End Sub <WorkItem(541891, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/541891")> <Fact()> Public Sub TestRefArgumentSelection02a() Dim dataFlowAnalysisResults = CompileAndAnalyzeDataFlow( <compilation name="TestRefArgumentSelection02"> <file name="a.b"> class C Sub Main() Dim x As UInteger System.Console.WriteLine(Goo([|x|])) End Sub Function Goo(ByRef x As ULong) x = 123 Return x + 1 End Function end class </file> </compilation>) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowAnalysisResults.VariablesDeclared)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowAnalysisResults.AlwaysAssigned)) Assert.Equal("x", GetSymbolNamesJoined(dataFlowAnalysisResults.DataFlowsIn)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowAnalysisResults.DataFlowsOut)) Assert.Equal("Me", GetSymbolNamesJoined(dataFlowAnalysisResults.DefinitelyAssignedOnEntry)) Assert.Equal("Me", GetSymbolNamesJoined(dataFlowAnalysisResults.DefinitelyAssignedOnExit)) Assert.Equal("x", GetSymbolNamesJoined(dataFlowAnalysisResults.ReadInside)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowAnalysisResults.WrittenInside)) Assert.Equal("Me", GetSymbolNamesJoined(dataFlowAnalysisResults.ReadOutside)) Assert.Equal("Me, x", GetSymbolNamesJoined(dataFlowAnalysisResults.WrittenOutside)) End Sub <Fact()> Public Sub TestCompoundAssignmentTargetSelection01() Dim dataFlowAnalysisResults = CompileAndAnalyzeDataFlow( <compilation name="TestCompoundAssignmentTargetSelection01"> <file name="a.b"> class C Sub Main() Dim x As String = "" [|x|]+=1 End Sub end class </file> </compilation>) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowAnalysisResults.VariablesDeclared)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowAnalysisResults.AlwaysAssigned)) Assert.Equal("x", GetSymbolNamesJoined(dataFlowAnalysisResults.DataFlowsIn)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowAnalysisResults.DataFlowsOut)) Assert.Equal("Me, x", GetSymbolNamesJoined(dataFlowAnalysisResults.DefinitelyAssignedOnEntry)) Assert.Equal("Me, x", GetSymbolNamesJoined(dataFlowAnalysisResults.DefinitelyAssignedOnExit)) Assert.Equal("x", GetSymbolNamesJoined(dataFlowAnalysisResults.ReadInside)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowAnalysisResults.WrittenInside)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowAnalysisResults.ReadOutside)) Assert.Equal("Me, x", GetSymbolNamesJoined(dataFlowAnalysisResults.WrittenOutside)) End Sub <Fact()> Public Sub TestCompoundAssignmentTargetSelection02() Dim dataFlowAnalysisResults = CompileAndAnalyzeDataFlow( <compilation name="TestCompoundAssignmentTargetSelection02"> <file name="a.b"> class C Sub Main() Dim x As String = "" [|x+=1|] End Sub end class </file> </compilation>) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowAnalysisResults.VariablesDeclared)) Assert.Equal("x", GetSymbolNamesJoined(dataFlowAnalysisResults.AlwaysAssigned)) Assert.Equal("x", GetSymbolNamesJoined(dataFlowAnalysisResults.DataFlowsIn)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowAnalysisResults.DataFlowsOut)) Assert.Equal("Me, x", GetSymbolNamesJoined(dataFlowAnalysisResults.DefinitelyAssignedOnEntry)) Assert.Equal("Me, x", GetSymbolNamesJoined(dataFlowAnalysisResults.DefinitelyAssignedOnExit)) Assert.Equal("x", GetSymbolNamesJoined(dataFlowAnalysisResults.ReadInside)) Assert.Equal("x", GetSymbolNamesJoined(dataFlowAnalysisResults.WrittenInside)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowAnalysisResults.ReadOutside)) Assert.Equal("Me, x", GetSymbolNamesJoined(dataFlowAnalysisResults.WrittenOutside)) End Sub <Fact()> Public Sub TestCompoundAssignmentTargetSelection03() Dim dataFlowAnalysisResults = CompileAndAnalyzeDataFlow( <compilation name="TestCompoundAssignmentTargetSelection03"> <file name="a.b"> Imports System Module M1 Sub M(ParamArray ary As Long()) Dim local01 As Integer = 1 Dim local02 As Short = 2 [| local01 ^= local02 Try local02 <<= ary(0) ary(1) *= local01 Dim flocal As Single = 0 flocal /= ary(0) ary(1) \= ary(0) Catch ex As Exception Finally Dim slocal = Nothing slocal &= Nothing End Try |] End Sub End Module </file> </compilation>) Assert.Equal("flocal, ex, slocal", GetSymbolNamesJoined(dataFlowAnalysisResults.VariablesDeclared)) Assert.Equal("local01, slocal", GetSymbolNamesJoined(dataFlowAnalysisResults.AlwaysAssigned)) Assert.Equal("ary, local01, local02", GetSymbolNamesJoined(dataFlowAnalysisResults.DataFlowsIn)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowAnalysisResults.DataFlowsOut)) Assert.Equal("ary, local01, local02", GetSymbolNamesJoined(dataFlowAnalysisResults.DefinitelyAssignedOnEntry)) Assert.Equal("ary, local01, local02, slocal", GetSymbolNamesJoined(dataFlowAnalysisResults.DefinitelyAssignedOnExit)) Assert.Equal("ary, local01, local02, flocal, slocal", GetSymbolNamesJoined(dataFlowAnalysisResults.ReadInside)) Assert.Equal("local01, local02, flocal, ex, slocal", GetSymbolNamesJoined(dataFlowAnalysisResults.WrittenInside)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowAnalysisResults.ReadOutside)) Assert.Equal("ary, local01, local02", GetSymbolNamesJoined(dataFlowAnalysisResults.WrittenOutside)) End Sub <WorkItem(541891, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/541891")> <Fact()> Public Sub TestRefArgumentSelection03() Dim dataFlowAnalysisResults = CompileAndAnalyzeDataFlow( <compilation name="TestRefArgumentSelection03"> <file name="a.b"> class C Sub Main() Dim x As ULong System.Console.WriteLine([|Goo(x)|]) End Sub Function Goo(ByRef x As ULong) x = 123 Return x + 1 End Function end class </file> </compilation>) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowAnalysisResults.VariablesDeclared)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowAnalysisResults.AlwaysAssigned)) Assert.Equal("Me, x", GetSymbolNamesJoined(dataFlowAnalysisResults.DataFlowsIn)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowAnalysisResults.DataFlowsOut)) Assert.Equal("Me", GetSymbolNamesJoined(dataFlowAnalysisResults.DefinitelyAssignedOnEntry)) Assert.Equal("Me, x", GetSymbolNamesJoined(dataFlowAnalysisResults.DefinitelyAssignedOnExit)) Assert.Equal("Me, x", GetSymbolNamesJoined(dataFlowAnalysisResults.ReadInside)) Assert.Equal("x", GetSymbolNamesJoined(dataFlowAnalysisResults.WrittenInside)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowAnalysisResults.ReadOutside)) Assert.Equal("Me", GetSymbolNamesJoined(dataFlowAnalysisResults.WrittenOutside)) End Sub <Fact()> Public Sub TestInvocation() Dim analysisResults = CompileAndAnalyzeControlAndDataFlow( <compilation name="TestInvocation"> <file name="a.b"> class C shared sub Main() dim x as integer = 1, y as integer = 1 [| Goo(x) |] end sub shared sub Goo(int x) end sub end class </file> </compilation>) Dim controlFlowAnalysisResults = analysisResults.Item1 Dim dataFlowAnalysisResults = analysisResults.Item2 Assert.Equal(0, controlFlowAnalysisResults.EntryPoints.Count()) Assert.Equal(0, controlFlowAnalysisResults.ExitPoints.Count()) Assert.True(controlFlowAnalysisResults.StartPointIsReachable) Assert.True(controlFlowAnalysisResults.EndPointIsReachable) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowAnalysisResults.VariablesDeclared)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowAnalysisResults.AlwaysAssigned)) Assert.Equal("x", GetSymbolNamesJoined(dataFlowAnalysisResults.DataFlowsIn)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowAnalysisResults.DataFlowsOut)) Assert.Equal("x, y", GetSymbolNamesJoined(dataFlowAnalysisResults.DefinitelyAssignedOnEntry)) Assert.Equal("x, y", GetSymbolNamesJoined(dataFlowAnalysisResults.DefinitelyAssignedOnExit)) Assert.Equal("x", GetSymbolNamesJoined(dataFlowAnalysisResults.ReadInside)) ' Sees Me beng read Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowAnalysisResults.ReadOutside)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowAnalysisResults.WrittenInside)) Assert.Equal("x, y", GetSymbolNamesJoined(dataFlowAnalysisResults.WrittenOutside)) End Sub <Fact()> Public Sub TestInvocationWithAssignmentInArguments() Dim analysisResults = CompileAndAnalyzeControlAndDataFlow( <compilation name="TestInvocationWithAssignmentInArguments"> <file name="a.b"> class C shared sub Main() dim x as integer = 1, y as integer = 1 [| x = y y = 2 Goo(y, 2) ' VB does not support expression assignment F(x = y, y = 2) |] dim z as integer = x + y } shared sub Goo(int x, int y) end sub } </file> </compilation>) Dim controlFlowAnalysisResults = analysisResults.Item1 Dim dataFlowAnalysisResults = analysisResults.Item2 Assert.Equal(0, controlFlowAnalysisResults.EntryPoints.Count()) Assert.Equal(0, controlFlowAnalysisResults.ExitPoints.Count()) Assert.True(controlFlowAnalysisResults.StartPointIsReachable) Assert.True(controlFlowAnalysisResults.EndPointIsReachable) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowAnalysisResults.VariablesDeclared)) Assert.Equal("x, y", GetSymbolNamesJoined(dataFlowAnalysisResults.AlwaysAssigned)) Assert.Equal("y", GetSymbolNamesJoined(dataFlowAnalysisResults.DataFlowsIn)) Assert.Equal("x, y", GetSymbolNamesJoined(dataFlowAnalysisResults.DataFlowsOut)) Assert.Equal("x, y", GetSymbolNamesJoined(dataFlowAnalysisResults.DefinitelyAssignedOnEntry)) Assert.Equal("x, y", GetSymbolNamesJoined(dataFlowAnalysisResults.DefinitelyAssignedOnExit)) Assert.Equal("y", GetSymbolNamesJoined(dataFlowAnalysisResults.ReadInside)) ' Sees Me being read Assert.Equal("x, y", GetSymbolNamesJoined(dataFlowAnalysisResults.ReadOutside)) Assert.Equal("x, y", GetSymbolNamesJoined(dataFlowAnalysisResults.WrittenInside)) Assert.Equal("x, y, z", GetSymbolNamesJoined(dataFlowAnalysisResults.WrittenOutside)) End Sub <Fact> Public Sub TestArrayInitializer() Dim analysisResults = CompileAndAnalyzeControlAndDataFlow( <compilation> <file name="a.b"><![CDATA[ Class C Sub Main(args As String()) Dim y As Integer = 1 Dim x(,) As Integer x = { { [|y|] } } End Sub End Class ]]></file> </compilation>) Dim controlFlowAnalysisResults = analysisResults.Item1 Dim dataFlowAnalysisResults = analysisResults.Item2 Assert.Equal(0, controlFlowAnalysisResults.EntryPoints.Count()) Assert.Equal(0, controlFlowAnalysisResults.ExitPoints.Count()) Assert.Equal(True, controlFlowAnalysisResults.StartPointIsReachable) Assert.Equal(True, controlFlowAnalysisResults.EndPointIsReachable) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowAnalysisResults.VariablesDeclared)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowAnalysisResults.AlwaysAssigned)) Assert.Equal("y", GetSymbolNamesJoined(dataFlowAnalysisResults.DataFlowsIn)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowAnalysisResults.DataFlowsOut)) Assert.Equal("Me, args, y", GetSymbolNamesJoined(dataFlowAnalysisResults.DefinitelyAssignedOnEntry)) Assert.Equal("Me, args, y", GetSymbolNamesJoined(dataFlowAnalysisResults.DefinitelyAssignedOnExit)) Assert.Equal("y", GetSymbolNamesJoined(dataFlowAnalysisResults.ReadInside)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowAnalysisResults.ReadOutside)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowAnalysisResults.WrittenInside)) Assert.Equal("Me, args, y", GetSymbolNamesJoined(dataFlowAnalysisResults.WrittenOutside)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowAnalysisResults.Captured)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowAnalysisResults.CapturedInside)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowAnalysisResults.CapturedOutside)) End Sub <Fact, WorkItem(538979, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/538979")> Public Sub AssertFromInvalidLocalDeclaration() Dim analysisResults = CompileAndAnalyzeControlAndDataFlow( <compilation name="AssertFromInvalidLocalDeclaration"> <file name="a.b"> Imports System Public Class C Public Shared Function Main() As Integer [| Dim v As Variant = New Byte(2) |] Dim b as Byte = v(0) Return 1 End Function End Class end class </file> </compilation>) Dim controlFlowAnalysisResults = analysisResults.Item1 Dim dataFlowAnalysisResults = analysisResults.Item2 Assert.Equal(0, controlFlowAnalysisResults.EntryPoints.Count()) Assert.Equal(0, controlFlowAnalysisResults.ExitPoints.Count()) Assert.True(controlFlowAnalysisResults.StartPointIsReachable) Assert.True(controlFlowAnalysisResults.EndPointIsReachable) Assert.Equal("v", GetSymbolNamesJoined(dataFlowAnalysisResults.VariablesDeclared)) Assert.Equal("v", GetSymbolNamesJoined(dataFlowAnalysisResults.AlwaysAssigned)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowAnalysisResults.DataFlowsIn)) Assert.Equal("v", GetSymbolNamesJoined(dataFlowAnalysisResults.DataFlowsOut)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowAnalysisResults.DefinitelyAssignedOnEntry)) Assert.Equal("v", GetSymbolNamesJoined(dataFlowAnalysisResults.DefinitelyAssignedOnExit)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowAnalysisResults.ReadInside)) Assert.Equal("v", GetSymbolNamesJoined(dataFlowAnalysisResults.ReadOutside)) Assert.Equal("v", GetSymbolNamesJoined(dataFlowAnalysisResults.WrittenInside)) Assert.Equal("b", GetSymbolNamesJoined(dataFlowAnalysisResults.WrittenOutside)) End Sub <Fact(), WorkItem(538979, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/538979")> Public Sub AssertFromInvalidKeywordAsExpr() Dim analysisResults = CompileAndAnalyzeControlAndDataFlow( <compilation name="AssertFromInvalidKeywordAsExpr"> <file name="a.b"> class B : A public Function M() as float [| return mybase |] End Function end class class A end class </file> </compilation>) Dim controlFlowAnalysisResults = analysisResults.Item1 Dim dataFlowAnalysisResults = analysisResults.Item2 Assert.Equal(0, controlFlowAnalysisResults.EntryPoints.Count()) Assert.Equal(1, controlFlowAnalysisResults.ExitPoints.Count()) Assert.True(controlFlowAnalysisResults.StartPointIsReachable) Assert.False(controlFlowAnalysisResults.EndPointIsReachable) End Sub <WorkItem(539286, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/539286")> <Fact()> Public Sub RegionAnalysisInFieldInitializers_Simple() Dim dataResults1 = CompileAndAnalyzeDataFlow( <compilation name="RegionAnalysisInFieldInitializers_Simple"> <file name="a.b"> Class Class1 Public Shared A As Integer = 10 Public B As Integer = [| 10 + A + Me.F() |] Public Function F() As Integer Return Nothing End Function End Class </file> </compilation>) Assert.Equal(Nothing, GetSymbolNamesJoined(dataResults1.AlwaysAssigned)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataResults1.Captured)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataResults1.CapturedInside)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataResults1.CapturedOutside)) Assert.Equal("Me", GetSymbolNamesJoined(dataResults1.DataFlowsIn)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataResults1.DataFlowsOut)) Assert.Equal("Me", GetSymbolNamesJoined(dataResults1.DefinitelyAssignedOnEntry)) Assert.Equal("Me", GetSymbolNamesJoined(dataResults1.DefinitelyAssignedOnExit)) Assert.Equal("Me", GetSymbolNamesJoined(dataResults1.ReadInside)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataResults1.ReadOutside)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataResults1.WrittenInside)) Assert.Equal("Me", GetSymbolNamesJoined(dataResults1.WrittenOutside)) End Sub <WorkItem(539286, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/539286")> <Fact()> Public Sub RegionAnalysisInPropertyInitializers_Simple() Dim dataResults1 = CompileAndAnalyzeDataFlow( <compilation> <file name="a.b"> Class Class1 Public Shared A As Integer = 10 Public Property B As Integer = [| 10 + A + Me.F() |] Public Function F() As Integer Return Nothing End Function End Class </file> </compilation>) Assert.Equal(Nothing, GetSymbolNamesJoined(dataResults1.AlwaysAssigned)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataResults1.Captured)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataResults1.CapturedInside)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataResults1.CapturedOutside)) Assert.Equal("Me", GetSymbolNamesJoined(dataResults1.DataFlowsIn)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataResults1.DataFlowsOut)) Assert.Equal("Me", GetSymbolNamesJoined(dataResults1.DefinitelyAssignedOnEntry)) Assert.Equal("Me", GetSymbolNamesJoined(dataResults1.DefinitelyAssignedOnExit)) Assert.Equal("Me", GetSymbolNamesJoined(dataResults1.ReadInside)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataResults1.ReadOutside)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataResults1.WrittenInside)) Assert.Equal("Me", GetSymbolNamesJoined(dataResults1.WrittenOutside)) End Sub <WorkItem(539286, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/539286")> <Fact()> Public Sub RegionAnalysisInFieldInitializers_WithMyBase() Dim source = <compilation name="RegionAnalysisInFieldInitializers_WithMyBase"> <file name="a.b"> Class Class1 Inherits Base Public Shared A As Integer = 10 Public B As Integer = [| 10 + A + Me.F() + MyBase.F() + Function() Return 10 + A + Me.F() + MyBase.F() End Function.Invoke |] Public Overrides Function F() As Integer Return Nothing End Function End Class Class Base Public Overridable Function F() As Integer Return Nothing End Function End Class </file> </compilation> Dim dataResults1 = CompileAndAnalyzeDataFlow(source) Assert.Equal(Nothing, GetSymbolNamesJoined(dataResults1.AlwaysAssigned)) Assert.Equal("Me", GetSymbolNamesJoined(dataResults1.Captured)) Assert.Equal("Me", GetSymbolNamesJoined(dataResults1.CapturedInside)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataResults1.CapturedOutside)) Assert.Equal("Me", GetSymbolNamesJoined(dataResults1.DataFlowsIn)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataResults1.DataFlowsOut)) Assert.Equal("Me", GetSymbolNamesJoined(dataResults1.DefinitelyAssignedOnEntry)) Assert.Equal("Me", GetSymbolNamesJoined(dataResults1.DefinitelyAssignedOnExit)) Assert.Equal("Me", GetSymbolNamesJoined(dataResults1.ReadInside)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataResults1.ReadOutside)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataResults1.WrittenInside)) Assert.Equal("Me", GetSymbolNamesJoined(dataResults1.WrittenOutside)) End Sub <WorkItem(539286, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/539286")> <Fact()> Public Sub RegionAnalysisInFieldInitializers_Lambda() Dim results1 = CompileAndAnalyzeControlAndDataFlow( <compilation name="RegionAnalysisInFieldInitializers_Lambda"> <file name="a.b"> Imports System Class Class1 Public Sub TST() Dim f As Func(Of Integer, Integer) = Function(p) Dim a As Integer = 1 Dim b As Integer = 2 [| b = 3 Dim c As Integer = 1 + a + b + Me.Goo() |] Return c End Function End Sub Public Function Goo() As Integer Return Nothing End Function End Class </file> </compilation>) Dim results2 = CompileAndAnalyzeControlAndDataFlow( <compilation name="AssertFromInvalidKeywordAsExpr"> <file name="a.b"> Imports System Class Class1 Dim f As Func(Of Integer, Integer) = Function(p) Dim a As Integer = 1 Dim b As Integer = 2 [| b = 3 Dim c As Integer = 1 + a + b + Me.Goo() |] Return c End Function Public Function Goo() As Integer Return Nothing End Function End Class </file> </compilation>) Dim controlResults1 = results1.Item1 Dim dataResults1 = results1.Item2 Dim controlResults2 = results2.Item1 Dim dataResults2 = results2.Item2 Assert.Equal(GetSymbolNamesJoined(dataResults1.AlwaysAssigned), GetSymbolNamesJoined(dataResults2.AlwaysAssigned)) Assert.Equal(GetSymbolNamesJoined(dataResults1.Captured), GetSymbolNamesJoined(dataResults2.Captured)) Assert.Equal(GetSymbolNamesJoined(dataResults1.CapturedInside), GetSymbolNamesJoined(dataResults2.CapturedInside)) Assert.Equal(GetSymbolNamesJoined(dataResults1.CapturedOutside), GetSymbolNamesJoined(dataResults2.CapturedOutside)) Assert.Equal(GetSymbolNamesJoined(dataResults1.DataFlowsIn), GetSymbolNamesJoined(dataResults2.DataFlowsIn)) Assert.Equal(GetSymbolNamesJoined(dataResults1.DataFlowsOut), GetSymbolNamesJoined(dataResults2.DataFlowsOut)) Assert.Equal(GetSymbolNamesJoined(dataResults1.ReadInside), GetSymbolNamesJoined(dataResults2.ReadInside)) Assert.Equal(GetSymbolNamesJoined(dataResults1.ReadOutside), GetSymbolNamesJoined(dataResults2.ReadOutside)) Assert.Equal(GetSymbolNamesJoined(dataResults1.WrittenInside), GetSymbolNamesJoined(dataResults2.WrittenInside)) Assert.True(dataResults1.WrittenOutside.Any(Function(ByVal s) s.Name = "f")) Assert.False(dataResults2.WrittenOutside.Any(Function(ByVal s) s.Name = "f")) Assert.Equal(GetSymbolNamesJoined(dataResults1.WrittenOutside.Where(Function(ByVal s) s.Name <> "f")), GetSymbolNamesJoined(dataResults2.WrittenOutside)) End Sub <WorkItem(539286, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/539286")> <Fact()> Public Sub RegionAnalysisInFieldInitializers_NestedLambdaAndTwoConstructors() Dim results1 = CompileAndAnalyzeControlAndDataFlow( <compilation name="RegionAnalysisInFieldInitializers_NestedLambdaAndTwoConstructors"> <file name="a.b"> Class Class1(Of T) Private Sub TST() Dim f As Func(Of T, Integer, Integer) = Function(x, p) Dim a_outer As Integer = 1 Dim tx As T = x Dim ff As Func(Of T, Integer, Integer) = Function(xx, pp) Dim a As Integer = 1 Dim b As Integer = 2 Dim ttx As T = tx [| b = 3 Dim c As Integer = Goo() + p + pp + a + b + a_outer |] Return c End Function Return ff(Nothing, p) End Function End Sub Public Function Goo() As Integer Return Nothing End Function Public Sub New() End Sub Public Sub New(i As Integer) End Sub End Class </file> </compilation>) Dim results2 = CompileAndAnalyzeControlAndDataFlow( <compilation name="AssertFromInvalidKeywordAsExpr"> <file name="a.b"> Class Class1(Of T) Dim f As Func(Of T, Integer, Integer) = Function(x, p) Dim a_outer As Integer = 1 Dim tx As T = x Dim ff As Func(Of T, Integer, Integer) = Function(xx, pp) Dim a As Integer = 1 Dim b As Integer = 2 Dim ttx As T = tx [| b = 3 Dim c As Integer = Goo() + p + pp + a + b + a_outer |] Return c End Function Return ff(Nothing, p) End Function Public Function Goo() As Integer Return Nothing End Function Public Sub New() End Sub Public Sub New(i As Integer) End Sub End Class </file> </compilation>) Dim controlResults1 = results1.Item1 Dim dataResults1 = results1.Item2 Dim controlResults2 = results2.Item1 Dim dataResults2 = results2.Item2 Assert.Equal(GetSymbolNamesJoined(dataResults1.AlwaysAssigned), GetSymbolNamesJoined(dataResults2.AlwaysAssigned)) Assert.Equal(GetSymbolNamesJoined(dataResults1.Captured), GetSymbolNamesJoined(dataResults2.Captured)) Assert.Equal(GetSymbolNamesJoined(dataResults1.CapturedInside), GetSymbolNamesJoined(dataResults2.CapturedInside)) Assert.Equal(GetSymbolNamesJoined(dataResults1.CapturedOutside), GetSymbolNamesJoined(dataResults2.CapturedOutside)) Assert.Equal(GetSymbolNamesJoined(dataResults1.DataFlowsIn), GetSymbolNamesJoined(dataResults2.DataFlowsIn)) Assert.Equal(GetSymbolNamesJoined(dataResults1.DataFlowsOut), GetSymbolNamesJoined(dataResults2.DataFlowsOut)) Assert.Equal(GetSymbolNamesJoined(dataResults1.ReadInside), GetSymbolNamesJoined(dataResults2.ReadInside)) Assert.Equal(GetSymbolNamesJoined(dataResults1.ReadOutside), GetSymbolNamesJoined(dataResults2.ReadOutside)) Assert.Equal(GetSymbolNamesJoined(dataResults1.WrittenInside), GetSymbolNamesJoined(dataResults2.WrittenInside)) Assert.Equal(GetSymbolNamesJoined(dataResults1.WrittenOutside.Where(Function(x) x.Name <> "f")), GetSymbolNamesJoined(dataResults2.WrittenOutside)) End Sub <WorkItem(539197, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/539197")> <Fact()> Public Sub ByRefParameterNotInAppropriateCollections1() ' ByRef parameters are not considered assigned Dim analysisResults = CompileAndAnalyzeControlAndDataFlow( <compilation name="AssertFromInvalidKeywordAsExpr"> <file name="a.b"> Imports System Imports System.Collections.Generic Class Program Sub Test(of T)(ByRef t As T) [| Dim t1 As T Test(t1) t = t1 |] System.Console.WriteLine(t1.ToString()) End Sub End Class </file> </compilation>) Dim controlFlowAnalysisResults = analysisResults.Item1 Dim dataFlowAnalysisResults = analysisResults.Item2 Assert.Equal(0, controlFlowAnalysisResults.EntryPoints.Count()) Assert.Equal(0, controlFlowAnalysisResults.ExitPoints.Count()) Assert.True(controlFlowAnalysisResults.StartPointIsReachable) Assert.True(controlFlowAnalysisResults.EndPointIsReachable) Assert.Equal("t1", GetSymbolNamesJoined(dataFlowAnalysisResults.VariablesDeclared)) Assert.Equal("t", GetSymbolNamesJoined(dataFlowAnalysisResults.AlwaysAssigned)) Assert.Equal("Me", GetSymbolNamesJoined(dataFlowAnalysisResults.DataFlowsIn)) Assert.Equal("t, t1", GetSymbolNamesJoined(dataFlowAnalysisResults.DataFlowsOut)) Assert.Equal("Me, t", GetSymbolNamesJoined(dataFlowAnalysisResults.DefinitelyAssignedOnEntry)) Assert.Equal("Me, t, t1", GetSymbolNamesJoined(dataFlowAnalysisResults.DefinitelyAssignedOnExit)) Assert.Equal("Me, t1", GetSymbolNamesJoined(dataFlowAnalysisResults.ReadInside)) Assert.Equal("t, t1", GetSymbolNamesJoined(dataFlowAnalysisResults.ReadOutside)) Assert.Equal("t, t1", GetSymbolNamesJoined(dataFlowAnalysisResults.WrittenInside)) Assert.Equal("Me, t, t1", GetSymbolNamesJoined(dataFlowAnalysisResults.WrittenOutside)) End Sub <WorkItem(539197, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/539197")> <Fact()> Public Sub ByRefParameterNotInAppropriateCollections2() ' ByRef parameters are not considered assigned Dim analysisResults = CompileAndAnalyzeControlAndDataFlow( <compilation name="AssertFromInvalidKeywordAsExpr"> <file name="a.b"> Imports System Imports System.Collections.Generic Class Program Sub Test(Of T)(ByRef t As T) [| Dim t1 As T = GetValue(of T)(t) |] System.Console.WriteLine(t1.ToString()) End Sub Private Function GetValue(Of T)(ByRef t As T) As T Return t End Function End Class </file> </compilation>) Dim controlFlowAnalysisResults = analysisResults.Item1 Dim dataFlowAnalysisResults = analysisResults.Item2 Assert.Equal(0, controlFlowAnalysisResults.EntryPoints.Count()) Assert.Equal(0, controlFlowAnalysisResults.ExitPoints.Count()) Assert.True(controlFlowAnalysisResults.StartPointIsReachable) Assert.True(controlFlowAnalysisResults.EndPointIsReachable) Assert.Equal("t1", GetSymbolNamesJoined(dataFlowAnalysisResults.VariablesDeclared)) Assert.Equal("t1", GetSymbolNamesJoined(dataFlowAnalysisResults.AlwaysAssigned)) Assert.Equal("Me, t", GetSymbolNamesJoined(dataFlowAnalysisResults.DataFlowsIn)) Assert.Equal("t, t1", GetSymbolNamesJoined(dataFlowAnalysisResults.DataFlowsOut)) Assert.Equal("Me, t", GetSymbolNamesJoined(dataFlowAnalysisResults.DefinitelyAssignedOnEntry)) Assert.Equal("Me, t, t1", GetSymbolNamesJoined(dataFlowAnalysisResults.DefinitelyAssignedOnExit)) Assert.Equal("Me, t", GetSymbolNamesJoined(dataFlowAnalysisResults.ReadInside)) Assert.Equal("t, t1", GetSymbolNamesJoined(dataFlowAnalysisResults.ReadOutside)) Assert.Equal("t, t1", GetSymbolNamesJoined(dataFlowAnalysisResults.WrittenInside)) Assert.Equal("Me, t, t1", GetSymbolNamesJoined(dataFlowAnalysisResults.WrittenOutside)) End Sub Private Shared ReadOnly s_customIL As XCData = <![CDATA[ .class public auto ansi beforefieldinit External extends [mscorlib]System.Object { .method public hidebysig instance bool M1([out] bool& x) cil managed { // Code size 11 (0xb) .maxstack 2 .locals init ([0] bool CS$1$0000) IL_0000: nop IL_0001: ldarg.1 IL_0002: ldc.i4.1 IL_0003: stind.i1 IL_0004: ldarg.1 IL_0005: ldind.i1 IL_0006: stloc.0 IL_0007: br.s IL_0009 IL_0009: ldloc.0 IL_000a: ret } // end of method External::M1 .method public hidebysig specialname rtspecialname instance void .ctor() cil managed { // Code size 7 (0x7) .maxstack 8 IL_0000: ldarg.0 IL_0001: call instance void [mscorlib]System.Object::.ctor() IL_0006: ret } // end of method External::.ctor } // end of class External ]]> <Fact()> Public Sub TestOutParameterAlwaysAssigned() Dim dataFlowAnalysisResults = CompileAndAnalyzeDataFlow( <compilation> <file name="a.b"> class C shared sub Main() dim b as boolean = true dim ext as external = new external dim zz as boolean = [|ext.M1(b)|] end sub end class </file> </compilation>, s_customIL) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowAnalysisResults.VariablesDeclared)) Assert.Equal("b", GetSymbolNamesJoined(dataFlowAnalysisResults.AlwaysAssigned)) ' NOTE: always assigned Assert.Equal("ext", GetSymbolNamesJoined(dataFlowAnalysisResults.DataFlowsIn)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowAnalysisResults.DataFlowsOut)) Assert.Equal("b, ext", GetSymbolNamesJoined(dataFlowAnalysisResults.DefinitelyAssignedOnEntry)) Assert.Equal("b, ext", GetSymbolNamesJoined(dataFlowAnalysisResults.DefinitelyAssignedOnExit)) Assert.Equal("ext", GetSymbolNamesJoined(dataFlowAnalysisResults.ReadInside)) Assert.Equal("b", GetSymbolNamesJoined(dataFlowAnalysisResults.WrittenInside)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowAnalysisResults.ReadOutside)) Assert.Equal("b, ext, zz", GetSymbolNamesJoined(dataFlowAnalysisResults.WrittenOutside)) End Sub <Fact()> Public Sub BinaryConditional() Dim dataFlowAnalysisResults = CompileAndAnalyzeDataFlow( <compilation name="BinaryConditional"> <file name="a.b"> Class A Function Test1() As Integer Dim ext As External = New External Dim x As Boolean = True Dim y As Boolean = IF(New Object(), [|ext.M1(x)|]) End Function End Class </file> </compilation>, s_customIL) Assert.Equal("x", GetSymbolNamesJoined(dataFlowAnalysisResults.AlwaysAssigned)) Assert.Equal("ext", GetSymbolNamesJoined(dataFlowAnalysisResults.DataFlowsIn)) Assert.Equal("Me, ext, x", GetSymbolNamesJoined(dataFlowAnalysisResults.DefinitelyAssignedOnEntry)) Assert.Equal("Me, ext, x", GetSymbolNamesJoined(dataFlowAnalysisResults.DefinitelyAssignedOnExit)) Assert.Equal("ext", GetSymbolNamesJoined(dataFlowAnalysisResults.ReadInside)) Assert.Equal("x", GetSymbolNamesJoined(dataFlowAnalysisResults.WrittenInside)) End Sub <Fact()> Public Sub BinaryConditional01() Dim dataFlowAnalysisResults = CompileAndAnalyzeDataFlow( <compilation name="BinaryConditional01"> <file name="a.b"> Class A Function Test1() As Integer Dim ext As External = New External Dim x As Boolean = True Dim y As True = IF("", [|ext.M1(x)|]) End Function End Class </file> </compilation>, s_customIL) Assert.Equal("x", GetSymbolNamesJoined(dataFlowAnalysisResults.AlwaysAssigned)) Assert.Equal("ext", GetSymbolNamesJoined(dataFlowAnalysisResults.DataFlowsIn)) Assert.Equal("Me, ext, x", GetSymbolNamesJoined(dataFlowAnalysisResults.DefinitelyAssignedOnEntry)) Assert.Equal("Me, ext, x", GetSymbolNamesJoined(dataFlowAnalysisResults.DefinitelyAssignedOnExit)) Assert.Equal("ext", GetSymbolNamesJoined(dataFlowAnalysisResults.ReadInside)) Assert.Equal("x", GetSymbolNamesJoined(dataFlowAnalysisResults.WrittenInside)) End Sub <Fact()> Public Sub BinaryConditional02() Dim dataFlowAnalysisResults = CompileAndAnalyzeDataFlow( <compilation name="BinaryConditional02"> <file name="a.b"> Class A Function Test1() As Integer Dim ext As External = New External Dim x As Boolean = True Dim y As True = [|IF("", ext.M1(x))|] End Function End Class </file> </compilation>, s_customIL) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowAnalysisResults.AlwaysAssigned)) Assert.Equal("ext", GetSymbolNamesJoined(dataFlowAnalysisResults.DataFlowsIn)) Assert.Equal("Me, ext, x", GetSymbolNamesJoined(dataFlowAnalysisResults.DefinitelyAssignedOnEntry)) Assert.Equal("Me, ext, x", GetSymbolNamesJoined(dataFlowAnalysisResults.DefinitelyAssignedOnExit)) Assert.Equal("ext", GetSymbolNamesJoined(dataFlowAnalysisResults.ReadInside)) Assert.Equal("x", GetSymbolNamesJoined(dataFlowAnalysisResults.WrittenInside)) End Sub <Fact()> Public Sub BinaryConditional03() Dim dataFlowAnalysisResults = CompileAndAnalyzeDataFlow( <compilation name="BinaryConditional03"> <file name="a.b"> Class A Function Test1() As Integer Dim ext As External = New External Dim x As Boolean = True Dim xx As Boolean = True Dim y As True = [|IF(ext.M1(xx), ext.M1(x))|] End Function End Class </file> </compilation>, s_customIL) Assert.Equal("xx", GetSymbolNamesJoined(dataFlowAnalysisResults.AlwaysAssigned)) Assert.Equal("ext", GetSymbolNamesJoined(dataFlowAnalysisResults.DataFlowsIn)) Assert.Equal("Me, ext, x, xx", GetSymbolNamesJoined(dataFlowAnalysisResults.DefinitelyAssignedOnEntry)) Assert.Equal("Me, ext, x, xx", GetSymbolNamesJoined(dataFlowAnalysisResults.DefinitelyAssignedOnExit)) Assert.Equal("ext", GetSymbolNamesJoined(dataFlowAnalysisResults.ReadInside)) Assert.Equal("x, xx", GetSymbolNamesJoined(dataFlowAnalysisResults.WrittenInside)) End Sub <Fact()> Public Sub BinaryConditional04() Dim dataFlowAnalysisResults = CompileAndAnalyzeDataFlow( <compilation name="BinaryConditional04"> <file name="a.b"> Class A Function Test1() As Integer Dim ext As External = New External Dim x As Boolean = True Dim xx As Boolean = True Dim y As True = IF([|ext.M1(xx)|], ext.M1(x)) End Function End Class </file> </compilation>, s_customIL) Assert.Equal("xx", GetSymbolNamesJoined(dataFlowAnalysisResults.AlwaysAssigned)) Assert.Equal("ext", GetSymbolNamesJoined(dataFlowAnalysisResults.DataFlowsIn)) Assert.Equal("Me, ext, x, xx", GetSymbolNamesJoined(dataFlowAnalysisResults.DefinitelyAssignedOnEntry)) Assert.Equal("Me, ext, x, xx", GetSymbolNamesJoined(dataFlowAnalysisResults.DefinitelyAssignedOnExit)) Assert.Equal("ext", GetSymbolNamesJoined(dataFlowAnalysisResults.ReadInside)) Assert.Equal("xx", GetSymbolNamesJoined(dataFlowAnalysisResults.WrittenInside)) End Sub <Fact()> Public Sub BinaryConditional05() Dim dataFlowAnalysisResults = CompileAndAnalyzeDataFlow( <compilation name="BinaryConditional05"> <file name="a.b"> Class A Sub Test1() Dim ext As External = New External Dim x As Boolean = Nothing Dim z As Object = [|IF(Nothing, ext.M1(x))|] End Sub End Class </file> </compilation>, s_customIL) Assert.Equal("x", GetSymbolNamesJoined(dataFlowAnalysisResults.AlwaysAssigned)) Assert.Equal("ext", GetSymbolNamesJoined(dataFlowAnalysisResults.DataFlowsIn)) Assert.Equal("Me, ext, x", GetSymbolNamesJoined(dataFlowAnalysisResults.DefinitelyAssignedOnEntry)) Assert.Equal("Me, ext, x", GetSymbolNamesJoined(dataFlowAnalysisResults.DefinitelyAssignedOnExit)) Assert.Equal("ext", GetSymbolNamesJoined(dataFlowAnalysisResults.ReadInside)) Assert.Equal("x", GetSymbolNamesJoined(dataFlowAnalysisResults.WrittenInside)) End Sub <Fact()> Public Sub BinaryAndAlso01() Dim dataFlowAnalysisResults = CompileAndAnalyzeDataFlow( <compilation name="BinaryAndAlso01"> <file name="a.b"> Class A Function F(ByRef p As Boolean) As Boolean Return Nothing End Function Sub Test1() Dim x As Boolean = True Dim y As Boolean = False Dim z As Boolean = IF(Nothing, [|F(x)|]) AndAlso IF(Nothing, F(y)) AndAlso False End Sub End Class </file> </compilation>) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowAnalysisResults.VariablesDeclared)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowAnalysisResults.AlwaysAssigned)) Assert.Equal("Me, x", GetSymbolNamesJoined(dataFlowAnalysisResults.DataFlowsIn)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowAnalysisResults.DataFlowsOut)) Assert.Equal("Me, x, y", GetSymbolNamesJoined(dataFlowAnalysisResults.DefinitelyAssignedOnEntry)) Assert.Equal("Me, x, y", GetSymbolNamesJoined(dataFlowAnalysisResults.DefinitelyAssignedOnExit)) Assert.Equal("Me, x", GetSymbolNamesJoined(dataFlowAnalysisResults.ReadInside)) Assert.Equal("Me, y", GetSymbolNamesJoined(dataFlowAnalysisResults.ReadOutside)) Assert.Equal("x", GetSymbolNamesJoined(dataFlowAnalysisResults.WrittenInside)) Assert.Equal("Me, x, y, z", GetSymbolNamesJoined(dataFlowAnalysisResults.WrittenOutside)) End Sub <Fact()> Public Sub BinaryAndAlso02() Dim dataFlowAnalysisResults = CompileAndAnalyzeDataFlow( <compilation name="BinaryAndAlso02"> <file name="a.b"> Class A Function F(ByRef p As Boolean) As Boolean Return Nothing End Function Sub Test1() Dim x As Boolean Dim y As Boolean = False Dim z As Boolean = x AndAlso [|y|] AndAlso False End Sub End Class </file> </compilation>) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowAnalysisResults.VariablesDeclared)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowAnalysisResults.AlwaysAssigned)) Assert.Equal("y", GetSymbolNamesJoined(dataFlowAnalysisResults.DataFlowsIn)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowAnalysisResults.DataFlowsOut)) Assert.Equal("Me, y", GetSymbolNamesJoined(dataFlowAnalysisResults.DefinitelyAssignedOnEntry)) Assert.Equal("Me, y", GetSymbolNamesJoined(dataFlowAnalysisResults.DefinitelyAssignedOnExit)) Assert.Equal("y", GetSymbolNamesJoined(dataFlowAnalysisResults.ReadInside)) Assert.Equal("x", GetSymbolNamesJoined(dataFlowAnalysisResults.ReadOutside)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowAnalysisResults.WrittenInside)) Assert.Equal("Me, y, z", GetSymbolNamesJoined(dataFlowAnalysisResults.WrittenOutside)) End Sub <Fact()> Public Sub BinaryAndAlso03() Dim source = <compilation name="BinaryAndAlso03"> <file name="a.b"> Class A Function F(ByRef p As Boolean) As Boolean Return Nothing End Function Sub Test1() Dim ext As External = New External Dim x As Boolean = True Dim y As Boolean = False Dim z As Boolean = [|ext.M1(x)|] AndAlso ext.M1(y) End Sub End Class </file> </compilation> Dim dataFlowAnalysisResults = CompileAndAnalyzeDataFlow(source, s_customIL) Assert.Equal("x", GetSymbolNamesJoined(dataFlowAnalysisResults.AlwaysAssigned)) Assert.Equal("ext", GetSymbolNamesJoined(dataFlowAnalysisResults.DataFlowsIn)) Assert.Equal("Me, ext, x, y", GetSymbolNamesJoined(dataFlowAnalysisResults.DefinitelyAssignedOnEntry)) Assert.Equal("Me, ext, x, y", GetSymbolNamesJoined(dataFlowAnalysisResults.DefinitelyAssignedOnExit)) Assert.Equal("ext", GetSymbolNamesJoined(dataFlowAnalysisResults.ReadInside)) Assert.Equal("x", GetSymbolNamesJoined(dataFlowAnalysisResults.WrittenInside)) End Sub <Fact()> Public Sub BinaryAndAlso04() Dim source = <compilation name="BinaryAndAlso04"> <file name="a.b"> Class A Function F(ByRef p As Boolean) As Boolean Return Nothing End Function Sub Test1() Dim ext As External = New External Dim x As Boolean = True Dim y As Boolean = False Dim z As Boolean = ext.M1(x) AndAlso [|ext.M1(y)|] End Sub End Class </file> </compilation> Dim dataFlowAnalysisResults = CompileAndAnalyzeDataFlow(source, s_customIL) Assert.Equal("y", GetSymbolNamesJoined(dataFlowAnalysisResults.AlwaysAssigned)) Assert.Equal("ext", GetSymbolNamesJoined(dataFlowAnalysisResults.DataFlowsIn)) Assert.Equal("Me, ext, x, y", GetSymbolNamesJoined(dataFlowAnalysisResults.DefinitelyAssignedOnEntry)) Assert.Equal("Me, ext, x, y", GetSymbolNamesJoined(dataFlowAnalysisResults.DefinitelyAssignedOnExit)) Assert.Equal("ext", GetSymbolNamesJoined(dataFlowAnalysisResults.ReadInside)) Assert.Equal("y", GetSymbolNamesJoined(dataFlowAnalysisResults.WrittenInside)) End Sub <Fact()> Public Sub BinaryAndAlso05() Dim source = <compilation name="BinaryAndAlso05"> <file name="a.b"> Class A Function F(ByRef p As Boolean) As Boolean Return Nothing End Function Sub Test1() Dim ext As External = New External Dim x As Boolean = True Dim y As Boolean = False Dim z As Boolean = [|ext.M1(x) AndAlso ext.M1(y)|] AndAlso True End Sub End Class </file> </compilation> Dim dataFlowAnalysisResults = CompileAndAnalyzeDataFlow(source, s_customIL) Assert.Equal("x", GetSymbolNamesJoined(dataFlowAnalysisResults.AlwaysAssigned)) Assert.Equal("ext", GetSymbolNamesJoined(dataFlowAnalysisResults.DataFlowsIn)) Assert.Equal("Me, ext, x, y", GetSymbolNamesJoined(dataFlowAnalysisResults.DefinitelyAssignedOnEntry)) Assert.Equal("Me, ext, x, y", GetSymbolNamesJoined(dataFlowAnalysisResults.DefinitelyAssignedOnExit)) Assert.Equal("ext", GetSymbolNamesJoined(dataFlowAnalysisResults.ReadInside)) Assert.Equal("x, y", GetSymbolNamesJoined(dataFlowAnalysisResults.WrittenInside)) End Sub <Fact()> Public Sub BinaryAndAlso06() Dim source = <compilation name="BinaryAndAlso06"> <file name="a.b"> Class A Function F(ByRef p As Boolean) As Boolean Return Nothing End Function Sub Test1() Dim ext As External = New External Dim x As Boolean = True Dim y As Boolean = False Dim z As Boolean = [|ext.M1(x) AndAlso ext.M1(y) AndAlso True|] End Sub End Class </file> </compilation> Dim dataFlowAnalysisResults = CompileAndAnalyzeDataFlow(source, s_customIL) Assert.Equal("x", GetSymbolNamesJoined(dataFlowAnalysisResults.AlwaysAssigned)) Assert.Equal("ext", GetSymbolNamesJoined(dataFlowAnalysisResults.DataFlowsIn)) Assert.Equal("Me, ext, x, y", GetSymbolNamesJoined(dataFlowAnalysisResults.DefinitelyAssignedOnEntry)) Assert.Equal("Me, ext, x, y", GetSymbolNamesJoined(dataFlowAnalysisResults.DefinitelyAssignedOnExit)) Assert.Equal("ext", GetSymbolNamesJoined(dataFlowAnalysisResults.ReadInside)) Assert.Equal("x, y", GetSymbolNamesJoined(dataFlowAnalysisResults.WrittenInside)) End Sub <Fact()> Public Sub BinaryOrElse01() Dim dataFlowAnalysisResults = CompileAndAnalyzeDataFlow( <compilation name="BinaryOrElse01"> <file name="a.b"> Class A Function F(ByRef p As Boolean) As Boolean Return Nothing End Function Sub Test1() Dim x As Boolean = True Dim y As Boolean = False Dim z As Boolean = IF(Nothing, [|F(x)|]) OrElse IF(Nothing, F(y)) OrElse False End Sub End Class </file> </compilation>) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowAnalysisResults.AlwaysAssigned)) Assert.Equal("Me, x", GetSymbolNamesJoined(dataFlowAnalysisResults.DataFlowsIn)) Assert.Equal("Me, x, y", GetSymbolNamesJoined(dataFlowAnalysisResults.DefinitelyAssignedOnEntry)) Assert.Equal("Me, x, y", GetSymbolNamesJoined(dataFlowAnalysisResults.DefinitelyAssignedOnExit)) Assert.Equal("Me, x", GetSymbolNamesJoined(dataFlowAnalysisResults.ReadInside)) Assert.Equal("x", GetSymbolNamesJoined(dataFlowAnalysisResults.WrittenInside)) End Sub <Fact()> Public Sub BinaryOrElse02() Dim dataFlowAnalysisResults = CompileAndAnalyzeDataFlow( <compilation name="BinaryOrElse02"> <file name="a.b"> Class A Function F(ByRef p As Boolean) As Boolean Return Nothing End Function Sub Test1() Dim x As Boolean Dim y As Boolean = False Dim z As Boolean = x OrElse [|y|] OrElse False End Sub End Class </file> </compilation>) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowAnalysisResults.AlwaysAssigned)) Assert.Equal("y", GetSymbolNamesJoined(dataFlowAnalysisResults.DataFlowsIn)) Assert.Equal("Me, y", GetSymbolNamesJoined(dataFlowAnalysisResults.DefinitelyAssignedOnEntry)) Assert.Equal("Me, y", GetSymbolNamesJoined(dataFlowAnalysisResults.DefinitelyAssignedOnExit)) Assert.Equal("y", GetSymbolNamesJoined(dataFlowAnalysisResults.ReadInside)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowAnalysisResults.WrittenInside)) End Sub <Fact()> Public Sub BinaryOrElse03() Dim source = <compilation name="BinaryOrElse03"> <file name="a.b"> Class A Function F(ByRef p As Boolean) As Boolean Return Nothing End Function Sub Test1() Dim ext As External = New External Dim x As Boolean = True Dim y As Boolean = False Dim z As Boolean = [|ext.M1(x)|] OrElse ext.M1(y) End Sub End Class </file> </compilation> Dim dataFlowAnalysisResults = CompileAndAnalyzeDataFlow(source, s_customIL) Assert.Equal("x", GetSymbolNamesJoined(dataFlowAnalysisResults.AlwaysAssigned)) Assert.Equal("ext", GetSymbolNamesJoined(dataFlowAnalysisResults.DataFlowsIn)) Assert.Equal("Me, ext, x, y", GetSymbolNamesJoined(dataFlowAnalysisResults.DefinitelyAssignedOnEntry)) Assert.Equal("Me, ext, x, y", GetSymbolNamesJoined(dataFlowAnalysisResults.DefinitelyAssignedOnExit)) Assert.Equal("ext", GetSymbolNamesJoined(dataFlowAnalysisResults.ReadInside)) Assert.Equal("x", GetSymbolNamesJoined(dataFlowAnalysisResults.WrittenInside)) End Sub <Fact()> Public Sub BinaryOrElse04() Dim source = <compilation name="BinaryOrElse04"> <file name="a.b"> Class A Function F(ByRef p As Boolean) As Boolean Return Nothing End Function Sub Test1() Dim ext As External = New External Dim x As Boolean = True Dim y As Boolean = False Dim z As Boolean = ext.M1(x) OrElse [|ext.M1(y)|] End Sub End Class </file> </compilation> Dim dataFlowAnalysisResults = CompileAndAnalyzeDataFlow(source, s_customIL) Assert.Equal("y", GetSymbolNamesJoined(dataFlowAnalysisResults.AlwaysAssigned)) Assert.Equal("ext", GetSymbolNamesJoined(dataFlowAnalysisResults.DataFlowsIn)) Assert.Equal("Me, ext, x, y", GetSymbolNamesJoined(dataFlowAnalysisResults.DefinitelyAssignedOnEntry)) Assert.Equal("Me, ext, x, y", GetSymbolNamesJoined(dataFlowAnalysisResults.DefinitelyAssignedOnExit)) Assert.Equal("ext", GetSymbolNamesJoined(dataFlowAnalysisResults.ReadInside)) Assert.Equal("y", GetSymbolNamesJoined(dataFlowAnalysisResults.WrittenInside)) End Sub <Fact()> Public Sub BinaryOrElse05() Dim source = <compilation name="BinaryOrElse05"> <file name="a.b"> Class A Function F(ByRef p As Boolean) As Boolean Return Nothing End Function Sub Test1() Dim ext As External = New External Dim x As Boolean = True Dim y As Boolean = False Dim z As Boolean = [|ext.M1(x) OrElse ext.M1(y)|] OrElse True End Sub End Class </file> </compilation> Dim dataFlowAnalysisResults = CompileAndAnalyzeDataFlow(source, s_customIL) Assert.Equal("x", GetSymbolNamesJoined(dataFlowAnalysisResults.AlwaysAssigned)) Assert.Equal("ext", GetSymbolNamesJoined(dataFlowAnalysisResults.DataFlowsIn)) Assert.Equal("Me, ext, x, y", GetSymbolNamesJoined(dataFlowAnalysisResults.DefinitelyAssignedOnEntry)) Assert.Equal("Me, ext, x, y", GetSymbolNamesJoined(dataFlowAnalysisResults.DefinitelyAssignedOnExit)) Assert.Equal("ext", GetSymbolNamesJoined(dataFlowAnalysisResults.ReadInside)) Assert.Equal("x, y", GetSymbolNamesJoined(dataFlowAnalysisResults.WrittenInside)) End Sub <Fact()> Public Sub BinaryOrElse06() Dim source = <compilation name="BinaryOrElse06"> <file name="a.b"> Class A Function F(ByRef p As Boolean) As Boolean Return Nothing End Function Sub Test1() Dim ext As External = New External Dim x As Boolean = True Dim y As Boolean = False Dim z As Boolean = [|ext.M1(x) OrElse ext.M1(y) OrElse True|] End Sub End Class </file> </compilation> Dim dataFlowAnalysisResults = CompileAndAnalyzeDataFlow(source, s_customIL) Assert.Equal("x", GetSymbolNamesJoined(dataFlowAnalysisResults.AlwaysAssigned)) Assert.Equal("ext", GetSymbolNamesJoined(dataFlowAnalysisResults.DataFlowsIn)) Assert.Equal("Me, ext, x, y", GetSymbolNamesJoined(dataFlowAnalysisResults.DefinitelyAssignedOnEntry)) Assert.Equal("Me, ext, x, y", GetSymbolNamesJoined(dataFlowAnalysisResults.DefinitelyAssignedOnExit)) Assert.Equal("ext", GetSymbolNamesJoined(dataFlowAnalysisResults.ReadInside)) Assert.Equal("x, y", GetSymbolNamesJoined(dataFlowAnalysisResults.WrittenInside)) End Sub <WorkItem(541005, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/541005")> <Fact()> Public Sub TestMultipleLocalsInitializedByAsNew1() Dim dataFlowAnalysis = CompileAndAnalyzeDataFlow( <compilation name="TestMultipleLocalsInitializedByAsNew"> <file name="a.b"> Module Program Class c Sub New(i As Integer) End Sub End Class Sub Main(args As String()) Dim a As Integer = 1 Dim x, y, z As New c([|a|]+1) End Sub End Module </file> </compilation>) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowAnalysis.AlwaysAssigned)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowAnalysis.WrittenInside)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowAnalysis.VariablesDeclared)) Assert.Equal("args, a, x, y, z", GetSymbolNamesJoined(dataFlowAnalysis.WrittenOutside)) End Sub <WorkItem(541005, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/541005")> <Fact()> Public Sub TestMultipleLocalsInitializedByAsNew2() Dim analysis = CompileAndAnalyzeControlAndDataFlow( <compilation name="TestMultipleLocalsInitializedByAsNew"> <file name="a.b"> Module Program Class c Sub New(i As Integer) End Sub End Class Sub Main(args As String()) Dim a As Integer = 1 [|Dim x, y, z As New c(a)|] End Sub End Module </file> </compilation>) Dim controlFlowAnalysis = analysis.Item1 Dim dataFlowAnalysis = analysis.Item2 Assert.Equal(0, controlFlowAnalysis.ExitPoints.Count()) Assert.Equal(0, controlFlowAnalysis.EntryPoints.Count()) Assert.Equal("x, y, z", GetSymbolNamesJoined(dataFlowAnalysis.AlwaysAssigned)) Assert.Equal("x, y, z", GetSymbolNamesJoined(dataFlowAnalysis.WrittenInside)) Assert.Equal("x, y, z", GetSymbolNamesJoined(dataFlowAnalysis.VariablesDeclared)) Assert.Equal("args, a", GetSymbolNamesJoined(dataFlowAnalysis.WrittenOutside)) Assert.True(controlFlowAnalysis.StartPointIsReachable) Assert.True(controlFlowAnalysis.EndPointIsReachable) End Sub <WorkItem(528623, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/528623")> <Fact()> Public Sub TestElementAccess01() Dim analysis = CompileAndAnalyzeControlAndDataFlow( <compilation name="TestElementAccess"> <file name="elem.b"> Imports System Public Class Test Sub F(p as Long()) Dim v() As Long = new Long() { 1, 2, 3 } [| v(0) = p(0) p(0) = v(1) |] v(1) = v(0) ' p(2) = p(0) End Sub End Class </file> </compilation>) Dim dataFlowAnalysis = analysis.Item2 Assert.True(dataFlowAnalysis.Succeeded) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowAnalysis.VariablesDeclared)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowAnalysis.AlwaysAssigned)) Assert.Equal("p, v", GetSymbolNamesJoined(dataFlowAnalysis.DataFlowsIn)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowAnalysis.DataFlowsOut)) Assert.Equal("Me, p, v", GetSymbolNamesJoined(dataFlowAnalysis.DefinitelyAssignedOnEntry)) Assert.Equal("Me, p, v", GetSymbolNamesJoined(dataFlowAnalysis.DefinitelyAssignedOnExit)) Assert.Equal("p, v", GetSymbolNamesJoined(dataFlowAnalysis.ReadInside)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowAnalysis.WrittenInside)) Assert.Equal("v", GetSymbolNamesJoined(dataFlowAnalysis.ReadOutside)) Assert.Equal("Me, p, v", GetSymbolNamesJoined(dataFlowAnalysis.WrittenOutside)) End Sub <Fact()> Public Sub DataFlowForDeclarationOfEnumTypedVariable() Dim dataFlowAnalysisResults = CompileAndAnalyzeDataFlow( <compilation> <file name="a.b"><![CDATA[ Class C Sub Main(args As String()) [|Dim s As color|] Try Catch ex As Exception When s = color.black Console.Write("Exception") End Try End Sub End Class Enum color black End Enum ]]></file> </compilation>) Assert.Equal("s", GetSymbolNamesJoined(dataFlowAnalysisResults.VariablesDeclared)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowAnalysisResults.AlwaysAssigned)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowAnalysisResults.DataFlowsIn)) Assert.Equal("s", GetSymbolNamesJoined(dataFlowAnalysisResults.DataFlowsOut)) Assert.Equal("Me, args", GetSymbolNamesJoined(dataFlowAnalysisResults.DefinitelyAssignedOnEntry)) Assert.Equal("Me, args", GetSymbolNamesJoined(dataFlowAnalysisResults.DefinitelyAssignedOnExit)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowAnalysisResults.ReadInside)) Assert.Equal("s", GetSymbolNamesJoined(dataFlowAnalysisResults.ReadOutside)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowAnalysisResults.WrittenInside)) Assert.Equal("Me, args, ex", GetSymbolNamesJoined(dataFlowAnalysisResults.WrittenOutside)) End Sub <WorkItem(542565, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/542565")> <Fact()> Public Sub IdentifierNameInForStatement() Dim dataFlowResults = CompileAndAnalyzeDataFlow( <compilation> <file name="a.vb"> Module Module1 Sub Main() For [|Idx|] = 0 To ubound(arry) Step 1 Next Idx End Sub End Module </file> </compilation>) Assert.True(dataFlowResults.Succeeded) End Sub <WorkItem(528860, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/528860")> <Fact()> Public Sub IdentifierNameInMemberAccessExpr() Dim dataFlowResults = CompileAndAnalyzeDataFlow( <compilation> <file name="a.vb"> Public Class Goo Sub M() Dim c As C = New C() Dim n1 = c.[|M|] End Sub End Class </file> </compilation>) Assert.False(dataFlowResults.Succeeded) End Sub <WorkItem(528860, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/528860")> <Fact()> Public Sub IdentifierNameInMemberAccessExpr2() Dim dataFlowResults = CompileAndAnalyzeDataFlow( <compilation> <file name="a.vb"> Public Class C Sub M() Dim c As C = New C() Dim n1 = c.[|M|] End Sub End Class </file> </compilation>) Assert.False(dataFlowResults.Succeeded) End Sub <WorkItem(542860, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/542860")> <Fact()> Public Sub IdentifierNameSyntax() Dim dataFlowResults = CompileAndAnalyzeDataFlow( <compilation> <file name="a.vb"> Imports Microsoft.VisualBasic Public Class C Sub M() Dim n1 = [|ChrW|](85) End Sub End Class </file> </compilation>) Assert.True(dataFlowResults.Succeeded) End Sub <WorkItem(542860, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/542860")> <Fact()> Public Sub IdentifierNameSyntax2() Dim dataFlowResults = CompileAndAnalyzeDataFlow( <compilation> <file name="a.vb"> Imports Microsoft.VisualBasic Public Class C Sub M() Dim n1 = [|Goo|](85) End Sub Function Goo(i As Integer) As Integer Return i End Function End Class </file> </compilation>) Assert.True(dataFlowResults.Succeeded) End Sub <WorkItem(542860, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/542860")> <Fact()> Public Sub IdentifierNameSyntax3() Dim dataFlowResults = CompileAndAnalyzeDataFlow( <compilation> <file name="a.vb"> Imports Microsoft.VisualBasic Public Class C Sub M() Dim n1 = [|Goo|](85) End Sub ReadOnly Property Goo(i As Integer) As Integer Get Return i End Get End Property End Class </file> </compilation>) Assert.True(dataFlowResults.Succeeded) End Sub <WorkItem(543369, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/543369")> <Fact()> Public Sub PredefinedTypeIncompleteSub() Dim dataFlowResults = CompileAndAnalyzeDataFlow( <compilation> <file name="a.vb"> Friend Module AcceptVB7_12mod Sub AcceptVB7_12() Dim lng As [|Integer|] Dim int1 As Short </file> </compilation>) Assert.False(dataFlowResults.Succeeded) End Sub <WorkItem(543369, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/543369")> <Fact()> Public Sub PredefinedType2() Dim dataFlowResults = CompileAndAnalyzeDataFlow( <compilation> <file name="a.vb"> Friend Module AcceptVB7_12mod Sub AcceptVB7_12() Dim lng As [|Integer|] Dim int1 As Short End Sub And Module </file> </compilation>) Assert.False(dataFlowResults.Succeeded) End Sub <WorkItem(543461, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/543461")> <Fact()> Public Sub CollectionInitSyntax() Dim compilation = CreateCompilationWithMscorlib40AndVBRuntime( <compilation> <file name="a.vb"> Module Program Sub Main(args As String()) Dim i1 = New Integer() {4, 5} End Sub End Module </file> </compilation>) Dim tree = compilation.SyntaxTrees.First() Dim model = compilation.GetSemanticModel(tree) Dim exprSyntaxNode = DirectCast(tree.GetCompilationUnitRoot().FindToken(tree.GetRoot.ToFullString().IndexOf("{4, 5}", StringComparison.Ordinal)).Parent, CollectionInitializerSyntax) Dim analysis = model.AnalyzeDataFlow(exprSyntaxNode) Assert.False(analysis.Succeeded) End Sub <WorkItem(543461, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/543461")> <Fact()> Public Sub CollectionInitSyntax2() Dim compilation = CreateCompilationWithMscorlib40AndVBRuntime( <compilation> <file name="a.vb"> Imports System.Collections.Generic Module Program Sub Main(args As String()) Dim i1 = New List(Of Integer) From {4, 5} End Sub End Module </file> </compilation>) Dim tree = compilation.SyntaxTrees.First() Dim model = compilation.GetSemanticModel(tree) Dim exprSyntaxNode = DirectCast(tree.GetCompilationUnitRoot().FindToken(tree.GetRoot.ToFullString().IndexOf("{4, 5}", StringComparison.Ordinal)).Parent, CollectionInitializerSyntax) Dim analysis = model.AnalyzeDataFlow(exprSyntaxNode) Assert.False(analysis.Succeeded) End Sub <WorkItem(543461, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/543461")> <Fact()> Public Sub CollectionInitSyntax3() Dim compilation = CreateCompilationWithMscorlib40AndVBRuntime( <compilation> <file name="a.vb"> Imports System.Collections.Generic Module Program Sub Main(args As String()) Dim i1 = {4, 5} End Sub End Module </file> </compilation>) Dim tree = compilation.SyntaxTrees.First() Dim model = compilation.GetSemanticModel(tree) Dim exprSyntaxNode = DirectCast(tree.GetCompilationUnitRoot().FindToken(tree.GetRoot.ToFullString().IndexOf("{4, 5}", StringComparison.Ordinal)).Parent, CollectionInitializerSyntax) Dim analysis = model.AnalyzeDataFlow(exprSyntaxNode) Assert.True(analysis.Succeeded) End Sub <WorkItem(543509, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/543509")> <Fact()> Public Sub IfStatementSyntax() Dim compilation = CreateCompilationWithMscorlib40AndVBRuntime( <compilation> <file name="a.vb"> Module Program Sub Main(args As String()) Dim x = 10 If False x = x + 1 End If End Sub End Module </file> </compilation>) Dim tree = compilation.SyntaxTrees.First() Dim model = compilation.GetSemanticModel(tree) Dim stmtSyntaxNode = DirectCast(tree.GetCompilationUnitRoot().FindToken(tree.GetRoot.ToFullString().IndexOf("If False", StringComparison.Ordinal)).Parent, IfStatementSyntax) Dim analysis = model.AnalyzeControlFlow(stmtSyntaxNode, stmtSyntaxNode) Assert.False(analysis.Succeeded) End Sub <Fact()> Public Sub ElseStatementSyntax() Dim compilation = CreateCompilationWithMscorlib40AndVBRuntime( <compilation> <file name="a.vb"> Module Program Sub Main(args As String()) Dim x = 10 If False x = x + 1 Else x = x - 1 End If End Sub End Module </file> </compilation>) Dim tree = compilation.SyntaxTrees.First() Dim model = compilation.GetSemanticModel(tree) Dim stmtSyntaxNode = DirectCast(tree.GetCompilationUnitRoot().FindToken(tree.GetRoot.ToFullString().IndexOf("Else", StringComparison.Ordinal)).Parent, ElseStatementSyntax) Dim analysis = model.AnalyzeControlFlow(stmtSyntaxNode, stmtSyntaxNode) Assert.False(analysis.Succeeded) End Sub <Fact()> Public Sub WithStatementSyntax() Dim compilation = CreateCompilationWithMscorlib40AndVBRuntime( <compilation> <file name="a.vb"> Module Program Sub Main(args As String()) With New Object() End With End Sub End Module </file> </compilation>) Dim tree = compilation.SyntaxTrees.First() Dim model = compilation.GetSemanticModel(tree) Dim stmtSyntaxNode = DirectCast(tree.GetCompilationUnitRoot().FindToken(tree.GetRoot.ToFullString().IndexOf("With New Object()", StringComparison.Ordinal)).Parent, WithStatementSyntax) Dim analysis = model.AnalyzeControlFlow(stmtSyntaxNode, stmtSyntaxNode) Assert.False(analysis.Succeeded) End Sub <WorkItem(757796, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/757796")> <Fact()> Public Sub Bug757796() Dim compilation = CreateCompilationWithMscorlib40AndVBRuntime( <compilation> <file name="a.vb"> Imports System Module Program Sub Main(args As String()) Dim tableauEmission(123) As Integer For t As Integer = 0 To 123 - 1 With tableauEmission(t) End With Next End Sub End Module </file> </compilation>) Dim tree = compilation.SyntaxTrees.First() Dim model = compilation.GetSemanticModel(tree) Dim withStatement = DirectCast(tree.GetCompilationUnitRoot().FindToken(tree.GetRoot.ToFullString().IndexOf("With tableauEmission(t)", StringComparison.Ordinal)).Parent, WithStatementSyntax) Dim tableauEmissionNode = DirectCast(withStatement.Expression, Microsoft.CodeAnalysis.VisualBasic.Syntax.InvocationExpressionSyntax).Expression Dim analysis = model.AnalyzeDataFlow(tableauEmissionNode) Assert.True(analysis.Succeeded) End Sub <Fact()> Public Sub TryStatementSyntax() Dim compilation = CreateCompilationWithMscorlib40AndVBRuntime( <compilation> <file name="a.vb"> Module Program Sub Main(args As String()) Try Dim a = 123 Catch e As Exception End Try End Sub End Module </file> </compilation>) Dim tree = compilation.SyntaxTrees.First() Dim model = compilation.GetSemanticModel(tree) Dim stmtSyntaxNode = DirectCast(tree.GetCompilationUnitRoot().FindToken(tree.GetRoot.ToFullString().IndexOf("Try", StringComparison.Ordinal)).Parent, TryStatementSyntax) Dim analysis = model.AnalyzeControlFlow(stmtSyntaxNode, stmtSyntaxNode) Assert.False(analysis.Succeeded) End Sub <Fact()> Public Sub CatchStatementSyntax() Dim compilation = CreateCompilationWithMscorlib40AndVBRuntime( <compilation> <file name="a.vb"> Module Program Sub Main(args As String()) Try Dim a = 123 Catch e As Exception End Try End Sub End Module </file> </compilation>) Dim tree = compilation.SyntaxTrees.First() Dim model = compilation.GetSemanticModel(tree) Dim stmtSyntaxNode = DirectCast(tree.GetCompilationUnitRoot().FindToken(tree.GetRoot.ToFullString().IndexOf("Catch e As Exception", StringComparison.Ordinal)).Parent, CatchStatementSyntax) Dim analysis = model.AnalyzeControlFlow(stmtSyntaxNode, stmtSyntaxNode) Assert.False(analysis.Succeeded) End Sub <Fact()> Public Sub FinallyStatementSyntax() Dim compilation = CreateCompilationWithMscorlib40AndVBRuntime( <compilation> <file name="a.vb"> Module Program Sub Main(args As String()) Try Dim a = 123 Finally End Try End Sub End Module </file> </compilation>) Dim tree = compilation.SyntaxTrees.First() Dim model = compilation.GetSemanticModel(tree) Dim stmtSyntaxNode = DirectCast(tree.GetCompilationUnitRoot().FindToken(tree.GetRoot.ToFullString().IndexOf("Finally", StringComparison.Ordinal)).Parent, FinallyStatementSyntax) Dim analysis = model.AnalyzeControlFlow(stmtSyntaxNode, stmtSyntaxNode) Assert.False(analysis.Succeeded) End Sub <WorkItem(543722, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/543722")> <Fact()> Public Sub SyncLockStatementSyntax() Dim compilation = CreateCompilationWithMscorlib40AndVBRuntime( <compilation> <file name="a.vb"> Module Program Sub Main(args As String()) SyncLock New With {.x = 0} End SyncLock End Sub End Module </file> </compilation>) Dim tree = compilation.SyntaxTrees.First() Dim model = compilation.GetSemanticModel(tree) Dim stmtSyntaxNode = DirectCast(tree.GetCompilationUnitRoot().FindToken(tree.GetRoot.ToFullString().IndexOf("SyncLock New With {.x = 0}", StringComparison.Ordinal)).Parent, SyncLockStatementSyntax) Dim analysis = model.AnalyzeControlFlow(stmtSyntaxNode, stmtSyntaxNode) Assert.False(analysis.Succeeded) End Sub <WorkItem(543736, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/543736")> <Fact()> Public Sub WhileStatementSyntax() Dim compilation = CreateCompilationWithMscorlib40AndVBRuntime( <compilation> <file name="a.vb"> Module Program Sub Main(args As String()) While True End While End Sub End Module </file> </compilation>) Dim tree = compilation.SyntaxTrees.First() Dim model = compilation.GetSemanticModel(tree) Dim stmtSyntaxNode = DirectCast(tree.GetCompilationUnitRoot().FindToken(tree.GetRoot.ToFullString().IndexOf("While True", StringComparison.Ordinal)).Parent, WhileStatementSyntax) Dim analysis = model.AnalyzeControlFlow(stmtSyntaxNode, stmtSyntaxNode) Assert.False(analysis.Succeeded) End Sub <Fact()> Public Sub UsingStatementSyntax() Dim compilation = CreateCompilationWithMscorlib40AndVBRuntime( <compilation> <file name="a.vb"> Imports System.IO Module Program Sub Main(args As String()) Using mem = New MemoryStream() End Using End Sub End Module </file> </compilation>) Dim tree = compilation.SyntaxTrees.First() Dim model = compilation.GetSemanticModel(tree) Dim stmtSyntaxNode = DirectCast(tree.GetCompilationUnitRoot().FindToken(tree.GetRoot.ToFullString().IndexOf("Using mem = New MemoryStream()", StringComparison.Ordinal)).Parent, UsingStatementSyntax) Dim analysis = model.AnalyzeControlFlow(stmtSyntaxNode, stmtSyntaxNode) Assert.False(analysis.Succeeded) End Sub <WorkItem(545449, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/545449")> <Fact()> Public Sub LoopWhileStatementSyntax() Dim compilation = CreateCompilationWithMscorlib40AndVBRuntime( <compilation> <file name="a.vb"> Imports System.IO Module Program Sub Main(args As String()) Do If Not Me.Scan() Then Return False End If Loop While Me.backwardBranchChanged Return True End Sub End Module </file> </compilation>) Dim tree = compilation.SyntaxTrees.First() Dim model = compilation.GetSemanticModel(tree) Dim stmtSyntaxNode = DirectCast(tree.GetCompilationUnitRoot().FindToken(tree.GetRoot.ToFullString().IndexOf("Loop While Me.backwardBranchChanged", StringComparison.Ordinal)).Parent, LoopStatementSyntax) Dim analysis = model.AnalyzeControlFlow(stmtSyntaxNode) Assert.False(analysis.Succeeded) End Sub <Fact()> Public Sub SelectStatementSyntax() Dim compilation = CreateCompilationWithMscorlib40AndVBRuntime( <compilation> <file name="a.vb"> Class Frame Sub Goo() Select Case 1 + 2 + 3 Case 1 Case 2 End Select End Sub End Class </file> </compilation>) Dim tree = compilation.SyntaxTrees.First() Dim model = compilation.GetSemanticModel(tree) Dim stmtSyntaxNode = DirectCast(tree.GetCompilationUnitRoot().FindToken(tree.GetRoot.ToFullString().IndexOf("Select Case 1 + 2 + 3", StringComparison.Ordinal)).Parent, SelectStatementSyntax) Dim analysis = model.AnalyzeControlFlow(stmtSyntaxNode, stmtSyntaxNode) Assert.False(analysis.Succeeded) End Sub <Fact()> Public Sub CaseStatementSyntax() Dim compilation = CreateCompilationWithMscorlib40AndVBRuntime( <compilation> <file name="a.vb"> Class Frame Sub Goo() Select Case 1 + 2 + 3 Case 1 Case 2 End Select End Sub End Class </file> </compilation>) Dim tree = compilation.SyntaxTrees.First() Dim model = compilation.GetSemanticModel(tree) Dim selectSyntaxNode = DirectCast(tree.GetCompilationUnitRoot().FindToken(tree.GetRoot.ToFullString().IndexOf("Select Case 1 + 2 + 3", StringComparison.Ordinal)).Parent, SelectStatementSyntax) Dim stmtSyntaxNode = DirectCast(selectSyntaxNode.Parent, SelectBlockSyntax).CaseBlocks(0).CaseStatement Dim analysis = model.AnalyzeControlFlow(stmtSyntaxNode, stmtSyntaxNode) Assert.False(analysis.Succeeded) End Sub <Fact()> Public Sub DoStatementSyntax() Dim compilation = CreateCompilationWithMscorlib40AndVBRuntime( <compilation> <file name="a.vb"> Class Frame Sub Goo() Do Exit Do Loop End Sub End Class </file> </compilation>) Dim tree = compilation.SyntaxTrees.First() Dim model = compilation.GetSemanticModel(tree) Dim stmtSyntaxNode = DirectCast(tree.GetCompilationUnitRoot().FindToken(tree.GetRoot.ToFullString().IndexOf("Do", StringComparison.Ordinal)).Parent, DoStatementSyntax) Dim analysis = model.AnalyzeControlFlow(stmtSyntaxNode, stmtSyntaxNode) Assert.False(analysis.Succeeded) End Sub <Fact()> Public Sub ForStatementSyntax() Dim compilation = CreateCompilationWithMscorlib40AndVBRuntime( <compilation> <file name="a.vb"> Class Frame Sub Goo() For i = 0 To 1 Next End Sub End Class </file> </compilation>) Dim tree = compilation.SyntaxTrees.First() Dim model = compilation.GetSemanticModel(tree) Dim stmtSyntaxNode = DirectCast(tree.GetCompilationUnitRoot().FindToken(tree.GetRoot.ToFullString().IndexOf("For i = 0 To 1", StringComparison.Ordinal)).Parent, ForStatementSyntax) Dim analysis = model.AnalyzeControlFlow(stmtSyntaxNode, stmtSyntaxNode) Assert.False(analysis.Succeeded) End Sub <Fact()> Public Sub ForEachStatementSyntax() Dim compilation = CreateCompilationWithMscorlib40AndVBRuntime( <compilation> <file name="a.vb"> Class Frame Sub Goo() For Each c In "" Next End Sub End Class </file> </compilation>) Dim tree = compilation.SyntaxTrees.First() Dim model = compilation.GetSemanticModel(tree) Dim stmtSyntaxNode = DirectCast(tree.GetCompilationUnitRoot().FindToken(tree.GetRoot.ToFullString().IndexOf("For Each c In """"", StringComparison.Ordinal)).Parent, ForEachStatementSyntax) Dim analysis = model.AnalyzeControlFlow(stmtSyntaxNode, stmtSyntaxNode) Assert.False(analysis.Succeeded) End Sub <WorkItem(543548, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/543548")> <Fact()> Public Sub NamespaceIdentifierNameInMemberAccess() Dim dataFlowResults = CompileAndAnalyzeDataFlow( <compilation> <file name="a.vb"> Namespace STForEach01 Friend Module STForEach01mod Sub STForEach01 End Sub End Module End Namespace Friend Module MainModule Sub Main() [|STForEach01|].STForEach01 End Sub End Module </file> </compilation>) Assert.False(dataFlowResults.Succeeded) End Sub <WorkItem(543548, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/543548")> <Fact()> Public Sub NamespaceIdentifierNameInMemberAccess2() Dim dataFlowResults = CompileAndAnalyzeDataFlow( <compilation> <file name="a.vb"> Namespace STForEach01 Friend Module STForEach01mod Sub STForEach01 End Sub End Module End Namespace Friend Module MainModule Sub Main() [|STForEach01.STForEach01mod|].STForEach01 End Sub End Module </file> </compilation>) Assert.False(dataFlowResults.Succeeded) End Sub <WorkItem(543548, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/543548")> <Fact()> Public Sub NamespaceIdentifierNameInMemberAccess3() Dim dataFlowResults = CompileAndAnalyzeDataFlow( <compilation> <file name="a.vb"> Namespace STForEach01 Friend Module STForEach01mod ReadOnly Property STForEach01 As Integer Get Return 1 End Get End Property End Module End Namespace Friend Module MainModule Sub Main() Dim a As Integer = [|STForEach01|].STForEach01 End Sub End Module </file> </compilation>) Assert.False(dataFlowResults.Succeeded) End Sub <WorkItem(543548, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/543548")> <Fact()> Public Sub NamespaceIdentifierNameInMemberAccess4() Dim dataFlowResults = CompileAndAnalyzeDataFlow( <compilation> <file name="a.vb"> Namespace STForEach01 Friend Module STForEach01mod ReadOnly Property STForEach01 As Integer Get Return 1 End Get End Property End Module End Namespace Friend Module MainModule Sub Main() Dim a As Integer = [|STForEach01.STForEach01mod|].STForEach01 End Sub End Module </file> </compilation>) Assert.False(dataFlowResults.Succeeded) End Sub <WorkItem(543695, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/543695")> <Fact()> Public Sub NamespaceIdentifierNameInMemberAccess5() Dim dataFlowResults = CompileAndAnalyzeDataFlow( <compilation> <file name="a.vb"> Module Program Sub Main() Dim d1 = Sub(x As Integer) [|System|].Console.WriteLine(x) End Sub End Sub End Module </file> </compilation>) Assert.False(dataFlowResults.Succeeded) End Sub <WorkItem(543695, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/543695")> <Fact()> Public Sub NamespaceIdentifierNameInMemberAccess6() Dim dataFlowResults = CompileAndAnalyzeDataFlow( <compilation> <file name="a.vb"> Module Program Sub Main() [|System|].Console.WriteLine(x) End Sub End Module </file> </compilation>) Assert.False(dataFlowResults.Succeeded) End Sub <WorkItem(543695, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/543695")> <Fact()> Public Sub NamespaceIdentifierNameInMemberAccess7() Dim dataFlowResults = CompileAndAnalyzeDataFlow( <compilation> <file name="a.vb"> Public Class A Public Class B Public Shared Sub M() End Sub End Class End Class Module Program Sub Main() [|A.B|].M() End Sub End Module </file> </compilation>) Assert.False(dataFlowResults.Succeeded) End Sub <WorkItem(543695, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/543695")> <Fact()> Public Sub NamespaceIdentifierNameInMemberAccess8() Dim dataFlowResults = CompileAndAnalyzeDataFlow( <compilation> <file name="a.vb"> Public Class A Public Class B Public Shared Sub M() End Sub End Class End Class Module Program Sub Main() [|A|].B.M() End Sub End Module </file> </compilation>) Assert.False(dataFlowResults.Succeeded) End Sub <WorkItem(545080, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/545080")> <Fact()> Public Sub NamespaceIdentifierNameInMemberAccess9() Dim dataFlowResults = CompileAndAnalyzeDataFlow( <compilation> <file name="a.vb"> Public Class Compilation Public Class B Public Shared Function M(a As Integer) As Boolean Return False End Function End Class End Class Friend Class Program Public Shared Sub Main() Dim x = [| Compilation |].B.M(a:=123) End Sub Public ReadOnly Property Compilation As Compilation Get Return Nothing End Get End Property End Class </file> </compilation>) Assert.False(dataFlowResults.Succeeded) End Sub <WorkItem(545080, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/545080")> <Fact()> Public Sub NamespaceIdentifierNameInMemberAccess10() Dim dataFlowResults = CompileAndAnalyzeDataFlow( <compilation> <file name="a.vb"> Public Class Compilation Public Shared Function M(a As Integer) As Boolean Return False End Function End Class Friend Class Program Public Shared Sub Main() Dim x = [| Compilation |].M(a:=123) End Sub Public ReadOnly Property Compilation As Compilation Get Return Nothing End Get End Property End Class </file> </compilation>) Assert.False(dataFlowResults.Succeeded) End Sub <Fact()> Public Sub ConstLocalUsedInLambda01() Dim analysisResult = CompileAndAnalyzeDataFlow( <compilation> <file name="a.vb"> Imports System Module M1 Sub Main() Dim local = 1 Const constLocal = 2 Dim f = [| Function(p as sbyte) As Short Return local + constlocal + p End Function |] Console.Write(f) End Sub End Module </file> </compilation>) Assert.Equal("p", GetSymbolNamesJoined(analysisResult.VariablesDeclared)) Assert.Equal(Nothing, GetSymbolNamesJoined(analysisResult.AlwaysAssigned)) Assert.Equal("local", GetSymbolNamesJoined(analysisResult.Captured)) Assert.Equal("local", GetSymbolNamesJoined(analysisResult.CapturedInside)) Assert.Equal(Nothing, GetSymbolNamesJoined(analysisResult.CapturedOutside)) Assert.Equal("local, constLocal", GetSymbolNamesJoined(analysisResult.DataFlowsIn)) Assert.Equal(Nothing, GetSymbolNamesJoined(analysisResult.DataFlowsOut)) Assert.Equal("local, constLocal, f", GetSymbolNamesJoined(analysisResult.DefinitelyAssignedOnEntry)) Assert.Equal("local, constLocal, f", GetSymbolNamesJoined(analysisResult.DefinitelyAssignedOnExit)) Assert.Equal("local, constLocal, p", GetSymbolNamesJoined(analysisResult.ReadInside)) ' WHY Assert.Equal("p", GetSymbolNamesJoined(analysisResult.WrittenInside)) Assert.Equal("f", GetSymbolNamesJoined(analysisResult.ReadOutside)) Assert.Equal("local, constLocal, f", GetSymbolNamesJoined(analysisResult.WrittenOutside)) End Sub <Fact()> Public Sub ConstLocalUsedInLambda02() Dim analysisResult = CompileAndAnalyzeDataFlow( <compilation> <file name="a.vb"> Class C Function F(mp As Short) As Integer Try Dim local = 1 Const constLocal = 2 Dim lf = [| Sub() local = constlocal + mp End Sub |] lf() Return local Finally End Try End Function End Class </file> </compilation>) Assert.Equal(Nothing, GetSymbolNamesJoined(analysisResult.VariablesDeclared)) Assert.Equal(Nothing, GetSymbolNamesJoined(analysisResult.AlwaysAssigned)) Assert.Equal("mp, local", GetSymbolNamesJoined(analysisResult.Captured)) Assert.Equal("mp, local", GetSymbolNamesJoined(analysisResult.CapturedInside)) Assert.Equal(Nothing, GetSymbolNamesJoined(analysisResult.CapturedOutside)) Assert.Equal("mp, constLocal", GetSymbolNamesJoined(analysisResult.DataFlowsIn)) Assert.Equal("Me, mp, local, constLocal, lf", GetSymbolNamesJoined(analysisResult.DefinitelyAssignedOnEntry)) Assert.Equal("Me, mp, local, constLocal, lf", GetSymbolNamesJoined(analysisResult.DefinitelyAssignedOnExit)) Assert.Equal("local", GetSymbolNamesJoined(analysisResult.DataFlowsOut)) Assert.Equal("mp, constLocal", GetSymbolNamesJoined(analysisResult.ReadInside)) Assert.Equal("local", GetSymbolNamesJoined(analysisResult.WrittenInside)) Assert.Equal("local, lf", GetSymbolNamesJoined(analysisResult.ReadOutside)) Assert.Equal("Me, mp, local, constLocal, lf", GetSymbolNamesJoined(analysisResult.WrittenOutside)) End Sub <WorkItem(543701, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/543701")> <Fact()> Public Sub LiteralExprInVarDeclInsideSingleLineLambda() Dim dataFlowResults = CompileAndAnalyzeDataFlow( <compilation> <file name="a.vb"> Module Test Sub Sub1() Dim x = Sub() Dim y = [|10|] End Sub End Module </file> </compilation>) Assert.True(dataFlowResults.Succeeded) End Sub <WorkItem(543702, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/543702")> <Fact()> Public Sub LiteralExprInsideEnumMemberDecl() Dim dataFlowResults = CompileAndAnalyzeDataFlow( <compilation> <file name="a.vb"> Module Program Enum NUMBERS One = [|1|] End Enum End Module </file> </compilation>) Assert.False(dataFlowResults.Succeeded) End Sub <WorkItem(11662, "DevDiv_Projects/Roslyn")> <Fact()> Public Sub ObjectCreationExpr() Dim dataFlowResults = CompileAndAnalyzeDataFlow( <compilation> <file name="a.vb"> Module Program Sub Main(args As String()) Dim x As [|New C|] End Sub End Module </file> </compilation>) Assert.True(dataFlowResults.Succeeded) End Sub #Region "ObjectInitializer" <Fact()> Public Sub ObjectInitializersNoLocalsAccessed() Dim dataFlowAnalysisResults = CompileAndAnalyzeDataFlow( <compilation> <file name="a.vb"> Imports System Public Class C1 Public FieldInt As Long Public FieldStr As String Public Property PropInt As Integer End Class Public Class C2 Public Shared Sub Main() Dim intlocal As Integer Dim x = New C1() With {.FieldStr = [|.FieldInt.ToString()|]} End Sub End Class </file> </compilation>) Assert.Null(GetSymbolNamesJoined(dataFlowAnalysisResults.VariablesDeclared)) Assert.Null(GetSymbolNamesJoined(dataFlowAnalysisResults.AlwaysAssigned)) Assert.Null(GetSymbolNamesJoined(dataFlowAnalysisResults.DataFlowsIn)) Assert.Null(GetSymbolNamesJoined(dataFlowAnalysisResults.DataFlowsOut)) Assert.Null(GetSymbolNamesJoined(dataFlowAnalysisResults.ReadInside)) Assert.Null(GetSymbolNamesJoined(dataFlowAnalysisResults.ReadOutside)) Assert.Null(GetSymbolNamesJoined(dataFlowAnalysisResults.WrittenInside)) Assert.Equal("x", GetSymbolNamesJoined(dataFlowAnalysisResults.WrittenOutside)) End Sub <WorkItem(544298, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/544298")> <Fact()> Public Sub ObjectInitializersLocalsAccessed1_OnlyImplicitReceiverRegion1() Dim dataFlowAnalysisResults = CompileAndAnalyzeDataFlow( <compilation> <file name="a.vb"> Imports System Public Structure S1 Public FieldInt As Long Public FieldStr As String Public Property PropInt As Integer End Structure Public Class S2 Public Shared Sub Main() Dim x, y As New S1() With {.FieldStr = [|.FieldInt.ToString()|]} End Sub End Class </file> </compilation>) Assert.False(dataFlowAnalysisResults.Succeeded) End Sub <WorkItem(544298, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/544298")> <Fact()> Public Sub ObjectInitializersLocalsAccessed1_OnlyImplicitReceiverRegion2() Dim dataFlowAnalysisResults = CompileAndAnalyzeDataFlow( <compilation> <file name="a.vb"> Imports System Public Structure S1 Public FieldInt As Long Public FieldStr As String Public Property PropInt As Integer End Structure Public Class S2 Public Shared Sub Main() Dim x, y As New S1() With {.FieldInt = [|.FieldStr.Length|]} End Sub End Class </file> </compilation>) Assert.False(dataFlowAnalysisResults.Succeeded) End Sub <WorkItem(544298, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/544298")> <Fact()> Public Sub ObjectInitializersLocalsAccessed1_DeclAndImplicitReceiverRegion() Dim dataFlowAnalysisResults = CompileAndAnalyzeDataFlow( <compilation> <file name="a.vb"> Imports System Public Structure S1 Public FieldInt As Long Public FieldStr As String Public Property PropInt As Integer End Structure Public Class S2 Public Shared Sub Main() [| Dim x, y As New S1() With {.FieldInt = .FieldStr.Length} |] End Sub End Class </file> </compilation>) Assert.True(dataFlowAnalysisResults.Succeeded) Assert.Equal("x, y", GetSymbolNamesJoined(dataFlowAnalysisResults.VariablesDeclared)) Assert.Equal("x, y", GetSymbolNamesJoined(dataFlowAnalysisResults.AlwaysAssigned)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowAnalysisResults.Captured)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowAnalysisResults.CapturedInside)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowAnalysisResults.CapturedOutside)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowAnalysisResults.DataFlowsIn)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowAnalysisResults.DataFlowsOut)) Assert.Equal("x, y", GetSymbolNamesJoined(dataFlowAnalysisResults.ReadInside)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowAnalysisResults.ReadOutside)) Assert.Equal("x, y", GetSymbolNamesJoined(dataFlowAnalysisResults.WrittenInside)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowAnalysisResults.WrittenOutside)) End Sub <WorkItem(544298, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/544298")> <Fact()> Public Sub ObjectInitializersLocalsAccessed1_ValidRegion1() Dim dataFlowAnalysisResults = CompileAndAnalyzeDataFlow( <compilation> <file name="a.vb"> Imports System Public Structure S1 Public FieldInt As Long Public FieldStr As String Default Public Property PropInt(i As String) As String Get Return 0 End Get Set(value As String) End Set End Property End Structure Public Class S2 Public Shared Sub Main() Dim x, y As New S1() With {.FieldInt = !A.Length } x.FieldInt = [| x!A.Length |] End Sub End Class </file> </compilation>) Assert.True(dataFlowAnalysisResults.Succeeded) Assert.Null(GetSymbolNamesJoined(dataFlowAnalysisResults.VariablesDeclared)) Assert.Null(GetSymbolNamesJoined(dataFlowAnalysisResults.AlwaysAssigned)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowAnalysisResults.Captured)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowAnalysisResults.CapturedInside)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowAnalysisResults.CapturedOutside)) Assert.Equal("x", GetSymbolNamesJoined(dataFlowAnalysisResults.DataFlowsIn)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowAnalysisResults.DataFlowsOut)) Assert.Equal("x", GetSymbolNamesJoined(dataFlowAnalysisResults.ReadInside)) Assert.Equal("x, y", GetSymbolNamesJoined(dataFlowAnalysisResults.ReadOutside)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowAnalysisResults.WrittenInside)) Assert.Equal("x, y", GetSymbolNamesJoined(dataFlowAnalysisResults.WrittenOutside)) End Sub <WorkItem(544298, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/544298")> <Fact()> Public Sub ObjectInitializersLocalsAccessed1_ValidRegion2() Dim dataFlowAnalysisResults = CompileAndAnalyzeDataFlow( <compilation> <file name="a.vb"> Imports System Public Structure S1 Public FieldInt As Long Public FieldStr As String Default Public Property PropInt(i As String) As String Get Return 0 End Get Set(value As String) End Set End Property End Structure Public Class S2 Public Shared Sub Main() Dim x, y As New S1() With {.FieldInt = [| x!A.Length |] } End Sub End Class </file> </compilation>) Assert.True(dataFlowAnalysisResults.Succeeded) Assert.Null(GetSymbolNamesJoined(dataFlowAnalysisResults.VariablesDeclared)) Assert.Null(GetSymbolNamesJoined(dataFlowAnalysisResults.AlwaysAssigned)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowAnalysisResults.Captured)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowAnalysisResults.CapturedInside)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowAnalysisResults.CapturedOutside)) Assert.Equal("x", GetSymbolNamesJoined(dataFlowAnalysisResults.DataFlowsIn)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowAnalysisResults.DataFlowsOut)) Assert.Equal("x", GetSymbolNamesJoined(dataFlowAnalysisResults.ReadInside)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowAnalysisResults.ReadOutside)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowAnalysisResults.WrittenInside)) Assert.Equal("x, y", GetSymbolNamesJoined(dataFlowAnalysisResults.WrittenOutside)) End Sub <WorkItem(544298, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/544298")> <Fact()> Public Sub ObjectInitializersLocalsAccessed1_InvalidRegion3() Dim dataFlowAnalysisResults = CompileAndAnalyzeDataFlow( <compilation> <file name="a.vb"> Imports System Public Structure S1 Public FieldInt As Long Public FieldStr As String Default Public Property PropInt(i As String) As String Get Return 0 End Get Set(value As String) End Set End Property End Structure Public Class S2 Public Shared Sub Main() Dim x, y As New S1() With {.FieldStr = [| !A |] } End Sub End Class </file> </compilation>) Assert.False(dataFlowAnalysisResults.Succeeded) End Sub <WorkItem(531226, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/531226")> <Fact()> Public Sub DisableConstantLiteralRegion() Dim dataFlowAnalysisResults = CompileAndAnalyzeDataFlow( <compilation> <file name="a.vb"> Imports System Public Class S2 Public Shared Sub Main() Const PERUSER_EXTENSION As String = [|".user"|] 'Project .user file extension End Sub End Class </file> </compilation>) Assert.False(dataFlowAnalysisResults.Succeeded) End Sub <WorkItem(531226, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/531226")> <Fact()> Public Sub WithStatement_LValueExpression() Dim dataFlowAnalysisResults = CompileAndAnalyzeDataFlow( <compilation> <file name="a.vb"> Imports System Public Structure S1 Public F1 As Integer Public F2 As Integer End Structure Public Class S2 Public Shared Sub Main() Dim arr() As S1 = {} With arr([|0|]) Console.WriteLine(.F1) .F2 = 123 Console.WriteLine(.F2) End With End Sub End Class </file> </compilation>) Assert.True(dataFlowAnalysisResults.Succeeded) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowAnalysisResults.VariablesDeclared)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowAnalysisResults.AlwaysAssigned)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowAnalysisResults.DataFlowsIn)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowAnalysisResults.ReadInside)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowAnalysisResults.WrittenInside)) End Sub <WorkItem(531226, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/531226")> <Fact()> Public Sub WithStatement_LValueExpression2() Dim dataFlowAnalysisResults = CompileAndAnalyzeDataFlow( <compilation> <file name="a.vb"> Imports System Public Structure S1 Public F1 As Integer Public F2 As Integer End Structure Public Class S2 Public Shared Sub Main() Dim arr() As S1 = {} With arr([|0|]) End With End Sub End Class </file> </compilation>) Assert.False(dataFlowAnalysisResults.Succeeded) End Sub <WorkItem(531226, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/531226")> <Fact()> Public Sub WithStatement_LValueExpression3() Dim dataFlowAnalysisResults = CompileAndAnalyzeDataFlow( <compilation> <file name="a.vb"> Imports System Public Structure S1 Public F1 As Integer Public F2 As Integer End Structure Public Class S2 Public Shared Sub Main() Dim arr() As S1 = {} With [|arr(0)|] End With End Sub End Class </file> </compilation>) Assert.True(dataFlowAnalysisResults.Succeeded) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowAnalysisResults.VariablesDeclared)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowAnalysisResults.AlwaysAssigned)) Assert.Equal("arr", GetSymbolNamesJoined(dataFlowAnalysisResults.DataFlowsIn)) Assert.Equal("arr", GetSymbolNamesJoined(dataFlowAnalysisResults.ReadInside)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowAnalysisResults.WrittenInside)) End Sub <WorkItem(531226, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/531226")> <Fact()> Public Sub WithStatement_LValueExpression4() Dim dataFlowAnalysisResults = CompileAndAnalyzeDataFlow( <compilation> <file name="a.vb"> Imports System Public Structure S1 Public F1 As Integer Public F2 As Integer End Structure Public Class S2 Public Shared Sub Main() Dim arr As New S1 With [|arr|] End With End Sub End Class </file> </compilation>) Assert.False(dataFlowAnalysisResults.Succeeded) End Sub <WorkItem(544298, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/544298")> <Fact()> Public Sub ObjectInitializersLocalsAccessed1a_ObjectInitializer() Dim dataFlowAnalysisResults = CompileAndAnalyzeDataFlow( <compilation> <file name="a.vb"> Imports System Public Structure S1 Public FieldInt As Long Public FieldStr As String Public Property PropInt As Integer End Structure Public Class S2 Public Shared Sub Main() Dim o As New S1() With o [|Console.WriteLine(New S1() With {.FieldStr = .FieldInt.ToString()})|] End With End Sub End Class </file> </compilation>) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowAnalysisResults.VariablesDeclared)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowAnalysisResults.AlwaysAssigned)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowAnalysisResults.Captured)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowAnalysisResults.CapturedInside)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowAnalysisResults.CapturedOutside)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowAnalysisResults.DataFlowsIn)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowAnalysisResults.DataFlowsOut)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowAnalysisResults.ReadInside)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowAnalysisResults.ReadOutside)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowAnalysisResults.WrittenInside)) Assert.Equal("o", GetSymbolNamesJoined(dataFlowAnalysisResults.WrittenOutside)) End Sub <WorkItem(544298, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/544298")> <Fact()> Public Sub ObjectInitializersLocalsAccessed1a_ObjectInitializer2() Dim dataFlowAnalysisResults = CompileAndAnalyzeDataFlow( <compilation> <file name="a.vb"> Imports System Public Structure S1 Public FieldInt As Long Public FieldStr As String Public Property PropInt As Integer End Structure Public Class S2 Public Shared Sub Main() Dim o As New S1() With o Console.WriteLine(New S1() With {.FieldStr = [|.FieldInt.ToString()|] }) End With End Sub End Class </file> </compilation>) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowAnalysisResults.VariablesDeclared)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowAnalysisResults.AlwaysAssigned)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowAnalysisResults.Captured)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowAnalysisResults.CapturedInside)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowAnalysisResults.CapturedOutside)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowAnalysisResults.DataFlowsIn)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowAnalysisResults.DataFlowsOut)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowAnalysisResults.ReadInside)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowAnalysisResults.ReadOutside)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowAnalysisResults.WrittenInside)) Assert.Equal("o", GetSymbolNamesJoined(dataFlowAnalysisResults.WrittenOutside)) End Sub <WorkItem(544298, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/544298")> <Fact()> Public Sub ObjectInitializersLocalsAccessed1b() Dim dataFlowAnalysisResults = CompileAndAnalyzeDataFlow( <compilation> <file name="a.vb"> Imports System Imports System.Collections.Generic Public Structure S1 Public FieldInt As Long Public FieldStr As String Public Property PropInt As Integer End Structure Public Class S2 Public Shared Sub Main() Dim o As New S1() With o [|Console.WriteLine(New List(Of String) From {.FieldStr, "Brian", "Tim"})|] End With End Sub End Class </file> </compilation>) Assert.Null(GetSymbolNamesJoined(dataFlowAnalysisResults.VariablesDeclared)) Assert.Null(GetSymbolNamesJoined(dataFlowAnalysisResults.AlwaysAssigned)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowAnalysisResults.Captured)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowAnalysisResults.CapturedInside)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowAnalysisResults.CapturedOutside)) Assert.Equal("o", GetSymbolNamesJoined(dataFlowAnalysisResults.DataFlowsIn)) Assert.Null(GetSymbolNamesJoined(dataFlowAnalysisResults.DataFlowsOut)) Assert.Equal("o", GetSymbolNamesJoined(dataFlowAnalysisResults.ReadInside)) Assert.Null(GetSymbolNamesJoined(dataFlowAnalysisResults.ReadOutside)) Assert.Null(GetSymbolNamesJoined(dataFlowAnalysisResults.WrittenInside)) Assert.Equal("o", GetSymbolNamesJoined(dataFlowAnalysisResults.WrittenOutside)) End Sub <WorkItem(544298, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/544298")> <Fact()> Public Sub ObjectInitializersLocalsAccessed1bb() Dim dataFlowAnalysisResults = CompileAndAnalyzeDataFlow( <compilation> <file name="a.vb"> Imports System Imports System.Collections.Generic Public Structure S1 Public FieldInt As Long Public FieldStr As String Public Property PropInt As Integer End Structure Public Class S2 Public Shared Sub Main() Dim o As New S1() [|Console.WriteLine(New List(Of String) From {o.FieldStr, "Brian", "Tim"})|] End Sub End Class </file> </compilation>) Assert.Null(GetSymbolNamesJoined(dataFlowAnalysisResults.VariablesDeclared)) Assert.Null(GetSymbolNamesJoined(dataFlowAnalysisResults.AlwaysAssigned)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowAnalysisResults.Captured)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowAnalysisResults.CapturedInside)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowAnalysisResults.CapturedOutside)) Assert.Equal("o", GetSymbolNamesJoined(dataFlowAnalysisResults.DataFlowsIn)) Assert.Null(GetSymbolNamesJoined(dataFlowAnalysisResults.DataFlowsOut)) Assert.Equal("o", GetSymbolNamesJoined(dataFlowAnalysisResults.ReadInside)) Assert.Null(GetSymbolNamesJoined(dataFlowAnalysisResults.ReadOutside)) Assert.Null(GetSymbolNamesJoined(dataFlowAnalysisResults.WrittenInside)) Assert.Equal("o", GetSymbolNamesJoined(dataFlowAnalysisResults.WrittenOutside)) End Sub <WorkItem(544298, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/544298")> <Fact()> Public Sub ObjectInitializers_StructWithFieldAccessesInLambda1() Dim dataFlowAnalysisResults = CompileAndAnalyzeDataFlow( <compilation> <file name="a.vb"> Imports System Imports System.Collections.Generic Structure SS1 Public A As String Public B As String End Structure Structure SS2 Public X As SS1 Public Y As SS1 End Structure Structure Clazz Shared Sub TEST() Dim a, b As New SS2() With {.X = Function() As SS1 With .Y [| .A = "1" |] '.B = "2" End With Return .Y End Function.Invoke()} End Sub End Structure </file> </compilation>) Assert.False(dataFlowAnalysisResults.Succeeded) End Sub <WorkItem(544298, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/544298")> <Fact()> Public Sub ObjectInitializers_StructWithFieldAccessesInLambda2() Dim dataFlowAnalysisResults = CompileAndAnalyzeDataFlow( <compilation> <file name="a.vb"> Imports System Imports System.Collections.Generic Structure SS1 Public A As String Public B As String End Structure Structure SS2 Public X As SS1 Public Y As SS1 End Structure Structure Clazz Shared Sub TEST() Dim a, b As New SS2() With {.X = Function() As SS1 With .Y [| b.Y.B = a.Y.A a.Y.A = "1" |] End With Return .Y End Function.Invoke()} End Sub End Structure </file> </compilation>) Assert.True(dataFlowAnalysisResults.Succeeded) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowAnalysisResults.VariablesDeclared)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowAnalysisResults.AlwaysAssigned)) Assert.Equal("a, b", GetSymbolNamesJoined(dataFlowAnalysisResults.Captured)) Assert.Equal("a, b", GetSymbolNamesJoined(dataFlowAnalysisResults.CapturedInside)) Assert.Equal("a, b", GetSymbolNamesJoined(dataFlowAnalysisResults.CapturedOutside)) Assert.Equal("a", GetSymbolNamesJoined(dataFlowAnalysisResults.DataFlowsIn)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowAnalysisResults.DataFlowsOut)) Assert.Equal("a", GetSymbolNamesJoined(dataFlowAnalysisResults.ReadInside)) Assert.Equal("a, b", GetSymbolNamesJoined(dataFlowAnalysisResults.ReadOutside)) Assert.Equal("a, b", GetSymbolNamesJoined(dataFlowAnalysisResults.WrittenInside)) Assert.Equal("a, b", GetSymbolNamesJoined(dataFlowAnalysisResults.WrittenOutside)) End Sub <WorkItem(544298, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/544298")> <Fact()> Public Sub ObjectInitializers_StructWithFieldAccessesInLambda3() Dim dataFlowAnalysisResults = CompileAndAnalyzeDataFlow( <compilation> <file name="a.vb"> Imports System Imports System.Collections.Generic Structure SS1 Public A As String Public B As String End Structure Structure SS2 Public X As SS1 Public Y As SS1 End Structure Structure Clazz Sub New(i As Integer) Dim l = Sub() Dim a, b As New SS2() With {.X = Function() As SS1 With .Y [| b.Y.B = a.Y.A a.Y.A = "1" |] End With Return .Y End Function.Invoke()} End Sub End Sub End Structure </file> </compilation>) Assert.True(dataFlowAnalysisResults.Succeeded) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowAnalysisResults.VariablesDeclared)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowAnalysisResults.AlwaysAssigned)) Assert.Equal("a, b", GetSymbolNamesJoined(dataFlowAnalysisResults.Captured)) Assert.Equal("a, b", GetSymbolNamesJoined(dataFlowAnalysisResults.CapturedInside)) Assert.Equal("a, b", GetSymbolNamesJoined(dataFlowAnalysisResults.CapturedOutside)) Assert.Equal("a", GetSymbolNamesJoined(dataFlowAnalysisResults.DataFlowsIn)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowAnalysisResults.DataFlowsOut)) Assert.Equal("a", GetSymbolNamesJoined(dataFlowAnalysisResults.ReadInside)) Assert.Equal("Me, a, b", GetSymbolNamesJoined(dataFlowAnalysisResults.ReadOutside)) Assert.Equal("a, b", GetSymbolNamesJoined(dataFlowAnalysisResults.WrittenInside)) Assert.Equal("Me, i, l, a, b", GetSymbolNamesJoined(dataFlowAnalysisResults.WrittenOutside)) End Sub <WorkItem(544298, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/544298")> <Fact()> Public Sub ObjectInitializers_StructWithFieldAccessesInLambda4() Dim dataFlowAnalysisResults = CompileAndAnalyzeDataFlow( <compilation> <file name="a.vb"> Imports System Imports System.Collections.Generic Structure SS1 Public A As String Public B As String End Structure Structure SS2 Public X As SS1 Public Y As SS1 End Structure Structure Clazz Sub New(i As Integer) Dim a, b As New SS2() With {.X = Function() As SS1 [| a.Y = New SS1() b.Y = New SS1() |] Return .Y End Function.Invoke()} Console.WriteLine(a.ToString()) End Sub End Structure </file> </compilation>) Assert.True(dataFlowAnalysisResults.Succeeded) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowAnalysisResults.VariablesDeclared)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowAnalysisResults.AlwaysAssigned)) Assert.Equal("a, b", GetSymbolNamesJoined(dataFlowAnalysisResults.Captured)) Assert.Equal("a, b", GetSymbolNamesJoined(dataFlowAnalysisResults.CapturedInside)) Assert.Equal("a, b", GetSymbolNamesJoined(dataFlowAnalysisResults.CapturedOutside)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowAnalysisResults.DataFlowsIn)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowAnalysisResults.DataFlowsOut)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowAnalysisResults.ReadInside)) Assert.Equal("Me, a, b", GetSymbolNamesJoined(dataFlowAnalysisResults.ReadOutside)) Assert.Equal("a, b", GetSymbolNamesJoined(dataFlowAnalysisResults.WrittenInside)) Assert.Equal("Me, i, a, b", GetSymbolNamesJoined(dataFlowAnalysisResults.WrittenOutside)) End Sub <WorkItem(544298, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/544298")> <Fact()> Public Sub ObjectInitializers_StructWithFieldAccessesInLambda5() Dim dataFlowAnalysisResults = CompileAndAnalyzeDataFlow( <compilation> <file name="a.vb"> Imports System Imports System.Collections.Generic Structure SS1 Public A As String Public B As String End Structure Structure SS2 Public X As SS1 Public Y As SS1 End Structure Structure Clazz Sub New(i As Integer) Dim a, b As New SS2() With {.X = Function() As SS1 [| b.Y = New SS1() |] Return a.Y End Function.Invoke()} Console.WriteLine(a.ToString()) End Sub End Structure </file> </compilation>) Assert.True(dataFlowAnalysisResults.Succeeded) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowAnalysisResults.VariablesDeclared)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowAnalysisResults.AlwaysAssigned)) Assert.Equal("a, b", GetSymbolNamesJoined(dataFlowAnalysisResults.Captured)) Assert.Equal("b", GetSymbolNamesJoined(dataFlowAnalysisResults.CapturedInside)) Assert.Equal("a", GetSymbolNamesJoined(dataFlowAnalysisResults.CapturedOutside)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowAnalysisResults.DataFlowsIn)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowAnalysisResults.DataFlowsOut)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowAnalysisResults.ReadInside)) Assert.Equal("Me, a", GetSymbolNamesJoined(dataFlowAnalysisResults.ReadOutside)) Assert.Equal("b", GetSymbolNamesJoined(dataFlowAnalysisResults.WrittenInside)) Assert.Equal("Me, i, a, b", GetSymbolNamesJoined(dataFlowAnalysisResults.WrittenOutside)) End Sub <WorkItem(544298, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/544298")> <Fact()> Public Sub ObjectInitializers_StructWithFieldAccessesInLambda6() Dim dataFlowAnalysisResults = CompileAndAnalyzeDataFlow( <compilation> <file name="a.vb"> Imports System Imports System.Collections.Generic Structure SS1 Public A As String Public B As String End Structure Structure SS2 Public X As SS1 Public Y As SS1 End Structure Structure Clazz Sub New(i As Integer) Dim a, b As New SS2() With {.X = Function() As SS1 [| b.Y = New SS1() |] Return b.Y End Function.Invoke()} Console.WriteLine(a.ToString()) End Sub End Structure </file> </compilation>) Assert.True(dataFlowAnalysisResults.Succeeded) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowAnalysisResults.VariablesDeclared)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowAnalysisResults.AlwaysAssigned)) Assert.Equal("b", GetSymbolNamesJoined(dataFlowAnalysisResults.Captured)) Assert.Equal("b", GetSymbolNamesJoined(dataFlowAnalysisResults.CapturedInside)) Assert.Equal("b", GetSymbolNamesJoined(dataFlowAnalysisResults.CapturedOutside)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowAnalysisResults.DataFlowsIn)) Assert.Equal("b", GetSymbolNamesJoined(dataFlowAnalysisResults.DataFlowsOut)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowAnalysisResults.ReadInside)) Assert.Equal("Me, a, b", GetSymbolNamesJoined(dataFlowAnalysisResults.ReadOutside)) Assert.Equal("b", GetSymbolNamesJoined(dataFlowAnalysisResults.WrittenInside)) Assert.Equal("Me, i, a, b", GetSymbolNamesJoined(dataFlowAnalysisResults.WrittenOutside)) End Sub <WorkItem(544298, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/544298")> <Fact()> Public Sub ObjectInitializers_PassingFieldByRef() Dim dataFlowAnalysisResults = CompileAndAnalyzeDataFlow( <compilation> <file name="a.vb"> Imports System Imports System.Collections.Generic Structure SS1 Public A As String Public B As String End Structure Structure SS2 Public X As SS1 Public Y As SS1 End Structure Structure Clazz Shared Function Transform(ByRef p As SS1) As SS1 Return p End Function Sub New(i As Integer) Dim a, b As New SS2() With {.X = [| Transform(b.Y) |] } End Sub End Structure </file> </compilation>) Assert.True(dataFlowAnalysisResults.Succeeded) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowAnalysisResults.VariablesDeclared)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowAnalysisResults.AlwaysAssigned)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowAnalysisResults.Captured)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowAnalysisResults.CapturedInside)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowAnalysisResults.CapturedOutside)) Assert.Equal("b", GetSymbolNamesJoined(dataFlowAnalysisResults.DataFlowsIn)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowAnalysisResults.DataFlowsOut)) Assert.Equal("b", GetSymbolNamesJoined(dataFlowAnalysisResults.ReadInside)) Assert.Equal("Me", GetSymbolNamesJoined(dataFlowAnalysisResults.ReadOutside)) Assert.Equal("b", GetSymbolNamesJoined(dataFlowAnalysisResults.WrittenInside)) Assert.Equal("Me, i, a, b", GetSymbolNamesJoined(dataFlowAnalysisResults.WrittenOutside)) End Sub <Fact()> Public Sub ObjectInitializersLocalsAccessed2() Dim dataFlowAnalysisResults = CompileAndAnalyzeDataFlow( <compilation> <file name="a.vb"> Imports System Public Structure S1 Public FieldInt As Long Public FieldStr As String Public Property PropInt As Integer End Structure Public Class S2 Public Shared Sub Main() Dim x As New S1() With {.FieldStr = [|.FieldInt.ToString()|]} End Sub End Class </file> </compilation>) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowAnalysisResults.VariablesDeclared)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowAnalysisResults.AlwaysAssigned)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowAnalysisResults.Captured)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowAnalysisResults.CapturedInside)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowAnalysisResults.CapturedOutside)) Assert.Equal("x", GetSymbolNamesJoined(dataFlowAnalysisResults.DataFlowsIn)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowAnalysisResults.DataFlowsOut)) Assert.Equal("x", GetSymbolNamesJoined(dataFlowAnalysisResults.ReadInside)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowAnalysisResults.ReadOutside)) Assert.Equal("x", GetSymbolNamesJoined(dataFlowAnalysisResults.WrittenInside)) Assert.Equal("x", GetSymbolNamesJoined(dataFlowAnalysisResults.WrittenOutside)) End Sub <Fact()> Public Sub ObjectInitializersWithLocalsAccessed() Dim dataFlowAnalysisResults = CompileAndAnalyzeDataFlow( <compilation> <file name="a.vb"> Imports System Public Class C1 Public FieldStr As String End Class Public Class C2 Public Shared Function GetStr(p as string) return p end Function Public Shared Sub Main() Dim strlocal As String Dim x = New C1() With {.FieldStr = [|GetStr(strLocal)|]} End Sub End Class </file> </compilation>) Assert.Null(GetSymbolNamesJoined(dataFlowAnalysisResults.VariablesDeclared)) Assert.Null(GetSymbolNamesJoined(dataFlowAnalysisResults.AlwaysAssigned)) Assert.Equal("strlocal", GetSymbolNamesJoined(dataFlowAnalysisResults.DataFlowsIn)) Assert.Null(GetSymbolNamesJoined(dataFlowAnalysisResults.DataFlowsOut)) Assert.Equal("strlocal", GetSymbolNamesJoined(dataFlowAnalysisResults.ReadInside)) Assert.Null(GetSymbolNamesJoined(dataFlowAnalysisResults.ReadOutside)) Assert.Null(GetSymbolNamesJoined(dataFlowAnalysisResults.WrittenInside)) Assert.Equal("x", GetSymbolNamesJoined(dataFlowAnalysisResults.WrittenOutside)) Assert.Null(GetSymbolNamesJoined(dataFlowAnalysisResults.Captured)) Assert.Null(GetSymbolNamesJoined(dataFlowAnalysisResults.CapturedInside)) Assert.Null(GetSymbolNamesJoined(dataFlowAnalysisResults.CapturedOutside)) End Sub <Fact()> Public Sub ObjectInitializersWithLocalCaptured() Dim dataFlowAnalysisResults = CompileAndAnalyzeDataFlow( <compilation> <file name="a.vb"> Imports System Class C1 Public Field As Integer = 42 Public Field2 As Func(Of Integer) End Class Class C1(Of T) Public Field As T End Class Class C2 Public Shared Sub Main() Dim localint as integer = 23 Dim x As New C1 With {.Field2 = [|Function() As Integer Return localint End Function|]} x.Field = 42 Console.WriteLine(x.Field2.Invoke()) End Sub End Class </file> </compilation>) Assert.Null(GetSymbolNamesJoined(dataFlowAnalysisResults.VariablesDeclared)) Assert.Null(GetSymbolNamesJoined(dataFlowAnalysisResults.AlwaysAssigned)) Assert.Equal("localint", GetSymbolNamesJoined(dataFlowAnalysisResults.DataFlowsIn)) Assert.Null(GetSymbolNamesJoined(dataFlowAnalysisResults.DataFlowsOut)) Assert.Equal("localint", GetSymbolNamesJoined(dataFlowAnalysisResults.ReadInside)) Assert.Equal("x", GetSymbolNamesJoined(dataFlowAnalysisResults.ReadOutside)) Assert.Null(GetSymbolNamesJoined(dataFlowAnalysisResults.WrittenInside)) Assert.Equal("localint, x", GetSymbolNamesJoined(dataFlowAnalysisResults.WrittenOutside)) Assert.Equal("localint", GetSymbolNamesJoined(dataFlowAnalysisResults.Captured)) Assert.Equal("localint", GetSymbolNamesJoined(dataFlowAnalysisResults.CapturedInside)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowAnalysisResults.CapturedOutside)) End Sub <Fact()> Public Sub ObjectInitializersWholeStatement() Dim analysisResults = CompileAndAnalyzeControlAndDataFlow( <compilation> <file name="a.vb"> Imports System Class C1 Public Field As Integer = 42 Public Field2 As Func(Of Integer) End Class Class C1(Of T) Public Field As T End Class Class C2 Public Shared Sub Main() Dim localint as integer [|Dim x As New C1 With {.Field2 = Function() As Integer localInt = 23 Return localint End Function}|] x.Field = 42 Console.WriteLine(x.Field2.Invoke()) End Sub End Class </file> </compilation>) Dim dataFlowAnalysisResults = analysisResults.Item2 Assert.Equal("x", GetSymbolNamesJoined(dataFlowAnalysisResults.VariablesDeclared)) Assert.Equal("x", GetSymbolNamesJoined(dataFlowAnalysisResults.AlwaysAssigned)) Assert.Null(GetSymbolNamesJoined(dataFlowAnalysisResults.DataFlowsIn)) Assert.Equal("x", GetSymbolNamesJoined(dataFlowAnalysisResults.DataFlowsOut)) Assert.Equal("localint", GetSymbolNamesJoined(dataFlowAnalysisResults.ReadInside)) Assert.Equal("x", GetSymbolNamesJoined(dataFlowAnalysisResults.ReadOutside)) Assert.Equal("localint, x", GetSymbolNamesJoined(dataFlowAnalysisResults.WrittenInside)) Assert.Null(GetSymbolNamesJoined(dataFlowAnalysisResults.WrittenOutside)) Assert.Equal("localint", GetSymbolNamesJoined(dataFlowAnalysisResults.Captured)) Assert.Equal("localint", GetSymbolNamesJoined(dataFlowAnalysisResults.CapturedInside)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowAnalysisResults.CapturedOutside)) Dim controlFlowAnalysisResults = analysisResults.Item1 Assert.Equal(0, controlFlowAnalysisResults.EntryPoints.Count) Assert.Equal(0, controlFlowAnalysisResults.ExitPoints.Count) Assert.True(controlFlowAnalysisResults.EndPointIsReachable) Assert.True(controlFlowAnalysisResults.StartPointIsReachable) End Sub #End Region #Region "CollectionInitializer" <Fact()> Public Sub CollectionInitializersCompleteObjectCreationExpression() Dim dataFlowAnalysisResults = CompileAndAnalyzeDataFlow( <compilation> <file name="a.vb"> Imports System Imports System.Collections.Generic Public Class C2 Public Shared Sub Main() dim goo as string = "Hello World" Dim x as [|New List(Of String) From {goo, "!"}|] End Sub End Class </file> </compilation>) Assert.Null(GetSymbolNamesJoined(dataFlowAnalysisResults.VariablesDeclared)) Assert.Null(GetSymbolNamesJoined(dataFlowAnalysisResults.AlwaysAssigned)) Assert.Equal("goo", GetSymbolNamesJoined(dataFlowAnalysisResults.DataFlowsIn)) Assert.Null(GetSymbolNamesJoined(dataFlowAnalysisResults.DataFlowsOut)) Assert.Equal("goo", GetSymbolNamesJoined(dataFlowAnalysisResults.ReadInside)) Assert.Null(GetSymbolNamesJoined(dataFlowAnalysisResults.ReadOutside)) Assert.Null(GetSymbolNamesJoined(dataFlowAnalysisResults.WrittenInside)) Assert.Equal("goo, x", GetSymbolNamesJoined(dataFlowAnalysisResults.WrittenOutside)) End Sub <Fact()> Public Sub CollectionInitializersOutermostInitializerAreNoVBExpressions() Dim dataFlowAnalysisResults = CompileAndAnalyzeDataFlow( <compilation> <file name="a.vb"> Imports System Imports System.Collections.Generic Public Class C2 Public Shared Sub Main() dim goo as string = "Hello World" Dim x as New List(Of String) From [|{goo, "!"}|] End Sub End Class </file> </compilation>) Assert.False(dataFlowAnalysisResults.Succeeded) End Sub <Fact()> Public Sub CollectionInitializersTopLevelInitializerAreNoVBExpressions() Dim dataFlowAnalysisResults = CompileAndAnalyzeDataFlow( <compilation> <file name="a.vb"> Imports System Imports System.Collections.Generic Public Class C2 Public Shared Sub Main() dim goo as string = "Hello World" Dim x as New Dictionary(Of String, Integer) From {[|{goo, 1}|], {"bar", 42}} End Sub End Class </file> </compilation>) Assert.False(dataFlowAnalysisResults.Succeeded) End Sub <WorkItem(530032, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/530032")> <Fact> Public Sub CollectionInitializersNestedInitializer() Dim dataFlowAnalysisResults = CompileAndAnalyzeDataFlow( <compilation> <file name="a.vb"> Imports System Imports System.Collections.Generic Public Class C2 Public Shared Sub Main(), dim goo as string = "Hello World" Dim x as New Dictionary(Of String(), Integer) From { {[|{goo, "!"}|], 1} } End Sub End Class </file> </compilation>) Assert.True(dataFlowAnalysisResults.Succeeded) Assert.Null(GetSymbolNamesJoined(dataFlowAnalysisResults.VariablesDeclared)) Assert.Null(GetSymbolNamesJoined(dataFlowAnalysisResults.AlwaysAssigned)) Assert.Equal("goo", GetSymbolNamesJoined(dataFlowAnalysisResults.DataFlowsIn)) Assert.Null(GetSymbolNamesJoined(dataFlowAnalysisResults.DataFlowsOut)) Assert.Equal("goo", GetSymbolNamesJoined(dataFlowAnalysisResults.ReadInside)) Assert.Null(GetSymbolNamesJoined(dataFlowAnalysisResults.ReadOutside)) Assert.Null(GetSymbolNamesJoined(dataFlowAnalysisResults.WrittenInside)) Assert.Equal("goo, x", GetSymbolNamesJoined(dataFlowAnalysisResults.WrittenOutside)) End Sub <Fact()> Public Sub CollectionInitializersLiftedLocals() Dim dataFlowAnalysisResults = CompileAndAnalyzeDataFlow( <compilation> <file name="a.vb"> Imports System Imports System.Collections.Generic Public Class C2 Public Shared Sub Main() Dim goo As String = "Hello World" Dim x As [|New List(Of Action) From { Sub() Console.WriteLine(goo) End Sub, Sub() Console.WriteLine(x.Item(0)) x = nothing End Sub }|] End Sub End Class </file> </compilation>) Assert.True(dataFlowAnalysisResults.Succeeded) Assert.Null(GetSymbolNamesJoined(dataFlowAnalysisResults.VariablesDeclared)) Assert.Null(GetSymbolNamesJoined(dataFlowAnalysisResults.AlwaysAssigned)) Assert.Equal("goo, x", GetSymbolNamesJoined(dataFlowAnalysisResults.DataFlowsIn)) Assert.Null(GetSymbolNamesJoined(dataFlowAnalysisResults.DataFlowsOut)) Assert.Equal("goo, x", GetSymbolNamesJoined(dataFlowAnalysisResults.Captured)) Assert.Equal("goo, x", GetSymbolNamesJoined(dataFlowAnalysisResults.CapturedInside)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowAnalysisResults.CapturedOutside)) Assert.Equal("goo, x", GetSymbolNamesJoined(dataFlowAnalysisResults.ReadInside)) Assert.Null(GetSymbolNamesJoined(dataFlowAnalysisResults.ReadOutside)) Assert.Equal("x", GetSymbolNamesJoined(dataFlowAnalysisResults.WrittenInside)) Assert.Equal("goo, x", GetSymbolNamesJoined(dataFlowAnalysisResults.WrittenOutside)) End Sub <Fact(), WorkItem(12970, "DevDiv_Projects/Roslyn")> Public Sub CollectionInitUndeclaredIdentifier() Dim dataFlowAnalysisResults = CompileAndAnalyzeDataFlow( <compilation> <file name="a.vb"> Imports System Imports System.Collections.Generic Imports System.Linq Module Program Sub Main(args As String()) Dim f1() As String = {[|X|]} End Sub End Module </file> </compilation>) Assert.True(dataFlowAnalysisResults.Succeeded) End Sub #End Region <Fact(), WorkItem(544079, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/544079")> Public Sub UserDefinedOperatorBody() Dim analysisResults = CompileAndAnalyzeControlAndDataFlow( <compilation> <file name="a.vb"> Imports System Module Module1 Class B2 Public f As Integer Public Sub New(x As Integer) f = x End Sub Shared Widening Operator CType(x As Integer) As B2 [| Return New B2(x) |] End Operator End Class Sub Main() Dim x As Integer = 11 Dim b2 As B2 = x End Sub End Module </file> </compilation>) Dim ctrlFlowResults = analysisResults.Item1 Assert.True(ctrlFlowResults.Succeeded) Assert.Equal(1, ctrlFlowResults.ExitPoints.Count()) Assert.Equal(0, ctrlFlowResults.EntryPoints.Count()) Assert.True(ctrlFlowResults.StartPointIsReachable) Assert.False(ctrlFlowResults.EndPointIsReachable) Dim dataFlowResults = analysisResults.Item2 Assert.True(dataFlowResults.Succeeded) Assert.Empty(dataFlowResults.VariablesDeclared) Assert.Empty(dataFlowResults.AlwaysAssigned) Assert.Empty(dataFlowResults.Captured) Assert.Empty(dataFlowResults.CapturedInside) Assert.Empty(dataFlowResults.CapturedOutside) Assert.Equal("x", GetSymbolNamesJoined(dataFlowResults.DataFlowsIn)) Assert.Empty((dataFlowResults.DataFlowsOut)) Assert.Equal("x", GetSymbolNamesJoined(dataFlowResults.DefinitelyAssignedOnEntry)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowResults.DefinitelyAssignedOnExit)) Assert.Equal("x", GetSymbolNamesJoined(dataFlowResults.ReadInside)) Assert.Empty(dataFlowResults.WrittenInside) Assert.Empty(dataFlowResults.ReadOutside) Assert.Equal("x", GetSymbolNamesJoined(dataFlowResults.WrittenOutside)) End Sub <Fact(), WorkItem(544079, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/544079")> Public Sub UserDefinedOperatorBody_1() Dim analysisResults = CompileAndAnalyzeControlAndDataFlow( <compilation> <file name="a.vb"> Imports System Module Module1 Class B2 Public f As Integer Public Sub New(x As Integer) f = x End Sub Shared Operator -(x As Integer, y As B2) As B2 [| Return New B2(x) |] End Operator End Class Sub Main() End Sub End Module </file> </compilation>) Dim ctrlFlowResults = analysisResults.Item1 Assert.True(ctrlFlowResults.Succeeded) Assert.Equal(1, ctrlFlowResults.ExitPoints.Count()) Assert.Equal(0, ctrlFlowResults.EntryPoints.Count()) Assert.True(ctrlFlowResults.StartPointIsReachable) Assert.False(ctrlFlowResults.EndPointIsReachable) Dim dataFlowResults = analysisResults.Item2 Assert.True(dataFlowResults.Succeeded) Assert.Empty(dataFlowResults.VariablesDeclared) Assert.Empty(dataFlowResults.AlwaysAssigned) Assert.Empty(dataFlowResults.Captured) Assert.Empty(dataFlowResults.CapturedInside) Assert.Empty(dataFlowResults.CapturedOutside) Assert.Equal("x", GetSymbolNamesJoined(dataFlowResults.DataFlowsIn)) Assert.Empty((dataFlowResults.DataFlowsOut)) Assert.Equal("x, y", GetSymbolNamesJoined(dataFlowResults.DefinitelyAssignedOnEntry)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowResults.DefinitelyAssignedOnExit)) Assert.Equal("x", GetSymbolNamesJoined(dataFlowResults.ReadInside)) Assert.Empty(dataFlowResults.WrittenInside) Assert.Empty(dataFlowResults.ReadOutside) Assert.Equal("x, y", GetSymbolNamesJoined(dataFlowResults.WrittenOutside)) End Sub <Fact()> Public Sub UserDefinedOperatorInExpression() Dim dataFlowResults = CompileAndAnalyzeDataFlow( <compilation> <file name="a.vb"> Imports System Module Module1 Class B2 Public f As Integer Public Sub New(x As Integer) f = x End Sub Shared Operator -(x As Integer, y As B2) As B2 Return New B2(x) End Operator End Class Sub Main(args As String()) Dim x As Short = 123 Dim bb = New B2(x) Dim ret = [| Function(y) Return args.Length - (y - (x - bb)) End Function |] End Sub End Module </file> </compilation>) Assert.True(dataFlowResults.Succeeded) Assert.Equal("y", GetSymbolNamesJoined(dataFlowResults.VariablesDeclared)) Assert.Empty(dataFlowResults.AlwaysAssigned) Assert.Equal("args, x, bb", GetSymbolNamesJoined(dataFlowResults.Captured)) Assert.Equal("args, x, bb", GetSymbolNamesJoined(dataFlowResults.CapturedInside)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowResults.CapturedOutside)) Assert.Equal("args, x, bb", GetSymbolNamesJoined(dataFlowResults.DataFlowsIn)) Assert.Empty(dataFlowResults.DataFlowsOut) Assert.Equal("args, x, bb, ret", GetSymbolNamesJoined(dataFlowResults.DefinitelyAssignedOnEntry)) Assert.Equal("args, x, bb, ret", GetSymbolNamesJoined(dataFlowResults.DefinitelyAssignedOnExit)) Assert.Equal("args, x, bb, y", GetSymbolNamesJoined(dataFlowResults.ReadInside)) Assert.Equal("y", GetSymbolNamesJoined(dataFlowResults.WrittenInside)) Assert.Equal("x", GetSymbolNamesJoined(dataFlowResults.ReadOutside)) Assert.Equal("args, x, bb, ret", GetSymbolNamesJoined(dataFlowResults.WrittenOutside)) End Sub <Fact(), WorkItem(545047, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/545047")> Public Sub UserDefinedLiftedOperatorInExpr() Dim dataFlowResults = CompileAndAnalyzeDataFlow( <compilation> <file name="a.vb"> Imports System Class A Structure S Shared Narrowing Operator CType(x As S?) As Integer System.Console.WriteLine("Operator Conv") Return 123 'Nothing End Operator Shared Operator *(x As S?, y As Integer?) As Integer? System.Console.WriteLine("Operator *") Return y End Operator End Structure End Class Module Program Sub M(Optional p As Integer? = Nothing) Dim local As A.S? = New A.S() Dim f As Func(Of A.S, Integer?) = [| Function(x) Return x * local * p End Function |] Console.Write(f(local)) End Sub End Module </file> </compilation>) Assert.True(dataFlowResults.Succeeded) Assert.Equal("x", GetSymbolNamesJoined(dataFlowResults.VariablesDeclared)) Assert.Empty(dataFlowResults.AlwaysAssigned) Assert.Equal("p, local", GetSymbolNamesJoined(dataFlowResults.Captured)) Assert.Equal("p, local", GetSymbolNamesJoined(dataFlowResults.CapturedInside)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowResults.CapturedOutside)) Assert.Equal("p, local", GetSymbolNamesJoined(dataFlowResults.DataFlowsIn)) Assert.Empty(dataFlowResults.DataFlowsOut) Assert.Equal("f", GetSymbolNamesJoined(dataFlowResults.DefinitelyAssignedOnEntry)) Assert.Equal("f", GetSymbolNamesJoined(dataFlowResults.DefinitelyAssignedOnExit)) Assert.Equal("p, local, x", GetSymbolNamesJoined(dataFlowResults.ReadInside)) Assert.Equal("x", GetSymbolNamesJoined(dataFlowResults.WrittenInside)) Assert.Equal("local, f", GetSymbolNamesJoined(dataFlowResults.ReadOutside)) Assert.Equal("p, local, f", GetSymbolNamesJoined(dataFlowResults.WrittenOutside)) End Sub <Fact(), WorkItem(545047, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/545047")> Public Sub DataFlowsInAndNullable() ' WARNING: if this test is edited, the test with the ' test with the same name in C# must be modified too Dim dataFlowResults = CompileAndAnalyzeDataFlow( <compilation> <file name="a.vb"> Imports System Structure S Public F As Integer Public Sub New(_f As Integer) Me.F = _f End Sub End Structure Module Program Sub Main(args As String()) Dim i As Integer? = 1 Dim s As New S(1) [| Console.Write(i.Value) Console.Write(s.F) |] End Sub End Module </file> </compilation>) Assert.True(dataFlowResults.Succeeded) Assert.Empty(dataFlowResults.VariablesDeclared) Assert.Empty(dataFlowResults.AlwaysAssigned) Assert.Empty(dataFlowResults.Captured) Assert.Empty(dataFlowResults.CapturedInside) Assert.Empty(dataFlowResults.CapturedOutside) Assert.Equal("i, s", GetSymbolNamesJoined(dataFlowResults.DataFlowsIn)) Assert.Empty(dataFlowResults.DataFlowsOut) Assert.Equal("args", GetSymbolNamesJoined(dataFlowResults.DefinitelyAssignedOnEntry)) Assert.Equal("args", GetSymbolNamesJoined(dataFlowResults.DefinitelyAssignedOnExit)) Assert.Equal("i, s", GetSymbolNamesJoined(dataFlowResults.ReadInside)) Assert.Empty(dataFlowResults.WrittenInside) Assert.Empty(dataFlowResults.ReadOutside) Assert.Equal("args, i, s", GetSymbolNamesJoined(dataFlowResults.WrittenOutside)) End Sub <WorkItem(545249, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/545249")> <Fact()> Public Sub TestWithEventsInitializer() Dim comp = CompileAndAnalyzeDataFlow( <compilation> <file name="a.vb"> Class C1 WithEvents e As C1 = [|Me|] End Class </file> </compilation>) Debug.Assert(comp.Succeeded) End Sub <WorkItem(545249, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/545249")> <Fact()> Public Sub TestWithEventsInitializer2() Dim comp = CompileAndAnalyzeDataFlow( <compilation> <file name="a.vb"> Class C1 Public Sub New(c As C1) End Sub WithEvents e As New C1([|Me|]) End Class </file> </compilation>) Debug.Assert(comp.Succeeded) End Sub <Fact()> Public Sub TestWithEventsInitializer3() Dim comp = CompileAndAnalyzeDataFlow( <compilation> <file name="a.vb"> Class C1 Public Sub New(c As C1) End Sub WithEvents e, f As C1 = [|Me|] End Class </file> </compilation>) Debug.Assert(comp.Succeeded) End Sub <Fact()> Public Sub TestWithEventsInitializer4() Dim comp = CompileAndAnalyzeDataFlow( <compilation> <file name="a.vb"> Class C1 Public Sub New(c As C1) End Sub WithEvents d As New C1(Me), e, f As New C1([|Me|]) End Class </file> </compilation>) Debug.Assert(comp.Succeeded) End Sub <WorkItem(545480, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/545480")> <Fact()> Public Sub ReturnStatementInElseInsideIncompleteFunction() Dim comp = CompilationUtils.CreateCompilationWithMscorlib40( <compilation> <file name="a.vb"> Public Class vbPartialCls002 Public Function Fun1() As Object If Nothing Then Return New Object() Else Return Nothing </file> </compilation>) Dim tree = comp.SyntaxTrees.First() Dim stmtNode = tree.GetCompilationUnitRoot().DescendantNodes().OfType(Of StatementSyntax).Where(Function(node) node.ToString() = "Return Nothing").First() Dim semanticModel = comp.GetSemanticModel(tree) Dim controlFlowAnalysis = semanticModel.AnalyzeControlFlow(stmtNode) Assert.True(controlFlowAnalysis.Succeeded) End Sub <WorkItem(545900, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/545900")> <Fact()> Public Sub AnonymousObjectCreationExprInsideOptionalParamDecl() Dim comp = CompileAndAnalyzeDataFlow( <compilation> <file name="a.vb"> Module Program Function scen3(Optional ByRef p1 As Object = New With {.abc = [|123|]}) End Function End Module </file> </compilation>) Assert.False(comp.Succeeded) End Sub <WorkItem(545900, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/545900")> <Fact()> Public Sub AnonymousObjectCreationExprInsideOptionalParamDecl2() Dim comp = CompileAndAnalyzeDataFlow( <compilation> <file name="a.vb"> Class Program Public XYZ As String = "xyz" Function scen3(Optional ByRef p1 As Object = New With {.abc = [|Me.XYZ|]}) As String Return Nothing End Function End Class </file> </compilation>) Assert.False(comp.Succeeded) End Sub <WorkItem(545900, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/545900")> <Fact()> Public Sub LambdaExprInsideOptionalParamDecl2() Dim comp = CompileAndAnalyzeDataFlow( <compilation> <file name="a.vb"> Module Program Sub Main(args As String()) End Sub Property P(i As Integer, Optional k As String = (Function() As String Return [| "" |] End Function)()) As String Get Return k End Get Set(value As String) End Set End Property End Module </file> </compilation>) Assert.True(comp.Succeeded) End Sub <Fact()> Public Sub ConstantUnevaluatedReceiver() Dim compilation = CompilationUtils.CreateCompilationWithMscorlib40( <compilation> <file name="a.vb"><![CDATA[ Class A Const F As Object = Nothing Function M() As Object Return Me.F End Function End Class ]]></file> </compilation>) Dim tree = compilation.SyntaxTrees(0) Dim model = compilation.GetSemanticModel(tree) Dim expr = FindNodeOfTypeFromText(Of ExpressionSyntax)(tree, "Me") model.AnalyzeDataFlow(expr) End Sub <Fact()> Public Sub CallUnevaluatedReceiver() Dim compilation = CompilationUtils.CreateCompilationWithMscorlib40( <compilation> <file name="a.vb"><![CDATA[ Class A Shared Function F() As Object Return Nothing End Function Function M() As Object Return Me.F() End Function End Class ]]></file> </compilation>) Dim tree = compilation.SyntaxTrees(0) Dim model = compilation.GetSemanticModel(tree) Dim expr = FindNodeOfTypeFromText(Of ExpressionSyntax)(tree, "Me") model.AnalyzeDataFlow(expr) End Sub <WorkItem(546639, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/546639")> <Fact()> Public Sub AddressOfUnevaluatedReceiver() Dim compilation = CompilationUtils.CreateCompilationWithMscorlib40( <compilation> <file name="a.vb"><![CDATA[ Class A Shared Sub M() End Sub Function F() As System.Action Return AddressOf Me.M End Function End Class ]]></file> </compilation>) Dim tree = compilation.SyntaxTrees(0) Dim model = compilation.GetSemanticModel(tree) Dim expr = FindNodeOfTypeFromText(Of ExpressionSyntax)(tree, "Me") model.AnalyzeDataFlow(expr) End Sub <WorkItem(546629, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/546629")> <Fact()> Public Sub TypeExpressionUnevaluatedReceiver() Dim compilation = CompilationUtils.CreateCompilationWithMscorlib40( <compilation> <file name="a.vb"><![CDATA[ Class A Class B Friend Const F As Object = Nothing End Class Function M() As Object Return (Me.B).F End Function End Class ]]></file> </compilation>) Dim tree = compilation.SyntaxTrees(0) Dim model = compilation.GetSemanticModel(tree) Dim expr = FindNodeOfTypeFromText(Of ExpressionSyntax)(tree, "Me") model.AnalyzeDataFlow(expr) End Sub <WorkItem(545266, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/545266")> <Fact()> Public Sub DataFlowImplicitLoopVariableInBrokenCodeNotInDataFlowsOut() Dim dataFlowResults = CompileAndAnalyzeDataFlow( <compilation> <file name="a.vb"> Module Program Sub Main(ByVal args As String()) GoTo Label1 For i = 1 To 5 Label1: Dim j = [|i|] Next End Sub End Module </file> </compilation>) Assert.True(dataFlowResults.Succeeded) Assert.Empty(dataFlowResults.VariablesDeclared) Assert.Empty(dataFlowResults.AlwaysAssigned) Assert.Empty(dataFlowResults.Captured) Assert.Empty(dataFlowResults.CapturedInside) Assert.Empty(dataFlowResults.CapturedOutside) Assert.Equal("i", GetSymbolNamesJoined(dataFlowResults.DataFlowsIn)) Assert.Empty(dataFlowResults.DataFlowsOut) Assert.Equal("args", GetSymbolNamesJoined(dataFlowResults.DefinitelyAssignedOnEntry)) Assert.Equal("args", GetSymbolNamesJoined(dataFlowResults.DefinitelyAssignedOnExit)) Assert.Equal("i", GetSymbolNamesJoined(dataFlowResults.ReadInside)) Assert.Empty(dataFlowResults.WrittenInside) Assert.Empty(dataFlowResults.ReadOutside) Assert.Equal("args, i, j", GetSymbolNamesJoined(dataFlowResults.WrittenOutside)) End Sub <WorkItem(545266, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/545266")> <Fact()> Public Sub DataFlowImplicitLoopVariableInBrokenCodeNotInDataFlowsOut_2() Dim dataFlowResults = CompileAndAnalyzeDataFlow( <compilation> <file name="a.vb"> Module Program Sub Main(ByVal args As String()) GoTo Label1 For x = 1 To 5 For i = 1 To 5 Label1: Dim j = [|i|] Next next End Sub End Module </file> </compilation>) Assert.True(dataFlowResults.Succeeded) Assert.Empty(dataFlowResults.VariablesDeclared) Assert.Empty(dataFlowResults.AlwaysAssigned) Assert.Empty(dataFlowResults.Captured) Assert.Empty(dataFlowResults.CapturedInside) Assert.Empty(dataFlowResults.CapturedOutside) Assert.Equal("i", GetSymbolNamesJoined(dataFlowResults.DataFlowsIn)) Assert.Empty(dataFlowResults.DataFlowsOut) Assert.Equal("args", GetSymbolNamesJoined(dataFlowResults.DefinitelyAssignedOnEntry)) Assert.Equal("args", GetSymbolNamesJoined(dataFlowResults.DefinitelyAssignedOnExit)) Assert.Equal("i", GetSymbolNamesJoined(dataFlowResults.ReadInside)) Assert.Empty(dataFlowResults.WrittenInside) Assert.Empty(dataFlowResults.ReadOutside) Assert.Equal("args, x, i, j", GetSymbolNamesJoined(dataFlowResults.WrittenOutside)) End Sub <WorkItem(545266, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/545266")> <Fact()> Public Sub DataFlowUnassignedVariablesWithoutAssignmentInsideDoNotFlowOut_1() Dim dataFlowResults = CompileAndAnalyzeDataFlow( <compilation> <file name="a.vb"> Module Program Sub Main(ByVal args As String()) GoTo Label1 if args(0) > 23 then dim i as integer = 23 Label1: Dim j = [|i|] i = 23 end if End Sub End Module </file> </compilation>) Assert.True(dataFlowResults.Succeeded) Assert.Empty(dataFlowResults.VariablesDeclared) Assert.Empty(dataFlowResults.AlwaysAssigned) Assert.Empty(dataFlowResults.Captured) Assert.Empty(dataFlowResults.CapturedInside) Assert.Empty(dataFlowResults.CapturedOutside) Assert.Equal("i", GetSymbolNamesJoined(dataFlowResults.DataFlowsIn)) Assert.Empty(dataFlowResults.DataFlowsOut) Assert.Equal("args", GetSymbolNamesJoined(dataFlowResults.DefinitelyAssignedOnEntry)) Assert.Equal("args", GetSymbolNamesJoined(dataFlowResults.DefinitelyAssignedOnExit)) Assert.Equal("i", GetSymbolNamesJoined(dataFlowResults.ReadInside)) Assert.Empty(dataFlowResults.WrittenInside) Assert.Equal("args", GetSymbolNamesJoined(dataFlowResults.ReadOutside)) Assert.Equal("args, i, j", GetSymbolNamesJoined(dataFlowResults.WrittenOutside)) End Sub <WorkItem(545266, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/545266")> <Fact()> Public Sub DataFlowUnassignedVariablesWithoutAssignmentInsideDoNotFlowOut_2() Dim dataFlowResults = CompileAndAnalyzeDataFlow( <compilation> <file name="a.vb"> Module Program Sub Main(ByVal args As String()) GoTo Label1 if args(0) > 23 then dim i as integer Label1: dim k = i Dim j = [|i|] i = 23 end if End Sub End Module </file> </compilation>) Assert.True(dataFlowResults.Succeeded) Assert.Empty(dataFlowResults.AlwaysAssigned) Assert.Empty(dataFlowResults.Captured) Assert.Empty(dataFlowResults.CapturedInside) Assert.Empty(dataFlowResults.CapturedOutside) Assert.Equal("i", GetSymbolNamesJoined(dataFlowResults.DataFlowsIn)) Assert.Empty(dataFlowResults.DataFlowsOut) Assert.Equal("args, k", GetSymbolNamesJoined(dataFlowResults.DefinitelyAssignedOnEntry)) Assert.Equal("args, k", GetSymbolNamesJoined(dataFlowResults.DefinitelyAssignedOnExit)) Assert.Equal("i", GetSymbolNamesJoined(dataFlowResults.ReadInside)) Assert.Empty(dataFlowResults.WrittenInside) Assert.Equal("args, i", GetSymbolNamesJoined(dataFlowResults.ReadOutside)) Assert.Equal("args, i, k, j", GetSymbolNamesJoined(dataFlowResults.WrittenOutside)) End Sub <WorkItem(545266, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/545266")> <Fact()> Public Sub DataFlowImplicitUsingVariableInBrokenCodeNotInDataFlowsOut() Dim dataFlowResults = CompileAndAnalyzeDataFlow( <compilation> <file name="a.vb"> Module Program Sub Main(ByVal args As String()) GoTo Label1 using i as new Object Label1: Dim j = [|i|] end using End Sub End Module </file> </compilation>) Assert.True(dataFlowResults.Succeeded) Assert.Empty(dataFlowResults.VariablesDeclared) Assert.Empty(dataFlowResults.AlwaysAssigned) Assert.Empty(dataFlowResults.Captured) Assert.Empty(dataFlowResults.CapturedInside) Assert.Empty(dataFlowResults.CapturedOutside) Assert.Equal("i", GetSymbolNamesJoined(dataFlowResults.DataFlowsIn)) Assert.Empty(dataFlowResults.DataFlowsOut) Assert.Equal("args", GetSymbolNamesJoined(dataFlowResults.DefinitelyAssignedOnEntry)) Assert.Equal("args", GetSymbolNamesJoined(dataFlowResults.DefinitelyAssignedOnExit)) Assert.Equal("i", GetSymbolNamesJoined(dataFlowResults.ReadInside)) Assert.Empty(dataFlowResults.WrittenInside) Assert.Equal("i", GetSymbolNamesJoined(dataFlowResults.ReadOutside)) Assert.Equal("args, i, j", GetSymbolNamesJoined(dataFlowResults.WrittenOutside)) End Sub <WorkItem(546995, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/546995")> <Fact()> Public Sub DataFlowUnassignedVariablesWithoutAssignmentInsideDoNotFlowOut_3() Dim dataFlowResults = CompileAndAnalyzeDataFlow( <compilation> <file name="a.vb"> Module Program Sub Main(ByVal args As String()) [|GoTo Label1 For i = 1 To 5 Label1: Dim q = i Next|] End Sub End Module </file> </compilation>) Assert.True(dataFlowResults.Succeeded) Assert.Equal("i, q", GetSymbolNamesJoined(dataFlowResults.VariablesDeclared)) Assert.Empty(dataFlowResults.AlwaysAssigned) Assert.Empty(dataFlowResults.Captured) Assert.Empty(dataFlowResults.CapturedInside) Assert.Empty(dataFlowResults.CapturedOutside) Assert.Equal("i", GetSymbolNamesJoined(dataFlowResults.DataFlowsIn)) Assert.Empty(dataFlowResults.DataFlowsOut) Assert.Equal("args", GetSymbolNamesJoined(dataFlowResults.DefinitelyAssignedOnEntry)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowResults.DefinitelyAssignedOnExit)) Assert.Equal("i", GetSymbolNamesJoined(dataFlowResults.ReadInside)) Assert.Equal("i, q", GetSymbolNamesJoined(dataFlowResults.WrittenInside)) Assert.Empty(dataFlowResults.ReadOutside) Assert.Equal("args", GetSymbolNamesJoined(dataFlowResults.WrittenOutside)) End Sub <WorkItem(669341, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/669341")> <Fact()> Public Sub ReceiverRead() Dim dataFlowResults = CompileAndAnalyzeDataFlow( <compilation> <file name="a.vb"> Public Structure X Public Y As Y End Structure Public Structure Y Public Z As Z End Structure Public Structure Z Public Value As Integer End Structure Module Module1 Sub Main() Dim X As New X Dim Value = [|X.Y|].Z.Value End Sub End Module </file> </compilation>) Assert.Equal("X", GetSymbolNamesJoined(dataFlowResults.ReadInside)) Assert.Empty(dataFlowResults.WrittenInside) Assert.Equal("X", GetSymbolNamesJoined(dataFlowResults.ReadOutside)) Assert.Equal("X, Value", GetSymbolNamesJoined(dataFlowResults.WrittenOutside)) End Sub <WorkItem(669341, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/669341")> <Fact()> Public Sub ReceiverWritten() Dim dataFlowResults = CompileAndAnalyzeDataFlow( <compilation> <file name="a.vb"> Public Structure X Public Y As Y End Structure Public Structure Y Public Z As Z End Structure Public Structure Z Public Value As Integer End Structure Module Module1 Sub Main() Dim X As New X [|X.Y|].Z.Value = 12 End Sub End Module </file> </compilation>) Assert.Empty(dataFlowResults.ReadInside) Assert.Equal("X", GetSymbolNamesJoined(dataFlowResults.WrittenInside)) Assert.Empty(dataFlowResults.ReadOutside) Assert.Equal("X", GetSymbolNamesJoined(dataFlowResults.WrittenOutside)) End Sub <WorkItem(669341, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/669341")> <Fact()> Public Sub ReceiverReadAndWritten() Dim dataFlowResults = CompileAndAnalyzeDataFlow( <compilation> <file name="a.vb"> Public Structure X Public Y As Y End Structure Public Structure Y Public Z As Z End Structure Public Structure Z Public Value As Integer End Structure Module Module1 Sub Main() Dim X As New X [|X.Y|].Z.Value += 12 End Sub End Module </file> </compilation>) Assert.Equal("X", GetSymbolNamesJoined(dataFlowResults.ReadInside)) Assert.Equal("X", GetSymbolNamesJoined(dataFlowResults.WrittenInside)) Assert.Equal("X", GetSymbolNamesJoined(dataFlowResults.ReadOutside)) Assert.Equal("X", GetSymbolNamesJoined(dataFlowResults.WrittenOutside)) End Sub #Region "Anonymous Type, Lambda" <WorkItem(543464, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/543464")> <Fact()> Public Sub TestCaptured() Dim analysis = CompileAndAnalyzeDataFlow( <compilation name="TestLifted"> <file name="a.b"> class C Dim field = 123 public sub F(x as integer) dim a as integer = 1, y as integer = 1 [| dim l1 = function() x+y+field |] dim c as integer = a + 4 + y end sub end class</file> </compilation>) Assert.Equal("l1", GetSymbolNamesJoined(analysis.VariablesDeclared)) Assert.Equal("l1", GetSymbolNamesJoined(analysis.AlwaysAssigned)) Assert.Equal("Me, x, y", GetSymbolNamesJoined(analysis.Captured)) Assert.Equal("Me, x, y", GetSymbolNamesJoined(analysis.CapturedInside)) Assert.Equal(Nothing, GetSymbolNamesJoined(analysis.CapturedOutside)) Assert.Equal("Me, x, y", GetSymbolNamesJoined(analysis.DataFlowsIn)) Assert.Equal(Nothing, GetSymbolNamesJoined(analysis.DataFlowsOut)) Assert.Equal("Me, x, y", GetSymbolNamesJoined(analysis.ReadInside)) Assert.Equal("l1", GetSymbolNamesJoined(analysis.WrittenInside)) Assert.Equal("a, y", GetSymbolNamesJoined(analysis.ReadOutside)) Assert.Equal("Me, x, a, y, c", GetSymbolNamesJoined(analysis.WrittenOutside)) End Sub <Fact()> Public Sub TestCapturedRegion() Dim analysis = CompileAndAnalyzeDataFlow( <compilation name="TestLifted"> <file name="a.b"> class C Dim field = 123 public sub F(x as integer) dim a as integer = 1, y as integer = 1 dim outside = function() x+field [| dim inside = function() y |] end sub end class</file> </compilation>) Assert.Equal("inside", GetSymbolNamesJoined(analysis.VariablesDeclared)) Assert.Equal("inside", GetSymbolNamesJoined(analysis.AlwaysAssigned)) Assert.Equal("Me, x, y", GetSymbolNamesJoined(analysis.Captured)) Assert.Equal("y", GetSymbolNamesJoined(analysis.CapturedInside)) Assert.Equal("Me, x", GetSymbolNamesJoined(analysis.CapturedOutside)) Assert.Equal("y", GetSymbolNamesJoined(analysis.DataFlowsIn)) Assert.Equal(Nothing, GetSymbolNamesJoined(analysis.DataFlowsOut)) Assert.Equal("y", GetSymbolNamesJoined(analysis.ReadInside)) Assert.Equal("inside", GetSymbolNamesJoined(analysis.WrittenInside)) Assert.Equal("Me, x", GetSymbolNamesJoined(analysis.ReadOutside)) Assert.Equal("Me, x, a, y, outside", GetSymbolNamesJoined(analysis.WrittenOutside)) End Sub <WorkItem(542629, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/542629")> <Fact()> Public Sub TestRegionControlFlowAnalysisInsideLambda() Dim controlFlowAnalysis = CompileAndAnalyzeControlFlow( <compilation name="TestRegionControlFlowAnalysisInsideLambda"> <file name="a.b"> Imports System Module Module1 Sub Main() Dim f1 As Func(Of Integer, Integer) = Function(lambdaParam As Integer) [| Return lambdaParam + 1 |] End Function End Sub End Module </file> </compilation>) Assert.Equal(1, controlFlowAnalysis.ExitPoints.Count()) Assert.Equal(0, controlFlowAnalysis.EntryPoints.Count()) Assert.True(controlFlowAnalysis.StartPointIsReachable) Assert.False(controlFlowAnalysis.EndPointIsReachable) End Sub <WorkItem(542629, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/542629")> <Fact()> Public Sub TestRegionControlFlowAnalysisInsideLambda2() Dim controlFlowAnalysis = CompileAndAnalyzeControlFlow( <compilation name="TestRegionControlFlowAnalysisInsideLambda2"> <file name="a.b"> Imports System Module Module1 Sub Main() Dim f1 As Object = Function(lambdaParam As Integer) [| Return lambdaParam + 1 |] End Function End Sub End Module </file> </compilation>) Assert.Equal(1, controlFlowAnalysis.ExitPoints.Count()) Assert.Equal(0, controlFlowAnalysis.EntryPoints.Count()) Assert.True(controlFlowAnalysis.StartPointIsReachable) Assert.False(controlFlowAnalysis.EndPointIsReachable) End Sub <WorkItem(542629, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/542629")> <Fact()> Public Sub TestRegionControlFlowAnalysisInsideLambda3() Dim controlFlowAnalysis = CompileAndAnalyzeControlFlow( <compilation name="TestRegionControlFlowAnalysisInsideLambda3"> <file name="a.b"> Imports System Module Module1 Sub Main() Dim f1 As Object = Nothing f1 = Function(lambdaParam As Integer) [| Return lambdaParam + 1 |] End Function End Sub End Module </file> </compilation>) Assert.Equal(1, controlFlowAnalysis.ExitPoints.Count()) Assert.Equal(0, controlFlowAnalysis.EntryPoints.Count()) Assert.True(controlFlowAnalysis.StartPointIsReachable) Assert.False(controlFlowAnalysis.EndPointIsReachable) End Sub <Fact()> Public Sub DoLoopInLambdaBody() Dim analysisResults = CompileAndAnalyzeControlAndDataFlow( <compilation name="DoLoopWithContinue"> <file name="a.b"> Class A Function Test1() As Integer Dim x As Integer = 5 Console.Write(x) dim x as System.Action(of Integer) = Sub(i) [| Do Console.Write(i) i = i + 1 Continue Do 'Blah Loop Until i > 5 |] end sub Return x End Function End Class </file> </compilation>) Dim controlFlowAnalysisResults = analysisResults.Item1 Dim dataFlowAnalysisResults = analysisResults.Item2 Assert.Equal(0, controlFlowAnalysisResults.EntryPoints.Count()) Assert.Equal(0, controlFlowAnalysisResults.ExitPoints.Count()) Assert.True(controlFlowAnalysisResults.StartPointIsReachable) Assert.True(controlFlowAnalysisResults.EndPointIsReachable) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowAnalysisResults.VariablesDeclared)) Assert.Equal("i", GetSymbolNamesJoined(dataFlowAnalysisResults.AlwaysAssigned)) Assert.Equal("i", GetSymbolNamesJoined(dataFlowAnalysisResults.DataFlowsIn)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowAnalysisResults.DataFlowsOut)) Assert.Equal("i", GetSymbolNamesJoined(dataFlowAnalysisResults.ReadInside)) Assert.Equal("x", GetSymbolNamesJoined(dataFlowAnalysisResults.ReadOutside)) Assert.Equal("i", GetSymbolNamesJoined(dataFlowAnalysisResults.WrittenInside)) Assert.Equal("Me, x, x, i", GetSymbolNamesJoined(dataFlowAnalysisResults.WrittenOutside)) End Sub <Fact()> Public Sub AnonymousTypeAsLambdaLocal() Dim analysisResults = CompileAndAnalyzeControlAndDataFlow( <compilation> <file name="a.vb"> Option Infer On Imports System Public Class Test delegate R Func(OfT, R)(ref T t); Public Shared Sub Main() Dim local(3) As String [| Dim lambda As Func(Of Integer, Integer) = Function(ByRef p As Integer) As Integer p = p * 2 Dim at = New With {New C(Of Integer)().F, C(Of String).SF, .L = local.Length + p} Console.Write("{0}, {1}, {2}", at.F, at.SF) Return at.L End Function |] End Sub Class C(Of T) Public Function F() As T Return Nothing End Function Shared Public Function SF() As T Return Nothing End Function End Class End Class </file> </compilation>) Dim controlFlowResults = analysisResults.Item1 Dim dataFlowResults = analysisResults.Item2 Assert.True(controlFlowResults.Succeeded) Assert.True(dataFlowResults.Succeeded) Assert.Equal("lambda", GetSymbolNamesJoined(dataFlowResults.AlwaysAssigned)) Assert.Equal("local", GetSymbolNamesJoined(dataFlowResults.Captured)) Assert.Equal("local", GetSymbolNamesJoined(dataFlowResults.CapturedInside)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowResults.CapturedOutside)) Assert.Equal("lambda, p, at", GetSymbolNamesJoined(dataFlowResults.VariablesDeclared)) Assert.Equal("local", GetSymbolNamesJoined(dataFlowResults.DataFlowsIn)) Assert.Equal("p", GetSymbolNamesJoined(dataFlowResults.DataFlowsOut)) Assert.Equal("local, p, at", GetSymbolNamesJoined(dataFlowResults.ReadInside)) Assert.Equal("lambda, p, at", GetSymbolNamesJoined(dataFlowResults.WrittenInside)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowResults.ReadOutside)) Assert.Equal("local", GetSymbolNamesJoined(dataFlowResults.WrittenOutside)) End Sub <Fact()> Public Sub AnonymousTypeAsNewInLocalContext() Dim analysisResults = CompileAndAnalyzeControlAndDataFlow( <compilation> <file name="a.vb"> Imports System Interface IGoo Delegate Sub DS(ByRef p As Char) End Interface Class CGoo Implements IGoo End Class Friend Module AM Sub Main(args As String()) Dim igoo As IGoo = New CGoo() Dim at1 As New With {.if = igoo} [| Dim at2 As New With {.if = at1, igoo, .friend = New With {Key args, .lambda = DirectCast(Sub(ByRef p As Char) args(0) = p & p p = "Q"c End Sub, IGoo.DS)}} |] Console.Write(args(0)) End Sub End Module </file> </compilation>) Dim controlFlowResults = analysisResults.Item1 Dim dataFlowResults = analysisResults.Item2 Assert.True(controlFlowResults.Succeeded) Assert.True(dataFlowResults.Succeeded) Assert.Equal("at2", GetSymbolNamesJoined(dataFlowResults.AlwaysAssigned)) Assert.Equal("args", GetSymbolNamesJoined(dataFlowResults.Captured)) Assert.Equal("args", GetSymbolNamesJoined(dataFlowResults.CapturedInside)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowResults.CapturedOutside)) Assert.Equal("at2, p", GetSymbolNamesJoined(dataFlowResults.VariablesDeclared)) Assert.Equal("args, igoo, at1", GetSymbolNamesJoined(dataFlowResults.DataFlowsIn)) Assert.Equal("p", GetSymbolNamesJoined(dataFlowResults.DataFlowsOut)) Assert.Equal("args, igoo, at1, p", GetSymbolNamesJoined(dataFlowResults.ReadInside)) Assert.Equal("at2, p", GetSymbolNamesJoined(dataFlowResults.WrittenInside)) Assert.Equal("args, igoo", GetSymbolNamesJoined(dataFlowResults.ReadOutside)) Assert.Equal("args, igoo, at1", GetSymbolNamesJoined(dataFlowResults.WrittenOutside)) End Sub <Fact()> Public Sub AnonymousTypeAsExpression() Dim dataFlowResults = CompileAndAnalyzeDataFlow( <compilation> <file name="a.vb"> Imports System Interface IGoo Delegate Sub DS(ByRef p As Char) End Interface Friend Module AM Sub Main(args As String()) Dim at1 As New With {.friend = New With {args, Key.lambda = DirectCast(Sub(ByRef p As Char) args(0) = p & p p = "Q"c End Sub, IGoo.DS) } } Dim at2 As New With { Key .a= at1, .friend = New With { [| at1 |] }} Console.Write(args(0)) End Sub End Module </file> </compilation>) Assert.True(dataFlowResults.Succeeded) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowResults.AlwaysAssigned)) Assert.Equal("args", GetSymbolNamesJoined(dataFlowResults.Captured)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowResults.CapturedInside)) Assert.Equal("args", GetSymbolNamesJoined(dataFlowResults.CapturedOutside)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowResults.VariablesDeclared)) Assert.Equal("at1", GetSymbolNamesJoined(dataFlowResults.DataFlowsIn)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowResults.DataFlowsOut)) Assert.Equal("at1", GetSymbolNamesJoined(dataFlowResults.ReadInside)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowResults.WrittenInside)) Assert.Equal("args, at1, p", GetSymbolNamesJoined(dataFlowResults.ReadOutside)) Assert.Equal("args, at1, p, at2", GetSymbolNamesJoined(dataFlowResults.WrittenOutside)) End Sub <Fact()> Public Sub AnonymousTypeAccessInstanceMember() Dim dataFlowResults = CompileAndAnalyzeDataFlow( <compilation> <file name="a.vb"> Imports System Class AM Dim field = 123 Sub M(args As String()) Dim at1 As New With {.friend = [| New With {args, Key.lambda = Sub(ByRef ary As Char()) Field = ary.Length End Sub } |] } End Sub End Class </file> </compilation>) Assert.True(dataFlowResults.Succeeded) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowResults.AlwaysAssigned)) Assert.Equal("Me", GetSymbolNamesJoined(dataFlowResults.Captured)) Assert.Equal("Me", GetSymbolNamesJoined(dataFlowResults.CapturedInside)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowResults.CapturedOutside)) Assert.Equal("ary", GetSymbolNamesJoined(dataFlowResults.VariablesDeclared)) Assert.Equal("Me, args", GetSymbolNamesJoined(dataFlowResults.DataFlowsIn)) Assert.Equal("ary", GetSymbolNamesJoined(dataFlowResults.DataFlowsOut)) Assert.Equal("Me, args, ary", GetSymbolNamesJoined(dataFlowResults.ReadInside)) Assert.Equal("ary", GetSymbolNamesJoined(dataFlowResults.WrittenInside)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowResults.ReadOutside)) Assert.Equal("Me, args, at1", GetSymbolNamesJoined(dataFlowResults.WrittenOutside)) End Sub <Fact()> Public Sub AnonymousTypeFieldInitializerWithLeftOmitted() Dim dataFlowResults = CompileAndAnalyzeDataFlow( <compilation> <file name="a.vb"> Imports System Class AM Dim field = 123 Sub M(args As String()) Dim var1 As New AM Dim at1 As New With { var1, .friend = [| .var1 |] } End Sub End Class </file> </compilation>) Assert.True(dataFlowResults.Succeeded) Assert.Null(GetSymbolNamesJoined(dataFlowResults.AlwaysAssigned)) Assert.Null(GetSymbolNamesJoined(dataFlowResults.Captured)) Assert.Null(GetSymbolNamesJoined(dataFlowResults.CapturedInside)) Assert.Null(GetSymbolNamesJoined(dataFlowResults.CapturedOutside)) Assert.Null(GetSymbolNamesJoined(dataFlowResults.VariablesDeclared)) Assert.Null(GetSymbolNamesJoined(dataFlowResults.DataFlowsIn)) Assert.Null(GetSymbolNamesJoined(dataFlowResults.DataFlowsOut)) Assert.Null(GetSymbolNamesJoined(dataFlowResults.ReadInside)) Assert.Null(GetSymbolNamesJoined(dataFlowResults.WrittenInside)) Assert.Equal("var1", GetSymbolNamesJoined(dataFlowResults.ReadOutside)) Assert.Equal("Me, args, var1, at1", GetSymbolNamesJoined(dataFlowResults.WrittenOutside)) End Sub <Fact()> Public Sub AnonymousTypeUsingMe() Dim dataFlowResults = CompileAndAnalyzeDataFlow( <compilation> <file name="a.vb"> Imports System Class Base Protected Function F1() As Long Return 123 End Function Friend Overridable Function F2(n As Integer) As Integer Return 456 End Function End Class Class Derived Inherits Base Friend Overrides Function F2(n As Integer) As Integer Return 789 End Function Sub M() Dim func = Function(x) Dim at = [| New With {.dim = New With {Key .nested = Me.F2(x * x)}} |] Return at.dim.nested End Function End Sub End Class </file> </compilation>) Assert.True(dataFlowResults.Succeeded) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowResults.AlwaysAssigned)) Assert.Equal("Me", GetSymbolNamesJoined(dataFlowResults.Captured)) Assert.Equal("Me", GetSymbolNamesJoined(dataFlowResults.CapturedInside)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowResults.CapturedOutside)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowResults.VariablesDeclared)) Assert.Equal("Me, x", GetSymbolNamesJoined(dataFlowResults.DataFlowsIn)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowResults.DataFlowsOut)) Assert.Equal("Me, x", GetSymbolNamesJoined(dataFlowResults.ReadInside)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowResults.WrittenInside)) Assert.Equal("at", GetSymbolNamesJoined(dataFlowResults.ReadOutside)) Assert.Equal("Me, func, x, at", GetSymbolNamesJoined(dataFlowResults.WrittenOutside)) End Sub <Fact()> Public Sub AnonymousTypeAccessMyBase() Dim dataFlowResults = CompileAndAnalyzeDataFlow( <compilation> <file name="a.vb"> Imports System Class Base Protected Overridable Function F1() As Long Return 123 End Function End Class Class Derived Inherits Base Protected Overrides Function F1() As Long Return 789 End Function Sub M() Dim func = Function(x) Dim at = [| New With {Key .dim = New With {MyBase.F1()}} |] Return at.dim.F1 End Function End Sub End Class </file> </compilation>) Assert.True(dataFlowResults.Succeeded) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowResults.AlwaysAssigned)) Assert.Equal("Me", GetSymbolNamesJoined(dataFlowResults.Captured)) Assert.Equal("Me", GetSymbolNamesJoined(dataFlowResults.CapturedInside)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowResults.CapturedOutside)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowResults.VariablesDeclared)) Assert.Equal("Me", GetSymbolNamesJoined(dataFlowResults.DataFlowsIn)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowResults.DataFlowsOut)) Assert.Equal("Me", GetSymbolNamesJoined(dataFlowResults.ReadInside)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowResults.WrittenInside)) Assert.Equal("at", GetSymbolNamesJoined(dataFlowResults.ReadOutside)) Assert.Equal("Me, func, x, at", GetSymbolNamesJoined(dataFlowResults.WrittenOutside)) End Sub <Fact()> Public Sub AnonymousTypeAccessMyClass() Dim dataFlowResults = CompileAndAnalyzeDataFlow( <compilation> <file name="a.vb"> Imports System Module M1 Class B1 Public Overridable Function F() As String Return "B1::F_" End Function End Class Class B2 Inherits B1 Public Overrides Function F() As String Return "B2::F_" End Function Public Sub TestMMM() Dim an = [| New With {.an = Function(s) As String Return s + Me.F() + MyBase.F() + MyClass.F() End Function } |] Console.WriteLine(an.an("R=")) End Sub End Class Class D Inherits B2 Public Overrides Function F() As String Return "D::F_" End Function End Class Public Sub Main() Call (New D()).TestMMM() End Sub End Module </file> </compilation>) Assert.True(dataFlowResults.Succeeded) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowResults.AlwaysAssigned)) Assert.Equal("Me", GetSymbolNamesJoined(dataFlowResults.Captured)) Assert.Equal("Me", GetSymbolNamesJoined(dataFlowResults.CapturedInside)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowResults.CapturedOutside)) Assert.Equal("s", GetSymbolNamesJoined(dataFlowResults.VariablesDeclared)) Assert.Equal("Me", GetSymbolNamesJoined(dataFlowResults.DataFlowsIn)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowResults.DataFlowsOut)) Assert.Equal("Me, s", GetSymbolNamesJoined(dataFlowResults.ReadInside)) Assert.Equal("s", GetSymbolNamesJoined(dataFlowResults.WrittenInside)) Assert.Equal("an", GetSymbolNamesJoined(dataFlowResults.ReadOutside)) Assert.Equal("Me, an", GetSymbolNamesJoined(dataFlowResults.WrittenOutside)) End Sub <WorkItem(543046, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/543046")> <Fact()> Public Sub Lambda() ' The region is not correct and it is not clear if there is a way to fix the test Assert.Throws(Of ArgumentException)( Sub() Dim dataFlowResults = CompileAndAnalyzeDataFlow( <compilation> <file name="a.vb"> Option Strict On Imports System Imports System.Runtime.InteropServices Public Class S1 [|Const str As String = "" < MyAttribute(Me.color.blue) > Sub goo() End Sub|] Shared Sub main() End Sub Enum color blue End Enum End Class Class MyAttribute Inherits Attribute Sub New(str As S1.color) End Sub End Class </file> </compilation>) Assert.False(dataFlowResults.Succeeded) End Sub) End Sub <WorkItem(543684, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/543684")> <Fact()> Public Sub AddressOfExpr() Dim dataFlowResults = CompileAndAnalyzeDataFlow( <compilation> <file name="a.vb"> Module Program Sub Main() Dim x5 = Function() AddressOf [|Main|] End Sub End Module </file> </compilation>) Assert.True(dataFlowResults.Succeeded) End Sub <WorkItem(543741, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/543741")> <Fact()> Public Sub AddressOfExpr2() Dim dataFlowResults = CompileAndAnalyzeDataFlow( <compilation> <file name="a.vb"> Module Program Public Event Ev1 Public Sub Handler1() End Sub Public Sub AddFirstHandler() AddHandler Ev1, AddressOf [|Handler1|] End Sub End Module </file> </compilation>) Assert.True(dataFlowResults.Succeeded) End Sub <Fact()> Public Sub XmlEmbeddedExpression() Dim compilation = CreateCompilationWithMscorlib40AndVBRuntimeAndReferences( <compilation> <file name="c.vb"><![CDATA[ Option Strict On Imports System.Xml.Linq Module M Function F() As Object Dim v0 = "v0" Dim v1 = XName.Get("v1", "") Dim v2 = XName.Get("v2", "") Dim v3 = "v3" Dim v4 = New XAttribute(XName.Get("v4", ""), "v4") Dim v5 = "v5" Return <?xml version="1.0"?><<%= v1 %> <%= v2 %>="v2" v3=<%= v3 %> <%= v4 %>><%= v5 %></> End Function End Module ]]></file> </compilation>, references:=XmlReferences) Dim tree = compilation.SyntaxTrees.First() Dim model = compilation.GetSemanticModel(tree) Dim root = tree.GetCompilationUnitRoot() Dim node = DirectCast(root.FindToken(root.ToFullString().IndexOf("Return", StringComparison.Ordinal)).Parent, StatementSyntax) Dim dataFlowAnalysis = model.AnalyzeDataFlow(node, node) Assert.True(dataFlowAnalysis.Succeeded) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowAnalysis.VariablesDeclared)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowAnalysis.AlwaysAssigned)) Assert.Equal("v1, v2, v3, v4, v5", GetSymbolNamesJoined(dataFlowAnalysis.DataFlowsIn)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowAnalysis.DataFlowsOut)) Assert.Equal("v1, v2, v3, v4, v5", GetSymbolNamesJoined(dataFlowAnalysis.ReadInside)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowAnalysis.WrittenInside)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowAnalysis.ReadOutside)) Assert.Equal("v0, v1, v2, v3, v4, v5", GetSymbolNamesJoined(dataFlowAnalysis.WrittenOutside)) End Sub <Fact()> Public Sub XmlMemberAccess() Dim compilation = CreateCompilationWithMscorlib40AndVBRuntimeAndReferences( <compilation> <file name="c.vb"><![CDATA[ Option Strict On Imports System.Xml.Linq Module M Function F() As Object Dim x = <a><b><c d="e"/></b></a> Return x.<b>...<c>.@<d> End Function End Module ]]></file> </compilation>, references:=XmlReferences) Dim tree = compilation.SyntaxTrees.First() Dim model = compilation.GetSemanticModel(tree) Dim root = tree.GetCompilationUnitRoot() Dim node = DirectCast(root.FindToken(root.ToFullString().IndexOf("Return", StringComparison.Ordinal)).Parent, StatementSyntax) Dim dataFlowAnalysis = model.AnalyzeDataFlow(node, node) Assert.True(dataFlowAnalysis.Succeeded) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowAnalysis.VariablesDeclared)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowAnalysis.AlwaysAssigned)) Assert.Equal("x", GetSymbolNamesJoined(dataFlowAnalysis.DataFlowsIn)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowAnalysis.DataFlowsOut)) Assert.Equal("x", GetSymbolNamesJoined(dataFlowAnalysis.ReadInside)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowAnalysis.WrittenInside)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowAnalysis.ReadOutside)) Assert.Equal("x", GetSymbolNamesJoined(dataFlowAnalysis.WrittenOutside)) End Sub <Fact()> Public Sub GenericStructureCycle() Dim source = <compilation> <file name="c.vb"><![CDATA[ Structure S(Of T) Public F As S(Of S(Of T)) End Structure Module M Sub M() Dim o As S(Of Object) End Sub End Module ]]></file> </compilation> Dim compilation = CreateCompilationWithMscorlib40(source) Dim tree = compilation.SyntaxTrees.First() Dim model = compilation.GetSemanticModel(tree) Dim root = tree.GetCompilationUnitRoot() Dim node = DirectCast(root.FindToken(root.ToFullString().IndexOf("Dim", StringComparison.Ordinal)).Parent, StatementSyntax) Dim dataFlowAnalysis = model.AnalyzeDataFlow(node, node) Assert.True(dataFlowAnalysis.Succeeded) Assert.Equal("o", GetSymbolNamesJoined(dataFlowAnalysis.VariablesDeclared)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowAnalysis.AlwaysAssigned)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowAnalysis.DataFlowsIn)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowAnalysis.DataFlowsOut)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowAnalysis.ReadInside)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowAnalysis.WrittenInside)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowAnalysis.ReadOutside)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowAnalysis.WrittenOutside)) End Sub #End Region #Region "With Statement" <Fact()> Public Sub WithStatement_Expression_RValue_1() Dim dataFlowResults = CompileAndAnalyzeDataFlow( <compilation> <file name="a.vb"> Structure SSS Public A As String Public B As Integer Public Sub New(_a As String, _b As Integer) End Sub End Structure Class Clazz Sub TEST(i As Integer) With [| New SSS(Me.ToString(), i) |] End With End Sub End Class </file> </compilation>) Assert.True(dataFlowResults.Succeeded) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowResults.VariablesDeclared)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowResults.AlwaysAssigned)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowResults.Captured)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowResults.CapturedInside)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowResults.CapturedOutside)) Assert.Equal("Me, i", GetSymbolNamesJoined(dataFlowResults.DataFlowsIn)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowResults.DataFlowsOut)) Assert.Equal("Me, i", GetSymbolNamesJoined(dataFlowResults.ReadInside)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowResults.WrittenInside)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowResults.ReadOutside)) Assert.Equal("Me, i", GetSymbolNamesJoined(dataFlowResults.WrittenOutside)) End Sub <Fact()> Public Sub WithStatement_Expression_RValue_2() Dim dataFlowResults = CompileAndAnalyzeDataFlow( <compilation> <file name="a.vb"> Structure SSS Public A As String Public B As Integer Public Sub New(_a As String, _b As Integer) End Sub End Structure Class Clazz Sub TEST(i As Integer) With [| New SSS(Me.ToString(), i) |] .A = "" End With End Sub End Class </file> </compilation>) Assert.True(dataFlowResults.Succeeded) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowResults.VariablesDeclared)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowResults.AlwaysAssigned)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowResults.Captured)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowResults.CapturedInside)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowResults.CapturedOutside)) Assert.Equal("Me, i", GetSymbolNamesJoined(dataFlowResults.DataFlowsIn)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowResults.DataFlowsOut)) Assert.Equal("Me, i", GetSymbolNamesJoined(dataFlowResults.ReadInside)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowResults.WrittenInside)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowResults.ReadOutside)) Assert.Equal("Me, i", GetSymbolNamesJoined(dataFlowResults.WrittenOutside)) End Sub <Fact()> Public Sub WithStatement_Expression_RValue_3() Dim dataFlowResults = CompileAndAnalyzeDataFlow( <compilation> <file name="a.vb"> Imports System Structure SSS Public A As String Public B As Integer Public Sub New(_a As String, _b As Integer) End Sub End Structure Class Clazz Sub TEST(i As Integer) With [| New SSS(Me.ToString(), i) |] Dim s As Action = Sub() .A = "" End Sub End With End Sub End Class </file> </compilation>) Assert.True(dataFlowResults.Succeeded) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowResults.VariablesDeclared)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowResults.AlwaysAssigned)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowResults.Captured)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowResults.CapturedInside)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowResults.CapturedOutside)) Assert.Equal("Me, i", GetSymbolNamesJoined(dataFlowResults.DataFlowsIn)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowResults.DataFlowsOut)) Assert.Equal("Me, i", GetSymbolNamesJoined(dataFlowResults.ReadInside)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowResults.WrittenInside)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowResults.ReadOutside)) Assert.Equal("Me, i, s", GetSymbolNamesJoined(dataFlowResults.WrittenOutside)) End Sub <Fact()> Public Sub WithStatement_Expression_LValue_1() Dim dataFlowResults = CompileAndAnalyzeDataFlow( <compilation> <file name="a.vb"> Structure SSS Public A As String Public B As Integer Public Sub New(_a As String, _b As Integer) End Sub End Structure Class Clazz Sub TEST(i As Integer) Dim x As New SSS(Me.ToString(), i) With [| x |] End With End Sub End Class </file> </compilation>) Assert.False(dataFlowResults.Succeeded) End Sub <Fact()> Public Sub WithStatement_Expression_LValue_2() Dim dataFlowResults = CompileAndAnalyzeDataFlow( <compilation> <file name="a.vb"> Structure SSS Public A As String Public B As Integer Public Sub New(_a As String, _b As Integer) End Sub End Structure Class Clazz Sub TEST(i As Integer) Dim x As New SSS(Me.ToString(), i) With [| x |] .A = "" End With End Sub End Class </file> </compilation>) Assert.True(dataFlowResults.Succeeded) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowResults.VariablesDeclared)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowResults.AlwaysAssigned)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowResults.Captured)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowResults.CapturedInside)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowResults.CapturedOutside)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowResults.DataFlowsIn)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowResults.DataFlowsOut)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowResults.ReadInside)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowResults.WrittenInside)) Assert.Equal("Me, i", GetSymbolNamesJoined(dataFlowResults.ReadOutside)) Assert.Equal("Me, i, x", GetSymbolNamesJoined(dataFlowResults.WrittenOutside)) End Sub <Fact()> Public Sub WithStatement_Expression_LValue_2_() Dim dataFlowResults = CompileAndAnalyzeDataFlow( <compilation> <file name="a.vb"> Structure SSS Public A As String Public B As Integer Public Sub New(_a As String, _b As Integer) End Sub End Structure Class Clazz Sub TEST(i As Integer) Dim x As New SSS(Me.ToString(), i) With [| x |] .A = "" Dim a = .A Dim b = .B .B = 1 End With End Sub End Class </file> </compilation>) Assert.True(dataFlowResults.Succeeded) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowResults.VariablesDeclared)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowResults.AlwaysAssigned)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowResults.Captured)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowResults.CapturedInside)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowResults.CapturedOutside)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowResults.DataFlowsIn)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowResults.DataFlowsOut)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowResults.ReadInside)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowResults.WrittenInside)) Assert.Equal("Me, i, x", GetSymbolNamesJoined(dataFlowResults.ReadOutside)) Assert.Equal("Me, i, x, a, b", GetSymbolNamesJoined(dataFlowResults.WrittenOutside)) End Sub <Fact()> Public Sub WithStatement_Expression_LValue_2a() Dim dataFlowResults = CompileAndAnalyzeDataFlow( <compilation> <file name="a.vb"> Structure SSS Public A As String Public B As Integer Public Sub New(_a As String, _b As Integer) End Sub End Structure Class Clazz Sub TEST(i As Integer) Dim x As New SSS(Me.ToString(), i) With x [| .A = "" |] End With End Sub End Class </file> </compilation>) Assert.True(dataFlowResults.Succeeded) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowResults.VariablesDeclared)) Assert.Equal("x", GetSymbolNamesJoined(dataFlowResults.AlwaysAssigned)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowResults.Captured)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowResults.CapturedInside)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowResults.CapturedOutside)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowResults.DataFlowsIn)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowResults.DataFlowsOut)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowResults.ReadInside)) Assert.Equal("x", GetSymbolNamesJoined(dataFlowResults.WrittenInside)) Assert.Equal("Me, i", GetSymbolNamesJoined(dataFlowResults.ReadOutside)) Assert.Equal("Me, i, x", GetSymbolNamesJoined(dataFlowResults.WrittenOutside)) End Sub <Fact()> Public Sub WithStatement_Expression_LValue_2b() Dim dataFlowResults = CompileAndAnalyzeDataFlow( <compilation> <file name="a.vb"> Structure SSS Public A As String Public B As Integer Public Sub New(_a As String, _b As Integer) End Sub End Structure Class Clazz Sub TEST(i As Integer) Dim x As New SSS(Me.ToString(), i) With x [| .B = "" |] End With End Sub End Class </file> </compilation>) Assert.True(dataFlowResults.Succeeded) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowResults.VariablesDeclared)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowResults.AlwaysAssigned)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowResults.Captured)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowResults.CapturedInside)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowResults.CapturedOutside)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowResults.DataFlowsIn)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowResults.DataFlowsOut)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowResults.ReadInside)) Assert.Equal("x", GetSymbolNamesJoined(dataFlowResults.WrittenInside)) Assert.Equal("Me, i", GetSymbolNamesJoined(dataFlowResults.ReadOutside)) Assert.Equal("Me, i, x", GetSymbolNamesJoined(dataFlowResults.WrittenOutside)) End Sub <Fact()> Public Sub WithStatement_Expression_LValue_3() Dim dataFlowResults = CompileAndAnalyzeDataFlow( <compilation> <file name="a.vb"> Imports System Structure SSS Public A As String Public B As Integer Public Sub New(_a As String, _b As Integer) End Sub End Structure Class Clazz Sub TEST(i As Integer) Dim x As New SSS(Me.ToString(), i) With [| x |] Dim s As Action = Sub() .A = "" End Sub End With End Sub End Class </file> </compilation>) Assert.True(dataFlowResults.Succeeded) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowResults.VariablesDeclared)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowResults.AlwaysAssigned)) Assert.Equal("x", GetSymbolNamesJoined(dataFlowResults.Captured)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowResults.CapturedInside)) Assert.Equal("x", GetSymbolNamesJoined(dataFlowResults.CapturedOutside)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowResults.DataFlowsIn)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowResults.DataFlowsOut)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowResults.ReadInside)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowResults.WrittenInside)) Assert.Equal("Me, i", GetSymbolNamesJoined(dataFlowResults.ReadOutside)) Assert.Equal("Me, i, x, s", GetSymbolNamesJoined(dataFlowResults.WrittenOutside)) End Sub <Fact()> Public Sub WithStatement_Expression_LValue_4() Dim dataFlowResults = CompileAndAnalyzeDataFlow( <compilation> <file name="a.vb"> Imports System Structure SSSS Public A As String Public B As Integer End Structure Structure SSS Public S As SSSS nd Structure Class Clazz Sub TEST() Dim x As New SSS() With [| x.S |] Dim s As Action = Sub() .A = "" End Sub End With End Sub End Class </file> </compilation>) Assert.True(dataFlowResults.Succeeded) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowResults.VariablesDeclared)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowResults.AlwaysAssigned)) Assert.Equal("x", GetSymbolNamesJoined(dataFlowResults.Captured)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowResults.CapturedInside)) Assert.Equal("x", GetSymbolNamesJoined(dataFlowResults.CapturedOutside)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowResults.DataFlowsIn)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowResults.DataFlowsOut)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowResults.ReadInside)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowResults.WrittenInside)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowResults.ReadOutside)) Assert.Equal("Me, x, s", GetSymbolNamesJoined(dataFlowResults.WrittenOutside)) End Sub <Fact()> Public Sub WithStatement_Expression_LValue_4a() Dim dataFlowResults = CompileAndAnalyzeDataFlow( <compilation> <file name="a.vb"> Imports System Structure SSSS Public A As String Public B As Integer End Structure Structure SSS Public S As SSSS nd Structure Class Clazz Sub TEST() Dim x As New SSS() With [| x |] .S Dim s As Action = Sub() .A = "" End Sub End With End Sub End Class </file> </compilation>) Assert.True(dataFlowResults.Succeeded) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowResults.VariablesDeclared)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowResults.AlwaysAssigned)) Assert.Equal("x", GetSymbolNamesJoined(dataFlowResults.Captured)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowResults.CapturedInside)) Assert.Equal("x", GetSymbolNamesJoined(dataFlowResults.CapturedOutside)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowResults.DataFlowsIn)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowResults.DataFlowsOut)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowResults.ReadInside)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowResults.WrittenInside)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowResults.ReadOutside)) Assert.Equal("Me, x, s", GetSymbolNamesJoined(dataFlowResults.WrittenOutside)) End Sub <Fact()> Public Sub WithStatement_Expression_LValue_4b() Dim dataFlowResults = CompileAndAnalyzeDataFlow( <compilation> <file name="a.vb"> Imports System Structure SSSS Public A As String Public B As Integer End Structure Structure SSS Public S As SSSS nd Structure Class Clazz Sub TEST() Dim x As New SSS() With x.S Dim s As Action = Sub() [| .A = "" |] End Sub End With x.ToString() End Sub End Class </file> </compilation>) Assert.True(dataFlowResults.Succeeded) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowResults.VariablesDeclared)) Assert.Equal("x", GetSymbolNamesJoined(dataFlowResults.AlwaysAssigned)) Assert.Equal("x", GetSymbolNamesJoined(dataFlowResults.Captured)) Assert.Equal("x", GetSymbolNamesJoined(dataFlowResults.CapturedInside)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowResults.CapturedOutside)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowResults.DataFlowsIn)) Assert.Equal("x", GetSymbolNamesJoined(dataFlowResults.DataFlowsOut)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowResults.ReadInside)) Assert.Equal("x", GetSymbolNamesJoined(dataFlowResults.WrittenInside)) Assert.Equal("x", GetSymbolNamesJoined(dataFlowResults.ReadOutside)) Assert.Equal("Me, x, s", GetSymbolNamesJoined(dataFlowResults.WrittenOutside)) End Sub <Fact()> Public Sub WithStatement_Expression_LValue_4c() Dim dataFlowResults = CompileAndAnalyzeDataFlow( <compilation> <file name="a.vb"> Imports System Structure SSSS Public A As String Public B As Integer End Structure Structure SSS Public S As SSSS nd Structure Class Clazz Sub TEST() Dim x As New SSS() With x.S Dim s As Action = Sub() [| .A |] = "" End Sub End With x.ToString() End Sub End Class </file> </compilation>) Assert.True(dataFlowResults.Succeeded) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowResults.VariablesDeclared)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowResults.AlwaysAssigned)) Assert.Equal("x", GetSymbolNamesJoined(dataFlowResults.Captured)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowResults.CapturedInside)) Assert.Equal("x", GetSymbolNamesJoined(dataFlowResults.CapturedOutside)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowResults.DataFlowsIn)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowResults.DataFlowsOut)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowResults.ReadInside)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowResults.WrittenInside)) Assert.Equal("x", GetSymbolNamesJoined(dataFlowResults.ReadOutside)) Assert.Equal("Me, x, s", GetSymbolNamesJoined(dataFlowResults.WrittenOutside)) End Sub <ConditionalFact(GetType(NoUsedAssembliesValidation))> ' https://github.com/dotnet/roslyn/issues/40684: The test hook is blocked by this issue. <WorkItem(40684, "https://github.com/dotnet/roslyn/issues/40684")> Public Sub WithStatement_Expression_LValue_4d() Dim dataFlowResults = CompileAndAnalyzeDataFlow( <compilation> <file name="a.vb"> Imports System Structure SSSS3 Public A As String Public B As Integer End Structure Structure SSSS2 Public S3 As SSSS3 End Structure Structure SSSS Public S2 As SSSS2 End Structure Structure SSS Public S As SSSS End Structure Class Clazz Sub TEST() Dim x As New SSS() With x.S With .S2 With .S3 Dim s As Action = Sub() [| .A = "" |] End Sub End With End With End With x.ToString() End Sub End Class </file> </compilation>) Assert.True(dataFlowResults.Succeeded) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowResults.VariablesDeclared)) Assert.Equal("x", GetSymbolNamesJoined(dataFlowResults.AlwaysAssigned)) Assert.Equal("x", GetSymbolNamesJoined(dataFlowResults.Captured)) Assert.Equal("x", GetSymbolNamesJoined(dataFlowResults.CapturedInside)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowResults.CapturedOutside)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowResults.DataFlowsIn)) Assert.Equal("x", GetSymbolNamesJoined(dataFlowResults.DataFlowsOut)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowResults.ReadInside)) Assert.Equal("x", GetSymbolNamesJoined(dataFlowResults.WrittenInside)) Assert.Equal("x", GetSymbolNamesJoined(dataFlowResults.ReadOutside)) Assert.Equal("Me, x, s", GetSymbolNamesJoined(dataFlowResults.WrittenOutside)) End Sub <ConditionalFact(GetType(NoUsedAssembliesValidation))> ' https://github.com/dotnet/roslyn/issues/40684: The test hook is blocked by this issue. <WorkItem(40684, "https://github.com/dotnet/roslyn/issues/40684")> Public Sub WithStatement_Expression_LValue_4e() Dim dataFlowResults = CompileAndAnalyzeDataFlow( <compilation> <file name="a.vb"> Imports System Structure SSSS3 Public A As String Public B As Integer End Structure Structure SSSS2 Public S3 As SSSS3 End Structure Structure SSSS Public S2 As SSSS2 End Structure Structure SSS Public S As SSSS End Structure Class Clazz Sub TEST() Dim x As New SSS() With x.S With .S2 With .S3 Dim s As Action = Sub() Dim xyz = [| .A |] End Sub End With End With End With x.ToString() End Sub End Class </file> </compilation>) Assert.True(dataFlowResults.Succeeded) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowResults.VariablesDeclared)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowResults.AlwaysAssigned)) Assert.Equal("x", GetSymbolNamesJoined(dataFlowResults.Captured)) Assert.Equal("x", GetSymbolNamesJoined(dataFlowResults.CapturedInside)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowResults.CapturedOutside)) Assert.Equal("x", GetSymbolNamesJoined(dataFlowResults.DataFlowsIn)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowResults.DataFlowsOut)) Assert.Equal("x", GetSymbolNamesJoined(dataFlowResults.ReadInside)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowResults.WrittenInside)) Assert.Equal("x", GetSymbolNamesJoined(dataFlowResults.ReadOutside)) Assert.Equal("Me, x, s, xyz", GetSymbolNamesJoined(dataFlowResults.WrittenOutside)) End Sub <Fact()> Public Sub WithStatement_Expression_LValue_4f() Dim dataFlowResults = CompileAndAnalyzeDataFlow( <compilation> <file name="a.vb"> Imports System Structure SSSS3 Public A As String Public B As Integer End Structure Structure SSSS2 Public S3 As SSSS3 End Structure Structure SSSS Public S2 As SSSS2 End Structure Structure SSS Public S As SSSS End Structure Class Clazz Sub TEST() Dim x As New SSS() With [| x.S.S2 |].S3 Dim s As Action = Sub() .A = "" End Sub End With x.ToString() End Sub End Class </file> </compilation>) Assert.True(dataFlowResults.Succeeded) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowResults.VariablesDeclared)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowResults.AlwaysAssigned)) Assert.Equal("x", GetSymbolNamesJoined(dataFlowResults.Captured)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowResults.CapturedInside)) Assert.Equal("x", GetSymbolNamesJoined(dataFlowResults.CapturedOutside)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowResults.DataFlowsIn)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowResults.DataFlowsOut)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowResults.ReadInside)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowResults.WrittenInside)) Assert.Equal("x", GetSymbolNamesJoined(dataFlowResults.ReadOutside)) Assert.Equal("Me, x, s", GetSymbolNamesJoined(dataFlowResults.WrittenOutside)) End Sub <Fact()> Public Sub WithStatement_Expression_LValue_4g() Dim dataFlowResults = CompileAndAnalyzeDataFlow( <compilation> <file name="a.vb"> Imports System Structure SSSS3 Public A As String Public B As Integer End Structure Structure SSSS2 Public S3 As SSSS3 End Structure Structure SSSS Public S2 As SSSS2 End Structure Class SSS Public S As SSSS End Class Class Clazz Sub TEST() Dim x As New SSS() With [| x.S.S2 |].S3 Dim s As Action = Sub() .A = "" End Sub End With x.ToString() End Sub End Class </file> </compilation>) Assert.True(dataFlowResults.Succeeded) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowResults.VariablesDeclared)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowResults.AlwaysAssigned)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowResults.Captured)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowResults.CapturedInside)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowResults.CapturedOutside)) Assert.Equal("x", GetSymbolNamesJoined(dataFlowResults.DataFlowsIn)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowResults.DataFlowsOut)) Assert.Equal("x", GetSymbolNamesJoined(dataFlowResults.ReadInside)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowResults.WrittenInside)) Assert.Equal("x", GetSymbolNamesJoined(dataFlowResults.ReadOutside)) Assert.Equal("Me, x, s", GetSymbolNamesJoined(dataFlowResults.WrittenOutside)) End Sub <Fact()> Public Sub WithStatement_MeReference_1() Dim dataFlowResults = CompileAndAnalyzeDataFlow( <compilation> <file name="a.vb"> Imports System Structure SSSS3 Public A As String Public B As Integer End Structure Structure SSSS2 Public S3 As SSSS3 End Structure Structure SSSS Public S2 As SSSS2 End Structure Structure SSS Public S As SSSS End Structure Class Clazz Public x As New SSS() Sub TEST() With [| x.S.S2 |].S3 Dim s As Action = Sub() .A = "" End Sub End With x.ToString() End Sub End Class </file> </compilation>) Assert.True(dataFlowResults.Succeeded) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowResults.VariablesDeclared)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowResults.AlwaysAssigned)) Assert.Equal("Me", GetSymbolNamesJoined(dataFlowResults.Captured)) Assert.Equal("Me", GetSymbolNamesJoined(dataFlowResults.CapturedInside)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowResults.CapturedOutside)) Assert.Equal("Me", GetSymbolNamesJoined(dataFlowResults.DataFlowsIn)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowResults.DataFlowsOut)) Assert.Equal("Me", GetSymbolNamesJoined(dataFlowResults.ReadInside)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowResults.WrittenInside)) Assert.Equal("Me", GetSymbolNamesJoined(dataFlowResults.ReadOutside)) Assert.Equal("Me, s", GetSymbolNamesJoined(dataFlowResults.WrittenOutside)) End Sub <Fact()> Public Sub WithStatement_MeReference_2() Dim dataFlowResults = CompileAndAnalyzeDataFlow( <compilation> <file name="a.vb"> Imports System Structure SSSS3 Public A As String Public B As Integer End Structure Structure SSSS2 Public S3 As SSSS3 End Structure Structure SSSS Public S2 As SSSS2 End Structure Structure SSS Public S As SSSS End Structure Structure Clazz Public x As New SSS() Sub TEST() With [| x.S |].S2 With .S3 .A = "" End With End With x.ToString() End Sub End Class </file> </compilation>) Assert.True(dataFlowResults.Succeeded) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowResults.VariablesDeclared)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowResults.AlwaysAssigned)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowResults.Captured)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowResults.CapturedInside)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowResults.CapturedOutside)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowResults.DataFlowsIn)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowResults.DataFlowsOut)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowResults.ReadInside)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowResults.WrittenInside)) Assert.Equal("Me", GetSymbolNamesJoined(dataFlowResults.ReadOutside)) Assert.Equal("Me", GetSymbolNamesJoined(dataFlowResults.WrittenOutside)) End Sub <Fact()> Public Sub WithStatement_MeReference_3() Dim dataFlowResults = CompileAndAnalyzeDataFlow( <compilation> <file name="a.vb"> Imports System Structure SSSS3 Public A As String Public B As Integer End Structure Structure SSSS2 Public S3 As SSSS3 End Structure Structure SSSS Public S2 As SSSS2 End Structure Structure SSS Public S As SSSS End Structure Structure Clazz Public x As New SSS() Sub TEST() With x.S.S2 With .S3 [| .A = "" |] End With End With x.ToString() End Sub End Class </file> </compilation>) Assert.True(dataFlowResults.Succeeded) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowResults.VariablesDeclared)) Assert.Equal("Me", GetSymbolNamesJoined(dataFlowResults.AlwaysAssigned)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowResults.Captured)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowResults.CapturedInside)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowResults.CapturedOutside)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowResults.DataFlowsIn)) Assert.Equal("Me", GetSymbolNamesJoined(dataFlowResults.DataFlowsOut)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowResults.ReadInside)) Assert.Equal("Me", GetSymbolNamesJoined(dataFlowResults.WrittenInside)) Assert.Equal("Me", GetSymbolNamesJoined(dataFlowResults.ReadOutside)) Assert.Equal("Me", GetSymbolNamesJoined(dataFlowResults.WrittenOutside)) End Sub <Fact()> Public Sub WithStatement_ComplexExpression_1() Dim dataFlowResults = CompileAndAnalyzeDataFlow( <compilation> <file name="a.vb"> Imports System Structure SSSS3 Public A As String Public B As Integer End Structure Structure SSSS2 Public S3 As SSSS3 End Structure Structure SSSS Public S2 As SSSS2 End Structure Structure SSS Public S As SSSS End Structure Class Clazz Public x As New SSS() Sub TEST() With DirectCast(Function() Return [| Me.x |] End Function, Func(Of SSS))() With .S.S2 Dim a = .S3.A End With End With x.ToString() End Sub End Class </file> </compilation>) Assert.True(dataFlowResults.Succeeded) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowResults.VariablesDeclared)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowResults.AlwaysAssigned)) Assert.Equal("Me", GetSymbolNamesJoined(dataFlowResults.Captured)) Assert.Equal("Me", GetSymbolNamesJoined(dataFlowResults.CapturedInside)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowResults.CapturedOutside)) Assert.Equal("Me", GetSymbolNamesJoined(dataFlowResults.DataFlowsIn)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowResults.DataFlowsOut)) Assert.Equal("Me", GetSymbolNamesJoined(dataFlowResults.ReadInside)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowResults.WrittenInside)) Assert.Equal("Me", GetSymbolNamesJoined(dataFlowResults.ReadOutside)) Assert.Equal("Me, a", GetSymbolNamesJoined(dataFlowResults.WrittenOutside)) End Sub <Fact()> Public Sub WithStatement_ComplexExpression_2() Dim dataFlowResults = CompileAndAnalyzeDataFlow( <compilation> <file name="a.vb"> Imports System Structure SSSS3 Public A As String Public B As Integer End Structure Structure SSSS2 Public S3 As SSSS3 End Structure Structure SSSS Public S2 As SSSS2 End Structure Structure SSS Public S As SSSS End Structure Class Clazz Public x As New SSS() Sub TEST() Dim arr(,) As SSS With arr(1, [| DirectCast(Function() Return x End Function, Func(Of SSS)) |] ().S.S2.S3.B).S Dim a = .S2.S3.A End With x.ToString() End Sub End Class </file> </compilation>) Assert.True(dataFlowResults.Succeeded) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowResults.VariablesDeclared)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowResults.AlwaysAssigned)) Assert.Equal("Me", GetSymbolNamesJoined(dataFlowResults.Captured)) Assert.Equal("Me", GetSymbolNamesJoined(dataFlowResults.CapturedInside)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowResults.CapturedOutside)) Assert.Equal("Me", GetSymbolNamesJoined(dataFlowResults.DataFlowsIn)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowResults.DataFlowsOut)) Assert.Equal("Me", GetSymbolNamesJoined(dataFlowResults.ReadInside)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowResults.WrittenInside)) Assert.Equal("Me, arr", GetSymbolNamesJoined(dataFlowResults.ReadOutside)) Assert.Equal("Me, a", GetSymbolNamesJoined(dataFlowResults.WrittenOutside)) End Sub #End Region #Region "Select Statement" <Fact()> Public Sub TestSelectCase_Empty() Dim analysis = CompileAndAnalyzeControlAndDataFlow( <compilation name="TestSelectCase_Empty"> <file name="a.b"> Module Program Sub Main() Dim obj As Object = 0 [| Select Case obj End Select |] End Sub End Module </file> </compilation>) Dim controlFlowResults = analysis.Item1 Assert.True(controlFlowResults.Succeeded) Assert.Equal(0, controlFlowResults.ExitPoints.Count()) Assert.Equal(0, controlFlowResults.EntryPoints.Count()) Assert.True(controlFlowResults.EndPointIsReachable) Dim dataFlowResults = analysis.Item2 Assert.True(dataFlowResults.Succeeded) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowResults.AlwaysAssigned)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowResults.Captured)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowResults.CapturedInside)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowResults.CapturedOutside)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowResults.VariablesDeclared)) Assert.Equal("obj", GetSymbolNamesJoined(dataFlowResults.DataFlowsIn)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowResults.DataFlowsOut)) Assert.Equal("obj", GetSymbolNamesJoined(dataFlowResults.ReadInside)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowResults.WrittenInside)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowResults.ReadOutside)) Assert.Equal("obj", GetSymbolNamesJoined(dataFlowResults.WrittenOutside)) End Sub <Fact()> Public Sub TestSelectCase_SingleCaseBlock_01() Dim analysis = CompileAndAnalyzeControlAndDataFlow( <compilation name="TestSelectCase_SingleCaseBlock_01"> <file name="a.b"> Module Program Sub Main() Dim obj1 As Object = 0 Dim obj2 As Object = 0 Dim obj3 As Object [| Select Case obj1 Case obj2 Dim obj4 = 1 obj3 = obj4 End Select |] End Sub End Module </file> </compilation>) Dim controlFlowResults = analysis.Item1 Assert.True(controlFlowResults.Succeeded) Assert.Equal(0, controlFlowResults.ExitPoints.Count()) Assert.Equal(0, controlFlowResults.EntryPoints.Count()) Assert.True(controlFlowResults.EndPointIsReachable) Dim dataFlowResults = analysis.Item2 Assert.True(dataFlowResults.Succeeded) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowResults.AlwaysAssigned)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowResults.Captured)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowResults.CapturedInside)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowResults.CapturedOutside)) Assert.Equal("obj4", GetSymbolNamesJoined(dataFlowResults.VariablesDeclared)) Assert.Equal("obj1, obj2", GetSymbolNamesJoined(dataFlowResults.DataFlowsIn)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowResults.DataFlowsOut)) Assert.Equal("obj1, obj2, obj4", GetSymbolNamesJoined(dataFlowResults.ReadInside)) Assert.Equal("obj3, obj4", GetSymbolNamesJoined(dataFlowResults.WrittenInside)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowResults.ReadOutside)) Assert.Equal("obj1, obj2", GetSymbolNamesJoined(dataFlowResults.WrittenOutside)) End Sub <Fact()> Public Sub TestSelectCase_SingleCaseBlock_02() Dim analysis = CompileAndAnalyzeControlAndDataFlow( <compilation name="TestSelectCase_SingleCaseBlock_02"> <file name="a.b"> Module Program Sub Main() Dim obj1 As Object = 0 Dim obj2 As Object = 0 Dim obj3 As Object Select Case obj1 Case obj2 [| Dim obj4 = 1 obj3 = obj4 |] End Select End Sub End Module </file> </compilation>) Dim controlFlowResults = analysis.Item1 Assert.True(controlFlowResults.Succeeded) Assert.Equal(0, controlFlowResults.ExitPoints.Count()) Assert.Equal(0, controlFlowResults.EntryPoints.Count()) Assert.True(controlFlowResults.EndPointIsReachable) Dim dataFlowResults = analysis.Item2 Assert.True(dataFlowResults.Succeeded) Assert.Equal("obj3, obj4", GetSymbolNamesJoined(dataFlowResults.AlwaysAssigned)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowResults.Captured)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowResults.CapturedInside)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowResults.CapturedOutside)) Assert.Equal("obj4", GetSymbolNamesJoined(dataFlowResults.VariablesDeclared)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowResults.DataFlowsIn)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowResults.DataFlowsOut)) Assert.Equal("obj4", GetSymbolNamesJoined(dataFlowResults.ReadInside)) Assert.Equal("obj3, obj4", GetSymbolNamesJoined(dataFlowResults.WrittenInside)) Assert.Equal("obj1, obj2", GetSymbolNamesJoined(dataFlowResults.ReadOutside)) Assert.Equal("obj1, obj2", GetSymbolNamesJoined(dataFlowResults.WrittenOutside)) End Sub <Fact()> Public Sub TestSelectCase_CaseBlocksWithCaseElse_01() Dim analysis = CompileAndAnalyzeControlAndDataFlow( <compilation name="TestSelectCase_CaseBlocksWithCaseElse_01"> <file name="a.b"> Module Program Sub Main() Dim obj1 As Object = 0 Dim obj2 As Object = 0 Dim obj3 As Object Dim obj4 As Object [| Select Case obj1 Case obj2 Dim obj5 = 1 obj3 = obj5 obj4 = obj5 Case Else Dim obj5 = 2 obj2 = obj5 obj4 = obj5 End Select |] obj1 = obj3 + obj4 End Sub End Module </file> </compilation>) Dim controlFlowResults = analysis.Item1 Assert.True(controlFlowResults.Succeeded) Assert.Equal(0, controlFlowResults.ExitPoints.Count()) Assert.Equal(0, controlFlowResults.EntryPoints.Count()) Assert.True(controlFlowResults.EndPointIsReachable) Dim dataFlowResults = analysis.Item2 Assert.True(dataFlowResults.Succeeded) Assert.Equal("obj4", GetSymbolNamesJoined(dataFlowResults.AlwaysAssigned)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowResults.Captured)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowResults.CapturedInside)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowResults.CapturedOutside)) Assert.Equal("obj5, obj5", GetSymbolNamesJoined(dataFlowResults.VariablesDeclared)) Assert.Equal("obj1, obj2", GetSymbolNamesJoined(dataFlowResults.DataFlowsIn)) Assert.Equal("obj3, obj4", GetSymbolNamesJoined(dataFlowResults.DataFlowsOut)) Assert.Equal("obj1, obj2, obj5, obj5", GetSymbolNamesJoined(dataFlowResults.ReadInside)) Assert.Equal("obj2, obj3, obj4, obj5, obj5", GetSymbolNamesJoined(dataFlowResults.WrittenInside)) Assert.Equal("obj3, obj4", GetSymbolNamesJoined(dataFlowResults.ReadOutside)) Assert.Equal("obj1, obj2", GetSymbolNamesJoined(dataFlowResults.WrittenOutside)) End Sub <Fact()> Public Sub TestSelectCase_CaseBlocksWithCaseElse_01_CaseElseRegion() Dim analysis = CompileAndAnalyzeControlAndDataFlow( <compilation name="TestSelectCase_CaseBlocksWithCaseElse_01_CaseElseRegion"> <file name="a.b"> Module Program Sub Main() Dim obj1 As Object = 0 Dim obj2 As Object = 0 Dim obj3 As Object Dim obj4 As Object Select Case obj1 Case obj2 Dim obj5 = 1 obj3 = obj5 obj4 = obj5 Case Else [| Dim obj5 = 2 obj2 = obj5 obj4 = obj5 |] End Select obj1 = obj3 + obj4 End Sub End Module </file> </compilation>) Dim controlFlowResults = analysis.Item1 Assert.True(controlFlowResults.Succeeded) Assert.Equal(0, controlFlowResults.ExitPoints.Count()) Assert.Equal(0, controlFlowResults.EntryPoints.Count()) Assert.True(controlFlowResults.EndPointIsReachable) Dim dataFlowResults = analysis.Item2 Assert.True(dataFlowResults.Succeeded) Assert.Equal("obj2, obj4, obj5", GetSymbolNamesJoined(dataFlowResults.AlwaysAssigned)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowResults.Captured)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowResults.CapturedInside)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowResults.CapturedOutside)) Assert.Equal("obj5", GetSymbolNamesJoined(dataFlowResults.VariablesDeclared)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowResults.DataFlowsIn)) Assert.Equal("obj4", GetSymbolNamesJoined(dataFlowResults.DataFlowsOut)) Assert.Equal("obj5", GetSymbolNamesJoined(dataFlowResults.ReadInside)) Assert.Equal("obj2, obj4, obj5", GetSymbolNamesJoined(dataFlowResults.WrittenInside)) Assert.Equal("obj1, obj2, obj3, obj4, obj5", GetSymbolNamesJoined(dataFlowResults.ReadOutside)) Assert.Equal("obj1, obj2, obj3, obj4, obj5", GetSymbolNamesJoined(dataFlowResults.WrittenOutside)) End Sub <Fact()> Public Sub TestSelectCase_CaseBlocksWithCaseElse_02() Dim analysis = CompileAndAnalyzeControlAndDataFlow( <compilation name="TestSelectCase_CaseBlocksWithCaseElse_02"> <file name="a.b"> Module Program Sub Main() Dim obj1 As Object = 0 Dim obj2 As Object = 0 Dim obj3 As Object [| Select Case obj1 Case obj2 Dim obj4 = 1 obj3 = obj4 Case Else End Select |] End Sub End Module </file> </compilation>) Dim controlFlowResults = analysis.Item1 Assert.True(controlFlowResults.Succeeded) Assert.Equal(0, controlFlowResults.ExitPoints.Count()) Assert.Equal(0, controlFlowResults.EntryPoints.Count()) Assert.True(controlFlowResults.EndPointIsReachable) Dim dataFlowResults = analysis.Item2 Assert.True(dataFlowResults.Succeeded) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowResults.AlwaysAssigned)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowResults.Captured)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowResults.CapturedInside)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowResults.CapturedOutside)) Assert.Equal("obj4", GetSymbolNamesJoined(dataFlowResults.VariablesDeclared)) Assert.Equal("obj1, obj2", GetSymbolNamesJoined(dataFlowResults.DataFlowsIn)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowResults.DataFlowsOut)) Assert.Equal("obj1, obj2, obj4", GetSymbolNamesJoined(dataFlowResults.ReadInside)) Assert.Equal("obj3, obj4", GetSymbolNamesJoined(dataFlowResults.WrittenInside)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowResults.ReadOutside)) Assert.Equal("obj1, obj2", GetSymbolNamesJoined(dataFlowResults.WrittenOutside)) End Sub <Fact()> Public Sub TestSelectCase_CaseBlockWithCaseElse_03() Dim analysis = CompileAndAnalyzeControlAndDataFlow( <compilation name="TestSelectCase_CaseBlockWithCaseElse_03"> <file name="a.b"> Module Program Sub Main() Dim obj1 As Object = 0 Dim obj2 As Object = 0 Dim obj3 As Object [| Select Case obj1 Case obj2 LabelCase: Dim obj4 = 1 obj3 = obj4 Case Else Goto LabelCase End Select |] End Sub End Module </file> </compilation>) Dim controlFlowResults = analysis.Item1 Assert.True(controlFlowResults.Succeeded) Assert.Equal(0, controlFlowResults.ExitPoints.Count()) Assert.Equal(0, controlFlowResults.EntryPoints.Count()) Assert.True(controlFlowResults.EndPointIsReachable) Dim dataFlowResults = analysis.Item2 Assert.True(dataFlowResults.Succeeded) Assert.Equal("obj3, obj4", GetSymbolNamesJoined(dataFlowResults.AlwaysAssigned)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowResults.Captured)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowResults.CapturedInside)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowResults.CapturedOutside)) Assert.Equal("obj4", GetSymbolNamesJoined(dataFlowResults.VariablesDeclared)) Assert.Equal("obj1, obj2", GetSymbolNamesJoined(dataFlowResults.DataFlowsIn)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowResults.DataFlowsOut)) Assert.Equal("obj1, obj2, obj4", GetSymbolNamesJoined(dataFlowResults.ReadInside)) Assert.Equal("obj3, obj4", GetSymbolNamesJoined(dataFlowResults.WrittenInside)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowResults.ReadOutside)) Assert.Equal("obj1, obj2", GetSymbolNamesJoined(dataFlowResults.WrittenOutside)) End Sub <Fact()> Public Sub TestSelectCase_CaseBlocksWithoutCaseElse_01() Dim analysis = CompileAndAnalyzeControlAndDataFlow( <compilation name="TestSelectCase_CaseBlocksWithoutCaseElse_01"> <file name="a.b"> Module Program Sub Main() Dim obj1 As Object = 0 Dim obj2 As Object = 0 Dim obj3 As Object Dim obj4 As Object [| Select Case obj1 Case obj2 Dim obj5 = 1 obj3 = obj5 obj4 = obj5 Case obj3 Dim obj5 = 2 obj2 = obj5 obj4 = obj5 End Select |] obj1 = obj3 + obj4 End Sub End Module </file> </compilation>) Dim controlFlowResults = analysis.Item1 Assert.True(controlFlowResults.Succeeded) Assert.Equal(0, controlFlowResults.ExitPoints.Count()) Assert.Equal(0, controlFlowResults.EntryPoints.Count()) Assert.True(controlFlowResults.EndPointIsReachable) Dim dataFlowResults = analysis.Item2 Assert.True(dataFlowResults.Succeeded) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowResults.AlwaysAssigned)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowResults.Captured)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowResults.CapturedInside)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowResults.CapturedOutside)) Assert.Equal("obj5, obj5", GetSymbolNamesJoined(dataFlowResults.VariablesDeclared)) Assert.Equal("obj1, obj2, obj3", GetSymbolNamesJoined(dataFlowResults.DataFlowsIn)) Assert.Equal("obj3, obj4", GetSymbolNamesJoined(dataFlowResults.DataFlowsOut)) Assert.Equal("obj1, obj2, obj3, obj5, obj5", GetSymbolNamesJoined(dataFlowResults.ReadInside)) Assert.Equal("obj2, obj3, obj4, obj5, obj5", GetSymbolNamesJoined(dataFlowResults.WrittenInside)) Assert.Equal("obj3, obj4", GetSymbolNamesJoined(dataFlowResults.ReadOutside)) Assert.Equal("obj1, obj2", GetSymbolNamesJoined(dataFlowResults.WrittenOutside)) End Sub <Fact()> Public Sub TestSelectCase_CaseBlockWithoutCaseElse_02() Dim analysis = CompileAndAnalyzeControlAndDataFlow( <compilation name="TestSelectCase_CaseBlockWithoutCaseElse_02"> <file name="a.b"> Module Program Sub Main() Dim obj1 As Object = 0 Dim obj2 As Object = 0 Dim obj3 As Object [| Select Case obj1 Case obj2 LabelCase: Dim obj4 = 1 obj3 = obj4 Case obj3 Goto LabelCase End Select |] End Sub End Module </file> </compilation>) Dim controlFlowResults = analysis.Item1 Assert.True(controlFlowResults.Succeeded) Assert.Equal(0, controlFlowResults.ExitPoints.Count()) Assert.Equal(0, controlFlowResults.EntryPoints.Count()) Assert.True(controlFlowResults.EndPointIsReachable) Dim dataFlowResults = analysis.Item2 Assert.True(dataFlowResults.Succeeded) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowResults.AlwaysAssigned)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowResults.Captured)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowResults.CapturedInside)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowResults.CapturedOutside)) Assert.Equal("obj4", GetSymbolNamesJoined(dataFlowResults.VariablesDeclared)) Assert.Equal("obj1, obj2, obj3", GetSymbolNamesJoined(dataFlowResults.DataFlowsIn)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowResults.DataFlowsOut)) Assert.Equal("obj1, obj2, obj3, obj4", GetSymbolNamesJoined(dataFlowResults.ReadInside)) Assert.Equal("obj3, obj4", GetSymbolNamesJoined(dataFlowResults.WrittenInside)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowResults.ReadOutside)) Assert.Equal("obj1, obj2", GetSymbolNamesJoined(dataFlowResults.WrittenOutside)) End Sub <Fact()> Public Sub TestSelectCase_CaseStatementRegion() Dim dataFlowResults = CompileAndAnalyzeDataFlow( <compilation name="TestSelectCase_CaseStatementRegion"> <file name="a.b"> Module Program Sub Main() Dim obj1 As Object = 0 Dim obj2 As Object = 0 Dim obj3 As Object Select Case obj1 Case [|obj2|] obj3 = 0 End Select End Sub End Module </file> </compilation>) Assert.True(dataFlowResults.Succeeded) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowResults.AlwaysAssigned)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowResults.Captured)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowResults.CapturedInside)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowResults.CapturedOutside)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowResults.VariablesDeclared)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowResults.DataFlowsOut)) Assert.Equal("obj2", GetSymbolNamesJoined(dataFlowResults.ReadInside)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowResults.WrittenInside)) Assert.Equal("obj1", GetSymbolNamesJoined(dataFlowResults.ReadOutside)) Assert.Equal("obj1, obj2, obj3", GetSymbolNamesJoined(dataFlowResults.WrittenOutside)) End Sub <Fact()> Public Sub TestSelectCase_Error_CaseElseBeforeCaseBlock() Dim analysis = CompileAndAnalyzeControlAndDataFlow( <compilation name="TestSelectCase_Error_CaseElseBeforeCaseBlock"> <file name="a.b"> Module Program Sub Main() Dim obj1 As Object = 0 Dim obj2 As Object = 0 Dim obj3 As Object Dim obj4 As Object Select Case obj1 Case Else [| Dim obj5 = 2 obj2 = obj5 obj4 = obj5 |] Case obj2 Dim obj5 = 1 obj3 = obj5 obj4 = obj5 End Select obj1 = obj3 + obj4 End Sub End Module </file> </compilation>) Dim controlFlowResults = analysis.Item1 Assert.True(controlFlowResults.Succeeded) Assert.Equal(0, controlFlowResults.ExitPoints.Count()) Assert.Equal(0, controlFlowResults.EntryPoints.Count()) Assert.True(controlFlowResults.EndPointIsReachable) Dim dataFlowResults = analysis.Item2 Assert.True(dataFlowResults.Succeeded) Assert.Equal("obj2, obj4, obj5", GetSymbolNamesJoined(dataFlowResults.AlwaysAssigned)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowResults.Captured)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowResults.CapturedInside)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowResults.CapturedOutside)) Assert.Equal("obj5", GetSymbolNamesJoined(dataFlowResults.VariablesDeclared)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowResults.DataFlowsIn)) Assert.Equal("obj4", GetSymbolNamesJoined(dataFlowResults.DataFlowsOut)) Assert.Equal("obj5", GetSymbolNamesJoined(dataFlowResults.ReadInside)) Assert.Equal("obj2, obj4, obj5", GetSymbolNamesJoined(dataFlowResults.WrittenInside)) Assert.Equal("obj1, obj2, obj3, obj4, obj5", GetSymbolNamesJoined(dataFlowResults.ReadOutside)) Assert.Equal("obj1, obj2, obj3, obj4, obj5", GetSymbolNamesJoined(dataFlowResults.WrittenOutside)) End Sub <WorkItem(529089, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/529089")> <Fact> Public Sub CaseClauseNotReachable() Dim analysis = CompileAndAnalyzeControlAndDataFlow( <compilation name="TestSelectCase_Error_CaseElseBeforeCaseBlock"> <file name="a.b"> Module Program Sub Main(args As String()) Dim x = 10 Select Case 5 Case 10 [|x = x + 1|] End Select End Sub End Module </file> </compilation>) Dim controlFlowResults = analysis.Item1 Assert.True(controlFlowResults.Succeeded) Assert.Equal(0, controlFlowResults.ExitPoints.Count()) Assert.Equal(0, controlFlowResults.EntryPoints.Count()) Assert.True(controlFlowResults.StartPointIsReachable) Assert.True(controlFlowResults.EndPointIsReachable) Dim dataFlowResults = analysis.Item2 Assert.True(dataFlowResults.Succeeded) Assert.Equal("x", GetSymbolNamesJoined(dataFlowResults.AlwaysAssigned)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowResults.Captured)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowResults.CapturedInside)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowResults.CapturedOutside)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowResults.VariablesDeclared)) Assert.Equal("x", GetSymbolNamesJoined(dataFlowResults.DataFlowsIn)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowResults.DataFlowsOut)) Assert.Equal("x", GetSymbolNamesJoined(dataFlowResults.ReadInside)) Assert.Equal("x", GetSymbolNamesJoined(dataFlowResults.WrittenInside)) Assert.Equal(Nothing, GetSymbolNamesJoined(dataFlowResults.ReadOutside)) Assert.Equal("args, x", GetSymbolNamesJoined(dataFlowResults.WrittenOutside)) End Sub <WorkItem(543402, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/543402")> <Fact()> Public Sub EndSelectStatement() Dim compilation = CreateCompilationWithMscorlib40AndVBRuntime( <compilation> <file name="a.vb"> Module Program Sub Main(args As String()) Select Case 99 End Select End Sub End Module </file> </compilation>) Dim tree = compilation.SyntaxTrees.First() Dim model = compilation.GetSemanticModel(tree) Dim stmtNode = DirectCast(tree.GetCompilationUnitRoot().FindToken(tree.GetRoot.ToFullString().IndexOf("End Select", StringComparison.Ordinal)).Parent, StatementSyntax) Dim analysis = model.AnalyzeControlFlow(stmtNode, stmtNode) Assert.False(analysis.Succeeded) End Sub <WorkItem(543434, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/543434")> <Fact()> Public Sub SelectCaseStatement() Dim compilation = CreateCompilationWithMscorlib40AndVBRuntime( <compilation> <file name="a.vb"> Module Program Sub Main(args As String()) Select Case 99 End Select End Sub End Module </file> </compilation>) Dim tree = compilation.SyntaxTrees.First() Dim model = compilation.GetSemanticModel(tree) Dim stmtNode = DirectCast(tree.GetCompilationUnitRoot().FindToken(tree.GetRoot.ToFullString().IndexOf("Select Case", StringComparison.Ordinal)).Parent, StatementSyntax) Dim analysis = model.AnalyzeControlFlow(stmtNode, stmtNode) Assert.False(analysis.Succeeded) End Sub <Fact, WorkItem(543492, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/543492")> Public Sub MyBaseExpressionSyntax() Dim source = <compilation> <file name="a.vb"> Imports System Public Class BaseClass Public Overridable Sub MyMeth() End Sub End Class Public Class MyClass : Inherits BaseClass Public Overrides Sub MyMeth() MyBase.MyMeth() End Sub Public Sub OtherMeth() Dim f = Function() MyBase End Sub End Class </file> </compilation> Dim comp = CreateCompilationWithMscorlib40(source) Dim tree = comp.SyntaxTrees.Single() Dim model = comp.GetSemanticModel(tree) Dim invocation = tree.GetCompilationUnitRoot().DescendantNodes().OfType(Of InvocationExpressionSyntax)().Single() Dim flowAnalysis = model.AnalyzeDataFlow(invocation) Assert.Empty(flowAnalysis.Captured) Assert.Empty(flowAnalysis.CapturedInside) Assert.Empty(flowAnalysis.CapturedOutside) Assert.Equal("Me As [MyClass]", flowAnalysis.DataFlowsIn.Single().ToTestDisplayString()) Assert.Empty(flowAnalysis.DataFlowsOut) Assert.Equal("Me As [MyClass]", flowAnalysis.ReadInside.Single().ToTestDisplayString()) Assert.Empty(flowAnalysis.WrittenInside) Assert.Equal("Me As [MyClass]", flowAnalysis.WrittenOutside.Single().ToTestDisplayString()) Dim lambda = tree.GetCompilationUnitRoot().DescendantNodes().OfType(Of LambdaExpressionSyntax)().Single() flowAnalysis = model.AnalyzeDataFlow(lambda) Assert.Equal("Me As [MyClass]", flowAnalysis.Captured.Single().ToTestDisplayString()) Assert.Equal("Me As [MyClass]", flowAnalysis.CapturedInside.Single().ToTestDisplayString()) Assert.Empty(flowAnalysis.CapturedOutside) Assert.Equal("Me As [MyClass]", flowAnalysis.DataFlowsIn.Single().ToTestDisplayString()) Assert.Empty(flowAnalysis.DataFlowsOut) Assert.Equal("Me As [MyClass]", flowAnalysis.ReadInside.Single().ToTestDisplayString()) Assert.Empty(flowAnalysis.WrittenInside) Assert.Equal("Me, f", GetSymbolNamesJoined(flowAnalysis.WrittenOutside)) End Sub #End Region #Region "Helpers" Private Shared Function GetSourceXElementFromTemplate(code As XCData) As XElement Return <compilation> <file name="a.vb"> Option Infer On Option Explicit Off Option Strict Off Imports System Imports System.Collections.Generic Imports System.Linq Module Module1 Sub Main() <%= code.Value %> End Sub End Module </file> </compilation> End Function Private Sub VerifyReDimDataFlowAnalysis( code As XCData, Optional alwaysAssigned() As String = Nothing, Optional captured() As String = Nothing, Optional dataFlowsIn() As String = Nothing, Optional dataFlowsOut() As String = Nothing, Optional definitelyAssignedOnEntry() As String = Nothing, Optional definitelyAssignedOnExit() As String = Nothing, Optional readInside() As String = Nothing, Optional readOutside() As String = Nothing, Optional variablesDeclared() As String = Nothing, Optional writtenInside() As String = Nothing, Optional writtenOutside() As String = Nothing, Optional capturedInside() As String = Nothing, Optional capturedOutside() As String = Nothing) VerifyDataFlowAnalysis(GetSourceXElementFromTemplate(code), alwaysAssigned, captured, dataFlowsIn, dataFlowsOut, definitelyAssignedOnEntry, definitelyAssignedOnExit, readInside, readOutside, variablesDeclared, writtenInside, writtenOutside, capturedInside, capturedOutside) End Sub <WorkItem("https://github.com/dotnet/roslyn/issues/38087")> <Fact()> Public Sub NestedBinaryOperator() Dim compilation = CreateCompilationWithMscorlib40AndVBRuntime( <compilation> <file name="a.vb"> Module Program Sub M(i As Integer, j As Integer, k As Integer, l As Integer) Dim x = i + j + k + l End Sub End Module </file> </compilation>) Dim tree = compilation.SyntaxTrees.First() Dim model = compilation.GetSemanticModel(tree) Dim nodes = tree.GetRoot().DescendantNodes().OfType(Of BinaryExpressionSyntax)().ToArray() Assert.Equal(3, nodes.Length) Assert.Equal("i + j + k + l", nodes(0).ToString()) Dim dataFlowResults = model.AnalyzeDataFlow(nodes(0)) Assert.Equal("i, j, k, l", GetSymbolNamesJoined(dataFlowResults.ReadInside)) Assert.Equal("i + j + k", nodes(1).ToString()) dataFlowResults = model.AnalyzeDataFlow(nodes(1)) Assert.Equal("i, j, k", GetSymbolNamesJoined(dataFlowResults.ReadInside)) Assert.Equal("i + j", nodes(2).ToString()) dataFlowResults = model.AnalyzeDataFlow(nodes(2)) Assert.Equal("i, j", GetSymbolNamesJoined(dataFlowResults.ReadInside)) End Sub #End Region End Class End Namespace