From d67e7660efe2e6d0f3f3339f997d65722ead96ea Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jindra=20Pet=F8=EDk?= Date: Sun, 31 Jul 2011 19:30:03 +0200 Subject: [PATCH] AS3: Clickable usage detection for multinames --- trunk/src/com/jpexs/asdec/abc/ABC.java | 30 ++--- .../jpexs/asdec/abc/gui/ClassesListTree.java | 104 +++++++++------ .../com/jpexs/asdec/abc/gui/UsageFrame.java | 119 ++++++++++++++---- .../jpexs/asdec/abc/gui/UsageListModel.java | 4 + .../abc/usages/ConstVarMultinameUsage.java | 26 ++-- .../usages/ConstVarNameMultinameUsage.java | 5 +- .../usages/ConstVarTypeMultinameUsage.java | 5 +- .../abc/usages/MethodBodyMultinameUsage.java | 5 +- .../abc/usages/MethodMultinameUsage.java | 27 ++-- .../abc/usages/MethodNameMultinameUsage.java | 5 +- .../usages/MethodParamsMultinameUsage.java | 7 +- .../MethodReturnTypeMultinameUsage.java | 7 +- .../asdec/abc/usages/TraitMultinameUsage.java | 40 ++++++ 13 files changed, 269 insertions(+), 115 deletions(-) create mode 100644 trunk/src/com/jpexs/asdec/abc/usages/TraitMultinameUsage.java diff --git a/trunk/src/com/jpexs/asdec/abc/ABC.java b/trunk/src/com/jpexs/asdec/abc/ABC.java index 99e33a9a8..33b79e6a1 100644 --- a/trunk/src/com/jpexs/asdec/abc/ABC.java +++ b/trunk/src/com/jpexs/asdec/abc/ABC.java @@ -808,20 +808,22 @@ public class ABC { return isValid; } - private void checkMultinameUsedInMethod(int multinameIndex, int methodInfo, List ret, int classIndex, int traitIndex, boolean isStatic, boolean isInitializer) { + private void checkMultinameUsedInMethod(int multinameIndex, int methodInfo, List ret, int classIndex, int traitIndex, boolean isStatic, boolean isInitializer,Traits traits,int parentTraitIndex) { for (int p = 0; p < method_info[methodInfo].param_types.length; p++) { if (method_info[methodInfo].param_types[p] == multinameIndex) { - ret.add(new MethodParamsMultinameUsage(multinameIndex, classIndex, traitIndex, isStatic, isInitializer)); + ret.add(new MethodParamsMultinameUsage(multinameIndex, classIndex, traitIndex, isStatic, isInitializer,traits,parentTraitIndex)); + break; } } if (method_info[methodInfo].ret_type == multinameIndex) { - ret.add(new MethodReturnTypeMultinameUsage(multinameIndex, classIndex, traitIndex, isStatic, isInitializer)); + ret.add(new MethodReturnTypeMultinameUsage(multinameIndex, classIndex, traitIndex, isStatic, isInitializer,traits,parentTraitIndex)); } MethodBody body = findBody(methodInfo); if (body != null) { + findMultinameUsageInTraits(body.traits,multinameIndex,isStatic,classIndex,ret,traitIndex); for(ABCException e:body.exceptions){ if((e.name_index==multinameIndex)||(e.type_index==multinameIndex)){ - ret.add(new MethodBodyMultinameUsage(multinameIndex, classIndex, traitIndex, isStatic, isInitializer)); + ret.add(new MethodBodyMultinameUsage(multinameIndex, classIndex, traitIndex, isStatic, isInitializer,traits,parentTraitIndex)); return; } } @@ -829,7 +831,7 @@ public class ABC { for (int o = 0; o < ins.definition.operands.length; o++) { if (ins.definition.operands[o] == AVM2Code.DAT_MULTINAME_INDEX) { if (ins.operands[o] == multinameIndex) { - ret.add(new MethodBodyMultinameUsage(multinameIndex, classIndex, traitIndex, isStatic, isInitializer)); + ret.add(new MethodBodyMultinameUsage(multinameIndex, classIndex, traitIndex, isStatic, isInitializer,traits,parentTraitIndex)); return; } } @@ -838,23 +840,23 @@ public class ABC { } } - private void findMultinameUsageInTraits(Traits traits, int multinameIndex, boolean isStatic, int classIndex, List ret) { + private void findMultinameUsageInTraits(Traits traits, int multinameIndex, boolean isStatic, int classIndex, List ret,int parentTraitIndex) { for (int t = 0; t < traits.traits.length; t++) { if (traits.traits[t] instanceof TraitSlotConst) { TraitSlotConst tsc = (TraitSlotConst) traits.traits[t]; if (tsc.name_index == multinameIndex) { - ret.add(new ConstVarNameMultinameUsage(multinameIndex, classIndex, t, isStatic)); + ret.add(new ConstVarNameMultinameUsage(multinameIndex, classIndex, t, isStatic,traits,parentTraitIndex)); } if (tsc.type_index == multinameIndex) { - ret.add(new ConstVarTypeMultinameUsage(multinameIndex, classIndex, t, isStatic)); + ret.add(new ConstVarTypeMultinameUsage(multinameIndex, classIndex, t, isStatic,traits,parentTraitIndex)); } } if (traits.traits[t] instanceof TraitMethodGetterSetter) { TraitMethodGetterSetter tmgs = (TraitMethodGetterSetter) traits.traits[t]; if (tmgs.name_index == multinameIndex) { - ret.add(new MethodNameMultinameUsage(multinameIndex, classIndex, t, isStatic, false)); + ret.add(new MethodNameMultinameUsage(multinameIndex, classIndex, t, isStatic, false,traits,parentTraitIndex)); } - checkMultinameUsedInMethod(multinameIndex, tmgs.method_info, ret, classIndex, t, isStatic, false); + checkMultinameUsedInMethod(multinameIndex, tmgs.method_info, ret, classIndex, t, isStatic, false,traits,parentTraitIndex); } } } @@ -876,10 +878,10 @@ public class ABC { ret.add(new ImplementsMultinameUsage(multinameIndex, c)); } } - checkMultinameUsedInMethod(multinameIndex, instance_info[c].iinit_index, ret, c, 0, false, true); - checkMultinameUsedInMethod(multinameIndex, class_info[c].cinit_index, ret, c, 0, true, true); - findMultinameUsageInTraits(instance_info[c].instance_traits, multinameIndex, false, c, ret); - findMultinameUsageInTraits(class_info[c].static_traits, multinameIndex, true, c, ret); + checkMultinameUsedInMethod(multinameIndex, instance_info[c].iinit_index, ret, c, 0, false, true,null,-1); + checkMultinameUsedInMethod(multinameIndex, class_info[c].cinit_index, ret, c, 0, true, true,null,-1); + findMultinameUsageInTraits(instance_info[c].instance_traits, multinameIndex, false, c, ret,-1); + findMultinameUsageInTraits(class_info[c].static_traits, multinameIndex, true, c, ret,-1); } loopm: for (int m = 1; m < constants.constant_multiname.length; m++) { diff --git a/trunk/src/com/jpexs/asdec/abc/gui/ClassesListTree.java b/trunk/src/com/jpexs/asdec/abc/gui/ClassesListTree.java index 6cc8f4436..636a41d3d 100644 --- a/trunk/src/com/jpexs/asdec/abc/gui/ClassesListTree.java +++ b/trunk/src/com/jpexs/asdec/abc/gui/ClassesListTree.java @@ -15,56 +15,86 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - package com.jpexs.asdec.abc.gui; import com.jpexs.asdec.Main; import com.jpexs.asdec.abc.ABC; +import java.util.ArrayList; +import java.util.List; import javax.swing.*; import javax.swing.event.TreeSelectionEvent; import javax.swing.event.TreeSelectionListener; import javax.swing.tree.DefaultTreeCellRenderer; - +import javax.swing.tree.TreePath; public class ClassesListTree extends JTree implements TreeSelectionListener { - public ABC abc; - public ClassesListTree(ABC abc) { - this.abc = abc; - setModel(new ClassesListTreeModel(abc)); - addTreeSelectionListener(this); - DefaultTreeCellRenderer treeRenderer = new DefaultTreeCellRenderer(); - ClassLoader cldr = this.getClass().getClassLoader(); - java.net.URL imageURL = cldr.getResource("com/jpexs/asdec/abc/gui/graphics/class.png"); - ImageIcon leafIcon = new ImageIcon(imageURL); - treeRenderer.setLeafIcon(leafIcon); - setCellRenderer(treeRenderer); - } + public ABC abc; - public void setABC(ABC abc) { - setModel(new ClassesListTreeModel(abc)); - this.abc = abc; - } + public void selectClass(int classIndex) { + List pathList = new ArrayList(); + String packageName = abc.instance_info[classIndex].getName(abc.constants).getNamespace(abc.constants).getName(abc.constants); + String className = abc.instance_info[classIndex].getName(abc.constants).getName(abc.constants); + String full = packageName + "." + className; + String parts[] = full.split("\\."); + String s = ""; + pathList.add(new TreePart("", "", -1)); + for (int j = 0; j < parts.length; j++) { + if (!s.endsWith(".")) { + s += "."; + } + s += parts[j]; + TreePart tp = new TreePart(s, parts[j], j < parts.length - 1 ? -1 : classIndex); + if (!pathList.contains(tp)) { + pathList.add(tp); + } + } - public void valueChanged(TreeSelectionEvent e) { - if (Main.isWorking()) return; - final TreePart tp = (TreePart) getLastSelectedPathComponent(); - if (tp == null) return; - if (tp.classIndex != -1) { - if (!Main.isWorking()) { - Main.startWork("Decompiling class..."); - (new Thread() { - @Override - public void run() { - Main.abcMainFrame.navigator.setClassIndex(tp.classIndex); - Main.abcMainFrame.decompiledTextArea.setClassIndex(tp.classIndex, abc); - Main.abcMainFrame.detailPanel.methodTraitPanel.methodCodePanel.sourceTextArea.setText(""); - Main.stopWork(); - } - }).start(); - } - } - } + TreePath tp = new TreePath(pathList.toArray()); + setSelectionPath(tp); + scrollPathToVisible(tp); + } + public ClassesListTree(ABC abc) { + this.abc = abc; + setModel(new ClassesListTreeModel(abc)); + addTreeSelectionListener(this); + DefaultTreeCellRenderer treeRenderer = new DefaultTreeCellRenderer(); + ClassLoader cldr = this.getClass().getClassLoader(); + java.net.URL imageURL = cldr.getResource("com/jpexs/asdec/abc/gui/graphics/class.png"); + ImageIcon leafIcon = new ImageIcon(imageURL); + treeRenderer.setLeafIcon(leafIcon); + setCellRenderer(treeRenderer); + } + + public void setABC(ABC abc) { + setModel(new ClassesListTreeModel(abc)); + this.abc = abc; + } + + public void valueChanged(TreeSelectionEvent e) { + if (Main.isWorking()) { + return; + } + final TreePart tp = (TreePart) getLastSelectedPathComponent(); + if (tp == null) { + return; + } + if (tp.classIndex != -1) { + if (!Main.isWorking()) { + Main.startWork("Decompiling class..."); + (new Thread() { + + @Override + public void run() { + Main.abcMainFrame.navigator.setClassIndex(tp.classIndex); + Main.abcMainFrame.decompiledTextArea.setClassIndex(tp.classIndex, abc); + Main.abcMainFrame.detailPanel.methodTraitPanel.methodCodePanel.sourceTextArea.setText(""); + Main.stopWork(); + } + }).start(); + } + } + } } diff --git a/trunk/src/com/jpexs/asdec/abc/gui/UsageFrame.java b/trunk/src/com/jpexs/asdec/abc/gui/UsageFrame.java index 361ec79e3..b36c3708a 100644 --- a/trunk/src/com/jpexs/asdec/abc/gui/UsageFrame.java +++ b/trunk/src/com/jpexs/asdec/abc/gui/UsageFrame.java @@ -15,67 +15,134 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - package com.jpexs.asdec.abc.gui; +import com.jpexs.asdec.Main; import com.jpexs.asdec.abc.ABC; import com.jpexs.asdec.abc.usages.InsideClassMultinameUsage; +import com.jpexs.asdec.abc.usages.MethodMultinameUsage; import com.jpexs.asdec.abc.usages.MultinameUsage; +import com.jpexs.asdec.abc.usages.TraitMultinameUsage; import com.jpexs.asdec.gui.View; import java.awt.BorderLayout; import java.awt.Container; import java.awt.FlowLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; +import java.awt.event.MouseEvent; +import java.awt.event.MouseListener; +import java.util.ArrayList; +import java.util.Collections; import java.util.List; +import java.util.logging.Level; +import java.util.logging.Logger; import javax.swing.DefaultListModel; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JList; import javax.swing.JPanel; import javax.swing.JScrollPane; +import javax.swing.tree.TreePath; /** * * @author JPEXS */ -public class UsageFrame extends JFrame implements ActionListener { - private JButton gotoButton=new JButton("Go to"); - private JButton cancelButton=new JButton("Cancel"); - private JList usageList; - private UsageListModel usageListModel; - public UsageFrame(ABC abc,int multinameIndex){ - List usages=abc.findMultinameUsage(multinameIndex); - usageListModel=new UsageListModel(abc); - for(MultinameUsage u:usages){ - usageListModel.addElement(u); +public class UsageFrame extends JFrame implements ActionListener, MouseListener { + + private JButton gotoButton = new JButton("Go to"); + private JButton cancelButton = new JButton("Cancel"); + private JList usageList; + private UsageListModel usageListModel; + private ABC abc; + + public UsageFrame(ABC abc, int multinameIndex) { + List usages = abc.findMultinameUsage(multinameIndex); + this.abc = abc; + usageListModel = new UsageListModel(abc); + for (MultinameUsage u : usages) { + usageListModel.addElement(u); } - usageList=new JList(usageListModel); + usageList = new JList(usageListModel); gotoButton.setActionCommand("GOTO"); gotoButton.addActionListener(this); cancelButton.setActionCommand("CANCEL"); cancelButton.addActionListener(this); - JPanel buttonsPanel=new JPanel(); + JPanel buttonsPanel = new JPanel(); buttonsPanel.setLayout(new FlowLayout()); - //buttonsPanel.add(gotoButton); + buttonsPanel.add(gotoButton); buttonsPanel.add(cancelButton); - Container cont=getContentPane(); + usageList.addMouseListener(this); + Container cont = getContentPane(); cont.setLayout(new BorderLayout()); - cont.add(new JScrollPane(usageList),BorderLayout.CENTER); + cont.add(new JScrollPane(usageList), BorderLayout.CENTER); cont.add(buttonsPanel, BorderLayout.SOUTH); - setSize(400,300); - setTitle("Usages:"+abc.constants.constant_multiname[multinameIndex].getNameWithNamespace(abc.constants)); + setSize(400, 300); + setTitle("Usages:" + abc.constants.constant_multiname[multinameIndex].getNameWithNamespace(abc.constants)); View.centerScreen(this); View.setWindowIcon(this); - } + } - public void actionPerformed(ActionEvent e) { - if(e.getActionCommand().equals("GOTO")){ + private void gotoUsage() { + if (usageList.getSelectedIndex() != -1) { + MultinameUsage usage = usageListModel.getUsage(usageList.getSelectedIndex()); + if (usage instanceof InsideClassMultinameUsage) { + InsideClassMultinameUsage icu = (InsideClassMultinameUsage) usage; + Main.abcMainFrame.classTree.selectClass(icu.classIndex); + try { + Thread.sleep(100); + } catch (InterruptedException ex) { + + } + if (usage instanceof TraitMultinameUsage) { + TraitMultinameUsage tmu=(TraitMultinameUsage)usage; + int traitIndex=0; + if(tmu.parentTraitIndex>-1){ + traitIndex=tmu.parentTraitIndex; + }else{ + traitIndex=tmu.traitIndex; + } + if(!tmu.isStatic){ + traitIndex+=abc.class_info[tmu.classIndex].static_traits.traits.length; + } + if(tmu instanceof MethodMultinameUsage){ + MethodMultinameUsage mmu=(MethodMultinameUsage)usage; + if(mmu.isInitializer==true){ + traitIndex=abc.class_info[mmu.classIndex].static_traits.traits.length+abc.instance_info[mmu.classIndex].instance_traits.traits.length+(mmu.isStatic?1:0); + } + } + Main.abcMainFrame.decompiledTextArea.gotoTrait(traitIndex); + } + } + } + } - } - if(e.getActionCommand().equals("CANCEL")){ - setVisible(false); - } - } + public void actionPerformed(ActionEvent e) { + if (e.getActionCommand().equals("GOTO")) { + gotoUsage(); + setVisible(false); + } + if (e.getActionCommand().equals("CANCEL")) { + setVisible(false); + } + } + + public void mouseClicked(MouseEvent e) { + if (e.getClickCount() == 2) { + gotoUsage(); + } + } + + public void mousePressed(MouseEvent e) { + } + + public void mouseReleased(MouseEvent e) { + } + + public void mouseEntered(MouseEvent e) { + } + + public void mouseExited(MouseEvent e) { + } } diff --git a/trunk/src/com/jpexs/asdec/abc/gui/UsageListModel.java b/trunk/src/com/jpexs/asdec/abc/gui/UsageListModel.java index f8d063cae..ff4b7894f 100644 --- a/trunk/src/com/jpexs/asdec/abc/gui/UsageListModel.java +++ b/trunk/src/com/jpexs/asdec/abc/gui/UsageListModel.java @@ -42,6 +42,10 @@ public class UsageListModel extends DefaultListModel{ return ((MultinameUsage)super.getElementAt(index)).toString(abc); } + public MultinameUsage getUsage(int index){ + return ((MultinameUsage)super.getElementAt(index)); + } + diff --git a/trunk/src/com/jpexs/asdec/abc/usages/ConstVarMultinameUsage.java b/trunk/src/com/jpexs/asdec/abc/usages/ConstVarMultinameUsage.java index 2425099a5..2705f4639 100644 --- a/trunk/src/com/jpexs/asdec/abc/usages/ConstVarMultinameUsage.java +++ b/trunk/src/com/jpexs/asdec/abc/usages/ConstVarMultinameUsage.java @@ -21,29 +21,31 @@ package com.jpexs.asdec.abc.usages; import com.jpexs.asdec.abc.ABC; import com.jpexs.asdec.abc.types.traits.TraitMethodGetterSetter; import com.jpexs.asdec.abc.types.traits.TraitSlotConst; +import com.jpexs.asdec.abc.types.traits.Traits; /** * * @author JPEXS */ -public abstract class ConstVarMultinameUsage extends InsideClassMultinameUsage { +public abstract class ConstVarMultinameUsage extends TraitMultinameUsage { - public int traitIndex ; - public boolean isStatic; - public ConstVarMultinameUsage(int multinameIndex,int classIndex,int traitIndex,boolean isStatic) + public ConstVarMultinameUsage(int multinameIndex,int classIndex,int traitIndex,boolean isStatic,Traits traits,int parentTraitIndex) { - super(multinameIndex,classIndex); - this.traitIndex=traitIndex; - this.isStatic=isStatic; + super(multinameIndex,classIndex,traitIndex,isStatic,traits,parentTraitIndex); } @Override public String toString(ABC abc) { - return super.toString(abc)+" "+(isStatic? - ((TraitSlotConst)abc.class_info[classIndex].static_traits.traits[traitIndex]).convert(abc.constants, abc.method_info, abc,true) - : - ((TraitSlotConst)abc.instance_info[classIndex].instance_traits.traits[traitIndex]).convert(abc.constants, abc.method_info, abc,false) - ); + return super.toString(abc)+" "+ + (parentTraitIndex>-1? + (isStatic? + (((TraitMethodGetterSetter)abc.class_info[classIndex].static_traits.traits[parentTraitIndex]).convert(abc.constants, abc.method_info, abc,isStatic)): + (((TraitMethodGetterSetter)abc.instance_info[classIndex].instance_traits.traits[parentTraitIndex]).convert(abc.constants, abc.method_info, abc,isStatic)) + ) + : + "")+ + ((TraitSlotConst)traits.traits[traitIndex]).convert(abc.constants, abc.method_info, abc,isStatic) + ; } public int getTraitIndex() { diff --git a/trunk/src/com/jpexs/asdec/abc/usages/ConstVarNameMultinameUsage.java b/trunk/src/com/jpexs/asdec/abc/usages/ConstVarNameMultinameUsage.java index c700bc9cb..dd1582b48 100644 --- a/trunk/src/com/jpexs/asdec/abc/usages/ConstVarNameMultinameUsage.java +++ b/trunk/src/com/jpexs/asdec/abc/usages/ConstVarNameMultinameUsage.java @@ -19,6 +19,7 @@ package com.jpexs.asdec.abc.usages; import com.jpexs.asdec.abc.ABC; +import com.jpexs.asdec.abc.types.traits.Traits; /** * @@ -26,9 +27,9 @@ import com.jpexs.asdec.abc.ABC; */ public class ConstVarNameMultinameUsage extends ConstVarMultinameUsage{ - public ConstVarNameMultinameUsage(int multinameIndex,int classIndex,int traitIndex,boolean isStatic) + public ConstVarNameMultinameUsage(int multinameIndex,int classIndex,int traitIndex,boolean isStatic,Traits traits,int parentTraitIndex) { - super(multinameIndex,classIndex,traitIndex,isStatic); + super(multinameIndex,classIndex,traitIndex,isStatic,traits,parentTraitIndex); } @Override diff --git a/trunk/src/com/jpexs/asdec/abc/usages/ConstVarTypeMultinameUsage.java b/trunk/src/com/jpexs/asdec/abc/usages/ConstVarTypeMultinameUsage.java index 89bc713dd..ad19fd7b0 100644 --- a/trunk/src/com/jpexs/asdec/abc/usages/ConstVarTypeMultinameUsage.java +++ b/trunk/src/com/jpexs/asdec/abc/usages/ConstVarTypeMultinameUsage.java @@ -19,6 +19,7 @@ package com.jpexs.asdec.abc.usages; import com.jpexs.asdec.abc.ABC; +import com.jpexs.asdec.abc.types.traits.Traits; /** * @@ -26,9 +27,9 @@ import com.jpexs.asdec.abc.ABC; */ public class ConstVarTypeMultinameUsage extends ConstVarMultinameUsage{ - public ConstVarTypeMultinameUsage(int multinameIndex,int classIndex,int traitIndex,boolean isStatic) + public ConstVarTypeMultinameUsage(int multinameIndex,int classIndex,int traitIndex,boolean isStatic,Traits traits,int parentTraitIndex) { - super(multinameIndex,classIndex,traitIndex,isStatic); + super(multinameIndex,classIndex,traitIndex,isStatic,traits,parentTraitIndex); } @Override diff --git a/trunk/src/com/jpexs/asdec/abc/usages/MethodBodyMultinameUsage.java b/trunk/src/com/jpexs/asdec/abc/usages/MethodBodyMultinameUsage.java index a64510707..bb6166a46 100644 --- a/trunk/src/com/jpexs/asdec/abc/usages/MethodBodyMultinameUsage.java +++ b/trunk/src/com/jpexs/asdec/abc/usages/MethodBodyMultinameUsage.java @@ -19,6 +19,7 @@ package com.jpexs.asdec.abc.usages; import com.jpexs.asdec.abc.ABC; +import com.jpexs.asdec.abc.types.traits.Traits; /** * @@ -26,9 +27,9 @@ import com.jpexs.asdec.abc.ABC; */ public class MethodBodyMultinameUsage extends MethodMultinameUsage { - public MethodBodyMultinameUsage(int multinameIndex,int classIndex,int traitIndex,boolean isStatic,boolean isInitializer) + public MethodBodyMultinameUsage(int multinameIndex,int classIndex,int traitIndex,boolean isStatic,boolean isInitializer,Traits traits,int parentTraitIndex) { - super(multinameIndex,classIndex,traitIndex,isStatic,isInitializer); + super(multinameIndex,classIndex,traitIndex,isStatic,isInitializer,traits,parentTraitIndex); } @Override diff --git a/trunk/src/com/jpexs/asdec/abc/usages/MethodMultinameUsage.java b/trunk/src/com/jpexs/asdec/abc/usages/MethodMultinameUsage.java index 1b39be19d..6c1dbbf1b 100644 --- a/trunk/src/com/jpexs/asdec/abc/usages/MethodMultinameUsage.java +++ b/trunk/src/com/jpexs/asdec/abc/usages/MethodMultinameUsage.java @@ -20,21 +20,19 @@ package com.jpexs.asdec.abc.usages; import com.jpexs.asdec.abc.ABC; import com.jpexs.asdec.abc.types.traits.TraitMethodGetterSetter; +import com.jpexs.asdec.abc.types.traits.Traits; /** * * @author JPEXS */ -public abstract class MethodMultinameUsage extends InsideClassMultinameUsage { +public abstract class MethodMultinameUsage extends TraitMultinameUsage { - public int traitIndex ; - public boolean isStatic; public boolean isInitializer; - public MethodMultinameUsage(int multinameIndex,int classIndex,int traitIndex,boolean isStatic,boolean isInitializer) + + public MethodMultinameUsage(int multinameIndex,int classIndex,int traitIndex,boolean isStatic,boolean isInitializer,Traits traits,int parentTraitIndex) { - super(multinameIndex,classIndex); - this.traitIndex=traitIndex; - this.isStatic=isStatic; + super(multinameIndex,classIndex,traitIndex,isStatic,traits,parentTraitIndex); this.isInitializer=isInitializer; } @@ -51,12 +49,17 @@ public abstract class MethodMultinameUsage extends InsideClassMultinameUsage { (isStatic? "class initializer": "instance initializer") - : + :( + (parentTraitIndex>-1? (isStatic? - ((TraitMethodGetterSetter)abc.class_info[classIndex].static_traits.traits[traitIndex]).convert(abc.constants, abc.method_info, abc,true) - : - ((TraitMethodGetterSetter)abc.instance_info[classIndex].instance_traits.traits[traitIndex]).convert(abc.constants, abc.method_info, abc,false) - )); + (((TraitMethodGetterSetter)abc.class_info[classIndex].static_traits.traits[parentTraitIndex]).convert(abc.constants, abc.method_info, abc,isStatic)): + (((TraitMethodGetterSetter)abc.instance_info[classIndex].instance_traits.traits[parentTraitIndex]).convert(abc.constants, abc.method_info, abc,isStatic)) + )+" " + : + "") + + + (((TraitMethodGetterSetter)traits.traits[traitIndex]).convert(abc.constants, abc.method_info, abc,isStatic))) + ); } public int getTraitIndex() { diff --git a/trunk/src/com/jpexs/asdec/abc/usages/MethodNameMultinameUsage.java b/trunk/src/com/jpexs/asdec/abc/usages/MethodNameMultinameUsage.java index f0403f3e2..4453ad37d 100644 --- a/trunk/src/com/jpexs/asdec/abc/usages/MethodNameMultinameUsage.java +++ b/trunk/src/com/jpexs/asdec/abc/usages/MethodNameMultinameUsage.java @@ -19,6 +19,7 @@ package com.jpexs.asdec.abc.usages; import com.jpexs.asdec.abc.ABC; +import com.jpexs.asdec.abc.types.traits.Traits; /** * @@ -26,9 +27,9 @@ import com.jpexs.asdec.abc.ABC; */ public class MethodNameMultinameUsage extends MethodMultinameUsage { - public MethodNameMultinameUsage(int multinameIndex,int classIndex,int traitIndex,boolean isStatic,boolean isInitializer) + public MethodNameMultinameUsage(int multinameIndex,int classIndex,int traitIndex,boolean isStatic,boolean isInitializer,Traits traits,int parentTraitIndex) { - super(multinameIndex,classIndex,traitIndex,isStatic,isInitializer); + super(multinameIndex,classIndex,traitIndex,isStatic,isInitializer,traits,parentTraitIndex); } @Override diff --git a/trunk/src/com/jpexs/asdec/abc/usages/MethodParamsMultinameUsage.java b/trunk/src/com/jpexs/asdec/abc/usages/MethodParamsMultinameUsage.java index db0773262..6803b0278 100644 --- a/trunk/src/com/jpexs/asdec/abc/usages/MethodParamsMultinameUsage.java +++ b/trunk/src/com/jpexs/asdec/abc/usages/MethodParamsMultinameUsage.java @@ -19,6 +19,7 @@ package com.jpexs.asdec.abc.usages; import com.jpexs.asdec.abc.ABC; +import com.jpexs.asdec.abc.types.traits.Traits; /** * @@ -26,13 +27,13 @@ import com.jpexs.asdec.abc.ABC; */ public class MethodParamsMultinameUsage extends MethodMultinameUsage { - public MethodParamsMultinameUsage(int multinameIndex,int classIndex,int traitIndex,boolean isStatic,boolean isInitializer) + public MethodParamsMultinameUsage(int multinameIndex,int classIndex,int traitIndex,boolean isStatic,boolean isInitializer,Traits traits,int parentTraitIndex) { - super(multinameIndex,classIndex,traitIndex,isStatic,isInitializer); + super(multinameIndex,classIndex,traitIndex,isStatic,isInitializer,traits,parentTraitIndex); } @Override public String toString(ABC abc) { - return super.toString(abc)+" return type"; + return super.toString(abc)+" params"; } } diff --git a/trunk/src/com/jpexs/asdec/abc/usages/MethodReturnTypeMultinameUsage.java b/trunk/src/com/jpexs/asdec/abc/usages/MethodReturnTypeMultinameUsage.java index 0c49a7e6a..e9089ac1d 100644 --- a/trunk/src/com/jpexs/asdec/abc/usages/MethodReturnTypeMultinameUsage.java +++ b/trunk/src/com/jpexs/asdec/abc/usages/MethodReturnTypeMultinameUsage.java @@ -19,6 +19,7 @@ package com.jpexs.asdec.abc.usages; import com.jpexs.asdec.abc.ABC; +import com.jpexs.asdec.abc.types.traits.Traits; /** * @@ -26,13 +27,13 @@ import com.jpexs.asdec.abc.ABC; */ public class MethodReturnTypeMultinameUsage extends MethodMultinameUsage { - public MethodReturnTypeMultinameUsage(int multinameIndex,int classIndex,int traitIndex,boolean isStatic,boolean isInitializer) + public MethodReturnTypeMultinameUsage(int multinameIndex,int classIndex,int traitIndex,boolean isStatic,boolean isInitializer,Traits traits,int parentTraitIndex) { - super(multinameIndex,classIndex,traitIndex,isStatic,isInitializer); + super(multinameIndex,classIndex,traitIndex,isStatic,isInitializer,traits,parentTraitIndex); } @Override public String toString(ABC abc) { - return super.toString(abc)+" params"; + return super.toString(abc)+" return type"; } } diff --git a/trunk/src/com/jpexs/asdec/abc/usages/TraitMultinameUsage.java b/trunk/src/com/jpexs/asdec/abc/usages/TraitMultinameUsage.java new file mode 100644 index 000000000..405e376ce --- /dev/null +++ b/trunk/src/com/jpexs/asdec/abc/usages/TraitMultinameUsage.java @@ -0,0 +1,40 @@ +/* + * Copyright (C) 2011 JPEXS + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + +package com.jpexs.asdec.abc.usages; + +import com.jpexs.asdec.abc.types.traits.Traits; + +/** + * + * @author JPEXS + */ +public abstract class TraitMultinameUsage extends InsideClassMultinameUsage { + public int traitIndex ; + public boolean isStatic; + public Traits traits; + public int parentTraitIndex; + public TraitMultinameUsage(int multinameIndex,int classIndex,int traitIndex,boolean isStatic,Traits traits,int parentTraitIndex) + { + super(multinameIndex,classIndex); + this.traitIndex=traitIndex; + this.isStatic=isStatic; + this.traits=traits; + this.parentTraitIndex=parentTraitIndex; + } +}