Subversion

guisurfer_software

[/] [GuiX.hs] - Rev 1

Compare with Previous - Blame



module GuiX where

import SlicingX

cons :: [String] -> String
cons [] = []
cons (e:t) = e++[' ']++(cons t)


-- String -> [(String,[String],Int,Int)]


-- Source level	
guiFilter l filterD = foldl (||) False [elem ("\""++f++"\"") l |f<-filterD]
              --(elem "\"setEnabled\"" l)
              --(elem "\"JButton\"" l) || 

filePackage ast = slice ast "Prpkg" 1 1
fileClassImports ast = slice ast "ImportN" 1 1
fileClassDefinitions ast = slice ast "TypeDecl" 1 1
className ast = let l = fileClassDefinitions ast
                    res = head [concat $ slice1 (b!!0) "Ident" |(a,b,c,d)<-l]
                in res

classConstructorsDefinition ast = slice ast "Dconst" 1 1
classMethodsDefinition ast = slice ast "Dmth" 1 1
classVariables ast = slice ast "Dvar" 1 1
guiClassVariables ast filterD = let l = classVariables ast
                                    res = [(a,b,c,d)|(a,b,c,d)<-l,guiFilter (slicen (b!!2) "Ident") filterD]
                                in res
variablesDeclaration ast = slice ast "LVar" 1 1
guiVariablesDeclaration ast filterD = let l = variablesDeclaration ast
                                          res = [(a,b,c,d)|(a,b,c,d)<-l,guiFilter (slicen (b!!1) "Ident") filterD]
                                      in res 
statements ast = let l = slice ast "Exps" 1 2
                     l1 = [(a,b,c,d)|(a,b,c,d)<-l,[1|(e,f,g,h)<-l,c<g, d>h]==[]]
                 in l1
guiStatements ast filterD = let l = statements ast
                                res = [(a,b,c,d)|(a,b,c,d)<-l,guiFilter (slicen (b!!0) "Ident") filterD]
                            in res
statementsIf1 ast = [("If1",[(b!!0)] ++ [(b!!1)],c+(length $ b!!0),c+(length $ b!!0)+(length $ b!!1))|(a,b,c,d)<-slice ast "If" 1 2]
                    ++
                    [("If1",[(b!!0)] ++ [(b!!1)],c+(length $ b!!0),c+(length $ b!!0)+(length $ b!!1))|(a,b,c,d)<-slice ast "Elseif" 1 2]
statementsIf2 ast = 
                    [("If2",[["(","Epreop","Logicalneg"]++(b!!0)++[")"]] ++ [(b!!3)],
                    c+(length $ b!!0)+(length $ b!!1)+(length $ b!!2),c+(length $ b!!0)+(length $ b!!1)+(length $ b!!2)+(length $ b!!3))|(a,b,c,d)<-slice ast "If" 1 2] ++
                    [("If2",[["(","Epreop","Logicalneg"]++(b!!0)++[")"]] ++ [(b!!2)],
                    c+(length $ b!!0)+(length $ b!!1)+(length $ b!!2),c+(length $ b!!0)+(length $ b!!1)+(length $ b!!2)+(length $ b!!3))|(a,b,c,d)<-slice ast "If" 1 2,(b!!2)/=["[","]"]]
--statementsIf2 ast = [("If2",[["(","Epreop","Logicalneg"]]++[(b!!0)]++[[")"]] ++ [(b!!3)],c+(length $ b!!0)+(length $ b!!1)+(length $ b!!2),c+(length $ b!!0)+(length $ b!!1)+(length $ b!!2)+(length $ b!!3))|(a,b,c,d)<-slice ast "If" 1 2]
guiStatementsIf ast filterD = let l = (statementsIf1 ast) ++ (statementsIf2 ast)
                                  res = [(a,b,c,d)|(a,b,c,d)<-l
--                                                       ,guiFilter (slicen (b!!0) "Ident") filterD || 
--                                                        guiFilter (slicen (b!!1) "Ident") filterD  
----                                                        guiFilter (slicen (b!!2) "Ident") filterD || 
----                                                        guiFilter (slicen (b!!3) "Ident") filterD  
                                        ]
                              in res
