@@ -4,6 +4,7 @@ module Parse.Primitives.Variable
6 , moduleName
6 , moduleName
7 , foreignUpper
8 , foreignUpper
8 , foreignAlpha
9 , foreignAlpha
9 , chompInnerChars
10 , chompInnerChars
@@ -15,14 +16,14 @@ module Parse.Primitives.Variable
16import Control.Exception (assert)
17import Control.Exception (assert)
17import Data.Bits ((.&.), (.|.), shiftL)
18import Data.Bits ((.&.), (.|.), shiftL)
18−import qualified Data.ByteString.Internal as B
19import qualified Data.Char as Char
19import qualified Data.Char as Char
20import qualified Data.Set as Set
20import qualified Data.Set as Set
21import Data.Text (Text)
21import Data.Text (Text)
22−import qualified Data.Text.Encoding as Text
23import Foreign.ForeignPtr (ForeignPtr)
22import Foreign.ForeignPtr (ForeignPtr)
24import GHC.Word (Word8)
23import GHC.Word (Word8)
25+import qualified AST.Source as Src
26+import qualified Elm.Name as N
26import Parse.Primitives.Internals (Parser(..), State(..), expect, noError, unsafeIndex)
27import Parse.Primitives.Internals (Parser(..), State(..), expect, noError, unsafeIndex)
27import qualified Reporting.Error.Syntax as E
28import qualified Reporting.Error.Syntax as E
@@ -38,8 +39,8 @@ upper =
38 if offset == newOffset then
39 if offset == newOffset then
39 eerr (expect row col ctx E.CapVar)
40 eerr (expect row col ctx E.CapVar)
41− let !variable = Text.decodeUtf8 (B.PS fp offset (newOffset - offset)) in
42+ let !name = N.fromForeignPtr fp offset (newOffset - offset) in
42− cok variable (State fp newOffset terminal indent row newCol ctx) noError
43+ cok name (State fp newOffset terminal indent row newCol ctx) noError
@@ -53,11 +54,11 @@ lower =
53 if offset == newOffset then
54 if offset == newOffset then
54 eerr (expect row col ctx E.LowVar)
55 eerr (expect row col ctx E.LowVar)
56− let !variable = Text.decodeUtf8 (B.PS fp offset (newOffset - offset)) in
57+ let !name = N.fromForeignPtr fp offset (newOffset - offset) in
57− if Set.member variable reservedWords then
58+ if Set.member name reservedWords then
58 eerr (expect row col ctx E.LowVar)
59 eerr (expect row col ctx E.LowVar)
60− cok variable (State fp newOffset terminal indent row newCol ctx) noError
61+ cok name (State fp newOffset terminal indent row newCol ctx) noError
63{-# NOINLINE reservedWords #-}
64{-# NOINLINE reservedWords #-}
@@ -89,7 +90,7 @@ moduleName =
90 Good end endCol ->
91 Good end endCol ->
92− !name = Text.decodeUtf8 (B.PS fp offset (end - offset))
93+ !name = N.fromForeignPtr fp offset (end - offset)
93 !newState = State fp end terminal indent row endCol ctx
94 !newState = State fp end terminal indent row endCol ctx
95 cok name newState noError
96 cok name newState noError
@@ -118,7 +119,12 @@ moduleNameHelp fp offset terminal col =
118-- FOREIGN UPPER
119-- FOREIGN UPPER
123+ = Unqualified N.Name
124+ | Qualified N.Name N.Name
121−foreignUpper :: Parser (Maybe Text, Text)
127+foreignUpper :: Parser Upper
122foreignUpper =
128foreignUpper =
123 Parser $ \(State fp offset terminal indent row col ctx) cok _ _ eerr ->
129 Parser $ \(State fp offset terminal indent row col ctx) cok _ _ eerr ->
124 let (# start, end, newCol #) = foreignUpperHelp fp offset terminal col in
130 let (# start, end, newCol #) = foreignUpperHelp fp offset terminal col in
@@ -127,13 +133,13 @@ foreignUpper =
129 !newState = State fp end terminal indent row newCol ctx
135 !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)
131 !foreign =
137 !foreign =
132 if start == offset then
138 if start == offset then
133− (Nothing, variable)
139+ Unqualified name
135− let !home = Text.decodeUtf8 (B.PS fp offset ((start - 1) - offset)) in
141+ let !home = N.fromForeignPtr fp offset ((start - 1) - offset) in
136− (Just home, variable)
142+ Qualified home name
138 cok foreign newState noError
144 cok foreign newState noError
@@ -157,47 +163,47 @@ foreignUpperHelp fp offset terminal col =
157-- FOREIGN ALPHA
163-- FOREIGN ALPHA
160−foreignAlpha :: Parser (Maybe Text, Text)
166+foreignAlpha :: Parser Src.Expr_
161foreignAlpha =
167foreignAlpha =
162 Parser $ \(State fp offset terminal indent row col ctx) cok _ _ eerr ->
168 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
164 if start == end then
170 if start == end then
165 eerr (E.ParseError row newCol (E.Theories ctx [E.LowVar, E.CapVar]))
171 eerr (E.ParseError row newCol (E.Theories ctx [E.LowVar, E.CapVar]))
168 !newState = State fp end terminal indent row newCol ctx
174 !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)
171 if start == offset then
177 if start == offset then
172− if Set.member variable reservedWords then
178+ if Set.member name reservedWords then
173 eerr noError
179 eerr noError
175− cok (Nothing, variable) newState noError
181+ cok (Src.Var varType name) newState noError
177− let !home = Text.decodeUtf8 (B.PS fp offset ((start - 1) - offset)) in
183+ let !home = N.fromForeignPtr fp offset ((start - 1) - offset) in
178− cok (Just home, variable) newState noError
184+ cok (Src.VarQual varType home name) newState noError
181−foreignAlphaHelp :: ForeignPtr Word8 -> Int -> Int -> Int -> (# Int, Int, Int #)
187+foreignAlphaHelp :: ForeignPtr Word8 -> Int -> Int -> Int -> (# Int, Int, Int, Src.VarType #)
182foreignAlphaHelp fp offset terminal col =
188foreignAlphaHelp fp offset terminal col =
184 (# lowerOffset, lowerCol #) = chompLower fp offset terminal col
190 (# lowerOffset, lowerCol #) = chompLower fp offset terminal col
186 if offset < lowerOffset then
192 if offset < lowerOffset then
187− (# offset, lowerOffset, lowerCol #)
193+ (# offset, lowerOffset, lowerCol, Src.Value #)
191 (# upperOffset, upperCol #) = chompUpper fp offset terminal col
197 (# upperOffset, upperCol #) = chompUpper fp offset terminal col
193 if offset == upperOffset then
199 if offset == upperOffset then
194− (# offset, offset, col #)
200+ (# offset, offset, col, Src.Ctor #)
196 else if isDot fp upperOffset terminal then
202 else if isDot fp upperOffset terminal then
197 foreignAlphaHelp fp (upperOffset + 1) terminal (upperCol + 1)
203 foreignAlphaHelp fp (upperOffset + 1) terminal (upperCol + 1)
200− (# offset, upperOffset, upperCol #)
206+ (# offset, upperOffset, upperCol, Src.Ctor #)