/// <summary> /// Creates diagnostic for specific node. /// </summary> public static Diagnostic CreateDiagnosticForNode([NotNull] INode node, [NotNull] IDiagnosticMessage message, params object[] args) { var sourceFile = NodeStructureExtensions.GetSourceFile(node); var span = DiagnosticUtilities.GetErrorSpanForNode(sourceFile, node); return(CreateFileDiagnostic(sourceFile, span.Start, span.Length, message, args)); }
/// <summary> /// Creates global, compilation-wide diagnostic. /// </summary> public static Diagnostic CreateCompilerDiagnostic(IDiagnosticMessage message, params object[] args) { var text = DiagnosticUtilities.GetLocaleSpecificMessage(message); if (args?.Length > 0) { text = DiagnosticUtilities.FormatStringFromArgs(text, args); } return(new Diagnostic(text, message.Category, message.Code)); }
/// <summary> /// Creates diagnostic instance for the file. /// </summary> public static Diagnostic CreateFileDiagnostic([NotNull] ISourceFile file, int start, int length, IDiagnosticMessage message, params object[] args) { Contract.Requires(start >= 0, "start must be non-negative"); Contract.Requires(length >= 0, "length must be non-negative"); var text = DiagnosticUtilities.GetLocaleSpecificMessage(message); // arguments is a javascript concept!! if (args?.Length > 0) { text = DiagnosticUtilities.FormatStringFromArgs(text, args); } return(new Diagnostic(file, start, length, text, message.Category, message.Code)); }
/// <summary> /// Creates diagnostic for specific node with a message chain. /// </summary> public static Diagnostic CreateDiagnosticForNodeFromMessageChain([NotNull] INode node, [NotNull] DiagnosticMessageChain messageChain) { var sourceFile = NodeStructureExtensions.GetSourceFile(node); var span = DiagnosticUtilities.GetErrorSpanForNode(sourceFile, node); Message message = messageChain.Next != null ? messageChain : (Message)messageChain.MessageText; return(new Diagnostic( sourceFile, span.Start, span.Length, message, messageChain.Category, messageChain.Code)); }
/// <inheritdoc /> public List <Diagnostic> GetDiagnostics(string fileName = null) { SortAndDeduplicateIfNeeded(); if (fileName != null) { return(m_fileDiagnostics.GetOrAddAtomic(fileName, _ => new List <Diagnostic>())); } List <Diagnostic> allDiagnostics = new List <Diagnostic>(m_nonFileDiagnostics); lock (m_fileDiagnostics) { foreach (var fileDiagnostic in m_fileDiagnostics.Values) { allDiagnostics.AddRange(fileDiagnostic); } } return(DiagnosticUtilities.SortAndDeduplicateDiagnostics(allDiagnostics)); }
private void SortAndDeduplicateIfNeeded() { if (!Volatile.Read(ref m_diagnosticsModified)) { return; } Volatile.Write(ref m_diagnosticsModified, false); m_nonFileDiagnostics = DiagnosticUtilities.SortAndDeduplicateDiagnostics(m_nonFileDiagnostics); Map <List <Diagnostic> > sortedAndDeduplicatedFileDiagnostics = new Map <List <Diagnostic> >(); lock (m_fileDiagnostics) { foreach (var key in m_fileDiagnostics.Keys) { sortedAndDeduplicatedFileDiagnostics[key] = DiagnosticUtilities.SortAndDeduplicateDiagnostics(m_fileDiagnostics[key]); } m_fileDiagnostics = sortedAndDeduplicatedFileDiagnostics; } }