statementsIfOne ast = slice ast "Ifone" 1 2
guiStatementsIfOne ast filterD = let l = statementsIfOne ast
                                     res = [(a,b,c,d)|(a,b,c,d)<-l
--                                                          ,guiFilter (slicen (b!!0) "Ident") filterD || 
--                                                           guiFilter (slicen (b!!1) "Ident") filterD || 
--                                                           guiFilter (slicen (b!!2) "Ident") filterD 
                                           ]
                                 in res
statementsTry ast = slice ast "Try" 1 2
guiStatementsTry ast filterD = let l = statementsTry ast
                                   res = [(a,[(b!!0)],c,c+(length $ b!!0))|(a,b,c,d)<-l
--                                                           ,   -- somente body
--                                                           guiFilter (slicen (b!!0) "Ident") filterD  
----                                                           guiFilter (slicen (b!!1) "Ident") filterD 
                                         ]
                               in res
statementsTryfinally ast = slice ast "Tryfinally" 1 2
guiStatementsTryfinally ast filterD = let l = statementsTryfinally ast
                                          res = [("Try",[(b!!0)],c,c+(length $ b!!0))|(a,b,c,d)<-l
--                                                          ,  -- somente body
--                                                           guiFilter (slicen (b!!0) "Ident") filterD  -- ||
----                                                           guiFilter (slicen (b!!1) "Ident") filterD ||
----                                                           guiFilter (slicen (b!!2) "Ident") filterD 
                                                ]
                                          res1 = [("finally",[(b!!2)],c+(length $ b!!0)+(length $ b!!1),c+(length $ b!!0)+(length $ b!!1)+(length $ b!!2))
                                                          |(a,b,c,d)<-l
--,               -- somente body finally
----                                                           guiFilter (slicen (b!!0) "Ident") filterD  ||
----                                                           guiFilter (slicen (b!!1) "Ident") filterD ||
--                                                           guiFilter (slicen (b!!2) "Ident") filterD 
                                                 ]
                                      in res++res1
statementsCatch1 ast = slice ast "Catch1" 1 2
guiStatementsCatch1 ast filterD = let l = statementsCatch1 ast
                                      res = [(a,b,c,d)|(a,b,c,d)<-l
--                                                          ,guiFilter (slicen (b!!0) "Ident") filterD || 
--                                                           guiFilter (slicen (b!!1) "Ident") filterD || 
--                                                           guiFilter (slicen (b!!2) "Ident") filterD 
                                            ]
                                  in res
statementsCatch2 ast = slice ast "Catch2" 1 2
guiStatementsCatch2 ast filterD = let l = statementsCatch1 ast
                                      res = [(a,b,c,d)|(a,b,c,d)<-l
--                                                          ,guiFilter (slicen (b!!0) "Ident") filterD || 
--                                                           guiFilter (slicen (b!!1) "Ident") filterD 
                                            ]
                                  in res

statementsAddActionListener ast = let l1 = slice ast "Emth" 1 2 
                                      l2 = [(a,b,c,d)| (a,b,c,d) <- l1 , (elem "\"addActionListener\"" (slicen (b!!0) "Ident"))]
                                  in l2
statementsAddWindowListener ast = let l1 = slice ast "Emth" 1 2 
                                      l2 = [(a,b,c,d)| (a,b,c,d) <- l1 , (elem "\"addWindowListener\"" (slicen (b!!0) "Ident"))]
                                  in l2
statementsExternalMethod ast = let l1 = (statementsAddActionListener ast) ++ (statementsAddWindowListener ast)
                                   l2 = slice ast "Emth" 1 2 
                               in [(a,b,c,d)|(a,b,c,d) <- l2, [1 |(e,f,g,h)<-l1, c>=g, d<=h]==[]]
statementsAllExternalMethod ast =  slice ast "Emth" 1 2 
statementsNewObject ast = slice ast "Anewclass" 1 2
statementsAssignment ast = slice ast "Eassign" 1 2


