From 4d7e062b957968993e35b95660f372961fec12df Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jindra=20Pet=C5=99=C3=ADk?= Date: Mon, 8 Mar 2021 17:52:29 +0100 Subject: [PATCH] #1636 Another Goto usage exception --- CHANGELOG.md | 2 +- .../jpexs/decompiler/flash/gui/MainPanel.java | 3 +- .../decompiler/flash/gui/abc/ABCPanel.java | 40 ++++++++++--------- .../flash/gui/abc/DecompiledEditorPane.java | 28 +++++++------ 4 files changed, 39 insertions(+), 34 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4c43b8fcb..8c6e952ef 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -23,7 +23,7 @@ All notable changes to this project will be documented in this file. - Generic tag saving problem - timelined exception - [#1332] Flash viewer - Show directly added images when placeFlagHasImage is true on AS3 swfs - XML Import - not set SWF and Timelined internal values caused an exception on item display -- Goto usage exception and incorrect trait position +- [#1636] Goto usage exception and incorrect trait position - [#1648] Search - loaded search results mixed - [#1650] Empty search results from history after reloading SWF file diff --git a/src/com/jpexs/decompiler/flash/gui/MainPanel.java b/src/com/jpexs/decompiler/flash/gui/MainPanel.java index 8ad31a0ca..85b21349f 100644 --- a/src/com/jpexs/decompiler/flash/gui/MainPanel.java +++ b/src/com/jpexs/decompiler/flash/gui/MainPanel.java @@ -155,6 +155,7 @@ import com.jpexs.helpers.CancellableWorker; import com.jpexs.helpers.Helper; import com.jpexs.helpers.Path; import com.jpexs.helpers.ProgressListener; +import com.jpexs.helpers.Reference; import com.jpexs.helpers.SerializableImage; import java.awt.BorderLayout; import java.awt.CardLayout; @@ -2219,7 +2220,7 @@ public final class MainPanel extends JPanel implements TreeSelectionListener, Se FileAttributesTag fileAttributes = swf.getFileAttributes(); if (fileAttributes != null && fileAttributes.actionScript3) { - final int multiName = getABCPanel().decompiledTextArea.getMultinameUnderCaret(); + final int multiName = getABCPanel().decompiledTextArea.getMultinameUnderCaret(new Reference(null)); final List abcList = swf.getAbcList(); if (multiName > 0) { new CancellableWorker() { diff --git a/src/com/jpexs/decompiler/flash/gui/abc/ABCPanel.java b/src/com/jpexs/decompiler/flash/gui/abc/ABCPanel.java index 47fc02408..a0caa27ef 100644 --- a/src/com/jpexs/decompiler/flash/gui/abc/ABCPanel.java +++ b/src/com/jpexs/decompiler/flash/gui/abc/ABCPanel.java @@ -1012,9 +1012,10 @@ public class ABCPanel extends JPanel implements ItemListener, SearchListener usedAbc = new Reference<>(null); + int multinameIndex = decompiledTextArea.getMultinameUnderCaret(usedAbc); if (multinameIndex > -1) { - UsageFrame usageFrame = new UsageFrame(abc, multinameIndex, ABCPanel.this, false); + UsageFrame usageFrame = new UsageFrame(usedAbc.getVal(), multinameIndex, ABCPanel.this, false); usageFrame.setVisible(true); } } @@ -1120,30 +1121,31 @@ public class ABCPanel extends JPanel implements ItemListener, SearchListener traitIndex = new Reference<>(0); Reference multinameIndexRef = new Reference<>(0); Reference classTrait = new Reference<>(false); - - if (decompiledTextArea.getPropertyTypeAtPos(pos, abcIndex, classIndex, traitIndex, classTrait, multinameIndexRef)) { + Reference usedAbcRef = new Reference<>(null); + if (decompiledTextArea.getPropertyTypeAtPos(pos, abcIndex, classIndex, traitIndex, classTrait, multinameIndexRef, usedAbcRef)) { return true; } - int multinameIndex = decompiledTextArea.getMultinameAtPos(pos); + ABC usedAbc = usedAbcRef.getVal(); + int multinameIndex = decompiledTextArea.getMultinameAtPos(pos, usedAbcRef); if (multinameIndex > -1) { if (multinameIndex == 0) { return false; } - List usages = abc.findMultinameDefinition(multinameIndex); + List usages = usedAbcRef.getVal().findMultinameDefinition(multinameIndex); - Multiname m = abc.constants.getMultiname(multinameIndex); + Multiname m = usedAbc.constants.getMultiname(multinameIndex); if (m == null) { return false; } //search other ABC tags if this is not private multiname - if (m.getSingleNamespaceIndex(abc.constants) > 0 && abc.constants.getNamespace(m.getSingleNamespaceIndex(abc.constants)).kind != Namespace.KIND_PRIVATE) { + if (m.getSingleNamespaceIndex(usedAbc.constants) > 0 && usedAbc.constants.getNamespace(m.getSingleNamespaceIndex(usedAbc.constants)).kind != Namespace.KIND_PRIVATE) { for (ABCContainerTag at : getAbcList()) { ABC a = at.getABC(); - if (a == abc) { + if (a == usedAbc) { continue; } - List mids = a.constants.getMultinameIds(m, abc.constants); + List mids = a.constants.getMultinameIds(m, usedAbc.constants); for (int mid : mids) { usages.addAll(a.findMultinameDefinition(mid)); } @@ -1167,25 +1169,26 @@ public class ABCPanel extends JPanel implements ItemListener, SearchListener traitIndex = new Reference<>(0); Reference classTrait = new Reference<>(false); Reference multinameIndexRef = new Reference<>(0); - - if (decompiledTextArea.getPropertyTypeAtPos(pos, abcIndex, classIndex, traitIndex, classTrait, multinameIndexRef)) { + Reference usedAbcRef = new Reference<>(null); + if (decompiledTextArea.getPropertyTypeAtPos(pos, abcIndex, classIndex, traitIndex, classTrait, multinameIndexRef, usedAbcRef)) { UsageFrame.gotoUsage(ABCPanel.this, new TraitMultinameUsage(getAbcList().get(abcIndex.getVal()).getABC(), multinameIndexRef.getVal(), decompiledTextArea.getScriptLeaf().scriptIndex, classIndex.getVal(), traitIndex.getVal(), classTrait.getVal() ? TraitMultinameUsage.TRAITS_TYPE_CLASS : TraitMultinameUsage.TRAITS_TYPE_INSTANCE, null, -1) { }); return; } - int multinameIndex = decompiledTextArea.getMultinameAtPos(pos); + int multinameIndex = decompiledTextArea.getMultinameAtPos(pos, usedAbcRef); + ABC usedAbc = usedAbcRef.getVal(); if (multinameIndex > -1) { List usages = abc.findMultinameDefinition(multinameIndex); - Multiname m = abc.constants.getMultiname(multinameIndex); + Multiname m = usedAbc.constants.getMultiname(multinameIndex); //search other ABC tags if this is not private multiname - if (m.getSingleNamespaceIndex(abc.constants) > 0 && m.getSingleNamespace(abc.constants).kind != Namespace.KIND_PRIVATE) { + if (m.getSingleNamespaceIndex(usedAbc.constants) > 0 && m.getSingleNamespace(usedAbc.constants).kind != Namespace.KIND_PRIVATE) { for (ABCContainerTag at : getAbcList()) { ABC a = at.getABC(); - if (a == abc) { + if (a == usedAbc) { continue; } - List mids = a.constants.getMultinameIds(m, abc.constants); + List mids = a.constants.getMultinameIds(m, usedAbc.constants); for (int mid : mids) { usages.addAll(a.findMultinameDefinition(mid)); } @@ -1194,7 +1197,7 @@ public class ABCPanel extends JPanel implements ItemListener, SearchListener 1) { - UsageFrame usageFrame = new UsageFrame(abc, multinameIndex, ABCPanel.this, true); + UsageFrame usageFrame = new UsageFrame(usedAbc, multinameIndex, ABCPanel.this, true); usageFrame.setVisible(true); return; } else if (!usages.isEmpty()) { //one @@ -1206,7 +1209,6 @@ public class ABCPanel extends JPanel implements ItemListener, SearchListener(null)); if (dpos > -1) { decompiledTextArea.setCaretPosition(dpos); - } } diff --git a/src/com/jpexs/decompiler/flash/gui/abc/DecompiledEditorPane.java b/src/com/jpexs/decompiler/flash/gui/abc/DecompiledEditorPane.java index efa5e9485..92b55e8ff 100644 --- a/src/com/jpexs/decompiler/flash/gui/abc/DecompiledEditorPane.java +++ b/src/com/jpexs/decompiler/flash/gui/abc/DecompiledEditorPane.java @@ -247,12 +247,12 @@ public class DecompiledEditorPane extends DebuggableEditorPane implements CaretL reset = false; } - public int getMultinameUnderMouseCursor(Point pt) { - return getMultinameAtPos(viewToModel(pt)); + public int getMultinameUnderMouseCursor(Point pt, Reference abcUsed) { + return getMultinameAtPos(viewToModel(pt), abcUsed); } - public int getMultinameUnderCaret() { - return getMultinameAtPos(getCaretPosition()); + public int getMultinameUnderCaret(Reference abcUsed) { + return getMultinameAtPos(getCaretPosition(), abcUsed); } public int getLocalDeclarationOfPos(int pos, Reference type) { @@ -310,9 +310,9 @@ public class DecompiledEditorPane extends DebuggableEditorPane implements CaretL return -1; } - public boolean getPropertyTypeAtPos(int pos, Reference abcIndex, Reference classIndex, Reference traitIndex, Reference classTrait, Reference multinameIndex) { + public boolean getPropertyTypeAtPos(int pos, Reference abcIndex, Reference classIndex, Reference traitIndex, Reference classTrait, Reference multinameIndex, Reference abcUsed) { - int m = getMultinameAtPos(pos, true); + int m = getMultinameAtPos(pos, true, abcUsed); if (m <= 0) { return false; } @@ -345,7 +345,7 @@ public class DecompiledEditorPane extends DebuggableEditorPane implements CaretL while (!currentType.equals(DottedChain.ALL)) { String ident = t.getString(sd); found = false; - List abcList = getABC().getSwf().getAbcList(); + List abcList = abcUsed.getVal().getSwf().getAbcList(); loopi: for (int i = 0; i < abcList.size(); i++) { ABC a = abcList.get(i).getABC(); @@ -398,27 +398,29 @@ public class DecompiledEditorPane extends DebuggableEditorPane implements CaretL return true; } - public int getMultinameAtPos(int pos) { - return getMultinameAtPos(pos, false); + public int getMultinameAtPos(int pos, Reference abcUsed) { + return getMultinameAtPos(pos, false, abcUsed); } - private int getMultinameAtPos(int pos, boolean codeOnly) { - int multinameIndex = _getMultinameAtPos(pos, codeOnly); + private int getMultinameAtPos(int pos, boolean codeOnly, Reference abcUsed) { + int multinameIndex = _getMultinameAtPos(pos, codeOnly, abcUsed); if (multinameIndex > -1) { - ABC abc = getABC(); + ABC abc = abcUsed.getVal(); multinameIndex = abc.constants.convertToQname(abc.constants, multinameIndex); } return multinameIndex; } - public int _getMultinameAtPos(int pos, boolean codeOnly) { + public int _getMultinameAtPos(int pos, boolean codeOnly, Reference abcUsed) { Highlighting tm = Highlighting.searchPos(highlightedText.getMethodHighlights(), pos); Trait currentTrait = null; int currentMethod = -1; ABC abc = getABC(); + abcUsed.setVal(abc); if (abc == null) { return -1; } + if (tm != null) { int mi = (int) tm.getProperties().index;