private static (CSharpCompilationOptions, CSharpParseOptions, Encoding) CreateCSharpCompilationOptions(CompilationOptionsReader pdbReader) { var pdbCompilationOptions = pdbReader.GetCompilationOptions(); var langVersionString = pdbCompilationOptions.GetUniqueOption("language-version"); var optimization = pdbCompilationOptions.GetUniqueOption("optimization"); // TODO: Check portability policy if needed // pdbCompilationOptions.TryGetValue("portability-policy", out var portabilityPolicyString); pdbCompilationOptions.TryGetUniqueOption("default-encoding", out var defaultEncoding); pdbCompilationOptions.TryGetUniqueOption("fallback-encoding", out var fallbackEncoding); pdbCompilationOptions.TryGetUniqueOption("define", out var define); pdbCompilationOptions.TryGetUniqueOption("checked", out var checkedString); pdbCompilationOptions.TryGetUniqueOption("nullable", out var nullable); pdbCompilationOptions.TryGetUniqueOption("unsafe", out var unsafeString); var encodingString = defaultEncoding ?? fallbackEncoding; var encoding = encodingString is null ? Encoding.UTF8 : Encoding.GetEncoding(encodingString); 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, _) = GetOptimizationLevel(optimization); var nullableOptions = nullable is null ? NullableContextOptions.Disable : (NullableContextOptions)Enum.Parse(typeof(NullableContextOptions), nullable); var compilationOptions = new CSharpCompilationOptions( pdbReader.GetOutputKind(), reportSuppressedDiagnostics: false, moduleName: null, mainTypeName: null, scriptClassName: null, usings: null, optimizationLevel, !string.IsNullOrEmpty(checkedString) && bool.Parse(checkedString), !string.IsNullOrEmpty(unsafeString) && bool.Parse(unsafeString), cryptoKeyContainer: null, cryptoKeyFile: null, cryptoPublicKey: default,
public Compilation CreateCompilation(MetadataReader metadataReader, string name) { var pdbReader = new CompilationOptionsReader(metadataReader); var pdbCompilationOptions = pdbReader.GetCompilationOptions(); if (pdbCompilationOptions.Length == 0) { throw new InvalidDataException("Did not find compilation options in pdb"); } if (pdbCompilationOptions.TryGetUniqueOption("language", out var language)) { var compilation = language switch { LanguageNames.CSharp => CreateCSharpCompilation(pdbReader, name), LanguageNames.VisualBasic => CreateVisualBasicCompilation(pdbReader, name), _ => throw new InvalidDataException($"{language} is not a known language") }; return(compilation); } throw new InvalidDataException("Did not find language in compilation options"); }