From 4a25c165a44c50c7c29a4198ebc53c91b9f9fead Mon Sep 17 00:00:00 2001 From: Max New Date: Fri, 3 Jan 2014 02:46:39 -0600 Subject: [PATCH] Hack to make imported names safe. This fixes a bug where imported identifiers with reserved names were not being changed during codegen. --- compiler/Generate/JavaScript.hs | 5 +++-- compiler/Parse/Helpers.hs | 10 ++++++++++ compiler/Transform/SafeNames.hs | 13 ++++++++----- 3 files changed, 21 insertions(+), 7 deletions(-) diff --git a/compiler/Generate/JavaScript.hs b/compiler/Generate/JavaScript.hs index aae77b4..86f6d98 100644 --- a/compiler/Generate/JavaScript.hs +++ b/compiler/Generate/JavaScript.hs @@ -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) diff --git a/compiler/Parse/Helpers.hs b/compiler/Parse/Helpers.hs index bdedc77..1c95962 100644 --- a/compiler/Parse/Helpers.hs +++ b/compiler/Parse/Helpers.hs @@ -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" diff --git a/compiler/Transform/SafeNames.hs b/compiler/Transform/SafeNames.hs index dcfbd06..a739360 100644 --- a/compiler/Transform/SafeNames.hs +++ b/compiler/Transform/SafeNames.hs @@ -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) - } \ No newline at end of file + }