From 7b32f27c547261f36b5e12159caa2fd6847616d4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jindra=20Pet=F8=EDk?= Date: Sat, 29 Dec 2012 22:40:21 +0100 Subject: [PATCH] AS3: Parsing all traits inside scripts instead of just classes --- trunk/src/com/jpexs/asdec/abc/ABC.java | 319 +----------------- .../com/jpexs/asdec/abc/ABCInputStream.java | 4 +- .../com/jpexs/asdec/abc/avm2/AVM2Code.java | 26 +- .../abc/avm2/instructions/SetTypeIns.java | 5 +- .../construction/NewFunctionIns.java | 2 +- .../localregs/SetLocalTypeIns.java | 2 +- .../instructions/other/GetGlobalScopeIns.java | 2 +- .../instructions/other/GetGlobalSlotIns.java | 2 +- .../instructions/other/GetScopeObjectIns.java | 2 +- .../avm2/instructions/other/GetSlotIns.java | 2 +- .../instructions/other/SetGlobalSlotIns.java | 2 +- .../instructions/other/SetPropertyIns.java | 6 +- .../avm2/instructions/other/SetSlotIns.java | 7 +- .../avm2/instructions/other/SetSuperIns.java | 6 +- .../avm2/treemodel/InitPropertyTreeItem.java | 2 +- .../abc/avm2/treemodel/SetLocalTreeItem.java | 2 +- .../avm2/treemodel/SetPropertyTreeItem.java | 2 +- .../abc/avm2/treemodel/SetSlotTreeItem.java | 30 +- .../treemodel/clauses/AssignmentTreeItem.java | 1 - .../clauses/DeclarationTreeItem.java | 4 +- .../jpexs/asdec/abc/gui/ClassesListTree.java | 43 +-- .../asdec/abc/gui/ClassesListTreeModel.java | 18 +- .../asdec/abc/gui/DecompiledEditorPane.java | 79 +++-- .../com/jpexs/asdec/abc/gui/MainFrame.java | 2 +- .../com/jpexs/asdec/abc/gui/TraitsList.java | 8 +- .../jpexs/asdec/abc/gui/TraitsListModel.java | 4 +- .../com/jpexs/asdec/abc/types/ClassInfo.java | 4 - .../jpexs/asdec/abc/types/InstanceInfo.java | 27 +- .../com/jpexs/asdec/abc/types/MethodBody.java | 9 +- .../com/jpexs/asdec/abc/types/Multiname.java | 2 +- .../com/jpexs/asdec/abc/types/Namespace.java | 18 +- .../com/jpexs/asdec/abc/types/ScriptInfo.java | 16 + .../com/jpexs/asdec/abc/types/ValueKind.java | 26 +- .../jpexs/asdec/abc/types/traits/Trait.java | 33 +- .../asdec/abc/types/traits/TraitClass.java | 252 ++++++++++++++ .../asdec/abc/types/traits/TraitFunction.java | 25 ++ .../types/traits/TraitMethodGetterSetter.java | 22 +- .../abc/types/traits/TraitSlotConst.java | 30 +- .../jpexs/asdec/abc/types/traits/Traits.java | 26 +- .../abc/usages/ConstVarMultinameUsage.java | 6 +- .../abc/usages/MethodMultinameUsage.java | 6 +- trunk/src/com/jpexs/asdec/action/Action.java | 2 +- .../com/jpexs/asdec/action/gui/MainFrame.java | 2 +- .../com/jpexs/asdec/helpers/Highlighting.java | 167 ++++----- 44 files changed, 664 insertions(+), 591 deletions(-) diff --git a/trunk/src/com/jpexs/asdec/abc/ABC.java b/trunk/src/com/jpexs/asdec/abc/ABC.java index f078ca5a9..9a71b83a1 100644 --- a/trunk/src/com/jpexs/asdec/abc/ABC.java +++ b/trunk/src/com/jpexs/asdec/abc/ABC.java @@ -21,9 +21,6 @@ import com.jpexs.asdec.abc.avm2.AVM2Code; import com.jpexs.asdec.abc.avm2.ConstantPool; import com.jpexs.asdec.abc.avm2.UnknownInstructionCode; import com.jpexs.asdec.abc.avm2.instructions.AVM2Instruction; -import com.jpexs.asdec.abc.avm2.treemodel.InitPropertyTreeItem; -import com.jpexs.asdec.abc.avm2.treemodel.SetPropertyTreeItem; -import com.jpexs.asdec.abc.avm2.treemodel.TreeItem; import com.jpexs.asdec.abc.types.*; import com.jpexs.asdec.abc.types.traits.Trait; import com.jpexs.asdec.abc.types.traits.TraitMethodGetterSetter; @@ -31,14 +28,11 @@ import com.jpexs.asdec.abc.types.traits.TraitSlotConst; import com.jpexs.asdec.abc.types.traits.Traits; import com.jpexs.asdec.abc.usages.*; import com.jpexs.asdec.helpers.Helper; -import com.jpexs.asdec.helpers.Highlighting; import java.io.*; import java.util.ArrayList; import java.util.HashMap; import java.util.HashSet; -import java.util.LinkedList; import java.util.List; -import java.util.Stack; import java.util.logging.Level; import java.util.logging.Logger; import java.util.regex.Pattern; @@ -255,7 +249,7 @@ public class ABC { bodyIdxFromMethodIdx[mb.method_info] = i; } loadNamespaceMap(); - /* for(ScriptInfo si:script_info){ + /* for(ScriptInfo si:script_info){ System.out.println("--------------------------------------------"); System.out.println(findBody(si.init_index).toString(true, false, -1, this, constants, method_info,new Stack(),false,false)); System.out.println("sitrait:"+si.traits.toString(this)); @@ -371,116 +365,6 @@ public class ABC { } } - private void parseImportFromNS(List imports, Namespace ns, String ignorePackage, String name) { - if(name.equals("")){ - name="*"; - } - if(ns.kind!=Namespace.KIND_PACKAGE){ - return; - } - String newimport = ns.getName(constants); - if (newimport.equals("-")) { - newimport = ""; - } - if (!newimport.equals("")) { - newimport += "." + name; - if (newimport.contains(":")) { - return; - } - if (!imports.contains(newimport)) { - String pkg = newimport.substring(0, newimport.lastIndexOf(".")); - if (!pkg.equals(ignorePackage)) { - imports.add(newimport); - } - } - } - } - - private void parseImportFromMultiname(List imports, Multiname m, String ignorePackage) { - if (m != null) { - Namespace ns = m.getNamespace(constants); - String name = m.getName(constants); - NamespaceSet nss = m.getNamespaceSet(constants); - if (ns != null) { - parseImportFromNS(imports, ns, ignorePackage, name); - } - if (nss != null) { - for (int ni : nss.namespaces) { - parseImportFromNS(imports, constants.constant_namespace[ni], ignorePackage, name); - } - } - } - } - - private void parseImportsFromMethodInfo(int method_index,List imports, String ignorePackage){ - if(method_info[method_index].ret_type!=0){ - parseImportFromMultiname(imports, constants.constant_multiname[method_info[method_index].ret_type], ignorePackage); - } - for(int t:method_info[method_index].param_types){ - if(t!=0){ - parseImportFromMultiname(imports, constants.constant_multiname[t], ignorePackage); - } - } - MethodBody body = findBody(method_index); - if (body != null) { - for (AVM2Instruction ins : body.code.code) { - for (int k = 0; k < ins.definition.operands.length; k++) { - if (ins.definition.operands[k] == AVM2Code.DAT_MULTINAME_INDEX) { - int multinameIndex = ins.operands[k]; - parseImportFromMultiname(imports, constants.constant_multiname[multinameIndex], ignorePackage); - } - } - } - } - } - - private List getImports(int instanceIndex) { - List imports = new ArrayList(); - - //constructor - - //parseImportFromMultiname(imports, constants.constant_multiname[instance_info[instanceIndex].name_index]); - - String packageName = instance_info[instanceIndex].getName(constants).getNamespace(constants).getName(constants); - - if (instance_info[instanceIndex].super_index > 0) { - parseImportFromMultiname(imports, constants.constant_multiname[instance_info[instanceIndex].super_index], packageName); - } - for (int i : instance_info[instanceIndex].interfaces) { - parseImportFromMultiname(imports, constants.constant_multiname[i], packageName); - } - - //static - for (Trait t : class_info[instanceIndex].static_traits.traits) { - //parseImportFromMultiname(imports, t.getMultiName(constants)); - if (t instanceof TraitMethodGetterSetter) { - TraitMethodGetterSetter tm = (TraitMethodGetterSetter) t; - if (tm.method_info != 0) { - parseImportsFromMethodInfo(tm.method_info,imports,packageName); - } - } - - } - - //static initializer - parseImportsFromMethodInfo(class_info[instanceIndex].cinit_index,imports,packageName); - - //instance - for (Trait t : instance_info[instanceIndex].instance_traits.traits) { - //parseImportFromMultiname(imports, t.getMultiName(constants)); - if (t instanceof TraitMethodGetterSetter) { - TraitMethodGetterSetter tm = (TraitMethodGetterSetter) t; - if (tm.method_info != 0) { - parseImportsFromMethodInfo(tm.method_info,imports,packageName); - } - } - } - - //instance initializer - parseImportsFromMethodInfo(instance_info[instanceIndex].iinit_index,imports,packageName); - return imports; - } - public MethodBody findBody(int methodInfo) { if (methodInfo < 0) { return null; @@ -501,7 +385,7 @@ public class ABC { for (Trait t : instance_info[i].instance_traits.traits) { if (t instanceof TraitMethodGetterSetter) { TraitMethodGetterSetter t2 = (TraitMethodGetterSetter) t; - if (methodName.equals(t2.getMethodName(constants))) { + if (methodName.equals(t2.getName(this).getName(constants))) { for (MethodBody body : bodies) { if (body.method_info == t2.method_info) { return body; @@ -518,7 +402,7 @@ public class ABC { for (Trait t : class_info[i].static_traits.traits) { if (t instanceof TraitMethodGetterSetter) { TraitMethodGetterSetter t2 = (TraitMethodGetterSetter) t; - if (methodName.equals(t2.getMethodName(constants))) { + if (methodName.equals(t2.getName(this).getName(constants))) { for (MethodBody body : bodies) { if (body.method_info == t2.method_info) { return body; @@ -535,7 +419,7 @@ public class ABC { return null; } - private String addTabs(String s, int tabs) { + public static String addTabs(String s, int tabs) { String parts[] = s.split("\r\n"); if (!s.contains("\r\n")) { parts = s.split("\n"); @@ -635,179 +519,15 @@ public class ABC { return ret; } - public String classToString(int i, boolean highlight, boolean pcode) { - if (!highlight) { - Highlighting.doHighlight = false; - } - String ret = ""; - ByteArrayOutputStream baos = new ByteArrayOutputStream(); - PrintStream out = new PrintStream(baos); - String packageName = instance_info[i].getName(constants).getNamespace(constants).getName(constants); - out.println("package " + packageName); - out.println("{"); - - //imports - List imports = getImports(i); - for (String imp : imports) { - out.println(IDENT_STRING + "import " + imp + ";"); - } - out.println(); - - //class header - String classHeader = instance_info[i].getClassHeaderStr(this); - /*if (classHeader.startsWith("private ")) { - classHeader = "public " + classHeader.substring("private ".length()); - }*/ - out.println(IDENT_STRING + classHeader); - out.println(IDENT_STRING + "{"); - - String toPrint; - List outTraits = new LinkedList(); - - //if (class_info[i].cinit_index != 0) { - if (AUTOINIT_STATIC_VARIABLES) { - int bodyIndex = findBodyIndex(class_info[i].cinit_index); - List initializer = bodies[bodyIndex].code.toTree(true, i, this, constants, method_info, bodies[bodyIndex], bodies[bodyIndex].code.getLocalRegNamesFromDebug(this)); - for (TreeItem ti : initializer) { - if (ti instanceof SetPropertyTreeItem) { - int multinameIndex = ((SetPropertyTreeItem) ti).propertyName.multinameIndex; - TreeItem value = ((SetPropertyTreeItem) ti).value; - for (Trait t : class_info[i].static_traits.traits) { - if (t.name_index == multinameIndex) { - if (t instanceof TraitSlotConst) { - ((TraitSlotConst) t).assignedValue = value; - } - } - } - } - if (ti instanceof InitPropertyTreeItem) { - int multinameIndex = ((InitPropertyTreeItem) ti).propertyName.multinameIndex; - TreeItem value = ((InitPropertyTreeItem) ti).value; - for (Trait t : class_info[i].static_traits.traits) { - if (t.name_index == multinameIndex) { - if (t instanceof TraitSlotConst) { - ((TraitSlotConst) t).assignedValue = value; - } - } - } - } - } - } - String bodyStr = ""; - int bodyIndex = findBodyIndex(class_info[i].cinit_index); - if (bodyIndex != -1) { - bodyStr = bodies[bodyIndex].toString(pcode, true, i, this, constants, method_info, new Stack(), true, highlight); - } - if (Highlighting.stripHilights(bodyStr).equals("")) { - toPrint = addTabs(bodyStr, 3); - } else { - toPrint = IDENT_STRING + IDENT_STRING + "{\r\n" + addTabs(bodyStr, 3) + "\r\n" + IDENT_STRING + IDENT_STRING + "}"; - } - if (highlight) { - toPrint = Highlighting.hilighTrait(toPrint, class_info[i].static_traits.traits.length + instance_info[i].instance_traits.traits.length + 1); - } - outTraits.add(toPrint); - //} - - //constructor - //if (instance_info[i].iinit_index != 0) { - if (!instance_info[i].isInterface()) { - String modifier = ""; - Multiname m = constants.constant_multiname[instance_info[i].name_index]; - if (m != null) { - Namespace ns = m.getNamespace(constants); - if (ns != null) { - modifier = ns.getPrefix(this) + " "; - if (modifier.equals(" ")) { - modifier = ""; - } - } - } - String constructorParams; - - bodyStr = ""; - bodyIndex = findBodyIndex(instance_info[i].iinit_index); - if (bodyIndex != -1) { - bodyStr = addTabs(bodies[bodyIndex].toString(pcode, false, i, this, constants, method_info, new Stack(), false, highlight), 3); - constructorParams = method_info[instance_info[i].iinit_index].getParamStr(constants, bodies[bodyIndex], this); - } else { - constructorParams = method_info[instance_info[i].iinit_index].getParamStr(constants, null, this); - } - toPrint = IDENT_STRING + IDENT_STRING + modifier + "function " + constants.constant_multiname[instance_info[i].name_index].getName(constants) + "(" + constructorParams + ") {\r\n" + bodyStr + "\r\n" + IDENT_STRING + IDENT_STRING + "}"; - if (highlight) { - toPrint = Highlighting.hilighTrait(toPrint, class_info[i].static_traits.traits.length + instance_info[i].instance_traits.traits.length); - } - outTraits.add(toPrint); - } - //} - - //static variables,constants & methods - for (int ti = 0; ti < class_info[i].static_traits.traits.length; ti++) { - Trait t = class_info[i].static_traits.traits[ti]; - toPrint = ""; - if (t instanceof TraitMethodGetterSetter) { - TraitMethodGetterSetter tm = (TraitMethodGetterSetter) t; - bodyStr = ""; - bodyIndex = findBodyIndex(tm.method_info); - if (bodyIndex != -1) { - bodyStr = addTabs(bodies[bodyIndex].toString(pcode, true, i, this, constants, method_info, new Stack(), false, highlight), 3); - } - toPrint = IDENT_STRING + IDENT_STRING + tm.convert(method_info, this, true) + (instance_info[i].isInterface() ? ";" : " {\r\n" + bodyStr + "\r\n" + IDENT_STRING + IDENT_STRING + "}"); - } - if (t instanceof TraitSlotConst) { - TraitSlotConst ts = (TraitSlotConst) t; - - toPrint = IDENT_STRING + IDENT_STRING + ts.convert(method_info, this, true) + ";"; - } - if (highlight) { - toPrint = Highlighting.hilighTrait(toPrint, ti); - } else { - toPrint = Highlighting.stripHilights(toPrint); - } - outTraits.add(toPrint); - } - for (int ti = 0; ti < instance_info[i].instance_traits.traits.length; ti++) { - Trait t = instance_info[i].instance_traits.traits[ti]; - toPrint = ""; - if (t instanceof TraitSlotConst) { - TraitSlotConst ts = (TraitSlotConst) t; - toPrint = IDENT_STRING + IDENT_STRING + ts.convert(method_info, this, false) + ";"; - } - - if (t instanceof TraitMethodGetterSetter) { - TraitMethodGetterSetter tm = (TraitMethodGetterSetter) t; - bodyStr = ""; - bodyIndex = findBodyIndex(tm.method_info); - if (bodyIndex != -1) { - bodyStr = addTabs(bodies[bodyIndex].toString(pcode, false, i, this, constants, method_info, new Stack(), false, highlight), 3); - } - toPrint = IDENT_STRING + IDENT_STRING + tm.convert(method_info, this, false) + (instance_info[i].isInterface() ? ";" : " {\r\n" + bodyStr + "\r\n" + IDENT_STRING + IDENT_STRING + "}"); - } - if (highlight) { - toPrint = Highlighting.hilighTrait(toPrint, class_info[i].static_traits.traits.length + ti); - } else { - toPrint = Highlighting.stripHilights(toPrint); - } - outTraits.add(toPrint); - } - - out.println(Helper.joinStrings(outTraits, "\r\n\r\n")); - out.println(IDENT_STRING + "}");//class - out.println("}");//package - out.flush(); - Highlighting.doHighlight = true; - return baos.toString(); - } - public void export(String directory, boolean pcode) throws IOException { - for (int i = 0; i < instance_info.length; i++) { - String packageName = instance_info[i].getName(constants).getNamespace(constants).getName(constants); - String className = instance_info[i].getName(constants).getName(constants); - String fullName = className; - if ((packageName != null) && (!packageName.equals(""))) { - fullName = packageName + "." + fullName; + for (int i = 0; i < script_info.length; i++) { + String path = script_info[i].getPath(this); + String packageName = path.substring(0, path.lastIndexOf(".")); + String className = path.substring(path.lastIndexOf(".") + 1); + if (packageName.equals("")) { + path = path.substring(1); } - String exStr = "Exporting " + (i + 1) + "/" + instance_info.length + " " + fullName + " ..."; + String exStr = "Exporting " + (i + 1) + "/" + script_info.length + " " + path + " ..."; informListeners("export", exStr); logger.info(exStr); File outDir = new File(directory + File.separatorChar + packageName.replace('.', File.separatorChar)); @@ -816,24 +536,9 @@ public class ABC { } String fileName = outDir.toString() + File.separator + className + ".as"; FileOutputStream fos = new FileOutputStream(fileName); - fos.write(classToString(i, false, pcode).getBytes()); + fos.write(script_info[i].convert(this, pcode, false).getBytes()); fos.close(); } - informListeners("export", "Exporting namespaces..."); - HashMap ns = namespacesToString(); - for (String n : ns.keySet()) { - String nsName = n.substring(n.lastIndexOf(".") + 1); - String packageName = n.substring(0, n.lastIndexOf(".")); - File outDir = new File(directory + File.separatorChar + packageName.replace('.', File.separatorChar)); - if (!outDir.exists()) { - outDir.mkdirs(); - } - String fileName = outDir.toString() + File.separator + nsName + ".as"; - FileOutputStream fos = new FileOutputStream(fileName); - fos.write(ns.get(n).getBytes()); - fos.close(); - } - } public void dump(OutputStream os) { diff --git a/trunk/src/com/jpexs/asdec/abc/ABCInputStream.java b/trunk/src/com/jpexs/asdec/abc/ABCInputStream.java index 5bd2eb096..5a6f8a713 100644 --- a/trunk/src/com/jpexs/asdec/abc/ABCInputStream.java +++ b/trunk/src/com/jpexs/asdec/abc/ABCInputStream.java @@ -269,7 +269,7 @@ public class ABCInputStream extends InputStream { int kind = read(); int kindType = 0xf & kind; int kindFlags = kind >> 4; - Trait trait = new Trait(); + Trait trait; switch (kindType) { case 0: //slot @@ -303,6 +303,8 @@ public class ABCInputStream extends InputStream { t4.method_info = readU30(); trait = t4; break; + default: + throw new IOException("Unknown trait kind:" + kind); } trait.fileOffset = pos; trait.kindType = kindType; diff --git a/trunk/src/com/jpexs/asdec/abc/avm2/AVM2Code.java b/trunk/src/com/jpexs/asdec/abc/avm2/AVM2Code.java index 4c6226e56..c5cd26265 100644 --- a/trunk/src/com/jpexs/asdec/abc/avm2/AVM2Code.java +++ b/trunk/src/com/jpexs/asdec/abc/avm2/AVM2Code.java @@ -1610,8 +1610,8 @@ public class AVM2Code { return ret; } - public String toSource(boolean isStatic, int classIndex, ABC abc, ConstantPool constants, MethodInfo method_info[], MethodBody body, HashMap localRegNames, Stack scopeStack,boolean isStaticInitializer) { - return toSource(isStatic, classIndex, abc, constants, method_info, body, false, localRegNames, scopeStack,isStaticInitializer); + public String toSource(boolean isStatic, int classIndex, ABC abc, ConstantPool constants, MethodInfo method_info[], MethodBody body, HashMap localRegNames, Stack scopeStack, boolean isStaticInitializer) { + return toSource(isStatic, classIndex, abc, constants, method_info, body, false, localRegNames, scopeStack, isStaticInitializer); } public List toTree(boolean isStatic, int classIndex, ABC abc, ConstantPool constants, MethodInfo method_info[], MethodBody body, HashMap localRegNames) { @@ -1689,7 +1689,7 @@ public class AVM2Code { } } - public String toSource(boolean isStatic, int classIndex, ABC abc, ConstantPool constants, MethodInfo method_info[], MethodBody body, boolean hilighted, HashMap localRegNames, Stack scopeStack,boolean isStaticInitializer) { + public String toSource(boolean isStatic, int classIndex, ABC abc, ConstantPool constants, MethodInfo method_info[], MethodBody body, boolean hilighted, HashMap localRegNames, Stack scopeStack, boolean isStaticInitializer) { toSourceCount = 0; loopList = new ArrayList(); unknownJumps = new ArrayList(); @@ -1712,20 +1712,20 @@ public class AVM2Code { try { list = toSource(isStatic, classIndex, localRegs, new Stack(), scopeStack, abc, constants, method_info, body, 0, code.size() - 1, localRegNames).output; - if(isStaticInitializer){ - - List newList=new ArrayList(); - for(TreeItem ti:list){ - if(!(ti instanceof ReturnVoidTreeItem)){ - if(!(ti instanceof InitPropertyTreeItem)){ - if(!(ti instanceof SetPropertyTreeItem)){ + if (isStaticInitializer) { + + List newList = new ArrayList(); + for (TreeItem ti : list) { + if (!(ti instanceof ReturnVoidTreeItem)) { + if (!(ti instanceof InitPropertyTreeItem)) { + if (!(ti instanceof SetPropertyTreeItem)) { newList.add(ti); } } } } - list=newList; - if(list.isEmpty()){ + list = newList; + if (list.isEmpty()) { return ""; } } @@ -1750,7 +1750,7 @@ public class AVM2Code { if (!declaredSlots.contains(sl)) { String type = "*"; for (int t = 0; t < body.traits.traits.length; t++) { - if (body.traits.traits[t].getMultiName(constants) == sl.multiname) { + if (body.traits.traits[t].getName(abc) == sl.multiname) { if (body.traits.traits[t] instanceof TraitSlotConst) { type = ((TraitSlotConst) body.traits.traits[t]).getType(constants); } diff --git a/trunk/src/com/jpexs/asdec/abc/avm2/instructions/SetTypeIns.java b/trunk/src/com/jpexs/asdec/abc/avm2/instructions/SetTypeIns.java index 9187bfcfb..8ab0c0492 100644 --- a/trunk/src/com/jpexs/asdec/abc/avm2/instructions/SetTypeIns.java +++ b/trunk/src/com/jpexs/asdec/abc/avm2/instructions/SetTypeIns.java @@ -16,14 +16,13 @@ */ package com.jpexs.asdec.abc.avm2.instructions; -import com.jpexs.asdec.abc.avm2.ConstantPool; +import com.jpexs.asdec.abc.ABC; import com.jpexs.asdec.abc.avm2.treemodel.TreeItem; -import com.jpexs.asdec.abc.types.MethodInfo; import java.util.HashMap; import java.util.List; import java.util.Stack; public interface SetTypeIns { - public abstract String getObject(Stack stack, ConstantPool constants, AVM2Instruction ins, MethodInfo[] method_info, List output, com.jpexs.asdec.abc.types.MethodBody body, HashMap localRegNames); + public abstract String getObject(Stack stack, ABC abc, AVM2Instruction ins, List output, com.jpexs.asdec.abc.types.MethodBody body, HashMap localRegNames); } diff --git a/trunk/src/com/jpexs/asdec/abc/avm2/instructions/construction/NewFunctionIns.java b/trunk/src/com/jpexs/asdec/abc/avm2/instructions/construction/NewFunctionIns.java index 6fd877f41..3a5b39c9e 100644 --- a/trunk/src/com/jpexs/asdec/abc/avm2/instructions/construction/NewFunctionIns.java +++ b/trunk/src/com/jpexs/asdec/abc/avm2/instructions/construction/NewFunctionIns.java @@ -43,7 +43,7 @@ public class NewFunctionIns extends InstructionDefinition { String bodyStr = ""; String paramStr = ""; if (mybody != null) { - bodyStr = Highlighting.hilighMethodEnd() + mybody.toString(false, isStatic, classIndex, abc, constants, method_info, new Stack()/*scopeStack*/, false,true) + Highlighting.hilighMethodBegin(body.method_info); + bodyStr = Highlighting.hilighMethodEnd() + mybody.toString(false, isStatic, classIndex, abc, constants, method_info, new Stack()/*scopeStack*/, false, true) + Highlighting.hilighMethodBegin(body.method_info); paramStr = method_info[methodIndex].getParamStr(constants, mybody, abc); } stack.push(new NewFunctionTreeItem(ins, paramStr, method_info[methodIndex].getReturnTypeStr(constants), bodyStr)); diff --git a/trunk/src/com/jpexs/asdec/abc/avm2/instructions/localregs/SetLocalTypeIns.java b/trunk/src/com/jpexs/asdec/abc/avm2/instructions/localregs/SetLocalTypeIns.java index e8c85a51f..cea4ddb77 100644 --- a/trunk/src/com/jpexs/asdec/abc/avm2/instructions/localregs/SetLocalTypeIns.java +++ b/trunk/src/com/jpexs/asdec/abc/avm2/instructions/localregs/SetLocalTypeIns.java @@ -105,7 +105,7 @@ public abstract class SetLocalTypeIns extends InstructionDefinition implements S output.add(new SetLocalTreeItem(ins, regId, value)); } - public String getObject(Stack stack, ConstantPool constants, AVM2Instruction ins, MethodInfo[] method_info, List output, com.jpexs.asdec.abc.types.MethodBody body, HashMap localRegNames) { + public String getObject(Stack stack, ABC abc, AVM2Instruction ins, List output, com.jpexs.asdec.abc.types.MethodBody body, HashMap localRegNames) { return TreeItem.localRegName(localRegNames, getRegisterId(ins)); } diff --git a/trunk/src/com/jpexs/asdec/abc/avm2/instructions/other/GetGlobalScopeIns.java b/trunk/src/com/jpexs/asdec/abc/avm2/instructions/other/GetGlobalScopeIns.java index c2a2065f7..e671c6bcb 100644 --- a/trunk/src/com/jpexs/asdec/abc/avm2/instructions/other/GetGlobalScopeIns.java +++ b/trunk/src/com/jpexs/asdec/abc/avm2/instructions/other/GetGlobalScopeIns.java @@ -41,7 +41,7 @@ public class GetGlobalScopeIns extends InstructionDefinition { @Override public void translate(boolean isStatic, int classIndex, java.util.HashMap localRegs, Stack stack, java.util.Stack scopeStack, ConstantPool constants, AVM2Instruction ins, MethodInfo[] method_info, List output, com.jpexs.asdec.abc.types.MethodBody body, com.jpexs.asdec.abc.ABC abc, HashMap localRegNames) { - if(scopeStack.isEmpty()){ + if (scopeStack.isEmpty()) { stack.push(new ClassTreeItem(abc.instance_info[classIndex].getName(constants))); return; } diff --git a/trunk/src/com/jpexs/asdec/abc/avm2/instructions/other/GetGlobalSlotIns.java b/trunk/src/com/jpexs/asdec/abc/avm2/instructions/other/GetGlobalSlotIns.java index 72a05bff3..c9d1e3e35 100644 --- a/trunk/src/com/jpexs/asdec/abc/avm2/instructions/other/GetGlobalSlotIns.java +++ b/trunk/src/com/jpexs/asdec/abc/avm2/instructions/other/GetGlobalSlotIns.java @@ -49,7 +49,7 @@ public class GetGlobalSlotIns extends InstructionDefinition { for (int t = 0; t < body.traits.traits.length; t++) { if (body.traits.traits[t] instanceof TraitSlotConst) { if (((TraitSlotConst) body.traits.traits[t]).slot_id == slotIndex) { - slotname = body.traits.traits[t].getMultiName(constants); + slotname = body.traits.traits[t].getName(abc); } } diff --git a/trunk/src/com/jpexs/asdec/abc/avm2/instructions/other/GetScopeObjectIns.java b/trunk/src/com/jpexs/asdec/abc/avm2/instructions/other/GetScopeObjectIns.java index 0f8e2eeea..a7ac0d8f5 100644 --- a/trunk/src/com/jpexs/asdec/abc/avm2/instructions/other/GetScopeObjectIns.java +++ b/trunk/src/com/jpexs/asdec/abc/avm2/instructions/other/GetScopeObjectIns.java @@ -39,7 +39,7 @@ public class GetScopeObjectIns extends InstructionDefinition { /* System.out.println("Getting scope object"+index+":"); for(TreeItem ti:scopeStack){ System.out.println(ti.toString(constants)); - }*/ + }*/ stack.push(scopeStack.get(index)); } diff --git a/trunk/src/com/jpexs/asdec/abc/avm2/instructions/other/GetSlotIns.java b/trunk/src/com/jpexs/asdec/abc/avm2/instructions/other/GetSlotIns.java index 9f6d6485f..ce28a3633 100644 --- a/trunk/src/com/jpexs/asdec/abc/avm2/instructions/other/GetSlotIns.java +++ b/trunk/src/com/jpexs/asdec/abc/avm2/instructions/other/GetSlotIns.java @@ -54,7 +54,7 @@ public class GetSlotIns extends InstructionDefinition { for (int t = 0; t < body.traits.traits.length; t++) { if (body.traits.traits[t] instanceof TraitSlotConst) { if (((TraitSlotConst) body.traits.traits[t]).slot_id == slotIndex) { - slotname = body.traits.traits[t].getMultiName(constants); + slotname = body.traits.traits[t].getName(abc); } } diff --git a/trunk/src/com/jpexs/asdec/abc/avm2/instructions/other/SetGlobalSlotIns.java b/trunk/src/com/jpexs/asdec/abc/avm2/instructions/other/SetGlobalSlotIns.java index ab4afc483..ddd4a7f77 100644 --- a/trunk/src/com/jpexs/asdec/abc/avm2/instructions/other/SetGlobalSlotIns.java +++ b/trunk/src/com/jpexs/asdec/abc/avm2/instructions/other/SetGlobalSlotIns.java @@ -40,7 +40,7 @@ public class SetGlobalSlotIns extends InstructionDefinition implements SetTypeIn output.add(new SetGlobalSlotTreeItem(ins, ins.operands[0], (TreeItem) stack.pop())); } - public String getObject(Stack stack, ConstantPool constants, AVM2Instruction ins, MethodInfo[] method_info, List output, com.jpexs.asdec.abc.types.MethodBody body, HashMap localRegNames) { + public String getObject(Stack stack, ABC abc, AVM2Instruction ins, List output, com.jpexs.asdec.abc.types.MethodBody body, HashMap localRegNames) { return "globalslot" + ins.operands[0]; } diff --git a/trunk/src/com/jpexs/asdec/abc/avm2/instructions/other/SetPropertyIns.java b/trunk/src/com/jpexs/asdec/abc/avm2/instructions/other/SetPropertyIns.java index dcf881403..7eba4b1bf 100644 --- a/trunk/src/com/jpexs/asdec/abc/avm2/instructions/other/SetPropertyIns.java +++ b/trunk/src/com/jpexs/asdec/abc/avm2/instructions/other/SetPropertyIns.java @@ -112,10 +112,10 @@ public class SetPropertyIns extends InstructionDefinition implements SetTypeIns output.add(new SetPropertyTreeItem(ins, obj, multiname, value)); } - public String getObject(Stack stack, ConstantPool constants, AVM2Instruction ins, MethodInfo[] method_info, List output, com.jpexs.asdec.abc.types.MethodBody body, HashMap localRegNames) { + public String getObject(Stack stack, ABC abc, AVM2Instruction ins, List output, com.jpexs.asdec.abc.types.MethodBody body, HashMap localRegNames) { int multinameIndex = ins.operands[0]; - String multiname = resolveMultinameNoPop(0, stack, constants, multinameIndex, ins); - TreeItem obj = stack.get(1 + resolvedCount(constants, multinameIndex)); //pod vrcholem + String multiname = resolveMultinameNoPop(0, stack, abc.constants, multinameIndex, ins); + TreeItem obj = stack.get(1 + resolvedCount(abc.constants, multinameIndex)); //pod vrcholem if ((!obj.toString().equals(""))) { multiname = "." + multiname; } diff --git a/trunk/src/com/jpexs/asdec/abc/avm2/instructions/other/SetSlotIns.java b/trunk/src/com/jpexs/asdec/abc/avm2/instructions/other/SetSlotIns.java index 02d034d43..8a1bc4202 100644 --- a/trunk/src/com/jpexs/asdec/abc/avm2/instructions/other/SetSlotIns.java +++ b/trunk/src/com/jpexs/asdec/abc/avm2/instructions/other/SetSlotIns.java @@ -25,7 +25,6 @@ import com.jpexs.asdec.abc.avm2.instructions.SetTypeIns; import com.jpexs.asdec.abc.avm2.treemodel.DecrementTreeItem; import com.jpexs.asdec.abc.avm2.treemodel.GetSlotTreeItem; import com.jpexs.asdec.abc.avm2.treemodel.IncrementTreeItem; -import com.jpexs.asdec.abc.avm2.treemodel.NewActivationTreeItem; import com.jpexs.asdec.abc.avm2.treemodel.PostDecrementTreeItem; import com.jpexs.asdec.abc.avm2.treemodel.PostIncrementTreeItem; import com.jpexs.asdec.abc.avm2.treemodel.SetSlotTreeItem; @@ -60,7 +59,7 @@ public class SetSlotIns extends InstructionDefinition implements SetTypeIns { for (int t = 0; t < body.traits.traits.length; t++) { if (body.traits.traits[t] instanceof TraitSlotConst) { if (((TraitSlotConst) body.traits.traits[t]).slot_id == slotIndex) { - slotname = body.traits.traits[t].getMultiName(constants); + slotname = body.traits.traits[t].getName(abc); } } @@ -123,14 +122,14 @@ public class SetSlotIns extends InstructionDefinition implements SetTypeIns { output.add(new SetSlotTreeItem(ins, obj, slotname, value)); } - public String getObject(Stack stack, ConstantPool constants, AVM2Instruction ins, MethodInfo[] method_info, List output, com.jpexs.asdec.abc.types.MethodBody body, HashMap localRegNames) { + public String getObject(Stack stack, ABC abc, AVM2Instruction ins, List output, com.jpexs.asdec.abc.types.MethodBody body, HashMap localRegNames) { int slotIndex = ins.operands[0]; ////String obj = stack.get(1); String slotname = ""; for (int t = 0; t < body.traits.traits.length; t++) { if (body.traits.traits[t] instanceof TraitSlotConst) { if (((TraitSlotConst) body.traits.traits[t]).slot_id == slotIndex) { - slotname = body.traits.traits[t].getMultiName(constants).getName(constants); + slotname = body.traits.traits[t].getName(abc).getName(abc.constants); } } diff --git a/trunk/src/com/jpexs/asdec/abc/avm2/instructions/other/SetSuperIns.java b/trunk/src/com/jpexs/asdec/abc/avm2/instructions/other/SetSuperIns.java index 42c2d8ae0..8689fe852 100644 --- a/trunk/src/com/jpexs/asdec/abc/avm2/instructions/other/SetSuperIns.java +++ b/trunk/src/com/jpexs/asdec/abc/avm2/instructions/other/SetSuperIns.java @@ -46,10 +46,10 @@ public class SetSuperIns extends InstructionDefinition implements SetTypeIns { output.add(new SetSuperTreeItem(ins, value, obj, multiname)); } - public String getObject(Stack stack, ConstantPool constants, AVM2Instruction ins, MethodInfo[] method_info, List output, com.jpexs.asdec.abc.types.MethodBody body, HashMap localRegNames) { + public String getObject(Stack stack, ABC abc, AVM2Instruction ins, List output, com.jpexs.asdec.abc.types.MethodBody body, HashMap localRegNames) { int multinameIndex = ins.operands[0]; - String multiname = resolveMultinameNoPop(1, stack, constants, multinameIndex, ins); - String obj = stack.get(1 + resolvedCount(constants, multinameIndex)).toString(constants, localRegNames); + String multiname = resolveMultinameNoPop(1, stack, abc.constants, multinameIndex, ins); + String obj = stack.get(1 + resolvedCount(abc.constants, multinameIndex)).toString(abc.constants, localRegNames); return obj + ".super." + multiname; } diff --git a/trunk/src/com/jpexs/asdec/abc/avm2/treemodel/InitPropertyTreeItem.java b/trunk/src/com/jpexs/asdec/abc/avm2/treemodel/InitPropertyTreeItem.java index 6dda585d1..60bb6eba6 100644 --- a/trunk/src/com/jpexs/asdec/abc/avm2/treemodel/InitPropertyTreeItem.java +++ b/trunk/src/com/jpexs/asdec/abc/avm2/treemodel/InitPropertyTreeItem.java @@ -21,7 +21,7 @@ import com.jpexs.asdec.abc.avm2.instructions.AVM2Instruction; import com.jpexs.asdec.abc.avm2.treemodel.clauses.AssignmentTreeItem; import java.util.HashMap; -public class InitPropertyTreeItem extends TreeItem implements SetTypeTreeItem,AssignmentTreeItem { +public class InitPropertyTreeItem extends TreeItem implements SetTypeTreeItem, AssignmentTreeItem { public TreeItem object; public FullMultinameTreeItem propertyName; diff --git a/trunk/src/com/jpexs/asdec/abc/avm2/treemodel/SetLocalTreeItem.java b/trunk/src/com/jpexs/asdec/abc/avm2/treemodel/SetLocalTreeItem.java index e0ccb3a84..a2cafe384 100644 --- a/trunk/src/com/jpexs/asdec/abc/avm2/treemodel/SetLocalTreeItem.java +++ b/trunk/src/com/jpexs/asdec/abc/avm2/treemodel/SetLocalTreeItem.java @@ -21,7 +21,7 @@ import com.jpexs.asdec.abc.avm2.instructions.AVM2Instruction; import com.jpexs.asdec.abc.avm2.treemodel.clauses.AssignmentTreeItem; import java.util.HashMap; -public class SetLocalTreeItem extends TreeItem implements SetTypeTreeItem,AssignmentTreeItem { +public class SetLocalTreeItem extends TreeItem implements SetTypeTreeItem, AssignmentTreeItem { public int regIndex; public TreeItem value; diff --git a/trunk/src/com/jpexs/asdec/abc/avm2/treemodel/SetPropertyTreeItem.java b/trunk/src/com/jpexs/asdec/abc/avm2/treemodel/SetPropertyTreeItem.java index a23232008..83637af2f 100644 --- a/trunk/src/com/jpexs/asdec/abc/avm2/treemodel/SetPropertyTreeItem.java +++ b/trunk/src/com/jpexs/asdec/abc/avm2/treemodel/SetPropertyTreeItem.java @@ -21,7 +21,7 @@ import com.jpexs.asdec.abc.avm2.instructions.AVM2Instruction; import com.jpexs.asdec.abc.avm2.treemodel.clauses.AssignmentTreeItem; import java.util.HashMap; -public class SetPropertyTreeItem extends TreeItem implements SetTypeTreeItem,AssignmentTreeItem { +public class SetPropertyTreeItem extends TreeItem implements SetTypeTreeItem, AssignmentTreeItem { public TreeItem object; public FullMultinameTreeItem propertyName; diff --git a/trunk/src/com/jpexs/asdec/abc/avm2/treemodel/SetSlotTreeItem.java b/trunk/src/com/jpexs/asdec/abc/avm2/treemodel/SetSlotTreeItem.java index bfd80b2ed..6273f8aaa 100644 --- a/trunk/src/com/jpexs/asdec/abc/avm2/treemodel/SetSlotTreeItem.java +++ b/trunk/src/com/jpexs/asdec/abc/avm2/treemodel/SetSlotTreeItem.java @@ -22,7 +22,7 @@ import com.jpexs.asdec.abc.avm2.treemodel.clauses.AssignmentTreeItem; import com.jpexs.asdec.abc.types.Multiname; import java.util.HashMap; -public class SetSlotTreeItem extends TreeItem implements SetTypeTreeItem,AssignmentTreeItem { +public class SetSlotTreeItem extends TreeItem implements SetTypeTreeItem, AssignmentTreeItem { public Multiname slotName; public TreeItem value; @@ -37,24 +37,24 @@ public class SetSlotTreeItem extends TreeItem implements SetTypeTreeItem,Assignm @Override public String toString(ConstantPool constants, HashMap localRegNames) { - - return getName(constants,localRegNames)+ hilight("=") + value.toString(constants, localRegNames); + + return getName(constants, localRegNames) + hilight("=") + value.toString(constants, localRegNames); } - - public String getName(ConstantPool constants, HashMap localRegNames){ + + public String getName(ConstantPool constants, HashMap localRegNames) { String ret = ""; /*ret = scope.toString(constants, localRegNames) + "."; - if (!(scope instanceof NewActivationTreeItem)) { - ret = scope.toString(constants, localRegNames) + "."; - } - if (scope instanceof LocalRegTreeItem) { - if (((LocalRegTreeItem) scope).computedValue != null) { - if (((LocalRegTreeItem) scope).computedValue instanceof NewActivationTreeItem) { - ret = ""; - } - } - }*/ + if (!(scope instanceof NewActivationTreeItem)) { + ret = scope.toString(constants, localRegNames) + "."; + } + if (scope instanceof LocalRegTreeItem) { + if (((LocalRegTreeItem) scope).computedValue != null) { + if (((LocalRegTreeItem) scope).computedValue instanceof NewActivationTreeItem) { + ret = ""; + } + } + }*/ return ret + hilight(slotName.getName(constants)); } diff --git a/trunk/src/com/jpexs/asdec/abc/avm2/treemodel/clauses/AssignmentTreeItem.java b/trunk/src/com/jpexs/asdec/abc/avm2/treemodel/clauses/AssignmentTreeItem.java index 5ad7f3fce..944422ceb 100644 --- a/trunk/src/com/jpexs/asdec/abc/avm2/treemodel/clauses/AssignmentTreeItem.java +++ b/trunk/src/com/jpexs/asdec/abc/avm2/treemodel/clauses/AssignmentTreeItem.java @@ -22,5 +22,4 @@ package com.jpexs.asdec.abc.avm2.treemodel.clauses; * @author JPEXS */ public interface AssignmentTreeItem { - } diff --git a/trunk/src/com/jpexs/asdec/abc/avm2/treemodel/clauses/DeclarationTreeItem.java b/trunk/src/com/jpexs/asdec/abc/avm2/treemodel/clauses/DeclarationTreeItem.java index eddd5fcb1..ff0b1b477 100644 --- a/trunk/src/com/jpexs/asdec/abc/avm2/treemodel/clauses/DeclarationTreeItem.java +++ b/trunk/src/com/jpexs/asdec/abc/avm2/treemodel/clauses/DeclarationTreeItem.java @@ -20,8 +20,6 @@ package com.jpexs.asdec.abc.avm2.treemodel.clauses; import com.jpexs.asdec.abc.avm2.ConstantPool; import com.jpexs.asdec.abc.avm2.treemodel.CoerceTreeItem; import com.jpexs.asdec.abc.avm2.treemodel.ConvertTreeItem; -import com.jpexs.asdec.abc.avm2.treemodel.LocalRegTreeItem; -import com.jpexs.asdec.abc.avm2.treemodel.NewActivationTreeItem; import com.jpexs.asdec.abc.avm2.treemodel.SetLocalTreeItem; import com.jpexs.asdec.abc.avm2.treemodel.SetSlotTreeItem; import com.jpexs.asdec.abc.avm2.treemodel.TreeItem; @@ -60,7 +58,7 @@ public class DeclarationTreeItem extends TreeItem { return "var " + hilight(localRegName(localRegNames, lti.regIndex) + ":" + type + " = ") + lti.value.toString(constants, localRegNames); } if (assignment instanceof SetSlotTreeItem) { - SetSlotTreeItem ssti = (SetSlotTreeItem) assignment; + SetSlotTreeItem ssti = (SetSlotTreeItem) assignment; return "var " + ssti.getName(constants, localRegNames) + ":" + type + hilight(" = ") + ssti.value.toString(constants, localRegNames); } return "var " + assignment.toString(constants, localRegNames); diff --git a/trunk/src/com/jpexs/asdec/abc/gui/ClassesListTree.java b/trunk/src/com/jpexs/asdec/abc/gui/ClassesListTree.java index ee3a459eb..c463f9801 100644 --- a/trunk/src/com/jpexs/asdec/abc/gui/ClassesListTree.java +++ b/trunk/src/com/jpexs/asdec/abc/gui/ClassesListTree.java @@ -18,6 +18,9 @@ package com.jpexs.asdec.abc.gui; import com.jpexs.asdec.Main; import com.jpexs.asdec.abc.ABC; +import com.jpexs.asdec.abc.types.ScriptInfo; +import com.jpexs.asdec.abc.types.traits.Trait; +import com.jpexs.asdec.abc.types.traits.TraitClass; import javax.swing.ImageIcon; import javax.swing.JTree; import javax.swing.event.TreeSelectionEvent; @@ -63,27 +66,29 @@ public class ClassesListTree extends JTree implements TreeSelectionListener { return; } Object item = tp.getItem(); - if (item instanceof TreeLeafString) { - Main.abcMainFrame.navigator.setClassIndex(-1); - Main.abcMainFrame.decompiledTextArea.setClassIndex(-1, abc); - Main.abcMainFrame.decompiledTextArea.setText(((TreeLeafString) item).str); - } - if (item instanceof TreeLeafClass) { - final int classIndex = ((TreeLeafClass) item).classIndex; - if (classIndex != -1) { - if (!Main.isWorking()) { - Main.startWork("Decompiling class..."); - (new Thread() { - @Override - public void run() { - Main.abcMainFrame.navigator.setClassIndex(classIndex); - Main.abcMainFrame.decompiledTextArea.setClassIndex(classIndex, abc); - Main.abcMainFrame.detailPanel.methodTraitPanel.methodCodePanel.sourceTextArea.setText(""); - Main.stopWork(); + if (item instanceof ScriptInfo) { + final ScriptInfo script = (ScriptInfo) item; + + if (!Main.isWorking()) { + Main.startWork("Decompiling class..."); + (new Thread() { + @Override + public void run() { + int classIndex = -1; + for (Trait t : script.traits.traits) { + if (t instanceof TraitClass) { + classIndex = ((TraitClass) t).class_info; + break; + } } - }).start(); - } + Main.abcMainFrame.navigator.setClassIndex(classIndex); + Main.abcMainFrame.decompiledTextArea.setScript(script, abc); + Main.abcMainFrame.detailPanel.methodTraitPanel.methodCodePanel.sourceTextArea.setText(""); + Main.stopWork(); + } + }).start(); } + } } diff --git a/trunk/src/com/jpexs/asdec/abc/gui/ClassesListTreeModel.java b/trunk/src/com/jpexs/asdec/abc/gui/ClassesListTreeModel.java index 73b9fe69f..50f5a3a98 100644 --- a/trunk/src/com/jpexs/asdec/abc/gui/ClassesListTreeModel.java +++ b/trunk/src/com/jpexs/asdec/abc/gui/ClassesListTreeModel.java @@ -17,7 +17,7 @@ package com.jpexs.asdec.abc.gui; import com.jpexs.asdec.abc.ABC; -import java.util.HashMap; +import com.jpexs.asdec.abc.types.ScriptInfo; import javax.swing.event.TreeModelListener; import javax.swing.tree.TreeModel; import javax.swing.tree.TreePath; @@ -55,17 +55,11 @@ public class ClassesListTreeModel implements TreeModel { public ClassesListTreeModel(ABC abc) { this.abc = abc; - for (int i = 0; i < abc.instance_info.length; i++) { - String packageName = abc.instance_info[i].getName(abc.constants).getNamespace(abc.constants).getName(abc.constants); - String className = abc.instance_info[i].getName(abc.constants).getName(abc.constants); - //String full = packageName + "." + className; - classTree.add(className, packageName, new TreeLeafClass(i)); - } - HashMap ns = abc.namespacesToString(); - for (String n : ns.keySet()) { - String nsName = n.substring(n.lastIndexOf(".") + 1); - String packageName = n.substring(0, n.lastIndexOf(".")); - classTree.add(nsName, packageName, new TreeLeafString(ns.get(n))); + for (ScriptInfo si : abc.script_info) { + String path = si.getPath(abc); + String nsName = path.substring(path.lastIndexOf(".") + 1); + String packageName = path.substring(0, path.lastIndexOf(".")); + classTree.add(nsName, packageName, si); } } diff --git a/trunk/src/com/jpexs/asdec/abc/gui/DecompiledEditorPane.java b/trunk/src/com/jpexs/asdec/abc/gui/DecompiledEditorPane.java index c924d0f8f..874a9e31e 100644 --- a/trunk/src/com/jpexs/asdec/abc/gui/DecompiledEditorPane.java +++ b/trunk/src/com/jpexs/asdec/abc/gui/DecompiledEditorPane.java @@ -19,6 +19,7 @@ package com.jpexs.asdec.abc.gui; import com.jpexs.asdec.Main; import com.jpexs.asdec.abc.ABC; import com.jpexs.asdec.abc.avm2.ConvertException; +import com.jpexs.asdec.abc.types.ScriptInfo; import com.jpexs.asdec.abc.types.traits.Trait; import com.jpexs.asdec.abc.types.traits.TraitSlotConst; import com.jpexs.asdec.helpers.Highlighting; @@ -35,8 +36,9 @@ public class DecompiledEditorPane extends LineMarkedEditorPane implements MouseL private List highlights = new ArrayList(); private List traitHighlights = new ArrayList(); private List methodHighlights = new ArrayList(); + private List classHighlights = new ArrayList(); private ABC abc; - private int classIndex; + private ScriptInfo script; public int lastTraitIndex = 0; public void setNoTrait() { @@ -69,9 +71,30 @@ public class DecompiledEditorPane extends LineMarkedEditorPane implements MouseL return success; } + public void displayClass(int classIndex) { + if (Main.abcMainFrame.navigator.getClassIndex() != classIndex) { + Main.abcMainFrame.navigator.setClassIndex(classIndex); + } + } + private int classIndex = -1; + public void caretUpdate(CaretEvent e) { getCaret().setVisible(true); int pos = getCaretPosition(); + + + for (Highlighting cm : classHighlights) { + if ((pos >= cm.startPos) && (pos < cm.startPos + cm.len)) { + classIndex = (int) cm.offset; + displayClass(classIndex); + break; + } + } + + if (classIndex == -1) { + setNoTrait(); + return; + } for (Highlighting tm : methodHighlights) { if ((pos >= tm.startPos) && (pos < tm.startPos + tm.len)) { displayMethod(pos, (int) tm.offset); @@ -102,15 +125,17 @@ public class DecompiledEditorPane extends LineMarkedEditorPane implements MouseL public List highlights; public List traitHighlights; public List methodHighlights; + public List classHighlights; - public BufferedClass(String text, List highlights, List traitHighlights, List methodHighlights) { + public BufferedClass(String text, List highlights, List traitHighlights, List methodHighlights, List classHighlights) { this.text = text; this.highlights = highlights; this.traitHighlights = traitHighlights; this.methodHighlights = methodHighlights; + this.classHighlights = classHighlights; } } - private HashMap bufferedClasses = new HashMap(); + private HashMap bufferedClasses = new HashMap(); public void gotoLastTrait() { gotoTrait(lastTraitIndex); @@ -121,16 +146,27 @@ public class DecompiledEditorPane extends LineMarkedEditorPane implements MouseL setCaretPosition(0); return; } - for (Highlighting th : traitHighlights) { - if (th.offset == traitId) { - try { - setCaretPosition(th.startPos + th.len - 1); - setCaretPosition(th.startPos); - } catch (IllegalArgumentException iae) { + + for (Highlighting tc : classHighlights) { + if (tc.offset == classIndex) { + for (Highlighting th : traitHighlights) { + if ((th.startPos > tc.startPos) && (th.startPos + th.len < tc.startPos + tc.len)) { + if (th.offset == traitId) { + try { + setCaretPosition(th.startPos + th.len - 1); + setCaretPosition(th.startPos); + } catch (IllegalArgumentException iae) { + } + return; + } + } } - return; + break; } } + + + setCaretPosition(0); } @@ -141,26 +177,27 @@ public class DecompiledEditorPane extends LineMarkedEditorPane implements MouseL addCaretListener(this); } - public void setClassIndex(int index, ABC abc) { + public void setScript(ScriptInfo script, ABC abc) { setText("//Please wait..."); - if (index == -1) { + if (script == null) { highlights = new ArrayList(); traitHighlights = new ArrayList(); methodHighlights = new ArrayList(); - classIndex = -1; + this.script = null; return; } String hilightedCode; - if (!bufferedClasses.containsKey(index)) { - hilightedCode = abc.classToString(index, true, false); + if (!bufferedClasses.containsKey(script)) { + hilightedCode = script.convert(abc, false, true); highlights = Highlighting.getInstrHighlights(hilightedCode); traitHighlights = Highlighting.getTraitHighlights(hilightedCode); methodHighlights = Highlighting.getMethodHighlights(hilightedCode); + classHighlights = Highlighting.getClassHighlights(hilightedCode); hilightedCode = Highlighting.stripHilights(hilightedCode); - bufferedClasses.put(index, new BufferedClass(hilightedCode, highlights, traitHighlights, methodHighlights)); + bufferedClasses.put(script, new BufferedClass(hilightedCode, highlights, traitHighlights, methodHighlights, classHighlights)); } else { - BufferedClass bc = bufferedClasses.get(index); + BufferedClass bc = bufferedClasses.get(script); hilightedCode = bc.text; highlights = bc.highlights; traitHighlights = bc.traitHighlights; @@ -168,14 +205,14 @@ public class DecompiledEditorPane extends LineMarkedEditorPane implements MouseL } setText(hilightedCode); this.abc = abc; - classIndex = index; + this.script = script; } public void reloadClass() { - if (bufferedClasses.containsKey(classIndex)) { - bufferedClasses.remove(classIndex); + if (bufferedClasses.containsKey(script)) { + bufferedClasses.remove(script); } - setClassIndex(classIndex, abc); + setScript(script, abc); setNoTrait(); } diff --git a/trunk/src/com/jpexs/asdec/abc/gui/MainFrame.java b/trunk/src/com/jpexs/asdec/abc/gui/MainFrame.java index 33e1e9c63..4e913068e 100644 --- a/trunk/src/com/jpexs/asdec/abc/gui/MainFrame.java +++ b/trunk/src/com/jpexs/asdec/abc/gui/MainFrame.java @@ -210,7 +210,7 @@ public class MainFrame extends JFrame implements ActionListener, ItemListener { navPanel); JTabbedPane tabbedPane = new JTabbedPane(); - tabbedPane.addTab("Classes", splitPane2); + tabbedPane.addTab("Scripts", splitPane2); pan2.add(tabbedPane, BorderLayout.CENTER); abcComboBox.addItemListener(this); diff --git a/trunk/src/com/jpexs/asdec/abc/gui/TraitsList.java b/trunk/src/com/jpexs/asdec/abc/gui/TraitsList.java index 52044c307..3a0221995 100644 --- a/trunk/src/com/jpexs/asdec/abc/gui/TraitsList.java +++ b/trunk/src/com/jpexs/asdec/abc/gui/TraitsList.java @@ -28,6 +28,10 @@ public class TraitsList extends JList implements ListSelectionListener { ABC abc; int classIndex = -1; + public int getClassIndex() { + return classIndex; + } + public TraitsList() { addListSelectionListener(this); setCellRenderer(new IconListRenderer()); @@ -36,9 +40,11 @@ public class TraitsList extends JList implements ListSelectionListener { public void setABC(ABC abc) { this.abc = abc; setModel(new DefaultListModel()); + setClassIndex(-1); } public void setClassIndex(int classIndex) { + this.classIndex = classIndex; if (classIndex == -1) { setModel(new DefaultListModel()); } else { @@ -46,8 +52,6 @@ public class TraitsList extends JList implements ListSelectionListener { setModel(new TraitsListModel(abc, classIndex)); } } - this.classIndex = classIndex; - } public void valueChanged(ListSelectionEvent e) { diff --git a/trunk/src/com/jpexs/asdec/abc/gui/TraitsListModel.java b/trunk/src/com/jpexs/asdec/abc/gui/TraitsListModel.java index f1f04fa34..5d199dce1 100644 --- a/trunk/src/com/jpexs/asdec/abc/gui/TraitsListModel.java +++ b/trunk/src/com/jpexs/asdec/abc/gui/TraitsListModel.java @@ -41,9 +41,9 @@ public class TraitsListModel implements ListModel { public Object getElementAt(int index) { if (index < abc.class_info[classIndex].static_traits.traits.length) { - return abc.class_info[classIndex].static_traits.traits[index].convert(abc.method_info, abc, true); + return abc.class_info[classIndex].static_traits.traits[index].convertHeader(abc, true, false, classIndex, false); } else if (index < abc.class_info[classIndex].static_traits.traits.length + abc.instance_info[classIndex].instance_traits.traits.length) { - return abc.instance_info[classIndex].instance_traits.traits[index - abc.class_info[classIndex].static_traits.traits.length].convert(abc.method_info, abc, false); + return abc.instance_info[classIndex].instance_traits.traits[index - abc.class_info[classIndex].static_traits.traits.length].convertHeader(abc, false, false, classIndex, false); } else if (index == abc.class_info[classIndex].static_traits.traits.length + abc.instance_info[classIndex].instance_traits.traits.length) { return STR_INSTANCE_INITIALIZER; } else { diff --git a/trunk/src/com/jpexs/asdec/abc/types/ClassInfo.java b/trunk/src/com/jpexs/asdec/abc/types/ClassInfo.java index 6164ca31f..dfb56a0f5 100644 --- a/trunk/src/com/jpexs/asdec/abc/types/ClassInfo.java +++ b/trunk/src/com/jpexs/asdec/abc/types/ClassInfo.java @@ -32,8 +32,4 @@ public class ClassInfo { public String toString(ABC abc) { return "method_index=" + cinit_index + "\r\n" + static_traits.toString(abc); } - - public String getStaticVarsStr(ABC abc) { - return static_traits.convert("\tstatic ", abc); - } } diff --git a/trunk/src/com/jpexs/asdec/abc/types/InstanceInfo.java b/trunk/src/com/jpexs/asdec/abc/types/InstanceInfo.java index a0b1be0c5..9044328f0 100644 --- a/trunk/src/com/jpexs/asdec/abc/types/InstanceInfo.java +++ b/trunk/src/com/jpexs/asdec/abc/types/InstanceInfo.java @@ -54,14 +54,14 @@ public class InstanceInfo { supIndexStr = " extends " + abc.constants.constant_multiname[super_index].getName(abc.constants);////+" flags="+flags+" protectedNS="+protectedNS+" interfaces="+Helper.intArrToString(interfaces)+" method_index="+iinit_index } String implStr = ""; - if(interfaces.length>0){ - if(isInterface()){ + if (interfaces.length > 0) { + if (isInterface()) { implStr = " extends "; - }else{ + } else { implStr = " implements "; } - for(int i=0;i0){ + for (int i = 0; i < interfaces.length; i++) { + if (i > 0) { implStr += ", "; } implStr += abc.constants.constant_multiname[interfaces[i]].getName(abc.constants); @@ -87,24 +87,19 @@ public class InstanceInfo { return modifiers + objType + abc.constants.constant_multiname[name_index].getName(abc.constants) + supIndexStr + implStr; } - public String getInstanceVarsStr(ABC abc) { - return instance_traits.convert("\t", abc); - } - public Multiname getName(ConstantPool constants) { return constants.constant_multiname[name_index]; } - - public boolean isInterface(){ + + public boolean isInterface() { return ((flags & CLASS_INTERFACE) == CLASS_INTERFACE); } - - public boolean isDynamic(){ + + public boolean isDynamic() { return (flags & CLASS_SEALED) == 0; } - - public boolean isFinal() - { + + public boolean isFinal() { return (flags & CLASS_FINAL) == CLASS_FINAL; } } diff --git a/trunk/src/com/jpexs/asdec/abc/types/MethodBody.java b/trunk/src/com/jpexs/asdec/abc/types/MethodBody.java index 4aa4489a8..91b8d0d2b 100644 --- a/trunk/src/com/jpexs/asdec/abc/types/MethodBody.java +++ b/trunk/src/com/jpexs/asdec/abc/types/MethodBody.java @@ -74,10 +74,9 @@ public class MethodBody implements Cloneable { } /*public String toString(boolean pcode, boolean isStatic, int classIndex, ABC abc, ConstantPool constants, MethodInfo method_info[], Stack scopeStack, boolean isStaticInitializer) { - return toString(pcode, isStatic, classIndex, abc, constants, method_info, scopeStack, isStaticInitializer,false); - }*/ - - public String toString(boolean pcode, boolean isStatic, int classIndex, ABC abc, ConstantPool constants, MethodInfo method_info[], Stack scopeStack, boolean isStaticInitializer,boolean hilight) { + return toString(pcode, isStatic, classIndex, abc, constants, method_info, scopeStack, isStaticInitializer,false); + }*/ + public String toString(boolean pcode, boolean isStatic, int classIndex, ABC abc, ConstantPool constants, MethodInfo method_info[], Stack scopeStack, boolean isStaticInitializer, boolean hilight) { String s = ""; //s+="method_info="+method_info+" max_stack="+max_stack+" max_regs="+max_regs+" scope_depth="+scope_depth+" max_scope="+max_scope; @@ -86,7 +85,7 @@ public class MethodBody implements Cloneable { s += code.toASMSource(constants, this); } else { try { - s += code.toSource(isStatic, classIndex, abc, constants, method_info, this, hilight, getLocalRegNames(abc), scopeStack,isStaticInitializer); + s += code.toSource(isStatic, classIndex, abc, constants, method_info, this, hilight, getLocalRegNames(abc), scopeStack, isStaticInitializer); s = s.trim(); if (hilight) { s = Highlighting.hilighMethod(s, this.method_info); diff --git a/trunk/src/com/jpexs/asdec/abc/types/Multiname.java b/trunk/src/com/jpexs/asdec/abc/types/Multiname.java index 7c9d8806d..ad4343974 100644 --- a/trunk/src/com/jpexs/asdec/abc/types/Multiname.java +++ b/trunk/src/com/jpexs/asdec/abc/types/Multiname.java @@ -230,7 +230,7 @@ public class Multiname { return null; } else if (namespace_set_index == -1) { return null; - }else { + } else { return constants.constant_namespace_set[namespace_set_index]; } } diff --git a/trunk/src/com/jpexs/asdec/abc/types/Namespace.java b/trunk/src/com/jpexs/asdec/abc/types/Namespace.java index 586dfd4b2..6ae843003 100644 --- a/trunk/src/com/jpexs/asdec/abc/types/Namespace.java +++ b/trunk/src/com/jpexs/asdec/abc/types/Namespace.java @@ -21,20 +21,18 @@ import com.jpexs.asdec.abc.avm2.ConstantPool; public class Namespace { - public static final int KIND_NAMESPACE=8; - public static final int KIND_PRIVATE=5; - public static final int KIND_PACKAGE=22; - public static final int KIND_PACKAGE_INTERNAL=23; - public static final int KIND_PROTECTED=24; - public static final int KIND_EXPLICIT=25; - public static final int KIND_STATIC_PROTECTED=26; - - + public static final int KIND_NAMESPACE = 8; + public static final int KIND_PRIVATE = 5; + public static final int KIND_PACKAGE = 22; + public static final int KIND_PACKAGE_INTERNAL = 23; + public static final int KIND_PROTECTED = 24; + public static final int KIND_EXPLICIT = 25; + public static final int KIND_STATIC_PROTECTED = 26; public static final int nameSpaceKinds[] = new int[]{KIND_NAMESPACE, KIND_PRIVATE, KIND_PACKAGE, KIND_PACKAGE_INTERNAL, KIND_PROTECTED, KIND_EXPLICIT, KIND_STATIC_PROTECTED}; public static final String nameSpaceKindNames[] = new String[]{"Namespace", "PrivateNamespace", "PackageNamespace", "PackageInternalNamespace", "ProtectedNamespace", "ExplicitNamespace", "StaticProtectedNamespace"}; public static final String namePrefixes[] = new String[]{"", "private", "public", "", "protected", "explicit", ""}; public int kind; - public int name_index; + public int name_index; public Namespace(int kind, int name_index) { this.kind = kind; diff --git a/trunk/src/com/jpexs/asdec/abc/types/ScriptInfo.java b/trunk/src/com/jpexs/asdec/abc/types/ScriptInfo.java index adbbcdad1..d942ad8b7 100644 --- a/trunk/src/com/jpexs/asdec/abc/types/ScriptInfo.java +++ b/trunk/src/com/jpexs/asdec/abc/types/ScriptInfo.java @@ -17,6 +17,7 @@ package com.jpexs.asdec.abc.types; import com.jpexs.asdec.abc.ABC; +import com.jpexs.asdec.abc.types.traits.Trait; import com.jpexs.asdec.abc.types.traits.Traits; public class ScriptInfo { @@ -32,4 +33,19 @@ public class ScriptInfo { public String toString(ABC abc) { return "method_index=" + init_index + "\r\n" + traits.toString(abc); } + + public String getPath(ABC abc) { + for (Trait t : traits.traits) { + Multiname name = t.getName(abc); + Namespace ns = name.getNamespace(abc.constants); + if (ns.kind == Namespace.KIND_PACKAGE) { + return ns.getName(abc.constants) + "." + name.getName(abc.constants); + } + } + return ""; + } + + public String convert(ABC abc, boolean pcode, boolean highlighting) { + return traits.convert(abc, false, pcode, true, -1, highlighting); + } } diff --git a/trunk/src/com/jpexs/asdec/abc/types/ValueKind.java b/trunk/src/com/jpexs/asdec/abc/types/ValueKind.java index c8a181f85..4f9f05680 100644 --- a/trunk/src/com/jpexs/asdec/abc/types/ValueKind.java +++ b/trunk/src/com/jpexs/asdec/abc/types/ValueKind.java @@ -64,6 +64,20 @@ public class ValueKind { return s; } + public boolean isNamespace() { + switch (value_kind) { + case CONSTANT_Namespace: + case CONSTANT_PackageInternalNs: + case CONSTANT_ProtectedNamespace: + case CONSTANT_ExplicitNamespace: + case CONSTANT_StaticProtectedNs: + case CONSTANT_PrivateNs: + return true; + default: + return false; + } + } + public String toString(ConstantPool constants) { String ret = "?"; switch (value_kind) { @@ -95,22 +109,12 @@ public class ValueKind { ret = "undefined"; break; case CONSTANT_Namespace: - ret = "ns[" + value_index + "]"; - break; case CONSTANT_PackageInternalNs: - ret = "package internal ns[" + value_index + "]"; - break; case CONSTANT_ProtectedNamespace: - ret = "protected ns[" + value_index + "]"; - break; case CONSTANT_ExplicitNamespace: - ret = "explicit ns[" + value_index + "]"; - break; case CONSTANT_StaticProtectedNs: - ret = "static protected ns[" + value_index + "]"; - break; case CONSTANT_PrivateNs: - ret = "private ns[" + value_index + "]"; + ret = "\"" + constants.constant_namespace[value_index].getName(constants) + "\""; break; } return ret; diff --git a/trunk/src/com/jpexs/asdec/abc/types/traits/Trait.java b/trunk/src/com/jpexs/asdec/abc/types/traits/Trait.java index 34cc808ef..32f415c8f 100644 --- a/trunk/src/com/jpexs/asdec/abc/types/traits/Trait.java +++ b/trunk/src/com/jpexs/asdec/abc/types/traits/Trait.java @@ -17,13 +17,11 @@ package com.jpexs.asdec.abc.types.traits; import com.jpexs.asdec.abc.ABC; -import com.jpexs.asdec.abc.avm2.ConstantPool; -import com.jpexs.asdec.abc.types.MethodInfo; import com.jpexs.asdec.abc.types.Multiname; import com.jpexs.asdec.abc.types.Namespace; import com.jpexs.asdec.helpers.Helper; -public class Trait { +public abstract class Trait { public int name_index; public int kindType; @@ -47,7 +45,7 @@ public class Trait { if ((kindFlags & ATTR_Override) > 0) { ret += "override"; } - Multiname m = getMultiName(abc.constants); + Multiname m = getName(abc); if (m != null) { int v = abc.nsValueToName(m.namespace_index); if (v > -1) { @@ -78,19 +76,32 @@ public class Trait { return abc.constants.constant_multiname[name_index].toString(abc.constants) + " kind=" + kindType + " metadata=" + Helper.intArrToString(metadata); } - public String convert(MethodInfo[] methodInfo, ABC abc) { - return convert(methodInfo, abc, false); - } - - public String convert(MethodInfo[] methodInfo, ABC abc, boolean isStatic) { + public String convert(ABC abc, boolean isStatic, boolean pcode, int classIndex, boolean highlight) { return abc.constants.constant_multiname[name_index].toString(abc.constants) + " kind=" + kindType + " metadata=" + Helper.intArrToString(metadata); } - public Multiname getMultiName(ConstantPool constants) { + public String convertPackaged(ABC abc, boolean isStatic, boolean pcod, int classIndex, boolean highlight) { + return makePackageFromIndex(abc, name_index, convert(abc, isStatic, pcod, classIndex, highlight)); + } + + public String convertHeader(ABC abc, boolean isStatic, boolean pcode, int classIndex, boolean highlight) { + return convert(abc, isStatic, pcode, classIndex, highlight).trim(); + } + + protected String makePackageFromIndex(ABC abc, int name_index, String value) { + Namespace ns = abc.constants.constant_multiname[name_index].getNamespace(abc.constants); + if (ns.kind == Namespace.KIND_PACKAGE) { + String nsname = ns.getName(abc.constants); + return "package " + nsname + "\r\n{\r\n" + value + "\r\n}"; + } + return value; + } + + public Multiname getName(ABC abc) { if (name_index == 0) { return null; } else { - return constants.constant_multiname[name_index]; + return abc.constants.constant_multiname[name_index]; } } } diff --git a/trunk/src/com/jpexs/asdec/abc/types/traits/TraitClass.java b/trunk/src/com/jpexs/asdec/abc/types/traits/TraitClass.java index 0f8a8bbfb..35a5db008 100644 --- a/trunk/src/com/jpexs/asdec/abc/types/traits/TraitClass.java +++ b/trunk/src/com/jpexs/asdec/abc/types/traits/TraitClass.java @@ -17,7 +17,24 @@ package com.jpexs.asdec.abc.types.traits; import com.jpexs.asdec.abc.ABC; +import com.jpexs.asdec.abc.avm2.AVM2Code; +import com.jpexs.asdec.abc.avm2.instructions.AVM2Instruction; +import com.jpexs.asdec.abc.avm2.instructions.construction.NewFunctionIns; +import com.jpexs.asdec.abc.avm2.treemodel.InitPropertyTreeItem; +import com.jpexs.asdec.abc.avm2.treemodel.SetPropertyTreeItem; +import com.jpexs.asdec.abc.avm2.treemodel.TreeItem; +import com.jpexs.asdec.abc.types.MethodBody; +import com.jpexs.asdec.abc.types.Multiname; +import com.jpexs.asdec.abc.types.Namespace; +import com.jpexs.asdec.abc.types.NamespaceSet; import com.jpexs.asdec.helpers.Helper; +import com.jpexs.asdec.helpers.Highlighting; +import java.io.ByteArrayOutputStream; +import java.io.PrintStream; +import java.util.ArrayList; +import java.util.LinkedList; +import java.util.List; +import java.util.Stack; public class TraitClass extends Trait { @@ -28,4 +45,239 @@ public class TraitClass extends Trait { public String toString(ABC abc) { return "Class " + abc.constants.constant_multiname[name_index].toString(abc.constants) + " slot=" + slot_id + " class_info=" + class_info + " metadata=" + Helper.intArrToString(metadata); } + + private void parseImportFromNS(ABC abc, List imports, Namespace ns, String ignorePackage, String name) { + if (name.equals("")) { + name = "*"; + } + if (ns.kind != Namespace.KIND_PACKAGE) { + return; + } + String newimport = ns.getName(abc.constants); + if (newimport.equals("-")) { + newimport = ""; + } + if (!newimport.equals("")) { + newimport += "." + name; + if (newimport.contains(":")) { + return; + } + if (!imports.contains(newimport)) { + String pkg = newimport.substring(0, newimport.lastIndexOf(".")); + if (!pkg.equals(ignorePackage)) { + imports.add(newimport); + } + } + } + } + + private void parseImportFromMultiname(ABC abc, List imports, Multiname m, String ignorePackage) { + if (m != null) { + Namespace ns = m.getNamespace(abc.constants); + String name = m.getName(abc.constants); + NamespaceSet nss = m.getNamespaceSet(abc.constants); + if (ns != null) { + parseImportFromNS(abc, imports, ns, ignorePackage, name); + } + if (nss != null) { + for (int ni : nss.namespaces) { + parseImportFromNS(abc, imports, abc.constants.constant_namespace[ni], ignorePackage, name); + } + } + } + } + + private void parseImportsFromMethodInfo(ABC abc, int method_index, List imports, String ignorePackage) { + if (abc.method_info[method_index].ret_type != 0) { + parseImportFromMultiname(abc, imports, abc.constants.constant_multiname[abc.method_info[method_index].ret_type], ignorePackage); + } + for (int t : abc.method_info[method_index].param_types) { + if (t != 0) { + parseImportFromMultiname(abc, imports, abc.constants.constant_multiname[t], ignorePackage); + } + } + MethodBody body = abc.findBody(method_index); + if (body != null) { + for (AVM2Instruction ins : body.code.code) { + if (ins.definition instanceof NewFunctionIns) { + parseImportsFromMethodInfo(abc, ins.operands[0], imports, ignorePackage); + } + for (int k = 0; k < ins.definition.operands.length; k++) { + if (ins.definition.operands[k] == AVM2Code.DAT_MULTINAME_INDEX) { + int multinameIndex = ins.operands[k]; + parseImportFromMultiname(abc, imports, abc.constants.constant_multiname[multinameIndex], ignorePackage); + } + } + } + } + } + + private List getImports(ABC abc) { + List imports = new ArrayList(); + + //constructor + + //parseImportFromMultiname(imports, constants.constant_multiname[instance_info[instanceIndex].name_index]); + + String packageName = abc.instance_info[class_info].getName(abc.constants).getNamespace(abc.constants).getName(abc.constants); + + if (abc.instance_info[class_info].super_index > 0) { + parseImportFromMultiname(abc, imports, abc.constants.constant_multiname[abc.instance_info[class_info].super_index], packageName); + } + for (int i : abc.instance_info[class_info].interfaces) { + parseImportFromMultiname(abc, imports, abc.constants.constant_multiname[i], packageName); + } + + //static + for (Trait t : abc.class_info[class_info].static_traits.traits) { + //parseImportFromMultiname(imports, t.getMultiName(constants)); + if (t instanceof TraitMethodGetterSetter) { + TraitMethodGetterSetter tm = (TraitMethodGetterSetter) t; + if (tm.method_info != 0) { + parseImportsFromMethodInfo(abc, tm.method_info, imports, packageName); + } + } + + } + + //static initializer + parseImportsFromMethodInfo(abc, abc.class_info[class_info].cinit_index, imports, packageName); + + //instance + for (Trait t : abc.instance_info[class_info].instance_traits.traits) { + //parseImportFromMultiname(imports, t.getMultiName(constants)); + if (t instanceof TraitMethodGetterSetter) { + TraitMethodGetterSetter tm = (TraitMethodGetterSetter) t; + if (tm.method_info != 0) { + parseImportsFromMethodInfo(abc, tm.method_info, imports, packageName); + } + } + } + + //instance initializer + parseImportsFromMethodInfo(abc, abc.instance_info[class_info].iinit_index, imports, packageName); + return imports; + } + + @Override + public String convert(ABC abc, boolean isStatic, boolean pcode, int classIndex, boolean highlight) { + if (!highlight) { + Highlighting.doHighlight = false; + } + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + PrintStream out = new PrintStream(baos); + + //imports + List imports = getImports(abc); + for (String imp : imports) { + out.println(ABC.IDENT_STRING + "import " + imp + ";"); + } + out.println(); + + //class header + String classHeader = abc.instance_info[class_info].getClassHeaderStr(abc); + if (classHeader.startsWith("private ")) { + classHeader = classHeader.substring("private ".length()); + } + out.println(ABC.IDENT_STRING + classHeader); + out.println(ABC.IDENT_STRING + "{"); + + String toPrint; + List outTraits = new LinkedList(); + + //if (class_info[i].cinit_index != 0) { + if (ABC.AUTOINIT_STATIC_VARIABLES) { + int bodyIndex = abc.findBodyIndex(abc.class_info[class_info].cinit_index); + List initializer = abc.bodies[bodyIndex].code.toTree(true, class_info, abc, abc.constants, abc.method_info, abc.bodies[bodyIndex], abc.bodies[bodyIndex].code.getLocalRegNamesFromDebug(abc)); + for (TreeItem ti : initializer) { + if (ti instanceof SetPropertyTreeItem) { + int multinameIndex = ((SetPropertyTreeItem) ti).propertyName.multinameIndex; + TreeItem value = ((SetPropertyTreeItem) ti).value; + for (Trait t : abc.class_info[class_info].static_traits.traits) { + if (t.name_index == multinameIndex) { + if (t instanceof TraitSlotConst) { + ((TraitSlotConst) t).assignedValue = value; + } + } + } + } + if (ti instanceof InitPropertyTreeItem) { + int multinameIndex = ((InitPropertyTreeItem) ti).propertyName.multinameIndex; + TreeItem value = ((InitPropertyTreeItem) ti).value; + for (Trait t : abc.class_info[class_info].static_traits.traits) { + if (t.name_index == multinameIndex) { + if (t instanceof TraitSlotConst) { + ((TraitSlotConst) t).assignedValue = value; + } + } + } + } + } + } + String bodyStr = ""; + int bodyIndex = abc.findBodyIndex(abc.class_info[class_info].cinit_index); + if (bodyIndex != -1) { + bodyStr = abc.bodies[bodyIndex].toString(pcode, true, class_info, abc, abc.constants, abc.method_info, new Stack(), true, highlight); + } + if (Highlighting.stripHilights(bodyStr).equals("")) { + toPrint = ABC.addTabs(bodyStr, 3); + } else { + toPrint = ABC.IDENT_STRING + ABC.IDENT_STRING + "{\r\n" + ABC.addTabs(bodyStr, 3) + "\r\n" + ABC.IDENT_STRING + ABC.IDENT_STRING + "}"; + } + if (highlight) { + toPrint = Highlighting.hilighTrait(toPrint, abc.class_info[class_info].static_traits.traits.length + abc.instance_info[class_info].instance_traits.traits.length + 1); + } + outTraits.add(toPrint); + //} + + //constructor + //if (instance_info[i].iinit_index != 0) { + if (!abc.instance_info[class_info].isInterface()) { + String modifier = ""; + Multiname m = abc.constants.constant_multiname[abc.instance_info[class_info].name_index]; + if (m != null) { + Namespace ns = m.getNamespace(abc.constants); + if (ns != null) { + modifier = ns.getPrefix(abc) + " "; + if (modifier.equals(" ")) { + modifier = ""; + } + if (modifier.startsWith("private")) { //cannot have private constuctor + modifier = ""; + } + } + } + String constructorParams; + + bodyStr = ""; + bodyIndex = abc.findBodyIndex(abc.instance_info[class_info].iinit_index); + if (bodyIndex != -1) { + bodyStr = ABC.addTabs(abc.bodies[bodyIndex].toString(pcode, false, class_info, abc, abc.constants, abc.method_info, new Stack(), false, highlight), 3); + constructorParams = abc.method_info[abc.instance_info[class_info].iinit_index].getParamStr(abc.constants, abc.bodies[bodyIndex], abc); + } else { + constructorParams = abc.method_info[abc.instance_info[class_info].iinit_index].getParamStr(abc.constants, null, abc); + } + toPrint = ABC.IDENT_STRING + ABC.IDENT_STRING + modifier + "function " + abc.constants.constant_multiname[abc.instance_info[class_info].name_index].getName(abc.constants) + "(" + constructorParams + ") {\r\n" + bodyStr + "\r\n" + ABC.IDENT_STRING + ABC.IDENT_STRING + "}"; + if (highlight) { + toPrint = Highlighting.hilighTrait(toPrint, abc.class_info[class_info].static_traits.traits.length + abc.instance_info[class_info].instance_traits.traits.length); + } + outTraits.add(toPrint); + } + //} + + //static variables,constants & methods + outTraits.add(abc.class_info[class_info].static_traits.convert(abc, true, pcode, false, class_info, highlight)); + + outTraits.add(abc.instance_info[class_info].instance_traits.convert(abc, false, pcode, false, class_info, highlight)); + + out.println(Helper.joinStrings(outTraits, "\r\n\r\n")); + out.println(ABC.IDENT_STRING + "}");//class + out.flush(); + Highlighting.doHighlight = true; + return baos.toString(); + } + + public Multiname getName(ABC abc) { + return abc.constants.constant_multiname[abc.instance_info[class_info].name_index]; + } } diff --git a/trunk/src/com/jpexs/asdec/abc/types/traits/TraitFunction.java b/trunk/src/com/jpexs/asdec/abc/types/traits/TraitFunction.java index 3ad7813ad..82b4a3032 100644 --- a/trunk/src/com/jpexs/asdec/abc/types/traits/TraitFunction.java +++ b/trunk/src/com/jpexs/asdec/abc/types/traits/TraitFunction.java @@ -17,7 +17,10 @@ package com.jpexs.asdec.abc.types.traits; import com.jpexs.asdec.abc.ABC; +import com.jpexs.asdec.abc.avm2.treemodel.TreeItem; +import com.jpexs.asdec.abc.types.MethodBody; import com.jpexs.asdec.helpers.Helper; +import java.util.Stack; public class TraitFunction extends Trait { @@ -28,4 +31,26 @@ public class TraitFunction extends Trait { public String toString(ABC abc) { return "Function " + abc.constants.constant_multiname[name_index].toString(abc.constants) + " slot=" + slot_index + " method_info=" + method_info + " metadata=" + Helper.intArrToString(metadata); } + + @Override + public String convertHeader(ABC abc, boolean isStatic, boolean pcode, int classIndex, boolean highlight) { + String modifier = getModifiers(abc, isStatic) + " "; + if (modifier.equals(" ")) { + modifier = ""; + } + MethodBody body = abc.findBody(method_info); + return modifier + "function " + abc.constants.constant_multiname[name_index].getName(abc.constants) + "(" + abc.method_info[method_info].getParamStr(abc.constants, body, abc) + ") : " + abc.method_info[method_info].getReturnTypeStr(abc.constants); + } + + @Override + public String convert(ABC abc, boolean isStatic, boolean pcode, int classIndex, boolean highlight) { + String header = convertHeader(abc, isStatic, pcode, classIndex, highlight); + String bodyStr = ""; + int bodyIndex = abc.findBodyIndex(method_info); + if (bodyIndex != -1) { + bodyStr = ABC.addTabs(abc.bodies[bodyIndex].toString(pcode, isStatic, classIndex, abc, abc.constants, abc.method_info, new Stack(), false, highlight), 3); + } + return ABC.IDENT_STRING + ABC.IDENT_STRING + header + (abc.instance_info[classIndex].isInterface() ? ";" : " {\r\n" + bodyStr + "\r\n" + ABC.IDENT_STRING + ABC.IDENT_STRING + "}"); + + } } diff --git a/trunk/src/com/jpexs/asdec/abc/types/traits/TraitMethodGetterSetter.java b/trunk/src/com/jpexs/asdec/abc/types/traits/TraitMethodGetterSetter.java index ba28349d1..711b7bc0d 100644 --- a/trunk/src/com/jpexs/asdec/abc/types/traits/TraitMethodGetterSetter.java +++ b/trunk/src/com/jpexs/asdec/abc/types/traits/TraitMethodGetterSetter.java @@ -17,10 +17,10 @@ package com.jpexs.asdec.abc.types.traits; import com.jpexs.asdec.abc.ABC; -import com.jpexs.asdec.abc.avm2.ConstantPool; +import com.jpexs.asdec.abc.avm2.treemodel.TreeItem; import com.jpexs.asdec.abc.types.MethodBody; -import com.jpexs.asdec.abc.types.MethodInfo; import com.jpexs.asdec.helpers.Helper; +import java.util.Stack; public class TraitMethodGetterSetter extends Trait { @@ -32,8 +32,7 @@ public class TraitMethodGetterSetter extends Trait { return "0x" + Helper.formatAddress(fileOffset) + " " + Helper.byteArrToString(bytes) + " MethodGetterSetter " + abc.constants.constant_multiname[name_index].toString(abc.constants) + " disp_id=" + disp_id + " method_info=" + method_info + " metadata=" + Helper.intArrToString(metadata); } - @Override - public String convert(MethodInfo[] methodInfo, ABC abc, boolean isStatic) { + public String convertHeader(ABC abc, boolean isStatic, boolean pcode, int classIndex, boolean highlight) { String modifier = getModifiers(abc, isStatic) + " "; if (modifier.equals(" ")) { modifier = ""; @@ -46,10 +45,19 @@ public class TraitMethodGetterSetter extends Trait { addKind = "set "; } MethodBody body = abc.findBody(method_info); - return modifier + "function " + addKind + getMethodName(abc.constants) + "(" + methodInfo[method_info].getParamStr(abc.constants, body, abc) + ") : " + methodInfo[method_info].getReturnTypeStr(abc.constants); + return modifier + "function " + addKind + getName(abc).getName(abc.constants) + "(" + abc.method_info[method_info].getParamStr(abc.constants, body, abc) + ") : " + abc.method_info[method_info].getReturnTypeStr(abc.constants); + } - public String getMethodName(ConstantPool constants) { - return constants.constant_multiname[name_index].getName(constants); + @Override + public String convert(ABC abc, boolean isStatic, boolean pcode, int classIndex, boolean highlight) { + String header = convertHeader(abc, isStatic, pcode, classIndex, highlight); + + String bodyStr = ""; + int bodyIndex = abc.findBodyIndex(method_info); + if (bodyIndex != -1) { + bodyStr = ABC.addTabs(abc.bodies[bodyIndex].toString(pcode, isStatic, classIndex, abc, abc.constants, abc.method_info, new Stack(), false, highlight), 3); + } + return ABC.IDENT_STRING + ABC.IDENT_STRING + header + (abc.instance_info[classIndex].isInterface() ? ";" : " {\r\n" + bodyStr + "\r\n" + ABC.IDENT_STRING + ABC.IDENT_STRING + "}"); } } diff --git a/trunk/src/com/jpexs/asdec/abc/types/traits/TraitSlotConst.java b/trunk/src/com/jpexs/asdec/abc/types/traits/TraitSlotConst.java index 0ad8c4a61..756377a5d 100644 --- a/trunk/src/com/jpexs/asdec/abc/types/traits/TraitSlotConst.java +++ b/trunk/src/com/jpexs/asdec/abc/types/traits/TraitSlotConst.java @@ -19,7 +19,6 @@ package com.jpexs.asdec.abc.types.traits; import com.jpexs.asdec.abc.ABC; import com.jpexs.asdec.abc.avm2.ConstantPool; import com.jpexs.asdec.abc.avm2.treemodel.TreeItem; -import com.jpexs.asdec.abc.types.MethodInfo; import com.jpexs.asdec.abc.types.ValueKind; import com.jpexs.asdec.helpers.Helper; import com.jpexs.asdec.helpers.Highlighting; @@ -50,36 +49,41 @@ public class TraitSlotConst extends Trait { return typeStr; } - public String getNameValueStr(ConstantPool constants) { + public String getNameValueStr(ABC abc) { - String typeStr = getType(constants); + String typeStr = getType(abc.constants); + if (typeStr.equals("*")) { + typeStr = ""; + } else { + typeStr = ":" + typeStr; + } String valueStr = ""; + ValueKind val = null; if (value_kind != 0) { - valueStr = " = " + (new ValueKind(value_index, value_kind)).toString(constants); + val = new ValueKind(value_index, value_kind); + valueStr = " = " + val.toString(abc.constants); } if (assignedValue != null) { - valueStr = " = " + Highlighting.stripHilights(assignedValue.toString(constants, new HashMap())); + valueStr = " = " + Highlighting.stripHilights(assignedValue.toString(abc.constants, new HashMap())); } - String slotconst = "var"; if (kindType == TRAIT_CONST) { slotconst = "const"; } - return slotconst + " " + getName(constants) + ":" + typeStr + valueStr; - } - - public String getName(ConstantPool constants) { - return constants.constant_multiname[name_index].getName(constants); + if (val != null && val.isNamespace()) { + slotconst = "namespace"; + } + return slotconst + " " + getName(abc).getName(abc.constants) + typeStr + valueStr + ";"; } @Override - public String convert(MethodInfo[] methodInfo, ABC abc, boolean isStatic) { + public String convert(ABC abc, boolean isStatic, boolean pcode, int classIndex, boolean highlight) { String modifier = getModifiers(abc, isStatic) + " "; if (modifier.equals(" ")) { modifier = ""; } - return modifier + getNameValueStr(abc.constants); + return ABC.IDENT_STRING + ABC.IDENT_STRING + modifier + getNameValueStr(abc); } public boolean isConst() { diff --git a/trunk/src/com/jpexs/asdec/abc/types/traits/Traits.java b/trunk/src/com/jpexs/asdec/abc/types/traits/Traits.java index d547b7da6..65740ed25 100644 --- a/trunk/src/com/jpexs/asdec/abc/types/traits/Traits.java +++ b/trunk/src/com/jpexs/asdec/abc/types/traits/Traits.java @@ -17,6 +17,7 @@ package com.jpexs.asdec.abc.types.traits; import com.jpexs.asdec.abc.ABC; +import com.jpexs.asdec.helpers.Highlighting; public class Traits { @@ -45,13 +46,32 @@ public class Traits { return s; } - public String convert(String prefix, ABC abc) { + public String convert(ABC abc, boolean isStatic, boolean pcode, boolean makePackages, int classIndex, boolean highlighting) { String s = ""; for (int t = 0; t < traits.length; t++) { if (t > 0) { - s += "\r\n"; + s += "\r\n\r\n"; } - s += prefix + traits[t].convert(null, abc); + String plus; + if (makePackages) { + plus = traits[t].convertPackaged(abc, isStatic, pcode, classIndex, highlighting); + } else { + plus = traits[t].convert(abc, isStatic, pcode, classIndex, highlighting); + } + if (highlighting) { + int h = t; + if (classIndex != -1) { + if (!isStatic) { + h = h + abc.class_info[classIndex].static_traits.traits.length; + } + } + if (traits[t] instanceof TraitClass) { + plus = Highlighting.hilighClass(plus, h); + } else { + plus = Highlighting.hilighTrait(plus, h); + } + } + s += plus; } return s; } diff --git a/trunk/src/com/jpexs/asdec/abc/usages/ConstVarMultinameUsage.java b/trunk/src/com/jpexs/asdec/abc/usages/ConstVarMultinameUsage.java index e5dc07924..d687110bb 100644 --- a/trunk/src/com/jpexs/asdec/abc/usages/ConstVarMultinameUsage.java +++ b/trunk/src/com/jpexs/asdec/abc/usages/ConstVarMultinameUsage.java @@ -36,10 +36,10 @@ public abstract class ConstVarMultinameUsage extends TraitMultinameUsage { return super.toString(abc) + " " + (parentTraitIndex > -1 ? (isStatic - ? (((TraitMethodGetterSetter) abc.class_info[classIndex].static_traits.traits[parentTraitIndex]).convert(abc.method_info, abc, isStatic)) - : (((TraitMethodGetterSetter) abc.instance_info[classIndex].instance_traits.traits[parentTraitIndex]).convert(abc.method_info, abc, isStatic))) + ? (((TraitMethodGetterSetter) abc.class_info[classIndex].static_traits.traits[parentTraitIndex]).convertHeader(abc, isStatic, false, classIndex, false)) + : (((TraitMethodGetterSetter) abc.instance_info[classIndex].instance_traits.traits[parentTraitIndex]).convertHeader(abc, isStatic, false, classIndex, false))) : "") - + ((TraitSlotConst) traits.traits[traitIndex]).convert(abc.method_info, abc, isStatic); + + ((TraitSlotConst) traits.traits[traitIndex]).convertHeader(abc, isStatic, false, classIndex, false); } public int getTraitIndex() { diff --git a/trunk/src/com/jpexs/asdec/abc/usages/MethodMultinameUsage.java b/trunk/src/com/jpexs/asdec/abc/usages/MethodMultinameUsage.java index df7806436..560ffbeaf 100644 --- a/trunk/src/com/jpexs/asdec/abc/usages/MethodMultinameUsage.java +++ b/trunk/src/com/jpexs/asdec/abc/usages/MethodMultinameUsage.java @@ -45,10 +45,10 @@ public abstract class MethodMultinameUsage extends TraitMultinameUsage { : "instance initializer") : ((parentTraitIndex > -1 ? (isStatic - ? (((TraitMethodGetterSetter) abc.class_info[classIndex].static_traits.traits[parentTraitIndex]).convert(abc.method_info, abc, isStatic)) - : (((TraitMethodGetterSetter) abc.instance_info[classIndex].instance_traits.traits[parentTraitIndex]).convert(abc.method_info, abc, isStatic))) + " " + ? (((TraitMethodGetterSetter) abc.class_info[classIndex].static_traits.traits[parentTraitIndex]).convertHeader(abc, isStatic, false, classIndex, false)) + : (((TraitMethodGetterSetter) abc.instance_info[classIndex].instance_traits.traits[parentTraitIndex]).convertHeader(abc, isStatic, false, classIndex, false))) + " " : "") - + (((TraitMethodGetterSetter) traits.traits[traitIndex]).convert(abc.method_info, abc, isStatic)))); + + (((TraitMethodGetterSetter) traits.traits[traitIndex]).convertHeader(abc, isStatic, false, classIndex, false)))); } public int getTraitIndex() { diff --git a/trunk/src/com/jpexs/asdec/action/Action.java b/trunk/src/com/jpexs/asdec/action/Action.java index ff3e8b14b..a76d1b724 100644 --- a/trunk/src/com/jpexs/asdec/action/Action.java +++ b/trunk/src/com/jpexs/asdec/action/Action.java @@ -87,7 +87,7 @@ public class Action { "_xmouse", "_ymouse" }; - + /** * Constructor * diff --git a/trunk/src/com/jpexs/asdec/action/gui/MainFrame.java b/trunk/src/com/jpexs/asdec/action/gui/MainFrame.java index afa516822..724419d04 100644 --- a/trunk/src/com/jpexs/asdec/action/gui/MainFrame.java +++ b/trunk/src/com/jpexs/asdec/action/gui/MainFrame.java @@ -222,7 +222,7 @@ public class MainFrame extends JFrame implements TreeSelectionListener, ActionLi List as = asm.getActions(SWF.DEFAULT_VERSION); com.jpexs.asdec.action.Action.setActionsAddresses(as, 0, SWF.DEFAULT_VERSION); - decompiledEditor.setText(Highlighting.stripHilights(com.jpexs.asdec.action.Action.actionsToSource(as, SWF.DEFAULT_VERSION))); + decompiledEditor.setText(Highlighting.stripHilights(com.jpexs.asdec.action.Action.actionsToSource(as, SWF.DEFAULT_VERSION))); } Main.stopWork(); } diff --git a/trunk/src/com/jpexs/asdec/helpers/Highlighting.java b/trunk/src/com/jpexs/asdec/helpers/Highlighting.java index ab7a69144..4263482db 100644 --- a/trunk/src/com/jpexs/asdec/helpers/Highlighting.java +++ b/trunk/src/com/jpexs/asdec/helpers/Highlighting.java @@ -18,6 +18,8 @@ package com.jpexs.asdec.helpers; import java.util.ArrayList; import java.util.List; +import java.util.logging.Level; +import java.util.logging.Logger; import java.util.regex.Pattern; /** @@ -75,6 +77,9 @@ public class Highlighting { private static final String METHODOPEN = "[METHOD"; private static final String METHODCLOSE = "]"; private static final String METHODEND = "[/METHOD]"; + private static final String CLASSOPEN = "[CLASS"; + private static final String CLASSCLOSE = "]"; + private static final String CLASSEND = "[/CLASS]"; /** * Highlights specified text as instruction by adding special tags @@ -143,6 +148,20 @@ public class Highlighting { return TRAITOPEN + offset + TRAITCLOSE + text + TRAITEND; } + /** + * Highlights specified text as class by adding special tags + * + * @param text Text to highlight + * @param offset Offset of trait + * @return Highlighted text + */ + public static String hilighClass(String text, long offset) { + if (!doHighlight) { + return text; + } + return CLASSOPEN + offset + CLASSCLOSE + text + CLASSEND; + } + /** * Strips all highlights from the text * @@ -156,6 +175,7 @@ public class Highlighting { text = stripInstrHilights(text); text = stripTraitHilights(text); text = stripMethodHilights(text); + text = stripClassHilights(text); return text; } @@ -166,9 +186,7 @@ public class Highlighting { * @return Text with no instruction highlights */ public static String stripInstrHilights(String text) { - text = text.replaceAll(Pattern.quote(OFSOPEN) + "[0-9]+" + Pattern.quote(OFSCLOSE), ""); - text = text.replace(OFSEND, ""); - return text; + return stripSpecificHilights(text, OFSOPEN, OFSCLOSE, OFSEND); } /** @@ -178,9 +196,7 @@ public class Highlighting { * @return Text with no method highlights */ public static String stripMethodHilights(String text) { - text = text.replaceAll(Pattern.quote(METHODOPEN) + "[0-9]+" + Pattern.quote(METHODCLOSE), ""); - text = text.replace(METHODEND, ""); - return text; + return stripSpecificHilights(text, METHODOPEN, METHODCLOSE, METHODEND); } /** @@ -190,11 +206,53 @@ public class Highlighting { * @return Text with no trait highlights */ public static String stripTraitHilights(String text) { - text = text.replaceAll(Pattern.quote(TRAITOPEN) + "[0-9]+" + Pattern.quote(TRAITCLOSE), ""); - text = text.replace(TRAITEND, ""); + return stripSpecificHilights(text, TRAITOPEN, TRAITCLOSE, TRAITEND); + } + + /** + * Strips class highlights from the text + * + * @param text Text to strip trait highlights in + * @return Text with no class highlights + */ + public static String stripClassHilights(String text) { + return stripSpecificHilights(text, CLASSOPEN, CLASSCLOSE, CLASSEND); + } + + private static String stripSpecificHilights(String text, String txtOpen, String txtClose, String txtEnd) { + text = text.replaceAll(Pattern.quote(txtOpen) + "[0-9]+" + Pattern.quote(txtClose), ""); + text = text.replace(txtEnd, ""); return text; } + private static List getSpecificHighlights(String text, String txtOpen, String txtClose, String txtEnd) { + List ret = new ArrayList(); + int pos = 0; + while (true) { + int openpos = text.indexOf(txtOpen); + if (openpos == -1) { + break; + } + int closepos = text.indexOf(txtClose, openpos); + int enpos = text.indexOf(txtEnd, openpos); + int textlen = enpos - closepos - txtClose.length(); + + int nextopenpos = text.indexOf(txtOpen, openpos + 1); + if (nextopenpos != -1) { + if (nextopenpos < enpos) { + Logger.getLogger(Highlighting.class.getName()).log(Level.SEVERE, "Crossed highligh - str:{0}", text); + enpos = nextopenpos; + } + } + long offset = Long.parseLong(text.substring(openpos + txtOpen.length(), closepos)); + Highlighting hl = new Highlighting(pos + openpos, textlen, offset); + pos += openpos + textlen; + text = text.substring(enpos + txtEnd.length()); + ret.add(hl); + } + return ret; + } + /** * Gets all trait highlight objects from specified text * @@ -205,31 +263,8 @@ public class Highlighting { text = text.replace("\r\n", "\n"); text = stripInstrHilights(text); text = stripMethodHilights(text); - List ret = new ArrayList(); - int pos = 0; - while (true) { - int openpos = text.indexOf(TRAITOPEN); - if (openpos == -1) { - break; - } - int closepos = text.indexOf(TRAITCLOSE, openpos); - int enpos = text.indexOf(TRAITEND, openpos); - int textlen = enpos - closepos - TRAITCLOSE.length(); - - int nextopenpos = text.indexOf(TRAITOPEN, openpos + 1); - if (nextopenpos != -1) { - if (nextopenpos < enpos) { - System.err.println(text); - throw new RuntimeException("Crossed highlight"); - } - } - long offset = Long.parseLong(text.substring(openpos + TRAITOPEN.length(), closepos)); - Highlighting hl = new Highlighting(pos + openpos, textlen, offset); - pos += openpos + textlen; - text = text.substring(enpos + TRAITEND.length()); - ret.add(hl); - } - return ret; + text = stripClassHilights(text); + return getSpecificHighlights(text, TRAITOPEN, TRAITCLOSE, TRAITEND); } /** @@ -242,31 +277,8 @@ public class Highlighting { text = text.replace("\r\n", "\n"); text = stripInstrHilights(text); text = stripTraitHilights(text); - List ret = new ArrayList(); - int pos = 0; - while (true) { - int openpos = text.indexOf(METHODOPEN); - if (openpos == -1) { - break; - } - int closepos = text.indexOf(METHODCLOSE, openpos); - int enpos = text.indexOf(METHODEND, openpos); - int textlen = enpos - closepos - METHODCLOSE.length(); - - int nextopenpos = text.indexOf(METHODOPEN, openpos + 1); - if (nextopenpos != -1) { - if (nextopenpos < enpos) { - System.err.println(text); - throw new RuntimeException("Crossed highlight"); - } - } - long offset = Long.parseLong(text.substring(openpos + METHODOPEN.length(), closepos)); - Highlighting hl = new Highlighting(pos + openpos, textlen, offset); - pos += openpos + textlen; - text = text.substring(enpos + METHODEND.length()); - ret.add(hl); - } - return ret; + text = stripClassHilights(text); + return getSpecificHighlights(text, METHODOPEN, METHODCLOSE, METHODEND); } /** @@ -279,30 +291,21 @@ public class Highlighting { text = text.replace("\r\n", "\n"); text = stripTraitHilights(text); text = stripMethodHilights(text); - List ret = new ArrayList(); - int pos = 0; - while (true) { - int openpos = text.indexOf(OFSOPEN); - if (openpos == -1) { - break; - } - int closepos = text.indexOf(OFSCLOSE, openpos); - int enpos = text.indexOf(OFSEND, openpos); - int textlen = enpos - closepos - OFSCLOSE.length(); + text = stripClassHilights(text); + return getSpecificHighlights(text, OFSOPEN, OFSCLOSE, OFSEND); + } - int nextopenpos = text.indexOf(OFSOPEN, openpos + 1); - if (nextopenpos != -1) { - if (nextopenpos < enpos) { - System.err.println(text); - throw new RuntimeException("Crossed highlight"); - } - } - long offset = Long.parseLong(text.substring(openpos + OFSOPEN.length(), closepos)); - Highlighting hl = new Highlighting(pos + openpos, textlen, offset); - pos += openpos + textlen; - text = text.substring(enpos + OFSEND.length()); - ret.add(hl); - } - return ret; + /** + * Gets all class highlight objects from specified text + * + * @param text Text to get highlights from + * @return List of class highlights + */ + public static List getClassHighlights(String text) { + text = text.replace("\r\n", "\n"); + text = stripTraitHilights(text); + text = stripMethodHilights(text); + text = stripInstrHilights(text); + return getSpecificHighlights(text, CLASSOPEN, CLASSCLOSE, CLASSEND); } }