Example #1
0
        private void AnalyzeSymbol(SymbolUsageAnalysisContext context, PlatformCompatOptions options)
        {
            var symbol = context.Symbol;

            // We only want to handle a specific set of symbols
            var isApplicable = symbol.Kind == SymbolKind.Event ||
                               symbol.Kind == SymbolKind.Field ||
                               symbol.Kind == SymbolKind.Method ||
                               symbol.Kind == SymbolKind.NamedType ||
                               symbol.Kind == SymbolKind.Namespace ||
                               symbol.Kind == SymbolKind.Property;

            if (!isApplicable)
            {
                return;
            }

            if (!_store.Value.TryLookup(symbol, out var entry))
            {
                return;
            }

            var api        = symbol.ToDisplayString(SymbolDisplayFormat.CSharpShortErrorMessageFormat);
            var location   = context.GetLocation();
            var diagnostic = Diagnostic.Create(Rule, location, api);

            context.ReportDiagnostic(diagnostic);
        }
        private void AnalyzeSymbol(SymbolUsageAnalysisContext context, PlatformCompatOptions options)
        {
            var symbol = context.Symbol;

            // We only want to handle a specific set of symbols
            var isApplicable = symbol.Kind == SymbolKind.Method ||
                               symbol.Kind == SymbolKind.Property ||
                               symbol.Kind == SymbolKind.Event;

            if (!isApplicable)
            {
                return;
            }

            if (!_store.Value.TryLookup(symbol, out var entry))
            {
                return;
            }

            // Check that the affected platforms aren't suppressed
            var maskedPlatforms = entry.Data & ~options.IgnoredPlatforms;

            if (maskedPlatforms == Platform.None)
            {
                return;
            }

            var api        = symbol.ToDisplayString(SymbolDisplayFormat.CSharpShortErrorMessageFormat);
            var location   = context.GetLocation();
            var list       = maskedPlatforms.ToFriendlyString();
            var diagnostic = Diagnostic.Create(Rule, location, api, list);

            context.ReportDiagnostic(diagnostic);
        }
Example #3
0
        public override void Initialize(AnalysisContext context)
        {
            context.RegisterCompilationStartAction(startContext =>
            {
                var settings = startContext.Options.GetFileSettings(PlatformCompatOptions.SettingsName);
                var options  = new PlatformCompatOptions(settings);

                // We only want to run if the project is targeting .NET Standard.
                var shouldRun = options.TargetFrameworkIsNetStandard();
                if (!shouldRun)
                {
                    return;
                }

                startContext.RegisterSymbolUsageAction(
                    usageContext => AnalyzeSymbol(usageContext, options)
                    );
            });
        }
        private void AnalyzeMethod(SymbolAnalysisContext context, PlatformCompatOptions options)
        {
            var symbol        = (IMethodSymbol)context.Symbol;
            var dllImportData = symbol.GetDllImportData();

            if (dllImportData == null)
            {
                return;
            }

            var entryPoint = dllImportData.EntryPointName ?? symbol.Name;
            var moduleName = dllImportData.ModuleName;
            var key        = (entryPoint, moduleName);

            if (_modernSdk.Value.Contains(key))
            {
                return;
            }

            var location   = symbol.Locations.First();
            var diagnostic = Diagnostic.Create(Rule, location, moduleName, entryPoint);

            context.ReportDiagnostic(diagnostic);
        }