| File: CSharpScriptCompiler.cs | Web Access |
| Project: src\roslyn\src\Scripting\CSharp\Microsoft.CodeAnalysis.CSharp.Scripting.csproj (Microsoft.CodeAnalysis.CSharp.Scripting) |
// Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. // See the LICENSE file in the project root for more information. #nullable disable using System; using System.Threading; using Microsoft.CodeAnalysis.Scripting; using Microsoft.CodeAnalysis.Text; namespace Microsoft.CodeAnalysis.CSharp.Scripting { internal sealed class CSharpScriptCompiler : ScriptCompiler { public static readonly ScriptCompiler Instance = new CSharpScriptCompiler(); internal static readonly CSharpParseOptions DefaultParseOptions = new CSharpParseOptions(kind: SourceCodeKind.Script, languageVersion: LanguageVersion.Latest); private CSharpScriptCompiler() { } public override DiagnosticFormatter DiagnosticFormatter => CSharpDiagnosticFormatter.Instance; public override StringComparer IdentifierComparer => StringComparer.Ordinal; public override bool IsCompleteSubmission(SyntaxTree tree) => SyntaxFactory.IsCompleteSubmission(tree); public override SyntaxTree ParseSubmission(SourceText text, ParseOptions parseOptions, CancellationToken cancellationToken) => SyntaxFactory.ParseSyntaxTree(text, parseOptions ?? DefaultParseOptions, cancellationToken: cancellationToken); public override Compilation CreateSubmission(Script script) { CSharpCompilation previousSubmission = null; if (script.Previous != null) { previousSubmission = (CSharpCompilation)script.Previous.GetCompilation(); } var diagnostics = DiagnosticBag.GetInstance(); var references = script.GetReferencesForCompilation(MessageProvider.Instance, diagnostics); // TODO: report diagnostics diagnostics.Free(); var tree = SyntaxFactory.ParseSyntaxTree(script.SourceText, script.Options.ParseOptions ?? DefaultParseOptions, script.Options.FilePath); string assemblyName, submissionTypeName; script.Builder.GenerateSubmissionId(out assemblyName, out submissionTypeName); var compilation = CSharpCompilation.CreateScriptCompilation( assemblyName, tree, references, WithTopLevelBinderFlags(new CSharpCompilationOptions( outputKind: OutputKind.DynamicallyLinkedLibrary, mainTypeName: null, scriptClassName: submissionTypeName, usings: script.Options.Imports, optimizationLevel: script.Options.OptimizationLevel, checkOverflow: script.Options.CheckOverflow, allowUnsafe: script.Options.AllowUnsafe, platform: Platform.AnyCpu, warningLevel: script.Options.WarningLevel, xmlReferenceResolver: null, // don't support XML file references in interactive (permissions & doc comment includes) sourceReferenceResolver: script.Options.SourceResolver, metadataReferenceResolver: script.Options.MetadataResolver, assemblyIdentityComparer: DesktopAssemblyIdentityComparer.Default )), previousSubmission, script.ReturnType, script.GlobalsType ); return compilation; } internal static CSharpCompilationOptions WithTopLevelBinderFlags(CSharpCompilationOptions options) => options.WithTopLevelBinderFlags(BinderFlags.IgnoreCorLibraryDuplicatedTypes); } }