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/Classes.html | 1652 +++++++++++++++++++++++--------------- 1 file changed, 1021 insertions(+), 631 deletions(-) (limited to 'hypsrc-test/ref/src/Classes.html') diff --git a/hypsrc-test/ref/src/Classes.html b/hypsrc-test/ref/src/Classes.html index d2604e82..dd1e6ebc 100644 --- a/hypsrc-test/ref/src/Classes.html +++ b/hypsrc-test/ref/src/Classes.html @@ -19,36 +19,40 @@ > class FooFoo aa barbar :: aa -> IntInt bazbaz :: IntInt (aa, aa) instance FooFoo IntInt barbar :: Int -> Int +bar = idInt -> Int +forall a. a -> a +id baz xbaz :: Int -> (Int, Int) +baz x :: Int +x (xInt +x, xInt +x) instance Foo [a] where + >instance Foo [a] where bar = length + > bar :: [a] -> Int bar = [a] -> Int +forall (t :: * -> *) a. Foldable t => t a -> Int +length + baz :: Int -> ([a], [a]) +baz baz _ = ([], [])_ = ([], []) class FooFoo aa => Foo'Foo' aa quuxquux (aa, aa)-> aa quux (x, y) = norf [x, y]quux (x :: a +x, y :: a +y) = [a] -> a +forall a. Foo' a => [a] -> a +norf [a +x, a +y] norfnorf [aa]-> aa norf = quux . baz . sum . map barnorf = (a, a) -> a +forall a. Foo' a => (a, a) -> a +quux ((a, a) -> a) -> ([a] -> (a, a)) -> [a] -> a +forall b c a. (b -> c) -> (a -> b) -> a -> c +. Int -> (a, a) +forall a. Foo a => Int -> (a, a) +baz (Int -> (a, a)) -> ([a] -> Int) -> [a] -> (a, a) +forall b c a. (b -> c) -> (a -> b) -> a -> c +. [Int] -> Int +forall (t :: * -> *) a. (Foldable t, Num a) => t a -> a +sum ([Int] -> Int) -> ([a] -> [Int]) -> [a] -> Int +forall b c a. (b -> c) -> (a -> b) -> a -> c +. (a -> Int) -> [a] -> [Int] +forall a b. (a -> b) -> [a] -> [b] +map a -> Int +forall a. Foo a => a -> Int +bar instance Foo' IntFoo' Int norfnorf :: [Int] -> Int +norf = sum[Int] -> Int +forall (t :: * -> *) a. (Foldable t, Num a) => t a -> a +sum instance Foo' [a] where + >instance Foo' [a] where quux = uncurry (++) quux :: ([a], [a]) -> [a] +quux = ([a] -> [a] -> [a]) -> ([a], [a]) -> [a] +forall a b c. (a -> b -> c) -> (a, b) -> c +uncurry [a] -> [a] -> [a] +forall a. [a] -> [a] -> [a] +(++) class PlughPlugh pp plugh :: p a a -> p b b -> p (a -> b) (b -> a)plugh :: p a a -> p b b -> p (a -> b) (b -> a) instance PlughPlugh EitherEither plughplugh :: Either a a -> Either b b -> Either (a -> b) (b -> a) +plugh (LeftLeft aa :: a +a)= Right(b -> a) -> Either (a -> b) (b -> a) +forall a b. b -> Either a b +Right $((b -> a) -> Either (a -> b) (b -> a)) +-> (b -> a) -> Either (a -> b) (b -> a) +forall a b. (a -> b) -> a -> b +$ consta -> b -> a +forall a b. a -> b -> a +const aa +a plughplugh (RightRight aa :: a +a)= Right(b -> a) -> Either (a -> b) (b -> a) +forall a b. b -> Either a b +Right $((b -> a) -> Either (a -> b) (b -> a)) +-> (b -> a) -> Either (a -> b) (b -> a) +forall a b. (a -> b) -> a -> b +$ consta -> b -> a +forall a b. a -> b -> a +const aa +a plughplugh (LeftLeft bb :: b +b)= Left(a -> b) -> Either (a -> b) (b -> a) +forall a b. a -> Either a b +Left $((a -> b) -> Either (a -> b) (b -> a)) +-> (a -> b) -> Either (a -> b) (b -> a) +forall a b. (a -> b) -> a -> b +$ constb -> a -> b +forall a b. a -> b -> a +const bb +b plughplugh (RightRight bb :: b +b)= Left(a -> b) -> Either (a -> b) (b -> a) +forall a b. a -> Either a b +Left $((a -> b) -> Either (a -> b) (b -> a)) +-> (a -> b) -> Either (a -> b) (b -> a) +forall a b. (a -> b) -> a -> b +$ constb -> a -> b +forall a b. a -> b -> a +const bb +b