difftastic/vendor/tree-sitter-haskell
Wilfred Hughes 2e0a7da8ea Merge commit 'cf394604ae2ec2a5e65b1afbc7dea21258ede403' 2022-07-10 23:00:27 +07:00
..
.github/workflows Merge commit 'ed976b81b00ce7b72b99bca75e7a616cc526220c' 2022-04-17 16:50:04 +07:00
bindings Merge commit 'cf394604ae2ec2a5e65b1afbc7dea21258ede403' 2022-07-10 23:00:27 +07:00
examples Add 'vendor/tree-sitter-haskell/' from commit 'bf7d643b494b7c7eed909ed7fbd8447231152cb0' 2021-09-22 09:50:50 +07:00
grammar Merge commit 'cf394604ae2ec2a5e65b1afbc7dea21258ede403' 2022-07-10 23:00:27 +07:00
queries Merge commit 'cf394604ae2ec2a5e65b1afbc7dea21258ede403' 2022-07-10 23:00:27 +07:00
script Merge commit 'cf394604ae2ec2a5e65b1afbc7dea21258ede403' 2022-07-10 23:00:27 +07:00
src Merge commit 'cf394604ae2ec2a5e65b1afbc7dea21258ede403' 2022-07-10 23:00:27 +07:00
test Merge commit 'cf394604ae2ec2a5e65b1afbc7dea21258ede403' 2022-07-10 23:00:27 +07:00
.gitattributes Add 'vendor/tree-sitter-haskell/' from commit 'bf7d643b494b7c7eed909ed7fbd8447231152cb0' 2021-09-22 09:50:50 +07:00
.gitignore Merge commit 'ed976b81b00ce7b72b99bca75e7a616cc526220c' 2022-04-17 16:50:04 +07:00
.npmignore Add 'vendor/tree-sitter-haskell/' from commit 'bf7d643b494b7c7eed909ed7fbd8447231152cb0' 2021-09-22 09:50:50 +07:00
Cargo.lock Merge commit 'cf394604ae2ec2a5e65b1afbc7dea21258ede403' 2022-07-10 23:00:27 +07:00
Cargo.toml Merge commit 'cf394604ae2ec2a5e65b1afbc7dea21258ede403' 2022-07-10 23:00:27 +07:00
LICENSE Add 'vendor/tree-sitter-haskell/' from commit 'bf7d643b494b7c7eed909ed7fbd8447231152cb0' 2021-09-22 09:50:50 +07:00
Makefile Merge commit 'ed976b81b00ce7b72b99bca75e7a616cc526220c' 2022-04-17 16:50:04 +07:00
README.md Merge commit 'cf394604ae2ec2a5e65b1afbc7dea21258ede403' 2022-07-10 23:00:27 +07:00
binding.gyp Add 'vendor/tree-sitter-haskell/' from commit 'bf7d643b494b7c7eed909ed7fbd8447231152cb0' 2021-09-22 09:50:50 +07:00
grammar.js Merge commit 'cf394604ae2ec2a5e65b1afbc7dea21258ede403' 2022-07-10 23:00:27 +07:00
package.json Merge commit 'ed976b81b00ce7b72b99bca75e7a616cc526220c' 2022-04-17 16:50:04 +07:00
tree-sitter-haskell.wasm Merge commit 'ed976b81b00ce7b72b99bca75e7a616cc526220c' 2022-04-17 16:50:04 +07:00
tree-sitter.patch Merge commit 'ed976b81b00ce7b72b99bca75e7a616cc526220c' 2022-04-17 16:50:04 +07:00

README.md

tree-sitter-haskell

CI

Haskell grammar for tree-sitter.

References

Building with nvim-treesitter

When installing the grammar from source, be sure to include the scanner in the source files:

lua <<EOF
local parser_config = require "nvim-treesitter.parsers".get_parser_configs()
parser_config.haskell = {
  install_info = {
    url = "~/path/to/tree-sitter-haskell",
    files = {"src/parser.c", "src/scanner.c"}
  }
}
EOF

Supported Language Extensions

