@@ -72,7 +72,7 @@ data RC = RC
72 -- ^ Whether to relax aligning rules for comments
72 -- ^ Whether to relax aligning rules for comments
73 , rcDebug :: Bool
73 , rcDebug :: Bool
74 -- ^ Whether to print debugging info as we go
74 -- ^ Whether to print debugging info as we go
75− , rcEnclosingSpan :: Maybe RealSrcSpan
75+ , rcEnclosingSpans :: [RealSrcSpan]
76 -- ^ Span of enclosing element of AST
76 -- ^ Span of enclosing element of AST
77 , rcAnns :: Anns
77 , rcAnns :: Anns
78 -- ^ Collection of annotations
78 -- ^ Collection of annotations
@@ -117,7 +117,7 @@ runR debug (R m) sstream cstream anns =
117 , rcLayout = MultiLine
117 , rcLayout = MultiLine
118 , rcRelaxedComments = False
118 , rcRelaxedComments = False
119 , rcDebug = debug
119 , rcDebug = debug
120− , rcEnclosingSpan = Nothing
120+ , rcEnclosingSpans = []
121 , rcAnns = anns
121 , rcAnns = anns
@@ -316,17 +316,18 @@ setIndent i m' = do
316 R (local modRC m)
316 R (local modRC m)
317 traceR "set_indent_after" Nothing
317 traceR "set_indent_after" Nothing
319−-- | Get 'RealSrcSpan' of enclosing span, if any.
319+-- | Get 'RealSrcSpan' of enclosing span for given referencne span.
321−getEnclosingSpan :: R (Maybe RealSrcSpan)
321+getEnclosingSpan :: RealSrcSpan -> R (Maybe RealSrcSpan)
322−getEnclosingSpan = R (asks rcEnclosingSpan)
322+getEnclosingSpan r =
323+ listToMaybe . dropWhile (== r) <$> R (asks rcEnclosingSpans)
324-- | Set 'RealSrcSpan' of enclosing span for the given computation.
325-- | Set 'RealSrcSpan' of enclosing span for the given computation.
326withEnclosingSpan :: RealSrcSpan -> R () -> R ()
327withEnclosingSpan :: RealSrcSpan -> R () -> R ()
327withEnclosingSpan spn (R m) = do
328withEnclosingSpan spn (R m) = do
328 let modRC rc = rc
329 let modRC rc = rc
329− { rcEnclosingSpan = Just spn
330+ { rcEnclosingSpans = spn : rcEnclosingSpans rc
331 R (local modRC m)
332 R (local modRC m)