@@ -4,6 +4,7 @@ module Parse.Primitives.Variable
44 ( lower
55 , upper
66 , moduleName
7+ , Upper(..)
78 , foreignUpper
89 , foreignAlpha
910 , chompInnerChars
@@ -15,14 +16,14 @@ module Parse.Primitives.Variable
1516
1617import Control.Exception (assert)
1718import Data.Bits ((.&.), (.|.), shiftL)
18−import qualified Data.ByteString.Internal as B
1919import qualified Data.Char as Char
2020import qualified Data.Set as Set
2121import Data.Text (Text)
22−import qualified Data.Text.Encoding as Text
2322import Foreign.ForeignPtr (ForeignPtr)
2423import GHC.Word (Word8)
2524
25+import qualified AST.Source as Src
26+import qualified Elm.Name as N
2627import Parse.Primitives.Internals (Parser(..), State(..), expect, noError, unsafeIndex)
2728import qualified Reporting.Error.Syntax as E
2829
@@ -38,8 +39,8 @@ upper =
3839 if offset == newOffset then
3940 eerr (expect row col ctx E.CapVar)
4041 else
41− let !variable = Text.decodeUtf8 (B.PS fp offset (newOffset - offset)) in
42− cok variable (State fp newOffset terminal indent row newCol ctx) noError
42+ let !name = N.fromForeignPtr fp offset (newOffset - offset) in
43+ cok name (State fp newOffset terminal indent row newCol ctx) noError
4344
4445
4546
@@ -53,11 +54,11 @@ lower =
5354 if offset == newOffset then
5455 eerr (expect row col ctx E.LowVar)
5556 else
56− let !variable = Text.decodeUtf8 (B.PS fp offset (newOffset - offset)) in
57− if Set.member variable reservedWords then
57+ let !name = N.fromForeignPtr fp offset (newOffset - offset) in
58+ if Set.member name reservedWords then
5859 eerr (expect row col ctx E.LowVar)
5960 else
60− cok variable (State fp newOffset terminal indent row newCol ctx) noError
61+ cok name (State fp newOffset terminal indent row newCol ctx) noError
6162
6263
6364{-# NOINLINE reservedWords #-}
@@ -89,7 +90,7 @@ moduleName =
8990
9091 Good end endCol ->
9192 let
92− !name = Text.decodeUtf8 (B.PS fp offset (end - offset))
93+ !name = N.fromForeignPtr fp offset (end - offset)
9394 !newState = State fp end terminal indent row endCol ctx
9495 in
9596 cok name newState noError
@@ -118,7 +119,12 @@ moduleNameHelp fp offset terminal col =
118119-- FOREIGN UPPER
119120
120121
121−foreignUpper :: Parser (Maybe Text, Text)
122+data Upper
123+ = Unqualified N.Name
124+ | Qualified N.Name N.Name
125+
126+
127+foreignUpper :: Parser Upper
122128foreignUpper =
123129 Parser $ \(State fp offset terminal indent row col ctx) cok _ _ eerr ->
124130 let (# start, end, newCol #) = foreignUpperHelp fp offset terminal col in
@@ -127,13 +133,13 @@ foreignUpper =
127133 else
128134 let
129135 !newState = State fp end terminal indent row newCol ctx
130− !variable = Text.decodeUtf8 (B.PS fp start (end - start))
136+ !name = N.fromForeignPtr fp start (end - start)
131137 !foreign =
132138 if start == offset then
133− (Nothing, variable)
139+ Unqualified name
134140 else
135− let !home = Text.decodeUtf8 (B.PS fp offset ((start - 1) - offset)) in
136− (Just home, variable)
141+ let !home = N.fromForeignPtr fp offset ((start - 1) - offset) in
142+ Qualified home name
137143 in
138144 cok foreign newState noError
139145
@@ -157,47 +163,47 @@ foreignUpperHelp fp offset terminal col =
157163-- FOREIGN ALPHA
158164
159165
160−foreignAlpha :: Parser (Maybe Text, Text)
166+foreignAlpha :: Parser Src.Expr_
161167foreignAlpha =
162168 Parser $ \(State fp offset terminal indent row col ctx) cok _ _ eerr ->
163− let (# start, end, newCol #) = foreignAlphaHelp fp offset terminal col in
169+ let (# start, end, newCol, varType #) = foreignAlphaHelp fp offset terminal col in
164170 if start == end then
165171 eerr (E.ParseError row newCol (E.Theories ctx [E.LowVar, E.CapVar]))
166172 else
167173 let
168174 !newState = State fp end terminal indent row newCol ctx
169− !variable = Text.decodeUtf8 (B.PS fp start (end - start))
175+ !name = N.fromForeignPtr fp start (end - start)
170176 in
171177 if start == offset then
172− if Set.member variable reservedWords then
178+ if Set.member name reservedWords then
173179 eerr noError
174180 else
175− cok (Nothing, variable) newState noError
181+ cok (Src.Var varType name) newState noError
176182 else
177− let !home = Text.decodeUtf8 (B.PS fp offset ((start - 1) - offset)) in
178− cok (Just home, variable) newState noError
183+ let !home = N.fromForeignPtr fp offset ((start - 1) - offset) in
184+ cok (Src.VarQual varType home name) newState noError
179185
180186
181−foreignAlphaHelp :: ForeignPtr Word8 -> Int -> Int -> Int -> (# Int, Int, Int #)
187+foreignAlphaHelp :: ForeignPtr Word8 -> Int -> Int -> Int -> (# Int, Int, Int, Src.VarType #)
182188foreignAlphaHelp fp offset terminal col =
183189 let
184190 (# lowerOffset, lowerCol #) = chompLower fp offset terminal col
185191 in
186192 if offset < lowerOffset then
187− (# offset, lowerOffset, lowerCol #)
193+ (# offset, lowerOffset, lowerCol, Src.Value #)
188194
189195 else
190196 let
191197 (# upperOffset, upperCol #) = chompUpper fp offset terminal col
192198 in
193199 if offset == upperOffset then
194− (# offset, offset, col #)
200+ (# offset, offset, col, Src.Ctor #)
195201
196202 else if isDot fp upperOffset terminal then
197203 foreignAlphaHelp fp (upperOffset + 1) terminal (upperCol + 1)
198204
199205 else
200− (# offset, upperOffset, upperCol #)
206+ (# offset, upperOffset, upperCol, Src.Ctor #)
201207
202208
203209