summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorhdgarrood <>2019-10-20 21:32:00 (GMT)
committerhdiff <hdiff@hdiff.luite.com>2019-10-20 21:32:00 (GMT)
commit5ad3069b08d142e1b278a1c0cb495de9ea7441a2 (patch)
treefb67390b7a61a787ecc6dde0217468ae02bdcfb4
parent196340405320c2706aef57bcfe40cf4790e62de3 (diff)
version 0.13.40.13.4
-rw-r--r--CONTRIBUTORS.md2
-rw-r--r--LICENSE256
-rw-r--r--purescript.cabal43
-rw-r--r--src/Language/PureScript/AST/Declarations.hs6
-rw-r--r--src/Language/PureScript/AST/Traversals.hs11
-rw-r--r--src/Language/PureScript/Bundle.hs57
-rw-r--r--src/Language/PureScript/Errors.hs43
-rw-r--r--src/Language/PureScript/Linter/Imports.hs3
-rw-r--r--src/Language/PureScript/Make.hs34
-rw-r--r--src/Language/PureScript/Make/Actions.hs77
-rw-r--r--src/Language/PureScript/Make/BuildPlan.hs93
-rw-r--r--src/Language/PureScript/Make/Cache.hs130
-rw-r--r--src/Language/PureScript/Make/Monad.hs85
-rw-r--r--src/Language/PureScript/Names.hs7
-rw-r--r--src/Language/PureScript/Sugar/Names/Imports.hs7
-rw-r--r--src/Language/PureScript/TypeChecker/Types.hs1
-rw-r--r--stack.yaml7
-rw-r--r--tests/Main.hs3
-rw-r--r--tests/TestMake.hs216
-rw-r--r--tests/TestUtils.hs6
-rw-r--r--tests/purs/bundle/3727.js4
-rw-r--r--tests/purs/bundle/3727.purs13
-rw-r--r--tests/purs/bundle/ObjectShorthand.js15
-rw-r--r--tests/purs/bundle/ObjectShorthand.purs18
-rw-r--r--tests/purs/docs/output/Ado/externs.json2
-rw-r--r--tests/purs/docs/output/ChildDeclOrder/externs.json2
-rw-r--r--tests/purs/docs/output/Clash/externs.json2
-rw-r--r--tests/purs/docs/output/Clash1/externs.json2
-rw-r--r--tests/purs/docs/output/Clash1a/externs.json2
-rw-r--r--tests/purs/docs/output/Clash2/externs.json2
-rw-r--r--tests/purs/docs/output/Clash2a/externs.json2
-rw-r--r--tests/purs/docs/output/ConstrainedArgument/externs.json2
-rw-r--r--tests/purs/docs/output/Data.Newtype/externs.json2
-rw-r--r--tests/purs/docs/output/DeclOrder/externs.json2
-rw-r--r--tests/purs/docs/output/DeclOrderNoExportList/externs.json2
-rw-r--r--tests/purs/docs/output/Desugar/externs.json2
-rw-r--r--tests/purs/docs/output/DocComments/externs.json2
-rw-r--r--tests/purs/docs/output/DocCommentsClassMethod/externs.json2
-rw-r--r--tests/purs/docs/output/DocCommentsDataConstructor/externs.json2
-rw-r--r--tests/purs/docs/output/DuplicateNames/externs.json2
-rw-r--r--tests/purs/docs/output/Example/externs.json2
-rw-r--r--tests/purs/docs/output/Example2/externs.json2
-rw-r--r--tests/purs/docs/output/ExplicitExport/externs.json2
-rw-r--r--tests/purs/docs/output/ExplicitTypeSignatures/externs.json2
-rw-r--r--tests/purs/docs/output/ImportedTwice/externs.json2
-rw-r--r--tests/purs/docs/output/ImportedTwiceA/externs.json2
-rw-r--r--tests/purs/docs/output/ImportedTwiceB/externs.json2
-rw-r--r--tests/purs/docs/output/MultiVirtual/externs.json2
-rw-r--r--tests/purs/docs/output/MultiVirtual1/externs.json2
-rw-r--r--tests/purs/docs/output/MultiVirtual2/externs.json2
-rw-r--r--tests/purs/docs/output/MultiVirtual3/externs.json2
-rw-r--r--tests/purs/docs/output/NewOperators/externs.json2
-rw-r--r--tests/purs/docs/output/NewOperators2/externs.json2
-rw-r--r--tests/purs/docs/output/NotAllCtors/externs.json2
-rw-r--r--tests/purs/docs/output/Prelude/externs.json2
-rw-r--r--tests/purs/docs/output/PrimSubmodules/externs.json2
-rw-r--r--tests/purs/docs/output/ReExportedTypeClass/externs.json2
-rw-r--r--tests/purs/docs/output/SolitaryTypeClassMember/externs.json2
-rw-r--r--tests/purs/docs/output/SomeTypeClass/externs.json2
-rw-r--r--tests/purs/docs/output/Transitive1/externs.json2
-rw-r--r--tests/purs/docs/output/Transitive2/externs.json2
-rw-r--r--tests/purs/docs/output/Transitive3/externs.json2
-rw-r--r--tests/purs/docs/output/TypeClassWithFunDeps/externs.json2
-rw-r--r--tests/purs/docs/output/TypeClassWithoutMembers/externs.json2
-rw-r--r--tests/purs/docs/output/TypeClassWithoutMembersIntermediate/externs.json2
-rw-r--r--tests/purs/docs/output/TypeLevelString/externs.json2
-rw-r--r--tests/purs/docs/output/TypeOpAliases/externs.json2
-rw-r--r--tests/purs/docs/output/TypeSynonym/externs.json2
-rw-r--r--tests/purs/docs/output/TypeSynonymInstance/externs.json2
-rw-r--r--tests/purs/docs/output/UTF8/externs.json2
-rw-r--r--tests/purs/docs/output/Virtual/externs.json2
-rw-r--r--tests/purs/docs/output/cache-db.json1
-rw-r--r--tests/purs/passing/3558-UpToDateDictsForHigherOrderFns.purs33
-rw-r--r--tests/purs/warning/Kind-UnusedExplicitImport-1.purs11
-rw-r--r--tests/purs/warning/Kind-UnusedExplicitImport-2.purs12
-rw-r--r--tests/purs/warning/Kind-UnusedImport.purs9
76 files changed, 1114 insertions, 183 deletions
diff --git a/CONTRIBUTORS.md b/CONTRIBUTORS.md
index 1ecc5a4..42f8195 100644
--- a/CONTRIBUTORS.md
+++ b/CONTRIBUTORS.md
@@ -135,6 +135,8 @@ If you would prefer to use different terms, please use the section below instead
| [@adnelson](https://github.com/adnelson) | Allen Nelson | [MIT license](http://opensource.org/licenses/MIT) |
| [@dyerw](https://github.com/dyerw) | Liam Dyer | [MIT license](http://opensource.org/licenses/MIT) |
| [@marcosh](https://github.com/marcosh) | Marco Perone | [MIT license](http://opensource.org/licenses/MIT) |
+| [@matthew-hilty](https://github.com/matthew-hilty) | Matthew Hilty | [MIT license](http://opensource.org/licenses/MIT) |
+| [@woody88](https://github.com/woody88) | Woodson Delhia | [MIT license](http://opensource.org/licenses/MIT) |
### Contributors using Modified Terms
diff --git a/LICENSE b/LICENSE
index 65cfa9e..362b1f1 100644
--- a/LICENSE
+++ b/LICENSE
@@ -17,6 +17,7 @@ PureScript uses the following Haskell library packages. Their license files foll
Cabal
Glob
SHA
+ StateVar
aeson
aeson-better-errors
aeson-pretty
@@ -33,6 +34,7 @@ PureScript uses the following Haskell library packages. Their license files foll
base-orphans
base64-bytestring
basement
+ bifunctors
binary
blaze-builder
blaze-html
@@ -48,10 +50,12 @@ PureScript uses the following Haskell library packages. Their license files foll
cheapskate
clock
colour
+ comonad
conduit
conduit-extra
constraints
containers
+ contravariant
cookie
cryptonite
css-text
@@ -63,6 +67,7 @@ PureScript uses the following Haskell library packages. Their license files foll
data-ordlist
deepseq
directory
+ distributive
dlist
easy-file
edit-distance
@@ -121,6 +126,8 @@ PureScript uses the following Haskell library packages. Their license files foll
resourcet
safe
scientific
+ semialign
+ semigroupoids
semigroups
shelly
simple-sendfile
@@ -139,6 +146,7 @@ PureScript uses the following Haskell library packages. Their license files foll
terminfo
text
th-abstraction
+ these
time
time-locale-compat
transformers
@@ -265,6 +273,38 @@ SHA LICENSE file:
ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.
+StateVar LICENSE file:
+
+ Copyright (c) 2014-2015, Edward Kmett
+ Copyright (c) 2009-2018, Sven Panne
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ 3. Neither the name of the author nor the names of its contributors may be
+ used to endorse or promote products derived from this software without
+ specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+ LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+
aeson LICENSE file:
Copyright (c) 2011, MailRank, Inc.
@@ -842,6 +882,35 @@ basement LICENSE file:
OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
SUCH DAMAGE.
+bifunctors LICENSE file:
+
+ Copyright 2008-2016 Edward Kmett
+
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS OR
+ IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ DISCLAIMED. IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE FOR
+ ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+ STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+ ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+
binary LICENSE file:
Copyright (c) Lennart Kolmodin
@@ -1317,6 +1386,36 @@ colour LICENSE file:
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
+comonad LICENSE file:
+
+ Copyright 2008-2014 Edward Kmett
+ Copyright 2004-2008 Dave Menendez
+
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS OR
+ IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ DISCLAIMED. IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE FOR
+ ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+ STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+ ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+
conduit LICENSE file:
Copyright (c) 2012 Michael Snoyman, http://www.yesodweb.com/
@@ -1426,6 +1525,39 @@ containers LICENSE file:
OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
DAMAGE.
+contravariant LICENSE file:
+
+ Copyright 2007-2015 Edward Kmett
+
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ 3. Neither the name of the author nor the names of his contributors
+ may be used to endorse or promote products derived from this software
+ without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS OR
+ IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ DISCLAIMED. IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE FOR
+ ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+ STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+ ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+
cookie LICENSE file:
Copyright (c) 2010 Michael Snoyman, http://www.yesodweb.com/
@@ -1769,6 +1901,35 @@ directory LICENSE file:
-----------------------------------------------------------------------------
+distributive LICENSE file:
+
+ Copyright 2011-2016 Edward Kmett
+
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS OR
+ IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ DISCLAIMED. IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE FOR
+ ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+ STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+ ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+
dlist LICENSE file:
Copyright (c) 2006-2009 Don Stewart, 2013-2016 Sean Leather
@@ -3695,6 +3856,68 @@ scientific LICENSE file:
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+semialign LICENSE file:
+
+ Copyright (c) 2012, C. McCann, 2015-2019 Oleg Grenrus
+
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+
+ * Redistributions in binary form must reproduce the above
+ copyright notice, this list of conditions and the following
+ disclaimer in the documentation and/or other materials provided
+ with the distribution.
+
+ * Neither the name of C. McCann nor the names of other
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+semigroupoids LICENSE file:
+
+ Copyright 2011-2015 Edward Kmett
+
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS OR
+ IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ DISCLAIMED. IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE FOR
+ ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+ STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+ ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+
semigroups LICENSE file:
Copyright 2011-2015 Edward Kmett
@@ -4290,6 +4513,39 @@ th-abstraction LICENSE file:
TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF
THIS SOFTWARE.
+these LICENSE file:
+
+ Copyright (c) 2012, C. McCann, 2015-2019 Oleg Grenrus
+
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+
+ * Redistributions in binary form must reproduce the above
+ copyright notice, this list of conditions and the following
+ disclaimer in the documentation and/or other materials provided
+ with the distribution.
+
+ * Neither the name of C. McCann nor the names of other
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
time LICENSE file:
TimeLib is Copyright (c) Ashley Yakeley, 2004-2014. All rights reserved.
diff --git a/purescript.cabal b/purescript.cabal
index 15d1c1e..fba9991 100644
--- a/purescript.cabal
+++ b/purescript.cabal
@@ -1,6 +1,6 @@
cabal-version: 1.12
name: purescript
-version: 0.13.3
+version: 0.13.4
license: BSD3
license-file: LICENSE
copyright: (c) 2013-17 Phil Freeman, (c) 2014-19 Gary Burgess, (c) other contributors (see CONTRIBUTORS.md)
@@ -23,6 +23,8 @@ extra-source-files:
bundle/build.sh
bundle/README
tests/purs/bundle/3551/ModuleWithDeadCode.js
+ tests/purs/bundle/3727.js
+ tests/purs/bundle/ObjectShorthand.js
tests/purs/failing/MissingFFIImplementations.js
tests/purs/passing/2172.js
tests/purs/passing/EffFn.js
@@ -33,6 +35,8 @@ extra-source-files:
tests/purs/warning/UnusedFFIImplementations.js
tests/purs/bundle/3551.purs
tests/purs/bundle/3551/ModuleWithDeadCode.purs
+ tests/purs/bundle/3727.purs
+ tests/purs/bundle/ObjectShorthand.purs
tests/purs/bundle/PSasConstructor.purs
tests/purs/docs/bower_components/purescript-newtype/src/Data/Newtype.purs
tests/purs/docs/bower_components/purescript-prelude/src/Prelude.purs
@@ -400,6 +404,7 @@ extra-source-files:
tests/purs/passing/3410.purs
tests/purs/passing/3481.purs
tests/purs/passing/3549.purs
+ tests/purs/passing/3558-UpToDateDictsForHigherOrderFns.purs
tests/purs/passing/3595.purs
tests/purs/passing/652.purs
tests/purs/passing/810.purs
@@ -710,6 +715,9 @@ extra-source-files:
tests/purs/warning/ImplicitImport.purs
tests/purs/warning/ImplicitQualifiedImport.purs
tests/purs/warning/ImplicitQualifiedImportReExport.purs
+ tests/purs/warning/Kind-UnusedExplicitImport-1.purs
+ tests/purs/warning/Kind-UnusedExplicitImport-2.purs
+ tests/purs/warning/Kind-UnusedImport.purs
tests/purs/warning/MissingTypeDeclaration.purs
tests/purs/warning/NewtypeInstance.purs
tests/purs/warning/NewtypeInstance2.purs
@@ -737,6 +745,7 @@ extra-source-files:
tests/purs/docs/bower.json
tests/purs/docs/output/Ado/docs.json
tests/purs/docs/output/Ado/externs.json
+ tests/purs/docs/output/cache-db.json
tests/purs/docs/output/ChildDeclOrder/docs.json
tests/purs/docs/output/ChildDeclOrder/externs.json
tests/purs/docs/output/Clash/docs.json
@@ -1090,6 +1099,7 @@ library
Language.PureScript.Make
Language.PureScript.Make.Actions
Language.PureScript.Make.BuildPlan
+ Language.PureScript.Make.Cache
Language.PureScript.Make.Monad
Language.PureScript.ModuleDependencies
Language.PureScript.Names
@@ -1145,11 +1155,11 @@ library
Paths_purescript
default-language: Haskell2010
default-extensions: ConstraintKinds DataKinds DeriveFunctor
- DeriveFoldable DeriveTraversable DeriveGeneric EmptyDataDecls
- FlexibleContexts KindSignatures LambdaCase MultiParamTypeClasses
- NoImplicitPrelude PatternGuards PatternSynonyms RankNTypes
- RecordWildCards OverloadedStrings ScopedTypeVariables TupleSections
- ViewPatterns
+ DeriveFoldable DeriveTraversable DeriveGeneric DerivingStrategies
+ EmptyDataDecls FlexibleContexts KindSignatures LambdaCase
+ MultiParamTypeClasses NoImplicitPrelude PatternGuards
+ PatternSynonyms RankNTypes RecordWildCards OverloadedStrings
+ ScopedTypeVariables TupleSections ViewPatterns
ghc-options: -Wall -O2
build-depends:
Cabal >=2.2 && <2.5,
@@ -1168,6 +1178,7 @@ library
cheapskate ==0.1.*,
clock <0.8,
containers <0.7,
+ cryptonite ==0.25.*,
data-ordlist >=0.4.7.0 && <0.5,
deepseq <1.5,
directory >=1.2.3 && <1.4,
@@ -1177,9 +1188,10 @@ library
filepath <1.5,
fsnotify >=0.2.1 && <0.4,
haskeline >=0.7.0.0 && <0.8,
- language-javascript >=0.6.0.13 && <0.7,
+ language-javascript >=0.7.0.0 && <0.8,
lifted-async >=0.10.0.3 && <0.10.1,
lifted-base ==0.2.3.*,
+ memory ==0.14.*,
microlens-platform >=0.3.9.0 && <0.4,
monad-control >=1.0.0.0 && <1.1,
monad-logger ==0.3.*,
@@ -1192,6 +1204,7 @@ library
regex-tdfa <1.3,
safe >=0.3.9 && <0.4,
scientific >=0.3.4.9 && <0.4,
+ semialign >=1 && <1.1,
semigroups >=0.16.2 && <0.19,
sourcemap >=0.1.6 && <0.2,
split <0.3,
@@ -1199,6 +1212,7 @@ library
stringsearch <0.4,
syb <0.8,
text <1.3,
+ these >=1 && <1.1,
time <1.9,
transformers >=0.3.0 && <0.6,
transformers-base >=0.4.0 && <0.5,
@@ -1244,6 +1258,7 @@ executable purs
cheapskate ==0.1.*,
clock <0.8,
containers <0.7,
+ cryptonite ==0.25.*,
data-ordlist >=0.4.7.0 && <0.5,
deepseq <1.5,
directory >=1.2.3 && <1.4,
@@ -1254,9 +1269,10 @@ executable purs
fsnotify >=0.2.1 && <0.4,
haskeline >=0.7.0.0 && <0.8,
http-types <0.13,
- language-javascript >=0.6.0.13 && <0.7,
+ language-javascript >=0.7.0.0 && <0.8,
lifted-async >=0.10.0.3 && <0.10.1,
lifted-base ==0.2.3.*,
+ memory ==0.14.*,
microlens-platform >=0.3.9.0 && <0.4,
monad-control >=1.0.0.0 && <1.1,
monad-logger ==0.3.*,
@@ -1272,6 +1288,7 @@ executable purs
regex-tdfa <1.3,
safe >=0.3.9 && <0.4,
scientific >=0.3.4.9 && <0.4,
+ semialign >=1 && <1.1,
semigroups >=0.16.2 && <0.19,
sourcemap >=0.1.6 && <0.2,
split <0.3,
@@ -1279,6 +1296,7 @@ executable purs
stringsearch <0.4,
syb <0.8,
text <1.3,
+ these >=1 && <1.1,
time <1.9,
transformers >=0.3.0 && <0.6,
transformers-base >=0.4.0 && <0.5,
@@ -1321,6 +1339,7 @@ test-suite tests
TestDocs
TestHierarchy
TestIde
+ TestMake
TestPrimDocs
TestPsci
TestPsci.CommandTest
@@ -1331,7 +1350,7 @@ test-suite tests
TestUtils
Paths_purescript
default-language: Haskell2010
- default-extensions: NoImplicitPrelude
+ default-extensions: NoImplicitPrelude LambdaCase OverloadedStrings
ghc-options: -Wall
build-depends:
Cabal >=2.2 && <2.5,
@@ -1351,6 +1370,7 @@ test-suite tests
cheapskate ==0.1.*,
clock <0.8,
containers <0.7,
+ cryptonite ==0.25.*,
data-ordlist >=0.4.7.0 && <0.5,
deepseq <1.5,
directory >=1.2.3 && <1.4,
@@ -1362,9 +1382,10 @@ test-suite tests
haskeline >=0.7.0.0 && <0.8,
hspec <2.7,
hspec-discover <2.7,
- language-javascript >=0.6.0.13 && <0.7,
+ language-javascript >=0.7.0.0 && <0.8,
lifted-async >=0.10.0.3 && <0.10.1,
lifted-base ==0.2.3.*,
+ memory ==0.14.*,
microlens-platform >=0.3.9.0 && <0.4,
monad-control >=1.0.0.0 && <1.1,
monad-logger ==0.3.*,
@@ -1378,6 +1399,7 @@ test-suite tests
regex-tdfa <1.3,
safe >=0.3.9 && <0.4,
scientific >=0.3.4.9 && <0.4,
+ semialign >=1 && <1.1,
semigroups >=0.16.2 && <0.19,
sourcemap >=0.1.6 && <0.2,
split <0.3,
@@ -1389,6 +1411,7 @@ test-suite tests
tasty-hspec <1.2,
tasty-quickcheck <0.11,
text <1.3,
+ these >=1 && <1.1,
time <1.9,
transformers >=0.3.0 && <0.6,
transformers-base >=0.4.0 && <0.5,
diff --git a/src/Language/PureScript/AST/Declarations.hs b/src/Language/PureScript/AST/Declarations.hs
index 93f8d87..557cb51 100644
--- a/src/Language/PureScript/AST/Declarations.hs
+++ b/src/Language/PureScript/AST/Declarations.hs
@@ -75,9 +75,7 @@ data SimpleErrorMessage
| MissingFFIImplementations ModuleName [Ident]
| UnusedFFIImplementations ModuleName [Ident]
| InvalidFFIIdentifier ModuleName Text
- | CannotGetFileInfo FilePath
- | CannotReadFile FilePath
- | CannotWriteFile FilePath
+ | FileIOError Text IOError -- ^ A description of what we were trying to do, and the error which occurred
| InfiniteType SourceType
| InfiniteKind SourceKind
| MultipleValueOpFixities (OpName 'ValueOpName)
@@ -151,7 +149,7 @@ data SimpleErrorMessage
| IncompleteExhaustivityCheck
| MisleadingEmptyTypeImport ModuleName (ProperName 'TypeName)
| ImportHidingModule ModuleName
- | UnusedImport ModuleName
+ | UnusedImport ModuleName (Maybe ModuleName)
| UnusedExplicitImport ModuleName [Name] (Maybe ModuleName) [DeclarationRef]
| UnusedDctorImport ModuleName (ProperName 'TypeName) (Maybe ModuleName) [DeclarationRef]
| UnusedDctorExplicitImport ModuleName (ProperName 'TypeName) [ProperName 'ConstructorName] (Maybe ModuleName) [DeclarationRef]
diff --git a/src/Language/PureScript/AST/Traversals.hs b/src/Language/PureScript/AST/Traversals.hs
index 70543f8..4aaeeec 100644
--- a/src/Language/PureScript/AST/Traversals.hs
+++ b/src/Language/PureScript/AST/Traversals.hs
@@ -11,6 +11,7 @@ import Data.Foldable (fold)
import Data.List (mapAccumL)
import Data.Maybe (mapMaybe)
import qualified Data.List.NonEmpty as NEL
+import qualified Data.Map as M
import qualified Data.Set as S
import Language.PureScript.AST.Binders
@@ -19,6 +20,7 @@ import Language.PureScript.AST.Literals
import Language.PureScript.Kinds
import Language.PureScript.Names
import Language.PureScript.Traversals
+import Language.PureScript.TypeClassDictionaries (TypeClassDictionaryInScope(..))
import Language.PureScript.Types
guardedExprM :: Applicative m
@@ -693,5 +695,12 @@ overTypes f = let (_, f', _) = everywhereOnValues id g id in f'
where
g :: Expr -> Expr
g (TypedValue checkTy val t) = TypedValue checkTy val (f t)
- g (TypeClassDictionary c sco hints) = TypeClassDictionary (mapConstraintArgs (fmap f) c) sco hints
+ g (TypeClassDictionary c sco hints) =
+ TypeClassDictionary
+ (mapConstraintArgs (fmap f) c)
+ (updateCtx sco)
+ hints
g other = other
+ updateDict fn dict = dict { tcdInstanceTypes = fn (tcdInstanceTypes dict) }
+ updateScope = fmap . fmap . fmap . fmap $ updateDict $ fmap f
+ updateCtx = M.alter updateScope Nothing
diff --git a/src/Language/PureScript/Bundle.hs b/src/Language/PureScript/Bundle.hs
index 2fd4165..df746f3 100644
--- a/src/Language/PureScript/Bundle.hs
+++ b/src/Language/PureScript/Bundle.hs
@@ -270,7 +270,7 @@ withDeps (Module modulePath fn es) = Module modulePath fn (map expandDeps es)
boundNames = mapMaybe toBoundName es
where
toBoundName :: ModuleElement -> Maybe String
- toBoundName (Member _ _ nm _ _) = Just nm
+ toBoundName (Member _ Internal nm _ _) = Just nm
toBoundName _ = Nothing
-- | Calculate dependencies and add them to the current element.
@@ -301,13 +301,33 @@ withDeps (Module modulePath fn es) = Module modulePath fn (map expandDeps es)
-- bound to the module level (i.e., hasn't been shadowed by a function
-- parameter)
= ([(m, nm, Internal)], bn)
+ toReference (JSObjectLiteral _ props _) bn
+ = let
+ shorthandNames =
+ filter (`elem` bn) $
+ -- ^ only add a dependency if this name is still in the list of
+ -- names bound to the module level (i.e., hasn't been shadowed by a
+ -- function parameter)
+ mapMaybe unPropertyIdentRef $
+ trailingCommaList props
+ in
+ (map (\name -> (m, name, Internal)) shorthandNames, bn)
toReference (JSFunctionExpression _ _ _ params _ _) bn
- = ([], bn \\ (mapMaybe unIdent $ commaList params))
+ = ([], bn \\ (mapMaybe unIdentifier $ commaList params))
+ toReference e bn
+ | Just nm <- exportsAccessor e
+ -- ^ exports.foo means there's a dependency on the public member "foo" of
+ -- this module.
+ = ([(m, nm, Public)], bn)
toReference _ bn = ([], bn)
- unIdent :: JSIdent -> Maybe String
- unIdent (JSIdentName _ name) = Just name
- unIdent _ = Nothing
+ unIdentifier :: JSExpression -> Maybe String
+ unIdentifier (JSIdentifier _ name) = Just name
+ unIdentifier _ = Nothing
+
+ unPropertyIdentRef :: JSObjectProperty -> Maybe String
+ unPropertyIdentRef (JSPropertyIdentRef _ name) = Just name
+ unPropertyIdentRef _ = Nothing
-- String literals include the quote chars
fromStringLiteral :: JSExpression -> Maybe String
@@ -450,21 +470,22 @@ matchMember stmt
= Just (Internal, name, decl)
-- exports.foo = expr; exports["foo"] = expr;
| JSAssignStatement e (JSAssign _) decl _ <- stmt
- , Just name <- accessor e
+ , Just name <- exportsAccessor e
= Just (Public, name, decl)
| otherwise
= Nothing
- where
- accessor :: JSExpression -> Maybe String
- accessor (JSMemberDot exports _ nm)
- | JSIdentifier _ "exports" <- exports
- , JSIdentifier _ name <- nm
- = Just name
- accessor (JSMemberSquare exports _ nm _)
- | JSIdentifier _ "exports" <- exports
- , Just name <- fromStringLiteral nm
- = Just name
- accessor _ = Nothing
+
+-- Matches exports.* or exports["*"] expressions and returns the property name.
+exportsAccessor :: JSExpression -> Maybe String
+exportsAccessor (JSMemberDot exports _ nm)
+ | JSIdentifier _ "exports" <- exports
+ , JSIdentifier _ name <- nm
+ = Just name
+exportsAccessor (JSMemberSquare exports _ nm _)
+ | JSIdentifier _ "exports" <- exports
+ , Just name <- fromStringLiteral nm
+ = Just name
+exportsAccessor _ = Nothing
-- Matches assignments to module.exports, like this:
-- module.exports = { ... }
@@ -757,7 +778,7 @@ codeGen optionsMainModule optionsNamespace ms outFileOpt = (fmap sourceMapping o
iife :: [JSStatement] -> String -> JSExpression -> JSStatement
iife body param arg =
- JSMethodCall (JSExpressionParen lf (JSFunctionExpression JSNoAnnot JSIdentNone JSNoAnnot (JSLOne (JSIdentName JSNoAnnot param)) JSNoAnnot
+ JSMethodCall (JSExpressionParen lf (JSFunctionExpression JSNoAnnot JSIdentNone JSNoAnnot (JSLOne (JSIdentifier JSNoAnnot param)) JSNoAnnot
(JSBlock sp (prependWhitespace "\n " body) lf))
JSNoAnnot)
JSNoAnnot
diff --git a/src/Language/PureScript/Errors.hs b/src/Language/PureScript/Errors.hs
index cb4f460..1386ce6 100644
--- a/src/Language/PureScript/Errors.hs
+++ b/src/Language/PureScript/Errors.hs
@@ -10,6 +10,7 @@ import Prelude.Compat
import Protolude (ordNub)
import Control.Arrow ((&&&))
+import Control.Exception (displayException)
import Control.Monad
import Control.Monad.Error.Class (MonadError(..))
import Control.Monad.Trans.State.Lazy
@@ -85,9 +86,7 @@ errorCode em = case unwrapErrorMessage em of
MissingFFIImplementations{} -> "MissingFFIImplementations"
UnusedFFIImplementations{} -> "UnusedFFIImplementations"
InvalidFFIIdentifier{} -> "InvalidFFIIdentifier"
- CannotGetFileInfo{} -> "CannotGetFileInfo"
- CannotReadFile{} -> "CannotReadFile"
- CannotWriteFile{} -> "CannotWriteFile"
+ FileIOError{} -> "FileIOError"
InfiniteType{} -> "InfiniteType"
InfiniteKind{} -> "InfiniteKind"
MultipleValueOpFixities{} -> "MultipleValueOpFixities"
@@ -465,17 +464,9 @@ prettyPrintSingleError (PPEOptions codeColor full level showDocs relPath) e = fl
else
"Make sure the source file exists, and that it has been provided as an input to the compiler."
]
- renderSimpleErrorMessage (CannotGetFileInfo path) =
- paras [ line "Unable to read file info: "
- , indent . lineS $ path
- ]
- renderSimpleErrorMessage (CannotReadFile path) =
- paras [ line "Unable to read file: "
- , indent . lineS $ path
- ]
- renderSimpleErrorMessage (CannotWriteFile path) =
- paras [ line "Unable to write file: "
- , indent . lineS $ path
+ renderSimpleErrorMessage (FileIOError doWhat err) =
+ paras [ line $ "I/O error while trying to " <> doWhat
+ , indent . lineS $ displayException err
]
renderSimpleErrorMessage (ErrorParsingFFIModule path extra) =
paras $ [ line "Unable to parse foreign module:"
@@ -897,8 +888,14 @@ prettyPrintSingleError (PPEOptions codeColor full level showDocs relPath) e = fl
paras [ line "An exhaustivity check was abandoned due to too many possible cases."
, line "You may want to decompose your data types into smaller types."
]
- renderSimpleErrorMessage (UnusedImport name) =
- line $ "The import of module " <> markCode (runModuleName name) <> " is redundant"
+
+ renderSimpleErrorMessage (UnusedImport mn qualifier) =
+ let
+ mark = markCode . runModuleName
+ unqualified = "The import of " <> mark mn <> " is redundant"
+ msg' q = "The qualified import of " <> mark mn <> " as " <> mark q <> " is redundant"
+ msg = maybe unqualified msg'
+ in line $ msg qualifier
renderSimpleErrorMessage msg@(UnusedExplicitImport mn names _ _) =
paras [ line $ "The import of module " <> markCode (runModuleName mn) <> " contains the following unused references:"
@@ -1190,11 +1187,17 @@ prettyPrintSingleError (PPEOptions codeColor full level showDocs relPath) e = fl
printRow f t = markCodeBox $ indent $ f prettyDepth t
-- If both rows are not empty, print them as diffs
+ -- If verbose print all rows else only print unique rows
printRows :: Type a -> Type a -> (Box.Box, Box.Box)
- printRows r1@RCons{} r2@RCons{} = let
- (sorted1, sorted2) = filterRows (rowToList r1) (rowToList r2)
- in (printRow typeDiffAsBox sorted1, printRow typeDiffAsBox sorted2)
- printRows r1 r2 = (printRow typeAsBox r1, printRow typeAsBox r2)
+ printRows r1 r2 = case (full, r1, r2) of
+ (True, _ , _) -> (printRow typeAsBox r1, printRow typeAsBox r2)
+
+ (_, RCons{}, RCons{}) ->
+ let (sorted1, sorted2) = filterRows (rowToList r1) (rowToList r2)
+ in (printRow typeDiffAsBox sorted1, printRow typeDiffAsBox sorted2)
+
+ (_, _, _) -> (printRow typeAsBox r1, printRow typeAsBox r2)
+
-- Keep the unique labels only
filterRows :: ([RowListItem a], Type a) -> ([RowListItem a], Type a) -> (Type a, Type a)
diff --git a/src/Language/PureScript/Linter/Imports.hs b/src/Language/PureScript/Linter/Imports.hs
index 3aa8bf6..7b1bbf0 100644
--- a/src/Language/PureScript/Linter/Imports.hs
+++ b/src/Language/PureScript/Linter/Imports.hs
@@ -279,7 +279,7 @@ lintImportDecl env mni qualifierName names ss declType allowImplicit =
isMatch _ _ = False
unused :: m Bool
- unused = warn (UnusedImport mni)
+ unused = warn (UnusedImport mni qualifierName)
warn :: SimpleErrorMessage -> m Bool
warn err = tell (errorMessage' ss err) >> return True
@@ -373,6 +373,7 @@ runDeclRef (ValueOpRef _ op) = Just $ ValOpName op
runDeclRef (TypeRef _ pn _) = Just $ TyName pn
runDeclRef (TypeOpRef _ op) = Just $ TyOpName op
runDeclRef (TypeClassRef _ pn) = Just $ TyClassName pn
+runDeclRef (KindRef _ pn) = Just $ KiName pn
runDeclRef _ = Nothing
checkDuplicateImports
diff --git a/src/Language/PureScript/Make.hs b/src/Language/PureScript/Make.hs
index f983266..3008930 100644
--- a/src/Language/PureScript/Make.hs
+++ b/src/Language/PureScript/Make.hs
@@ -22,7 +22,7 @@ import Data.Function (on)
import Data.Foldable (for_)
import Data.List (foldl', sortBy)
import qualified Data.List.NonEmpty as NEL
-import Data.Maybe (fromMaybe, mapMaybe)
+import Data.Maybe (fromMaybe)
import qualified Data.Map as M
import qualified Data.Set as S
import qualified Data.Text as T
@@ -41,6 +41,7 @@ import Language.PureScript.Sugar
import Language.PureScript.TypeChecker
import Language.PureScript.Make.BuildPlan
import qualified Language.PureScript.Make.BuildPlan as BuildPlan
+import qualified Language.PureScript.Make.Cache as Cache
import Language.PureScript.Make.Actions as Actions
import Language.PureScript.Make.Monad as Monad
import qualified Language.PureScript.CoreFn as CF
@@ -99,18 +100,19 @@ rebuildModule MakeActions{..} externs m@(Module _ _ moduleName _ _) = do
-- | Compiles in "make" mode, compiling each module separately to a @.js@ file and an @externs.json@ file.
--
--- If timestamps have not changed, the externs file can be used to provide the module's types without
--- having to typecheck the module again.
+-- If timestamps or hashes have not changed, existing externs files can be used to provide upstream modules' types without
+-- having to typecheck those modules again.
make :: forall m. (Monad m, MonadBaseControl IO m, MonadError MultipleErrors m, MonadWriter MultipleErrors m)
=> MakeActions m
-> [CST.PartialResult Module]
-> m [ExternsFile]
make ma@MakeActions{..} ms = do
checkModuleNames
+ cacheDb <- readCacheDb
(sorted, graph) <- sortModules (moduleSignature . CST.resPartial) ms
- buildPlan <- BuildPlan.construct ma (sorted, graph)
+ (buildPlan, newCacheDb) <- BuildPlan.construct ma cacheDb (sorted, graph)
let toBeRebuilt = filter (BuildPlan.needsRebuild buildPlan . getModuleName . CST.resPartial) sorted
for_ toBeRebuilt $ \m -> fork $ do
@@ -122,21 +124,31 @@ make ma@MakeActions{..} ms = do
(deps `inOrderOf` map (getModuleName . CST.resPartial) sorted)
-- Wait for all threads to complete, and collect results (and errors).
- results <- BuildPlan.collectResults buildPlan
+ (failures, successes) <-
+ let
+ splitResults = \case
+ BuildJobSucceeded _ exts ->
+ Right exts
+ BuildJobFailed errs ->
+ Left errs
+ BuildJobSkipped ->
+ Left mempty
+ in
+ M.mapEither splitResults <$> BuildPlan.collectResults buildPlan
+
+ -- Write the updated build cache database to disk
+ writeCacheDb $ Cache.removeModules (M.keysSet failures) newCacheDb
-- All threads have completed, rethrow any caught errors.
- let errors = mapMaybe buildJobFailure $ M.elems results
+ let errors = M.elems failures
unless (null errors) $ throwError (mconcat errors)
-- Here we return all the ExternsFile in the ordering of the topological sort,
-- so they can be folded into an Environment. This result is used in the tests
-- and in PSCI.
let lookupResult mn =
- snd
- . fromMaybe (internalError "make: module's build job did not succeed")
- . buildJobSuccess
- . fromMaybe (internalError "make: module not found in results")
- $ M.lookup mn results
+ fromMaybe (internalError "make: module not found in results")
+ $ M.lookup mn successes
return (map (lookupResult . getModuleName . CST.resPartial) sorted)
where
diff --git a/src/Language/PureScript/Make/Actions.hs b/src/Language/PureScript/Make/Actions.hs
index 8b54765..a8f6318 100644
--- a/src/Language/PureScript/Make/Actions.hs
+++ b/src/Language/PureScript/Make/Actions.hs
@@ -16,7 +16,7 @@ import Control.Monad.Reader (asks)
import Control.Monad.Supply
import Control.Monad.Trans.Class (MonadTrans(..))
import Control.Monad.Writer.Class (MonadWriter(..))
-import Data.Aeson (encode)
+import qualified Data.Aeson as Aeson
import Data.Bifunctor (bimap)
import qualified Data.ByteString.Lazy as B
import qualified Data.ByteString.Lazy as LB
@@ -25,7 +25,7 @@ import Data.Either (partitionEithers)
import Data.Foldable (for_, minimum)
import qualified Data.List.NonEmpty as NEL
import qualified Data.Map as M
-import Data.Maybe (fromMaybe)
+import Data.Maybe (fromMaybe, maybeToList)
import qualified Data.Set as S
import qualified Data.Text as T
import qualified Data.Text.Encoding as TE
@@ -44,6 +44,7 @@ import qualified Language.PureScript.CST as CST
import qualified Language.PureScript.Docs.Types as Docs
import Language.PureScript.Errors
import Language.PureScript.Make.Monad
+import Language.PureScript.Make.Cache
import Language.PureScript.Names
import Language.PureScript.Names (runModuleName, ModuleName)
import Language.PureScript.Options hiding (codegenTargets)
@@ -51,8 +52,8 @@ import Language.PureScript.Pretty.Common (SMap(..))
import qualified Paths_purescript as Paths
import SourceMap
import SourceMap.Types
-import System.Directory (doesFileExist, getModificationTime, createDirectoryIfMissing, getCurrentDirectory)
-import System.FilePath ((</>), takeDirectory, makeRelative, splitPath, normalise)
+import System.Directory (getCurrentDirectory)
+import System.FilePath ((</>), makeRelative, splitPath, normalise)
-- | Determines when to rebuild a module
data RebuildPolicy
@@ -83,10 +84,10 @@ renderProgressMessage (CompilingModule mn) = "Compiling " ++ T.unpack (runModule
--
-- * The details of how files are read/written etc.
data MakeActions m = MakeActions
- { getInputTimestamp :: ModuleName -> m (Either RebuildPolicy (Maybe UTCTime))
- -- ^ Get the timestamp for the input file(s) for a module. If there are multiple
- -- files (@.purs@ and foreign files, for example) the timestamp should be for
- -- the most recently modified file.
+ { getInputTimestampsAndHashes :: ModuleName -> m (Either RebuildPolicy (M.Map FilePath (UTCTime, m ContentHash)))
+ -- ^ Get the timestamps and content hashes for the input files for a module.
+ -- The content hash is returned as a monadic action so that the file does not
+ -- have to be read if it's not necessary.
, getOutputTimestamp :: ModuleName -> m (Maybe UTCTime)
-- ^ Get the timestamp for the output files for a module. This should be the
-- timestamp for the oldest modified file, or 'Nothing' if any of the required
@@ -100,6 +101,12 @@ data MakeActions m = MakeActions
-- ^ Check ffi and print it in the output directory.
, progress :: ProgressMessage -> m ()
-- ^ Respond to a progress update.
+ , readCacheDb :: m CacheDb
+ -- ^ Read the cache database (which contains timestamps and hashes for input
+ -- files) from some external source, e.g. a file on disk.
+ , writeCacheDb :: CacheDb -> m ()
+ -- ^ Write the given cache database to some external source (e.g. a file on
+ -- disk).
}
-- | A set of make actions that read and write modules from the given directory.
@@ -114,15 +121,24 @@ buildMakeActions
-- ^ Generate a prefix comment?
-> MakeActions Make
buildMakeActions outputDir filePathMap foreigns usePrefix =
- MakeActions getInputTimestamp getOutputTimestamp readExterns codegen ffiCodegen progress
+ MakeActions getInputTimestampsAndHashes getOutputTimestamp readExterns codegen ffiCodegen progress readCacheDb writeCacheDb
where
- getInputTimestamp :: ModuleName -> Make (Either RebuildPolicy (Maybe UTCTime))
- getInputTimestamp mn = do
+ getInputTimestampsAndHashes
+ :: ModuleName
+ -> Make (Either RebuildPolicy (M.Map FilePath (UTCTime, Make ContentHash)))
+ getInputTimestampsAndHashes mn = do
let path = fromMaybe (internalError "Module has no filename in 'make'") $ M.lookup mn filePathMap
- e1 <- traverse getTimestamp path
- fPath <- maybe (return Nothing) getTimestamp $ M.lookup mn foreigns
- return $ fmap (max fPath) e1
+ case path of
+ Left policy ->
+ return (Left policy)
+ Right filePath -> do
+ let inputPaths = filePath : maybeToList (M.lookup mn foreigns)
+ getInfo fp = do
+ ts <- getTimestamp fp
+ return (ts, hash <$> readTextFile fp)
+ pathsWithInfo <- traverse (\fp -> (fp,) <$> getInfo fp) inputPaths
+ return $ Right $ M.fromList pathsWithInfo
outputFilename :: ModuleName -> String -> FilePath
outputFilename mn fn =
@@ -140,7 +156,7 @@ buildMakeActions outputDir filePathMap foreigns usePrefix =
getOutputTimestamp mn = do
codegenTargets <- asks optionsCodegenTargets
let outputPaths = [outputFilename mn "externs.json"] <> fmap (targetFilename mn) (S.toList codegenTargets)
- timestamps <- traverse getTimestamp outputPaths
+ timestamps <- traverse getTimestampMaybe outputPaths
pure $ fmap minimum . NEL.nonEmpty =<< sequence timestamps
readExterns :: ModuleName -> Make (FilePath, Externs)
@@ -156,7 +172,7 @@ buildMakeActions outputDir filePathMap foreigns usePrefix =
when (S.member CoreFn codegenTargets) $ do
let coreFnFile = targetFilename mn CoreFn
json = CFJ.moduleToJSON Paths.version m
- lift $ writeTextFile coreFnFile (encode json)
+ lift $ writeTextFile coreFnFile (Aeson.encode json)
when (S.member JS codegenTargets) $ do
foreignInclude <- case mn `M.lookup` foreigns of
Just _
@@ -167,7 +183,7 @@ buildMakeActions outputDir filePathMap foreigns usePrefix =
Nothing | requiresForeign m -> throwError . errorMessage' (CF.moduleSourceSpan m) $ MissingFFIModule mn
| otherwise -> return Nothing
rawJs <- J.moduleToJs m foreignInclude
- dir <- lift $ makeIO (const (ErrorMessage [] $ CannotGetFileInfo ".")) getCurrentDirectory
+ dir <- lift $ makeIO "get the current directory" getCurrentDirectory
let sourceMaps = S.member JSSourceMap codegenTargets
(pjs, mappings) = if sourceMaps then prettyPrintJSWithSourceMaps rawJs else (prettyPrintJS rawJs, [])
jsFile = targetFilename mn JS
@@ -179,7 +195,7 @@ buildMakeActions outputDir filePathMap foreigns usePrefix =
writeTextFile jsFile (B.fromStrict $ TE.encodeUtf8 $ js <> mapRef)
when sourceMaps $ genSourceMap dir mapFile (length prefix) mappings
when (S.member Docs codegenTargets) $ do
- lift $ writeTextFile (outputFilename mn "docs.json") (encode docs)
+ lift $ writeTextFile (outputFilename mn "docs.json") (Aeson.encode docs)
ffiCodegen :: CF.Module CF.Ann -> Make ()
ffiCodegen m = do
@@ -212,7 +228,7 @@ buildMakeActions outputDir filePathMap foreigns usePrefix =
}) mappings
}
let mapping = generate rawMapping
- writeTextFile mapFile (encode mapping)
+ writeTextFile mapFile (Aeson.encode mapping)
where
add :: Int -> Int -> SourcePos -> SourcePos
add n m (SourcePos n' m') = SourcePos (n+n') (m+m')
@@ -224,24 +240,17 @@ buildMakeActions outputDir filePathMap foreigns usePrefix =
requiresForeign :: CF.Module a -> Bool
requiresForeign = not . null . CF.moduleForeign
- getTimestamp :: FilePath -> Make (Maybe UTCTime)
- getTimestamp path = makeIO (const (ErrorMessage [] $ CannotGetFileInfo path)) $ do
- exists <- doesFileExist path
- if exists
- then Just <$> getModificationTime path
- else pure Nothing
-
- writeTextFile :: FilePath -> B.ByteString -> Make ()
- writeTextFile path text = makeIO (const (ErrorMessage [] $ CannotWriteFile path)) $ do
- mkdirp path
- B.writeFile path text
- where
- mkdirp :: FilePath -> IO ()
- mkdirp = createDirectoryIfMissing True . takeDirectory
-
progress :: ProgressMessage -> Make ()
progress = liftIO . putStrLn . renderProgressMessage
+ readCacheDb :: Make CacheDb
+ readCacheDb = fmap (fromMaybe mempty) $ readJSONFile cacheDbFile
+
+ writeCacheDb :: CacheDb -> Make ()
+ writeCacheDb = writeJSONFile cacheDbFile
+
+ cacheDbFile = outputDir </> "cache-db.json"
+
-- | Check that the declarations in a given PureScript module match with those
-- in its corresponding foreign module.
checkForeignDecls :: CF.Module ann -> FilePath -> Make ()
diff --git a/src/Language/PureScript/Make/BuildPlan.hs b/src/Language/PureScript/Make/BuildPlan.hs
index 7e4d81e..ebbe50d 100644
--- a/src/Language/PureScript/Make/BuildPlan.hs
+++ b/src/Language/PureScript/Make/BuildPlan.hs
@@ -15,12 +15,11 @@ import Prelude
import Control.Concurrent.Async.Lifted as A
import Control.Concurrent.Lifted as C
import Control.Monad hiding (sequence)
-import Control.Monad.Trans.Class (lift)
import Control.Monad.Trans.Control (MonadBaseControl(..))
import Control.Monad.Trans.Maybe (MaybeT(..), runMaybeT)
import Data.Foldable (foldl')
import qualified Data.Map as M
-import Data.Maybe (catMaybes, fromMaybe)
+import Data.Maybe (fromMaybe, mapMaybe)
import Data.Time.Clock (UTCTime)
import Language.PureScript.AST
import Language.PureScript.Crash
@@ -28,6 +27,7 @@ import qualified Language.PureScript.CST as CST
import Language.PureScript.Errors
import Language.PureScript.Externs
import Language.PureScript.Make.Actions as Actions
+import Language.PureScript.Make.Cache
import Language.PureScript.Names (ModuleName)
-- | The BuildPlan tracks information about our build progress, and holds all
@@ -65,6 +65,20 @@ buildJobFailure :: BuildJobResult -> Maybe MultipleErrors
buildJobFailure (BuildJobFailed errors) = Just errors
buildJobFailure _ = Nothing
+-- | Information obtained about a particular module while constructing a build
+-- plan; used to decide whether a module needs rebuilding.
+data RebuildStatus = RebuildStatus
+ { statusModuleName :: ModuleName
+ , statusRebuildNever :: Bool
+ , statusNewCacheInfo :: Maybe CacheInfo
+ -- ^ New cache info for this module which should be stored for subsequent
+ -- incremental builds. A value of Nothing indicates that cache info for
+ -- this module should not be stored in the build cache, because it is being
+ -- rebuilt according to a RebuildPolicy instead.
+ , statusPrebuilt :: Maybe Prebuilt
+ -- ^ Prebuilt externs and timestamp for this module, if any.
+ }
+
-- | Called when we finished compiling a module and want to report back the
-- compilation result, as well as any potential errors that were thrown.
markComplete
@@ -115,32 +129,67 @@ getResult buildPlan moduleName =
construct
:: forall m. (Monad m, MonadBaseControl IO m)
=> MakeActions m
+ -> CacheDb
-> ([CST.PartialResult Module], [(ModuleName, [ModuleName])])
- -> m BuildPlan
-construct MakeActions{..} (sorted, graph) = do
- prebuilt <- foldl' collectPrebuiltModules M.empty . catMaybes <$> A.forConcurrently sorted findExistingExtern
- let toBeRebuilt = filter (not . flip M.member prebuilt . getModuleName . CST.resPartial) sorted
- buildJobs <- foldM makeBuildJob M.empty (map (getModuleName . CST.resPartial) toBeRebuilt)
- pure $ BuildPlan prebuilt buildJobs
+ -> m (BuildPlan, CacheDb)
+construct MakeActions{..} cacheDb (sorted, graph) = do
+ let sortedModuleNames = map (getModuleName . CST.resPartial) sorted
+ rebuildStatuses <- A.forConcurrently sortedModuleNames getRebuildStatus
+ let prebuilt =
+ foldl' collectPrebuiltModules M.empty $
+ mapMaybe (\s -> (statusModuleName s, statusRebuildNever s,) <$> statusPrebuilt s) rebuildStatuses
+ let toBeRebuilt = filter (not . flip M.member prebuilt) sortedModuleNames
+ buildJobs <- foldM makeBuildJob M.empty toBeRebuilt
+ pure
+ ( BuildPlan prebuilt buildJobs
+ , let
+ update = flip $ \s ->
+ M.alter (const (statusNewCacheInfo s)) (statusModuleName s)
+ in
+ foldl' update cacheDb rebuildStatuses
+ )
where
makeBuildJob prev moduleName = do
buildJob <- BuildJob <$> C.newEmptyMVar
pure (M.insert moduleName buildJob prev)
- findExistingExtern :: CST.PartialResult Module -> m (Maybe (ModuleName, Bool, Prebuilt))
- findExistingExtern (getModuleName . CST.resPartial -> moduleName) = runMaybeT $ do
- inputTimestamp <- lift $ getInputTimestamp moduleName
- (rebuildNever, existingTimestamp) <-
- case inputTimestamp of
- Left RebuildNever ->
- fmap (True,) $ MaybeT $ getOutputTimestamp moduleName
- Right (Just t1) -> do
- outputTimestamp <- MaybeT $ getOutputTimestamp moduleName
- guard (t1 < outputTimestamp)
- pure (False, outputTimestamp)
- _ -> mzero
- externsFile <- MaybeT $ decodeExterns . snd <$> readExterns moduleName
- pure (moduleName, rebuildNever, Prebuilt existingTimestamp externsFile)
+ getRebuildStatus :: ModuleName -> m RebuildStatus
+ getRebuildStatus moduleName = do
+ inputInfo <- getInputTimestampsAndHashes moduleName
+ case inputInfo of
+ Left RebuildNever -> do
+ prebuilt <- findExistingExtern moduleName
+ pure (RebuildStatus
+ { statusModuleName = moduleName
+ , statusRebuildNever = True
+ , statusPrebuilt = prebuilt
+ , statusNewCacheInfo = Nothing
+ })
+ Left RebuildAlways -> do
+ pure (RebuildStatus
+ { statusModuleName = moduleName
+ , statusRebuildNever = False
+ , statusPrebuilt = Nothing
+ , statusNewCacheInfo = Nothing
+ })
+ Right cacheInfo -> do
+ (newCacheInfo, isUpToDate) <- checkChanged cacheDb moduleName cacheInfo
+ prebuilt <-
+ if isUpToDate
+ then findExistingExtern moduleName
+ else pure Nothing
+ pure (RebuildStatus
+ { statusModuleName = moduleName
+ , statusRebuildNever = False
+ , statusPrebuilt = prebuilt
+ , statusNewCacheInfo = Just newCacheInfo
+ })
+
+ findExistingExtern :: ModuleName -> m (Maybe Prebuilt)
+ findExistingExtern moduleName = runMaybeT $ do
+ timestamp <- MaybeT $ getOutputTimestamp moduleName
+ externs <- MaybeT $ decodeExterns . snd <$> readExterns moduleName
+ pure (Prebuilt timestamp externs)
collectPrebuiltModules :: M.Map ModuleName Prebuilt -> (ModuleName, Bool, Prebuilt) -> M.Map ModuleName Prebuilt
collectPrebuiltModules prev (moduleName, rebuildNever, pb)
diff --git a/src/Language/PureScript/Make/Cache.hs b/src/Language/PureScript/Make/Cache.hs
new file mode 100644
index 0000000..337ee2d
--- /dev/null
+++ b/src/Language/PureScript/Make/Cache.hs
@@ -0,0 +1,130 @@
+{-# LANGUAGE GeneralizedNewtypeDeriving #-}
+
+module Language.PureScript.Make.Cache
+ ( ContentHash
+ , hash
+ , CacheDb
+ , CacheInfo
+ , checkChanged
+ , removeModules
+ ) where
+
+import Prelude
+
+import Control.Category ((>>>))
+import Control.Monad ((>=>))
+import Crypto.Hash (hashlazy, HashAlgorithm, Digest, SHA512, digestFromByteString)
+import qualified Data.Aeson as Aeson
+import Data.Align (align)
+import Data.ByteArray.Encoding (Base(Base16), convertToBase, convertFromBase)
+import qualified Data.ByteString as BS
+import qualified Data.ByteString.Lazy as BSL
+import Data.Map (Map)
+import qualified Data.Map as Map
+import Data.Maybe (fromMaybe)
+import Data.Monoid (All(..))
+import Data.Set (Set)
+import Data.Text (Text)
+import Data.Text.Encoding (encodeUtf8, decodeUtf8)
+import Data.These (These(..))
+import Data.Time.Clock (UTCTime)
+import Data.Traversable (for)
+
+import Language.PureScript.Names (ModuleName)
+
+digestToHex :: Digest a -> Text
+digestToHex = decodeUtf8 . convertToBase Base16
+
+digestFromHex :: forall a. HashAlgorithm a => Text -> Maybe (Digest a)
+digestFromHex =
+ encodeUtf8
+ >>> either (const Nothing) Just . convertFromBase Base16
+ >=> (digestFromByteString :: BS.ByteString -> Maybe (Digest a))
+
+-- | Defines the hash algorithm we use for cache invalidation of input files.
+newtype ContentHash = ContentHash
+ { unContentHash :: Digest SHA512 }
+ deriving (Show, Eq, Ord)
+
+instance Aeson.ToJSON ContentHash where
+ toJSON = Aeson.toJSON . digestToHex . unContentHash
+
+instance Aeson.FromJSON ContentHash where
+ parseJSON x = do
+ str <- Aeson.parseJSON x
+ case digestFromHex str of
+ Just digest ->
+ pure $ ContentHash digest
+ Nothing ->
+ fail "Unable to decode ContentHash"
+
+hash :: BSL.ByteString -> ContentHash
+hash = ContentHash . hashlazy
+
+type CacheDb = Map ModuleName CacheInfo
+
+-- | A CacheInfo contains all of the information we need to store about a
+-- particular module in the cache database.
+newtype CacheInfo = CacheInfo
+ { unCacheInfo :: Map FilePath (UTCTime, ContentHash) }
+ deriving stock (Show)
+ deriving newtype (Eq, Ord, Semigroup, Monoid, Aeson.FromJSON, Aeson.ToJSON)
+
+-- | Given a module name, and a map containing the associated input files
+-- together with current metadata i.e. timestamps and hashes, check whether the
+-- input files have changed, based on comparing with the database stored in the
+-- monadic state.
+--
+-- The CacheInfo in the return value should be stored in the cache for future
+-- builds.
+--
+-- The Bool in the return value indicates whether it is safe to use existing
+-- build artifacts for this module, at least based on the timestamps and hashes
+-- of the module's input files.
+--
+-- If the timestamps are the same as those in the database, assume the file is
+-- unchanged, and return True without checking hashes.
+--
+-- If any of the timestamps differ from what is in the database, check the
+-- hashes of those files. In this case, update the database with any changed
+-- timestamps and hashes, and return True if and only if all of the hashes are
+-- unchanged.
+checkChanged
+ :: Monad m
+ => CacheDb
+ -> ModuleName
+ -> Map FilePath (UTCTime, m ContentHash)
+ -> m (CacheInfo, Bool)
+checkChanged cacheDb mn currentInfo = do
+ let dbInfo = unCacheInfo $ fromMaybe mempty (Map.lookup mn cacheDb)
+ (newInfo, isUpToDate) <-
+ fmap mconcat $
+ for (Map.toList (align dbInfo currentInfo)) $ \(fp, aligned) -> do
+ case aligned of
+ This _ -> do
+ -- One of the input files listed in the cache no longer exists;
+ -- remove that file from the cache and note that the module needs
+ -- rebuilding
+ pure (Map.empty, All False)
+ That (timestamp, getHash) -> do
+ -- The module has a new input file; add it to the cache and
+ -- note that the module needs rebuilding.
+ newHash <- getHash
+ pure (Map.singleton fp (timestamp, newHash), All False)
+ These db@(dbTimestamp, _) (newTimestamp, _) | dbTimestamp == newTimestamp -> do
+ -- This file exists both currently and in the cache database,
+ -- and the timestamp is unchanged, so we skip checking the
+ -- hash.
+ pure (Map.singleton fp db, mempty)
+ These (_, dbHash) (newTimestamp, getHash) -> do
+ -- This file exists both currently and in the cache database,
+ -- but the timestamp has changed, so we need to check the hash.
+ newHash <- getHash
+ pure (Map.singleton fp (newTimestamp, newHash), All (dbHash == newHash))
+
+ pure (CacheInfo newInfo, getAll isUpToDate)
+
+-- | Remove any modules from the given set from the cache database; used when
+-- they failed to build.
+removeModules :: Set ModuleName -> CacheDb -> CacheDb
+removeModules moduleNames = flip Map.withoutKeys moduleNames
diff --git a/src/Language/PureScript/Make/Monad.hs b/src/Language/PureScript/Make/Monad.hs
index bbc737e..6fe38f3 100644
--- a/src/Language/PureScript/Make/Monad.hs
+++ b/src/Language/PureScript/Make/Monad.hs
@@ -5,11 +5,19 @@ module Language.PureScript.Make.Monad
Make(..)
, runMake
, makeIO
+ , getTimestamp
+ , getTimestampMaybe
, readTextFile
+ , readTextFileMaybe
+ , readJSONFile
+ , writeTextFile
+ , writeJSONFile
) where
import Prelude
+import Control.Exception (tryJust)
+import Control.Monad (join, guard)
import Control.Monad.Base (MonadBase(..))
import Control.Monad.Error.Class (MonadError(..))
import Control.Monad.IO.Class
@@ -18,11 +26,17 @@ import Control.Monad.Reader (MonadReader(..), ReaderT(..))
import Control.Monad.Trans.Control (MonadBaseControl(..))
import Control.Monad.Trans.Except
import Control.Monad.Writer.Class (MonadWriter(..))
+import qualified Data.Aeson as Aeson
import qualified Data.ByteString.Lazy as B
+import Data.Text (Text)
+import qualified Data.Text as Text
+import Data.Time.Clock (UTCTime)
import Language.PureScript.AST
import Language.PureScript.Errors
import Language.PureScript.Options
-import System.IO.Error (tryIOError)
+import System.Directory (createDirectoryIfMissing, getModificationTime)
+import System.FilePath (takeDirectory)
+import System.IO.Error (tryIOError, isDoesNotExistError)
-- | A monad for running make actions
newtype Make a = Make
@@ -41,14 +55,71 @@ instance MonadBaseControl IO Make where
runMake :: Options -> Make a -> IO (Either MultipleErrors a, MultipleErrors)
runMake opts = runLogger' . runExceptT . flip runReaderT opts . unMake
--- | Run an 'IO' action in the 'Make' monad, by specifying how IO errors should
--- be rendered as 'ErrorMessage' values.
-makeIO :: (IOError -> ErrorMessage) -> IO a -> Make a
-makeIO f io = do
+-- | Run an 'IO' action in the 'Make' monad. The 'String' argument should
+-- describe what we were trying to do; it is used for rendering errors in the
+-- case that an IOException is thrown.
+makeIO :: Text -> IO a -> Make a
+makeIO description io = do
e <- liftIO $ tryIOError io
- either (throwError . singleError . f) return e
+ either (throwError . singleError . ErrorMessage [] . FileIOError description) return e
+
+-- | Get a file's modification time in the 'Make' monad, capturing any errors
+-- using the 'MonadError' instance.
+getTimestamp :: FilePath -> Make UTCTime
+getTimestamp path =
+ makeIO ("get a timestamp for file: " <> Text.pack path) $ getModificationTime path
+
+-- | Get a file's modification time in the 'Make' monad, returning Nothing if
+-- the file does not exist.
+getTimestampMaybe :: FilePath -> Make (Maybe UTCTime)
+getTimestampMaybe path =
+ makeIO ("get a timestamp for file: " <> Text.pack path) $ catchDoesNotExist $ getModificationTime path
-- | Read a text file in the 'Make' monad, capturing any errors using the
-- 'MonadError' instance.
readTextFile :: FilePath -> Make B.ByteString
-readTextFile path = makeIO (const (ErrorMessage [] $ CannotReadFile path)) $ B.readFile path
+readTextFile path =
+ makeIO ("read file: " <> Text.pack path) $ B.readFile path
+
+-- | Read a text file in the 'Make' monad, or return 'Nothing' if the file does
+-- not exist. Errors are captured using the 'MonadError' instance.
+readTextFileMaybe :: FilePath -> Make (Maybe B.ByteString)
+readTextFileMaybe path =
+ makeIO ("read file: " <> Text.pack path) $ catchDoesNotExist $ B.readFile path
+
+-- | Read a JSON file in the 'Make' monad, returning 'Nothing' if the file does
+-- not exist or could not be parsed. Errors are captured using the 'MonadError'
+-- instance.
+readJSONFile :: Aeson.FromJSON a => FilePath -> Make (Maybe a)
+readJSONFile path =
+ makeIO ("read JSON file: " <> Text.pack path) $ do
+ r <- catchDoesNotExist $ Aeson.decodeFileStrict' path
+ return $ join r
+
+-- | If the provided action threw an 'isDoesNotExist' error, catch it and
+-- return Nothing. Otherwise return Just the result of the inner action.
+catchDoesNotExist :: IO a -> IO (Maybe a)
+catchDoesNotExist inner = do
+ r <- tryJust (guard . isDoesNotExistError) inner
+ case r of
+ Left () ->
+ return Nothing
+ Right x ->
+ return (Just x)
+
+-- | Write a text file in the 'Make' monad, capturing any errors using the
+-- 'MonadError' instance.
+writeTextFile :: FilePath -> B.ByteString -> Make ()
+writeTextFile path text = makeIO ("write file: " <> Text.pack path) $ do
+ createParentDirectory path
+ B.writeFile path text
+
+-- | Write a JSON file in the 'Make' monad, capturing any errors using the
+-- 'MonadError' instance.
+writeJSONFile :: Aeson.ToJSON a => FilePath -> a -> Make ()
+writeJSONFile path value = makeIO ("write JSON file: " <> Text.pack path) $ do
+ createParentDirectory path
+ Aeson.encodeFile path value
+
+createParentDirectory :: FilePath -> IO ()
+createParentDirectory = createDirectoryIfMissing True . takeDirectory
diff --git a/src/Language/PureScript/Names.hs b/src/Language/PureScript/Names.hs
index e2327c1..5f8afd7 100644
--- a/src/Language/PureScript/Names.hs
+++ b/src/Language/PureScript/Names.hs
@@ -12,6 +12,7 @@ import Prelude.Compat
import Control.Monad.Supply.Class
import Control.DeepSeq (NFData)
+import Data.Functor.Contravariant (contramap)
import GHC.Generics (Generic)
import Data.Aeson
@@ -243,3 +244,9 @@ isQualifiedWith _ _ = False
$(deriveJSON (defaultOptions { sumEncoding = ObjectWithSingleField }) ''Qualified)
$(deriveJSON (defaultOptions { sumEncoding = ObjectWithSingleField }) ''Ident)
$(deriveJSON (defaultOptions { sumEncoding = ObjectWithSingleField }) ''ModuleName)
+
+instance ToJSONKey ModuleName where
+ toJSONKey = contramap runModuleName toJSONKey
+
+instance FromJSONKey ModuleName where
+ fromJSONKey = fmap moduleNameFromString fromJSONKey
diff --git a/src/Language/PureScript/Sugar/Names/Imports.hs b/src/Language/PureScript/Sugar/Names/Imports.hs
index 4253709..f4e5298 100644
--- a/src/Language/PureScript/Sugar/Names/Imports.hs
+++ b/src/Language/PureScript/Sugar/Names/Imports.hs
@@ -32,10 +32,9 @@ findImports
-> M.Map ModuleName [ImportDef]
findImports = foldr go M.empty
where
- go (ImportDeclaration (pos, _) mn typ qual) result =
- let imp = (pos, typ, qual)
- in M.insert mn (maybe [imp] (imp :) (mn `M.lookup` result)) result
- go _ result = result
+ go (ImportDeclaration (pos, _) mn typ qual) =
+ M.alter (return . ((pos, typ, qual) :) . fromMaybe []) mn
+ go _ = id
-- |
-- Constructs a set of imports for a module.
diff --git a/src/Language/PureScript/TypeChecker/Types.hs b/src/Language/PureScript/TypeChecker/Types.hs
index e449135..b0bc93d 100644
--- a/src/Language/PureScript/TypeChecker/Types.hs
+++ b/src/Language/PureScript/TypeChecker/Types.hs
@@ -173,6 +173,7 @@ typesOf bindingGroupType moduleName vals = withFreshSubstitution $ do
constrain cs ty = foldr srcConstrainedType ty (map (\(_, _, x) -> x) cs)
-- Apply the substitution that was returned from runUnify to both types and (type-annotated) values
+
tidyUp ts sub = first (map (second (first (second (overTypes (substituteType sub) *** substituteType sub))))) ts
isHoleError :: ErrorMessage -> Bool
diff --git a/stack.yaml b/stack.yaml
index 3187ac9..85af85f 100644
--- a/stack.yaml
+++ b/stack.yaml
@@ -4,8 +4,10 @@ packages:
- '.'
extra-deps:
- happy-1.19.9
-- language-javascript-0.6.0.13
+- language-javascript-0.7.0.0
- network-3.0.1.1
+- these-1.0.1
+- semialign-1
nix:
enable: false
packages:
@@ -17,3 +19,6 @@ nix:
flags:
aeson-pretty:
lib-only: true
+ these:
+ assoc: false
+ quickcheck: false
diff --git a/tests/Main.hs b/tests/Main.hs
index 37bf70b..3c7d5e0 100644
--- a/tests/Main.hs
+++ b/tests/Main.hs
@@ -20,6 +20,7 @@ import qualified TestPsci
import qualified TestIde
import qualified TestPscPublish
import qualified TestBundle
+import qualified TestMake
import qualified TestUtils
import System.IO (hSetEncoding, stdout, stderr, utf8)
@@ -35,6 +36,7 @@ main = do
cstTests <- TestCst.main
ideTests <- TestIde.main
compilerTests <- TestCompiler.main
+ makeTests <- TestMake.main
psciTests <- TestPsci.main
pscBundleTests <- TestBundle.main
coreFnTests <- TestCoreFn.main
@@ -48,6 +50,7 @@ main = do
"Tests"
[ cstTests
, compilerTests
+ , makeTests
, psciTests
, pscBundleTests
, ideTests
diff --git a/tests/TestMake.hs b/tests/TestMake.hs
new file mode 100644
index 0000000..dadee27
--- /dev/null
+++ b/tests/TestMake.hs
@@ -0,0 +1,216 @@
+-- Tests for the compiler's handling of incremental builds, i.e. the code in
+-- Language.PureScript.Make.
+
+module TestMake where
+
+import Prelude ()
+import Prelude.Compat
+
+import qualified Language.PureScript as P
+import qualified Language.PureScript.CST as CST
+
+import Control.Monad
+import Control.Exception (tryJust)
+import Control.Monad.IO.Class (liftIO)
+import Control.Concurrent.MVar (readMVar, newMVar, modifyMVar_)
+import Data.Time.Calendar
+import Data.Time.Clock
+import qualified Data.Text as T
+import Data.Set (Set)
+import qualified Data.Set as Set
+import qualified Data.Map as M
+
+import System.FilePath
+import System.Directory
+import System.IO.Error (isDoesNotExistError)
+import System.IO.UTF8 (readUTF8FilesT, writeUTF8FileT)
+
+import Test.Tasty
+import Test.Tasty.Hspec
+
+utcMidnightOnDate :: Integer -> Int -> Int -> UTCTime
+utcMidnightOnDate day month year = UTCTime (fromGregorian day month year) (secondsToDiffTime 0)
+
+timestampA, timestampB, timestampC, timestampD, timestampE, timestampF :: UTCTime
+timestampA = utcMidnightOnDate 2019 1 1
+timestampB = utcMidnightOnDate 2019 1 2
+timestampC = utcMidnightOnDate 2019 1 3
+timestampD = utcMidnightOnDate 2019 1 4
+timestampE = utcMidnightOnDate 2019 1 5
+timestampF = utcMidnightOnDate 2019 1 6
+
+main :: IO TestTree
+main = testSpec "make" spec
+
+spec :: Spec
+spec = do
+ let sourcesDir = "tests/purs/make"
+ let moduleNames = Set.fromList . map P.moduleNameFromString
+ before_ (rimraf modulesDir >> rimraf sourcesDir >> createDirectory sourcesDir) $ do
+ it "does not recompile if there are no changes" $ do
+ let modulePath = sourcesDir </> "Module.purs"
+
+ writeFileWithTimestamp modulePath timestampA "module Module where\nfoo = 0\n"
+ compile [modulePath] `shouldReturn` moduleNames ["Module"]
+ compile [modulePath] `shouldReturn` moduleNames []
+
+ it "recompiles if files have changed" $ do
+ let modulePath = sourcesDir </> "Module.purs"
+
+ writeFileWithTimestamp modulePath timestampA "module Module where\nfoo = 0\n"
+ compile [modulePath] `shouldReturn` moduleNames ["Module"]
+ writeFileWithTimestamp modulePath timestampB "module Module where\nfoo = 1\n"
+ compile [modulePath] `shouldReturn` moduleNames ["Module"]
+
+ it "does not recompile if hashes have not changed" $ do
+ let modulePath = sourcesDir </> "Module.purs"
+ moduleContent = "module Module where\nfoo = 0\n"
+
+ writeFileWithTimestamp modulePath timestampA moduleContent
+ compile [modulePath] `shouldReturn` moduleNames ["Module"]
+ writeFileWithTimestamp modulePath timestampB moduleContent
+ compile [modulePath] `shouldReturn` moduleNames []
+
+ it "recompiles if the file path for a module has changed" $ do
+ let modulePath1 = sourcesDir </> "Module1.purs"
+ modulePath2 = sourcesDir </> "Module2.purs"
+ moduleContent = "module Module where\nfoo = 0\n"
+
+ writeFileWithTimestamp modulePath1 timestampA moduleContent
+ writeFileWithTimestamp modulePath2 timestampA moduleContent
+
+ compile [modulePath1] `shouldReturn` moduleNames ["Module"]
+ compile [modulePath2] `shouldReturn` moduleNames ["Module"]
+
+ it "recompiles if an FFI file was added" $ do
+ let moduleBasePath = sourcesDir </> "Module"
+ modulePath = moduleBasePath ++ ".purs"
+ moduleFFIPath = moduleBasePath ++ ".js"
+ moduleContent = "module Module where\nfoo = 0\n"
+
+ writeFileWithTimestamp modulePath timestampA moduleContent
+ compile [modulePath] `shouldReturn` moduleNames ["Module"]
+
+ writeFileWithTimestamp moduleFFIPath timestampB "exports.bar = 1;\n"
+ compile [modulePath] `shouldReturn` moduleNames ["Module"]
+
+ it "recompiles if an FFI file was removed" $ do
+ let moduleBasePath = sourcesDir </> "Module"
+ modulePath = moduleBasePath ++ ".purs"
+ moduleFFIPath = moduleBasePath ++ ".js"
+ moduleContent = "module Module where\nfoo = 0\n"
+
+ writeFileWithTimestamp modulePath timestampA moduleContent
+ writeFileWithTimestamp moduleFFIPath timestampB "exports.bar = 1;\n"
+ compile [modulePath] `shouldReturn` moduleNames ["Module"]
+
+ removeFile moduleFFIPath
+ compile [modulePath] `shouldReturn` moduleNames ["Module"]
+
+ it "recompiles downstream modules when a module is rebuilt" $ do
+ let moduleAPath = sourcesDir </> "A.purs"
+ moduleBPath = sourcesDir </> "B.purs"
+ moduleAContent1 = "module A where\nfoo = 0\n"
+ moduleAContent2 = "module A where\nfoo = 1\n"
+ moduleBContent = "module B where\nimport A (foo)\nbar = foo\n"
+
+ writeFileWithTimestamp moduleAPath timestampA moduleAContent1
+ writeFileWithTimestamp moduleBPath timestampB moduleBContent
+ compile [moduleAPath, moduleBPath] `shouldReturn` moduleNames ["A", "B"]
+
+ writeFileWithTimestamp moduleAPath timestampC moduleAContent2
+ compile [moduleAPath, moduleBPath] `shouldReturn` moduleNames ["A", "B"]
+
+ it "only recompiles downstream modules when a module is rebuilt" $ do
+ let moduleAPath = sourcesDir </> "A.purs"
+ moduleBPath = sourcesDir </> "B.purs"
+ moduleCPath = sourcesDir </> "C.purs"
+ modulePaths = [moduleAPath, moduleBPath, moduleCPath]
+ moduleAContent1 = "module A where\nfoo = 0\n"
+ moduleAContent2 = "module A where\nfoo = 1\n"
+ moduleBContent = "module B where\nimport A (foo)\nbar = foo\n"
+ moduleCContent = "module C where\nbaz = 3\n"
+
+ writeFileWithTimestamp moduleAPath timestampA moduleAContent1
+ writeFileWithTimestamp moduleBPath timestampB moduleBContent
+ writeFileWithTimestamp moduleCPath timestampC moduleCContent
+ compile modulePaths `shouldReturn` moduleNames ["A", "B", "C"]
+
+ writeFileWithTimestamp moduleAPath timestampD moduleAContent2
+ compile modulePaths `shouldReturn` moduleNames ["A", "B"]
+
+ it "does not necessarily recompile modules which were not part of the previous batch" $ do
+ let moduleAPath = sourcesDir </> "A.purs"
+ moduleBPath = sourcesDir </> "B.purs"
+ moduleCPath = sourcesDir </> "C.purs"
+ modulePaths = [moduleAPath, moduleBPath, moduleCPath]
+ batch1 = [moduleAPath, moduleBPath]
+ batch2 = [moduleAPath, moduleCPath]
+ moduleAContent = "module A where\nfoo = 0\n"
+ moduleBContent = "module B where\nimport A (foo)\nbar = foo\n"
+ moduleCContent = "module C where\nbaz = 3\n"
+
+ writeFileWithTimestamp moduleAPath timestampA moduleAContent
+ writeFileWithTimestamp moduleBPath timestampB moduleBContent
+ writeFileWithTimestamp moduleCPath timestampC moduleCContent
+ compile modulePaths `shouldReturn` moduleNames ["A", "B", "C"]
+
+ compile batch1 `shouldReturn` moduleNames []
+ compile batch2 `shouldReturn` moduleNames []
+
+ it "recompiles if a module fails to compile" $ do
+ let modulePath = sourcesDir </> "Module.purs"
+ moduleContent = "module Module where\nfoo :: Int\nfoo = \"not an int\"\n"
+
+ writeFileWithTimestamp modulePath timestampA moduleContent
+ compileAllowingFailures [modulePath] `shouldReturn` moduleNames ["Module"]
+ compileAllowingFailures [modulePath] `shouldReturn` moduleNames ["Module"]
+
+rimraf :: FilePath -> IO ()
+rimraf =
+ void . tryJust (guard . isDoesNotExistError) . removeDirectoryRecursive
+
+-- | Returns a set of the modules for which a rebuild was attempted, including
+-- the make result.
+compileWithResult :: [FilePath] -> IO (Either P.MultipleErrors [P.ExternsFile], Set P.ModuleName)
+compileWithResult input = do
+ recompiled <- newMVar Set.empty
+ moduleFiles <- readUTF8FilesT input
+ (makeResult, _) <- P.runMake P.defaultOptions $ do
+ ms <- CST.parseModulesFromFiles id moduleFiles
+ let filePathMap = M.fromList $ map (\(fp, pm) -> (P.getModuleName $ CST.resPartial pm, Right fp)) ms
+ foreigns <- P.inferForeignModules filePathMap
+ let makeActions =
+ (P.buildMakeActions modulesDir filePathMap foreigns True)
+ { P.progress = \(P.CompilingModule mn) ->
+ liftIO $ modifyMVar_ recompiled (return . Set.insert mn)
+ }
+ P.make makeActions (map snd ms)
+
+ recompiledModules <- readMVar recompiled
+ pure (makeResult, recompiledModules)
+
+-- | Compile, returning the set of modules which were rebuilt, and failing if
+-- any errors occurred.
+compile :: [FilePath] -> IO (Set P.ModuleName)
+compile input = do
+ (result, recompiled) <- compileWithResult input
+ case result of
+ Left errs ->
+ fail (P.prettyPrintMultipleErrors P.defaultPPEOptions errs)
+ Right _ ->
+ pure recompiled
+
+compileAllowingFailures :: [FilePath] -> IO (Set P.ModuleName)
+compileAllowingFailures input = fmap snd (compileWithResult input)
+
+writeFileWithTimestamp :: FilePath -> UTCTime -> T.Text -> IO ()
+writeFileWithTimestamp path mtime contents = do
+ writeUTF8FileT path contents
+ setModificationTime path mtime
+
+-- | Use a different output directory to ensure that we don't get interference
+-- from other test results
+modulesDir :: FilePath
+modulesDir = ".test_modules" </> "make"
+
diff --git a/tests/TestUtils.hs b/tests/TestUtils.hs
index fe0c14d..78ba841 100644
--- a/tests/TestUtils.hs
+++ b/tests/TestUtils.hs
@@ -198,13 +198,13 @@ checkMain ms =
makeActions :: [P.Module] -> M.Map P.ModuleName FilePath -> P.MakeActions P.Make
makeActions modules foreigns = (P.buildMakeActions modulesDir (P.internalError "makeActions: input file map was read.") foreigns False)
- { P.getInputTimestamp = getInputTimestamp
+ { P.getInputTimestampsAndHashes = getInputTimestampsAndHashes
, P.getOutputTimestamp = getOutputTimestamp
, P.progress = const (pure ())
}
where
- getInputTimestamp :: P.ModuleName -> P.Make (Either P.RebuildPolicy (Maybe UTCTime))
- getInputTimestamp mn
+ getInputTimestampsAndHashes :: P.ModuleName -> P.Make (Either P.RebuildPolicy a)
+ getInputTimestampsAndHashes mn
| isSupportModule (P.runModuleName mn) = return (Left P.RebuildNever)
| otherwise = return (Left P.RebuildAlways)
where
diff --git a/tests/purs/bundle/3727.js b/tests/purs/bundle/3727.js
new file mode 100644
index 0000000..02e18d2
--- /dev/null
+++ b/tests/purs/bundle/3727.js
@@ -0,0 +1,4 @@
+'use strict';
+
+exports.foo = 1;
+exports.bar = exports.foo;
diff --git a/tests/purs/bundle/3727.purs b/tests/purs/bundle/3727.purs
new file mode 100644
index 0000000..2bdf512
--- /dev/null
+++ b/tests/purs/bundle/3727.purs
@@ -0,0 +1,13 @@
+module Main (main) where
+
+import Prelude
+import Effect (Effect)
+import Effect.Console (log)
+import Test.Assert (assert)
+
+main :: Effect Unit
+main = do
+ assert (bar == 1)
+ log "Done"
+
+foreign import bar :: Int
diff --git a/tests/purs/bundle/ObjectShorthand.js b/tests/purs/bundle/ObjectShorthand.js
new file mode 100644
index 0000000..156ff0c
--- /dev/null
+++ b/tests/purs/bundle/ObjectShorthand.js
@@ -0,0 +1,15 @@
+"use strict";
+
+var foo = 1;
+
+exports.bar = { foo };
+
+var baz = 2;
+
+exports.quux = function(baz) {
+ return { baz };
+};
+
+var fs = require('fs');
+var source = fs.readFileSync(__filename, 'utf-8');
+exports.bazIsEliminated = !/^ *var baz =/m.test(source);
diff --git a/tests/purs/bundle/ObjectShorthand.purs b/tests/purs/bundle/ObjectShorthand.purs
new file mode 100644
index 0000000..6914845
--- /dev/null
+++ b/tests/purs/bundle/ObjectShorthand.purs
@@ -0,0 +1,18 @@
+-- See issue #3741
+module Main (main) where
+
+import Prelude
+import Effect (Effect)
+import Effect.Console (log)
+import Test.Assert (assert')
+
+main :: Effect Unit
+main = do
+ assert' "bar" (bar.foo == 1)
+ assert' "quux" (quux 3 == { baz: 3 })
+ assert' "baz" bazIsEliminated
+ log "Done"
+
+foreign import bar :: { foo :: Int }
+foreign import quux :: forall a. a -> { baz :: a }
+foreign import bazIsEliminated :: Boolean
diff --git a/tests/purs/docs/output/Ado/externs.json b/tests/purs/docs/output/Ado/externs.json
index 2f63b8d..2894d1a 100644
--- a/tests/purs/docs/output/Ado/externs.json
+++ b/tests/purs/docs/output/Ado/externs.json
@@ -1 +1 @@
-{"efVersion":"0.13.2","efModuleName":["Ado"],"efExports":[{"ValueRef":[{"start":[2,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/Ado.purs","end":[9,16]},{"Ident":"test"}]}],"efImports":[{"eiModule":["Prim"],"eiImportType":{"Implicit":[]},"eiImportedAs":["Prim"]},{"eiModule":["Prim"],"eiImportType":{"Implicit":[]},"eiImportedAs":null}],"efFixities":[],"efTypeFixities":[],"efDeclarations":[{"EDValue":{"edValueName":{"Ident":"test"},"edValueType":{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeConstructor","contents":[["Prim"],"Int"]}}}],"efSourceSpan":{"start":[2,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/Ado.purs","end":[9,16]}} \ No newline at end of file
+{"efVersion":"0.13.3","efModuleName":["Ado"],"efExports":[{"ValueRef":[{"start":[2,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/Ado.purs","end":[9,16]},{"Ident":"test"}]}],"efImports":[{"eiModule":["Prim"],"eiImportType":{"Implicit":[]},"eiImportedAs":["Prim"]},{"eiModule":["Prim"],"eiImportType":{"Implicit":[]},"eiImportedAs":null}],"efFixities":[],"efTypeFixities":[],"efDeclarations":[{"EDValue":{"edValueName":{"Ident":"test"},"edValueType":{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeConstructor","contents":[["Prim"],"Int"]}}}],"efSourceSpan":{"start":[2,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/Ado.purs","end":[9,16]}} \ No newline at end of file
diff --git a/tests/purs/docs/output/ChildDeclOrder/externs.json b/tests/purs/docs/output/ChildDeclOrder/externs.json
index 3808dec..e221f30 100644
--- a/tests/purs/docs/output/ChildDeclOrder/externs.json
+++ b/tests/purs/docs/output/ChildDeclOrder/externs.json
@@ -1 +1 @@
-{"efVersion":"0.13.2","efModuleName":["ChildDeclOrder"],"efExports":[{"ValueRef":[{"start":[5,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/ChildDeclOrder.purs","end":[27,11]},{"Ident":"foo1"}]},{"ValueRef":[{"start":[5,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/ChildDeclOrder.purs","end":[27,11]},{"Ident":"foo2"}]},{"ValueRef":[{"start":[5,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/ChildDeclOrder.purs","end":[27,11]},{"Ident":"show"}]},{"TypeRef":[{"start":[5,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/ChildDeclOrder.purs","end":[27,11]},"Two",["First","Second"]]},{"TypeClassRef":[{"start":[5,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/ChildDeclOrder.purs","end":[27,11]},"Show"]},{"TypeClassRef":[{"start":[5,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/ChildDeclOrder.purs","end":[27,11]},"Foo"]},{"TypeInstanceRef":[{"start":[0,0],"name":"<generated>","end":[0,0]},{"Ident":"showTwo"}]},{"TypeInstanceRef":[{"start":[0,0],"name":"<generated>","end":[0,0]},{"Ident":"fooTwo"}]},{"TypeInstanceRef":[{"start":[0,0],"name":"<generated>","end":[0,0]},{"Ident":"fooInt"}]}],"efImports":[{"eiModule":["Prim"],"eiImportType":{"Implicit":[]},"eiImportedAs":["Prim"]},{"eiModule":["Prim"],"eiImportType":{"Implicit":[]},"eiImportedAs":null}],"efFixities":[],"efTypeFixities":[],"efDeclarations":[{"EDValue":{"edValueName":{"Ident":"foo1"},"edValueType":{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"ForAll","contents":["a",{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"ConstrainedType","contents":[{"constraintAnn":[{"start":[0,0],"name":"","end":[0,0]},[]],"constraintClass":[["ChildDeclOrder"],"Foo"],"constraintArgs":[{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeVar","contents":"a"}],"constraintData":null},{"annotation":[{"start":[15,11],"name":"/home/harry/code/purescript/tests/purs/docs/src/ChildDeclOrder.purs","end":[15,12]},[]],"tag":"TypeVar","contents":"a"}]},2]}}},{"EDValue":{"edValueName":{"Ident":"foo2"},"edValueType":{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"ForAll","contents":["a",{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"ConstrainedType","contents":[{"constraintAnn":[{"start":[0,0],"name":"","end":[0,0]},[]],"constraintClass":[["ChildDeclOrder"],"Foo"],"constraintArgs":[{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeVar","contents":"a"}],"constraintData":null},{"annotation":[{"start":[16,11],"name":"/home/harry/code/purescript/tests/purs/docs/src/ChildDeclOrder.purs","end":[16,12]},[]],"tag":"TypeVar","contents":"a"}]},1]}}},{"EDValue":{"edValueName":{"Ident":"show"},"edValueType":{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"ForAll","contents":["a",{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"ConstrainedType","contents":[{"constraintAnn":[{"start":[0,0],"name":"","end":[0,0]},[]],"constraintClass":[["ChildDeclOrder"],"Show"],"constraintArgs":[{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeVar","contents":"a"}],"constraintData":null},{"annotation":[{"start":[12,11],"name":"/home/harry/code/purescript/tests/purs/docs/src/ChildDeclOrder.purs","end":[12,22]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[12,11],"name":"/home/harry/code/purescript/tests/purs/docs/src/ChildDeclOrder.purs","end":[12,22]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[12,13],"name":"/home/harry/code/purescript/tests/purs/docs/src/ChildDeclOrder.purs","end":[12,15]},[]],"tag":"TypeConstructor","contents":[["Prim"],"Function"]},{"annotation":[{"start":[12,11],"name":"/home/harry/code/purescript/tests/purs/docs/src/ChildDeclOrder.purs","end":[12,12]},[]],"tag":"TypeVar","contents":"a"}]},{"annotation":[{"start":[12,16],"name":"/home/harry/code/purescript/tests/purs/docs/src/ChildDeclOrder.purs","end":[12,22]},[]],"tag":"TypeConstructor","contents":[["Prim"],"String"]}]}]},0]}}},{"EDType":{"edTypeName":"Two","edTypeKind":{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"NamedKind","contents":[["Prim"],"Type"]},"edTypeDeclarationKind":{"DataType":{"args":[],"ctors":[["First",[]],["Second",[]]]}}}},{"EDDataConstructor":{"edDataCtorName":"First","edDataCtorOrigin":"data","edDataCtorTypeCtor":"Two","edDataCtorType":{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeConstructor","contents":[["ChildDeclOrder"],"Two"]},"edDataCtorFields":[]}},{"EDDataConstructor":{"edDataCtorName":"Second","edDataCtorOrigin":"data","edDataCtorTypeCtor":"Two","edDataCtorType":{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeConstructor","contents":[["ChildDeclOrder"],"Two"]},"edDataCtorFields":[]}},{"EDType":{"edTypeName":"Show","edTypeKind":{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"FunKind","contents":[{"annotation":[{"start":[12,13],"name":"/home/harry/code/purescript/tests/purs/docs/src/ChildDeclOrder.purs","end":[12,15]},[]],"tag":"NamedKind","contents":[["Prim"],"Type"]},{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"NamedKind","contents":[["Prim"],"Type"]}]},"edTypeDeclarationKind":"TypeSynonym"}},{"EDTypeSynonym":{"edTypeSynonymName":"Show","edTypeSynonymArguments":[["a",null]],"edTypeSynonymType":{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeConstructor","contents":[["Prim"],"Record"]},{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"RCons","contents":["show",{"annotation":[{"start":[12,11],"name":"/home/harry/code/purescript/tests/purs/docs/src/ChildDeclOrder.purs","end":[12,22]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[12,11],"name":"/home/harry/code/purescript/tests/purs/docs/src/ChildDeclOrder.purs","end":[12,22]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[12,13],"name":"/home/harry/code/purescript/tests/purs/docs/src/ChildDeclOrder.purs","end":[12,15]},[]],"tag":"TypeConstructor","contents":[["Prim"],"Function"]},{"annotation":[{"start":[12,11],"name":"/home/harry/code/purescript/tests/purs/docs/src/ChildDeclOrder.purs","end":[12,12]},[]],"tag":"TypeVar","contents":"a"}]},{"annotation":[{"start":[12,16],"name":"/home/harry/code/purescript/tests/purs/docs/src/ChildDeclOrder.purs","end":[12,22]},[]],"tag":"TypeConstructor","contents":[["Prim"],"String"]}]},{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"REmpty"}]}]}}},{"EDClass":{"edClassName":"Show","edClassTypeArguments":[["a",null]],"edClassMembers":[[{"Ident":"show"},{"annotation":[{"start":[12,11],"name":"/home/harry/code/purescript/tests/purs/docs/src/ChildDeclOrder.purs","end":[12,22]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[12,11],"name":"/home/harry/code/purescript/tests/purs/docs/src/ChildDeclOrder.purs","end":[12,22]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[12,13],"name":"/home/harry/code/purescript/tests/purs/docs/src/ChildDeclOrder.purs","end":[12,15]},[]],"tag":"TypeConstructor","contents":[["Prim"],"Function"]},{"annotation":[{"start":[12,11],"name":"/home/harry/code/purescript/tests/purs/docs/src/ChildDeclOrder.purs","end":[12,12]},[]],"tag":"TypeVar","contents":"a"}]},{"annotation":[{"start":[12,16],"name":"/home/harry/code/purescript/tests/purs/docs/src/ChildDeclOrder.purs","end":[12,22]},[]],"tag":"TypeConstructor","contents":[["Prim"],"String"]}]}]],"edClassConstraints":[],"edFunctionalDependencies":[],"edIsEmpty":false}},{"EDType":{"edTypeName":"Foo","edTypeKind":{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"FunKind","contents":[{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"NamedKind","contents":[["Prim"],"Type"]},{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"NamedKind","contents":[["Prim"],"Type"]}]},"edTypeDeclarationKind":"TypeSynonym"}},{"EDTypeSynonym":{"edTypeSynonymName":"Foo","edTypeSynonymArguments":[["a",null]],"edTypeSynonymType":{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeConstructor","contents":[["Prim"],"Record"]},{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"RCons","contents":["foo1",{"annotation":[{"start":[15,11],"name":"/home/harry/code/purescript/tests/purs/docs/src/ChildDeclOrder.purs","end":[15,12]},[]],"tag":"TypeVar","contents":"a"},{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"RCons","contents":["foo2",{"annotation":[{"start":[16,11],"name":"/home/harry/code/purescript/tests/purs/docs/src/ChildDeclOrder.purs","end":[16,12]},[]],"tag":"TypeVar","contents":"a"},{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"REmpty"}]}]}]}}},{"EDClass":{"edClassName":"Foo","edClassTypeArguments":[["a",null]],"edClassMembers":[[{"Ident":"foo1"},{"annotation":[{"start":[15,11],"name":"/home/harry/code/purescript/tests/purs/docs/src/ChildDeclOrder.purs","end":[15,12]},[]],"tag":"TypeVar","contents":"a"}],[{"Ident":"foo2"},{"annotation":[{"start":[16,11],"name":"/home/harry/code/purescript/tests/purs/docs/src/ChildDeclOrder.purs","end":[16,12]},[]],"tag":"TypeVar","contents":"a"}]],"edClassConstraints":[],"edFunctionalDependencies":[],"edIsEmpty":false}},{"EDInstance":{"edInstanceClassName":[["ChildDeclOrder"],"Show"],"edInstanceName":{"Ident":"showTwo"},"edInstanceTypes":[{"annotation":[{"start":[18,26],"name":"/home/harry/code/purescript/tests/purs/docs/src/ChildDeclOrder.purs","end":[18,29]},[]],"tag":"TypeConstructor","contents":[["ChildDeclOrder"],"Two"]}],"edInstanceConstraints":[],"edInstanceChain":[[["ChildDeclOrder"],{"Ident":"showTwo"}]],"edInstanceChainIndex":0}},{"EDInstance":{"edInstanceClassName":[["ChildDeclOrder"],"Foo"],"edInstanceName":{"Ident":"fooTwo"},"edInstanceTypes":[{"annotation":[{"start":[21,24],"name":"/home/harry/code/purescript/tests/purs/docs/src/ChildDeclOrder.purs","end":[21,27]},[]],"tag":"TypeConstructor","contents":[["ChildDeclOrder"],"Two"]}],"edInstanceConstraints":[],"edInstanceChain":[[["ChildDeclOrder"],{"Ident":"fooTwo"}]],"edInstanceChainIndex":0}},{"EDInstance":{"edInstanceClassName":[["ChildDeclOrder"],"Foo"],"edInstanceName":{"Ident":"fooInt"},"edInstanceTypes":[{"annotation":[{"start":[25,24],"name":"/home/harry/code/purescript/tests/purs/docs/src/ChildDeclOrder.purs","end":[25,27]},[]],"tag":"TypeConstructor","contents":[["Prim"],"Int"]}],"edInstanceConstraints":[],"edInstanceChain":[[["ChildDeclOrder"],{"Ident":"fooInt"}]],"edInstanceChainIndex":0}}],"efSourceSpan":{"start":[5,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/ChildDeclOrder.purs","end":[27,11]}} \ No newline at end of file
+{"efVersion":"0.13.3","efModuleName":["ChildDeclOrder"],"efExports":[{"ValueRef":[{"start":[5,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/ChildDeclOrder.purs","end":[27,11]},{"Ident":"foo1"}]},{"ValueRef":[{"start":[5,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/ChildDeclOrder.purs","end":[27,11]},{"Ident":"foo2"}]},{"ValueRef":[{"start":[5,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/ChildDeclOrder.purs","end":[27,11]},{"Ident":"show"}]},{"TypeRef":[{"start":[5,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/ChildDeclOrder.purs","end":[27,11]},"Two",["First","Second"]]},{"TypeClassRef":[{"start":[5,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/ChildDeclOrder.purs","end":[27,11]},"Show"]},{"TypeClassRef":[{"start":[5,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/ChildDeclOrder.purs","end":[27,11]},"Foo"]},{"TypeInstanceRef":[{"start":[0,0],"name":"<generated>","end":[0,0]},{"Ident":"showTwo"}]},{"TypeInstanceRef":[{"start":[0,0],"name":"<generated>","end":[0,0]},{"Ident":"fooTwo"}]},{"TypeInstanceRef":[{"start":[0,0],"name":"<generated>","end":[0,0]},{"Ident":"fooInt"}]}],"efImports":[{"eiModule":["Prim"],"eiImportType":{"Implicit":[]},"eiImportedAs":["Prim"]},{"eiModule":["Prim"],"eiImportType":{"Implicit":[]},"eiImportedAs":null}],"efFixities":[],"efTypeFixities":[],"efDeclarations":[{"EDValue":{"edValueName":{"Ident":"foo1"},"edValueType":{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"ForAll","contents":["a",{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"ConstrainedType","contents":[{"constraintAnn":[{"start":[0,0],"name":"","end":[0,0]},[]],"constraintClass":[["ChildDeclOrder"],"Foo"],"constraintArgs":[{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeVar","contents":"a"}],"constraintData":null},{"annotation":[{"start":[15,11],"name":"/home/harry/code/purescript/tests/purs/docs/src/ChildDeclOrder.purs","end":[15,12]},[]],"tag":"TypeVar","contents":"a"}]},2]}}},{"EDValue":{"edValueName":{"Ident":"foo2"},"edValueType":{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"ForAll","contents":["a",{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"ConstrainedType","contents":[{"constraintAnn":[{"start":[0,0],"name":"","end":[0,0]},[]],"constraintClass":[["ChildDeclOrder"],"Foo"],"constraintArgs":[{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeVar","contents":"a"}],"constraintData":null},{"annotation":[{"start":[16,11],"name":"/home/harry/code/purescript/tests/purs/docs/src/ChildDeclOrder.purs","end":[16,12]},[]],"tag":"TypeVar","contents":"a"}]},1]}}},{"EDValue":{"edValueName":{"Ident":"show"},"edValueType":{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"ForAll","contents":["a",{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"ConstrainedType","contents":[{"constraintAnn":[{"start":[0,0],"name":"","end":[0,0]},[]],"constraintClass":[["ChildDeclOrder"],"Show"],"constraintArgs":[{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeVar","contents":"a"}],"constraintData":null},{"annotation":[{"start":[12,11],"name":"/home/harry/code/purescript/tests/purs/docs/src/ChildDeclOrder.purs","end":[12,22]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[12,11],"name":"/home/harry/code/purescript/tests/purs/docs/src/ChildDeclOrder.purs","end":[12,22]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[12,13],"name":"/home/harry/code/purescript/tests/purs/docs/src/ChildDeclOrder.purs","end":[12,15]},[]],"tag":"TypeConstructor","contents":[["Prim"],"Function"]},{"annotation":[{"start":[12,11],"name":"/home/harry/code/purescript/tests/purs/docs/src/ChildDeclOrder.purs","end":[12,12]},[]],"tag":"TypeVar","contents":"a"}]},{"annotation":[{"start":[12,16],"name":"/home/harry/code/purescript/tests/purs/docs/src/ChildDeclOrder.purs","end":[12,22]},[]],"tag":"TypeConstructor","contents":[["Prim"],"String"]}]}]},0]}}},{"EDType":{"edTypeName":"Two","edTypeKind":{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"NamedKind","contents":[["Prim"],"Type"]},"edTypeDeclarationKind":{"DataType":{"args":[],"ctors":[["First",[]],["Second",[]]]}}}},{"EDDataConstructor":{"edDataCtorName":"First","edDataCtorOrigin":"data","edDataCtorTypeCtor":"Two","edDataCtorType":{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeConstructor","contents":[["ChildDeclOrder"],"Two"]},"edDataCtorFields":[]}},{"EDDataConstructor":{"edDataCtorName":"Second","edDataCtorOrigin":"data","edDataCtorTypeCtor":"Two","edDataCtorType":{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeConstructor","contents":[["ChildDeclOrder"],"Two"]},"edDataCtorFields":[]}},{"EDType":{"edTypeName":"Show","edTypeKind":{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"FunKind","contents":[{"annotation":[{"start":[12,13],"name":"/home/harry/code/purescript/tests/purs/docs/src/ChildDeclOrder.purs","end":[12,15]},[]],"tag":"NamedKind","contents":[["Prim"],"Type"]},{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"NamedKind","contents":[["Prim"],"Type"]}]},"edTypeDeclarationKind":"TypeSynonym"}},{"EDTypeSynonym":{"edTypeSynonymName":"Show","edTypeSynonymArguments":[["a",null]],"edTypeSynonymType":{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeConstructor","contents":[["Prim"],"Record"]},{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"RCons","contents":["show",{"annotation":[{"start":[12,11],"name":"/home/harry/code/purescript/tests/purs/docs/src/ChildDeclOrder.purs","end":[12,22]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[12,11],"name":"/home/harry/code/purescript/tests/purs/docs/src/ChildDeclOrder.purs","end":[12,22]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[12,13],"name":"/home/harry/code/purescript/tests/purs/docs/src/ChildDeclOrder.purs","end":[12,15]},[]],"tag":"TypeConstructor","contents":[["Prim"],"Function"]},{"annotation":[{"start":[12,11],"name":"/home/harry/code/purescript/tests/purs/docs/src/ChildDeclOrder.purs","end":[12,12]},[]],"tag":"TypeVar","contents":"a"}]},{"annotation":[{"start":[12,16],"name":"/home/harry/code/purescript/tests/purs/docs/src/ChildDeclOrder.purs","end":[12,22]},[]],"tag":"TypeConstructor","contents":[["Prim"],"String"]}]},{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"REmpty"}]}]}}},{"EDClass":{"edClassName":"Show","edClassTypeArguments":[["a",null]],"edClassMembers":[[{"Ident":"show"},{"annotation":[{"start":[12,11],"name":"/home/harry/code/purescript/tests/purs/docs/src/ChildDeclOrder.purs","end":[12,22]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[12,11],"name":"/home/harry/code/purescript/tests/purs/docs/src/ChildDeclOrder.purs","end":[12,22]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[12,13],"name":"/home/harry/code/purescript/tests/purs/docs/src/ChildDeclOrder.purs","end":[12,15]},[]],"tag":"TypeConstructor","contents":[["Prim"],"Function"]},{"annotation":[{"start":[12,11],"name":"/home/harry/code/purescript/tests/purs/docs/src/ChildDeclOrder.purs","end":[12,12]},[]],"tag":"TypeVar","contents":"a"}]},{"annotation":[{"start":[12,16],"name":"/home/harry/code/purescript/tests/purs/docs/src/ChildDeclOrder.purs","end":[12,22]},[]],"tag":"TypeConstructor","contents":[["Prim"],"String"]}]}]],"edClassConstraints":[],"edFunctionalDependencies":[],"edIsEmpty":false}},{"EDType":{"edTypeName":"Foo","edTypeKind":{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"FunKind","contents":[{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"NamedKind","contents":[["Prim"],"Type"]},{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"NamedKind","contents":[["Prim"],"Type"]}]},"edTypeDeclarationKind":"TypeSynonym"}},{"EDTypeSynonym":{"edTypeSynonymName":"Foo","edTypeSynonymArguments":[["a",null]],"edTypeSynonymType":{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeConstructor","contents":[["Prim"],"Record"]},{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"RCons","contents":["foo1",{"annotation":[{"start":[15,11],"name":"/home/harry/code/purescript/tests/purs/docs/src/ChildDeclOrder.purs","end":[15,12]},[]],"tag":"TypeVar","contents":"a"},{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"RCons","contents":["foo2",{"annotation":[{"start":[16,11],"name":"/home/harry/code/purescript/tests/purs/docs/src/ChildDeclOrder.purs","end":[16,12]},[]],"tag":"TypeVar","contents":"a"},{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"REmpty"}]}]}]}}},{"EDClass":{"edClassName":"Foo","edClassTypeArguments":[["a",null]],"edClassMembers":[[{"Ident":"foo1"},{"annotation":[{"start":[15,11],"name":"/home/harry/code/purescript/tests/purs/docs/src/ChildDeclOrder.purs","end":[15,12]},[]],"tag":"TypeVar","contents":"a"}],[{"Ident":"foo2"},{"annotation":[{"start":[16,11],"name":"/home/harry/code/purescript/tests/purs/docs/src/ChildDeclOrder.purs","end":[16,12]},[]],"tag":"TypeVar","contents":"a"}]],"edClassConstraints":[],"edFunctionalDependencies":[],"edIsEmpty":false}},{"EDInstance":{"edInstanceClassName":[["ChildDeclOrder"],"Show"],"edInstanceName":{"Ident":"showTwo"},"edInstanceTypes":[{"annotation":[{"start":[18,26],"name":"/home/harry/code/purescript/tests/purs/docs/src/ChildDeclOrder.purs","end":[18,29]},[]],"tag":"TypeConstructor","contents":[["ChildDeclOrder"],"Two"]}],"edInstanceConstraints":[],"edInstanceChain":[[["ChildDeclOrder"],{"Ident":"showTwo"}]],"edInstanceChainIndex":0}},{"EDInstance":{"edInstanceClassName":[["ChildDeclOrder"],"Foo"],"edInstanceName":{"Ident":"fooTwo"},"edInstanceTypes":[{"annotation":[{"start":[21,24],"name":"/home/harry/code/purescript/tests/purs/docs/src/ChildDeclOrder.purs","end":[21,27]},[]],"tag":"TypeConstructor","contents":[["ChildDeclOrder"],"Two"]}],"edInstanceConstraints":[],"edInstanceChain":[[["ChildDeclOrder"],{"Ident":"fooTwo"}]],"edInstanceChainIndex":0}},{"EDInstance":{"edInstanceClassName":[["ChildDeclOrder"],"Foo"],"edInstanceName":{"Ident":"fooInt"},"edInstanceTypes":[{"annotation":[{"start":[25,24],"name":"/home/harry/code/purescript/tests/purs/docs/src/ChildDeclOrder.purs","end":[25,27]},[]],"tag":"TypeConstructor","contents":[["Prim"],"Int"]}],"edInstanceConstraints":[],"edInstanceChain":[[["ChildDeclOrder"],{"Ident":"fooInt"}]],"edInstanceChainIndex":0}}],"efSourceSpan":{"start":[5,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/ChildDeclOrder.purs","end":[27,11]}} \ No newline at end of file
diff --git a/tests/purs/docs/output/Clash/externs.json b/tests/purs/docs/output/Clash/externs.json
index 281d038..8577758 100644
--- a/tests/purs/docs/output/Clash/externs.json
+++ b/tests/purs/docs/output/Clash/externs.json
@@ -1 +1 @@
-{"efVersion":"0.13.2","efModuleName":["Clash"],"efExports":[{"ReExportRef":[{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/Clash.purs","end":[4,24]},{"exportSourceImportedFrom":["Clash1"],"exportSourceDefinedIn":["Clash1a"]},{"TypeRef":[{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/Clash.purs","end":[4,24]},"Type",[]]}]},{"ReExportRef":[{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/Clash.purs","end":[4,24]},{"exportSourceImportedFrom":["Clash1"],"exportSourceDefinedIn":["Clash1a"]},{"TypeClassRef":[{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/Clash.purs","end":[4,24]},"TypeClass"]}]},{"ReExportRef":[{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/Clash.purs","end":[4,24]},{"exportSourceImportedFrom":["Clash1"],"exportSourceDefinedIn":["Clash1a"]},{"ValueRef":[{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/Clash.purs","end":[4,24]},{"Ident":"typeClassMember"}]}]},{"ReExportRef":[{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/Clash.purs","end":[4,24]},{"exportSourceImportedFrom":["Clash1"],"exportSourceDefinedIn":["Clash1a"]},{"ValueRef":[{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/Clash.purs","end":[4,24]},{"Ident":"value"}]}]},{"ModuleRef":[{"start":[1,15],"name":"/home/harry/code/purescript/tests/purs/docs/src/Clash.purs","end":[1,28]},["Clash1"]]}],"efImports":[{"eiModule":["Prim"],"eiImportType":{"Implicit":[]},"eiImportedAs":["Prim"]},{"eiModule":["Prim"],"eiImportType":{"Implicit":[]},"eiImportedAs":null},{"eiModule":["Clash1"],"eiImportType":{"Implicit":[]},"eiImportedAs":["Clash1"]},{"eiModule":["Clash2"],"eiImportType":{"Implicit":[]},"eiImportedAs":["Clash2"]}],"efFixities":[],"efTypeFixities":[],"efDeclarations":[],"efSourceSpan":{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/Clash.purs","end":[4,24]}} \ No newline at end of file
+{"efVersion":"0.13.3","efModuleName":["Clash"],"efExports":[{"ReExportRef":[{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/Clash.purs","end":[4,24]},{"exportSourceImportedFrom":["Clash1"],"exportSourceDefinedIn":["Clash1a"]},{"TypeRef":[{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/Clash.purs","end":[4,24]},"Type",[]]}]},{"ReExportRef":[{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/Clash.purs","end":[4,24]},{"exportSourceImportedFrom":["Clash1"],"exportSourceDefinedIn":["Clash1a"]},{"TypeClassRef":[{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/Clash.purs","end":[4,24]},"TypeClass"]}]},{"ReExportRef":[{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/Clash.purs","end":[4,24]},{"exportSourceImportedFrom":["Clash1"],"exportSourceDefinedIn":["Clash1a"]},{"ValueRef":[{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/Clash.purs","end":[4,24]},{"Ident":"typeClassMember"}]}]},{"ReExportRef":[{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/Clash.purs","end":[4,24]},{"exportSourceImportedFrom":["Clash1"],"exportSourceDefinedIn":["Clash1a"]},{"ValueRef":[{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/Clash.purs","end":[4,24]},{"Ident":"value"}]}]},{"ModuleRef":[{"start":[1,15],"name":"/home/harry/code/purescript/tests/purs/docs/src/Clash.purs","end":[1,28]},["Clash1"]]}],"efImports":[{"eiModule":["Prim"],"eiImportType":{"Implicit":[]},"eiImportedAs":["Prim"]},{"eiModule":["Prim"],"eiImportType":{"Implicit":[]},"eiImportedAs":null},{"eiModule":["Clash1"],"eiImportType":{"Implicit":[]},"eiImportedAs":["Clash1"]},{"eiModule":["Clash2"],"eiImportType":{"Implicit":[]},"eiImportedAs":["Clash2"]}],"efFixities":[],"efTypeFixities":[],"efDeclarations":[],"efSourceSpan":{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/Clash.purs","end":[4,24]}} \ No newline at end of file
diff --git a/tests/purs/docs/output/Clash1/externs.json b/tests/purs/docs/output/Clash1/externs.json
index 2002388..4881be8 100644
--- a/tests/purs/docs/output/Clash1/externs.json
+++ b/tests/purs/docs/output/Clash1/externs.json
@@ -1 +1 @@
-{"efVersion":"0.13.2","efModuleName":["Clash1"],"efExports":[{"ReExportRef":[{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/Clash1.purs","end":[3,15]},{"exportSourceImportedFrom":["Clash1a"],"exportSourceDefinedIn":["Clash1a"]},{"TypeRef":[{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/Clash1.purs","end":[3,15]},"Type",[]]}]},{"ReExportRef":[{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/Clash1.purs","end":[3,15]},{"exportSourceImportedFrom":["Clash1a"],"exportSourceDefinedIn":["Clash1a"]},{"TypeClassRef":[{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/Clash1.purs","end":[3,15]},"TypeClass"]}]},{"ReExportRef":[{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/Clash1.purs","end":[3,15]},{"exportSourceImportedFrom":["Clash1a"],"exportSourceDefinedIn":["Clash1a"]},{"ValueRef":[{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/Clash1.purs","end":[3,15]},{"Ident":"typeClassMember"}]}]},{"ReExportRef":[{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/Clash1.purs","end":[3,15]},{"exportSourceImportedFrom":["Clash1a"],"exportSourceDefinedIn":["Clash1a"]},{"ValueRef":[{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/Clash1.purs","end":[3,15]},{"Ident":"value"}]}]},{"ModuleRef":[{"start":[1,16],"name":"/home/harry/code/purescript/tests/purs/docs/src/Clash1.purs","end":[1,30]},["Clash1a"]]}],"efImports":[{"eiModule":["Prim"],"eiImportType":{"Implicit":[]},"eiImportedAs":["Prim"]},{"eiModule":["Prim"],"eiImportType":{"Implicit":[]},"eiImportedAs":null},{"eiModule":["Clash1a"],"eiImportType":{"Implicit":[]},"eiImportedAs":null}],"efFixities":[],"efTypeFixities":[],"efDeclarations":[],"efSourceSpan":{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/Clash1.purs","end":[3,15]}} \ No newline at end of file
+{"efVersion":"0.13.3","efModuleName":["Clash1"],"efExports":[{"ReExportRef":[{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/Clash1.purs","end":[3,15]},{"exportSourceImportedFrom":["Clash1a"],"exportSourceDefinedIn":["Clash1a"]},{"TypeRef":[{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/Clash1.purs","end":[3,15]},"Type",[]]}]},{"ReExportRef":[{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/Clash1.purs","end":[3,15]},{"exportSourceImportedFrom":["Clash1a"],"exportSourceDefinedIn":["Clash1a"]},{"TypeClassRef":[{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/Clash1.purs","end":[3,15]},"TypeClass"]}]},{"ReExportRef":[{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/Clash1.purs","end":[3,15]},{"exportSourceImportedFrom":["Clash1a"],"exportSourceDefinedIn":["Clash1a"]},{"ValueRef":[{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/Clash1.purs","end":[3,15]},{"Ident":"typeClassMember"}]}]},{"ReExportRef":[{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/Clash1.purs","end":[3,15]},{"exportSourceImportedFrom":["Clash1a"],"exportSourceDefinedIn":["Clash1a"]},{"ValueRef":[{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/Clash1.purs","end":[3,15]},{"Ident":"value"}]}]},{"ModuleRef":[{"start":[1,16],"name":"/home/harry/code/purescript/tests/purs/docs/src/Clash1.purs","end":[1,30]},["Clash1a"]]}],"efImports":[{"eiModule":["Prim"],"eiImportType":{"Implicit":[]},"eiImportedAs":["Prim"]},{"eiModule":["Prim"],"eiImportType":{"Implicit":[]},"eiImportedAs":null},{"eiModule":["Clash1a"],"eiImportType":{"Implicit":[]},"eiImportedAs":null}],"efFixities":[],"efTypeFixities":[],"efDeclarations":[],"efSourceSpan":{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/Clash1.purs","end":[3,15]}} \ No newline at end of file
diff --git a/tests/purs/docs/output/Clash1a/externs.json b/tests/purs/docs/output/Clash1a/externs.json
index af196ce..5b01b43 100644
--- a/tests/purs/docs/output/Clash1a/externs.json
+++ b/tests/purs/docs/output/Clash1a/externs.json
@@ -1 +1 @@
-{"efVersion":"0.13.2","efModuleName":["Clash1a"],"efExports":[{"ValueRef":[{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/Clash1a.purs","end":[9,23]},{"Ident":"typeClassMember"}]},{"ValueRef":[{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/Clash1a.purs","end":[9,23]},{"Ident":"value"}]},{"TypeRef":[{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/Clash1a.purs","end":[9,23]},"Type",[]]},{"TypeClassRef":[{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/Clash1a.purs","end":[9,23]},"TypeClass"]}],"efImports":[{"eiModule":["Prim"],"eiImportType":{"Implicit":[]},"eiImportedAs":["Prim"]},{"eiModule":["Prim"],"eiImportType":{"Implicit":[]},"eiImportedAs":null}],"efFixities":[],"efTypeFixities":[],"efDeclarations":[{"EDValue":{"edValueName":{"Ident":"typeClassMember"},"edValueType":{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"ForAll","contents":["a",{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"ConstrainedType","contents":[{"constraintAnn":[{"start":[0,0],"name":"","end":[0,0]},[]],"constraintClass":[["Clash1a"],"TypeClass"],"constraintArgs":[{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeVar","contents":"a"}],"constraintData":null},{"annotation":[{"start":[9,22],"name":"/home/harry/code/purescript/tests/purs/docs/src/Clash1a.purs","end":[9,23]},[]],"tag":"TypeVar","contents":"a"}]},0]}}},{"EDValue":{"edValueName":{"Ident":"value"},"edValueType":{"annotation":[{"start":[3,10],"name":"/home/harry/code/purescript/tests/purs/docs/src/Clash1a.purs","end":[3,13]},[]],"tag":"TypeConstructor","contents":[["Prim"],"Int"]}}},{"EDType":{"edTypeName":"Type","edTypeKind":{"annotation":[{"start":[6,13],"name":"/home/harry/code/purescript/tests/purs/docs/src/Clash1a.purs","end":[6,16]},[]],"tag":"NamedKind","contents":[["Prim"],"Type"]},"edTypeDeclarationKind":"TypeSynonym"}},{"EDTypeSynonym":{"edTypeSynonymName":"Type","edTypeSynonymArguments":[],"edTypeSynonymType":{"annotation":[{"start":[6,13],"name":"/home/harry/code/purescript/tests/purs/docs/src/Clash1a.purs","end":[6,16]},[]],"tag":"TypeConstructor","contents":[["Prim"],"Int"]}}},{"EDType":{"edTypeName":"TypeClass","edTypeKind":{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"FunKind","contents":[{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"NamedKind","contents":[["Prim"],"Type"]},{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"NamedKind","contents":[["Prim"],"Type"]}]},"edTypeDeclarationKind":"TypeSynonym"}},{"EDTypeSynonym":{"edTypeSynonymName":"TypeClass","edTypeSynonymArguments":[["a",null]],"edTypeSynonymType":{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeConstructor","contents":[["Prim"],"Record"]},{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"RCons","contents":["typeClassMember",{"annotation":[{"start":[9,22],"name":"/home/harry/code/purescript/tests/purs/docs/src/Clash1a.purs","end":[9,23]},[]],"tag":"TypeVar","contents":"a"},{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"REmpty"}]}]}}},{"EDClass":{"edClassName":"TypeClass","edClassTypeArguments":[["a",null]],"edClassMembers":[[{"Ident":"typeClassMember"},{"annotation":[{"start":[9,22],"name":"/home/harry/code/purescript/tests/purs/docs/src/Clash1a.purs","end":[9,23]},[]],"tag":"TypeVar","contents":"a"}]],"edClassConstraints":[],"edFunctionalDependencies":[],"edIsEmpty":false}}],"efSourceSpan":{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/Clash1a.purs","end":[9,23]}} \ No newline at end of file
+{"efVersion":"0.13.3","efModuleName":["Clash1a"],"efExports":[{"ValueRef":[{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/Clash1a.purs","end":[9,23]},{"Ident":"typeClassMember"}]},{"ValueRef":[{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/Clash1a.purs","end":[9,23]},{"Ident":"value"}]},{"TypeRef":[{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/Clash1a.purs","end":[9,23]},"Type",[]]},{"TypeClassRef":[{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/Clash1a.purs","end":[9,23]},"TypeClass"]}],"efImports":[{"eiModule":["Prim"],"eiImportType":{"Implicit":[]},"eiImportedAs":["Prim"]},{"eiModule":["Prim"],"eiImportType":{"Implicit":[]},"eiImportedAs":null}],"efFixities":[],"efTypeFixities":[],"efDeclarations":[{"EDValue":{"edValueName":{"Ident":"typeClassMember"},"edValueType":{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"ForAll","contents":["a",{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"ConstrainedType","contents":[{"constraintAnn":[{"start":[0,0],"name":"","end":[0,0]},[]],"constraintClass":[["Clash1a"],"TypeClass"],"constraintArgs":[{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeVar","contents":"a"}],"constraintData":null},{"annotation":[{"start":[9,22],"name":"/home/harry/code/purescript/tests/purs/docs/src/Clash1a.purs","end":[9,23]},[]],"tag":"TypeVar","contents":"a"}]},0]}}},{"EDValue":{"edValueName":{"Ident":"value"},"edValueType":{"annotation":[{"start":[3,10],"name":"/home/harry/code/purescript/tests/purs/docs/src/Clash1a.purs","end":[3,13]},[]],"tag":"TypeConstructor","contents":[["Prim"],"Int"]}}},{"EDType":{"edTypeName":"Type","edTypeKind":{"annotation":[{"start":[6,13],"name":"/home/harry/code/purescript/tests/purs/docs/src/Clash1a.purs","end":[6,16]},[]],"tag":"NamedKind","contents":[["Prim"],"Type"]},"edTypeDeclarationKind":"TypeSynonym"}},{"EDTypeSynonym":{"edTypeSynonymName":"Type","edTypeSynonymArguments":[],"edTypeSynonymType":{"annotation":[{"start":[6,13],"name":"/home/harry/code/purescript/tests/purs/docs/src/Clash1a.purs","end":[6,16]},[]],"tag":"TypeConstructor","contents":[["Prim"],"Int"]}}},{"EDType":{"edTypeName":"TypeClass","edTypeKind":{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"FunKind","contents":[{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"NamedKind","contents":[["Prim"],"Type"]},{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"NamedKind","contents":[["Prim"],"Type"]}]},"edTypeDeclarationKind":"TypeSynonym"}},{"EDTypeSynonym":{"edTypeSynonymName":"TypeClass","edTypeSynonymArguments":[["a",null]],"edTypeSynonymType":{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeConstructor","contents":[["Prim"],"Record"]},{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"RCons","contents":["typeClassMember",{"annotation":[{"start":[9,22],"name":"/home/harry/code/purescript/tests/purs/docs/src/Clash1a.purs","end":[9,23]},[]],"tag":"TypeVar","contents":"a"},{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"REmpty"}]}]}}},{"EDClass":{"edClassName":"TypeClass","edClassTypeArguments":[["a",null]],"edClassMembers":[[{"Ident":"typeClassMember"},{"annotation":[{"start":[9,22],"name":"/home/harry/code/purescript/tests/purs/docs/src/Clash1a.purs","end":[9,23]},[]],"tag":"TypeVar","contents":"a"}]],"edClassConstraints":[],"edFunctionalDependencies":[],"edIsEmpty":false}}],"efSourceSpan":{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/Clash1a.purs","end":[9,23]}} \ No newline at end of file
diff --git a/tests/purs/docs/output/Clash2/externs.json b/tests/purs/docs/output/Clash2/externs.json
index 1f08994..fe7088a 100644
--- a/tests/purs/docs/output/Clash2/externs.json
+++ b/tests/purs/docs/output/Clash2/externs.json
@@ -1 +1 @@
-{"efVersion":"0.13.2","efModuleName":["Clash2"],"efExports":[{"ReExportRef":[{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/Clash2.purs","end":[3,15]},{"exportSourceImportedFrom":["Clash2a"],"exportSourceDefinedIn":["Clash2a"]},{"TypeRef":[{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/Clash2.purs","end":[3,15]},"Type",[]]}]},{"ReExportRef":[{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/Clash2.purs","end":[3,15]},{"exportSourceImportedFrom":["Clash2a"],"exportSourceDefinedIn":["Clash2a"]},{"TypeClassRef":[{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/Clash2.purs","end":[3,15]},"TypeClass"]}]},{"ReExportRef":[{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/Clash2.purs","end":[3,15]},{"exportSourceImportedFrom":["Clash2a"],"exportSourceDefinedIn":["Clash2a"]},{"ValueRef":[{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/Clash2.purs","end":[3,15]},{"Ident":"typeClassMember"}]}]},{"ReExportRef":[{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/Clash2.purs","end":[3,15]},{"exportSourceImportedFrom":["Clash2a"],"exportSourceDefinedIn":["Clash2a"]},{"ValueRef":[{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/Clash2.purs","end":[3,15]},{"Ident":"value"}]}]},{"ModuleRef":[{"start":[1,16],"name":"/home/harry/code/purescript/tests/purs/docs/src/Clash2.purs","end":[1,30]},["Clash2a"]]}],"efImports":[{"eiModule":["Prim"],"eiImportType":{"Implicit":[]},"eiImportedAs":["Prim"]},{"eiModule":["Prim"],"eiImportType":{"Implicit":[]},"eiImportedAs":null},{"eiModule":["Clash2a"],"eiImportType":{"Implicit":[]},"eiImportedAs":null}],"efFixities":[],"efTypeFixities":[],"efDeclarations":[],"efSourceSpan":{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/Clash2.purs","end":[3,15]}} \ No newline at end of file
+{"efVersion":"0.13.3","efModuleName":["Clash2"],"efExports":[{"ReExportRef":[{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/Clash2.purs","end":[3,15]},{"exportSourceImportedFrom":["Clash2a"],"exportSourceDefinedIn":["Clash2a"]},{"TypeRef":[{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/Clash2.purs","end":[3,15]},"Type",[]]}]},{"ReExportRef":[{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/Clash2.purs","end":[3,15]},{"exportSourceImportedFrom":["Clash2a"],"exportSourceDefinedIn":["Clash2a"]},{"TypeClassRef":[{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/Clash2.purs","end":[3,15]},"TypeClass"]}]},{"ReExportRef":[{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/Clash2.purs","end":[3,15]},{"exportSourceImportedFrom":["Clash2a"],"exportSourceDefinedIn":["Clash2a"]},{"ValueRef":[{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/Clash2.purs","end":[3,15]},{"Ident":"typeClassMember"}]}]},{"ReExportRef":[{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/Clash2.purs","end":[3,15]},{"exportSourceImportedFrom":["Clash2a"],"exportSourceDefinedIn":["Clash2a"]},{"ValueRef":[{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/Clash2.purs","end":[3,15]},{"Ident":"value"}]}]},{"ModuleRef":[{"start":[1,16],"name":"/home/harry/code/purescript/tests/purs/docs/src/Clash2.purs","end":[1,30]},["Clash2a"]]}],"efImports":[{"eiModule":["Prim"],"eiImportType":{"Implicit":[]},"eiImportedAs":["Prim"]},{"eiModule":["Prim"],"eiImportType":{"Implicit":[]},"eiImportedAs":null},{"eiModule":["Clash2a"],"eiImportType":{"Implicit":[]},"eiImportedAs":null}],"efFixities":[],"efTypeFixities":[],"efDeclarations":[],"efSourceSpan":{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/Clash2.purs","end":[3,15]}} \ No newline at end of file
diff --git a/tests/purs/docs/output/Clash2a/externs.json b/tests/purs/docs/output/Clash2a/externs.json
index 2af705f..b8cf69d 100644
--- a/tests/purs/docs/output/Clash2a/externs.json
+++ b/tests/purs/docs/output/Clash2a/externs.json
@@ -1 +1 @@
-{"efVersion":"0.13.2","efModuleName":["Clash2a"],"efExports":[{"ValueRef":[{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/Clash2a.purs","end":[9,28]},{"Ident":"typeClassMember"}]},{"ValueRef":[{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/Clash2a.purs","end":[9,28]},{"Ident":"value"}]},{"TypeRef":[{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/Clash2a.purs","end":[9,28]},"Type",[]]},{"TypeClassRef":[{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/Clash2a.purs","end":[9,28]},"TypeClass"]}],"efImports":[{"eiModule":["Prim"],"eiImportType":{"Implicit":[]},"eiImportedAs":["Prim"]},{"eiModule":["Prim"],"eiImportType":{"Implicit":[]},"eiImportedAs":null}],"efFixities":[],"efTypeFixities":[],"efDeclarations":[{"EDValue":{"edValueName":{"Ident":"typeClassMember"},"edValueType":{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"ForAll","contents":["a",{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"ForAll","contents":["b",{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"ConstrainedType","contents":[{"constraintAnn":[{"start":[0,0],"name":"","end":[0,0]},[]],"constraintClass":[["Clash2a"],"TypeClass"],"constraintArgs":[{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeVar","contents":"a"},{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeVar","contents":"b"}],"constraintData":null},{"annotation":[{"start":[9,22],"name":"/home/harry/code/purescript/tests/purs/docs/src/Clash2a.purs","end":[9,28]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[9,22],"name":"/home/harry/code/purescript/tests/purs/docs/src/Clash2a.purs","end":[9,28]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[9,24],"name":"/home/harry/code/purescript/tests/purs/docs/src/Clash2a.purs","end":[9,26]},[]],"tag":"TypeConstructor","contents":[["Prim"],"Function"]},{"annotation":[{"start":[9,22],"name":"/home/harry/code/purescript/tests/purs/docs/src/Clash2a.purs","end":[9,23]},[]],"tag":"TypeVar","contents":"a"}]},{"annotation":[{"start":[9,27],"name":"/home/harry/code/purescript/tests/purs/docs/src/Clash2a.purs","end":[9,28]},[]],"tag":"TypeVar","contents":"b"}]}]},0]},1]}}},{"EDValue":{"edValueName":{"Ident":"value"},"edValueType":{"annotation":[{"start":[3,10],"name":"/home/harry/code/purescript/tests/purs/docs/src/Clash2a.purs","end":[3,16]},[]],"tag":"TypeConstructor","contents":[["Prim"],"String"]}}},{"EDType":{"edTypeName":"Type","edTypeKind":{"annotation":[{"start":[6,13],"name":"/home/harry/code/purescript/tests/purs/docs/src/Clash2a.purs","end":[6,19]},[]],"tag":"NamedKind","contents":[["Prim"],"Type"]},"edTypeDeclarationKind":"TypeSynonym"}},{"EDTypeSynonym":{"edTypeSynonymName":"Type","edTypeSynonymArguments":[],"edTypeSynonymType":{"annotation":[{"start":[6,13],"name":"/home/harry/code/purescript/tests/purs/docs/src/Clash2a.purs","end":[6,19]},[]],"tag":"TypeConstructor","contents":[["Prim"],"String"]}}},{"EDType":{"edTypeName":"TypeClass","edTypeKind":{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"FunKind","contents":[{"annotation":[{"start":[9,24],"name":"/home/harry/code/purescript/tests/purs/docs/src/Clash2a.purs","end":[9,26]},[]],"tag":"NamedKind","contents":[["Prim"],"Type"]},{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"FunKind","contents":[{"annotation":[{"start":[9,24],"name":"/home/harry/code/purescript/tests/purs/docs/src/Clash2a.purs","end":[9,26]},[]],"tag":"NamedKind","contents":[["Prim"],"Type"]},{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"NamedKind","contents":[["Prim"],"Type"]}]}]},"edTypeDeclarationKind":"TypeSynonym"}},{"EDTypeSynonym":{"edTypeSynonymName":"TypeClass","edTypeSynonymArguments":[["a",null],["b",null]],"edTypeSynonymType":{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeConstructor","contents":[["Prim"],"Record"]},{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"RCons","contents":["typeClassMember",{"annotation":[{"start":[9,22],"name":"/home/harry/code/purescript/tests/purs/docs/src/Clash2a.purs","end":[9,28]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[9,22],"name":"/home/harry/code/purescript/tests/purs/docs/src/Clash2a.purs","end":[9,28]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[9,24],"name":"/home/harry/code/purescript/tests/purs/docs/src/Clash2a.purs","end":[9,26]},[]],"tag":"TypeConstructor","contents":[["Prim"],"Function"]},{"annotation":[{"start":[9,22],"name":"/home/harry/code/purescript/tests/purs/docs/src/Clash2a.purs","end":[9,23]},[]],"tag":"TypeVar","contents":"a"}]},{"annotation":[{"start":[9,27],"name":"/home/harry/code/purescript/tests/purs/docs/src/Clash2a.purs","end":[9,28]},[]],"tag":"TypeVar","contents":"b"}]},{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"REmpty"}]}]}}},{"EDClass":{"edClassName":"TypeClass","edClassTypeArguments":[["a",null],["b",null]],"edClassMembers":[[{"Ident":"typeClassMember"},{"annotation":[{"start":[9,22],"name":"/home/harry/code/purescript/tests/purs/docs/src/Clash2a.purs","end":[9,28]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[9,22],"name":"/home/harry/code/purescript/tests/purs/docs/src/Clash2a.purs","end":[9,28]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[9,24],"name":"/home/harry/code/purescript/tests/purs/docs/src/Clash2a.purs","end":[9,26]},[]],"tag":"TypeConstructor","contents":[["Prim"],"Function"]},{"annotation":[{"start":[9,22],"name":"/home/harry/code/purescript/tests/purs/docs/src/Clash2a.purs","end":[9,23]},[]],"tag":"TypeVar","contents":"a"}]},{"annotation":[{"start":[9,27],"name":"/home/harry/code/purescript/tests/purs/docs/src/Clash2a.purs","end":[9,28]},[]],"tag":"TypeVar","contents":"b"}]}]],"edClassConstraints":[],"edFunctionalDependencies":[],"edIsEmpty":false}}],"efSourceSpan":{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/Clash2a.purs","end":[9,28]}} \ No newline at end of file
+{"efVersion":"0.13.3","efModuleName":["Clash2a"],"efExports":[{"ValueRef":[{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/Clash2a.purs","end":[9,28]},{"Ident":"typeClassMember"}]},{"ValueRef":[{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/Clash2a.purs","end":[9,28]},{"Ident":"value"}]},{"TypeRef":[{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/Clash2a.purs","end":[9,28]},"Type",[]]},{"TypeClassRef":[{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/Clash2a.purs","end":[9,28]},"TypeClass"]}],"efImports":[{"eiModule":["Prim"],"eiImportType":{"Implicit":[]},"eiImportedAs":["Prim"]},{"eiModule":["Prim"],"eiImportType":{"Implicit":[]},"eiImportedAs":null}],"efFixities":[],"efTypeFixities":[],"efDeclarations":[{"EDValue":{"edValueName":{"Ident":"typeClassMember"},"edValueType":{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"ForAll","contents":["a",{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"ForAll","contents":["b",{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"ConstrainedType","contents":[{"constraintAnn":[{"start":[0,0],"name":"","end":[0,0]},[]],"constraintClass":[["Clash2a"],"TypeClass"],"constraintArgs":[{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeVar","contents":"a"},{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeVar","contents":"b"}],"constraintData":null},{"annotation":[{"start":[9,22],"name":"/home/harry/code/purescript/tests/purs/docs/src/Clash2a.purs","end":[9,28]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[9,22],"name":"/home/harry/code/purescript/tests/purs/docs/src/Clash2a.purs","end":[9,28]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[9,24],"name":"/home/harry/code/purescript/tests/purs/docs/src/Clash2a.purs","end":[9,26]},[]],"tag":"TypeConstructor","contents":[["Prim"],"Function"]},{"annotation":[{"start":[9,22],"name":"/home/harry/code/purescript/tests/purs/docs/src/Clash2a.purs","end":[9,23]},[]],"tag":"TypeVar","contents":"a"}]},{"annotation":[{"start":[9,27],"name":"/home/harry/code/purescript/tests/purs/docs/src/Clash2a.purs","end":[9,28]},[]],"tag":"TypeVar","contents":"b"}]}]},0]},1]}}},{"EDValue":{"edValueName":{"Ident":"value"},"edValueType":{"annotation":[{"start":[3,10],"name":"/home/harry/code/purescript/tests/purs/docs/src/Clash2a.purs","end":[3,16]},[]],"tag":"TypeConstructor","contents":[["Prim"],"String"]}}},{"EDType":{"edTypeName":"Type","edTypeKind":{"annotation":[{"start":[6,13],"name":"/home/harry/code/purescript/tests/purs/docs/src/Clash2a.purs","end":[6,19]},[]],"tag":"NamedKind","contents":[["Prim"],"Type"]},"edTypeDeclarationKind":"TypeSynonym"}},{"EDTypeSynonym":{"edTypeSynonymName":"Type","edTypeSynonymArguments":[],"edTypeSynonymType":{"annotation":[{"start":[6,13],"name":"/home/harry/code/purescript/tests/purs/docs/src/Clash2a.purs","end":[6,19]},[]],"tag":"TypeConstructor","contents":[["Prim"],"String"]}}},{"EDType":{"edTypeName":"TypeClass","edTypeKind":{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"FunKind","contents":[{"annotation":[{"start":[9,24],"name":"/home/harry/code/purescript/tests/purs/docs/src/Clash2a.purs","end":[9,26]},[]],"tag":"NamedKind","contents":[["Prim"],"Type"]},{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"FunKind","contents":[{"annotation":[{"start":[9,24],"name":"/home/harry/code/purescript/tests/purs/docs/src/Clash2a.purs","end":[9,26]},[]],"tag":"NamedKind","contents":[["Prim"],"Type"]},{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"NamedKind","contents":[["Prim"],"Type"]}]}]},"edTypeDeclarationKind":"TypeSynonym"}},{"EDTypeSynonym":{"edTypeSynonymName":"TypeClass","edTypeSynonymArguments":[["a",null],["b",null]],"edTypeSynonymType":{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeConstructor","contents":[["Prim"],"Record"]},{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"RCons","contents":["typeClassMember",{"annotation":[{"start":[9,22],"name":"/home/harry/code/purescript/tests/purs/docs/src/Clash2a.purs","end":[9,28]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[9,22],"name":"/home/harry/code/purescript/tests/purs/docs/src/Clash2a.purs","end":[9,28]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[9,24],"name":"/home/harry/code/purescript/tests/purs/docs/src/Clash2a.purs","end":[9,26]},[]],"tag":"TypeConstructor","contents":[["Prim"],"Function"]},{"annotation":[{"start":[9,22],"name":"/home/harry/code/purescript/tests/purs/docs/src/Clash2a.purs","end":[9,23]},[]],"tag":"TypeVar","contents":"a"}]},{"annotation":[{"start":[9,27],"name":"/home/harry/code/purescript/tests/purs/docs/src/Clash2a.purs","end":[9,28]},[]],"tag":"TypeVar","contents":"b"}]},{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"REmpty"}]}]}}},{"EDClass":{"edClassName":"TypeClass","edClassTypeArguments":[["a",null],["b",null]],"edClassMembers":[[{"Ident":"typeClassMember"},{"annotation":[{"start":[9,22],"name":"/home/harry/code/purescript/tests/purs/docs/src/Clash2a.purs","end":[9,28]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[9,22],"name":"/home/harry/code/purescript/tests/purs/docs/src/Clash2a.purs","end":[9,28]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[9,24],"name":"/home/harry/code/purescript/tests/purs/docs/src/Clash2a.purs","end":[9,26]},[]],"tag":"TypeConstructor","contents":[["Prim"],"Function"]},{"annotation":[{"start":[9,22],"name":"/home/harry/code/purescript/tests/purs/docs/src/Clash2a.purs","end":[9,23]},[]],"tag":"TypeVar","contents":"a"}]},{"annotation":[{"start":[9,27],"name":"/home/harry/code/purescript/tests/purs/docs/src/Clash2a.purs","end":[9,28]},[]],"tag":"TypeVar","contents":"b"}]}]],"edClassConstraints":[],"edFunctionalDependencies":[],"edIsEmpty":false}}],"efSourceSpan":{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/Clash2a.purs","end":[9,28]}} \ No newline at end of file
diff --git a/tests/purs/docs/output/ConstrainedArgument/externs.json b/tests/purs/docs/output/ConstrainedArgument/externs.json
index 5a880b3..3907e24 100644
--- a/tests/purs/docs/output/ConstrainedArgument/externs.json
+++ b/tests/purs/docs/output/ConstrainedArgument/externs.json
@@ -1 +1 @@
-{"efVersion":"0.13.2","efModuleName":["ConstrainedArgument"],"efExports":[{"TypeClassRef":[{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/ConstrainedArgument.purs","end":[8,63]},"Foo"]},{"TypeRef":[{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/ConstrainedArgument.purs","end":[8,63]},"WithoutArgs",[]]},{"TypeRef":[{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/ConstrainedArgument.purs","end":[8,63]},"WithArgs",[]]},{"TypeRef":[{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/ConstrainedArgument.purs","end":[8,63]},"MultiWithoutArgs",[]]},{"TypeRef":[{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/ConstrainedArgument.purs","end":[8,63]},"MultiWithArgs",[]]}],"efImports":[{"eiModule":["Prim"],"eiImportType":{"Implicit":[]},"eiImportedAs":["Prim"]},{"eiModule":["Prim"],"eiImportType":{"Implicit":[]},"eiImportedAs":null}],"efFixities":[],"efTypeFixities":[],"efDeclarations":[{"EDType":{"edTypeName":"Foo","edTypeKind":{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"FunKind","contents":[{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"NamedKind","contents":[["Prim"],"Type"]},{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"NamedKind","contents":[["Prim"],"Type"]}]},"edTypeDeclarationKind":"TypeSynonym"}},{"EDTypeSynonym":{"edTypeSynonymName":"Foo","edTypeSynonymArguments":[["t",null]],"edTypeSynonymType":{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeConstructor","contents":[["Prim"],"Record"]},{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"REmpty"}]}}},{"EDClass":{"edClassName":"Foo","edClassTypeArguments":[["t",null]],"edClassMembers":[],"edClassConstraints":[],"edFunctionalDependencies":[],"edIsEmpty":true}},{"EDType":{"edTypeName":"WithoutArgs","edTypeKind":{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"NamedKind","contents":[["Prim"],"Type"]},"edTypeDeclarationKind":"TypeSynonym"}},{"EDTypeSynonym":{"edTypeSynonymName":"WithoutArgs","edTypeSynonymArguments":[],"edTypeSynonymType":{"annotation":[{"start":[5,25],"name":"/home/harry/code/purescript/tests/purs/docs/src/ConstrainedArgument.purs","end":[5,54]},[]],"tag":"ForAll","contents":["a",{"annotation":[{"start":[5,35],"name":"/home/harry/code/purescript/tests/purs/docs/src/ConstrainedArgument.purs","end":[5,54]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[5,35],"name":"/home/harry/code/purescript/tests/purs/docs/src/ConstrainedArgument.purs","end":[5,54]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[5,50],"name":"/home/harry/code/purescript/tests/purs/docs/src/ConstrainedArgument.purs","end":[5,52]},[]],"tag":"TypeConstructor","contents":[["Prim"],"Function"]},{"annotation":[{"start":[5,36],"name":"/home/harry/code/purescript/tests/purs/docs/src/ConstrainedArgument.purs","end":[5,48]},[]],"tag":"ConstrainedType","contents":[{"constraintAnn":[{"start":[5,36],"name":"/home/harry/code/purescript/tests/purs/docs/src/ConstrainedArgument.purs","end":[5,43]},[]],"constraintClass":[["Prim"],"Partial"],"constraintArgs":[],"constraintData":null},{"annotation":[{"start":[5,47],"name":"/home/harry/code/purescript/tests/purs/docs/src/ConstrainedArgument.purs","end":[5,48]},[]],"tag":"TypeVar","contents":"a"}]}]},{"annotation":[{"start":[5,53],"name":"/home/harry/code/purescript/tests/purs/docs/src/ConstrainedArgument.purs","end":[5,54]},[]],"tag":"TypeVar","contents":"a"}]},null]}}},{"EDType":{"edTypeName":"WithArgs","edTypeKind":{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"NamedKind","contents":[["Prim"],"Type"]},"edTypeDeclarationKind":"TypeSynonym"}},{"EDTypeSynonym":{"edTypeSynonymName":"WithArgs","edTypeSynonymArguments":[],"edTypeSynonymType":{"annotation":[{"start":[6,25],"name":"/home/harry/code/purescript/tests/purs/docs/src/ConstrainedArgument.purs","end":[6,52]},[]],"tag":"ForAll","contents":["a",{"annotation":[{"start":[6,35],"name":"/home/harry/code/purescript/tests/purs/docs/src/ConstrainedArgument.purs","end":[6,52]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[6,35],"name":"/home/harry/code/purescript/tests/purs/docs/src/ConstrainedArgument.purs","end":[6,52]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[6,48],"name":"/home/harry/code/purescript/tests/purs/docs/src/ConstrainedArgument.purs","end":[6,50]},[]],"tag":"TypeConstructor","contents":[["Prim"],"Function"]},{"annotation":[{"start":[6,36],"name":"/home/harry/code/purescript/tests/purs/docs/src/ConstrainedArgument.purs","end":[6,46]},[]],"tag":"ConstrainedType","contents":[{"constraintAnn":[{"start":[6,36],"name":"/home/harry/code/purescript/tests/purs/docs/src/ConstrainedArgument.purs","end":[6,41]},[]],"constraintClass":[["ConstrainedArgument"],"Foo"],"constraintArgs":[{"annotation":[{"start":[6,40],"name":"/home/harry/code/purescript/tests/purs/docs/src/ConstrainedArgument.purs","end":[6,41]},[]],"tag":"TypeVar","contents":"a"}],"constraintData":null},{"annotation":[{"start":[6,45],"name":"/home/harry/code/purescript/tests/purs/docs/src/ConstrainedArgument.purs","end":[6,46]},[]],"tag":"TypeVar","contents":"a"}]}]},{"annotation":[{"start":[6,51],"name":"/home/harry/code/purescript/tests/purs/docs/src/ConstrainedArgument.purs","end":[6,52]},[]],"tag":"TypeVar","contents":"a"}]},null]}}},{"EDType":{"edTypeName":"MultiWithoutArgs","edTypeKind":{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"NamedKind","contents":[["Prim"],"Type"]},"edTypeDeclarationKind":"TypeSynonym"}},{"EDTypeSynonym":{"edTypeSynonymName":"MultiWithoutArgs","edTypeSynonymArguments":[],"edTypeSynonymType":{"annotation":[{"start":[7,25],"name":"/home/harry/code/purescript/tests/purs/docs/src/ConstrainedArgument.purs","end":[7,65]},[]],"tag":"ForAll","contents":["a",{"annotation":[{"start":[7,35],"name":"/home/harry/code/purescript/tests/purs/docs/src/ConstrainedArgument.purs","end":[7,65]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[7,35],"name":"/home/harry/code/purescript/tests/purs/docs/src/ConstrainedArgument.purs","end":[7,65]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[7,61],"name":"/home/harry/code/purescript/tests/purs/docs/src/ConstrainedArgument.purs","end":[7,63]},[]],"tag":"TypeConstructor","contents":[["Prim"],"Function"]},{"annotation":[{"start":[7,36],"name":"/home/harry/code/purescript/tests/purs/docs/src/ConstrainedArgument.purs","end":[7,59]},[]],"tag":"ConstrainedType","contents":[{"constraintAnn":[{"start":[7,36],"name":"/home/harry/code/purescript/tests/purs/docs/src/ConstrainedArgument.purs","end":[7,43]},[]],"constraintClass":[["Prim"],"Partial"],"constraintArgs":[],"constraintData":null},{"annotation":[{"start":[7,47],"name":"/home/harry/code/purescript/tests/purs/docs/src/ConstrainedArgument.purs","end":[7,59]},[]],"tag":"ConstrainedType","contents":[{"constraintAnn":[{"start":[7,47],"name":"/home/harry/code/purescript/tests/purs/docs/src/ConstrainedArgument.purs","end":[7,54]},[]],"constraintClass":[["Prim"],"Partial"],"constraintArgs":[],"constraintData":null},{"annotation":[{"start":[7,58],"name":"/home/harry/code/purescript/tests/purs/docs/src/ConstrainedArgument.purs","end":[7,59]},[]],"tag":"TypeVar","contents":"a"}]}]}]},{"annotation":[{"start":[7,64],"name":"/home/harry/code/purescript/tests/purs/docs/src/ConstrainedArgument.purs","end":[7,65]},[]],"tag":"TypeVar","contents":"a"}]},null]}}},{"EDType":{"edTypeName":"MultiWithArgs","edTypeKind":{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"NamedKind","contents":[["Prim"],"Type"]},"edTypeDeclarationKind":"TypeSynonym"}},{"EDTypeSynonym":{"edTypeSynonymName":"MultiWithArgs","edTypeSynonymArguments":[],"edTypeSynonymType":{"annotation":[{"start":[8,25],"name":"/home/harry/code/purescript/tests/purs/docs/src/ConstrainedArgument.purs","end":[8,63]},[]],"tag":"ForAll","contents":["b",{"annotation":[{"start":[8,32],"name":"/home/harry/code/purescript/tests/purs/docs/src/ConstrainedArgument.purs","end":[8,63]},[]],"tag":"ForAll","contents":["a",{"annotation":[{"start":[8,37],"name":"/home/harry/code/purescript/tests/purs/docs/src/ConstrainedArgument.purs","end":[8,63]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[8,37],"name":"/home/harry/code/purescript/tests/purs/docs/src/ConstrainedArgument.purs","end":[8,63]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[8,59],"name":"/home/harry/code/purescript/tests/purs/docs/src/ConstrainedArgument.purs","end":[8,61]},[]],"tag":"TypeConstructor","contents":[["Prim"],"Function"]},{"annotation":[{"start":[8,38],"name":"/home/harry/code/purescript/tests/purs/docs/src/ConstrainedArgument.purs","end":[8,57]},[]],"tag":"ConstrainedType","contents":[{"constraintAnn":[{"start":[8,38],"name":"/home/harry/code/purescript/tests/purs/docs/src/ConstrainedArgument.purs","end":[8,43]},[]],"constraintClass":[["ConstrainedArgument"],"Foo"],"constraintArgs":[{"annotation":[{"start":[8,42],"name":"/home/harry/code/purescript/tests/purs/docs/src/ConstrainedArgument.purs","end":[8,43]},[]],"tag":"TypeVar","contents":"a"}],"constraintData":null},{"annotation":[{"start":[8,47],"name":"/home/harry/code/purescript/tests/purs/docs/src/ConstrainedArgument.purs","end":[8,57]},[]],"tag":"ConstrainedType","contents":[{"constraintAnn":[{"start":[8,47],"name":"/home/harry/code/purescript/tests/purs/docs/src/ConstrainedArgument.purs","end":[8,52]},[]],"constraintClass":[["ConstrainedArgument"],"Foo"],"constraintArgs":[{"annotation":[{"start":[8,51],"name":"/home/harry/code/purescript/tests/purs/docs/src/ConstrainedArgument.purs","end":[8,52]},[]],"tag":"TypeVar","contents":"b"}],"constraintData":null},{"annotation":[{"start":[8,56],"name":"/home/harry/code/purescript/tests/purs/docs/src/ConstrainedArgument.purs","end":[8,57]},[]],"tag":"TypeVar","contents":"a"}]}]}]},{"annotation":[{"start":[8,62],"name":"/home/harry/code/purescript/tests/purs/docs/src/ConstrainedArgument.purs","end":[8,63]},[]],"tag":"TypeVar","contents":"a"}]},null]},null]}}}],"efSourceSpan":{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/ConstrainedArgument.purs","end":[8,63]}} \ No newline at end of file
+{"efVersion":"0.13.3","efModuleName":["ConstrainedArgument"],"efExports":[{"TypeClassRef":[{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/ConstrainedArgument.purs","end":[8,63]},"Foo"]},{"TypeRef":[{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/ConstrainedArgument.purs","end":[8,63]},"WithoutArgs",[]]},{"TypeRef":[{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/ConstrainedArgument.purs","end":[8,63]},"WithArgs",[]]},{"TypeRef":[{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/ConstrainedArgument.purs","end":[8,63]},"MultiWithoutArgs",[]]},{"TypeRef":[{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/ConstrainedArgument.purs","end":[8,63]},"MultiWithArgs",[]]}],"efImports":[{"eiModule":["Prim"],"eiImportType":{"Implicit":[]},"eiImportedAs":["Prim"]},{"eiModule":["Prim"],"eiImportType":{"Implicit":[]},"eiImportedAs":null}],"efFixities":[],"efTypeFixities":[],"efDeclarations":[{"EDType":{"edTypeName":"Foo","edTypeKind":{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"FunKind","contents":[{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"NamedKind","contents":[["Prim"],"Type"]},{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"NamedKind","contents":[["Prim"],"Type"]}]},"edTypeDeclarationKind":"TypeSynonym"}},{"EDTypeSynonym":{"edTypeSynonymName":"Foo","edTypeSynonymArguments":[["t",null]],"edTypeSynonymType":{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeConstructor","contents":[["Prim"],"Record"]},{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"REmpty"}]}}},{"EDClass":{"edClassName":"Foo","edClassTypeArguments":[["t",null]],"edClassMembers":[],"edClassConstraints":[],"edFunctionalDependencies":[],"edIsEmpty":true}},{"EDType":{"edTypeName":"WithoutArgs","edTypeKind":{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"NamedKind","contents":[["Prim"],"Type"]},"edTypeDeclarationKind":"TypeSynonym"}},{"EDTypeSynonym":{"edTypeSynonymName":"WithoutArgs","edTypeSynonymArguments":[],"edTypeSynonymType":{"annotation":[{"start":[5,25],"name":"/home/harry/code/purescript/tests/purs/docs/src/ConstrainedArgument.purs","end":[5,54]},[]],"tag":"ForAll","contents":["a",{"annotation":[{"start":[5,35],"name":"/home/harry/code/purescript/tests/purs/docs/src/ConstrainedArgument.purs","end":[5,54]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[5,35],"name":"/home/harry/code/purescript/tests/purs/docs/src/ConstrainedArgument.purs","end":[5,54]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[5,50],"name":"/home/harry/code/purescript/tests/purs/docs/src/ConstrainedArgument.purs","end":[5,52]},[]],"tag":"TypeConstructor","contents":[["Prim"],"Function"]},{"annotation":[{"start":[5,36],"name":"/home/harry/code/purescript/tests/purs/docs/src/ConstrainedArgument.purs","end":[5,48]},[]],"tag":"ConstrainedType","contents":[{"constraintAnn":[{"start":[5,36],"name":"/home/harry/code/purescript/tests/purs/docs/src/ConstrainedArgument.purs","end":[5,43]},[]],"constraintClass":[["Prim"],"Partial"],"constraintArgs":[],"constraintData":null},{"annotation":[{"start":[5,47],"name":"/home/harry/code/purescript/tests/purs/docs/src/ConstrainedArgument.purs","end":[5,48]},[]],"tag":"TypeVar","contents":"a"}]}]},{"annotation":[{"start":[5,53],"name":"/home/harry/code/purescript/tests/purs/docs/src/ConstrainedArgument.purs","end":[5,54]},[]],"tag":"TypeVar","contents":"a"}]},null]}}},{"EDType":{"edTypeName":"WithArgs","edTypeKind":{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"NamedKind","contents":[["Prim"],"Type"]},"edTypeDeclarationKind":"TypeSynonym"}},{"EDTypeSynonym":{"edTypeSynonymName":"WithArgs","edTypeSynonymArguments":[],"edTypeSynonymType":{"annotation":[{"start":[6,25],"name":"/home/harry/code/purescript/tests/purs/docs/src/ConstrainedArgument.purs","end":[6,52]},[]],"tag":"ForAll","contents":["a",{"annotation":[{"start":[6,35],"name":"/home/harry/code/purescript/tests/purs/docs/src/ConstrainedArgument.purs","end":[6,52]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[6,35],"name":"/home/harry/code/purescript/tests/purs/docs/src/ConstrainedArgument.purs","end":[6,52]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[6,48],"name":"/home/harry/code/purescript/tests/purs/docs/src/ConstrainedArgument.purs","end":[6,50]},[]],"tag":"TypeConstructor","contents":[["Prim"],"Function"]},{"annotation":[{"start":[6,36],"name":"/home/harry/code/purescript/tests/purs/docs/src/ConstrainedArgument.purs","end":[6,46]},[]],"tag":"ConstrainedType","contents":[{"constraintAnn":[{"start":[6,36],"name":"/home/harry/code/purescript/tests/purs/docs/src/ConstrainedArgument.purs","end":[6,41]},[]],"constraintClass":[["ConstrainedArgument"],"Foo"],"constraintArgs":[{"annotation":[{"start":[6,40],"name":"/home/harry/code/purescript/tests/purs/docs/src/ConstrainedArgument.purs","end":[6,41]},[]],"tag":"TypeVar","contents":"a"}],"constraintData":null},{"annotation":[{"start":[6,45],"name":"/home/harry/code/purescript/tests/purs/docs/src/ConstrainedArgument.purs","end":[6,46]},[]],"tag":"TypeVar","contents":"a"}]}]},{"annotation":[{"start":[6,51],"name":"/home/harry/code/purescript/tests/purs/docs/src/ConstrainedArgument.purs","end":[6,52]},[]],"tag":"TypeVar","contents":"a"}]},null]}}},{"EDType":{"edTypeName":"MultiWithoutArgs","edTypeKind":{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"NamedKind","contents":[["Prim"],"Type"]},"edTypeDeclarationKind":"TypeSynonym"}},{"EDTypeSynonym":{"edTypeSynonymName":"MultiWithoutArgs","edTypeSynonymArguments":[],"edTypeSynonymType":{"annotation":[{"start":[7,25],"name":"/home/harry/code/purescript/tests/purs/docs/src/ConstrainedArgument.purs","end":[7,65]},[]],"tag":"ForAll","contents":["a",{"annotation":[{"start":[7,35],"name":"/home/harry/code/purescript/tests/purs/docs/src/ConstrainedArgument.purs","end":[7,65]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[7,35],"name":"/home/harry/code/purescript/tests/purs/docs/src/ConstrainedArgument.purs","end":[7,65]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[7,61],"name":"/home/harry/code/purescript/tests/purs/docs/src/ConstrainedArgument.purs","end":[7,63]},[]],"tag":"TypeConstructor","contents":[["Prim"],"Function"]},{"annotation":[{"start":[7,36],"name":"/home/harry/code/purescript/tests/purs/docs/src/ConstrainedArgument.purs","end":[7,59]},[]],"tag":"ConstrainedType","contents":[{"constraintAnn":[{"start":[7,36],"name":"/home/harry/code/purescript/tests/purs/docs/src/ConstrainedArgument.purs","end":[7,43]},[]],"constraintClass":[["Prim"],"Partial"],"constraintArgs":[],"constraintData":null},{"annotation":[{"start":[7,47],"name":"/home/harry/code/purescript/tests/purs/docs/src/ConstrainedArgument.purs","end":[7,59]},[]],"tag":"ConstrainedType","contents":[{"constraintAnn":[{"start":[7,47],"name":"/home/harry/code/purescript/tests/purs/docs/src/ConstrainedArgument.purs","end":[7,54]},[]],"constraintClass":[["Prim"],"Partial"],"constraintArgs":[],"constraintData":null},{"annotation":[{"start":[7,58],"name":"/home/harry/code/purescript/tests/purs/docs/src/ConstrainedArgument.purs","end":[7,59]},[]],"tag":"TypeVar","contents":"a"}]}]}]},{"annotation":[{"start":[7,64],"name":"/home/harry/code/purescript/tests/purs/docs/src/ConstrainedArgument.purs","end":[7,65]},[]],"tag":"TypeVar","contents":"a"}]},null]}}},{"EDType":{"edTypeName":"MultiWithArgs","edTypeKind":{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"NamedKind","contents":[["Prim"],"Type"]},"edTypeDeclarationKind":"TypeSynonym"}},{"EDTypeSynonym":{"edTypeSynonymName":"MultiWithArgs","edTypeSynonymArguments":[],"edTypeSynonymType":{"annotation":[{"start":[8,25],"name":"/home/harry/code/purescript/tests/purs/docs/src/ConstrainedArgument.purs","end":[8,63]},[]],"tag":"ForAll","contents":["b",{"annotation":[{"start":[8,32],"name":"/home/harry/code/purescript/tests/purs/docs/src/ConstrainedArgument.purs","end":[8,63]},[]],"tag":"ForAll","contents":["a",{"annotation":[{"start":[8,37],"name":"/home/harry/code/purescript/tests/purs/docs/src/ConstrainedArgument.purs","end":[8,63]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[8,37],"name":"/home/harry/code/purescript/tests/purs/docs/src/ConstrainedArgument.purs","end":[8,63]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[8,59],"name":"/home/harry/code/purescript/tests/purs/docs/src/ConstrainedArgument.purs","end":[8,61]},[]],"tag":"TypeConstructor","contents":[["Prim"],"Function"]},{"annotation":[{"start":[8,38],"name":"/home/harry/code/purescript/tests/purs/docs/src/ConstrainedArgument.purs","end":[8,57]},[]],"tag":"ConstrainedType","contents":[{"constraintAnn":[{"start":[8,38],"name":"/home/harry/code/purescript/tests/purs/docs/src/ConstrainedArgument.purs","end":[8,43]},[]],"constraintClass":[["ConstrainedArgument"],"Foo"],"constraintArgs":[{"annotation":[{"start":[8,42],"name":"/home/harry/code/purescript/tests/purs/docs/src/ConstrainedArgument.purs","end":[8,43]},[]],"tag":"TypeVar","contents":"a"}],"constraintData":null},{"annotation":[{"start":[8,47],"name":"/home/harry/code/purescript/tests/purs/docs/src/ConstrainedArgument.purs","end":[8,57]},[]],"tag":"ConstrainedType","contents":[{"constraintAnn":[{"start":[8,47],"name":"/home/harry/code/purescript/tests/purs/docs/src/ConstrainedArgument.purs","end":[8,52]},[]],"constraintClass":[["ConstrainedArgument"],"Foo"],"constraintArgs":[{"annotation":[{"start":[8,51],"name":"/home/harry/code/purescript/tests/purs/docs/src/ConstrainedArgument.purs","end":[8,52]},[]],"tag":"TypeVar","contents":"b"}],"constraintData":null},{"annotation":[{"start":[8,56],"name":"/home/harry/code/purescript/tests/purs/docs/src/ConstrainedArgument.purs","end":[8,57]},[]],"tag":"TypeVar","contents":"a"}]}]}]},{"annotation":[{"start":[8,62],"name":"/home/harry/code/purescript/tests/purs/docs/src/ConstrainedArgument.purs","end":[8,63]},[]],"tag":"TypeVar","contents":"a"}]},null]},null]}}}],"efSourceSpan":{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/ConstrainedArgument.purs","end":[8,63]}} \ No newline at end of file
diff --git a/tests/purs/docs/output/Data.Newtype/externs.json b/tests/purs/docs/output/Data.Newtype/externs.json
index 803d410..dd5c749 100644
--- a/tests/purs/docs/output/Data.Newtype/externs.json
+++ b/tests/purs/docs/output/Data.Newtype/externs.json
@@ -1 +1 @@
-{"efVersion":"0.13.2","efModuleName":["Data","Newtype"],"efExports":[{"ValueRef":[{"start":[1,1],"name":"bower_components/purescript-newtype/src/Data/Newtype.purs","end":[5,19]},{"Ident":"unwrap"}]},{"ValueRef":[{"start":[1,1],"name":"bower_components/purescript-newtype/src/Data/Newtype.purs","end":[5,19]},{"Ident":"wrap"}]},{"TypeClassRef":[{"start":[1,1],"name":"bower_components/purescript-newtype/src/Data/Newtype.purs","end":[5,19]},"Newtype"]}],"efImports":[{"eiModule":["Prim"],"eiImportType":{"Implicit":[]},"eiImportedAs":["Prim"]},{"eiModule":["Prim"],"eiImportType":{"Implicit":[]},"eiImportedAs":null}],"efFixities":[],"efTypeFixities":[],"efDeclarations":[{"EDValue":{"edValueName":{"Ident":"unwrap"},"edValueType":{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"ForAll","contents":["t",{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"ForAll","contents":["a",{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"ConstrainedType","contents":[{"constraintAnn":[{"start":[0,0],"name":"","end":[0,0]},[]],"constraintClass":[["Data","Newtype"],"Newtype"],"constraintArgs":[{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeVar","contents":"t"},{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeVar","contents":"a"}],"constraintData":null},{"annotation":[{"start":[5,13],"name":"bower_components/purescript-newtype/src/Data/Newtype.purs","end":[5,19]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[5,13],"name":"bower_components/purescript-newtype/src/Data/Newtype.purs","end":[5,19]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[5,15],"name":"bower_components/purescript-newtype/src/Data/Newtype.purs","end":[5,17]},[]],"tag":"TypeConstructor","contents":[["Prim"],"Function"]},{"annotation":[{"start":[5,13],"name":"bower_components/purescript-newtype/src/Data/Newtype.purs","end":[5,14]},[]],"tag":"TypeVar","contents":"t"}]},{"annotation":[{"start":[5,18],"name":"bower_components/purescript-newtype/src/Data/Newtype.purs","end":[5,19]},[]],"tag":"TypeVar","contents":"a"}]}]},2]},3]}}},{"EDValue":{"edValueName":{"Ident":"wrap"},"edValueType":{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"ForAll","contents":["t",{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"ForAll","contents":["a",{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"ConstrainedType","contents":[{"constraintAnn":[{"start":[0,0],"name":"","end":[0,0]},[]],"constraintClass":[["Data","Newtype"],"Newtype"],"constraintArgs":[{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeVar","contents":"t"},{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeVar","contents":"a"}],"constraintData":null},{"annotation":[{"start":[4,11],"name":"bower_components/purescript-newtype/src/Data/Newtype.purs","end":[4,17]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[4,11],"name":"bower_components/purescript-newtype/src/Data/Newtype.purs","end":[4,17]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[4,13],"name":"bower_components/purescript-newtype/src/Data/Newtype.purs","end":[4,15]},[]],"tag":"TypeConstructor","contents":[["Prim"],"Function"]},{"annotation":[{"start":[4,11],"name":"bower_components/purescript-newtype/src/Data/Newtype.purs","end":[4,12]},[]],"tag":"TypeVar","contents":"a"}]},{"annotation":[{"start":[4,16],"name":"bower_components/purescript-newtype/src/Data/Newtype.purs","end":[4,17]},[]],"tag":"TypeVar","contents":"t"}]}]},0]},1]}}},{"EDType":{"edTypeName":"Newtype","edTypeKind":{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"FunKind","contents":[{"annotation":[{"start":[4,13],"name":"bower_components/purescript-newtype/src/Data/Newtype.purs","end":[4,15]},[]],"tag":"NamedKind","contents":[["Prim"],"Type"]},{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"FunKind","contents":[{"annotation":[{"start":[4,13],"name":"bower_components/purescript-newtype/src/Data/Newtype.purs","end":[4,15]},[]],"tag":"NamedKind","contents":[["Prim"],"Type"]},{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"NamedKind","contents":[["Prim"],"Type"]}]}]},"edTypeDeclarationKind":"TypeSynonym"}},{"EDTypeSynonym":{"edTypeSynonymName":"Newtype","edTypeSynonymArguments":[["t",null],["a",null]],"edTypeSynonymType":{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeConstructor","contents":[["Prim"],"Record"]},{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"RCons","contents":["wrap",{"annotation":[{"start":[4,11],"name":"bower_components/purescript-newtype/src/Data/Newtype.purs","end":[4,17]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[4,11],"name":"bower_components/purescript-newtype/src/Data/Newtype.purs","end":[4,17]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[4,13],"name":"bower_components/purescript-newtype/src/Data/Newtype.purs","end":[4,15]},[]],"tag":"TypeConstructor","contents":[["Prim"],"Function"]},{"annotation":[{"start":[4,11],"name":"bower_components/purescript-newtype/src/Data/Newtype.purs","end":[4,12]},[]],"tag":"TypeVar","contents":"a"}]},{"annotation":[{"start":[4,16],"name":"bower_components/purescript-newtype/src/Data/Newtype.purs","end":[4,17]},[]],"tag":"TypeVar","contents":"t"}]},{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"RCons","contents":["unwrap",{"annotation":[{"start":[5,13],"name":"bower_components/purescript-newtype/src/Data/Newtype.purs","end":[5,19]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[5,13],"name":"bower_components/purescript-newtype/src/Data/Newtype.purs","end":[5,19]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[5,15],"name":"bower_components/purescript-newtype/src/Data/Newtype.purs","end":[5,17]},[]],"tag":"TypeConstructor","contents":[["Prim"],"Function"]},{"annotation":[{"start":[5,13],"name":"bower_components/purescript-newtype/src/Data/Newtype.purs","end":[5,14]},[]],"tag":"TypeVar","contents":"t"}]},{"annotation":[{"start":[5,18],"name":"bower_components/purescript-newtype/src/Data/Newtype.purs","end":[5,19]},[]],"tag":"TypeVar","contents":"a"}]},{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"REmpty"}]}]}]}}},{"EDClass":{"edClassName":"Newtype","edClassTypeArguments":[["t",null],["a",null]],"edClassMembers":[[{"Ident":"wrap"},{"annotation":[{"start":[4,11],"name":"bower_components/purescript-newtype/src/Data/Newtype.purs","end":[4,17]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[4,11],"name":"bower_components/purescript-newtype/src/Data/Newtype.purs","end":[4,17]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[4,13],"name":"bower_components/purescript-newtype/src/Data/Newtype.purs","end":[4,15]},[]],"tag":"TypeConstructor","contents":[["Prim"],"Function"]},{"annotation":[{"start":[4,11],"name":"bower_components/purescript-newtype/src/Data/Newtype.purs","end":[4,12]},[]],"tag":"TypeVar","contents":"a"}]},{"annotation":[{"start":[4,16],"name":"bower_components/purescript-newtype/src/Data/Newtype.purs","end":[4,17]},[]],"tag":"TypeVar","contents":"t"}]}],[{"Ident":"unwrap"},{"annotation":[{"start":[5,13],"name":"bower_components/purescript-newtype/src/Data/Newtype.purs","end":[5,19]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[5,13],"name":"bower_components/purescript-newtype/src/Data/Newtype.purs","end":[5,19]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[5,15],"name":"bower_components/purescript-newtype/src/Data/Newtype.purs","end":[5,17]},[]],"tag":"TypeConstructor","contents":[["Prim"],"Function"]},{"annotation":[{"start":[5,13],"name":"bower_components/purescript-newtype/src/Data/Newtype.purs","end":[5,14]},[]],"tag":"TypeVar","contents":"t"}]},{"annotation":[{"start":[5,18],"name":"bower_components/purescript-newtype/src/Data/Newtype.purs","end":[5,19]},[]],"tag":"TypeVar","contents":"a"}]}]],"edClassConstraints":[],"edFunctionalDependencies":[{"determiners":[0],"determined":[1]}],"edIsEmpty":false}}],"efSourceSpan":{"start":[1,1],"name":"bower_components/purescript-newtype/src/Data/Newtype.purs","end":[5,19]}} \ No newline at end of file
+{"efVersion":"0.13.3","efModuleName":["Data","Newtype"],"efExports":[{"ValueRef":[{"start":[1,1],"name":"bower_components/purescript-newtype/src/Data/Newtype.purs","end":[5,19]},{"Ident":"unwrap"}]},{"ValueRef":[{"start":[1,1],"name":"bower_components/purescript-newtype/src/Data/Newtype.purs","end":[5,19]},{"Ident":"wrap"}]},{"TypeClassRef":[{"start":[1,1],"name":"bower_components/purescript-newtype/src/Data/Newtype.purs","end":[5,19]},"Newtype"]}],"efImports":[{"eiModule":["Prim"],"eiImportType":{"Implicit":[]},"eiImportedAs":["Prim"]},{"eiModule":["Prim"],"eiImportType":{"Implicit":[]},"eiImportedAs":null}],"efFixities":[],"efTypeFixities":[],"efDeclarations":[{"EDValue":{"edValueName":{"Ident":"unwrap"},"edValueType":{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"ForAll","contents":["t",{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"ForAll","contents":["a",{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"ConstrainedType","contents":[{"constraintAnn":[{"start":[0,0],"name":"","end":[0,0]},[]],"constraintClass":[["Data","Newtype"],"Newtype"],"constraintArgs":[{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeVar","contents":"t"},{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeVar","contents":"a"}],"constraintData":null},{"annotation":[{"start":[5,13],"name":"bower_components/purescript-newtype/src/Data/Newtype.purs","end":[5,19]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[5,13],"name":"bower_components/purescript-newtype/src/Data/Newtype.purs","end":[5,19]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[5,15],"name":"bower_components/purescript-newtype/src/Data/Newtype.purs","end":[5,17]},[]],"tag":"TypeConstructor","contents":[["Prim"],"Function"]},{"annotation":[{"start":[5,13],"name":"bower_components/purescript-newtype/src/Data/Newtype.purs","end":[5,14]},[]],"tag":"TypeVar","contents":"t"}]},{"annotation":[{"start":[5,18],"name":"bower_components/purescript-newtype/src/Data/Newtype.purs","end":[5,19]},[]],"tag":"TypeVar","contents":"a"}]}]},2]},3]}}},{"EDValue":{"edValueName":{"Ident":"wrap"},"edValueType":{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"ForAll","contents":["t",{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"ForAll","contents":["a",{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"ConstrainedType","contents":[{"constraintAnn":[{"start":[0,0],"name":"","end":[0,0]},[]],"constraintClass":[["Data","Newtype"],"Newtype"],"constraintArgs":[{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeVar","contents":"t"},{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeVar","contents":"a"}],"constraintData":null},{"annotation":[{"start":[4,11],"name":"bower_components/purescript-newtype/src/Data/Newtype.purs","end":[4,17]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[4,11],"name":"bower_components/purescript-newtype/src/Data/Newtype.purs","end":[4,17]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[4,13],"name":"bower_components/purescript-newtype/src/Data/Newtype.purs","end":[4,15]},[]],"tag":"TypeConstructor","contents":[["Prim"],"Function"]},{"annotation":[{"start":[4,11],"name":"bower_components/purescript-newtype/src/Data/Newtype.purs","end":[4,12]},[]],"tag":"TypeVar","contents":"a"}]},{"annotation":[{"start":[4,16],"name":"bower_components/purescript-newtype/src/Data/Newtype.purs","end":[4,17]},[]],"tag":"TypeVar","contents":"t"}]}]},0]},1]}}},{"EDType":{"edTypeName":"Newtype","edTypeKind":{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"FunKind","contents":[{"annotation":[{"start":[4,13],"name":"bower_components/purescript-newtype/src/Data/Newtype.purs","end":[4,15]},[]],"tag":"NamedKind","contents":[["Prim"],"Type"]},{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"FunKind","contents":[{"annotation":[{"start":[4,13],"name":"bower_components/purescript-newtype/src/Data/Newtype.purs","end":[4,15]},[]],"tag":"NamedKind","contents":[["Prim"],"Type"]},{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"NamedKind","contents":[["Prim"],"Type"]}]}]},"edTypeDeclarationKind":"TypeSynonym"}},{"EDTypeSynonym":{"edTypeSynonymName":"Newtype","edTypeSynonymArguments":[["t",null],["a",null]],"edTypeSynonymType":{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeConstructor","contents":[["Prim"],"Record"]},{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"RCons","contents":["wrap",{"annotation":[{"start":[4,11],"name":"bower_components/purescript-newtype/src/Data/Newtype.purs","end":[4,17]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[4,11],"name":"bower_components/purescript-newtype/src/Data/Newtype.purs","end":[4,17]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[4,13],"name":"bower_components/purescript-newtype/src/Data/Newtype.purs","end":[4,15]},[]],"tag":"TypeConstructor","contents":[["Prim"],"Function"]},{"annotation":[{"start":[4,11],"name":"bower_components/purescript-newtype/src/Data/Newtype.purs","end":[4,12]},[]],"tag":"TypeVar","contents":"a"}]},{"annotation":[{"start":[4,16],"name":"bower_components/purescript-newtype/src/Data/Newtype.purs","end":[4,17]},[]],"tag":"TypeVar","contents":"t"}]},{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"RCons","contents":["unwrap",{"annotation":[{"start":[5,13],"name":"bower_components/purescript-newtype/src/Data/Newtype.purs","end":[5,19]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[5,13],"name":"bower_components/purescript-newtype/src/Data/Newtype.purs","end":[5,19]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[5,15],"name":"bower_components/purescript-newtype/src/Data/Newtype.purs","end":[5,17]},[]],"tag":"TypeConstructor","contents":[["Prim"],"Function"]},{"annotation":[{"start":[5,13],"name":"bower_components/purescript-newtype/src/Data/Newtype.purs","end":[5,14]},[]],"tag":"TypeVar","contents":"t"}]},{"annotation":[{"start":[5,18],"name":"bower_components/purescript-newtype/src/Data/Newtype.purs","end":[5,19]},[]],"tag":"TypeVar","contents":"a"}]},{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"REmpty"}]}]}]}}},{"EDClass":{"edClassName":"Newtype","edClassTypeArguments":[["t",null],["a",null]],"edClassMembers":[[{"Ident":"wrap"},{"annotation":[{"start":[4,11],"name":"bower_components/purescript-newtype/src/Data/Newtype.purs","end":[4,17]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[4,11],"name":"bower_components/purescript-newtype/src/Data/Newtype.purs","end":[4,17]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[4,13],"name":"bower_components/purescript-newtype/src/Data/Newtype.purs","end":[4,15]},[]],"tag":"TypeConstructor","contents":[["Prim"],"Function"]},{"annotation":[{"start":[4,11],"name":"bower_components/purescript-newtype/src/Data/Newtype.purs","end":[4,12]},[]],"tag":"TypeVar","contents":"a"}]},{"annotation":[{"start":[4,16],"name":"bower_components/purescript-newtype/src/Data/Newtype.purs","end":[4,17]},[]],"tag":"TypeVar","contents":"t"}]}],[{"Ident":"unwrap"},{"annotation":[{"start":[5,13],"name":"bower_components/purescript-newtype/src/Data/Newtype.purs","end":[5,19]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[5,13],"name":"bower_components/purescript-newtype/src/Data/Newtype.purs","end":[5,19]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[5,15],"name":"bower_components/purescript-newtype/src/Data/Newtype.purs","end":[5,17]},[]],"tag":"TypeConstructor","contents":[["Prim"],"Function"]},{"annotation":[{"start":[5,13],"name":"bower_components/purescript-newtype/src/Data/Newtype.purs","end":[5,14]},[]],"tag":"TypeVar","contents":"t"}]},{"annotation":[{"start":[5,18],"name":"bower_components/purescript-newtype/src/Data/Newtype.purs","end":[5,19]},[]],"tag":"TypeVar","contents":"a"}]}]],"edClassConstraints":[],"edFunctionalDependencies":[{"determiners":[0],"determined":[1]}],"edIsEmpty":false}}],"efSourceSpan":{"start":[1,1],"name":"bower_components/purescript-newtype/src/Data/Newtype.purs","end":[5,19]}} \ No newline at end of file
diff --git a/tests/purs/docs/output/DeclOrder/externs.json b/tests/purs/docs/output/DeclOrder/externs.json
index f46ec77..883a114 100644
--- a/tests/purs/docs/output/DeclOrder/externs.json
+++ b/tests/purs/docs/output/DeclOrder/externs.json
@@ -1 +1 @@
-{"efVersion":"0.13.2","efModuleName":["DeclOrder"],"efExports":[{"TypeClassRef":[{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/DeclOrder.purs","end":[17,8]},"A"]},{"ValueRef":[{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/DeclOrder.purs","end":[17,8]},{"Ident":"x1"}]},{"TypeRef":[{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/DeclOrder.purs","end":[17,8]},"X2",[]]},{"ValueRef":[{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/DeclOrder.purs","end":[17,8]},{"Ident":"x3"}]},{"TypeRef":[{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/DeclOrder.purs","end":[17,8]},"X4",[]]},{"TypeClassRef":[{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/DeclOrder.purs","end":[17,8]},"B"]}],"efImports":[{"eiModule":["Prim"],"eiImportType":{"Implicit":[]},"eiImportedAs":["Prim"]},{"eiModule":["Prim"],"eiImportType":{"Implicit":[]},"eiImportedAs":null}],"efFixities":[],"efTypeFixities":[],"efDeclarations":[{"EDType":{"edTypeName":"A","edTypeKind":{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"NamedKind","contents":[["Prim"],"Type"]},"edTypeDeclarationKind":"TypeSynonym"}},{"EDTypeSynonym":{"edTypeSynonymName":"A","edTypeSynonymArguments":[],"edTypeSynonymType":{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeConstructor","contents":[["Prim"],"Record"]},{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"REmpty"}]}}},{"EDClass":{"edClassName":"A","edClassTypeArguments":[],"edClassMembers":[],"edClassConstraints":[],"edFunctionalDependencies":[],"edIsEmpty":true}},{"EDValue":{"edValueName":{"Ident":"x1"},"edValueType":{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeConstructor","contents":[["Prim"],"Int"]}}},{"EDType":{"edTypeName":"X2","edTypeKind":{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"NamedKind","contents":[["Prim"],"Type"]},"edTypeDeclarationKind":{"DataType":{"args":[],"ctors":[]}}}},{"EDValue":{"edValueName":{"Ident":"x3"},"edValueType":{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeConstructor","contents":[["Prim"],"Int"]}}},{"EDType":{"edTypeName":"X4","edTypeKind":{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"NamedKind","contents":[["Prim"],"Type"]},"edTypeDeclarationKind":{"DataType":{"args":[],"ctors":[]}}}},{"EDType":{"edTypeName":"B","edTypeKind":{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"NamedKind","contents":[["Prim"],"Type"]},"edTypeDeclarationKind":"TypeSynonym"}},{"EDTypeSynonym":{"edTypeSynonymName":"B","edTypeSynonymArguments":[],"edTypeSynonymType":{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeConstructor","contents":[["Prim"],"Record"]},{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"REmpty"}]}}},{"EDClass":{"edClassName":"B","edClassTypeArguments":[],"edClassMembers":[],"edClassConstraints":[],"edFunctionalDependencies":[],"edIsEmpty":true}}],"efSourceSpan":{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/DeclOrder.purs","end":[17,8]}} \ No newline at end of file
+{"efVersion":"0.13.3","efModuleName":["DeclOrder"],"efExports":[{"TypeClassRef":[{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/DeclOrder.purs","end":[17,8]},"A"]},{"ValueRef":[{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/DeclOrder.purs","end":[17,8]},{"Ident":"x1"}]},{"TypeRef":[{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/DeclOrder.purs","end":[17,8]},"X2",[]]},{"ValueRef":[{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/DeclOrder.purs","end":[17,8]},{"Ident":"x3"}]},{"TypeRef":[{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/DeclOrder.purs","end":[17,8]},"X4",[]]},{"TypeClassRef":[{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/DeclOrder.purs","end":[17,8]},"B"]}],"efImports":[{"eiModule":["Prim"],"eiImportType":{"Implicit":[]},"eiImportedAs":["Prim"]},{"eiModule":["Prim"],"eiImportType":{"Implicit":[]},"eiImportedAs":null}],"efFixities":[],"efTypeFixities":[],"efDeclarations":[{"EDType":{"edTypeName":"A","edTypeKind":{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"NamedKind","contents":[["Prim"],"Type"]},"edTypeDeclarationKind":"TypeSynonym"}},{"EDTypeSynonym":{"edTypeSynonymName":"A","edTypeSynonymArguments":[],"edTypeSynonymType":{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeConstructor","contents":[["Prim"],"Record"]},{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"REmpty"}]}}},{"EDClass":{"edClassName":"A","edClassTypeArguments":[],"edClassMembers":[],"edClassConstraints":[],"edFunctionalDependencies":[],"edIsEmpty":true}},{"EDValue":{"edValueName":{"Ident":"x1"},"edValueType":{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeConstructor","contents":[["Prim"],"Int"]}}},{"EDType":{"edTypeName":"X2","edTypeKind":{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"NamedKind","contents":[["Prim"],"Type"]},"edTypeDeclarationKind":{"DataType":{"args":[],"ctors":[]}}}},{"EDValue":{"edValueName":{"Ident":"x3"},"edValueType":{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeConstructor","contents":[["Prim"],"Int"]}}},{"EDType":{"edTypeName":"X4","edTypeKind":{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"NamedKind","contents":[["Prim"],"Type"]},"edTypeDeclarationKind":{"DataType":{"args":[],"ctors":[]}}}},{"EDType":{"edTypeName":"B","edTypeKind":{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"NamedKind","contents":[["Prim"],"Type"]},"edTypeDeclarationKind":"TypeSynonym"}},{"EDTypeSynonym":{"edTypeSynonymName":"B","edTypeSynonymArguments":[],"edTypeSynonymType":{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeConstructor","contents":[["Prim"],"Record"]},{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"REmpty"}]}}},{"EDClass":{"edClassName":"B","edClassTypeArguments":[],"edClassMembers":[],"edClassConstraints":[],"edFunctionalDependencies":[],"edIsEmpty":true}}],"efSourceSpan":{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/DeclOrder.purs","end":[17,8]}} \ No newline at end of file
diff --git a/tests/purs/docs/output/DeclOrderNoExportList/externs.json b/tests/purs/docs/output/DeclOrderNoExportList/externs.json
index 39c4234..1368f5d 100644
--- a/tests/purs/docs/output/DeclOrderNoExportList/externs.json
+++ b/tests/purs/docs/output/DeclOrderNoExportList/externs.json
@@ -1 +1 @@
-{"efVersion":"0.13.2","efModuleName":["DeclOrderNoExportList"],"efExports":[{"ValueRef":[{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/DeclOrderNoExportList.purs","end":[10,8]},{"Ident":"x1"}]},{"ValueRef":[{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/DeclOrderNoExportList.purs","end":[10,8]},{"Ident":"x3"}]},{"TypeRef":[{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/DeclOrderNoExportList.purs","end":[10,8]},"X2",[]]},{"TypeRef":[{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/DeclOrderNoExportList.purs","end":[10,8]},"X4",[]]},{"TypeClassRef":[{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/DeclOrderNoExportList.purs","end":[10,8]},"A"]},{"TypeClassRef":[{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/DeclOrderNoExportList.purs","end":[10,8]},"B"]}],"efImports":[{"eiModule":["Prim"],"eiImportType":{"Implicit":[]},"eiImportedAs":["Prim"]},{"eiModule":["Prim"],"eiImportType":{"Implicit":[]},"eiImportedAs":null}],"efFixities":[],"efTypeFixities":[],"efDeclarations":[{"EDValue":{"edValueName":{"Ident":"x1"},"edValueType":{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeConstructor","contents":[["Prim"],"Int"]}}},{"EDValue":{"edValueName":{"Ident":"x3"},"edValueType":{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeConstructor","contents":[["Prim"],"Int"]}}},{"EDType":{"edTypeName":"X2","edTypeKind":{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"NamedKind","contents":[["Prim"],"Type"]},"edTypeDeclarationKind":{"DataType":{"args":[],"ctors":[]}}}},{"EDType":{"edTypeName":"X4","edTypeKind":{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"NamedKind","contents":[["Prim"],"Type"]},"edTypeDeclarationKind":{"DataType":{"args":[],"ctors":[]}}}},{"EDType":{"edTypeName":"A","edTypeKind":{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"NamedKind","contents":[["Prim"],"Type"]},"edTypeDeclarationKind":"TypeSynonym"}},{"EDTypeSynonym":{"edTypeSynonymName":"A","edTypeSynonymArguments":[],"edTypeSynonymType":{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeConstructor","contents":[["Prim"],"Record"]},{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"REmpty"}]}}},{"EDClass":{"edClassName":"A","edClassTypeArguments":[],"edClassMembers":[],"edClassConstraints":[],"edFunctionalDependencies":[],"edIsEmpty":true}},{"EDType":{"edTypeName":"B","edTypeKind":{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"NamedKind","contents":[["Prim"],"Type"]},"edTypeDeclarationKind":"TypeSynonym"}},{"EDTypeSynonym":{"edTypeSynonymName":"B","edTypeSynonymArguments":[],"edTypeSynonymType":{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeConstructor","contents":[["Prim"],"Record"]},{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"REmpty"}]}}},{"EDClass":{"edClassName":"B","edClassTypeArguments":[],"edClassMembers":[],"edClassConstraints":[],"edFunctionalDependencies":[],"edIsEmpty":true}}],"efSourceSpan":{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/DeclOrderNoExportList.purs","end":[10,8]}} \ No newline at end of file
+{"efVersion":"0.13.3","efModuleName":["DeclOrderNoExportList"],"efExports":[{"ValueRef":[{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/DeclOrderNoExportList.purs","end":[10,8]},{"Ident":"x1"}]},{"ValueRef":[{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/DeclOrderNoExportList.purs","end":[10,8]},{"Ident":"x3"}]},{"TypeRef":[{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/DeclOrderNoExportList.purs","end":[10,8]},"X2",[]]},{"TypeRef":[{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/DeclOrderNoExportList.purs","end":[10,8]},"X4",[]]},{"TypeClassRef":[{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/DeclOrderNoExportList.purs","end":[10,8]},"A"]},{"TypeClassRef":[{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/DeclOrderNoExportList.purs","end":[10,8]},"B"]}],"efImports":[{"eiModule":["Prim"],"eiImportType":{"Implicit":[]},"eiImportedAs":["Prim"]},{"eiModule":["Prim"],"eiImportType":{"Implicit":[]},"eiImportedAs":null}],"efFixities":[],"efTypeFixities":[],"efDeclarations":[{"EDValue":{"edValueName":{"Ident":"x1"},"edValueType":{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeConstructor","contents":[["Prim"],"Int"]}}},{"EDValue":{"edValueName":{"Ident":"x3"},"edValueType":{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeConstructor","contents":[["Prim"],"Int"]}}},{"EDType":{"edTypeName":"X2","edTypeKind":{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"NamedKind","contents":[["Prim"],"Type"]},"edTypeDeclarationKind":{"DataType":{"args":[],"ctors":[]}}}},{"EDType":{"edTypeName":"X4","edTypeKind":{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"NamedKind","contents":[["Prim"],"Type"]},"edTypeDeclarationKind":{"DataType":{"args":[],"ctors":[]}}}},{"EDType":{"edTypeName":"A","edTypeKind":{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"NamedKind","contents":[["Prim"],"Type"]},"edTypeDeclarationKind":"TypeSynonym"}},{"EDTypeSynonym":{"edTypeSynonymName":"A","edTypeSynonymArguments":[],"edTypeSynonymType":{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeConstructor","contents":[["Prim"],"Record"]},{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"REmpty"}]}}},{"EDClass":{"edClassName":"A","edClassTypeArguments":[],"edClassMembers":[],"edClassConstraints":[],"edFunctionalDependencies":[],"edIsEmpty":true}},{"EDType":{"edTypeName":"B","edTypeKind":{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"NamedKind","contents":[["Prim"],"Type"]},"edTypeDeclarationKind":"TypeSynonym"}},{"EDTypeSynonym":{"edTypeSynonymName":"B","edTypeSynonymArguments":[],"edTypeSynonymType":{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeConstructor","contents":[["Prim"],"Record"]},{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"REmpty"}]}}},{"EDClass":{"edClassName":"B","edClassTypeArguments":[],"edClassMembers":[],"edClassConstraints":[],"edFunctionalDependencies":[],"edIsEmpty":true}}],"efSourceSpan":{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/DeclOrderNoExportList.purs","end":[10,8]}} \ No newline at end of file
diff --git a/tests/purs/docs/output/Desugar/externs.json b/tests/purs/docs/output/Desugar/externs.json
index 4faf567..d546054 100644
--- a/tests/purs/docs/output/Desugar/externs.json
+++ b/tests/purs/docs/output/Desugar/externs.json
@@ -1 +1 @@
-{"efVersion":"0.13.2","efModuleName":["Desugar"],"efExports":[{"TypeRef":[{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/Desugar.purs","end":[8,9]},"X",["X"]]},{"ValueRef":[{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/Desugar.purs","end":[8,9]},{"Ident":"test"}]}],"efImports":[{"eiModule":["Prim"],"eiImportType":{"Implicit":[]},"eiImportedAs":["Prim"]},{"eiModule":["Prim"],"eiImportType":{"Implicit":[]},"eiImportedAs":null}],"efFixities":[],"efTypeFixities":[],"efDeclarations":[{"EDType":{"edTypeName":"X","edTypeKind":{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"FunKind","contents":[{"annotation":[{"start":[3,16],"name":"/home/harry/code/purescript/tests/purs/docs/src/Desugar.purs","end":[3,17]},[]],"tag":"NamedKind","contents":[["Prim"],"Type"]},{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"FunKind","contents":[{"annotation":[{"start":[3,18],"name":"/home/harry/code/purescript/tests/purs/docs/src/Desugar.purs","end":[3,19]},[]],"tag":"NamedKind","contents":[["Prim"],"Type"]},{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"NamedKind","contents":[["Prim"],"Type"]}]}]},"edTypeDeclarationKind":{"DataType":{"args":[["a",{"annotation":[{"start":[3,16],"name":"/home/harry/code/purescript/tests/purs/docs/src/Desugar.purs","end":[3,17]},[]],"tag":"NamedKind","contents":[["Prim"],"Type"]}],["b",{"annotation":[{"start":[3,18],"name":"/home/harry/code/purescript/tests/purs/docs/src/Desugar.purs","end":[3,19]},[]],"tag":"NamedKind","contents":[["Prim"],"Type"]}]],"ctors":[["X",[{"annotation":[{"start":[3,16],"name":"/home/harry/code/purescript/tests/purs/docs/src/Desugar.purs","end":[3,17]},[]],"tag":"TypeVar","contents":"a"},{"annotation":[{"start":[3,18],"name":"/home/harry/code/purescript/tests/purs/docs/src/Desugar.purs","end":[3,19]},[]],"tag":"TypeVar","contents":"b"}]]]}}}},{"EDDataConstructor":{"edDataCtorName":"X","edDataCtorOrigin":"data","edDataCtorTypeCtor":"X","edDataCtorType":{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"ForAll","contents":["b",{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"ForAll","contents":["a",{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeConstructor","contents":[["Prim"],"Function"]},{"annotation":[{"start":[3,16],"name":"/home/harry/code/purescript/tests/purs/docs/src/Desugar.purs","end":[3,17]},[]],"tag":"TypeVar","contents":"a"}]},{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeConstructor","contents":[["Prim"],"Function"]},{"annotation":[{"start":[3,18],"name":"/home/harry/code/purescript/tests/purs/docs/src/Desugar.purs","end":[3,19]},[]],"tag":"TypeVar","contents":"b"}]},{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeConstructor","contents":[["Desugar"],"X"]},{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeVar","contents":"a"}]},{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeVar","contents":"b"}]}]}]},null]},null]},"edDataCtorFields":[{"Ident":"value0"},{"Ident":"value1"}]}},{"EDValue":{"edValueName":{"Ident":"test"},"edValueType":{"annotation":[{"start":[5,9],"name":"/home/harry/code/purescript/tests/purs/docs/src/Desugar.purs","end":[5,38]},[]],"tag":"ForAll","contents":["b",{"annotation":[{"start":[5,16],"name":"/home/harry/code/purescript/tests/purs/docs/src/Desugar.purs","end":[5,38]},[]],"tag":"ForAll","contents":["a",{"annotation":[{"start":[5,21],"name":"/home/harry/code/purescript/tests/purs/docs/src/Desugar.purs","end":[5,38]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[5,21],"name":"/home/harry/code/purescript/tests/purs/docs/src/Desugar.purs","end":[5,38]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[5,34],"name":"/home/harry/code/purescript/tests/purs/docs/src/Desugar.purs","end":[5,36]},[]],"tag":"TypeConstructor","contents":[["Prim"],"Function"]},{"annotation":[{"start":[5,21],"name":"/home/harry/code/purescript/tests/purs/docs/src/Desugar.purs","end":[5,33]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[5,21],"name":"/home/harry/code/purescript/tests/purs/docs/src/Desugar.purs","end":[5,31]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[5,21],"name":"/home/harry/code/purescript/tests/purs/docs/src/Desugar.purs","end":[5,22]},[]],"tag":"TypeConstructor","contents":[["Desugar"],"X"]},{"annotation":[{"start":[5,24],"name":"/home/harry/code/purescript/tests/purs/docs/src/Desugar.purs","end":[5,30]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[5,24],"name":"/home/harry/code/purescript/tests/purs/docs/src/Desugar.purs","end":[5,30]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[5,26],"name":"/home/harry/code/purescript/tests/purs/docs/src/Desugar.purs","end":[5,28]},[]],"tag":"TypeConstructor","contents":[["Prim"],"Function"]},{"annotation":[{"start":[5,24],"name":"/home/harry/code/purescript/tests/purs/docs/src/Desugar.purs","end":[5,25]},[]],"tag":"TypeVar","contents":"a"}]},{"annotation":[{"start":[5,29],"name":"/home/harry/code/purescript/tests/purs/docs/src/Desugar.purs","end":[5,30]},[]],"tag":"TypeVar","contents":"b"}]}]},{"annotation":[{"start":[5,32],"name":"/home/harry/code/purescript/tests/purs/docs/src/Desugar.purs","end":[5,33]},[]],"tag":"TypeVar","contents":"a"}]}]},{"annotation":[{"start":[5,37],"name":"/home/harry/code/purescript/tests/purs/docs/src/Desugar.purs","end":[5,38]},[]],"tag":"TypeVar","contents":"b"}]},0]},1]}}}],"efSourceSpan":{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/Desugar.purs","end":[8,9]}} \ No newline at end of file
+{"efVersion":"0.13.3","efModuleName":["Desugar"],"efExports":[{"TypeRef":[{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/Desugar.purs","end":[8,9]},"X",["X"]]},{"ValueRef":[{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/Desugar.purs","end":[8,9]},{"Ident":"test"}]}],"efImports":[{"eiModule":["Prim"],"eiImportType":{"Implicit":[]},"eiImportedAs":["Prim"]},{"eiModule":["Prim"],"eiImportType":{"Implicit":[]},"eiImportedAs":null}],"efFixities":[],"efTypeFixities":[],"efDeclarations":[{"EDType":{"edTypeName":"X","edTypeKind":{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"FunKind","contents":[{"annotation":[{"start":[3,16],"name":"/home/harry/code/purescript/tests/purs/docs/src/Desugar.purs","end":[3,17]},[]],"tag":"NamedKind","contents":[["Prim"],"Type"]},{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"FunKind","contents":[{"annotation":[{"start":[3,18],"name":"/home/harry/code/purescript/tests/purs/docs/src/Desugar.purs","end":[3,19]},[]],"tag":"NamedKind","contents":[["Prim"],"Type"]},{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"NamedKind","contents":[["Prim"],"Type"]}]}]},"edTypeDeclarationKind":{"DataType":{"args":[["a",{"annotation":[{"start":[3,16],"name":"/home/harry/code/purescript/tests/purs/docs/src/Desugar.purs","end":[3,17]},[]],"tag":"NamedKind","contents":[["Prim"],"Type"]}],["b",{"annotation":[{"start":[3,18],"name":"/home/harry/code/purescript/tests/purs/docs/src/Desugar.purs","end":[3,19]},[]],"tag":"NamedKind","contents":[["Prim"],"Type"]}]],"ctors":[["X",[{"annotation":[{"start":[3,16],"name":"/home/harry/code/purescript/tests/purs/docs/src/Desugar.purs","end":[3,17]},[]],"tag":"TypeVar","contents":"a"},{"annotation":[{"start":[3,18],"name":"/home/harry/code/purescript/tests/purs/docs/src/Desugar.purs","end":[3,19]},[]],"tag":"TypeVar","contents":"b"}]]]}}}},{"EDDataConstructor":{"edDataCtorName":"X","edDataCtorOrigin":"data","edDataCtorTypeCtor":"X","edDataCtorType":{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"ForAll","contents":["b",{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"ForAll","contents":["a",{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeConstructor","contents":[["Prim"],"Function"]},{"annotation":[{"start":[3,16],"name":"/home/harry/code/purescript/tests/purs/docs/src/Desugar.purs","end":[3,17]},[]],"tag":"TypeVar","contents":"a"}]},{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeConstructor","contents":[["Prim"],"Function"]},{"annotation":[{"start":[3,18],"name":"/home/harry/code/purescript/tests/purs/docs/src/Desugar.purs","end":[3,19]},[]],"tag":"TypeVar","contents":"b"}]},{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeConstructor","contents":[["Desugar"],"X"]},{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeVar","contents":"a"}]},{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeVar","contents":"b"}]}]}]},null]},null]},"edDataCtorFields":[{"Ident":"value0"},{"Ident":"value1"}]}},{"EDValue":{"edValueName":{"Ident":"test"},"edValueType":{"annotation":[{"start":[5,9],"name":"/home/harry/code/purescript/tests/purs/docs/src/Desugar.purs","end":[5,38]},[]],"tag":"ForAll","contents":["b",{"annotation":[{"start":[5,16],"name":"/home/harry/code/purescript/tests/purs/docs/src/Desugar.purs","end":[5,38]},[]],"tag":"ForAll","contents":["a",{"annotation":[{"start":[5,21],"name":"/home/harry/code/purescript/tests/purs/docs/src/Desugar.purs","end":[5,38]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[5,21],"name":"/home/harry/code/purescript/tests/purs/docs/src/Desugar.purs","end":[5,38]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[5,34],"name":"/home/harry/code/purescript/tests/purs/docs/src/Desugar.purs","end":[5,36]},[]],"tag":"TypeConstructor","contents":[["Prim"],"Function"]},{"annotation":[{"start":[5,21],"name":"/home/harry/code/purescript/tests/purs/docs/src/Desugar.purs","end":[5,33]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[5,21],"name":"/home/harry/code/purescript/tests/purs/docs/src/Desugar.purs","end":[5,31]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[5,21],"name":"/home/harry/code/purescript/tests/purs/docs/src/Desugar.purs","end":[5,22]},[]],"tag":"TypeConstructor","contents":[["Desugar"],"X"]},{"annotation":[{"start":[5,24],"name":"/home/harry/code/purescript/tests/purs/docs/src/Desugar.purs","end":[5,30]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[5,24],"name":"/home/harry/code/purescript/tests/purs/docs/src/Desugar.purs","end":[5,30]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[5,26],"name":"/home/harry/code/purescript/tests/purs/docs/src/Desugar.purs","end":[5,28]},[]],"tag":"TypeConstructor","contents":[["Prim"],"Function"]},{"annotation":[{"start":[5,24],"name":"/home/harry/code/purescript/tests/purs/docs/src/Desugar.purs","end":[5,25]},[]],"tag":"TypeVar","contents":"a"}]},{"annotation":[{"start":[5,29],"name":"/home/harry/code/purescript/tests/purs/docs/src/Desugar.purs","end":[5,30]},[]],"tag":"TypeVar","contents":"b"}]}]},{"annotation":[{"start":[5,32],"name":"/home/harry/code/purescript/tests/purs/docs/src/Desugar.purs","end":[5,33]},[]],"tag":"TypeVar","contents":"a"}]}]},{"annotation":[{"start":[5,37],"name":"/home/harry/code/purescript/tests/purs/docs/src/Desugar.purs","end":[5,38]},[]],"tag":"TypeVar","contents":"b"}]},0]},1]}}}],"efSourceSpan":{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/Desugar.purs","end":[8,9]}} \ No newline at end of file
diff --git a/tests/purs/docs/output/DocComments/externs.json b/tests/purs/docs/output/DocComments/externs.json
index be028c7..bfefbaf 100644
--- a/tests/purs/docs/output/DocComments/externs.json
+++ b/tests/purs/docs/output/DocComments/externs.json
@@ -1 +1 @@
-{"efVersion":"0.13.2","efModuleName":["DocComments"],"efExports":[{"ValueRef":[{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/DocComments.purs","end":[11,12]},{"Ident":"example"}]}],"efImports":[{"eiModule":["Prim"],"eiImportType":{"Implicit":[]},"eiImportedAs":["Prim"]},{"eiModule":["Prim"],"eiImportType":{"Implicit":[]},"eiImportedAs":null}],"efFixities":[],"efTypeFixities":[],"efDeclarations":[{"EDValue":{"edValueName":{"Ident":"example"},"edValueType":{"annotation":[{"start":[10,12],"name":"/home/harry/code/purescript/tests/purs/docs/src/DocComments.purs","end":[10,15]},[]],"tag":"TypeConstructor","contents":[["Prim"],"Int"]}}}],"efSourceSpan":{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/DocComments.purs","end":[11,12]}} \ No newline at end of file
+{"efVersion":"0.13.3","efModuleName":["DocComments"],"efExports":[{"ValueRef":[{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/DocComments.purs","end":[11,12]},{"Ident":"example"}]}],"efImports":[{"eiModule":["Prim"],"eiImportType":{"Implicit":[]},"eiImportedAs":["Prim"]},{"eiModule":["Prim"],"eiImportType":{"Implicit":[]},"eiImportedAs":null}],"efFixities":[],"efTypeFixities":[],"efDeclarations":[{"EDValue":{"edValueName":{"Ident":"example"},"edValueType":{"annotation":[{"start":[10,12],"name":"/home/harry/code/purescript/tests/purs/docs/src/DocComments.purs","end":[10,15]},[]],"tag":"TypeConstructor","contents":[["Prim"],"Int"]}}}],"efSourceSpan":{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/DocComments.purs","end":[11,12]}} \ No newline at end of file
diff --git a/tests/purs/docs/output/DocCommentsClassMethod/externs.json b/tests/purs/docs/output/DocCommentsClassMethod/externs.json
index 8f4d7a6..dd73354 100644
--- a/tests/purs/docs/output/DocCommentsClassMethod/externs.json
+++ b/tests/purs/docs/output/DocCommentsClassMethod/externs.json
@@ -1 +1 @@
-{"efVersion":"0.13.2","efModuleName":["DocCommentsClassMethod"],"efExports":[{"ValueRef":[{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/DocCommentsClassMethod.purs","end":[6,21]},{"Ident":"bar"}]},{"ValueRef":[{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/DocCommentsClassMethod.purs","end":[6,21]},{"Ident":"baz"}]},{"TypeClassRef":[{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/DocCommentsClassMethod.purs","end":[6,21]},"Foo"]}],"efImports":[{"eiModule":["Prim"],"eiImportType":{"Implicit":[]},"eiImportedAs":["Prim"]},{"eiModule":["Prim"],"eiImportType":{"Implicit":[]},"eiImportedAs":null}],"efFixities":[],"efTypeFixities":[],"efDeclarations":[{"EDValue":{"edValueName":{"Ident":"bar"},"edValueType":{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"ForAll","contents":["a",{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"ConstrainedType","contents":[{"constraintAnn":[{"start":[0,0],"name":"","end":[0,0]},[]],"constraintClass":[["DocCommentsClassMethod"],"Foo"],"constraintArgs":[{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeVar","contents":"a"}],"constraintData":null},{"annotation":[{"start":[5,10],"name":"/home/harry/code/purescript/tests/purs/docs/src/DocCommentsClassMethod.purs","end":[5,11]},[]],"tag":"TypeVar","contents":"a"}]},1]}}},{"EDValue":{"edValueName":{"Ident":"baz"},"edValueType":{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"ForAll","contents":["a",{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"ConstrainedType","contents":[{"constraintAnn":[{"start":[0,0],"name":"","end":[0,0]},[]],"constraintClass":[["DocCommentsClassMethod"],"Foo"],"constraintArgs":[{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeVar","contents":"a"}],"constraintData":null},{"annotation":[{"start":[6,10],"name":"/home/harry/code/purescript/tests/purs/docs/src/DocCommentsClassMethod.purs","end":[6,21]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[6,10],"name":"/home/harry/code/purescript/tests/purs/docs/src/DocCommentsClassMethod.purs","end":[6,21]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[6,17],"name":"/home/harry/code/purescript/tests/purs/docs/src/DocCommentsClassMethod.purs","end":[6,19]},[]],"tag":"TypeConstructor","contents":[["Prim"],"Function"]},{"annotation":[{"start":[6,10],"name":"/home/harry/code/purescript/tests/purs/docs/src/DocCommentsClassMethod.purs","end":[6,16]},[]],"tag":"TypeConstructor","contents":[["Prim"],"String"]}]},{"annotation":[{"start":[6,20],"name":"/home/harry/code/purescript/tests/purs/docs/src/DocCommentsClassMethod.purs","end":[6,21]},[]],"tag":"TypeVar","contents":"a"}]}]},0]}}},{"EDType":{"edTypeName":"Foo","edTypeKind":{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"FunKind","contents":[{"annotation":[{"start":[6,17],"name":"/home/harry/code/purescript/tests/purs/docs/src/DocCommentsClassMethod.purs","end":[6,19]},[]],"tag":"NamedKind","contents":[["Prim"],"Type"]},{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"NamedKind","contents":[["Prim"],"Type"]}]},"edTypeDeclarationKind":"TypeSynonym"}},{"EDTypeSynonym":{"edTypeSynonymName":"Foo","edTypeSynonymArguments":[["a",null]],"edTypeSynonymType":{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeConstructor","contents":[["Prim"],"Record"]},{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"RCons","contents":["bar",{"annotation":[{"start":[5,10],"name":"/home/harry/code/purescript/tests/purs/docs/src/DocCommentsClassMethod.purs","end":[5,11]},[]],"tag":"TypeVar","contents":"a"},{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"RCons","contents":["baz",{"annotation":[{"start":[6,10],"name":"/home/harry/code/purescript/tests/purs/docs/src/DocCommentsClassMethod.purs","end":[6,21]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[6,10],"name":"/home/harry/code/purescript/tests/purs/docs/src/DocCommentsClassMethod.purs","end":[6,21]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[6,17],"name":"/home/harry/code/purescript/tests/purs/docs/src/DocCommentsClassMethod.purs","end":[6,19]},[]],"tag":"TypeConstructor","contents":[["Prim"],"Function"]},{"annotation":[{"start":[6,10],"name":"/home/harry/code/purescript/tests/purs/docs/src/DocCommentsClassMethod.purs","end":[6,16]},[]],"tag":"TypeConstructor","contents":[["Prim"],"String"]}]},{"annotation":[{"start":[6,20],"name":"/home/harry/code/purescript/tests/purs/docs/src/DocCommentsClassMethod.purs","end":[6,21]},[]],"tag":"TypeVar","contents":"a"}]},{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"REmpty"}]}]}]}}},{"EDClass":{"edClassName":"Foo","edClassTypeArguments":[["a",null]],"edClassMembers":[[{"Ident":"bar"},{"annotation":[{"start":[5,10],"name":"/home/harry/code/purescript/tests/purs/docs/src/DocCommentsClassMethod.purs","end":[5,11]},[]],"tag":"TypeVar","contents":"a"}],[{"Ident":"baz"},{"annotation":[{"start":[6,10],"name":"/home/harry/code/purescript/tests/purs/docs/src/DocCommentsClassMethod.purs","end":[6,21]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[6,10],"name":"/home/harry/code/purescript/tests/purs/docs/src/DocCommentsClassMethod.purs","end":[6,21]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[6,17],"name":"/home/harry/code/purescript/tests/purs/docs/src/DocCommentsClassMethod.purs","end":[6,19]},[]],"tag":"TypeConstructor","contents":[["Prim"],"Function"]},{"annotation":[{"start":[6,10],"name":"/home/harry/code/purescript/tests/purs/docs/src/DocCommentsClassMethod.purs","end":[6,16]},[]],"tag":"TypeConstructor","contents":[["Prim"],"String"]}]},{"annotation":[{"start":[6,20],"name":"/home/harry/code/purescript/tests/purs/docs/src/DocCommentsClassMethod.purs","end":[6,21]},[]],"tag":"TypeVar","contents":"a"}]}]],"edClassConstraints":[],"edFunctionalDependencies":[],"edIsEmpty":false}}],"efSourceSpan":{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/DocCommentsClassMethod.purs","end":[6,21]}} \ No newline at end of file
+{"efVersion":"0.13.3","efModuleName":["DocCommentsClassMethod"],"efExports":[{"ValueRef":[{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/DocCommentsClassMethod.purs","end":[6,21]},{"Ident":"bar"}]},{"ValueRef":[{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/DocCommentsClassMethod.purs","end":[6,21]},{"Ident":"baz"}]},{"TypeClassRef":[{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/DocCommentsClassMethod.purs","end":[6,21]},"Foo"]}],"efImports":[{"eiModule":["Prim"],"eiImportType":{"Implicit":[]},"eiImportedAs":["Prim"]},{"eiModule":["Prim"],"eiImportType":{"Implicit":[]},"eiImportedAs":null}],"efFixities":[],"efTypeFixities":[],"efDeclarations":[{"EDValue":{"edValueName":{"Ident":"bar"},"edValueType":{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"ForAll","contents":["a",{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"ConstrainedType","contents":[{"constraintAnn":[{"start":[0,0],"name":"","end":[0,0]},[]],"constraintClass":[["DocCommentsClassMethod"],"Foo"],"constraintArgs":[{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeVar","contents":"a"}],"constraintData":null},{"annotation":[{"start":[5,10],"name":"/home/harry/code/purescript/tests/purs/docs/src/DocCommentsClassMethod.purs","end":[5,11]},[]],"tag":"TypeVar","contents":"a"}]},1]}}},{"EDValue":{"edValueName":{"Ident":"baz"},"edValueType":{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"ForAll","contents":["a",{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"ConstrainedType","contents":[{"constraintAnn":[{"start":[0,0],"name":"","end":[0,0]},[]],"constraintClass":[["DocCommentsClassMethod"],"Foo"],"constraintArgs":[{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeVar","contents":"a"}],"constraintData":null},{"annotation":[{"start":[6,10],"name":"/home/harry/code/purescript/tests/purs/docs/src/DocCommentsClassMethod.purs","end":[6,21]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[6,10],"name":"/home/harry/code/purescript/tests/purs/docs/src/DocCommentsClassMethod.purs","end":[6,21]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[6,17],"name":"/home/harry/code/purescript/tests/purs/docs/src/DocCommentsClassMethod.purs","end":[6,19]},[]],"tag":"TypeConstructor","contents":[["Prim"],"Function"]},{"annotation":[{"start":[6,10],"name":"/home/harry/code/purescript/tests/purs/docs/src/DocCommentsClassMethod.purs","end":[6,16]},[]],"tag":"TypeConstructor","contents":[["Prim"],"String"]}]},{"annotation":[{"start":[6,20],"name":"/home/harry/code/purescript/tests/purs/docs/src/DocCommentsClassMethod.purs","end":[6,21]},[]],"tag":"TypeVar","contents":"a"}]}]},0]}}},{"EDType":{"edTypeName":"Foo","edTypeKind":{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"FunKind","contents":[{"annotation":[{"start":[6,17],"name":"/home/harry/code/purescript/tests/purs/docs/src/DocCommentsClassMethod.purs","end":[6,19]},[]],"tag":"NamedKind","contents":[["Prim"],"Type"]},{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"NamedKind","contents":[["Prim"],"Type"]}]},"edTypeDeclarationKind":"TypeSynonym"}},{"EDTypeSynonym":{"edTypeSynonymName":"Foo","edTypeSynonymArguments":[["a",null]],"edTypeSynonymType":{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeConstructor","contents":[["Prim"],"Record"]},{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"RCons","contents":["bar",{"annotation":[{"start":[5,10],"name":"/home/harry/code/purescript/tests/purs/docs/src/DocCommentsClassMethod.purs","end":[5,11]},[]],"tag":"TypeVar","contents":"a"},{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"RCons","contents":["baz",{"annotation":[{"start":[6,10],"name":"/home/harry/code/purescript/tests/purs/docs/src/DocCommentsClassMethod.purs","end":[6,21]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[6,10],"name":"/home/harry/code/purescript/tests/purs/docs/src/DocCommentsClassMethod.purs","end":[6,21]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[6,17],"name":"/home/harry/code/purescript/tests/purs/docs/src/DocCommentsClassMethod.purs","end":[6,19]},[]],"tag":"TypeConstructor","contents":[["Prim"],"Function"]},{"annotation":[{"start":[6,10],"name":"/home/harry/code/purescript/tests/purs/docs/src/DocCommentsClassMethod.purs","end":[6,16]},[]],"tag":"TypeConstructor","contents":[["Prim"],"String"]}]},{"annotation":[{"start":[6,20],"name":"/home/harry/code/purescript/tests/purs/docs/src/DocCommentsClassMethod.purs","end":[6,21]},[]],"tag":"TypeVar","contents":"a"}]},{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"REmpty"}]}]}]}}},{"EDClass":{"edClassName":"Foo","edClassTypeArguments":[["a",null]],"edClassMembers":[[{"Ident":"bar"},{"annotation":[{"start":[5,10],"name":"/home/harry/code/purescript/tests/purs/docs/src/DocCommentsClassMethod.purs","end":[5,11]},[]],"tag":"TypeVar","contents":"a"}],[{"Ident":"baz"},{"annotation":[{"start":[6,10],"name":"/home/harry/code/purescript/tests/purs/docs/src/DocCommentsClassMethod.purs","end":[6,21]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[6,10],"name":"/home/harry/code/purescript/tests/purs/docs/src/DocCommentsClassMethod.purs","end":[6,21]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[6,17],"name":"/home/harry/code/purescript/tests/purs/docs/src/DocCommentsClassMethod.purs","end":[6,19]},[]],"tag":"TypeConstructor","contents":[["Prim"],"Function"]},{"annotation":[{"start":[6,10],"name":"/home/harry/code/purescript/tests/purs/docs/src/DocCommentsClassMethod.purs","end":[6,16]},[]],"tag":"TypeConstructor","contents":[["Prim"],"String"]}]},{"annotation":[{"start":[6,20],"name":"/home/harry/code/purescript/tests/purs/docs/src/DocCommentsClassMethod.purs","end":[6,21]},[]],"tag":"TypeVar","contents":"a"}]}]],"edClassConstraints":[],"edFunctionalDependencies":[],"edIsEmpty":false}}],"efSourceSpan":{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/DocCommentsClassMethod.purs","end":[6,21]}} \ No newline at end of file
diff --git a/tests/purs/docs/output/DocCommentsDataConstructor/externs.json b/tests/purs/docs/output/DocCommentsDataConstructor/externs.json
index e81feea..fbe8033 100644
--- a/tests/purs/docs/output/DocCommentsDataConstructor/externs.json
+++ b/tests/purs/docs/output/DocCommentsDataConstructor/externs.json
@@ -1 +1 @@
-{"efVersion":"0.13.2","efModuleName":["DocCommentsDataConstructor"],"efExports":[{"TypeRef":[{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/DocCommentsDataConstructor.purs","end":[15,40]},"Foo",["Bar","Baz"]]},{"TypeRef":[{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/DocCommentsDataConstructor.purs","end":[15,40]},"ComplexFoo",["ComplexBar","ComplexBaz"]]},{"TypeRef":[{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/DocCommentsDataConstructor.purs","end":[15,40]},"NewtypeFoo",["NewtypeFoo"]]}],"efImports":[{"eiModule":["Prim"],"eiImportType":{"Implicit":[]},"eiImportedAs":["Prim"]},{"eiModule":["Prim"],"eiImportType":{"Implicit":[]},"eiImportedAs":null}],"efFixities":[],"efTypeFixities":[],"efDeclarations":[{"EDType":{"edTypeName":"Foo","edTypeKind":{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"NamedKind","contents":[["Prim"],"Type"]},"edTypeDeclarationKind":{"DataType":{"args":[],"ctors":[["Bar",[]],["Baz",[]]]}}}},{"EDDataConstructor":{"edDataCtorName":"Bar","edDataCtorOrigin":"data","edDataCtorTypeCtor":"Foo","edDataCtorType":{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeConstructor","contents":[["DocCommentsDataConstructor"],"Foo"]},"edDataCtorFields":[]}},{"EDDataConstructor":{"edDataCtorName":"Baz","edDataCtorOrigin":"data","edDataCtorTypeCtor":"Foo","edDataCtorType":{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeConstructor","contents":[["DocCommentsDataConstructor"],"Foo"]},"edDataCtorFields":[]}},{"EDType":{"edTypeName":"ComplexFoo","edTypeKind":{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"FunKind","contents":[{"annotation":[{"start":[9,16],"name":"/home/harry/code/purescript/tests/purs/docs/src/DocCommentsDataConstructor.purs","end":[9,17]},[]],"tag":"NamedKind","contents":[["Prim"],"Type"]},{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"FunKind","contents":[{"annotation":[{"start":[11,18],"name":"/home/harry/code/purescript/tests/purs/docs/src/DocCommentsDataConstructor.purs","end":[11,19]},[]],"tag":"NamedKind","contents":[["Prim"],"Type"]},{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"NamedKind","contents":[["Prim"],"Type"]}]}]},"edTypeDeclarationKind":{"DataType":{"args":[["a",{"annotation":[{"start":[9,16],"name":"/home/harry/code/purescript/tests/purs/docs/src/DocCommentsDataConstructor.purs","end":[9,17]},[]],"tag":"NamedKind","contents":[["Prim"],"Type"]}],["b",{"annotation":[{"start":[11,18],"name":"/home/harry/code/purescript/tests/purs/docs/src/DocCommentsDataConstructor.purs","end":[11,19]},[]],"tag":"NamedKind","contents":[["Prim"],"Type"]}]],"ctors":[["ComplexBar",[{"annotation":[{"start":[9,16],"name":"/home/harry/code/purescript/tests/purs/docs/src/DocCommentsDataConstructor.purs","end":[9,17]},[]],"tag":"TypeVar","contents":"a"}]],["ComplexBaz",[{"annotation":[{"start":[11,16],"name":"/home/harry/code/purescript/tests/purs/docs/src/DocCommentsDataConstructor.purs","end":[11,17]},[]],"tag":"TypeVar","contents":"a"},{"annotation":[{"start":[11,18],"name":"/home/harry/code/purescript/tests/purs/docs/src/DocCommentsDataConstructor.purs","end":[11,19]},[]],"tag":"TypeVar","contents":"b"}]]]}}}},{"EDDataConstructor":{"edDataCtorName":"ComplexBar","edDataCtorOrigin":"data","edDataCtorTypeCtor":"ComplexFoo","edDataCtorType":{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"ForAll","contents":["b",{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"ForAll","contents":["a",{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeConstructor","contents":[["Prim"],"Function"]},{"annotation":[{"start":[9,16],"name":"/home/harry/code/purescript/tests/purs/docs/src/DocCommentsDataConstructor.purs","end":[9,17]},[]],"tag":"TypeVar","contents":"a"}]},{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeConstructor","contents":[["DocCommentsDataConstructor"],"ComplexFoo"]},{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeVar","contents":"a"}]},{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeVar","contents":"b"}]}]},null]},null]},"edDataCtorFields":[{"Ident":"value0"}]}},{"EDDataConstructor":{"edDataCtorName":"ComplexBaz","edDataCtorOrigin":"data","edDataCtorTypeCtor":"ComplexFoo","edDataCtorType":{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"ForAll","contents":["b",{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"ForAll","contents":["a",{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeConstructor","contents":[["Prim"],"Function"]},{"annotation":[{"start":[11,16],"name":"/home/harry/code/purescript/tests/purs/docs/src/DocCommentsDataConstructor.purs","end":[11,17]},[]],"tag":"TypeVar","contents":"a"}]},{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeConstructor","contents":[["Prim"],"Function"]},{"annotation":[{"start":[11,18],"name":"/home/harry/code/purescript/tests/purs/docs/src/DocCommentsDataConstructor.purs","end":[11,19]},[]],"tag":"TypeVar","contents":"b"}]},{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeConstructor","contents":[["DocCommentsDataConstructor"],"ComplexFoo"]},{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeVar","contents":"a"}]},{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeVar","contents":"b"}]}]}]},null]},null]},"edDataCtorFields":[{"Ident":"value0"},{"Ident":"value1"}]}},{"EDType":{"edTypeName":"NewtypeFoo","edTypeKind":{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"NamedKind","contents":[["Prim"],"Type"]},"edTypeDeclarationKind":{"DataType":{"args":[],"ctors":[["NewtypeFoo",[{"annotation":[{"start":[15,16],"name":"/home/harry/code/purescript/tests/purs/docs/src/DocCommentsDataConstructor.purs","end":[15,40]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[15,16],"name":"/home/harry/code/purescript/tests/purs/docs/src/DocCommentsDataConstructor.purs","end":[15,17]},[]],"tag":"TypeConstructor","contents":[["Prim"],"Record"]},{"annotation":[{"start":[15,18],"name":"/home/harry/code/purescript/tests/purs/docs/src/DocCommentsDataConstructor.purs","end":[15,38]},[]],"tag":"RCons","contents":["newtypeBar",{"annotation":[{"start":[15,32],"name":"/home/harry/code/purescript/tests/purs/docs/src/DocCommentsDataConstructor.purs","end":[15,38]},[]],"tag":"TypeConstructor","contents":[["Prim"],"String"]},{"annotation":[{"start":[15,39],"name":"/home/harry/code/purescript/tests/purs/docs/src/DocCommentsDataConstructor.purs","end":[15,40]},[]],"tag":"REmpty"}]}]}]]]}}}},{"EDDataConstructor":{"edDataCtorName":"NewtypeFoo","edDataCtorOrigin":"newtype","edDataCtorTypeCtor":"NewtypeFoo","edDataCtorType":{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeConstructor","contents":[["Prim"],"Function"]},{"annotation":[{"start":[15,16],"name":"/home/harry/code/purescript/tests/purs/docs/src/DocCommentsDataConstructor.purs","end":[15,40]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[15,16],"name":"/home/harry/code/purescript/tests/purs/docs/src/DocCommentsDataConstructor.purs","end":[15,17]},[]],"tag":"TypeConstructor","contents":[["Prim"],"Record"]},{"annotation":[{"start":[15,18],"name":"/home/harry/code/purescript/tests/purs/docs/src/DocCommentsDataConstructor.purs","end":[15,38]},[]],"tag":"RCons","contents":["newtypeBar",{"annotation":[{"start":[15,32],"name":"/home/harry/code/purescript/tests/purs/docs/src/DocCommentsDataConstructor.purs","end":[15,38]},[]],"tag":"TypeConstructor","contents":[["Prim"],"String"]},{"annotation":[{"start":[15,39],"name":"/home/harry/code/purescript/tests/purs/docs/src/DocCommentsDataConstructor.purs","end":[15,40]},[]],"tag":"REmpty"}]}]}]},{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeConstructor","contents":[["DocCommentsDataConstructor"],"NewtypeFoo"]}]},"edDataCtorFields":[{"Ident":"value0"}]}}],"efSourceSpan":{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/DocCommentsDataConstructor.purs","end":[15,40]}} \ No newline at end of file
+{"efVersion":"0.13.3","efModuleName":["DocCommentsDataConstructor"],"efExports":[{"TypeRef":[{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/DocCommentsDataConstructor.purs","end":[15,40]},"Foo",["Bar","Baz"]]},{"TypeRef":[{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/DocCommentsDataConstructor.purs","end":[15,40]},"ComplexFoo",["ComplexBar","ComplexBaz"]]},{"TypeRef":[{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/DocCommentsDataConstructor.purs","end":[15,40]},"NewtypeFoo",["NewtypeFoo"]]}],"efImports":[{"eiModule":["Prim"],"eiImportType":{"Implicit":[]},"eiImportedAs":["Prim"]},{"eiModule":["Prim"],"eiImportType":{"Implicit":[]},"eiImportedAs":null}],"efFixities":[],"efTypeFixities":[],"efDeclarations":[{"EDType":{"edTypeName":"Foo","edTypeKind":{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"NamedKind","contents":[["Prim"],"Type"]},"edTypeDeclarationKind":{"DataType":{"args":[],"ctors":[["Bar",[]],["Baz",[]]]}}}},{"EDDataConstructor":{"edDataCtorName":"Bar","edDataCtorOrigin":"data","edDataCtorTypeCtor":"Foo","edDataCtorType":{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeConstructor","contents":[["DocCommentsDataConstructor"],"Foo"]},"edDataCtorFields":[]}},{"EDDataConstructor":{"edDataCtorName":"Baz","edDataCtorOrigin":"data","edDataCtorTypeCtor":"Foo","edDataCtorType":{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeConstructor","contents":[["DocCommentsDataConstructor"],"Foo"]},"edDataCtorFields":[]}},{"EDType":{"edTypeName":"ComplexFoo","edTypeKind":{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"FunKind","contents":[{"annotation":[{"start":[9,16],"name":"/home/harry/code/purescript/tests/purs/docs/src/DocCommentsDataConstructor.purs","end":[9,17]},[]],"tag":"NamedKind","contents":[["Prim"],"Type"]},{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"FunKind","contents":[{"annotation":[{"start":[11,18],"name":"/home/harry/code/purescript/tests/purs/docs/src/DocCommentsDataConstructor.purs","end":[11,19]},[]],"tag":"NamedKind","contents":[["Prim"],"Type"]},{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"NamedKind","contents":[["Prim"],"Type"]}]}]},"edTypeDeclarationKind":{"DataType":{"args":[["a",{"annotation":[{"start":[9,16],"name":"/home/harry/code/purescript/tests/purs/docs/src/DocCommentsDataConstructor.purs","end":[9,17]},[]],"tag":"NamedKind","contents":[["Prim"],"Type"]}],["b",{"annotation":[{"start":[11,18],"name":"/home/harry/code/purescript/tests/purs/docs/src/DocCommentsDataConstructor.purs","end":[11,19]},[]],"tag":"NamedKind","contents":[["Prim"],"Type"]}]],"ctors":[["ComplexBar",[{"annotation":[{"start":[9,16],"name":"/home/harry/code/purescript/tests/purs/docs/src/DocCommentsDataConstructor.purs","end":[9,17]},[]],"tag":"TypeVar","contents":"a"}]],["ComplexBaz",[{"annotation":[{"start":[11,16],"name":"/home/harry/code/purescript/tests/purs/docs/src/DocCommentsDataConstructor.purs","end":[11,17]},[]],"tag":"TypeVar","contents":"a"},{"annotation":[{"start":[11,18],"name":"/home/harry/code/purescript/tests/purs/docs/src/DocCommentsDataConstructor.purs","end":[11,19]},[]],"tag":"TypeVar","contents":"b"}]]]}}}},{"EDDataConstructor":{"edDataCtorName":"ComplexBar","edDataCtorOrigin":"data","edDataCtorTypeCtor":"ComplexFoo","edDataCtorType":{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"ForAll","contents":["b",{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"ForAll","contents":["a",{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeConstructor","contents":[["Prim"],"Function"]},{"annotation":[{"start":[9,16],"name":"/home/harry/code/purescript/tests/purs/docs/src/DocCommentsDataConstructor.purs","end":[9,17]},[]],"tag":"TypeVar","contents":"a"}]},{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeConstructor","contents":[["DocCommentsDataConstructor"],"ComplexFoo"]},{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeVar","contents":"a"}]},{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeVar","contents":"b"}]}]},null]},null]},"edDataCtorFields":[{"Ident":"value0"}]}},{"EDDataConstructor":{"edDataCtorName":"ComplexBaz","edDataCtorOrigin":"data","edDataCtorTypeCtor":"ComplexFoo","edDataCtorType":{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"ForAll","contents":["b",{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"ForAll","contents":["a",{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeConstructor","contents":[["Prim"],"Function"]},{"annotation":[{"start":[11,16],"name":"/home/harry/code/purescript/tests/purs/docs/src/DocCommentsDataConstructor.purs","end":[11,17]},[]],"tag":"TypeVar","contents":"a"}]},{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeConstructor","contents":[["Prim"],"Function"]},{"annotation":[{"start":[11,18],"name":"/home/harry/code/purescript/tests/purs/docs/src/DocCommentsDataConstructor.purs","end":[11,19]},[]],"tag":"TypeVar","contents":"b"}]},{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeConstructor","contents":[["DocCommentsDataConstructor"],"ComplexFoo"]},{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeVar","contents":"a"}]},{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeVar","contents":"b"}]}]}]},null]},null]},"edDataCtorFields":[{"Ident":"value0"},{"Ident":"value1"}]}},{"EDType":{"edTypeName":"NewtypeFoo","edTypeKind":{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"NamedKind","contents":[["Prim"],"Type"]},"edTypeDeclarationKind":{"DataType":{"args":[],"ctors":[["NewtypeFoo",[{"annotation":[{"start":[15,16],"name":"/home/harry/code/purescript/tests/purs/docs/src/DocCommentsDataConstructor.purs","end":[15,40]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[15,16],"name":"/home/harry/code/purescript/tests/purs/docs/src/DocCommentsDataConstructor.purs","end":[15,17]},[]],"tag":"TypeConstructor","contents":[["Prim"],"Record"]},{"annotation":[{"start":[15,18],"name":"/home/harry/code/purescript/tests/purs/docs/src/DocCommentsDataConstructor.purs","end":[15,38]},[]],"tag":"RCons","contents":["newtypeBar",{"annotation":[{"start":[15,32],"name":"/home/harry/code/purescript/tests/purs/docs/src/DocCommentsDataConstructor.purs","end":[15,38]},[]],"tag":"TypeConstructor","contents":[["Prim"],"String"]},{"annotation":[{"start":[15,39],"name":"/home/harry/code/purescript/tests/purs/docs/src/DocCommentsDataConstructor.purs","end":[15,40]},[]],"tag":"REmpty"}]}]}]]]}}}},{"EDDataConstructor":{"edDataCtorName":"NewtypeFoo","edDataCtorOrigin":"newtype","edDataCtorTypeCtor":"NewtypeFoo","edDataCtorType":{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeConstructor","contents":[["Prim"],"Function"]},{"annotation":[{"start":[15,16],"name":"/home/harry/code/purescript/tests/purs/docs/src/DocCommentsDataConstructor.purs","end":[15,40]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[15,16],"name":"/home/harry/code/purescript/tests/purs/docs/src/DocCommentsDataConstructor.purs","end":[15,17]},[]],"tag":"TypeConstructor","contents":[["Prim"],"Record"]},{"annotation":[{"start":[15,18],"name":"/home/harry/code/purescript/tests/purs/docs/src/DocCommentsDataConstructor.purs","end":[15,38]},[]],"tag":"RCons","contents":["newtypeBar",{"annotation":[{"start":[15,32],"name":"/home/harry/code/purescript/tests/purs/docs/src/DocCommentsDataConstructor.purs","end":[15,38]},[]],"tag":"TypeConstructor","contents":[["Prim"],"String"]},{"annotation":[{"start":[15,39],"name":"/home/harry/code/purescript/tests/purs/docs/src/DocCommentsDataConstructor.purs","end":[15,40]},[]],"tag":"REmpty"}]}]}]},{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeConstructor","contents":[["DocCommentsDataConstructor"],"NewtypeFoo"]}]},"edDataCtorFields":[{"Ident":"value0"}]}}],"efSourceSpan":{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/DocCommentsDataConstructor.purs","end":[15,40]}} \ No newline at end of file
diff --git a/tests/purs/docs/output/DuplicateNames/externs.json b/tests/purs/docs/output/DuplicateNames/externs.json
index 4c946da..14dda7d 100644
--- a/tests/purs/docs/output/DuplicateNames/externs.json
+++ b/tests/purs/docs/output/DuplicateNames/externs.json
@@ -1 +1 @@
-{"efVersion":"0.13.2","efModuleName":["DuplicateNames"],"efExports":[{"ReExportRef":[{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/DuplicateNames.purs","end":[9,9]},{"exportSourceImportedFrom":["Prelude"],"exportSourceDefinedIn":["Prelude"]},{"TypeRef":[{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/DuplicateNames.purs","end":[9,9]},"Unit",[]]}]},{"ValueRef":[{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/DuplicateNames.purs","end":[9,9]},{"Ident":"unit"}]},{"ModuleRef":[{"start":[2,5],"name":"/home/harry/code/purescript/tests/purs/docs/src/DuplicateNames.purs","end":[2,26]},["DuplicateNames"]]},{"ModuleRef":[{"start":[3,5],"name":"/home/harry/code/purescript/tests/purs/docs/src/DuplicateNames.purs","end":[3,19]},["Prelude"]]}],"efImports":[{"eiModule":["Prim"],"eiImportType":{"Implicit":[]},"eiImportedAs":["Prim"]},{"eiModule":["Prim"],"eiImportType":{"Implicit":[]},"eiImportedAs":null},{"eiModule":["Prelude"],"eiImportType":{"Explicit":[{"TypeRef":[{"start":[6,17],"name":"/home/harry/code/purescript/tests/purs/docs/src/DuplicateNames.purs","end":[6,21]},"Unit",[]]}]},"eiImportedAs":null}],"efFixities":[],"efTypeFixities":[],"efDeclarations":[{"EDValue":{"edValueName":{"Ident":"unit"},"edValueType":{"annotation":[{"start":[8,9],"name":"/home/harry/code/purescript/tests/purs/docs/src/DuplicateNames.purs","end":[8,12]},[]],"tag":"TypeConstructor","contents":[["Prim"],"Int"]}}}],"efSourceSpan":{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/DuplicateNames.purs","end":[9,9]}} \ No newline at end of file
+{"efVersion":"0.13.3","efModuleName":["DuplicateNames"],"efExports":[{"ReExportRef":[{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/DuplicateNames.purs","end":[9,9]},{"exportSourceImportedFrom":["Prelude"],"exportSourceDefinedIn":["Prelude"]},{"TypeRef":[{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/DuplicateNames.purs","end":[9,9]},"Unit",[]]}]},{"ValueRef":[{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/DuplicateNames.purs","end":[9,9]},{"Ident":"unit"}]},{"ModuleRef":[{"start":[2,5],"name":"/home/harry/code/purescript/tests/purs/docs/src/DuplicateNames.purs","end":[2,26]},["DuplicateNames"]]},{"ModuleRef":[{"start":[3,5],"name":"/home/harry/code/purescript/tests/purs/docs/src/DuplicateNames.purs","end":[3,19]},["Prelude"]]}],"efImports":[{"eiModule":["Prim"],"eiImportType":{"Implicit":[]},"eiImportedAs":["Prim"]},{"eiModule":["Prim"],"eiImportType":{"Implicit":[]},"eiImportedAs":null},{"eiModule":["Prelude"],"eiImportType":{"Explicit":[{"TypeRef":[{"start":[6,17],"name":"/home/harry/code/purescript/tests/purs/docs/src/DuplicateNames.purs","end":[6,21]},"Unit",[]]}]},"eiImportedAs":null}],"efFixities":[],"efTypeFixities":[],"efDeclarations":[{"EDValue":{"edValueName":{"Ident":"unit"},"edValueType":{"annotation":[{"start":[8,9],"name":"/home/harry/code/purescript/tests/purs/docs/src/DuplicateNames.purs","end":[8,12]},[]],"tag":"TypeConstructor","contents":[["Prim"],"Int"]}}}],"efSourceSpan":{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/DuplicateNames.purs","end":[9,9]}} \ No newline at end of file
diff --git a/tests/purs/docs/output/Example/externs.json b/tests/purs/docs/output/Example/externs.json
index 1cc9945..9fa8142 100644
--- a/tests/purs/docs/output/Example/externs.json
+++ b/tests/purs/docs/output/Example/externs.json
@@ -1 +1 @@
-{"efVersion":"0.13.2","efModuleName":["Example"],"efExports":[{"ReExportRef":[{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/Example.purs","end":[7,22]},{"exportSourceImportedFrom":["Prelude"],"exportSourceDefinedIn":["Prelude"]},{"TypeRef":[{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/Example.purs","end":[7,22]},"Unit",[]]}]},{"ReExportRef":[{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/Example.purs","end":[7,22]},{"exportSourceImportedFrom":["Example2"],"exportSourceDefinedIn":["Example2"]},{"ValueRef":[{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/Example.purs","end":[7,22]},{"Ident":"one"}]}]},{"ModuleRef":[{"start":[2,5],"name":"/home/harry/code/purescript/tests/purs/docs/src/Example.purs","end":[2,19]},["Prelude"]]},{"ModuleRef":[{"start":[3,5],"name":"/home/harry/code/purescript/tests/purs/docs/src/Example.purs","end":[3,20]},["Example2"]]}],"efImports":[{"eiModule":["Prim"],"eiImportType":{"Implicit":[]},"eiImportedAs":["Prim"]},{"eiModule":["Prim"],"eiImportType":{"Implicit":[]},"eiImportedAs":null},{"eiModule":["Prelude"],"eiImportType":{"Explicit":[{"TypeRef":[{"start":[6,17],"name":"/home/harry/code/purescript/tests/purs/docs/src/Example.purs","end":[6,23]},"Unit",[]]}]},"eiImportedAs":null},{"eiModule":["Example2"],"eiImportType":{"Explicit":[{"ValueRef":[{"start":[7,18],"name":"/home/harry/code/purescript/tests/purs/docs/src/Example.purs","end":[7,21]},{"Ident":"one"}]}]},"eiImportedAs":null}],"efFixities":[],"efTypeFixities":[],"efDeclarations":[],"efSourceSpan":{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/Example.purs","end":[7,22]}} \ No newline at end of file
+{"efVersion":"0.13.3","efModuleName":["Example"],"efExports":[{"ReExportRef":[{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/Example.purs","end":[7,22]},{"exportSourceImportedFrom":["Prelude"],"exportSourceDefinedIn":["Prelude"]},{"TypeRef":[{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/Example.purs","end":[7,22]},"Unit",[]]}]},{"ReExportRef":[{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/Example.purs","end":[7,22]},{"exportSourceImportedFrom":["Example2"],"exportSourceDefinedIn":["Example2"]},{"ValueRef":[{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/Example.purs","end":[7,22]},{"Ident":"one"}]}]},{"ModuleRef":[{"start":[2,5],"name":"/home/harry/code/purescript/tests/purs/docs/src/Example.purs","end":[2,19]},["Prelude"]]},{"ModuleRef":[{"start":[3,5],"name":"/home/harry/code/purescript/tests/purs/docs/src/Example.purs","end":[3,20]},["Example2"]]}],"efImports":[{"eiModule":["Prim"],"eiImportType":{"Implicit":[]},"eiImportedAs":["Prim"]},{"eiModule":["Prim"],"eiImportType":{"Implicit":[]},"eiImportedAs":null},{"eiModule":["Prelude"],"eiImportType":{"Explicit":[{"TypeRef":[{"start":[6,17],"name":"/home/harry/code/purescript/tests/purs/docs/src/Example.purs","end":[6,23]},"Unit",[]]}]},"eiImportedAs":null},{"eiModule":["Example2"],"eiImportType":{"Explicit":[{"ValueRef":[{"start":[7,18],"name":"/home/harry/code/purescript/tests/purs/docs/src/Example.purs","end":[7,21]},{"Ident":"one"}]}]},"eiImportedAs":null}],"efFixities":[],"efTypeFixities":[],"efDeclarations":[],"efSourceSpan":{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/Example.purs","end":[7,22]}} \ No newline at end of file
diff --git a/tests/purs/docs/output/Example2/externs.json b/tests/purs/docs/output/Example2/externs.json
index 162fa6d..b34d742 100644
--- a/tests/purs/docs/output/Example2/externs.json
+++ b/tests/purs/docs/output/Example2/externs.json
@@ -1 +1 @@
-{"efVersion":"0.13.2","efModuleName":["Example2"],"efExports":[{"ValueRef":[{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/Example2.purs","end":[7,8]},{"Ident":"one"}]},{"ValueRef":[{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/Example2.purs","end":[7,8]},{"Ident":"two"}]}],"efImports":[{"eiModule":["Prim"],"eiImportType":{"Implicit":[]},"eiImportedAs":["Prim"]},{"eiModule":["Prim"],"eiImportType":{"Implicit":[]},"eiImportedAs":null}],"efFixities":[],"efTypeFixities":[],"efDeclarations":[{"EDValue":{"edValueName":{"Ident":"one"},"edValueType":{"annotation":[{"start":[3,8],"name":"/home/harry/code/purescript/tests/purs/docs/src/Example2.purs","end":[3,11]},[]],"tag":"TypeConstructor","contents":[["Prim"],"Int"]}}},{"EDValue":{"edValueName":{"Ident":"two"},"edValueType":{"annotation":[{"start":[6,8],"name":"/home/harry/code/purescript/tests/purs/docs/src/Example2.purs","end":[6,11]},[]],"tag":"TypeConstructor","contents":[["Prim"],"Int"]}}}],"efSourceSpan":{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/Example2.purs","end":[7,8]}} \ No newline at end of file
+{"efVersion":"0.13.3","efModuleName":["Example2"],"efExports":[{"ValueRef":[{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/Example2.purs","end":[7,8]},{"Ident":"one"}]},{"ValueRef":[{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/Example2.purs","end":[7,8]},{"Ident":"two"}]}],"efImports":[{"eiModule":["Prim"],"eiImportType":{"Implicit":[]},"eiImportedAs":["Prim"]},{"eiModule":["Prim"],"eiImportType":{"Implicit":[]},"eiImportedAs":null}],"efFixities":[],"efTypeFixities":[],"efDeclarations":[{"EDValue":{"edValueName":{"Ident":"one"},"edValueType":{"annotation":[{"start":[3,8],"name":"/home/harry/code/purescript/tests/purs/docs/src/Example2.purs","end":[3,11]},[]],"tag":"TypeConstructor","contents":[["Prim"],"Int"]}}},{"EDValue":{"edValueName":{"Ident":"two"},"edValueType":{"annotation":[{"start":[6,8],"name":"/home/harry/code/purescript/tests/purs/docs/src/Example2.purs","end":[6,11]},[]],"tag":"TypeConstructor","contents":[["Prim"],"Int"]}}}],"efSourceSpan":{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/Example2.purs","end":[7,8]}} \ No newline at end of file
diff --git a/tests/purs/docs/output/ExplicitExport/externs.json b/tests/purs/docs/output/ExplicitExport/externs.json
index 7c14b46..3a8c3e7 100644
--- a/tests/purs/docs/output/ExplicitExport/externs.json
+++ b/tests/purs/docs/output/ExplicitExport/externs.json
@@ -1 +1 @@
-{"efVersion":"0.13.2","efModuleName":["ExplicitExport"],"efExports":[{"ValueRef":[{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/ExplicitExport.purs","end":[7,8]},{"Ident":"one"}]}],"efImports":[{"eiModule":["Prim"],"eiImportType":{"Implicit":[]},"eiImportedAs":["Prim"]},{"eiModule":["Prim"],"eiImportType":{"Implicit":[]},"eiImportedAs":null}],"efFixities":[],"efTypeFixities":[],"efDeclarations":[{"EDValue":{"edValueName":{"Ident":"one"},"edValueType":{"annotation":[{"start":[3,8],"name":"/home/harry/code/purescript/tests/purs/docs/src/ExplicitExport.purs","end":[3,11]},[]],"tag":"TypeConstructor","contents":[["Prim"],"Int"]}}}],"efSourceSpan":{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/ExplicitExport.purs","end":[7,8]}} \ No newline at end of file
+{"efVersion":"0.13.3","efModuleName":["ExplicitExport"],"efExports":[{"ValueRef":[{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/ExplicitExport.purs","end":[7,8]},{"Ident":"one"}]}],"efImports":[{"eiModule":["Prim"],"eiImportType":{"Implicit":[]},"eiImportedAs":["Prim"]},{"eiModule":["Prim"],"eiImportType":{"Implicit":[]},"eiImportedAs":null}],"efFixities":[],"efTypeFixities":[],"efDeclarations":[{"EDValue":{"edValueName":{"Ident":"one"},"edValueType":{"annotation":[{"start":[3,8],"name":"/home/harry/code/purescript/tests/purs/docs/src/ExplicitExport.purs","end":[3,11]},[]],"tag":"TypeConstructor","contents":[["Prim"],"Int"]}}}],"efSourceSpan":{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/ExplicitExport.purs","end":[7,8]}} \ No newline at end of file
diff --git a/tests/purs/docs/output/ExplicitTypeSignatures/externs.json b/tests/purs/docs/output/ExplicitTypeSignatures/externs.json
index a024055..12d61ff 100644
--- a/tests/purs/docs/output/ExplicitTypeSignatures/externs.json
+++ b/tests/purs/docs/output/ExplicitTypeSignatures/externs.json
@@ -1 +1 @@
-{"efVersion":"0.13.2","efModuleName":["ExplicitTypeSignatures"],"efExports":[{"ValueRef":[{"start":[2,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/ExplicitTypeSignatures.purs","end":[16,14]},{"Ident":"explicit"}]},{"ValueRef":[{"start":[2,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/ExplicitTypeSignatures.purs","end":[16,14]},{"Ident":"anInt"}]},{"ValueRef":[{"start":[2,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/ExplicitTypeSignatures.purs","end":[16,14]},{"Ident":"aNumber"}]}],"efImports":[{"eiModule":["Prim"],"eiImportType":{"Implicit":[]},"eiImportedAs":["Prim"]},{"eiModule":["Prim"],"eiImportType":{"Implicit":[]},"eiImportedAs":null}],"efFixities":[],"efTypeFixities":[],"efDeclarations":[{"EDValue":{"edValueName":{"Ident":"explicit"},"edValueType":{"annotation":[{"start":[6,13],"name":"/home/harry/code/purescript/tests/purs/docs/src/ExplicitTypeSignatures.purs","end":[6,53]},[]],"tag":"ForAll","contents":["something",{"annotation":[{"start":[6,31],"name":"/home/harry/code/purescript/tests/purs/docs/src/ExplicitTypeSignatures.purs","end":[6,53]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[6,31],"name":"/home/harry/code/purescript/tests/purs/docs/src/ExplicitTypeSignatures.purs","end":[6,53]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[6,41],"name":"/home/harry/code/purescript/tests/purs/docs/src/ExplicitTypeSignatures.purs","end":[6,43]},[]],"tag":"TypeConstructor","contents":[["Prim"],"Function"]},{"annotation":[{"start":[6,31],"name":"/home/harry/code/purescript/tests/purs/docs/src/ExplicitTypeSignatures.purs","end":[6,40]},[]],"tag":"TypeVar","contents":"something"}]},{"annotation":[{"start":[6,44],"name":"/home/harry/code/purescript/tests/purs/docs/src/ExplicitTypeSignatures.purs","end":[6,53]},[]],"tag":"TypeVar","contents":"something"}]},0]}}},{"EDValue":{"edValueName":{"Ident":"anInt"},"edValueType":{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeConstructor","contents":[["Prim"],"Int"]}}},{"EDValue":{"edValueName":{"Ident":"aNumber"},"edValueType":{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeConstructor","contents":[["Prim"],"Number"]}}}],"efSourceSpan":{"start":[2,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/ExplicitTypeSignatures.purs","end":[16,14]}} \ No newline at end of file
+{"efVersion":"0.13.3","efModuleName":["ExplicitTypeSignatures"],"efExports":[{"ValueRef":[{"start":[2,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/ExplicitTypeSignatures.purs","end":[16,14]},{"Ident":"explicit"}]},{"ValueRef":[{"start":[2,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/ExplicitTypeSignatures.purs","end":[16,14]},{"Ident":"anInt"}]},{"ValueRef":[{"start":[2,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/ExplicitTypeSignatures.purs","end":[16,14]},{"Ident":"aNumber"}]}],"efImports":[{"eiModule":["Prim"],"eiImportType":{"Implicit":[]},"eiImportedAs":["Prim"]},{"eiModule":["Prim"],"eiImportType":{"Implicit":[]},"eiImportedAs":null}],"efFixities":[],"efTypeFixities":[],"efDeclarations":[{"EDValue":{"edValueName":{"Ident":"explicit"},"edValueType":{"annotation":[{"start":[6,13],"name":"/home/harry/code/purescript/tests/purs/docs/src/ExplicitTypeSignatures.purs","end":[6,53]},[]],"tag":"ForAll","contents":["something",{"annotation":[{"start":[6,31],"name":"/home/harry/code/purescript/tests/purs/docs/src/ExplicitTypeSignatures.purs","end":[6,53]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[6,31],"name":"/home/harry/code/purescript/tests/purs/docs/src/ExplicitTypeSignatures.purs","end":[6,53]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[6,41],"name":"/home/harry/code/purescript/tests/purs/docs/src/ExplicitTypeSignatures.purs","end":[6,43]},[]],"tag":"TypeConstructor","contents":[["Prim"],"Function"]},{"annotation":[{"start":[6,31],"name":"/home/harry/code/purescript/tests/purs/docs/src/ExplicitTypeSignatures.purs","end":[6,40]},[]],"tag":"TypeVar","contents":"something"}]},{"annotation":[{"start":[6,44],"name":"/home/harry/code/purescript/tests/purs/docs/src/ExplicitTypeSignatures.purs","end":[6,53]},[]],"tag":"TypeVar","contents":"something"}]},0]}}},{"EDValue":{"edValueName":{"Ident":"anInt"},"edValueType":{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeConstructor","contents":[["Prim"],"Int"]}}},{"EDValue":{"edValueName":{"Ident":"aNumber"},"edValueType":{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeConstructor","contents":[["Prim"],"Number"]}}}],"efSourceSpan":{"start":[2,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/ExplicitTypeSignatures.purs","end":[16,14]}} \ No newline at end of file
diff --git a/tests/purs/docs/output/ImportedTwice/externs.json b/tests/purs/docs/output/ImportedTwice/externs.json
index 408849c..ce9be62 100644
--- a/tests/purs/docs/output/ImportedTwice/externs.json
+++ b/tests/purs/docs/output/ImportedTwice/externs.json
@@ -1 +1 @@
-{"efVersion":"0.13.2","efModuleName":["ImportedTwice"],"efExports":[{"ReExportRef":[{"start":[6,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/ImportedTwice.purs","end":[13,22]},{"exportSourceImportedFrom":["ImportedTwiceB"],"exportSourceDefinedIn":["ImportedTwiceB"]},{"ValueRef":[{"start":[6,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/ImportedTwice.purs","end":[13,22]},{"Ident":"foo"}]}]},{"ModuleRef":[{"start":[7,5],"name":"/home/harry/code/purescript/tests/purs/docs/src/ImportedTwice.purs","end":[7,26]},["ImportedTwiceA"]]},{"ModuleRef":[{"start":[8,5],"name":"/home/harry/code/purescript/tests/purs/docs/src/ImportedTwice.purs","end":[8,26]},["ImportedTwiceB"]]}],"efImports":[{"eiModule":["Prim"],"eiImportType":{"Implicit":[]},"eiImportedAs":["Prim"]},{"eiModule":["Prim"],"eiImportType":{"Implicit":[]},"eiImportedAs":null},{"eiModule":["ImportedTwiceA"],"eiImportType":{"Implicit":[]},"eiImportedAs":null},{"eiModule":["ImportedTwiceB"],"eiImportType":{"Implicit":[]},"eiImportedAs":null}],"efFixities":[],"efTypeFixities":[],"efDeclarations":[],"efSourceSpan":{"start":[6,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/ImportedTwice.purs","end":[13,22]}} \ No newline at end of file
+{"efVersion":"0.13.3","efModuleName":["ImportedTwice"],"efExports":[{"ReExportRef":[{"start":[6,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/ImportedTwice.purs","end":[13,22]},{"exportSourceImportedFrom":["ImportedTwiceB"],"exportSourceDefinedIn":["ImportedTwiceB"]},{"ValueRef":[{"start":[6,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/ImportedTwice.purs","end":[13,22]},{"Ident":"foo"}]}]},{"ModuleRef":[{"start":[7,5],"name":"/home/harry/code/purescript/tests/purs/docs/src/ImportedTwice.purs","end":[7,26]},["ImportedTwiceA"]]},{"ModuleRef":[{"start":[8,5],"name":"/home/harry/code/purescript/tests/purs/docs/src/ImportedTwice.purs","end":[8,26]},["ImportedTwiceB"]]}],"efImports":[{"eiModule":["Prim"],"eiImportType":{"Implicit":[]},"eiImportedAs":["Prim"]},{"eiModule":["Prim"],"eiImportType":{"Implicit":[]},"eiImportedAs":null},{"eiModule":["ImportedTwiceA"],"eiImportType":{"Implicit":[]},"eiImportedAs":null},{"eiModule":["ImportedTwiceB"],"eiImportType":{"Implicit":[]},"eiImportedAs":null}],"efFixities":[],"efTypeFixities":[],"efDeclarations":[],"efSourceSpan":{"start":[6,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/ImportedTwice.purs","end":[13,22]}} \ No newline at end of file
diff --git a/tests/purs/docs/output/ImportedTwiceA/externs.json b/tests/purs/docs/output/ImportedTwiceA/externs.json
index 2475783..4cc0dfe 100644
--- a/tests/purs/docs/output/ImportedTwiceA/externs.json
+++ b/tests/purs/docs/output/ImportedTwiceA/externs.json
@@ -1 +1 @@
-{"efVersion":"0.13.2","efModuleName":["ImportedTwiceA"],"efExports":[{"ReExportRef":[{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/ImportedTwiceA.purs","end":[8,8]},{"exportSourceImportedFrom":["ImportedTwiceB"],"exportSourceDefinedIn":["ImportedTwiceB"]},{"ValueRef":[{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/ImportedTwiceA.purs","end":[8,8]},{"Ident":"foo"}]}]},{"ModuleRef":[{"start":[2,5],"name":"/home/harry/code/purescript/tests/purs/docs/src/ImportedTwiceA.purs","end":[2,26]},["ImportedTwiceB"]]}],"efImports":[{"eiModule":["Prim"],"eiImportType":{"Implicit":[]},"eiImportedAs":["Prim"]},{"eiModule":["Prim"],"eiImportType":{"Implicit":[]},"eiImportedAs":null},{"eiModule":["ImportedTwiceB"],"eiImportType":{"Implicit":[]},"eiImportedAs":null}],"efFixities":[],"efTypeFixities":[],"efDeclarations":[],"efSourceSpan":{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/ImportedTwiceA.purs","end":[8,8]}} \ No newline at end of file
+{"efVersion":"0.13.3","efModuleName":["ImportedTwiceA"],"efExports":[{"ReExportRef":[{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/ImportedTwiceA.purs","end":[8,8]},{"exportSourceImportedFrom":["ImportedTwiceB"],"exportSourceDefinedIn":["ImportedTwiceB"]},{"ValueRef":[{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/ImportedTwiceA.purs","end":[8,8]},{"Ident":"foo"}]}]},{"ModuleRef":[{"start":[2,5],"name":"/home/harry/code/purescript/tests/purs/docs/src/ImportedTwiceA.purs","end":[2,26]},["ImportedTwiceB"]]}],"efImports":[{"eiModule":["Prim"],"eiImportType":{"Implicit":[]},"eiImportedAs":["Prim"]},{"eiModule":["Prim"],"eiImportType":{"Implicit":[]},"eiImportedAs":null},{"eiModule":["ImportedTwiceB"],"eiImportType":{"Implicit":[]},"eiImportedAs":null}],"efFixities":[],"efTypeFixities":[],"efDeclarations":[],"efSourceSpan":{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/ImportedTwiceA.purs","end":[8,8]}} \ No newline at end of file
diff --git a/tests/purs/docs/output/ImportedTwiceB/externs.json b/tests/purs/docs/output/ImportedTwiceB/externs.json
index 6bc3413..b4c8b81 100644
--- a/tests/purs/docs/output/ImportedTwiceB/externs.json
+++ b/tests/purs/docs/output/ImportedTwiceB/externs.json
@@ -1 +1 @@
-{"efVersion":"0.13.2","efModuleName":["ImportedTwiceB"],"efExports":[{"ValueRef":[{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/ImportedTwiceB.purs","end":[4,8]},{"Ident":"foo"}]}],"efImports":[{"eiModule":["Prim"],"eiImportType":{"Implicit":[]},"eiImportedAs":["Prim"]},{"eiModule":["Prim"],"eiImportType":{"Implicit":[]},"eiImportedAs":null}],"efFixities":[],"efTypeFixities":[],"efDeclarations":[{"EDValue":{"edValueName":{"Ident":"foo"},"edValueType":{"annotation":[{"start":[3,8],"name":"/home/harry/code/purescript/tests/purs/docs/src/ImportedTwiceB.purs","end":[3,11]},[]],"tag":"TypeConstructor","contents":[["Prim"],"Int"]}}}],"efSourceSpan":{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/ImportedTwiceB.purs","end":[4,8]}} \ No newline at end of file
+{"efVersion":"0.13.3","efModuleName":["ImportedTwiceB"],"efExports":[{"ValueRef":[{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/ImportedTwiceB.purs","end":[4,8]},{"Ident":"foo"}]}],"efImports":[{"eiModule":["Prim"],"eiImportType":{"Implicit":[]},"eiImportedAs":["Prim"]},{"eiModule":["Prim"],"eiImportType":{"Implicit":[]},"eiImportedAs":null}],"efFixities":[],"efTypeFixities":[],"efDeclarations":[{"EDValue":{"edValueName":{"Ident":"foo"},"edValueType":{"annotation":[{"start":[3,8],"name":"/home/harry/code/purescript/tests/purs/docs/src/ImportedTwiceB.purs","end":[3,11]},[]],"tag":"TypeConstructor","contents":[["Prim"],"Int"]}}}],"efSourceSpan":{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/ImportedTwiceB.purs","end":[4,8]}} \ No newline at end of file
diff --git a/tests/purs/docs/output/MultiVirtual/externs.json b/tests/purs/docs/output/MultiVirtual/externs.json
index a1aae2c..bd84477 100644
--- a/tests/purs/docs/output/MultiVirtual/externs.json
+++ b/tests/purs/docs/output/MultiVirtual/externs.json
@@ -1 +1 @@
-{"efVersion":"0.13.2","efModuleName":["MultiVirtual"],"efExports":[{"ReExportRef":[{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/MultiVirtual.purs","end":[6,26]},{"exportSourceImportedFrom":["MultiVirtual2"],"exportSourceDefinedIn":["MultiVirtual2"]},{"ValueRef":[{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/MultiVirtual.purs","end":[6,26]},{"Ident":"bar"}]}]},{"ReExportRef":[{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/MultiVirtual.purs","end":[6,26]},{"exportSourceImportedFrom":["MultiVirtual2"],"exportSourceDefinedIn":["MultiVirtual3"]},{"ValueRef":[{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/MultiVirtual.purs","end":[6,26]},{"Ident":"baz"}]}]},{"ReExportRef":[{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/MultiVirtual.purs","end":[6,26]},{"exportSourceImportedFrom":["MultiVirtual1"],"exportSourceDefinedIn":["MultiVirtual1"]},{"ValueRef":[{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/MultiVirtual.purs","end":[6,26]},{"Ident":"foo"}]}]},{"ModuleRef":[{"start":[2,5],"name":"/home/harry/code/purescript/tests/purs/docs/src/MultiVirtual.purs","end":[2,13]},["X"]]}],"efImports":[{"eiModule":["Prim"],"eiImportType":{"Implicit":[]},"eiImportedAs":["Prim"]},{"eiModule":["Prim"],"eiImportType":{"Implicit":[]},"eiImportedAs":null},{"eiModule":["MultiVirtual1"],"eiImportType":{"Implicit":[]},"eiImportedAs":["X"]},{"eiModule":["MultiVirtual2"],"eiImportType":{"Implicit":[]},"eiImportedAs":["X"]}],"efFixities":[],"efTypeFixities":[],"efDeclarations":[],"efSourceSpan":{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/MultiVirtual.purs","end":[6,26]}} \ No newline at end of file
+{"efVersion":"0.13.3","efModuleName":["MultiVirtual"],"efExports":[{"ReExportRef":[{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/MultiVirtual.purs","end":[6,26]},{"exportSourceImportedFrom":["MultiVirtual2"],"exportSourceDefinedIn":["MultiVirtual2"]},{"ValueRef":[{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/MultiVirtual.purs","end":[6,26]},{"Ident":"bar"}]}]},{"ReExportRef":[{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/MultiVirtual.purs","end":[6,26]},{"exportSourceImportedFrom":["MultiVirtual2"],"exportSourceDefinedIn":["MultiVirtual3"]},{"ValueRef":[{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/MultiVirtual.purs","end":[6,26]},{"Ident":"baz"}]}]},{"ReExportRef":[{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/MultiVirtual.purs","end":[6,26]},{"exportSourceImportedFrom":["MultiVirtual1"],"exportSourceDefinedIn":["MultiVirtual1"]},{"ValueRef":[{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/MultiVirtual.purs","end":[6,26]},{"Ident":"foo"}]}]},{"ModuleRef":[{"start":[2,5],"name":"/home/harry/code/purescript/tests/purs/docs/src/MultiVirtual.purs","end":[2,13]},["X"]]}],"efImports":[{"eiModule":["Prim"],"eiImportType":{"Implicit":[]},"eiImportedAs":["Prim"]},{"eiModule":["Prim"],"eiImportType":{"Implicit":[]},"eiImportedAs":null},{"eiModule":["MultiVirtual1"],"eiImportType":{"Implicit":[]},"eiImportedAs":["X"]},{"eiModule":["MultiVirtual2"],"eiImportType":{"Implicit":[]},"eiImportedAs":["X"]}],"efFixities":[],"efTypeFixities":[],"efDeclarations":[],"efSourceSpan":{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/MultiVirtual.purs","end":[6,26]}} \ No newline at end of file
diff --git a/tests/purs/docs/output/MultiVirtual1/externs.json b/tests/purs/docs/output/MultiVirtual1/externs.json
index 7d9e7dd..2dd97e4 100644
--- a/tests/purs/docs/output/MultiVirtual1/externs.json
+++ b/tests/purs/docs/output/MultiVirtual1/externs.json
@@ -1 +1 @@
-{"efVersion":"0.13.2","efModuleName":["MultiVirtual1"],"efExports":[{"ValueRef":[{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/MultiVirtual1.purs","end":[4,8]},{"Ident":"foo"}]}],"efImports":[{"eiModule":["Prim"],"eiImportType":{"Implicit":[]},"eiImportedAs":["Prim"]},{"eiModule":["Prim"],"eiImportType":{"Implicit":[]},"eiImportedAs":null}],"efFixities":[],"efTypeFixities":[],"efDeclarations":[{"EDValue":{"edValueName":{"Ident":"foo"},"edValueType":{"annotation":[{"start":[3,8],"name":"/home/harry/code/purescript/tests/purs/docs/src/MultiVirtual1.purs","end":[3,11]},[]],"tag":"TypeConstructor","contents":[["Prim"],"Int"]}}}],"efSourceSpan":{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/MultiVirtual1.purs","end":[4,8]}} \ No newline at end of file
+{"efVersion":"0.13.3","efModuleName":["MultiVirtual1"],"efExports":[{"ValueRef":[{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/MultiVirtual1.purs","end":[4,8]},{"Ident":"foo"}]}],"efImports":[{"eiModule":["Prim"],"eiImportType":{"Implicit":[]},"eiImportedAs":["Prim"]},{"eiModule":["Prim"],"eiImportType":{"Implicit":[]},"eiImportedAs":null}],"efFixities":[],"efTypeFixities":[],"efDeclarations":[{"EDValue":{"edValueName":{"Ident":"foo"},"edValueType":{"annotation":[{"start":[3,8],"name":"/home/harry/code/purescript/tests/purs/docs/src/MultiVirtual1.purs","end":[3,11]},[]],"tag":"TypeConstructor","contents":[["Prim"],"Int"]}}}],"efSourceSpan":{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/MultiVirtual1.purs","end":[4,8]}} \ No newline at end of file
diff --git a/tests/purs/docs/output/MultiVirtual2/externs.json b/tests/purs/docs/output/MultiVirtual2/externs.json
index e836284..cba0940 100644
--- a/tests/purs/docs/output/MultiVirtual2/externs.json
+++ b/tests/purs/docs/output/MultiVirtual2/externs.json
@@ -1 +1 @@
-{"efVersion":"0.13.2","efModuleName":["MultiVirtual2"],"efExports":[{"ValueRef":[{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/MultiVirtual2.purs","end":[9,8]},{"Ident":"bar"}]},{"ReExportRef":[{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/MultiVirtual2.purs","end":[9,8]},{"exportSourceImportedFrom":["MultiVirtual3"],"exportSourceDefinedIn":["MultiVirtual3"]},{"ValueRef":[{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/MultiVirtual2.purs","end":[9,8]},{"Ident":"baz"}]}]},{"ModuleRef":[{"start":[2,5],"name":"/home/harry/code/purescript/tests/purs/docs/src/MultiVirtual2.purs","end":[2,25]},["MultiVirtual2"]]},{"ModuleRef":[{"start":[3,5],"name":"/home/harry/code/purescript/tests/purs/docs/src/MultiVirtual2.purs","end":[3,25]},["MultiVirtual3"]]}],"efImports":[{"eiModule":["Prim"],"eiImportType":{"Implicit":[]},"eiImportedAs":["Prim"]},{"eiModule":["Prim"],"eiImportType":{"Implicit":[]},"eiImportedAs":null},{"eiModule":["MultiVirtual3"],"eiImportType":{"Implicit":[]},"eiImportedAs":null}],"efFixities":[],"efTypeFixities":[],"efDeclarations":[{"EDValue":{"edValueName":{"Ident":"bar"},"edValueType":{"annotation":[{"start":[8,8],"name":"/home/harry/code/purescript/tests/purs/docs/src/MultiVirtual2.purs","end":[8,11]},[]],"tag":"TypeConstructor","contents":[["Prim"],"Int"]}}}],"efSourceSpan":{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/MultiVirtual2.purs","end":[9,8]}} \ No newline at end of file
+{"efVersion":"0.13.3","efModuleName":["MultiVirtual2"],"efExports":[{"ValueRef":[{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/MultiVirtual2.purs","end":[9,8]},{"Ident":"bar"}]},{"ReExportRef":[{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/MultiVirtual2.purs","end":[9,8]},{"exportSourceImportedFrom":["MultiVirtual3"],"exportSourceDefinedIn":["MultiVirtual3"]},{"ValueRef":[{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/MultiVirtual2.purs","end":[9,8]},{"Ident":"baz"}]}]},{"ModuleRef":[{"start":[2,5],"name":"/home/harry/code/purescript/tests/purs/docs/src/MultiVirtual2.purs","end":[2,25]},["MultiVirtual2"]]},{"ModuleRef":[{"start":[3,5],"name":"/home/harry/code/purescript/tests/purs/docs/src/MultiVirtual2.purs","end":[3,25]},["MultiVirtual3"]]}],"efImports":[{"eiModule":["Prim"],"eiImportType":{"Implicit":[]},"eiImportedAs":["Prim"]},{"eiModule":["Prim"],"eiImportType":{"Implicit":[]},"eiImportedAs":null},{"eiModule":["MultiVirtual3"],"eiImportType":{"Implicit":[]},"eiImportedAs":null}],"efFixities":[],"efTypeFixities":[],"efDeclarations":[{"EDValue":{"edValueName":{"Ident":"bar"},"edValueType":{"annotation":[{"start":[8,8],"name":"/home/harry/code/purescript/tests/purs/docs/src/MultiVirtual2.purs","end":[8,11]},[]],"tag":"TypeConstructor","contents":[["Prim"],"Int"]}}}],"efSourceSpan":{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/MultiVirtual2.purs","end":[9,8]}} \ No newline at end of file
diff --git a/tests/purs/docs/output/MultiVirtual3/externs.json b/tests/purs/docs/output/MultiVirtual3/externs.json
index b3eee96..1bd73c2 100644
--- a/tests/purs/docs/output/MultiVirtual3/externs.json
+++ b/tests/purs/docs/output/MultiVirtual3/externs.json
@@ -1 +1 @@
-{"efVersion":"0.13.2","efModuleName":["MultiVirtual3"],"efExports":[{"ValueRef":[{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/MultiVirtual3.purs","end":[4,8]},{"Ident":"baz"}]}],"efImports":[{"eiModule":["Prim"],"eiImportType":{"Implicit":[]},"eiImportedAs":["Prim"]},{"eiModule":["Prim"],"eiImportType":{"Implicit":[]},"eiImportedAs":null}],"efFixities":[],"efTypeFixities":[],"efDeclarations":[{"EDValue":{"edValueName":{"Ident":"baz"},"edValueType":{"annotation":[{"start":[3,8],"name":"/home/harry/code/purescript/tests/purs/docs/src/MultiVirtual3.purs","end":[3,11]},[]],"tag":"TypeConstructor","contents":[["Prim"],"Int"]}}}],"efSourceSpan":{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/MultiVirtual3.purs","end":[4,8]}} \ No newline at end of file
+{"efVersion":"0.13.3","efModuleName":["MultiVirtual3"],"efExports":[{"ValueRef":[{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/MultiVirtual3.purs","end":[4,8]},{"Ident":"baz"}]}],"efImports":[{"eiModule":["Prim"],"eiImportType":{"Implicit":[]},"eiImportedAs":["Prim"]},{"eiModule":["Prim"],"eiImportType":{"Implicit":[]},"eiImportedAs":null}],"efFixities":[],"efTypeFixities":[],"efDeclarations":[{"EDValue":{"edValueName":{"Ident":"baz"},"edValueType":{"annotation":[{"start":[3,8],"name":"/home/harry/code/purescript/tests/purs/docs/src/MultiVirtual3.purs","end":[3,11]},[]],"tag":"TypeConstructor","contents":[["Prim"],"Int"]}}}],"efSourceSpan":{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/MultiVirtual3.purs","end":[4,8]}} \ No newline at end of file
diff --git a/tests/purs/docs/output/NewOperators/externs.json b/tests/purs/docs/output/NewOperators/externs.json
index 747a2b4..ef9075f 100644
--- a/tests/purs/docs/output/NewOperators/externs.json
+++ b/tests/purs/docs/output/NewOperators/externs.json
@@ -1 +1 @@
-{"efVersion":"0.13.2","efModuleName":["NewOperators"],"efExports":[{"ReExportRef":[{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/NewOperators.purs","end":[5,21]},{"exportSourceImportedFrom":["NewOperators2"],"exportSourceDefinedIn":["NewOperators2"]},{"ValueRef":[{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/NewOperators.purs","end":[5,21]},{"Ident":"_compose"}]}]},{"ReExportRef":[{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/NewOperators.purs","end":[5,21]},{"exportSourceImportedFrom":["NewOperators2"],"exportSourceDefinedIn":["NewOperators2"]},{"ValueOpRef":[{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/NewOperators.purs","end":[5,21]},">>>"]}]},{"ModuleRef":[{"start":[2,5],"name":"/home/harry/code/purescript/tests/purs/docs/src/NewOperators.purs","end":[2,25]},["NewOperators2"]]}],"efImports":[{"eiModule":["Prim"],"eiImportType":{"Implicit":[]},"eiImportedAs":["Prim"]},{"eiModule":["Prim"],"eiImportType":{"Implicit":[]},"eiImportedAs":null},{"eiModule":["NewOperators2"],"eiImportType":{"Implicit":[]},"eiImportedAs":null}],"efFixities":[],"efTypeFixities":[],"efDeclarations":[],"efSourceSpan":{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/NewOperators.purs","end":[5,21]}} \ No newline at end of file
+{"efVersion":"0.13.3","efModuleName":["NewOperators"],"efExports":[{"ReExportRef":[{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/NewOperators.purs","end":[5,21]},{"exportSourceImportedFrom":["NewOperators2"],"exportSourceDefinedIn":["NewOperators2"]},{"ValueRef":[{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/NewOperators.purs","end":[5,21]},{"Ident":"_compose"}]}]},{"ReExportRef":[{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/NewOperators.purs","end":[5,21]},{"exportSourceImportedFrom":["NewOperators2"],"exportSourceDefinedIn":["NewOperators2"]},{"ValueOpRef":[{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/NewOperators.purs","end":[5,21]},">>>"]}]},{"ModuleRef":[{"start":[2,5],"name":"/home/harry/code/purescript/tests/purs/docs/src/NewOperators.purs","end":[2,25]},["NewOperators2"]]}],"efImports":[{"eiModule":["Prim"],"eiImportType":{"Implicit":[]},"eiImportedAs":["Prim"]},{"eiModule":["Prim"],"eiImportType":{"Implicit":[]},"eiImportedAs":null},{"eiModule":["NewOperators2"],"eiImportType":{"Implicit":[]},"eiImportedAs":null}],"efFixities":[],"efTypeFixities":[],"efDeclarations":[],"efSourceSpan":{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/NewOperators.purs","end":[5,21]}} \ No newline at end of file
diff --git a/tests/purs/docs/output/NewOperators2/externs.json b/tests/purs/docs/output/NewOperators2/externs.json
index b5d9af1..e695e84 100644
--- a/tests/purs/docs/output/NewOperators2/externs.json
+++ b/tests/purs/docs/output/NewOperators2/externs.json
@@ -1 +1 @@
-{"efVersion":"0.13.2","efModuleName":["NewOperators2"],"efExports":[{"ValueOpRef":[{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/NewOperators2.purs","end":[6,25]},">>>"]},{"ValueRef":[{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/NewOperators2.purs","end":[6,25]},{"Ident":"_compose"}]}],"efImports":[{"eiModule":["Prim"],"eiImportType":{"Implicit":[]},"eiImportedAs":["Prim"]},{"eiModule":["Prim"],"eiImportType":{"Implicit":[]},"eiImportedAs":null}],"efFixities":[{"efAssociativity":"infixl","efPrecedence":8,"efOperator":">>>","efAlias":[["NewOperators2"],{"Left":{"Ident":"_compose"}}]}],"efTypeFixities":[],"efDeclarations":[{"EDValue":{"edValueName":{"Ident":"_compose"},"edValueType":{"annotation":[{"start":[5,13],"name":"/home/harry/code/purescript/tests/purs/docs/src/NewOperators2.purs","end":[5,59]},[]],"tag":"ForAll","contents":["c",{"annotation":[{"start":[5,20],"name":"/home/harry/code/purescript/tests/purs/docs/src/NewOperators2.purs","end":[5,59]},[]],"tag":"ForAll","contents":["b",{"annotation":[{"start":[5,20],"name":"/home/harry/code/purescript/tests/purs/docs/src/NewOperators2.purs","end":[5,59]},[]],"tag":"ForAll","contents":["a",{"annotation":[{"start":[5,27],"name":"/home/harry/code/purescript/tests/purs/docs/src/NewOperators2.purs","end":[5,59]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[5,27],"name":"/home/harry/code/purescript/tests/purs/docs/src/NewOperators2.purs","end":[5,59]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[5,36],"name":"/home/harry/code/purescript/tests/purs/docs/src/NewOperators2.purs","end":[5,38]},[]],"tag":"TypeConstructor","contents":[["Prim"],"Function"]},{"annotation":[{"start":[5,28],"name":"/home/harry/code/purescript/tests/purs/docs/src/NewOperators2.purs","end":[5,34]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[5,28],"name":"/home/harry/code/purescript/tests/purs/docs/src/NewOperators2.purs","end":[5,34]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[5,30],"name":"/home/harry/code/purescript/tests/purs/docs/src/NewOperators2.purs","end":[5,32]},[]],"tag":"TypeConstructor","contents":[["Prim"],"Function"]},{"annotation":[{"start":[5,28],"name":"/home/harry/code/purescript/tests/purs/docs/src/NewOperators2.purs","end":[5,29]},[]],"tag":"TypeVar","contents":"b"}]},{"annotation":[{"start":[5,33],"name":"/home/harry/code/purescript/tests/purs/docs/src/NewOperators2.purs","end":[5,34]},[]],"tag":"TypeVar","contents":"c"}]}]},{"annotation":[{"start":[5,39],"name":"/home/harry/code/purescript/tests/purs/docs/src/NewOperators2.purs","end":[5,59]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[5,39],"name":"/home/harry/code/purescript/tests/purs/docs/src/NewOperators2.purs","end":[5,59]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[5,48],"name":"/home/harry/code/purescript/tests/purs/docs/src/NewOperators2.purs","end":[5,50]},[]],"tag":"TypeConstructor","contents":[["Prim"],"Function"]},{"annotation":[{"start":[5,40],"name":"/home/harry/code/purescript/tests/purs/docs/src/NewOperators2.purs","end":[5,46]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[5,40],"name":"/home/harry/code/purescript/tests/purs/docs/src/NewOperators2.purs","end":[5,46]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[5,42],"name":"/home/harry/code/purescript/tests/purs/docs/src/NewOperators2.purs","end":[5,44]},[]],"tag":"TypeConstructor","contents":[["Prim"],"Function"]},{"annotation":[{"start":[5,40],"name":"/home/harry/code/purescript/tests/purs/docs/src/NewOperators2.purs","end":[5,41]},[]],"tag":"TypeVar","contents":"a"}]},{"annotation":[{"start":[5,45],"name":"/home/harry/code/purescript/tests/purs/docs/src/NewOperators2.purs","end":[5,46]},[]],"tag":"TypeVar","contents":"b"}]}]},{"annotation":[{"start":[5,52],"name":"/home/harry/code/purescript/tests/purs/docs/src/NewOperators2.purs","end":[5,58]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[5,52],"name":"/home/harry/code/purescript/tests/purs/docs/src/NewOperators2.purs","end":[5,58]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[5,54],"name":"/home/harry/code/purescript/tests/purs/docs/src/NewOperators2.purs","end":[5,56]},[]],"tag":"TypeConstructor","contents":[["Prim"],"Function"]},{"annotation":[{"start":[5,52],"name":"/home/harry/code/purescript/tests/purs/docs/src/NewOperators2.purs","end":[5,53]},[]],"tag":"TypeVar","contents":"a"}]},{"annotation":[{"start":[5,57],"name":"/home/harry/code/purescript/tests/purs/docs/src/NewOperators2.purs","end":[5,58]},[]],"tag":"TypeVar","contents":"c"}]}]}]},0]},1]},2]}}}],"efSourceSpan":{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/NewOperators2.purs","end":[6,25]}} \ No newline at end of file
+{"efVersion":"0.13.3","efModuleName":["NewOperators2"],"efExports":[{"ValueOpRef":[{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/NewOperators2.purs","end":[6,25]},">>>"]},{"ValueRef":[{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/NewOperators2.purs","end":[6,25]},{"Ident":"_compose"}]}],"efImports":[{"eiModule":["Prim"],"eiImportType":{"Implicit":[]},"eiImportedAs":["Prim"]},{"eiModule":["Prim"],"eiImportType":{"Implicit":[]},"eiImportedAs":null}],"efFixities":[{"efAssociativity":"infixl","efPrecedence":8,"efOperator":">>>","efAlias":[["NewOperators2"],{"Left":{"Ident":"_compose"}}]}],"efTypeFixities":[],"efDeclarations":[{"EDValue":{"edValueName":{"Ident":"_compose"},"edValueType":{"annotation":[{"start":[5,13],"name":"/home/harry/code/purescript/tests/purs/docs/src/NewOperators2.purs","end":[5,59]},[]],"tag":"ForAll","contents":["c",{"annotation":[{"start":[5,20],"name":"/home/harry/code/purescript/tests/purs/docs/src/NewOperators2.purs","end":[5,59]},[]],"tag":"ForAll","contents":["b",{"annotation":[{"start":[5,20],"name":"/home/harry/code/purescript/tests/purs/docs/src/NewOperators2.purs","end":[5,59]},[]],"tag":"ForAll","contents":["a",{"annotation":[{"start":[5,27],"name":"/home/harry/code/purescript/tests/purs/docs/src/NewOperators2.purs","end":[5,59]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[5,27],"name":"/home/harry/code/purescript/tests/purs/docs/src/NewOperators2.purs","end":[5,59]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[5,36],"name":"/home/harry/code/purescript/tests/purs/docs/src/NewOperators2.purs","end":[5,38]},[]],"tag":"TypeConstructor","contents":[["Prim"],"Function"]},{"annotation":[{"start":[5,28],"name":"/home/harry/code/purescript/tests/purs/docs/src/NewOperators2.purs","end":[5,34]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[5,28],"name":"/home/harry/code/purescript/tests/purs/docs/src/NewOperators2.purs","end":[5,34]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[5,30],"name":"/home/harry/code/purescript/tests/purs/docs/src/NewOperators2.purs","end":[5,32]},[]],"tag":"TypeConstructor","contents":[["Prim"],"Function"]},{"annotation":[{"start":[5,28],"name":"/home/harry/code/purescript/tests/purs/docs/src/NewOperators2.purs","end":[5,29]},[]],"tag":"TypeVar","contents":"b"}]},{"annotation":[{"start":[5,33],"name":"/home/harry/code/purescript/tests/purs/docs/src/NewOperators2.purs","end":[5,34]},[]],"tag":"TypeVar","contents":"c"}]}]},{"annotation":[{"start":[5,39],"name":"/home/harry/code/purescript/tests/purs/docs/src/NewOperators2.purs","end":[5,59]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[5,39],"name":"/home/harry/code/purescript/tests/purs/docs/src/NewOperators2.purs","end":[5,59]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[5,48],"name":"/home/harry/code/purescript/tests/purs/docs/src/NewOperators2.purs","end":[5,50]},[]],"tag":"TypeConstructor","contents":[["Prim"],"Function"]},{"annotation":[{"start":[5,40],"name":"/home/harry/code/purescript/tests/purs/docs/src/NewOperators2.purs","end":[5,46]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[5,40],"name":"/home/harry/code/purescript/tests/purs/docs/src/NewOperators2.purs","end":[5,46]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[5,42],"name":"/home/harry/code/purescript/tests/purs/docs/src/NewOperators2.purs","end":[5,44]},[]],"tag":"TypeConstructor","contents":[["Prim"],"Function"]},{"annotation":[{"start":[5,40],"name":"/home/harry/code/purescript/tests/purs/docs/src/NewOperators2.purs","end":[5,41]},[]],"tag":"TypeVar","contents":"a"}]},{"annotation":[{"start":[5,45],"name":"/home/harry/code/purescript/tests/purs/docs/src/NewOperators2.purs","end":[5,46]},[]],"tag":"TypeVar","contents":"b"}]}]},{"annotation":[{"start":[5,52],"name":"/home/harry/code/purescript/tests/purs/docs/src/NewOperators2.purs","end":[5,58]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[5,52],"name":"/home/harry/code/purescript/tests/purs/docs/src/NewOperators2.purs","end":[5,58]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[5,54],"name":"/home/harry/code/purescript/tests/purs/docs/src/NewOperators2.purs","end":[5,56]},[]],"tag":"TypeConstructor","contents":[["Prim"],"Function"]},{"annotation":[{"start":[5,52],"name":"/home/harry/code/purescript/tests/purs/docs/src/NewOperators2.purs","end":[5,53]},[]],"tag":"TypeVar","contents":"a"}]},{"annotation":[{"start":[5,57],"name":"/home/harry/code/purescript/tests/purs/docs/src/NewOperators2.purs","end":[5,58]},[]],"tag":"TypeVar","contents":"c"}]}]}]},0]},1]},2]}}}],"efSourceSpan":{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/NewOperators2.purs","end":[6,25]}} \ No newline at end of file
diff --git a/tests/purs/docs/output/NotAllCtors/externs.json b/tests/purs/docs/output/NotAllCtors/externs.json
index 1744fd1..5ebad0b 100644
--- a/tests/purs/docs/output/NotAllCtors/externs.json
+++ b/tests/purs/docs/output/NotAllCtors/externs.json
@@ -1 +1 @@
-{"efVersion":"0.13.2","efModuleName":["NotAllCtors"],"efExports":[{"ReExportRef":[{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/NotAllCtors.purs","end":[5,32]},{"exportSourceImportedFrom":["Prelude"],"exportSourceDefinedIn":["Prelude"]},{"TypeRef":[{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/NotAllCtors.purs","end":[5,32]},"Boolean2",["True"]]}]},{"ModuleRef":[{"start":[2,5],"name":"/home/harry/code/purescript/tests/purs/docs/src/NotAllCtors.purs","end":[2,19]},["Prelude"]]}],"efImports":[{"eiModule":["Prim"],"eiImportType":{"Implicit":[]},"eiImportedAs":["Prim"]},{"eiModule":["Prim"],"eiImportType":{"Implicit":[]},"eiImportedAs":null},{"eiModule":["Prelude"],"eiImportType":{"Explicit":[{"TypeRef":[{"start":[5,17],"name":"/home/harry/code/purescript/tests/purs/docs/src/NotAllCtors.purs","end":[5,31]},"Boolean2",["True"]]}]},"eiImportedAs":null}],"efFixities":[],"efTypeFixities":[],"efDeclarations":[],"efSourceSpan":{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/NotAllCtors.purs","end":[5,32]}} \ No newline at end of file
+{"efVersion":"0.13.3","efModuleName":["NotAllCtors"],"efExports":[{"ReExportRef":[{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/NotAllCtors.purs","end":[5,32]},{"exportSourceImportedFrom":["Prelude"],"exportSourceDefinedIn":["Prelude"]},{"TypeRef":[{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/NotAllCtors.purs","end":[5,32]},"Boolean2",["True"]]}]},{"ModuleRef":[{"start":[2,5],"name":"/home/harry/code/purescript/tests/purs/docs/src/NotAllCtors.purs","end":[2,19]},["Prelude"]]}],"efImports":[{"eiModule":["Prim"],"eiImportType":{"Implicit":[]},"eiImportedAs":["Prim"]},{"eiModule":["Prim"],"eiImportType":{"Implicit":[]},"eiImportedAs":null},{"eiModule":["Prelude"],"eiImportType":{"Explicit":[{"TypeRef":[{"start":[5,17],"name":"/home/harry/code/purescript/tests/purs/docs/src/NotAllCtors.purs","end":[5,31]},"Boolean2",["True"]]}]},"eiImportedAs":null}],"efFixities":[],"efTypeFixities":[],"efDeclarations":[],"efSourceSpan":{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/NotAllCtors.purs","end":[5,32]}} \ No newline at end of file
diff --git a/tests/purs/docs/output/Prelude/externs.json b/tests/purs/docs/output/Prelude/externs.json
index 02d1512..724b7a1 100644
--- a/tests/purs/docs/output/Prelude/externs.json
+++ b/tests/purs/docs/output/Prelude/externs.json
@@ -1 +1 @@
-{"efVersion":"0.13.2","efModuleName":["Prelude"],"efExports":[{"TypeRef":[{"start":[1,1],"name":"bower_components/purescript-prelude/src/Prelude.purs","end":[8,29]},"Unit",["Unit"]]},{"ValueRef":[{"start":[1,1],"name":"bower_components/purescript-prelude/src/Prelude.purs","end":[8,29]},{"Ident":"unit"}]},{"TypeRef":[{"start":[1,1],"name":"bower_components/purescript-prelude/src/Prelude.purs","end":[8,29]},"Boolean2",["True","False"]]}],"efImports":[{"eiModule":["Prim"],"eiImportType":{"Implicit":[]},"eiImportedAs":["Prim"]},{"eiModule":["Prim"],"eiImportType":{"Implicit":[]},"eiImportedAs":null}],"efFixities":[],"efTypeFixities":[],"efDeclarations":[{"EDType":{"edTypeName":"Unit","edTypeKind":{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"NamedKind","contents":[["Prim"],"Type"]},"edTypeDeclarationKind":{"DataType":{"args":[],"ctors":[["Unit",[{"annotation":[{"start":[3,21],"name":"bower_components/purescript-prelude/src/Prelude.purs","end":[3,23]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[3,21],"name":"bower_components/purescript-prelude/src/Prelude.purs","end":[3,22]},[]],"tag":"TypeConstructor","contents":[["Prim"],"Record"]},{"annotation":[{"start":[3,22],"name":"bower_components/purescript-prelude/src/Prelude.purs","end":[3,23]},[]],"tag":"REmpty"}]}]]]}}}},{"EDDataConstructor":{"edDataCtorName":"Unit","edDataCtorOrigin":"newtype","edDataCtorTypeCtor":"Unit","edDataCtorType":{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeConstructor","contents":[["Prim"],"Function"]},{"annotation":[{"start":[3,21],"name":"bower_components/purescript-prelude/src/Prelude.purs","end":[3,23]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[3,21],"name":"bower_components/purescript-prelude/src/Prelude.purs","end":[3,22]},[]],"tag":"TypeConstructor","contents":[["Prim"],"Record"]},{"annotation":[{"start":[3,22],"name":"bower_components/purescript-prelude/src/Prelude.purs","end":[3,23]},[]],"tag":"REmpty"}]}]},{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeConstructor","contents":[["Prelude"],"Unit"]}]},"edDataCtorFields":[{"Ident":"value0"}]}},{"EDValue":{"edValueName":{"Ident":"unit"},"edValueType":{"annotation":[{"start":[5,9],"name":"bower_components/purescript-prelude/src/Prelude.purs","end":[5,13]},[]],"tag":"TypeConstructor","contents":[["Prelude"],"Unit"]}}},{"EDType":{"edTypeName":"Boolean2","edTypeKind":{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"NamedKind","contents":[["Prim"],"Type"]},"edTypeDeclarationKind":{"DataType":{"args":[],"ctors":[["True",[]],["False",[]]]}}}},{"EDDataConstructor":{"edDataCtorName":"True","edDataCtorOrigin":"data","edDataCtorTypeCtor":"Boolean2","edDataCtorType":{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeConstructor","contents":[["Prelude"],"Boolean2"]},"edDataCtorFields":[]}},{"EDDataConstructor":{"edDataCtorName":"False","edDataCtorOrigin":"data","edDataCtorTypeCtor":"Boolean2","edDataCtorType":{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeConstructor","contents":[["Prelude"],"Boolean2"]},"edDataCtorFields":[]}}],"efSourceSpan":{"start":[1,1],"name":"bower_components/purescript-prelude/src/Prelude.purs","end":[8,29]}} \ No newline at end of file
+{"efVersion":"0.13.3","efModuleName":["Prelude"],"efExports":[{"TypeRef":[{"start":[1,1],"name":"bower_components/purescript-prelude/src/Prelude.purs","end":[8,29]},"Unit",["Unit"]]},{"ValueRef":[{"start":[1,1],"name":"bower_components/purescript-prelude/src/Prelude.purs","end":[8,29]},{"Ident":"unit"}]},{"TypeRef":[{"start":[1,1],"name":"bower_components/purescript-prelude/src/Prelude.purs","end":[8,29]},"Boolean2",["True","False"]]}],"efImports":[{"eiModule":["Prim"],"eiImportType":{"Implicit":[]},"eiImportedAs":["Prim"]},{"eiModule":["Prim"],"eiImportType":{"Implicit":[]},"eiImportedAs":null}],"efFixities":[],"efTypeFixities":[],"efDeclarations":[{"EDType":{"edTypeName":"Unit","edTypeKind":{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"NamedKind","contents":[["Prim"],"Type"]},"edTypeDeclarationKind":{"DataType":{"args":[],"ctors":[["Unit",[{"annotation":[{"start":[3,21],"name":"bower_components/purescript-prelude/src/Prelude.purs","end":[3,23]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[3,21],"name":"bower_components/purescript-prelude/src/Prelude.purs","end":[3,22]},[]],"tag":"TypeConstructor","contents":[["Prim"],"Record"]},{"annotation":[{"start":[3,22],"name":"bower_components/purescript-prelude/src/Prelude.purs","end":[3,23]},[]],"tag":"REmpty"}]}]]]}}}},{"EDDataConstructor":{"edDataCtorName":"Unit","edDataCtorOrigin":"newtype","edDataCtorTypeCtor":"Unit","edDataCtorType":{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeConstructor","contents":[["Prim"],"Function"]},{"annotation":[{"start":[3,21],"name":"bower_components/purescript-prelude/src/Prelude.purs","end":[3,23]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[3,21],"name":"bower_components/purescript-prelude/src/Prelude.purs","end":[3,22]},[]],"tag":"TypeConstructor","contents":[["Prim"],"Record"]},{"annotation":[{"start":[3,22],"name":"bower_components/purescript-prelude/src/Prelude.purs","end":[3,23]},[]],"tag":"REmpty"}]}]},{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeConstructor","contents":[["Prelude"],"Unit"]}]},"edDataCtorFields":[{"Ident":"value0"}]}},{"EDValue":{"edValueName":{"Ident":"unit"},"edValueType":{"annotation":[{"start":[5,9],"name":"bower_components/purescript-prelude/src/Prelude.purs","end":[5,13]},[]],"tag":"TypeConstructor","contents":[["Prelude"],"Unit"]}}},{"EDType":{"edTypeName":"Boolean2","edTypeKind":{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"NamedKind","contents":[["Prim"],"Type"]},"edTypeDeclarationKind":{"DataType":{"args":[],"ctors":[["True",[]],["False",[]]]}}}},{"EDDataConstructor":{"edDataCtorName":"True","edDataCtorOrigin":"data","edDataCtorTypeCtor":"Boolean2","edDataCtorType":{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeConstructor","contents":[["Prelude"],"Boolean2"]},"edDataCtorFields":[]}},{"EDDataConstructor":{"edDataCtorName":"False","edDataCtorOrigin":"data","edDataCtorTypeCtor":"Boolean2","edDataCtorType":{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeConstructor","contents":[["Prelude"],"Boolean2"]},"edDataCtorFields":[]}}],"efSourceSpan":{"start":[1,1],"name":"bower_components/purescript-prelude/src/Prelude.purs","end":[8,29]}} \ No newline at end of file
diff --git a/tests/purs/docs/output/PrimSubmodules/externs.json b/tests/purs/docs/output/PrimSubmodules/externs.json
index 42de5de..112958b 100644
--- a/tests/purs/docs/output/PrimSubmodules/externs.json
+++ b/tests/purs/docs/output/PrimSubmodules/externs.json
@@ -1 +1 @@
-{"efVersion":"0.13.2","efModuleName":["PrimSubmodules"],"efExports":[{"ReExportRef":[{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/PrimSubmodules.purs","end":[11,10]},{"exportSourceImportedFrom":["Prim","Ordering"],"exportSourceDefinedIn":["Prim","Ordering"]},{"TypeRef":[{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/PrimSubmodules.purs","end":[11,10]},"EQ",[]]}]},{"ReExportRef":[{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/PrimSubmodules.purs","end":[11,10]},{"exportSourceImportedFrom":["Prim","Ordering"],"exportSourceDefinedIn":["Prim","Ordering"]},{"TypeRef":[{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/PrimSubmodules.purs","end":[11,10]},"GT",[]]}]},{"ReExportRef":[{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/PrimSubmodules.purs","end":[11,10]},{"exportSourceImportedFrom":["Prim","Ordering"],"exportSourceDefinedIn":["Prim","Ordering"]},{"TypeRef":[{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/PrimSubmodules.purs","end":[11,10]},"LT",[]]}]},{"ReExportRef":[{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/PrimSubmodules.purs","end":[11,10]},{"exportSourceImportedFrom":["Prim","Ordering"],"exportSourceDefinedIn":["Prim","Ordering"]},{"KindRef":[{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/PrimSubmodules.purs","end":[11,10]},"Ordering"]}]},{"TypeRef":[{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/PrimSubmodules.purs","end":[11,10]},"Lol",["Lol"]]},{"ValueRef":[{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/PrimSubmodules.purs","end":[11,10]},{"Ident":"x"}]},{"ValueRef":[{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/PrimSubmodules.purs","end":[11,10]},{"Ident":"y"}]},{"ModuleRef":[{"start":[1,39],"name":"/home/harry/code/purescript/tests/purs/docs/src/PrimSubmodules.purs","end":[1,47]},["O"]]}],"efImports":[{"eiModule":["Prim"],"eiImportType":{"Implicit":[]},"eiImportedAs":["Prim"]},{"eiModule":["Prim"],"eiImportType":{"Implicit":[]},"eiImportedAs":null},{"eiModule":["Prim","Ordering"],"eiImportType":{"Explicit":[{"KindRef":[{"start":[3,23],"name":"/home/harry/code/purescript/tests/purs/docs/src/PrimSubmodules.purs","end":[3,36]},"Ordering"]},{"TypeRef":[{"start":[3,38],"name":"/home/harry/code/purescript/tests/purs/docs/src/PrimSubmodules.purs","end":[3,40]},"LT",[]]},{"TypeRef":[{"start":[3,42],"name":"/home/harry/code/purescript/tests/purs/docs/src/PrimSubmodules.purs","end":[3,44]},"EQ",[]]},{"TypeRef":[{"start":[3,46],"name":"/home/harry/code/purescript/tests/purs/docs/src/PrimSubmodules.purs","end":[3,48]},"GT",[]]}]},"eiImportedAs":["O"]}],"efFixities":[],"efTypeFixities":[],"efDeclarations":[{"EDType":{"edTypeName":"Lol","edTypeKind":{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"FunKind","contents":[{"annotation":[{"start":[5,16],"name":"/home/harry/code/purescript/tests/purs/docs/src/PrimSubmodules.purs","end":[5,26]},[]],"tag":"NamedKind","contents":[["Prim","Ordering"],"Ordering"]},{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"NamedKind","contents":[["Prim"],"Type"]}]},"edTypeDeclarationKind":{"DataType":{"args":[["a",{"annotation":[{"start":[5,16],"name":"/home/harry/code/purescript/tests/purs/docs/src/PrimSubmodules.purs","end":[5,26]},[]],"tag":"NamedKind","contents":[["Prim","Ordering"],"Ordering"]}]],"ctors":[["Lol",[{"annotation":[{"start":[5,34],"name":"/home/harry/code/purescript/tests/purs/docs/src/PrimSubmodules.purs","end":[5,37]},[]],"tag":"TypeConstructor","contents":[["Prim"],"Int"]}]]]}}}},{"EDDataConstructor":{"edDataCtorName":"Lol","edDataCtorOrigin":"data","edDataCtorTypeCtor":"Lol","edDataCtorType":{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"ForAll","contents":["a",{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeConstructor","contents":[["Prim"],"Function"]},{"annotation":[{"start":[5,34],"name":"/home/harry/code/purescript/tests/purs/docs/src/PrimSubmodules.purs","end":[5,37]},[]],"tag":"TypeConstructor","contents":[["Prim"],"Int"]}]},{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeConstructor","contents":[["PrimSubmodules"],"Lol"]},{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeVar","contents":"a"}]}]},null]},"edDataCtorFields":[{"Ident":"value0"}]}},{"EDValue":{"edValueName":{"Ident":"x"},"edValueType":{"annotation":[{"start":[7,6],"name":"/home/harry/code/purescript/tests/purs/docs/src/PrimSubmodules.purs","end":[7,14]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[7,6],"name":"/home/harry/code/purescript/tests/purs/docs/src/PrimSubmodules.purs","end":[7,9]},[]],"tag":"TypeConstructor","contents":[["PrimSubmodules"],"Lol"]},{"annotation":[{"start":[7,10],"name":"/home/harry/code/purescript/tests/purs/docs/src/PrimSubmodules.purs","end":[7,14]},[]],"tag":"TypeConstructor","contents":[["Prim","Ordering"],"LT"]}]}}},{"EDValue":{"edValueName":{"Ident":"y"},"edValueType":{"annotation":[{"start":[10,6],"name":"/home/harry/code/purescript/tests/purs/docs/src/PrimSubmodules.purs","end":[10,14]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[10,6],"name":"/home/harry/code/purescript/tests/purs/docs/src/PrimSubmodules.purs","end":[10,9]},[]],"tag":"TypeConstructor","contents":[["PrimSubmodules"],"Lol"]},{"annotation":[{"start":[10,10],"name":"/home/harry/code/purescript/tests/purs/docs/src/PrimSubmodules.purs","end":[10,14]},[]],"tag":"TypeConstructor","contents":[["Prim","Ordering"],"EQ"]}]}}}],"efSourceSpan":{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/PrimSubmodules.purs","end":[11,10]}} \ No newline at end of file
+{"efVersion":"0.13.3","efModuleName":["PrimSubmodules"],"efExports":[{"ReExportRef":[{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/PrimSubmodules.purs","end":[11,10]},{"exportSourceImportedFrom":["Prim","Ordering"],"exportSourceDefinedIn":["Prim","Ordering"]},{"TypeRef":[{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/PrimSubmodules.purs","end":[11,10]},"EQ",[]]}]},{"ReExportRef":[{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/PrimSubmodules.purs","end":[11,10]},{"exportSourceImportedFrom":["Prim","Ordering"],"exportSourceDefinedIn":["Prim","Ordering"]},{"TypeRef":[{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/PrimSubmodules.purs","end":[11,10]},"GT",[]]}]},{"ReExportRef":[{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/PrimSubmodules.purs","end":[11,10]},{"exportSourceImportedFrom":["Prim","Ordering"],"exportSourceDefinedIn":["Prim","Ordering"]},{"TypeRef":[{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/PrimSubmodules.purs","end":[11,10]},"LT",[]]}]},{"ReExportRef":[{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/PrimSubmodules.purs","end":[11,10]},{"exportSourceImportedFrom":["Prim","Ordering"],"exportSourceDefinedIn":["Prim","Ordering"]},{"KindRef":[{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/PrimSubmodules.purs","end":[11,10]},"Ordering"]}]},{"TypeRef":[{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/PrimSubmodules.purs","end":[11,10]},"Lol",["Lol"]]},{"ValueRef":[{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/PrimSubmodules.purs","end":[11,10]},{"Ident":"x"}]},{"ValueRef":[{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/PrimSubmodules.purs","end":[11,10]},{"Ident":"y"}]},{"ModuleRef":[{"start":[1,39],"name":"/home/harry/code/purescript/tests/purs/docs/src/PrimSubmodules.purs","end":[1,47]},["O"]]}],"efImports":[{"eiModule":["Prim"],"eiImportType":{"Implicit":[]},"eiImportedAs":["Prim"]},{"eiModule":["Prim"],"eiImportType":{"Implicit":[]},"eiImportedAs":null},{"eiModule":["Prim","Ordering"],"eiImportType":{"Explicit":[{"KindRef":[{"start":[3,23],"name":"/home/harry/code/purescript/tests/purs/docs/src/PrimSubmodules.purs","end":[3,36]},"Ordering"]},{"TypeRef":[{"start":[3,38],"name":"/home/harry/code/purescript/tests/purs/docs/src/PrimSubmodules.purs","end":[3,40]},"LT",[]]},{"TypeRef":[{"start":[3,42],"name":"/home/harry/code/purescript/tests/purs/docs/src/PrimSubmodules.purs","end":[3,44]},"EQ",[]]},{"TypeRef":[{"start":[3,46],"name":"/home/harry/code/purescript/tests/purs/docs/src/PrimSubmodules.purs","end":[3,48]},"GT",[]]}]},"eiImportedAs":["O"]}],"efFixities":[],"efTypeFixities":[],"efDeclarations":[{"EDType":{"edTypeName":"Lol","edTypeKind":{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"FunKind","contents":[{"annotation":[{"start":[5,16],"name":"/home/harry/code/purescript/tests/purs/docs/src/PrimSubmodules.purs","end":[5,26]},[]],"tag":"NamedKind","contents":[["Prim","Ordering"],"Ordering"]},{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"NamedKind","contents":[["Prim"],"Type"]}]},"edTypeDeclarationKind":{"DataType":{"args":[["a",{"annotation":[{"start":[5,16],"name":"/home/harry/code/purescript/tests/purs/docs/src/PrimSubmodules.purs","end":[5,26]},[]],"tag":"NamedKind","contents":[["Prim","Ordering"],"Ordering"]}]],"ctors":[["Lol",[{"annotation":[{"start":[5,34],"name":"/home/harry/code/purescript/tests/purs/docs/src/PrimSubmodules.purs","end":[5,37]},[]],"tag":"TypeConstructor","contents":[["Prim"],"Int"]}]]]}}}},{"EDDataConstructor":{"edDataCtorName":"Lol","edDataCtorOrigin":"data","edDataCtorTypeCtor":"Lol","edDataCtorType":{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"ForAll","contents":["a",{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeConstructor","contents":[["Prim"],"Function"]},{"annotation":[{"start":[5,34],"name":"/home/harry/code/purescript/tests/purs/docs/src/PrimSubmodules.purs","end":[5,37]},[]],"tag":"TypeConstructor","contents":[["Prim"],"Int"]}]},{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeConstructor","contents":[["PrimSubmodules"],"Lol"]},{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeVar","contents":"a"}]}]},null]},"edDataCtorFields":[{"Ident":"value0"}]}},{"EDValue":{"edValueName":{"Ident":"x"},"edValueType":{"annotation":[{"start":[7,6],"name":"/home/harry/code/purescript/tests/purs/docs/src/PrimSubmodules.purs","end":[7,14]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[7,6],"name":"/home/harry/code/purescript/tests/purs/docs/src/PrimSubmodules.purs","end":[7,9]},[]],"tag":"TypeConstructor","contents":[["PrimSubmodules"],"Lol"]},{"annotation":[{"start":[7,10],"name":"/home/harry/code/purescript/tests/purs/docs/src/PrimSubmodules.purs","end":[7,14]},[]],"tag":"TypeConstructor","contents":[["Prim","Ordering"],"LT"]}]}}},{"EDValue":{"edValueName":{"Ident":"y"},"edValueType":{"annotation":[{"start":[10,6],"name":"/home/harry/code/purescript/tests/purs/docs/src/PrimSubmodules.purs","end":[10,14]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[10,6],"name":"/home/harry/code/purescript/tests/purs/docs/src/PrimSubmodules.purs","end":[10,9]},[]],"tag":"TypeConstructor","contents":[["PrimSubmodules"],"Lol"]},{"annotation":[{"start":[10,10],"name":"/home/harry/code/purescript/tests/purs/docs/src/PrimSubmodules.purs","end":[10,14]},[]],"tag":"TypeConstructor","contents":[["Prim","Ordering"],"EQ"]}]}}}],"efSourceSpan":{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/PrimSubmodules.purs","end":[11,10]}} \ No newline at end of file
diff --git a/tests/purs/docs/output/ReExportedTypeClass/externs.json b/tests/purs/docs/output/ReExportedTypeClass/externs.json
index 7db2137..fef5549 100644
--- a/tests/purs/docs/output/ReExportedTypeClass/externs.json
+++ b/tests/purs/docs/output/ReExportedTypeClass/externs.json
@@ -1 +1 @@
-{"efVersion":"0.13.2","efModuleName":["ReExportedTypeClass"],"efExports":[{"ReExportRef":[{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/ReExportedTypeClass.purs","end":[5,21]},{"exportSourceImportedFrom":["SomeTypeClass"],"exportSourceDefinedIn":["SomeTypeClass"]},{"TypeClassRef":[{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/ReExportedTypeClass.purs","end":[5,21]},"SomeClass"]}]},{"ReExportRef":[{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/ReExportedTypeClass.purs","end":[5,21]},{"exportSourceImportedFrom":["SomeTypeClass"],"exportSourceDefinedIn":["SomeTypeClass"]},{"ValueRef":[{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/ReExportedTypeClass.purs","end":[5,21]},{"Ident":"member"}]}]},{"ModuleRef":[{"start":[2,5],"name":"/home/harry/code/purescript/tests/purs/docs/src/ReExportedTypeClass.purs","end":[2,25]},["SomeTypeClass"]]}],"efImports":[{"eiModule":["Prim"],"eiImportType":{"Implicit":[]},"eiImportedAs":["Prim"]},{"eiModule":["Prim"],"eiImportType":{"Implicit":[]},"eiImportedAs":null},{"eiModule":["SomeTypeClass"],"eiImportType":{"Implicit":[]},"eiImportedAs":null}],"efFixities":[],"efTypeFixities":[],"efDeclarations":[],"efSourceSpan":{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/ReExportedTypeClass.purs","end":[5,21]}} \ No newline at end of file
+{"efVersion":"0.13.3","efModuleName":["ReExportedTypeClass"],"efExports":[{"ReExportRef":[{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/ReExportedTypeClass.purs","end":[5,21]},{"exportSourceImportedFrom":["SomeTypeClass"],"exportSourceDefinedIn":["SomeTypeClass"]},{"TypeClassRef":[{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/ReExportedTypeClass.purs","end":[5,21]},"SomeClass"]}]},{"ReExportRef":[{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/ReExportedTypeClass.purs","end":[5,21]},{"exportSourceImportedFrom":["SomeTypeClass"],"exportSourceDefinedIn":["SomeTypeClass"]},{"ValueRef":[{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/ReExportedTypeClass.purs","end":[5,21]},{"Ident":"member"}]}]},{"ModuleRef":[{"start":[2,5],"name":"/home/harry/code/purescript/tests/purs/docs/src/ReExportedTypeClass.purs","end":[2,25]},["SomeTypeClass"]]}],"efImports":[{"eiModule":["Prim"],"eiImportType":{"Implicit":[]},"eiImportedAs":["Prim"]},{"eiModule":["Prim"],"eiImportType":{"Implicit":[]},"eiImportedAs":null},{"eiModule":["SomeTypeClass"],"eiImportType":{"Implicit":[]},"eiImportedAs":null}],"efFixities":[],"efTypeFixities":[],"efDeclarations":[],"efSourceSpan":{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/ReExportedTypeClass.purs","end":[5,21]}} \ No newline at end of file
diff --git a/tests/purs/docs/output/SolitaryTypeClassMember/externs.json b/tests/purs/docs/output/SolitaryTypeClassMember/externs.json
index a33aeb4..a390523 100644
--- a/tests/purs/docs/output/SolitaryTypeClassMember/externs.json
+++ b/tests/purs/docs/output/SolitaryTypeClassMember/externs.json
@@ -1 +1 @@
-{"efVersion":"0.13.2","efModuleName":["SolitaryTypeClassMember"],"efExports":[{"ReExportRef":[{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/SolitaryTypeClassMember.purs","end":[5,30]},{"exportSourceImportedFrom":["SomeTypeClass"],"exportSourceDefinedIn":["SomeTypeClass"]},{"ValueRef":[{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/SolitaryTypeClassMember.purs","end":[5,30]},{"Ident":"member"}]}]},{"ModuleRef":[{"start":[2,5],"name":"/home/harry/code/purescript/tests/purs/docs/src/SolitaryTypeClassMember.purs","end":[2,25]},["SomeTypeClass"]]}],"efImports":[{"eiModule":["Prim"],"eiImportType":{"Implicit":[]},"eiImportedAs":["Prim"]},{"eiModule":["Prim"],"eiImportType":{"Implicit":[]},"eiImportedAs":null},{"eiModule":["SomeTypeClass"],"eiImportType":{"Explicit":[{"ValueRef":[{"start":[5,23],"name":"/home/harry/code/purescript/tests/purs/docs/src/SolitaryTypeClassMember.purs","end":[5,29]},{"Ident":"member"}]}]},"eiImportedAs":null}],"efFixities":[],"efTypeFixities":[],"efDeclarations":[],"efSourceSpan":{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/SolitaryTypeClassMember.purs","end":[5,30]}} \ No newline at end of file
+{"efVersion":"0.13.3","efModuleName":["SolitaryTypeClassMember"],"efExports":[{"ReExportRef":[{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/SolitaryTypeClassMember.purs","end":[5,30]},{"exportSourceImportedFrom":["SomeTypeClass"],"exportSourceDefinedIn":["SomeTypeClass"]},{"ValueRef":[{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/SolitaryTypeClassMember.purs","end":[5,30]},{"Ident":"member"}]}]},{"ModuleRef":[{"start":[2,5],"name":"/home/harry/code/purescript/tests/purs/docs/src/SolitaryTypeClassMember.purs","end":[2,25]},["SomeTypeClass"]]}],"efImports":[{"eiModule":["Prim"],"eiImportType":{"Implicit":[]},"eiImportedAs":["Prim"]},{"eiModule":["Prim"],"eiImportType":{"Implicit":[]},"eiImportedAs":null},{"eiModule":["SomeTypeClass"],"eiImportType":{"Explicit":[{"ValueRef":[{"start":[5,23],"name":"/home/harry/code/purescript/tests/purs/docs/src/SolitaryTypeClassMember.purs","end":[5,29]},{"Ident":"member"}]}]},"eiImportedAs":null}],"efFixities":[],"efTypeFixities":[],"efDeclarations":[],"efSourceSpan":{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/SolitaryTypeClassMember.purs","end":[5,30]}} \ No newline at end of file
diff --git a/tests/purs/docs/output/SomeTypeClass/externs.json b/tests/purs/docs/output/SomeTypeClass/externs.json
index b592123..8b8dd7a 100644
--- a/tests/purs/docs/output/SomeTypeClass/externs.json
+++ b/tests/purs/docs/output/SomeTypeClass/externs.json
@@ -1 +1 @@
-{"efVersion":"0.13.2","efModuleName":["SomeTypeClass"],"efExports":[{"ValueRef":[{"start":[2,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/SomeTypeClass.purs","end":[5,14]},{"Ident":"member"}]},{"TypeClassRef":[{"start":[2,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/SomeTypeClass.purs","end":[5,14]},"SomeClass"]}],"efImports":[{"eiModule":["Prim"],"eiImportType":{"Implicit":[]},"eiImportedAs":["Prim"]},{"eiModule":["Prim"],"eiImportType":{"Implicit":[]},"eiImportedAs":null}],"efFixities":[],"efTypeFixities":[],"efDeclarations":[{"EDValue":{"edValueName":{"Ident":"member"},"edValueType":{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"ForAll","contents":["a",{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"ConstrainedType","contents":[{"constraintAnn":[{"start":[0,0],"name":"","end":[0,0]},[]],"constraintClass":[["SomeTypeClass"],"SomeClass"],"constraintArgs":[{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeVar","contents":"a"}],"constraintData":null},{"annotation":[{"start":[5,13],"name":"/home/harry/code/purescript/tests/purs/docs/src/SomeTypeClass.purs","end":[5,14]},[]],"tag":"TypeVar","contents":"a"}]},0]}}},{"EDType":{"edTypeName":"SomeClass","edTypeKind":{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"FunKind","contents":[{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"NamedKind","contents":[["Prim"],"Type"]},{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"NamedKind","contents":[["Prim"],"Type"]}]},"edTypeDeclarationKind":"TypeSynonym"}},{"EDTypeSynonym":{"edTypeSynonymName":"SomeClass","edTypeSynonymArguments":[["a",null]],"edTypeSynonymType":{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeConstructor","contents":[["Prim"],"Record"]},{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"RCons","contents":["member",{"annotation":[{"start":[5,13],"name":"/home/harry/code/purescript/tests/purs/docs/src/SomeTypeClass.purs","end":[5,14]},[]],"tag":"TypeVar","contents":"a"},{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"REmpty"}]}]}}},{"EDClass":{"edClassName":"SomeClass","edClassTypeArguments":[["a",null]],"edClassMembers":[[{"Ident":"member"},{"annotation":[{"start":[5,13],"name":"/home/harry/code/purescript/tests/purs/docs/src/SomeTypeClass.purs","end":[5,14]},[]],"tag":"TypeVar","contents":"a"}]],"edClassConstraints":[],"edFunctionalDependencies":[],"edIsEmpty":false}}],"efSourceSpan":{"start":[2,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/SomeTypeClass.purs","end":[5,14]}} \ No newline at end of file
+{"efVersion":"0.13.3","efModuleName":["SomeTypeClass"],"efExports":[{"ValueRef":[{"start":[2,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/SomeTypeClass.purs","end":[5,14]},{"Ident":"member"}]},{"TypeClassRef":[{"start":[2,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/SomeTypeClass.purs","end":[5,14]},"SomeClass"]}],"efImports":[{"eiModule":["Prim"],"eiImportType":{"Implicit":[]},"eiImportedAs":["Prim"]},{"eiModule":["Prim"],"eiImportType":{"Implicit":[]},"eiImportedAs":null}],"efFixities":[],"efTypeFixities":[],"efDeclarations":[{"EDValue":{"edValueName":{"Ident":"member"},"edValueType":{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"ForAll","contents":["a",{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"ConstrainedType","contents":[{"constraintAnn":[{"start":[0,0],"name":"","end":[0,0]},[]],"constraintClass":[["SomeTypeClass"],"SomeClass"],"constraintArgs":[{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeVar","contents":"a"}],"constraintData":null},{"annotation":[{"start":[5,13],"name":"/home/harry/code/purescript/tests/purs/docs/src/SomeTypeClass.purs","end":[5,14]},[]],"tag":"TypeVar","contents":"a"}]},0]}}},{"EDType":{"edTypeName":"SomeClass","edTypeKind":{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"FunKind","contents":[{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"NamedKind","contents":[["Prim"],"Type"]},{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"NamedKind","contents":[["Prim"],"Type"]}]},"edTypeDeclarationKind":"TypeSynonym"}},{"EDTypeSynonym":{"edTypeSynonymName":"SomeClass","edTypeSynonymArguments":[["a",null]],"edTypeSynonymType":{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeConstructor","contents":[["Prim"],"Record"]},{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"RCons","contents":["member",{"annotation":[{"start":[5,13],"name":"/home/harry/code/purescript/tests/purs/docs/src/SomeTypeClass.purs","end":[5,14]},[]],"tag":"TypeVar","contents":"a"},{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"REmpty"}]}]}}},{"EDClass":{"edClassName":"SomeClass","edClassTypeArguments":[["a",null]],"edClassMembers":[[{"Ident":"member"},{"annotation":[{"start":[5,13],"name":"/home/harry/code/purescript/tests/purs/docs/src/SomeTypeClass.purs","end":[5,14]},[]],"tag":"TypeVar","contents":"a"}]],"edClassConstraints":[],"edFunctionalDependencies":[],"edIsEmpty":false}}],"efSourceSpan":{"start":[2,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/SomeTypeClass.purs","end":[5,14]}} \ No newline at end of file
diff --git a/tests/purs/docs/output/Transitive1/externs.json b/tests/purs/docs/output/Transitive1/externs.json
index 0fc4d8e..ec2e4e0 100644
--- a/tests/purs/docs/output/Transitive1/externs.json
+++ b/tests/purs/docs/output/Transitive1/externs.json
@@ -1 +1 @@
-{"efVersion":"0.13.2","efModuleName":["Transitive1"],"efExports":[{"ReExportRef":[{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/Transitive1.purs","end":[5,19]},{"exportSourceImportedFrom":["Transitive2"],"exportSourceDefinedIn":["Transitive3"]},{"ValueRef":[{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/Transitive1.purs","end":[5,19]},{"Ident":"transitive3"}]}]},{"ModuleRef":[{"start":[2,5],"name":"/home/harry/code/purescript/tests/purs/docs/src/Transitive1.purs","end":[2,23]},["Transitive2"]]}],"efImports":[{"eiModule":["Prim"],"eiImportType":{"Implicit":[]},"eiImportedAs":["Prim"]},{"eiModule":["Prim"],"eiImportType":{"Implicit":[]},"eiImportedAs":null},{"eiModule":["Transitive2"],"eiImportType":{"Implicit":[]},"eiImportedAs":null}],"efFixities":[],"efTypeFixities":[],"efDeclarations":[],"efSourceSpan":{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/Transitive1.purs","end":[5,19]}} \ No newline at end of file
+{"efVersion":"0.13.3","efModuleName":["Transitive1"],"efExports":[{"ReExportRef":[{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/Transitive1.purs","end":[5,19]},{"exportSourceImportedFrom":["Transitive2"],"exportSourceDefinedIn":["Transitive3"]},{"ValueRef":[{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/Transitive1.purs","end":[5,19]},{"Ident":"transitive3"}]}]},{"ModuleRef":[{"start":[2,5],"name":"/home/harry/code/purescript/tests/purs/docs/src/Transitive1.purs","end":[2,23]},["Transitive2"]]}],"efImports":[{"eiModule":["Prim"],"eiImportType":{"Implicit":[]},"eiImportedAs":["Prim"]},{"eiModule":["Prim"],"eiImportType":{"Implicit":[]},"eiImportedAs":null},{"eiModule":["Transitive2"],"eiImportType":{"Implicit":[]},"eiImportedAs":null}],"efFixities":[],"efTypeFixities":[],"efDeclarations":[],"efSourceSpan":{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/Transitive1.purs","end":[5,19]}} \ No newline at end of file
diff --git a/tests/purs/docs/output/Transitive2/externs.json b/tests/purs/docs/output/Transitive2/externs.json
index 5f97685..e8ad330 100644
--- a/tests/purs/docs/output/Transitive2/externs.json
+++ b/tests/purs/docs/output/Transitive2/externs.json
@@ -1 +1 @@
-{"efVersion":"0.13.2","efModuleName":["Transitive2"],"efExports":[{"ReExportRef":[{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/Transitive2.purs","end":[5,19]},{"exportSourceImportedFrom":["Transitive3"],"exportSourceDefinedIn":["Transitive3"]},{"ValueRef":[{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/Transitive2.purs","end":[5,19]},{"Ident":"transitive3"}]}]},{"ModuleRef":[{"start":[2,5],"name":"/home/harry/code/purescript/tests/purs/docs/src/Transitive2.purs","end":[2,23]},["Transitive3"]]}],"efImports":[{"eiModule":["Prim"],"eiImportType":{"Implicit":[]},"eiImportedAs":["Prim"]},{"eiModule":["Prim"],"eiImportType":{"Implicit":[]},"eiImportedAs":null},{"eiModule":["Transitive3"],"eiImportType":{"Implicit":[]},"eiImportedAs":null}],"efFixities":[],"efTypeFixities":[],"efDeclarations":[],"efSourceSpan":{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/Transitive2.purs","end":[5,19]}} \ No newline at end of file
+{"efVersion":"0.13.3","efModuleName":["Transitive2"],"efExports":[{"ReExportRef":[{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/Transitive2.purs","end":[5,19]},{"exportSourceImportedFrom":["Transitive3"],"exportSourceDefinedIn":["Transitive3"]},{"ValueRef":[{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/Transitive2.purs","end":[5,19]},{"Ident":"transitive3"}]}]},{"ModuleRef":[{"start":[2,5],"name":"/home/harry/code/purescript/tests/purs/docs/src/Transitive2.purs","end":[2,23]},["Transitive3"]]}],"efImports":[{"eiModule":["Prim"],"eiImportType":{"Implicit":[]},"eiImportedAs":["Prim"]},{"eiModule":["Prim"],"eiImportType":{"Implicit":[]},"eiImportedAs":null},{"eiModule":["Transitive3"],"eiImportType":{"Implicit":[]},"eiImportedAs":null}],"efFixities":[],"efTypeFixities":[],"efDeclarations":[],"efSourceSpan":{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/Transitive2.purs","end":[5,19]}} \ No newline at end of file
diff --git a/tests/purs/docs/output/Transitive3/externs.json b/tests/purs/docs/output/Transitive3/externs.json
index ec9e18e..63033c5 100644
--- a/tests/purs/docs/output/Transitive3/externs.json
+++ b/tests/purs/docs/output/Transitive3/externs.json
@@ -1 +1 @@
-{"efVersion":"0.13.2","efModuleName":["Transitive3"],"efExports":[{"ValueRef":[{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/Transitive3.purs","end":[4,16]},{"Ident":"transitive3"}]}],"efImports":[{"eiModule":["Prim"],"eiImportType":{"Implicit":[]},"eiImportedAs":["Prim"]},{"eiModule":["Prim"],"eiImportType":{"Implicit":[]},"eiImportedAs":null}],"efFixities":[],"efTypeFixities":[],"efDeclarations":[{"EDValue":{"edValueName":{"Ident":"transitive3"},"edValueType":{"annotation":[{"start":[3,16],"name":"/home/harry/code/purescript/tests/purs/docs/src/Transitive3.purs","end":[3,19]},[]],"tag":"TypeConstructor","contents":[["Prim"],"Int"]}}}],"efSourceSpan":{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/Transitive3.purs","end":[4,16]}} \ No newline at end of file
+{"efVersion":"0.13.3","efModuleName":["Transitive3"],"efExports":[{"ValueRef":[{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/Transitive3.purs","end":[4,16]},{"Ident":"transitive3"}]}],"efImports":[{"eiModule":["Prim"],"eiImportType":{"Implicit":[]},"eiImportedAs":["Prim"]},{"eiModule":["Prim"],"eiImportType":{"Implicit":[]},"eiImportedAs":null}],"efFixities":[],"efTypeFixities":[],"efDeclarations":[{"EDValue":{"edValueName":{"Ident":"transitive3"},"edValueType":{"annotation":[{"start":[3,16],"name":"/home/harry/code/purescript/tests/purs/docs/src/Transitive3.purs","end":[3,19]},[]],"tag":"TypeConstructor","contents":[["Prim"],"Int"]}}}],"efSourceSpan":{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/Transitive3.purs","end":[4,16]}} \ No newline at end of file
diff --git a/tests/purs/docs/output/TypeClassWithFunDeps/externs.json b/tests/purs/docs/output/TypeClassWithFunDeps/externs.json
index 190c1db..c6fafcf 100644
--- a/tests/purs/docs/output/TypeClassWithFunDeps/externs.json
+++ b/tests/purs/docs/output/TypeClassWithFunDeps/externs.json
@@ -1 +1 @@
-{"efVersion":"0.13.2","efModuleName":["TypeClassWithFunDeps"],"efExports":[{"ValueRef":[{"start":[2,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeClassWithFunDeps.purs","end":[5,20]},{"Ident":"aMember"}]},{"TypeClassRef":[{"start":[2,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeClassWithFunDeps.purs","end":[5,20]},"TypeClassWithFunDeps"]}],"efImports":[{"eiModule":["Prim"],"eiImportType":{"Implicit":[]},"eiImportedAs":["Prim"]},{"eiModule":["Prim"],"eiImportType":{"Implicit":[]},"eiImportedAs":null}],"efFixities":[],"efTypeFixities":[],"efDeclarations":[{"EDValue":{"edValueName":{"Ident":"aMember"},"edValueType":{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"ForAll","contents":["a",{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"ForAll","contents":["b",{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"ForAll","contents":["c",{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"ForAll","contents":["d",{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"ForAll","contents":["e",{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"ConstrainedType","contents":[{"constraintAnn":[{"start":[0,0],"name":"","end":[0,0]},[]],"constraintClass":[["TypeClassWithFunDeps"],"TypeClassWithFunDeps"],"constraintArgs":[{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeVar","contents":"a"},{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeVar","contents":"b"},{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeVar","contents":"c"},{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeVar","contents":"d"},{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeVar","contents":"e"}],"constraintData":null},{"annotation":[{"start":[5,14],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeClassWithFunDeps.purs","end":[5,20]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[5,14],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeClassWithFunDeps.purs","end":[5,20]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[5,16],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeClassWithFunDeps.purs","end":[5,18]},[]],"tag":"TypeConstructor","contents":[["Prim"],"Function"]},{"annotation":[{"start":[5,14],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeClassWithFunDeps.purs","end":[5,15]},[]],"tag":"TypeVar","contents":"a"}]},{"annotation":[{"start":[5,19],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeClassWithFunDeps.purs","end":[5,20]},[]],"tag":"TypeVar","contents":"b"}]}]},0]},1]},2]},3]},4]}}},{"EDType":{"edTypeName":"TypeClassWithFunDeps","edTypeKind":{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"FunKind","contents":[{"annotation":[{"start":[5,16],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeClassWithFunDeps.purs","end":[5,18]},[]],"tag":"NamedKind","contents":[["Prim"],"Type"]},{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"FunKind","contents":[{"annotation":[{"start":[5,16],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeClassWithFunDeps.purs","end":[5,18]},[]],"tag":"NamedKind","contents":[["Prim"],"Type"]},{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"FunKind","contents":[{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"NamedKind","contents":[["Prim"],"Type"]},{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"FunKind","contents":[{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"NamedKind","contents":[["Prim"],"Type"]},{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"FunKind","contents":[{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"NamedKind","contents":[["Prim"],"Type"]},{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"NamedKind","contents":[["Prim"],"Type"]}]}]}]}]}]},"edTypeDeclarationKind":"TypeSynonym"}},{"EDTypeSynonym":{"edTypeSynonymName":"TypeClassWithFunDeps","edTypeSynonymArguments":[["a",null],["b",null],["c",null],["d",null],["e",null]],"edTypeSynonymType":{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeConstructor","contents":[["Prim"],"Record"]},{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"RCons","contents":["aMember",{"annotation":[{"start":[5,14],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeClassWithFunDeps.purs","end":[5,20]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[5,14],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeClassWithFunDeps.purs","end":[5,20]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[5,16],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeClassWithFunDeps.purs","end":[5,18]},[]],"tag":"TypeConstructor","contents":[["Prim"],"Function"]},{"annotation":[{"start":[5,14],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeClassWithFunDeps.purs","end":[5,15]},[]],"tag":"TypeVar","contents":"a"}]},{"annotation":[{"start":[5,19],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeClassWithFunDeps.purs","end":[5,20]},[]],"tag":"TypeVar","contents":"b"}]},{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"REmpty"}]}]}}},{"EDClass":{"edClassName":"TypeClassWithFunDeps","edClassTypeArguments":[["a",null],["b",null],["c",null],["d",null],["e",null]],"edClassMembers":[[{"Ident":"aMember"},{"annotation":[{"start":[5,14],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeClassWithFunDeps.purs","end":[5,20]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[5,14],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeClassWithFunDeps.purs","end":[5,20]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[5,16],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeClassWithFunDeps.purs","end":[5,18]},[]],"tag":"TypeConstructor","contents":[["Prim"],"Function"]},{"annotation":[{"start":[5,14],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeClassWithFunDeps.purs","end":[5,15]},[]],"tag":"TypeVar","contents":"a"}]},{"annotation":[{"start":[5,19],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeClassWithFunDeps.purs","end":[5,20]},[]],"tag":"TypeVar","contents":"b"}]}]],"edClassConstraints":[],"edFunctionalDependencies":[{"determiners":[0,1],"determined":[2]},{"determiners":[2],"determined":[3,4]}],"edIsEmpty":false}}],"efSourceSpan":{"start":[2,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeClassWithFunDeps.purs","end":[5,20]}} \ No newline at end of file
+{"efVersion":"0.13.3","efModuleName":["TypeClassWithFunDeps"],"efExports":[{"ValueRef":[{"start":[2,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeClassWithFunDeps.purs","end":[5,20]},{"Ident":"aMember"}]},{"TypeClassRef":[{"start":[2,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeClassWithFunDeps.purs","end":[5,20]},"TypeClassWithFunDeps"]}],"efImports":[{"eiModule":["Prim"],"eiImportType":{"Implicit":[]},"eiImportedAs":["Prim"]},{"eiModule":["Prim"],"eiImportType":{"Implicit":[]},"eiImportedAs":null}],"efFixities":[],"efTypeFixities":[],"efDeclarations":[{"EDValue":{"edValueName":{"Ident":"aMember"},"edValueType":{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"ForAll","contents":["a",{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"ForAll","contents":["b",{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"ForAll","contents":["c",{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"ForAll","contents":["d",{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"ForAll","contents":["e",{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"ConstrainedType","contents":[{"constraintAnn":[{"start":[0,0],"name":"","end":[0,0]},[]],"constraintClass":[["TypeClassWithFunDeps"],"TypeClassWithFunDeps"],"constraintArgs":[{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeVar","contents":"a"},{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeVar","contents":"b"},{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeVar","contents":"c"},{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeVar","contents":"d"},{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeVar","contents":"e"}],"constraintData":null},{"annotation":[{"start":[5,14],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeClassWithFunDeps.purs","end":[5,20]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[5,14],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeClassWithFunDeps.purs","end":[5,20]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[5,16],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeClassWithFunDeps.purs","end":[5,18]},[]],"tag":"TypeConstructor","contents":[["Prim"],"Function"]},{"annotation":[{"start":[5,14],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeClassWithFunDeps.purs","end":[5,15]},[]],"tag":"TypeVar","contents":"a"}]},{"annotation":[{"start":[5,19],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeClassWithFunDeps.purs","end":[5,20]},[]],"tag":"TypeVar","contents":"b"}]}]},0]},1]},2]},3]},4]}}},{"EDType":{"edTypeName":"TypeClassWithFunDeps","edTypeKind":{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"FunKind","contents":[{"annotation":[{"start":[5,16],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeClassWithFunDeps.purs","end":[5,18]},[]],"tag":"NamedKind","contents":[["Prim"],"Type"]},{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"FunKind","contents":[{"annotation":[{"start":[5,16],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeClassWithFunDeps.purs","end":[5,18]},[]],"tag":"NamedKind","contents":[["Prim"],"Type"]},{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"FunKind","contents":[{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"NamedKind","contents":[["Prim"],"Type"]},{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"FunKind","contents":[{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"NamedKind","contents":[["Prim"],"Type"]},{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"FunKind","contents":[{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"NamedKind","contents":[["Prim"],"Type"]},{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"NamedKind","contents":[["Prim"],"Type"]}]}]}]}]}]},"edTypeDeclarationKind":"TypeSynonym"}},{"EDTypeSynonym":{"edTypeSynonymName":"TypeClassWithFunDeps","edTypeSynonymArguments":[["a",null],["b",null],["c",null],["d",null],["e",null]],"edTypeSynonymType":{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeConstructor","contents":[["Prim"],"Record"]},{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"RCons","contents":["aMember",{"annotation":[{"start":[5,14],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeClassWithFunDeps.purs","end":[5,20]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[5,14],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeClassWithFunDeps.purs","end":[5,20]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[5,16],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeClassWithFunDeps.purs","end":[5,18]},[]],"tag":"TypeConstructor","contents":[["Prim"],"Function"]},{"annotation":[{"start":[5,14],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeClassWithFunDeps.purs","end":[5,15]},[]],"tag":"TypeVar","contents":"a"}]},{"annotation":[{"start":[5,19],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeClassWithFunDeps.purs","end":[5,20]},[]],"tag":"TypeVar","contents":"b"}]},{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"REmpty"}]}]}}},{"EDClass":{"edClassName":"TypeClassWithFunDeps","edClassTypeArguments":[["a",null],["b",null],["c",null],["d",null],["e",null]],"edClassMembers":[[{"Ident":"aMember"},{"annotation":[{"start":[5,14],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeClassWithFunDeps.purs","end":[5,20]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[5,14],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeClassWithFunDeps.purs","end":[5,20]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[5,16],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeClassWithFunDeps.purs","end":[5,18]},[]],"tag":"TypeConstructor","contents":[["Prim"],"Function"]},{"annotation":[{"start":[5,14],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeClassWithFunDeps.purs","end":[5,15]},[]],"tag":"TypeVar","contents":"a"}]},{"annotation":[{"start":[5,19],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeClassWithFunDeps.purs","end":[5,20]},[]],"tag":"TypeVar","contents":"b"}]}]],"edClassConstraints":[],"edFunctionalDependencies":[{"determiners":[0,1],"determined":[2]},{"determiners":[2],"determined":[3,4]}],"edIsEmpty":false}}],"efSourceSpan":{"start":[2,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeClassWithFunDeps.purs","end":[5,20]}} \ No newline at end of file
diff --git a/tests/purs/docs/output/TypeClassWithoutMembers/externs.json b/tests/purs/docs/output/TypeClassWithoutMembers/externs.json
index c9adf0c..b8a2486 100644
--- a/tests/purs/docs/output/TypeClassWithoutMembers/externs.json
+++ b/tests/purs/docs/output/TypeClassWithoutMembers/externs.json
@@ -1 +1 @@
-{"efVersion":"0.13.2","efModuleName":["TypeClassWithoutMembers"],"efExports":[{"ReExportRef":[{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeClassWithoutMembers.purs","end":[5,43]},{"exportSourceImportedFrom":["TypeClassWithoutMembersIntermediate"],"exportSourceDefinedIn":["SomeTypeClass"]},{"TypeClassRef":[{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeClassWithoutMembers.purs","end":[5,43]},"SomeClass"]}]},{"ModuleRef":[{"start":[2,5],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeClassWithoutMembers.purs","end":[2,47]},["TypeClassWithoutMembersIntermediate"]]}],"efImports":[{"eiModule":["Prim"],"eiImportType":{"Implicit":[]},"eiImportedAs":["Prim"]},{"eiModule":["Prim"],"eiImportType":{"Implicit":[]},"eiImportedAs":null},{"eiModule":["TypeClassWithoutMembersIntermediate"],"eiImportType":{"Implicit":[]},"eiImportedAs":null}],"efFixities":[],"efTypeFixities":[],"efDeclarations":[],"efSourceSpan":{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeClassWithoutMembers.purs","end":[5,43]}} \ No newline at end of file
+{"efVersion":"0.13.3","efModuleName":["TypeClassWithoutMembers"],"efExports":[{"ReExportRef":[{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeClassWithoutMembers.purs","end":[5,43]},{"exportSourceImportedFrom":["TypeClassWithoutMembersIntermediate"],"exportSourceDefinedIn":["SomeTypeClass"]},{"TypeClassRef":[{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeClassWithoutMembers.purs","end":[5,43]},"SomeClass"]}]},{"ModuleRef":[{"start":[2,5],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeClassWithoutMembers.purs","end":[2,47]},["TypeClassWithoutMembersIntermediate"]]}],"efImports":[{"eiModule":["Prim"],"eiImportType":{"Implicit":[]},"eiImportedAs":["Prim"]},{"eiModule":["Prim"],"eiImportType":{"Implicit":[]},"eiImportedAs":null},{"eiModule":["TypeClassWithoutMembersIntermediate"],"eiImportType":{"Implicit":[]},"eiImportedAs":null}],"efFixities":[],"efTypeFixities":[],"efDeclarations":[],"efSourceSpan":{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeClassWithoutMembers.purs","end":[5,43]}} \ No newline at end of file
diff --git a/tests/purs/docs/output/TypeClassWithoutMembersIntermediate/externs.json b/tests/purs/docs/output/TypeClassWithoutMembersIntermediate/externs.json
index 16b2162..8af4f0b 100644
--- a/tests/purs/docs/output/TypeClassWithoutMembersIntermediate/externs.json
+++ b/tests/purs/docs/output/TypeClassWithoutMembersIntermediate/externs.json
@@ -1 +1 @@
-{"efVersion":"0.13.2","efModuleName":["TypeClassWithoutMembersIntermediate"],"efExports":[{"ReExportRef":[{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeClassWithoutMembersIntermediate.purs","end":[5,39]},{"exportSourceImportedFrom":["SomeTypeClass"],"exportSourceDefinedIn":["SomeTypeClass"]},{"TypeClassRef":[{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeClassWithoutMembersIntermediate.purs","end":[5,39]},"SomeClass"]}]},{"ModuleRef":[{"start":[2,5],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeClassWithoutMembersIntermediate.purs","end":[2,25]},["SomeTypeClass"]]}],"efImports":[{"eiModule":["Prim"],"eiImportType":{"Implicit":[]},"eiImportedAs":["Prim"]},{"eiModule":["Prim"],"eiImportType":{"Implicit":[]},"eiImportedAs":null},{"eiModule":["SomeTypeClass"],"eiImportType":{"Explicit":[{"TypeClassRef":[{"start":[5,23],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeClassWithoutMembersIntermediate.purs","end":[5,38]},"SomeClass"]}]},"eiImportedAs":null}],"efFixities":[],"efTypeFixities":[],"efDeclarations":[],"efSourceSpan":{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeClassWithoutMembersIntermediate.purs","end":[5,39]}} \ No newline at end of file
+{"efVersion":"0.13.3","efModuleName":["TypeClassWithoutMembersIntermediate"],"efExports":[{"ReExportRef":[{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeClassWithoutMembersIntermediate.purs","end":[5,39]},{"exportSourceImportedFrom":["SomeTypeClass"],"exportSourceDefinedIn":["SomeTypeClass"]},{"TypeClassRef":[{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeClassWithoutMembersIntermediate.purs","end":[5,39]},"SomeClass"]}]},{"ModuleRef":[{"start":[2,5],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeClassWithoutMembersIntermediate.purs","end":[2,25]},["SomeTypeClass"]]}],"efImports":[{"eiModule":["Prim"],"eiImportType":{"Implicit":[]},"eiImportedAs":["Prim"]},{"eiModule":["Prim"],"eiImportType":{"Implicit":[]},"eiImportedAs":null},{"eiModule":["SomeTypeClass"],"eiImportType":{"Explicit":[{"TypeClassRef":[{"start":[5,23],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeClassWithoutMembersIntermediate.purs","end":[5,38]},"SomeClass"]}]},"eiImportedAs":null}],"efFixities":[],"efTypeFixities":[],"efDeclarations":[],"efSourceSpan":{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeClassWithoutMembersIntermediate.purs","end":[5,39]}} \ No newline at end of file
diff --git a/tests/purs/docs/output/TypeLevelString/externs.json b/tests/purs/docs/output/TypeLevelString/externs.json
index 756e82e..4f32df4 100644
--- a/tests/purs/docs/output/TypeLevelString/externs.json
+++ b/tests/purs/docs/output/TypeLevelString/externs.json
@@ -1 +1 @@
-{"efVersion":"0.13.2","efModuleName":["TypeLevelString"],"efExports":[{"TypeRef":[{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeLevelString.purs","end":[9,49]},"Foo",[]]},{"TypeClassRef":[{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeLevelString.purs","end":[9,49]},"Bar"]},{"TypeInstanceRef":[{"start":[0,0],"name":"<generated>","end":[0,0]},{"Ident":"fooBar"}]}],"efImports":[{"eiModule":["Prim"],"eiImportType":{"Implicit":[]},"eiImportedAs":["Prim"]},{"eiModule":["Prim"],"eiImportType":{"Implicit":[]},"eiImportedAs":null},{"eiModule":["Prim","TypeError"],"eiImportType":{"Explicit":[{"TypeClassRef":[{"start":[3,24],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeLevelString.purs","end":[3,34]},"Fail"]},{"TypeRef":[{"start":[3,36],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeLevelString.purs","end":[3,40]},"Text",[]]}]},"eiImportedAs":null}],"efFixities":[],"efTypeFixities":[],"efDeclarations":[{"EDType":{"edTypeName":"Foo","edTypeKind":{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"NamedKind","contents":[["Prim"],"Type"]},"edTypeDeclarationKind":{"DataType":{"args":[],"ctors":[]}}}},{"EDType":{"edTypeName":"Bar","edTypeKind":{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"FunKind","contents":[{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"NamedKind","contents":[["Prim"],"Type"]},{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"NamedKind","contents":[["Prim"],"Type"]}]},"edTypeDeclarationKind":"TypeSynonym"}},{"EDTypeSynonym":{"edTypeSynonymName":"Bar","edTypeSynonymArguments":[["a",null]],"edTypeSynonymType":{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeConstructor","contents":[["Prim"],"Record"]},{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"REmpty"}]}}},{"EDClass":{"edClassName":"Bar","edClassTypeArguments":[["a",null]],"edClassMembers":[],"edClassConstraints":[],"edFunctionalDependencies":[],"edIsEmpty":true}},{"EDInstance":{"edInstanceClassName":[["TypeLevelString"],"Bar"],"edInstanceName":{"Ident":"fooBar"},"edInstanceTypes":[{"annotation":[{"start":[9,46],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeLevelString.purs","end":[9,49]},[]],"tag":"TypeConstructor","contents":[["TypeLevelString"],"Foo"]}],"edInstanceConstraints":[{"constraintAnn":[{"start":[9,20],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeLevelString.purs","end":[9,38]},[]],"constraintClass":[["Prim","TypeError"],"Fail"],"constraintArgs":[{"annotation":[{"start":[9,26],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeLevelString.purs","end":[9,37]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[9,26],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeLevelString.purs","end":[9,30]},[]],"tag":"TypeConstructor","contents":[["Prim","TypeError"],"Text"]},{"annotation":[{"start":[9,31],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeLevelString.purs","end":[9,37]},[]],"tag":"TypeLevelString","contents":"oops"}]}],"constraintData":null}],"edInstanceChain":[[["TypeLevelString"],{"Ident":"fooBar"}]],"edInstanceChainIndex":0}}],"efSourceSpan":{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeLevelString.purs","end":[9,49]}} \ No newline at end of file
+{"efVersion":"0.13.3","efModuleName":["TypeLevelString"],"efExports":[{"TypeRef":[{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeLevelString.purs","end":[9,49]},"Foo",[]]},{"TypeClassRef":[{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeLevelString.purs","end":[9,49]},"Bar"]},{"TypeInstanceRef":[{"start":[0,0],"name":"<generated>","end":[0,0]},{"Ident":"fooBar"}]}],"efImports":[{"eiModule":["Prim"],"eiImportType":{"Implicit":[]},"eiImportedAs":["Prim"]},{"eiModule":["Prim"],"eiImportType":{"Implicit":[]},"eiImportedAs":null},{"eiModule":["Prim","TypeError"],"eiImportType":{"Explicit":[{"TypeClassRef":[{"start":[3,24],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeLevelString.purs","end":[3,34]},"Fail"]},{"TypeRef":[{"start":[3,36],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeLevelString.purs","end":[3,40]},"Text",[]]}]},"eiImportedAs":null}],"efFixities":[],"efTypeFixities":[],"efDeclarations":[{"EDType":{"edTypeName":"Foo","edTypeKind":{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"NamedKind","contents":[["Prim"],"Type"]},"edTypeDeclarationKind":{"DataType":{"args":[],"ctors":[]}}}},{"EDType":{"edTypeName":"Bar","edTypeKind":{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"FunKind","contents":[{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"NamedKind","contents":[["Prim"],"Type"]},{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"NamedKind","contents":[["Prim"],"Type"]}]},"edTypeDeclarationKind":"TypeSynonym"}},{"EDTypeSynonym":{"edTypeSynonymName":"Bar","edTypeSynonymArguments":[["a",null]],"edTypeSynonymType":{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeConstructor","contents":[["Prim"],"Record"]},{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"REmpty"}]}}},{"EDClass":{"edClassName":"Bar","edClassTypeArguments":[["a",null]],"edClassMembers":[],"edClassConstraints":[],"edFunctionalDependencies":[],"edIsEmpty":true}},{"EDInstance":{"edInstanceClassName":[["TypeLevelString"],"Bar"],"edInstanceName":{"Ident":"fooBar"},"edInstanceTypes":[{"annotation":[{"start":[9,46],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeLevelString.purs","end":[9,49]},[]],"tag":"TypeConstructor","contents":[["TypeLevelString"],"Foo"]}],"edInstanceConstraints":[{"constraintAnn":[{"start":[9,20],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeLevelString.purs","end":[9,38]},[]],"constraintClass":[["Prim","TypeError"],"Fail"],"constraintArgs":[{"annotation":[{"start":[9,26],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeLevelString.purs","end":[9,37]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[9,26],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeLevelString.purs","end":[9,30]},[]],"tag":"TypeConstructor","contents":[["Prim","TypeError"],"Text"]},{"annotation":[{"start":[9,31],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeLevelString.purs","end":[9,37]},[]],"tag":"TypeLevelString","contents":"oops"}]}],"constraintData":null}],"edInstanceChain":[[["TypeLevelString"],{"Ident":"fooBar"}]],"edInstanceChainIndex":0}}],"efSourceSpan":{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeLevelString.purs","end":[9,49]}} \ No newline at end of file
diff --git a/tests/purs/docs/output/TypeOpAliases/externs.json b/tests/purs/docs/output/TypeOpAliases/externs.json
index 415fc44..a0b7a21 100644
--- a/tests/purs/docs/output/TypeOpAliases/externs.json
+++ b/tests/purs/docs/output/TypeOpAliases/externs.json
@@ -1 +1 @@
-{"efVersion":"0.13.2","efModuleName":["TypeOpAliases"],"efExports":[{"ValueRef":[{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeOpAliases.purs","end":[44,23]},{"Ident":"show"}]},{"ValueRef":[{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeOpAliases.purs","end":[44,23]},{"Ident":"testL"}]},{"ValueRef":[{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeOpAliases.purs","end":[44,23]},{"Ident":"testR"}]},{"TypeRef":[{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeOpAliases.purs","end":[44,23]},"AltFn",[]]},{"TypeOpRef":[{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeOpAliases.purs","end":[44,23]},"~>"]},{"ValueRef":[{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeOpAliases.purs","end":[44,23]},{"Ident":"test1"}]},{"ValueRef":[{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeOpAliases.purs","end":[44,23]},{"Ident":"test2"}]},{"ValueRef":[{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeOpAliases.purs","end":[44,23]},{"Ident":"test3"}]},{"ValueRef":[{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeOpAliases.purs","end":[44,23]},{"Ident":"test4"}]},{"TypeRef":[{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeOpAliases.purs","end":[44,23]},"Tuple",["Tuple"]]},{"ValueOpRef":[{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeOpAliases.purs","end":[44,23]},"×"]},{"TypeOpRef":[{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeOpAliases.purs","end":[44,23]},"×"]},{"TypeRef":[{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeOpAliases.purs","end":[44,23]},"Either",["Left","Right"]]},{"TypeOpRef":[{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeOpAliases.purs","end":[44,23]},"⊕"]},{"ValueRef":[{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeOpAliases.purs","end":[44,23]},{"Ident":"third"}]},{"TypeClassRef":[{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeOpAliases.purs","end":[44,23]},"Show"]},{"TypeClassRef":[{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeOpAliases.purs","end":[44,23]},"TestL"]},{"TypeClassRef":[{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeOpAliases.purs","end":[44,23]},"TestR"]},{"TypeInstanceRef":[{"start":[0,0],"name":"<generated>","end":[0,0]},{"Ident":"showTuple"}]},{"TypeInstanceRef":[{"start":[0,0],"name":"<generated>","end":[0,0]},{"Ident":"testLEither"}]},{"TypeInstanceRef":[{"start":[0,0],"name":"<generated>","end":[0,0]},{"Ident":"testREither"}]}],"efImports":[{"eiModule":["Prim"],"eiImportType":{"Implicit":[]},"eiImportedAs":["Prim"]},{"eiModule":["Prim"],"eiImportType":{"Implicit":[]},"eiImportedAs":null}],"efFixities":[{"efAssociativity":"infixl","efPrecedence":6,"efOperator":"×","efAlias":[["TypeOpAliases"],{"Right":"Tuple"}]}],"efTypeFixities":[{"efTypeAssociativity":"infixr","efTypePrecedence":6,"efTypeOperator":"~>","efTypeAlias":[["TypeOpAliases"],"AltFn"]},{"efTypeAssociativity":"infixl","efTypePrecedence":6,"efTypeOperator":"×","efTypeAlias":[["TypeOpAliases"],"Tuple"]},{"efTypeAssociativity":"infixl","efTypePrecedence":5,"efTypeOperator":"⊕","efTypeAlias":[["TypeOpAliases"],"Either"]}],"efDeclarations":[{"EDValue":{"edValueName":{"Ident":"show"},"edValueType":{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"ForAll","contents":["a",{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"ConstrainedType","contents":[{"constraintAnn":[{"start":[0,0],"name":"","end":[0,0]},[]],"constraintClass":[["TypeOpAliases"],"Show"],"constraintArgs":[{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeVar","contents":"a"}],"constraintData":null},{"annotation":[{"start":[25,11],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeOpAliases.purs","end":[25,22]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[25,11],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeOpAliases.purs","end":[25,22]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[25,13],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeOpAliases.purs","end":[25,15]},[]],"tag":"TypeConstructor","contents":[["Prim"],"Function"]},{"annotation":[{"start":[25,11],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeOpAliases.purs","end":[25,12]},[]],"tag":"TypeVar","contents":"a"}]},{"annotation":[{"start":[25,16],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeOpAliases.purs","end":[25,22]},[]],"tag":"TypeConstructor","contents":[["Prim"],"String"]}]}]},8]}}},{"EDValue":{"edValueName":{"Ident":"testL"},"edValueType":{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"ForAll","contents":["a",{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"ConstrainedType","contents":[{"constraintAnn":[{"start":[0,0],"name":"","end":[0,0]},[]],"constraintClass":[["TypeOpAliases"],"TestL"],"constraintArgs":[{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeVar","contents":"a"}],"constraintData":null},{"annotation":[{"start":[33,12],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeOpAliases.purs","end":[33,13]},[]],"tag":"TypeVar","contents":"a"}]},7]}}},{"EDValue":{"edValueName":{"Ident":"testR"},"edValueType":{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"ForAll","contents":["a",{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"ConstrainedType","contents":[{"constraintAnn":[{"start":[0,0],"name":"","end":[0,0]},[]],"constraintClass":[["TypeOpAliases"],"TestR"],"constraintArgs":[{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeVar","contents":"a"}],"constraintData":null},{"annotation":[{"start":[36,12],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeOpAliases.purs","end":[36,13]},[]],"tag":"TypeVar","contents":"a"}]},6]}}},{"EDType":{"edTypeName":"AltFn","edTypeKind":{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"FunKind","contents":[{"annotation":[{"start":[3,20],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeOpAliases.purs","end":[3,22]},[]],"tag":"NamedKind","contents":[["Prim"],"Type"]},{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"FunKind","contents":[{"annotation":[{"start":[3,20],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeOpAliases.purs","end":[3,22]},[]],"tag":"NamedKind","contents":[["Prim"],"Type"]},{"annotation":[{"start":[3,20],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeOpAliases.purs","end":[3,22]},[]],"tag":"NamedKind","contents":[["Prim"],"Type"]}]}]},"edTypeDeclarationKind":"TypeSynonym"}},{"EDTypeSynonym":{"edTypeSynonymName":"AltFn","edTypeSynonymArguments":[["a",{"annotation":[{"start":[3,20],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeOpAliases.purs","end":[3,22]},[]],"tag":"NamedKind","contents":[["Prim"],"Type"]}],["b",{"annotation":[{"start":[3,20],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeOpAliases.purs","end":[3,22]},[]],"tag":"NamedKind","contents":[["Prim"],"Type"]}]],"edTypeSynonymType":{"annotation":[{"start":[3,18],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeOpAliases.purs","end":[3,24]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[3,18],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeOpAliases.purs","end":[3,24]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[3,20],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeOpAliases.purs","end":[3,22]},[]],"tag":"TypeConstructor","contents":[["Prim"],"Function"]},{"annotation":[{"start":[3,18],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeOpAliases.purs","end":[3,19]},[]],"tag":"TypeVar","contents":"a"}]},{"annotation":[{"start":[3,23],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeOpAliases.purs","end":[3,24]},[]],"tag":"TypeVar","contents":"b"}]}}},{"EDValue":{"edValueName":{"Ident":"test1"},"edValueType":{"annotation":[{"start":[7,25],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeOpAliases.purs","end":[7,43]},[]],"tag":"ForAll","contents":["b",{"annotation":[{"start":[7,32],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeOpAliases.purs","end":[7,43]},[]],"tag":"ForAll","contents":["a",{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeConstructor","contents":[["TypeOpAliases"],"AltFn"]},{"annotation":[{"start":[7,37],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeOpAliases.purs","end":[7,38]},[]],"tag":"TypeVar","contents":"a"}]},{"annotation":[{"start":[7,42],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeOpAliases.purs","end":[7,43]},[]],"tag":"TypeVar","contents":"b"}]},null]},null]}}},{"EDValue":{"edValueName":{"Ident":"test2"},"edValueType":{"annotation":[{"start":[8,25],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeOpAliases.purs","end":[8,50]},[]],"tag":"ForAll","contents":["c",{"annotation":[{"start":[8,32],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeOpAliases.purs","end":[8,50]},[]],"tag":"ForAll","contents":["b",{"annotation":[{"start":[8,32],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeOpAliases.purs","end":[8,50]},[]],"tag":"ForAll","contents":["a",{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeConstructor","contents":[["TypeOpAliases"],"AltFn"]},{"annotation":[{"start":[8,39],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeOpAliases.purs","end":[8,40]},[]],"tag":"TypeVar","contents":"a"}]},{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeConstructor","contents":[["TypeOpAliases"],"AltFn"]},{"annotation":[{"start":[8,44],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeOpAliases.purs","end":[8,45]},[]],"tag":"TypeVar","contents":"b"}]},{"annotation":[{"start":[8,49],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeOpAliases.purs","end":[8,50]},[]],"tag":"TypeVar","contents":"c"}]}]},null]},null]},null]}}},{"EDValue":{"edValueName":{"Ident":"test3"},"edValueType":{"annotation":[{"start":[9,25],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeOpAliases.purs","end":[9,59]},[]],"tag":"ForAll","contents":["d",{"annotation":[{"start":[9,32],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeOpAliases.purs","end":[9,59]},[]],"tag":"ForAll","contents":["c",{"annotation":[{"start":[9,32],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeOpAliases.purs","end":[9,59]},[]],"tag":"ForAll","contents":["b",{"annotation":[{"start":[9,32],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeOpAliases.purs","end":[9,59]},[]],"tag":"ForAll","contents":["a",{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeConstructor","contents":[["TypeOpAliases"],"AltFn"]},{"annotation":[{"start":[9,41],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeOpAliases.purs","end":[9,42]},[]],"tag":"TypeVar","contents":"a"}]},{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeConstructor","contents":[["TypeOpAliases"],"AltFn"]},{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeConstructor","contents":[["TypeOpAliases"],"AltFn"]},{"annotation":[{"start":[9,47],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeOpAliases.purs","end":[9,48]},[]],"tag":"TypeVar","contents":"b"}]},{"annotation":[{"start":[9,52],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeOpAliases.purs","end":[9,53]},[]],"tag":"TypeVar","contents":"c"}]}]},{"annotation":[{"start":[9,58],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeOpAliases.purs","end":[9,59]},[]],"tag":"TypeVar","contents":"d"}]}]},null]},null]},null]},null]}}},{"EDValue":{"edValueName":{"Ident":"test4"},"edValueType":{"annotation":[{"start":[10,25],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeOpAliases.purs","end":[10,61]},[]],"tag":"ForAll","contents":["d",{"annotation":[{"start":[10,32],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeOpAliases.purs","end":[10,61]},[]],"tag":"ForAll","contents":["c",{"annotation":[{"start":[10,32],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeOpAliases.purs","end":[10,61]},[]],"tag":"ForAll","contents":["b",{"annotation":[{"start":[10,32],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeOpAliases.purs","end":[10,61]},[]],"tag":"ForAll","contents":["a",{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeConstructor","contents":[["TypeOpAliases"],"AltFn"]},{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeConstructor","contents":[["TypeOpAliases"],"AltFn"]},{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeConstructor","contents":[["TypeOpAliases"],"AltFn"]},{"annotation":[{"start":[10,43],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeOpAliases.purs","end":[10,44]},[]],"tag":"TypeVar","contents":"a"}]},{"annotation":[{"start":[10,48],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeOpAliases.purs","end":[10,49]},[]],"tag":"TypeVar","contents":"b"}]}]},{"annotation":[{"start":[10,54],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeOpAliases.purs","end":[10,55]},[]],"tag":"TypeVar","contents":"c"}]}]},{"annotation":[{"start":[10,60],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeOpAliases.purs","end":[10,61]},[]],"tag":"TypeVar","contents":"d"}]},null]},null]},null]},null]}}},{"EDType":{"edTypeName":"Tuple","edTypeKind":{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"FunKind","contents":[{"annotation":[{"start":[12,24],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeOpAliases.purs","end":[12,25]},[]],"tag":"NamedKind","contents":[["Prim"],"Type"]},{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"FunKind","contents":[{"annotation":[{"start":[12,26],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeOpAliases.purs","end":[12,27]},[]],"tag":"NamedKind","contents":[["Prim"],"Type"]},{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"NamedKind","contents":[["Prim"],"Type"]}]}]},"edTypeDeclarationKind":{"DataType":{"args":[["a",{"annotation":[{"start":[12,24],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeOpAliases.purs","end":[12,25]},[]],"tag":"NamedKind","contents":[["Prim"],"Type"]}],["b",{"annotation":[{"start":[12,26],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeOpAliases.purs","end":[12,27]},[]],"tag":"NamedKind","contents":[["Prim"],"Type"]}]],"ctors":[["Tuple",[{"annotation":[{"start":[12,24],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeOpAliases.purs","end":[12,25]},[]],"tag":"TypeVar","contents":"a"},{"annotation":[{"start":[12,26],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeOpAliases.purs","end":[12,27]},[]],"tag":"TypeVar","contents":"b"}]]]}}}},{"EDDataConstructor":{"edDataCtorName":"Tuple","edDataCtorOrigin":"data","edDataCtorTypeCtor":"Tuple","edDataCtorType":{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"ForAll","contents":["b",{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"ForAll","contents":["a",{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeConstructor","contents":[["Prim"],"Function"]},{"annotation":[{"start":[12,24],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeOpAliases.purs","end":[12,25]},[]],"tag":"TypeVar","contents":"a"}]},{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeConstructor","contents":[["Prim"],"Function"]},{"annotation":[{"start":[12,26],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeOpAliases.purs","end":[12,27]},[]],"tag":"TypeVar","contents":"b"}]},{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeConstructor","contents":[["TypeOpAliases"],"Tuple"]},{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeVar","contents":"a"}]},{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeVar","contents":"b"}]}]}]},null]},null]},"edDataCtorFields":[{"Ident":"value0"},{"Ident":"value1"}]}},{"EDType":{"edTypeName":"Either","edTypeKind":{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"FunKind","contents":[{"annotation":[{"start":[17,24],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeOpAliases.purs","end":[17,25]},[]],"tag":"NamedKind","contents":[["Prim"],"Type"]},{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"FunKind","contents":[{"annotation":[{"start":[17,34],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeOpAliases.purs","end":[17,35]},[]],"tag":"NamedKind","contents":[["Prim"],"Type"]},{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"NamedKind","contents":[["Prim"],"Type"]}]}]},"edTypeDeclarationKind":{"DataType":{"args":[["a",{"annotation":[{"start":[17,24],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeOpAliases.purs","end":[17,25]},[]],"tag":"NamedKind","contents":[["Prim"],"Type"]}],["b",{"annotation":[{"start":[17,34],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeOpAliases.purs","end":[17,35]},[]],"tag":"NamedKind","contents":[["Prim"],"Type"]}]],"ctors":[["Left",[{"annotation":[{"start":[17,24],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeOpAliases.purs","end":[17,25]},[]],"tag":"TypeVar","contents":"a"}]],["Right",[{"annotation":[{"start":[17,34],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeOpAliases.purs","end":[17,35]},[]],"tag":"TypeVar","contents":"b"}]]]}}}},{"EDDataConstructor":{"edDataCtorName":"Left","edDataCtorOrigin":"data","edDataCtorTypeCtor":"Either","edDataCtorType":{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"ForAll","contents":["b",{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"ForAll","contents":["a",{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeConstructor","contents":[["Prim"],"Function"]},{"annotation":[{"start":[17,24],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeOpAliases.purs","end":[17,25]},[]],"tag":"TypeVar","contents":"a"}]},{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeConstructor","contents":[["TypeOpAliases"],"Either"]},{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeVar","contents":"a"}]},{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeVar","contents":"b"}]}]},null]},null]},"edDataCtorFields":[{"Ident":"value0"}]}},{"EDDataConstructor":{"edDataCtorName":"Right","edDataCtorOrigin":"data","edDataCtorTypeCtor":"Either","edDataCtorType":{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"ForAll","contents":["b",{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"ForAll","contents":["a",{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeConstructor","contents":[["Prim"],"Function"]},{"annotation":[{"start":[17,34],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeOpAliases.purs","end":[17,35]},[]],"tag":"TypeVar","contents":"b"}]},{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeConstructor","contents":[["TypeOpAliases"],"Either"]},{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeVar","contents":"a"}]},{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeVar","contents":"b"}]}]},null]},null]},"edDataCtorFields":[{"Ident":"value0"}]}},{"EDValue":{"edValueName":{"Ident":"third"},"edValueType":{"annotation":[{"start":[21,9],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeOpAliases.purs","end":[21,31]},[]],"tag":"ForAll","contents":["c",{"annotation":[{"start":[21,11],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeOpAliases.purs","end":[21,31]},[]],"tag":"ForAll","contents":["b",{"annotation":[{"start":[21,11],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeOpAliases.purs","end":[21,31]},[]],"tag":"ForAll","contents":["a",{"annotation":[{"start":[21,18],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeOpAliases.purs","end":[21,31]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[21,18],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeOpAliases.purs","end":[21,31]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[21,28],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeOpAliases.purs","end":[21,29]},[]],"tag":"TypeConstructor","contents":[["Prim"],"Function"]},{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeConstructor","contents":[["TypeOpAliases"],"Tuple"]},{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeConstructor","contents":[["TypeOpAliases"],"Tuple"]},{"annotation":[{"start":[21,18],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeOpAliases.purs","end":[21,19]},[]],"tag":"TypeVar","contents":"a"}]},{"annotation":[{"start":[21,22],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeOpAliases.purs","end":[21,23]},[]],"tag":"TypeVar","contents":"b"}]}]},{"annotation":[{"start":[21,26],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeOpAliases.purs","end":[21,27]},[]],"tag":"TypeVar","contents":"c"}]}]},{"annotation":[{"start":[21,30],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeOpAliases.purs","end":[21,31]},[]],"tag":"TypeVar","contents":"c"}]},0]},1]},2]}}},{"EDType":{"edTypeName":"Show","edTypeKind":{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"FunKind","contents":[{"annotation":[{"start":[25,13],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeOpAliases.purs","end":[25,15]},[]],"tag":"NamedKind","contents":[["Prim"],"Type"]},{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"NamedKind","contents":[["Prim"],"Type"]}]},"edTypeDeclarationKind":"TypeSynonym"}},{"EDTypeSynonym":{"edTypeSynonymName":"Show","edTypeSynonymArguments":[["a",null]],"edTypeSynonymType":{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeConstructor","contents":[["Prim"],"Record"]},{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"RCons","contents":["show",{"annotation":[{"start":[25,11],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeOpAliases.purs","end":[25,22]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[25,11],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeOpAliases.purs","end":[25,22]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[25,13],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeOpAliases.purs","end":[25,15]},[]],"tag":"TypeConstructor","contents":[["Prim"],"Function"]},{"annotation":[{"start":[25,11],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeOpAliases.purs","end":[25,12]},[]],"tag":"TypeVar","contents":"a"}]},{"annotation":[{"start":[25,16],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeOpAliases.purs","end":[25,22]},[]],"tag":"TypeConstructor","contents":[["Prim"],"String"]}]},{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"REmpty"}]}]}}},{"EDClass":{"edClassName":"Show","edClassTypeArguments":[["a",null]],"edClassMembers":[[{"Ident":"show"},{"annotation":[{"start":[25,11],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeOpAliases.purs","end":[25,22]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[25,11],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeOpAliases.purs","end":[25,22]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[25,13],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeOpAliases.purs","end":[25,15]},[]],"tag":"TypeConstructor","contents":[["Prim"],"Function"]},{"annotation":[{"start":[25,11],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeOpAliases.purs","end":[25,12]},[]],"tag":"TypeVar","contents":"a"}]},{"annotation":[{"start":[25,16],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeOpAliases.purs","end":[25,22]},[]],"tag":"TypeConstructor","contents":[["Prim"],"String"]}]}]],"edClassConstraints":[],"edFunctionalDependencies":[],"edIsEmpty":false}},{"EDType":{"edTypeName":"TestL","edTypeKind":{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"FunKind","contents":[{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"NamedKind","contents":[["Prim"],"Type"]},{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"NamedKind","contents":[["Prim"],"Type"]}]},"edTypeDeclarationKind":"TypeSynonym"}},{"EDTypeSynonym":{"edTypeSynonymName":"TestL","edTypeSynonymArguments":[["a",null]],"edTypeSynonymType":{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeConstructor","contents":[["Prim"],"Record"]},{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"RCons","contents":["testL",{"annotation":[{"start":[33,12],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeOpAliases.purs","end":[33,13]},[]],"tag":"TypeVar","contents":"a"},{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"REmpty"}]}]}}},{"EDClass":{"edClassName":"TestL","edClassTypeArguments":[["a",null]],"edClassMembers":[[{"Ident":"testL"},{"annotation":[{"start":[33,12],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeOpAliases.purs","end":[33,13]},[]],"tag":"TypeVar","contents":"a"}]],"edClassConstraints":[],"edFunctionalDependencies":[],"edIsEmpty":false}},{"EDType":{"edTypeName":"TestR","edTypeKind":{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"FunKind","contents":[{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"NamedKind","contents":[["Prim"],"Type"]},{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"NamedKind","contents":[["Prim"],"Type"]}]},"edTypeDeclarationKind":"TypeSynonym"}},{"EDTypeSynonym":{"edTypeSynonymName":"TestR","edTypeSynonymArguments":[["a",null]],"edTypeSynonymType":{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeConstructor","contents":[["Prim"],"Record"]},{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"RCons","contents":["testR",{"annotation":[{"start":[36,12],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeOpAliases.purs","end":[36,13]},[]],"tag":"TypeVar","contents":"a"},{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"REmpty"}]}]}}},{"EDClass":{"edClassName":"TestR","edClassTypeArguments":[["a",null]],"edClassMembers":[[{"Ident":"testR"},{"annotation":[{"start":[36,12],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeOpAliases.purs","end":[36,13]},[]],"tag":"TypeVar","contents":"a"}]],"edClassConstraints":[],"edFunctionalDependencies":[],"edIsEmpty":false}},{"EDInstance":{"edInstanceClassName":[["TypeOpAliases"],"Show"],"edInstanceName":{"Ident":"showTuple"},"edInstanceTypes":[{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeConstructor","contents":[["TypeOpAliases"],"Tuple"]},{"annotation":[{"start":[27,39],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeOpAliases.purs","end":[27,40]},[]],"tag":"TypeVar","contents":"a"}]},{"annotation":[{"start":[27,43],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeOpAliases.purs","end":[27,44]},[]],"tag":"TypeVar","contents":"b"}]}],"edInstanceConstraints":[{"constraintAnn":[{"start":[27,23],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeOpAliases.purs","end":[27,29]},[]],"constraintClass":[["TypeOpAliases"],"Show"],"constraintArgs":[{"annotation":[{"start":[27,28],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeOpAliases.purs","end":[27,29]},[]],"tag":"TypeVar","contents":"a"}],"constraintData":null}],"edInstanceChain":[[["TypeOpAliases"],{"Ident":"showTuple"}]],"edInstanceChainIndex":0}},{"EDInstance":{"edInstanceClassName":[["TypeOpAliases"],"TestL"],"edInstanceName":{"Ident":"testLEither"},"edInstanceTypes":[{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeConstructor","contents":[["TypeOpAliases"],"Either"]},{"annotation":[{"start":[39,32],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeOpAliases.purs","end":[39,35]},[]],"tag":"TypeConstructor","contents":[["Prim"],"Int"]}]},{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeConstructor","contents":[["TypeOpAliases"],"Tuple"]},{"annotation":[{"start":[39,38],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeOpAliases.purs","end":[39,41]},[]],"tag":"TypeConstructor","contents":[["Prim"],"Int"]}]},{"annotation":[{"start":[39,44],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeOpAliases.purs","end":[39,50]},[]],"tag":"TypeConstructor","contents":[["Prim"],"String"]}]}]}],"edInstanceConstraints":[],"edInstanceChain":[[["TypeOpAliases"],{"Ident":"testLEither"}]],"edInstanceChainIndex":0}},{"EDInstance":{"edInstanceClassName":[["TypeOpAliases"],"TestR"],"edInstanceName":{"Ident":"testREither"},"edInstanceTypes":[{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeConstructor","contents":[["TypeOpAliases"],"Either"]},{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeConstructor","contents":[["TypeOpAliases"],"Tuple"]},{"annotation":[{"start":[43,32],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeOpAliases.purs","end":[43,35]},[]],"tag":"TypeConstructor","contents":[["Prim"],"Int"]}]},{"annotation":[{"start":[43,38],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeOpAliases.purs","end":[43,41]},[]],"tag":"TypeConstructor","contents":[["Prim"],"Int"]}]}]},{"annotation":[{"start":[43,44],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeOpAliases.purs","end":[43,50]},[]],"tag":"TypeConstructor","contents":[["Prim"],"String"]}]}],"edInstanceConstraints":[],"edInstanceChain":[[["TypeOpAliases"],{"Ident":"testREither"}]],"edInstanceChainIndex":0}}],"efSourceSpan":{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeOpAliases.purs","end":[44,23]}} \ No newline at end of file
+{"efVersion":"0.13.3","efModuleName":["TypeOpAliases"],"efExports":[{"ValueRef":[{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeOpAliases.purs","end":[44,23]},{"Ident":"show"}]},{"ValueRef":[{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeOpAliases.purs","end":[44,23]},{"Ident":"testL"}]},{"ValueRef":[{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeOpAliases.purs","end":[44,23]},{"Ident":"testR"}]},{"TypeRef":[{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeOpAliases.purs","end":[44,23]},"AltFn",[]]},{"TypeOpRef":[{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeOpAliases.purs","end":[44,23]},"~>"]},{"ValueRef":[{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeOpAliases.purs","end":[44,23]},{"Ident":"test1"}]},{"ValueRef":[{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeOpAliases.purs","end":[44,23]},{"Ident":"test2"}]},{"ValueRef":[{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeOpAliases.purs","end":[44,23]},{"Ident":"test3"}]},{"ValueRef":[{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeOpAliases.purs","end":[44,23]},{"Ident":"test4"}]},{"TypeRef":[{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeOpAliases.purs","end":[44,23]},"Tuple",["Tuple"]]},{"ValueOpRef":[{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeOpAliases.purs","end":[44,23]},"×"]},{"TypeOpRef":[{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeOpAliases.purs","end":[44,23]},"×"]},{"TypeRef":[{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeOpAliases.purs","end":[44,23]},"Either",["Left","Right"]]},{"TypeOpRef":[{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeOpAliases.purs","end":[44,23]},"⊕"]},{"ValueRef":[{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeOpAliases.purs","end":[44,23]},{"Ident":"third"}]},{"TypeClassRef":[{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeOpAliases.purs","end":[44,23]},"Show"]},{"TypeClassRef":[{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeOpAliases.purs","end":[44,23]},"TestL"]},{"TypeClassRef":[{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeOpAliases.purs","end":[44,23]},"TestR"]},{"TypeInstanceRef":[{"start":[0,0],"name":"<generated>","end":[0,0]},{"Ident":"showTuple"}]},{"TypeInstanceRef":[{"start":[0,0],"name":"<generated>","end":[0,0]},{"Ident":"testLEither"}]},{"TypeInstanceRef":[{"start":[0,0],"name":"<generated>","end":[0,0]},{"Ident":"testREither"}]}],"efImports":[{"eiModule":["Prim"],"eiImportType":{"Implicit":[]},"eiImportedAs":["Prim"]},{"eiModule":["Prim"],"eiImportType":{"Implicit":[]},"eiImportedAs":null}],"efFixities":[{"efAssociativity":"infixl","efPrecedence":6,"efOperator":"×","efAlias":[["TypeOpAliases"],{"Right":"Tuple"}]}],"efTypeFixities":[{"efTypeAssociativity":"infixr","efTypePrecedence":6,"efTypeOperator":"~>","efTypeAlias":[["TypeOpAliases"],"AltFn"]},{"efTypeAssociativity":"infixl","efTypePrecedence":6,"efTypeOperator":"×","efTypeAlias":[["TypeOpAliases"],"Tuple"]},{"efTypeAssociativity":"infixl","efTypePrecedence":5,"efTypeOperator":"⊕","efTypeAlias":[["TypeOpAliases"],"Either"]}],"efDeclarations":[{"EDValue":{"edValueName":{"Ident":"show"},"edValueType":{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"ForAll","contents":["a",{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"ConstrainedType","contents":[{"constraintAnn":[{"start":[0,0],"name":"","end":[0,0]},[]],"constraintClass":[["TypeOpAliases"],"Show"],"constraintArgs":[{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeVar","contents":"a"}],"constraintData":null},{"annotation":[{"start":[25,11],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeOpAliases.purs","end":[25,22]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[25,11],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeOpAliases.purs","end":[25,22]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[25,13],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeOpAliases.purs","end":[25,15]},[]],"tag":"TypeConstructor","contents":[["Prim"],"Function"]},{"annotation":[{"start":[25,11],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeOpAliases.purs","end":[25,12]},[]],"tag":"TypeVar","contents":"a"}]},{"annotation":[{"start":[25,16],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeOpAliases.purs","end":[25,22]},[]],"tag":"TypeConstructor","contents":[["Prim"],"String"]}]}]},8]}}},{"EDValue":{"edValueName":{"Ident":"testL"},"edValueType":{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"ForAll","contents":["a",{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"ConstrainedType","contents":[{"constraintAnn":[{"start":[0,0],"name":"","end":[0,0]},[]],"constraintClass":[["TypeOpAliases"],"TestL"],"constraintArgs":[{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeVar","contents":"a"}],"constraintData":null},{"annotation":[{"start":[33,12],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeOpAliases.purs","end":[33,13]},[]],"tag":"TypeVar","contents":"a"}]},7]}}},{"EDValue":{"edValueName":{"Ident":"testR"},"edValueType":{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"ForAll","contents":["a",{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"ConstrainedType","contents":[{"constraintAnn":[{"start":[0,0],"name":"","end":[0,0]},[]],"constraintClass":[["TypeOpAliases"],"TestR"],"constraintArgs":[{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeVar","contents":"a"}],"constraintData":null},{"annotation":[{"start":[36,12],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeOpAliases.purs","end":[36,13]},[]],"tag":"TypeVar","contents":"a"}]},6]}}},{"EDType":{"edTypeName":"AltFn","edTypeKind":{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"FunKind","contents":[{"annotation":[{"start":[3,20],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeOpAliases.purs","end":[3,22]},[]],"tag":"NamedKind","contents":[["Prim"],"Type"]},{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"FunKind","contents":[{"annotation":[{"start":[3,20],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeOpAliases.purs","end":[3,22]},[]],"tag":"NamedKind","contents":[["Prim"],"Type"]},{"annotation":[{"start":[3,20],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeOpAliases.purs","end":[3,22]},[]],"tag":"NamedKind","contents":[["Prim"],"Type"]}]}]},"edTypeDeclarationKind":"TypeSynonym"}},{"EDTypeSynonym":{"edTypeSynonymName":"AltFn","edTypeSynonymArguments":[["a",{"annotation":[{"start":[3,20],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeOpAliases.purs","end":[3,22]},[]],"tag":"NamedKind","contents":[["Prim"],"Type"]}],["b",{"annotation":[{"start":[3,20],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeOpAliases.purs","end":[3,22]},[]],"tag":"NamedKind","contents":[["Prim"],"Type"]}]],"edTypeSynonymType":{"annotation":[{"start":[3,18],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeOpAliases.purs","end":[3,24]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[3,18],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeOpAliases.purs","end":[3,24]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[3,20],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeOpAliases.purs","end":[3,22]},[]],"tag":"TypeConstructor","contents":[["Prim"],"Function"]},{"annotation":[{"start":[3,18],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeOpAliases.purs","end":[3,19]},[]],"tag":"TypeVar","contents":"a"}]},{"annotation":[{"start":[3,23],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeOpAliases.purs","end":[3,24]},[]],"tag":"TypeVar","contents":"b"}]}}},{"EDValue":{"edValueName":{"Ident":"test1"},"edValueType":{"annotation":[{"start":[7,25],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeOpAliases.purs","end":[7,43]},[]],"tag":"ForAll","contents":["b",{"annotation":[{"start":[7,32],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeOpAliases.purs","end":[7,43]},[]],"tag":"ForAll","contents":["a",{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeConstructor","contents":[["TypeOpAliases"],"AltFn"]},{"annotation":[{"start":[7,37],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeOpAliases.purs","end":[7,38]},[]],"tag":"TypeVar","contents":"a"}]},{"annotation":[{"start":[7,42],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeOpAliases.purs","end":[7,43]},[]],"tag":"TypeVar","contents":"b"}]},null]},null]}}},{"EDValue":{"edValueName":{"Ident":"test2"},"edValueType":{"annotation":[{"start":[8,25],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeOpAliases.purs","end":[8,50]},[]],"tag":"ForAll","contents":["c",{"annotation":[{"start":[8,32],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeOpAliases.purs","end":[8,50]},[]],"tag":"ForAll","contents":["b",{"annotation":[{"start":[8,32],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeOpAliases.purs","end":[8,50]},[]],"tag":"ForAll","contents":["a",{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeConstructor","contents":[["TypeOpAliases"],"AltFn"]},{"annotation":[{"start":[8,39],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeOpAliases.purs","end":[8,40]},[]],"tag":"TypeVar","contents":"a"}]},{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeConstructor","contents":[["TypeOpAliases"],"AltFn"]},{"annotation":[{"start":[8,44],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeOpAliases.purs","end":[8,45]},[]],"tag":"TypeVar","contents":"b"}]},{"annotation":[{"start":[8,49],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeOpAliases.purs","end":[8,50]},[]],"tag":"TypeVar","contents":"c"}]}]},null]},null]},null]}}},{"EDValue":{"edValueName":{"Ident":"test3"},"edValueType":{"annotation":[{"start":[9,25],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeOpAliases.purs","end":[9,59]},[]],"tag":"ForAll","contents":["d",{"annotation":[{"start":[9,32],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeOpAliases.purs","end":[9,59]},[]],"tag":"ForAll","contents":["c",{"annotation":[{"start":[9,32],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeOpAliases.purs","end":[9,59]},[]],"tag":"ForAll","contents":["b",{"annotation":[{"start":[9,32],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeOpAliases.purs","end":[9,59]},[]],"tag":"ForAll","contents":["a",{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeConstructor","contents":[["TypeOpAliases"],"AltFn"]},{"annotation":[{"start":[9,41],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeOpAliases.purs","end":[9,42]},[]],"tag":"TypeVar","contents":"a"}]},{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeConstructor","contents":[["TypeOpAliases"],"AltFn"]},{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeConstructor","contents":[["TypeOpAliases"],"AltFn"]},{"annotation":[{"start":[9,47],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeOpAliases.purs","end":[9,48]},[]],"tag":"TypeVar","contents":"b"}]},{"annotation":[{"start":[9,52],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeOpAliases.purs","end":[9,53]},[]],"tag":"TypeVar","contents":"c"}]}]},{"annotation":[{"start":[9,58],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeOpAliases.purs","end":[9,59]},[]],"tag":"TypeVar","contents":"d"}]}]},null]},null]},null]},null]}}},{"EDValue":{"edValueName":{"Ident":"test4"},"edValueType":{"annotation":[{"start":[10,25],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeOpAliases.purs","end":[10,61]},[]],"tag":"ForAll","contents":["d",{"annotation":[{"start":[10,32],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeOpAliases.purs","end":[10,61]},[]],"tag":"ForAll","contents":["c",{"annotation":[{"start":[10,32],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeOpAliases.purs","end":[10,61]},[]],"tag":"ForAll","contents":["b",{"annotation":[{"start":[10,32],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeOpAliases.purs","end":[10,61]},[]],"tag":"ForAll","contents":["a",{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeConstructor","contents":[["TypeOpAliases"],"AltFn"]},{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeConstructor","contents":[["TypeOpAliases"],"AltFn"]},{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeConstructor","contents":[["TypeOpAliases"],"AltFn"]},{"annotation":[{"start":[10,43],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeOpAliases.purs","end":[10,44]},[]],"tag":"TypeVar","contents":"a"}]},{"annotation":[{"start":[10,48],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeOpAliases.purs","end":[10,49]},[]],"tag":"TypeVar","contents":"b"}]}]},{"annotation":[{"start":[10,54],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeOpAliases.purs","end":[10,55]},[]],"tag":"TypeVar","contents":"c"}]}]},{"annotation":[{"start":[10,60],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeOpAliases.purs","end":[10,61]},[]],"tag":"TypeVar","contents":"d"}]},null]},null]},null]},null]}}},{"EDType":{"edTypeName":"Tuple","edTypeKind":{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"FunKind","contents":[{"annotation":[{"start":[12,24],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeOpAliases.purs","end":[12,25]},[]],"tag":"NamedKind","contents":[["Prim"],"Type"]},{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"FunKind","contents":[{"annotation":[{"start":[12,26],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeOpAliases.purs","end":[12,27]},[]],"tag":"NamedKind","contents":[["Prim"],"Type"]},{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"NamedKind","contents":[["Prim"],"Type"]}]}]},"edTypeDeclarationKind":{"DataType":{"args":[["a",{"annotation":[{"start":[12,24],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeOpAliases.purs","end":[12,25]},[]],"tag":"NamedKind","contents":[["Prim"],"Type"]}],["b",{"annotation":[{"start":[12,26],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeOpAliases.purs","end":[12,27]},[]],"tag":"NamedKind","contents":[["Prim"],"Type"]}]],"ctors":[["Tuple",[{"annotation":[{"start":[12,24],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeOpAliases.purs","end":[12,25]},[]],"tag":"TypeVar","contents":"a"},{"annotation":[{"start":[12,26],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeOpAliases.purs","end":[12,27]},[]],"tag":"TypeVar","contents":"b"}]]]}}}},{"EDDataConstructor":{"edDataCtorName":"Tuple","edDataCtorOrigin":"data","edDataCtorTypeCtor":"Tuple","edDataCtorType":{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"ForAll","contents":["b",{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"ForAll","contents":["a",{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeConstructor","contents":[["Prim"],"Function"]},{"annotation":[{"start":[12,24],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeOpAliases.purs","end":[12,25]},[]],"tag":"TypeVar","contents":"a"}]},{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeConstructor","contents":[["Prim"],"Function"]},{"annotation":[{"start":[12,26],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeOpAliases.purs","end":[12,27]},[]],"tag":"TypeVar","contents":"b"}]},{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeConstructor","contents":[["TypeOpAliases"],"Tuple"]},{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeVar","contents":"a"}]},{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeVar","contents":"b"}]}]}]},null]},null]},"edDataCtorFields":[{"Ident":"value0"},{"Ident":"value1"}]}},{"EDType":{"edTypeName":"Either","edTypeKind":{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"FunKind","contents":[{"annotation":[{"start":[17,24],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeOpAliases.purs","end":[17,25]},[]],"tag":"NamedKind","contents":[["Prim"],"Type"]},{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"FunKind","contents":[{"annotation":[{"start":[17,34],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeOpAliases.purs","end":[17,35]},[]],"tag":"NamedKind","contents":[["Prim"],"Type"]},{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"NamedKind","contents":[["Prim"],"Type"]}]}]},"edTypeDeclarationKind":{"DataType":{"args":[["a",{"annotation":[{"start":[17,24],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeOpAliases.purs","end":[17,25]},[]],"tag":"NamedKind","contents":[["Prim"],"Type"]}],["b",{"annotation":[{"start":[17,34],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeOpAliases.purs","end":[17,35]},[]],"tag":"NamedKind","contents":[["Prim"],"Type"]}]],"ctors":[["Left",[{"annotation":[{"start":[17,24],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeOpAliases.purs","end":[17,25]},[]],"tag":"TypeVar","contents":"a"}]],["Right",[{"annotation":[{"start":[17,34],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeOpAliases.purs","end":[17,35]},[]],"tag":"TypeVar","contents":"b"}]]]}}}},{"EDDataConstructor":{"edDataCtorName":"Left","edDataCtorOrigin":"data","edDataCtorTypeCtor":"Either","edDataCtorType":{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"ForAll","contents":["b",{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"ForAll","contents":["a",{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeConstructor","contents":[["Prim"],"Function"]},{"annotation":[{"start":[17,24],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeOpAliases.purs","end":[17,25]},[]],"tag":"TypeVar","contents":"a"}]},{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeConstructor","contents":[["TypeOpAliases"],"Either"]},{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeVar","contents":"a"}]},{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeVar","contents":"b"}]}]},null]},null]},"edDataCtorFields":[{"Ident":"value0"}]}},{"EDDataConstructor":{"edDataCtorName":"Right","edDataCtorOrigin":"data","edDataCtorTypeCtor":"Either","edDataCtorType":{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"ForAll","contents":["b",{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"ForAll","contents":["a",{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeConstructor","contents":[["Prim"],"Function"]},{"annotation":[{"start":[17,34],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeOpAliases.purs","end":[17,35]},[]],"tag":"TypeVar","contents":"b"}]},{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeConstructor","contents":[["TypeOpAliases"],"Either"]},{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeVar","contents":"a"}]},{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeVar","contents":"b"}]}]},null]},null]},"edDataCtorFields":[{"Ident":"value0"}]}},{"EDValue":{"edValueName":{"Ident":"third"},"edValueType":{"annotation":[{"start":[21,9],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeOpAliases.purs","end":[21,31]},[]],"tag":"ForAll","contents":["c",{"annotation":[{"start":[21,11],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeOpAliases.purs","end":[21,31]},[]],"tag":"ForAll","contents":["b",{"annotation":[{"start":[21,11],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeOpAliases.purs","end":[21,31]},[]],"tag":"ForAll","contents":["a",{"annotation":[{"start":[21,18],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeOpAliases.purs","end":[21,31]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[21,18],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeOpAliases.purs","end":[21,31]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[21,28],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeOpAliases.purs","end":[21,29]},[]],"tag":"TypeConstructor","contents":[["Prim"],"Function"]},{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeConstructor","contents":[["TypeOpAliases"],"Tuple"]},{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeConstructor","contents":[["TypeOpAliases"],"Tuple"]},{"annotation":[{"start":[21,18],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeOpAliases.purs","end":[21,19]},[]],"tag":"TypeVar","contents":"a"}]},{"annotation":[{"start":[21,22],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeOpAliases.purs","end":[21,23]},[]],"tag":"TypeVar","contents":"b"}]}]},{"annotation":[{"start":[21,26],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeOpAliases.purs","end":[21,27]},[]],"tag":"TypeVar","contents":"c"}]}]},{"annotation":[{"start":[21,30],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeOpAliases.purs","end":[21,31]},[]],"tag":"TypeVar","contents":"c"}]},0]},1]},2]}}},{"EDType":{"edTypeName":"Show","edTypeKind":{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"FunKind","contents":[{"annotation":[{"start":[25,13],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeOpAliases.purs","end":[25,15]},[]],"tag":"NamedKind","contents":[["Prim"],"Type"]},{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"NamedKind","contents":[["Prim"],"Type"]}]},"edTypeDeclarationKind":"TypeSynonym"}},{"EDTypeSynonym":{"edTypeSynonymName":"Show","edTypeSynonymArguments":[["a",null]],"edTypeSynonymType":{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeConstructor","contents":[["Prim"],"Record"]},{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"RCons","contents":["show",{"annotation":[{"start":[25,11],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeOpAliases.purs","end":[25,22]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[25,11],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeOpAliases.purs","end":[25,22]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[25,13],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeOpAliases.purs","end":[25,15]},[]],"tag":"TypeConstructor","contents":[["Prim"],"Function"]},{"annotation":[{"start":[25,11],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeOpAliases.purs","end":[25,12]},[]],"tag":"TypeVar","contents":"a"}]},{"annotation":[{"start":[25,16],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeOpAliases.purs","end":[25,22]},[]],"tag":"TypeConstructor","contents":[["Prim"],"String"]}]},{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"REmpty"}]}]}}},{"EDClass":{"edClassName":"Show","edClassTypeArguments":[["a",null]],"edClassMembers":[[{"Ident":"show"},{"annotation":[{"start":[25,11],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeOpAliases.purs","end":[25,22]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[25,11],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeOpAliases.purs","end":[25,22]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[25,13],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeOpAliases.purs","end":[25,15]},[]],"tag":"TypeConstructor","contents":[["Prim"],"Function"]},{"annotation":[{"start":[25,11],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeOpAliases.purs","end":[25,12]},[]],"tag":"TypeVar","contents":"a"}]},{"annotation":[{"start":[25,16],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeOpAliases.purs","end":[25,22]},[]],"tag":"TypeConstructor","contents":[["Prim"],"String"]}]}]],"edClassConstraints":[],"edFunctionalDependencies":[],"edIsEmpty":false}},{"EDType":{"edTypeName":"TestL","edTypeKind":{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"FunKind","contents":[{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"NamedKind","contents":[["Prim"],"Type"]},{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"NamedKind","contents":[["Prim"],"Type"]}]},"edTypeDeclarationKind":"TypeSynonym"}},{"EDTypeSynonym":{"edTypeSynonymName":"TestL","edTypeSynonymArguments":[["a",null]],"edTypeSynonymType":{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeConstructor","contents":[["Prim"],"Record"]},{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"RCons","contents":["testL",{"annotation":[{"start":[33,12],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeOpAliases.purs","end":[33,13]},[]],"tag":"TypeVar","contents":"a"},{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"REmpty"}]}]}}},{"EDClass":{"edClassName":"TestL","edClassTypeArguments":[["a",null]],"edClassMembers":[[{"Ident":"testL"},{"annotation":[{"start":[33,12],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeOpAliases.purs","end":[33,13]},[]],"tag":"TypeVar","contents":"a"}]],"edClassConstraints":[],"edFunctionalDependencies":[],"edIsEmpty":false}},{"EDType":{"edTypeName":"TestR","edTypeKind":{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"FunKind","contents":[{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"NamedKind","contents":[["Prim"],"Type"]},{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"NamedKind","contents":[["Prim"],"Type"]}]},"edTypeDeclarationKind":"TypeSynonym"}},{"EDTypeSynonym":{"edTypeSynonymName":"TestR","edTypeSynonymArguments":[["a",null]],"edTypeSynonymType":{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeConstructor","contents":[["Prim"],"Record"]},{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"RCons","contents":["testR",{"annotation":[{"start":[36,12],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeOpAliases.purs","end":[36,13]},[]],"tag":"TypeVar","contents":"a"},{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"REmpty"}]}]}}},{"EDClass":{"edClassName":"TestR","edClassTypeArguments":[["a",null]],"edClassMembers":[[{"Ident":"testR"},{"annotation":[{"start":[36,12],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeOpAliases.purs","end":[36,13]},[]],"tag":"TypeVar","contents":"a"}]],"edClassConstraints":[],"edFunctionalDependencies":[],"edIsEmpty":false}},{"EDInstance":{"edInstanceClassName":[["TypeOpAliases"],"Show"],"edInstanceName":{"Ident":"showTuple"},"edInstanceTypes":[{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeConstructor","contents":[["TypeOpAliases"],"Tuple"]},{"annotation":[{"start":[27,39],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeOpAliases.purs","end":[27,40]},[]],"tag":"TypeVar","contents":"a"}]},{"annotation":[{"start":[27,43],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeOpAliases.purs","end":[27,44]},[]],"tag":"TypeVar","contents":"b"}]}],"edInstanceConstraints":[{"constraintAnn":[{"start":[27,23],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeOpAliases.purs","end":[27,29]},[]],"constraintClass":[["TypeOpAliases"],"Show"],"constraintArgs":[{"annotation":[{"start":[27,28],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeOpAliases.purs","end":[27,29]},[]],"tag":"TypeVar","contents":"a"}],"constraintData":null}],"edInstanceChain":[[["TypeOpAliases"],{"Ident":"showTuple"}]],"edInstanceChainIndex":0}},{"EDInstance":{"edInstanceClassName":[["TypeOpAliases"],"TestL"],"edInstanceName":{"Ident":"testLEither"},"edInstanceTypes":[{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeConstructor","contents":[["TypeOpAliases"],"Either"]},{"annotation":[{"start":[39,32],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeOpAliases.purs","end":[39,35]},[]],"tag":"TypeConstructor","contents":[["Prim"],"Int"]}]},{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeConstructor","contents":[["TypeOpAliases"],"Tuple"]},{"annotation":[{"start":[39,38],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeOpAliases.purs","end":[39,41]},[]],"tag":"TypeConstructor","contents":[["Prim"],"Int"]}]},{"annotation":[{"start":[39,44],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeOpAliases.purs","end":[39,50]},[]],"tag":"TypeConstructor","contents":[["Prim"],"String"]}]}]}],"edInstanceConstraints":[],"edInstanceChain":[[["TypeOpAliases"],{"Ident":"testLEither"}]],"edInstanceChainIndex":0}},{"EDInstance":{"edInstanceClassName":[["TypeOpAliases"],"TestR"],"edInstanceName":{"Ident":"testREither"},"edInstanceTypes":[{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeConstructor","contents":[["TypeOpAliases"],"Either"]},{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeConstructor","contents":[["TypeOpAliases"],"Tuple"]},{"annotation":[{"start":[43,32],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeOpAliases.purs","end":[43,35]},[]],"tag":"TypeConstructor","contents":[["Prim"],"Int"]}]},{"annotation":[{"start":[43,38],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeOpAliases.purs","end":[43,41]},[]],"tag":"TypeConstructor","contents":[["Prim"],"Int"]}]}]},{"annotation":[{"start":[43,44],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeOpAliases.purs","end":[43,50]},[]],"tag":"TypeConstructor","contents":[["Prim"],"String"]}]}],"edInstanceConstraints":[],"edInstanceChain":[[["TypeOpAliases"],{"Ident":"testREither"}]],"edInstanceChainIndex":0}}],"efSourceSpan":{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeOpAliases.purs","end":[44,23]}} \ No newline at end of file
diff --git a/tests/purs/docs/output/TypeSynonym/externs.json b/tests/purs/docs/output/TypeSynonym/externs.json
index a5c9f52..a2b81a7 100644
--- a/tests/purs/docs/output/TypeSynonym/externs.json
+++ b/tests/purs/docs/output/TypeSynonym/externs.json
@@ -1 +1 @@
-{"efVersion":"0.13.2","efModuleName":["TypeSynonym"],"efExports":[{"TypeRef":[{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeSynonym.purs","end":[3,17]},"MyInt",[]]}],"efImports":[{"eiModule":["Prim"],"eiImportType":{"Implicit":[]},"eiImportedAs":["Prim"]},{"eiModule":["Prim"],"eiImportType":{"Implicit":[]},"eiImportedAs":null}],"efFixities":[],"efTypeFixities":[],"efDeclarations":[{"EDType":{"edTypeName":"MyInt","edTypeKind":{"annotation":[{"start":[3,14],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeSynonym.purs","end":[3,17]},[]],"tag":"NamedKind","contents":[["Prim"],"Type"]},"edTypeDeclarationKind":"TypeSynonym"}},{"EDTypeSynonym":{"edTypeSynonymName":"MyInt","edTypeSynonymArguments":[],"edTypeSynonymType":{"annotation":[{"start":[3,14],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeSynonym.purs","end":[3,17]},[]],"tag":"TypeConstructor","contents":[["Prim"],"Int"]}}}],"efSourceSpan":{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeSynonym.purs","end":[3,17]}} \ No newline at end of file
+{"efVersion":"0.13.3","efModuleName":["TypeSynonym"],"efExports":[{"TypeRef":[{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeSynonym.purs","end":[3,17]},"MyInt",[]]}],"efImports":[{"eiModule":["Prim"],"eiImportType":{"Implicit":[]},"eiImportedAs":["Prim"]},{"eiModule":["Prim"],"eiImportType":{"Implicit":[]},"eiImportedAs":null}],"efFixities":[],"efTypeFixities":[],"efDeclarations":[{"EDType":{"edTypeName":"MyInt","edTypeKind":{"annotation":[{"start":[3,14],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeSynonym.purs","end":[3,17]},[]],"tag":"NamedKind","contents":[["Prim"],"Type"]},"edTypeDeclarationKind":"TypeSynonym"}},{"EDTypeSynonym":{"edTypeSynonymName":"MyInt","edTypeSynonymArguments":[],"edTypeSynonymType":{"annotation":[{"start":[3,14],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeSynonym.purs","end":[3,17]},[]],"tag":"TypeConstructor","contents":[["Prim"],"Int"]}}}],"efSourceSpan":{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeSynonym.purs","end":[3,17]}} \ No newline at end of file
diff --git a/tests/purs/docs/output/TypeSynonymInstance/externs.json b/tests/purs/docs/output/TypeSynonymInstance/externs.json
index a2af387..f6003d6 100644
--- a/tests/purs/docs/output/TypeSynonymInstance/externs.json
+++ b/tests/purs/docs/output/TypeSynonymInstance/externs.json
@@ -1 +1 @@
-{"efVersion":"0.13.2","efModuleName":["TypeSynonymInstance"],"efExports":[{"TypeRef":[{"start":[2,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeSynonymInstance.purs","end":[11,8]},"MyNT",["MyNT"]]},{"ValueRef":[{"start":[2,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeSynonymInstance.purs","end":[11,8]},{"Ident":"foo"}]},{"TypeInstanceRef":[{"start":[0,0],"name":"<generated>","end":[0,0]},{"Ident":"ntMyNT"}]}],"efImports":[{"eiModule":["Prim"],"eiImportType":{"Implicit":[]},"eiImportedAs":["Prim"]},{"eiModule":["Prim"],"eiImportType":{"Implicit":[]},"eiImportedAs":null},{"eiModule":["Data","Newtype"],"eiImportType":{"Explicit":[{"TypeClassRef":[{"start":[4,22],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeSynonymInstance.purs","end":[4,35]},"Newtype"]}]},"eiImportedAs":null},{"eiModule":["TypeSynonym"],"eiImportType":{"Explicit":[{"TypeRef":[{"start":[5,21],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeSynonymInstance.purs","end":[5,26]},"MyInt",[]]}]},"eiImportedAs":null}],"efFixities":[],"efTypeFixities":[],"efDeclarations":[{"EDType":{"edTypeName":"MyNT","edTypeKind":{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"NamedKind","contents":[["Prim"],"Type"]},"edTypeDeclarationKind":{"DataType":{"args":[],"ctors":[["MyNT",[{"annotation":[{"start":[7,21],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeSynonymInstance.purs","end":[7,26]},[]],"tag":"TypeConstructor","contents":[["TypeSynonym"],"MyInt"]}]]]}}}},{"EDDataConstructor":{"edDataCtorName":"MyNT","edDataCtorOrigin":"newtype","edDataCtorTypeCtor":"MyNT","edDataCtorType":{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeConstructor","contents":[["Prim"],"Function"]},{"annotation":[{"start":[7,21],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeSynonymInstance.purs","end":[7,26]},[]],"tag":"TypeConstructor","contents":[["TypeSynonym"],"MyInt"]}]},{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeConstructor","contents":[["TypeSynonymInstance"],"MyNT"]}]},"edDataCtorFields":[{"Ident":"value0"}]}},{"EDValue":{"edValueName":{"Ident":"foo"},"edValueType":{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeConstructor","contents":[["Prim"],"Int"]}}},{"EDInstance":{"edInstanceClassName":[["Data","Newtype"],"Newtype"],"edInstanceName":{"Ident":"ntMyNT"},"edInstanceTypes":[{"annotation":[{"start":[9,35],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeSynonymInstance.purs","end":[9,39]},[]],"tag":"TypeConstructor","contents":[["TypeSynonymInstance"],"MyNT"]},{"annotation":[{"start":[3,14],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeSynonym.purs","end":[3,17]},[]],"tag":"TypeConstructor","contents":[["Prim"],"Int"]}],"edInstanceConstraints":[],"edInstanceChain":[[["TypeSynonymInstance"],{"Ident":"ntMyNT"}]],"edInstanceChainIndex":0}}],"efSourceSpan":{"start":[2,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeSynonymInstance.purs","end":[11,8]}} \ No newline at end of file
+{"efVersion":"0.13.3","efModuleName":["TypeSynonymInstance"],"efExports":[{"TypeRef":[{"start":[2,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeSynonymInstance.purs","end":[11,8]},"MyNT",["MyNT"]]},{"ValueRef":[{"start":[2,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeSynonymInstance.purs","end":[11,8]},{"Ident":"foo"}]},{"TypeInstanceRef":[{"start":[0,0],"name":"<generated>","end":[0,0]},{"Ident":"ntMyNT"}]}],"efImports":[{"eiModule":["Prim"],"eiImportType":{"Implicit":[]},"eiImportedAs":["Prim"]},{"eiModule":["Prim"],"eiImportType":{"Implicit":[]},"eiImportedAs":null},{"eiModule":["Data","Newtype"],"eiImportType":{"Explicit":[{"TypeClassRef":[{"start":[4,22],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeSynonymInstance.purs","end":[4,35]},"Newtype"]}]},"eiImportedAs":null},{"eiModule":["TypeSynonym"],"eiImportType":{"Explicit":[{"TypeRef":[{"start":[5,21],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeSynonymInstance.purs","end":[5,26]},"MyInt",[]]}]},"eiImportedAs":null}],"efFixities":[],"efTypeFixities":[],"efDeclarations":[{"EDType":{"edTypeName":"MyNT","edTypeKind":{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"NamedKind","contents":[["Prim"],"Type"]},"edTypeDeclarationKind":{"DataType":{"args":[],"ctors":[["MyNT",[{"annotation":[{"start":[7,21],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeSynonymInstance.purs","end":[7,26]},[]],"tag":"TypeConstructor","contents":[["TypeSynonym"],"MyInt"]}]]]}}}},{"EDDataConstructor":{"edDataCtorName":"MyNT","edDataCtorOrigin":"newtype","edDataCtorTypeCtor":"MyNT","edDataCtorType":{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeApp","contents":[{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeConstructor","contents":[["Prim"],"Function"]},{"annotation":[{"start":[7,21],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeSynonymInstance.purs","end":[7,26]},[]],"tag":"TypeConstructor","contents":[["TypeSynonym"],"MyInt"]}]},{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeConstructor","contents":[["TypeSynonymInstance"],"MyNT"]}]},"edDataCtorFields":[{"Ident":"value0"}]}},{"EDValue":{"edValueName":{"Ident":"foo"},"edValueType":{"annotation":[{"start":[0,0],"name":"","end":[0,0]},[]],"tag":"TypeConstructor","contents":[["Prim"],"Int"]}}},{"EDInstance":{"edInstanceClassName":[["Data","Newtype"],"Newtype"],"edInstanceName":{"Ident":"ntMyNT"},"edInstanceTypes":[{"annotation":[{"start":[9,35],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeSynonymInstance.purs","end":[9,39]},[]],"tag":"TypeConstructor","contents":[["TypeSynonymInstance"],"MyNT"]},{"annotation":[{"start":[3,14],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeSynonym.purs","end":[3,17]},[]],"tag":"TypeConstructor","contents":[["Prim"],"Int"]}],"edInstanceConstraints":[],"edInstanceChain":[[["TypeSynonymInstance"],{"Ident":"ntMyNT"}]],"edInstanceChainIndex":0}}],"efSourceSpan":{"start":[2,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/TypeSynonymInstance.purs","end":[11,8]}} \ No newline at end of file
diff --git a/tests/purs/docs/output/UTF8/externs.json b/tests/purs/docs/output/UTF8/externs.json
index c662c74..8454b09 100644
--- a/tests/purs/docs/output/UTF8/externs.json
+++ b/tests/purs/docs/output/UTF8/externs.json
@@ -1 +1 @@
-{"efVersion":"0.13.2","efModuleName":["UTF8"],"efExports":[{"ValueRef":[{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/UTF8.purs","end":[7,13]},{"Ident":"thing"}]}],"efImports":[{"eiModule":["Prim"],"eiImportType":{"Implicit":[]},"eiImportedAs":["Prim"]},{"eiModule":["Prim"],"eiImportType":{"Implicit":[]},"eiImportedAs":null},{"eiModule":["Prelude"],"eiImportType":{"Explicit":[{"TypeRef":[{"start":[3,17],"name":"/home/harry/code/purescript/tests/purs/docs/src/UTF8.purs","end":[3,21]},"Unit",[]]},{"ValueRef":[{"start":[3,23],"name":"/home/harry/code/purescript/tests/purs/docs/src/UTF8.purs","end":[3,27]},{"Ident":"unit"}]}]},"eiImportedAs":null}],"efFixities":[],"efTypeFixities":[],"efDeclarations":[{"EDValue":{"edValueName":{"Ident":"thing"},"edValueType":{"annotation":[{"start":[6,10],"name":"/home/harry/code/purescript/tests/purs/docs/src/UTF8.purs","end":[6,14]},[]],"tag":"TypeConstructor","contents":[["Prelude"],"Unit"]}}}],"efSourceSpan":{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/UTF8.purs","end":[7,13]}} \ No newline at end of file
+{"efVersion":"0.13.3","efModuleName":["UTF8"],"efExports":[{"ValueRef":[{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/UTF8.purs","end":[7,13]},{"Ident":"thing"}]}],"efImports":[{"eiModule":["Prim"],"eiImportType":{"Implicit":[]},"eiImportedAs":["Prim"]},{"eiModule":["Prim"],"eiImportType":{"Implicit":[]},"eiImportedAs":null},{"eiModule":["Prelude"],"eiImportType":{"Explicit":[{"TypeRef":[{"start":[3,17],"name":"/home/harry/code/purescript/tests/purs/docs/src/UTF8.purs","end":[3,21]},"Unit",[]]},{"ValueRef":[{"start":[3,23],"name":"/home/harry/code/purescript/tests/purs/docs/src/UTF8.purs","end":[3,27]},{"Ident":"unit"}]}]},"eiImportedAs":null}],"efFixities":[],"efTypeFixities":[],"efDeclarations":[{"EDValue":{"edValueName":{"Ident":"thing"},"edValueType":{"annotation":[{"start":[6,10],"name":"/home/harry/code/purescript/tests/purs/docs/src/UTF8.purs","end":[6,14]},[]],"tag":"TypeConstructor","contents":[["Prelude"],"Unit"]}}}],"efSourceSpan":{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/UTF8.purs","end":[7,13]}} \ No newline at end of file
diff --git a/tests/purs/docs/output/Virtual/externs.json b/tests/purs/docs/output/Virtual/externs.json
index 30efa91..4ebc3dc 100644
--- a/tests/purs/docs/output/Virtual/externs.json
+++ b/tests/purs/docs/output/Virtual/externs.json
@@ -1 +1 @@
-{"efVersion":"0.13.2","efModuleName":["Virtual"],"efExports":[{"ReExportRef":[{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/Virtual.purs","end":[5,33]},{"exportSourceImportedFrom":["Prelude"],"exportSourceDefinedIn":["Prelude"]},{"TypeRef":[{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/Virtual.purs","end":[5,33]},"Boolean2",["False","True"]]}]},{"ReExportRef":[{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/Virtual.purs","end":[5,33]},{"exportSourceImportedFrom":["Prelude"],"exportSourceDefinedIn":["Prelude"]},{"TypeRef":[{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/Virtual.purs","end":[5,33]},"Unit",["Unit"]]}]},{"ReExportRef":[{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/Virtual.purs","end":[5,33]},{"exportSourceImportedFrom":["Prelude"],"exportSourceDefinedIn":["Prelude"]},{"ValueRef":[{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/Virtual.purs","end":[5,33]},{"Ident":"unit"}]}]},{"ModuleRef":[{"start":[2,5],"name":"/home/harry/code/purescript/tests/purs/docs/src/Virtual.purs","end":[2,26]},["VirtualPrelude"]]}],"efImports":[{"eiModule":["Prim"],"eiImportType":{"Implicit":[]},"eiImportedAs":["Prim"]},{"eiModule":["Prim"],"eiImportType":{"Implicit":[]},"eiImportedAs":null},{"eiModule":["Prelude"],"eiImportType":{"Implicit":[]},"eiImportedAs":["VirtualPrelude"]}],"efFixities":[],"efTypeFixities":[],"efDeclarations":[],"efSourceSpan":{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/Virtual.purs","end":[5,33]}} \ No newline at end of file
+{"efVersion":"0.13.3","efModuleName":["Virtual"],"efExports":[{"ReExportRef":[{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/Virtual.purs","end":[5,33]},{"exportSourceImportedFrom":["Prelude"],"exportSourceDefinedIn":["Prelude"]},{"TypeRef":[{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/Virtual.purs","end":[5,33]},"Boolean2",["False","True"]]}]},{"ReExportRef":[{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/Virtual.purs","end":[5,33]},{"exportSourceImportedFrom":["Prelude"],"exportSourceDefinedIn":["Prelude"]},{"TypeRef":[{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/Virtual.purs","end":[5,33]},"Unit",["Unit"]]}]},{"ReExportRef":[{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/Virtual.purs","end":[5,33]},{"exportSourceImportedFrom":["Prelude"],"exportSourceDefinedIn":["Prelude"]},{"ValueRef":[{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/Virtual.purs","end":[5,33]},{"Ident":"unit"}]}]},{"ModuleRef":[{"start":[2,5],"name":"/home/harry/code/purescript/tests/purs/docs/src/Virtual.purs","end":[2,26]},["VirtualPrelude"]]}],"efImports":[{"eiModule":["Prim"],"eiImportType":{"Implicit":[]},"eiImportedAs":["Prim"]},{"eiModule":["Prim"],"eiImportType":{"Implicit":[]},"eiImportedAs":null},{"eiModule":["Prelude"],"eiImportType":{"Implicit":[]},"eiImportedAs":["VirtualPrelude"]}],"efFixities":[],"efTypeFixities":[],"efDeclarations":[],"efSourceSpan":{"start":[1,1],"name":"/home/harry/code/purescript/tests/purs/docs/src/Virtual.purs","end":[5,33]}} \ No newline at end of file
diff --git a/tests/purs/docs/output/cache-db.json b/tests/purs/docs/output/cache-db.json
new file mode 100644
index 0000000..7cceebe
--- /dev/null
+++ b/tests/purs/docs/output/cache-db.json
@@ -0,0 +1 @@
+{"Ado":{"/home/harry/code/purescript/tests/purs/docs/src/Ado.purs":["2019-05-27T15:59:36.744262173Z","bd980ae20d61e0e34d23507b1d25598f27407a78cf70084327506f21cc02d85df1bd1b6937459665a8dd9df5bb43ec5947b6e94c16c852aba233747e05a9d58f"]},"ChildDeclOrder":{"/home/harry/code/purescript/tests/purs/docs/src/ChildDeclOrder.purs":["2019-05-07T20:51:57.241885374Z","41a7be97fffe1bbbf925ccb56b68246abb8684b23529fc25e07827b57b32b60ccd82d5c9a2279dc23be1f8803cff8267fa296509b873ec337ffa15ee0e32e2c9"]},"Clash":{"/home/harry/code/purescript/tests/purs/docs/src/Clash.purs":["2019-05-07T20:51:57.241885374Z","7b70d019ea46b72149e185d82bc1345113e8a3977a886aa31ac8a268c6c63c7b93553e1586c45e023e49e485d3f6523a4a11efc8dc70dd8bac5d8b9cac4e4c2d"]},"Clash1":{"/home/harry/code/purescript/tests/purs/docs/src/Clash1.purs":["2019-05-07T20:51:57.241885374Z","bd09c1fd0308ce61d83bef03d3b2366601df559ef8cc9c09f17d963a1bfb2b2e373dcbf5729a3e465c635fbf0035ae09ea3ba58b7844b56586dc3baf9d857bb5"]},"Clash1a":{"/home/harry/code/purescript/tests/purs/docs/src/Clash1a.purs":["2019-05-07T20:51:57.241885374Z","0a93c507e1fab2abaee66e20721e952062466e2597d8eb0c48cad8d351e3204ac157da0c3eebf3d13211cbe379e704245da3535f02bd768adf92f6c1119ca2ee"]},"Clash2":{"/home/harry/code/purescript/tests/purs/docs/src/Clash2.purs":["2019-05-07T20:51:57.241885374Z","10c61c6600084fdcc0ee93608a354fd7efa7edab67ac8cce131e522b597080b2927dc7bb1a6c98765dfc9a30583dc5bea2514d2932554ab1657c664a81a0a81b"]},"Clash2a":{"/home/harry/code/purescript/tests/purs/docs/src/Clash2a.purs":["2019-05-07T20:51:57.241885374Z","d37d26a74b0adec6d8b2de4b75997306e4f199374a1a2b4c1b431a273d16a9e89a634028b428c25aedbc01213bc00574abedaaabaae920f40eaa5be6196c07f6"]},"ConstrainedArgument":{"/home/harry/code/purescript/tests/purs/docs/src/ConstrainedArgument.purs":["2019-05-07T20:51:57.241885374Z","87e0f15cb8e2608fa2ba1a5726eae564526394d07c787975db539c4a496d8889be042c774bd68f975e5fe3fd94a0ab66edac081192a5f5ea581424ea28e36948"]},"Data.Newtype":{"bower_components/purescript-newtype/src/Data/Newtype.purs":["2019-05-29T23:59:43.541797429Z","9a591cfc87fe2fc4e0cd95362fc2a3c12dbf4f7875860036d0d18cf57cdc063b3d72488fe351e2e95196030e89fb133edceed211219be5922f86160fed4965b9"]},"DeclOrder":{"/home/harry/code/purescript/tests/purs/docs/src/DeclOrder.purs":["2019-05-07T20:51:57.241885374Z","a8c6ab9c335037c255ae6e0124a107f2e2462c2eebc2ff3637273ba436f2f3589ae203919ff5c8c61106b0542114ba3eba66426d8b5e316089bc1f4efb72643a"]},"DeclOrderNoExportList":{"/home/harry/code/purescript/tests/purs/docs/src/DeclOrderNoExportList.purs":["2019-05-07T20:51:57.241885374Z","379def50dfd7a01dd2b057c707ea8ee53147d41c7dc28083c3827ccc213816840fd26d784a78bd1eabd105231e5479c7bfeebfcb03d1e2f3e8174ab173d740c4"]},"Desugar":{"/home/harry/code/purescript/tests/purs/docs/src/Desugar.purs":["2019-05-07T20:51:57.241885374Z","50ceefe5cbac286908cc7070f4e94f57c62b5c91245d5a8c66d7f4565e3d037e4cf11524c4c790664588a0a5c4216390b5138be9ec93e14d0f82a2c59c8f561a"]},"DocComments":{"/home/harry/code/purescript/tests/purs/docs/src/DocComments.purs":["2019-05-07T20:51:57.241885374Z","220498626601722feb58dd23dd80ac970f6ba7df8e8c2ad604ed833933f6b36219fb5f1d0b9963ffc7e9314043760055ab547fac5784a28416a4851f257a635b"]},"DocCommentsClassMethod":{"/home/harry/code/purescript/tests/purs/docs/src/DocCommentsClassMethod.purs":["2019-10-12T20:54:05.715305902Z","f55a03f2b2624a9ca01adc8372bad4b7e46e8ef1a52ec41c5992767146c9a2354320a3a38587cbf2e78fec118430f193fdcb1cdd9600cd9f755dbbc2e36e46b7"]},"DocCommentsDataConstructor":{"/home/harry/code/purescript/tests/purs/docs/src/DocCommentsDataConstructor.purs":["2019-10-12T20:54:05.715305902Z","68d644ce63642bd55d8338e78e0070c409d3c970a2967338cf612d7a3217813fd98a08e1905776572819cadbc08cdd4bec4a7c1473974a9f3f5d5b1149d33257"]},"DuplicateNames":{"/home/harry/code/purescript/tests/purs/docs/src/DuplicateNames.purs":["2019-05-07T20:51:57.241885374Z","5652f5da0ae79185fb27bce13793bd7752779364e0d1c7c56be2d213853c26ad0abff8536a0d34090a079980e498c837026521efe4a8cfc1b1a16ec70c724eed"]},"Example":{"/home/harry/code/purescript/tests/purs/docs/src/Example.purs":["2019-05-07T20:51:57.241885374Z","3b700a99cc5ee257009553d27a2d25f71f68f006e9deec2b3578f01c7fe4e77de1e929dc110dfcd51d68685ad3ab6b09b0147fe63719861e8a9e480a64e286d9"]},"Example2":{"/home/harry/code/purescript/tests/purs/docs/src/Example2.purs":["2019-05-07T20:51:57.241885374Z","6a479db4e40f66b1e29889516a55cfb22b15b2b8c4531b9cf20307a965af3dc0a6dab4eccc31cca4eacaaa158a01c58ff995ac6f01b2e1ed5571c44fa3bf2536"]},"ExplicitExport":{"/home/harry/code/purescript/tests/purs/docs/src/ExplicitExport.purs":["2019-05-07T20:51:57.241885374Z","fe733409eb325c971f84b6414a1fc9e08793d2271eebcd670ceefd5c5aef837ee76ec5cb5bed96d87ea791a7521c76668a71be5cd8fb14209414893dc20d3d47"]},"ExplicitTypeSignatures":{"/home/harry/code/purescript/tests/purs/docs/src/ExplicitTypeSignatures.purs":["2019-05-07T20:51:57.241885374Z","78a70441c9966f04c6c32a74cbba299f0f8ea870c664e738eb0d8f8cc5929edb7bb697170fc306c9ee69fa4e2f0112af15c8bdb29d63645cdf6f2916a122a0bd"]},"ImportedTwice":{"/home/harry/code/purescript/tests/purs/docs/src/ImportedTwice.purs":["2019-05-07T20:51:57.241885374Z","be9a0cb1e75c689c3af6817a5750862915e70a0017476cce4c539a3c7ce5b33554aa14d2668bd131b89bb28d65b5ddaa79abfb2a538d606f1b11b5ef0ec79067"]},"ImportedTwiceA":{"/home/harry/code/purescript/tests/purs/docs/src/ImportedTwiceA.purs":["2019-05-07T20:51:57.241885374Z","883c8abaefe0dbacbcdea4c53eab41da26687680274419720b1e5d6510bf5127b7ba06df23515ad34f7ffc4626f0064d7867e2b4a5f255a6b573d219926364de"]},"ImportedTwiceB":{"/home/harry/code/purescript/tests/purs/docs/src/ImportedTwiceB.purs":["2019-05-07T20:51:57.241885374Z","48cc2ac8ce40b1d0e3782fcb8ec798cf9c4838a595148055f1bb830d9b07d58780170ad3f8a90f43ac561aff2c52a5d8793480526a4768ebf1c8af1ff1b68751"]},"MultiVirtual":{"/home/harry/code/purescript/tests/purs/docs/src/MultiVirtual.purs":["2019-05-07T20:51:57.241885374Z","31bc7e2c2ebee39dbc89536db51493a2cb1843a9e1aed8b288ef16660877fd1abd5f4224d3325a415aabcf79bd5fe76ebb9257738b0193a50c79a20d48b5ab29"]},"MultiVirtual1":{"/home/harry/code/purescript/tests/purs/docs/src/MultiVirtual1.purs":["2019-05-07T20:51:57.241885374Z","23f7975f7494bb84f9fc6fde9071ce04e86df774d81e2b027a85ab46c8237f9921ee926f4a4ad3e03c7799e485ce39e542d1dd94953c50c0d58ea0003cfc3842"]},"MultiVirtual2":{"/home/harry/code/purescript/tests/purs/docs/src/MultiVirtual2.purs":["2019-05-07T20:51:57.241885374Z","f424ed7c0db709b6bb1e57f87069f484fd0db9dddd0475cd15d36bd58743e98729c42efd2df6ee8fbd18609c36c2247cf3428a5a7f1f5ed11e233a2b134990ba"]},"MultiVirtual3":{"/home/harry/code/purescript/tests/purs/docs/src/MultiVirtual3.purs":["2019-05-07T20:51:57.241885374Z","a42415e3b8309bfa81ef127c61dba6f4001188dcee160a8e2f73399179a11262f12daf0205d6bec38fc605b637550f16b62e84a0f2a0f6999355d56ff2540405"]},"NewOperators":{"/home/harry/code/purescript/tests/purs/docs/src/NewOperators.purs":["2019-05-07T20:51:57.241885374Z","f74cae05c73db1f629e199692c517866fb1683caab3c4509657a371733f30319f0c505ed57208757b3e43795aab5191000c834a501d9bd2bf0e58875873c5c40"]},"NewOperators2":{"/home/harry/code/purescript/tests/purs/docs/src/NewOperators2.purs":["2019-05-07T20:51:57.241885374Z","c551a91aa792fb9ee4b5758c010761a53d4a14b8fbaa6b76b6bd9a318a28f245c9b090bdc4f77b904c873d9b71d59fbad3ccd9ad7c8773f5c1e57a22a0204844"]},"NotAllCtors":{"/home/harry/code/purescript/tests/purs/docs/src/NotAllCtors.purs":["2019-05-07T20:51:57.241885374Z","6e0af26cf897b5dd6e8dd4d75988e5607118f6fdd5219aa192f477cc4d760d504bdec930d46af82a44950e3de4fe6c37664a4560a523a45097503b85c161bd96"]},"Prelude":{"bower_components/purescript-prelude/src/Prelude.purs":["2019-05-07T20:51:57.237885423Z","7eb0b2f9b7aec29693f79be4642ccea792b1f54c7022a4f1395fb8f3a9b1ad6cbfb2e7685940b89ab21890c02949ec90d4823bd5c36a6b566ca9cb8ec561958f"]},"PrimSubmodules":{"/home/harry/code/purescript/tests/purs/docs/src/PrimSubmodules.purs":["2019-05-07T20:51:57.241885374Z","cea3766e9920985a3458c6f7af4a19dbe435527d0b0e1d465e8d7362ebd14cea569e820c3849e45c88f368ced11b1e948276f86dc6f0dc0e0eac78c7df2afa50"]},"ReExportedTypeClass":{"/home/harry/code/purescript/tests/purs/docs/src/ReExportedTypeClass.purs":["2019-05-07T20:51:57.241885374Z","1cc581d68e1ce113162ab851872e73645807f0deb1d2b970ebc04b314184fe30c3431212ffcf9eec09a56a2291e0050750ac6905f1884bc74d406d0323c4f804"]},"SolitaryTypeClassMember":{"/home/harry/code/purescript/tests/purs/docs/src/SolitaryTypeClassMember.purs":["2019-05-07T20:51:57.241885374Z","f627c589b0a8f58d7bfdf28ecf87891a74e64e8399ce0ab645b7c58049fddc1ea3cbb3c34b862bec8576108d5258d9548ecfbbab98598671cc645a3f358ac852"]},"SomeTypeClass":{"/home/harry/code/purescript/tests/purs/docs/src/SomeTypeClass.purs":["2019-05-07T20:51:57.241885374Z","d09fc77e6c6350e7e4941e2911e012271a49db4a75c57cf738d5865ca622d60b69337f969aa02b13fc869484cba00479212e4b8dbcb458c5723e7a5d73888368"]},"Transitive1":{"/home/harry/code/purescript/tests/purs/docs/src/Transitive1.purs":["2019-05-07T20:51:57.241885374Z","42681f3d0fa143d36474d1cb2f464820bdb907bbc432cd91349f6acdd82657ecb4d9ad1d075c96c551bed37dada4615dd3ff64f912f2cc8a6d99b5e02ee51979"]},"Transitive2":{"/home/harry/code/purescript/tests/purs/docs/src/Transitive2.purs":["2019-05-07T20:51:57.241885374Z","110a1bae420e0f0c05e9846fad483a1d035dfc3ba82c2cd81e44f548fd97965055b1a687ab86256f8cb6a3d79b4c4abe6f45d4728bbc04a7a1b0fedbca115b1e"]},"Transitive3":{"/home/harry/code/purescript/tests/purs/docs/src/Transitive3.purs":["2019-05-07T20:51:57.241885374Z","65f7bb366ac8fab63084ff0229c9d55293db8126b539ff2cb53e511505995f426d50f4cca7d1f61fc53aaaaeed9d72791f9d9f12cc569d92e7bbe1d1908b093c"]},"TypeClassWithFunDeps":{"/home/harry/code/purescript/tests/purs/docs/src/TypeClassWithFunDeps.purs":["2019-05-07T20:51:57.241885374Z","c828f194c8c679d97425ed7e04eb3c9bb04bc4c32542d7d6d7e4a36c6c734eb8ba1ef472ad2b0085d9a042a0724648b85a4605d8fe4995e1a32839b1fb1f0f23"]},"TypeClassWithoutMembers":{"/home/harry/code/purescript/tests/purs/docs/src/TypeClassWithoutMembers.purs":["2019-05-07T20:51:57.241885374Z","3eac42652ce295ee47c340c4b86c91d0f6a8ad1f81824475fa4fc4ae8fd8bb77ceee6a46e31bebe9d2e8a980a7923432b41b0eff5cbf75580ee149e7d997e098"]},"TypeClassWithoutMembersIntermediate":{"/home/harry/code/purescript/tests/purs/docs/src/TypeClassWithoutMembersIntermediate.purs":["2019-05-07T20:51:57.241885374Z","76d65083da1f6240b4c3b6c910af1326b9b9a538f4eb278b00ddf0bf67d9547c1cab0fae7661bbe4af6e7ecdea9fd26cc9ff9ea5b289d3c3994b3ccb3d099ba8"]},"TypeLevelString":{"/home/harry/code/purescript/tests/purs/docs/src/TypeLevelString.purs":["2019-05-07T20:51:57.241885374Z","361dc3825ebd3efcd9a53dd900cc623f5eca14df82afc93f4d485d8b38e51eb0a72929b6cfb783b3d5c9bef46e6fd18c139fdbd10de484beb335e09ecee79388"]},"TypeOpAliases":{"/home/harry/code/purescript/tests/purs/docs/src/TypeOpAliases.purs":["2019-05-07T20:51:57.241885374Z","5f1279d355f0e8f8c7d063950007ba060f0afdb83524fa10361f389d25fdacdf149c907cbdd94cf3d1a77751903701f22ba377203cd3b5d0c40e504699f94249"]},"TypeSynonym":{"/home/harry/code/purescript/tests/purs/docs/src/TypeSynonym.purs":["2019-05-29T23:59:43.541797429Z","d1a0af1c2592e7f150bb0bf1dca4fc82ffe95b4f96be611408828d105d28bb6a4243a4c2799b1c35875a352e51a19464e4507b9c81d9cd34f0f55f8c94898ed9"]},"TypeSynonymInstance":{"/home/harry/code/purescript/tests/purs/docs/src/TypeSynonymInstance.purs":["2019-05-29T23:59:43.541797429Z","336ba7262428a526f3824306f4ac472aebf637181b8aa23d823e6e70641539a14d57b52272d844af3e3a7fa85cdf4094042e464b61622a5a1c290ee8a6684733"]},"UTF8":{"/home/harry/code/purescript/tests/purs/docs/src/UTF8.purs":["2019-05-07T20:51:57.241885374Z","60771c6d4974ef36414775e5a2511e99d08d5ba3945b010d7a399b77b88b310e10ad7d0016f7946ca3f524e7bbd1dce3575f7b2d81f8154bde197a3da411a624"]},"Virtual":{"/home/harry/code/purescript/tests/purs/docs/src/Virtual.purs":["2019-05-07T20:51:57.241885374Z","a1e01c8b1a7c86c86942611649702ebf6689cf7559ce9ca0ba66052eafe64826b0770b33089e72cc26a3c90d75bcf62e0b75a6a90e085e70a6ec946b16456de2"]}} \ No newline at end of file
diff --git a/tests/purs/passing/3558-UpToDateDictsForHigherOrderFns.purs b/tests/purs/passing/3558-UpToDateDictsForHigherOrderFns.purs
new file mode 100644
index 0000000..8515fc9
--- /dev/null
+++ b/tests/purs/passing/3558-UpToDateDictsForHigherOrderFns.purs
@@ -0,0 +1,33 @@
+module Main where
+
+import Prelude (Unit)
+import Effect (Effect)
+import Effect.Console (log)
+import Record.Unsafe (unsafeGet)
+import Type.Data.Symbol (class IsSymbol, SProxy, reflectSymbol)
+import Type.Row (class Cons) as Row
+
+newtype LBox row a = LBox (∀ r. (∀ lbl _1. Row.Cons lbl a _1 row ⇒ IsSymbol lbl ⇒ SProxy lbl → r) → r)
+
+unLBox ∷ ∀ row a r. (∀ lbl _1. Row.Cons lbl a _1 row ⇒ IsSymbol lbl ⇒ SProxy lbl → r) → LBox row a → r
+unLBox g (LBox f) = f g
+
+-- Example 1
+lboxIdentity ∷ ∀ row a. LBox row a → LBox row a
+lboxIdentity = unLBox \lbl → LBox \f → f lbl
+
+-- Example 2
+read ∷ ∀ row a. Record row → LBox row a → a
+read rec = unLBox \lbl → get lbl rec
+
+get
+ :: forall r r' l a
+ . IsSymbol l
+ => Row.Cons l a r' r
+ => SProxy l
+ -> Record r
+ -> a
+get l r = unsafeGet (reflectSymbol l) r
+
+main :: Effect Unit
+main = log "Done"
diff --git a/tests/purs/warning/Kind-UnusedExplicitImport-1.purs b/tests/purs/warning/Kind-UnusedExplicitImport-1.purs
new file mode 100644
index 0000000..e5c9ba5
--- /dev/null
+++ b/tests/purs/warning/Kind-UnusedExplicitImport-1.purs
@@ -0,0 +1,11 @@
+-- @shouldWarnWith UnusedExplicitImport
+module Main where
+
+import Prelude (Unit, unit, pure)
+import Effect (Effect)
+import Type.RowList (RLProxy, kind RowList)
+
+class A (a :: RowList)
+
+main :: Effect Unit
+main = pure unit
diff --git a/tests/purs/warning/Kind-UnusedExplicitImport-2.purs b/tests/purs/warning/Kind-UnusedExplicitImport-2.purs
new file mode 100644
index 0000000..0c8623e
--- /dev/null
+++ b/tests/purs/warning/Kind-UnusedExplicitImport-2.purs
@@ -0,0 +1,12 @@
+-- @shouldWarnWith UnusedExplicitImport
+module Main where
+
+import Prelude (Unit, unit, pure)
+import Effect (Effect)
+import Type.RowList (RLProxy, kind RowList)
+
+f :: forall l. RLProxy l -> Int
+f _ = 0
+
+main :: Effect Unit
+main = pure unit
diff --git a/tests/purs/warning/Kind-UnusedImport.purs b/tests/purs/warning/Kind-UnusedImport.purs
new file mode 100644
index 0000000..07ad87f
--- /dev/null
+++ b/tests/purs/warning/Kind-UnusedImport.purs
@@ -0,0 +1,9 @@
+-- @shouldWarnWith UnusedImport
+module Main where
+
+import Prelude (Unit, unit, pure)
+import Effect (Effect)
+import Type.RowList (kind RowList)
+
+main :: Effect Unit
+main = pure unit