1{-# LANGUAGE FlexibleContexts #-}
2{-# LANGUAGE MultiParamTypeClasses #-}
4module IRTS.Java.Mangling where
10import Control.Applicative
12import Control.Monad.Error
15import Language.Java.Parser
16import Language.Java.Pretty
17import Language.Java.Syntax hiding (Name)
18import qualified Language.Java.Syntax as J
22prefixCallNamespaces :: Ident -> SDecl -> SDecl
23prefixCallNamespaces name (SFun fname args i e) =
24 SFun fname args i (prefixCallNamespacesExp name e)
26 prefixCallNamespacesExp :: Ident -> SExp -> SExp
27 prefixCallNamespacesExp (Ident name) (SApp tail (NS n ns) args) =
28 SApp tail (NS n (name:ns)) args
29 prefixCallNamespacesExp name (SLet var e1 e2) =
30 SLet var (prefixCallNamespacesExp name e1) (prefixCallNamespacesExp name e2)
31 prefixCallNamespacesExp name (SUpdate var e) =
32 SUpdate var (prefixCallNamespacesExp name e)
33 prefixCallNamespacesExp name (SCase var alts) =
34 SCase var (map (prefixCallNamespacesCase name) alts)
35 prefixCallNamespacesExp name (SChkCase var alts) =
36 SChkCase var (map (prefixCallNamespacesCase name) alts)
37 prefixCallNamespacesExp _ exp = exp
39 prefixCallNamespacesCase :: Ident -> SAlt -> SAlt
40 prefixCallNamespacesCase name (SConCase x y n ns e) =
41 SConCase x y n ns (prefixCallNamespacesExp name e)
42 prefixCallNamespacesCase name (SConstCase c e) =
43 SConstCase c (prefixCallNamespacesExp name e)
44 prefixCallNamespacesCase name (SDefaultCase e) =
45 SDefaultCase (prefixCallNamespacesExp name e)
47liftParsed :: (Show e, MonadError String m) => Either e a -> m a
48liftParsed = either (\ err -> throwError $ "Parser error: " ++ (show err))
51mkClassName :: (MonadError String m) => FilePath -> m Ident
53 liftParsed . parser ident . takeBaseName $ takeFileName path
55mangleWithPrefix :: (Applicative m, MonadError String m) => String -> Name -> m Ident
56mangleWithPrefix prefix (NS name _) = mangleWithPrefix prefix name
57mangleWithPrefix prefix (MN i name) =
58 (\ (Ident x) -> Ident $ x ++ ('_' : show i))
59 <$> mangleWithPrefix prefix (UN name)
60mangleWithPrefix prefix (UN name) =
68 | x == '#' = "_Hash" ++ cleanNonLetter xs
69 | x == '@' = "_At" ++ cleanNonLetter xs
70 | x == '$' = "_Dollar" ++ cleanNonLetter xs
71 | x == '!' = "_Bang" ++ cleanNonLetter xs
72 | x == '.' = "_Dot" ++ cleanNonLetter xs
73 | x == '\'' = "_Prime" ++ cleanNonLetter xs
74 | x == '*' = "_Times" ++ cleanNonLetter xs
75 | x == '+' = "_Plus" ++ cleanNonLetter xs
76 | x == '/' = "_Divide" ++ cleanNonLetter xs
77 | x == '-' = "_Minus" ++ cleanNonLetter xs
78 | x == '%' = "_Mod" ++ cleanNonLetter xs
79 | x == '<' = "_LessThan" ++ cleanNonLetter xs
80 | x == '=' = "_Equals" ++ cleanNonLetter xs
81 | x == '>' = "_MoreThan" ++ cleanNonLetter xs
82 | x == '[' = "_LSBrace" ++ cleanNonLetter xs
83 | x == ']' = "_RSBrace" ++ cleanNonLetter xs
84 | x == '(' = "_LBrace" ++ cleanNonLetter xs
85 | x == ')' = "_RBrace" ++ cleanNonLetter xs
86 | x == '_' = "__" ++ cleanNonLetter xs
87 | not (isAlphaNum x) = "_" ++ (show $ ord x) ++ xs
88 | otherwise = x:cleanNonLetter xs
89 cleanNonLetter [] = []
90 cleanWs capitalize (x:xs)
91 | isSpace x = cleanWs True xs
92 | capitalize = (toUpper x) : (cleanWs False xs)
93 | otherwise = x : (cleanWs False xs)
96mangle :: (Applicative m, MonadError String m) => Name -> m Ident
97mangle = mangleWithPrefix "__IDRCG__"
99mangle' :: Name -> Ident
100mangle' = either error id . mangleWithPrefix "__IDRCG__"
102mangleFull :: (Applicative m, MonadError String m) => Name -> m J.Name
103mangleFull (NS name (rootns:nss)) =
104 (\ r n ns -> J.Name (r:(ns ++ [n])))
105 <$> mangleWithPrefix "" (UN rootns)
107 <*> mapM (mangle . UN) nss
108mangleFull n = J.Name . (:[]) <$> mangle n
keysesc to close
- j k
- move down, up
- enter
- open
- esc
- back, or up a level
- 1 2 3 4
- readme, files, commits, refs
- /
- filter
- y
- copy the clone command
- c
- compare the chosen commit with another (or shift-click both)
- ?
- show or hide this list