diff --git a/README.md b/README.md
index 6a17216443e8ab7a418227d8b5f011a122c06be1..74c6ef59f37a7dcf832d99c2f909e4574e20a308 100644
--- a/README.md
+++ b/README.md
@@ -82,7 +82,7 @@ Some of the best ways to contribute are to try things out, file bugs, and join i
* [How to Contribute](https://github.com/dotnet/roslyn/wiki/Contributing-Code)
* [Pull requests](https://github.com/dotnet/roslyn/pulls): [Open](https://github.com/dotnet/roslyn/pulls?q=is%3Aopen+is%3Apr)/[Closed](https://github.com/dotnet/roslyn/pulls?q=is%3Apr+is%3Aclosed)
-Looking for something to work on? The list of [up for grabs issues](https://github.com/dotnet/roslyn/labels/up-for-grabs) is a great place to start.
+Looking for something to work on? The list of [up for grabs issues](https://github.com/dotnet/roslyn/labels/help%20wanted) is a great place to start.
This project has adopted the [Microsoft Open Source Code of Conduct](https://opensource.microsoft.com/codeofconduct/). For more information see the [Code of Conduct FAQ](https://opensource.microsoft.com/codeofconduct/faq/) or contact [opencode@microsoft.com](mailto:opencode@microsoft.com) with any additional questions or comments.
diff --git a/build/Targets/Imports.targets b/build/Targets/Imports.targets
index fa8eff847c587a8491ead61cec4da2b1fb503a76..a63f83c44b5cf41bac77e691e5abf75cb1938071 100644
--- a/build/Targets/Imports.targets
+++ b/build/Targets/Imports.targets
@@ -293,16 +293,6 @@
-
-
-
-
-
false
diff --git a/build/scripts/build.ps1 b/build/scripts/build.ps1
index 303480cd242745dfdae92b11f30061bacab10721..ea62d53fc09eaae58061a9d3189c4d1a6d1824ed 100644
--- a/build/scripts/build.ps1
+++ b/build/scripts/build.ps1
@@ -35,6 +35,7 @@ param (
[switch]$testVsiNetCore = $false,
[switch]$testDesktop = $false,
[switch]$testCoreClr = $false,
+ [switch]$testIOperation = $false,
# Special test options
[switch]$testDeterminism = $false,
@@ -66,6 +67,7 @@ function Print-Usage() {
Write-Host " -testCoreClr Run CoreClr unit tests"
Write-Host " -testVsi Run all integration tests"
Write-Host " -testVsiNetCore Run just dotnet core integration tests"
+ Write-Host " -testIOperation Run extra checks to validate IOperations"
Write-Host ""
Write-Host "Special Test options"
Write-Host " -testBuildCorrectness Run build correctness tests"
@@ -141,6 +143,11 @@ function Run-MSBuild([string]$buildArgs = "", [string]$logFile = "", [switch]$pa
$args += " /p:BootstrapBuildPath=$bootstrapDir"
}
+ if ($testIOperation)
+ {
+ $args += " /p:TestIOperationInterface=true"
+ }
+
$args += " $buildArgs"
Exec-Console $msbuild $args
}
diff --git a/src/Compilers/Test/Utilities/CSharp/CSharpTestBase.cs b/src/Compilers/Test/Utilities/CSharp/CSharpTestBase.cs
index 26b409c8a4af46ae328d49414ac87d1e2ab79430..1a3c4a6f3f843b20e8f16f468be0f7e14a673eb2 100644
--- a/src/Compilers/Test/Utilities/CSharp/CSharpTestBase.cs
+++ b/src/Compilers/Test/Utilities/CSharp/CSharpTestBase.cs
@@ -1,4 +1,4 @@
-// Copyright (c) Microsoft. All Rights Reserved. Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
+// Copyright (c) Microsoft. All Rights Reserved. Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
using Microsoft.CodeAnalysis.CodeGen;
using Microsoft.CodeAnalysis.CSharp.Emit;
@@ -514,11 +514,13 @@ public static SyntaxTree ParseWithRoundTripCheck(string text, CSharpParseOptions
options = options.WithConcurrentBuild(false);
}
- return CSharpCompilation.Create(
+ Func createCompilationLambda = () => CSharpCompilation.Create(
assemblyName == "" ? GetUniqueName() : assemblyName,
trees,
references,
options);
+ CompilationExtensions.ValidateIOperations(createCompilationLambda);
+ return createCompilationLambda();
}
public static CSharpCompilation CreateCompilation(
@@ -529,7 +531,10 @@ public static SyntaxTree ParseWithRoundTripCheck(string text, CSharpParseOptions
CSharpParseOptions parseOptions = null)
{
var trees = (sources == null) ? null : sources.Select(s => Parse(s, options: parseOptions)).ToArray();
- var c = CSharpCompilation.Create(identity.Name, options: options ?? TestOptions.ReleaseDll, references: references, syntaxTrees: trees);
+ Func createCompilationLambda = () => CSharpCompilation.Create(identity.Name, options: options ?? TestOptions.ReleaseDll, references: references, syntaxTrees: trees);
+
+ CompilationExtensions.ValidateIOperations(createCompilationLambda);
+ var c = createCompilationLambda();
Assert.NotNull(c.Assembly); // force creation of SourceAssemblySymbol
((SourceAssemblySymbol)c.Assembly).lazyAssemblyIdentity = identity;
@@ -545,7 +550,7 @@ public static SyntaxTree ParseWithRoundTripCheck(string text, CSharpParseOptions
Type returnType = null,
Type hostObjectType = null)
{
- return CSharpCompilation.CreateScriptCompilation(
+ Func createCompilationLambda = () => CSharpCompilation.CreateScriptCompilation(
GetUniqueName(),
references: references,
options: options,
@@ -553,6 +558,8 @@ public static SyntaxTree ParseWithRoundTripCheck(string text, CSharpParseOptions
previousScriptCompilation: previous,
returnType: returnType,
globalsType: hostObjectType);
+ CompilationExtensions.ValidateIOperations(createCompilationLambda);
+ return createCompilationLambda();
}
private static ImmutableArray s_scriptRefs = ImmutableArray.Create(MscorlibRef_v4_0_30316_17626);
@@ -566,7 +573,7 @@ public static SyntaxTree ParseWithRoundTripCheck(string text, CSharpParseOptions
Type returnType = null,
Type hostObjectType = null)
{
- return CSharpCompilation.CreateScriptCompilation(
+ Func createCompilationLambda = () => CSharpCompilation.CreateScriptCompilation(
GetUniqueName(),
references: (references != null) ? s_scriptRefs.Concat(references) : s_scriptRefs,
options: options,
@@ -574,6 +581,8 @@ public static SyntaxTree ParseWithRoundTripCheck(string text, CSharpParseOptions
previousScriptCompilation: previous,
returnType: returnType,
globalsType: hostObjectType);
+ CompilationExtensions.ValidateIOperations(createCompilationLambda);
+ return createCompilationLambda();
}
public CompilationVerifier CompileWithCustomILSource(string cSharpSource, string ilSource, Action compilationVerifier = null, bool importInternals = true, string expectedOutput = null)
diff --git a/src/Compilers/Test/Utilities/VisualBasic/CompilationTestUtils.vb b/src/Compilers/Test/Utilities/VisualBasic/CompilationTestUtils.vb
index 5ce08d3324c901928d482e29e528aea2d070cc4a..443de354bc524b6b781bdc1410f12b80eef3783e 100644
--- a/src/Compilers/Test/Utilities/VisualBasic/CompilationTestUtils.vb
+++ b/src/Compilers/Test/Utilities/VisualBasic/CompilationTestUtils.vb
@@ -1,4 +1,4 @@
-' Copyright (c) Microsoft. All Rights Reserved. Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
+' Copyright (c) Microsoft. All Rights Reserved. Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
Imports System.Collections.Immutable
Imports System.Globalization
@@ -34,13 +34,18 @@ Friend Module CompilationUtils
options = options.WithConcurrentBuild(False)
End If
- Return VisualBasicCompilation.Create(
- If(assemblyName, GetUniqueName()),
- sourceTrees,
- references,
- options)
+ Dim createCompilationLambda = Function()
+ Return VisualBasicCompilation.Create(
+ If(assemblyName, GetUniqueName()),
+ sourceTrees,
+ references,
+ options)
+ End Function
+ CompilationExtensions.ValidateIOperations(createCompilationLambda)
+ Return createCompilationLambda()
End Function
+
Public Function CreateCompilation(sources As IEnumerable(Of String),
Optional references As IEnumerable(Of MetadataReference) = Nothing,
Optional options As VisualBasicCompilationOptions = Nothing,
@@ -67,12 +72,12 @@ Friend Module CompilationUtils
Dim metadataReferences = If(references Is Nothing, {MscorlibRef}, {MscorlibRef}.Concat(references))
assemblyName = If(assemblyName, GetUniqueName())
-#If Test_IOperation_Interface Then
- Dim compilationForOperationWalking = VisualBasicCompilation.Create(assemblyName, sourceTrees, metadataReferences, options)
- WalkOperationTrees(compilationForOperationWalking)
-#End If
+ Dim createCompilationLambda = Function()
+ Return VisualBasicCompilation.Create(assemblyName, sourceTrees, metadataReferences, options)
+ End Function
- Return VisualBasicCompilation.Create(assemblyName, sourceTrees, metadataReferences, options)
+ CompilationExtensions.ValidateIOperations(createCompilationLambda)
+ Return createCompilationLambda()
End Function
Public Function CreateCompilationWithMscorlib(sources As IEnumerable(Of String),
@@ -98,29 +103,46 @@ Friend Module CompilationUtils
Optional options As VisualBasicCompilationOptions = Nothing,
Optional assemblyName As String = Nothing) As VisualBasicCompilation
Dim additionalRefs = {MscorlibRef_v4_0_30316_17626}
- Return VisualBasicCompilation.Create(If(assemblyName, GetUniqueName()), sourceTrees, If(references Is Nothing, additionalRefs, additionalRefs.Concat(references)), options)
+ Dim createCompilationLambda = Function()
+ Return VisualBasicCompilation.Create(If(assemblyName, GetUniqueName()), sourceTrees, If(references Is Nothing, additionalRefs, additionalRefs.Concat(references)), options)
+ End Function
+ CompilationExtensions.ValidateIOperations(createCompilationLambda)
+ Return createCompilationLambda()
End Function
+
Public Function CreateCompilationWithMscorlib45(source As String,
Optional references As IEnumerable(Of MetadataReference) = Nothing,
Optional options As VisualBasicCompilationOptions = Nothing,
Optional assemblyName As String = Nothing,
Optional parseOptions As VisualBasicParseOptions = Nothing) As VisualBasicCompilation
Dim additionalRefs = {MscorlibRef_v4_0_30316_17626}
- Return VisualBasicCompilation.Create(If(assemblyName, GetUniqueName()), {Parse(source, parseOptions)}, If(references Is Nothing, additionalRefs, additionalRefs.Concat(references)), options)
+ Dim createCompilationLambda = Function()
+ Return VisualBasicCompilation.Create(If(assemblyName, GetUniqueName()), {Parse(source, parseOptions)}, If(references Is Nothing, additionalRefs, additionalRefs.Concat(references)), options)
+ End Function
+ CompilationExtensions.ValidateIOperations(createCompilationLambda)
+ Return createCompilationLambda()
End Function
Public Function CreateCompilationWithMscorlib45AndVBRuntime(sourceTrees As IEnumerable(Of SyntaxTree),
Optional references As IEnumerable(Of MetadataReference) = Nothing,
Optional options As VisualBasicCompilationOptions = Nothing) As VisualBasicCompilation
Dim additionalRefs = {MscorlibRef_v4_0_30316_17626, MsvbRef_v4_0_30319_17929}
- Return VisualBasicCompilation.Create(GetUniqueName(), sourceTrees, If(references Is Nothing, additionalRefs, additionalRefs.Concat(references)), options)
+ Dim createCompilationLambda = Function()
+ Return VisualBasicCompilation.Create(GetUniqueName(), sourceTrees, If(references Is Nothing, additionalRefs, additionalRefs.Concat(references)), options)
+ End Function
+ CompilationExtensions.ValidateIOperations(createCompilationLambda)
+ Return createCompilationLambda()
End Function
Public Function CreateCompilationWithMscorlib(sourceTree As SyntaxTree,
Optional references As IEnumerable(Of MetadataReference) = Nothing,
Optional options As VisualBasicCompilationOptions = Nothing) As VisualBasicCompilation
- Return VisualBasicCompilation.Create(GetUniqueName(), {sourceTree}, If(references Is Nothing, {MscorlibRef}, {MscorlibRef}.Concat(references)), options)
+ Dim createCompilationLambda = Function()
+ Return VisualBasicCompilation.Create(GetUniqueName(), {sourceTree}, If(references Is Nothing, {MscorlibRef}, {MscorlibRef}.Concat(references)), options)
+ End Function
+ CompilationExtensions.ValidateIOperations(createCompilationLambda)
+ Return createCompilationLambda()
End Function
@@ -308,13 +330,11 @@ Friend Module CompilationUtils
options = options.WithConcurrentBuild(False)
End If
End If
-
-#If Test_IOperation_Interface Then
- Dim compilationForOperationWalking = VisualBasicCompilation.Create(If(assemblyName, GetUniqueName()), sourceTrees, references, options)
- WalkOperationTrees(compilationForOperationWalking)
-#End If
-
- Return VisualBasicCompilation.Create(If(assemblyName, GetUniqueName()), sourceTrees, references, options)
+ Dim createCompilationLambda = Function()
+ Return VisualBasicCompilation.Create(If(assemblyName, GetUniqueName()), sourceTrees, references, options)
+ End Function
+ CompilationExtensions.ValidateIOperations(createCompilationLambda)
+ Return createCompilationLambda()
End Function
''' The sources compile according to the following schema
@@ -337,34 +357,17 @@ Friend Module CompilationUtils
Optional options As VisualBasicCompilationOptions = Nothing) As VisualBasicCompilation
Dim trees = If(sources Is Nothing, Nothing, sources.Select(AddressOf VisualBasicSyntaxTree.ParseText).ToArray())
- Dim c = VisualBasicCompilation.Create(identity.Name, trees, references, options)
+ Dim createCompilationLambda = Function()
+ Return VisualBasicCompilation.Create(identity.Name, trees, references, options)
+ End Function
+ CompilationExtensions.ValidateIOperations(createCompilationLambda)
+ Dim c = createCompilationLambda()
Assert.NotNull(c.Assembly) ' force creation of SourceAssemblySymbol
DirectCast(c.Assembly, SourceAssemblySymbol).m_lazyIdentity = identity
Return c
End Function
-#If Test_IOperation_Interface Then
- Private Sub WalkOperationTrees(compilation As VisualBasicCompilation)
- Dim operationWalker = TestOperationWalker.GetInstance()
-
- For Each tree In compilation.SyntaxTrees
- Dim semanticModel = compilation.GetSemanticModel(tree)
- Dim root = tree.GetRoot()
-
- ' need to check other operation root as well (property, etc)
- For Each methodNode As MethodBlockBaseSyntax In root.DescendantNodesAndSelf().OfType(Of MethodBlockBaseSyntax)
- ' Have to iterate through statements because a bug:
- ' https://github.com/dotnet/roslyn/issues/8919
- For Each statement In methodNode.Statements
- Dim operation = semanticModel.GetOperation(statement)
- operationWalker.Visit(operation)
- Next
- Next
- Next
- End Sub
-#End If
-
'''
'''
'''
diff --git a/src/Test/Utilities/Portable/Compilation/CompilationExtensions.cs b/src/Test/Utilities/Portable/Compilation/CompilationExtensions.cs
index c4c0894c6f685bedee44570c112cbb7f1ee15f9b..9cdfbbe151087bb49d67e9c662533f62441cccf1 100644
--- a/src/Test/Utilities/Portable/Compilation/CompilationExtensions.cs
+++ b/src/Test/Utilities/Portable/Compilation/CompilationExtensions.cs
@@ -1,4 +1,4 @@
-// Copyright (c) Microsoft. All Rights Reserved. Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
+// Copyright (c) Microsoft. All Rights Reserved. Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
using System;
using System.Collections.Generic;
@@ -251,5 +251,27 @@ internal static bool CanHaveExecutableCodeBlock(ISymbol symbol)
}
}
+ public static void ValidateIOperations(Func createCompilation)
+ {
+#if TEST_IOPERATION_INTERFACE
+ var compilation = createCompilation();
+
+ foreach (var tree in compilation.SyntaxTrees)
+ {
+ var semanticModel = compilation.GetSemanticModel(tree);
+ var root = tree.GetRoot();
+
+ foreach (var node in root.DescendantNodesAndSelf())
+ {
+ var operation = semanticModel.GetOperationInternal(node);
+ if (operation != null)
+ {
+ // Make sure IOperation returned by GetOperation(syntaxnode) will have same syntaxnode as the given syntaxnode(IOperation.Syntax == syntaxnode).
+ Assert.True(node == operation.Syntax, $"Expected : {node} - Actual : {operation.Syntax}");
+ }
+ }
+ }
+#endif
+ }
}
}
diff --git a/src/Test/Utilities/Portable/TestUtilities.csproj b/src/Test/Utilities/Portable/TestUtilities.csproj
index 5f34942b904514b6a5c2e0fbe4c48a316bd6ed40..82bb32e51fe6391f1ed1a0a7c7092d401543ac9e 100644
--- a/src/Test/Utilities/Portable/TestUtilities.csproj
+++ b/src/Test/Utilities/Portable/TestUtilities.csproj
@@ -23,6 +23,9 @@
+
+ $(DefineConstants);TEST_IOPERATION_INTERFACE
+
diff --git a/src/Tools/BuildBoss/README.md b/src/Tools/BuildBoss/README.md
index 6cc9b68059473c632442a45b4440b6aa67edfaf2..2b6cc3c33c5cd702ef7dd5099fa859911d93fd7c 100644
--- a/src/Tools/BuildBoss/README.md
+++ b/src/Tools/BuildBoss/README.md
@@ -6,7 +6,7 @@ This is a tool to validate the state of our solutions, project files and other b
> BuildBoss.exe
```
-This tool is run on every CI job against our important solution files: [Roslyn.sln](https://github.com/dotnet/roslyn/blob/master/Roslyn.sln), [CrossPlatform.sln](https://github.com/dotnet/roslyn/blob/master/CrossPlatform.sln) and [Samples.sln)(https://github.com/dotnet/roslyn/blob/master/src/Samples/Samples.sln).
+This tool is run on every CI job against our important solution files: [Roslyn.sln](https://github.com/dotnet/roslyn/blob/master/Roslyn.sln), [CrossPlatform.sln](https://github.com/dotnet/roslyn/blob/master/CrossPlatform.sln) and [Samples.sln](https://github.com/dotnet/roslyn/blob/master/src/Samples/Samples.sln).
Violations reported are important to fix as they represent correctness issues in our build. Many of the properties verified represent problems that otherwise won't be verified at check in time.