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/Records.html | 1346 +++++++++++++++++++++++++------------- 1 file changed, 900 insertions(+), 446 deletions(-) (limited to 'hypsrc-test/ref/src/Records.html') diff --git a/hypsrc-test/ref/src/Records.html b/hypsrc-test/ref/src/Records.html index 7d23d114..bc99cc56 100644 --- a/hypsrc-test/ref/src/Records.html +++ b/hypsrc-test/ref/src/Records.html @@ -11,25 +11,25 @@ > {-# LANGUAGE RecordWildCards #-} module data PointPoint = PointPoint { xPoint -> Int +x !IntInt , yPoint -> Int +y !IntInt pointpoint :: IntInt -> IntInt -> PointPoint point x ypoint :: Int -> Int -> Point +point x :: Int +x y :: Int +y = Point$WPoint :: Int -> Int -> Point +Point { xx :: Int +x = xInt +x, yy :: Int +y = yInt +y lengthSqrlengthSqr :: PointPoint -> IntInt lengthSqrlengthSqr :: Point -> Int +lengthSqr (PointPoint { xx :: Point -> Int +x = xInt +x, yy :: Point -> Int +y = yInt +y = xInt +x *Int -> Int -> Int +forall a. Num a => a -> a -> a +* 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 lengthSqr'lengthSqr' :: PointPoint -> IntInt lengthSqr'lengthSqr' :: Point -> Int +lengthSqr' (PointPoint { xInt +x :: Int +x :: Point -> Int +x, yInt +y :: Int +y :: Point -> Int +y = 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 *Int -> Int -> Int +forall a. Num a => a -> a -> a +* xInt +x translateXtranslateX, translateYtranslateY :: PointPoint -> IntInt -> PointPoint translateX p dtranslateX :: Point -> Int -> Point +translateX p :: Point +p d :: Int +d = pPoint +p { xx :: Int +x = xPoint -> Int +x pPoint +p +Int -> Int -> Int +forall a. Num a => a -> a -> a ++ dInt +d translateY p dtranslateY :: Point -> Int -> Point +translateY p :: Point +p d :: Int +d = pPoint +p { yy :: Int +y = yPoint -> Int +y pPoint +p +Int -> Int -> Int +forall a. Num a => a -> a -> a ++ dInt +d translatetranslate :: IntInt -> IntInt -> PointPoint -> PointPoint translate x y ptranslate :: Int -> Int -> Point -> Point +translate x :: Int +x y :: Int +y p :: Point +p auxPoint -> Point +aux pPoint +p (dxdx :: Int +dx, dydy :: Int +dy) (xInt +x, yInt +y) aux Point{..}aux :: Point -> Point +aux Point{..} = pPoint +p { xx :: Int +x = xInt +x +Int -> Int -> Int +forall a. Num a => a -> a -> a ++ dxInt +dx, yy :: Int +y = yInt +y +Int -> Int -> Int +forall a. Num a => a -> a -> a ++ dyInt +dy