packages feed

hs-tree-sitter (empty) → 13.0.14.0

raw patch · 5 files changed

+2499/−0 lines, 5 filesdep +basedep +base-compat-constptrdep +bytestring

Dependencies added: base, base-compat-constptr, bytestring, hs-tree-sitter, hs-tree-sitter-capi

Files

+ README.md view
@@ -0,0 +1,12 @@+# High-level bindings for tree-sitter++This package implements high-level bindings for [tree-sitter](https://tree-sitter.github.io/tree-sitter/),+a widely-supported parser generator tool and an incremental parsing library.++This package is an alternative to the official [tree-sitter](https://hackage.haskell.org/package/tree-sitter) package,+which only binds a subset of the features offered by tree-sitter parsers.++This package is compiled against [tree-sitter](https://github.com/tree-sitter/tree-sitter) version [0.24.3](https://github.com/tree-sitter/tree-sitter/releases/tag/v0.24.3) (2024-10-09).+It is feature complete for version 14 of the tree-sitter ABI and is backwards compatible down to version 13.++All tree-sitter versions up to version [0.25.8](https://github.com/tree-sitter/tree-sitter/releases/tag/v0.25.8) (2025-07-13) are backwards compatible down to version 13, so this package should work with all grammars generated by any version of tree-sitter after [0.19.0](https://github.com/tree-sitter/tree-sitter/releases/tag/v0.19.0) (2021-03-01), though this is untested.
+ hs-tree-sitter.cabal view
@@ -0,0 +1,56 @@+cabal-version:   3.4+name:            hs-tree-sitter+version:         13.0.14.0+license:         AGPL-3.0-only+synopsis:        High-level bindings for tree-sitter+description:     High-level bindings for tree-sitter.+author:          Wen Kokke+maintainer:      wenkokke@users.noreply.github.com+category:        Language+build-type:      Simple+extra-doc-files: README.md+tested-with:+  GHC ==8.10.7+   || ==9.0.2+   || ==9.2.8+   || ==9.4.8+   || ==9.6.7+   || ==9.8.4+   || ==9.10.2+   || ==9.12.2++common language+  ghc-options:+    -Wall -Wcompat -Widentities -Wprepositive-qualified-module+    -Wredundant-constraints -Wunticked-promoted-constructors+    -Wunused-packages++  default-language:   Haskell2010+  default-extensions: ImportQualifiedPost++  if impl(ghc <9.6.1)+    ghc-options:+      -optc=-Wno-discarded-qualifiers+      -optc=-Wno-incompatible-pointer-types-discards-qualifiers++library+  import:             language+  exposed-modules:    TreeSitter+  hs-source-dirs:     src+  build-depends:      hs-tree-sitter:internal+  default-extensions: NoImplicitPrelude++library internal+  import:          language+  visibility:      private+  hs-source-dirs:  src-internal+  ghc-options:     -Wno-name-shadowing+  exposed-modules:+    TreeSitter.Internal+    TreeSitter.Internal.ST++  build-depends:+    , base                  >=4.13 && <5+    , base-compat-constptr  >=0.1  && <0.2+    , bytestring            >=0.11 && <0.13+    , hs-tree-sitter-capi   >=13.0 && <13.1
+ src-internal/TreeSitter/Internal.hs view
@@ -0,0 +1,1710 @@+{-# LANGUAGE BangPatterns #-}+{-# LANGUAGE DerivingStrategies #-}+{-# LANGUAGE DuplicateRecordFields #-}+{-# LANGUAGE GADTs #-}+{-# LANGUAGE GeneralizedNewtypeDeriving #-}+{-# LANGUAGE InstanceSigs #-}+{-# LANGUAGE PatternSynonyms #-}+{-# LANGUAGE RecordWildCards #-}+{-# LANGUAGE ScopedTypeVariables #-}+{-# LANGUAGE TypeApplications #-}+{-# LANGUAGE ViewPatterns #-}+{-# OPTIONS_GHC -Wno-unused-top-binds #-}++module TreeSitter.Internal (+  -- * ABI Versioning+  C.TREE_SITTER_LANGUAGE_VERSION,+  C.TREE_SITTER_MIN_COMPATIBLE_LANGUAGE_VERSION,++  -- * Types+  Symbol (..),+  StateId (..),+  GrammarType (..),+  FieldId (..),+  FieldName (..),+  CaptureName (..),+  CaptureIndex (..),+  PatternIndex (..),+  Language,+  Parser,+  Tree,+  Query,+  QueryCursor,+  LookaheadIterator,+  InputEncoding (InputEncodingUTF8, InputEncodingUTF16),+  SymbolType (SymbolTypeRegular, SymbolTypeAnonymous, SymbolTypeSupertype, SymbolTypeAuxiliary),+  Point (Point, pointColumn, pointRow),+  Range (Range, rangeStartPoint, rangeEndPoint, rangeStartByte, rangeEndByte),+  Input,+  LogType (LogTypeLex, LogTypeParse),+  InputEdit (InputEdit, inputEditStartByte, inputEditOldEndByte, inputEditNewEndByte, inputEditStartPoint, inputEditOldEndPoint, inputEditNewEndPoint),+  Node,+  NodeId (..),+  nodeId,+  TreeCursor,+  TreeCursorId (..),+  QueryCapture,+  Quantifier,+  QueryMatch,+  QueryPredicateStepType,+  QueryPredicateStep,+  QueryErrorType (QueryErrorTypeSyntax, QueryErrorTypeNodeType, QueryErrorTypeField, QueryErrorTypeCapture, QueryErrorTypeStructure, QueryErrorTypeLanguage),+  QueryError (..),++  -- * Parser+  parserNew,+  unsafeParserDelete,+  withParser,+  parserSetLanguage,+  parserLanguage,+  parserSetIncludedRanges,+  parserIncludedRanges,+  parserSetLogger,+  parserLogger,+  parserHasLogger,+  parserRemoveLogger,+  parserParse,+  parserParseString,+  parserParseByteString,+  parserParseByteStringWithEncoding,+  parserReset,+  Microsecond (..),+  parserSetTimeoutMicros,+  parserTimeoutMicros,+  CancellationFlag (Cancel, Continue),+  CancellationFlagRef,+  getCancellationFlag,+  putCancellationFlag,+  parserSetCancellationFlag,+  parserCancellationFlag,+  parserPrintDotGraphs,++  -- * Tree+  treeCopy,+  unsafeTreeDelete,+  treeRootNode,+  treeRootNodeWithOffset,+  treeLanguage,+  treeIncludedRanges,+  treeEdit,+  treeGetChangedRanges,+  treePrintDotGraph,++  -- * Node+  nodeType,+  nodeTypeAsString,+  nodeSymbol,+  nodeLanguage,+  nodeGrammarType,+  nodeGrammarTypeAsString,+  nodeGrammarSymbol,+  nodeRange,+  nodeStartByte,+  nodeStartPoint,+  nodeEndByte,+  nodeEndPoint,+  showNode,+  showNodeAsString,+  nodeIsNull,+  nodeIsNamed,+  nodeIsMissing,+  nodeIsExtra,+  nodeHasChanges,+  nodeHasError,+  nodeIsError,+  nodeParseState,+  nodeNextParseState,+  nodeParent,+  nodeChildWithDescendant,+  nodeChild,+  nodeFieldNameForChild,+  nodeFieldNameForChildAsString,+  nodeFieldNameForNamedChild,+  nodeFieldNameForNamedChildAsString,+  nodeChildCount,+  nodeNamedChild,+  nodeNamedChildCount,+  nodeChildByFieldName,+  nodeChildByFieldId,+  nodeNextSibling,+  nodePrevSibling,+  nodeNextNamedSibling,+  nodePrevNamedSibling,+  nodeFirstChildForByte,+  nodeFirstNamedChildForByte,+  nodeDescendantCount,+  nodeDescendantForByteRange,+  nodeDescendantForPointRange,+  nodeNamedDescendantForByteRange,+  nodeNamedDescendantForPointRange,+  nodeEdit,+  nodeEq,++  -- * TreeCursor+  treeCursorNew,+  unsafeTreeCursorDelete,+  treeCursorReset,+  treeCursorResetTo,+  treeCursorCurrentNode,+  treeCursorCurrentFieldName,+  treeCursorCurrentFieldId,+  treeCursorGotoParent,+  treeCursorGotoNextSibling,+  treeCursorGotoPreviousSibling,+  treeCursorGotoFirstChild,+  treeCursorGotoLastChild,+  treeCursorGotoDescendant,+  treeCursorCurrentDescendantIndex,+  treeCursorCurrentDepth,+  treeCursorGotoFirstChildForByte,+  treeCursorGotoFirstChildForPoint,+  treeCursorCopy,++  -- * Query+  queryNew,+  unsafeQueryDelete,+  queryPatternCount,+  queryCaptureCount,+  queryStringCount,+  queryStartByteForPattern,+  queryEndByteForPattern,+  queryPredicatesForPattern,+  queryIsPatternRooted,+  queryIsPatternNonLocal,+  queryIsPatternGuaranteedAtStep,+  queryCaptureNameForIndex,+  queryCaptureQuantifierForIndex,+  queryStringValueForIndex,+  queryDisableCapture,+  queryDisablePattern,+  queryCursorNew,+  unsafeQueryCursorDelete,+  queryCursorExec,+  queryCursorDidExceedMatchLimit,+  queryCursorMatchLimit,+  queryCursorSetMatchLimit,+  queryCursorSetTimeoutMicros,+  queryCursorTimeoutMicros,+  queryCursorSetByteRange,+  queryCursorSetPointRange,+  queryCursorNextMatch,+  queryCursorRemoveMatch,+  queryCursorNextCapture,+  queryCursorSetMaxStartDepth,++  -- * Language+  unsafeToLanguage,+  unsafeLanguageDelete,+  languageCopy,+  languageSymbolCount,+  languageStateCount,+  languageSymbolName,+  languageSymbolForGrammarType,+  languageFieldCount,+  languageFieldNameForId,+  languageFieldIdForName,+  languageSymbolType,+  languageVersion,+  languageNextState,++  -- * Lookahead Iterator+  withLookaheadIteratorAsTSLookaheadIteratorPtr,+  lookaheadIteratorNew,+  unsafeLookaheadIteratorDelete,+  lookaheadIteratorResetState,+  lookaheadIteratorReset,+  lookaheadIteratorLanguage,+  lookaheadIteratorNext,+  lookaheadIteratorCurrentSymbol,+  lookaheadIteratorCurrentSymbolName,++  -- * Global Configuration+) where++import Control.Exception (Exception (..), assert, bracket, throwIO)+import Control.Monad ((<=<))+import Data.ByteString qualified as BS+import Data.ByteString.Builder qualified as BSB+import Data.ByteString.Char8 qualified as BSC+import Data.ByteString.Internal (ByteString (BS))+import Data.ByteString.Unsafe qualified as BSU+import Data.Coerce (coerce)+import Data.IORef (newIORef, writeIORef)+import Data.Maybe (isJust)+import Foreign+import Foreign.C (CBool, CInt (CInt), CSize (..))+import Foreign.C.ConstPtr.Compat (ConstPtr (..))+import Foreign.ForeignPtr.Unsafe (unsafeForeignPtrToPtr)+import GHC.IO.FD (FD (..))+import GHC.IO.Handle.FD (handleToFd)+import System.IO (Handle)+import TreeSitter.CApi qualified as C+import TreeSitter.CApi qualified as TSNode (TSNode (..))++--------------------------------------------------------------------------------++{-# ANN module ("HLint: ignore Redundant lambda" :: String) #-}++{-# ANN module ("HLint: ignore Foreign should be imported post-qualified or with an explicit import list" :: String) #-}++--------------------------------------------------------------------------------++-- * Types++newtype CaptureIndex = WrapTSCaptureIndex {unWrapTSCaptureIndex :: Word32}++newtype PatternIndex = WrapTSPatternIndex {unWrapTSPatternIndex :: Word32}++newtype StateId = WrapTSStateId {unWrapTSStateId :: C.TSStateId}+  deriving stock (Show, Read, Eq, Ord)+  deriving newtype (Num, Real, Integral, Enum)++newtype Symbol = WrapTSSymbol {unWrapTSSymbol :: C.TSSymbol}+  deriving stock (Show, Read, Eq, Ord)+  deriving newtype (Num, Real, Integral, Enum)++newtype GrammarType = WrapTSGrammarType {unWrapTSGrammarType :: ByteString}+  deriving stock (Show, Read, Eq, Ord)++newtype FieldId = WrapTSFieldId {unWrapTSFieldId :: C.TSFieldId}+  deriving stock (Show, Read, Eq, Ord)+  deriving newtype (Num, Real, Integral, Enum)++newtype FieldName = WrapTSFieldName {unWrapTSFieldName :: ByteString}+  deriving stock (Show, Read, Eq, Ord)++newtype CaptureName = WrapTSCaptureName {unWrapTSCaptureName :: ByteString}+  deriving stock (Show, Read, Eq, Ord)++newtype Language = WrapTSLanguage {unWrapTSLanguage :: ForeignPtr C.TSLanguage}++newtype Parser = WrapTSParser {unWrapTSParser :: ForeignPtr C.TSParser}++-- | __Warning__: 'Tree' is not thread-safe. To use a 'Tree' from multiple threads, you must copy it using 'treeCopy'.+newtype Tree = WrapTSTree {unWrapTSTree :: ForeignPtr C.TSTree}++newtype Query = WrapTSQuery {unWrapTSQuery :: ForeignPtr C.TSQuery}++newtype QueryCursor = WrapTSQueryCursor {unWrapTSQueryCursor :: ForeignPtr C.TSQueryCursor}++newtype LookaheadIterator = WrapTSLookaheadIterator {unWrapTSLookaheadIterator :: ForeignPtr C.TSLookaheadIterator}++newtype InputEncoding = WrapTSInputEncoding {unWrapTSInputEncoding :: C.TSInputEncoding}++pattern InputEncodingUTF8 :: InputEncoding+pattern InputEncodingUTF8 = WrapTSInputEncoding C.TSInputEncodingUTF8++pattern InputEncodingUTF16 :: InputEncoding+pattern InputEncodingUTF16 = WrapTSInputEncoding C.TSInputEncodingUTF16++{-# COMPLETE InputEncodingUTF8, InputEncodingUTF16 #-}++instance Show InputEncoding where+  show InputEncodingUTF8 = "InputEncodingUTF8"+  show InputEncodingUTF16 = "InputEncodingUTF16"++newtype SymbolType = WrapTSSymbolType {unWrapTSSymbolType :: C.TSSymbolType}+  deriving stock (Eq)++pattern SymbolTypeRegular :: SymbolType+pattern SymbolTypeRegular = WrapTSSymbolType C.TSSymbolTypeRegular++pattern SymbolTypeAnonymous :: SymbolType+pattern SymbolTypeAnonymous = WrapTSSymbolType C.TSSymbolTypeAnonymous++pattern SymbolTypeSupertype :: SymbolType+pattern SymbolTypeSupertype = WrapTSSymbolType C.TSSymbolTypeSupertype++pattern SymbolTypeAuxiliary :: SymbolType+pattern SymbolTypeAuxiliary = WrapTSSymbolType C.TSSymbolTypeAuxiliary++{-# COMPLETE SymbolTypeRegular, SymbolTypeAnonymous, SymbolTypeSupertype, SymbolTypeAuxiliary #-}++instance Show SymbolType where+  show SymbolTypeRegular = "SymbolTypeRegular"+  show SymbolTypeAnonymous = "SymbolTypeAnonymous"+  show SymbolTypeSupertype = "SymbolTypeSupertype"+  show SymbolTypeAuxiliary = "SymbolTypeAuxiliary"++newtype Point = WrapTSPoint {unWrapTSPoint :: C.TSPoint}+  deriving newtype (Ord, Eq)++pattern Point :: Word32 -> Word32 -> Point+pattern Point+  { pointRow+  , pointColumn+  } =+  WrapTSPoint+    ( C.TSPoint+        pointRow+        pointColumn+      )++{-# COMPLETE Point #-}++instance Show Point where+  showsPrec :: Int -> Point -> ShowS+  showsPrec p Point{..} =+    showParen (p > 10) $+      showString "Point "+        . showsPrec 11 pointRow+        . showChar ' '+        . showsPrec 11 pointColumn++newtype Range = WrapTSRange {unWrapTSRange :: C.TSRange}+  deriving stock (Eq)++pattern Range :: Point -> Point -> Word32 -> Word32 -> Range+pattern Range+  { rangeStartPoint+  , rangeEndPoint+  , rangeStartByte+  , rangeEndByte+  } <-+  WrapTSRange+    ( C.TSRange+        (WrapTSPoint -> rangeStartPoint)+        (WrapTSPoint -> rangeEndPoint)+        rangeStartByte+        rangeEndByte+      )+  where+    Range startPoint endPoint startByte endByte =+      WrapTSRange+        ( C.TSRange+            (unWrapTSPoint startPoint)+            (unWrapTSPoint endPoint)+            startByte+            endByte+        )++{-# COMPLETE Range #-}++instance Show Range where+  showsPrec :: Int -> Range -> ShowS+  showsPrec p Range{..} =+    showParen (p > 10) $+      showString "Range "+        . showsPrec 11 rangeStartPoint+        . showChar ' '+        . showsPrec 11 rangeEndPoint+        . showChar ' '+        . showsPrec 11 rangeStartByte+        . showChar ' '+        . showsPrec 11 rangeEndByte++newtype LogType = WrapTSLogType {unWrapTSLogType :: C.TSLogType}+  deriving (Eq)++pattern LogTypeParse :: LogType+pattern LogTypeParse = WrapTSLogType C.TSLogTypeParse++pattern LogTypeLex :: LogType+pattern LogTypeLex = WrapTSLogType C.TSLogTypeLex++{-# COMPLETE LogTypeParse, LogTypeLex #-}++instance Show LogType where+  show LogTypeParse = "LogTypeParse"+  show LogTypeLex = "LogTypeLex"++type Log = LogType -> ByteString -> IO ()++logToTSLog :: Log -> C.TSLog+logToTSLog logFun = \logType logMsg ->+  BS.packCString (unConstPtr logMsg) >>= logFun (coerce logType)++tsLogToLog :: C.TSLog -> Log+tsLogToLog logFun = \logType logMsg ->+  BS.useAsCString logMsg $ logFun (coerce logType) . ConstPtr++newtype InputEdit = WrapTSInputEdit {unWrapTSInputEdit :: C.TSInputEdit}++pattern InputEdit :: Word32 -> Word32 -> Word32 -> Point -> Point -> Point -> InputEdit+pattern InputEdit+  { inputEditStartByte+  , inputEditOldEndByte+  , inputEditNewEndByte+  , inputEditStartPoint+  , inputEditOldEndPoint+  , inputEditNewEndPoint+  } <-+  WrapTSInputEdit+    ( C.TSInputEdit+        inputEditStartByte+        inputEditOldEndByte+        inputEditNewEndByte+        (WrapTSPoint -> inputEditStartPoint)+        (WrapTSPoint -> inputEditOldEndPoint)+        (WrapTSPoint -> inputEditNewEndPoint)+      )+  where+    InputEdit startByte oldEndByte newEndByte startPoint oldEndPoint newEndPoint =+      WrapTSInputEdit+        ( C.TSInputEdit+            startByte+            oldEndByte+            newEndByte+            (unWrapTSPoint startPoint)+            (unWrapTSPoint oldEndPoint)+            (unWrapTSPoint newEndPoint)+        )++newtype Node = WrapTSNode {unWrapTSNode :: C.TSNode}++newtype NodeId = WrapTSNodeId {unWrapTSNodeId :: Int}+  deriving stock (Eq, Ord)+  deriving newtype (Show)++nodeId :: Node -> NodeId+nodeId = coerce . ptrToIntPtr . coerce . TSNode._id . coerce++newtype TreeCursor = WrapTSTreeCursor {unWrapTSTreeCursor :: ForeignPtr C.TSTreeCursor}++newtype TreeCursorId = WrapTSTreeCursorId {unWrapTSTreeCursorId :: Word}+  deriving (Eq, Ord)++-- treeCursorId :: TreeCursor -> TreeCursorId+-- treeCursorId = coerce . ptrToWordPtr . coerce . TSTreeCursor._id . coerce++newtype QueryCapture = WrapTSQueryCapture {unWrapTSQueryCapture :: C.TSQueryCapture}++newtype Quantifier = WrapTSQuantifier {unWrapTSQuantifier :: C.TSQuantifier}+  deriving stock (Eq)++pattern QuantifierZero :: Quantifier+pattern QuantifierZero = WrapTSQuantifier C.TSQuantifierZero++pattern QuantifierZeroOrOne :: Quantifier+pattern QuantifierZeroOrOne = WrapTSQuantifier C.TSQuantifierZeroOrOne++pattern QuantifierZeroOrMore :: Quantifier+pattern QuantifierZeroOrMore = WrapTSQuantifier C.TSQuantifierZeroOrMore++pattern QuantifierOne :: Quantifier+pattern QuantifierOne = WrapTSQuantifier C.TSQuantifierOne++pattern QuantifierOneOrMore :: Quantifier+pattern QuantifierOneOrMore = WrapTSQuantifier C.TSQuantifierOneOrMore++{-# COMPLETE QuantifierZero, QuantifierZeroOrOne, QuantifierZeroOrMore, QuantifierOne, QuantifierOneOrMore #-}++instance Show Quantifier where+  show QuantifierZero = "QuantifierZero"+  show QuantifierZeroOrOne = "QuantifierZeroOrOne"+  show QuantifierZeroOrMore = "QuantifierZeroOrMore"+  show QuantifierOne = "QuantifierOne"+  show QuantifierOneOrMore = "QuantifierOneOrMore"++newtype QueryMatch = WrapTSQueryMatch {unWrapTSQueryMatch :: C.TSQueryMatch}++newtype QueryPredicateStepType = WrapTSQueryPredicateStepType {unWrapTSQueryPredicateStepType :: C.TSQueryPredicateStepType}+  deriving stock (Eq)++pattern QueryPredicateStepTypeDone :: QueryPredicateStepType+pattern QueryPredicateStepTypeDone = WrapTSQueryPredicateStepType C.TSQueryPredicateStepTypeDone++pattern QueryPredicateStepTypeCapture :: QueryPredicateStepType+pattern QueryPredicateStepTypeCapture = WrapTSQueryPredicateStepType C.TSQueryPredicateStepTypeCapture++pattern QueryPredicateStepTypeString :: QueryPredicateStepType+pattern QueryPredicateStepTypeString = WrapTSQueryPredicateStepType C.TSQueryPredicateStepTypeString++{-# COMPLETE QueryPredicateStepTypeDone, QueryPredicateStepTypeCapture, QueryPredicateStepTypeString #-}++instance Show QueryPredicateStepType where+  show QueryPredicateStepTypeDone = "QueryPredicateStepTypeDone"+  show QueryPredicateStepTypeCapture = "QueryPredicateStepTypeCapture"+  show QueryPredicateStepTypeString = "QueryPredicateStepTypeString"++newtype QueryPredicateStep = WrapTSQueryPredicateStep {unWrapTSQueryPredicateStep :: C.TSQueryPredicateStep}++newtype QueryErrorType = WrapTSQueryErrorType {unWrapTSQueryErrorType :: C.TSQueryError}+  deriving stock (Eq)++pattern QueryErrorTypeSyntax :: QueryErrorType+pattern QueryErrorTypeSyntax = WrapTSQueryErrorType C.TSQueryErrorSyntax++pattern QueryErrorTypeNodeType :: QueryErrorType+pattern QueryErrorTypeNodeType = WrapTSQueryErrorType C.TSQueryErrorNodeType++pattern QueryErrorTypeField :: QueryErrorType+pattern QueryErrorTypeField = WrapTSQueryErrorType C.TSQueryErrorField++pattern QueryErrorTypeCapture :: QueryErrorType+pattern QueryErrorTypeCapture = WrapTSQueryErrorType C.TSQueryErrorCapture++pattern QueryErrorTypeStructure :: QueryErrorType+pattern QueryErrorTypeStructure = WrapTSQueryErrorType C.TSQueryErrorStructure++pattern QueryErrorTypeLanguage :: QueryErrorType+pattern QueryErrorTypeLanguage = WrapTSQueryErrorType C.TSQueryErrorLanguage++{-# COMPLETE QueryErrorTypeSyntax, QueryErrorTypeNodeType, QueryErrorTypeField, QueryErrorTypeCapture, QueryErrorTypeStructure, QueryErrorTypeLanguage #-}++instance Show QueryErrorType where+  show QueryErrorTypeSyntax = "QueryErrorTypeSyntax"+  show QueryErrorTypeNodeType = "QueryErrorTypeNodeType"+  show QueryErrorTypeField = "QueryErrorTypeField"+  show QueryErrorTypeCapture = "QueryErrorTypeCapture"+  show QueryErrorTypeStructure = "QueryErrorTypeStructure"+  show QueryErrorTypeLanguage = "QueryErrorTypeLanguage"++data QueryError = QueryError+  { queryErrorOffset :: !Word32+  , queryErrorPoint :: !Point+  , queryErrorMessage :: !String+  , queryErrorType :: !QueryErrorType+  }+  deriving (Show)++instance Exception QueryError where+  displayException :: QueryError -> String+  displayException = queryErrorMessage++-- * Parser++withParserAsTSParserPtr :: Parser -> (Ptr C.TSParser -> IO a) -> IO a+withParserAsTSParserPtr = withForeignPtr . coerce++-- | See @`C.ts_parser_new`@.+parserNew :: IO Parser+parserNew = coerce newForeignPtr C.p_ts_parser_delete =<< C.ts_parser_new++{-| Delete the 'Parser' and free the associated memory.++See @`C.ts_parser_delete`@.++__Warning__: Using the 'Parser' after calling 'unsafeParserDelete' leads to undefined behaviour.++__Warning__: If the 'Parser' has a logger, this function does not delete it.+-}+unsafeParserDelete :: Parser -> IO ()+unsafeParserDelete = coerce finalizeForeignPtr++withParser :: (Parser -> IO a) -> IO a+withParser = bracket parserNew unsafeParserDelete++-- | See @`C.ts_parser_language`@.+parserLanguage :: Parser -> IO Language+parserLanguage parser =+  withParserAsTSParserPtr parser $+    unsafeToLanguage <=< coerce C.ts_parser_language++-- | See @`C.ts_parser_set_language`@.+parserSetLanguage :: Parser -> Language -> IO Bool+parserSetLanguage parser language =+  withParserAsTSParserPtr parser $ \parserPtr -> do+    withLanguageAsTSLanguagePtr language $ \languagePtr -> do+      success <- C.ts_parser_set_language parserPtr languagePtr+      pure $ toBool success++-- | See @`C.ts_parser_set_included_ranges`@.+parserSetIncludedRanges :: Parser -> [Range] -> IO Bool+parserSetIncludedRanges parser ranges =+  withParserAsTSParserPtr parser $ \parserPtr -> do+    let rangesLength = length ranges+    withArray (coerce ranges) $ \rangesPtr -> do+      success <-+        C.ts_parser_set_included_ranges+          parserPtr+          (ConstPtr rangesPtr)+          (fromIntegral rangesLength)+      pure $ toBool success++-- | See @`C.ts_parser_included_ranges`@.+parserIncludedRanges :: Parser -> IO [Range]+parserIncludedRanges parser =+  withParserAsTSParserPtr parser $ \parserPtr -> do+    alloca $ \rangesLengthPtr -> do+      rangesPtr <-+        C.ts_parser_included_ranges+          (ConstPtr parserPtr)+          rangesLengthPtr+      rangesLength <- fromIntegral <$> peek rangesLengthPtr+      coerce $ peekArray rangesLength (unConstPtr rangesPtr)++{-| Set the 'Logger' for a 'Parser'.++  See @`C.ts_parser_set_logger`@.+-}+parserSetLogger :: Parser -> Log -> IO ()+parserSetLogger parser logFun =+  withParserAsTSParserPtr parser $ \parserPtr ->+    C.ts_parser_set_logger (coerce parserPtr) (logToTSLog logFun)++{-| Get the 'Logger' for a 'Parser'.++  If no 'Logger' was set, 'parserLogger' returns 'Nothing'.++  See @`C.ts_parser_logger`@.+-}+parserLogger :: Parser -> IO (Maybe Log)+parserLogger parser =+  withParserAsTSParserPtr parser $+    fmap (fmap tsLogToLog) . C.ts_parser_logger . coerce++-- | Test if the 'Parser' has a 'Logger'.+parserHasLogger :: Parser -> IO Bool+parserHasLogger = fmap isJust . parserLogger++-- | If the 'Parser' has a 'Logger', remove and pure it.+parserRemoveLogger :: Parser -> IO (Maybe Log)+parserRemoveLogger parser =+  withParserAsTSParserPtr parser $+    fmap (fmap tsLogToLog) . C.ts_parser_remove_logger . coerce++type Input =+  -- | Byte index.+  Word32 ->+  -- | Position.+  Point ->+  IO ByteString++-- | See @`C.ts_parser_parse`@.+parserParse :: Parser -> Maybe Tree -> Input -> InputEncoding -> IO (Maybe Tree)+parserParse parser oldTree input encoding =+  withParserAsTSParserPtr parser $ \parserPtr ->+    withMaybeTreeAsTSTreePtr oldTree $ \oldTreePtr -> do+      -- NOTE: The purpose of `chunkRef` is to hold on to a reference to+      --       the current chunk and prevent its garbage collection until+      --       the next call to `tsRead`.+      --       Incorrect management of these references can potentially cause+      --       either a memory leak or a use-after-free error, since by using+      --       `unsafeForeignPtrToPtr` we bypass the foreign pointer finalizer.+      -- NOTE: Despite my best efforts, I have not been able to demonstrate+      --       that this code without the `IORef` leaks memory.+      chunkRef <- newIORef BS.empty+      let tsRead = \byteIndex position_p bytesRead -> do+            position <- WrapTSPoint <$> peek position_p+            chunk@(BS chunkForeignPtr chunkLenInt) <- input byteIndex position+            writeIORef chunkRef chunk+            let chunkLen = fromIntegral chunkLenInt+            poke bytesRead chunkLen+            let chunkPtr = coerce (unsafeForeignPtrToPtr chunkForeignPtr)+            pure chunkPtr+      newTreePtr <-+        C.ts_parser_parse+          parserPtr+          (ConstPtr oldTreePtr)+          tsRead+          (coerce encoding)+      toMaybeTree newTreePtr++-- | See @`C.ts_parser_parse_string`@.+parserParseString :: Parser -> Maybe Tree -> String -> IO (Maybe Tree)+parserParseString parser oldTree string =+  parserParseByteString parser oldTree (BSC.pack string)++-- | See @`C.ts_parser_parse_string`@.+parserParseByteString :: Parser -> Maybe Tree -> ByteString -> IO (Maybe Tree)+parserParseByteString parser oldTree string =+  withParserAsTSParserPtr parser $ \parserPtr ->+    withMaybeTreeAsTSTreePtr oldTree $ \oldTreePtr ->+      BSU.unsafeUseAsCStringLen string $ \(stringPtr, stringLen) -> do+        newTreePtr <-+          C.ts_parser_parse_string+            parserPtr+            (ConstPtr oldTreePtr)+            (ConstPtr stringPtr)+            (fromIntegral stringLen)+        toMaybeTree newTreePtr++-- | See @`C.ts_parser_parse_string_encoding`@.+parserParseByteStringWithEncoding :: Parser -> Maybe Tree -> ByteString -> InputEncoding -> IO (Maybe Tree)+parserParseByteStringWithEncoding parser oldTree string inputEncoding =+  withParserAsTSParserPtr parser $ \parserPtr ->+    withMaybeTreeAsTSTreePtr oldTree $ \oldTreePtr ->+      BSU.unsafeUseAsCStringLen string $ \(stringPtr, stringLen) -> do+        newTreePtr <-+          C.ts_parser_parse_string_encoding+            parserPtr+            (ConstPtr oldTreePtr)+            (ConstPtr stringPtr)+            (fromIntegral stringLen)+            (coerce inputEncoding)+        toMaybeTree newTreePtr++-- | See @`C.ts_parser_reset`@.+parserReset :: Parser -> IO ()+parserReset = (`withParserAsTSParserPtr` C.ts_parser_reset)++-- | Microseconds.+newtype Microsecond = Microsecond {unMicrosecond :: Word64}+  deriving stock (Show, Read, Eq, Ord)+  deriving newtype (Num, Real, Integral, Enum)++-- | See @`C.ts_parser_set_timeout_micros`@.+parserSetTimeoutMicros :: Parser -> Microsecond -> IO ()+parserSetTimeoutMicros parser ms =+  withParserAsTSParserPtr parser $ \parserPtr ->+    coerce C.ts_parser_set_timeout_micros parserPtr ms++-- | See @`C.ts_parser_timeout_micros`@.+parserTimeoutMicros :: Parser -> IO Microsecond+parserTimeoutMicros parser =+  withParserAsTSParserPtr parser $+    coerce C.ts_parser_timeout_micros++newtype CancellationFlag = WrapTSCancellationFlag {unWrapTSCancellationFlag :: CSize}++isContinue :: CancellationFlag -> Bool+isContinue = (== 0) . unWrapTSCancellationFlag+{-# INLINE isContinue #-}++pattern Continue :: CancellationFlag+pattern Continue = WrapTSCancellationFlag 0++pattern Cancel :: CancellationFlag+pattern Cancel <- (isContinue -> False)+  where+    Cancel = WrapTSCancellationFlag 1++{-# COMPLETE Continue, Cancel #-}++newtype CancellationFlagRef = CancellationFlagRef {unCancellationFlagRef :: ConstPtr CSize}++putCancellationFlag :: CancellationFlagRef -> CancellationFlag -> IO ()+putCancellationFlag = coerce (poke @CSize)+{-# INLINE putCancellationFlag #-}++getCancellationFlag :: CancellationFlagRef -> IO CancellationFlag+getCancellationFlag = coerce (peek @CSize)+{-# INLINE getCancellationFlag #-}++-- | See @`C.ts_parser_set_cancellation_flag`@.+parserSetCancellationFlag :: Parser -> CancellationFlagRef -> IO ()+parserSetCancellationFlag parser cancellationFlagRef =+  withParserAsTSParserPtr parser $ \parserPtr ->+    coerce C.ts_parser_set_cancellation_flag parserPtr cancellationFlagRef++-- | See @`C.ts_parser_cancellation_flag`@.+parserCancellationFlag :: Parser -> IO CancellationFlagRef+parserCancellationFlag parser =+  withParserAsTSParserPtr parser $ \parserPtr ->+    coerce C.ts_parser_cancellation_flag parserPtr++{-| See @'C.ts_parser_print_dot_graphs'@.+| This function throws an 'IOError' if the 'Handle' does not reference a file descriptor.+-}+parserPrintDotGraphs :: Parser -> Handle -> IO ()+parserPrintDotGraphs parser handle = do+  fileDescriptor <- fdFD <$> handleToFd handle+  withParserAsTSParserPtr parser $ \parserPtr ->+    coerce C.ts_parser_print_dot_graphs parserPtr fileDescriptor++-- * Tree++toTree :: Ptr C.TSTree -> IO Tree+toTree = coerce newForeignPtr C.p_ts_tree_delete++withTreeAsTSTreePtr :: Tree -> (Ptr C.TSTree -> IO a) -> IO a+withTreeAsTSTreePtr = withForeignPtr . coerce++toMaybeTree :: Ptr C.TSTree -> IO (Maybe Tree)+toMaybeTree treePtr+  | treePtr == nullPtr = pure Nothing+  | otherwise = Just <$> toTree treePtr++withMaybeTreeAsTSTreePtr :: Maybe Tree -> (Ptr C.TSTree -> IO a) -> IO a+withMaybeTreeAsTSTreePtr mtree action =+  maybe (action nullPtr) (`withTreeAsTSTreePtr` action) mtree++-- | See @`C.ts_tree_copy`@.+treeCopy :: Tree -> IO Tree+treeCopy tree =+  withTreeAsTSTreePtr tree $+    toTree <=< C.ts_tree_copy++{-| Delete the 'Tree'.++See @`C.ts_tree_delete`@.++__Warning__: Using the 'Tree' after calling 'unsafeTreeDelete' leads to undefined behaviour.+-}+unsafeTreeDelete :: Tree -> IO ()+unsafeTreeDelete = coerce finalizeForeignPtr++-- | See @`C.ts_tree_root_node`@.+treeRootNode :: Tree -> IO Node+treeRootNode tree =+  withTreeAsTSTreePtr tree $+    coerce C.ts_tree_root_node++-- | See @`C.ts_tree_root_node_with_offset`@.+treeRootNodeWithOffset :: Tree -> Word32 -> Point -> IO Node+treeRootNodeWithOffset tree offsetBytes offsetExtent =+  withTreeAsTSTreePtr tree $ \treePtr ->+    coerce C.ts_tree_root_node_with_offset treePtr offsetBytes offsetExtent++-- | See @`C.ts_tree_language`@.+treeLanguage :: Tree -> IO Language+treeLanguage tree =+  withTreeAsTSTreePtr tree $+    unsafeToLanguage <=< C.ts_tree_language++-- | See @`C.ts_tree_included_ranges`@.+treeIncludedRanges :: Tree -> IO [Range]+treeIncludedRanges tree = do+  alloca $ \rangesLengthPtr -> do+    rangesPtr <-+      withTreeAsTSTreePtr tree $ \treePtr ->+        C.ts_tree_included_ranges treePtr rangesLengthPtr+    rangesLength <- fromIntegral <$> peek rangesLengthPtr+    coerce <$> peekArray rangesLength rangesPtr++-- | See @`C.ts_tree_edit`@.+treeEdit :: Tree -> InputEdit -> IO ()+treeEdit tree inputEdit =+  withTreeAsTSTreePtr tree $ \treePtr ->+    with (coerce inputEdit) $ \inputEditPtr ->+      C.ts_tree_edit treePtr inputEditPtr++-- | See @`C.ts_tree_get_changed_ranges`@.+treeGetChangedRanges :: Tree -> Tree -> IO [Range]+treeGetChangedRanges oldTree newTree =+  alloca $ \rangesLengthPtr -> do+    rangesPtr <-+      withTreeAsTSTreePtr oldTree $ \oldTreePtr ->+        withTreeAsTSTreePtr newTree $ \newTreePtr ->+          C.ts_tree_get_changed_ranges oldTreePtr newTreePtr rangesLengthPtr+    rangesLength <- fromIntegral <$> peek rangesLengthPtr+    coerce <$> peekArray rangesLength rangesPtr++{-| See @'C.ts_tree_print_dot_graph'@.+| This function throws an 'IOError' if the 'Handle' does not reference a file descriptor.+-}+treePrintDotGraph :: Tree -> Handle -> IO ()+treePrintDotGraph tree handle = do+  fileDescriptor <- fdFD <$> handleToFd handle+  withTreeAsTSTreePtr tree $ \treePtr ->+    C.ts_tree_print_dot_graph treePtr (coerce fileDescriptor)++-- * Node++-- | See @`C.ts_node_type`@.+nodeType :: Node -> IO ByteString+nodeType =+  -- The string returned by ts_node_type is null-terminated+  -- and lives in static and constant memory. Do not free.+  BSU.unsafePackCString <=< coerce C.ts_node_type+{-# INLINE nodeType #-}++-- | See @`C.ts_node_type`@.+nodeTypeAsString :: Node -> IO String+nodeTypeAsString = fmap BSC.unpack . nodeType+{-# INLINE nodeTypeAsString #-}++-- | See @`C.ts_node_symbol`@.+nodeSymbol :: Node -> IO Symbol+nodeSymbol = coerce C.ts_node_symbol+{-# INLINE nodeSymbol #-}++-- | See @`C.ts_node_language`@.+nodeLanguage :: Node -> IO Language+nodeLanguage = unsafeToLanguage <=< coerce C.ts_node_language+{-# INLINE nodeLanguage #-}++-- | See @`C.ts_node_grammar_type`@.+nodeGrammarType :: Node -> IO GrammarType+nodeGrammarType =+  -- The string returned by ts_node_grammar_type is null-terminated+  -- and lives in static and constant memory. Do not free.+  coerce . BSU.unsafePackCString <=< coerce C.ts_node_grammar_type+{-# INLINE nodeGrammarType #-}++-- | See @`C.ts_node_grammar_type`@.+nodeGrammarTypeAsString :: Node -> IO String+nodeGrammarTypeAsString = fmap (BSC.unpack . coerce) . nodeGrammarType+{-# INLINE nodeGrammarTypeAsString #-}++-- | See @`C.ts_node_grammar_symbol`@.+nodeGrammarSymbol :: Node -> IO Symbol+nodeGrammarSymbol = coerce C.ts_node_grammar_symbol+{-# INLINE nodeGrammarSymbol #-}++-- | Get the `Range` for the `Node`.+nodeRange :: Node -> IO Range+nodeRange node = do+  rangeStartByte <- nodeStartByte node+  rangeEndByte <- nodeEndByte node+  rangeStartPoint <- nodeStartPoint node+  rangeEndPoint <- nodeEndPoint node+  pure Range{..}++-- | See @`C.ts_node_start_byte`@.+nodeStartByte :: Node -> IO Word32+nodeStartByte = coerce C.ts_node_start_byte+{-# INLINE nodeStartByte #-}++-- | See @`C.ts_node_start_point`@.+nodeStartPoint :: Node -> IO Point+nodeStartPoint = coerce C.ts_node_start_point+{-# INLINE nodeStartPoint #-}++-- | See @`C.ts_node_end_byte`@.+nodeEndByte :: Node -> IO Word32+nodeEndByte = coerce C.ts_node_end_byte+{-# INLINE nodeEndByte #-}++-- | See @`C.ts_node_end_point`@.+nodeEndPoint :: Node -> IO Point+nodeEndPoint = coerce C.ts_node_end_point+{-# INLINE nodeEndPoint #-}++-- | See @`C.ts_node_string`@.+showNode :: Node -> IO ByteString+showNode = BSU.unsafePackMallocCString <=< coerce C.ts_node_string+{-# INLINE showNode #-}++-- | See @`C.ts_node_string`@.+showNodeAsString :: Node -> IO String+showNodeAsString = fmap BSC.unpack . showNode+{-# INLINE showNodeAsString #-}++-- | See @`C.ts_node_is_null`@.+nodeIsNull :: Node -> IO Bool+nodeIsNull = fmap toBool . C.ts_node_is_null . coerce+{-# INLINE nodeIsNull #-}++-- | See @`C.ts_node_is_named`@.+nodeIsNamed :: Node -> IO Bool+nodeIsNamed = fmap toBool . C.ts_node_is_named . coerce+{-# INLINE nodeIsNamed #-}++-- | See @`C.ts_node_is_missing`@.+nodeIsMissing :: Node -> IO Bool+nodeIsMissing = fmap toBool . C.ts_node_is_missing . coerce+{-# INLINE nodeIsMissing #-}++-- | See @`C.ts_node_is_extra`@.+nodeIsExtra :: Node -> IO Bool+nodeIsExtra = fmap toBool . C.ts_node_is_extra . coerce+{-# INLINE nodeIsExtra #-}++-- | See @`C.ts_node_has_changes`@.+nodeHasChanges :: Node -> IO Bool+nodeHasChanges = fmap toBool . C.ts_node_has_changes . coerce+{-# INLINE nodeHasChanges #-}++-- | See @`C.ts_node_has_error`@.+nodeHasError :: Node -> IO Bool+nodeHasError = fmap toBool . C.ts_node_has_error . coerce+{-# INLINE nodeHasError #-}++-- | See @`C.ts_node_is_error`@.+nodeIsError :: Node -> IO Bool+nodeIsError = fmap toBool . C.ts_node_is_error . coerce+{-# INLINE nodeIsError #-}++-- | See @`C.ts_node_parse_state`@.+nodeParseState :: Node -> IO StateId+nodeParseState = coerce C.ts_node_parse_state+{-# INLINE nodeParseState #-}++-- | See @`C.ts_node_next_parse_state`@.+nodeNextParseState :: Node -> IO StateId+nodeNextParseState = coerce C.ts_node_next_parse_state+{-# INLINE nodeNextParseState #-}++-- | See @`C.ts_node_parent`@.+nodeParent :: Node -> IO Node+nodeParent = coerce C.ts_node_parent+{-# INLINE nodeParent #-}++-- | See @`C.ts_node_child_with_descendant`@.+nodeChildWithDescendant :: Node -> Node -> IO Node+nodeChildWithDescendant = coerce C.ts_node_child_with_descendant+{-# INLINE nodeChildWithDescendant #-}++-- | See @`C.ts_node_child`@.+nodeChild :: Node -> Word32 -> IO Node+nodeChild = coerce C.ts_node_child+{-# INLINE nodeChild #-}++-- | See @`C.ts_node_field_name_for_child`@.+nodeFieldNameForChild :: Node -> Word32 -> IO FieldName+nodeFieldNameForChild node =+  -- The string returned by ts_node_grammar_type is null-terminated+  -- and lives in static and constant memory. Do not free.+  coerce . BSU.unsafePackCString <=< coerce C.ts_node_field_name_for_child node+{-# INLINE nodeFieldNameForChild #-}++-- | See @`C.ts_node_field_name_for_child`@.+nodeFieldNameForChildAsString :: Node -> Word32 -> IO String+nodeFieldNameForChildAsString node childIndex =+  BSC.unpack . coerce <$> nodeFieldNameForChild node childIndex+{-# INLINE nodeFieldNameForChildAsString #-}++-- | See @`C.ts_node_field_name_for_named_child`@.+nodeFieldNameForNamedChild :: Node -> Word32 -> IO FieldName+nodeFieldNameForNamedChild node =+  -- The string returned by ts_node_grammar_type is null-terminated+  -- and lives in static and constant memory. Do not free.+  coerce . BSU.unsafePackCString <=< coerce C.ts_node_field_name_for_named_child node+{-# INLINE nodeFieldNameForNamedChild #-}++-- | See @`C.ts_node_field_name_for_named_child`@.+nodeFieldNameForNamedChildAsString :: Node -> Word32 -> IO String+nodeFieldNameForNamedChildAsString node childIndex =+  BSC.unpack . coerce <$> nodeFieldNameForNamedChild node childIndex+{-# INLINE nodeFieldNameForNamedChildAsString #-}++-- | See @`C.ts_node_child_count`@.+nodeChildCount :: Node -> IO Word32+nodeChildCount = coerce C.ts_node_child_count+{-# INLINE nodeChildCount #-}++-- | See @`C.ts_node_named_child`@.+nodeNamedChild :: Node -> Word32 -> IO Node+nodeNamedChild = coerce C.ts_node_named_child+{-# INLINE nodeNamedChild #-}++-- | See @`C.ts_node_named_child_count`@.+nodeNamedChildCount :: Node -> IO Word32+nodeNamedChildCount = coerce C.ts_node_named_child_count+{-# INLINE nodeNamedChildCount #-}++-- | See @`C.ts_node_child_by_field_name`@.+nodeChildByFieldName :: Node -> FieldName -> IO Node+nodeChildByFieldName node fieldName =+  BSU.unsafeUseAsCStringLen (coerce fieldName) $ \(stringPtr, stringLen) ->+    coerce C.ts_node_child_by_field_name node stringPtr $+      fromIntegral @_ @Word32 stringLen+{-# INLINE nodeChildByFieldName #-}++-- | See @`C.ts_node_child_by_field_id`@.+nodeChildByFieldId :: Node -> FieldId -> IO Node+nodeChildByFieldId = coerce C.ts_node_child_by_field_id+{-# INLINE nodeChildByFieldId #-}++-- | See @`C.ts_node_next_sibling`@.+nodeNextSibling :: Node -> IO Node+nodeNextSibling = coerce C.ts_node_next_sibling+{-# INLINE nodeNextSibling #-}++-- | See @`C.ts_node_prev_sibling`@.+nodePrevSibling :: Node -> IO Node+nodePrevSibling = coerce C.ts_node_prev_sibling+{-# INLINE nodePrevSibling #-}++-- | See @`C.ts_node_next_named_sibling`@.+nodeNextNamedSibling :: Node -> IO Node+nodeNextNamedSibling = coerce C.ts_node_next_named_sibling+{-# INLINE nodeNextNamedSibling #-}++-- | See @`C.ts_node_prev_named_sibling`@.+nodePrevNamedSibling :: Node -> IO Node+nodePrevNamedSibling = coerce C.ts_node_prev_named_sibling+{-# INLINE nodePrevNamedSibling #-}++-- | See @`C.ts_node_first_child_for_byte`@.+nodeFirstChildForByte :: Node -> Word32 -> IO Node+nodeFirstChildForByte = coerce C.ts_node_first_child_for_byte+{-# INLINE nodeFirstChildForByte #-}++-- | See @`C.ts_node_first_named_child_for_byte`@.+nodeFirstNamedChildForByte :: Node -> Word32 -> IO Node+nodeFirstNamedChildForByte = coerce C.ts_node_first_named_child_for_byte+{-# INLINE nodeFirstNamedChildForByte #-}++-- | See @`C.ts_node_descendant_count`@.+nodeDescendantCount :: Node -> IO Word32+nodeDescendantCount = coerce C.ts_node_descendant_count+{-# INLINE nodeDescendantCount #-}++-- | See @`C.ts_node_descendant_for_byte_range`@.+nodeDescendantForByteRange :: Node -> Word32 -> Word32 -> IO Node+nodeDescendantForByteRange = coerce C.ts_node_descendant_for_byte_range+{-# INLINE nodeDescendantForByteRange #-}++-- | See @`C.ts_node_descendant_for_point_range`@.+nodeDescendantForPointRange :: Node -> Point -> Point -> IO Node+nodeDescendantForPointRange = coerce C.ts_node_descendant_for_point_range+{-# INLINE nodeDescendantForPointRange #-}++-- | See @`C.ts_node_named_descendant_for_byte_range`@.+nodeNamedDescendantForByteRange :: Node -> Word32 -> Word32 -> IO Node+nodeNamedDescendantForByteRange = coerce C.ts_node_named_descendant_for_byte_range+{-# INLINE nodeNamedDescendantForByteRange #-}++-- | See @`C.ts_node_named_descendant_for_point_range`@.+nodeNamedDescendantForPointRange :: Node -> Point -> Point -> IO Node+nodeNamedDescendantForPointRange = coerce C.ts_node_named_descendant_for_point_range+{-# INLINE nodeNamedDescendantForPointRange #-}++-- | See @`C.ts_node_edit`@.+nodeEdit :: Node -> InputEdit -> IO ()+nodeEdit node inputEdit =+  with (unWrapTSNode node) $ \nodePtr ->+    with (unWrapTSInputEdit inputEdit) $ \inputEditPtr ->+      coerce C.ts_node_edit nodePtr inputEditPtr+{-# INLINE nodeEdit #-}++-- | See @`C.ts_node_eq`@.+nodeEq :: Node -> Node -> IO Bool+nodeEq node1 node2 =+  toBool <$> C.ts_node_eq (coerce node1) (coerce node2)+{-# INLINE nodeEq #-}++-- * TreeCursor++withTreeCursorAsTSTreeCursorPtr :: TreeCursor -> (Ptr C.TSTreeCursor -> IO a) -> IO a+withTreeCursorAsTSTreeCursorPtr = withForeignPtr . coerce++-- | See @`C.ts_tree_cursor_new`@.+treeCursorNew :: Node -> IO TreeCursor+treeCursorNew node = do+  treeCursorForeignPtr <- mallocForeignPtr+  withForeignPtr treeCursorForeignPtr $ \treeCursorPtr ->+    C.ts_tree_cursor_new_p (coerce node) treeCursorPtr+  addForeignPtrFinalizer C.p_ts_tree_cursor_delete treeCursorForeignPtr+  pure $ WrapTSTreeCursor treeCursorForeignPtr++{-| Delete the 'TreeCursor'.++| See @`C.ts_tree_cursor_delete`@.++__Warning__: Using the 'Tree' after calling 'unsafeTreeCursorDelete' leads to undefined behaviour.+-}+unsafeTreeCursorDelete :: TreeCursor -> IO ()+unsafeTreeCursorDelete = coerce finalizeForeignPtr++-- | See @`C.ts_tree_cursor_reset`@.+treeCursorReset :: TreeCursor -> Node -> IO ()+treeCursorReset treeCursor node =+  withTreeCursorAsTSTreeCursorPtr treeCursor $ \treeCursorPtr ->+    C.ts_tree_cursor_reset treeCursorPtr (coerce node)++-- | See @`C.ts_tree_cursor_reset_to`@.+treeCursorResetTo :: TreeCursor -> TreeCursor -> IO ()+treeCursorResetTo self other =+  withTreeCursorAsTSTreeCursorPtr self $ \selfPtr ->+    withTreeCursorAsTSTreeCursorPtr other $ \otherPtr ->+      coerce C.ts_tree_cursor_reset_to selfPtr otherPtr++-- | See @`C.ts_tree_cursor_current_node`@.+treeCursorCurrentNode :: TreeCursor -> IO Node+treeCursorCurrentNode treeCursor =+  withTreeCursorAsTSTreeCursorPtr treeCursor $ \treeCursorPtr ->+    coerce C.ts_tree_cursor_current_node treeCursorPtr++-- | See @`C.ts_tree_cursor_current_field_name`@.+treeCursorCurrentFieldName :: TreeCursor -> IO (Maybe ByteString)+treeCursorCurrentFieldName treeCursor =+  withTreeCursorAsTSTreeCursorPtr treeCursor $ \treeCursorPtr -> do+    fieldNamePtr <- coerce C.ts_tree_cursor_current_field_name treeCursorPtr+    if fieldNamePtr == nullPtr+      then pure Nothing+      else Just <$> BSU.unsafePackCString fieldNamePtr++-- | See @`C.ts_tree_cursor_current_field_id`@.+treeCursorCurrentFieldId :: TreeCursor -> IO (Maybe FieldId)+treeCursorCurrentFieldId treeCursor =+  withTreeCursorAsTSTreeCursorPtr treeCursor $ \treeCursorPtr -> do+    fieldId <- coerce C.ts_tree_cursor_current_field_id treeCursorPtr+    pure $ if fieldId == 0 then Nothing else Just fieldId++-- | See @`C.ts_tree_cursor_goto_parent`@.+treeCursorGotoParent :: TreeCursor -> IO Bool+treeCursorGotoParent treeCursor =+  withTreeCursorAsTSTreeCursorPtr treeCursor $+    fmap toBool . C.ts_tree_cursor_goto_parent++-- | See @`C.ts_tree_cursor_goto_next_sibling`@.+treeCursorGotoNextSibling :: TreeCursor -> IO Bool+treeCursorGotoNextSibling treeCursor =+  withTreeCursorAsTSTreeCursorPtr treeCursor $+    fmap toBool . C.ts_tree_cursor_goto_next_sibling++-- | See @`C.ts_tree_cursor_goto_previous_sibling`@.+treeCursorGotoPreviousSibling :: TreeCursor -> IO Bool+treeCursorGotoPreviousSibling treeCursor =+  withTreeCursorAsTSTreeCursorPtr treeCursor $+    fmap toBool . C.ts_tree_cursor_goto_previous_sibling++-- | See @`C.ts_tree_cursor_goto_first_child`@.+treeCursorGotoFirstChild :: TreeCursor -> IO Bool+treeCursorGotoFirstChild treeCursor =+  withTreeCursorAsTSTreeCursorPtr treeCursor $+    fmap toBool . C.ts_tree_cursor_goto_first_child++-- | See @`C.ts_tree_cursor_goto_last_child`@.+treeCursorGotoLastChild :: TreeCursor -> IO Bool+treeCursorGotoLastChild treeCursor =+  withTreeCursorAsTSTreeCursorPtr treeCursor $+    fmap toBool . C.ts_tree_cursor_goto_last_child++-- | See @`C.ts_tree_cursor_goto_descendant`@.+treeCursorGotoDescendant :: TreeCursor -> Word32 -> IO ()+treeCursorGotoDescendant treeCursor descsendantIndex =+  withTreeCursorAsTSTreeCursorPtr treeCursor $ \treeCursorPtr ->+    C.ts_tree_cursor_goto_descendant treeCursorPtr descsendantIndex++-- | See @`C.ts_tree_cursor_current_descendant_index`@.+treeCursorCurrentDescendantIndex :: TreeCursor -> IO Word32+treeCursorCurrentDescendantIndex treeCursor =+  withTreeCursorAsTSTreeCursorPtr treeCursor $+    C.ts_tree_cursor_current_descendant_index . coerce++-- | See @`C.ts_tree_cursor_current_depth`@.+treeCursorCurrentDepth :: TreeCursor -> IO Word32+treeCursorCurrentDepth treeCursor =+  withTreeCursorAsTSTreeCursorPtr treeCursor $+    C.ts_tree_cursor_current_depth . coerce++-- | See @`C.ts_tree_cursor_goto_first_child_for_byte`@.+treeCursorGotoFirstChildForByte :: TreeCursor -> Word32 -> IO Int64+treeCursorGotoFirstChildForByte treeCursor goalByte =+  withTreeCursorAsTSTreeCursorPtr treeCursor $ \treeCursorPtr ->+    C.ts_tree_cursor_goto_first_child_for_byte treeCursorPtr goalByte++-- | See @`C.ts_tree_cursor_goto_first_child_for_point`@.+treeCursorGotoFirstChildForPoint :: TreeCursor -> Point -> IO Int64+treeCursorGotoFirstChildForPoint treeCursor point =+  withTreeCursorAsTSTreeCursorPtr treeCursor $ \treeCursorPtr ->+    C.ts_tree_cursor_goto_first_child_for_point treeCursorPtr (coerce point)++-- | See @`C.ts_tree_cursor_copy`@.+treeCursorCopy :: TreeCursor -> IO TreeCursor+treeCursorCopy treeCursor = do+  copyOfTreeCursorForeignPtr <- mallocForeignPtr+  withForeignPtr copyOfTreeCursorForeignPtr $ \copyOfTreeCursorPtr ->+    withTreeCursorAsTSTreeCursorPtr treeCursor $ \treeCursorPtr ->+      C.ts_tree_cursor_copy_p treeCursorPtr copyOfTreeCursorPtr+  addForeignPtrFinalizer C.p_ts_tree_cursor_delete copyOfTreeCursorForeignPtr+  pure $ WrapTSTreeCursor copyOfTreeCursorForeignPtr++-- * Query++withQueryAsTSQueryPtr :: Query -> (Ptr C.TSQuery -> IO a) -> IO a+withQueryAsTSQueryPtr = withForeignPtr . coerce++-- | See @`C.ts_query_new`@.+queryNew :: Language -> ByteString -> IO Query+queryNew language query =+  alloca $ \queryErrorOffsetPtr -> alloca $ \queryErrorTypePtr -> do+    queryPtr <-+      withLanguageAsTSLanguagePtr language $ \languagePtr ->+        BSU.unsafeUseAsCStringLen query $ \(queryPtr, queryLen) ->+          coerce C.ts_query_new languagePtr queryPtr (fromIntegral queryLen :: Word32) queryErrorOffsetPtr queryErrorTypePtr+    queryErrorType' <- peek queryErrorTypePtr+    if queryPtr /= nullPtr+      then assert (queryErrorType' == C.TSQueryErrorNone) $ do+        WrapTSQuery <$> newForeignPtr C.p_ts_query_delete queryPtr+      else assert (queryErrorType' /= C.TSQueryErrorNone) $ do+        queryErrorOffset' <- peek queryErrorOffsetPtr+        let !queryError = makeQueryError query queryErrorOffset' (WrapTSQueryErrorType queryErrorType')+        throwIO queryError++-- | Internal helper: Format a query error.+makeQueryError :: ByteString -> Word32 -> QueryErrorType -> QueryError+makeQueryError query queryErrorOffset queryErrorType = QueryError{..}+ where+  (queryErrorPoint, queryErrorLine) = offsetToPointAndLine query queryErrorOffset+  queryErrorMessage =+    BSC.unpack . BS.toStrict . BSB.toLazyByteString . mconcat $+      [ BSB.stringUtf8 $+          case queryErrorType of+            QueryErrorTypeSyntax -> "Invalid syntax"+            QueryErrorTypeNodeType -> "Invalid node type"+            QueryErrorTypeField -> "Invalid field name"+            QueryErrorTypeCapture -> "Invalid capture name"+            QueryErrorTypeStructure -> "Impossible pattern"+            QueryErrorTypeLanguage -> "Invalid language"+      , BSB.stringUtf8 " at row "+      , BSB.word32Dec $ pointRow queryErrorPoint+      , BSB.stringUtf8 ", column "+      , BSB.word32Dec $ pointColumn queryErrorPoint+      , BSB.stringUtf8 ":\n\n> "+      , BSB.stringUtf8 queryErrorLine+      , BSB.stringUtf8 "\n> "+      , BSB.stringUtf8 (replicate (fromIntegral $ pointColumn queryErrorPoint - 1) ' ')+      , BSB.stringUtf8 "^\n\n"+      ]++-- | Internal helper: Given a byte offset, find the row, column, and line pointed to.+offsetToPointAndLine :: ByteString -> Word32 -> (Point, String)+offsetToPointAndLine str offset = (point, line)+ where+  (prefix, suffix) = BS.splitAt (fromIntegral offset) str+  prefixLine = BSC.unpack $ BSC.takeWhileEnd (/= '\n') prefix+  suffixLine = BSC.unpack $ BSC.takeWhile (/= '\n') suffix+  row = 1 + BSC.count '\n' prefix+  column = 1 + length prefixLine+  point = Point{pointRow = fromIntegral row, pointColumn = fromIntegral column}+  line = prefixLine <> suffixLine++{-| Delete the 'Query' and free the associated memory.++See @`C.ts_query_delete`@.++__Warning__: Using the 'Query' after calling 'unsafeQueryDelete' leads to undefined behaviour.+-}+unsafeQueryDelete :: Query -> IO ()+unsafeQueryDelete = coerce finalizeForeignPtr++-- | See @`C.ts_query_pattern_count`@.+queryPatternCount :: Query -> IO Word32+queryPatternCount query =+  withQueryAsTSQueryPtr query $+    coerce C.ts_query_pattern_count++-- | See @`C.ts_query_capture_count`@.+queryCaptureCount :: Query -> IO Word32+queryCaptureCount query =+  withQueryAsTSQueryPtr query $+    coerce C.ts_query_capture_count++-- | See @`C.ts_query_string_count`@.+queryStringCount :: Query -> IO Word32+queryStringCount query =+  withQueryAsTSQueryPtr query $+    coerce C.ts_query_string_count++-- | See @`C.ts_query_start_byte_for_pattern`@.+queryStartByteForPattern :: Query -> PatternIndex -> IO Word32+queryStartByteForPattern query patternIndex =+  withQueryAsTSQueryPtr query $ \queryPtr ->+    coerce C.ts_query_start_byte_for_pattern queryPtr patternIndex++-- | See @`C.ts_query_end_byte_for_pattern`@.+queryEndByteForPattern :: Query -> PatternIndex -> IO Word32+queryEndByteForPattern query patternIndex =+  withQueryAsTSQueryPtr query $ \queryPtr ->+    coerce C.ts_query_end_byte_for_pattern queryPtr patternIndex++-- -- | See @`ts_query_predicates_for_pattern`@.+queryPredicatesForPattern :: Query -> Word32 -> IO [QueryPredicateStep]+queryPredicatesForPattern query patternIndex = do+  (stepsPtr, stepsLen) <-+    alloca $ \stepCountPtr -> do+      stepsPtr <-+        withQueryAsTSQueryPtr query $ \queryPtr ->+          C.ts_query_predicates_for_pattern (ConstPtr queryPtr) patternIndex stepCountPtr+      stepsLen <- fromIntegral <$> peek stepCountPtr+      pure (unConstPtr stepsPtr, stepsLen)+  coerce $ peekArray @C.TSQueryPredicateStep stepsLen stepsPtr++-- | See @`C.ts_query_is_pattern_rooted`@.+queryIsPatternRooted :: Query -> PatternIndex -> IO Bool+queryIsPatternRooted query patternIndex =+  withQueryAsTSQueryPtr query $ \queryPtr ->+    toBool @CBool <$> coerce C.ts_query_is_pattern_rooted queryPtr patternIndex++-- | See @`C.ts_query_is_pattern_non_local`@.+queryIsPatternNonLocal :: Query -> PatternIndex -> IO Bool+queryIsPatternNonLocal query patternIndex =+  withQueryAsTSQueryPtr query $ \queryPtr ->+    toBool @CBool <$> coerce C.ts_query_is_pattern_non_local queryPtr patternIndex++-- | See @`C.ts_query_is_pattern_guaranteed_at_step`@.+queryIsPatternGuaranteedAtStep :: Query -> Word32 -> IO Bool+queryIsPatternGuaranteedAtStep query byteOffset =+  withQueryAsTSQueryPtr query $ \queryPtr ->+    toBool <$> C.ts_query_is_pattern_guaranteed_at_step (ConstPtr queryPtr) byteOffset++-- | See @`C.ts_query_capture_name_for_id`@.+queryCaptureNameForIndex :: Query -> CaptureIndex -> IO CaptureName+queryCaptureNameForIndex query captureIndex = do+  (namePtr, nameLen) <-+    alloca @Word32 $ \nameLenPtr ->+      (,)+        <$> withQueryAsTSQueryPtr+          query+          ( \queryPtr ->+              coerce C.ts_query_capture_name_for_id queryPtr captureIndex nameLenPtr+          )+        <*> (fromIntegral <$> peek nameLenPtr)+  coerce $ BSU.unsafePackCStringLen (namePtr, nameLen)++-- | See @`C.ts_query_capture_quantifier_for_id`@.+queryCaptureQuantifierForIndex :: Query -> PatternIndex -> CaptureIndex -> IO Quantifier+queryCaptureQuantifierForIndex query patternIndex captureIndex =+  withQueryAsTSQueryPtr query $ \queryPtr ->+    coerce C.ts_query_capture_quantifier_for_id queryPtr patternIndex captureIndex++-- -- | See @`ts_query_string_value_for_id`@.+queryStringValueForIndex :: Query -> CaptureIndex -> IO ByteString+queryStringValueForIndex query captureIndex = do+  (strPtr, strLen) <-+    alloca @Word32 $ \strLenPtr ->+      (,)+        <$> withQueryAsTSQueryPtr+          query+          ( \queryPtr ->+              coerce C.ts_query_string_value_for_id queryPtr captureIndex strLenPtr+          )+        <*> (fromIntegral <$> peek strLenPtr)+  BS.packCStringLen (strPtr, strLen)++-- | See @`C.ts_query_disable_capture`@.+queryDisableCapture :: Query -> CaptureName -> IO ()+queryDisableCapture query captureName =+  withQueryAsTSQueryPtr query $ \queryPtr ->+    BSU.unsafeUseAsCStringLen (coerce captureName) $ \(namePtr, nameLen) ->+      coerce C.ts_query_disable_capture queryPtr namePtr (fromIntegral nameLen :: Word32)++-- | See @`C.ts_query_disable_pattern`@.+queryDisablePattern :: Query -> PatternIndex -> IO ()+queryDisablePattern query patternIndex =+  withQueryAsTSQueryPtr query $ \queryPtr ->+    coerce C.ts_query_disable_pattern queryPtr patternIndex++withQueryCursorAsTSQueryCursorPtr :: QueryCursor -> (Ptr C.TSQueryCursor -> IO a) -> IO a+withQueryCursorAsTSQueryCursorPtr = withForeignPtr . coerce++-- | See @`C.ts_query_cursor_new`@.+queryCursorNew :: IO QueryCursor+queryCursorNew =+  coerce newForeignPtr C.p_ts_query_cursor_delete =<< C.ts_query_cursor_new++-- | See @`C.ts_query_cursor_delete`@.+unsafeQueryCursorDelete :: QueryCursor -> IO ()+unsafeQueryCursorDelete = coerce finalizeForeignPtr++-- | See @`C.ts_query_cursor_exec`@.+queryCursorExec :: QueryCursor -> Query -> Node -> IO ()+queryCursorExec queryCursor query node =+  withQueryCursorAsTSQueryCursorPtr queryCursor $ \queryCursorPtr ->+    withQueryAsTSQueryPtr query $ \queryPtr ->+      coerce C.ts_query_cursor_exec queryCursorPtr queryPtr node++-- | See @`C.ts_query_cursor_did_exceed_match_limit`@.+queryCursorDidExceedMatchLimit :: QueryCursor -> IO Bool+queryCursorDidExceedMatchLimit queryCursor =+  withQueryCursorAsTSQueryCursorPtr queryCursor $ \queryCursorPtr ->+    toBool @CBool <$> coerce C.ts_query_cursor_did_exceed_match_limit queryCursorPtr++-- | See @`C.ts_query_cursor_match_limit`@.+queryCursorMatchLimit :: QueryCursor -> IO Word32+queryCursorMatchLimit queryCursor =+  withQueryCursorAsTSQueryCursorPtr queryCursor $+    coerce C.ts_query_cursor_match_limit++-- | See @`C.ts_query_cursor_set_match_limit`@.+queryCursorSetMatchLimit :: QueryCursor -> Word32 -> IO ()+queryCursorSetMatchLimit queryCursor matchLimit =+  withQueryCursorAsTSQueryCursorPtr queryCursor $ \queryCursorPtr ->+    C.ts_query_cursor_set_match_limit queryCursorPtr matchLimit++-- | See @`C.ts_query_cursor_set_timeout_micros`@.+queryCursorSetTimeoutMicros :: QueryCursor -> Microsecond -> IO ()+queryCursorSetTimeoutMicros queryCursor micros =+  withQueryCursorAsTSQueryCursorPtr queryCursor $ \queryCursorPtr ->+    coerce C.ts_query_cursor_set_timeout_micros queryCursorPtr micros++-- | See @`C.ts_query_cursor_timeout_micros`@.+queryCursorTimeoutMicros :: QueryCursor -> IO Microsecond+queryCursorTimeoutMicros queryCursor =+  withQueryCursorAsTSQueryCursorPtr queryCursor $+    coerce C.ts_query_cursor_timeout_micros++-- | See @`C.ts_query_cursor_set_byte_range`@.+queryCursorSetByteRange :: QueryCursor -> Word32 -> Word32 -> IO ()+queryCursorSetByteRange queryCursor startByte endByte =+  withQueryCursorAsTSQueryCursorPtr queryCursor $ \queryCursorPtr ->+    C.ts_query_cursor_set_byte_range queryCursorPtr startByte endByte++-- | See @`C.ts_query_cursor_set_point_range`@.+queryCursorSetPointRange :: QueryCursor -> Point -> Point -> IO ()+queryCursorSetPointRange queryCursor startPoint endPoint =+  withQueryCursorAsTSQueryCursorPtr queryCursor $ \queryCursorPtr ->+    coerce C.ts_query_cursor_set_point_range queryCursorPtr startPoint endPoint++-- | See @`C.ts_query_cursor_next_match`@.+queryCursorNextMatch :: QueryCursor -> IO (Maybe QueryMatch)+queryCursorNextMatch queryCursor =+  alloca $ \queryMatchPtr -> do+    success <-+      withQueryCursorAsTSQueryCursorPtr queryCursor $ \queryCursorPtr ->+        C.ts_query_cursor_next_match queryCursorPtr queryMatchPtr+    if toBool success+      then do+        queryMatch <- peek queryMatchPtr+        pure . Just . coerce $ queryMatch+      else pure Nothing++-- | See @`C.ts_query_cursor_remove_match`@.+queryCursorRemoveMatch :: QueryCursor -> CaptureIndex -> IO ()+queryCursorRemoveMatch queryCursor captureIndex =+  withQueryCursorAsTSQueryCursorPtr queryCursor $ \queryCursorPtr ->+    coerce C.ts_query_cursor_remove_match queryCursorPtr captureIndex++-- | See @`C.ts_query_cursor_next_capture`@.+queryCursorNextCapture :: QueryCursor -> IO (Maybe (CaptureIndex, QueryMatch))+queryCursorNextCapture queryCursor =+  alloca $ \captureIndexPtr -> alloca $ \queryMatchPtr -> do+    success <-+      withQueryCursorAsTSQueryCursorPtr queryCursor $ \queryCursorPtr ->+        C.ts_query_cursor_next_capture queryCursorPtr queryMatchPtr captureIndexPtr+    if toBool success+      then do+        captureIndex <- peek captureIndexPtr+        queryMatch <- peek queryMatchPtr+        pure . Just . coerce $ (captureIndex, queryMatch)+      else pure Nothing++-- | See @`C.ts_query_cursor_set_max_start_depth`@.+queryCursorSetMaxStartDepth :: QueryCursor -> Word32 -> IO ()+queryCursorSetMaxStartDepth queryCursor maxStartDepth =+  withQueryCursorAsTSQueryCursorPtr queryCursor $ \queryCursorPtr ->+    C.ts_query_cursor_set_max_start_depth queryCursorPtr maxStartDepth++-- * Language++unsafeToLanguage :: ConstPtr tsLanguage -> IO Language+unsafeToLanguage languageConstPtr = do+  let languagePtr = castPtr . unConstPtr $ languageConstPtr+  let languageFinalizer = castFunPtr C.p_ts_language_delete+  languageForeignPtr <- newForeignPtr languageFinalizer languagePtr+  pure $ coerce languageForeignPtr++unsafeLanguageDelete :: Language -> IO ()+unsafeLanguageDelete =+  finalizeForeignPtr . coerce++withLanguageAsTSLanguagePtr :: Language -> (ConstPtr C.TSLanguage -> IO a) -> IO a+withLanguageAsTSLanguagePtr language action =+  withForeignPtr (coerce language) (action . ConstPtr)++-- | See @`C.ts_language_copy`@.+languageCopy :: Language -> IO Language+languageCopy language =+  withLanguageAsTSLanguagePtr language $+    unsafeToLanguage <=< C.ts_language_copy . coerce++-- | See @`C.ts_language_symbol_count`@.+languageSymbolCount :: Language -> IO Word32+languageSymbolCount language =+  withLanguageAsTSLanguagePtr+    language+    C.ts_language_symbol_count++-- | See @`C.ts_language_state_count`@.+languageStateCount :: Language -> IO Word32+languageStateCount language =+  withLanguageAsTSLanguagePtr+    language+    C.ts_language_state_count++-- | See @`C.ts_language_symbol_name`@.+languageSymbolName :: Language -> Symbol -> IO ByteString+languageSymbolName language symbol =+  withLanguageAsTSLanguagePtr language $ \languagePtr ->+    BSU.unsafePackCString =<< coerce C.ts_language_symbol_name languagePtr symbol++-- | See @`C.ts_language_symbol_for_name`@.+languageSymbolForGrammarType :: Language -> ByteString -> Bool -> IO Symbol+languageSymbolForGrammarType language grammarType isNamed =+  withLanguageAsTSLanguagePtr language $ \languagePtr ->+    BSU.unsafeUseAsCStringLen grammarType $ \(grammarTypeStr, grammarTypeLen) ->+      coerce+        C.ts_language_symbol_for_name+        languagePtr+        grammarTypeStr+        (fromIntegral grammarTypeLen :: Word32)+        (fromBool isNamed :: CBool)++-- | See @`C.ts_language_field_count`@.+languageFieldCount :: Language -> IO Word32+languageFieldCount language =+  withLanguageAsTSLanguagePtr language $ \languagePtr ->+    C.ts_language_field_count languagePtr++-- | See @`C.ts_language_field_name_for_id`@.+languageFieldNameForId :: Language -> FieldId -> IO ByteString+languageFieldNameForId language fieldId =+  withLanguageAsTSLanguagePtr language $ \languagePtr ->+    BSU.unsafePackCString =<< coerce C.ts_language_field_name_for_id languagePtr fieldId++-- | See @`C.ts_language_field_id_for_name`@.+languageFieldIdForName :: Language -> ByteString -> IO FieldId+languageFieldIdForName language fieldName =+  withLanguageAsTSLanguagePtr language $ \languagePtr ->+    BSU.unsafeUseAsCStringLen fieldName $ \(fieldNameStr, fieldNameLen) ->+      coerce+        C.ts_language_field_id_for_name+        languagePtr+        fieldNameStr+        (fromIntegral fieldNameLen :: Word32)++-- | See @`C.ts_language_symbol_type`@.+languageSymbolType :: Language -> Symbol -> IO SymbolType+languageSymbolType language symbol =+  withLanguageAsTSLanguagePtr language $ \languagePtr ->+    coerce C.ts_language_symbol_type languagePtr symbol++-- | See @`C.ts_language_version`@.+languageVersion :: Language -> IO Word32+languageVersion language =+  withLanguageAsTSLanguagePtr language C.ts_language_version++-- | See @`C.ts_language_next_state`@.+languageNextState :: Language -> StateId -> Symbol -> IO StateId+languageNextState language stateId symbol =+  withLanguageAsTSLanguagePtr language $ \languagePtr ->+    coerce C.ts_language_next_state languagePtr stateId symbol++-- * Lookahead Iterator++withLookaheadIteratorAsTSLookaheadIteratorPtr :: LookaheadIterator -> (ConstPtr C.TSLookaheadIterator -> IO a) -> IO a+withLookaheadIteratorAsTSLookaheadIteratorPtr lookaheadIterator action =+  withForeignPtr (coerce lookaheadIterator) (action . ConstPtr)++-- | See @`C.ts_lookahead_iterator_new`@.+lookaheadIteratorNew :: Language -> StateId -> IO LookaheadIterator+lookaheadIteratorNew language stateId =+  withLanguageAsTSLanguagePtr language $ \languagePtr ->+    coerce newForeignPtr C.p_ts_lookahead_iterator_delete+      =<< C.ts_lookahead_iterator_new languagePtr (coerce stateId)++{-| See @`C.ts_lookahead_iterator_delete`@.++    __Warning__: Using the `LookaheadIterator` after calling `unsafeLookaheadIteratorDelete` leads to undefined behaviour.+-}+unsafeLookaheadIteratorDelete :: LookaheadIterator -> IO ()+unsafeLookaheadIteratorDelete = coerce finalizeForeignPtr++-- | See @`C.ts_lookahead_iterator_reset_state`@.+lookaheadIteratorResetState :: LookaheadIterator -> StateId -> IO Bool+lookaheadIteratorResetState lookaheadIterator stateId =+  withLookaheadIteratorAsTSLookaheadIteratorPtr lookaheadIterator $ \lookaheadIteratorPtr -> do+    toBool @CBool <$> coerce C.ts_lookahead_iterator_reset_state lookaheadIteratorPtr stateId++-- | See @`C.ts_lookahead_iterator_reset`@.+lookaheadIteratorReset :: LookaheadIterator -> Language -> StateId -> IO Bool+lookaheadIteratorReset lookaheadIterator language stateId = do+  withLanguageAsTSLanguagePtr language $ \languagePtr ->+    withLookaheadIteratorAsTSLookaheadIteratorPtr lookaheadIterator $ \lookaheadIteratorPtr ->+      toBool @CBool <$> coerce C.ts_lookahead_iterator_reset lookaheadIteratorPtr languagePtr stateId++-- | See @`C.ts_lookahead_iterator_language`@.+lookaheadIteratorLanguage :: LookaheadIterator -> IO Language+lookaheadIteratorLanguage lookaheadIterator =+  withLookaheadIteratorAsTSLookaheadIteratorPtr lookaheadIterator $+    unsafeToLanguage <=< coerce C.ts_lookahead_iterator_language++-- | See @`C.ts_lookahead_iterator_next`@.+lookaheadIteratorNext :: LookaheadIterator -> IO Bool+lookaheadIteratorNext lookaheadIterator =+  withLookaheadIteratorAsTSLookaheadIteratorPtr lookaheadIterator $ \lookaheadIteratorPtr ->+    toBool @CBool <$> coerce C.ts_lookahead_iterator_next lookaheadIteratorPtr++-- | See @`C.ts_lookahead_iterator_current_symbol`@.+lookaheadIteratorCurrentSymbol :: LookaheadIterator -> IO Symbol+lookaheadIteratorCurrentSymbol lookaheadIterator =+  withLookaheadIteratorAsTSLookaheadIteratorPtr lookaheadIterator $ \lookaheadIteratorPtr ->+    coerce C.ts_lookahead_iterator_current_symbol lookaheadIteratorPtr++-- | See @`C.ts_lookahead_iterator_current_symbol_name`@.+lookaheadIteratorCurrentSymbolName :: LookaheadIterator -> IO ByteString+lookaheadIteratorCurrentSymbolName lookaheadIterator =+  withLookaheadIteratorAsTSLookaheadIteratorPtr lookaheadIterator $+    BSU.unsafePackCString <=< coerce C.ts_lookahead_iterator_current_symbol_name++-- * Global Configuration++-- -- | See @`C.ts_set_allocator`@.+-- setAllocator :: FunPtr (CSize -> IO ()) -> FunPtr (CSize -> CSize -> IO ()) -> FunPtr (Ptr a -> CSize -> IO ()) -> FunPtr (Ptr a -> IO ()) -> IO ()+-- setAllocator = undefined -- C.ts_set_allocator
+ src-internal/TreeSitter/Internal/ST.hs view
@@ -0,0 +1,504 @@+{-# LANGUAGE RoleAnnotations #-}++module TreeSitter.Internal.ST (+  -- * Types+  FieldId (..),+  FieldName (..),+  GrammarType (..),+  InputEdit (..),+  Point (..),+  StateId (..),+  Symbol (..),+  SymbolType (..),+  Language,+  Node,+  TreeCursor,++  -- * Tree+  treeRootNode,+  treeRootNodeWithOffset,++  -- * Node+  nodeType,+  nodeTypeAsString,+  nodeSymbol,+  nodeLanguage,+  nodeGrammarType,+  nodeGrammarTypeAsString,+  nodeGrammarSymbol,+  nodeStartByte,+  nodeStartPoint,+  nodeEndByte,+  nodeEndPoint,+  showNode,+  showNodeAsString,+  nodeIsNull,+  nodeIsNamed,+  nodeIsMissing,+  nodeIsExtra,+  nodeHasChanges,+  nodeHasError,+  nodeIsError,+  nodeParseState,+  nodeNextParseState,+  nodeParent,+  nodeChildWithDescendant,+  nodeChild,+  nodeFieldNameForChild,+  nodeFieldNameForChildAsString,+  nodeFieldNameForNamedChild,+  nodeFieldNameForNamedChildAsString,+  nodeChildCount,+  nodeNamedChild,+  nodeNamedChildCount,+  nodeChildByFieldName,+  nodeChildByFieldId,+  nodeNextSibling,+  nodePrevSibling,+  nodeNextNamedSibling,+  nodePrevNamedSibling,+  nodeFirstChildForByte,+  nodeFirstNamedChildForByte,+  nodeDescendantCount,+  nodeDescendantForByteRange,+  nodeDescendantForPointRange,+  nodeNamedDescendantForByteRange,+  nodeNamedDescendantForPointRange,+  nodeEdit,+  nodeEq,++  -- * TreeCursor+  treeCursorNew,+  treeCursorReset,+  treeCursorResetTo,+  treeCursorCurrentNode,+  treeCursorCurrentFieldName,+  treeCursorCurrentFieldId,+  treeCursorGotoParent,+  treeCursorGotoNextSibling,+  treeCursorGotoPreviousSibling,+  treeCursorGotoFirstChild,+  treeCursorGotoLastChild,+  treeCursorGotoDescendant,+  treeCursorCurrentDescendantIndex,+  treeCursorCurrentDepth,+  treeCursorGotoFirstChildForByte,+  treeCursorGotoFirstChildForPoint,+  treeCursorCopy,++  -- * Language+  languageCopy,+  languageSymbolCount,+  languageStateCount,+  languageSymbolName,+  languageSymbolForGrammarType,+  languageFieldCount,+  languageFieldNameForId,+  languageFieldIdForName,+  languageSymbolType,+  languageVersion,+  languageNextState,+) where++import Control.Monad.ST (ST)+import Control.Monad.ST.Unsafe (unsafeIOToST)+import Data.ByteString (ByteString)+import Data.Coerce (coerce)+import Data.Int (Int64)+import Data.Word (Word32)+import TreeSitter.Internal (+  FieldId (..),+  FieldName (..),+  GrammarType (..),+  InputEdit (..),+  Point (..),+  StateId (..),+  Symbol (..),+  SymbolType (..),+ )+import TreeSitter.Internal qualified as TSIO++--------------------------------------------------------------------------------++{-# ANN module ("HLint: ignore Redundant lambda" :: String) #-}++--------------------------------------------------------------------------------++-- * Types++newtype Language s = WrapIOLanguage TSIO.Language++type role Language nominal++newtype Node s = WrapIONode TSIO.Node++type role Node nominal++newtype TreeCursor s = WrapIOTreeCursor TSIO.TreeCursor++type role TreeCursor nominal++-- * Tree++-- | See @`TSIO.treeRootNode`@.+treeRootNode :: TSIO.Tree -> ST s (Node s)+treeRootNode = unsafeIOToST . coerce . TSIO.treeRootNode+{-# INLINE treeRootNode #-}++-- | See @`TSIO.treeRootNodeWithOffset`@.+treeRootNodeWithOffset :: TSIO.Tree -> Word32 -> TSIO.Point -> ST s (Node s)+treeRootNodeWithOffset = ((unsafeIOToST .) .) . coerce TSIO.treeRootNodeWithOffset+{-# INLINE treeRootNodeWithOffset #-}++-- * Node++-- | See @`TSIO.nodeType`@.+nodeType :: Node s -> ST s ByteString+nodeType = unsafeIOToST . coerce TSIO.nodeType+{-# INLINE nodeType #-}++-- -- | See @`TSIO.nodeType`@.+nodeTypeAsString :: Node s -> ST s String+nodeTypeAsString = unsafeIOToST . coerce TSIO.nodeTypeAsString+{-# INLINE nodeTypeAsString #-}++-- | See @`TSIO.nodeSymbol`@.+nodeSymbol :: Node s -> ST s TSIO.Symbol+nodeSymbol = unsafeIOToST . coerce TSIO.nodeSymbol+{-# INLINE nodeSymbol #-}++-- | See @`TSIO.nodeLanguage`@.+nodeLanguage :: Node s -> ST s TSIO.Language+nodeLanguage = unsafeIOToST . coerce TSIO.nodeLanguage+{-# INLINE nodeLanguage #-}++-- | See @`TSIO.nodeGrammarType`@.+nodeGrammarType :: Node s -> ST s GrammarType+nodeGrammarType = unsafeIOToST . coerce TSIO.nodeGrammarType+{-# INLINE nodeGrammarType #-}++-- | See @`TSIO.nodeGrammarType`@.+nodeGrammarTypeAsString :: Node s -> ST s String+nodeGrammarTypeAsString = unsafeIOToST . coerce TSIO.nodeGrammarTypeAsString+{-# INLINE nodeGrammarTypeAsString #-}++-- | See @`TSIO.nodeGrammarSymbol`@.+nodeGrammarSymbol :: Node s -> ST s Symbol+nodeGrammarSymbol = unsafeIOToST . coerce TSIO.nodeGrammarSymbol+{-# INLINE nodeGrammarSymbol #-}++-- | See @`TSIO.nodeStartByte`@.+nodeStartByte :: Node s -> ST s Word32+nodeStartByte = unsafeIOToST . coerce TSIO.nodeStartByte+{-# INLINE nodeStartByte #-}++-- | See @`TSIO.nodeStartPoint`@.+nodeStartPoint :: Node s -> ST s Point+nodeStartPoint = unsafeIOToST . coerce TSIO.nodeStartPoint+{-# INLINE nodeStartPoint #-}++-- | See @`TSIO.nodeEndByte`@.+nodeEndByte :: Node s -> ST s Word32+nodeEndByte = unsafeIOToST . coerce TSIO.nodeEndByte+{-# INLINE nodeEndByte #-}++-- | See @`TSIO.nodeEndPoint`@.+nodeEndPoint :: Node s -> ST s Point+nodeEndPoint = unsafeIOToST . coerce TSIO.nodeEndPoint+{-# INLINE nodeEndPoint #-}++-- | See @`TSIO.nodeString`@.+showNode :: Node s -> ST s ByteString+showNode = unsafeIOToST . coerce TSIO.showNode+{-# INLINE showNode #-}++-- | See @`TSIO.nodeString`@.+showNodeAsString :: Node s -> ST s String+showNodeAsString = unsafeIOToST . coerce TSIO.showNodeAsString+{-# INLINE showNodeAsString #-}++-- | See @`TSIO.nodeIsNull`@.+nodeIsNull :: Node s -> ST s Bool+nodeIsNull = unsafeIOToST . coerce TSIO.nodeIsNull+{-# INLINE nodeIsNull #-}++-- | See @`TSIO.nodeIsNamed`@.+nodeIsNamed :: Node s -> ST s Bool+nodeIsNamed = unsafeIOToST . coerce TSIO.nodeIsNamed+{-# INLINE nodeIsNamed #-}++-- | See @`TSIO.nodeIsMissing`@.+nodeIsMissing :: Node s -> ST s Bool+nodeIsMissing = unsafeIOToST . coerce TSIO.nodeIsMissing+{-# INLINE nodeIsMissing #-}++-- | See @`TSIO.nodeIsExtra`@.+nodeIsExtra :: Node s -> ST s Bool+nodeIsExtra = unsafeIOToST . coerce TSIO.nodeIsExtra+{-# INLINE nodeIsExtra #-}++-- | See @`TSIO.nodeHasChanges`@.+nodeHasChanges :: Node s -> ST s Bool+nodeHasChanges = unsafeIOToST . coerce TSIO.nodeHasChanges+{-# INLINE nodeHasChanges #-}++-- | See @`TSIO.nodeHasError`@.+nodeHasError :: Node s -> ST s Bool+nodeHasError = unsafeIOToST . coerce TSIO.nodeHasError+{-# INLINE nodeHasError #-}++-- | See @`TSIO.nodeIsError`@.+nodeIsError :: Node s -> ST s Bool+nodeIsError = unsafeIOToST . coerce TSIO.nodeIsError+{-# INLINE nodeIsError #-}++-- | See @`TSIO.nodeParseState`@.+nodeParseState :: Node s -> ST s StateId+nodeParseState = unsafeIOToST . coerce TSIO.nodeParseState+{-# INLINE nodeParseState #-}++-- | See @`TSIO.nodeNextParseState`@.+nodeNextParseState :: Node s -> ST s StateId+nodeNextParseState = unsafeIOToST . coerce TSIO.nodeNextParseState+{-# INLINE nodeNextParseState #-}++-- | See @`TSIO.nodeParent`@.+nodeParent :: Node s -> ST s (Node s)+nodeParent = unsafeIOToST . coerce TSIO.nodeParent+{-# INLINE nodeParent #-}++-- | See @`TSIO.nodeChildWithDescen[dant`@.+nodeChildWithDescendant :: Node s -> Node s -> ST s (Node s)+nodeChildWithDescendant = (unsafeIOToST .) . coerce TSIO.nodeChildWithDescendant+{-# INLINE nodeChildWithDescendant #-}++-- | See @`TSIO.nodeChild`@.+nodeChild :: Node s -> Word32 -> ST s (Node s)+nodeChild = (unsafeIOToST .) . coerce TSIO.nodeChild+{-# INLINE nodeChild #-}++-- | See @`TSIO.nodeFieldNameForChild`@.+nodeFieldNameForChild :: Node s -> Word32 -> ST s FieldName+nodeFieldNameForChild = (unsafeIOToST .) . coerce TSIO.nodeFieldNameForChild+{-# INLINE nodeFieldNameForChild #-}++-- | See @`TSIO.nodeFieldNameForChild`@.+nodeFieldNameForChildAsString :: Node s -> Word32 -> ST s String+nodeFieldNameForChildAsString = (unsafeIOToST .) . coerce TSIO.nodeFieldNameForChildAsString+{-# INLINE nodeFieldNameForChildAsString #-}++-- | See @`TSIO.nodeFieldNameForNamedChild`@.+nodeFieldNameForNamedChild :: Node s -> Word32 -> ST s FieldName+nodeFieldNameForNamedChild = (unsafeIOToST .) . coerce TSIO.nodeFieldNameForNamedChild+{-# INLINE nodeFieldNameForNamedChild #-}++-- | See @`TSIO.nodeFieldNameForNamedChild`@.+nodeFieldNameForNamedChildAsString :: Node s -> Word32 -> ST s String+nodeFieldNameForNamedChildAsString = (unsafeIOToST .) . coerce TSIO.nodeFieldNameForNamedChildAsString+{-# INLINE nodeFieldNameForNamedChildAsString #-}++-- | See @`TSIO.nodeChildCount`@.+nodeChildCount :: Node s -> ST s Word32+nodeChildCount = unsafeIOToST . coerce TSIO.nodeChildCount+{-# INLINE nodeChildCount #-}++-- | See @`TSIO.nodeNamedChild`@.+nodeNamedChild :: Node s -> Word32 -> ST s (Node s)+nodeNamedChild = (unsafeIOToST .) . coerce TSIO.nodeNamedChild+{-# INLINE nodeNamedChild #-}++-- | See @`TSIO.nodeNamedChildCount`@.+nodeNamedChildCount :: Node s -> ST s Word32+nodeNamedChildCount = unsafeIOToST . coerce TSIO.nodeNamedChildCount+{-# INLINE nodeNamedChildCount #-}++-- | See @`TSIO.nodeChildByFieldName`@.+nodeChildByFieldName :: Node s -> FieldName -> ST s (Node s)+nodeChildByFieldName = (unsafeIOToST .) . coerce TSIO.nodeChildByFieldName+{-# INLINE nodeChildByFieldName #-}++-- | See @`TSIO.nodeChildByFieldId`@.+nodeChildByFieldId :: Node s -> FieldId -> ST s (Node s)+nodeChildByFieldId = (unsafeIOToST .) . coerce TSIO.nodeChildByFieldId+{-# INLINE nodeChildByFieldId #-}++-- | See @`TSIO.nodeNextSibling`@.+nodeNextSibling :: Node s -> ST s (Node s)+nodeNextSibling = unsafeIOToST . coerce TSIO.nodeNextSibling+{-# INLINE nodeNextSibling #-}++-- | See @`TSIO.nodePrevSibling`@.+nodePrevSibling :: Node s -> ST s (Node s)+nodePrevSibling = unsafeIOToST . coerce TSIO.nodePrevSibling+{-# INLINE nodePrevSibling #-}++-- | See @`TSIO.nodeNextNamedSibling`@.+nodeNextNamedSibling :: Node s -> ST s (Node s)+nodeNextNamedSibling = unsafeIOToST . coerce TSIO.nodeNextNamedSibling+{-# INLINE nodeNextNamedSibling #-}++-- | See @`TSIO.nodePrevNamedSibling`@.+nodePrevNamedSibling :: Node s -> ST s (Node s)+nodePrevNamedSibling = unsafeIOToST . coerce TSIO.nodePrevNamedSibling+{-# INLINE nodePrevNamedSibling #-}++-- | See @`TSIO.nodeFirstChildForByte`@.+nodeFirstChildForByte :: Node s -> Word32 -> ST s (Node s)+nodeFirstChildForByte = (unsafeIOToST .) . coerce TSIO.nodeFirstChildForByte+{-# INLINE nodeFirstChildForByte #-}++-- | See @`TSIO.nodeFirstNamedChildForByte`@.+nodeFirstNamedChildForByte :: Node s -> Word32 -> ST s (Node s)+nodeFirstNamedChildForByte = (unsafeIOToST .) . coerce TSIO.nodeFirstNamedChildForByte+{-# INLINE nodeFirstNamedChildForByte #-}++-- | See @`TSIO.nodeDescendantCount`@.+nodeDescendantCount :: Node s -> ST s Word32+nodeDescendantCount = unsafeIOToST . coerce TSIO.nodeDescendantCount+{-# INLINE nodeDescendantCount #-}++-- | See @`TSIO.nodeDescendantForByteRange`@.+nodeDescendantForByteRange :: Node s -> Word32 -> Word32 -> ST s (Node s)+nodeDescendantForByteRange = ((unsafeIOToST .) .) . coerce TSIO.nodeDescendantForByteRange+{-# INLINE nodeDescendantForByteRange #-}++-- | See @`TSIO.nodeDescendantForPointRange`@.+nodeDescendantForPointRange :: Node s -> Point -> Point -> ST s (Node s)+nodeDescendantForPointRange = ((unsafeIOToST .) .) . coerce TSIO.nodeDescendantForPointRange+{-# INLINE nodeDescendantForPointRange #-}++-- | See @`TSIO.nodeNamedDescendantForByteRange`@.+nodeNamedDescendantForByteRange :: Node s -> Word32 -> Word32 -> ST s (Node s)+nodeNamedDescendantForByteRange = ((unsafeIOToST .) .) . coerce TSIO.nodeNamedDescendantForByteRange+{-# INLINE nodeNamedDescendantForByteRange #-}++-- | See @`TSIO.nodeNamedDescendantForPointRange`@.+nodeNamedDescendantForPointRange :: Node s -> Point -> Point -> ST s (Node s)+nodeNamedDescendantForPointRange = ((unsafeIOToST .) .) . coerce TSIO.nodeNamedDescendantForPointRange+{-# INLINE nodeNamedDescendantForPointRange #-}++-- | See @`TSIO.nodeEdit`@.+nodeEdit :: Node s -> InputEdit -> ST s ()+nodeEdit = (unsafeIOToST .) . coerce TSIO.nodeEdit+{-# INLINE nodeEdit #-}++-- | See @`TSIO.nodeEq`@.+nodeEq :: Node s -> Node s -> ST s Bool+nodeEq = (unsafeIOToST .) . coerce TSIO.nodeEq+{-# INLINE nodeEq #-}++-- * TreeCursor++-- | See @`TSIO.treeCursorNew`@.+treeCursorNew :: Node s -> ST s (TreeCursor s)+treeCursorNew = unsafeIOToST . coerce TSIO.treeCursorNew++-- | See @`TSIO.treeCursorReset`@.+treeCursorReset :: TreeCursor s -> Node s -> ST s ()+treeCursorReset = (unsafeIOToST .) . coerce TSIO.treeCursorReset++-- | See @`TSIO.treeCursorResetTo`@.+treeCursorResetTo :: TreeCursor s -> TreeCursor s -> ST s ()+treeCursorResetTo = (unsafeIOToST .) . coerce TSIO.treeCursorResetTo++-- | See @`TSIO.treeCursorCurrentNode`@.+treeCursorCurrentNode :: TreeCursor s -> ST s (Node s)+treeCursorCurrentNode = unsafeIOToST . coerce TSIO.treeCursorCurrentNode++-- | See @`TSIO.treeCursorCurrentFieldName`@.+treeCursorCurrentFieldName :: TreeCursor s -> ST s (Maybe FieldName)+treeCursorCurrentFieldName = unsafeIOToST . coerce TSIO.treeCursorCurrentFieldName++-- | See @`TSIO.treeCursorCurrentFieldId`@.+treeCursorCurrentFieldId :: TreeCursor s -> ST s (Maybe FieldId)+treeCursorCurrentFieldId = unsafeIOToST . coerce TSIO.treeCursorCurrentFieldId++-- | See @`TSIO.treeCursorGotoParent`@.+treeCursorGotoParent :: TreeCursor s -> ST s Bool+treeCursorGotoParent = unsafeIOToST . coerce TSIO.treeCursorGotoParent++-- | See @`TSIO.treeCursorGotoNextSibling`@.+treeCursorGotoNextSibling :: TreeCursor s -> ST s Bool+treeCursorGotoNextSibling = unsafeIOToST . coerce TSIO.treeCursorGotoNextSibling++-- | See @`TSIO.treeCursorGotoPreviousSibling`@.+treeCursorGotoPreviousSibling :: TreeCursor s -> ST s Bool+treeCursorGotoPreviousSibling = unsafeIOToST . coerce TSIO.treeCursorGotoPreviousSibling++-- | See @`TSIO.treeCursorGotoFirstChild`@.+treeCursorGotoFirstChild :: TreeCursor s -> ST s Bool+treeCursorGotoFirstChild = unsafeIOToST . coerce TSIO.treeCursorGotoFirstChild++-- | See @`TSIO.treeCursorGotoLastChild`@.+treeCursorGotoLastChild :: TreeCursor s -> ST s Bool+treeCursorGotoLastChild = unsafeIOToST . coerce TSIO.treeCursorGotoLastChild++-- | See @`TSIO.treeCursorGotoDescendant`@.+treeCursorGotoDescendant :: TreeCursor s -> Word32 -> ST s ()+treeCursorGotoDescendant = (unsafeIOToST .) . coerce TSIO.treeCursorGotoDescendant++-- | See @`TSIO.treeCursorCurrentDescendantIndex`@.+treeCursorCurrentDescendantIndex :: TreeCursor s -> ST s Word32+treeCursorCurrentDescendantIndex = unsafeIOToST . coerce TSIO.treeCursorCurrentDescendantIndex++-- | See @`TSIO.treeCursorCurrentDepth`@.+treeCursorCurrentDepth :: TreeCursor s -> ST s Word32+treeCursorCurrentDepth = unsafeIOToST . coerce TSIO.treeCursorCurrentDepth++-- | See @`TSIO.treeCursorGotoFirstChildForByte`@.+treeCursorGotoFirstChildForByte :: TreeCursor s -> Word32 -> ST s Int64+treeCursorGotoFirstChildForByte = (unsafeIOToST .) . coerce TSIO.treeCursorGotoFirstChildForByte++-- | See @`TSIO.treeCursorGotoFirstChildForPoint`@.+treeCursorGotoFirstChildForPoint :: TreeCursor s -> Point -> ST s Int64+treeCursorGotoFirstChildForPoint = (unsafeIOToST .) . coerce TSIO.treeCursorGotoFirstChildForPoint++-- | See @`TSIO.treeCursorCopy`@.+treeCursorCopy :: TreeCursor s -> ST s (TreeCursor s)+treeCursorCopy = unsafeIOToST . coerce TSIO.treeCursorCopy++-- * Language++-- | See @`C.ts_language_copy`@.+languageCopy :: Language s -> ST s (Language s)+languageCopy = unsafeIOToST . coerce TSIO.languageCopy++-- | See @`C.ts_language_symbol_count`@.+languageSymbolCount :: Language s -> ST s Word32+languageSymbolCount = unsafeIOToST . coerce TSIO.languageSymbolCount++-- | See @`C.ts_language_state_count`@.+languageStateCount :: Language s -> ST s Word32+languageStateCount = unsafeIOToST . coerce TSIO.languageStateCount++-- | See @`C.ts_language_symbol_name`@.+languageSymbolName :: Language s -> Symbol -> ST s ByteString+languageSymbolName = (unsafeIOToST .) . coerce TSIO.languageSymbolName++-- | See @`C.ts_language_symbol_for_name`@.+languageSymbolForGrammarType :: Language s -> ByteString -> Bool -> ST s Symbol+languageSymbolForGrammarType = ((unsafeIOToST .) .) . coerce TSIO.languageSymbolForGrammarType++-- | See @`C.ts_language_field_count`@.+languageFieldCount :: Language s -> ST s Word32+languageFieldCount = unsafeIOToST . coerce TSIO.languageFieldCount++-- | See @`C.ts_language_field_name_for_id`@.+languageFieldNameForId :: Language s -> FieldId -> ST s ByteString+languageFieldNameForId = (unsafeIOToST .) . coerce TSIO.languageFieldNameForId++-- | See @`C.ts_language_field_id_for_name`@.+languageFieldIdForName :: Language s -> ByteString -> ST s FieldId+languageFieldIdForName = (unsafeIOToST .) . coerce TSIO.languageFieldIdForName++-- | See @`C.ts_language_symbol_type`@.+languageSymbolType :: Language s -> Symbol -> ST s SymbolType+languageSymbolType = (unsafeIOToST .) . coerce TSIO.languageSymbolType++-- | See @`C.ts_language_version`@.+languageVersion :: Language s -> ST s Word32+languageVersion = unsafeIOToST . coerce TSIO.languageVersion++-- | See @`C.ts_language_next_state`@.+languageNextState :: Language s -> StateId -> Symbol -> ST s StateId+languageNextState = ((unsafeIOToST .) .) . coerce TSIO.languageNextState
+ src/TreeSitter.hs view
@@ -0,0 +1,217 @@+{-# LANGUAGE RankNTypes #-}++module TreeSitter (+  -- * ABI Versioning+  TREE_SITTER_LANGUAGE_VERSION,+  TREE_SITTER_MIN_COMPATIBLE_LANGUAGE_VERSION,++  -- * Types+  Symbol (..),+  StateId (..),+  GrammarType (..),+  FieldId (..),+  FieldName (..),+  CaptureName (..),+  CaptureIndex (..),+  PatternIndex (..),+  Language,+  Parser,+  Tree,+  Query,+  QueryCursor,+  LookaheadIterator,+  InputEncoding (InputEncodingUTF8, InputEncodingUTF16),+  SymbolType (SymbolTypeRegular, SymbolTypeAnonymous, SymbolTypeSupertype, SymbolTypeAuxiliary),+  Point (Point, pointColumn, pointRow),+  Range (Range, rangeStartPoint, rangeEndPoint, rangeStartByte, rangeEndByte),+  Input,+  LogType (LogTypeLex, LogTypeParse),+  InputEdit (InputEdit, inputEditStartByte, inputEditOldEndByte, inputEditNewEndByte, inputEditStartPoint, inputEditOldEndPoint, inputEditNewEndPoint),+  Node,+  NodeId (..),+  nodeId,+  TreeCursor,+  TreeCursorId (..),+  QueryCapture,+  Quantifier,+  QueryMatch,+  QueryPredicateStepType,+  QueryPredicateStep,+  QueryErrorType (QueryErrorTypeSyntax, QueryErrorTypeNodeType, QueryErrorTypeField, QueryErrorTypeCapture, QueryErrorTypeStructure, QueryErrorTypeLanguage),+  QueryError (..),++  -- * Parser+  parserNew,+  unsafeParserDelete,+  withParser,+  parserSetLanguage,+  parserLanguage,+  parserSetIncludedRanges,+  parserIncludedRanges,+  parserSetLogger,+  parserLogger,+  parserHasLogger,+  parserRemoveLogger,+  parserParse,+  parserParseString,+  parserParseByteString,+  parserParseByteStringWithEncoding,+  parserReset,+  Microsecond (..),+  parserSetTimeoutMicros,+  parserTimeoutMicros,+  CancellationFlag (Cancel, Continue),+  CancellationFlagRef,+  getCancellationFlag,+  putCancellationFlag,+  parserSetCancellationFlag,+  parserCancellationFlag,+  parserPrintDotGraphs,++  -- * Tree+  treeCopy,+  unsafeTreeDelete,+  treeRootNode,+  treeRootNodeWithOffset,+  treeLanguage,+  treeIncludedRanges,+  treeEdit,+  treeGetChangedRanges,+  treePrintDotGraph,++  -- * Node+  nodeType,+  nodeTypeAsString,+  nodeSymbol,+  nodeLanguage,+  nodeGrammarType,+  nodeGrammarTypeAsString,+  nodeGrammarSymbol,+  nodeRange,+  nodeStartByte,+  nodeStartPoint,+  nodeEndByte,+  nodeEndPoint,+  showNode,+  showNodeAsString,+  nodeIsNull,+  nodeIsNamed,+  nodeIsMissing,+  nodeIsExtra,+  nodeHasChanges,+  nodeHasError,+  nodeIsError,+  nodeParseState,+  nodeNextParseState,+  nodeParent,+  nodeChildWithDescendant,+  nodeChild,+  nodeFieldNameForChild,+  nodeFieldNameForChildAsString,+  nodeFieldNameForNamedChild,+  nodeFieldNameForNamedChildAsString,+  nodeChildCount,+  nodeNamedChild,+  nodeNamedChildCount,+  nodeChildByFieldName,+  nodeChildByFieldId,+  nodeNextSibling,+  nodePrevSibling,+  nodeNextNamedSibling,+  nodePrevNamedSibling,+  nodeFirstChildForByte,+  nodeFirstNamedChildForByte,+  nodeDescendantCount,+  nodeDescendantForByteRange,+  nodeDescendantForPointRange,+  nodeNamedDescendantForByteRange,+  nodeNamedDescendantForPointRange,+  nodeEdit,+  nodeEq,++  -- * TreeCursor+  treeCursorNew,+  unsafeTreeCursorDelete,+  treeCursorReset,+  treeCursorResetTo,+  treeCursorCurrentNode,+  treeCursorCurrentFieldName,+  treeCursorCurrentFieldId,+  treeCursorGotoParent,+  treeCursorGotoNextSibling,+  treeCursorGotoPreviousSibling,+  treeCursorGotoFirstChild,+  treeCursorGotoLastChild,+  treeCursorGotoDescendant,+  treeCursorCurrentDescendantIndex,+  treeCursorCurrentDepth,+  treeCursorGotoFirstChildForByte,+  treeCursorGotoFirstChildForPoint,+  treeCursorCopy,++  -- * Query+  queryNew,+  unsafeQueryDelete,+  queryPatternCount,+  queryCaptureCount,+  queryStringCount,+  queryStartByteForPattern,+  queryEndByteForPattern,+  queryPredicatesForPattern,+  queryIsPatternRooted,+  queryIsPatternNonLocal,+  queryIsPatternGuaranteedAtStep,+  queryCaptureNameForIndex,+  queryCaptureQuantifierForIndex,+  queryStringValueForIndex,+  queryDisableCapture,+  queryDisablePattern,+  queryCursorNew,+  unsafeQueryCursorDelete,+  queryCursorExec,+  queryCursorDidExceedMatchLimit,+  queryCursorMatchLimit,+  queryCursorSetMatchLimit,+  queryCursorSetTimeoutMicros,+  queryCursorTimeoutMicros,+  queryCursorSetByteRange,+  queryCursorSetPointRange,+  queryCursorNextMatch,+  queryCursorRemoveMatch,+  queryCursorNextCapture,+  queryCursorSetMaxStartDepth,++  -- * Language+  unsafeToLanguage,+  unsafeLanguageDelete,+  languageCopy,+  languageSymbolCount,+  languageStateCount,+  languageSymbolName,+  languageSymbolForGrammarType,+  languageFieldCount,+  languageFieldNameForId,+  languageFieldIdForName,+  languageSymbolType,+  languageVersion,+  languageNextState,++  -- * Lookahead Iterator+  withLookaheadIteratorAsTSLookaheadIteratorPtr,+  lookaheadIteratorNew,+  unsafeLookaheadIteratorDelete,+  lookaheadIteratorResetState,+  lookaheadIteratorReset,+  lookaheadIteratorLanguage,+  lookaheadIteratorNext,+  lookaheadIteratorCurrentSymbol,+  lookaheadIteratorCurrentSymbolName,+) where++import TreeSitter.Internal++--------------------------------------------------------------------------------++{-# ANN module "HLint: ignore TreeSitter.Internal should be imported post-qualified or with an explicit import list" #-}++--------------------------------------------------------------------------------