From 1b26460fb3b5df5215cc1e6715661cbc7c950085 Mon Sep 17 00:00:00 2001 From: Alec Theriault <alec.theriault@gmail.com> 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/ClangCppBug.html | 306 +++++++++++++++++++++++++++++++++++ 1 file changed, 306 insertions(+) create mode 100644 hypsrc-test/ref/src/ClangCppBug.html (limited to 'hypsrc-test/ref/src/ClangCppBug.html') diff --git a/hypsrc-test/ref/src/ClangCppBug.html b/hypsrc-test/ref/src/ClangCppBug.html new file mode 100644 index 00000000..42d0cfc0 --- /dev/null +++ b/hypsrc-test/ref/src/ClangCppBug.html @@ -0,0 +1,306 @@ +<html xmlns="http://www.w3.org/1999/xhtml" +><head + ><link rel="stylesheet" type="text/css" href="style.css" + /><script type="text/javascript" src="highlight.js" + ></script + ></head + ><body + ><pre + ><span class="hs-pragma" + >{-# LANGUAGE CPP #-}</span + ><span + > +</span + ><span id="line-2" + ></span + ><span class="hs-keyword" + >module</span + ><span + > </span + ><span class="hs-identifier" + >ClangCppBug</span + ><span + > </span + ><span class="hs-keyword" + >where</span + ><span + > +</span + ><span id="line-3" + ></span + ><span + > +</span + ><span id="line-4" + ></span + ><span class="annot" + ><a href="ClangCppBug.html#foo" + ><span class="hs-identifier hs-type" + >foo</span + ></a + ></span + ><span + > </span + ><span class="hs-glyph" + >::</span + ><span + > </span + ><span class="annot" + ><span class="hs-identifier hs-type" + >Int</span + ></span + ><span + > +</span + ><span id="line-5" + ></span + ><span id="foo" + ><span class="annot" + ><span class="annottext" + >foo :: Int +</span + ><a href="ClangCppBug.html#foo" + ><span class="hs-identifier hs-var hs-var" + >foo</span + ></a + ></span + ></span + ><span + > </span + ><span class="hs-glyph" + >=</span + ><span + > </span + ><span class="annot" + ><span class="hs-number" + >1</span + ></span + ><span + > +</span + ><span id="line-6" + ></span + ><span + > +</span + ><span id="line-7" + ></span + ><span class="hs-comment" + >-- Clang doesn't mind these:</span + ><span class="hs-cpp" + > +#define BAX 2 +</span + ><span class="hs-pragma" + >{-# INLINE</span + ><span + > </span + ><span class="annot" + ><a href="ClangCppBug.html#bar" + ><span class="hs-pragma hs-type" + >bar</span + ></a + ></span + ><span + > </span + ><span class="hs-pragma" + >#-}</span + ><span + > +</span + ><span id="line-10" + ></span + ><span + > +</span + ><span id="line-11" + ></span + ><span class="annot" + ><a href="ClangCppBug.html#bar" + ><span class="hs-identifier hs-type" + >bar</span + ></a + ></span + ><span + > </span + ><span class="hs-glyph" + >::</span + ><span + > </span + ><span class="annot" + ><span class="hs-identifier hs-type" + >Int</span + ></span + ><span + > +</span + ><span id="line-12" + ></span + ><span id="bar" + ><span class="annot" + ><span class="annottext" + >bar :: Int +</span + ><a href="ClangCppBug.html#bar" + ><span class="hs-identifier hs-var hs-var" + >bar</span + ></a + ></span + ></span + ><span + > </span + ><span class="hs-glyph" + >=</span + ><span + > </span + ><span class="annot" + ><span class="hs-number" + >3</span + ></span + ><span + > +</span + ><span id="line-13" + ></span + ><span + > +</span + ><span id="line-14" + ></span + ><span class="hs-comment" + >-- But it doesn't like this:</span + ><span + > +</span + ><span id="line-15" + ></span + ><span class="hs-pragma" + >{-# RULES</span + ><span + > +</span + ><span id="line-16" + ></span + ><span class="annot" + ><span class="hs-pragma" + >"bar/qux"</span + ></span + ><span + > </span + ><span class="annot" + ><a href="ClangCppBug.html#bar" + ><span class="hs-pragma hs-type" + >bar</span + ></a + ></span + ><span + > </span + ><span class="hs-pragma" + >=</span + ><span + > </span + ><span class="annot" + ><a href="ClangCppBug.html#qux" + ><span class="hs-pragma hs-type" + >qux</span + ></a + ></span + ><span + > +</span + ><span id="line-17" + ></span + ><span class="annot" + ><span class="hs-pragma" + >"qux/foo"</span + ></span + ><span + > </span + ><span class="annot" + ><a href="ClangCppBug.html#qux" + ><span class="hs-pragma hs-type" + >qux</span + ></a + ></span + ><span + > </span + ><span class="hs-pragma" + >=</span + ><span + > </span + ><span class="annot" + ><a href="ClangCppBug.html#foo" + ><span class="hs-pragma hs-type" + >foo</span + ></a + ></span + ><span + > +</span + ><span id="line-18" + ></span + ><span + > </span + ><span class="hs-pragma" + >#-}</span + ><span + > +</span + ><span id="line-20" + ></span + ><span + > +</span + ><span id="line-21" + ></span + ><span class="annot" + ><a href="ClangCppBug.html#qux" + ><span class="hs-identifier hs-type" + >qux</span + ></a + ></span + ><span + > </span + ><span class="hs-glyph" + >::</span + ><span + > </span + ><span class="annot" + ><span class="hs-identifier hs-type" + >Int</span + ></span + ><span + > +</span + ><span id="line-22" + ></span + ><span id="qux" + ><span class="annot" + ><span class="annottext" + >qux :: Int +</span + ><a href="ClangCppBug.html#qux" + ><span class="hs-identifier hs-var hs-var" + >qux</span + ></a + ></span + ></span + ><span + > </span + ><span class="hs-glyph" + >=</span + ><span + > </span + ><span class="annot" + ><span class="hs-number" + >88</span + ></span + ><span + > +</span + ><span id="line-23" + ></span + ></pre + ></body + ></html +> \ No newline at end of file -- cgit v1.2.3