These extensions are supported , unsupported or not applicable because they don't involve parsing :

  • AllowAmbiguousTypes
  • ApplicativeDo
  • Arrows
  • BangPatterns
  • BinaryLiterals
  • BlockArguments
  • CApiFFI
  • ConstrainedClassMethods
  • ConstraintKinds
  • CPP
  • CUSKs
  • DataKinds
  • DatatypeContexts
  • DefaultSignatures
  • DeriveAnyClass
  • DeriveDataTypeable
  • DeriveFoldable
  • DeriveFunctor
  • DeriveGeneric
  • DeriveLift
  • DeriveTraversable
  • DerivingStrategies
  • DerivingVia
  • DisambiguateRecordFields
  • DuplicateRecordFields
  • EmptyCase
  • EmptyDataDecls
  • EmptyDataDeriving
  • ExistentialQuantification
  • ExplicitForAll
  • ExplicitNamespaces
  • ExtendedDefaultRules
  • FlexibleContexts
  • FlexibleInstances
  • ForeignFunctionInterface
  • FunctionalDependencies
  • GADTs
  • GADTSyntax
  • GeneralisedNewtypeDeriving
  • GHCForeignImportPrim
  • Haskell2010
  • Haskell98
  • HexFloatLiterals
  • ImplicitParams
  • ImplicitPrelude
  • ImportQualifiedPost
  • ImpredicativeTypes
  • IncoherentInstances
  • InstanceSigs
  • InterruptibleFFI
  • KindSignatures
  • LambdaCase
  • LexicalNegation
  • LiberalTypeSynonyms
  • LinearTypes
  • MagicHash
  • Modifiers
  • MonadComprehensions
  • MonadFailDesugaring
  • MonoLocalBinds
  • MonomorphismRestriction
  • MultiParamTypeClasses
  • MultiWayIf
  • NamedFieldPuns
  • NamedWildCards
  • NegativeLiterals
  • NondecreasingIndentation
  • NPlusKPatterns
  • NullaryTypeClasses
  • NumDecimals
  • NumericUnderscores
  • OverlappingInstances
  • OverloadedLabels
  • OverloadedLists
  • OverloadedStrings
  • PackageImports
  • ParallelListComp
  • PartialTypeSignatures
  • PatternGuards
  • PatternSynonyms
  • PolyKinds
  • PostfixOperators
  • QualifiedDo
  • QuantifiedConstraints
  • QuasiQuotes
  • Rank2Types
  • RankNTypes
  • RebindableSyntax
  • RecordWildCards
  • RecursiveDo
  • RoleAnnotations
  • Safe
  • ScopedTypeVariables
  • StandaloneDeriving
  • StandaloneKindSignatures
  • StarIsType
  • StaticPointers
  • Strict
  • StrictData
  • TemplateHaskell
  • TemplateHaskellQuotes
  • TraditionalRecordSyntax
  • TransformListComp
  • Trustworthy
  • TupleSections
  • TypeApplications
  • TypeFamilies
  • TypeFamilyDependencies
  • TypeInType
  • TypeOperators
  • TypeSynonymInstances
  • UnboxedSums
  • UnboxedTuples
  • UndecidableInstances
  • UndecidableSuperClasses
  • UnicodeSyntax
  • UnliftedFFITypes
  • UnliftedNewtypes
  • Unsafe
  • ViewPatterns

Bugs

CPP

Preprocessor #elif and #else directives cannot be handled correctly, since the parser state would have to be manually reset to what it was at the #if. As a workaround, the code blocks in the alternative branches are parsed as part of the directives.

Layout

NondecreasingIndentation is not supported (yet?).

Operators on newlines in do

A strange edge case is when an infix operator follows an expression statement of a do block with an indent of less or equal the do's layout column:

f = do
  readSomething
  >>= doSomething

The >>= causes the do's layout to be terminated, resulting in an AST similar to

f = (do readSomething) >>= doSomething

This is checked heuristically, probably unreliably.

Testing

Requires: tree-sitter(-cli)

Run test corpus

These are stored in ./tests/corpus/

$ tree-sitter test

Test parsing an example codebase

Requires: bc
This will print the percentage of the codebase parsed, and the time taken

$ ./script/parse-examples             # this clones all repos
$ ./script/parse-example <example>    # where <example> is a project under ./examples/

Enable scanner debug output

To get an extra-verbose scanner, unoptimized, with debug symbols:

$ CFLAGS='-DDEBUG' make debug.so
$ cp debug.so $HOME/.cache/tree-sitter/lib/haskell.so    # So `tree-sitter-cli` uses our binary
$ tree-sitter test
$ ./script/parse-example <example>

If you want to debug the scanner with gdb, you can b tree_sitter_haskell_external_scanner_scan with tree-sitter test.

Create visual graph of parser steps

Requires: graphviz

$ tree-sitter parse -D test/Basic.hs    # Produces log.html