| File: VisualBasicCompilationFactory.cs | Web Access |
| Project: src\roslyn\src\Compilers\Core\Rebuild\Microsoft.CodeAnalysis.Rebuild.csproj (Microsoft.CodeAnalysis.Rebuild) |
// 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. using System; using System.Collections.Generic; using System.Collections.Immutable; using System.Diagnostics; using System.IO; using System.Linq; using Microsoft.Cci; using Microsoft.CodeAnalysis; using Microsoft.CodeAnalysis.Debugging; using Microsoft.CodeAnalysis.Text; using Microsoft.CodeAnalysis.VisualBasic; using Roslyn.Utilities; using VB = Microsoft.CodeAnalysis.VisualBasic; namespace Microsoft.CodeAnalysis.Rebuild { public sealed class VisualBasicCompilationFactory : CompilationFactory { public new VisualBasicCompilationOptions CompilationOptions { get; } public new VisualBasicParseOptions ParseOptions => CompilationOptions.ParseOptions; protected override ParseOptions CommonParseOptions => ParseOptions; protected override CompilationOptions CommonCompilationOptions => CompilationOptions; private VisualBasicCompilationFactory( string assemblyFileName, CompilationOptionsReader optionsReader, VisualBasicCompilationOptions compilationOptions) : base(assemblyFileName, optionsReader) { CompilationOptions = compilationOptions; } internal static new VisualBasicCompilationFactory Create(string assemblyFileName, CompilationOptionsReader optionsReader) { Debug.Assert(optionsReader.GetLanguageName() == LanguageNames.VisualBasic); var compilationOptions = CreateVisualBasicCompilationOptions(assemblyFileName, optionsReader); return new VisualBasicCompilationFactory(assemblyFileName, optionsReader, compilationOptions); } public override SyntaxTree CreateSyntaxTree(string filePath, SourceText sourceText) => VisualBasicSyntaxTree.ParseText(sourceText, ParseOptions, filePath); public override Compilation CreateCompilation( ImmutableArray<SyntaxTree> syntaxTrees, ImmutableArray<MetadataReference> metadataReferences) => VisualBasicCompilation.Create( Path.GetFileNameWithoutExtension(AssemblyFileName), syntaxTrees: syntaxTrees, references: metadataReferences, options: CompilationOptions); private static VisualBasicCompilationOptions CreateVisualBasicCompilationOptions(string assemblyFileName, CompilationOptionsReader optionsReader) { var pdbOptions = optionsReader.GetMetadataCompilationOptions(); var langVersionString = pdbOptions.GetUniqueOption(CompilationOptionNames.LanguageVersion); pdbOptions.TryGetUniqueOption(CompilationOptionNames.Optimization, out var optimization); pdbOptions.TryGetUniqueOption(CompilationOptionNames.Platform, out var platform); pdbOptions.TryGetUniqueOption(CompilationOptionNames.GlobalNamespaces, out var globalNamespacesString); IEnumerable<GlobalImport>? globalImports = null; if (!string.IsNullOrEmpty(globalNamespacesString)) { globalImports = GlobalImport.Parse(globalNamespacesString.Split(';')); } VB.LanguageVersion langVersion = default; VB.LanguageVersionFacts.TryParse(langVersionString, ref langVersion); IReadOnlyDictionary<string, object>? preprocessorSymbols = null; if (pdbOptions.OptionToString(CompilationOptionNames.Define) is string defineString) { preprocessorSymbols = VisualBasicCommandLineParser.ParseConditionalCompilationSymbols(defineString, out var diagnostics); var diagnostic = diagnostics?.FirstOrDefault(x => x.IsUnsuppressedError); if (diagnostic is object) { throw new Exception(string.Format(RebuildResources.Cannot_create_compilation_options_0, diagnostic)); } } var parseOptions = VisualBasicParseOptions .Default .WithLanguageVersion(langVersion) .WithPreprocessorSymbols(preprocessorSymbols.ToImmutableArrayOrEmpty()); var (optimizationLevel, plus) = GetOptimizationLevel(optimization); var isChecked = pdbOptions.OptionToBool(CompilationOptionNames.Checked) ?? true; var embedVBRuntime = pdbOptions.OptionToBool(CompilationOptionNames.EmbedRuntime) ?? false; var rootNamespace = pdbOptions.OptionToString(CompilationOptionNames.RootNamespace); var compilationOptions = new VisualBasicCompilationOptions( pdbOptions.OptionToEnum<OutputKind>(CompilationOptionNames.OutputKind) ?? OutputKind.DynamicallyLinkedLibrary, moduleName: assemblyFileName, mainTypeName: optionsReader.GetMainTypeName(), scriptClassName: "Script", globalImports: globalImports, rootNamespace: rootNamespace, optionStrict: pdbOptions.OptionToEnum<OptionStrict>(CompilationOptionNames.OptionStrict) ?? OptionStrict.Off, optionInfer: pdbOptions.OptionToBool(CompilationOptionNames.OptionInfer) ?? false, optionExplicit: pdbOptions.OptionToBool(CompilationOptionNames.OptionExplicit) ?? false, optionCompareText: pdbOptions.OptionToBool(CompilationOptionNames.OptionCompareText) ?? false, parseOptions: parseOptions, embedVbCoreRuntime: embedVBRuntime, optimizationLevel: optimizationLevel, checkOverflow: isChecked, cryptoKeyContainer: null, cryptoKeyFile: null, cryptoPublicKey: optionsReader.GetPublicKey()?.ToImmutableArray() ?? default, delaySign: null, platform: GetPlatform(platform), generalDiagnosticOption: ReportDiagnostic.Default, specificDiagnosticOptions: null, concurrentBuild: true, deterministic: true, xmlReferenceResolver: null, sourceReferenceResolver: RebuildSourceReferenceResolver.Instance, metadataReferenceResolver: null, assemblyIdentityComparer: null, strongNameProvider: null, publicSign: false, reportSuppressedDiagnostics: false, metadataImportOptions: MetadataImportOptions.Public); compilationOptions.DebugPlusMode = plus; return compilationOptions; } } }