Пример #1
0
 private VisualBasicCompilationFactory(
     string assemblyFileName,
     CompilationOptionsReader optionsReader,
     VisualBasicCompilationOptions compilationOptions
     ) : base(assemblyFileName, optionsReader)
 {
     CompilationOptions = compilationOptions;
 }
Пример #2
0
 protected CompilationFactory(
     string assemblyFileName,
     CompilationOptionsReader optionsReader
     )
 {
     AssemblyFileName = assemblyFileName;
     OptionsReader    = optionsReader;
 }
 private CSharpCompilationFactory(
     string assemblyFileName,
     CompilationOptionsReader optionsReader,
     CSharpParseOptions parseOptions,
     CSharpCompilationOptions compilationOptions)
     : base(assemblyFileName, optionsReader)
 {
     Debug.Assert(optionsReader.GetLanguageName() == LanguageNames.CSharp);
     ParseOptions       = parseOptions;
     CompilationOptions = compilationOptions;
 }
Пример #4
0
        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
                       ));
        }
Пример #5
0
 internal static new CSharpCompilationFactory Create(
     string assemblyFileName,
     CompilationOptionsReader optionsReader
     )
 {
     Debug.Assert(optionsReader.GetLanguageName() == LanguageNames.CSharp);
     var(compilationOptions, parseOptions) = CreateCSharpCompilationOptions(
         assemblyFileName,
         optionsReader
         );
     return(new CSharpCompilationFactory(
                assemblyFileName,
                optionsReader,
                parseOptions,
                compilationOptions
                ));
 }
Пример #6
0
 public static CompilationFactory Create(string assemblyFileName, CompilationOptionsReader optionsReader)
 => optionsReader.GetLanguageName() switch
 {
Пример #7
0
        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($"Cannot create compilation options: {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: null,
                metadataReferenceResolver: null,
                assemblyIdentityComparer: null,
                strongNameProvider: null,
                publicSign: false,
                reportSuppressedDiagnostics: false,
                metadataImportOptions: MetadataImportOptions.Public
                );

            compilationOptions.DebugPlusMode = plus;

            return(compilationOptions);
        }
        private static (CSharpCompilationOptions, CSharpParseOptions) CreateCSharpCompilationOptions(string assemblyFileName, CompilationOptionsReader optionsReader)
        {
            var pdbCompilationOptions = optionsReader.GetMetadataCompilationOptions();

            var langVersionString = pdbCompilationOptions.GetUniqueOption(CompilationOptionNames.LanguageVersion);

            pdbCompilationOptions.TryGetUniqueOption(CompilationOptionNames.Optimization, out var optimization);
            pdbCompilationOptions.TryGetUniqueOption(CompilationOptionNames.Platform, out var platform);

            // TODO: Check portability policy if needed
            // pdbCompilationOptions.TryGetValue("portability-policy", out var portabilityPolicyString);
            pdbCompilationOptions.TryGetUniqueOption(CompilationOptionNames.Define, out var define);
            pdbCompilationOptions.TryGetUniqueOption(CompilationOptionNames.Checked, out var checkedString);
            pdbCompilationOptions.TryGetUniqueOption(CompilationOptionNames.Nullable, out var nullable);
            pdbCompilationOptions.TryGetUniqueOption(CompilationOptionNames.Unsafe, out var unsafeString);

            CS.LanguageVersionFacts.TryParse(langVersionString, out var langVersion);

            var preprocessorSymbols = define == null
                ? ImmutableArray <string> .Empty
                : define.Split(',').ToImmutableArray();

            var parseOptions = CSharpParseOptions.Default.WithLanguageVersion(langVersion)
                               .WithPreprocessorSymbols(preprocessorSymbols);

            var(optimizationLevel, plus) = GetOptimizationLevel(optimization);

            var nullableOptions = nullable is null
                ? NullableContextOptions.Disable
                : (NullableContextOptions)Enum.Parse(typeof(NullableContextOptions), nullable);

            var compilationOptions = new CSharpCompilationOptions(
                optionsReader.GetOutputKind(),
                reportSuppressedDiagnostics: false,

                moduleName: assemblyFileName,
                mainTypeName: optionsReader.GetMainTypeName(),
                scriptClassName: null,
                usings: null,
                optimizationLevel,
                !string.IsNullOrEmpty(checkedString) && bool.Parse(checkedString),
                !string.IsNullOrEmpty(unsafeString) && bool.Parse(unsafeString),
                cryptoKeyContainer: null,
                cryptoKeyFile: null,
                cryptoPublicKey: optionsReader.GetPublicKey()?.ToImmutableArray() ?? default,
                delaySign: null,
                GetPlatform(platform),

                // presence of diagnostics is expected to not affect emit.
                ReportDiagnostic.Suppress,
                warningLevel: 4,
                specificDiagnosticOptions: null,

                concurrentBuild: true,
                deterministic: true,

                xmlReferenceResolver: null,
                sourceReferenceResolver: null,
                metadataReferenceResolver: null,

                assemblyIdentityComparer: null,
                strongNameProvider: null,
                publicSign: false,

                metadataImportOptions: MetadataImportOptions.Public,
                nullableContextOptions: nullableOptions);

            compilationOptions.DebugPlusMode = plus;

            return(compilationOptions, parseOptions);
        }