private void AdditionalFileAction(AdditionalFileAnalysisContext context) { if (context.AdditionalFile.Path.EndsWith(".manifest", StringComparison.OrdinalIgnoreCase)) { VerifyAppManifest(context, context.AdditionalFile); } // TODO: look for app.config? }
private static void VerifyAppManifest(AdditionalFileAnalysisContext context, AdditionalText appManifest) { SourceText?appManifestXml = appManifest.GetText(context.CancellationToken); if (appManifestXml is null) { return; } // If the manifest file is corrupt - let the build fail XmlDocument doc = new(); try { doc.LoadXml(appManifestXml.ToString()); } catch { // Invalid xml, don't care return; } XmlNamespaceManager nsmgr = new(doc.NameTable); nsmgr.AddNamespace("v1", "urn:schemas-microsoft-com:asm.v1"); nsmgr.AddNamespace("v3", "urn:schemas-microsoft-com:asm.v3"); nsmgr.AddNamespace("v3ws", "http://schemas.microsoft.com/SMI/2005/WindowsSettings"); if (doc.DocumentElement.SelectSingleNode("//v3:application/v3:windowsSettings/v3ws:dpiAware", nsmgr) is not null) { switch (context.Compilation.Language) { case LanguageNames.CSharp: context.ReportDiagnostic(Diagnostic.Create(DiagnosticDescriptors.s_migrateHighDpiSettings_CSharp, Location.None, appManifest.Path, ApplicationConfig.PropertyNameCSharp.HighDpiMode)); break; case LanguageNames.VisualBasic: context.ReportDiagnostic(Diagnostic.Create(DiagnosticDescriptors.s_migrateHighDpiSettings_VB, Location.None, appManifest.Path, ApplicationConfig.PropertyNameVisualBasic.HighDpiMode)); break; default: throw new NotSupportedException(); } } }
/// <summary> /// Creates a new instance of the <see cref="ReadonlyContextualDiagnosticReceiver{T}"/> class that accepts only <see cref="AdditionalFileAnalysisContext"/>. /// </summary> /// <param name="context">Context of this <see cref="ReadonlyContextualDiagnosticReceiver{T}"/>.</param> public static ReadonlyContextualDiagnosticReceiver <AdditionalFileAnalysisContext> AdditionalFile(AdditionalFileAnalysisContext context) { return(new ReadonlyContextualDiagnosticReceiver <AdditionalFileAnalysisContext>((in AdditionalFileAnalysisContext context, Diagnostic diag) => context.ReportDiagnostic(diag), context)); }
private void AnalyzeAdditionalFile(AdditionalFileAnalysisContext context) { OnAbstractMember("AdditionalFile"); OnOptions(context.Options); }
/// <summary> /// Creates a new instance of the <see cref="ReadonlyContextualLoggableGeneratorDiagnosticReceiver{T}"/> class that accepts only <see cref="AdditionalFileAnalysisContext"/>. /// </summary> /// <param name="generator">Target <see cref="LoggableSourceGenerator"/>.</param> /// <param name="context">Context of this <see cref="ReadonlyContextualLoggableGeneratorDiagnosticReceiver{T}"/>.</param> public static ReadonlyContextualLoggableGeneratorDiagnosticReceiver <AdditionalFileAnalysisContext> AdditionalFile(LoggableSourceGenerator generator, AdditionalFileAnalysisContext context) { return(new ReadonlyContextualLoggableGeneratorDiagnosticReceiver <AdditionalFileAnalysisContext>(generator, (in AdditionalFileAnalysisContext context, Diagnostic diag) => context.ReportDiagnostic(diag), context)); }