11module Language.Astview.Languages.HaskellCore (haskellCore ) where
22import Prelude hiding (span )
3- import Data.Generics (Data ,extQ )
3+
4+ import Data.Tree (Tree (Node ))
5+ import Data.Generics (Data ,Typeable ,extQ ,ext1Q ,gmapQ ,showConstr ,toConstr ,typeOf )
46import Data.Generics.Zipper (toZipper ,down' ,query )
57
68import Language.Astview.Language hiding (parse )
7- import Language.Astview.DataTree (dataToAstIgnoreByExample )
9+ import Language.Astview.DataTree (manual )
810
911import Parser
1012import Lexer hiding (getDynFlags , getSrcLoc , buffer )
1113import qualified DynFlags as GHC
1214import Outputable
13- import qualified SrcLoc
1415import FastString
1516import StringBuffer
1617import qualified GHC
18+ import qualified SrcLoc as GHC
19+ import qualified Outputable as GHC
20+ import qualified RdrName as GHC
21+ import qualified OccName as GHC
1722
1823import GHC.Paths (libdir )
1924
@@ -25,34 +30,33 @@ haskellCore = Language "HaskellCore" "Haskell" [".hs"] parsehs
2530parsehs :: String -> Either Error Ast
2631parsehs s =
2732 case runParser s parseModule of
28- POk _ parsed -> Right (dataToAstIgnoreByExample getSrcLoc ( undefined :: SrcSpan ) parsed)
33+ POk _ parsed -> Right (coreToAst parsed)
2934 PFailed ss msg -> Left $ makeError ss (showSDocUnsafe msg)
3035
31- makeError :: SrcLoc . SrcSpan -> String -> Error
36+ makeError :: GHC . SrcSpan -> String -> Error
3237makeError ss s =
3338 case ss of
34- SrcLoc . RealSrcSpan real -> ErrLocation (ghcss2ss real) s
39+ GHC . RealSrcSpan real -> ErrLocation (ghcss2ss real) s
3540 _ -> ErrMessage s
3641
3742
38- ghcss2ss :: SrcLoc . RealSrcSpan -> SrcSpan
43+ ghcss2ss :: GHC . RealSrcSpan -> SrcSpan
3944ghcss2ss real
40- = let start = SrcLoc . realSrcSpanStart real
41- end = SrcLoc . realSrcSpanEnd real
42- in span (SrcLoc . srcLocLine start)
43- (SrcLoc . srcLocCol start)
44- (SrcLoc . srcLocLine end)
45- (SrcLoc . srcLocCol end)
45+ = let start = GHC . realSrcSpanStart real
46+ end = GHC . realSrcSpanEnd real
47+ in span (GHC . srcLocLine start)
48+ (GHC . srcLocCol start)
49+ (GHC . srcLocLine end)
50+ (GHC . srcLocCol end)
4651
4752runParser :: String -> P a -> ParseResult a
4853runParser str parser = unP parser parseState
4954 where
5055 filename = " <interactive>"
51- location = SrcLoc . mkRealSrcLoc (mkFastString filename) 1 1
56+ location = GHC . mkRealSrcLoc (mkFastString filename) 1 1
5257 buffer = stringToStringBuffer str
5358 parseState = mkPState (unsafePerformIO getDynFlags) buffer location
5459
55-
5660getDynFlags :: IO GHC. DynFlags
5761getDynFlags =
5862 GHC. defaultErrorHandler GHC. defaultFatalMessager GHC. defaultFlushOut $
@@ -67,3 +71,51 @@ getSrcLoc t = down' (toZipper t) >>= query (def `extQ` atSpan) where
6771 atSpan :: GHC. SrcSpan -> Maybe SrcSpan
6872 atSpan (GHC. RealSrcSpan ss) = Just $ ghcss2ss ss
6973 atSpan _ = Nothing
74+
75+ -- * typed ast to untyped ast
76+
77+ coreToAst :: (Data t ,Typeable t ) => t -> Ast
78+ coreToAst = manual worker where
79+ worker :: (Data t ,Typeable t ) => t -> Tree (Maybe AstNode )
80+ worker term
81+ | term `equalTypes` (undefined :: GHC. SrcSpan ) = Node Nothing []
82+ | otherwise = (gdefault `ext1Q` atL `extQ` atRdrName `extQ` atOccName `extQ` atString) term where
83+
84+ atString :: String -> Tree (Maybe AstNode )
85+ atString s = Node (Just $ AstNode s Nothing [] Identificator ) []
86+
87+ atRdrName :: GHC. RdrName -> Tree (Maybe AstNode )
88+ atRdrName rdr = Node (Just $ AstNode (rdrName2String rdr) (getSrcLoc rdr) [] Identificator ) []
89+
90+ atOccName :: GHC. OccName -> Tree (Maybe AstNode )
91+ atOccName o = Node (Just $ AstNode (GHC. occNameString o) (getSrcLoc o) [] Identificator ) []
92+
93+ atL :: (Typeable t , Data t ) => GHC. GenLocated GHC. SrcSpan t -> Tree (Maybe AstNode )
94+ atL (GHC. L _ a) = worker a
95+
96+ gdefault :: (Typeable t ,Data t ) => t -> Tree (Maybe AstNode )
97+ gdefault x = Node (Just n) cs where
98+
99+ n :: AstNode
100+ n = AstNode (showConstr $ toConstr x) (getSrcLoc x) [] Operation
101+
102+ cs = gmapQ worker x
103+
104+ rdrName2String :: GHC. RdrName -> String
105+ rdrName2String r =
106+ case GHC. isExact_maybe r of
107+ Just n -> showGhc n
108+ Nothing ->
109+ case r of
110+ GHC. Unqual _occ -> GHC. occNameString $ GHC. rdrNameOcc r
111+ GHC. Qual modname _occ -> GHC. moduleNameString modname ++ " ."
112+ ++ GHC. occNameString (GHC. rdrNameOcc r)
113+ GHC. Orig _ _ -> error " GHC.Orig introduced after renaming"
114+ GHC. Exact _ -> error " GHC.Exact introduced after renaming"
115+
116+ showGhc :: (GHC. Outputable a ) => a -> String
117+ showGhc = GHC. showPpr GHC. unsafeGlobalDynFlags
118+
119+ -- | returns whether both values are of the same type
120+ equalTypes :: (Typeable b1 ,Typeable b2 ) => b1 -> b2 -> Bool
121+ equalTypes t1 t2 = typeOf t1 == typeOf t2
0 commit comments