module Foreign.Java.Utils where
import Data.Strings
javaKeywords, haskellKeywords :: [String]
javaKeywords = ["abstract",
"assert",
"boolean",
"break",
"byte",
"case",
"catch",
"char",
"class",
"const",
"continue",
"default",
"do",
"double",
"else",
"enum",
"extends",
"final",
"finally",
"float",
"for",
"goto",
"if",
"implements",
"import",
"instanceof",
"int",
"interface",
"long",
"native",
"new",
"package",
"private",
"protected",
"public",
"return",
"short",
"static",
"staticfp",
"super",
"switch",
"synchronized",
"this",
"throw",
"throws",
"transient",
"try",
"void",
"volatile",
"while",
"null", "true", "false"]
haskellKeywords = ["as",
"case",
"of",
"class",
"data",
"default",
"deriving",
"do",
"foreign",
"hiding",
"if",
"then",
"else",
"import",
"infixl",
"infixr",
"instance",
"let",
"in",
"module",
"newtype",
"qualified",
"type",
"where",
"forall",
"mdo",
"rec",
"proc",
"family"]
makeName :: Maybe String
-> String
-> String
makeName pkg clazz = case pkg of
(Just package) -> package ++ '.' : clazz
_ -> clazz
makePackageModuleName :: String
-> String
makePackageModuleName name
| null name = name
| otherwise = strJoin "." $ map (strCapitalize)
$ strSplitAll "." name
makeClassModuleName :: String
-> String
makeClassModuleName name = case maybe "" makePackageModuleName (takePackageName name) of
"" -> classModuleName
package -> package ++ '.' : classModuleName
where classModuleName = strCapitalize
$ dropWhile (== '_') $ filter (/= '$')
$ takeClassName name
splitClassName :: String -> (String, String)
splitClassName name = (maybe "" id $ takePackageName name, takeClassName name)
joinClassName :: (String, String) -> String
joinClassName (package, clazz) = case package of
"" -> clazz
_ -> package ++ '.' : clazz
takePackageName :: String -> Maybe String
takePackageName fullName = if null name then Nothing else Just (init name)
where name = (reverse . snd . break (== '.') . reverse) fullName
takeClassName :: String -> String
takeClassName = reverse . fst . break (== '.') . reverse
takeBaseClassName :: String -> String
takeBaseClassName = reverse . fst . break (== '$') . reverse . takeClassName
takeEnclosingClasses :: String -> [String]
takeEnclosingClasses name = map (makeName (takePackageName name)) simpleNames
where simpleNames = scanl1 (\x y-> x ++ "$" ++ y) $ init $ names $ takeClassName name
names n = let (a, b) = break (== '$') n
in a : if null b then [] else names (tail b)