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.