|
3 | 3 | {-# LANGUAGE FlexibleInstances #-}
|
4 | 4 | {-# LANGUAGE RankNTypes #-}
|
5 | 5 | module Ide.Plugin.Literals where
|
6 |
| -import Data.Maybe (maybeToList) |
| 6 | +import Data.Maybe (fromMaybe, maybeToList) |
7 | 7 | import Data.Text (Text)
|
8 | 8 | import qualified Data.Text as T
|
9 | 9 | import Development.IDE.GHC.Compat
|
10 | 10 | import Development.IDE.GHC.Util (unsafePrintSDoc)
|
11 |
| -import Development.IDE.Graph.Classes (NFData) |
| 11 | +import Development.IDE.Graph.Classes (NFData (rnf)) |
12 | 12 | import qualified GHC.Generics as GHC
|
13 |
| -import Generics.SYB |
| 13 | +import Generics.SYB (Data, Typeable, cast, |
| 14 | + everything) |
14 | 15 |
|
15 | 16 | -- data type to capture what type of literal we are dealing with
|
16 | 17 | -- provides location and possibly source text (for OverLits) as well as it's value
|
17 | 18 | -- we currently don't have any use for PrimLiterals. They never have source text so we always drop them
|
18 |
| -data Literal = IntLiteral SrcSpan (Maybe Text) Integer |
19 |
| - | FracLiteral SrcSpan (Maybe Text) Rational |
20 |
| - | IntPrimLiteral SrcSpan (Maybe Text) Integer |
21 |
| - | FracPrimLiteral SrcSpan (Maybe Text) Rational |
| 19 | +data Literal = IntLiteral RealSrcSpan Text Integer |
| 20 | + | FracLiteral RealSrcSpan Text Rational |
22 | 21 | deriving (GHC.Generic, Show)
|
23 | 22 |
|
| 23 | +instance NFData RealSrcSpan where |
| 24 | + rnf x = x `seq` () |
| 25 | + |
24 | 26 | instance NFData Literal
|
25 | 27 |
|
26 |
| -getSrcText :: Literal -> Maybe Text |
| 28 | +getSrcText :: Literal -> Text |
27 | 29 | getSrcText = \case
|
28 |
| - IntLiteral _ txt _ -> txt |
29 |
| - FracLiteral _ txt _ -> txt |
30 |
| - IntPrimLiteral _ txt _ -> txt |
31 |
| - FracPrimLiteral _ txt _ -> txt |
| 30 | + IntLiteral _ txt _ -> txt |
| 31 | + FracLiteral _ txt _ -> txt |
32 | 32 |
|
33 |
| -getSrcSpan :: Literal -> SrcSpan |
| 33 | +getSrcSpan :: Literal -> RealSrcSpan |
34 | 34 | getSrcSpan = \case
|
35 |
| - IntLiteral ss _ _ -> ss |
36 |
| - FracLiteral ss _ _ -> ss |
37 |
| - IntPrimLiteral ss _ _ -> ss |
38 |
| - FracPrimLiteral ss _ _ -> ss |
39 |
| - |
| 35 | + IntLiteral ss _ _ -> ss |
| 36 | + FracLiteral ss _ _ -> ss |
40 | 37 |
|
41 | 38 | -- | Find all literals in a Parsed Source File
|
42 | 39 | collectLiterals :: (Data ast, Typeable ast) => ast -> [Literal]
|
@@ -74,37 +71,42 @@ traverseExpr sSpan = \case
|
74 | 71 | expr -> collectLiterals expr
|
75 | 72 |
|
76 | 73 | getLiteralAsList :: SrcSpan -> HsLit GhcPs -> [Literal]
|
77 |
| -getLiteralAsList sSpan = maybeToList . getLiteral sSpan |
| 74 | +getLiteralAsList sSpan lit = case sSpan of |
| 75 | + RealSrcSpan rss _ -> getLiteralAsList' lit rss |
| 76 | + _ -> [] |
| 77 | + |
| 78 | +getLiteralAsList' :: HsLit GhcPs -> RealSrcSpan -> [Literal] |
| 79 | +getLiteralAsList' lit = maybeToList . flip getLiteral lit |
78 | 80 |
|
79 | 81 | -- Translate from Hs Type to our Literal type
|
80 |
| -getLiteral :: SrcSpan -> HsLit GhcPs -> Maybe Literal |
| 82 | +getLiteral :: RealSrcSpan -> HsLit GhcPs -> Maybe Literal |
81 | 83 | getLiteral sSpan = \case
|
82 |
| - HsInt _ val -> Just $ fromIntegralLit sSpan val |
83 |
| - HsIntPrim _ val -> Just $ IntPrimLiteral sSpan Nothing val |
84 |
| - HsWordPrim _ val -> Just $ IntPrimLiteral sSpan Nothing val |
85 |
| - HsInt64Prim _ val -> Just $ IntPrimLiteral sSpan Nothing val |
86 |
| - HsWord64Prim _ val -> Just $ IntPrimLiteral sSpan Nothing val |
87 |
| - HsInteger _ val _ -> Just $ IntLiteral sSpan Nothing val |
88 |
| - HsRat _ val _ -> Just $ fromFractionalLit sSpan val |
89 |
| - HsFloatPrim _ (FL _ _ val) -> Just $ FracPrimLiteral sSpan Nothing val |
90 |
| - HsDoublePrim _ (FL _ _ val) -> Just $ FracPrimLiteral sSpan Nothing val |
91 |
| - _ -> Nothing |
| 84 | + HsInt _ val -> fromIntegralLit sSpan val |
| 85 | +-- Ignore this case for now |
| 86 | +-- HsInteger _ val _ -> Just $ IntLiteral sSpan Nothing val |
| 87 | + HsRat _ val _ -> fromFractionalLit sSpan val |
| 88 | + _ -> Nothing |
92 | 89 |
|
93 | 90 | getOverLiteralAsList :: SrcSpan -> HsOverLit GhcPs -> [Literal]
|
94 |
| -getOverLiteralAsList sSpan = maybeToList . getOverLiteral sSpan |
| 91 | +getOverLiteralAsList sSpan lit = case sSpan of |
| 92 | + RealSrcSpan rss _ -> getOverLiteralAsList' lit rss |
| 93 | + _ -> [] |
| 94 | + |
| 95 | +getOverLiteralAsList' :: HsOverLit GhcPs -> RealSrcSpan -> [Literal] |
| 96 | +getOverLiteralAsList' lit = maybeToList . flip getOverLiteral lit |
95 | 97 |
|
96 |
| -getOverLiteral :: SrcSpan -> HsOverLit GhcPs -> Maybe Literal |
| 98 | +getOverLiteral :: RealSrcSpan -> HsOverLit GhcPs -> Maybe Literal |
97 | 99 | getOverLiteral sSpan OverLit{..} = case ol_val of
|
98 |
| - HsIntegral il -> Just $ fromIntegralLit sSpan il |
99 |
| - HsFractional fl -> Just $ fromFractionalLit sSpan fl |
| 100 | + HsIntegral il -> fromIntegralLit sSpan il |
| 101 | + HsFractional fl -> fromFractionalLit sSpan fl |
100 | 102 | _ -> Nothing
|
101 | 103 | getOverLiteral _ _ = Nothing
|
102 | 104 |
|
103 |
| -fromIntegralLit :: SrcSpan -> IntegralLit -> Literal |
104 |
| -fromIntegralLit s (IL txt _ val) = IntLiteral s (fromSourceText txt) val |
| 105 | +fromIntegralLit :: RealSrcSpan -> IntegralLit -> Maybe Literal |
| 106 | +fromIntegralLit s (IL txt _ val) = fmap (\txt' -> IntLiteral s txt' val) (fromSourceText txt) |
105 | 107 |
|
106 |
| -fromFractionalLit :: SrcSpan -> FractionalLit -> Literal |
107 |
| -fromFractionalLit s (FL txt _ val) = FracLiteral s (fromSourceText txt) val |
| 108 | +fromFractionalLit :: RealSrcSpan -> FractionalLit -> Maybe Literal |
| 109 | +fromFractionalLit s (FL txt _ val) = fmap (\txt' -> FracLiteral s txt' val) (fromSourceText txt) |
108 | 110 |
|
109 | 111 | fromSourceText :: SourceText -> Maybe Text
|
110 | 112 | fromSourceText = \case
|
|
0 commit comments