on master help sign in
Hack to make imported names safe.
4a25c16Max New
compiler/Generate/JavaScript.hs+3−2
@@ -12,6 +12,7 @@ import Generate.JavaScript.Helpers
12import qualified Generate.Cases as Case
12import qualified Generate.Cases as Case
13import qualified Generate.JavaScript.Ports as Port
13import qualified Generate.JavaScript.Ports as Port
14import qualified Generate.Markdown as MD
14import qualified Generate.Markdown as MD
15+import qualified Parse.Helpers as PHelp
15import qualified SourceSyntax.Helpers as Help
16import qualified SourceSyntax.Helpers as Help
16import SourceSyntax.Literal
17import SourceSyntax.Literal
17import SourceSyntax.Pattern as Pattern
18import SourceSyntax.Pattern as Pattern
@@ -311,7 +312,7 @@ generate unsafeModule =
311
312
312 jsImport modul = setup Nothing path ++ [ include ]
313 jsImport modul = setup Nothing path ++ [ include ]
313 where
314 where
314− path = split modul
315+ path = PHelp.splitDots modul
315 include = assign path $ dotSep ("Elm" : path ++ ["make"]) <| ref "_elm"
316 include = assign path $ dotSep ("Elm" : path ++ ["make"]) <| ref "_elm"
316
317
317 setup namespace path = map create paths
318 setup namespace path = map create paths
@@ -351,7 +352,7 @@ binop span op e1 e2 =
351 func | Help.isOp operator = BracketRef () (dotSep (init parts ++ ["_op"])) (string operator)
352 func | Help.isOp operator = BracketRef () (dotSep (init parts ++ ["_op"])) (string operator)
352 | otherwise = dotSep parts
353 | otherwise = dotSep parts
353 where
354 where
354− parts = split op
355+ parts = PHelp.splitDots op
355 operator = last parts
356 operator = last parts
356
357
357 opDict = Map.fromList (infixOps ++ specialOps)
358 opDict = Map.fromList (infixOps ++ specialOps)
compiler/Parse/Helpers.hs+10
@@ -18,6 +18,16 @@ import SourceSyntax.Expression
18import SourceSyntax.PrettyPrint
18import SourceSyntax.PrettyPrint
19import SourceSyntax.Declaration (Assoc)
19import SourceSyntax.Declaration (Assoc)
20
20
21+splitDots :: String -> [String]
22+splitDots = go []
23+ where
24+ go vars str =
25+ case break (=='.') str of
26+ (x,'.':rest) | Help.isOp x -> vars ++ [x ++ '.' : rest]
27+ | otherwise -> go (vars ++ [x]) rest
28+ (x,[]) -> vars ++ [x]
29+
30+
21reserveds = [ "if", "then", "else"
31reserveds = [ "if", "then", "else"
22 , "case", "of"
32 , "case", "of"
23 , "let", "in"
33 , "let", "in"
compiler/Transform/SafeNames.hs+8−5
@@ -1,16 +1,19 @@
1{-# OPTIONS_GHC -Wall #-}
1{-# OPTIONS_GHC -Wall #-}
2module Transform.SafeNames (metadataModule) where
2module Transform.SafeNames (metadataModule) where
3
3
4−import Control.Arrow (first, (***))
4+import Control.Arrow (first, (***))
5+import Data.List (intercalate)
6+
7+import qualified Data.Set as Set
8+import qualified Parse.Helpers as PHelp
9+
5import SourceSyntax.Expression
10import SourceSyntax.Expression
6import SourceSyntax.Location
11import SourceSyntax.Location
7import SourceSyntax.Module
12import SourceSyntax.Module
8import SourceSyntax.Pattern
13import SourceSyntax.Pattern
9−import qualified Data.Set as Set
10−import qualified Parse.Helpers as PHelp
11
14
12var :: String -> String
15var :: String -> String
13−var = dereserve . deprime
16+var = intercalate "." . map (dereserve . deprime) . PHelp.splitDots
14 where
17 where
15 deprime = map (\c -> if c == '\'' then '$' else c)
18 deprime = map (\c -> if c == '\'' then '$' else c)
16 dereserve x = case Set.member x PHelp.jsReserveds of
19 dereserve x = case Set.member x PHelp.jsReserveds of
@@ -69,4 +72,4 @@ metadataModule modul =
69 , datatypes =
72 , datatypes =
70 let makeSafe (name,tvars,ctors,ds) = (var name, tvars, map (first var) ctors, ds)
73 let makeSafe (name,tvars,ctors,ds) = (var name, tvars, map (first var) ctors, ds)
71 in map makeSafe (datatypes modul)
74 in map makeSafe (datatypes modul)
72− }
75+ }