From 1b26460fb3b5df5215cc1e6715661cbc7c950085 Mon Sep 17 00:00:00 2001 From: Alec Theriault Date: Thu, 31 Jan 2019 01:37:25 -0800 Subject: Use `.hie` files for the Hyperlinker backend (#977) # Summary This is a large architectural change to the Hyperlinker. * extract link (and now also type) information from `.hie` instead of doing ad-hoc SYB traversals of the `RenamedSource`. Also adds a superb type-on-hover feature (#715). * re-engineer the lexer to avoid needless string conversions. By going directly through GHC's `P` monad and taking bytestring slices, we avoid a ton of allocation and have better handling of position pragmas and CPP. In terms of performance, the Haddock side of things has gotten _much_ more efficient. Unfortunately, much of this is cancelled out by the increased GHC workload for generating `.hie` files. For the full set of boot libs (including `ghc`-the-library) * the sum of total time went down by 9-10% overall * the sum of total allocations went down by 6-7% # Motivation Haddock is moving towards working entirely over `.hi` and `.hie` files. This change means we no longer need the `RenamedSource` from `TypecheckedModule` (something which is _not_ in `.hi` files). # Details Along the way a bunch of things were fixed: * Cross package (and other) links are now more reliable (#496) * The lexer tries to recover from errors on every line (instead of at CPP boundaries) * `LINE`/`COLUMN` pragmas are taken into account * filter out zero length tokens before rendering * avoid recomputing the `ModuleName`-based `SrcMap` * remove the last use of `Documentation.Haddock.Utf8` (see #998) * restructure temporary folder logic for `.hi`/`.hie` model --- hypsrc-test/ref/src/Identifiers.html | 1485 +++++++++++++++++++++++----------- 1 file changed, 1020 insertions(+), 465 deletions(-) (limited to 'hypsrc-test/ref/src/Identifiers.html') diff --git a/hypsrc-test/ref/src/Identifiers.html b/hypsrc-test/ref/src/Identifiers.html index ce69ad37..301761c1 100644 --- a/hypsrc-test/ref/src/Identifiers.html +++ b/hypsrc-test/ref/src/Identifiers.html @@ -19,641 +19,1040 @@ > foofoo, barbar, bazbaz :: IntInt -> IntInt -> IntInt foo x yfoo :: Int -> Int -> Int +foo x :: Int +x y :: Int +y = x + xInt +x *Int -> Int -> Int +forall a. Num a => a -> a -> a ++ barInt +x yInt -> Int -> Int +forall a. Num a => a -> a -> a +* xInt -> Int -> Int +bar *Int +y yInt +x +Int -> Int -> Int +forall a. Num a => a -> a -> a +* y + >Int bary xInt -> Int -> Int +forall a. Num a => a -> a -> a ++ Int +y +bar :: Int -> Int -> Int +bar x :: Int +x y :: Int +y = y + xInt +y -Int -> Int -> Int +forall a. Num a => a -> a -> a ++ bazInt +x xInt -> Int -> Int +forall a. Num a => a -> a -> a +- yInt -> Int -> Int +baz -Int +x xInt +y +Int -> Int -> Int +forall a. Num a => a -> a -> a +- y + >Int bazx xInt -> Int -> Int +forall a. Num a => a -> a -> a ++ Int +y +baz :: Int -> Int -> Int +baz x :: Int +x y :: Int +y = xInt +x *Int -> Int -> Int +forall a. Num a => a -> a -> a +* yInt +y *Int -> Int -> Int +forall a. Num a => a -> a -> a +* yInt +y *Int -> Int -> Int +forall a. Num a => a -> a -> a +* yInt +y *Int -> Int -> Int +forall a. Num a => a -> a -> a +* xInt +x quuxquux :: IntInt -> IntInt quux xquux :: Int -> Int +quux x :: Int +x = fooInt -> Int -> Int +foo (barInt -> Int -> Int +bar xInt +x xInt +x) (barInt -> Int -> Int +bar xInt +x xInt +x) norfnorf :: IntInt -> IntInt -> IntInt -> IntInt norf x y znorf :: Int -> Int -> Int -> Int +norf x :: Int +x y :: Int +y z :: Int +z | xInt +x <Int -> Int -> Bool +forall a. Ord a => a -> a -> Bool +< 00 = quuxInt -> Int +quux xInt +x | yInt +y <Int -> Int -> Bool +forall a. Ord a => a -> a -> Bool +< 00 = quuxInt -> Int +quux yInt +y | zInt +z <Int -> Int -> Bool +forall a. Ord a => a -> a -> Bool +< 00 = quuxInt -> Int +quux zInt +z | otherwiseBool +otherwise = norfInt -> Int -> Int -> Int +norf (-xInt +x)(-yInt +y)(-zInt +z) mainmain :: IOIO mainmain :: IO () +main putStrLnString -> IO () +putStrLn .(String -> IO ()) -> (Int -> String) -> Int -> IO () +forall b c a. (b -> c) -> (a -> b) -> a -> c +. showInt -> String +forall a. Show a => a -> String +show $(Int -> IO ()) -> Int -> IO () +forall a b. (a -> b) -> a -> b +$ fooInt -> Int -> Int +foo xInt +x yInt +y putStrLnString -> IO () +putStrLn .(String -> IO ()) -> (Int -> String) -> Int -> IO () +forall b c a. (b -> c) -> (a -> b) -> a -> c +. showInt -> String +forall a. Show a => a -> String +show $(Int -> IO ()) -> Int -> IO () +forall a b. (a -> b) -> a -> b +$ quuxInt -> Int +quux zInt +z putStrLnString -> IO () +putStrLn .(String -> IO ()) -> (Int -> String) -> Int -> IO () +forall b c a. (b -> c) -> (a -> b) -> a -> c +. showInt -> String +forall a. Show a => a -> String +show $(Int -> IO ()) -> Int -> IO () +forall a b. (a -> b) -> a -> b +$ Identifiers.norfInt -> Int -> Int -> Int +Identifiers.norf xInt +x yInt +y zInt +z xx :: Int +x = 1010 yy :: Int +y = 2020 zz :: Int +z = 3030 +> \ No newline at end of file -- cgit v1.2.3