@@ -18,11 +18,12 @@
19module Language.PureScript.CodeGen.Cpp.Common where
19module Language.PureScript.CodeGen.Cpp.Common where
21−import Prelude.Compat hiding (all, concatMap, last, init, null)
21+import Prelude.Compat hiding (all, any, concatMap, last, init, map, null)
23import Data.Char
23import Data.Char
24−import Data.Text hiding (map)
24+import Data.Text hiding (foldl1)
25import Data.Monoid ((<>))
25import Data.Monoid ((<>))
26+import qualified Language.PureScript.Constants as C
26import Language.PureScript.Crash
27import Language.PureScript.Crash
27import Language.PureScript.Names
28import Language.PureScript.Names
@@ -45,6 +46,10 @@ safeName name
45safeName name
46safeName name
46 | Just ('$', s) <- uncons name
47 | Just ('$', s) <- uncons name
47 , all isDigit s = name
48 , all isDigit s = name
50+ | C.__superclass_ `isPrefixOf` name
52+ = "$" <> (escaped $ dotsTo '_' name)
48safeName name
53safeName name
49 | "_" `isPrefixOf` name = "$" <> escaped name
54 | "_" `isPrefixOf` name = "$" <> escaped name
50safeName name = escaped name
55safeName name = escaped name
@@ -52,6 +57,9 @@ safeName name = escaped name
52escaped :: Text -> Text
57escaped :: Text -> Text
53escaped = escapeDoubleUnderscores . concatMap identCharToText
58escaped = escapeDoubleUnderscores . concatMap identCharToText
60+dotsTo :: Char -> Text -> Text
61+dotsTo chr' = map (\c -> if c == '.' then chr' else c)
56-- C++ actually reserves all identifiers containing double
64-- C++ actually reserves all identifiers containing double
57-- underscores.
65-- underscores.
@@ -235,8 +243,12 @@ normalizedName = unescapeDoubleUnderscores . normalizedName'
236moduleNameToCpp :: ModuleName -> Text
244moduleNameToCpp :: ModuleName -> Text
237moduleNameToCpp (ModuleName pns) =
245moduleNameToCpp (ModuleName pns) =
238− let name = intercalate "_" (runProperName `map` pns)
239− in if properNameIsCppReserved name then name <> "$" else name
246+ if properNameIsCppReserved name then name <> "$" else name
248+ pnames = runProperName <$> pns
250+ | foldl1 (||) (any (=='_') <$> pnames) = error "Module names can now contain underscores"
251+ | otherwise = intercalate "_" pnames
242-- Checks whether a proper name is reserved in C++11.
254-- Checks whether a proper name is reserved in C++11.