示例#1
0
        /// <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));
        }
示例#2
0
        /// <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));
        }
示例#3
0
        /// <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));
        }
示例#4
0
        /// <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));
        }
示例#5
0
        /// <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));
        }
示例#6
0
        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;
            }
        }