public static ImmutableDictionary <string, ReportDiagnostic> GetDiagnosticOptions(this ProjectFileInfo projectFileInfo) { var defaultSuppressions = CompilationOptionsHelper.GetDefaultSuppressedDiagnosticOptions(projectFileInfo.SuppressedDiagnosticIds); var specificRules = projectFileInfo.RuleSet?.SpecificDiagnosticOptions ?? ImmutableDictionary <string, ReportDiagnostic> .Empty; return(specificRules.Concat(defaultSuppressions.Where(x => !specificRules.Keys.Contains(x.Key))).ToImmutableDictionary()); }
private CSharpCompilationOptions CreateCompilationOptions() { var compilationOptions = new CSharpCompilationOptions( OutputKind.DynamicallyLinkedLibrary, usings: DefaultNamespaces, allowUnsafe: true, metadataReferenceResolver: CreateMetadataReferenceResolver(), sourceReferenceResolver: ScriptSourceResolver.Default, assemblyIdentityComparer: DesktopAssemblyIdentityComparer.Default). WithSpecificDiagnosticOptions(CompilationOptionsHelper.GetDefaultSuppressedDiagnosticOptions()); var topLevelBinderFlagsProperty = typeof(CSharpCompilationOptions).GetProperty(TopLevelBinderFlagsProperty, BindingFlags.Instance | BindingFlags.NonPublic); var binderFlagsType = typeof(CSharpCompilationOptions).GetTypeInfo().Assembly.GetType(BinderFlagsType); var ignoreCorLibraryDuplicatedTypesMember = binderFlagsType?.GetField(IgnoreCorLibraryDuplicatedTypesField, BindingFlags.Static | BindingFlags.Public); var ignoreCorLibraryDuplicatedTypesValue = ignoreCorLibraryDuplicatedTypesMember?.GetValue(null); if (ignoreCorLibraryDuplicatedTypesValue != null) { topLevelBinderFlagsProperty?.SetValue(compilationOptions, ignoreCorLibraryDuplicatedTypesValue); } // in scripts, the option to supersede lower versions is ALWAYS enabled // see: https://github.com/dotnet/roslyn/blob/version-2.6.0-beta3/src/Compilers/CSharp/Portable/Compilation/CSharpCompilation.cs#L199 var referencesSupersedeLowerVersionsProperty = typeof(CompilationOptions).GetProperty(ReferencesSupersedeLowerVersionsProperty, BindingFlags.Instance | BindingFlags.NonPublic); referencesSupersedeLowerVersionsProperty?.SetValue(compilationOptions, true); return(compilationOptions); }
public static ImmutableDictionary <string, ReportDiagnostic> GetDiagnosticOptions(this ProjectFileInfo projectFileInfo) { var suppressions = CompilationOptionsHelper.GetDefaultSuppressedDiagnosticOptions(projectFileInfo.SuppressedDiagnosticIds); var specificRules = projectFileInfo.RuleSet?.SpecificDiagnosticOptions ?? ImmutableDictionary <string, ReportDiagnostic> .Empty; // suppressions capture NoWarn and they have the highest priority var combinedRules = specificRules.Concat(suppressions.Where(x => !specificRules.Keys.Contains(x.Key))).ToDictionary(x => x.Key, x => x.Value); // then handle WarningsAsErrors foreach (var warningAsError in projectFileInfo.WarningsAsErrors) { if (!suppressions.ContainsKey(warningAsError)) { combinedRules[warningAsError] = ReportDiagnostic.Error; } } // WarningsNotAsErrors can overwrite WarningsAsErrors foreach (var warningNotAsError in projectFileInfo.WarningsNotAsErrors) { if (!suppressions.ContainsKey(warningNotAsError)) { combinedRules[warningNotAsError] = ReportDiagnostic.Warn; } } return(combinedRules.ToImmutableDictionary()); }
public static CSharpCompilationOptions CreateCompilationOptions(this ProjectFileInfo projectFileInfo) { var result = new CSharpCompilationOptions(projectFileInfo.OutputKind); result = result.WithAssemblyIdentityComparer(DesktopAssemblyIdentityComparer.Default); if (projectFileInfo.AllowUnsafeCode) { result = result.WithAllowUnsafe(true); } result = result.WithSpecificDiagnosticOptions(CompilationOptionsHelper.GetDefaultSuppressedDiagnosticOptions(projectFileInfo.SuppressedDiagnosticIds)); if (projectFileInfo.SignAssembly && !string.IsNullOrEmpty(projectFileInfo.AssemblyOriginatorKeyFile)) { var keyFile = Path.Combine(projectFileInfo.Directory, projectFileInfo.AssemblyOriginatorKeyFile); result = result.WithStrongNameProvider(new DesktopStrongNameProvider()) .WithCryptoKeyFile(keyFile); } if (!string.IsNullOrWhiteSpace(projectFileInfo.DocumentationFile)) { result = result.WithXmlReferenceResolver(XmlFileResolver.Default); } return(result); }
private CSharpCompilationOptions CreateCompilationOptions() { var compilationOptions = new CSharpCompilationOptions( OutputKind.DynamicallyLinkedLibrary, usings: DefaultNamespaces, allowUnsafe: true, metadataReferenceResolver: CreateMetadataReferenceResolver(), sourceReferenceResolver: ScriptSourceResolver.Default, assemblyIdentityComparer: DesktopAssemblyIdentityComparer.Default). WithSpecificDiagnosticOptions(CompilationOptionsHelper.GetDefaultSuppressedDiagnosticOptions()); var topLevelBinderFlagsProperty = typeof(CSharpCompilationOptions).GetProperty(TopLevelBinderFlagsProperty, BindingFlags.Instance | BindingFlags.NonPublic); var binderFlagsType = typeof(CSharpCompilationOptions).GetTypeInfo().Assembly.GetType(BinderFlagsType); var ignoreCorLibraryDuplicatedTypesMember = binderFlagsType?.GetField(IgnoreCorLibraryDuplicatedTypesField, BindingFlags.Static | BindingFlags.Public); var ignoreCorLibraryDuplicatedTypesValue = ignoreCorLibraryDuplicatedTypesMember?.GetValue(null); if (ignoreCorLibraryDuplicatedTypesValue != null) { topLevelBinderFlagsProperty?.SetValue(compilationOptions, ignoreCorLibraryDuplicatedTypesValue); } return(compilationOptions); }
private CSharpCompilationOptions CreateCompilationOptions() { var csharpCommandLineArguments = _commandLineArgs.Value; // if RSP file was used, pick namespaces from there // otherwise use default set of namespaces var compilationOptions = new CSharpCompilationOptions(OutputKind.DynamicallyLinkedLibrary, usings: csharpCommandLineArguments != null ? csharpCommandLineArguments.CompilationOptions.Usings : DefaultNamespaces); foreach (var ns in compilationOptions.Usings) { _logger.LogDebug($"CSX global using statement: {ns}"); } if (csharpCommandLineArguments != null) { foreach (var error in csharpCommandLineArguments.Errors) { _logger.LogError($"CSX RSP parse error. {error.GetMessage()}"); } } var metadataReferenceResolver = CreateMetadataReferenceResolver(csharpCommandLineArguments?.ReferencePaths); var sourceResolver = CreateScriptSourceResolver(csharpCommandLineArguments?.SourcePaths); compilationOptions = compilationOptions .WithAllowUnsafe(true) .WithMetadataReferenceResolver(metadataReferenceResolver) .WithSourceReferenceResolver(sourceResolver) .WithAssemblyIdentityComparer(DesktopAssemblyIdentityComparer.Default) .WithSpecificDiagnosticOptions(!_scriptOptions.IsNugetEnabled() ? CompilationOptionsHelper.GetDefaultSuppressedDiagnosticOptions() : CompilationOptionsHelper.GetDefaultSuppressedDiagnosticOptions(_scriptOptions.NullableDiagnostics)); // for .NET Core 3.0 dotnet-script use extra nullable diagnostics var topLevelBinderFlagsProperty = typeof(CSharpCompilationOptions).GetProperty(TopLevelBinderFlagsProperty, BindingFlags.Instance | BindingFlags.NonPublic); var binderFlagsType = typeof(CSharpCompilationOptions).GetTypeInfo().Assembly.GetType(BinderFlagsType); var ignoreCorLibraryDuplicatedTypesMember = binderFlagsType?.GetField(IgnoreCorLibraryDuplicatedTypesField, BindingFlags.Static | BindingFlags.Public); var ignoreCorLibraryDuplicatedTypesValue = ignoreCorLibraryDuplicatedTypesMember?.GetValue(null); if (ignoreCorLibraryDuplicatedTypesValue != null) { topLevelBinderFlagsProperty?.SetValue(compilationOptions, ignoreCorLibraryDuplicatedTypesValue); } // in scripts, the option to supersede lower versions is ALWAYS enabled // see: https://github.com/dotnet/roslyn/blob/version-2.6.0-beta3/src/Compilers/CSharp/Portable/Compilation/CSharpCompilation.cs#L199 var referencesSupersedeLowerVersionsProperty = typeof(CompilationOptions).GetProperty(ReferencesSupersedeLowerVersionsProperty, BindingFlags.Instance | BindingFlags.NonPublic); referencesSupersedeLowerVersionsProperty?.SetValue(compilationOptions, true); return(compilationOptions); }
private void UpdateCompilationOption(ProjectState state) { var context = state.ProjectContext; var project = context.ProjectFile; var option = project.GetCompilerOptions(context.TargetFramework, CompilationConfiguration); var outputKind = option.EmitEntryPoint.GetValueOrDefault() ? OutputKind.ConsoleApplication : OutputKind.DynamicallyLinkedLibrary; var generalDiagnosticOpt = (option.WarningsAsErrors ?? false) ? ReportDiagnostic.Error : ReportDiagnostic.Default; var optimize = (option.Optimize ?? false) ? OptimizationLevel.Release : OptimizationLevel.Debug; var csharpOptions = new CSharpCompilationOptions(outputKind) .WithAssemblyIdentityComparer(DesktopAssemblyIdentityComparer.Default) .WithAllowUnsafe(option.AllowUnsafe ?? false) .WithPlatform(ParsePlatfrom(option.Platform)) .WithGeneralDiagnosticOption(generalDiagnosticOpt) .WithOptimizationLevel(optimize) .WithSpecificDiagnosticOptions(CompilationOptionsHelper.GetDefaultSuppressedDiagnosticOptions(option.SuppressWarnings)) .WithConcurrentBuild(false); // TODO: actually just need to disable on mono if (!string.IsNullOrEmpty(option.KeyFile)) { var cryptoKeyFile = Path.GetFullPath(Path.Combine(project.ProjectDirectory, option.KeyFile)); if (File.Exists(cryptoKeyFile)) { var strongNameProvider = new DesktopStrongNameProvider(ImmutableArray.Create(project.ProjectDirectory)); csharpOptions = csharpOptions .WithStrongNameProvider(strongNameProvider) .WithCryptoPublicKey(SnkUtils.ExtractPublicKey(File.ReadAllBytes(cryptoKeyFile))); } } var parseOptions = new CSharpParseOptions(languageVersion: ParseLanguageVersion(option.LanguageVersion), preprocessorSymbols: option.Defines); if (option.GenerateXmlDocumentation ?? false) { csharpOptions = csharpOptions.WithXmlReferenceResolver(XmlFileResolver.Default); parseOptions = parseOptions.WithDocumentationMode(DocumentationMode.Diagnose); } _workspace.SetCompilationOptions(state.Id, csharpOptions); _workspace.SetParseOptions(state.Id, parseOptions); }
public static ImmutableDictionary <string, ReportDiagnostic> GetDiagnosticOptions(this ProjectFileInfo projectFileInfo) { var suppressions = CompilationOptionsHelper.GetDefaultSuppressedDiagnosticOptions(projectFileInfo.SuppressedDiagnosticIds); var specificRules = projectFileInfo.RuleSet?.SpecificDiagnosticOptions ?? ImmutableDictionary <string, ReportDiagnostic> .Empty; // suppressions capture NoWarn and they have the highest priority var combinedRules = specificRules.Concat(suppressions.Where(x => !specificRules.ContainsKey(x.Key))).ToDictionary(x => x.Key, x => x.Value); // then handle WarningsAsErrors foreach (var warningAsError in projectFileInfo.WarningsAsErrors) { if (string.Equals(warningAsError, "nullable", StringComparison.OrdinalIgnoreCase)) { foreach (var id in Errors.NullableWarnings) { AddIfNotSuppressed(id, ReportDiagnostic.Error); } } else { AddIfNotSuppressed(warningAsError, ReportDiagnostic.Error); } } // WarningsNotAsErrors can overwrite WarningsAsErrors foreach (var warningNotAsError in projectFileInfo.WarningsNotAsErrors) { AddIfNotSuppressed(warningNotAsError, ReportDiagnostic.Warn); } return(combinedRules.ToImmutableDictionary()); void AddIfNotSuppressed(string code, ReportDiagnostic diagnostic) { if (!suppressions.ContainsKey(code)) { combinedRules[code] = diagnostic; } } }
public static CSharpCompilationOptions CreateCompilationOptions(this ProjectFileInfo projectFileInfo) { var compilationOptions = new CSharpCompilationOptions(projectFileInfo.OutputKind); compilationOptions = compilationOptions.WithAssemblyIdentityComparer(DesktopAssemblyIdentityComparer.Default); if (projectFileInfo.AllowUnsafeCode) { compilationOptions = compilationOptions.WithAllowUnsafe(true).WithGeneralDiagnosticOption(ReportDiagnostic.Error); } if (projectFileInfo.TreatWarningsAsErrors) { compilationOptions = compilationOptions.WithGeneralDiagnosticOption(ReportDiagnostic.Error); } if (projectFileInfo.NullableContextOptions != compilationOptions.NullableContextOptions) { compilationOptions = compilationOptions.WithNullableContextOptions(projectFileInfo.NullableContextOptions); } compilationOptions = compilationOptions.WithSpecificDiagnosticOptions(CompilationOptionsHelper.GetDefaultSuppressedDiagnosticOptions(projectFileInfo.SuppressedDiagnosticIds)); if (projectFileInfo.SignAssembly && !string.IsNullOrEmpty(projectFileInfo.AssemblyOriginatorKeyFile)) { var keyFile = Path.Combine(projectFileInfo.Directory, projectFileInfo.AssemblyOriginatorKeyFile); compilationOptions = compilationOptions.WithStrongNameProvider(new DesktopStrongNameProvider()) .WithCryptoKeyFile(keyFile); } if (!string.IsNullOrWhiteSpace(projectFileInfo.DocumentationFile)) { compilationOptions = compilationOptions.WithXmlReferenceResolver(XmlFileResolver.Default); } return(compilationOptions); }