allGui ast filterD = guiClassVariables ast filterD ++ classConstructorsDefinition ast ++ classMethodsDefinition ast ++ guiVariablesDeclaration ast filterD++ guiStatements ast filterD ++ guiStatementsIf ast filterD ++ guiStatementsIfOne ast filterD ++ statementsExternalMethod ast ++ guiStatementsTry ast filterD ++guiStatementsTryfinally ast filterD ++ guiStatementsCatch1 ast filterD ++ guiStatementsCatch2 ast filterD 

allGuiWithListener ast filterD = guiClassVariables ast filterD ++ classConstructorsDefinition ast ++ classMethodsDefinition ast ++ guiVariablesDeclaration ast filterD ++ guiStatements ast filterD ++ guiStatementsIf ast filterD ++ guiStatementsIfOne ast filterD ++ statementsAllExternalMethod ast  ++ guiStatementsTry ast filterD ++guiStatementsTryfinally ast filterD ++ guiStatementsCatch1 ast filterD ++ guiStatementsCatch2 ast filterD 

-- Gui level
jButtonNew ast = let sa = statementsAssignment ast
                     jbn = [slice1 (b!!0) "Ident"
                            |(a,b,c,d)<-sa,concat (b!!2)=="(Enewalloc (Anewclass (ClassType [Ident \"javax\",Ident \"swing\",Ident \"JButton\"]) (Args [])))"]
                 in jbn
jButtonStatements ast = let sa = statements ast
                            jbn = jButtonNew ast
                            jbs = [(a,b,c,d)|i <- jbn, (a,b,c,d) <- sa, (slice1 (concat b) "Ident")==i]
                        in jbs

idClassMethodsDefinition ast = let cmd = classMethodsDefinition ast
                                   m = [(slice1 (b!!2) "Ident",a,b,c,d)|(a,b,c,d) <- cmd] 
                               in m
idClassConstructorsDefinition ast = let cmd = classConstructorsDefinition ast
                                        m = [(slice1 (b!!1) "Ident",a,b,c,d)|(a,b,c,d) <- cmd] 
                                    in m
idClassProcedureDefinition ast = idClassMethodsDefinition ast ++ idClassConstructorsDefinition ast 
idStatementsExternalMethod ast = let cmd = statementsExternalMethod ast
                                     m = [(slice1 (b!!0) "Ident",a,b,c,d)|(a,b,c,d) <- cmd] 
                                 in m
--idStatementsNewObject ast = let cmd = statementsNewObject ast
--                                m = [(slicen (b!!1) "Ident",a,b,c,d)|(a,b,c,d) <- cmd] 
--                            in m


method ast name = let 
                     cmd = (classMethodsDefinition ast) ++ (classConstructorsDefinition ast)
                     m = [(a,b,c,d)|(a,b,c,d) <- cmd, slice1 (b!!2) "DeclName" == ["(","Ident"]++["\""++name++"\""]++[")"] ] 
                 in head m

-- código executado pelo metodo name excluindo listener (considerando filtro)
initState ast name filterD = let (a,b,c,d) = method ast name
                                 s = executedCode (a,b,c,d) ast [(c,d)] filterD
                             in s


-- código executado por cada listener do metodo name (considerando filtro)
eventsFromInitState ast name filterD
                             = let (a,b,c,d) = method ast name
                                   s = allExecutedCode (a,b,c,d) ast [(c,d)] filterD
                                   l1 = [(a,b,c,d,d1e1)|(a,b,c,d,d1e1)<-s,a=="Emth"]--slice ast "Emth" 1 2 
                                   l2 = [(a,b,c,d,d1e1)|(a,b,c,d,d1e1)<-l1,[1|(e,f,g,h,ij)<-s,c>g,d<h]/=[]]
                                   l = [(a,b,c,d,d1e1)| (a,b,c,d,d1e1) <- l2 , (elem "\"addActionListener\"" (slicen (b!!0) "Ident"))]
