-- Hoogle documentation, generated by Haddock -- See Hoogle, http://www.haskell.org/hoogle/ -- | Utilities to tie up tokens to an AST -- -- This library is currently experimental. -- -- The GHC part is solid, since it has been migrated from HaRe. -- -- The haskell-src-exts one is still in progress -- -- This package provides a set of data structures to manage the tie-up -- between a Haskell AST and the underlying tokens, such that it -- explicitly captures the Haskell layout rules and original formatting. -- As a result changes can be made to the AST and the tokens will be -- updated so that the source file can be recreated with only the updated -- parts changed. This makes it easier to write Haskell source code -- modification programmes. @package haskell-token-utils @version 0.0.0.2 module Language.Haskell.TokenUtils.Types -- | An entry in the data structure for a particular srcspan. data Entry a -- | Entry has * the source span contained in this Node * how the -- sub-elements nest * the tokens for the SrcSpan if subtree is empty Entry :: !ForestSpan -> !Layout -> ![a] -> Entry a -- | Deleted has * the source span has been deleted * prior gap in lines * -- the gap between this span end and the start of the next in the fringe -- of the tree. Deleted :: !ForestSpan -> !RowOffset -> !SimpPos -> Entry a data TokenCache a TK :: !(Map TreeId (Tree (Entry a))) -> !TreeId -> TokenCache a tkCache :: TokenCache a -> !(Map TreeId (Tree (Entry a))) tkLastTreeId :: TokenCache a -> !TreeId data TreeId TId :: !Int -> TreeId -- | Identifies the tree carrying the main tokens, not any work in progress -- or deleted ones mainTid :: TreeId -- | Match a SrcSpan, using a ForestLine as the marker type ForestSpan = (ForestPos, ForestPos) type ForestPos = (ForestLine, Int) data ForestLine ForestLine :: !Bool -> !Int -> !Int -> !Int -> ForestLine -- | The length of the span may have changed due to updated tokens. flSpanLengthChanged :: ForestLine -> !Bool flTreeSelector :: ForestLine -> !Int flInsertVersion :: ForestLine -> !Int flLine :: ForestLine -> !Int type RowOffset = Int type ColOffset = Int type Row = Int type Col = Int type SimpPos = (Int, Int) data Layout -- | Initial offset from token before the stacked list of items, the (r,c) -- of the first non-comment token, the (r,c) of the end of the last -- non-comment token in the stacked list to be able to calculate the -- (RowOffset,ColOffset) between the last token and the start of the next -- item. Above :: EndOffset -> (Row, Col) -> (Row, Col) -> EndOffset -> Layout NoChange :: Layout data EndOffset None :: EndOffset SameLine :: ColOffset -> EndOffset FromAlignCol :: (RowOffset, ColOffset) -> EndOffset data Located e L :: Span -> e -> Located e data Span Span :: (Row, Col) -> (Row, Col) -> Span nullSpan :: Span data TokenLayout a type LayoutTree a = Tree (Entry a) forestSpanFromEntry :: Entry a -> ForestSpan putForestSpanInEntry :: Entry a -> ForestSpan -> Entry a -- | Strip out the version markers forestSpanToSimpPos :: ForestSpan -> (SimpPos, SimpPos) -- | Checks if the version is non-zero in either position forestSpanVersionSet :: ForestSpan -> Bool -- | Get the start and end position of a Tree treeStartEnd :: Tree Entry -- -> (SimpPos,SimpPos) treeStartEnd (Node (Entry sspan _) _) = -- (getGhcLoc sspan,getGhcLocEnd sspan) treeStartEnd :: Tree (Entry a) -> ForestSpan groupTokensByLine :: IsToken a => [a] -> [[a]] tokenRow :: IsToken a => a -> Int tokenCol :: IsToken a => a -> Int tokenColEnd :: IsToken a => a -> Int tokenPos :: IsToken a => a -> SimpPos tokenPosEnd :: IsToken a => a -> SimpPos -- | Shift the whole token by the given offset increaseSrcSpan :: IsToken a => SimpPos -> a -> a srcPosToSimpPos :: (Int, Int) -> (Int, Int) -- | Add a constant line and column offset to a span of tokens addOffsetToToks :: IsToken a => SimpPos -> [a] -> [a] -- | Extract an encoded ForestLine from a GHC line ghcLineToForestLine :: Int -> ForestLine forestLineToGhcLine :: ForestLine -> Int forestLenChangedMask :: Int -- | The IsToken class captures the different token type in use. For GHC it -- represents the type returned by getRichTokenStream, namely -- [(GHC.Located GHC.Token, String)] For haskell-src-exts this is the -- reult of lexTokenStream, namely `[HSE.Loc HSE.Token]` class Show a => IsToken a getSpan :: IsToken a => a -> Span putSpan :: IsToken a => a -> Span -> a tokenLen :: IsToken a => a -> Int isComment :: IsToken a => a -> Bool isEmpty :: IsToken a => a -> Bool mkZeroToken :: IsToken a => a isDo :: IsToken a => a -> Bool isElse :: IsToken a => a -> Bool isIn :: IsToken a => a -> Bool isLet :: IsToken a => a -> Bool isOf :: IsToken a => a -> Bool isThen :: IsToken a => a -> Bool isWhere :: IsToken a => a -> Bool tokenToString :: IsToken a => a -> String showTokenStream :: IsToken a => [a] -> String markToken :: IsToken a => a -> a isMarked :: IsToken a => a -> Bool notWhiteSpace :: IsToken a => a -> Bool isWhiteSpaceOrIgnored :: IsToken a => a -> Bool isIgnored :: IsToken a => a -> Bool -- | Tokens that are ignored when determining the first non-comment token -- in a span isIgnoredNonComment :: IsToken a => a -> Bool isWhereOrLet :: IsToken a => a -> Bool showFriendlyToks :: IsToken a => [a] -> String class HasLoc a getLoc :: HasLoc a => a -> SimpPos getLocEnd :: HasLoc a => a -> SimpPos class Allocatable b a allocTokens :: Allocatable b a => b -> [a] -> LayoutTree a instance Show EndOffset instance Eq EndOffset instance Show Layout instance Eq Layout instance Show a => Show (Entry a) instance Eq TreeId instance Ord TreeId instance Show TreeId instance Show Span instance Eq Span instance Ord Span instance Show e => Show (Located e) instance IsToken t => Ord (LayoutTree t) instance HasLoc ForestSpan instance Ord ForestLine instance Show ForestLine instance Eq ForestLine instance HasLoc (Entry a) instance IsToken a => Eq (Entry a) module Language.Haskell.TokenUtils.DualTree layoutTreeToSourceTree :: IsToken a => LayoutTree a -> SourceTree a retrieveLinesFromLayoutTree :: IsToken a => LayoutTree a -> [Line a] retrieveLines :: IsToken a => SourceTree a -> [Line a] renderLines :: IsToken a => [Line a] -> String renderSourceTree :: IsToken a => SourceTree a -> String -- | The main data structure for this module type SourceTree a = DUALTree Transformation (Up a) Annot (Prim a) data Line a Line :: Row -> Col -> RowOffset -> Source -> LineOpt -> [a] -> Line a data Source SOriginal :: Source SAdded :: Source SWasAdded :: Source renderLinesFromLayoutTree :: IsToken a => LayoutTree a -> String data Alignment ANone :: Alignment AVertical :: Alignment data Annot Ann :: String -> Annot ADeleted :: ForestSpan -> RowOffset -> SimpPos -> Annot ASubtree :: ForestSpan -> Annot data DeletedSpan DeletedSpan :: Span -> RowOffset -> SimpPos -> DeletedSpan data LineOpt ONone :: LineOpt -- | This line needs to be grouped with the next in terms of layout, so any -- column offsets need to be propagated OGroup :: LineOpt data Prim a PToks :: [a] -> Prim a PDeleted :: ForestSpan -> RowOffset -> SimpPos -> Prim a data Transformation TAbove :: ColOffset -> EndOffset -> (Row, Col) -> (Row, Col) -> EndOffset -> Transformation -- | The value that bubbles up. This is the Span occupied by the subtree, -- together with a string representation of the subtree. The origin of -- the string is the start of the span. data Up a Up :: Span -> Alignment -> (NonEmpty (Line a)) -> [DeletedSpan] -> Up a UDeleted :: [DeletedSpan] -> Up a instance Show DeletedSpan instance Eq DeletedSpan instance Show Transformation instance Show Alignment instance Eq Alignment instance Show Source instance Eq Source instance Show LineOpt instance Eq LineOpt instance IsToken a => Show (Up a) instance Show Annot instance Show a => Show (Prim a) instance Action Transformation (Up a) instance Semigroup Transformation instance IsToken a => Semigroup (Up a) instance Semigroup Span instance IsToken a => Show (Line a) module Language.Haskell.TokenUtils.Layout retrieveTokens :: IsToken a => LayoutTree a -> [a] module Language.Haskell.TokenUtils.Pretty class Outputable a ppr :: Outputable a => a -> Doc showPpr :: Outputable a => a -> String instance (Outputable a, Outputable b) => Outputable (a, b) instance Outputable a => Outputable [a] instance Outputable Row instance Outputable Bool instance Outputable ForestLine instance Outputable LineOpt instance Outputable Source instance IsToken a => Outputable (Line a) instance Outputable a => Outputable (NonEmpty a) instance Outputable Span instance Outputable DeletedSpan instance Outputable Alignment instance IsToken a => Outputable (Up a) instance Outputable Annot instance Outputable EndOffset instance Outputable Transformation instance IsToken a => Outputable (Prim a) instance IsToken a => Outputable (DUALTreeNE Transformation (Up a) Annot (Prim a)) instance IsToken a => Outputable (DUALTreeU Transformation (Up a) Annot (Prim a)) instance IsToken a => Outputable (SourceTree a) module Language.Haskell.TokenUtils.Utils -- | Split the token stream into three parts: the tokens before the -- startPos, the tokens between startPos and endPos, and the tokens after -- endPos. Note: The startPos and endPos refer to the startPos of a token -- only. So a single token will have the same startPos and endPos NO^^^^ splitToks :: IsToken a => (SimpPos, SimpPos) -> [a] -> ([a], [a], [a]) ghead :: String -> [a] -> a glast :: String -> [a] -> a gtail :: String -> [a] -> [a] gfromJust :: [Char] -> Maybe a -> a addEndOffsets :: IsToken a => LayoutTree a -> [a] -> LayoutTree a calcLastTokenPos :: IsToken a => [a] -> (Int, Int) makeOffset :: RowOffset -> ColOffset -> EndOffset makeLeaf :: IsToken a => Span -> Layout -> [a] -> LayoutTree a makeLeafFromToks :: IsToken a => [a] -> [LayoutTree a] -- | Split the given tokens to include the comments belonging to the span. splitToksIncComments :: IsToken a => (SimpPos, SimpPos) -> [a] -> ([a], [a], [a]) makeGroup :: IsToken a => [LayoutTree a] -> LayoutTree a makeGroupLayout :: IsToken a => Layout -> [LayoutTree a] -> LayoutTree a makeSpanFromTrees :: [LayoutTree a] -> ForestSpan mkGroup :: IsToken a => Span -> Layout -> [LayoutTree a] -> LayoutTree a subTreeOnly :: IsToken a => [LayoutTree a] -> [LayoutTree a] -- | Split the given tokens into the ones that occur prior to the start of -- the list and ones that occur after splitToksForList :: (IsToken a, HasLoc b) => [b] -> [a] -> ([a], [a], [a]) placeAbove :: IsToken a => EndOffset -> (Row, Col) -> (Row, Col) -> [LayoutTree a] -> LayoutTree a allocList :: (IsToken a, HasLoc b) => [b] -> [a] -> (b -> [a] -> [LayoutTree a]) -> [LayoutTree a] strip :: IsToken a => [LayoutTree a] -> [LayoutTree a] -- | Get the start&end location of t in the token stream, then extend -- the start and end location to cover the preceding and following -- comments. startEndLocIncComments' :: IsToken a => [a] -> (SimpPos, SimpPos) -> (SimpPos, SimpPos) sf :: Span -> ForestSpan srcSpanToForestSpan :: Span -> ForestSpan fs :: ForestSpan -> Span forestSpanToSrcSpan :: ForestSpan -> Span treeIdFromForestSpan :: ForestSpan -> TreeId -- | Gets the version numbers forestSpanVersions :: ForestSpan -> (Int, Int) -- | Gets the AST tree numbers forestSpanAstVersions :: ForestSpan -> (Int, Int) -- | Gets the SpanLengthChanged flags forestSpanLenChangedFlags :: ForestSpan -> (Bool, Bool) -- | Checks if the version is zero in both positions forestSpanVersionNotSet :: ForestSpan -> Bool -- | Checks if the version is non-zero forestPosVersionSet :: ForestPos -> Bool -- | Checks if the AST version is non-zero forestPosAstVersionSet :: ForestPos -> Bool -- | Checks if the version is zero forestPosVersionNotSet :: ForestPos -> Bool forestSpanLenChanged :: ForestSpan -> Bool forestPosLenChanged :: ForestPos -> Bool -- | Puts a TreeId into a forestSpan treeIdIntoForestSpan :: TreeId -> ForestSpan -> ForestSpan -- | Does the first span contain the second? Takes cognisance of the -- various flags a ForestSpan can have. NOTE: This function relies on the -- Eq instance for ForestLine spanContains :: ForestSpan -> ForestSpan -> Bool insertVersionsInForestSpan :: Int -> Int -> ForestSpan -> ForestSpan insertLenChangedInForestSpan :: Bool -> ForestSpan -> ForestSpan spanStartEnd :: Span -> (SimpPos, SimpPos) -- | ForestSpan version of GHC combineSrcSpans combineSpans :: ForestSpan -> ForestSpan -> ForestSpan -- | Extract the start and end position of a span, without any leading or -- trailing comments nonCommentSpan :: IsToken a => [a] -> (SimpPos, SimpPos) -- | Neat 2-dimensional drawing of a tree. drawTreeEntry :: Tree (Entry a) -> String -- | Neat 2-dimensional drawing of a forest. drawForestEntry :: Forest (Entry a) -> String showLayout :: Layout -> String drawTreeCompact :: Tree (Entry a) -> String drawTreeWithToks :: IsToken a => Tree (Entry a) -> String showForestSpan :: ForestSpan -> String -- | Call drawTreeEntry on the entire token cache drawTokenCache :: IsToken a => TokenCache a -> String -- | Call drawTreeEntry on the entire token cache drawTokenCacheDetailed :: IsToken a => TokenCache a -> String -- | Split a set of comment tokens into the ones that belong with the -- startLine and those that belong with the endLine divideComments :: IsToken a => Int -> Int -> [a] -> ([a], [a]) module Language.Haskell.TokenUtils.TokenUtils initTokenCache :: IsToken a => [a] -> TokenCache a initTokenCacheLayout :: IsToken a => Tree (Entry a) -> TokenCache a -- | Make a tree representing a particular set of tokens mkTreeFromTokens :: IsToken a => [a] -> Tree (Entry a) -- | Make a tree representing a particular set of tokens mkTreeFromSpanTokens :: IsToken a => ForestSpan -> [a] -> Tree (Entry a) -- | How new SrcSpans should be inserted in the Token tree, relative to the -- prior span data Positioning -- | Only a single space between the end of the prior span and the new one PlaceAdjacent :: Positioning -- | Start at the specified line and col PlaceAbsolute :: !Int -> !Int -> Positioning -- | Line offset and absolute Col. Mainly for forcing start at left margin, -- number of lines to add at the end PlaceAbsCol :: !Int -> !Int -> !Int -> Positioning -- | Line and Col offset for start, num lines to add at the end relative to -- the indent level of the prior span PlaceOffset :: !Int -> !Int -> !Int -> Positioning -- | Line and Col offset for start, num lines to add at the end relative to -- the indent level of the prior line PlaceIndent :: !Int -> !Int -> !Int -> Positioning -- | Keep track of when tokens are reversed, to avoid confusion data ReversedToks a RT :: [a] -> ReversedToks a reverseToks :: IsToken a => [a] -> ReversedToks a unReverseToks :: IsToken a => ReversedToks a -> [a] reversedToks :: IsToken a => ReversedToks a -> [a] putToksInCache :: IsToken a => TokenCache a -> Span -> [a] -> (TokenCache a, Span) replaceTokenInCache :: IsToken a => TokenCache a -> Span -> a -> TokenCache a removeToksFromCache :: IsToken a => TokenCache a -> Span -> TokenCache a -- | Replace a single token in a token tree, without changing the structure -- of the tree NOTE: the GHC.SrcSpan may have been used to select the -- appropriate forest in the first place, and is required to select the -- correct span in the tree, due to the ForestLine annotations that may -- be present replaceTokenForSrcSpan :: IsToken a => Tree (Entry a) -> Span -> a -> Tree (Entry a) -- | Check the invariant for the token cache. Returns list of any errors -- found. Invariants: 1. For each tree, either the rootLabel has a -- SrcSpan only, or the subForest /= []. 2a. The trees making up the -- subForest of a given node fully include the parent SrcSpan. i.e. the -- leaves contain all the tokens for a given SrcSpan. 2b. The subForest -- is in SrcSpan order 3. A given SrcSpan can only appear (or be -- included) in a single tree of the forest. 4. The parent link for all -- sub-trees does exist, and actually points to the parent. 5. There are -- no nullForestSpan entries in the tree NOTE: the tokens may extend -- before or after the SrcSpan, due to comments only NOTE2: this will -- have to be revisited when edits to the tokens are made invariant :: IsToken a => Tree (Entry a) -> [String] -- | Retrieve a path to the tree containing a ForestSpan from the forest, -- inserting it if not already present getSrcSpanFor :: IsToken a => Tree (Entry a) -> ForestSpan -> (Tree (Entry a), Tree (Entry a)) -- | indent the tree and tokens by the given offset, and sync the AST to -- the tree too. indentDeclToks :: (IsToken a, HasLoc t) => (t -> ForestSpan -> t) -> t -> Tree (Entry a) -> Int -> (t, Tree (Entry a)) -- | Add new tokens after the given SrcSpan, constructing a new SrcSpan in -- the process addToksAfterSrcSpan :: IsToken a => Tree (Entry a) -> Span -> Positioning -> [a] -> (Tree (Entry a), Span) addOffsetToSpan :: (Int, Int) -> Span -> Span reIndentToks :: IsToken a => Positioning -> [a] -> [a] -> [a] -- | Retrieve all the tokens at the leaves of the tree, in order. No -- adjustments are made to address gaps or re-alignment of the tokens retrieveTokensInterim :: IsToken a => Tree (Entry a) -> [a] -- | Get the (possible cached) tokens for a given source span, and cache -- their being fetched. NOTE: The SrcSpan may be one introduced by HaRe, -- rather than GHC. getTokensForNoIntros :: IsToken a => Bool -> Tree (Entry a) -> Span -> (Tree (Entry a), [a]) -- | Get the (possible cached) tokens for a given source span, and cache -- their being fetched. NOTE: The SrcSpan may be one introduced by HaRe, -- rather than GHC. getTokensFor :: IsToken a => Bool -> Tree (Entry a) -> Span -> (Tree (Entry a), [a]) -- | Get the tokens preceding a given SrcSpan getTokensBefore :: IsToken a => Tree (Entry a) -> Span -> (Tree (Entry a), ReversedToks a) reAlignMarked :: IsToken a => [a] -> [a] splitOnNewLn :: IsToken a => [a] -> ([a], [a]) -- | Get the indent of the line before, taking into account in-line -- 'where', 'let', 'in' and 'do' tokens getIndentOffset :: IsToken a => [a] -> SimpPos -> Int newLnToken :: IsToken a => a -> a -- | Get the start&end location of t in the token stream, then extend -- the start and end location to cover the preceding and following -- comments. startEndLocIncComments' :: IsToken a => [a] -> (SimpPos, SimpPos) -> (SimpPos, SimpPos) -- | Strip out the version markers forestSpanToGhcPos :: ForestSpan -> (SimpPos, SimpPos) nullForestSpan :: ForestSpan nullForestPos :: ForestPos simpPosToForestSpan :: (SimpPos, SimpPos) -> ForestSpan showTree :: IsToken a => Tree (Entry a) -> String showToks :: IsToken a => [a] -> String -- | Add a new SrcSpan and Tokens after a given one in the token stream and -- forest. This will be given a unique SrcSpan in return, which -- specifically indexes into the forest. addNewSrcSpanAndToksAfter :: IsToken a => Tree (Entry a) -> Span -> Span -> Positioning -> [a] -> (Tree (Entry a), Span) -- | Open a zipper so that its focus has the given SrcSpan in its subtree, -- or the location where the SrcSpan should go, if it is not in the tree openZipperToSpan :: IsToken a => ForestSpan -> TreePos Full (Entry a) -> TreePos Full (Entry a) -- | Open a zipper to a SrcSpan that has been added in the tree, and thus -- does not necessarily fall in the logical hierarchy of the tree openZipperToSpanAdded :: IsToken a => ForestSpan -> TreePos Full (Entry a) -> TreePos Full (Entry a) -- | Starting from a point in the zipper, retrieve all tokens backwards -- until the line changes for a non-comment/non-empty token or beginning -- of file. retrievePrevLineToks :: IsToken a => TreePos Full (Entry a) -> ReversedToks a limitPrevToks :: IsToken a => ReversedToks a -> Span -> ReversedToks a -- | Insert a ForestSpan into the forest, if it is not there already. -- Assumes the forest was populated with the tokens containing the -- ForestSpan already insertSrcSpan :: IsToken a => Tree (Entry a) -> ForestSpan -> Tree (Entry a) insertLenChangedInSrcSpan :: Bool -> Bool -> Span -> Span insertVersionsInSrcSpan :: Int -> Int -> Span -> Span -- | Replace the tokens for a given SrcSpan with new ones. The SrcSpan will -- be inserted into the tree if it is not already there. If the SrcSpan -- changes size, replace the SrcSpan with a new one (marked), and return -- it, as well as the old one TODO: What about trailing comments? -- Preserve or replace? updateTokensForSrcSpan :: IsToken a => Tree (Entry a) -> Span -> [a] -> (Tree (Entry a), Span, Tree (Entry a)) -- | Removes a ForestSpan and its tokens from the forest. removeSrcSpan :: IsToken a => Tree (Entry a) -> ForestSpan -> (Tree (Entry a), Tree (Entry a)) -- | True if the start of the second param lies in the span of the first containsStart :: ForestSpan -> ForestSpan -> Bool -- | True if the start of the second param lies before the first, and ends -- after or on the second containsMiddle :: ForestSpan -> ForestSpan -> Bool -- | True if the end of the second param lies in the span of the first containsEnd :: ForestSpan -> ForestSpan -> Bool -- | Split a given tree into a possibly empty part that lies before the -- srcspan, the part that is wholly included in the srcspan and the part -- the lies outside of it at the end. splitSubtree :: IsToken a => Tree (Entry a) -> ForestSpan -> ([Tree (Entry a)], [Tree (Entry a)], [Tree (Entry a)]) -- | Insert a new node after the designated one in the tree insertNodeAfter :: IsToken a => Tree (Entry a) -> Tree (Entry a) -> Tree (Entry a) -> Tree (Entry a) splitSubToks :: IsToken a => Tree (Entry a) -> (ForestPos, ForestPos) -> ([Tree (Entry a)], [Tree (Entry a)], [Tree (Entry a)]) placeToksForSpan :: IsToken a => Tree (Entry a) -> Span -> Tree (Entry a) -> Positioning -> [a] -> [a] -- | Some tokens are marked if they belong to identifiers which have been -- renamed. When the renaming takes place, no layout adjustment is done. -- This function adjusts the spacing for the rest of the line to match as -- far as possible the original spacing, except for the name change. reAlignOneLine :: IsToken a => [a] -> [a] -- | For a span about to be deleted, calculate the gap between the end of -- the span being deleted and the start of the next one, at a token -- level. calcEndGap :: IsToken a => Tree (Entry a) -> ForestSpan -> SimpPos getTreeSpansAsList :: IsToken a => Tree (Entry a) -> [(Int, ForestSpan)] -- | Open a zipper so that its focus has the given SrcSpan in its subtree, -- or the location where the SrcSpan should go, if it is not in the tree openZipperToSpanOrig :: IsToken a => ForestSpan -> TreePos Full (Entry a) -> TreePos Full (Entry a) instance Show a => Show (ReversedToks a) instance Show Positioning module Language.Haskell.TokenUtils.GHC.Layout initTokenLayout :: ParsedSource -> [GhcPosToken] -> LayoutTree GhcPosToken ghcAllocTokens :: ParsedSource -> [GhcPosToken] -> LayoutTree GhcPosToken retrieveTokens :: IsToken a => LayoutTree a -> [a] getLoc :: HasLoc a => a -> SimpPos nullSrcSpan :: SrcSpan -- | Compose a new token using the given arguments. mkToken :: Token -> SimpPos -> String -> GhcPosToken addEndOffsets :: IsToken a => LayoutTree a -> [a] -> LayoutTree a instance Show (GenLocated SrcSpan Token) instance HasLoc (Located a) instance IsToken (Located Token, String) instance Allocatable ParsedSource GhcPosToken instance Outputable EndOffset instance Outputable Token instance Outputable Layout instance Outputable ForestLine instance Outputable (Entry GhcPosToken) instance Outputable (LayoutTree GhcPosToken) instance Outputable LineOpt instance Outputable Source instance Outputable (Line GhcPosToken) module Language.Haskell.TokenUtils.HSE.Layout loadFile :: FilePath -> IO (ParseResult (Module SrcSpanInfo, [Loc TuToken])) loadFileWithMode :: ParseMode -> FilePath -> IO (ParseResult (Module SrcSpanInfo, [Loc TuToken])) templateHaskellMode :: ParseMode data TuToken T :: Token -> TuToken C :: Comment -> TuToken instance Show TuToken instance Eq TuToken instance Monoid Layout instance Allocatable (Module SrcSpanInfo) (Loc TuToken) instance IsToken (Loc TuToken) module Language.Haskell.TokenUtils.API -- | The IsToken class captures the different token type in use. For GHC it -- represents the type returned by getRichTokenStream, namely -- [(GHC.Located GHC.Token, String)] For haskell-src-exts this is the -- reult of lexTokenStream, namely `[HSE.Loc HSE.Token]` class Show a => IsToken a getSpan :: IsToken a => a -> Span putSpan :: IsToken a => a -> Span -> a tokenLen :: IsToken a => a -> Int isComment :: IsToken a => a -> Bool isEmpty :: IsToken a => a -> Bool mkZeroToken :: IsToken a => a isDo :: IsToken a => a -> Bool isElse :: IsToken a => a -> Bool isIn :: IsToken a => a -> Bool isLet :: IsToken a => a -> Bool isOf :: IsToken a => a -> Bool isThen :: IsToken a => a -> Bool isWhere :: IsToken a => a -> Bool tokenToString :: IsToken a => a -> String showTokenStream :: IsToken a => [a] -> String markToken :: IsToken a => a -> a isMarked :: IsToken a => a -> Bool class HasLoc a getLoc :: HasLoc a => a -> SimpPos getLocEnd :: HasLoc a => a -> SimpPos