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:
parent
3640376be8
commit
4a25c165a4
3 changed files with 21 additions and 7 deletions
|
@ -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)
|
||||
|
|
|
@ -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"
|
||||
|
|
|
@ -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)
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue