Fixed: #2316 AS3 direct editation - private classes

Refactored imports.
This commit is contained in:
Jindra Petřík
2024-09-23 14:27:47 +02:00
parent ba596c3698
commit 09b0c3acfb
16 changed files with 108 additions and 225 deletions

View File

@@ -320,6 +320,8 @@ public class ScriptPack extends AS3ClassTreeItem {
writer.newLine();
}
DottedChain pkg = getPathPackage();
for (int t : traitIndices) {
Trait trait = traits.get(t);
@@ -337,7 +339,7 @@ public class ScriptPack extends AS3ClassTreeItem {
if ((nskind == Namespace.KIND_PACKAGE) || (nskind == Namespace.KIND_PACKAGE_INTERNAL)) {
trait.toStringPackaged(abcIndex, null, convertData, "", abc, false, exportMode, scriptIndex, -1, writer, new ArrayList<>(), parallel, false);
} else {
trait.toString(abcIndex, null, convertData, "", abc, false, exportMode, scriptIndex, -1, writer, new ArrayList<>(), parallel, false);
trait.toString(abcIndex, pkg, null, convertData, "", abc, false, exportMode, scriptIndex, -1, writer, new ArrayList<>(), parallel, false);
}
if (!(trait instanceof TraitClass)) {
writer.endTrait();
@@ -387,7 +389,7 @@ public class ScriptPack extends AS3ClassTreeItem {
if ((nskind == Namespace.KIND_PACKAGE) || (nskind == Namespace.KIND_PACKAGE_INTERNAL)) {
trait.toStringPackaged(abcIndex, null, convertData, "", abc, false, exportMode, scriptIndex, -1, writer, new ArrayList<>(), parallel, false);
} else {
trait.toString(abcIndex, null, convertData, "", abc, false, exportMode, scriptIndex, -1, writer, new ArrayList<>(), parallel, false);
trait.toString(abcIndex, pkg, null, convertData, "", abc, false, exportMode, scriptIndex, -1, writer, new ArrayList<>(), parallel, false);
}
if (!(trait instanceof TraitClass)) {
writer.endTrait();

View File

@@ -21,6 +21,7 @@ import com.jpexs.decompiler.flash.abc.types.ConvertData;
import com.jpexs.decompiler.flash.abc.types.traits.TraitSlotConst;
import com.jpexs.decompiler.flash.abc.types.traits.TraitType;
import com.jpexs.decompiler.flash.helpers.GraphTextWriter;
import com.jpexs.decompiler.graph.DottedChain;
import com.jpexs.decompiler.graph.GraphSourceItem;
import com.jpexs.decompiler.graph.GraphTargetItem;
import com.jpexs.decompiler.graph.model.LocalData;
@@ -93,7 +94,7 @@ public class TraitSlotConstAVM2Item extends AVM2Item {
boolean insideInterface = classIndex > -1 ? localData.abc.instance_info.get(classIndex).isInterface() : false;
trait.toString(
localData.abcIndex,
DottedChain.EMPTY /*??*/,
null,
cd,
"trait " + trait.getName(localData.abc),

View File

@@ -218,9 +218,10 @@ public class AVM2SourceGenerator implements SourceGenerator {
}
}
}*/
ABC abc = abcIndex.getSelectedAbc();
AVM2ConstantPool constants = abc.constants;
AbcIndexing.ClassIndex ci = abcIndex.findClass(new TypeItem(dname), null, null/*FIXME?*/);
AbcIndexing.ClassIndex ci = abcIndex.findClass(new TypeItem(dname), abc, localData != null ? localData.scriptIndex : null);
if (ci != null) {
Multiname m = ci.abc.instance_info.get(ci.index).getName(ci.abc.constants);
if (m != null) {
@@ -234,16 +235,16 @@ public class AVM2SourceGenerator implements SourceGenerator {
}
}
String pkgRaw = pkg.toRawString();
/*String pkgRaw = pkg.toRawString();
for (int i = 1; i < constants.getMultinameCount(); i++) {
Multiname mname = constants.getMultiname(i);
if (mname != null && name.equals(mname.getName(constants, null, true, true /*FIXME!!*/))) {
if (mname != null && name.equals(mname.getName(constants, null, true, true FIXME!!))) {
if (mname.getNamespace(constants) != null && Objects.equals(pkgRaw, mname.getNamespace(constants).getRawName(constants))) {
name_index = i;
break;
}
}
}
}*/
if (name_index == 0) {
if (pkg.isEmpty() && localData.currentScript != null /*FIXME!*/) {
for (Trait t : localData.currentScript.traits.traits) {
@@ -688,7 +689,7 @@ public class AVM2SourceGenerator implements SourceGenerator {
parent = ((UnresolvedAVM2Item) parent).resolved;
}
if (parent instanceof TypeItem) {
ClassIndex ci = abcIndex.findClass(parent, null, null/*FIXME?*/);
ClassIndex ci = abcIndex.findClass(parent, abcIndex.getSelectedAbc(), localData != null ? localData.scriptIndex : null);
if (ci != null) {
int mi = ci.abc.class_info.get(ci.index).cinit_index;
MethodBody pcinit = ci.abc.findBody(mi);
@@ -1464,7 +1465,7 @@ public class AVM2SourceGenerator implements SourceGenerator {
*/
int parentConstMinAC = 0;
AbcIndexing.ClassIndex ci = abcIndex.findClass(new TypeItem(superType), null, null/*FIXME?*/);
AbcIndexing.ClassIndex ci = abcIndex.findClass(new TypeItem(superType), abcIndex.getSelectedAbc(), localData.scriptIndex);
if (ci != null) {
MethodInfo pmi = ci.abc.method_info.get(ci.abc.instance_info.get(ci.index).iinit_index);
@@ -2217,7 +2218,7 @@ public class AVM2SourceGenerator implements SourceGenerator {
sinitcode.add(ins(AVM2Instructions.PushNull));
} else {
AbcIndexing.ClassIndex ci = abcIndex.findClass(AbcIndexing.multinameToType(abc.instance_info.get(tc.class_info).name_index, constants), null, null/*FIXME?*/);
AbcIndexing.ClassIndex ci = abcIndex.findClass(AbcIndexing.multinameToType(abc.instance_info.get(tc.class_info).name_index, constants), abc, scriptIndex);
while (ci != null && ci.parent != null) {
ci = ci.parent;
Multiname origM = ci.abc.constants.getMultiname(ci.abc.instance_info.get(ci.index).name_index);
@@ -2274,11 +2275,11 @@ public class AVM2SourceGenerator implements SourceGenerator {
* @param names Names
* @param namespaces Namespaces
*/
public static void parentNamesAddNames(AbcIndexing abc, int name_index, List<Integer> indices, List<String> names, List<String> namespaces) {
public static void parentNamesAddNames(AbcIndexing abc, int scriptIndex, int name_index, List<Integer> indices, List<String> names, List<String> namespaces) {
List<Integer> cindices = new ArrayList<>();
List<ABC> outABCs = new ArrayList<>();
parentNames(abc, name_index, cindices, names, namespaces, outABCs);
parentNames(abc, scriptIndex, name_index, cindices, names, namespaces, outABCs);
for (int i = 0; i < cindices.size(); i++) {
ABC a = outABCs.get(i);
int m = cindices.get(i);
@@ -2411,8 +2412,8 @@ public class AVM2SourceGenerator implements SourceGenerator {
* @param namespaces Namespaces
* @param outABCs Out ABCs
*/
public static void parentNames(AbcIndexing abc, int name_index, List<Integer> indices, List<String> names, List<String> namespaces, List<ABC> outABCs) {
AbcIndexing.ClassIndex ci = abc.findClass(new TypeItem(abc.getSelectedAbc().constants.getMultiname(name_index).getNameWithNamespace(abc.getSelectedAbc().constants, true /*FIXME!!*/)), null, null/*FIXME?*/);
public static void parentNames(AbcIndexing abc, int scriptIndex, int name_index, List<Integer> indices, List<String> names, List<String> namespaces, List<ABC> outABCs) {
AbcIndexing.ClassIndex ci = abc.findClass(new TypeItem(abc.getSelectedAbc().constants.getMultiname(name_index).getNameWithNamespace(abc.getSelectedAbc().constants, true /*FIXME!!*/)), abc.getSelectedAbc(), scriptIndex);
while (ci != null) {
int ni = ci.abc.instance_info.get(ci.index).name_index;
indices.add(ni);

View File

@@ -1186,7 +1186,7 @@ public class ActionScript3Parser {
List<String> names = new ArrayList<>();
List<String> namespaces = new ArrayList<>();
//FIXME for Private classes in script (?)
AVM2SourceGenerator.parentNamesAddNames(abcIndex, AVM2SourceGenerator.resolveType(new SourceGeneratorLocalData(new HashMap<>(), 0, false, 0), ((TypeItem) ((UnresolvedAVM2Item) extendsTypeStr)
AVM2SourceGenerator.parentNamesAddNames(abcIndex, scriptIndex, AVM2SourceGenerator.resolveType(new SourceGeneratorLocalData(new HashMap<>(), 0, false, 0), ((TypeItem) ((UnresolvedAVM2Item) extendsTypeStr)
.resolve(null, pkgName.addWithSuffix(subNameStr).toRawString(), null, new ArrayList<>(), new ArrayList<>(), abcIndex, new ArrayList<>(), new ArrayList<>())), abcIndex), indices, names, namespaces);
for (int i = 0; i < names.size(); i++) {
if (namespaces.get(i) == null || namespaces.get(i).isEmpty()) {

View File

@@ -715,7 +715,20 @@ public class Multiname {
return isAttribute() ? "@*" : "*";
} else {
String name = constants.getString(name_index);
if (fullyQualifiedNames != null && !fullyQualifiedNames.isEmpty() && fullyQualifiedNames.contains(DottedChain.parseWithSuffix(name))) {
Namespace ns = getNamespace(constants);
boolean isPublic = false;
if (ns == null) {
NamespaceSet nss = getNamespaceSet(constants);
if (nss != null) {
if (nss.namespaces.length > 0) {
ns = constants.getNamespace(nss.namespaces[0]);
}
}
}
if (ns != null && (ns.kind == Namespace.KIND_PACKAGE || ns.kind == Namespace.KIND_PACKAGE_INTERNAL)) {
isPublic = true;
}
if (isPublic && fullyQualifiedNames != null && !fullyQualifiedNames.isEmpty() && fullyQualifiedNames.contains(DottedChain.parseWithSuffix(name))) {
DottedChain dc = getNameWithNamespace(constants, withSuffix);
return dontDeobfuscate ? dc.toRawString() : dc.toPrintableString(true);
}

View File

@@ -52,6 +52,7 @@ import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.LinkedHashMap;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
@@ -390,7 +391,10 @@ public abstract class Trait implements Cloneable, Serializable {
traitNamesInThisScript.add(st.getName(abc).getName(abc.constants, new ArrayList<>(), true, true));
}
}
Set<String> traitNamesInThisScriptSet = new LinkedHashSet<>(traitNamesInThisScript);
traitNamesInThisScript = new ArrayList<>(traitNamesInThisScriptSet);
//imports
List<Dependency> dependencies = new ArrayList<>();
String customNs = null;
@@ -416,24 +420,21 @@ public abstract class Trait implements Cloneable, Serializable {
}
}
List<String> importnames = new ArrayList<>();
importnames.addAll(namesInThisPackage);
importnames.addAll(traitNamesInThisScript);
importnames.addAll(Arrays.asList(builtInClasses));
List<String> importedNames = new ArrayList<>();
importedNames.addAll(Arrays.asList(builtInClasses));
importedNames.addAll(namesInThisPackage);
importedNames.addAll(traitNamesInThisScript);
for (DottedChain imp : imports) {
if (imp.getLast().equals("*")) {
if (imp.getWithoutLast().equals(ignorePackage)) {
continue;
}
Set<String> objectsInPkg = abcIndex.getPackageObjects(imp.getWithoutLast());
for (String objectName : objectsInPkg) {
if (importnames.contains(objectName)) {
fullyQualifiedNames.add(DottedChain.parseWithSuffix(objectName));
} else {
importnames.add(objectName);
}
}
importedNames.addAll(abcIndex.getPackageObjects(imp.getWithoutLast()));
}
}
@@ -450,24 +451,30 @@ public abstract class Trait implements Cloneable, Serializable {
i--;
}
}
for (int i = 0; i < imports.size(); i++) {
DottedChain ipath = imports.get(i);
DottedChain pkg = ipath.getWithoutLast();
if (pkg.equals(ignorePackage)) {
imports.remove(i);
i--;
}
}
for (int i = 0; i < imports.size(); i++) {
DottedChain ipath = imports.get(i);
String name = ipath.getLast();
if (ipath.getWithoutLast().equals(ignorePackage)) { //do not check classes from same package, they are imported automatically
if (traitNamesInThisScript.contains(name)) {
fullyQualifiedNames.add(DottedChain.parseWithSuffix(name));
}
imports.remove(i);
i--;
continue;
}
if (importnames.contains(name)) {
importedNames.add(name);
}
List<String> uniqueImportedNames = new ArrayList<>();
for (int i = 0; i < importedNames.size(); i++) {
String name = importedNames.get(i);
if (uniqueImportedNames.contains(name)) {
fullyQualifiedNames.add(DottedChain.parseWithSuffix(name));
} else {
importnames.add(name);
uniqueImportedNames.add(name);
}
}
@@ -707,6 +714,7 @@ public abstract class Trait implements Cloneable, Serializable {
* To string.
*
* @param abcIndex ABC indexing
* @param packageName Package name
* @param parent Parent trait
* @param convertData Convert data
* @param path Path
@@ -722,7 +730,7 @@ public abstract class Trait implements Cloneable, Serializable {
* @return Writer
* @throws InterruptedException On interrupt
*/
public GraphTextWriter toString(AbcIndexing abcIndex, Trait parent, ConvertData convertData, String path, ABC abc, boolean isStatic, ScriptExportMode exportMode, int scriptIndex, int classIndex, GraphTextWriter writer, List<DottedChain> fullyQualifiedNames, boolean parallel, boolean insideInterface) throws InterruptedException {
public GraphTextWriter toString(AbcIndexing abcIndex, DottedChain packageName, Trait parent, ConvertData convertData, String path, ABC abc, boolean isStatic, ScriptExportMode exportMode, int scriptIndex, int classIndex, GraphTextWriter writer, List<DottedChain> fullyQualifiedNames, boolean parallel, boolean insideInterface) throws InterruptedException {
writer.appendNoHilight(abc.constants.getMultiname(name_index).toString(abc.constants, fullyQualifiedNames) + " kind=" + kindType + " metadata=" + Helper.intArrToString(metadata));
return writer;
}
@@ -868,7 +876,7 @@ public abstract class Trait implements Cloneable, Serializable {
writer.appendNoHilight(" " + nsname); //assume not null name
}
writer.startBlock();
toString(abcIndex, parent, convertData, path, abc, isStatic, exportMode, scriptIndex, classIndex, writer, fullyQualifiedNames, parallel, insideInterface);
toString(abcIndex, name.getNameWithNamespace(abc.constants, true).getWithoutLast(), parent, convertData, path, abc, isStatic, exportMode, scriptIndex, classIndex, writer, fullyQualifiedNames, parallel, insideInterface);
writer.endBlock();
writer.newLine();
}
@@ -906,6 +914,7 @@ public abstract class Trait implements Cloneable, Serializable {
* ToString of header.
*
* @param parent Parent trait
* @param packageName Package name
* @param convertData Convert data
* @param path Path
* @param abc ABC
@@ -920,8 +929,8 @@ public abstract class Trait implements Cloneable, Serializable {
* @return Writer
* @throws InterruptedException On interrupt
*/
public GraphTextWriter toStringHeader(Trait parent, ConvertData convertData, String path, ABC abc, boolean isStatic, ScriptExportMode exportMode, int scriptIndex, int classIndex, GraphTextWriter writer, List<DottedChain> fullyQualifiedNames, boolean parallel, boolean insideInterface) throws InterruptedException {
toString(null, parent, convertData, path, abc, isStatic, exportMode, scriptIndex, classIndex, writer, fullyQualifiedNames, parallel, insideInterface);
public GraphTextWriter toStringHeader(Trait parent, DottedChain packageName, ConvertData convertData, String path, ABC abc, boolean isStatic, ScriptExportMode exportMode, int scriptIndex, int classIndex, GraphTextWriter writer, List<DottedChain> fullyQualifiedNames, boolean parallel, boolean insideInterface) throws InterruptedException {
toString(null, packageName, parent, convertData, path, abc, isStatic, exportMode, scriptIndex, classIndex, writer, fullyQualifiedNames, parallel, insideInterface);
return writer;
}

View File

@@ -145,26 +145,9 @@ public class TraitClass extends Trait implements TraitWithSlot {
//instance initializer
DependencyParser.parseDependenciesFromMethodInfo(abcIndex, null, scriptIndex, class_info, false, customNamespace, abc, instanceInfo.iinit_index, dependencies, packageName, fullyQualifiedNames, new ArrayList<>(), uses, numberContextRef);
}
/**
* ToString of header.
*
* @param parent Parent trait
* @param convertData Convert data
* @param path Path
* @param abc ABC
* @param isStatic Is static
* @param exportMode Export mode
* @param scriptIndex Script index
* @param classIndex Class index
* @param writer Writer
* @param fullyQualifiedNames Fully qualified names
* @param parallel Parallel
* @param insideInterface Inside interface
* @return Writer
*/
@Override
public GraphTextWriter toStringHeader(Trait parent, ConvertData convertData, String path, ABC abc, boolean isStatic, ScriptExportMode exportMode, int scriptIndex, int classIndex, GraphTextWriter writer, List<DottedChain> fullyQualifiedNames, boolean parallel, boolean insideInterface) {
public GraphTextWriter toStringHeader(Trait parent, DottedChain packageName, ConvertData convertData, String path, ABC abc, boolean isStatic, ScriptExportMode exportMode, int scriptIndex, int classIndex, GraphTextWriter writer, List<DottedChain> fullyQualifiedNames, boolean parallel, boolean insideInterface) {
abc.instance_info.get(class_info).getClassHeaderStr(convertData.assetsDir, writer, abc, fullyQualifiedNames, false, false /*??*/);
return writer;
}
@@ -220,19 +203,19 @@ public class TraitClass extends Trait implements TraitWithSlot {
* @throws InterruptedException On interrupt
*/
@Override
public GraphTextWriter toString(AbcIndexing abcIndex, Trait parent, ConvertData convertData, String path, ABC abc, boolean isStatic, ScriptExportMode exportMode, int scriptIndex, int classIndex, GraphTextWriter writer, List<DottedChain> fullyQualifiedNames, boolean parallel, boolean insideInterface) throws InterruptedException {
public GraphTextWriter toString(AbcIndexing abcIndex, DottedChain packageName, Trait parent, ConvertData convertData, String path, ABC abc, boolean isStatic, ScriptExportMode exportMode, int scriptIndex, int classIndex, GraphTextWriter writer, List<DottedChain> fullyQualifiedNames, boolean parallel, boolean insideInterface) throws InterruptedException {
InstanceInfo instanceInfo = abc.instance_info.get(class_info);
boolean isInterface = instanceInfo.isInterface();
Multiname instanceInfoMultiname = instanceInfo.getName(abc.constants);
DottedChain packageName = instanceInfoMultiname.getNamespace(abc.constants).getName(abc.constants); //assume not null name
//DottedChain packageName = instanceInfoMultiname.getNamespace(abc.constants).getName(abc.constants); //assume not null name
fullyQualifiedNames = new ArrayList<>();
Reference<Boolean> first = new Reference<>(true);
if (getName(abc).getNamespace(abc.constants).kind != Namespace.KIND_PACKAGE_INTERNAL) {
List<Trait> traits = new ArrayList<>();
traits.add(this);
@@ -284,7 +267,7 @@ public class TraitClass extends Trait implements TraitWithSlot {
//static variables & constants
ClassInfo classInfo = abc.class_info.get(class_info);
classInfo.static_traits.toString(first, abcIndex, new Class[]{TraitSlotConst.class}, this, convertData, path + "/" + instanceInfoName, abc, true, exportMode, false, scriptIndex, class_info, writer, fullyQualifiedNames, parallel, new ArrayList<>(), isInterface);
classInfo.static_traits.toString(packageName, first, abcIndex, new Class[]{TraitSlotConst.class}, this, convertData, path + "/" + instanceInfoName, abc, true, exportMode, false, scriptIndex, class_info, writer, fullyQualifiedNames, parallel, new ArrayList<>(), isInterface);
//static initializer
int bodyIndex = abc.findBodyIndex(classInfo.cinit_index);
@@ -319,7 +302,7 @@ public class TraitClass extends Trait implements TraitWithSlot {
}
//instance variables
instanceInfo.instance_traits.toString(first, abcIndex, new Class[]{TraitSlotConst.class}, this, convertData, path + "/" + instanceInfoName, abc, false, exportMode, false, scriptIndex, class_info, writer, fullyQualifiedNames, parallel, new ArrayList<>(), isInterface);
instanceInfo.instance_traits.toString(packageName, first, abcIndex, new Class[]{TraitSlotConst.class}, this, convertData, path + "/" + instanceInfoName, abc, false, exportMode, false, scriptIndex, class_info, writer, fullyQualifiedNames, parallel, new ArrayList<>(), isInterface);
//instance initializer - constructor
if (!instanceInfo.isInterface()) {
@@ -354,10 +337,10 @@ public class TraitClass extends Trait implements TraitWithSlot {
}
//static methods
classInfo.static_traits.toString(first, abcIndex, new Class[]{TraitClass.class, TraitFunction.class, TraitMethodGetterSetter.class}, this, convertData, path + "/" + instanceInfoName, abc, true, exportMode, false, scriptIndex, class_info, writer, fullyQualifiedNames, parallel, new ArrayList<>(), isInterface);
classInfo.static_traits.toString(packageName, first, abcIndex, new Class[]{TraitClass.class, TraitFunction.class, TraitMethodGetterSetter.class}, this, convertData, path + "/" + instanceInfoName, abc, true, exportMode, false, scriptIndex, class_info, writer, fullyQualifiedNames, parallel, new ArrayList<>(), isInterface);
//instance methods
instanceInfo.instance_traits.toString(first, abcIndex, new Class[]{TraitClass.class, TraitFunction.class, TraitMethodGetterSetter.class}, this, convertData, path + "/" + instanceInfoName, abc, false, exportMode, false, scriptIndex, class_info, writer, fullyQualifiedNames, parallel, convertData.ignoreFrameScripts ? frameTraitNames : new ArrayList<>(), isInterface);
instanceInfo.instance_traits.toString(packageName, first, abcIndex, new Class[]{TraitClass.class, TraitFunction.class, TraitMethodGetterSetter.class}, this, convertData, path + "/" + instanceInfoName, abc, false, exportMode, false, scriptIndex, class_info, writer, fullyQualifiedNames, parallel, convertData.ignoreFrameScripts ? frameTraitNames : new ArrayList<>(), isInterface);
if (first.getVal()) {
writer.newLine();

View File

@@ -75,26 +75,9 @@ public class TraitFunction extends Trait implements TraitWithSlot {
public int getSlotIndex() {
return slot_id;
}
/**
* ToString of header.
*
* @param parent Parent trait
* @param convertData Convert data
* @param path Path
* @param abc ABC
* @param isStatic Is static
* @param exportMode Export mode
* @param scriptIndex Script index
* @param classIndex Class index
* @param writer Writer
* @param fullyQualifiedNames Fully qualified names
* @param parallel Parallel
* @param insideInterface Inside interface
* @return Writer
*/
@Override
public GraphTextWriter toStringHeader(Trait parent, ConvertData convertData, String path, ABC abc, boolean isStatic, ScriptExportMode exportMode, int scriptIndex, int classIndex, GraphTextWriter writer, List<DottedChain> fullyQualifiedNames, boolean parallel, boolean insideInterface) {
public GraphTextWriter toStringHeader(Trait parent, DottedChain packageName, ConvertData convertData, String path, ABC abc, boolean isStatic, ScriptExportMode exportMode, int scriptIndex, int classIndex, GraphTextWriter writer, List<DottedChain> fullyQualifiedNames, boolean parallel, boolean insideInterface) {
MethodBody body = abc.findBody(method_info);
if (body == null) {
writer.appendNoHilight("native ");
@@ -139,34 +122,15 @@ public class TraitFunction extends Trait implements TraitWithSlot {
public String toString(ABC abc, List<DottedChain> fullyQualifiedNames) {
return "Function " + abc.constants.getMultiname(name_index).toString(abc.constants, fullyQualifiedNames) + " slot=" + slot_id + " method_info=" + method_info + " metadata=" + Helper.intArrToString(metadata);
}
/**
* To string.
*
* @param abcIndex ABC indexing
* @param parent Parent trait
* @param convertData Convert data
* @param path Path
* @param abc ABC
* @param isStatic Is static
* @param exportMode Export mode
* @param scriptIndex Script index
* @param classIndex Class index
* @param writer Writer
* @param fullyQualifiedNames Fully qualified names
* @param parallel Parallel
* @param insideInterface Inside interface
* @return Writer
* @throws InterruptedException On interrupt
*/
@Override
public GraphTextWriter toString(AbcIndexing abcIndex, Trait parent, ConvertData convertData, String path, ABC abc, boolean isStatic, ScriptExportMode exportMode, int scriptIndex, int classIndex, GraphTextWriter writer, List<DottedChain> fullyQualifiedNames, boolean parallel, boolean insideInterface) throws InterruptedException {
public GraphTextWriter toString(AbcIndexing abcIndex, DottedChain packageName, Trait parent, ConvertData convertData, String path, ABC abc, boolean isStatic, ScriptExportMode exportMode, int scriptIndex, int classIndex, GraphTextWriter writer, List<DottedChain> fullyQualifiedNames, boolean parallel, boolean insideInterface) throws InterruptedException {
List<Trait> traits = new ArrayList<>();
traits.add(this);
writeImports(traits, -1, abcIndex, scriptIndex, classIndex, false, abc, writer, getPackage(abc), fullyQualifiedNames);
getMetaData(this, convertData, abc, writer);
writer.startMethod(method_info, getName(abc).getName(abc.constants, new ArrayList<>(), true, false));
toStringHeader(parent, convertData, path, abc, isStatic, exportMode, scriptIndex, classIndex, writer, fullyQualifiedNames, parallel, insideInterface);
toStringHeader(parent, packageName, convertData, path, abc, isStatic, exportMode, scriptIndex, classIndex, writer, fullyQualifiedNames, parallel, insideInterface);
writer.startBlock();
int bodyIndex = abc.findBodyIndex(method_info);

View File

@@ -120,26 +120,9 @@ public class TraitMethodGetterSetter extends Trait {
}
DependencyParser.parseDependenciesFromMethodInfo(abcIndex, this, scriptIndex, classIndex, isStatic, customNamespace, abc, method_info, dependencies, ignorePackage, fullyQualifiedNames, new ArrayList<>(), uses, numberContextRef);
}
/**
* ToString of header.
*
* @param parent Parent trait
* @param convertData Convert data
* @param path Path
* @param abc ABC
* @param isStatic Is static
* @param exportMode Export mode
* @param scriptIndex Script index
* @param classIndex Class index
* @param writer Writer
* @param fullyQualifiedNames Fully qualified names
* @param parallel Parallel
* @param insideInterface Inside interface
* @return Writer
*/
@Override
public GraphTextWriter toStringHeader(Trait parent, ConvertData convertData, String path, ABC abc, boolean isStatic, ScriptExportMode exportMode, int scriptIndex, int classIndex, GraphTextWriter writer, List<DottedChain> fullyQualifiedNames, boolean parallel, boolean insideInterface) {
public GraphTextWriter toStringHeader(Trait parent, DottedChain packageName, ConvertData convertData, String path, ABC abc, boolean isStatic, ScriptExportMode exportMode, int scriptIndex, int classIndex, GraphTextWriter writer, List<DottedChain> fullyQualifiedNames, boolean parallel, boolean insideInterface) {
String addKind = "";
if (kindType == TRAIT_GETTER) {
addKind = "get ";
@@ -217,27 +200,8 @@ public class TraitMethodGetterSetter extends Trait {
return "0x" + Helper.formatAddress(fileOffset) + " " + Helper.byteArrToString(bytes) + " MethodGetterSetter " + abc.constants.getMultiname(name_index).toString(abc.constants, fullyQualifiedNames) + " disp_id=" + disp_id + " method_info=" + method_info + " metadata=" + Helper.intArrToString(metadata);
}
/**
* To string.
*
* @param abcIndex ABC indexing
* @param parent Parent trait
* @param convertData Convert data
* @param path Path
* @param abc ABC
* @param isStatic Is static
* @param exportMode Export mode
* @param scriptIndex Script index
* @param classIndex Class index
* @param writer Writer
* @param fullyQualifiedNames Fully qualified names
* @param parallel Parallel
* @param insideInterface Inside interface
* @return Writer
* @throws InterruptedException On interrupt
*/
@Override
public GraphTextWriter toString(AbcIndexing abcIndex, Trait parent, ConvertData convertData, String path, ABC abc, boolean isStatic, ScriptExportMode exportMode, int scriptIndex, int classIndex, GraphTextWriter writer, List<DottedChain> fullyQualifiedNames, boolean parallel, boolean insideInterface) throws InterruptedException {
public GraphTextWriter toString(AbcIndexing abcIndex, DottedChain packageName, Trait parent, ConvertData convertData, String path, ABC abc, boolean isStatic, ScriptExportMode exportMode, int scriptIndex, int classIndex, GraphTextWriter writer, List<DottedChain> fullyQualifiedNames, boolean parallel, boolean insideInterface) throws InterruptedException {
if (classIndex < 0) {
//writeImports(this, -1, abcIndex, scriptIndex, classIndex, isStatic, abc, writer, getPackage(abc), fullyQualifiedNames);
@@ -245,7 +209,7 @@ public class TraitMethodGetterSetter extends Trait {
getMetaData(this, convertData, abc, writer);
writer.startMethod(method_info, getName(abc).getName(abc.constants, new ArrayList<>(), true, false));
path = path + "." + getName(abc).getName(abc.constants, fullyQualifiedNames, false, true);
toStringHeader(parent, convertData, path, abc, isStatic, exportMode, scriptIndex, classIndex, writer, fullyQualifiedNames, parallel, insideInterface);
toStringHeader(parent, packageName, convertData, path, abc, isStatic, exportMode, scriptIndex, classIndex, writer, fullyQualifiedNames, parallel, insideInterface);
int bodyIndex = abc.findBodyIndex(method_info);
if (classIndex != -1 && abc.instance_info.get(classIndex).isInterface() || bodyIndex == -1) {
writer.appendNoHilight(";");

View File

@@ -230,27 +230,8 @@ public class TraitSlotConst extends Trait implements TraitWithSlot {
return "0x" + Helper.formatAddress(fileOffset) + " " + Helper.byteArrToString(bytes) + " SlotConst " + abc.constants.getMultiname(name_index).toString(abc.constants, fullyQualifiedNames) + " slot=" + slot_id + " type=" + typeStr + " value=" + (new ValueKind(value_index, value_kind)).toString(abc) + " metadata=" + Helper.intArrToString(metadata);
}
/**
* To string.
*
* @param abcIndex ABC indexing
* @param parent Parent trait
* @param convertData Convert data
* @param path Path
* @param abc ABC
* @param isStatic Is static
* @param exportMode Export mode
* @param scriptIndex Script index
* @param classIndex Class index
* @param writer Writer
* @param fullyQualifiedNames Fully qualified names
* @param parallel Parallel
* @param insideInterface Inside interface
* @return Writer
* @throws InterruptedException On interrupt
*/
@Override
public GraphTextWriter toString(AbcIndexing abcIndex, Trait parent, ConvertData convertData, String path, ABC abc, boolean isStatic, ScriptExportMode exportMode, int scriptIndex, int classIndex, GraphTextWriter writer, List<DottedChain> fullyQualifiedNames, boolean parallel, boolean insideInterface) throws InterruptedException {
public GraphTextWriter toString(AbcIndexing abcIndex, DottedChain packageName, Trait parent, ConvertData convertData, String path, ABC abc, boolean isStatic, ScriptExportMode exportMode, int scriptIndex, int classIndex, GraphTextWriter writer, List<DottedChain> fullyQualifiedNames, boolean parallel, boolean insideInterface) throws InterruptedException {
getMetaData(this, convertData, abc, writer);
Multiname n = getName(abc);
boolean showModifier = true;

View File

@@ -295,6 +295,7 @@ public class Traits implements Cloneable, Serializable {
/**
* To string.
*
* @param packageName Package name
* @param first Whether to add newline
* @param abcIndex ABC indexing
* @param traitTypes Trait types
@@ -315,49 +316,7 @@ public class Traits implements Cloneable, Serializable {
* @return Writer
* @throws InterruptedException On interrupt
*/
public GraphTextWriter toString(Reference<Boolean> first, AbcIndexing abcIndex, Class[] traitTypes, Trait parent, ConvertData convertData, String path, ABC abc, boolean isStatic, ScriptExportMode exportMode, boolean makePackages, int scriptIndex, int classIndex, GraphTextWriter writer, List<DottedChain> fullyQualifiedNames, boolean parallel, List<String> ignoredTraitNames, boolean insideInterface) throws InterruptedException {
/*List<Trait> ordered = new ArrayList<>(traits);
loopi:
for (int i = 0; i < ordered.size(); i++) {
for (int j = i + 1; j < ordered.size(); j++) {
if (i == j) {
continue;
}
Trait o1 = ordered.get(i);
Trait o2 = ordered.get(j);
Multiname m2 = abc.constants.getMultiname(o2.name_index);
if (!convertData.assignedValues.containsKey(o1)) {
continue;
}
GraphTargetItem v1 = convertData.assignedValues.get(o1).value;
Set<GraphTargetItem> subitems1 = v1.getAllSubItemsRecursively();
subitems1.add(v1);
for (GraphTargetItem si : subitems1) {
if (si instanceof GetPropertyAVM2Item) {
GetPropertyAVM2Item getProp = (GetPropertyAVM2Item) si;
Multiname sm1 = abc.constants.getMultiname(((FullMultinameAVM2Item) getProp.propertyName).multinameIndex);
if (getProp.object instanceof FindPropertyAVM2Item && sm1.equals(m2)) {
ordered.add(j + 1, o1);
ordered.remove(i);
i--;
continue loopi;
}
}
if (si instanceof GetLexAVM2Item) {
GetLexAVM2Item lex = (GetLexAVM2Item) si;
if (lex.propertyName.equals(m2)) {
ordered.add(j + 1, o1);
ordered.remove(i);
i--;
continue loopi;
}
}
}
}
}
*/
public GraphTextWriter toString(DottedChain packageName, Reference<Boolean> first, AbcIndexing abcIndex, Class[] traitTypes, Trait parent, ConvertData convertData, String path, ABC abc, boolean isStatic, ScriptExportMode exportMode, boolean makePackages, int scriptIndex, int classIndex, GraphTextWriter writer, List<DottedChain> fullyQualifiedNames, boolean parallel, List<String> ignoredTraitNames, boolean insideInterface) throws InterruptedException {
List<Trait> ordered = traits;
for (Trait trait : ordered) {
@@ -394,7 +353,7 @@ public class Traits implements Cloneable, Serializable {
if (makePackages) {
trait.toStringPackaged(abcIndex, parent, convertData, path, abc, isStatic, exportMode, scriptIndex, classIndex, writer, fullyQualifiedNames, parallel, insideInterface);
} else {
trait.toString(abcIndex, parent, convertData, path, abc, isStatic, exportMode, scriptIndex, classIndex, writer, fullyQualifiedNames, parallel, insideInterface);
trait.toString(abcIndex, packageName, parent, convertData, path, abc, isStatic, exportMode, scriptIndex, classIndex, writer, fullyQualifiedNames, parallel, insideInterface);
}
writer.endTrait();
}

View File

@@ -25,6 +25,7 @@ import com.jpexs.decompiler.flash.configuration.Configuration;
import com.jpexs.decompiler.flash.exporters.modes.ScriptExportMode;
import com.jpexs.decompiler.flash.helpers.HighlightedTextWriter;
import com.jpexs.decompiler.flash.helpers.NulWriter;
import com.jpexs.decompiler.graph.DottedChain;
import java.util.ArrayList;
/**
@@ -75,13 +76,13 @@ public abstract class ConstVarMultinameUsage extends TraitMultinameUsage {
if (parentTraitIndex > -1) {
if (traitsType == TRAITS_TYPE_CLASS) {
((TraitMethodGetterSetter) abc.class_info.get(classIndex).static_traits.traits.get(parentTraitIndex)).toStringHeader(null, convertData, "", abc, traitsType == TRAITS_TYPE_CLASS, ScriptExportMode.AS, -1/*FIXME*/, classIndex, writer, new ArrayList<>(), false, insideInterface);
((TraitMethodGetterSetter) abc.class_info.get(classIndex).static_traits.traits.get(parentTraitIndex)).toStringHeader(null, DottedChain.EMPTY /*??*/, convertData, "", abc, traitsType == TRAITS_TYPE_CLASS, ScriptExportMode.AS, -1/*FIXME*/, classIndex, writer, new ArrayList<>(), false, insideInterface);
} else if (traitsType == TRAITS_TYPE_INSTANCE) {
((TraitMethodGetterSetter) abc.instance_info.get(classIndex).instance_traits.traits.get(parentTraitIndex)).toStringHeader(null, convertData, "", abc, traitsType == TRAITS_TYPE_CLASS, ScriptExportMode.AS, -1/*FIXME*/, classIndex, writer, new ArrayList<>(), false, insideInterface);
((TraitMethodGetterSetter) abc.instance_info.get(classIndex).instance_traits.traits.get(parentTraitIndex)).toStringHeader(null, DottedChain.EMPTY /*??*/, convertData, "", abc, traitsType == TRAITS_TYPE_CLASS, ScriptExportMode.AS, -1/*FIXME*/, classIndex, writer, new ArrayList<>(), false, insideInterface);
}
}
try {
((TraitSlotConst) traits.traits.get(traitIndex)).toStringHeader(null, convertData, "", abc, traitsType == TRAITS_TYPE_CLASS, ScriptExportMode.AS, -1/*FIXME*/, classIndex, writer, new ArrayList<>(), false, insideInterface);
((TraitSlotConst) traits.traits.get(traitIndex)).toStringHeader(null, DottedChain.EMPTY /*??*/, convertData, "", abc, traitsType == TRAITS_TYPE_CLASS, ScriptExportMode.AS, -1/*FIXME*/, classIndex, writer, new ArrayList<>(), false, insideInterface);
} catch (InterruptedException ex) {
// ignore
}

View File

@@ -24,6 +24,7 @@ import com.jpexs.decompiler.flash.configuration.Configuration;
import com.jpexs.decompiler.flash.exporters.modes.ScriptExportMode;
import com.jpexs.decompiler.flash.helpers.HighlightedTextWriter;
import com.jpexs.decompiler.flash.helpers.NulWriter;
import com.jpexs.decompiler.graph.DottedChain;
import java.util.ArrayList;
/**
@@ -99,13 +100,13 @@ public abstract class MethodMultinameUsage extends TraitMultinameUsage {
}
if (parentTraitIndex > -1) {
if (traitsType == TRAITS_TYPE_CLASS) {
((TraitMethodGetterSetter) abc.class_info.get(classIndex).static_traits.traits.get(parentTraitIndex)).toStringHeader(null, convertData, "", abc, traitsType == TRAITS_TYPE_CLASS, ScriptExportMode.AS, -1/*FIXME*/, classIndex, writer, new ArrayList<>(), false, insideInterface);
((TraitMethodGetterSetter) abc.class_info.get(classIndex).static_traits.traits.get(parentTraitIndex)).toStringHeader(null, DottedChain.EMPTY /*??*/, convertData, "", abc, traitsType == TRAITS_TYPE_CLASS, ScriptExportMode.AS, -1/*FIXME*/, classIndex, writer, new ArrayList<>(), false, insideInterface);
} else {
((TraitMethodGetterSetter) abc.instance_info.get(classIndex).instance_traits.traits.get(parentTraitIndex)).toStringHeader(null, convertData, "", abc, traitsType == TRAITS_TYPE_CLASS, ScriptExportMode.AS, -1/*FIXME*/, classIndex, writer, new ArrayList<>(), false, insideInterface);
((TraitMethodGetterSetter) abc.instance_info.get(classIndex).instance_traits.traits.get(parentTraitIndex)).toStringHeader(null, DottedChain.EMPTY /*??*/,convertData, "", abc, traitsType == TRAITS_TYPE_CLASS, ScriptExportMode.AS, -1/*FIXME*/, classIndex, writer, new ArrayList<>(), false, insideInterface);
}
writer.appendNoHilight(" ");
}
((TraitMethodGetterSetter) traits.traits.get(traitIndex)).toStringHeader(null, convertData, "", abc, traitsType == TRAITS_TYPE_CLASS, ScriptExportMode.AS, -1/*FIXME*/, classIndex, writer, new ArrayList<>(), false, insideInterface);
((TraitMethodGetterSetter) traits.traits.get(traitIndex)).toStringHeader(null, DottedChain.EMPTY /*??*/, convertData, "", abc, traitsType == TRAITS_TYPE_CLASS, ScriptExportMode.AS, -1/*FIXME*/, classIndex, writer, new ArrayList<>(), false, insideInterface);
}
writer.finishHilights();
return writer.toString().trim();

View File

@@ -78,6 +78,7 @@ public class FFDecAs3ScriptReplacer implements As3ScriptReplacerInterface {
abc.script_info.get(oldIndex).delete(abc, true);
AbcIndexing abcIndex = swf.getAbcIndex();
abcIndex.selectAbc(abc);
abcIndex.refreshAbc(abc);
ActionScript3Parser.compile(text, abc, abcIndex, scriptName, newClassIndex, oldIndex, air, swf.getDocumentClass());
if (pack.isSimple) {