on master help sign in
Dissolve AST.Literal, be explicit in Source, Canonical, patterns, etc.

This revealed that it is pretty silly to allow floats in pattern matches. They had that only because the code wanted to share the parser, and no design thinking went into it past that. Nice find!

commit232f7dc3f031065db099cd29513eedb99ce096de authorEvan Czaplicki <evancz@users.noreply.github.com> dateWed 8 Nov 2017, 16:15 (9 years ago) parent7c09ac2
5 files changed+65−108
src/AST/Expression/Canonical.hs+14−9 src/AST/Expression/Source.hs+9−4 src/AST/Expression/Valid.hs+6−3 src/AST/Literal.hs−92 src/AST/Shader.hs+36
src/AST/Expression/Canonical.hs+14−9
@@ -33,9 +33,10 @@ import qualified Data.Map as Map
3333import Data.Text (Text)
3434
3535import qualified AST.Binop as Binop
36−import qualified AST.Literal as Literal
3736import qualified AST.Module.Name as ModuleName
37+import qualified AST.Shader as Shader
3838import qualified AST.Type as Type
39+import qualified Data.Index as Index
3940import qualified Elm.Name as N
4041import Elm.Name (Name)
4142import qualified Reporting.Annotation as A
@@ -56,7 +57,10 @@ data Expr_
5657 | VarKernel Name Name
5758 | VarForeign ModuleName.Canonical Name
5859 | VarOperator Name ModuleName.Canonical Name
59− | Literal Literal.Literal
60+ | Chr Text
61+ | Str Text
62+ | Int Int
63+ | Float Double
6064 | List [Expr]
6165 | Negate Expr
6266 | Binop Name ModuleName.Canonical Name Expr Expr
@@ -67,14 +71,13 @@ data Expr_
6771 | LetRec [Def] Expr
6872 | LetDestruct Match Expr Expr
6973 | Case Expr [(Match, Expr)]
70− | CtorAccess Expr Int
7174 | Accessor Name
7275 | Access Expr Name
7376 | Update Expr (Map.Map Name Expr)
7477 | Record (Map.Map Name Expr)
7578 | Unit
7679 | Tuple Expr Expr (Maybe Expr)
77− | GLShader Name Name Literal.Shader
80+ | Shader Name Name Shader.Shader
7881
7982
8083
@@ -95,7 +98,7 @@ data Def =
9598
9699
97100data Args = Args [Arg] Destructors
98−data Arg = Arg Int Pattern
101+data Arg = Arg Index.ZeroBased Pattern
99102
100103data Match = Match Pattern Destructors
101104
@@ -111,22 +114,24 @@ data Pattern_
111114 | PTuple Pattern Pattern (Maybe Pattern)
112115 | PList [Pattern]
113116 | PCons Pattern Pattern
114− | PLiteral Literal.Literal
117+ | PChr Text
118+ | PStr Text
119+ | PInt Int
115120 | PCtor
116121 { _p_home :: ModuleName.Canonical
117122 , _p_type :: N.Name
118123 , _p_vars :: [N.Name]
119124 , _p_name :: N.Name
120− , _p_args :: [(Int, Type.Canonical, Pattern)] -- zero indexed
125+ , _p_args :: [(Index.ZeroBased, Type.Canonical, Pattern)]
121126 }
122127
123128
124129type Destructors = Map.Map N.Name (A.Located Destructor)
125130
126131data Destructor
127− = DIndex Int Destructor
132+ = DIndex Index.ZeroBased Destructor
128133 | DField N.Name Destructor
129− | DRoot Int
134+ | DRoot Index.ZeroBased
130135
131136
132137
src/AST/Expression/Source.hs+9−4
@@ -21,7 +21,7 @@ import qualified Data.ByteString as B
2121import Data.Text (Text)
2222
2323import qualified AST.Binop as Binop
24−import qualified AST.Literal as Literal
24+import qualified AST.Shader as Shader
2525import qualified AST.Type as Type
2626import qualified Elm.Name as N
2727import qualified Reporting.Annotation as A
@@ -36,7 +36,10 @@ type Expr = A.Located Expr_
3636
3737
3838data Expr_
39− = Literal Literal.Literal
39+ = Chr Text
40+ | Str Text
41+ | Int Int
42+ | Float Double
4043 | Var (Maybe N.Name) N.Name
4144 | List [Expr]
4245 | Op N.Name
@@ -53,7 +56,7 @@ data Expr_
5356 | Record [(A.Located N.Name, Expr)]
5457 | Unit
5558 | Tuple Expr Expr [Expr]
56− | GLShader Text Text Literal.Shader
59+ | Shader Text Text Shader.Shader
5760
5861
5962
@@ -83,7 +86,9 @@ data Pattern_
8386 | PCtor R.Region (Maybe N.Name) N.Name [Pattern]
8487 | PList [Pattern]
8588 | PCons Pattern Pattern
86− | PLiteral Literal.Literal
89+ | PChr Text
90+ | PStr Text
91+ | PInt Int
8792
8893
8994
src/AST/Expression/Valid.hs+6−3
@@ -20,7 +20,7 @@ import Data.Text (Text)
2020
2121import qualified AST.Binop as Binop
2222import qualified AST.Expression.Source as Src
23−import qualified AST.Literal as Literal
23+import qualified AST.Shader as Shader
2424import qualified AST.Type as Type
2525import qualified Elm.Name as N
2626import qualified Reporting.Annotation as A
@@ -35,7 +35,10 @@ type Expr = A.Located Expr_
3535
3636
3737data Expr_
38− = Literal Literal.Literal
38+ = Chr Text
39+ | Str Text
40+ | Int Int
41+ | Float Double
3942 | Var (Maybe N.Name) N.Name
4043 | List [Expr]
4144 | Op N.Name
@@ -52,7 +55,7 @@ data Expr_
5255 | Record [(A.Located N.Name, Expr)]
5356 | Unit
5457 | Tuple Expr Expr [Expr]
55− | GLShader Text Text Literal.Shader
58+ | Shader Text Text Shader.Shader
5659
5760
5861
src/AST/Literal.hsdeleted−92
@@ -1,92 +0,0 @@
1−{-# OPTIONS_GHC -Wall #-}
2−{-# LANGUAGE OverloadedStrings #-}
3−module AST.Literal
4− ( Literal(..)
5− , toBuilder
6− , Shader(..)
7− , GLType(..)
8− )
9− where
10−
11−
12−import Data.Binary
13−import qualified Data.Map as Map
14−import Data.Monoid ((<>))
15−import Data.Text (Text)
16−import Data.Text.Lazy.Builder (Builder, fromText)
17−import Data.Text.Lazy.Builder.Int (decimal)
18−import Data.Text.Lazy.Builder.RealFloat (realFloat)
19−
20−
21−
22−-- LITERALS
23−
24−
25−data Literal
26− = Chr Text
27− | Str Text
28− | IntNum Int
29− | FloatNum Double
30− deriving (Eq, Ord)
31−
32−
33−toBuilder :: Literal -> Builder
34−toBuilder literal =
35− case literal of
36− Chr c -> fromText ("'" <> c <> "'")
37− Str s -> fromText ("\"" <> s <> "\"")
38− IntNum n -> decimal n
39− FloatNum n -> realFloat n
40−
41−
42−
43−-- WebGL TYPES
44−
45−
46−data Shader =
47− Shader
48− { attribute :: Map.Map Text GLType
49− , uniform :: Map.Map Text GLType
50− , varying :: Map.Map Text GLType
51− }
52− deriving (Eq)
53−
54−
55−data GLType
56− = Int
57− | Float
58− | V2
59− | V3
60− | V4
61− | M4
62− | Texture
63− deriving (Eq)
64−
65−
66−
67−-- BINARY
68−
69−
70−instance Binary Literal where
71− put literal =
72− case literal of
73− Chr chr ->
74− putWord8 0 >> put chr
75−
76− Str str ->
77− putWord8 1 >> put str
78−
79− IntNum n ->
80− putWord8 2 >> put n
81−
82− FloatNum n ->
83− putWord8 3 >> put n
84−
85− get =
86− do word <- getWord8
87− case word of
88− 0 -> Chr <$> get
89− 1 -> Str <$> get
90− 2 -> IntNum <$> get
91− 3 -> FloatNum <$> get
92− _ -> error "bad binary for AST.Literal"
src/AST/Shader.hsnew file+36
@@ -0,0 +1,36 @@
1+{-# OPTIONS_GHC -Wall #-}
2+module AST.Shader
3+ ( Shader(..)
4+ , Type(..)
5+ )
6+ where
7+
8+
9+import qualified Data.Map as Map
10+import qualified Elm.Name as N
11+
12+
13+
14+-- SHADERS
15+
16+
17+data Shader =
18+ Shader
19+ { _attribute :: Map.Map N.Name Type
20+ , _uniform :: Map.Map N.Name Type
21+ , _varying :: Map.Map N.Name Type
22+ }
23+
24+
25+
26+-- GL TYPES
27+
28+
29+data Type
30+ = Int
31+ | Float
32+ | V2
33+ | V3
34+ | V4
35+ | M4
36+ | Texture