Files
rose-ash/lib/haskell/tests/parse-extras.sx
giles 4510e7e475
Some checks failed
Test, Build, and Deploy / test-build-deploy (push) Failing after 21s
haskell: Phase 17 — import declarations anywhere among top-level decls
hk-collect-module-body previously ran a fixed import-loop at the start
and then a separate decl-loop; merged into a single hk-body-step
dispatcher that routes `import` to the imports list and everything else
to hk-parse-decl. Both call sites (initial step + post-semicolon loop)
use the dispatcher. The eval side reads imports as a list (not by AST
position) so mid-stream imports feed into hk-bind-decls! unchanged.

tests/parse-extras.sx 12 → 17: very-top, mid-stream, post-main,
two-imports-different-positions, unqualified-mid-file. Regression
sweep clean: eval 66/0, exceptions 14/0, typecheck 15/0, records 14/0,
ioref 13/0, map 26/0, set 17/0.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-10 19:11:36 +00:00

103 lines
2.3 KiB
Plaintext

;; Phase 17 — parser polish unit tests.
(hk-test
"type-ann: literal int annotated"
(hk-deep-force (hk-run "main = (42 :: Int)"))
42)
(hk-test
"type-ann: arithmetic annotated"
(hk-deep-force (hk-run "main = (1 + 2 :: Int)"))
3)
(hk-test
"type-ann: function arg annotated"
(hk-deep-force
(hk-run "f x = x + 1\nmain = f (1 :: Int)"))
2)
(hk-test
"type-ann: string annotated"
(hk-deep-force (hk-run "main = (\"hi\" :: String)"))
"hi")
(hk-test
"type-ann: bool annotated"
(hk-deep-force (hk-run "main = (True :: Bool)"))
(list "True"))
(hk-test
"type-ann: tuple annotated"
(hk-deep-force (hk-run "main = ((1, 2) :: (Int, Int))"))
(list "Tuple" 1 2))
(hk-test
"type-ann: nested annotation in arithmetic"
(hk-deep-force (hk-run "main = (1 :: Int) + (2 :: Int)"))
3)
(hk-test
"type-ann: function-typed annotation passes through eval"
(hk-deep-force
(hk-run "main = let f = ((\\x -> x + 1) :: Int -> Int) in f 5"))
6)
(hk-test
"no regression: plain parens still work"
(hk-deep-force (hk-run "main = (5)"))
5)
(hk-test
"no regression: 3-tuple still works"
(hk-deep-force (hk-run "main = (1, 2, 3)"))
(list "Tuple" 1 2 3))
(hk-test
"no regression: section-left still works"
(hk-deep-force (hk-run "main = (3 +) 4"))
7)
(hk-test
"no regression: section-right still works"
(hk-deep-force (hk-run "main = (+ 3) 4"))
7)
(hk-test
"import: still works as the very first decl"
(hk-deep-force
(hk-run "import qualified Data.IORef as I
main = do { r <- I.newIORef 7; I.readIORef r }"))
(list "IO" 7))
(hk-test
"import: between decls — after main"
(hk-deep-force
(hk-run "main = do { r <- I.newIORef 11; I.readIORef r }
import qualified Data.IORef as I"))
(list "IO" 11))
(hk-test
"import: between two decls — uses helper after import"
(hk-deep-force
(hk-run "f x = x + 100
import qualified Data.IORef as I
main = do { r <- I.newIORef 5; I.modifyIORef r f; I.readIORef r }"))
(list "IO" 105))
(hk-test
"import: two imports in different positions"
(hk-deep-force
(hk-run "import qualified Data.IORef as I
helper x = x * 2
import qualified Data.Map as M
main = do { r <- I.newIORef (helper 21); I.readIORef r }"))
(list "IO" 42))
(hk-test
"import: unqualified, mid-file"
(hk-deep-force
(hk-run "go x = x
import Data.IORef
main = go 9"))
9)