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
|