@@ -16,20 +16,25 @@ namespace IronScheme.VisualStudio
1616 [ TagType ( typeof ( StructureTag ) ) ]
1717 internal class StructureTaggerProvider : ITaggerProvider
1818 {
19+ [ Import ]
20+ IBufferTagAggregatorFactoryService aggService = null ;
21+
1922 public ITagger < T > CreateTagger < T > ( ITextBuffer buffer ) where T : ITag
2023 {
2124 return buffer . Properties . GetOrCreateSingletonProperty (
22- ( ) => new StructureTagger ( buffer ) as ITagger < T > ) ;
25+ ( ) => new StructureTagger ( buffer , aggService . CreateTagAggregator < SchemeTag > ( buffer ) ) as ITagger < T > ) ;
2326 }
2427 }
2528
2629 class StructureTagger : BaseTagger , ITagger < StructureTag > , IDisposable
2730 {
2831 private ITextBuffer buffer ;
32+ private readonly ITagAggregator < SchemeTag > tagAggregator ;
2933
30- public StructureTagger ( ITextBuffer buffer )
34+ public StructureTagger ( ITextBuffer buffer , ITagAggregator < SchemeTag > tagAggregator )
3135 {
3236 this . buffer = buffer ;
37+ this . tagAggregator = tagAggregator ;
3338 }
3439
3540 IEnumerable < ITagSpan < StructureTag > > GetTags ( Cons c , NormalizedSnapshotSpanCollection spans )
@@ -71,7 +76,7 @@ IEnumerable<ITagSpan<StructureTag>> GetTags(Annotation a, NormalizedSnapshotSpan
7176 var collapseHint = new SnapshotSpan ( startLine . Start , endLine . End ) . GetText ( ) ;
7277 collapseHint = new string ( ' ' , startOffset ) + collapseHint . Substring ( startOffset , collapseHint . Length - startOffset - endOffset ) + new string ( ' ' , endOffset ) ;
7378
74- yield return new TagSpan < StructureTag > ( span ,
79+ yield return new TagSpan < StructureTag > ( span ,
7580 new StructureTag ( buffer . CurrentSnapshot , span , headerSpan , type : PredefinedStructureTagTypes . Expression , isCollapsible : true , collapsedForm : header , collapsedHintForm : collapseHint ) ) ;
7681
7782 if ( a . expression is Cons cc )
@@ -105,6 +110,49 @@ public IEnumerable<ITagSpan<StructureTag>> GetTags(NormalizedSnapshotSpanCollect
105110 }
106111 }
107112 }
113+
114+ var lines = 0 ;
115+ IMappingTagSpan < SchemeTag > start = null , last = null ;
116+
117+ foreach ( var tag in this . tagAggregator . GetTags ( new SnapshotSpan ( buffer . CurrentSnapshot , 0 , buffer . CurrentSnapshot . Length ) ) )
118+ {
119+ if ( tag . Tag . type == Compiler . Tokens . COMMENT )
120+ {
121+ if ( start == null )
122+ {
123+ start = tag ;
124+ }
125+ lines ++ ;
126+ last = tag ;
127+ continue ;
128+ }
129+
130+ if ( start != null )
131+ {
132+ if ( lines > 2 )
133+ {
134+ var ss = start . Span . GetSpans ( buffer ) . First ( ) ;
135+ var tt = last . Span . GetSpans ( buffer ) . First ( ) ;
136+ var cc = new SnapshotSpan ( ss . Start , tt . End ) ;
137+
138+ lines = 0 ;
139+
140+ if ( spans . IntersectsWith ( cc ) )
141+ {
142+
143+ var header = ss . Start . GetContainingLine ( ) ;
144+ var headerText = header . GetText ( ) ;
145+ var headerSpan = new SnapshotSpan ( ss . Start , header . End ) ;
146+
147+ yield return new TagSpan < StructureTag > ( cc ,
148+ new StructureTag ( buffer . CurrentSnapshot , cc , headerSpan , type : PredefinedStructureTagTypes . Comment , isCollapsible : true , collapsedForm : headerText , collapsedHintForm : cc . GetText ( ) ) ) ;
149+ }
150+ }
151+
152+ start = null ;
153+ last = tag ;
154+ }
155+ }
108156 }
109157 }
110158}
0 commit comments