Hack to make imported names safe.

This fixes a bug where imported identifiers with reserved names were
not being changed during codegen.
This commit is contained in:
Max New 2014-01-03 02:46:39 -06:00
parent 3640376be8
commit 4a25c165a4
3 changed files with 21 additions and 7 deletions

View file

@ -12,6 +12,7 @@ import Generate.JavaScript.Helpers
import qualified Generate.Cases as Case
import qualified Generate.JavaScript.Ports as Port
import qualified Generate.Markdown as MD
import qualified Parse.Helpers as PHelp
import qualified SourceSyntax.Helpers as Help
import SourceSyntax.Literal
import SourceSyntax.Pattern as Pattern
@ -311,7 +312,7 @@ generate unsafeModule =
jsImport modul = setup Nothing path ++ [ include ]
where
path = split modul
path = PHelp.splitDots modul
include = assign path $ dotSep ("Elm" : path ++ ["make"]) <| ref "_elm"
setup namespace path = map create paths
@ -351,7 +352,7 @@ binop span op e1 e2 =
func | Help.isOp operator = BracketRef () (dotSep (init parts ++ ["_op"])) (string operator)
| otherwise = dotSep parts
where
parts = split op
parts = PHelp.splitDots op
operator = last parts
opDict = Map.fromList (infixOps ++ specialOps)

View file

@ -18,6 +18,16 @@ import SourceSyntax.Expression
import SourceSyntax.PrettyPrint
import SourceSyntax.Declaration (Assoc)
splitDots :: String -> [String]
splitDots = go []
where
go vars str =
case break (=='.') str of
(x,'.':rest) | Help.isOp x -> vars ++ [x ++ '.' : rest]
| otherwise -> go (vars ++ [x]) rest
(x,[]) -> vars ++ [x]
reserveds = [ "if", "then", "else"
, "case", "of"
, "let", "in"

View file

@ -1,16 +1,19 @@
{-# OPTIONS_GHC -Wall #-}
module Transform.SafeNames (metadataModule) where
import Control.Arrow (first, (***))
import Control.Arrow (first, (***))
import Data.List (intercalate)
import qualified Data.Set as Set
import qualified Parse.Helpers as PHelp
import SourceSyntax.Expression
import SourceSyntax.Location
import SourceSyntax.Module
import SourceSyntax.Pattern
import qualified Data.Set as Set
import qualified Parse.Helpers as PHelp
var :: String -> String
var = dereserve . deprime
var = intercalate "." . map (dereserve . deprime) . PHelp.splitDots
where
deprime = map (\c -> if c == '\'' then '$' else c)
dereserve x = case Set.member x PHelp.jsReserveds of
@ -69,4 +72,4 @@ metadataModule modul =
, datatypes =
let makeSafe (name,tvars,ctors,ds) = (var name, tvars, map (first var) ctors, ds)
in map makeSafe (datatypes modul)
}
}