Delete leftover NotCPP file
This commit is contained in:
parent
d16e0ade07
commit
07dcabdbb3
@ -1,188 +0,0 @@
|
|||||||
-- ghc-mod: Happy Haskell Hacking
|
|
||||||
-- Copyright (C) 2015 Daniel Gröber <dxld ÄT darkboxed DOT org>
|
|
||||||
--
|
|
||||||
-- This program is free software: you can redistribute it and/or modify
|
|
||||||
-- it under the terms of the GNU Affero General Public License as published by
|
|
||||||
-- the Free Software Foundation, either version 3 of the License, or
|
|
||||||
-- (at your option) any later version.
|
|
||||||
--
|
|
||||||
-- This program is distributed in the hope that it will be useful,
|
|
||||||
-- but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
-- GNU Affero General Public License for more details.
|
|
||||||
--
|
|
||||||
-- You should have received a copy of the GNU Affero General Public License
|
|
||||||
-- along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
|
|
||||||
{-# OPTIONS_GHC -fno-warn-unused-imports #-}
|
|
||||||
{-# LANGUAGE CPP #-}
|
|
||||||
-- Using CPP so you don't have to :)
|
|
||||||
module NotCPP.Declarations where
|
|
||||||
|
|
||||||
import Control.Arrow
|
|
||||||
import Control.Applicative
|
|
||||||
import Data.Maybe
|
|
||||||
import Language.Haskell.TH.Syntax
|
|
||||||
|
|
||||||
import NotCPP.LookupValueName
|
|
||||||
|
|
||||||
nT :: Monad m => String -> m Type
|
|
||||||
cT :: Monad m => String -> m Type
|
|
||||||
nE :: Monad m => String -> m Exp
|
|
||||||
nP :: Monad m => String -> m Pat
|
|
||||||
|
|
||||||
nT str = return $ VarT (mkName str)
|
|
||||||
cT str = return $ ConT (mkName str)
|
|
||||||
nE str = return $ VarE (mkName str)
|
|
||||||
nP str = return $ VarP (mkName str)
|
|
||||||
recUpdE' :: Q Exp -> Name -> Exp -> Q Exp
|
|
||||||
recUpdE' ex name assign = do
|
|
||||||
RecUpdE <$> ex <*> pure [(name, assign)]
|
|
||||||
|
|
||||||
lookupName' :: (NameSpace, String) -> Q (Maybe Name)
|
|
||||||
lookupName' (VarName, n) = lookupValueName n
|
|
||||||
lookupName' (DataName, n) = lookupValueName n
|
|
||||||
lookupName' (TcClsName, n) = lookupTypeName n
|
|
||||||
|
|
||||||
-- Does this even make sense?
|
|
||||||
ifelseD :: Q [Dec] -> Q [Dec] -> Q [Dec]
|
|
||||||
ifelseD if_decls' else_decls = do
|
|
||||||
if_decls <- if_decls'
|
|
||||||
alreadyDefined <- definedNames (boundNames `concatMap` if_decls)
|
|
||||||
case alreadyDefined of
|
|
||||||
[] -> if_decls'
|
|
||||||
_ -> else_decls
|
|
||||||
|
|
||||||
ifdefelseD, ifelsedefD :: String -> Q [Dec] -> Q [Dec] -> Q [Dec]
|
|
||||||
ifelsedefD = ifdefelseD
|
|
||||||
ifdefelseD ident if_decls else_decls = do
|
|
||||||
exists <- isJust <$> lookupValueName ident
|
|
||||||
if exists
|
|
||||||
then if_decls
|
|
||||||
else else_decls
|
|
||||||
|
|
||||||
ifdefD :: String -> Q [Dec] -> Q [Dec]
|
|
||||||
ifdefD ident decls = ifdefelseD ident decls (return [])
|
|
||||||
|
|
||||||
ifndefD :: String -> Q [Dec] -> Q [Dec]
|
|
||||||
ifndefD ident decls = ifdefelseD ident (return []) decls
|
|
||||||
|
|
||||||
-- | Each of the given declarations is only spliced if the identifier it defines
|
|
||||||
-- is not defined yet.
|
|
||||||
--
|
|
||||||
-- For example:
|
|
||||||
--
|
|
||||||
-- @$(ifD [[d| someFunctionThatShouldExist x = x+1 |]]@
|
|
||||||
--
|
|
||||||
-- If @someFunctionThatShouldExist@ doesn't actually exist the definition given
|
|
||||||
-- in the splice will be the result of the splice otherwise nothing will be
|
|
||||||
-- spliced.
|
|
||||||
--
|
|
||||||
-- Currently this only works for function declarations but it can be easily
|
|
||||||
-- extended to other kinds of declarations.
|
|
||||||
ifD :: Q [Dec] -> Q [Dec]
|
|
||||||
ifD decls' = do
|
|
||||||
decls <- decls'
|
|
||||||
concat <$> flip mapM decls (\decl -> do
|
|
||||||
alreadyDefined <- definedNames (boundNames decl)
|
|
||||||
case alreadyDefined of
|
|
||||||
[] -> return [decl]
|
|
||||||
_ -> return [])
|
|
||||||
|
|
||||||
definedNames :: [(NameSpace, Name)] -> Q [Name]
|
|
||||||
definedNames ns = catMaybes <$> (lookupName' . second nameBase) `mapM` ns
|
|
||||||
|
|
||||||
boundNames :: Dec -> [(NameSpace, Name)]
|
|
||||||
boundNames decl =
|
|
||||||
case decl of
|
|
||||||
SigD n _ -> [(VarName, n)]
|
|
||||||
FunD n _cls -> [(VarName, n)]
|
|
||||||
#if __GLASGOW_HASKELL__ >= 706
|
|
||||||
InfixD _ n -> [(VarName, n)]
|
|
||||||
#endif
|
|
||||||
ValD p _ _ -> map ((,) VarName) $ patNames p
|
|
||||||
|
|
||||||
TySynD n _ _ -> [(TcClsName, n)]
|
|
||||||
ClassD _ n _ _ _ -> [(TcClsName, n)]
|
|
||||||
|
|
||||||
#if __GLASGOW_HASKELL__ >= 800
|
|
||||||
DataD _ n _ _ ctors _ ->
|
|
||||||
#else
|
|
||||||
DataD _ n _ ctors _ ->
|
|
||||||
#endif
|
|
||||||
[(TcClsName, n)] ++ map ((,) TcClsName) (conNames `concatMap` ctors)
|
|
||||||
|
|
||||||
#if __GLASGOW_HASKELL__ >= 800
|
|
||||||
NewtypeD _ n _ _ ctor _ ->
|
|
||||||
#else
|
|
||||||
NewtypeD _ n _ ctor _ ->
|
|
||||||
#endif
|
|
||||||
[(TcClsName, n)] ++ map ((,) TcClsName) (conNames ctor)
|
|
||||||
|
|
||||||
#if __GLASGOW_HASKELL__ >= 800
|
|
||||||
DataInstD _ _n _ _ ctors _ ->
|
|
||||||
#else
|
|
||||||
DataInstD _ _n _ ctors _ ->
|
|
||||||
#endif
|
|
||||||
map ((,) TcClsName) (conNames `concatMap` ctors)
|
|
||||||
|
|
||||||
#if __GLASGOW_HASKELL__ >= 800
|
|
||||||
NewtypeInstD _ _n _ _ ctor _ ->
|
|
||||||
#else
|
|
||||||
NewtypeInstD _ _n _ ctor _ ->
|
|
||||||
#endif
|
|
||||||
map ((,) TcClsName) (conNames ctor)
|
|
||||||
|
|
||||||
InstanceD {} -> -- _ _ty _
|
|
||||||
error "notcpp: Instance declarations are not supported yet"
|
|
||||||
ForeignD _ ->
|
|
||||||
error "notcpp: Foreign declarations are not supported yet"
|
|
||||||
PragmaD _pragma -> error "notcpp: pragmas are not supported yet"
|
|
||||||
|
|
||||||
#if __GLASGOW_HASKELL__ >= 708
|
|
||||||
TySynInstD _n _ -> error "notcpp: TySynInstD not supported yet"
|
|
||||||
#else
|
|
||||||
TySynInstD _n _ _ -> error "notcpp: TySynInstD not supported yet"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if __GLASGOW_HASKELL__ >= 708
|
|
||||||
RoleAnnotD _n _ -> error "notcpp: RoleAnnotD not supported yet"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if __GLASGOW_HASKELL__ >= 704 && __GLASGOW_HASKELL__ < 800
|
|
||||||
FamilyD _ n _ _ -> [(TcClsName, n)]
|
|
||||||
#elif __GLASGOW_HASKELL__ >= 708 && __GLASGOW_HASKELL__ < 800
|
|
||||||
ClosedTypeFamilyD n _ _ _ -> [(TcClsName, n)]
|
|
||||||
#else
|
|
||||||
OpenTypeFamilyD (TypeFamilyHead n _ _ _) -> [(TcClsName, n)]
|
|
||||||
ClosedTypeFamilyD (TypeFamilyHead n _ _ _) _ -> [(TcClsName, n)]
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
conNames :: Con -> [Name]
|
|
||||||
conNames con =
|
|
||||||
case con of
|
|
||||||
NormalC n _ -> [n]
|
|
||||||
RecC n _ -> [n]
|
|
||||||
InfixC _ n _ -> [n]
|
|
||||||
ForallC _ _ c -> conNames c
|
|
||||||
|
|
||||||
patNames :: Pat -> [Name]
|
|
||||||
patNames p'' =
|
|
||||||
case p'' of
|
|
||||||
LitP _ -> []
|
|
||||||
VarP n -> [n]
|
|
||||||
TupP ps -> patNames `concatMap` ps
|
|
||||||
UnboxedTupP ps -> patNames `concatMap` ps
|
|
||||||
ConP _ ps -> patNames `concatMap` ps
|
|
||||||
InfixP p _ p' -> patNames `concatMap` [p,p']
|
|
||||||
UInfixP p _ p' -> patNames `concatMap` [p,p']
|
|
||||||
ParensP p -> patNames p
|
|
||||||
TildeP p -> patNames p
|
|
||||||
BangP p -> patNames p
|
|
||||||
AsP n p -> n:(patNames p)
|
|
||||||
WildP -> []
|
|
||||||
RecP _ fps -> patNames `concatMap` map snd fps
|
|
||||||
ListP ps -> patNames `concatMap` ps
|
|
||||||
SigP p _ -> patNames p
|
|
||||||
ViewP _ p -> patNames p
|
|
Loading…
Reference in New Issue
Block a user