on master help sign in
Hack to make imported names safe.

This fixes a bug where imported identifiers with reserved names were not being changed during codegen.

commit4a25c165a44c50c7c29a4198ebc53c91b9f9fead authorMax New <maxsnew@gmail.com> dateFri 3 Jan 2014, 02:46 (13 years ago) parent3640376
3 files changed+21−7
compiler/Generate/JavaScript.hs+3−2 compiler/Parse/Helpers.hs+10 compiler/Transform/SafeNames.hs+8−5
compiler/Generate/JavaScript.hs+3−2
@@ -12,6 +12,7 @@ import Generate.JavaScript.Helpers
1212import qualified Generate.Cases as Case
1313import qualified Generate.JavaScript.Ports as Port
1414import qualified Generate.Markdown as MD
15+import qualified Parse.Helpers as PHelp
1516import qualified SourceSyntax.Helpers as Help
1617import SourceSyntax.Literal
1718import SourceSyntax.Pattern as Pattern
@@ -311,7 +312,7 @@ generate unsafeModule =
311312
312313 jsImport modul = setup Nothing path ++ [ include ]
313314 where
314− path = split modul
315+ path = PHelp.splitDots modul
315316 include = assign path $ dotSep ("Elm" : path ++ ["make"]) <| ref "_elm"
316317
317318 setup namespace path = map create paths
@@ -351,7 +352,7 @@ binop span op e1 e2 =
351352 func | Help.isOp operator = BracketRef () (dotSep (init parts ++ ["_op"])) (string operator)
352353 | otherwise = dotSep parts
353354 where
354− parts = split op
355+ parts = PHelp.splitDots op
355356 operator = last parts
356357
357358 opDict = Map.fromList (infixOps ++ specialOps)
compiler/Parse/Helpers.hs+10
@@ -18,6 +18,16 @@ import SourceSyntax.Expression
1818import SourceSyntax.PrettyPrint
1919import SourceSyntax.Declaration (Assoc)
2020
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+
2131reserveds = [ "if", "then", "else"
2232 , "case", "of"
2333 , "let", "in"
compiler/Transform/SafeNames.hs+8−5
@@ -1,16 +1,19 @@
11{-# OPTIONS_GHC -Wall #-}
22module Transform.SafeNames (metadataModule) where
33
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+
510import SourceSyntax.Expression
611import SourceSyntax.Location
712import SourceSyntax.Module
813import SourceSyntax.Pattern
9−import qualified Data.Set as Set
10−import qualified Parse.Helpers as PHelp
1114
1215var :: String -> String
13−var = dereserve . deprime
16+var = intercalate "." . map (dereserve . deprime) . PHelp.splitDots
1417 where
1518 deprime = map (\c -> if c == '\'' then '$' else c)
1619 dereserve x = case Set.member x PHelp.jsReserveds of
@@ -69,4 +72,4 @@ metadataModule modul =
6972 , datatypes =
7073 let makeSafe (name,tvars,ctors,ds) = (var name, tvars, map (first var) ctors, ds)
7174 in map makeSafe (datatypes modul)
72− }
75+ }