purescript 0.11.1 → 0.11.2
raw patch · 30 files changed
+1501/−673 lines, 30 filesdep ~Globdep ~aesondep ~aeson-better-errorsPVP: major bump suggested
API removals or changes: PVP suggests a major version bump
Dependency ranges changed: Glob, aeson, aeson-better-errors, base, base-compat, blaze-html, bower-json, boxes, directory, http-types, lens, monad-logger, mtl, optparse-applicative, parsec, process, stm, transformers, transformers-compat, utf8-string
API changes (from Hackage documentation)
- Language.PureScript.Ide.Externs: annotateModule :: (DefinitionSites SourceSpan, TypeAnnotations) -> [IdeDeclarationAnn] -> [IdeDeclarationAnn]
+ Language.PureScript.Ide.Types: [_ideSynonymKind] :: IdeTypeSynonym -> Kind
+ Language.PureScript.Ide.Types: [_ideTCKind] :: IdeTypeClass -> Kind
+ Language.PureScript.Ide.Types: ideSynonymKind :: Lens' IdeTypeSynonym Kind
+ Language.PureScript.Ide.Types: ideTCKind :: Lens' IdeTypeClass Kind
+ Language.PureScript.Sugar.CaseDeclarations: desugarCaseGuards :: forall m. (MonadSupply m, MonadError MultipleErrors m) => [Declaration] -> m [Declaration]
- Language.PureScript.Ide.Types: IdeTypeClass :: ProperName ClassName -> [IdeInstance] -> IdeTypeClass
+ Language.PureScript.Ide.Types: IdeTypeClass :: ProperName ClassName -> Kind -> [IdeInstance] -> IdeTypeClass
- Language.PureScript.Ide.Types: IdeTypeSynonym :: ProperName TypeName -> Type -> IdeTypeSynonym
+ Language.PureScript.Ide.Types: IdeTypeSynonym :: ProperName TypeName -> Type -> Kind -> IdeTypeSynonym
Files
- CONTRIBUTORS.md +1/−0
- examples/passing/2795.purs +14/−0
- examples/passing/PolyLabels.js +17/−0
- examples/passing/PolyLabels.purs +65/−0
- examples/psci/BasicEval.purs +10/−0
- examples/psci/Multiline.purs +10/−0
- purescript.cabal +1026/−466
- src/Language/PureScript/Constants.hs +3/−0
- src/Language/PureScript/Docs/Prim.hs +8/−0
- src/Language/PureScript/Environment.hs +11/−0
- src/Language/PureScript/Ide/Externs.hs +58/−62
- src/Language/PureScript/Ide/State.hs +35/−2
- src/Language/PureScript/Ide/Types.hs +2/−0
- src/Language/PureScript/Ide/Util.hs +1/−1
- src/Language/PureScript/Interactive/IO.hs +12/−5
- src/Language/PureScript/Make.hs +9/−2
- src/Language/PureScript/Pretty/Values.hs +25/−7
- src/Language/PureScript/Sugar/CaseDeclarations.hs +32/−15
- src/Language/PureScript/TypeChecker/Entailment.hs +6/−1
- src/Language/PureScript/TypeChecker/Types.hs +12/−11
- tests/Language/PureScript/Ide/ImportsSpec.hs +12/−15
- tests/Language/PureScript/Ide/ReexportsSpec.hs +14/−24
- tests/Language/PureScript/Ide/SourceFileSpec.hs +2/−2
- tests/Language/PureScript/Ide/StateSpec.hs +2/−4
- tests/Language/PureScript/Ide/Test.hs +6/−6
- tests/TestPsci.hs +6/−13
- tests/TestPsci/CommandTest.hs +25/−26
- tests/TestPsci/CompletionTest.hs +8/−8
- tests/TestPsci/EvalTest.hs +66/−0
- tests/TestPsci/TestEnv.hs +3/−3
CONTRIBUTORS.md view
@@ -53,6 +53,7 @@ | [@kika](https://github.com/kika) | Kirill Pertsev | MIT license | | [@kRITZCREEK](https://github.com/kRITZCREEK) | Christoph Hegemann | MIT license | | [@L8D](https://github.com/L8D) | Tenor Biel | [MIT license](http://opensource.org/licenses/MIT) |+| [@legrostdg](https://github.com/legrostdg) | Félix Sipma | [MIT license](http://opensource.org/licenses/MIT) | | [@LiamGoodacre](https://github.com/LiamGoodacre) | Liam Goodacre | [MIT license](http://opensource.org/licenses/MIT) | | [@lukerandall](https://github.com/lukerandall) | Luke Randall | [MIT license](http://opensource.org/licenses/MIT) | | [@matthewleon](https://github.com/matthewleon) | Matthew Leon | [MIT license](http://opensource.org/licenses/MIT) |
+ examples/passing/2795.purs view
@@ -0,0 +1,14 @@+module Main where++import Prelude+import Control.Monad.Eff.Console (log)++data X = X Int | Y++x :: X -> Int+x = case _ of+ Y -> 0+ X n | 1 <- n -> 1+ | otherwise -> 2++main = log "Done"
+ examples/passing/PolyLabels.js view
@@ -0,0 +1,17 @@+"use strict";++exports.unsafeGet = function (s) {+ return function (o) {+ return o[s];+ };+};++exports.unsafeSet = function(s) {+ return function(a) {+ return function (o) {+ var o1 = {};+ o1[s] = a;+ return Object.assign({}, o, o1);+ };+ };+};
+ examples/passing/PolyLabels.purs view
@@ -0,0 +1,65 @@+module Main where++import Prelude+import Control.Monad.Eff+import Control.Monad.Eff.Console+import Data.Symbol (class IsSymbol, SProxy(..), reflectSymbol)++foreign import unsafeGet+ :: forall r a+ . String+ -> Record r+ -> a++foreign import unsafeSet+ :: forall r1 r2 a+ . String+ -> a+ -> Record r1+ -> Record r2++get+ :: forall r r' l a+ . IsSymbol l+ => RowCons l a r' r+ => SProxy l+ -> Record r+ -> a+get l = unsafeGet (reflectSymbol l)++set+ :: forall r1 r2 r l a b+ . IsSymbol l+ => RowCons l a r r1+ => RowCons l b r r2+ => SProxy l+ -> b+ -> Record r1+ -> Record r2+set l = unsafeSet (reflectSymbol l)++lens + :: forall l f r1 r2 r a b+ . IsSymbol l+ => RowCons l a r r1+ => RowCons l b r r2+ => Functor f+ => SProxy l+ -> (a -> f b)+ -> Record r1+ -> f (Record r2)+lens l f r = flip (set l) r <$> f (get l r)++getFoo :: forall a r. { foo :: a | r } -> a+getFoo = get (SProxy :: SProxy "foo")++setFoo :: forall a b r. b -> { foo :: a | r } -> { foo :: b | r }+setFoo = set (SProxy :: SProxy "foo")++fooLens :: forall f a b r. Functor f => (a -> f b) -> { foo :: a | r } -> f { foo :: b | r } +fooLens = lens (SProxy :: SProxy "foo")++main :: Eff (console :: CONSOLE) Unit+main = do+ _ <- fooLens logShow { foo: 1 }+ log (getFoo (setFoo "Done" { foo: 1 }))
+ examples/psci/BasicEval.purs view
@@ -0,0 +1,10 @@+import Prelude+import Data.Array++-- @shouldEvaluateTo 3628800+let fac n = foldl mul 1 (1..n) in fac 10++fac n = foldl mul 1 (1..n)++-- @shouldEvaluateTo 3628800+fac 10
+ examples/psci/Multiline.purs view
@@ -0,0 +1,10 @@+import Prelude+import Data.Array++-- @paste+fac :: Int -> Int+fac n = foldl mul 1 (1..n)+-- @paste++-- @shouldEvaluateTo 3628800+fac 10
purescript.cabal view
@@ -1,466 +1,1026 @@-name: purescript-version: 0.11.1-cabal-version: >=1.8-build-type: Simple-license: BSD3-license-file: LICENSE-copyright: (c) 2013-16 Phil Freeman, (c) 2014-16 Gary Burgess-maintainer: Phil Freeman <paf31@cantab.net>-stability: experimental-synopsis: PureScript Programming Language Compiler-description: A small strongly, statically typed programming language with expressive types, inspired by Haskell and compiling to JavaScript.-category: Language-Homepage: http://www.purescript.org/-author: Phil Freeman <paf31@cantab.net>,- Gary Burgess <gary.burgess@gmail.com>,- Hardy Jones <jones3.hardy@gmail.com>,- Harry Garrood <harry@garrood.me>,- Christoph Hegemann <christoph.hegemann1337@gmail.com>--tested-with: GHC==7.10.3--extra-source-files: examples/passing/*.purs- , examples/passing/*.js- , examples/passing/2018/*.purs- , examples/passing/2138/*.purs- , examples/passing/2609/*.purs- , examples/passing/ClassRefSyntax/*.purs- , examples/passing/DctorOperatorAlias/*.purs- , examples/passing/ExplicitImportReExport/*.purs- , examples/passing/ExportExplicit/*.purs- , examples/passing/ExportExplicit2/*.purs- , examples/passing/ForeignKind/*.purs- , examples/passing/Import/*.purs- , examples/passing/ImportExplicit/*.purs- , examples/passing/ImportQualified/*.purs- , examples/passing/Module/*.purs- , examples/passing/ModuleDeps/*.purs- , examples/passing/ModuleExport/*.purs- , examples/passing/ModuleExportDupes/*.purs- , examples/passing/ModuleExportExcluded/*.purs- , examples/passing/ModuleExportQualified/*.purs- , examples/passing/ModuleExportSelf/*.purs- , examples/passing/NonConflictingExports/*.purs- , examples/passing/NonOrphanInstanceMulti/*.purs- , examples/passing/NonOrphanInstanceFunDepExtra/*.purs- , examples/passing/OperatorAliasElsewhere/*.purs- , examples/passing/Operators/*.purs- , examples/passing/PendingConflictingImports/*.purs- , examples/passing/PendingConflictingImports2/*.purs- , examples/passing/QualifiedNames/*.purs- , examples/passing/RedefinedFixity/*.purs- , examples/passing/ReExportQualified/*.purs- , examples/passing/ResolvableScopeConflict/*.purs- , examples/passing/ResolvableScopeConflict2/*.purs- , examples/passing/ResolvableScopeConflict3/*.purs- , examples/passing/ShadowedModuleName/*.purs- , examples/passing/SolvingIsSymbol/*.purs- , examples/passing/StringEdgeCases/*.purs- , examples/passing/TransitiveImport/*.purs- , examples/passing/TypeOperators/*.purs- , examples/passing/TypeWithoutParens/*.purs- , examples/failing/*.purs- , examples/failing/1733/*.purs- , examples/failing/2378/*.purs- , examples/failing/2379/*.purs- , examples/failing/ConflictingExports/*.purs- , examples/failing/ConflictingImports/*.purs- , examples/failing/ConflictingImports2/*.purs- , examples/failing/ConflictingQualifiedImports/*.purs- , examples/failing/ConflictingQualifiedImports2/*.purs- , examples/failing/DiffKindsSameName/*.purs- , examples/failing/DuplicateModule/*.purs- , examples/failing/ExportConflictClass/*.purs- , examples/failing/ExportConflictCtor/*.purs- , examples/failing/ExportConflictType/*.purs- , examples/failing/ExportConflictTypeOp/*.purs- , examples/failing/ExportConflictValue/*.purs- , examples/failing/ExportConflictValueOp/*.purs- , examples/failing/ExportExplicit1/*.purs- , examples/failing/ExportExplicit3/*.purs- , examples/failing/ImportExplicit/*.purs- , examples/failing/ImportExplicit2/*.purs- , examples/failing/ImportHidingModule/*.purs- , examples/failing/ImportModule/*.purs- , examples/failing/InstanceExport/*.purs- , examples/failing/OrphanInstance/*.purs- , examples/failing/OrphanInstanceFunDepCycle/*.purs- , examples/failing/OrphanInstanceWithDetermined/*.purs- , examples/failing/OrphanInstanceNullary/*.purs- , examples/warning/*.purs- , examples/warning/*.js- , examples/warning/UnusedExplicitImportTypeOp/*.purs- , examples/docs/bower_components/purescript-prelude/src/*.purs- , examples/docs/bower.json- , examples/docs/src/*.purs- , examples/docs/resolutions.json- , app/static/index.html- , app/static/index.js- , app/static/*.css- , tests/support/package.json- , tests/support/bower.json- , tests/support/setup-win.cmd- , tests/support/psci/*.purs- , tests/support/pscide/src/*.purs- , tests/support/pscide/src/*.js- , tests/support/pscide/src/*.fail- , tests/support/prelude-resolutions.json- , stack.yaml- , README.md- , INSTALL.md- , CONTRIBUTORS.md- , CONTRIBUTING.md--source-repository head- type: git- location: https://github.com/purescript/purescript.git--flag release- description: Mark this build as a release build: prevents inclusion of extra- info e.g. commit SHA in --version output)- default: False--library- build-depends: base >=4.8 && <5,- aeson >= 0.8 && < 1.1,- aeson-better-errors >= 0.8,- ansi-terminal >= 0.6.2 && < 0.7,- base-compat >=0.6.0,- blaze-html >= 0.8.1 && < 0.9,- bower-json >= 1.0.0.1 && < 1.1,- boxes >= 0.1.4 && < 0.2.0,- bytestring -any,- cheapskate >= 0.1 && < 0.2,- containers -any,- clock -any,- data-ordlist >= 0.4.7.0,- deepseq -any,- directory >= 1.2,- dlist -any,- edit-distance -any,- filepath -any,- fsnotify >= 0.2.1,- Glob >= 0.7 && < 0.8,- haskeline >= 0.7.0.0,- http-client >= 0.4.30 && < 0.6.0,- http-types -any,- language-javascript >= 0.6.0.9 && < 0.7,- lens == 4.*,- lifted-base >= 0.2.3 && < 0.2.4,- monad-control >= 1.0.0.0 && < 1.1,- monad-logger >= 0.3 && < 0.4,- mtl >= 2.1.0 && < 2.3.0,- parallel >= 3.2 && < 3.3,- parsec >=3.1.10,- pattern-arrows >= 0.0.2 && < 0.1,- pipes >= 4.0.0 && < 4.4.0,- pipes-http -any,- process >= 1.2.0 && < 1.5,- protolude >= 0.1.6,- regex-tdfa -any,- safe >= 0.3.9 && < 0.4,- scientific >= 0.3.4.9 && < 0.4,- semigroups >= 0.16.2 && < 0.19,- sourcemap >= 0.1.6,- spdx == 0.2.*,- split -any,- stm >= 0.2.4.0,- syb -any,- text -any,- time -any,- transformers >= 0.3.0 && < 0.6,- transformers-base >= 0.4.0 && < 0.5,- transformers-compat >= 0.3.0,- unordered-containers -any,- utf8-string >= 1 && < 2,- vector -any-- exposed-modules: Language.PureScript- Language.PureScript.AST- Language.PureScript.AST.Binders- Language.PureScript.AST.Declarations- Language.PureScript.AST.Operators- Language.PureScript.AST.Literals- Language.PureScript.AST.SourcePos- Language.PureScript.AST.Traversals- Language.PureScript.AST.Exported- Language.PureScript.Bundle- Language.PureScript.Crash- Language.PureScript.Externs- Language.PureScript.CodeGen- Language.PureScript.CodeGen.JS- Language.PureScript.CodeGen.JS.Common- Language.PureScript.CodeGen.JS.Printer- Language.PureScript.Constants- Language.PureScript.CoreFn- Language.PureScript.CoreFn.Ann- Language.PureScript.CoreFn.Binders- Language.PureScript.CoreFn.Desugar- Language.PureScript.CoreFn.Expr- Language.PureScript.CoreFn.Meta- Language.PureScript.CoreFn.Module- Language.PureScript.CoreFn.Traversals- Language.PureScript.CoreFn.ToJSON- Language.PureScript.CoreImp- Language.PureScript.CoreImp.AST- Language.PureScript.CoreImp.Optimizer- Language.PureScript.CoreImp.Optimizer.Blocks- Language.PureScript.CoreImp.Optimizer.Common- Language.PureScript.CoreImp.Optimizer.Inliner- Language.PureScript.CoreImp.Optimizer.MagicDo- Language.PureScript.CoreImp.Optimizer.TCO- Language.PureScript.CoreImp.Optimizer.Unused- Language.PureScript.Comments- Language.PureScript.Environment- Language.PureScript.Errors- Language.PureScript.Errors.JSON- Language.PureScript.Kinds- Language.PureScript.Label- Language.PureScript.Linter- Language.PureScript.Linter.Exhaustive- Language.PureScript.Linter.Imports- Language.PureScript.Make- Language.PureScript.ModuleDependencies- Language.PureScript.Names- Language.PureScript.Options- Language.PureScript.Parser- Language.PureScript.Parser.Lexer- Language.PureScript.Parser.Common- Language.PureScript.Parser.Declarations- Language.PureScript.Parser.Kinds- Language.PureScript.Parser.State- Language.PureScript.Parser.Types- Language.PureScript.Pretty- Language.PureScript.Pretty.Common- Language.PureScript.Pretty.Kinds- Language.PureScript.Pretty.Types- Language.PureScript.Pretty.Values- Language.PureScript.PSString- Language.PureScript.Renamer- Language.PureScript.Sugar- Language.PureScript.Sugar.BindingGroups- Language.PureScript.Sugar.CaseDeclarations- Language.PureScript.Sugar.DoNotation- Language.PureScript.Sugar.LetPattern- Language.PureScript.Sugar.Names- Language.PureScript.Sugar.Names.Common- Language.PureScript.Sugar.Names.Env- Language.PureScript.Sugar.Names.Exports- Language.PureScript.Sugar.Names.Imports- Language.PureScript.Sugar.ObjectWildcards- Language.PureScript.Sugar.Operators- Language.PureScript.Sugar.Operators.Common- Language.PureScript.Sugar.Operators.Expr- Language.PureScript.Sugar.Operators.Binders- Language.PureScript.Sugar.Operators.Types- Language.PureScript.Sugar.TypeClasses- Language.PureScript.Sugar.TypeClasses.Deriving- Language.PureScript.Sugar.TypeDeclarations- Language.PureScript.Traversals- Language.PureScript.TypeChecker- Language.PureScript.TypeChecker.Entailment- Language.PureScript.TypeChecker.Kinds- Language.PureScript.TypeChecker.Monad- Language.PureScript.TypeChecker.Skolems- Language.PureScript.TypeChecker.Subsumption- Language.PureScript.TypeChecker.Synonyms- Language.PureScript.TypeChecker.Types- Language.PureScript.TypeChecker.TypeSearch- Language.PureScript.TypeChecker.Unify- Language.PureScript.TypeClassDictionaries- Language.PureScript.Types-- Language.PureScript.Docs- Language.PureScript.Docs.Convert- Language.PureScript.Docs.Convert.Single- Language.PureScript.Docs.Convert.ReExports- Language.PureScript.Docs.Prim- Language.PureScript.Docs.Render- Language.PureScript.Docs.Types- Language.PureScript.Docs.RenderedCode- Language.PureScript.Docs.RenderedCode.Types- Language.PureScript.Docs.RenderedCode.RenderType- Language.PureScript.Docs.RenderedCode.RenderKind- Language.PureScript.Docs.AsMarkdown- Language.PureScript.Docs.AsHtml- Language.PureScript.Docs.ParseInPackage- Language.PureScript.Docs.Utils.MonoidExtras-- Language.PureScript.Publish- Language.PureScript.Publish.Utils- Language.PureScript.Publish.ErrorsWarnings- Language.PureScript.Publish.BoxesHelpers-- Language.PureScript.Ide- Language.PureScript.Ide.CaseSplit- Language.PureScript.Ide.Command- Language.PureScript.Ide.Completion- Language.PureScript.Ide.Externs- Language.PureScript.Ide.Error- Language.PureScript.Ide.Filter- Language.PureScript.Ide.Imports- Language.PureScript.Ide.Logging- Language.PureScript.Ide.Matcher- Language.PureScript.Ide.Pursuit- Language.PureScript.Ide.Rebuild- Language.PureScript.Ide.Reexports- Language.PureScript.Ide.SourceFile- Language.PureScript.Ide.State- Language.PureScript.Ide.Types- Language.PureScript.Ide.Util- Language.PureScript.Ide.Watcher-- Language.PureScript.Interactive- Language.PureScript.Interactive.Types- Language.PureScript.Interactive.Parser- Language.PureScript.Interactive.Directive- Language.PureScript.Interactive.Completion- Language.PureScript.Interactive.IO- Language.PureScript.Interactive.Message- Language.PureScript.Interactive.Module- Language.PureScript.Interactive.Printer-- Control.Monad.Logger- Control.Monad.Supply- Control.Monad.Supply.Class-- System.IO.UTF8-- extensions: ConstraintKinds- DataKinds- DeriveFunctor- EmptyDataDecls- FlexibleContexts- KindSignatures- LambdaCase- MultiParamTypeClasses- NoImplicitPrelude- PatternGuards- PatternSynonyms- RankNTypes- RecordWildCards- OverloadedStrings- ScopedTypeVariables- TupleSections- ViewPatterns- exposed: True- buildable: True- hs-source-dirs: src- other-modules: Paths_purescript- ghc-options: -Wall -O2--executable purs- build-depends: base >=4 && <5,- aeson >= 0.8 && < 1.1,- ansi-terminal >= 0.6.2 && < 0.7,- ansi-wl-pprint -any,- base-compat >=0.6.0,- blaze-html -any,- boxes >= 0.1.4 && < 0.2.0,- bytestring -any,- containers -any,- directory -any,- file-embed -any,- filepath -any,- Glob >= 0.7 && < 0.8,- haskeline >= 0.7.0.0,- http-types == 0.9.*,- monad-logger -any,- mtl -any,- network -any,- optparse-applicative >= 0.13.0,- parsec -any,- process -any,- protolude >= 0.1.6,- purescript -any,- sourcemap >= 0.1.6,- split -any,- stm >= 0.2.4.0,- text -any,- time -any,- transformers -any,- transformers-compat -any,- utf8-string >= 1 && < 2,- wai == 3.*,- wai-websockets == 3.*,- warp == 3.*,- websockets >= 0.9 && <0.11- main-is: Main.hs- buildable: True- hs-source-dirs: app- other-modules: Paths_purescript- Command.Bundle- Command.Compile- Command.Docs- Command.Docs.Ctags- Command.Docs.Etags- Command.Docs.Tags- Command.Docs.Html- Command.Hierarchy- Command.Ide- Command.Publish- Command.REPL- Version- ghc-options: -Wall -O2 -fno-warn-unused-do-bind -threaded -rtsopts "-with-rtsopts=-N"-- if flag(release)- cpp-options: -DRELEASE- else- build-depends: gitrev >= 1.2.0 && <1.3--test-suite tests- build-depends: base >=4 && <5,- purescript -any,- aeson -any,- aeson-better-errors -any,- base-compat -any,- bower-json -any,- boxes -any,- bytestring -any,- containers -any,- directory -any,- filepath -any,- Glob -any,- haskeline >= 0.7.0.0,- hspec -any,- hspec-discover -any,- HUnit -any,- lens -any,- monad-logger -any,- mtl -any,- optparse-applicative -any,- parsec -any,- process -any,- protolude >= 0.1.6,- silently -any,- stm -any,- text -any,- time -any,- transformers -any,- transformers-compat -any,- utf8-string -any,- vector -any- ghc-options: -Wall- type: exitcode-stdio-1.0- main-is: Main.hs- other-modules: TestUtils- TestCompiler- TestDocs- TestPrimDocs- TestPscPublish- TestPsci- TestPsci.CommandTest- TestPsci.CompletionTest- TestPsci.TestEnv- TestPscIde- PscIdeSpec- Language.PureScript.Ide.Test- Language.PureScript.Ide.FilterSpec- Language.PureScript.Ide.ImportsSpec- Language.PureScript.Ide.MatcherSpec- Language.PureScript.Ide.RebuildSpec- Language.PureScript.Ide.ReexportsSpec- Language.PureScript.Ide.SourceFileSpec- Language.PureScript.Ide.StateSpec- buildable: True- hs-source-dirs: tests+-- This file has been generated from package.yaml by hpack version 0.15.0.+--+-- see: https://github.com/sol/hpack++name: purescript+version: 0.11.2+cabal-version: >= 1.10+build-type: Simple+license: BSD3+license-file: LICENSE+copyright: (c) 2013-16 Phil Freeman, (c) 2014-16 Gary Burgess+maintainer: Phil Freeman <paf31@cantab.net>+stability: experimental+homepage: http://www.purescript.org/+bug-reports: https://github.com/purescript/purescript.git/issues+synopsis: PureScript Programming Language Compiler+description: A small strongly, statically typed programming language with expressive types, inspired by Haskell and compiling to JavaScript.+category: Language+author: Phil Freeman <paf31@cantab.net>, Gary Burgess <gary.burgess@gmail.com>, Hardy Jones <jones3.hardy@gmail.com>, Harry Garrood <harry@garrood.me>, Christoph Hegemann <christoph.hegemann1337@gmail.com>+++extra-source-files:+ app/static/index.html+ app/static/index.js+ app/static/normalize.css+ app/static/pursuit.css+ CONTRIBUTING.md+ CONTRIBUTORS.md+ examples/docs/bower.json+ examples/docs/bower_components/purescript-prelude/src/Prelude.purs+ examples/docs/resolutions.json+ examples/docs/src/Clash.purs+ examples/docs/src/Clash1.purs+ examples/docs/src/Clash1a.purs+ examples/docs/src/Clash2.purs+ examples/docs/src/Clash2a.purs+ examples/docs/src/ConstrainedArgument.purs+ examples/docs/src/DocComments.purs+ examples/docs/src/DuplicateNames.purs+ examples/docs/src/Example.purs+ examples/docs/src/Example2.purs+ examples/docs/src/ExplicitTypeSignatures.purs+ examples/docs/src/ImportedTwice.purs+ examples/docs/src/ImportedTwiceA.purs+ examples/docs/src/ImportedTwiceB.purs+ examples/docs/src/MultiVirtual.purs+ examples/docs/src/MultiVirtual1.purs+ examples/docs/src/MultiVirtual2.purs+ examples/docs/src/MultiVirtual3.purs+ examples/docs/src/NewOperators.purs+ examples/docs/src/NewOperators2.purs+ examples/docs/src/NotAllCtors.purs+ examples/docs/src/ReExportedTypeClass.purs+ examples/docs/src/SolitaryTypeClassMember.purs+ examples/docs/src/SomeTypeClass.purs+ examples/docs/src/Transitive1.purs+ examples/docs/src/Transitive2.purs+ examples/docs/src/Transitive3.purs+ examples/docs/src/TypeClassWithFunDeps.purs+ examples/docs/src/TypeClassWithoutMembers.purs+ examples/docs/src/TypeClassWithoutMembersIntermediate.purs+ examples/docs/src/TypeOpAliases.purs+ examples/docs/src/UTF8.purs+ examples/docs/src/Virtual.purs+ examples/failing/1071.purs+ examples/failing/1169.purs+ examples/failing/1175.purs+ examples/failing/1310.purs+ examples/failing/1570.purs+ examples/failing/1733.purs+ examples/failing/1733/Thingy.purs+ examples/failing/1825.purs+ examples/failing/1881.purs+ examples/failing/2128-class.purs+ examples/failing/2128-instance.purs+ examples/failing/2378.purs+ examples/failing/2378/Lib.purs+ examples/failing/2379.purs+ examples/failing/2379/Lib.purs+ examples/failing/2434.purs+ examples/failing/2534.purs+ examples/failing/2542.purs+ examples/failing/2567.purs+ examples/failing/2601.purs+ examples/failing/2616.purs+ examples/failing/365.purs+ examples/failing/438.purs+ examples/failing/881.purs+ examples/failing/AnonArgument1.purs+ examples/failing/AnonArgument2.purs+ examples/failing/AnonArgument3.purs+ examples/failing/ArgLengthMismatch.purs+ examples/failing/Arrays.purs+ examples/failing/ArrayType.purs+ examples/failing/BindInDo-2.purs+ examples/failing/BindInDo.purs+ examples/failing/CannotDeriveNewtypeForData.purs+ examples/failing/CaseBinderLengthsDiffer.purs+ examples/failing/CaseDoesNotMatchAllConstructorArgs.purs+ examples/failing/ConflictingExports.purs+ examples/failing/ConflictingExports/A.purs+ examples/failing/ConflictingExports/B.purs+ examples/failing/ConflictingImports.purs+ examples/failing/ConflictingImports/A.purs+ examples/failing/ConflictingImports/B.purs+ examples/failing/ConflictingImports2.purs+ examples/failing/ConflictingImports2/A.purs+ examples/failing/ConflictingImports2/B.purs+ examples/failing/ConflictingQualifiedImports.purs+ examples/failing/ConflictingQualifiedImports/A.purs+ examples/failing/ConflictingQualifiedImports/B.purs+ examples/failing/ConflictingQualifiedImports2.purs+ examples/failing/ConflictingQualifiedImports2/A.purs+ examples/failing/ConflictingQualifiedImports2/B.purs+ examples/failing/ConstraintFailure.purs+ examples/failing/ConstraintInference.purs+ examples/failing/DctorOperatorAliasExport.purs+ examples/failing/DeclConflictClassCtor.purs+ examples/failing/DeclConflictClassSynonym.purs+ examples/failing/DeclConflictClassType.purs+ examples/failing/DeclConflictCtorClass.purs+ examples/failing/DeclConflictCtorCtor.purs+ examples/failing/DeclConflictDuplicateCtor.purs+ examples/failing/DeclConflictSynonymClass.purs+ examples/failing/DeclConflictSynonymType.purs+ examples/failing/DeclConflictTypeClass.purs+ examples/failing/DeclConflictTypeSynonym.purs+ examples/failing/DeclConflictTypeType.purs+ examples/failing/DiffKindsSameName.purs+ examples/failing/DiffKindsSameName/LibA.purs+ examples/failing/DiffKindsSameName/LibB.purs+ examples/failing/Do.purs+ examples/failing/DoNotSuggestComposition.purs+ examples/failing/DoNotSuggestComposition2.purs+ examples/failing/DuplicateDeclarationsInLet.purs+ examples/failing/DuplicateModule.purs+ examples/failing/DuplicateModule/M1.purs+ examples/failing/DuplicateProperties.purs+ examples/failing/DuplicateTypeVars.purs+ examples/failing/Eff.purs+ examples/failing/EmptyCase.purs+ examples/failing/EmptyClass.purs+ examples/failing/EmptyDo.purs+ examples/failing/ExportConflictClass.purs+ examples/failing/ExportConflictClass/A.purs+ examples/failing/ExportConflictClass/B.purs+ examples/failing/ExportConflictCtor.purs+ examples/failing/ExportConflictCtor/A.purs+ examples/failing/ExportConflictCtor/B.purs+ examples/failing/ExportConflictType.purs+ examples/failing/ExportConflictType/A.purs+ examples/failing/ExportConflictType/B.purs+ examples/failing/ExportConflictTypeOp.purs+ examples/failing/ExportConflictTypeOp/A.purs+ examples/failing/ExportConflictTypeOp/B.purs+ examples/failing/ExportConflictValue.purs+ examples/failing/ExportConflictValue/A.purs+ examples/failing/ExportConflictValue/B.purs+ examples/failing/ExportConflictValueOp.purs+ examples/failing/ExportConflictValueOp/A.purs+ examples/failing/ExportConflictValueOp/B.purs+ examples/failing/ExportExplicit.purs+ examples/failing/ExportExplicit1.purs+ examples/failing/ExportExplicit1/M1.purs+ examples/failing/ExportExplicit2.purs+ examples/failing/ExportExplicit3.purs+ examples/failing/ExportExplicit3/M1.purs+ examples/failing/ExtraRecordField.purs+ examples/failing/Foldable.purs+ examples/failing/Generalization1.purs+ examples/failing/Generalization2.purs+ examples/failing/ImportExplicit.purs+ examples/failing/ImportExplicit/M1.purs+ examples/failing/ImportExplicit2.purs+ examples/failing/ImportExplicit2/M1.purs+ examples/failing/ImportHidingModule.purs+ examples/failing/ImportHidingModule/A.purs+ examples/failing/ImportHidingModule/B.purs+ examples/failing/ImportModule.purs+ examples/failing/ImportModule/M2.purs+ examples/failing/InfiniteKind.purs+ examples/failing/InfiniteType.purs+ examples/failing/InstanceExport.purs+ examples/failing/InstanceExport/InstanceExport.purs+ examples/failing/IntOutOfRange.purs+ examples/failing/InvalidDerivedInstance.purs+ examples/failing/InvalidDerivedInstance2.purs+ examples/failing/InvalidOperatorInBinder.purs+ examples/failing/KindError.purs+ examples/failing/KindStar.purs+ examples/failing/LeadingZeros1.purs+ examples/failing/LeadingZeros2.purs+ examples/failing/Let.purs+ examples/failing/LetPatterns1.purs+ examples/failing/LetPatterns2.purs+ examples/failing/LetPatterns3.purs+ examples/failing/LetPatterns4.purs+ examples/failing/MissingClassExport.purs+ examples/failing/MissingClassMemberExport.purs+ examples/failing/MissingRecordField.purs+ examples/failing/MPTCs.purs+ examples/failing/MultipleErrors.purs+ examples/failing/MultipleErrors2.purs+ examples/failing/MultipleTypeOpFixities.purs+ examples/failing/MultipleValueOpFixities.purs+ examples/failing/MutRec.purs+ examples/failing/MutRec2.purs+ examples/failing/NewtypeInstance.purs+ examples/failing/NewtypeInstance2.purs+ examples/failing/NewtypeInstance3.purs+ examples/failing/NewtypeInstance4.purs+ examples/failing/NewtypeInstance5.purs+ examples/failing/NewtypeInstance6.purs+ examples/failing/NewtypeMultiArgs.purs+ examples/failing/NewtypeMultiCtor.purs+ examples/failing/NonExhaustivePatGuard.purs+ examples/failing/NonWildcardNewtypeInstance.purs+ examples/failing/NullaryAbs.purs+ examples/failing/Object.purs+ examples/failing/OperatorAliasNoExport.purs+ examples/failing/OperatorSections.purs+ examples/failing/OrphanInstance.purs+ examples/failing/OrphanInstance/Class.purs+ examples/failing/OrphanInstanceFunDepCycle.purs+ examples/failing/OrphanInstanceFunDepCycle/Lib.purs+ examples/failing/OrphanInstanceNullary.purs+ examples/failing/OrphanInstanceNullary/Lib.purs+ examples/failing/OrphanInstanceWithDetermined.purs+ examples/failing/OrphanInstanceWithDetermined/Lib.purs+ examples/failing/OrphanTypeDecl.purs+ examples/failing/OverlappingArguments.purs+ examples/failing/OverlappingBinders.purs+ examples/failing/OverlappingVars.purs+ examples/failing/ProgrammableTypeErrors.purs+ examples/failing/ProgrammableTypeErrorsTypeString.purs+ examples/failing/Rank2Types.purs+ examples/failing/RequiredHiddenType.purs+ examples/failing/Reserved.purs+ examples/failing/RowConstructors1.purs+ examples/failing/RowConstructors2.purs+ examples/failing/RowConstructors3.purs+ examples/failing/RowInInstanceNotDetermined0.purs+ examples/failing/RowInInstanceNotDetermined1.purs+ examples/failing/RowInInstanceNotDetermined2.purs+ examples/failing/SkolemEscape.purs+ examples/failing/SkolemEscape2.purs+ examples/failing/SuggestComposition.purs+ examples/failing/Superclasses1.purs+ examples/failing/Superclasses2.purs+ examples/failing/Superclasses3.purs+ examples/failing/Superclasses5.purs+ examples/failing/TooFewClassInstanceArgs.purs+ examples/failing/TopLevelCaseNoArgs.purs+ examples/failing/TransitiveDctorExport.purs+ examples/failing/TransitiveSynonymExport.purs+ examples/failing/TypeClasses2.purs+ examples/failing/TypeClassInstances.purs+ examples/failing/TypedBinders.purs+ examples/failing/TypedBinders2.purs+ examples/failing/TypedBinders3.purs+ examples/failing/TypedHole.purs+ examples/failing/TypeError.purs+ examples/failing/TypeOperatorAliasNoExport.purs+ examples/failing/TypeSynonyms.purs+ examples/failing/TypeSynonyms2.purs+ examples/failing/TypeSynonyms3.purs+ examples/failing/TypeSynonyms4.purs+ examples/failing/TypeSynonyms5.purs+ examples/failing/TypeWildcards1.purs+ examples/failing/TypeWildcards2.purs+ examples/failing/TypeWildcards3.purs+ examples/failing/UnderscoreModuleName.purs+ examples/failing/UnknownType.purs+ examples/failing/UnusableTypeClassMethod.purs+ examples/failing/UnusableTypeClassMethodConflictingIdent.purs+ examples/failing/UnusableTypeClassMethodSynonym.purs+ examples/passing/1110.purs+ examples/passing/1185.purs+ examples/passing/1335.purs+ examples/passing/1570.purs+ examples/passing/1664.purs+ examples/passing/1697.purs+ examples/passing/1807.purs+ examples/passing/1881.purs+ examples/passing/1991.purs+ examples/passing/2018.purs+ examples/passing/2018/A.purs+ examples/passing/2018/B.purs+ examples/passing/2049.purs+ examples/passing/2136.purs+ examples/passing/2138.purs+ examples/passing/2138/Lib.purs+ examples/passing/2172.js+ examples/passing/2172.purs+ examples/passing/2252.purs+ examples/passing/2288.purs+ examples/passing/2378.purs+ examples/passing/2438.purs+ examples/passing/2609.purs+ examples/passing/2609/Eg.purs+ examples/passing/2616.purs+ examples/passing/2626.purs+ examples/passing/2663.purs+ examples/passing/2689.purs+ examples/passing/2695.purs+ examples/passing/2756.purs+ examples/passing/2787.purs+ examples/passing/2795.purs+ examples/passing/652.purs+ examples/passing/810.purs+ examples/passing/862.purs+ examples/passing/922.purs+ examples/passing/Applicative.purs+ examples/passing/ArrayType.purs+ examples/passing/Auto.purs+ examples/passing/AutoPrelude.purs+ examples/passing/AutoPrelude2.purs+ examples/passing/BindersInFunctions.purs+ examples/passing/BindingGroups.purs+ examples/passing/BlockString.purs+ examples/passing/CaseInDo.purs+ examples/passing/CaseInputWildcard.purs+ examples/passing/CaseMultipleExpressions.purs+ examples/passing/CaseStatement.purs+ examples/passing/CheckFunction.purs+ examples/passing/CheckSynonymBug.purs+ examples/passing/CheckTypeClass.purs+ examples/passing/Church.purs+ examples/passing/ClassRefSyntax.purs+ examples/passing/ClassRefSyntax/Lib.purs+ examples/passing/Collatz.purs+ examples/passing/Comparisons.purs+ examples/passing/Conditional.purs+ examples/passing/Console.purs+ examples/passing/ConstraintInference.purs+ examples/passing/ConstraintParens.purs+ examples/passing/ConstraintParsingIssue.purs+ examples/passing/ContextSimplification.purs+ examples/passing/DataAndType.purs+ examples/passing/DctorName.purs+ examples/passing/DctorOperatorAlias.purs+ examples/passing/DctorOperatorAlias/List.purs+ examples/passing/DeepArrayBinder.purs+ examples/passing/DeepCase.purs+ examples/passing/DeriveNewtype.purs+ examples/passing/DeriveWithNestedSynonyms.purs+ examples/passing/Deriving.purs+ examples/passing/DerivingFunctor.purs+ examples/passing/Do.purs+ examples/passing/Dollar.purs+ examples/passing/DuplicateProperties.purs+ examples/passing/Eff.purs+ examples/passing/EmptyDataDecls.purs+ examples/passing/EmptyRow.purs+ examples/passing/EmptyTypeClass.purs+ examples/passing/EntailsKindedType.purs+ examples/passing/EqOrd.purs+ examples/passing/ExplicitImportReExport.purs+ examples/passing/ExplicitImportReExport/Bar.purs+ examples/passing/ExplicitImportReExport/Foo.purs+ examples/passing/ExplicitOperatorSections.purs+ examples/passing/ExportedInstanceDeclarations.purs+ examples/passing/ExportExplicit.purs+ examples/passing/ExportExplicit/M1.purs+ examples/passing/ExportExplicit2.purs+ examples/passing/ExportExplicit2/M1.purs+ examples/passing/ExtendedInfixOperators.purs+ examples/passing/Fib.purs+ examples/passing/FieldConsPuns.purs+ examples/passing/FieldPuns.purs+ examples/passing/FinalTagless.purs+ examples/passing/ForeignKind.purs+ examples/passing/ForeignKind/Lib.purs+ examples/passing/FunctionalDependencies.purs+ examples/passing/Functions.purs+ examples/passing/Functions2.purs+ examples/passing/FunctionScope.purs+ examples/passing/FunWithFunDeps.js+ examples/passing/FunWithFunDeps.purs+ examples/passing/Generalization1.purs+ examples/passing/GenericsRep.purs+ examples/passing/Guards.purs+ examples/passing/HasOwnProperty.purs+ examples/passing/HoistError.purs+ examples/passing/IfThenElseMaybe.purs+ examples/passing/IfWildcard.purs+ examples/passing/ImplicitEmptyImport.purs+ examples/passing/Import.purs+ examples/passing/Import/M1.purs+ examples/passing/Import/M2.purs+ examples/passing/ImportExplicit.purs+ examples/passing/ImportExplicit/M1.purs+ examples/passing/ImportHiding.purs+ examples/passing/ImportQualified.purs+ examples/passing/ImportQualified/M1.purs+ examples/passing/InferRecFunWithConstrainedArgument.purs+ examples/passing/InstanceBeforeClass.purs+ examples/passing/IntAndChar.purs+ examples/passing/iota.purs+ examples/passing/JSReserved.purs+ examples/passing/KindedType.purs+ examples/passing/LargeSumType.purs+ examples/passing/Let.purs+ examples/passing/Let2.purs+ examples/passing/LetInInstance.purs+ examples/passing/LetPattern.purs+ examples/passing/LiberalTypeSynonyms.purs+ examples/passing/Match.purs+ examples/passing/Module.purs+ examples/passing/Module/M1.purs+ examples/passing/Module/M2.purs+ examples/passing/ModuleDeps.purs+ examples/passing/ModuleDeps/M1.purs+ examples/passing/ModuleDeps/M2.purs+ examples/passing/ModuleDeps/M3.purs+ examples/passing/ModuleExport.purs+ examples/passing/ModuleExport/A.purs+ examples/passing/ModuleExportDupes.purs+ examples/passing/ModuleExportDupes/A.purs+ examples/passing/ModuleExportDupes/B.purs+ examples/passing/ModuleExportDupes/C.purs+ examples/passing/ModuleExportExcluded.purs+ examples/passing/ModuleExportExcluded/A.purs+ examples/passing/ModuleExportQualified.purs+ examples/passing/ModuleExportQualified/A.purs+ examples/passing/ModuleExportSelf.purs+ examples/passing/ModuleExportSelf/A.purs+ examples/passing/Monad.purs+ examples/passing/MonadState.purs+ examples/passing/MPTCs.purs+ examples/passing/MultiArgFunctions.purs+ examples/passing/MutRec.purs+ examples/passing/MutRec2.purs+ examples/passing/MutRec3.purs+ examples/passing/NakedConstraint.purs+ examples/passing/NamedPatterns.purs+ examples/passing/NegativeBinder.purs+ examples/passing/NegativeIntInRange.purs+ examples/passing/Nested.purs+ examples/passing/NestedRecordUpdate.purs+ examples/passing/NestedRecordUpdateWildcards.purs+ examples/passing/NestedTypeSynonyms.purs+ examples/passing/NestedWhere.purs+ examples/passing/Newtype.purs+ examples/passing/NewtypeClass.purs+ examples/passing/NewtypeEff.purs+ examples/passing/NewtypeInstance.purs+ examples/passing/NewtypeWithRecordUpdate.purs+ examples/passing/NonConflictingExports.purs+ examples/passing/NonConflictingExports/A.purs+ examples/passing/NonOrphanInstanceFunDepExtra.purs+ examples/passing/NonOrphanInstanceFunDepExtra/Lib.purs+ examples/passing/NonOrphanInstanceMulti.purs+ examples/passing/NonOrphanInstanceMulti/Lib.purs+ examples/passing/NumberLiterals.purs+ examples/passing/ObjectGetter.purs+ examples/passing/Objects.purs+ examples/passing/ObjectSynonym.purs+ examples/passing/ObjectUpdate.purs+ examples/passing/ObjectUpdate2.purs+ examples/passing/ObjectUpdater.purs+ examples/passing/ObjectWildcards.purs+ examples/passing/OneConstructor.purs+ examples/passing/OperatorAlias.purs+ examples/passing/OperatorAliasElsewhere.purs+ examples/passing/OperatorAliasElsewhere/Def.purs+ examples/passing/OperatorAssociativity.purs+ examples/passing/OperatorInlining.purs+ examples/passing/Operators.purs+ examples/passing/Operators/Other.purs+ examples/passing/OperatorSections.purs+ examples/passing/OptimizerBug.purs+ examples/passing/OptionalQualified.purs+ examples/passing/OverlappingInstances.purs+ examples/passing/OverlappingInstances2.purs+ examples/passing/OverlappingInstances3.purs+ examples/passing/ParensInTypedBinder.purs+ examples/passing/PartialFunction.purs+ examples/passing/Patterns.purs+ examples/passing/PendingConflictingImports.purs+ examples/passing/PendingConflictingImports/A.purs+ examples/passing/PendingConflictingImports/B.purs+ examples/passing/PendingConflictingImports2.purs+ examples/passing/PendingConflictingImports2/A.purs+ examples/passing/Person.purs+ examples/passing/PolyLabels.js+ examples/passing/PolyLabels.purs+ examples/passing/PrimedTypeName.purs+ examples/passing/QualifiedNames.purs+ examples/passing/QualifiedNames/Either.purs+ examples/passing/QualifiedQualifiedImports.purs+ examples/passing/Rank2Data.purs+ examples/passing/Rank2Object.purs+ examples/passing/Rank2Types.purs+ examples/passing/Rank2TypeSynonym.purs+ examples/passing/RebindableSyntax.purs+ examples/passing/Recursion.purs+ examples/passing/RedefinedFixity.purs+ examples/passing/RedefinedFixity/M1.purs+ examples/passing/RedefinedFixity/M2.purs+ examples/passing/RedefinedFixity/M3.purs+ examples/passing/ReExportQualified.purs+ examples/passing/ReExportQualified/A.purs+ examples/passing/ReExportQualified/B.purs+ examples/passing/ReExportQualified/C.purs+ examples/passing/ReservedWords.purs+ examples/passing/ResolvableScopeConflict.purs+ examples/passing/ResolvableScopeConflict/A.purs+ examples/passing/ResolvableScopeConflict/B.purs+ examples/passing/ResolvableScopeConflict2.purs+ examples/passing/ResolvableScopeConflict2/A.purs+ examples/passing/ResolvableScopeConflict3.purs+ examples/passing/ResolvableScopeConflict3/A.purs+ examples/passing/RowConstructors.purs+ examples/passing/RowInInstanceHeadDetermined.purs+ examples/passing/RowPolyInstanceContext.purs+ examples/passing/RowsInInstanceContext.purs+ examples/passing/RowUnion.js+ examples/passing/RowUnion.purs+ examples/passing/RuntimeScopeIssue.purs+ examples/passing/s.purs+ examples/passing/ScopedTypeVariables.purs+ examples/passing/Sequence.purs+ examples/passing/SequenceDesugared.purs+ examples/passing/ShadowedModuleName.purs+ examples/passing/ShadowedModuleName/Test.purs+ examples/passing/ShadowedName.purs+ examples/passing/ShadowedRename.purs+ examples/passing/ShadowedTCO.purs+ examples/passing/ShadowedTCOLet.purs+ examples/passing/SignedNumericLiterals.purs+ examples/passing/SolvingAppendSymbol.purs+ examples/passing/SolvingCompareSymbol.purs+ examples/passing/SolvingIsSymbol.purs+ examples/passing/SolvingIsSymbol/Lib.purs+ examples/passing/Stream.purs+ examples/passing/StringEdgeCases.purs+ examples/passing/StringEdgeCases/Records.purs+ examples/passing/StringEdgeCases/Symbols.purs+ examples/passing/StringEscapes.purs+ examples/passing/Superclasses1.purs+ examples/passing/Superclasses3.purs+ examples/passing/TailCall.purs+ examples/passing/TCO.purs+ examples/passing/TCOCase.purs+ examples/passing/Tick.purs+ examples/passing/TopLevelCase.purs+ examples/passing/TransitiveImport.purs+ examples/passing/TransitiveImport/Middle.purs+ examples/passing/TransitiveImport/Test.purs+ examples/passing/TypeClasses.purs+ examples/passing/TypeClassesInOrder.purs+ examples/passing/TypeClassesWithOverlappingTypeVariables.purs+ examples/passing/TypeClassMemberOrderChange.purs+ examples/passing/TypedBinders.purs+ examples/passing/TypeDecl.purs+ examples/passing/TypedWhere.purs+ examples/passing/TypeOperators.purs+ examples/passing/TypeOperators/A.purs+ examples/passing/TypeSynonymInData.purs+ examples/passing/TypeSynonyms.purs+ examples/passing/TypeWildcards.purs+ examples/passing/TypeWildcardsRecordExtension.purs+ examples/passing/TypeWithoutParens.purs+ examples/passing/TypeWithoutParens/Lib.purs+ examples/passing/UnderscoreIdent.purs+ examples/passing/UnicodeIdentifier.purs+ examples/passing/UnicodeOperators.purs+ examples/passing/UnicodeType.purs+ examples/passing/UnifyInTypeInstanceLookup.purs+ examples/passing/Unit.purs+ examples/passing/UnknownInTypeClassLookup.purs+ examples/passing/UntupledConstraints.purs+ examples/passing/UsableTypeClassMethods.purs+ examples/passing/UTF8Sourcefile.purs+ examples/passing/Where.purs+ examples/passing/WildcardInInstance.purs+ examples/passing/WildcardType.purs+ examples/psci/BasicEval.purs+ examples/psci/Multiline.purs+ examples/warning/2140.purs+ examples/warning/2383.purs+ examples/warning/2411.purs+ examples/warning/2542.purs+ examples/warning/CustomWarning.purs+ examples/warning/DuplicateExportRef.purs+ examples/warning/DuplicateImport.purs+ examples/warning/DuplicateImportRef.purs+ examples/warning/DuplicateSelectiveImport.purs+ examples/warning/HidingImport.purs+ examples/warning/ImplicitImport.purs+ examples/warning/ImplicitQualifiedImport.purs+ examples/warning/MissingTypeDeclaration.purs+ examples/warning/OverlappingInstances.purs+ examples/warning/OverlappingPattern.purs+ examples/warning/ScopeShadowing.purs+ examples/warning/ShadowedBinderPatternGuard.purs+ examples/warning/ShadowedNameParens.purs+ examples/warning/ShadowedTypeVar.purs+ examples/warning/UnnecessaryFFIModule.js+ examples/warning/UnnecessaryFFIModule.purs+ examples/warning/UnusedDctorExplicitImport.purs+ examples/warning/UnusedDctorImportAll.purs+ examples/warning/UnusedDctorImportExplicit.purs+ examples/warning/UnusedExplicitImport.purs+ examples/warning/UnusedExplicitImportTypeOp.purs+ examples/warning/UnusedExplicitImportTypeOp/Lib.purs+ examples/warning/UnusedExplicitImportValOp.purs+ examples/warning/UnusedFFIImplementations.js+ examples/warning/UnusedFFIImplementations.purs+ examples/warning/UnusedImport.purs+ examples/warning/UnusedTypeVar.purs+ examples/warning/WildcardInferredType.purs+ INSTALL.md+ README.md+ stack.yaml+ tests/support/bower.json+ tests/support/package.json+ tests/support/prelude-resolutions.json+ tests/support/psci/Sample.purs+ tests/support/pscide/src/ImportsSpec.purs+ tests/support/pscide/src/ImportsSpec1.purs+ tests/support/pscide/src/MatcherSpec.purs+ tests/support/pscide/src/RebuildSpecDep.purs+ tests/support/pscide/src/RebuildSpecSingleModule.fail+ tests/support/pscide/src/RebuildSpecSingleModule.purs+ tests/support/pscide/src/RebuildSpecWithDeps.purs+ tests/support/pscide/src/RebuildSpecWithForeign.js+ tests/support/pscide/src/RebuildSpecWithForeign.purs+ tests/support/pscide/src/RebuildSpecWithHiddenIdent.purs+ tests/support/pscide/src/RebuildSpecWithMissingForeign.fail+ tests/support/setup-win.cmd++source-repository head+ type: git+ location: https://github.com/purescript/purescript.git++flag release+ description: Mark this build as a release build: prevents inclusion of extra info e.g. commit SHA in --version output)++ manual: False+ default: False++library+ build-depends:+ aeson >=0.8 && <1.1+ , aeson-better-errors >=0.8+ , ansi-terminal >=0.6.2 && <0.7+ , base >=4.8 && <5+ , base-compat >=0.6.0+ , blaze-html >=0.8.1 && <0.9+ , bower-json >=1.0.0.1 && <1.1+ , boxes >=0.1.4 && <0.2.0+ , bytestring+ , cheapskate >=0.1 && <0.2+ , clock+ , containers+ , data-ordlist >=0.4.7.0+ , deepseq+ , directory >=1.2+ , dlist+ , edit-distance+ , filepath+ , fsnotify >=0.2.1+ , Glob >=0.7 && <0.8+ , haskeline >=0.7.0.0+ , http-client >=0.4.30 && <0.6.0+ , http-types+ , language-javascript >=0.6.0.9 && <0.7+ , lens ==4.*+ , lifted-base >=0.2.3 && <0.2.4+ , monad-control >=1.0.0.0 && <1.1+ , monad-logger >=0.3 && <0.4+ , mtl >=2.1.0 && <2.3.0+ , parallel >=3.2 && <3.3+ , parsec >=3.1.10+ , pattern-arrows >=0.0.2 && <0.1+ , pipes >=4.0.0 && <4.4.0+ , pipes-http+ , process >=1.2.0 && <1.5+ , protolude >=0.1.6+ , regex-tdfa+ , safe >=0.3.9 && <0.4+ , scientific >=0.3.4.9 && <0.4+ , semigroups >=0.16.2 && <0.19+ , sourcemap >=0.1.6+ , spdx ==0.2.*+ , split+ , stm >=0.2.4.0+ , syb+ , text+ , time+ , transformers >=0.3.0 && <0.6+ , transformers-base >=0.4.0 && <0.5+ , transformers-compat >=0.3.0+ , unordered-containers+ , utf8-string >=1 && <2+ , vector+ exposed-modules:+ Control.Monad.Logger+ Control.Monad.Supply+ Control.Monad.Supply.Class+ Language.PureScript+ Language.PureScript.AST+ Language.PureScript.AST.Binders+ Language.PureScript.AST.Declarations+ Language.PureScript.AST.Exported+ Language.PureScript.AST.Literals+ Language.PureScript.AST.Operators+ Language.PureScript.AST.SourcePos+ Language.PureScript.AST.Traversals+ Language.PureScript.Bundle+ Language.PureScript.CodeGen+ Language.PureScript.CodeGen.JS+ Language.PureScript.CodeGen.JS.Common+ Language.PureScript.CodeGen.JS.Printer+ Language.PureScript.Comments+ Language.PureScript.Constants+ Language.PureScript.CoreFn+ Language.PureScript.CoreFn.Ann+ Language.PureScript.CoreFn.Binders+ Language.PureScript.CoreFn.Desugar+ Language.PureScript.CoreFn.Expr+ Language.PureScript.CoreFn.Meta+ Language.PureScript.CoreFn.Module+ Language.PureScript.CoreFn.ToJSON+ Language.PureScript.CoreFn.Traversals+ Language.PureScript.CoreImp+ Language.PureScript.CoreImp.AST+ Language.PureScript.CoreImp.Optimizer+ Language.PureScript.CoreImp.Optimizer.Blocks+ Language.PureScript.CoreImp.Optimizer.Common+ Language.PureScript.CoreImp.Optimizer.Inliner+ Language.PureScript.CoreImp.Optimizer.MagicDo+ Language.PureScript.CoreImp.Optimizer.TCO+ Language.PureScript.CoreImp.Optimizer.Unused+ Language.PureScript.Crash+ Language.PureScript.Docs+ Language.PureScript.Docs.AsHtml+ Language.PureScript.Docs.AsMarkdown+ Language.PureScript.Docs.Convert+ Language.PureScript.Docs.Convert.ReExports+ Language.PureScript.Docs.Convert.Single+ Language.PureScript.Docs.ParseInPackage+ Language.PureScript.Docs.Prim+ Language.PureScript.Docs.Render+ Language.PureScript.Docs.RenderedCode+ Language.PureScript.Docs.RenderedCode.RenderKind+ Language.PureScript.Docs.RenderedCode.RenderType+ Language.PureScript.Docs.RenderedCode.Types+ Language.PureScript.Docs.Types+ Language.PureScript.Docs.Utils.MonoidExtras+ Language.PureScript.Environment+ Language.PureScript.Errors+ Language.PureScript.Errors.JSON+ Language.PureScript.Externs+ Language.PureScript.Ide+ Language.PureScript.Ide.CaseSplit+ Language.PureScript.Ide.Command+ Language.PureScript.Ide.Completion+ Language.PureScript.Ide.Error+ Language.PureScript.Ide.Externs+ Language.PureScript.Ide.Filter+ Language.PureScript.Ide.Imports+ Language.PureScript.Ide.Logging+ Language.PureScript.Ide.Matcher+ Language.PureScript.Ide.Pursuit+ Language.PureScript.Ide.Rebuild+ Language.PureScript.Ide.Reexports+ Language.PureScript.Ide.SourceFile+ Language.PureScript.Ide.State+ Language.PureScript.Ide.Types+ Language.PureScript.Ide.Util+ Language.PureScript.Ide.Watcher+ Language.PureScript.Interactive+ Language.PureScript.Interactive.Completion+ Language.PureScript.Interactive.Directive+ Language.PureScript.Interactive.IO+ Language.PureScript.Interactive.Message+ Language.PureScript.Interactive.Module+ Language.PureScript.Interactive.Parser+ Language.PureScript.Interactive.Printer+ Language.PureScript.Interactive.Types+ Language.PureScript.Kinds+ Language.PureScript.Label+ Language.PureScript.Linter+ Language.PureScript.Linter.Exhaustive+ Language.PureScript.Linter.Imports+ Language.PureScript.Make+ Language.PureScript.ModuleDependencies+ Language.PureScript.Names+ Language.PureScript.Options+ Language.PureScript.Parser+ Language.PureScript.Parser.Common+ Language.PureScript.Parser.Declarations+ Language.PureScript.Parser.Kinds+ Language.PureScript.Parser.Lexer+ Language.PureScript.Parser.State+ Language.PureScript.Parser.Types+ Language.PureScript.Pretty+ Language.PureScript.Pretty.Common+ Language.PureScript.Pretty.Kinds+ Language.PureScript.Pretty.Types+ Language.PureScript.Pretty.Values+ Language.PureScript.PSString+ Language.PureScript.Publish+ Language.PureScript.Publish.BoxesHelpers+ Language.PureScript.Publish.ErrorsWarnings+ Language.PureScript.Publish.Utils+ Language.PureScript.Renamer+ Language.PureScript.Sugar+ Language.PureScript.Sugar.BindingGroups+ Language.PureScript.Sugar.CaseDeclarations+ Language.PureScript.Sugar.DoNotation+ Language.PureScript.Sugar.LetPattern+ Language.PureScript.Sugar.Names+ Language.PureScript.Sugar.Names.Common+ Language.PureScript.Sugar.Names.Env+ Language.PureScript.Sugar.Names.Exports+ Language.PureScript.Sugar.Names.Imports+ Language.PureScript.Sugar.ObjectWildcards+ Language.PureScript.Sugar.Operators+ Language.PureScript.Sugar.Operators.Binders+ Language.PureScript.Sugar.Operators.Common+ Language.PureScript.Sugar.Operators.Expr+ Language.PureScript.Sugar.Operators.Types+ Language.PureScript.Sugar.TypeClasses+ Language.PureScript.Sugar.TypeClasses.Deriving+ Language.PureScript.Sugar.TypeDeclarations+ Language.PureScript.Traversals+ Language.PureScript.TypeChecker+ Language.PureScript.TypeChecker.Entailment+ Language.PureScript.TypeChecker.Kinds+ Language.PureScript.TypeChecker.Monad+ Language.PureScript.TypeChecker.Skolems+ Language.PureScript.TypeChecker.Subsumption+ Language.PureScript.TypeChecker.Synonyms+ Language.PureScript.TypeChecker.Types+ Language.PureScript.TypeChecker.TypeSearch+ Language.PureScript.TypeChecker.Unify+ Language.PureScript.TypeClassDictionaries+ Language.PureScript.Types+ System.IO.UTF8+ other-modules:+ Paths_purescript+ hs-source-dirs:+ src+ default-extensions: ConstraintKinds DataKinds DeriveFunctor EmptyDataDecls FlexibleContexts KindSignatures LambdaCase MultiParamTypeClasses NoImplicitPrelude PatternGuards PatternSynonyms RankNTypes RecordWildCards OverloadedStrings ScopedTypeVariables TupleSections ViewPatterns+ default-language: Haskell2010+ ghc-options: -Wall -O2++executable purs+ build-depends:+ aeson >=0.8 && <1.1+ , aeson-better-errors >=0.8+ , ansi-terminal >=0.6.2 && <0.7+ , base >=4.8 && <5+ , base-compat >=0.6.0+ , blaze-html >=0.8.1 && <0.9+ , bower-json >=1.0.0.1 && <1.1+ , boxes >=0.1.4 && <0.2.0+ , bytestring+ , cheapskate >=0.1 && <0.2+ , clock+ , containers+ , data-ordlist >=0.4.7.0+ , deepseq+ , directory >=1.2+ , dlist+ , edit-distance+ , filepath+ , fsnotify >=0.2.1+ , Glob >=0.7 && <0.8+ , haskeline >=0.7.0.0+ , http-client >=0.4.30 && <0.6.0+ , http-types+ , language-javascript >=0.6.0.9 && <0.7+ , lens ==4.*+ , lifted-base >=0.2.3 && <0.2.4+ , monad-control >=1.0.0.0 && <1.1+ , monad-logger >=0.3 && <0.4+ , mtl >=2.1.0 && <2.3.0+ , parallel >=3.2 && <3.3+ , parsec >=3.1.10+ , pattern-arrows >=0.0.2 && <0.1+ , pipes >=4.0.0 && <4.4.0+ , pipes-http+ , process >=1.2.0 && <1.5+ , protolude >=0.1.6+ , regex-tdfa+ , safe >=0.3.9 && <0.4+ , scientific >=0.3.4.9 && <0.4+ , semigroups >=0.16.2 && <0.19+ , sourcemap >=0.1.6+ , spdx ==0.2.*+ , split+ , stm >=0.2.4.0+ , syb+ , text+ , time+ , transformers >=0.3.0 && <0.6+ , transformers-base >=0.4.0 && <0.5+ , transformers-compat >=0.3.0+ , unordered-containers+ , utf8-string >=1 && <2+ , vector+ , ansi-wl-pprint+ , file-embed+ , network+ , optparse-applicative >=0.13.0+ , purescript+ , wai ==3.*+ , wai-websockets ==3.*+ , warp ==3.*+ , websockets >=0.9 && <0.11+ if flag(release)+ cpp-options: -DRELEASE+ else+ build-depends:+ gitrev >=1.2.0 && <1.3+ main-is: Main.hs+ hs-source-dirs:+ app+ other-modules:+ Command.Bundle+ Command.Compile+ Command.Docs+ Command.Docs.Ctags+ Command.Docs.Etags+ Command.Docs.Html+ Command.Docs.Tags+ Command.Hierarchy+ Command.Ide+ Command.Publish+ Command.REPL+ Version+ default-language: Haskell2010+ ghc-options: -Wall -O2 -fno-warn-unused-do-bind -threaded -rtsopts -with-rtsopts=-N++test-suite tests+ build-depends:+ aeson >=0.8 && <1.1+ , aeson-better-errors >=0.8+ , ansi-terminal >=0.6.2 && <0.7+ , base >=4.8 && <5+ , base-compat >=0.6.0+ , blaze-html >=0.8.1 && <0.9+ , bower-json >=1.0.0.1 && <1.1+ , boxes >=0.1.4 && <0.2.0+ , bytestring+ , cheapskate >=0.1 && <0.2+ , clock+ , containers+ , data-ordlist >=0.4.7.0+ , deepseq+ , directory >=1.2+ , dlist+ , edit-distance+ , filepath+ , fsnotify >=0.2.1+ , Glob >=0.7 && <0.8+ , haskeline >=0.7.0.0+ , http-client >=0.4.30 && <0.6.0+ , http-types+ , language-javascript >=0.6.0.9 && <0.7+ , lens ==4.*+ , lifted-base >=0.2.3 && <0.2.4+ , monad-control >=1.0.0.0 && <1.1+ , monad-logger >=0.3 && <0.4+ , mtl >=2.1.0 && <2.3.0+ , parallel >=3.2 && <3.3+ , parsec >=3.1.10+ , pattern-arrows >=0.0.2 && <0.1+ , pipes >=4.0.0 && <4.4.0+ , pipes-http+ , process >=1.2.0 && <1.5+ , protolude >=0.1.6+ , regex-tdfa+ , safe >=0.3.9 && <0.4+ , scientific >=0.3.4.9 && <0.4+ , semigroups >=0.16.2 && <0.19+ , sourcemap >=0.1.6+ , spdx ==0.2.*+ , split+ , stm >=0.2.4.0+ , syb+ , text+ , time+ , transformers >=0.3.0 && <0.6+ , transformers-base >=0.4.0 && <0.5+ , transformers-compat >=0.3.0+ , unordered-containers+ , utf8-string >=1 && <2+ , vector+ , purescript+ , hspec+ , hspec-discover+ , HUnit+ , silently+ ghc-options: -Wall+ type: exitcode-stdio-1.0+ main-is: Main.hs+ other-modules:+ Language.PureScript.Ide.FilterSpec+ Language.PureScript.Ide.ImportsSpec+ Language.PureScript.Ide.MatcherSpec+ Language.PureScript.Ide.RebuildSpec+ Language.PureScript.Ide.ReexportsSpec+ Language.PureScript.Ide.SourceFileSpec+ Language.PureScript.Ide.StateSpec+ Language.PureScript.Ide.Test+ PscIdeSpec+ TestCompiler+ TestDocs+ TestPrimDocs+ TestPsci+ TestPsci.CommandTest+ TestPsci.CompletionTest+ TestPsci.EvalTest+ TestPsci.TestEnv+ TestPscIde+ TestPscPublish+ TestUtils+ default-language: Haskell2010+ hs-source-dirs:+ tests
src/Language/PureScript/Constants.hs view
@@ -384,6 +384,9 @@ pattern Union :: Qualified (ProperName 'ClassName) pattern Union = Qualified (Just Prim) (ProperName "Union") +pattern RowCons :: Qualified (ProperName 'ClassName)+pattern RowCons = Qualified (Just Prim) (ProperName "RowCons")+ typ :: forall a. (IsString a) => a typ = "Type"
src/Language/PureScript/Docs/Prim.hs view
@@ -26,6 +26,7 @@ , fail , warn , union+ , rowCons , typeConcat , typeString , kindType@@ -235,6 +236,13 @@ , "(left-biased, including duplicates)." , "" , "The third type argument represents the union of the first two."+ ]++rowCons :: Declaration+rowCons = primClass "RowCons" $ T.unlines+ [ "The RowCons type class is a 4-way relation which asserts that one row of"+ , "types can be obtained from another by inserting a new label/type pair on"+ , "the left." ] typeConcat :: Declaration
src/Language/PureScript/Environment.hs view
@@ -327,6 +327,7 @@ , (primName "Boolean", (kindType, ExternData)) , (primName "Partial", (kindType, ExternData)) , (primName "Union", (FunKind (Row kindType) (FunKind (Row kindType) (FunKind (Row kindType) kindType)), ExternData))+ , (primName "RowCons", (FunKind kindSymbol (FunKind kindType (FunKind (Row kindType) (FunKind (Row kindType) kindType))), ExternData)) , (primName "Fail", (FunKind kindSymbol kindType, ExternData)) , (primName "Warn", (FunKind kindSymbol kindType, ExternData)) , (primName "TypeString", (FunKind kindType kindSymbol, ExternData))@@ -354,6 +355,16 @@ [ FunctionalDependency [0, 1] [2] , FunctionalDependency [1, 2] [0] , FunctionalDependency [2, 0] [1]+ ]))+ -- class RowCons (l :: Symbol) (a :: Type) (i :: # Type) (o :: # Type) | l i a -> o, l o -> a i+ , (primName "RowCons", (makeTypeClassData+ [ ("l", Just kindSymbol)+ , ("a", Just (Row kindType))+ , ("i", Just kindType)+ , ("o", Just kindType)+ ] [] []+ [ FunctionalDependency [0, 1, 2] [3]+ , FunctionalDependency [0, 3] [1, 2] ])) ]
src/Language/PureScript/Ide/Externs.hs view
@@ -17,16 +17,14 @@ module Language.PureScript.Ide.Externs ( readExternFile , convertExterns- , annotateModule ) where -import Protolude+import Protolude hiding (to, from, (&)) -import Control.Lens ((^.))+import Control.Lens import "monad-logger" Control.Monad.Logger import Data.Aeson (decodeStrict) import qualified Data.ByteString as BS-import qualified Data.Map as Map import Data.Version (showVersion) import Language.PureScript.Ide.Error (IdeError (..)) import Language.PureScript.Ide.Types@@ -60,45 +58,76 @@ where decls = map (IdeDeclarationAnn emptyAnn)- (cleanDeclarations ++ operatorDecls ++ tyOperatorDecls)+ (resolvedDeclarations ++ operatorDecls ++ tyOperatorDecls) exportDecls = mapMaybe (convertExport . unwrapPositionedRef) (P.efExports ef) operatorDecls = convertOperator <$> P.efFixities ef tyOperatorDecls = convertTypeOperator <$> P.efTypeFixities ef- declarations = mapMaybe convertDecl (P.efDeclarations ef)+ (toResolve, declarations) =+ second catMaybes (partitionEithers (map convertDecl (P.efDeclarations ef))) - typeClassFilter = foldMap removeTypeDeclarationsForClass (filter isTypeClassDeclaration declarations)- cleanDeclarations = ordNub (appEndo typeClassFilter declarations)+ -- It's important that we resolve synonyms first, because that resolving+ -- process removes the corresponding type declarations. This way we don't+ -- leave any stray type declarations for type classes around since they have+ -- already been cleaned up in the type synonym pass.+ resolver = resolveTypeClasses toResolve <> resolveSynonyms toResolve+ resolvedDeclarations = appEndo resolver declarations -removeTypeDeclarationsForClass :: IdeDeclaration -> Endo [IdeDeclaration]-removeTypeDeclarationsForClass (IdeDeclTypeClass n) = Endo (filter notDuplicate)- where notDuplicate (IdeDeclType t) =- n ^. ideTCName . properNameT /= t ^. ideTypeName . properNameT- notDuplicate (IdeDeclTypeSynonym s) =- n ^. ideTCName . properNameT /= s ^. ideSynonymName . properNameT- notDuplicate _ = True-removeTypeDeclarationsForClass _ = mempty+resolveSynonyms :: [ToResolve] -> Endo [IdeDeclaration]+resolveSynonyms = foldMap resolveSynonym+ where+ resolveSynonym tr = case tr of+ TypeClassToResolve _ -> mempty+ SynonymToResolve tn ty -> Endo $ \decls ->+ case findType tn decls of+ Nothing -> decls+ Just tyDecl ->+ IdeDeclTypeSynonym (IdeTypeSynonym tn ty (tyDecl^.ideTypeKind))+ : filter (not . anyOf (_IdeDeclType.ideTypeName) (== tn)) decls -isTypeClassDeclaration :: IdeDeclaration -> Bool-isTypeClassDeclaration IdeDeclTypeClass{} = True-isTypeClassDeclaration _ = False+resolveTypeClasses :: [ToResolve] -> Endo [IdeDeclaration]+resolveTypeClasses = foldMap resolveTypeClass+ where+ resolveTypeClass tr = case tr of+ SynonymToResolve _ _ -> mempty+ TypeClassToResolve tcn -> Endo $ \decls ->+ case findSynonym (P.coerceProperName tcn) decls of+ Nothing -> decls+ Just tySyn -> IdeDeclTypeClass+ (IdeTypeClass tcn (tySyn^.ideSynonymKind) [])+ : filter (not . anyOf (_IdeDeclTypeSynonym.ideSynonymName) (== P.coerceProperName tcn)) decls +findType :: P.ProperName 'P.TypeName -> [IdeDeclaration] -> Maybe IdeType+findSynonym :: P.ProperName 'P.TypeName -> [IdeDeclaration] -> Maybe IdeTypeSynonym+(findType, findSynonym) = ( findDecl _IdeDeclType ideTypeName+ , findDecl _IdeDeclTypeSynonym ideSynonymName+ )+ where+ findDecl p l tn decls = decls+ & mapMaybe (preview p)+ & find ((==) tn . view l)++-- The Externs format splits information about synonyms across EDType and+-- EDTypeSynonym declarations. For type classes there are three declarations+-- involved. We collect these and resolve them at the end of the conversion process.+data ToResolve+ = TypeClassToResolve (P.ProperName 'P.ClassName)+ | SynonymToResolve (P.ProperName 'P.TypeName) P.Type+ convertExport :: P.DeclarationRef -> Maybe (P.ModuleName, P.DeclarationRef) convertExport (P.ReExportRef m r) = Just (m, r) convertExport _ = Nothing -convertDecl :: P.ExternsDeclaration -> Maybe IdeDeclaration-convertDecl P.EDType{..} = Just $ IdeDeclType $+convertDecl :: P.ExternsDeclaration -> Either ToResolve (Maybe IdeDeclaration)+convertDecl P.EDType{..} = Right $ Just $ IdeDeclType $ IdeType edTypeName edTypeKind-convertDecl P.EDTypeSynonym{..} = Just $ IdeDeclTypeSynonym- (IdeTypeSynonym edTypeSynonymName edTypeSynonymType)-convertDecl P.EDDataConstructor{..} = Just $ IdeDeclDataConstructor $+convertDecl P.EDTypeSynonym{..} = Left (SynonymToResolve edTypeSynonymName edTypeSynonymType)+convertDecl P.EDDataConstructor{..} = Right $ Just $ IdeDeclDataConstructor $ IdeDataConstructor edDataCtorName edDataCtorTypeCtor edDataCtorType-convertDecl P.EDValue{..} = Just $ IdeDeclValue $+convertDecl P.EDValue{..} = Right $ Just $ IdeDeclValue $ IdeValue edValueName edValueType-convertDecl P.EDClass{..} = Just $ IdeDeclTypeClass $- IdeTypeClass edClassName []-convertDecl P.EDKind{..} = Just (IdeDeclKind edKindName)-convertDecl P.EDInstance{} = Nothing+convertDecl P.EDClass{..} = Left (TypeClassToResolve edClassName)+convertDecl P.EDKind{..} = Right (Just (IdeDeclKind edKindName))+convertDecl P.EDInstance{} = Right Nothing convertOperator :: P.ExternsFixity -> IdeDeclaration convertOperator P.ExternsFixity{..} =@@ -117,36 +146,3 @@ efTypePrecedence efTypeAssociativity Nothing--annotateModule- :: (DefinitionSites P.SourceSpan, TypeAnnotations)- -> [IdeDeclarationAnn]- -> [IdeDeclarationAnn]-annotateModule (defs, types) decls =- map convertDeclaration decls- where- convertDeclaration :: IdeDeclarationAnn -> IdeDeclarationAnn- convertDeclaration (IdeDeclarationAnn ann d) = case d of- IdeDeclValue v ->- annotateFunction (v ^. ideValueIdent) (IdeDeclValue v)- IdeDeclType t ->- annotateType (t ^. ideTypeName . properNameT) (IdeDeclType t)- IdeDeclTypeSynonym s ->- annotateType (s ^. ideSynonymName . properNameT) (IdeDeclTypeSynonym s)- IdeDeclDataConstructor dtor ->- annotateValue (dtor ^. ideDtorName . properNameT) (IdeDeclDataConstructor dtor)- IdeDeclTypeClass tc ->- annotateType (tc ^. ideTCName . properNameT) (IdeDeclTypeClass tc)- IdeDeclValueOperator op ->- annotateValue (op ^. ideValueOpName . opNameT) (IdeDeclValueOperator op)- IdeDeclTypeOperator op ->- annotateType (op ^. ideTypeOpName . opNameT) (IdeDeclTypeOperator op)- IdeDeclKind i ->- annotateKind (i ^. properNameT) (IdeDeclKind i)- where- annotateFunction x = IdeDeclarationAnn (ann { _annLocation = Map.lookup (IdeNSValue (P.runIdent x)) defs- , _annTypeAnnotation = Map.lookup x types- })- annotateValue x = IdeDeclarationAnn (ann {_annLocation = Map.lookup (IdeNSValue x) defs})- annotateType x = IdeDeclarationAnn (ann {_annLocation = Map.lookup (IdeNSType x) defs})- annotateKind x = IdeDeclarationAnn (ann {_annLocation = Map.lookup (IdeNSKind x) defs})
src/Language/PureScript/Ide/State.hs view
@@ -139,7 +139,7 @@ ast = fromMaybe (Map.empty, Map.empty) (Map.lookup moduleName asts) cachedModule =- annotateModule ast (fst (convertExterns ef))+ resolveLocationsForModule ast (fst (convertExterns ef)) tmp = Map.insert moduleName cachedModule declarations resolved =@@ -222,7 +222,40 @@ -> ModuleMap [IdeDeclarationAnn] resolveLocations asts = Map.mapWithKey (\mn decls ->- maybe decls (flip annotateModule decls) (Map.lookup mn asts))+ maybe decls (flip resolveLocationsForModule decls) (Map.lookup mn asts))++resolveLocationsForModule+ :: (DefinitionSites P.SourceSpan, TypeAnnotations)+ -> [IdeDeclarationAnn]+ -> [IdeDeclarationAnn]+resolveLocationsForModule (defs, types) decls =+ map convertDeclaration decls+ where+ convertDeclaration :: IdeDeclarationAnn -> IdeDeclarationAnn+ convertDeclaration (IdeDeclarationAnn ann d) = case d of+ IdeDeclValue v ->+ annotateFunction (v ^. ideValueIdent) (IdeDeclValue v)+ IdeDeclType t ->+ annotateType (t ^. ideTypeName . properNameT) (IdeDeclType t)+ IdeDeclTypeSynonym s ->+ annotateType (s ^. ideSynonymName . properNameT) (IdeDeclTypeSynonym s)+ IdeDeclDataConstructor dtor ->+ annotateValue (dtor ^. ideDtorName . properNameT) (IdeDeclDataConstructor dtor)+ IdeDeclTypeClass tc ->+ annotateType (tc ^. ideTCName . properNameT) (IdeDeclTypeClass tc)+ IdeDeclValueOperator operator ->+ annotateValue (operator ^. ideValueOpName . opNameT) (IdeDeclValueOperator operator)+ IdeDeclTypeOperator operator ->+ annotateType (operator ^. ideTypeOpName . opNameT) (IdeDeclTypeOperator operator)+ IdeDeclKind i ->+ annotateKind (i ^. properNameT) (IdeDeclKind i)+ where+ annotateFunction x = IdeDeclarationAnn (ann { _annLocation = Map.lookup (IdeNSValue (P.runIdent x)) defs+ , _annTypeAnnotation = Map.lookup x types+ })+ annotateValue x = IdeDeclarationAnn (ann {_annLocation = Map.lookup (IdeNSValue x) defs})+ annotateType x = IdeDeclarationAnn (ann {_annLocation = Map.lookup (IdeNSType x) defs})+ annotateKind x = IdeDeclarationAnn (ann {_annLocation = Map.lookup (IdeNSKind x) defs}) resolveInstances :: ModuleMap P.ExternsFile
src/Language/PureScript/Ide/Types.hs view
@@ -53,6 +53,7 @@ data IdeTypeSynonym = IdeTypeSynonym { _ideSynonymName :: P.ProperName 'P.TypeName , _ideSynonymType :: P.Type+ , _ideSynonymKind :: P.Kind } deriving (Show, Eq, Ord) data IdeDataConstructor = IdeDataConstructor@@ -63,6 +64,7 @@ data IdeTypeClass = IdeTypeClass { _ideTCName :: P.ProperName 'P.ClassName+ , _ideTCKind :: P.Kind , _ideTCInstances :: [IdeInstance] } deriving (Show, Eq, Ord)
src/Language/PureScript/Ide/Util.hs view
@@ -74,7 +74,7 @@ IdeDeclType t -> (t ^. ideTypeName . properNameT, t ^. ideTypeKind & P.prettyPrintKind) IdeDeclTypeSynonym s -> (s ^. ideSynonymName . properNameT, s ^. ideSynonymType & prettyPrintTypeSingleLine) IdeDeclDataConstructor d -> (d ^. ideDtorName . properNameT, d ^. ideDtorType & prettyPrintTypeSingleLine)- IdeDeclTypeClass d -> (d ^. ideTCName . properNameT, "type class")+ IdeDeclTypeClass d -> (d ^. ideTCName . properNameT, d ^. ideTCKind & P.prettyPrintKind) IdeDeclValueOperator (IdeValueOperator op ref precedence associativity typeP) -> (P.runOpName op, maybe (showFixity precedence associativity (valueOperatorAliasT ref) op) prettyPrintTypeSingleLine typeP) IdeDeclTypeOperator (IdeTypeOperator op ref precedence associativity kind) ->
src/Language/PureScript/Interactive/IO.hs view
@@ -4,7 +4,9 @@ import Control.Monad (msum) import Control.Monad.Trans.Maybe (MaybeT(..), runMaybeT)-import System.Directory (createDirectoryIfMissing, getHomeDirectory, findExecutable)+import System.Directory (XdgDirectory (..), createDirectoryIfMissing,+ getAppUserDataDirectory, getXdgDirectory,+ findExecutable, doesFileExist) import System.FilePath (takeDirectory, (</>)) mkdirp :: FilePath -> IO ()@@ -28,7 +30,12 @@ -- getHistoryFilename :: IO FilePath getHistoryFilename = do- home <- getHomeDirectory- let filename = home </> ".purescript" </> "psci_history"- mkdirp filename- return filename+ appuserdata <- getAppUserDataDirectory "purescript"+ olddirbool <- doesFileExist (appuserdata </> "psci_history")+ if olddirbool+ then return (appuserdata </> "psci_history")+ else do+ datadir <- getXdgDirectory XdgData "purescript"+ let filename = datadir </> "psci_history"+ mkdirp filename+ return filename
src/Language/PureScript/Make.hs view
@@ -144,12 +144,19 @@ ((Module ss coms _ elaborated exps, env'), nextVar) <- runSupplyT 0 $ do [desugared] <- desugar externs [withPrim] runCheck' (emptyCheckState env) $ typeCheckModule desugared- regrouped <- createBindingGroups moduleName . collapseBindingGroups $ elaborated++ -- desugar case declarations *after* type- and exhaustiveness checking+ -- since pattern guards introduces cases which the exhaustiveness checker+ -- reports as not-exhaustive.+ (deguarded, nextVar') <- runSupplyT nextVar $ do+ desugarCaseGuards elaborated++ regrouped <- createBindingGroups moduleName . collapseBindingGroups $ deguarded let mod' = Module ss coms moduleName regrouped exps corefn = CF.moduleToCoreFn env' mod' [renamed] = renameInModules [corefn] exts = moduleToExternsFile mod' env'- evalSupplyT nextVar . codegen renamed env' . encode $ exts+ evalSupplyT nextVar' . codegen renamed env' . encode $ exts return exts -- | Compiles in "make" mode, compiling each module separately to a @.js@ file and an @externs.json@ file.
src/Language/PureScript/Pretty/Values.hs view
@@ -141,16 +141,34 @@ prettyPrintResult :: [GuardedExpr] -> Box prettyPrintResult [GuardedExpr [] v] = text " -> " <> prettyPrintValue (d - 1) v prettyPrintResult gs =- vcat left (map prettyPrintGuardedValue gs)+ vcat left (map (prettyPrintGuardedValueSep (text " | ")) gs) - prettyPrintGuardedValue :: GuardedExpr -> Box- prettyPrintGuardedValue (GuardedExpr [ConditionGuard grd] val) = foldl1 before- [ text " | "- , prettyPrintValue (d - 1) grd- , text " -> "+ prettyPrintGuardedValueSep :: Box -> GuardedExpr -> Box+ prettyPrintGuardedValueSep _ (GuardedExpr [] val) =+ text " -> " <> prettyPrintValue (d - 1) val++ prettyPrintGuardedValueSep sep (GuardedExpr [guard] val) =+ foldl1 before [ sep+ , prettyPrintGuard guard+ , prettyPrintGuardedValueSep sep (GuardedExpr [] val)+ ]++ prettyPrintGuardedValueSep sep (GuardedExpr (guard : guards) val) =+ vcat left [ foldl1 before+ [ sep+ , prettyPrintGuard guard+ ]+ , prettyPrintGuardedValueSep (text " , ") (GuardedExpr guards val)+ ]++ prettyPrintGuard (ConditionGuard cond) =+ prettyPrintValue (d - 1) cond+ prettyPrintGuard (PatternGuard binder val) =+ foldl1 before+ [ text (T.unpack (prettyPrintBinder binder))+ , text " <- " , prettyPrintValue (d - 1) val ]- prettyPrintGuardedValue _ = internalError "There should only be ConditionGuards after desugaring cases" prettyPrintDoNotationElement :: Int -> DoNotationElement -> Box prettyPrintDoNotationElement d _ | d < 0 = ellipsis
src/Language/PureScript/Sugar/CaseDeclarations.hs view
@@ -5,6 +5,7 @@ module Language.PureScript.Sugar.CaseDeclarations ( desugarCases , desugarCasesModule+ , desugarCaseGuards ) where import Prelude.Compat@@ -37,14 +38,23 @@ <$> (desugarCases <=< desugarAbs <=< validateCases $ ds) <*> pure exps +desugarCaseGuards+ :: forall m. (MonadSupply m, MonadError MultipleErrors m)+ => [Declaration]+ -> m [Declaration]+desugarCaseGuards declarations = parU declarations f+ where+ (f, _, _) = everywhereOnValuesM return desugarGuardedExprs return+ -- | -- Desugar case with pattern guards and pattern clauses to a -- series of nested case expressions. ---desugarCase :: forall m. (MonadSupply m)- => Expr- -> m Expr-desugarCase (Case scrut alternatives)+desugarGuardedExprs+ :: forall m. (MonadSupply m)+ => Expr+ -> m Expr+desugarGuardedExprs (Case scrut alternatives) | any (not . isTrivialExpr) scrut = do -- in case the scrutinee is non trivial (e.g. not a Var or Literal) -- we may evaluate the scrutinee more than once when a guard occurrs.@@ -55,16 +65,17 @@ , ValueDeclaration scrut_id Private [] [MkUnguarded e] ) )- Let scrut_decls <$> desugarCase (Case scrut' alternatives)+ Let scrut_decls <$> desugarGuardedExprs (Case scrut' alternatives) where isTrivialExpr (Var _) = True isTrivialExpr (Literal _) = True isTrivialExpr (Accessor _ e) = isTrivialExpr e isTrivialExpr (Parens e) = isTrivialExpr e isTrivialExpr (PositionedValue _ _ e) = isTrivialExpr e+ isTrivialExpr (TypedValue _ e _) = isTrivialExpr e isTrivialExpr _ = False -desugarCase (Case scrut alternatives) =+desugarGuardedExprs (Case scrut alternatives) = let -- Alternatives which do not have guards are -- left as-is. Alternatives which@@ -206,8 +217,9 @@ desugarAltOutOfLine alt_binder rem_guarded rem_alts mk_body | Just rem_case <- mkCaseOfRemainingGuardsAndAlts = do - desugared <- desugarCase rem_case- rem_case_id <- freshIdent'+ desugared <- desugarGuardedExprs rem_case+ rem_case_id <- freshIdent'+ unused_binder <- freshIdent' let goto_rem_case :: Expr@@ -216,8 +228,8 @@ alt_fail = [CaseAlternative [NullBinder] [MkUnguarded goto_rem_case]] pure $ Let [- ValueDeclaration rem_case_id Private [NullBinder]- [MkUnguarded desugared]+ ValueDeclaration rem_case_id Private []+ [MkUnguarded (Abs (VarBinder unused_binder) desugared)] ] (mk_body alt_fail) | otherwise@@ -251,8 +263,14 @@ alts' <- desugarAlternatives alternatives return $ optimize (Case scrut alts') -desugarCase v = pure v+desugarGuardedExprs (TypedValue infered e ty) =+ TypedValue infered <$> desugarGuardedExprs e <*> pure ty +desugarGuardedExprs (PositionedValue ss comms e) =+ PositionedValue ss comms <$> desugarGuardedExprs e++desugarGuardedExprs v = pure v+ -- | -- Validates that case head and binder lengths match. --@@ -262,12 +280,12 @@ (f, _, _) = everywhereOnValuesM return validate return validate :: Expr -> m Expr- validate (Case vs alts) = do+ validate c@(Case vs alts) = do let l = length vs alts' = filter ((l /=) . length . caseAlternativeBinders) alts unless (null alts') $ throwError . MultipleErrors $ fmap (altError l) (caseAlternativeBinders <$> alts')- desugarCase (Case vs alts)+ return c validate other = return other altError :: Int -> [Binder] -> ErrorMessage@@ -370,8 +388,7 @@ else replicateM (length argNames) freshIdent' let vars = map (Var . Qualified Nothing) args binders = [ CaseAlternative bs result | (bs, result) <- alternatives ]- case_ <- desugarCase (Case vars binders)- let value = foldr (Abs . VarBinder) case_ args+ let value = foldr (Abs . VarBinder) (Case vars binders) args return $ ValueDeclaration ident Public [] [MkUnguarded value] where
src/Language/PureScript/TypeChecker/Entailment.hs view
@@ -55,7 +55,9 @@ | AppendSymbolInstance -- ^ Computed instance of AppendSymbol | UnionInstance- -- ^ Computed instance of RowUnion+ -- ^ Computed instance of Union+ | ConsInstance+ -- ^ Computed instance of RowCons deriving (Show, Eq) -- | Extract the identifier of a named instance@@ -167,6 +169,8 @@ forClassName _ C.Union [l, r, u] | Just (lOut, rOut, uOut, cst) <- unionRows l r u = [ TypeClassDictionaryInScope UnionInstance [] C.Union [lOut, rOut, uOut] cst ]+ forClassName _ C.RowCons [TypeLevelString sym, ty, r, _]+ = [ TypeClassDictionaryInScope ConsInstance [] C.RowCons [TypeLevelString sym, ty, r, RCons (Label sym) ty r] Nothing ] forClassName ctx cn@(Qualified (Just mn) _) tys = concatMap (findDicts ctx cn) (ordNub (Nothing : Just mn : map Just (mapMaybe ctorModules tys))) forClassName _ _ _ = internalError "forClassName: expected qualified class name" @@ -326,6 +330,7 @@ -- We need the subgoal dictionary to appear in the term somewhere return $ App (Abs (VarBinder (Ident C.__unused)) valUndefined) e mkDictionary UnionInstance _ = return valUndefined+ mkDictionary ConsInstance _ = return valUndefined mkDictionary (WarnInstance msg) _ = do tell . errorMessage $ UserDefinedWarning msg -- We cannot call the type class constructor here because Warn is declared in Prim.
src/Language/PureScript/TypeChecker/Types.hs view
@@ -556,12 +556,7 @@ let ns = concatMap binderNames binders in length (ordNub ns) == length ns m1 <- M.unions <$> zipWithM inferBinder nvals binders r <- bindLocalVariables [ (name, ty, Defined) | (name, ty) <- M.toList m1 ] $- CaseAlternative binders <$>- case result of- [MkUnguarded val] -> do- val' <- TypedValue True <$> check val ret <*> pure ret- return [MkUnguarded val']- gs -> forM gs (\ge -> checkGuardedRhs ge ret)+ CaseAlternative binders <$> forM result (\ge -> checkGuardedRhs ge ret) rs <- checkBinders nvals ret bs return $ r : rs @@ -573,12 +568,18 @@ checkGuardedRhs (GuardedExpr [] rhs) ret = do rhs' <- TypedValue True <$> check rhs ret <*> pure ret return $ GuardedExpr [] rhs'-checkGuardedRhs (GuardedExpr [ConditionGuard cond] rhs) ret = do+checkGuardedRhs (GuardedExpr (ConditionGuard cond : guards) rhs) ret = do cond' <- withErrorMessageHint ErrorCheckingGuard $ check cond tyBoolean- rhs' <- TypedValue True <$> check rhs ret <*> pure ret- return $ GuardedExpr [ConditionGuard cond'] rhs'-checkGuardedRhs _ _ =- internalError "Pattern not desugared"+ GuardedExpr guards' rhs' <- checkGuardedRhs (GuardedExpr guards rhs) ret+ return $ GuardedExpr (ConditionGuard cond' : guards') rhs'+checkGuardedRhs (GuardedExpr (PatternGuard binder expr : guards) rhs) ret = do+ expr'@(TypedValue _ _ ty) <- infer expr+ variables <- inferBinder ty binder+ GuardedExpr guards' rhs' <- bindLocalVariables [ (name, bty, Defined)+ | (name, bty) <- M.toList variables+ ] $+ checkGuardedRhs (GuardedExpr guards rhs) ret+ return $ GuardedExpr (PatternGuard binder expr' : guards') rhs' -- | -- Check the type of a value, rethrowing errors to provide a better error message
tests/Language/PureScript/Ide/ImportsSpec.hs view
@@ -56,9 +56,6 @@ consoleImport = testParseImport "import Control.Monad.Eff.Console (log) as Console" maybeImport = testParseImport "import Data.Maybe (Maybe(Just))" -wildcard :: P.Type-wildcard = P.TypeWildcard $ P.SourceSpan "" (P.SourcePos 0 0) (P.SourcePos 0 0)- spec :: Spec spec = do describe "determining the importsection" $ do@@ -104,13 +101,13 @@ describe "import commands" $ do let simpleFileImports = let (_, _, i, _) = splitSimpleFile in i addValueImport i mn is =- prettyPrintImportSection (addExplicitImport' (IdeDeclValue (IdeValue (P.Ident i) wildcard)) mn is)+ prettyPrintImportSection (addExplicitImport' (_idaDeclaration (Test.ideValue i Nothing)) mn is) addOpImport op mn is =- prettyPrintImportSection (addExplicitImport' (IdeDeclValueOperator (IdeValueOperator op (P.Qualified Nothing (Left (P.Ident ""))) 2 P.Infix Nothing)) mn is)+ prettyPrintImportSection (addExplicitImport' (_idaDeclaration (Test.ideValueOp op (P.Qualified Nothing (Left "")) 2 Nothing Nothing)) mn is) addDtorImport i t mn is =- prettyPrintImportSection (addExplicitImport' (IdeDeclDataConstructor (IdeDataConstructor (P.ProperName i) t wildcard)) mn is)+ prettyPrintImportSection (addExplicitImport' (_idaDeclaration (Test.ideDtor i t Nothing)) mn is) addTypeImport i mn is =- prettyPrintImportSection (addExplicitImport' (IdeDeclType (IdeType (P.ProperName i) P.kindType)) mn is)+ prettyPrintImportSection (addExplicitImport' (_idaDeclaration (Test.ideType i Nothing)) mn is) it "adds an implicit unqualified import to a file without any imports" $ shouldBe (addImplicitImport' [] (P.moduleNameFromString "Data.Map"))@@ -144,7 +141,7 @@ ] it "adds an operator to an explicit import list" $ shouldBe- (addOpImport (P.OpName "<~>") (P.moduleNameFromString "Data.Array") explicitImports)+ (addOpImport "<~>" (P.moduleNameFromString "Data.Array") explicitImports) [ "import Prelude" , "import Data.Array (tail, (<~>))" ]@@ -156,21 +153,21 @@ ] it "adds the type for a given DataConstructor" $ shouldBe- (addDtorImport "Just" (P.ProperName "Maybe") (P.moduleNameFromString "Data.Maybe") simpleFileImports)+ (addDtorImport "Just" "Maybe" (P.moduleNameFromString "Data.Maybe") simpleFileImports) [ "import Prelude" , "import Data.Maybe (Maybe(..))" ] it "adds a dataconstructor to an existing type import" $ do let Right (_, _, typeImports, _) = sliceImportSection (withImports ["import Data.Maybe (Maybe)"]) shouldBe- (addDtorImport "Just" (P.ProperName "Maybe") (P.moduleNameFromString "Data.Maybe") typeImports)+ (addDtorImport "Just" "Maybe" (P.moduleNameFromString "Data.Maybe") typeImports) [ "import Prelude" , "import Data.Maybe (Maybe(..))" ] it "doesn't add a dataconstructor to an existing type import with open dtors" $ do let Right (_, _, typeImports, _) = sliceImportSection (withImports ["import Data.Maybe (Maybe(..))"]) shouldBe- (addDtorImport "Just" (P.ProperName "Maybe") (P.moduleNameFromString "Data.Maybe") typeImports)+ (addDtorImport "Just" "Maybe" (P.moduleNameFromString "Data.Maybe") typeImports) [ "import Prelude" , "import Data.Maybe (Maybe(..))" ]@@ -186,10 +183,10 @@ let Right (_, _, baseImports, _) = sliceImportSection $ withImports ["import Control.Monad (ap)"] moduleName = (P.moduleNameFromString "Control.Monad") addImport imports import' = addExplicitImport' import' moduleName imports- valueImport ident = (IdeDeclValue (IdeValue (P.Ident ident) wildcard))- typeImport name = (IdeDeclType (IdeType (P.ProperName name) P.kindType))- classImport name = (IdeDeclTypeClass (IdeTypeClass (P.ProperName name) []))- dtorImport name typeName = (IdeDeclDataConstructor (IdeDataConstructor (P.ProperName name) (P.ProperName typeName) wildcard))+ valueImport ident = _idaDeclaration (Test.ideValue ident Nothing)+ typeImport name = _idaDeclaration (Test.ideType name Nothing)+ classImport name = _idaDeclaration (Test.ideTypeClass name P.kindType [])+ dtorImport name typeName = _idaDeclaration (Test.ideDtor name typeName Nothing) -- expect any list of provided identifiers, when imported, to come out as specified expectSorted imports expected = shouldBe (ordNub $ map
tests/Language/PureScript/Ide/ReexportsSpec.hs view
@@ -7,49 +7,39 @@ import qualified Data.Map as Map import Language.PureScript.Ide.Reexports import Language.PureScript.Ide.Types+import Language.PureScript.Ide.Test import qualified Language.PureScript as P import Test.Hspec -type Module = (P.ModuleName, [IdeDeclarationAnn])--m :: Text -> P.ModuleName-m = P.moduleNameFromString--d :: IdeDeclaration -> IdeDeclarationAnn-d = IdeDeclarationAnn emptyAnn--exportedFrom :: Text -> IdeDeclarationAnn -> IdeDeclarationAnn-exportedFrom mn (IdeDeclarationAnn ann decl) = IdeDeclarationAnn (ann {_annExportedFrom = Just (m mn)}) decl- valueA, typeA, classA, dtorA1, dtorA2 :: IdeDeclarationAnn-valueA = d (IdeDeclValue (IdeValue (P.Ident "valueA") P.REmpty))-typeA = d (IdeDeclType (IdeType(P.ProperName "TypeA") P.kindType))-classA = d (IdeDeclTypeClass (IdeTypeClass (P.ProperName "ClassA") []))-dtorA1 = d (IdeDeclDataConstructor (IdeDataConstructor (P.ProperName "DtorA1") (P.ProperName "TypeA") P.REmpty))-dtorA2 = d (IdeDeclDataConstructor (IdeDataConstructor (P.ProperName "DtorA2") (P.ProperName "TypeA") P.REmpty))+valueA = ideValue "valueA" Nothing+typeA = ideType "TypeA" Nothing+classA = ideTypeClass "ClassA" P.kindType []+dtorA1 = ideDtor "DtorA1" "TypeA" Nothing+dtorA2 = ideDtor "DtorA2" "TypeA" Nothing env :: ModuleMap [IdeDeclarationAnn] env = Map.fromList- [ (m "A", [valueA, typeA, classA, dtorA1, dtorA2])+ [ (mn "A", [valueA, typeA, classA, dtorA1, dtorA2]) ] type Refs = [(P.ModuleName, P.DeclarationRef)] succTestCases :: [(Text, Refs, [IdeDeclarationAnn])] succTestCases =- [ ("resolves a value reexport", [(m "A", P.ValueRef (P.Ident "valueA"))], [exportedFrom "A" valueA])+ [ ("resolves a value reexport", [(mn "A", P.ValueRef (P.Ident "valueA"))], [valueA `annExp` "A"]) , ("resolves a type reexport with explicit data constructors"- , [(m "A", P.TypeRef (P.ProperName "TypeA") (Just [P.ProperName "DtorA1"]))], [exportedFrom "A" typeA, exportedFrom "A" dtorA1])+ , [(mn "A", P.TypeRef (P.ProperName "TypeA") (Just [P.ProperName "DtorA1"]))], [typeA `annExp` "A", dtorA1 `annExp` "A"]) , ("resolves a type reexport with implicit data constructors"- , [(m "A", P.TypeRef (P.ProperName "TypeA") Nothing)], map (exportedFrom "A") [typeA, dtorA1, dtorA2])- , ("resolves a class reexport", [(m "A", P.TypeClassRef (P.ProperName "ClassA"))], [exportedFrom "A" classA])+ , [(mn "A", P.TypeRef (P.ProperName "TypeA") Nothing)], map (`annExp` "A") [typeA, dtorA1, dtorA2])+ , ("resolves a class reexport", [(mn "A", P.TypeClassRef (P.ProperName "ClassA"))], [classA `annExp` "A"]) ] failTestCases :: [(Text, Refs)] failTestCases =- [ ("fails to resolve a non existing value", [(m "A", P.ValueRef (P.Ident "valueB"))])- , ("fails to resolve a non existing type reexport" , [(m "A", P.TypeRef (P.ProperName "TypeB") Nothing)])- , ("fails to resolve a non existing class reexport", [(m "A", P.TypeClassRef (P.ProperName "ClassB"))])+ [ ("fails to resolve a non existing value", [(mn "A", P.ValueRef (P.Ident "valueB"))])+ , ("fails to resolve a non existing type reexport" , [(mn "A", P.TypeRef (P.ProperName "TypeB") Nothing)])+ , ("fails to resolve a non existing class reexport", [(mn "A", P.TypeClassRef (P.ProperName "ClassB"))]) ] spec :: Spec
tests/Language/PureScript/Ide/SourceFileSpec.hs view
@@ -97,12 +97,12 @@ ideState = emptyIdeState `s3` [ ("Test", [ ideValue "sfValue" Nothing `annLoc` valueSS- , ideSynonym "SFType" P.tyString `annLoc` synonymSS+ , ideSynonym "SFType" P.tyString P.kindType `annLoc` synonymSS , ideType "SFData" Nothing `annLoc` typeSS , ideDtor "SFOne" "SFData" Nothing `annLoc` typeSS , ideDtor "SFTwo" "SFData" Nothing `annLoc` typeSS , ideDtor "SFThree" "SFData" Nothing `annLoc` typeSS- , ideTypeClass "SFClass" [] `annLoc` classSS+ , ideTypeClass "SFClass" P.kindType [] `annLoc` classSS , ideValueOp "<$>" (P.Qualified Nothing (Left "")) 0 Nothing Nothing `annLoc` valueOpSS , ideTypeOp "~>" (P.Qualified Nothing "") 0 Nothing Nothing
tests/Language/PureScript/Ide/StateSpec.hs view
@@ -6,6 +6,7 @@ import Control.Lens hiding ((&)) import Language.PureScript.Ide.Types import Language.PureScript.Ide.State+import Language.PureScript.Ide.Test import qualified Language.PureScript as P import Test.Hspec import qualified Data.Map as Map@@ -34,9 +35,6 @@ d :: IdeDeclaration -> IdeDeclarationAnn d = IdeDeclarationAnn emptyAnn -mn :: Text -> P.ModuleName-mn = P.moduleNameFromString- testState :: ModuleMap [IdeDeclarationAnn] testState = Map.fromList [testModule] @@ -72,7 +70,7 @@ -- } moduleMap :: ModuleMap [IdeDeclarationAnn]-moduleMap = Map.singleton (mn "ClassModule") [d (IdeDeclTypeClass (IdeTypeClass (P.ProperName "MyClass") []))]+moduleMap = Map.singleton (mn "ClassModule") [ideTypeClass "MyClass" P.kindType []] ideInstance :: IdeInstance ideInstance = IdeInstance (mn "InstanceModule") (P.Ident "myClassInstance") mempty mempty
tests/Language/PureScript/Ide/Test.hs view
@@ -49,8 +49,8 @@ annLoc :: IdeDeclarationAnn -> P.SourceSpan -> IdeDeclarationAnn annLoc (IdeDeclarationAnn a d) loc = IdeDeclarationAnn a {_annLocation = Just loc} d -annExp :: IdeDeclarationAnn -> P.ModuleName -> IdeDeclarationAnn-annExp (IdeDeclarationAnn a d) e = IdeDeclarationAnn a {_annExportedFrom = Just e} d+annExp :: IdeDeclarationAnn -> Text -> IdeDeclarationAnn+annExp (IdeDeclarationAnn a d) e = IdeDeclarationAnn a {_annExportedFrom = Just (mn e)} d annTyp :: IdeDeclarationAnn -> P.Type -> IdeDeclarationAnn annTyp (IdeDeclarationAnn a d) ta = IdeDeclarationAnn a {_annTypeAnnotation = Just ta} d@@ -66,11 +66,11 @@ ideType :: Text -> Maybe P.Kind -> IdeDeclarationAnn ideType pn ki = ida (IdeDeclType (IdeType (P.ProperName pn) (fromMaybe P.kindType ki))) -ideSynonym :: Text -> P.Type -> IdeDeclarationAnn-ideSynonym pn ty = ida (IdeDeclTypeSynonym (IdeTypeSynonym (P.ProperName pn) ty))+ideSynonym :: Text -> P.Type -> P.Kind -> IdeDeclarationAnn+ideSynonym pn ty kind = ida (IdeDeclTypeSynonym (IdeTypeSynonym (P.ProperName pn) ty kind)) -ideTypeClass :: Text -> [IdeInstance] -> IdeDeclarationAnn-ideTypeClass pn instances = ida (IdeDeclTypeClass (IdeTypeClass (P.ProperName pn) instances))+ideTypeClass :: Text -> P.Kind -> [IdeInstance] -> IdeDeclarationAnn+ideTypeClass pn kind instances = ida (IdeDeclTypeClass (IdeTypeClass (P.ProperName pn) kind instances)) ideDtor :: Text -> Text -> Maybe P.Type -> IdeDeclarationAnn ideDtor pn tn ty = ida (IdeDeclDataConstructor (IdeDataConstructor (P.ProperName pn) (P.ProperName tn) (fromMaybe P.tyString ty)))
tests/TestPsci.hs view
@@ -1,22 +1,15 @@-{-# LANGUAGE RecordWildCards #-}- module TestPsci where import Prelude () import Prelude.Compat -import Control.Monad (when)-import System.Exit (exitFailure)-import Test.HUnit+import Test.Hspec import TestPsci.CommandTest (commandTests) import TestPsci.CompletionTest (completionTests)+import TestPsci.EvalTest (evalTests) main :: IO ()-main = do- Counts{..} <- runTestTT allTests- when (errors + failures > 0) exitFailure--allTests :: Test-allTests = TestList [ completionTests- , commandTests- ]+main = hspec $ do+ completionTests+ commandTests+ evalTests
tests/TestPsci/CommandTest.hs view
@@ -5,31 +5,30 @@ import Control.Monad.Trans.RWS.Strict (get) import Language.PureScript.Interactive-import Test.HUnit+import Test.Hspec import TestPsci.TestEnv -commandTests :: Test-commandTests = TestLabel "commandTests" $ TestList $ map (TestCase . execTestPSCi)- [ do- run "import Prelude"- run "import Data.Functor"- run "import Control.Monad"- before <- psciImportedModules <$> get- length before `equalsTo` 3- run ":clear"- after <- psciImportedModules <$> get- length after `equalsTo` 0- , do- run "import Prelude"- run "import Data.Functor"- run "import Control.Monad"- before <- psciImportedModules <$> get- length before `equalsTo` 3- run ":reload"- after <- psciImportedModules <$> get- length after `equalsTo` 3- , do- run "import Prelude"- run "import Data.Array"- "let fac n = foldl mul 1 (1..n) in fac 10" `evaluatesTo` "3628800"- ]+specPSCi :: String -> TestPSCi () -> Spec+specPSCi label = specify label . execTestPSCi++commandTests :: Spec+commandTests = context "commandTests" $ do+ specPSCi ":clear" $ do+ run "import Prelude"+ run "import Data.Functor"+ run "import Control.Monad"+ ms <- psciImportedModules <$> get+ length ms `equalsTo` 3+ run ":clear"+ ms' <- psciImportedModules <$> get+ length ms' `equalsTo` 0++ specPSCi ":reload" $ do+ run "import Prelude"+ run "import Data.Functor"+ run "import Control.Monad"+ ms <- psciImportedModules <$> get+ length ms `equalsTo` 3+ run ":reload"+ ms' <- psciImportedModules <$> get+ length ms' `equalsTo` 3
tests/TestPsci/CompletionTest.hs view
@@ -3,8 +3,9 @@ import Prelude () import Prelude.Compat -import Test.HUnit+import Test.Hspec +import Control.Monad (mapM_) import Control.Monad.Trans.State.Strict (evalStateT) import Data.List (sort) import qualified Data.Text as T@@ -14,10 +15,9 @@ import TestPsci.TestEnv (initTestPSCiEnv) import TestUtils (supportModules) -completionTests :: Test-completionTests =- TestLabel "completionTests"- (TestList (map (TestCase . assertCompletedOk) completionTestData))+completionTests :: Spec+completionTests = context "completionTests" $+ mapM_ assertCompletedOk completionTestData -- If the cursor is at the right end of the line, with the 1st element of the -- pair as the text in the line, then pressing tab should offer all the@@ -84,12 +84,12 @@ , ("Control.Monad.ST.new", ["Control.Monad.ST.newSTRef"]) ] -assertCompletedOk :: (String, [String]) -> Assertion-assertCompletedOk (line, expecteds) = do+assertCompletedOk :: (String, [String]) -> Spec+assertCompletedOk (line, expecteds) = specify line $ do (unusedR, completions) <- runCM (completion' (reverse line, "")) let unused = reverse unusedR let actuals = map ((unused ++) . replacement) completions- sort expecteds @=? sort actuals+ sort expecteds `shouldBe` sort actuals runCM :: CompletionM a -> IO a runCM act = do
+ tests/TestPsci/EvalTest.hs view
@@ -0,0 +1,66 @@+module TestPsci.EvalTest where++import Prelude ()+import Prelude.Compat++import Control.Monad (forM_, foldM_)+import Control.Monad.IO.Class (liftIO)+import Data.List (stripPrefix, intercalate)+import Data.List.Split (splitOn)+import System.Directory (getCurrentDirectory)+import System.Exit (exitFailure)+import System.FilePath ((</>), takeFileName)+import qualified System.FilePath.Glob as Glob+import System.IO.UTF8 (readUTF8File)+import Test.Hspec+import TestPsci.TestEnv++evalTests :: Spec+evalTests = context "evalTests" $ do+ testFiles <- runIO evalTestFiles+ forM_ testFiles evalTest++evalTestFiles :: IO [FilePath]+evalTestFiles = do+ cwd <- getCurrentDirectory+ let psciExamples = cwd </> "examples" </> "psci"+ Glob.globDir1 (Glob.compile "**/*.purs") psciExamples++data EvalLine = Line String+ | Comment EvalContext+ | Empty+ | Invalid String+ deriving (Show)++data EvalContext = ShouldEvaluateTo String+ | Paste [String]+ | None+ deriving (Show)++evalCommentPrefix :: String+evalCommentPrefix = "-- @"++parseEvalLine :: String -> EvalLine+parseEvalLine "" = Empty+parseEvalLine line =+ case stripPrefix evalCommentPrefix line of+ Just rest ->+ case splitOn " " rest of+ "shouldEvaluateTo" : args -> Comment (ShouldEvaluateTo $ intercalate " " args)+ "paste" : [] -> Comment (Paste [])+ _ -> Invalid line+ Nothing -> Line line++evalTest :: FilePath -> Spec+evalTest f = specify (takeFileName f) $ do+ evalLines <- map parseEvalLine . lines <$> readUTF8File f+ execTestPSCi $ foldM_ handleLine None evalLines++handleLine :: EvalContext -> EvalLine -> TestPSCi EvalContext+handleLine ctx Empty = pure ctx+handleLine None (Line stmt) = run stmt >> pure None+handleLine None (Comment ctx) = pure ctx+handleLine (ShouldEvaluateTo expected) (Line expr) = expr `evaluatesTo` expected >> pure None+handleLine (Paste ls) (Line l) = pure . Paste $ ls ++ [l]+handleLine (Paste ls) (Comment (Paste _)) = run (intercalate "\n" ls) >> pure None+handleLine _ line = liftIO $ putStrLn ("unexpected: " ++ show line) >> exitFailure
tests/TestPsci/TestEnv.hs view
@@ -12,7 +12,7 @@ import System.FilePath ((</>)) import qualified System.FilePath.Glob as Glob import System.Process (readProcessWithExitCode)-import Test.HUnit ((@?=))+import Test.Hspec (shouldBe) -- | A monad transformer for handle PSCi actions in tests type TestPSCi a = RWST PSCiConfig () PSCiState IO a@@ -70,9 +70,9 @@ run :: String -> TestPSCi () run comm = runAndEval comm $ jsEval *> return () --- | A lifted evaluation of HUnit '@?=' for the TestPSCi+-- | A lifted evaluation of Hspec 'shouldBe' for the TestPSCi equalsTo :: (Eq a, Show a) => a -> a -> TestPSCi ()-equalsTo x y = liftIO $ x @?= y+equalsTo x y = liftIO $ x `shouldBe` y -- | An assertion to check if a command evaluates to a string evaluatesTo :: String -> String -> TestPSCi ()