private bool IsDiagnosticSuppressed(string id, Location location, out SuppressMessageInfo info) { Debug.Assert(id != null); Debug.Assert(location != null); info = default(SuppressMessageInfo); if (IsDiagnosticGloballySuppressed(id, symbolOpt: null, isImmediatelyContainingSymbol: false, info: out info)) { return(true); } // Walk up the syntax tree checking for suppression by any declared symbols encountered if (location.IsInSource) { var model = _compilation.GetSemanticModel(location.SourceTree); bool inImmediatelyContainingSymbol = true; for (var node = location.SourceTree.GetRoot().FindNode(location.SourceSpan, getInnermostNodeForTie: true); node != null; node = node.Parent) { var declaredSymbols = model.GetDeclaredSymbolsForNode(node); Debug.Assert(declaredSymbols != null); foreach (var symbol in declaredSymbols) { if (symbol.Kind == SymbolKind.Namespace) { return(hasNamespaceSuppression((INamespaceSymbol)symbol, inImmediatelyContainingSymbol)); } else if (IsDiagnosticLocallySuppressed(id, symbol, out info) || IsDiagnosticGloballySuppressed(id, symbol, inImmediatelyContainingSymbol, out info)) { return(true); } } if (!declaredSymbols.IsEmpty) { inImmediatelyContainingSymbol = false; } } } return(false); bool hasNamespaceSuppression(INamespaceSymbol namespaceSymbol, bool inImmediatelyContainingSymbol) { do { if (IsDiagnosticGloballySuppressed(id, namespaceSymbol, inImmediatelyContainingSymbol, out _)) { return(true); } namespaceSymbol = namespaceSymbol.ContainingNamespace; inImmediatelyContainingSymbol = false; }while (namespaceSymbol != null); return(false); } }
private bool IsDiagnosticSuppressed(Diagnostic diagnostic, out SuppressMessageInfo info) => IsDiagnosticSuppressed(diagnostic.Id, diagnostic.Location, out info);