--                                 l = statementsAddActionListener ast
                                   p = [((a,b,c,d,d1e1),executedCodeEvents (a,b,c,d) ast d1e1 filterD)|(a,b,c,d,d1e1)<-l]
                               in p




-- todo o código executado incluindo listener
-- (a,b,c,d) ast -1 -1
allExecutedCode (a,b,ind1,ind2) ast d1e1 filterD
                                         = let al = allGuiWithListener ast filterD
                                               dl = [(a,b,c,d,d1e1) | (a,b,c,d) <- al, ind1 < c, d < ind2] 
                                               allCode = dl ++ allMethodInvocation dl ast filterD
--                                             guiCode = [(a,b,c,d,e,f)|(a,b,c,d,e,f)<-allCode,a/="Emth" && a/="Dmth"]
                                            in allCode 
allMethodInvocation l ast filterD = let idEmth = [(slice1 (b!!0) "Ident",a,b,c,d,ef) | (a,b,c,d,ef) <- l, a == "Emth"]
                                        icpd = idClassProcedureDefinition ast
                                        emth = [(b,c,d,e,g1h1 ++ [(d1,e1)])|(a,b,c,d,e)<-icpd,(a1,b1,c1,d1,e1,g1h1)<-idEmth,a==a1]
                                    in emth ++ (concat [allExecutedCode (b,c,d,e) ast d1e1 filterD |(b,c,d,e,d1e1)<-emth])

-- todo o código executado excluindo listener
executedCode (a,b,ind1,ind2) ast d1e1 filterD 
                                      = let al = allGui ast filterD
                                            dl = [(a,b,c,d,d1e1) | (a,b,c,d) <- al, ind1 < c, d < ind2] 
                                            allCode = dl ++ methodInvocation dl ast filterD
                                            guiCode = [(a,b,c,d,ef)|(a,b,c,d,ef)<-allCode,a/="Emth" && a/="Dmth" && a/="Dconst"] -- && a /="Statem"]
                                         in guiCode
methodInvocation l ast filterD = let idEmth = [(slice1 (b!!0) "Ident",a,b,c,d,ef) | (a,b,c,d,ef) <- l, a == "Emth"]
                                     icpd = idClassProcedureDefinition ast
                                     emth = [(b,c,d,e,g1h1 ++ [(d1,e1)])|(a,b,c,d,e)<-icpd,(a1,b1,c1,d1,e1,g1h1)<-idEmth,a==a1]
                                 in emth ++ (concat [executedCode (b,c,d,e) ast d1e1 filterD |(b,c,d,e,d1e1)<-emth])


--Assume-se não existir AddActionListener aninhados
--código executado a partir de um evento
executedCodeEvents (a,b,ind1,ind2) ast d1e1 filterD
                                            = let al = allGuiWithListener ast filterD
                                                  dl = [(a,b,c,d,d1e1) | (a,b,c,d) <- al, ind1 < c, d < ind2] 
                                                  allCode = dl ++ methodInvocationEvents dl ast filterD
                                                  guiCode = [(a,b,c,d,ef)|(a,b,c,d,ef)<-allCode,a/="Emth"&&a/="Dmth" && a/="Dconst"]
                                               in guiCode
methodInvocationEvents l ast filterD = let idEmth = [(slice1 (b!!0) "Ident",a,b,c,d,ef) | (a,b,c,d,ef) <- l, a == "Emth"]
                                           icpd = idClassProcedureDefinition ast
                                           emth = [(b,c,d,e,g1h1 ++ [(d1,e1)])|(a,b,c,d,e)<-icpd,(a1,b1,c1,d1,e1,g1h1)<-idEmth,a==a1]
                                       in emth ++ (concat [executedCodeEvents (b,c,d,e) ast d1e1 filterD |(b,c,d,e,d1e1)<-emth])

-- ???
initAdd ast name filterD = let m = method ast name
                               s = executedCodeEvents m ast [] filterD
                           in s


Theme by Vikram Singh | Powered by WebSVN v1.61