AS highligter - support for obfuscated names

This commit is contained in:
Jindra Petřík
2025-06-11 21:07:25 +02:00
parent e594a96a39
commit b26791697c
13 changed files with 479 additions and 311 deletions
@@ -20,6 +20,7 @@ import com.jpexs.debugger.flash.Variable;
import com.jpexs.debugger.flash.VariableFlags;
import com.jpexs.debugger.flash.VariableType;
import com.jpexs.debugger.flash.messages.in.InGetVariable;
import com.jpexs.decompiler.flash.IdentifiersDeobfuscation;
import com.jpexs.decompiler.flash.SWF;
import com.jpexs.decompiler.flash.abc.ABC;
import com.jpexs.decompiler.flash.abc.ClassPath;
@@ -82,6 +83,7 @@ import com.jpexs.decompiler.flash.search.ScriptSearchListener;
import com.jpexs.decompiler.flash.search.ScriptSearchResult;
import com.jpexs.decompiler.flash.simpleparser.LinkHandler;
import com.jpexs.decompiler.flash.simpleparser.LinkType;
import com.jpexs.decompiler.flash.simpleparser.Path;
import com.jpexs.decompiler.flash.tags.ABCContainerTag;
import com.jpexs.decompiler.flash.tags.Tag;
import com.jpexs.decompiler.flash.timeline.AS3Package;
@@ -117,6 +119,7 @@ import java.awt.event.MouseMotionListener;
import java.io.IOException;
import java.io.StringReader;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@@ -953,11 +956,11 @@ public class ABCPanel extends JPanel implements ItemListener, SearchListener<Scr
decompiledTextArea.setLinkHandler(new LinkHandler() {
@Override
public LinkType getClassLinkType(String className) {
AbcIndexing.ClassIndex ci = abc.getSwf().getAbcIndex().findClass(new TypeItem(className), abc, decompiledTextArea.getScriptIndex());
public LinkType getClassLinkType(Path className) {
AbcIndexing.ClassIndex ci = abc.getSwf().getAbcIndex().findClass(new TypeItem(className.toString()), abc, decompiledTextArea.getScriptIndex());
if (ci == null) {
AbcIndexing.TraitIndex ti = abc.getSwf().getAbcIndex().findScriptProperty(DottedChain.parseNoSuffix(className));
AbcIndexing.TraitIndex ti = abc.getSwf().getAbcIndex().findScriptProperty(DottedChain.parseNoSuffix(className.toString()));
if (ti == null) {
return LinkType.NO_LINK;
}
@@ -983,9 +986,9 @@ public class ABCPanel extends JPanel implements ItemListener, SearchListener<Scr
}
@Override
public boolean traitExists(String className, String traitName) {
public boolean traitExists(Path className, String traitName) {
Reference<Boolean> foundStatic = new Reference<>(null);
AbcIndexing.TraitIndex ti = abc.getSwf().getAbcIndex().findProperty(new AbcIndexing.PropertyDef(traitName, new TypeItem(className), abc, -1),
AbcIndexing.TraitIndex ti = abc.getSwf().getAbcIndex().findProperty(new AbcIndexing.PropertyDef(traitName, new TypeItem(className.toString()), abc, -1),
true,
true,
true,
@@ -994,11 +997,11 @@ public class ABCPanel extends JPanel implements ItemListener, SearchListener<Scr
}
@Override
public void handleClassLink(String scriptName) {
public void handleClassLink(Path scriptName) {
Reference<SWF> swfRef = new Reference<>(null);
AbcIndexing.ClassIndex ci = abc.getSwf().getAbcIndex().findClass(new TypeItem(scriptName), abc, decompiledTextArea.getScriptIndex());
AbcIndexing.ClassIndex ci = abc.getSwf().getAbcIndex().findClass(new TypeItem(scriptName.toString()), abc, decompiledTextArea.getScriptIndex());
if (ci == null) {
AbcIndexing.TraitIndex ti = abc.getSwf().getAbcIndex().findScriptProperty(DottedChain.parseNoSuffix(scriptName));
AbcIndexing.TraitIndex ti = abc.getSwf().getAbcIndex().findScriptProperty(DottedChain.parseNoSuffix(scriptName.toString()));
if (ti == null) {
return;
}
@@ -1008,18 +1011,20 @@ public class ABCPanel extends JPanel implements ItemListener, SearchListener<Scr
swfRef.setVal(ci.abc.getSwf());
}
if (swfRef.getVal() == abc.getSwf()) {
hilightScript(getOpenable(), scriptName);
String scriptNamePrintable = DottedChain.parseWithSuffix(scriptName.toString()).toPrintableString(true);
if (swfRef.getVal() == abc.getSwf()) {
hilightScript(getOpenable(), scriptNamePrintable);
return;
}
hilightScript(swfRef.getVal(), scriptName);
hilightScript(swfRef.getVal(), scriptNamePrintable);
}
@Override
public void handleTraitLink(String className, String traitName) {
public void handleTraitLink(Path className, String traitName) {
Reference<Boolean> foundStatic = new Reference<>(null);
AbcIndexing.TraitIndex ti = abc.getSwf().getAbcIndex().findProperty(new AbcIndexing.PropertyDef(traitName, new TypeItem(className), abc, -1),
AbcIndexing.TraitIndex ti = abc.getSwf().getAbcIndex().findProperty(new AbcIndexing.PropertyDef(traitName, new TypeItem(className.toString()), abc, -1),
true,
true,
true,
@@ -1051,9 +1056,9 @@ public class ABCPanel extends JPanel implements ItemListener, SearchListener<Scr
}
@Override
public String getTraitType(String className, String traitName) {
public Path getTraitType(Path className, String traitName) {
Reference<Boolean> foundStatic = new Reference<>(null);
AbcIndexing.TraitIndex ti = abc.getSwf().getAbcIndex().findProperty(new AbcIndexing.PropertyDef(traitName, new TypeItem(className), abc, -1),
AbcIndexing.TraitIndex ti = abc.getSwf().getAbcIndex().findProperty(new AbcIndexing.PropertyDef(traitName, new TypeItem(className.toString()), abc, -1),
true,
true,
true,
@@ -1063,15 +1068,19 @@ public class ABCPanel extends JPanel implements ItemListener, SearchListener<Scr
}
if (ti.returnType instanceof ApplyTypeAVM2Item) {
ApplyTypeAVM2Item at = (ApplyTypeAVM2Item) ti.returnType;
return at.object.toString();
return typeToPath(at.object);
}
return ti.returnType.toString();
return typeToPath(ti.returnType);
}
private Path typeToPath(GraphTargetItem type) {
return new Path(Arrays.asList(type.toString().split("\\.")));
}
@Override
public String getTraitSubType(String className, String traitName, int level) {
public Path getTraitSubType(Path className, String traitName, int level) {
Reference<Boolean> foundStatic = new Reference<>(null);
AbcIndexing.TraitIndex ti = abc.getSwf().getAbcIndex().findProperty(new AbcIndexing.PropertyDef(traitName, new TypeItem(className), abc, -1),
AbcIndexing.TraitIndex ti = abc.getSwf().getAbcIndex().findProperty(new AbcIndexing.PropertyDef(traitName, new TypeItem(className.toString()), abc, -1),
true,
true,
true,
@@ -1087,13 +1096,13 @@ public class ABCPanel extends JPanel implements ItemListener, SearchListener<Scr
it = ((ApplyTypeAVM2Item) it).params.get(0);
}
return it.toString();
return typeToPath(it);
}
@Override
public String getTraitCallType(String className, String traitName) {
public Path getTraitCallType(Path className, String traitName) {
Reference<Boolean> foundStatic = new Reference<>(null);
AbcIndexing.TraitIndex ti = abc.getSwf().getAbcIndex().findProperty(new AbcIndexing.PropertyDef(traitName, new TypeItem(className), abc, -1),
AbcIndexing.TraitIndex ti = abc.getSwf().getAbcIndex().findProperty(new AbcIndexing.PropertyDef(traitName, new TypeItem(className.toString()), abc, -1),
true,
true,
true,
@@ -1103,15 +1112,15 @@ public class ABCPanel extends JPanel implements ItemListener, SearchListener<Scr
}
if (ti.callReturnType instanceof ApplyTypeAVM2Item) {
ApplyTypeAVM2Item at = (ApplyTypeAVM2Item) ti.callReturnType;
return at.object.toString();
return typeToPath(at.object);
}
return ti.callReturnType.toString();
return typeToPath(ti.callReturnType);
}
@Override
public String getTraitCallSubType(String className, String traitName, int level) {
public Path getTraitCallSubType(Path className, String traitName, int level) {
Reference<Boolean> foundStatic = new Reference<>(null);
AbcIndexing.TraitIndex ti = abc.getSwf().getAbcIndex().findProperty(new AbcIndexing.PropertyDef(traitName, new TypeItem(className), abc, -1),
AbcIndexing.TraitIndex ti = abc.getSwf().getAbcIndex().findProperty(new AbcIndexing.PropertyDef(traitName, new TypeItem(className.toString()), abc, -1),
true,
true,
true,
@@ -1127,7 +1136,7 @@ public class ABCPanel extends JPanel implements ItemListener, SearchListener<Scr
it = ((ApplyTypeAVM2Item) it).params.get(0);
}
return it.toString();
return typeToPath(it);
}
});
@@ -20,6 +20,7 @@ import com.jpexs.decompiler.flash.configuration.Configuration;
import com.jpexs.decompiler.flash.gui.AppStrings;
import com.jpexs.decompiler.flash.simpleparser.LinkHandler;
import com.jpexs.decompiler.flash.simpleparser.LinkType;
import com.jpexs.decompiler.flash.simpleparser.Path;
import com.jpexs.decompiler.flash.simpleparser.SimpleParser;
import com.jpexs.helpers.Reference;
import java.awt.Color;
@@ -73,40 +74,40 @@ public class LineMarkedEditorPane extends UndoFixedEditorPane implements LinkHan
private SimpleParser parser;
@Override
public LinkType getClassLinkType(String className) {
public LinkType getClassLinkType(Path className) {
return LinkType.NO_LINK;
}
@Override
public boolean traitExists(String className, String traitName) {
public boolean traitExists(Path className, String traitName) {
return false;
}
@Override
public void handleClassLink(String className) {
public void handleClassLink(Path className) {
}
@Override
public void handleTraitLink(String className, String traitName) {
public void handleTraitLink(Path className, String traitName) {
}
@Override
public String getTraitType(String className, String traitName) {
return "*";
public Path getTraitType(Path className, String traitName) {
return new Path("*");
}
@Override
public String getTraitSubType(String className, String traitName, int level) {
public Path getTraitSubType(Path className, String traitName, int level) {
return null;
}
@Override
public String getTraitCallType(String className, String traitName) {
public Path getTraitCallType(Path className, String traitName) {
return null;
}
@Override
public String getTraitCallSubType(String className, String traitName, int level) {
public Path getTraitCallSubType(Path className, String traitName, int level) {
return null;
}
@@ -21,6 +21,7 @@ import com.jpexs.decompiler.flash.gui.Main;
import com.jpexs.decompiler.flash.gui.View;
import com.jpexs.decompiler.flash.gui.ViewMessages;
import com.jpexs.decompiler.flash.simpleparser.LinkType;
import com.jpexs.decompiler.flash.simpleparser.Path;
import com.jpexs.decompiler.flash.simpleparser.SimpleParseException;
import com.jpexs.decompiler.flash.simpleparser.SimpleParser;
import java.awt.BorderLayout;
@@ -106,12 +107,12 @@ public class VariableMarker implements SyntaxComponent, CaretListener, PropertyC
private Map<Integer, List<Integer>> definitionPosToReferences = new LinkedHashMap<>();
private Map<Integer, Integer> referenceToDefinition = new LinkedHashMap<>();
private List<String> externalTypes = new ArrayList<>();
private List<Path> externalTypes = new ArrayList<>();
private Map<Integer, Integer> referenceToExternalTypeIndex = new LinkedHashMap<>();
private Map<Integer, List<Integer>> externalTypeIndexToReference = new LinkedHashMap<>();
private Map<String, String> simpleExternalClassNameToFullClassName = new LinkedHashMap<>();
private Map<Integer, String> referenceToExternalTraitKey = new LinkedHashMap<>();
private Map<String, List<Integer>> externalTraitKeyToReference = new LinkedHashMap<>();
private Map<Path, Path> simpleExternalClassNameToFullClassName = new LinkedHashMap<>();
private Map<Integer, Path> referenceToExternalTraitKey = new LinkedHashMap<>();
private Map<Path, List<Integer>> externalTraitKeyToReference = new LinkedHashMap<>();
private MouseMotionAdapter mouseMotionAdapter;
@@ -289,7 +290,7 @@ public class VariableMarker implements SyntaxComponent, CaretListener, PropertyC
return;
} else {
if (referenceToExternalTraitKey.containsKey(tok.start)) {
String traitKey = referenceToExternalTraitKey.get(tok.start);
Path traitKey = referenceToExternalTraitKey.get(tok.start);
for (int i : externalTraitKeyToReference.get(traitKey)) {
Token referenceToken = getIdentifierTokenAt(sDoc, i);
if (referenceToken != null) {
@@ -669,11 +670,11 @@ public class VariableMarker implements SyntaxComponent, CaretListener, PropertyC
Map<Integer, List<Integer>> newDefinitionPosToReferences = new LinkedHashMap<>();
Map<Integer, Integer> newReferenceToDefinition = new LinkedHashMap<>();
List<SimpleParseException> newErrors = new ArrayList<>();
List<String> newExternalTypes = new ArrayList<>();
List<Path> newExternalTypes = new ArrayList<>();
Map<Integer, Integer> newReferenceToExternalTypeIndex = new LinkedHashMap<>();
Map<Integer, List<Integer>> newExternalTypeIndexToReference = new LinkedHashMap<>();
Map<Integer, String> newReferenceToExternalTraitKey = new LinkedHashMap<>();
Map<String, List<Integer>> newExternalTraitKeyToReference = new LinkedHashMap<>();
Map<Integer, Path> newReferenceToExternalTraitKey = new LinkedHashMap<>();
Map<Path, List<Integer>> newExternalTraitKeyToReference = new LinkedHashMap<>();
parser.parse(
fullText,
newDefinitionPosToReferences,
@@ -686,11 +687,10 @@ public class VariableMarker implements SyntaxComponent, CaretListener, PropertyC
newReferenceToExternalTraitKey, newExternalTraitKeyToReference
);
Map<String, String> newSimpleExternalClassNameToFullClassName = new LinkedHashMap<>();
Map<Path, Path> newSimpleExternalClassNameToFullClassName = new LinkedHashMap<>();
for (int i = 0; i < newExternalTypes.size(); i++) {
String type = newExternalTypes.get(i);
String simpleName = type.contains(".") ? type.substring(type.lastIndexOf(".") + 1) : type;
newSimpleExternalClassNameToFullClassName.put(simpleName, type);
Path type = newExternalTypes.get(i);
newSimpleExternalClassNameToFullClassName.put(type.getLast(), type);
}
definitionPosToReferences = newDefinitionPosToReferences;
referenceToDefinition = newReferenceToDefinition;
@@ -757,13 +757,13 @@ public class VariableMarker implements SyntaxComponent, CaretListener, PropertyC
return LinkType.NO_LINK;
}
if (referenceToExternalTypeIndex.containsKey(token.start)) {
String externalType = externalTypes.get(referenceToExternalTypeIndex.get(token.start));
Path externalType = externalTypes.get(referenceToExternalTypeIndex.get(token.start));
return ((LineMarkedEditorPane) pane).getLinkHandler().getClassLinkType(externalType);
}
if (referenceToExternalTraitKey.containsKey(token.start)) {
String traitKey = referenceToExternalTraitKey.get(token.start);
Path traitKey = referenceToExternalTraitKey.get(token.start);
//String traitName = traitKey.substring(traitKey.lastIndexOf("/") + 1);
String className = traitKey.substring(0, traitKey.lastIndexOf("/"));
Path className = traitKey.getParent();
if (simpleExternalClassNameToFullClassName.containsKey(className)) {
className = simpleExternalClassNameToFullClassName.get(className);
}
@@ -808,7 +808,7 @@ public class VariableMarker implements SyntaxComponent, CaretListener, PropertyC
if (referenceToExternalTypeIndex.containsKey(token.start)
&& com.jpexs.decompiler.flash.configuration.Configuration.warningLinkTypes.get()) {
String externalType = externalTypes.get(referenceToExternalTypeIndex.get(token.start));
Path externalType = externalTypes.get(referenceToExternalTypeIndex.get(token.start));
LinkType lt = ((LineMarkedEditorPane) pane).getLinkHandler().getClassLinkType(externalType);
@@ -888,14 +888,14 @@ public class VariableMarker implements SyntaxComponent, CaretListener, PropertyC
if (referenceToExternalTypeIndex.containsKey(token.start)) {
goingOut = true;
pane.setCursor(Cursor.getDefaultCursor());
String externalType = externalTypes.get(referenceToExternalTypeIndex.get(token.start));
Path externalType = externalTypes.get(referenceToExternalTypeIndex.get(token.start));
((LineMarkedEditorPane) pane).getLinkHandler().handleClassLink(externalType);
return;
}
if (referenceToExternalTraitKey.containsKey(token.start)) {
String traitKey = referenceToExternalTraitKey.get(token.start);
String traitName = traitKey.substring(traitKey.lastIndexOf("/") + 1);
String className = traitKey.substring(0, traitKey.lastIndexOf("/"));
Path traitKey = referenceToExternalTraitKey.get(token.start);
String traitName = traitKey.getLast().toString();
Path className = traitKey.getParent();
if (simpleExternalClassNameToFullClassName.containsKey(className)) {
className = simpleExternalClassNameToFullClassName.get(className);