git.iko.soy/rowtype-yoga/purescript-native
on golang help sign in
[psc-ide] Adds lenses and prisms for psc-ide's core data types
commit2acd6d89b2489e2146f5331466c934c01f0a76a6 authorChristoph Hegemann <christoph.hegemann1337@gmail.com> dateSun 18 Sep 2016, 12:52 (10 years ago) parent12ec934
21 files changed+246−190
purescript.cabal+1 src/Language/PureScript/Ide/CaseSplit.hs+6−6 src/Language/PureScript/Ide/Command.hs+2−1 src/Language/PureScript/Ide/Conversions.hs+9−3 src/Language/PureScript/Ide/Error.hs+3−3 src/Language/PureScript/Ide/Externs.hs+29−28 src/Language/PureScript/Ide/Filter.hs+3−4 src/Language/PureScript/Ide/Imports.hs+21−15 src/Language/PureScript/Ide/Matcher.hs+1−1 src/Language/PureScript/Ide/Pursuit.hs+1−1 src/Language/PureScript/Ide/Rebuild.hs+1−1 src/Language/PureScript/Ide/Reexports.hs+13−16 src/Language/PureScript/Ide/SourceFile.hs+5−5 src/Language/PureScript/Ide/State.hs+37−45 src/Language/PureScript/Ide/Types.hs+72−21 src/Language/PureScript/Ide/Util.hs+26−24 tests/Language/PureScript/Ide/FilterSpec.hs+1−1 tests/Language/PureScript/Ide/ImportsSpec.hs+3−3 tests/Language/PureScript/Ide/MatcherSpec.hs+1−1 tests/Language/PureScript/Ide/ReexportsSpec.hs+5−5 tests/Language/PureScript/Ide/StateSpec.hs+6−6
purescript.cabal+1
@@ -122,6 +122,7 @@ library
122122 http-client >= 0.4.30 && <0.5,
123123 http-types -any,
124124 language-javascript == 0.6.*,
125+ lens == 4.*,
125126 lifted-base >= 0.2.3 && < 0.2.4,
126127 monad-control >= 1.0.0.0 && < 1.1,
127128 monad-logger >= 0.3 && < 0.4,
src/Language/PureScript/Ide/CaseSplit.hs+6−6
@@ -12,7 +12,7 @@
1212-- Casesplitting and adding function clauses
1313-----------------------------------------------------------------------------
1414
15−{-# LANGUAGE OverloadedStrings #-}
15+{-# LANGUAGE OverloadedStrings #-}
1616
1717module Language.PureScript.Ide.CaseSplit
1818 ( WildcardAnnotations()
@@ -23,10 +23,10 @@ module Language.PureScript.Ide.CaseSplit
2323 , caseSplit
2424 ) where
2525
26−import Protolude hiding (Constructor)
26+import Protolude hiding (Constructor)
2727
28−import qualified Data.Text as T
29−import qualified Language.PureScript as P
28+import qualified Data.Text as T
29+import qualified Language.PureScript as P
3030
3131import Language.PureScript.Externs
3232import Language.PureScript.Ide.Error
@@ -34,8 +34,8 @@ import Language.PureScript.Ide.State
3434import Language.PureScript.Ide.Types
3535import Language.PureScript.Ide.Util
3636
37−import Text.Parsec as Parsec
38−import qualified Text.PrettyPrint.Boxes as Box
37+import Text.Parsec as Parsec
38+import qualified Text.PrettyPrint.Boxes as Box
3939
4040type Constructor = (P.ProperName 'P.ConstructorName, [P.Type])
4141
src/Language/PureScript/Ide/Command.hs+2−1
@@ -12,7 +12,8 @@
1212-- Datatypes for the commands psc-ide accepts
1313-----------------------------------------------------------------------------
1414
15−{-# LANGUAGE OverloadedStrings #-}
15+{-# LANGUAGE OverloadedStrings #-}
16+
1617
1718module Language.PureScript.Ide.Command where
1819
src/Language/PureScript/Ide/Conversions.hs+9−3
@@ -14,16 +14,23 @@
1414
1515module Language.PureScript.Ide.Conversions where
1616
17−import Protolude
18−import Data.Text (unwords, lines, strip)
17+import Control.Lens.Iso
18+import Data.Text (lines, strip, unwords)
1919import qualified Language.PureScript as P
20+import Protolude
2021
2122runProperNameT :: P.ProperName a -> Text
2223runProperNameT = toS . P.runProperName
2324
25+properNameT :: Iso' (P.ProperName a) Text
26+properNameT = iso (toS . P.runProperName) (P.ProperName . toS)
27+
2428runIdentT :: P.Ident -> Text
2529runIdentT = toS . P.runIdent
2630
31+identT :: Iso' P.Ident Text
32+identT = iso (toS . P.runIdent) (P.Ident . toS)
33+
2734runOpNameT :: P.OpName a -> Text
2835runOpNameT = toS . P.runOpName
2936
@@ -32,4 +39,3 @@ runModuleNameT = toS . P.runModuleName
3239
3340prettyTypeT :: P.Type -> Text
3441prettyTypeT = unwords . map strip . lines . toS . P.prettyPrintType
35−
src/Language/PureScript/Ide/Error.hs+3−3
@@ -17,11 +17,11 @@ module Language.PureScript.Ide.Error
1717 ( PscIdeError(..)
1818 ) where
1919
20−import Protolude
2120import Data.Aeson
2221import Language.PureScript.Errors.JSON
23−import Language.PureScript.Ide.Types (ModuleIdent)
24−import qualified Text.Parsec.Error as P
22+import Language.PureScript.Ide.Types (ModuleIdent)
23+import Protolude
24+import qualified Text.Parsec.Error as P
2525
2626data PscIdeError
2727 = GeneralError Text
src/Language/PureScript/Ide/Externs.hs+29−28
@@ -14,7 +14,6 @@
1414
1515{-# LANGUAGE OverloadedStrings #-}
1616{-# LANGUAGE RecordWildCards #-}
17−{-# LANGUAGE FlexibleContexts #-}
1817
1918module Language.PureScript.Ide.Externs
2019 ( readExternFile
@@ -24,10 +23,11 @@ module Language.PureScript.Ide.Externs
2423
2524import Protolude
2625
26+import Control.Lens ((^.))
2727import Data.Aeson (decodeStrict)
28+import qualified Data.ByteString as BS
2829import Data.List (nub)
2930import qualified Data.Map as Map
30−import qualified Data.ByteString as BS
3131import Language.PureScript.Ide.Error (PscIdeError (..))
3232import Language.PureScript.Ide.Types
3333import Language.PureScript.Ide.Util
@@ -58,14 +58,14 @@ convertExterns ef =
5858 cleanDeclarations = nub $ appEndo typeClassFilter declarations
5959
6060removeTypeDeclarationsForClass :: IdeDeclaration -> Endo [IdeDeclaration]
61−removeTypeDeclarationsForClass (IdeTypeClass n) = Endo (filter notDuplicate)
62− where notDuplicate (IdeType n' _) = runProperNameT n /= runProperNameT n'
63− notDuplicate (IdeTypeSynonym n' _) = runProperNameT n /= runProperNameT n'
61+removeTypeDeclarationsForClass (IdeDeclTypeClass n) = Endo (filter notDuplicate)
62+ where notDuplicate (IdeDeclType t) = n ^. properNameT /= t ^. ideTypeName . properNameT
63+ notDuplicate (IdeDeclTypeSynonym s) = n ^. properNameT /= s ^. ideSynonymName . properNameT
6464 notDuplicate _ = True
6565removeTypeDeclarationsForClass _ = mempty
6666
6767isTypeClassDeclaration :: IdeDeclaration -> Bool
68−isTypeClassDeclaration IdeTypeClass{} = True
68+isTypeClassDeclaration IdeDeclTypeClass{} = True
6969isTypeClassDeclaration _ = False
7070
7171convertExport :: P.DeclarationRef -> Maybe (P.ModuleName, P.DeclarationRef)
@@ -73,19 +73,20 @@ convertExport (P.ReExportRef m r) = Just (m, r)
7373convertExport _ = Nothing
7474
7575convertDecl :: P.ExternsDeclaration -> Maybe IdeDeclaration
76−convertDecl P.EDType{..} = Just (IdeType edTypeName edTypeKind)
77−convertDecl P.EDTypeSynonym{..} =
78− Just (IdeTypeSynonym edTypeSynonymName edTypeSynonymType)
79−convertDecl P.EDDataConstructor{..} = Just $
76+convertDecl P.EDType{..} = Just $ IdeDeclType $
77+ IdeType edTypeName edTypeKind
78+convertDecl P.EDTypeSynonym{..} = Just $ IdeDeclTypeSynonym
79+ (IdeSynonym edTypeSynonymName edTypeSynonymType)
80+convertDecl P.EDDataConstructor{..} = Just $ IdeDeclDataConstructor $
8081 IdeDataConstructor edDataCtorName edDataCtorTypeCtor edDataCtorType
81−convertDecl P.EDValue{..} = Just $
82+convertDecl P.EDValue{..} = Just $ IdeDeclValue $
8283 IdeValue edValueName edValueType
83−convertDecl P.EDClass{..} = Just (IdeTypeClass edClassName)
84+convertDecl P.EDClass{..} = Just (IdeDeclTypeClass edClassName)
8485convertDecl P.EDInstance{} = Nothing
8586
8687convertOperator :: P.ExternsFixity -> IdeDeclaration
8788convertOperator P.ExternsFixity{..} =
88− IdeValueOperator
89+ IdeDeclValueOperator $ IdeValueOperator
8990 efOperator
9091 efAlias
9192 efPrecedence
@@ -94,7 +95,7 @@ convertOperator P.ExternsFixity{..} =
9495
9596convertTypeOperator :: P.ExternsTypeFixity -> IdeDeclaration
9697convertTypeOperator P.ExternsTypeFixity{..} =
97− IdeTypeOperator
98+ IdeDeclTypeOperator $ IdeTypeOperator
9899 efTypeOperator
99100 efTypeAlias
100101 efTypePrecedence
@@ -110,20 +111,20 @@ annotateModule (defs, types) (moduleName, decls) =
110111 where
111112 convertDeclaration :: IdeDeclarationAnn -> IdeDeclarationAnn
112113 convertDeclaration (IdeDeclarationAnn ann d) = case d of
113− IdeValue i t ->
114− annotateFunction i (IdeValue i t)
115− IdeType i k ->
116− annotateType (runProperNameT i) (IdeType i k)
117− IdeTypeSynonym i t ->
118− annotateType (runProperNameT i) (IdeTypeSynonym i t)
119− IdeDataConstructor i tn t ->
120− annotateValue (runProperNameT i) (IdeDataConstructor i tn t)
121− IdeTypeClass i ->
122− annotateType (runProperNameT i) (IdeTypeClass i)
123− IdeValueOperator n i p a t ->
124− annotateValue (valueOperatorAliasT i) (IdeValueOperator n i p a t)
125− IdeTypeOperator n i p a k ->
126− annotateType (typeOperatorAliasT i) (IdeTypeOperator n i p a k)
114+ IdeDeclValue v ->
115+ annotateFunction (v ^. ideValueIdent) (IdeDeclValue v)
116+ IdeDeclType t ->
117+ annotateType (t ^. ideTypeName . properNameT) (IdeDeclType t)
118+ IdeDeclTypeSynonym s ->
119+ annotateType (s ^. ideSynonymName . properNameT) (IdeDeclTypeSynonym s)
120+ IdeDeclDataConstructor dtor ->
121+ annotateValue (dtor ^. ideDtorName . properNameT) (IdeDeclDataConstructor dtor)
122+ IdeDeclTypeClass i ->
123+ annotateType (runProperNameT i) (IdeDeclTypeClass i)
124+ IdeDeclValueOperator op ->
125+ annotateValue (op ^. ideValueOpAlias & valueOperatorAliasT) (IdeDeclValueOperator op)
126+ IdeDeclTypeOperator op ->
127+ annotateType (op ^. ideTypeOpAlias & typeOperatorAliasT) (IdeDeclTypeOperator op)
127128 where
128129 annotateFunction x = IdeDeclarationAnn (ann { annLocation = Map.lookup (Left (runIdentT x)) defs
129130 , annTypeAnnotation = Map.lookup x types
src/Language/PureScript/Ide/Filter.hs+3−4
@@ -23,13 +23,13 @@ module Language.PureScript.Ide.Filter
2323 , applyFilters
2424 ) where
2525
26−import Protolude hiding (isPrefixOf)
26+import Protolude hiding (isPrefixOf)
2727
2828import Data.Aeson
2929import Data.Text (isPrefixOf)
30+import qualified Language.PureScript as P
3031import Language.PureScript.Ide.Types
3132import Language.PureScript.Ide.Util
32−import qualified Language.PureScript as P
3333
3434newtype Filter = Filter (Endo [Module]) deriving(Monoid)
3535
@@ -65,8 +65,7 @@ identFilter predicate search =
6565 where
6666 filterModuleDecls :: Module -> Module
6767 filterModuleDecls (moduleIdent, decls) =
68− (moduleIdent, filter (flip predicate search . getDeclaration) decls)
69− getDeclaration (IdeDeclarationAnn _ d) = d
68+ (moduleIdent, filter (flip predicate search . discardAnn) decls)
7069
7170runFilter :: Filter -> [Module] -> [Module]
7271runFilter (Filter f) = appEndo f
src/Language/PureScript/Ide/Imports.hs+21−15
@@ -30,8 +30,10 @@ module Language.PureScript.Ide.Imports
3030 where
3131
3232import Protolude
33+
34+import Control.Lens ((^.))
35+import Data.List (findIndex, nubBy)
3336import qualified Data.Text as T
34−import Data.List (nubBy, findIndex)
3537import qualified Data.Text.IO as TIO
3638import qualified Language.PureScript as P
3739import Language.PureScript.Ide.Completion
@@ -197,16 +199,16 @@ addExplicitImport' decl moduleName imports =
197199 then imports
198200 else updateAtFirstOrPrepend matches (insertDeclIntoImport decl) freshImport imports
199201 where
200− refFromDeclaration (IdeTypeClass n) =
202+ refFromDeclaration (IdeDeclTypeClass n) =
201203 P.TypeClassRef n
202− refFromDeclaration (IdeDataConstructor n tn _) =
203− P.TypeRef tn (Just [n])
204− refFromDeclaration (IdeType n _) =
205− P.TypeRef n (Just [])
206− refFromDeclaration (IdeValueOperator op _ _ _ _) =
207− P.ValueOpRef op
208− refFromDeclaration (IdeTypeOperator op _ _ _ _) =
209− P.TypeOpRef op
204+ refFromDeclaration (IdeDeclDataConstructor dtor) =
205+ P.TypeRef (dtor ^. ideDtorTypeName) (Just [dtor ^. ideDtorName])
206+ refFromDeclaration (IdeDeclType t) =
207+ P.TypeRef (t ^. ideTypeName) (Just [])
208+ refFromDeclaration (IdeDeclValueOperator op) =
209+ P.ValueOpRef (op ^. ideValueOpName)
210+ refFromDeclaration (IdeDeclTypeOperator op) =
211+ P.TypeOpRef (op ^. ideTypeOpName)
210212 refFromDeclaration d =
211213 P.ValueRef $ P.Ident $ T.unpack (identifierFromIdeDeclaration d)
212214
@@ -218,8 +220,12 @@ addExplicitImport' decl moduleName imports =
218220 insertDeclIntoImport _ is = is
219221
220222 insertDeclIntoRefs :: IdeDeclaration -> [P.DeclarationRef] -> [P.DeclarationRef]
221− insertDeclIntoRefs (IdeDataConstructor dtor tn _) refs =
222− updateAtFirstOrPrepend (matchType tn) (insertDtor dtor) (P.TypeRef tn (Just [dtor])) refs
223+ insertDeclIntoRefs d@(IdeDeclDataConstructor dtor) refs =
224+ updateAtFirstOrPrepend
225+ (matchType (dtor ^. ideDtorTypeName))
226+ (insertDtor (dtor ^. ideDtorName))
227+ (refFromDeclaration d)
228+ refs
223229 insertDeclIntoRefs dr refs = nubBy ((==) `on` P.prettyPrintRef) (refFromDeclaration dr : refs)
224230
225231 insertDtor dtor (P.TypeRef tn' dtors) =
@@ -294,9 +300,9 @@ addImportForIdentifier fp ident filters = do
294300 xs ->
295301 pure $ Left xs
296302 where
297− decideRedundantCase dtor@(IdeDataConstructor _ t _) (IdeType t' _) =
298− if t == t' then Just dtor else Nothing
299− decideRedundantCase IdeType{} ts@IdeTypeSynonym{} =
303+ decideRedundantCase d@(IdeDeclDataConstructor dtor) (IdeDeclType t) =
304+ if dtor ^. ideDtorTypeName == t ^. ideTypeName then Just d else Nothing
305+ decideRedundantCase IdeDeclType{} ts@IdeDeclTypeSynonym{} =
300306 Just ts
301307 decideRedundantCase _ _ = Nothing
302308
src/Language/PureScript/Ide/Matcher.hs+1−1
@@ -12,9 +12,9 @@
1212-- Matchers for psc-ide commands
1313-----------------------------------------------------------------------------
1414
15+{-# LANGUAGE FlexibleInstances #-}
1516{-# LANGUAGE GeneralizedNewtypeDeriving #-}
1617{-# LANGUAGE OverloadedStrings #-}
17−{-# LANGUAGE FlexibleInstances #-}
1818
1919module Language.PureScript.Ide.Matcher
2020 ( Matcher
src/Language/PureScript/Ide/Pursuit.hs+1−1
@@ -12,7 +12,7 @@
1212-- Pursuit client for psc-ide
1313-----------------------------------------------------------------------------
1414
15−{-# LANGUAGE OverloadedStrings #-}
15+{-# LANGUAGE OverloadedStrings #-}
1616
1717module Language.PureScript.Ide.Pursuit
1818 ( searchPursuitForDeclarations
src/Language/PureScript/Ide/Rebuild.hs+1−1
@@ -11,7 +11,7 @@ module Language.PureScript.Ide.Rebuild
1111import Protolude
1212
1313import "monad-logger" Control.Monad.Logger
14−import qualified Data.List as List
14+import qualified Data.List as List
1515import qualified Data.Map.Lazy as M
1616import Data.Maybe (fromJust)
1717import qualified Data.Set as S
src/Language/PureScript/Ide/Reexports.hs+13−16
@@ -25,16 +25,18 @@ module Language.PureScript.Ide.Reexports
2525
2626import Protolude
2727
28+import Control.Lens hiding ((&))
29+
2830import qualified Data.Map as Map
31+import qualified Language.PureScript as P
2932import Language.PureScript.Ide.Types
3033import Language.PureScript.Ide.Util
31−import qualified Language.PureScript as P
3234
3335-- | Contains the module with resolved reexports, and eventual failures
3436data ReexportResult a
3537 = ReexportResult
3638 { reResolved :: a
37− , reFailed :: [(P.ModuleName, P.DeclarationRef)]
39+ , reFailed :: [(P.ModuleName, P.DeclarationRef)]
3840 } deriving (Show, Eq, Functor)
3941
4042-- | Uses the passed formatter to format the resolved module, and adds eventual
@@ -79,7 +81,7 @@ resolveRef
7981 -> Either P.DeclarationRef [IdeDeclarationAnn]
8082resolveRef decls ref = case ref of
8183 P.TypeRef tn mdtors ->
82− case findRef (\case IdeType name _ -> name == tn; _ -> False) of
84+ case findRef (\x -> x ^? _IdeDeclType . ideTypeName <&> (== tn) & fromMaybe False) of
8385 Nothing -> Left ref
8486 Just d -> Right $ d : case mdtors of
8587 Nothing ->
@@ -89,28 +91,23 @@ resolveRef decls ref = case ref of
8991 findDtors tn
9092 Just dtors -> mapMaybe lookupDtor dtors
9193 P.ValueRef i ->
92− findWrapped (\case IdeValue i' _ -> i' == i; _ -> False)
93− P.TypeOpRef name ->
94− findWrapped (\case IdeTypeOperator n _ _ _ _ -> n == name; _ -> False)
94+ findWrapped (\x -> x ^? _IdeDeclValue . ideValueIdent <&> (== i) & fromMaybe False)
9595 P.ValueOpRef name ->
96− findWrapped (\case IdeValueOperator n _ _ _ _ -> n == name; _ -> False)
96+ findWrapped (\x -> x ^? _IdeDeclValueOperator . ideValueOpName <&> (== name) & fromMaybe False)
97+ P.TypeOpRef name ->
98+ findWrapped (\x -> x ^? _IdeDeclTypeOperator . ideTypeOpName <&> (== name) & fromMaybe False)
9799 P.TypeClassRef name ->
98− findWrapped (\case IdeTypeClass n -> n == name; _ -> False)
100+ findWrapped (\case IdeDeclTypeClass n -> n == name; _ -> False)
99101 _ ->
100102 Left ref
101103 where
102− findWrapped = wrapSingle . findRef
103− wrapSingle = maybe (Left ref) (Right . pure)
104+ findWrapped = maybe (Left ref) (Right . pure) . findRef
104105 findRef f = find (f . discardAnn) decls
105106
106107 lookupDtor name =
107− findRef (\case IdeDataConstructor name' _ _ -> name == name'
108− _ -> False)
108+ findRef (\x -> x ^? _IdeDeclDataConstructor . ideDtorName <&> (== name) & fromMaybe False)
109109
110110 findDtors tn = filter (f . discardAnn) decls
111111 where
112112 f :: IdeDeclaration -> Bool
113− f decl
114− | (IdeDataConstructor _ tn' _) <- decl
115− , tn == tn' = True
116− | otherwise = False
113+ f decl = decl ^? _IdeDeclDataConstructor . ideDtorTypeName <&> (== tn) & fromMaybe False
src/Language/PureScript/Ide/SourceFile.hs+5−5
@@ -12,7 +12,7 @@
1212-- Getting declarations from PureScript sourcefiles
1313-----------------------------------------------------------------------------
1414
15−{-# LANGUAGE OverloadedStrings #-}
15+{-# LANGUAGE OverloadedStrings #-}
1616
1717module Language.PureScript.Ide.SourceFile
1818 ( parseModule
@@ -25,12 +25,12 @@ module Language.PureScript.Ide.SourceFile
2525
2626import Protolude
2727
28−import qualified Data.Map as Map
29−import qualified Language.PureScript as P
28+import qualified Data.Map as Map
29+import qualified Language.PureScript as P
3030import Language.PureScript.Ide.Error
31−import Language.PureScript.Ide.Util
3231import Language.PureScript.Ide.Types
33−import System.IO.UTF8 (readUTF8File)
32+import Language.PureScript.Ide.Util
33+import System.IO.UTF8 (readUTF8File)
3434
3535parseModule
3636 :: (MonadIO m)
src/Language/PureScript/Ide/State.hs+37−45
@@ -32,20 +32,20 @@ module Language.PureScript.Ide.State
3232 , resolveOperatorsForModule
3333 ) where
3434
35−import Protolude
3635import qualified Prelude
36+import Protolude
3737
3838import Control.Concurrent.STM
39+import Control.Lens hiding (op, (&))
3940import "monad-logger" Control.Monad.Logger
40−import qualified Data.Map.Lazy as Map
41−import qualified Data.List as List
41+import qualified Data.Map.Lazy as Map
42+import qualified Language.PureScript as P
4243import Language.PureScript.Externs
4344import Language.PureScript.Ide.Externs
4445import Language.PureScript.Ide.Reexports
4546import Language.PureScript.Ide.SourceFile
4647import Language.PureScript.Ide.Types
4748import Language.PureScript.Ide.Util
48−import qualified Language.PureScript as P
4949import System.Clock
5050
5151-- | Resets all State inside psc-ide
@@ -235,47 +235,39 @@ resolveOperatorsForModule
235235 :: Map P.ModuleName [IdeDeclarationAnn]
236236 -> [IdeDeclarationAnn]
237237 -> [IdeDeclarationAnn]
238−resolveOperatorsForModule modules = map (mapIdeDeclaration resolveOperator)
238+resolveOperatorsForModule modules = map ((over idaDeclaration) resolveOperator)
239239 where
240− resolveOperator (IdeValueOperator
241− opName
242− i@(P.Qualified (Just moduleName)
243− (Left ident)) precedence assoc _) =
244− let t = do
245− sourceModule <- Map.lookup moduleName modules
246− IdeValue _ tP <-
247− List.find (\case
248− IdeValue iP _ -> iP == ident
249− _ -> False) (discardAnn <$> sourceModule)
250− pure tP
251−
252− in IdeValueOperator opName i precedence assoc t
253− resolveOperator (IdeValueOperator
254− opName
255− i@(P.Qualified (Just moduleName)
256− (Right ctor)) precedence assoc _) =
257− let t = do
258− sourceModule <- Map.lookup moduleName modules
259− IdeDataConstructor _ _ tP <-
260− List.find (\case
261− IdeDataConstructor cname _ _ -> ctor == cname
262− _ -> False) (discardAnn <$> sourceModule)
263− pure tP
264−
265− in IdeValueOperator opName i precedence assoc t
266− resolveOperator (IdeTypeOperator
267− opName
268− i@(P.Qualified (Just moduleName) properName) precedence assoc _) =
269− let k = do
270− sourceModule <- Map.lookup moduleName modules
271− IdeType _ kP <-
272− List.find (\case
273− IdeType name _ -> name == properName
274− _ -> False) (discardAnn <$> sourceModule)
275− pure kP
276−
277− in IdeTypeOperator opName i precedence assoc k
240+ hasName :: Eq b => Lens' a b -> b -> a -> Bool
241+ hasName l a x = x ^. l == a
242+
243+ getDeclarations :: P.ModuleName -> [IdeDeclaration]
244+ getDeclarations moduleName =
245+ Map.lookup moduleName modules
246+ & fromMaybe []
247+ & map discardAnn
248+
249+ resolveOperator (IdeDeclValueOperator op)
250+ | (P.Qualified (Just mn) (Left ident)) <- op ^. ideValueOpAlias =
251+ let t = getDeclarations mn
252+ & mapMaybe (preview _IdeDeclValue)
253+ & filter (hasName ideValueIdent ident)
254+ & map (view ideValueType)
255+ & listToMaybe
256+ in IdeDeclValueOperator (op & ideValueOpType .~ t)
257+ | (P.Qualified (Just mn) (Right dtor)) <- op ^. ideValueOpAlias =
258+ let t = getDeclarations mn
259+ & mapMaybe (preview _IdeDeclDataConstructor)
260+ & filter (hasName ideDtorName dtor)
261+ & map (view ideDtorType)
262+ & listToMaybe
263+ in IdeDeclValueOperator (op & ideValueOpType .~ t)
264+ resolveOperator (IdeDeclTypeOperator op)
265+ | P.Qualified (Just mn) properName <- op ^. ideTypeOpAlias =
266+ let k = getDeclarations mn
267+ & mapMaybe (preview _IdeDeclType)
268+ & filter (hasName ideTypeName properName)
269+ & map (view ideTypeKind)
270+ & listToMaybe
271+ in IdeDeclTypeOperator (op & ideTypeOpKind .~ k)
278272 resolveOperator x = x
279273
280−mapIdeDeclaration :: (IdeDeclaration -> IdeDeclaration) -> IdeDeclarationAnn -> IdeDeclarationAnn
281−mapIdeDeclaration f (IdeDeclarationAnn ann decl) = IdeDeclarationAnn ann (f decl)
src/Language/PureScript/Ide/Types.hs+72−21
@@ -12,42 +12,93 @@
1212-- Type definitions for psc-ide
1313-----------------------------------------------------------------------------
1414
15−{-# LANGUAGE OverloadedStrings #-}
1615{-# LANGUAGE DeriveFoldable #-}
16+{-# LANGUAGE OverloadedStrings #-}
17+{-# LANGUAGE TemplateHaskell #-}
1718
1819module Language.PureScript.Ide.Types where
1920
2021import Protolude
2122
2223import Control.Concurrent.STM
24+import Control.Lens.TH
2325import Data.Aeson
24−import qualified Data.Map.Lazy as M
25−import qualified Language.PureScript.Errors.JSON as P
26−import qualified Language.PureScript as P
26+import qualified Data.Map.Lazy as M
27+import qualified Language.PureScript as P
28+import qualified Language.PureScript.Errors.JSON as P
2729import Language.PureScript.Ide.Conversions
2830
2931type ModuleIdent = Text
3032
3133data IdeDeclaration
32− = IdeValue P.Ident P.Type
33− | IdeType (P.ProperName 'P.TypeName) P.Kind
34− | IdeTypeSynonym (P.ProperName 'P.TypeName) P.Type
35− | IdeDataConstructor (P.ProperName 'P.ConstructorName) (P.ProperName 'P.TypeName) P.Type
36− | IdeTypeClass (P.ProperName 'P.ClassName)
37− | IdeValueOperator (P.OpName 'P.ValueOpName) (P.Qualified (Either P.Ident (P.ProperName 'P.ConstructorName))) P.Precedence P.Associativity (Maybe P.Type)
38− | IdeTypeOperator (P.OpName 'P.TypeOpName) (P.Qualified (P.ProperName 'P.TypeName)) P.Precedence P.Associativity (Maybe P.Kind)
34+ = IdeDeclValue IdeValue
35+ | IdeDeclType IdeType
36+ | IdeDeclTypeSynonym IdeSynonym
37+ | IdeDeclDataConstructor IdeDataConstructor
38+ | IdeDeclTypeClass (P.ProperName 'P.ClassName)
39+ | IdeDeclValueOperator IdeValueOperator
40+ | IdeDeclTypeOperator IdeTypeOperator
3941 deriving (Show, Eq, Ord)
4042
41−data IdeDeclarationAnn = IdeDeclarationAnn Annotation IdeDeclaration
42− deriving (Show, Eq, Ord)
43+data IdeValue = IdeValue
44+ { _ideValueIdent :: P.Ident
45+ , _ideValueType :: P.Type
46+ } deriving (Show, Eq, Ord)
47+
48+data IdeType = IdeType
49+ { _ideTypeName :: P.ProperName 'P.TypeName
50+ , _ideTypeKind :: P.Kind
51+ } deriving (Show, Eq, Ord)
52+
53+data IdeSynonym = IdeSynonym
54+ { _ideSynonymName :: P.ProperName 'P.TypeName
55+ , _ideSynonymType :: P.Type
56+ } deriving (Show, Eq, Ord)
57+
58+data IdeDataConstructor = IdeDataConstructor
59+ { _ideDtorName :: P.ProperName 'P.ConstructorName
60+ , _ideDtorTypeName :: P.ProperName 'P.TypeName
61+ , _ideDtorType :: P.Type
62+ } deriving (Show, Eq, Ord)
63+
64+data IdeValueOperator = IdeValueOperator
65+ { _ideValueOpName :: P.OpName 'P.ValueOpName
66+ , _ideValueOpAlias :: P.Qualified (Either P.Ident (P.ProperName 'P.ConstructorName))
67+ , _ideValueOpPrecedence :: P.Precedence
68+ , _ideValueOpAssociativity :: P.Associativity
69+ , _ideValueOpType :: Maybe P.Type
70+ } deriving (Show, Eq, Ord)
71+
72+data IdeTypeOperator = IdeTypeOperator
73+ { _ideTypeOpName :: P.OpName 'P.TypeOpName
74+ , _ideTypeOpAlias :: P.Qualified (P.ProperName 'P.TypeName)
75+ , _ideTypeOpPrecedence :: P.Precedence
76+ , _ideTypeOpAssociativity :: P.Associativity
77+ , _ideTypeOpKind :: Maybe P.Kind
78+ } deriving (Show, Eq, Ord)
79+
80+makePrisms ''IdeDeclaration
81+makeLenses ''IdeValue
82+makeLenses ''IdeType
83+makeLenses ''IdeSynonym
84+makeLenses ''IdeDataConstructor
85+makeLenses ''IdeValueOperator
86+makeLenses ''IdeTypeOperator
87+
88+data IdeDeclarationAnn = IdeDeclarationAnn
89+ { _idaAnnotation :: Annotation
90+ , _idaDeclaration :: IdeDeclaration
91+ } deriving (Show, Eq, Ord)
4392
4493data Annotation
4594 = Annotation
46− { annLocation :: Maybe P.SourceSpan
47− , annExportedFrom :: Maybe P.ModuleName
95+ { annLocation :: Maybe P.SourceSpan
96+ , annExportedFrom :: Maybe P.ModuleName
4897 , annTypeAnnotation :: Maybe P.Type
4998 } deriving (Show, Eq, Ord)
5099
100+makeLenses ''IdeDeclarationAnn
101+
51102emptyAnn :: Annotation
52103emptyAnn = Annotation Nothing Nothing Nothing
53104
@@ -103,7 +154,7 @@ data Stage2 = Stage2
103154 }
104155
105156data Stage3 = Stage3
106− { s3Declarations :: M.Map P.ModuleName [IdeDeclarationAnn]
157+ { s3Declarations :: M.Map P.ModuleName [IdeDeclarationAnn]
107158 , s3CachedRebuild :: Maybe (P.ModuleName, P.ExternsFile)
108159 }
109160
@@ -112,11 +163,11 @@ newtype Match a = Match (P.ModuleName, a)
112163
113164-- | A completion as it gets sent to the editors
114165data Completion = Completion
115− { complModule :: Text
116− , complIdentifier :: Text
117− , complType :: Text
118− , complExpandedType :: Text
119− , complLocation :: Maybe P.SourceSpan
166+ { complModule :: Text
167+ , complIdentifier :: Text
168+ , complType :: Text
169+ , complExpandedType :: Text
170+ , complLocation :: Maybe P.SourceSpan
120171 , complDocumentation :: Maybe Text
121172 } deriving (Show, Eq)
122173
src/Language/PureScript/Ide/Util.hs+26−24
@@ -29,23 +29,25 @@ module Language.PureScript.Ide.Util
2929 , module Language.PureScript.Ide.Conversions
3030 ) where
3131
32−import Protolude hiding (decodeUtf8, encodeUtf8)
32+import Control.Lens ((^.))
3333import Data.Aeson
34−import qualified Data.Text as T
35−import Data.Text.Lazy.Encoding (decodeUtf8, encodeUtf8)
36−import qualified Language.PureScript as P
37−import Language.PureScript.Ide.Types
34+import qualified Data.Text as T
35+import Data.Text.Lazy.Encoding (decodeUtf8, encodeUtf8)
36+import qualified Language.PureScript as P
3837import Language.PureScript.Ide.Conversions
38+import Language.PureScript.Ide.Types
39+import Protolude hiding (decodeUtf8,
40+ encodeUtf8)
3941
4042identifierFromIdeDeclaration :: IdeDeclaration -> Text
4143identifierFromIdeDeclaration d = case d of
42− IdeValue name _ -> runIdentT name
43− IdeType name _ -> runProperNameT name
44− IdeTypeSynonym name _ -> runProperNameT name
45− IdeDataConstructor name _ _ -> runProperNameT name
46− IdeTypeClass name -> runProperNameT name
47− IdeValueOperator op _ _ _ _ -> runOpNameT op
48− IdeTypeOperator op _ _ _ _ -> runOpNameT op
44+ IdeDeclValue v -> v ^. ideValueIdent . identT
45+ IdeDeclType t -> t ^. ideTypeName . properNameT
46+ IdeDeclTypeSynonym s -> s ^. ideSynonymName . properNameT
47+ IdeDeclDataConstructor dtor -> dtor ^. ideDtorName . properNameT
48+ IdeDeclTypeClass name -> runProperNameT name
49+ IdeDeclValueOperator op -> op ^. ideValueOpName & runOpNameT
50+ IdeDeclTypeOperator op -> op ^. ideTypeOpName & runOpNameT
4951
5052discardAnn :: IdeDeclarationAnn -> IdeDeclaration
5153discardAnn (IdeDeclarationAnn _ d) = d
@@ -61,24 +63,24 @@ completionFromMatch (Match (m, IdeDeclarationAnn ann decl)) =
6163 Completion {..}
6264 where
6365 (complIdentifier, complExpandedType) = case decl of
64− IdeValue name type' -> (runIdentT name, prettyTypeT type')
65− IdeType name kind -> (runProperNameT name, toS (P.prettyPrintKind kind))
66− IdeTypeSynonym name kind -> (runProperNameT name, prettyTypeT kind)
67− IdeDataConstructor name _ type' -> (runProperNameT name, prettyTypeT type')
68− IdeTypeClass name -> (runProperNameT name, "class")
69− IdeValueOperator op ref precedence associativity typeP ->
70− (runOpNameT op, maybe (showFixity precedence associativity (valueOperatorAliasT ref) op) prettyTypeT typeP)
71− IdeTypeOperator op ref precedence associativity kind ->
66+ IdeDeclValue v -> (v ^. ideValueIdent . identT, v ^. ideValueType & prettyTypeT)
67+ IdeDeclType t -> (t ^. ideTypeName . properNameT, t ^. ideTypeKind & P.prettyPrintKind & toS )
68+ IdeDeclTypeSynonym s -> (s ^. ideSynonymName . properNameT, s ^. ideSynonymType & prettyTypeT)
69+ IdeDeclDataConstructor d -> (d ^. ideDtorName . properNameT, d ^. ideDtorType & prettyTypeT)
70+ IdeDeclTypeClass name -> (runProperNameT name, "class")
71+ IdeDeclValueOperator (IdeValueOperator op ref precedence associativity typeP) ->
72+ (runOpNameT op, maybe (showFixity precedence associativity (valueOperatorAliasT ref) op) prettyTypeT typeP)
73+ IdeDeclTypeOperator (IdeTypeOperator op ref precedence associativity kind) ->
7274 (runOpNameT op, maybe (showFixity precedence associativity (typeOperatorAliasT ref) op) (toS . P.prettyPrintKind) kind)
73−
75+
7476 complModule = runModuleNameT m
7577
7678 complType = maybe complExpandedType prettyTypeT (annTypeAnnotation ann)
77−
79+
7880 complLocation = annLocation ann
7981
8082 complDocumentation = Nothing
81−
83+
8284 showFixity p a r o =
8385 let asso = case a of
8486 P.Infix -> "infix"
@@ -95,7 +97,7 @@ typeOperatorAliasT
9597 :: P.Qualified (P.ProperName 'P.TypeName) -> Text
9698typeOperatorAliasT i =
9799 toS (P.showQualified P.runProperName i)
98−
100+
99101encodeT :: (ToJSON a) => a -> Text
100102encodeT = toS . decodeUtf8 . encode
101103
tests/Language/PureScript/Ide/FilterSpec.hs+1−1
@@ -9,7 +9,7 @@ import qualified Language.PureScript as P
99import Test.Hspec
1010
1111value :: Text -> IdeDeclarationAnn
12−value s = IdeDeclarationAnn emptyAnn (IdeValue (P.Ident (toS s)) P.REmpty)
12+value s = IdeDeclarationAnn emptyAnn (IdeDeclValue (IdeValue (P.Ident (toS s)) P.REmpty))
1313
1414moduleA, moduleB :: Module
1515moduleA = (P.moduleNameFromString "Module.A", [value "function1"])
tests/Language/PureScript/Ide/ImportsSpec.hs+3−3
@@ -68,11 +68,11 @@ spec = do
6868 describe "import commands" $ do
6969 let simpleFileImports = let (_, _, i, _) = splitSimpleFile in i
7070 addValueImport i mn is =
71− prettyPrintImportSection (addExplicitImport' (IdeValue (P.Ident i) wildcard) mn is)
71+ prettyPrintImportSection (addExplicitImport' (IdeDeclValue (IdeValue (P.Ident i) wildcard)) mn is)
7272 addOpImport op mn is =
73− prettyPrintImportSection (addExplicitImport' (IdeValueOperator op (P.Qualified Nothing (Left (P.Ident ""))) 2 P.Infix Nothing) mn is)
73+ prettyPrintImportSection (addExplicitImport' (IdeDeclValueOperator (IdeValueOperator op (P.Qualified Nothing (Left (P.Ident ""))) 2 P.Infix Nothing)) mn is)
7474 addDtorImport i t mn is =
75− prettyPrintImportSection (addExplicitImport' (IdeDataConstructor (P.ProperName i) t wildcard) mn is)
75+ prettyPrintImportSection (addExplicitImport' (IdeDeclDataConstructor (IdeDataConstructor (P.ProperName i) t wildcard)) mn is)
7676 it "adds an implicit unqualified import" $
7777 shouldBe
7878 (addImplicitImport' simpleFileImports (P.moduleNameFromString "Data.Map"))
tests/Language/PureScript/Ide/MatcherSpec.hs+1−1
@@ -13,7 +13,7 @@ import Language.PureScript.Ide.Util
1313import Test.Hspec
1414
1515value :: Text -> IdeDeclarationAnn
16−value s = withEmptyAnn (IdeValue (P.Ident (toS s)) P.REmpty)
16+value s = withEmptyAnn (IdeDeclValue (IdeValue (P.Ident (toS s)) P.REmpty))
1717
1818firstResult, secondResult, fiult :: Match IdeDeclarationAnn
1919firstResult = Match (P.moduleNameFromString "Match", value "firstResult")
tests/Language/PureScript/Ide/ReexportsSpec.hs+5−5
@@ -18,11 +18,11 @@ d :: IdeDeclaration -> IdeDeclarationAnn
1818d = IdeDeclarationAnn emptyAnn
1919
2020valueA, typeA, classA, dtorA1, dtorA2 :: IdeDeclarationAnn
21−valueA = d (IdeValue (P.Ident "valueA") P.REmpty)
22−typeA = d (IdeType (P.ProperName "TypeA") P.Star)
23−classA = d (IdeTypeClass (P.ProperName "ClassA"))
24−dtorA1 = d (IdeDataConstructor (P.ProperName "DtorA1") (P.ProperName "TypeA") P.REmpty)
25−dtorA2 = d (IdeDataConstructor (P.ProperName "DtorA2") (P.ProperName "TypeA") P.REmpty)
21+valueA = d (IdeDeclValue (IdeValue (P.Ident "valueA") P.REmpty))
22+typeA = d (IdeDeclType (IdeType(P.ProperName "TypeA") P.Star))
23+classA = d (IdeDeclTypeClass (P.ProperName "ClassA"))
24+dtorA1 = d (IdeDeclDataConstructor (IdeDataConstructor (P.ProperName "DtorA1") (P.ProperName "TypeA") P.REmpty))
25+dtorA2 = d (IdeDeclDataConstructor (IdeDataConstructor (P.ProperName "DtorA2") (P.ProperName "TypeA") P.REmpty))
2626
2727env :: Map P.ModuleName [IdeDeclarationAnn]
2828env = Map.fromList
tests/Language/PureScript/Ide/StateSpec.hs+6−6
@@ -11,20 +11,20 @@ import qualified Data.Map as Map
1111
1212valueOperator :: Maybe P.Type -> IdeDeclarationAnn
1313valueOperator =
14− d . IdeValueOperator (P.OpName "<$>") (P.Qualified (Just (mn "Test")) (Left (P.Ident "function"))) 2 P.Infix
14+ d . IdeDeclValueOperator . IdeValueOperator (P.OpName "<$>") (P.Qualified (Just (mn "Test")) (Left (P.Ident "function"))) 2 P.Infix
1515
1616ctorOperator :: Maybe P.Type -> IdeDeclarationAnn
1717ctorOperator =
18− d . IdeValueOperator (P.OpName ":") (P.Qualified (Just (mn "Test")) (Right (P.ProperName "Cons"))) 2 P.Infix
18+ d . IdeDeclValueOperator . IdeValueOperator (P.OpName ":") (P.Qualified (Just (mn "Test")) (Right (P.ProperName "Cons"))) 2 P.Infix
1919
2020typeOperator :: Maybe P.Kind -> IdeDeclarationAnn
2121typeOperator =
22− d . IdeTypeOperator (P.OpName ":") (P.Qualified (Just (mn "Test")) (P.ProperName "List")) 2 P.Infix
22+ d . IdeDeclTypeOperator . IdeTypeOperator (P.OpName ":") (P.Qualified (Just (mn "Test")) (P.ProperName "List")) 2 P.Infix
2323
2424testModule :: Module
25−testModule = (mn "Test", [ d (IdeValue (P.Ident "function") P.REmpty)
26− , d (IdeDataConstructor (P.ProperName "Cons") (P.ProperName "List") (P.REmpty))
27− , d (IdeType (P.ProperName "List") P.Star)
25+testModule = (mn "Test", [ d (IdeDeclValue (IdeValue (P.Ident "function") P.REmpty))
26+ , d (IdeDeclDataConstructor (IdeDataConstructor (P.ProperName "Cons") (P.ProperName "List") (P.REmpty)))
27+ , d (IdeDeclType (IdeType (P.ProperName "List") P.Star))
2828 , valueOperator Nothing
2929 , ctorOperator Nothing
3030 , typeOperator Nothing