@@ -15,6 +15,7 @@ module Ide.Plugin.Eval.GHC (
15
15
) where
16
16
17
17
import Data.List (isPrefixOf )
18
+ import Data.Maybe (mapMaybe )
18
19
import Development.IDE.GHC.Compat
19
20
import qualified EnumSet
20
21
import GHC.LanguageExtensions.Type (Extension (.. ))
@@ -39,9 +40,9 @@ import StringBuffer (stringToStringBuffer)
39
40
{- $setup
40
41
>>> import GHC
41
42
>>> import GHC.Paths
42
- >>> run act = runGhc (Just libdir) (getSessionDynFlags >>= act)
43
+ >>> run act = runGhc (Just libdir) (getInteractiveDynFlags >>= act)
43
44
>>> libdir
44
- "/Users/titto/.stack/programs/x86_64-osx/ ghc-8.10.2 /lib/ghc-8.10.2 "
45
+ "/Users/titto/.ghcup/ ghc/8.8.4 /lib/ghc-8.8.4 "
45
46
-}
46
47
47
48
{- | Returns true if string is an expression
@@ -82,38 +83,61 @@ Right True
82
83
>>> hasPackageTst "ghc"
83
84
Right True
84
85
86
+ >>> hasPackageTst "extra"
87
+ Left "<command line>: cannot satisfy -package extra\n (use -v for more information)"
88
+
85
89
>>> hasPackageTst "QuickCheck"
86
90
Left "<command line>: cannot satisfy -package QuickCheck\n (use -v for more information)"
87
91
-}
88
92
hasPackage :: DynFlags -> String -> Bool
89
- hasPackage df name =
90
- any
93
+ hasPackage df = hasPackage_ (packageFlags df)
94
+
95
+ hasPackage_ :: [PackageFlag ] -> [Char ] -> Bool
96
+ hasPackage_ pkgFlags name = any (name `isPrefixOf` ) (pkgNames_ pkgFlags)
97
+
98
+ {- |
99
+ >>> run (return . pkgNames)
100
+ []
101
+ -}
102
+ pkgNames :: DynFlags -> [String ]
103
+ pkgNames = pkgNames_ . packageFlags
104
+
105
+ pkgNames_ :: [PackageFlag ] -> [String ]
106
+ pkgNames_ =
107
+ mapMaybe
91
108
( \ case
92
- ExposePackage _ (PackageArg n) _ | name `isPrefixOf` n -> True
93
- ExposePackage _ (UnitIdArg (DefiniteUnitId ( DefUnitId ( InstalledUnitId n)))) _ | name `isPrefixOf` asS n -> True
94
- _ -> False
109
+ ExposePackage _ (PackageArg n) _ -> Just n
110
+ ExposePackage _ (UnitIdArg (DefiniteUnitId n)) _ -> Just $ asS n
111
+ _ -> Nothing
95
112
)
96
- $ packageFlags df
97
113
98
- {- | Expose a list of packages
114
+ {- | Expose a list of packages.
99
115
>>> addPackagesTest pkgs = run (\_ -> (packageFlags <$>) <$> addPackages pkgs)
100
116
101
117
>>> addPackagesTest []
102
118
Right []
103
119
104
- >>> addPackagesTest ["base","array"]
120
+ >>> addPackagesTest ["base","base"," array"]
105
121
Right [-package base{package base True ([])},-package array{package array True ([])}]
106
122
123
+ >>> addPackagesTest ["Cabal"]
124
+ Right [-package Cabal{package Cabal True ([])}]
125
+
107
126
>>> addPackagesTest ["QuickCheck"]
108
127
Left "<command line>: cannot satisfy -package QuickCheck\n (use -v for more information)"
109
128
110
- >>> addPackagesTest ["notThere"]
129
+ >>> addPackagesTest ["base"," notThere"]
111
130
Left "<command line>: cannot satisfy -package notThere\n (use -v for more information)"
131
+
132
+ prop> \(x::Int) -> x + x == 2 * x
133
+ +++ OK, passed 100 tests.
112
134
-}
113
135
addPackages :: [String ] -> Ghc (Either String DynFlags )
114
- addPackages pkgNames = gStrictTry $ modifyFlags (\ df -> df{packageFlags = map expose pkgNames ++ packageFlags df})
136
+ addPackages pkgNames = gStrictTry $
137
+ modifyFlags $ \ df ->
138
+ df{packageFlags = foldr (\ pkgName pf -> if hasPackage_ pf pkgName then pf else expose pkgName : pf) (packageFlags df) pkgNames}
115
139
where
116
- expose name = ExposePackage (" -package " ++ name) (PackageArg name) (ModRenaming True [] ) -- -package-id filepath-1.4.2.1
140
+ expose name = ExposePackage (" -package " ++ name) (PackageArg name) (ModRenaming True [] )
117
141
118
142
modifyFlags :: GhcMonad m => (DynFlags -> DynFlags ) -> m DynFlags
119
143
modifyFlags f = do
@@ -168,11 +192,12 @@ showDynFlags df =
168
192
[ (" extensions" , ppr . extensions $ df)
169
193
, (" extensionFlags" , ppr . EnumSet. toList . extensionFlags $ df)
170
194
, (" importPaths" , vList $ importPaths df)
171
- -- , ("includePaths", text . show $ includePaths df)
172
- -- , ("packageEnv", ppr $ packageEnv df)
173
- -- , ("packageFlags", vcat . map ppr $ packageFlags df)
195
+ , -- , ("includePaths", text . show $ includePaths df)
196
+ -- ("packageEnv", ppr $ packageEnv df)
197
+ (" pkgNames" , vcat . map text $ pkgNames df)
198
+ , (" packageFlags" , vcat . map ppr $ packageFlags df)
174
199
-- ,("pkgDatabase",(map) (ppr . installedPackageId) . pkgDatabase $ df)
175
- -- , ("pkgDatabase",text . show <$> pkgDatabase $ df)
200
+ -- ("pkgDatabase", text . show <$> pkgDatabase $ df)
176
201
]
177
202
178
203
vList :: [String ] -> SDoc
0 commit comments