public IClassifier GetClassifier(ITextBuffer buffer)
 {
     try
     {
         if (_outputClassifier == null)
         {
             Interlocked.CompareExchange(
                 ref _outputClassifier,
                 new GCCErrorListOutputClassifier(),
                 null);
             GCCErrorGenerator.Initialize(ServiceProvider.GlobalProvider);
             _outputClassifier.Initialize();
         }
     }
     catch (Exception ex)
     {
         Log.LogError(ex.ToString());
         throw;
     }
     return(_outputClassifier);
 }
        public IList <ClassificationSpan> GetClassificationSpans(SnapshotSpan span)
        {
            try
            {
                var spans    = new List <ClassificationSpan>();
                var snapshot = span.Snapshot;
                if (snapshot == null || snapshot.Length == 0)
                {
                    return(spans);
                }
                if (_classifiers == null)
                {
                    UpdateClassifiers();
                }

                var classifiers = _classifiers ?? new List <Classifier>();
                var start       = span.Start.GetContainingLine().LineNumber;
                var end         = (span.End - 1).GetContainingLine().LineNumber;
                for (var i = start; i <= end; i++)
                {
                    var line = snapshot.GetLineFromLineNumber(i);
                    if (line == null)
                    {
                        continue;
                    }
                    var snapshotSpan = new SnapshotSpan(line.Start, line.Length);
                    var text         = line.Snapshot.GetText(snapshotSpan);
                    if (string.IsNullOrEmpty(text))
                    {
                        continue;
                    }

                    var classificationName = classifiers.FirstOrDefault(classifier => classifier.Test(text)).Type;
                    if (classificationName == null)
                    {
                        continue;
                    }
                    switch (classificationName)
                    {
                    case ClassificationTypeDefinitions.LogError:
                        GCCErrorGenerator.AddError(GCCErrorListItem.Parse(text));
                        break;

                    case ClassificationTypeDefinitions.LogWarn:
                        GCCErrorGenerator.AddWarning(GCCErrorListItem.Parse(text));
                        break;

                    case ClassificationTypeDefinitions.LogInfo:
                        GCCErrorGenerator.AddMessage(GCCErrorListItem.Parse(text));
                        break;
                    }
                }
                return(spans);
            }
            catch (FormatException)
            {
                // eat it.
                return(new List <ClassificationSpan>());
            }
            catch (RegexMatchTimeoutException)
            {
                // eat it.
                return(new List <ClassificationSpan>());
            }
            catch (NullReferenceException)
            {
                // eat it.
                return(new List <ClassificationSpan>());
            }
            catch (Exception ex)
            {
                Log.LogError(ex.ToString());
                throw;
            }
        }