diff --git a/netci.groovy b/netci.groovy index 4b4190607efefd0b123bcd6537831976a48b0f72..80ef85b760686cfadeba3c6ffcb2ca2fd1f496a3 100644 --- a/netci.groovy +++ b/netci.groovy @@ -18,7 +18,7 @@ static void addConcurrentBuild(def myJob, String category) { throttleConcurrentBuilds { throttleDisabled(false) maxTotal(0) - maxPerNode(1) + maxPerNode(4) categories([category]) } } @@ -121,7 +121,7 @@ static void addPullRequestTrigger(def myJob, String contextName, String opsysNam autoCloseFailedPullRequests(false) orgWhitelist('Microsoft') allowMembersOfWhitelistedOrgsAsAdmin(true) - permitAll(true) + permitAll(false) extensions { commitStatus { context(contextName.replace('_', '/').substring(7)) @@ -149,7 +149,7 @@ static void addPullRequestTrigger(def myJob, String contextName, String opsysNam switch (opsys) { case 'win': myJob.with { - label('windows-roslyn') + label('windows-roslyn-internal') steps { batchFile(".\\cibuild.cmd ${(configuration == 'dbg') ? '/debug' : '/release'} ${(buildTarget == 'unit32') ? '/test32' : '/test64'}") } diff --git a/src/Compilers/CSharp/Portable/Binder/Binder_Expressions.cs b/src/Compilers/CSharp/Portable/Binder/Binder_Expressions.cs index 14ec694a8a2b3133a87774cecf37302d71cd2030..e1f87af1ebf0606c990e144d407be6a00c1f9a46 100644 --- a/src/Compilers/CSharp/Portable/Binder/Binder_Expressions.cs +++ b/src/Compilers/CSharp/Portable/Binder/Binder_Expressions.cs @@ -4753,7 +4753,7 @@ private BoundExpression MakeMemberAccessValue(BoundExpression expr, DiagnosticBa typeArguments, boundLeft, rightName, - ImmutableArray.Empty, + lookupResult.Symbols.All(s => s.Kind == SymbolKind.Method) ? lookupResult.Symbols.SelectAsArray(s_toMethodSymbolFunc) : ImmutableArray.Empty, lookupResult, flags); } diff --git a/src/Compilers/CSharp/Portable/CSharpCodeAnalysis.csproj b/src/Compilers/CSharp/Portable/CSharpCodeAnalysis.csproj index 31fcf0b9f6ba4c040fe776399b3c8908a9ea9a1d..cc8389b53b5ca6956564671f956c6c9d9feaad07 100644 --- a/src/Compilers/CSharp/Portable/CSharpCodeAnalysis.csproj +++ b/src/Compilers/CSharp/Portable/CSharpCodeAnalysis.csproj @@ -228,6 +228,7 @@ + diff --git a/src/Compilers/CSharp/Portable/CSharpResources.Designer.cs b/src/Compilers/CSharp/Portable/CSharpResources.Designer.cs index d2b13064bf65389bf6280b54ef6aba8f41ee043a..eef81c1814592e264419b56bbc52b864ff3a6cc3 100644 --- a/src/Compilers/CSharp/Portable/CSharpResources.Designer.cs +++ b/src/Compilers/CSharp/Portable/CSharpResources.Designer.cs @@ -61,15 +61,6 @@ internal class CSharpResources { } } - /// - /// Looks up a localized string similar to Cannot have a previousSubmission when not a submission.. - /// - internal static string CannotHavePreviousSubmission { - get { - return ResourceManager.GetString("CannotHavePreviousSubmission", resourceCulture); - } - } - /// /// Looks up a localized string similar to Can't reference compilation of type '{0}' from {1} compilation.. /// @@ -9782,15 +9773,6 @@ internal class CSharpResources { } } - /// - /// Looks up a localized string similar to This compilation doesn't represent an interactive submission.. - /// - internal static string ThisCompilationNotInteractive { - get { - return ResourceManager.GetString("ThisCompilationNotInteractive", resourceCulture); - } - } - /// /// Looks up a localized string similar to This method can only be used to create tokens - {0} is not a token kind.. /// diff --git a/src/Compilers/CSharp/Portable/CSharpResources.resx b/src/Compilers/CSharp/Portable/CSharpResources.resx index 6d3564efdd09efc60f99bce7e00d93c5415f72fd..45fcaf6f596e717bdc3013e3e75bd5898ab114dc 100644 --- a/src/Compilers/CSharp/Portable/CSharpResources.resx +++ b/src/Compilers/CSharp/Portable/CSharpResources.resx @@ -4236,9 +4236,6 @@ To remove the warning, you can use /reference instead (set the Embed Interop Typ Position is not within syntax tree with full span {0} - - This compilation doesn't represent an interactive submission. - The language name '{0}' is invalid. @@ -4651,9 +4648,6 @@ To remove the warning, you can use /reference instead (set the Embed Interop Typ Could not find file. File path referenced in source (#load) could not be resolved. - - Cannot have a previousSubmission when not a submission. - SyntaxTree '{0}' resulted from a #load directive and cannot be removed or replaced directly. diff --git a/src/Compilers/CSharp/Portable/Compilation/CSharpCompilation.cs b/src/Compilers/CSharp/Portable/Compilation/CSharpCompilation.cs index d6cfb32c19d33894b909dafb292df282412354b6..dc6a1b2c26d9384c1e17f8a1de717c93d0d4aadb 100644 --- a/src/Compilers/CSharp/Portable/Compilation/CSharpCompilation.cs +++ b/src/Compilers/CSharp/Portable/Compilation/CSharpCompilation.cs @@ -49,7 +49,6 @@ public sealed partial class CSharpCompilation : Compilation private readonly Lazy _previousSubmissionImports; private readonly Lazy _globalNamespaceAlias; // alias symbol used to resolve "global::". private readonly Lazy _scriptClass; - private readonly CSharpCompilation _previousSubmission; // All imports (using directives and extern aliases) in syntax trees in this compilation. // NOTE: We need to de-dup since the Imports objects that populate the list may be GC'd @@ -209,25 +208,26 @@ public override INamedTypeSymbol CreateErrorTypeSymbol(INamespaceOrTypeSymbol co /// /// Creates a new compilation that can be used in scripting. /// - public static CSharpCompilation CreateSubmission( + public static CSharpCompilation CreateScriptCompilation( string assemblyName, SyntaxTree syntaxTree = null, IEnumerable references = null, CSharpCompilationOptions options = null, - Compilation previousSubmission = null, + CSharpCompilation previousScriptCompilation = null, Type returnType = null, - Type hostObjectType = null) + Type globalsType = null) { CheckSubmissionOptions(options); + ValidateScriptCompilationParameters(previousScriptCompilation, returnType, ref globalsType); return Create( assemblyName, options ?? s_defaultSubmissionOptions, (syntaxTree != null) ? new[] { syntaxTree } : SpecializedCollections.EmptyEnumerable(), references, - (CSharpCompilation)previousSubmission, - returnType, - hostObjectType, + previousScriptCompilation, + returnType, + globalsType, isSubmission: true); } @@ -245,7 +245,6 @@ public override INamedTypeSymbol CreateErrorTypeSymbol(INamespaceOrTypeSymbol co CheckAssemblyName(assemblyName); var validatedReferences = ValidateReferences(references); - ValidateSubmissionParameters(previousSubmission, returnType, ref hostObjectType); var compilation = new CSharpCompilation( assemblyName, @@ -286,7 +285,7 @@ public override INamedTypeSymbol CreateErrorTypeSymbol(INamespaceOrTypeSymbol co bool reuseReferenceManager, SyntaxAndDeclarationManager syntaxAndDeclarations, AsyncQueue eventQueue = null) - : base(assemblyName, references, SyntaxTreeCommonFeatures(syntaxAndDeclarations.ExternalSyntaxTrees), submissionReturnType, hostObjectType, isSubmission, eventQueue) + : base(assemblyName, references, SyntaxTreeCommonFeatures(syntaxAndDeclarations.ExternalSyntaxTrees), isSubmission, eventQueue) { _wellKnownMemberSignatureComparer = new WellKnownMembersSignatureComparer(this); _options = options; @@ -302,8 +301,7 @@ public override INamedTypeSymbol CreateErrorTypeSymbol(INamespaceOrTypeSymbol co if (isSubmission) { Debug.Assert(previousSubmission == null || previousSubmission.HostObjectType == hostObjectType); - - _previousSubmission = previousSubmission; + this.ScriptCompilationInfo = new CSharpScriptCompilationInfo(previousSubmission, submissionReturnType, hostObjectType); } else { @@ -369,7 +367,7 @@ public new CSharpCompilation Clone() this.AssemblyName, _options, this.ExternalReferences, - _previousSubmission, + this.PreviousSubmission, this.SubmissionReturnType, this.HostObjectType, this.IsSubmission, @@ -387,7 +385,7 @@ public new CSharpCompilation Clone() this.AssemblyName, _options, this.ExternalReferences, - _previousSubmission, + this.PreviousSubmission, this.SubmissionReturnType, this.HostObjectType, this.IsSubmission, @@ -411,7 +409,7 @@ public new CSharpCompilation WithAssemblyName(string assemblyName) assemblyName, _options, this.ExternalReferences, - _previousSubmission, + this.PreviousSubmission, this.SubmissionReturnType, this.HostObjectType, this.IsSubmission, @@ -440,7 +438,7 @@ public new CSharpCompilation WithReferences(IEnumerable refer this.AssemblyName, _options, ValidateReferences(references), - _previousSubmission, + this.PreviousSubmission, this.SubmissionReturnType, this.HostObjectType, this.IsSubmission, @@ -471,7 +469,7 @@ public CSharpCompilation WithOptions(CSharpCompilationOptions options) this.AssemblyName, options, this.ExternalReferences, - _previousSubmission, + this.PreviousSubmission, this.SubmissionReturnType, this.HostObjectType, this.IsSubmission, @@ -491,23 +489,23 @@ public CSharpCompilation WithOptions(CSharpCompilationOptions options) /// /// Returns a new compilation with the given compilation set as the previous submission. /// - internal CSharpCompilation WithPreviousSubmission(CSharpCompilation newPreviousSubmission) + public CSharpCompilation WithCompilationScriptInfo(CSharpScriptCompilationInfo info) { - if (!this.IsSubmission) + if (info == ScriptCompilationInfo) { - throw new InvalidOperationException(CSharpResources.CannotHavePreviousSubmission); + return this; } - + // Reference binding doesn't depend on previous submission so we can reuse it. return new CSharpCompilation( this.AssemblyName, _options, this.ExternalReferences, - newPreviousSubmission, - this.SubmissionReturnType, - this.HostObjectType, - this.IsSubmission, + info?.PreviousScriptCompilation, + info?.ReturnType, + info?.GlobalsType, + info != null, _referenceManager, reuseReferenceManager: true, syntaxAndDeclarations: _syntaxAndDeclarations); @@ -522,7 +520,7 @@ internal override Compilation WithEventQueue(AsyncQueue eventQ this.AssemblyName, _options, this.ExternalReferences, - _previousSubmission, + this.PreviousSubmission, this.SubmissionReturnType, this.HostObjectType, this.IsSubmission, @@ -536,10 +534,10 @@ internal override Compilation WithEventQueue(AsyncQueue eventQ #region Submission - internal new CSharpCompilation PreviousSubmission - { - get { return _previousSubmission; } - } + public new CSharpScriptCompilationInfo ScriptCompilationInfo { get; } + internal override ScriptCompilationInfo CommonScriptCompilationInfo => ScriptCompilationInfo; + + internal CSharpCompilation PreviousSubmission => ScriptCompilationInfo?.PreviousScriptCompilation; // TODO (tomat): consider moving this method to SemanticModel @@ -558,12 +556,9 @@ internal new CSharpCompilation PreviousSubmission /// /// True if the submission has value, i.e. if it ends with a statement that is an expression statement. /// The compilation doesn't represent a submission ( return false). - internal new TypeSymbol GetSubmissionResultType(out bool hasValue) + internal override ITypeSymbol GetSubmissionResultType(out bool hasValue) { - if (!IsSubmission) - { - throw new InvalidOperationException(CSharpResources.ThisCompilationNotInteractive); - } + Debug.Assert(IsSubmission); hasValue = false; @@ -1241,14 +1236,15 @@ internal Imports GetSubmissionImports() private Imports ExpandPreviousSubmissionImports() { Debug.Assert(this.IsSubmission); + var previous = this.PreviousSubmission; - if (_previousSubmission == null) + if (previous == null) { return Imports.Empty; } - return Imports.ExpandPreviousSubmissionImports(_previousSubmission.GetPreviousSubmissionImports(), this).Concat( - Imports.ExpandPreviousSubmissionImports(_previousSubmission.GetSubmissionImports(), this)); + return Imports.ExpandPreviousSubmissionImports(previous.GetPreviousSubmissionImports(), this).Concat( + Imports.ExpandPreviousSubmissionImports(previous.GetSubmissionImports(), this)); } internal AliasSymbol GlobalNamespaceAlias @@ -2700,11 +2696,6 @@ protected override Compilation CommonWithAssemblyName(string assemblyName) return WithAssemblyName(assemblyName); } - protected override ITypeSymbol CommonGetSubmissionResultType(out bool hasValue) - { - return GetSubmissionResultType(out hasValue); - } - protected override IAssemblySymbol CommonAssembly { get { return this.Assembly; } @@ -2720,11 +2711,6 @@ protected override CompilationOptions CommonOptions get { return _options; } } - protected override Compilation CommonPreviousSubmission - { - get { return _previousSubmission; } - } - protected override SemanticModel CommonGetSemanticModel(SyntaxTree syntaxTree, bool ignoreAccessibility) { return this.GetSemanticModel((SyntaxTree)syntaxTree, ignoreAccessibility); @@ -2763,14 +2749,14 @@ protected override Compilation CommonWithOptions(CompilationOptions options) return this.WithOptions((CSharpCompilationOptions)options); } - protected override Compilation CommonWithPreviousSubmission(Compilation newPreviousSubmission) + protected override Compilation CommonWithCompilationScriptInfo(ScriptCompilationInfo info) { - return this.WithPreviousSubmission((CSharpCompilation)newPreviousSubmission); + return this.WithCompilationScriptInfo((CSharpScriptCompilationInfo)info); } protected override bool CommonContainsSyntaxTree(SyntaxTree syntaxTree) { - return this.ContainsSyntaxTree((SyntaxTree)syntaxTree); + return this.ContainsSyntaxTree(syntaxTree); } protected override ISymbol CommonGetAssemblyOrModuleSymbol(MetadataReference reference) diff --git a/src/Compilers/CSharp/Portable/Compilation/CSharpScriptCompilationInfo.cs b/src/Compilers/CSharp/Portable/Compilation/CSharpScriptCompilationInfo.cs new file mode 100644 index 0000000000000000000000000000000000000000..4276a7a0dce6fafa6ae7f30365761f93b02dc94d --- /dev/null +++ b/src/Compilers/CSharp/Portable/Compilation/CSharpScriptCompilationInfo.cs @@ -0,0 +1,28 @@ +// 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.Diagnostics; + +namespace Microsoft.CodeAnalysis.CSharp +{ + public sealed class CSharpScriptCompilationInfo : ScriptCompilationInfo + { + public new CSharpCompilation PreviousScriptCompilation { get; } + + internal CSharpScriptCompilationInfo(CSharpCompilation previousCompilationOpt, Type returnType, Type globalsType) + : base(returnType, globalsType) + { + Debug.Assert(previousCompilationOpt == null || previousCompilationOpt.HostObjectType == globalsType); + + PreviousScriptCompilation = previousCompilationOpt; + } + + internal override Compilation CommonPreviousScriptCompilation => PreviousScriptCompilation; + + public CSharpScriptCompilationInfo WithPreviousScriptCompilation(CSharpCompilation compilation) => + (compilation == PreviousScriptCompilation) ? this : new CSharpScriptCompilationInfo(compilation, ReturnType, GlobalsType); + + internal override ScriptCompilationInfo CommonWithPreviousScriptCompilation(Compilation compilation) => + WithPreviousScriptCompilation((CSharpCompilation)compilation); + } +} diff --git a/src/Compilers/CSharp/Portable/PublicAPI.Unshipped.txt b/src/Compilers/CSharp/Portable/PublicAPI.Unshipped.txt index f5b93b6f79ff291bf3fc058933eedaa856e2ba0c..d87cabf068e12358f10f82ef384b7f824935defa 100644 --- a/src/Compilers/CSharp/Portable/PublicAPI.Unshipped.txt +++ b/src/Compilers/CSharp/Portable/PublicAPI.Unshipped.txt @@ -1,12 +1,17 @@ *REMOVED*Microsoft.CodeAnalysis.CSharp.CSharpCompilationOptions.CSharpCompilationOptions(Microsoft.CodeAnalysis.OutputKind outputKind, string moduleName = null, string mainTypeName = null, string scriptClassName = null, System.Collections.Generic.IEnumerable usings = null, Microsoft.CodeAnalysis.OptimizationLevel optimizationLevel = Microsoft.CodeAnalysis.OptimizationLevel.Debug, bool checkOverflow = false, bool allowUnsafe = false, string cryptoKeyContainer = null, string cryptoKeyFile = null, System.Collections.Immutable.ImmutableArray cryptoPublicKey = default(System.Collections.Immutable.ImmutableArray), bool? delaySign = null, Microsoft.CodeAnalysis.Platform platform = Microsoft.CodeAnalysis.Platform.AnyCpu, Microsoft.CodeAnalysis.ReportDiagnostic generalDiagnosticOption = Microsoft.CodeAnalysis.ReportDiagnostic.Default, int warningLevel = 4, System.Collections.Generic.IEnumerable> specificDiagnosticOptions = null, bool concurrentBuild = true, Microsoft.CodeAnalysis.XmlReferenceResolver xmlReferenceResolver = null, Microsoft.CodeAnalysis.SourceReferenceResolver sourceReferenceResolver = null, Microsoft.CodeAnalysis.MetadataReferenceResolver metadataReferenceResolver = null, Microsoft.CodeAnalysis.AssemblyIdentityComparer assemblyIdentityComparer = null, Microsoft.CodeAnalysis.StrongNameProvider strongNameProvider = null) -> void *REMOVED*static Microsoft.CodeAnalysis.CSharp.SyntaxExtensions.NormalizeWhitespace(this Microsoft.CodeAnalysis.SyntaxToken token, string indentation = " ", bool elasticTrivia = false) -> Microsoft.CodeAnalysis.SyntaxToken *REMOVED*static Microsoft.CodeAnalysis.CSharp.SyntaxExtensions.NormalizeWhitespace(this Microsoft.CodeAnalysis.SyntaxTriviaList list, string indentation = " ", bool elasticTrivia = false) -> Microsoft.CodeAnalysis.SyntaxTriviaList +Microsoft.CodeAnalysis.CSharp.CSharpCompilation.ScriptCompilationInfo.get -> Microsoft.CodeAnalysis.CSharp.CSharpScriptCompilationInfo +Microsoft.CodeAnalysis.CSharp.CSharpCompilation.WithCompilationScriptInfo(Microsoft.CodeAnalysis.CSharp.CSharpScriptCompilationInfo info) -> Microsoft.CodeAnalysis.CSharp.CSharpCompilation Microsoft.CodeAnalysis.CSharp.CSharpCompilationOptions.CSharpCompilationOptions(Microsoft.CodeAnalysis.OutputKind outputKind, bool reportSuppressedDiagnostics, string moduleName = null, string mainTypeName = null, string scriptClassName = null, System.Collections.Generic.IEnumerable usings = null, Microsoft.CodeAnalysis.OptimizationLevel optimizationLevel = Microsoft.CodeAnalysis.OptimizationLevel.Debug, bool checkOverflow = false, bool allowUnsafe = false, string cryptoKeyContainer = null, string cryptoKeyFile = null, System.Collections.Immutable.ImmutableArray cryptoPublicKey = default(System.Collections.Immutable.ImmutableArray), bool? delaySign = null, Microsoft.CodeAnalysis.Platform platform = Microsoft.CodeAnalysis.Platform.AnyCpu, Microsoft.CodeAnalysis.ReportDiagnostic generalDiagnosticOption = Microsoft.CodeAnalysis.ReportDiagnostic.Default, int warningLevel = 4, System.Collections.Generic.IEnumerable> specificDiagnosticOptions = null, bool concurrentBuild = true, bool deterministic = true, Microsoft.CodeAnalysis.XmlReferenceResolver xmlReferenceResolver = null, Microsoft.CodeAnalysis.SourceReferenceResolver sourceReferenceResolver = null, Microsoft.CodeAnalysis.MetadataReferenceResolver metadataReferenceResolver = null, Microsoft.CodeAnalysis.AssemblyIdentityComparer assemblyIdentityComparer = null, Microsoft.CodeAnalysis.StrongNameProvider strongNameProvider = null) -> void Microsoft.CodeAnalysis.CSharp.CSharpCompilationOptions.CSharpCompilationOptions(Microsoft.CodeAnalysis.OutputKind outputKind, string moduleName = null, string mainTypeName = null, string scriptClassName = null, System.Collections.Generic.IEnumerable usings = null, Microsoft.CodeAnalysis.OptimizationLevel optimizationLevel = Microsoft.CodeAnalysis.OptimizationLevel.Debug, bool checkOverflow = false, bool allowUnsafe = false, string cryptoKeyContainer = null, string cryptoKeyFile = null, System.Collections.Immutable.ImmutableArray cryptoPublicKey = default(System.Collections.Immutable.ImmutableArray), bool? delaySign = null, Microsoft.CodeAnalysis.Platform platform = Microsoft.CodeAnalysis.Platform.AnyCpu, Microsoft.CodeAnalysis.ReportDiagnostic generalDiagnosticOption = Microsoft.CodeAnalysis.ReportDiagnostic.Default, int warningLevel = 4, System.Collections.Generic.IEnumerable> specificDiagnosticOptions = null, bool concurrentBuild = true, bool deterministic = false, Microsoft.CodeAnalysis.XmlReferenceResolver xmlReferenceResolver = null, Microsoft.CodeAnalysis.SourceReferenceResolver sourceReferenceResolver = null, Microsoft.CodeAnalysis.MetadataReferenceResolver metadataReferenceResolver = null, Microsoft.CodeAnalysis.AssemblyIdentityComparer assemblyIdentityComparer = null, Microsoft.CodeAnalysis.StrongNameProvider strongNameProvider = null) -> void Microsoft.CodeAnalysis.CSharp.CSharpCompilationOptions.CSharpCompilationOptions(Microsoft.CodeAnalysis.OutputKind outputKind, string moduleName, string mainTypeName, string scriptClassName, System.Collections.Generic.IEnumerable usings, Microsoft.CodeAnalysis.OptimizationLevel optimizationLevel, bool checkOverflow, bool allowUnsafe, string cryptoKeyContainer, string cryptoKeyFile, System.Collections.Immutable.ImmutableArray cryptoPublicKey, bool? delaySign, Microsoft.CodeAnalysis.Platform platform, Microsoft.CodeAnalysis.ReportDiagnostic generalDiagnosticOption, int warningLevel, System.Collections.Generic.IEnumerable> specificDiagnosticOptions, bool concurrentBuild, Microsoft.CodeAnalysis.XmlReferenceResolver xmlReferenceResolver, Microsoft.CodeAnalysis.SourceReferenceResolver sourceReferenceResolver, Microsoft.CodeAnalysis.MetadataReferenceResolver metadataReferenceResolver, Microsoft.CodeAnalysis.AssemblyIdentityComparer assemblyIdentityComparer, Microsoft.CodeAnalysis.StrongNameProvider strongNameProvider) -> void Microsoft.CodeAnalysis.CSharp.CSharpCompilationOptions.WithDeterministic(bool deterministic) -> Microsoft.CodeAnalysis.CSharp.CSharpCompilationOptions Microsoft.CodeAnalysis.CSharp.CSharpCompilationOptions.WithReportSuppressedDiagnostics(bool reportSuppressedDiagnostics) -> Microsoft.CodeAnalysis.CSharp.CSharpCompilationOptions Microsoft.CodeAnalysis.CSharp.CSharpParseOptions.WithKind(Microsoft.CodeAnalysis.SourceCodeKind kind) -> Microsoft.CodeAnalysis.CSharp.CSharpParseOptions +Microsoft.CodeAnalysis.CSharp.CSharpScriptCompilationInfo +Microsoft.CodeAnalysis.CSharp.CSharpScriptCompilationInfo.PreviousScriptCompilation.get -> Microsoft.CodeAnalysis.CSharp.CSharpCompilation +Microsoft.CodeAnalysis.CSharp.CSharpScriptCompilationInfo.WithPreviousScriptCompilation(Microsoft.CodeAnalysis.CSharp.CSharpCompilation compilation) -> Microsoft.CodeAnalysis.CSharp.CSharpScriptCompilationInfo Microsoft.CodeAnalysis.CSharp.Syntax.CompilationUnitSyntax.GetLoadDirectives() -> System.Collections.Generic.IList Microsoft.CodeAnalysis.CSharp.Syntax.LoadDirectiveTriviaSyntax Microsoft.CodeAnalysis.CSharp.Syntax.LoadDirectiveTriviaSyntax.File.get -> Microsoft.CodeAnalysis.SyntaxToken @@ -27,7 +32,7 @@ override Microsoft.CodeAnalysis.CSharp.Syntax.LoadDirectiveTriviaSyntax.Accept Microsoft.CodeAnalysis.SyntaxToken override Microsoft.CodeAnalysis.CSharp.Syntax.LoadDirectiveTriviaSyntax.HashToken.get -> Microsoft.CodeAnalysis.SyntaxToken override Microsoft.CodeAnalysis.CSharp.Syntax.LoadDirectiveTriviaSyntax.IsActive.get -> bool -static Microsoft.CodeAnalysis.CSharp.CSharpCompilation.CreateSubmission(string assemblyName, Microsoft.CodeAnalysis.SyntaxTree syntaxTree = null, System.Collections.Generic.IEnumerable references = null, Microsoft.CodeAnalysis.CSharp.CSharpCompilationOptions options = null, Microsoft.CodeAnalysis.Compilation previousSubmission = null, System.Type returnType = null, System.Type hostObjectType = null) -> Microsoft.CodeAnalysis.CSharp.CSharpCompilation +static Microsoft.CodeAnalysis.CSharp.CSharpCompilation.CreateScriptCompilation(string assemblyName, Microsoft.CodeAnalysis.SyntaxTree syntaxTree = null, System.Collections.Generic.IEnumerable references = null, Microsoft.CodeAnalysis.CSharp.CSharpCompilationOptions options = null, Microsoft.CodeAnalysis.CSharp.CSharpCompilation previousScriptCompilation = null, System.Type returnType = null, System.Type globalsType = null) -> Microsoft.CodeAnalysis.CSharp.CSharpCompilation static Microsoft.CodeAnalysis.CSharp.SyntaxExtensions.NormalizeWhitespace(this Microsoft.CodeAnalysis.SyntaxToken token, string indentation = " ", string eol = "\r\n", bool elasticTrivia = false) -> Microsoft.CodeAnalysis.SyntaxToken static Microsoft.CodeAnalysis.CSharp.SyntaxExtensions.NormalizeWhitespace(this Microsoft.CodeAnalysis.SyntaxToken token, string indentation, bool elasticTrivia) -> Microsoft.CodeAnalysis.SyntaxToken static Microsoft.CodeAnalysis.CSharp.SyntaxExtensions.NormalizeWhitespace(this Microsoft.CodeAnalysis.SyntaxTriviaList list, string indentation = " ", string eol = "\r\n", bool elasticTrivia = false) -> Microsoft.CodeAnalysis.SyntaxTriviaList diff --git a/src/Compilers/CSharp/Test/CommandLine/CommandLineScriptTests.cs b/src/Compilers/CSharp/Test/CommandLine/CommandLineScriptTests.cs index 695a8ccfc35600b1008876a0f5536d53a9676923..15ec40865fcef2b27021370152d1ac15595fba79 100644 --- a/src/Compilers/CSharp/Test/CommandLine/CommandLineScriptTests.cs +++ b/src/Compilers/CSharp/Test/CommandLine/CommandLineScriptTests.cs @@ -35,16 +35,16 @@ public void CompilationChain_SystemObject_NotEquals() var options = new CSharpParseOptions(kind: SourceCodeKind.Script, documentationMode: DocumentationMode.None); var corLib = AssemblyMetadata.CreateFromImage(TestResources.NetFX.v4_0_30319.mscorlib); - var s1 = CSharpCompilation.CreateSubmission("s1.dll", + var s1 = CSharpCompilation.CreateScriptCompilation("s1.dll", syntaxTree: SyntaxFactory.ParseSyntaxTree("struct S { }", options), references: new[] { corLib.GetReference(documentation: new TestDocumentationProviderNoEquals()) }, returnType: typeof(object)); s1.VerifyDiagnostics(); - var s2 = CSharpCompilation.CreateSubmission("s2.dll", + var s2 = CSharpCompilation.CreateScriptCompilation("s2.dll", syntaxTree: SyntaxFactory.ParseSyntaxTree("System.Collections.IEnumerable Iterator() { yield return new S(); }", options), - previousSubmission: s1, + previousScriptCompilation: s1, references: new[] { corLib.GetReference(documentation: new TestDocumentationProviderNoEquals()) }, returnType: typeof(object)); @@ -65,16 +65,16 @@ public void CompilationChain_SystemObject_Equals() var options = new CSharpParseOptions(kind: SourceCodeKind.Script, documentationMode: DocumentationMode.None); var corLib = AssemblyMetadata.CreateFromImage(TestResources.NetFX.v4_0_30319.mscorlib); - var s1 = CSharpCompilation.CreateSubmission("s1.dll", + var s1 = CSharpCompilation.CreateScriptCompilation("s1.dll", syntaxTree: SyntaxFactory.ParseSyntaxTree("struct S { }", options), references: new[] { corLib.GetReference(documentation: new TestDocumentationProviderEquals()) }, returnType: typeof(object)); s1.VerifyDiagnostics(); - var s2 = CSharpCompilation.CreateSubmission("s2.dll", + var s2 = CSharpCompilation.CreateScriptCompilation("s2.dll", syntaxTree: SyntaxFactory.ParseSyntaxTree("System.Collections.IEnumerable Iterator() { yield return new S(); }", options), - previousSubmission: s1, + previousScriptCompilation: s1, references: new[] { corLib.GetReference(documentation: new TestDocumentationProviderEquals()) }, returnType: typeof(object)); diff --git a/src/Compilers/CSharp/Test/Emit/CodeGen/CodeGenAsyncTests.cs b/src/Compilers/CSharp/Test/Emit/CodeGen/CodeGenAsyncTests.cs index d597744b8f66986917e297976dc448b1305e218a..a455a11f2bc0322c57f791078c17104d11aeb257 100644 --- a/src/Compilers/CSharp/Test/Emit/CodeGen/CodeGenAsyncTests.cs +++ b/src/Compilers/CSharp/Test/Emit/CodeGen/CodeGenAsyncTests.cs @@ -3640,8 +3640,8 @@ public void AwaitInInteractiveExpression() }"; var source1 = @"await F()"; - var s0 = CSharpCompilation.CreateSubmission("s0.dll", SyntaxFactory.ParseSyntaxTree(source0, options: TestOptions.Script), references); - var s1 = CSharpCompilation.CreateSubmission("s1.dll", SyntaxFactory.ParseSyntaxTree(source1, options: TestOptions.Script), references, previousSubmission: s0); + var s0 = CSharpCompilation.CreateScriptCompilation("s0.dll", SyntaxFactory.ParseSyntaxTree(source0, options: TestOptions.Script), references); + var s1 = CSharpCompilation.CreateScriptCompilation("s1.dll", SyntaxFactory.ParseSyntaxTree(source1, options: TestOptions.Script), references, previousScriptCompilation: s0); s1.VerifyDiagnostics(); } @@ -3651,7 +3651,7 @@ public void AwaitInInteractiveGlobalStatement() var references = new[] { MscorlibRef_v4_0_30316_17626, SystemCoreRef }; var source0 = @"await System.Threading.Tasks.Task.FromResult(5);"; - var s0 = CSharpCompilation.CreateSubmission("s0.dll", SyntaxFactory.ParseSyntaxTree(source0, options: TestOptions.Script), references); + var s0 = CSharpCompilation.CreateScriptCompilation("s0.dll", SyntaxFactory.ParseSyntaxTree(source0, options: TestOptions.Script), references); s0.VerifyDiagnostics(); } diff --git a/src/Compilers/CSharp/Test/Emit/CodeGen/CodeGenScriptTests.cs b/src/Compilers/CSharp/Test/Emit/CodeGen/CodeGenScriptTests.cs index 58d1f0ef78163722809a9e9b460f7e4d828f0e41..84dafa9a1672d0bcb24a008ffe01c94abad75574 100644 --- a/src/Compilers/CSharp/Test/Emit/CodeGen/CodeGenScriptTests.cs +++ b/src/Compilers/CSharp/Test/Emit/CodeGen/CodeGenScriptTests.cs @@ -547,7 +547,7 @@ public void SubmissionEntryPoint() await System.Threading.Tasks.Task.Delay(100); System.Console.Write(""complete""); }"; - var s0 = CSharpCompilation.CreateSubmission( + var s0 = CSharpCompilation.CreateScriptCompilation( "s0.dll", SyntaxFactory.ParseSyntaxTree(source0, options: TestOptions.Script), references); diff --git a/src/Compilers/CSharp/Test/Semantic/Semantics/BindingAsyncTests.cs b/src/Compilers/CSharp/Test/Semantic/Semantics/BindingAsyncTests.cs index fba5973f58f72ee7ccc9c5e7528e328a8539d426..74c55763154a9530b11c1c45c11c3de1c982ee42 100644 --- a/src/Compilers/CSharp/Test/Semantic/Semantics/BindingAsyncTests.cs +++ b/src/Compilers/CSharp/Test/Semantic/Semantics/BindingAsyncTests.cs @@ -3144,7 +3144,7 @@ public void UnobservedAwaitableExpression_Submission() @"using System.Threading.Tasks; Task.FromResult(1); Task.FromResult(2)"; - var submission = CSharpCompilation.CreateSubmission( + var submission = CSharpCompilation.CreateScriptCompilation( "s0.dll", syntaxTree: SyntaxFactory.ParseSyntaxTree(source0, options: TestOptions.Script), references: new[] { MscorlibRef_v4_0_30316_17626 }); diff --git a/src/Compilers/CSharp/Test/Semantic/Semantics/ObjectAndCollectionInitializerTests.cs b/src/Compilers/CSharp/Test/Semantic/Semantics/ObjectAndCollectionInitializerTests.cs index 9260145bf8e864b8cd081f7a83ebd6d8f05065de..25ded91054d38cec1c7b6c78eef4cc23c707d0ce 100644 --- a/src/Compilers/CSharp/Test/Semantic/Semantics/ObjectAndCollectionInitializerTests.cs +++ b/src/Compilers/CSharp/Test/Semantic/Semantics/ObjectAndCollectionInitializerTests.cs @@ -1987,6 +1987,18 @@ static void Main() "; var compilation = CreateCompilationWithMscorlib(source); + compilation.VerifyDiagnostics( + // (5,14): error CS0535: 'Base' does not implement interface member 'IEnumerable.GetEnumerator()' + // class Base : IEnumerable + Diagnostic(ErrorCode.ERR_UnimplementedInterfaceMember, "IEnumerable").WithArguments("Base", "System.Collections.Generic.IEnumerable.GetEnumerator()").WithLocation(5, 14), + // (5,14): error CS0535: 'Base' does not implement interface member 'IEnumerable.GetEnumerator()' + // class Base : IEnumerable + Diagnostic(ErrorCode.ERR_UnimplementedInterfaceMember, "IEnumerable").WithArguments("Base", "System.Collections.IEnumerable.GetEnumerator()").WithLocation(5, 14), + // (17,32): error CS0122: 'X.Add(string)' is inaccessible due to its protection level + // var z = new X { String.Empty }; + Diagnostic(ErrorCode.ERR_BadAccess, "Empty").WithArguments("X.Add(string)").WithLocation(17, 32) + ); + var tree = compilation.SyntaxTrees.Single(); var semanticModel = compilation.GetSemanticModel(tree); @@ -1999,8 +2011,8 @@ where node.IsKind(SyntaxKind.CollectionInitializerExpression) symbolInfo = semanticModel.GetCollectionInitializerSymbolInfo(nodes[0]); Assert.Null(symbolInfo.Symbol); - Assert.Equal(CandidateReason.None, symbolInfo.CandidateReason); - Assert.Equal(0, symbolInfo.CandidateSymbols.Length); + Assert.Equal(CandidateReason.Inaccessible, symbolInfo.CandidateReason); + Assert.Equal("void X.Add(System.String x)", symbolInfo.CandidateSymbols.Single().ToTestDisplayString()); } [WorkItem(529787, "DevDiv")] diff --git a/src/Compilers/CSharp/Test/Semantic/Semantics/OverloadResolutionTests.cs b/src/Compilers/CSharp/Test/Semantic/Semantics/OverloadResolutionTests.cs index d77e7c1bdb4728e926e87005a071465c1effc9ae..dc2897930a729f34766b5ecf7b4b9ab5570c19da 100644 --- a/src/Compilers/CSharp/Test/Semantic/Semantics/OverloadResolutionTests.cs +++ b/src/Compilers/CSharp/Test/Semantic/Semantics/OverloadResolutionTests.cs @@ -8237,5 +8237,47 @@ public static class Class RemoveDetail RemoveDetail"); } + + [Fact, WorkItem(2544, "https://github.com/dotnet/roslyn/issues/2544")] + public void GetSymbolOnfo_Inaccessible() + { + var source = +@" +class C +{ + private void M(D d) + { + d.M(1); + } +} + +class D +{ + private void M(int i) { } + private void M(double d) { } +} +"; + var compilation = CreateCompilationWithMscorlib(source, options: TestOptions.ReleaseDll); + + compilation.VerifyDiagnostics( + // (6,11): error CS0122: 'D.M(int)' is inaccessible due to its protection level + // d.M(1); + Diagnostic(ErrorCode.ERR_BadAccess, "M").WithArguments("D.M(int)").WithLocation(6, 11) + ); + + var tree = compilation.SyntaxTrees.Single(); + var model = compilation.GetSemanticModel(tree); + + var callSyntax = tree.GetRoot().DescendantNodes().OfType().Single(); + + var symbolInfo = model.GetSymbolInfo(callSyntax); + + Assert.Equal(CandidateReason.Inaccessible, symbolInfo.CandidateReason); + var candidates = symbolInfo.CandidateSymbols; + Assert.Equal(2, candidates.Length); + Assert.Equal("void D.M(System.Int32 i)", candidates[0].ToTestDisplayString()); + Assert.Equal("void D.M(System.Double d)", candidates[1].ToTestDisplayString()); + } + } } diff --git a/src/Compilers/CSharp/Test/Semantic/Semantics/ScriptSemanticsTests.cs b/src/Compilers/CSharp/Test/Semantic/Semantics/ScriptSemanticsTests.cs index 1386814fe49090522d86c2d8291fa5fdaa2c3389..e24379acac5060d2fb1ad28d2e0bab648f1eed0f 100644 --- a/src/Compilers/CSharp/Test/Semantic/Semantics/ScriptSemanticsTests.cs +++ b/src/Compilers/CSharp/Test/Semantic/Semantics/ScriptSemanticsTests.cs @@ -86,7 +86,7 @@ public void MainInScript1() [Fact] public void NoReferences() { - var submission = CSharpCompilation.CreateSubmission("test", syntaxTree: SyntaxFactory.ParseSyntaxTree("1", options: TestOptions.Script), returnType: typeof(int)); + var submission = CSharpCompilation.CreateScriptCompilation("test", syntaxTree: SyntaxFactory.ParseSyntaxTree("1", options: TestOptions.Script), returnType: typeof(int)); submission.VerifyDiagnostics( // (1,1): error CS0518: Predefined type 'System.Object' is not defined or imported // 1 diff --git a/src/Compilers/CSharp/Test/Semantic/Semantics/SwitchTests.cs b/src/Compilers/CSharp/Test/Semantic/Semantics/SwitchTests.cs index c72281e9568447421853a6f05132f55e2a48bcc7..227e9204505b0f6040548676f794987c352e90e4 100644 --- a/src/Compilers/CSharp/Test/Semantic/Semantics/SwitchTests.cs +++ b/src/Compilers/CSharp/Test/Semantic/Semantics/SwitchTests.cs @@ -2148,7 +2148,7 @@ public void SwitchFallOut_Script2() default: Console.WriteLine(2); }"; - var submission = CSharpCompilation.CreateSubmission( + var submission = CSharpCompilation.CreateScriptCompilation( "s0.dll", syntaxTree: SyntaxFactory.ParseSyntaxTree(source, options: TestOptions.Script), references: new[] { MscorlibRef, SystemCoreRef }); diff --git a/src/Compilers/CSharp/Test/Semantic/Semantics/SyntaxTreeRootTests.cs b/src/Compilers/CSharp/Test/Semantic/Semantics/SyntaxTreeRootTests.cs index b67f856b94bc07344bfc3ebcd0870dae13d89c23..4e2539727c16c3ae52d56420a072a6091a19360f 100644 --- a/src/Compilers/CSharp/Test/Semantic/Semantics/SyntaxTreeRootTests.cs +++ b/src/Compilers/CSharp/Test/Semantic/Semantics/SyntaxTreeRootTests.cs @@ -56,7 +56,7 @@ public void CompilationDoesNotAcceptArbitrarilyRootedTree() var arbitraryTree = SyntaxFactory.SyntaxTree(SyntaxFactory.Attribute(SyntaxFactory.IdentifierName("Wooh"))); var parsedTree = SyntaxFactory.ParseSyntaxTree(""); Assert.Throws(() => CSharpCompilation.Create("Grrr", syntaxTrees: new[] { arbitraryTree })); - Assert.Throws(() => CSharpCompilation.CreateSubmission("Wah").AddSyntaxTrees(arbitraryTree)); + Assert.Throws(() => CSharpCompilation.CreateScriptCompilation("Wah").AddSyntaxTrees(arbitraryTree)); Assert.Throws(() => CSharpCompilation.Create("Bahh", syntaxTrees: new[] { parsedTree }).ReplaceSyntaxTree(parsedTree, arbitraryTree)); Assert.Throws(() => CSharpCompilation.Create("Woo").GetSemanticModel(arbitraryTree)); } diff --git a/src/Compilers/CSharp/Test/Symbol/Compilation/CompilationAPITests.cs b/src/Compilers/CSharp/Test/Symbol/Compilation/CompilationAPITests.cs index 81a348315199951338078b04c15761c04305dbb3..98c06a8fda9b7ce7a015507999928fac3f212094 100644 --- a/src/Compilers/CSharp/Test/Symbol/Compilation/CompilationAPITests.cs +++ b/src/Compilers/CSharp/Test/Symbol/Compilation/CompilationAPITests.cs @@ -1384,7 +1384,7 @@ class A public void GetEntryPoint_Submission() { var source = @"1 + 1"; - var compilation = CSharpCompilation.CreateSubmission("sub", + var compilation = CSharpCompilation.CreateScriptCompilation("sub", references: new[] { MscorlibRef }, syntaxTree: Parse(source, options: TestOptions.Script)); compilation.VerifyDiagnostics(); @@ -1408,7 +1408,7 @@ class A static void Main() { } } "; - var compilation = CSharpCompilation.CreateSubmission("sub", + var compilation = CSharpCompilation.CreateScriptCompilation("sub", references: new[] { MscorlibRef }, syntaxTree: Parse(source, options: TestOptions.Script)); compilation.VerifyDiagnostics( @@ -1568,16 +1568,6 @@ public void ReferenceManagerReuse_WithOptions() Assert.True(c1.ReferenceManagerEquals(c2)); } - [Fact] - public void ReferenceManagerReuse_WithPreviousSubmission() - { - var s1 = CSharpCompilation.CreateSubmission("s1"); - var s2 = CSharpCompilation.CreateSubmission("s2"); - - var s3 = s2.WithPreviousSubmission(s1); - Assert.True(s2.ReferenceManagerEquals(s3)); - } - [Fact] public void ReferenceManagerReuse_WithMetadataReferenceResolver() { @@ -1930,31 +1920,31 @@ public void SubmissionCompilation_Errors() var ptr = typeof(int).MakePointerType(); var byref = typeof(int).MakeByRefType(); - Assert.Throws(() => CSharpCompilation.CreateSubmission("a", returnType: genericParameter)); - Assert.Throws(() => CSharpCompilation.CreateSubmission("a", returnType: open)); - Assert.Throws(() => CSharpCompilation.CreateSubmission("a", returnType: typeof(void))); - Assert.Throws(() => CSharpCompilation.CreateSubmission("a", returnType: byref)); + Assert.Throws(() => CSharpCompilation.CreateScriptCompilation("a", returnType: genericParameter)); + Assert.Throws(() => CSharpCompilation.CreateScriptCompilation("a", returnType: open)); + Assert.Throws(() => CSharpCompilation.CreateScriptCompilation("a", returnType: typeof(void))); + Assert.Throws(() => CSharpCompilation.CreateScriptCompilation("a", returnType: byref)); - Assert.Throws(() => CSharpCompilation.CreateSubmission("a", hostObjectType: genericParameter)); - Assert.Throws(() => CSharpCompilation.CreateSubmission("a", hostObjectType: open)); - Assert.Throws(() => CSharpCompilation.CreateSubmission("a", hostObjectType: typeof(void))); - Assert.Throws(() => CSharpCompilation.CreateSubmission("a", hostObjectType: typeof(int))); - Assert.Throws(() => CSharpCompilation.CreateSubmission("a", hostObjectType: ptr)); - Assert.Throws(() => CSharpCompilation.CreateSubmission("a", hostObjectType: byref)); + Assert.Throws(() => CSharpCompilation.CreateScriptCompilation("a", globalsType: genericParameter)); + Assert.Throws(() => CSharpCompilation.CreateScriptCompilation("a", globalsType: open)); + Assert.Throws(() => CSharpCompilation.CreateScriptCompilation("a", globalsType: typeof(void))); + Assert.Throws(() => CSharpCompilation.CreateScriptCompilation("a", globalsType: typeof(int))); + Assert.Throws(() => CSharpCompilation.CreateScriptCompilation("a", globalsType: ptr)); + Assert.Throws(() => CSharpCompilation.CreateScriptCompilation("a", globalsType: byref)); - var s0 = CSharpCompilation.CreateSubmission("a0", hostObjectType: typeof(List)); - Assert.Throws(() => CSharpCompilation.CreateSubmission("a1", previousSubmission: s0, hostObjectType: typeof(List))); + var s0 = CSharpCompilation.CreateScriptCompilation("a0", globalsType: typeof(List)); + Assert.Throws(() => CSharpCompilation.CreateScriptCompilation("a1", previousScriptCompilation: s0, globalsType: typeof(List))); // invalid options: - Assert.Throws(() => CSharpCompilation.CreateSubmission("a", options: TestOptions.ReleaseExe)); - Assert.Throws(() => CSharpCompilation.CreateSubmission("a", options: TestOptions.ReleaseDll.WithOutputKind(OutputKind.NetModule))); - Assert.Throws(() => CSharpCompilation.CreateSubmission("a", options: TestOptions.ReleaseDll.WithOutputKind(OutputKind.WindowsRuntimeMetadata))); - Assert.Throws(() => CSharpCompilation.CreateSubmission("a", options: TestOptions.ReleaseDll.WithOutputKind(OutputKind.WindowsRuntimeApplication))); - Assert.Throws(() => CSharpCompilation.CreateSubmission("a", options: TestOptions.ReleaseDll.WithOutputKind(OutputKind.WindowsApplication))); - Assert.Throws(() => CSharpCompilation.CreateSubmission("a", options: TestOptions.ReleaseDll.WithCryptoKeyContainer("foo"))); - Assert.Throws(() => CSharpCompilation.CreateSubmission("a", options: TestOptions.ReleaseDll.WithCryptoKeyFile("foo.snk"))); - Assert.Throws(() => CSharpCompilation.CreateSubmission("a", options: TestOptions.ReleaseDll.WithDelaySign(true))); - Assert.Throws(() => CSharpCompilation.CreateSubmission("a", options: TestOptions.ReleaseDll.WithDelaySign(false))); + Assert.Throws(() => CSharpCompilation.CreateScriptCompilation("a", options: TestOptions.ReleaseExe)); + Assert.Throws(() => CSharpCompilation.CreateScriptCompilation("a", options: TestOptions.ReleaseDll.WithOutputKind(OutputKind.NetModule))); + Assert.Throws(() => CSharpCompilation.CreateScriptCompilation("a", options: TestOptions.ReleaseDll.WithOutputKind(OutputKind.WindowsRuntimeMetadata))); + Assert.Throws(() => CSharpCompilation.CreateScriptCompilation("a", options: TestOptions.ReleaseDll.WithOutputKind(OutputKind.WindowsRuntimeApplication))); + Assert.Throws(() => CSharpCompilation.CreateScriptCompilation("a", options: TestOptions.ReleaseDll.WithOutputKind(OutputKind.WindowsApplication))); + Assert.Throws(() => CSharpCompilation.CreateScriptCompilation("a", options: TestOptions.ReleaseDll.WithCryptoKeyContainer("foo"))); + Assert.Throws(() => CSharpCompilation.CreateScriptCompilation("a", options: TestOptions.ReleaseDll.WithCryptoKeyFile("foo.snk"))); + Assert.Throws(() => CSharpCompilation.CreateScriptCompilation("a", options: TestOptions.ReleaseDll.WithDelaySign(true))); + Assert.Throws(() => CSharpCompilation.CreateScriptCompilation("a", options: TestOptions.ReleaseDll.WithDelaySign(false))); } private static void TestSubmissionResult(CSharpCompilation s, SpecialType? expectedType, bool expectedHasValue) @@ -1968,7 +1958,7 @@ private static void TestSubmissionResult(CSharpCompilation s, SpecialType? expec [Fact] public void SubmissionResultType() { - var submission = CSharpCompilation.CreateSubmission("sub"); + var submission = CSharpCompilation.CreateScriptCompilation("sub"); bool hasValue; Assert.Equal(SpecialType.System_Void, submission.GetSubmissionResultType(out hasValue).SpecialType); Assert.False(hasValue); diff --git a/src/Compilers/CSharp/Test/Symbol/Compilation/GetUnusedImportDirectivesTests.cs b/src/Compilers/CSharp/Test/Symbol/Compilation/GetUnusedImportDirectivesTests.cs index e41b4e3d7c59ec0fcfc6a8024c3cfd7290a886a3..58cb0fe7fdbad4d14bd9ecd90fbb6def48b88200 100644 --- a/src/Compilers/CSharp/Test/Symbol/Compilation/GetUnusedImportDirectivesTests.cs +++ b/src/Compilers/CSharp/Test/Symbol/Compilation/GetUnusedImportDirectivesTests.cs @@ -360,7 +360,7 @@ public void InfoAndWarnAsError() public void UnusedUsingInteractive() { var tree = Parse("using System;", options: TestOptions.Script); - var comp = CSharpCompilation.CreateSubmission("sub1", tree, new[] { MscorlibRef_v4_0_30316_17626 }); + var comp = CSharpCompilation.CreateScriptCompilation("sub1", tree, new[] { MscorlibRef_v4_0_30316_17626 }); comp.VerifyDiagnostics(); } diff --git a/src/Compilers/CSharp/Test/Symbol/Symbols/ExtensionMethodTests.cs b/src/Compilers/CSharp/Test/Symbol/Symbols/ExtensionMethodTests.cs index 7d6bab9dfd78591bb47a9ca5e147629664ce9e95..eddd207d2c85f62baa543f74b4ee355c6c5d92d0 100644 --- a/src/Compilers/CSharp/Test/Symbol/Symbols/ExtensionMethodTests.cs +++ b/src/Compilers/CSharp/Test/Symbol/Symbols/ExtensionMethodTests.cs @@ -3700,16 +3700,16 @@ public void InteractiveExtensionMethods() var o = new object(); o.G().F();"; - var s0 = CSharpCompilation.CreateSubmission( + var s0 = CSharpCompilation.CreateScriptCompilation( "s0.dll", syntaxTree: SyntaxFactory.ParseSyntaxTree(source0, options: parseOptions), references: references); s0.VerifyDiagnostics(); - var s1 = CSharpCompilation.CreateSubmission( + var s1 = CSharpCompilation.CreateScriptCompilation( "s1.dll", syntaxTree: SyntaxFactory.ParseSyntaxTree(source1, options: parseOptions), - previousSubmission: s0, + previousScriptCompilation: s0, references: references); s1.VerifyDiagnostics(); } diff --git a/src/Compilers/CSharp/Test/Symbol/Symbols/Source/ExternAliasTests.cs b/src/Compilers/CSharp/Test/Symbol/Symbols/Source/ExternAliasTests.cs index 3a992859e6abed8d4c1de286f175ada732e5a21c..cca00c19746f3072f7119e18119f02b405aaba43 100644 --- a/src/Compilers/CSharp/Test/Symbol/Symbols/Source/ExternAliasTests.cs +++ b/src/Compilers/CSharp/Test/Symbol/Symbols/Source/ExternAliasTests.cs @@ -103,7 +103,7 @@ public void ExternAliasInInteractive_Error() { var src = "extern alias Bar;"; - var comp = CSharpCompilation.CreateSubmission( + var comp = CSharpCompilation.CreateScriptCompilation( GetUniqueName(), syntaxTree: SyntaxFactory.ParseSyntaxTree(src, options: TestOptions.Script), references: new MetadataReference[] { MscorlibRef, ExternAliasTests.Foo1, ExternAliasTests.Foo2 }); diff --git a/src/Compilers/CSharp/Test/Symbol/Symbols/SymbolErrorTests.cs b/src/Compilers/CSharp/Test/Symbol/Symbols/SymbolErrorTests.cs index 38996e97c040f64366ac3f77d23c92bac2f29226..cee4d360bcce2e2b9dc0d53af66a3aca7b0d92bb 100644 --- a/src/Compilers/CSharp/Test/Symbol/Symbols/SymbolErrorTests.cs +++ b/src/Compilers/CSharp/Test/Symbol/Symbols/SymbolErrorTests.cs @@ -19170,7 +19170,7 @@ public void AbstractInSubmission() @"internal abstract void M(); internal abstract object P { get; } internal abstract event System.EventHandler E;"; - var submission = CSharpCompilation.CreateSubmission("s0.dll", SyntaxFactory.ParseSyntaxTree(source, options: TestOptions.Script), new[] { MscorlibRef_v4_0_30316_17626, SystemCoreRef }); + var submission = CSharpCompilation.CreateScriptCompilation("s0.dll", SyntaxFactory.ParseSyntaxTree(source, options: TestOptions.Script), new[] { MscorlibRef_v4_0_30316_17626, SystemCoreRef }); submission.VerifyDiagnostics( // (1,24): error CS0513: 'M()' is abstract but it is contained in non-abstract class 'Script' // internal abstract void M(); diff --git a/src/Compilers/Core/Portable/CodeAnalysis.csproj b/src/Compilers/Core/Portable/CodeAnalysis.csproj index df8383f375d8db289e5dc343f097df718cee6726..e2e42d836c851ba5233da4e2edb74aed78d5d60f 100644 --- a/src/Compilers/Core/Portable/CodeAnalysis.csproj +++ b/src/Compilers/Core/Portable/CodeAnalysis.csproj @@ -51,6 +51,7 @@ + diff --git a/src/Compilers/Core/Portable/Compilation/Compilation.cs b/src/Compilers/Core/Portable/Compilation/Compilation.cs index de3494d623caef34a10ea2248ed16506956ff4fa..c1c0b7ed8df7db5e7ab6356663abe73831c3a165 100644 --- a/src/Compilers/Core/Portable/Compilation/Compilation.cs +++ b/src/Compilers/Core/Portable/Compilation/Compilation.cs @@ -52,12 +52,13 @@ public abstract partial class Compilation private readonly IReadOnlyDictionary _features; + public ScriptCompilationInfo ScriptCompilationInfo => CommonScriptCompilationInfo; + internal abstract ScriptCompilationInfo CommonScriptCompilationInfo { get; } + internal Compilation( string name, ImmutableArray references, IReadOnlyDictionary features, - Type submissionReturnType, - Type hostObjectType, bool isSubmission, AsyncQueue eventQueue) { @@ -68,17 +69,7 @@ public abstract partial class Compilation this.ExternalReferences = references; this.EventQueue = eventQueue; - if (isSubmission) - { - _lazySubmissionSlotIndex = SubmissionSlotIndexToBeAllocated; - this.SubmissionReturnType = submissionReturnType ?? typeof(object); - this.HostObjectType = hostObjectType; - } - else - { - _lazySubmissionSlotIndex = SubmissionSlotIndexNotApplicable; - } - + _lazySubmissionSlotIndex = isSubmission ? SubmissionSlotIndexToBeAllocated : SubmissionSlotIndexNotApplicable; _features = features; } @@ -118,11 +109,11 @@ public abstract partial class Compilation /// public abstract string Language { get; } - internal static void ValidateSubmissionParameters(Compilation previousSubmission, Type returnType, ref Type hostObjectType) + internal static void ValidateScriptCompilationParameters(Compilation previousScriptCompilation, Type returnType, ref Type globalsType) { - if (hostObjectType != null && !IsValidHostObjectType(hostObjectType)) + if (globalsType != null && !IsValidHostObjectType(globalsType)) { - throw new ArgumentException(CodeAnalysisResources.ReturnTypeCannotBeValuePointerbyRefOrOpen, nameof(hostObjectType)); + throw new ArgumentException(CodeAnalysisResources.ReturnTypeCannotBeValuePointerbyRefOrOpen, nameof(globalsType)); } if (returnType != null && !IsValidSubmissionReturnType(returnType)) @@ -130,19 +121,19 @@ internal static void ValidateSubmissionParameters(Compilation previousSubmission throw new ArgumentException(CodeAnalysisResources.ReturnTypeCannotBeVoidByRefOrOpen, nameof(returnType)); } - if (previousSubmission != null) + if (previousScriptCompilation != null) { - if (hostObjectType == null) + if (globalsType == null) { - hostObjectType = previousSubmission.HostObjectType; + globalsType = previousScriptCompilation.HostObjectType; } - else if (hostObjectType != previousSubmission.HostObjectType) + else if (globalsType != previousScriptCompilation.HostObjectType) { - throw new ArgumentException(CodeAnalysisResources.TypeMustBeSameAsHostObjectTypeOfPreviousSubmission, nameof(hostObjectType)); + throw new ArgumentException(CodeAnalysisResources.TypeMustBeSameAsHostObjectTypeOfPreviousSubmission, nameof(globalsType)); } // Force the previous submission to be analyzed. This is required for anonymous types unification. - if (previousSubmission.GetDiagnostics().Any(d => d.Severity == DiagnosticSeverity.Error)) + if (previousScriptCompilation.GetDiagnostics().Any(d => d.Severity == DiagnosticSeverity.Error)) { throw new InvalidOperationException(CodeAnalysisResources.PreviousSubmissionHasErrors); } @@ -314,7 +305,7 @@ internal int GetSubmissionSlotIndex() if (_lazySubmissionSlotIndex == SubmissionSlotIndexToBeAllocated) { // TODO (tomat): remove recursion - int lastSlotIndex = PreviousSubmission?.GetSubmissionSlotIndex() ?? 0; + int lastSlotIndex = ScriptCompilationInfo.PreviousScriptCompilation?.GetSubmissionSlotIndex() ?? 0; _lazySubmissionSlotIndex = HasCodeToEmit() ? lastSlotIndex + 1 : lastSlotIndex; } @@ -332,7 +323,7 @@ internal int GetSubmissionSlotIndex() /// /// The type object that represents the type of submission result the host requested. /// - internal Type SubmissionReturnType { get; } + internal Type SubmissionReturnType => ScriptCompilationInfo?.ReturnType; internal static bool IsValidSubmissionReturnType(Type type) { @@ -340,9 +331,9 @@ internal static bool IsValidSubmissionReturnType(Type type) } /// - /// The type of the host object or null if not specified for this compilation. + /// The type of the globals object or null if not specified for this compilation. /// - internal Type HostObjectType { get; } + internal Type HostObjectType => ScriptCompilationInfo?.GlobalsType; internal static bool IsValidHostObjectType(Type type) { @@ -376,32 +367,10 @@ internal static bool IsValidHostObjectType(Type type) /// is false in the former case and true /// in the latter. /// - public ITypeSymbol GetSubmissionResultType(out bool hasValue) - { - return CommonGetSubmissionResultType(out hasValue); - } - - protected abstract ITypeSymbol CommonGetSubmissionResultType(out bool hasValue); + internal abstract ITypeSymbol GetSubmissionResultType(out bool hasValue); - /// - /// The previous submission compilation, or null if either this - /// compilation doesn't represent a submission or the submission is the - /// first submission in a submission chain. - /// - public Compilation PreviousSubmission { get { return CommonPreviousSubmission; } } - - protected abstract Compilation CommonPreviousSubmission { get; } - - /// - /// Returns a new compilation with the given compilation set as the - /// previous submission. - /// - public Compilation WithPreviousSubmission(Compilation newPreviousSubmission) - { - return CommonWithPreviousSubmission(newPreviousSubmission); - } - - protected abstract Compilation CommonWithPreviousSubmission(Compilation newPreviousSubmission); + public Compilation WithCompilationScriptInfo(ScriptCompilationInfo info) => CommonWithCompilationScriptInfo(info); + protected abstract Compilation CommonWithCompilationScriptInfo(ScriptCompilationInfo info); #endregion @@ -1416,6 +1385,8 @@ internal bool IsRealSigned internal void EnsureAnonymousTypeTemplates(CancellationToken cancellationToken) { + Debug.Assert(IsSubmission); + if (this.GetSubmissionSlotIndex() >= 0 && HasCodeToEmit()) { if (!this.CommonAnonymousTypeManager.AreTemplatesSealed) @@ -1449,7 +1420,7 @@ internal void EnsureAnonymousTypeTemplates(CancellationToken cancellationToken) } else { - this.PreviousSubmission?.EnsureAnonymousTypeTemplates(cancellationToken); + this.ScriptCompilationInfo.PreviousScriptCompilation?.EnsureAnonymousTypeTemplates(cancellationToken); } } diff --git a/src/Compilers/Core/Portable/Compilation/ScriptCompilationInfo.cs b/src/Compilers/Core/Portable/Compilation/ScriptCompilationInfo.cs new file mode 100644 index 0000000000000000000000000000000000000000..927a52c7670829a661611a77eaa8f3d0f2eeb867 --- /dev/null +++ b/src/Compilers/Core/Portable/Compilation/ScriptCompilationInfo.cs @@ -0,0 +1,24 @@ +// 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; + +namespace Microsoft.CodeAnalysis +{ + public abstract class ScriptCompilationInfo + { + public Type ReturnType { get; } + public Type GlobalsType { get; } + + internal ScriptCompilationInfo(Type returnType, Type globalsType) + { + ReturnType = returnType ?? typeof(object); + GlobalsType = globalsType; + } + + public Compilation PreviousScriptCompilation => CommonPreviousScriptCompilation; + internal abstract Compilation CommonPreviousScriptCompilation { get; } + + public ScriptCompilationInfo WithPreviousScriptCompilation(Compilation compilation) => CommonWithPreviousScriptCompilation(compilation); + internal abstract ScriptCompilationInfo CommonWithPreviousScriptCompilation(Compilation compilation); + } +} diff --git a/src/Compilers/Core/Portable/SourceCodeKind.cs b/src/Compilers/Core/Portable/SourceCodeKind.cs index 79ba57bdd71616a466684b1cb70b8ed935bf3e8a..aeaa20afcb43db33260cd9592dc06aa5a8c1a8e5 100644 --- a/src/Compilers/Core/Portable/SourceCodeKind.cs +++ b/src/Compilers/Core/Portable/SourceCodeKind.cs @@ -25,7 +25,7 @@ public enum SourceCodeKind /// /// The same as . /// - [Obsolete("Use Script instead", error: true)] + [Obsolete("Use Script instead", error: false)] [EditorBrowsable(EditorBrowsableState.Never)] Interactive = 2, } diff --git a/src/Compilers/Test/Utilities/CSharp/CSharpTestBase.cs b/src/Compilers/Test/Utilities/CSharp/CSharpTestBase.cs index 8177e0c7d9563f00ff27b8b0935a5c1b6d544851..a1ecdf0d4b681076afad5b16ea44e9a636dcab4a 100644 --- a/src/Compilers/Test/Utilities/CSharp/CSharpTestBase.cs +++ b/src/Compilers/Test/Utilities/CSharp/CSharpTestBase.cs @@ -502,14 +502,14 @@ public static SyntaxTree ParseWithRoundTripCheck(string text, CSharpParseOptions Type returnType = null, Type hostObjectType = null) { - return CSharpCompilation.CreateSubmission( + return CSharpCompilation.CreateScriptCompilation( GetUniqueName(), references: (references != null) ? new[] { MscorlibRef_v4_0_30316_17626 }.Concat(references) : new[] { MscorlibRef_v4_0_30316_17626 }, options: options, syntaxTree: Parse(code, options: parseOptions ?? TestOptions.Script), - previousSubmission: previous, + previousScriptCompilation: previous, returnType: returnType, - hostObjectType: hostObjectType); + globalsType: hostObjectType); } public CompilationVerifier CompileWithCustomILSource(string cSharpSource, string ilSource, Action compilationVerifier = null, bool importInternals = true, string expectedOutput = null) diff --git a/src/Compilers/Test/Utilities/VisualBasic/BasicTestBase.vb b/src/Compilers/Test/Utilities/VisualBasic/BasicTestBase.vb index 7255f0316d4e21e73da36d8bdb66a47ce900e9b4..be2c6c11e21834df8fa623dd3f758f5c7380e096 100644 --- a/src/Compilers/Test/Utilities/VisualBasic/BasicTestBase.vb +++ b/src/Compilers/Test/Utilities/VisualBasic/BasicTestBase.vb @@ -378,14 +378,14 @@ Public MustInherit Class BasicTestBaseBase Optional previous As VisualBasicCompilation = Nothing, Optional returnType As Type = Nothing, Optional hostObjectType As Type = Nothing) As VisualBasicCompilation - Return VisualBasicCompilation.CreateSubmission( + Return VisualBasicCompilation.CreateScriptCompilation( GetUniqueName(), references:=If(references Is Nothing, {MscorlibRef_v4_0_30316_17626, MsvbRef_v4_0_30319_17929}, {MscorlibRef_v4_0_30316_17626, MsvbRef_v4_0_30319_17929}.Concat(references)), options:=options, syntaxTree:=Parse(code, options:=If(parseOptions, TestOptions.Script)), - previousSubmission:=previous, + previousScriptCompilation:=previous, returnType:=returnType, - hostObjectType:=hostObjectType) + globalsType:=hostObjectType) End Function Friend Shared Function GetAttributeNames(attributes As ImmutableArray(Of SynthesizedAttributeData)) As IEnumerable(Of String) diff --git a/src/Compilers/VisualBasic/Portable/BasicCodeAnalysis.vbproj b/src/Compilers/VisualBasic/Portable/BasicCodeAnalysis.vbproj index 7a32af5cd716ff39429eed6f72c2a9f237728490..ac27798ad8378163b22429e5bca69898bf585274 100644 --- a/src/Compilers/VisualBasic/Portable/BasicCodeAnalysis.vbproj +++ b/src/Compilers/VisualBasic/Portable/BasicCodeAnalysis.vbproj @@ -361,6 +361,7 @@ + diff --git a/src/Compilers/VisualBasic/Portable/Compilation/VisualBasicCompilation.vb b/src/Compilers/VisualBasic/Portable/Compilation/VisualBasicCompilation.vb index 85fc051cdce0b7c3bb0f6536ee8a5376af5cb4ac..7d7c714e5a3e308c3b4dc1b41d9172b2db34327f 100644 --- a/src/Compilers/VisualBasic/Portable/Compilation/VisualBasicCompilation.vb +++ b/src/Compilers/VisualBasic/Portable/Compilation/VisualBasicCompilation.vb @@ -158,7 +158,6 @@ Namespace Microsoft.CodeAnalysis.VisualBasic Private _lazyMyTemplate As SyntaxTree = VisualBasicSyntaxTree.Dummy Private ReadOnly _scriptClass As Lazy(Of ImplicitNamedTypeSymbol) - Private ReadOnly _previousSubmission As VisualBasicCompilation ''' ''' Contains the main method of this assembly, if there is one. @@ -322,28 +321,26 @@ Namespace Microsoft.CodeAnalysis.VisualBasic ''' ''' Creates a new compilation that can be used in scripting. ''' - Public Shared Function CreateSubmission( + Friend Shared Function CreateScriptCompilation( assemblyName As String, Optional syntaxTree As SyntaxTree = Nothing, Optional references As IEnumerable(Of MetadataReference) = Nothing, Optional options As VisualBasicCompilationOptions = Nothing, - Optional previousSubmission As Compilation = Nothing, + Optional previousScriptCompilation As VisualBasicCompilation = Nothing, Optional returnType As Type = Nothing, - Optional hostObjectType As Type = Nothing) As VisualBasicCompilation + Optional globalsType As Type = Nothing) As VisualBasicCompilation CheckSubmissionOptions(options) - - Dim vbTree = syntaxTree - Dim vbPrevious = DirectCast(previousSubmission, VisualBasicCompilation) + ValidateScriptCompilationParameters(previousScriptCompilation, returnType, globalsType) Return Create( assemblyName, If(options, New VisualBasicCompilationOptions(OutputKind.DynamicallyLinkedLibrary)), - If((syntaxTree IsNot Nothing), {vbTree}, SpecializedCollections.EmptyEnumerable(Of SyntaxTree)()), + If((syntaxTree IsNot Nothing), {syntaxTree}, SpecializedCollections.EmptyEnumerable(Of SyntaxTree)()), references, - vbPrevious, + previousScriptCompilation, returnType, - hostObjectType, + globalsType, isSubmission:=True) End Function @@ -364,7 +361,6 @@ Namespace Microsoft.CodeAnalysis.VisualBasic CheckAssemblyName(assemblyName) Dim validatedReferences = ValidateReferences(Of VisualBasicCompilationReference)(references) - ValidateSubmissionParameters(previousSubmission, returnType, hostObjectType) Dim c As VisualBasicCompilation = Nothing Dim embeddedTrees = CreateEmbeddedTrees(New Lazy(Of VisualBasicCompilation)(Function() c)) @@ -413,7 +409,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic reuseReferenceManager As Boolean, Optional eventQueue As AsyncQueue(Of CompilationEvent) = Nothing ) - MyBase.New(assemblyName, references, SyntaxTreeCommonFeatures(syntaxTrees), submissionReturnType, hostObjectType, isSubmission, eventQueue) + MyBase.New(assemblyName, references, SyntaxTreeCommonFeatures(syntaxTrees), isSubmission, eventQueue) Debug.Assert(rootNamespaces IsNot Nothing) Debug.Assert(declarationTable IsNot Nothing) @@ -434,7 +430,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic If isSubmission Then Debug.Assert(previousSubmission Is Nothing OrElse previousSubmission.HostObjectType Is hostObjectType) - _previousSubmission = previousSubmission + Me.ScriptCompilationInfo = New VisualBasicScriptCompilationInfo(previousSubmission, submissionReturnType, hostObjectType) Else Debug.Assert(previousSubmission Is Nothing AndAlso submissionReturnType Is Nothing AndAlso hostObjectType Is Nothing) End If @@ -493,7 +489,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic _rootNamespaces, _embeddedTrees, _declarationTable, - _previousSubmission, + Me.PreviousSubmission, Me.SubmissionReturnType, Me.HostObjectType, Me.IsSubmission, @@ -518,7 +514,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic rootNamespaces, _embeddedTrees, declarationTable, - _previousSubmission, + Me.PreviousSubmission, Me.SubmissionReturnType, Me.HostObjectType, Me.IsSubmission, @@ -545,7 +541,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic _rootNamespaces, _embeddedTrees, _declarationTable, - _previousSubmission, + Me.PreviousSubmission, Me.SubmissionReturnType, Me.HostObjectType, Me.IsSubmission, @@ -586,7 +582,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic _rootNamespaces, embeddedTrees, declTable, - _previousSubmission, + Me.PreviousSubmission, Me.SubmissionReturnType, Me.HostObjectType, Me.IsSubmission, @@ -639,7 +635,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic declMap, embeddedTrees, declTable, - _previousSubmission, + Me.PreviousSubmission, Me.SubmissionReturnType, Me.HostObjectType, Me.IsSubmission, @@ -651,9 +647,9 @@ Namespace Microsoft.CodeAnalysis.VisualBasic ''' ''' Returns a new compilation with the given compilation set as the previous submission. ''' - Friend Shadows Function WithPreviousSubmission(newPreviousSubmission As VisualBasicCompilation) As VisualBasicCompilation - If Not IsSubmission Then - Throw New NotSupportedException("Can't have a previousSubmission when not a submission") + Friend Shadows Function WithScriptCompilationInfo(info As VisualBasicScriptCompilationInfo) As VisualBasicCompilation + If info Is ScriptCompilationInfo Then + Return Me End If ' Reference binding doesn't depend on previous submission so we can reuse it. @@ -667,10 +663,10 @@ Namespace Microsoft.CodeAnalysis.VisualBasic _rootNamespaces, _embeddedTrees, _declarationTable, - newPreviousSubmission, - Me.SubmissionReturnType, - Me.HostObjectType, - Me.IsSubmission, + info?.PreviousScriptCompilation, + info?.ReturnType, + info?.GlobalsType, + info IsNot Nothing, _referenceManager, reuseReferenceManager:=True) End Function @@ -688,7 +684,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic _rootNamespaces, _embeddedTrees, _declarationTable, - _previousSubmission, + Me.PreviousSubmission, Me.SubmissionReturnType, Me.HostObjectType, Me.IsSubmission, @@ -701,9 +697,17 @@ Namespace Microsoft.CodeAnalysis.VisualBasic #Region "Submission" + Friend Shadows ReadOnly Property ScriptCompilationInfo As VisualBasicScriptCompilationInfo + + Friend Overrides ReadOnly Property CommonScriptCompilationInfo As ScriptCompilationInfo + Get + Return ScriptCompilationInfo + End Get + End Property + Friend Shadows ReadOnly Property PreviousSubmission As VisualBasicCompilation Get - Return _previousSubmission + Return ScriptCompilationInfo?.PreviousScriptCompilation End Get End Property @@ -724,11 +728,8 @@ Namespace Microsoft.CodeAnalysis.VisualBasic ''' Note that the return type is System.Void for both compilations "System.Console.WriteLine()" and "?System.Console.WriteLine()", ''' and is False for the former and True for the latter. ''' - ''' The compilation doesn't represent a submission ( return false). - Friend Shadows Function GetSubmissionResultType( ByRef hasValue As Boolean) As TypeSymbol - If Not IsSubmission Then - Throw New InvalidOperationException(VBResources.CompilationDoesNotRepresentInteractiveSubmission) - End If + Friend Overrides Function GetSubmissionResultType( ByRef hasValue As Boolean) As ITypeSymbol + Debug.Assert(IsSubmission) hasValue = False Dim tree = SyntaxTrees.SingleOrDefault() @@ -2503,8 +2504,8 @@ Namespace Microsoft.CodeAnalysis.VisualBasic Return WithAssemblyName(assemblyName) End Function - Protected Overrides Function CommonGetSubmissionResultType(ByRef hasValue As Boolean) As ITypeSymbol - Return GetSubmissionResultType(hasValue) + Protected Overrides Function CommonWithCompilationScriptInfo(info As ScriptCompilationInfo) As Compilation + Return WithScriptCompilationInfo(DirectCast(info, VisualBasicScriptCompilationInfo)) End Function Protected Overrides ReadOnly Property CommonAssembly As IAssemblySymbol @@ -2525,12 +2526,6 @@ Namespace Microsoft.CodeAnalysis.VisualBasic End Get End Property - Protected Overrides ReadOnly Property CommonPreviousSubmission As Compilation - Get - Return PreviousSubmission - End Get - End Property - Protected Overrides Function CommonGetSemanticModel(syntaxTree As SyntaxTree, ignoreAccessibility As Boolean) As SemanticModel Return Me.GetSemanticModel(syntaxTree, ignoreAccessibility) End Function @@ -2579,10 +2574,6 @@ Namespace Microsoft.CodeAnalysis.VisualBasic Return Me.WithOptions(DirectCast(options, VisualBasicCompilationOptions)) End Function - Protected Overrides Function CommonWithPreviousSubmission(newPreviousSubmission As Compilation) As Compilation - Return Me.WithPreviousSubmission(DirectCast(newPreviousSubmission, VisualBasicCompilation)) - End Function - Protected Overrides Function CommonContainsSyntaxTree(syntaxTree As SyntaxTree) As Boolean Return Me.ContainsSyntaxTree(syntaxTree) End Function diff --git a/src/Compilers/VisualBasic/Portable/Compilation/VisualBasicScriptCompilationInfo.vb b/src/Compilers/VisualBasic/Portable/Compilation/VisualBasicScriptCompilationInfo.vb new file mode 100644 index 0000000000000000000000000000000000000000..385e97f8e8447d809827af76d3ed7cb7efa4ae9f --- /dev/null +++ b/src/Compilers/VisualBasic/Portable/Compilation/VisualBasicScriptCompilationInfo.vb @@ -0,0 +1,31 @@ +' Copyright (c) Microsoft. All Rights Reserved. Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +Namespace Microsoft.CodeAnalysis.VisualBasic + + Friend NotInheritable Class VisualBasicScriptCompilationInfo + Inherits ScriptCompilationInfo + + Public Shadows ReadOnly Property PreviousScriptCompilation As VisualBasicCompilation + + Friend Sub New(previousCompilationOpt As VisualBasicCompilation, returnType As Type, globalsType As Type) + MyBase.New(returnType, globalsType) + + Debug.Assert(previousCompilationOpt Is Nothing OrElse previousCompilationOpt.HostObjectType Is globalsType) + PreviousScriptCompilation = previousCompilationOpt + End Sub + + Friend Overrides ReadOnly Property CommonPreviousScriptCompilation As Compilation + Get + Return PreviousScriptCompilation + End Get + End Property + + Public Shadows Function WithPreviousScriptCompilation(compilation As VisualBasicCompilation) As VisualBasicScriptCompilationInfo + Return If(compilation Is PreviousScriptCompilation, Me, New VisualBasicScriptCompilationInfo(compilation, ReturnType, GlobalsType)) + End Function + + Friend Overrides Function CommonWithPreviousScriptCompilation(compilation As Compilation) As ScriptCompilationInfo + Return WithPreviousScriptCompilation(DirectCast(compilation, VisualBasicCompilation)) + End Function + End Class +End Namespace diff --git a/src/Compilers/VisualBasic/Portable/PublicAPI.Unshipped.txt b/src/Compilers/VisualBasic/Portable/PublicAPI.Unshipped.txt index 0c284295a93237d1c63c38c962a48b9731d5fc43..01f06035bbb3f6701c47fc4f7e2205e927e39ed8 100644 --- a/src/Compilers/VisualBasic/Portable/PublicAPI.Unshipped.txt +++ b/src/Compilers/VisualBasic/Portable/PublicAPI.Unshipped.txt @@ -13,5 +13,4 @@ Microsoft.CodeAnalysis.VisualBasic.VisualBasicCompilationOptions.New(outputKind Microsoft.CodeAnalysis.VisualBasic.VisualBasicCompilationOptions.WithDeterministic(deterministic As Boolean) -> Microsoft.CodeAnalysis.VisualBasic.VisualBasicCompilationOptions Microsoft.CodeAnalysis.VisualBasic.VisualBasicCompilationOptions.WithReportSuppressedDiagnostics(value As Boolean) -> Microsoft.CodeAnalysis.VisualBasic.VisualBasicCompilationOptions Microsoft.CodeAnalysis.VisualBasic.VisualBasicParseOptions.WithKind(kind As Microsoft.CodeAnalysis.SourceCodeKind) -> Microsoft.CodeAnalysis.VisualBasic.VisualBasicParseOptions -Overrides Microsoft.CodeAnalysis.VisualBasic.VisualBasicParseOptions.CommonWithKind(kind As Microsoft.CodeAnalysis.SourceCodeKind) -> Microsoft.CodeAnalysis.ParseOptions -Shared Microsoft.CodeAnalysis.VisualBasic.VisualBasicCompilation.CreateSubmission(assemblyName As String, syntaxTree As Microsoft.CodeAnalysis.SyntaxTree = Nothing, references As System.Collections.Generic.IEnumerable(Of Microsoft.CodeAnalysis.MetadataReference) = Nothing, options As Microsoft.CodeAnalysis.VisualBasic.VisualBasicCompilationOptions = Nothing, previousSubmission As Microsoft.CodeAnalysis.Compilation = Nothing, returnType As System.Type = Nothing, hostObjectType As System.Type = Nothing) -> Microsoft.CodeAnalysis.VisualBasic.VisualBasicCompilation \ No newline at end of file +Overrides Microsoft.CodeAnalysis.VisualBasic.VisualBasicParseOptions.CommonWithKind(kind As Microsoft.CodeAnalysis.SourceCodeKind) -> Microsoft.CodeAnalysis.ParseOptions \ No newline at end of file diff --git a/src/Compilers/VisualBasic/Portable/VBResources.Designer.vb b/src/Compilers/VisualBasic/Portable/VBResources.Designer.vb index 5a61952b49467d08be05863f17fd254aa4c3034e..a488e4c2d6560f68c54608e28584600dcddbe529 100644 --- a/src/Compilers/VisualBasic/Portable/VBResources.Designer.vb +++ b/src/Compilers/VisualBasic/Portable/VBResources.Designer.vb @@ -124,15 +124,6 @@ Namespace Microsoft.CodeAnalysis.VisualBasic End Get End Property - ''' - ''' Looks up a localized string similar to This compilation doesn't represent an interactive submission.. - ''' - Friend ReadOnly Property CompilationDoesNotRepresentInteractiveSubmission() As String - Get - Return ResourceManager.GetString("CompilationDoesNotRepresentInteractiveSubmission", resourceCulture) - End Get - End Property - ''' ''' Looks up a localized string similar to Compilation (Visual Basic): . ''' diff --git a/src/Compilers/VisualBasic/Portable/VBResources.resx b/src/Compilers/VisualBasic/Portable/VBResources.resx index df9b54974fd5871226f50d5a8ce4cf897075f25e..9f970a11a0007798d432459153cf8c348b61211b 100644 --- a/src/Compilers/VisualBasic/Portable/VBResources.resx +++ b/src/Compilers/VisualBasic/Portable/VBResources.resx @@ -4910,9 +4910,6 @@ The system cannot find the path specified - - This compilation doesn't represent an interactive submission. - Unrecognized file format. diff --git a/src/Compilers/VisualBasic/Test/Emit/CodeGen/CodeGenScriptTests.vb b/src/Compilers/VisualBasic/Test/Emit/CodeGen/CodeGenScriptTests.vb index 174fe2df8a46090f966e21008a41741339324736..c69d14009019adfd235996a789930b9a54c99a20 100644 --- a/src/Compilers/VisualBasic/Test/Emit/CodeGen/CodeGenScriptTests.vb +++ b/src/Compilers/VisualBasic/Test/Emit/CodeGen/CodeGenScriptTests.vb @@ -177,30 +177,30 @@ Next Public Sub ChainingAnonymousTypeTemplates() Dim references = LatestVbReferences - Dim s0 = VisualBasicCompilation.CreateSubmission("s0.dll", + Dim s0 = VisualBasicCompilation.CreateScriptCompilation("s0.dll", syntaxTree:=VisualBasicSyntaxTree.ParseText( "Dim x = New With {.a = 1}", options:=TestOptions.Script), references:=references, returnType:=GetType(Object)) - Dim s__ = VisualBasicCompilation.CreateSubmission("s__.dll", + Dim s__ = VisualBasicCompilation.CreateScriptCompilation("s__.dll", syntaxTree:=VisualBasicSyntaxTree.ParseText( "Dim y = New With {.b = 1}", options:=TestOptions.Script), - previousSubmission:=s0, + previousScriptCompilation:=s0, references:=references, returnType:=GetType(Object)) - Dim s1 = VisualBasicCompilation.CreateSubmission("s1.dll", + Dim s1 = VisualBasicCompilation.CreateScriptCompilation("s1.dll", syntaxTree:=VisualBasicSyntaxTree.ParseText( "Dim y = New With {.a = New With {.b = 1} }", options:=TestOptions.Script), - previousSubmission:=s0, + previousScriptCompilation:=s0, references:=references, returnType:=GetType(Object)) - Dim s2 = VisualBasicCompilation.CreateSubmission("s2.dll", + Dim s2 = VisualBasicCompilation.CreateScriptCompilation("s2.dll", syntaxTree:=VisualBasicSyntaxTree.ParseText( "? x.GetType() Is y.GetType()", options:=TestOptions.Script), - previousSubmission:=s1, + previousScriptCompilation:=s1, references:=references, returnType:=GetType(Object)) @@ -256,7 +256,7 @@ Next Public Sub LabelLookup() Const source = "Imports System : 1" Dim tree = Parse(source, options:=TestOptions.Script) - Dim submission = VisualBasicCompilation.CreateSubmission("sub1", tree, {MscorlibRef}) + Dim submission = VisualBasicCompilation.CreateScriptCompilation("sub1", tree, {MscorlibRef}) Dim model = submission.GetSemanticModel(tree) Assert.Empty(model.LookupLabels(source.Length - 1)) End Sub @@ -264,7 +264,7 @@ Next Public Sub ErrorInUsing() - Dim submission = VisualBasicCompilation.CreateSubmission("sub1", Parse("Imports Unknown", options:=TestOptions.Script), {MscorlibRef}) + Dim submission = VisualBasicCompilation.CreateScriptCompilation("sub1", Parse("Imports Unknown", options:=TestOptions.Script), {MscorlibRef}) Dim expectedErrors = - Dim s0 = VisualBasicCompilation.CreateSubmission( + Dim s0 = VisualBasicCompilation.CreateScriptCompilation( "s0.dll", syntaxTree:=Parse(source0.Value, parseOptions), references:=references) diff --git a/src/Compilers/VisualBasic/Test/Semantic/Compilation/CompilationAPITests.vb b/src/Compilers/VisualBasic/Test/Semantic/Compilation/CompilationAPITests.vb index 12a2453785b4182c3332bf4b6f353f9bf759c899..b6d7585cf8cbb78010c434333ab98dbd6cd57631 100644 --- a/src/Compilers/VisualBasic/Test/Semantic/Compilation/CompilationAPITests.vb +++ b/src/Compilers/VisualBasic/Test/Semantic/Compilation/CompilationAPITests.vb @@ -1322,7 +1322,7 @@ End Class Public Sub GetEntryPoint_Submission() Dim source = "? 1 + 1" - Dim compilation = VisualBasicCompilation.CreateSubmission( + Dim compilation = VisualBasicCompilation.CreateScriptCompilation( "sub", references:={MscorlibRef}, syntaxTree:=Parse(source, options:=TestOptions.Script)) @@ -1346,7 +1346,7 @@ End Class End Sub End Class " - Dim compilation = VisualBasicCompilation.CreateSubmission( + Dim compilation = VisualBasicCompilation.CreateScriptCompilation( "Sub", references:={MscorlibRef}, syntaxTree:=Parse(source, options:=TestOptions.Script)) @@ -1416,10 +1416,10 @@ End Class Public Sub ReferenceManagerReuse_WithPreviousSubmission() - Dim s1 = VisualBasicCompilation.CreateSubmission("s1") - Dim s2 = VisualBasicCompilation.CreateSubmission("s2") + Dim s1 = VisualBasicCompilation.CreateScriptCompilation("s1") + Dim s2 = VisualBasicCompilation.CreateScriptCompilation("s2") - Dim s3 = s2.WithPreviousSubmission(s1) + Dim s3 = s2.WithScriptCompilationInfo(s2.ScriptCompilationInfo.WithPreviousScriptCompilation(s1)) Assert.True(s2.ReferenceManagerEquals(s3)) End Sub @@ -1720,35 +1720,35 @@ End Namespace Dim ptr = GetType(Integer).MakePointerType() Dim byRefType = GetType(Integer).MakeByRefType() - Assert.Throws(Of ArgumentException)(Function() VisualBasicCompilation.CreateSubmission("a", returnType:=genericParameter)) - Assert.Throws(Of ArgumentException)(Function() VisualBasicCompilation.CreateSubmission("a", returnType:=open)) - Assert.Throws(Of ArgumentException)(Function() VisualBasicCompilation.CreateSubmission("a", returnType:=GetType(Void))) - Assert.Throws(Of ArgumentException)(Function() VisualBasicCompilation.CreateSubmission("a", returnType:=byRefType)) - Assert.Throws(Of ArgumentException)(Function() VisualBasicCompilation.CreateSubmission("a", hostObjectType:=genericParameter)) - Assert.Throws(Of ArgumentException)(Function() VisualBasicCompilation.CreateSubmission("a", hostObjectType:=open)) - Assert.Throws(Of ArgumentException)(Function() VisualBasicCompilation.CreateSubmission("a", hostObjectType:=GetType(Void))) - Assert.Throws(Of ArgumentException)(Function() VisualBasicCompilation.CreateSubmission("a", hostObjectType:=GetType(Integer))) - Assert.Throws(Of ArgumentException)(Function() VisualBasicCompilation.CreateSubmission("a", hostObjectType:=ptr)) - Assert.Throws(Of ArgumentException)(Function() VisualBasicCompilation.CreateSubmission("a", hostObjectType:=byRefType)) + Assert.Throws(Of ArgumentException)(Function() VisualBasicCompilation.CreateScriptCompilation("a", returnType:=genericParameter)) + Assert.Throws(Of ArgumentException)(Function() VisualBasicCompilation.CreateScriptCompilation("a", returnType:=open)) + Assert.Throws(Of ArgumentException)(Function() VisualBasicCompilation.CreateScriptCompilation("a", returnType:=GetType(Void))) + Assert.Throws(Of ArgumentException)(Function() VisualBasicCompilation.CreateScriptCompilation("a", returnType:=byRefType)) + Assert.Throws(Of ArgumentException)(Function() VisualBasicCompilation.CreateScriptCompilation("a", globalsType:=genericParameter)) + Assert.Throws(Of ArgumentException)(Function() VisualBasicCompilation.CreateScriptCompilation("a", globalsType:=open)) + Assert.Throws(Of ArgumentException)(Function() VisualBasicCompilation.CreateScriptCompilation("a", globalsType:=GetType(Void))) + Assert.Throws(Of ArgumentException)(Function() VisualBasicCompilation.CreateScriptCompilation("a", globalsType:=GetType(Integer))) + Assert.Throws(Of ArgumentException)(Function() VisualBasicCompilation.CreateScriptCompilation("a", globalsType:=ptr)) + Assert.Throws(Of ArgumentException)(Function() VisualBasicCompilation.CreateScriptCompilation("a", globalsType:=byRefType)) - Dim s0 = VisualBasicCompilation.CreateSubmission("a0", hostObjectType:=GetType(List(Of Integer))) - Assert.Throws(Of ArgumentException)(Function() VisualBasicCompilation.CreateSubmission("a1", previousSubmission:=s0, hostObjectType:=GetType(List(Of Boolean)))) + Dim s0 = VisualBasicCompilation.CreateScriptCompilation("a0", globalsType:=GetType(List(Of Integer))) + Assert.Throws(Of ArgumentException)(Function() VisualBasicCompilation.CreateScriptCompilation("a1", previousScriptCompilation:=s0, globalsType:=GetType(List(Of Boolean)))) ' invalid options - Assert.Throws(Of ArgumentException)(Function() VisualBasicCompilation.CreateSubmission("a", options:=TestOptions.ReleaseExe)) - Assert.Throws(Of ArgumentException)(Function() VisualBasicCompilation.CreateSubmission("a", options:=TestOptions.ReleaseDll.WithOutputKind(OutputKind.NetModule))) - Assert.Throws(Of ArgumentException)(Function() VisualBasicCompilation.CreateSubmission("a", options:=TestOptions.ReleaseDll.WithOutputKind(OutputKind.WindowsRuntimeMetadata))) - Assert.Throws(Of ArgumentException)(Function() VisualBasicCompilation.CreateSubmission("a", options:=TestOptions.ReleaseDll.WithOutputKind(OutputKind.WindowsRuntimeApplication))) - Assert.Throws(Of ArgumentException)(Function() VisualBasicCompilation.CreateSubmission("a", options:=TestOptions.ReleaseDll.WithOutputKind(OutputKind.WindowsApplication))) - Assert.Throws(Of ArgumentException)(Function() VisualBasicCompilation.CreateSubmission("a", options:=TestOptions.ReleaseDll.WithCryptoKeyContainer("foo"))) - Assert.Throws(Of ArgumentException)(Function() VisualBasicCompilation.CreateSubmission("a", options:=TestOptions.ReleaseDll.WithCryptoKeyFile("foo.snk"))) - Assert.Throws(Of ArgumentException)(Function() VisualBasicCompilation.CreateSubmission("a", options:=TestOptions.ReleaseDll.WithDelaySign(True))) - Assert.Throws(Of ArgumentException)(Function() VisualBasicCompilation.CreateSubmission("a", options:=TestOptions.ReleaseDll.WithDelaySign(False))) + Assert.Throws(Of ArgumentException)(Function() VisualBasicCompilation.CreateScriptCompilation("a", options:=TestOptions.ReleaseExe)) + Assert.Throws(Of ArgumentException)(Function() VisualBasicCompilation.CreateScriptCompilation("a", options:=TestOptions.ReleaseDll.WithOutputKind(OutputKind.NetModule))) + Assert.Throws(Of ArgumentException)(Function() VisualBasicCompilation.CreateScriptCompilation("a", options:=TestOptions.ReleaseDll.WithOutputKind(OutputKind.WindowsRuntimeMetadata))) + Assert.Throws(Of ArgumentException)(Function() VisualBasicCompilation.CreateScriptCompilation("a", options:=TestOptions.ReleaseDll.WithOutputKind(OutputKind.WindowsRuntimeApplication))) + Assert.Throws(Of ArgumentException)(Function() VisualBasicCompilation.CreateScriptCompilation("a", options:=TestOptions.ReleaseDll.WithOutputKind(OutputKind.WindowsApplication))) + Assert.Throws(Of ArgumentException)(Function() VisualBasicCompilation.CreateScriptCompilation("a", options:=TestOptions.ReleaseDll.WithCryptoKeyContainer("foo"))) + Assert.Throws(Of ArgumentException)(Function() VisualBasicCompilation.CreateScriptCompilation("a", options:=TestOptions.ReleaseDll.WithCryptoKeyFile("foo.snk"))) + Assert.Throws(Of ArgumentException)(Function() VisualBasicCompilation.CreateScriptCompilation("a", options:=TestOptions.ReleaseDll.WithDelaySign(True))) + Assert.Throws(Of ArgumentException)(Function() VisualBasicCompilation.CreateScriptCompilation("a", options:=TestOptions.ReleaseDll.WithDelaySign(False))) End Sub Public Sub SubmissionResultType() - Dim submission = VisualBasicCompilation.CreateSubmission("sub") + Dim submission = VisualBasicCompilation.CreateScriptCompilation("sub") Dim hasValue As Boolean Assert.Equal(SpecialType.System_Void, submission.GetSubmissionResultType(hasValue).SpecialType) Assert.False(hasValue) @@ -1788,7 +1788,7 @@ End Sub Private Shared Sub TestSubmissionResult(s As VisualBasicCompilation, expectedType As Func(Of TypeSymbol, Boolean), expectedHasValue As Boolean) Dim hasValue As Boolean Dim type = s.GetSubmissionResultType(hasValue) - Assert.True(expectedType(type), "unexpected type") + Assert.True(expectedType(DirectCast(type, TypeSymbol)), "unexpected type") Assert.Equal(expectedHasValue, hasValue) End Sub diff --git a/src/Compilers/VisualBasic/Test/Semantic/Semantics/GetUnusedImportDirectivesTests.vb b/src/Compilers/VisualBasic/Test/Semantic/Semantics/GetUnusedImportDirectivesTests.vb index 45067e306d9291af702fb3fae077e3e43a91e4b0..1a8fda6d6322d3e618c20f118c70fcbb12226ced 100644 --- a/src/Compilers/VisualBasic/Test/Semantic/Semantics/GetUnusedImportDirectivesTests.vb +++ b/src/Compilers/VisualBasic/Test/Semantic/Semantics/GetUnusedImportDirectivesTests.vb @@ -299,7 +299,7 @@ Imports System Public Sub UnusedImportInteractive() Dim tree = Parse("Imports System", options:=TestOptions.Script) - Dim compilation = VisualBasicCompilation.CreateSubmission("sub1", tree, {MscorlibRef_v4_0_30316_17626}) + Dim compilation = VisualBasicCompilation.CreateScriptCompilation("sub1", tree, {MscorlibRef_v4_0_30316_17626}) compilation.AssertNoDiagnostics(suppressInfos:=False) End Sub diff --git a/src/Compilers/VisualBasic/Test/Semantic/Semantics/SyntaxTreeRootTests.vb b/src/Compilers/VisualBasic/Test/Semantic/Semantics/SyntaxTreeRootTests.vb index 5920ddc970cc5a8c8a101e906ffd859975dd4389..9a6c985c355e5ba2e745058df55495c6a4c4fb9d 100644 --- a/src/Compilers/VisualBasic/Test/Semantic/Semantics/SyntaxTreeRootTests.vb +++ b/src/Compilers/VisualBasic/Test/Semantic/Semantics/SyntaxTreeRootTests.vb @@ -45,7 +45,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.UnitTests.Semantics Dim arbitraryTree = VisualBasicSyntaxTree.Create(SyntaxFactory.Attribute(SyntaxFactory.IdentifierName("Wooh"))) Dim parsedTree = VisualBasicSyntaxTree.ParseText("Class TheClass _ End Class") Assert.Throws(Of ArgumentException)(Function() VisualBasicCompilation.Create("Grrr", syntaxTrees:={arbitraryTree})) - Assert.Throws(Of ArgumentException)(Function() VisualBasicCompilation.CreateSubmission("Wah").AddSyntaxTrees(arbitraryTree)) + Assert.Throws(Of ArgumentException)(Function() VisualBasicCompilation.CreateScriptCompilation("Wah").AddSyntaxTrees(arbitraryTree)) Assert.Throws(Of ArgumentException)(Sub() VisualBasicCompilation.Create("Bah", syntaxTrees:={parsedTree}).ReplaceSyntaxTree(parsedTree, arbitraryTree)) 'FIXME: Assert.Throws(Of ArgumentException)(Function() VisualBasicCompilation.Create("Woo").GetSemanticModel(tree)) End Sub diff --git a/src/Compilers/VisualBasic/Test/Symbol/SymbolsTests/ExtensionMethods/ExtensionMethodTests.vb b/src/Compilers/VisualBasic/Test/Symbol/SymbolsTests/ExtensionMethods/ExtensionMethodTests.vb index c64dd7dcafeea0aab9a11d57aad7c2e3ac2610d1..be0f7d617035972d15e49d4fac75670510d1b7f7 100644 --- a/src/Compilers/VisualBasic/Test/Symbol/SymbolsTests/ExtensionMethods/ExtensionMethodTests.vb +++ b/src/Compilers/VisualBasic/Test/Symbol/SymbolsTests/ExtensionMethods/ExtensionMethodTests.vb @@ -2469,17 +2469,17 @@ End Function Dim o As New Object() ? o.G().F()" - Dim s0 = VisualBasicCompilation.CreateSubmission( + Dim s0 = VisualBasicCompilation.CreateScriptCompilation( "s0.dll", syntaxTree:=Parse(source0, TestOptions.Script), references:=references) s0.VerifyDiagnostics() Assert.True(s0.SourceAssembly.MightContainExtensionMethods) - - Dim s1 = VisualBasicCompilation.CreateSubmission( + + Dim s1 = VisualBasicCompilation.CreateScriptCompilation( "s1.dll", syntaxTree:=Parse(source1, TestOptions.Script), - previousSubmission:=s0, + previousScriptCompilation:=s0, references:=references) s1.VerifyDiagnostics() Assert.True(s1.SourceAssembly.MightContainExtensionMethods) diff --git a/src/Compilers/VisualBasic/Test/Symbol/SymbolsTests/SymbolErrorTests.vb b/src/Compilers/VisualBasic/Test/Symbol/SymbolsTests/SymbolErrorTests.vb index 5e6002233be1b474f779863af811958b58daba57..0f71a283e7b46f43e33b54b52b84181af8d62b35 100644 --- a/src/Compilers/VisualBasic/Test/Symbol/SymbolsTests/SymbolErrorTests.vb +++ b/src/Compilers/VisualBasic/Test/Symbol/SymbolsTests/SymbolErrorTests.vb @@ -23698,7 +23698,7 @@ Friend MustOverride ReadOnly Property P Friend MustOverride Function F() As Object Friend MustOverride ReadOnly Property P ]]> - Dim submission = VisualBasicCompilation.CreateSubmission( + Dim submission = VisualBasicCompilation.CreateScriptCompilation( "s0.dll", syntaxTree:=Parse(source.Value, TestOptions.Script), references:={MscorlibRef, SystemCoreRef}) diff --git a/src/EditorFeatures/Test2/FindReferences/FindReferencesTests.OrdinaryMethodSymbols.vb b/src/EditorFeatures/Test2/FindReferences/FindReferencesTests.OrdinaryMethodSymbols.vb index bd0b8b2690ae6ef9686aa94b4154ca45b8e551b9..cd465f605d87641b46c02567a9b63b24a4a889c6 100644 --- a/src/EditorFeatures/Test2/FindReferences/FindReferencesTests.OrdinaryMethodSymbols.vb +++ b/src/EditorFeatures/Test2/FindReferences/FindReferencesTests.OrdinaryMethodSymbols.vb @@ -891,7 +891,7 @@ Namespace Microsoft.CodeAnalysis.Editor.UnitTests.FindReferences End Sub - + Public Sub TestInaccessibleMemberOverrideCS() Dim workspace = diff --git a/src/Interactive/Features/Interactive/Core/InteractiveHost.Service.cs b/src/Interactive/Features/Interactive/Core/InteractiveHost.Service.cs index 92dc5efd9ccffbe7d82deed6ebd252690e0ab04a..0ad88845142dc055dc2cb1c7b303276d77473746 100644 --- a/src/Interactive/Features/Interactive/Core/InteractiveHost.Service.cs +++ b/src/Interactive/Features/Interactive/Core/InteractiveHost.Service.cs @@ -462,18 +462,9 @@ private async Task ExecuteAsync(Task lastTask, private void DisplaySubmissionResult(ScriptState state) { - bool hasValue; - var resultType = state.Script.GetCompilation().GetSubmissionResultType(out hasValue); - if (hasValue) + if (state.Script.HasReturnValue()) { - if (resultType != null && resultType.SpecialType == SpecialType.System_Void) - { - Console.Out.WriteLine(_replServiceProvider.ObjectFormatter.VoidDisplayString); - } - else - { - _globals.Print(state.ReturnValue); - } + _globals.Print(state.ReturnValue); } } @@ -761,14 +752,10 @@ private Script TryCompile(Script previousScript, string code, string pat script = _replServiceProvider.CreateScript(code, scriptOptions, _globals.GetType(), _assemblyLoader); } - // force build so exception is thrown now if errors are found. - try - { - script.Build(); - } - catch (CompilationErrorException e) + var diagnostics = script.Build(); + if (diagnostics.HasAnyErrors()) { - DisplayInteractiveErrors(e.Diagnostics, Console.Error); + DisplayInteractiveErrors(diagnostics, Console.Error); return null; } diff --git a/src/Interactive/HostTest/InteractiveHostTests.cs b/src/Interactive/HostTest/InteractiveHostTests.cs index 44e5b5ce26c802a36ec0683540bc5170fb4a46ef..5fe32a8acc8ece5bdd5b6806a03c8bfb5d7bedf9 100644 --- a/src/Interactive/HostTest/InteractiveHostTests.cs +++ b/src/Interactive/HostTest/InteractiveHostTests.cs @@ -996,7 +996,7 @@ public void SubmissionResult_PrintingVoid() Execute(@"System.Console.WriteLine(2)"); var output = ReadOutputToEnd(); - Assert.Equal("2\r\n\r\n", output); + Assert.Equal("2\r\n", output); Execute(@" void foo() { } @@ -1004,7 +1004,7 @@ public void SubmissionResult_PrintingVoid() "); output = ReadOutputToEnd(); - Assert.Equal("\r\n", output); + Assert.Equal("", output); } #endregion diff --git a/src/Scripting/CSharp/CSharpScriptCompiler.cs b/src/Scripting/CSharp/CSharpScriptCompiler.cs index d5c2479615e11e8bcee1a4779c9de8eb430e8654..95c2ec8a01e39bf2dab5ec8c6641fabff599109b 100644 --- a/src/Scripting/CSharp/CSharpScriptCompiler.cs +++ b/src/Scripting/CSharp/CSharpScriptCompiler.cs @@ -28,10 +28,10 @@ private CSharpScriptCompiler() public override Compilation CreateSubmission(Script script) { - Compilation previousSubmission = null; + CSharpCompilation previousSubmission = null; if (script.Previous != null) { - previousSubmission = script.Previous.GetCompilation(); + previousSubmission = (CSharpCompilation)script.Previous.GetCompilation(); } var diagnostics = DiagnosticBag.GetInstance(); @@ -45,7 +45,7 @@ public override Compilation CreateSubmission(Script script) string assemblyName, submissionTypeName; script.Builder.GenerateSubmissionId(out assemblyName, out submissionTypeName); - var compilation = CSharpCompilation.CreateSubmission( + var compilation = CSharpCompilation.CreateScriptCompilation( assemblyName, tree, references, diff --git a/src/Scripting/CSharpTest/CommandLineRunnerTests.cs b/src/Scripting/CSharpTest/CommandLineRunnerTests.cs index ba50d5cc4e2978f20ee75b2b87d4a471b53665a0..b955ce77f3515de7473d70cf5b2cd811a98bf42b 100644 --- a/src/Scripting/CSharpTest/CommandLineRunnerTests.cs +++ b/src/Scripting/CSharpTest/CommandLineRunnerTests.cs @@ -86,6 +86,27 @@ public void Await() > ", runner.Console.Out.ToString()); } + [Fact] + public void Void() + { + var runner = CreateRunner(input: +@"Print(1); +Print(2) +"); + runner.RunInteractive(); + + AssertEx.AssertEqualToleratingWhitespaceDifferences( +$@"Microsoft (R) Visual C# Interactive Compiler version {CompilerVersion} +Copyright (C) Microsoft Corporation. All rights reserved. + +Type ""#help"" for more information. +> Print(1); +1 +> Print(2) +2 +> ", runner.Console.Out.ToString()); + } + [Fact] public void Exception() { diff --git a/src/Scripting/Core/Hosting/CommandLine/CommandLineRunner.cs b/src/Scripting/Core/Hosting/CommandLine/CommandLineRunner.cs index 50696e0b9948b082e30f5b87ede17c3acf5a663a..e5a23f5376c998453a8203123406d662ebc47a1f 100644 --- a/src/Scripting/Core/Hosting/CommandLine/CommandLineRunner.cs +++ b/src/Scripting/Core/Hosting/CommandLine/CommandLineRunner.cs @@ -199,9 +199,7 @@ private void RunInteractiveLoop(ScriptOptions options, string initialScriptCodeO if (initialScriptCodeOpt != null) { var script = Script.CreateInitialScript(_scriptCompiler, initialScriptCodeOpt, options, globals.GetType(), assemblyLoaderOpt: null); - - Compilation compilation; - TryBuildAndRun(script, globals, ref state, out compilation, cancellationToken); + TryBuildAndRun(script, globals, ref state, cancellationToken); } while (true) @@ -259,42 +257,24 @@ private void RunInteractiveLoop(ScriptOptions options, string initialScriptCodeO newScript = state.Script.ContinueWith(code, options); } - Compilation newCompilation; - if (!TryBuildAndRun(newScript, globals, ref state, out newCompilation, cancellationToken)) + if (!TryBuildAndRun(newScript, globals, ref state, cancellationToken)) { continue; } - bool hasValue; - ITypeSymbol resultType = newCompilation.GetSubmissionResultType(out hasValue); - if (hasValue) + if (newScript.HasReturnValue()) { - if (resultType != null && resultType.SpecialType == SpecialType.System_Void) - { - _console.Out.WriteLine(_objectFormatter.VoidDisplayString); - } - else - { - globals.Print(state.ReturnValue); - } + globals.Print(state.ReturnValue); } } } - private bool TryBuildAndRun(Script newScript, object globals, ref ScriptState state, out Compilation newCompilation, CancellationToken cancellationToken) + private bool TryBuildAndRun(Script newScript, object globals, ref ScriptState state, CancellationToken cancellationToken) { - newCompilation = newScript.GetCompilation(); - - try - { - newScript.Build(cancellationToken); - - // display warnings: - DisplayDiagnostics(newCompilation.GetDiagnostics(cancellationToken).Where(d => d.Severity == DiagnosticSeverity.Warning)); - } - catch (CompilationErrorException e) + var diagnostics = newScript.Build(cancellationToken); + DisplayDiagnostics(diagnostics); + if (diagnostics.HasAnyErrors()) { - DisplayDiagnostics(e.Diagnostics.Where(d => d.Severity == DiagnosticSeverity.Error || d.Severity == DiagnosticSeverity.Warning)); return false; } diff --git a/src/Scripting/Core/PublicAPI.Unshipped.txt b/src/Scripting/Core/PublicAPI.Unshipped.txt index d5ad521d1855d7903e14440781154d976ddc1c6d..5f0a99b7728306a9519fd0073ab702dd983272a7 100644 --- a/src/Scripting/Core/PublicAPI.Unshipped.txt +++ b/src/Scripting/Core/PublicAPI.Unshipped.txt @@ -33,7 +33,7 @@ Microsoft.CodeAnalysis.Scripting.Hosting.ShadowCopy Microsoft.CodeAnalysis.Scripting.Hosting.ShadowCopy.FullPath.get -> string Microsoft.CodeAnalysis.Scripting.Hosting.ShadowCopy.OriginalPath.get -> string Microsoft.CodeAnalysis.Scripting.Script -Microsoft.CodeAnalysis.Scripting.Script.Build(System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> void +Microsoft.CodeAnalysis.Scripting.Script.Build(System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Collections.Immutable.ImmutableArray Microsoft.CodeAnalysis.Scripting.Script.Code.get -> string Microsoft.CodeAnalysis.Scripting.Script.ContinueWith(string code, Microsoft.CodeAnalysis.Scripting.ScriptOptions options = null) -> Microsoft.CodeAnalysis.Scripting.Script Microsoft.CodeAnalysis.Scripting.Script.ContinueWith(string code, Microsoft.CodeAnalysis.Scripting.ScriptOptions options = null) -> Microsoft.CodeAnalysis.Scripting.Script diff --git a/src/Scripting/Core/Script.cs b/src/Scripting/Core/Script.cs index 02c56dda33a5de0785e99c4b523ab0956ebb0c7b..a35c13eca9c273652633aa3cf4c7ff51aca316f8 100644 --- a/src/Scripting/Core/Script.cs +++ b/src/Scripting/Core/Script.cs @@ -165,10 +165,10 @@ public Compilation GetCompilation() /// Forces the script through the build step. /// If not called directly, the build step will occur on the first call to Run. /// - public void Build(CancellationToken cancellationToken = default(CancellationToken)) => + public ImmutableArray Build(CancellationToken cancellationToken = default(CancellationToken)) => CommonBuild(cancellationToken); - internal abstract void CommonBuild(CancellationToken cancellationToken); + internal abstract ImmutableArray CommonBuild(CancellationToken cancellationToken); internal abstract Func CommonGetExecutor(CancellationToken cancellationToken); /// @@ -235,6 +235,26 @@ public Compilation GetCompilation() references.Free(); } } + + // TODO: remove + internal bool HasReturnValue() + { + bool hasValue; + var resultType = GetCompilation().GetSubmissionResultType(out hasValue); + if (hasValue) + { + if (resultType != null && resultType.SpecialType == SpecialType.System_Void) + { + return false; + } + else + { + return true; + } + } + + return false; + } } public sealed class Script : Script @@ -268,12 +288,21 @@ public new Script WithGlobalsType(Type globalsType) internal override Script WithOptionsInternal(ScriptOptions options) => WithOptions(options); internal override Script WithCodeInternal(string code) => WithCode(code); internal override Script WithGlobalsTypeInternal(Type globalsType) => WithGlobalsType(globalsType); - - /// Compilation has errors. - internal override void CommonBuild(CancellationToken cancellationToken) + + internal override ImmutableArray CommonBuild(CancellationToken cancellationToken) { - GetPrecedingExecutors(cancellationToken); - GetExecutor(cancellationToken); + // TODO: avoid throwing exception, report all diagnostics https://github.com/dotnet/roslyn/issues/5949 + try + { + GetPrecedingExecutors(cancellationToken); + GetExecutor(cancellationToken); + + return ImmutableArray.CreateRange(GetCompilation().GetDiagnostics(cancellationToken).Where(d => d.Severity == DiagnosticSeverity.Warning)); + } + catch (CompilationErrorException e) + { + return ImmutableArray.CreateRange(e.Diagnostics.Where(d => d.Severity == DiagnosticSeverity.Error || d.Severity == DiagnosticSeverity.Warning)); + } } internal override Func CommonGetExecutor(CancellationToken cancellationToken) diff --git a/src/Scripting/Core/Scripting.csproj b/src/Scripting/Core/Scripting.csproj index 99a326496c2cda96b929c1bbb524fd7409f298d0..d1766bb272796612a8b9ae485485192bc2a59631 100644 --- a/src/Scripting/Core/Scripting.csproj +++ b/src/Scripting/Core/Scripting.csproj @@ -110,8 +110,8 @@ - + diff --git a/src/Scripting/VisualBasic/VisualBasicScriptCompiler.vb b/src/Scripting/VisualBasic/VisualBasicScriptCompiler.vb index f44ccbe5ee6fd28fd74aa5d7b34e2705cbcebdda..87bff13f471e510b8e30bb96b99128e3e0538bb9 100644 --- a/src/Scripting/VisualBasic/VisualBasicScriptCompiler.vb +++ b/src/Scripting/VisualBasic/VisualBasicScriptCompiler.vb @@ -46,9 +46,9 @@ Namespace Microsoft.CodeAnalysis.Scripting.VisualBasic End Function Public Overrides Function CreateSubmission(script As Script) As Compilation - Dim previousSubmission As Compilation = Nothing + Dim previousSubmission As VisualBasicCompilation = Nothing If script.Previous IsNot Nothing Then - previousSubmission = script.Previous.GetCompilation() + previousSubmission = DirectCast(script.Previous.GetCompilation(), VisualBasicCompilation) End If Dim diagnostics = DiagnosticBag.GetInstance() @@ -67,7 +67,7 @@ Namespace Microsoft.CodeAnalysis.Scripting.VisualBasic Dim globalImports = GetGlobalImportsForCompilation(script) - Dim submission = VisualBasicCompilation.CreateSubmission( + Dim submission = VisualBasicCompilation.CreateScriptCompilation( assemblyName, tree, references, diff --git a/src/Test/Utilities/Desktop/HostedRuntimeEnvironment.cs b/src/Test/Utilities/Desktop/HostedRuntimeEnvironment.cs index e35ec5c20d4aecf80de232b3083fea8c1c263a47..f9b5668466ad5c31a8cfed6112e6bdf89d8e6e7b 100644 --- a/src/Test/Utilities/Desktop/HostedRuntimeEnvironment.cs +++ b/src/Test/Utilities/Desktop/HostedRuntimeEnvironment.cs @@ -140,9 +140,10 @@ private static string DetectNameCollision(IEnumerable modules) internal static void EmitReferences(Compilation compilation, List dependencies, DiagnosticBag diagnostics) { - if (compilation.PreviousSubmission != null) + var previousSubmission = compilation.ScriptCompilationInfo?.PreviousScriptCompilation; + if (previousSubmission != null) { - EmitDependentCompilation(compilation.PreviousSubmission, dependencies, diagnostics); + EmitDependentCompilation(previousSubmission, dependencies, diagnostics); } foreach (MetadataReference r in compilation.References) diff --git a/src/Workspaces/CSharp/Portable/LanguageServices/CSharpCompilationFactoryService.cs b/src/Workspaces/CSharp/Portable/LanguageServices/CSharpCompilationFactoryService.cs index 324dd17b817ed8b088686c24eefe8dd785501774..9d0af82a8c730ea177347547bb94c6a4521601a3 100644 --- a/src/Workspaces/CSharp/Portable/LanguageServices/CSharpCompilationFactoryService.cs +++ b/src/Workspaces/CSharp/Portable/LanguageServices/CSharpCompilationFactoryService.cs @@ -22,11 +22,11 @@ Compilation ICompilationFactoryService.CreateCompilation(string assemblyName, Co Compilation ICompilationFactoryService.CreateSubmissionCompilation(string assemblyName, CompilationOptions options, Type hostObjectType) { - return CSharpCompilation.CreateSubmission( + return CSharpCompilation.CreateScriptCompilation( assemblyName, options: (CSharpCompilationOptions)options, - previousSubmission: null, - hostObjectType: hostObjectType); + previousScriptCompilation: null, + globalsType: hostObjectType); } Compilation ICompilationFactoryService.GetCompilationFromCompilationReference(MetadataReference reference) diff --git a/src/Workspaces/Core/Portable/FindSymbols/FindReferences/DependentProjectsFinder.cs b/src/Workspaces/Core/Portable/FindSymbols/FindReferences/DependentProjectsFinder.cs index 5ed7f85dc4eec239de9ad00ce0328ed9390e7adc..b92f7e9d8a06a5f1637504fc15191cfe6097a6e3 100644 --- a/src/Workspaces/Core/Portable/FindSymbols/FindReferences/DependentProjectsFinder.cs +++ b/src/Workspaces/Core/Portable/FindSymbols/FindReferences/DependentProjectsFinder.cs @@ -238,9 +238,11 @@ private static async Task AddSubmissionDependentProjectsAsync(Solution solution, // If we are referencing another project, store the link in the other direction // so we walk across it later var compilation = await project.GetCompilationAsync(cancellationToken).ConfigureAwait(false); - if (compilation.PreviousSubmission != null) + var previous = compilation.ScriptCompilationInfo.PreviousScriptCompilation; + + if (previous != null) { - var referencedProject = solution.GetProject(compilation.PreviousSubmission.Assembly, cancellationToken); + var referencedProject = solution.GetProject(previous.Assembly, cancellationToken); List referencingSubmissions = null; if (!projectIdsToReferencingSubmissionIds.TryGetValue(referencedProject.Id, out referencingSubmissions)) diff --git a/src/Workspaces/Core/Portable/Workspace/Solution/Solution.CompilationTracker.cs b/src/Workspaces/Core/Portable/Workspace/Solution/Solution.CompilationTracker.cs index 485898f1a87d214465560140b91db39e7df4f33d..4b834a27854b07854de66541ec249598f9e18b8b 100644 --- a/src/Workspaces/Core/Portable/Workspace/Solution/Solution.CompilationTracker.cs +++ b/src/Workspaces/Core/Portable/Workspace/Solution/Solution.CompilationTracker.cs @@ -250,7 +250,7 @@ public CompilationTracker FreezePartialStateWithTree(Solution solution, Document if (referencedProject.IsSubmission) { var compilation = solution.GetCompilationAsync(projectReference.ProjectId, cancellationToken).WaitAndGetResult(cancellationToken); - inProgressCompilation = inProgressCompilation.WithPreviousSubmission(compilation); + inProgressCompilation = inProgressCompilation.WithCompilationScriptInfo(inProgressCompilation.ScriptCompilationInfo.WithPreviousScriptCompilation(compilation)); } else { @@ -591,7 +591,9 @@ private Compilation CreateEmptyCompilation() var previousSubmissionCompilation = await solution.GetCompilationAsync(projectReference.ProjectId, cancellationToken).ConfigureAwait(false); - compilation = compilation.WithPreviousSubmission(previousSubmissionCompilation); + + compilation = compilation.WithCompilationScriptInfo( + compilation.ScriptCompilationInfo.WithPreviousScriptCompilation(previousSubmissionCompilation)); } else { diff --git a/src/Workspaces/VisualBasic/Portable/LanguageServices/VisualBasicCompilationFactoryService.vb b/src/Workspaces/VisualBasic/Portable/LanguageServices/VisualBasicCompilationFactoryService.vb index 515449fb9e316c4d4e5be0ba1b11b77b3021724b..babfadaf1b0749ee70009c900188c7eda8b933d5 100644 --- a/src/Workspaces/VisualBasic/Portable/LanguageServices/VisualBasicCompilationFactoryService.vb +++ b/src/Workspaces/VisualBasic/Portable/LanguageServices/VisualBasicCompilationFactoryService.vb @@ -26,10 +26,12 @@ Namespace Microsoft.CodeAnalysis.VisualBasic options As CompilationOptions, hostObjectType As Type) As Compilation Implements ICompilationFactoryService.CreateSubmissionCompilation - Return VisualBasicCompilation.CreateSubmission( - assemblyName, - options:=DirectCast(options, VisualBasicCompilationOptions), - hostObjectType:=hostObjectType) + Throw New NotImplementedException() + ' https://github.com/dotnet/roslyn/issues/5944 + 'Return VisualBasicCompilation.CreateScriptCompilation( + ' assemblyName, + ' options:=DirectCast(options, VisualBasicCompilationOptions), + ' globalsType:=hostObjectType) End Function Private Function ICompilationFactoryService_GetCompilationFromCompilationReference(reference As MetadataReference) As Compilation Implements ICompilationFactoryService.GetCompilationFromCompilationReference