From 09b0c3acfbc38bcb51cd216b6e659da85be72e78 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jindra=20Pet=C5=99=C3=ADk?= Date: Mon, 23 Sep 2024 14:27:47 +0200 Subject: [PATCH] Fixed: #2316 AS3 direct editation - private classes Refactored imports. --- CHANGELOG.md | 2 + .../decompiler/flash/abc/ScriptPack.java | 6 +- .../avm2/model/TraitSlotConstAVM2Item.java | 3 +- .../parser/script/AVM2SourceGenerator.java | 23 ++++--- .../parser/script/ActionScript3Parser.java | 2 +- .../decompiler/flash/abc/types/Multiname.java | 15 +++- .../flash/abc/types/traits/Trait.java | 69 +++++++++++-------- .../flash/abc/types/traits/TraitClass.java | 35 +++------- .../flash/abc/types/traits/TraitFunction.java | 46 ++----------- .../types/traits/TraitMethodGetterSetter.java | 44 ++---------- .../abc/types/traits/TraitSlotConst.java | 21 +----- .../flash/abc/types/traits/Traits.java | 47 +------------ .../multinames/ConstVarMultinameUsage.java | 7 +- .../multinames/MethodMultinameUsage.java | 7 +- .../importers/FFDecAs3ScriptReplacer.java | 1 + .../flash/gui/abc/TraitsListItem.java | 5 +- 16 files changed, 108 insertions(+), 225 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4bff8167d..2d6d64821 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -31,6 +31,7 @@ All notable changes to this project will be documented in this file. - [#2313] AS3 direct editation - parsing class traits metadata - [#2314] AS3 direct editation - cannot save class initializer in some cases - [#2315] AS3 direct editation - switching scripts during editation causing missing scripts +- [#2316] AS3 direct editation - private classes ## [21.0.5] - 2024-09-05 ### Fixed @@ -3586,6 +3587,7 @@ Major version of SWF to XML export changed to 2. [#2313]: https://www.free-decompiler.com/flash/issues/2313 [#2314]: https://www.free-decompiler.com/flash/issues/2314 [#2315]: https://www.free-decompiler.com/flash/issues/2315 +[#2316]: https://www.free-decompiler.com/flash/issues/2316 [#2293]: https://www.free-decompiler.com/flash/issues/2293 [#2294]: https://www.free-decompiler.com/flash/issues/2294 [#2299]: https://www.free-decompiler.com/flash/issues/2299 diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/ScriptPack.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/ScriptPack.java index 5ab742f3d..ebf748ba5 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/ScriptPack.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/ScriptPack.java @@ -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(); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/TraitSlotConstAVM2Item.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/TraitSlotConstAVM2Item.java index 1d442c103..0fd06fd5a 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/TraitSlotConstAVM2Item.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/TraitSlotConstAVM2Item.java @@ -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), diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/parser/script/AVM2SourceGenerator.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/parser/script/AVM2SourceGenerator.java index 5b896cb3b..49b40e01a 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/parser/script/AVM2SourceGenerator.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/parser/script/AVM2SourceGenerator.java @@ -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 indices, List names, List namespaces) { + public static void parentNamesAddNames(AbcIndexing abc, int scriptIndex, int name_index, List indices, List names, List namespaces) { List cindices = new ArrayList<>(); List 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 indices, List names, List namespaces, List 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 indices, List names, List namespaces, List 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); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/parser/script/ActionScript3Parser.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/parser/script/ActionScript3Parser.java index ca4131480..2789dc976 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/parser/script/ActionScript3Parser.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/parser/script/ActionScript3Parser.java @@ -1186,7 +1186,7 @@ public class ActionScript3Parser { List names = new ArrayList<>(); List 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()) { diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/types/Multiname.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/types/Multiname.java index 05f7eecc6..080396eb6 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/types/Multiname.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/types/Multiname.java @@ -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); } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/types/traits/Trait.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/types/traits/Trait.java index bd3e5d82e..9f076cd7f 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/types/traits/Trait.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/types/traits/Trait.java @@ -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 traitNamesInThisScriptSet = new LinkedHashSet<>(traitNamesInThisScript); + traitNamesInThisScript = new ArrayList<>(traitNamesInThisScriptSet); + //imports List dependencies = new ArrayList<>(); String customNs = null; @@ -416,24 +420,21 @@ public abstract class Trait implements Cloneable, Serializable { } } - List importnames = new ArrayList<>(); - importnames.addAll(namesInThisPackage); - importnames.addAll(traitNamesInThisScript); - importnames.addAll(Arrays.asList(builtInClasses)); - + + List 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 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 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 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 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 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 fullyQualifiedNames, boolean parallel, boolean insideInterface) throws InterruptedException { + toString(null, packageName, parent, convertData, path, abc, isStatic, exportMode, scriptIndex, classIndex, writer, fullyQualifiedNames, parallel, insideInterface); return writer; } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/types/traits/TraitClass.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/types/traits/TraitClass.java index 5cc80fbbf..e03773dde 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/types/traits/TraitClass.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/types/traits/TraitClass.java @@ -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 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 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 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 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 first = new Reference<>(true); - + if (getName(abc).getNamespace(abc.constants).kind != Namespace.KIND_PACKAGE_INTERNAL) { List 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(); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/types/traits/TraitFunction.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/types/traits/TraitFunction.java index e743d4558..4fcdf9b20 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/types/traits/TraitFunction.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/types/traits/TraitFunction.java @@ -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 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 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 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 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 fullyQualifiedNames, boolean parallel, boolean insideInterface) throws InterruptedException { List 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); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/types/traits/TraitMethodGetterSetter.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/types/traits/TraitMethodGetterSetter.java index d4e2fe1d9..ef630e7b7 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/types/traits/TraitMethodGetterSetter.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/types/traits/TraitMethodGetterSetter.java @@ -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 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 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 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 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(";"); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/types/traits/TraitSlotConst.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/types/traits/TraitSlotConst.java index d7d282a2b..719fb2de6 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/types/traits/TraitSlotConst.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/types/traits/TraitSlotConst.java @@ -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 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 fullyQualifiedNames, boolean parallel, boolean insideInterface) throws InterruptedException { getMetaData(this, convertData, abc, writer); Multiname n = getName(abc); boolean showModifier = true; diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/types/traits/Traits.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/types/traits/Traits.java index d78db837d..d25f80f1a 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/types/traits/Traits.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/types/traits/Traits.java @@ -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 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 fullyQualifiedNames, boolean parallel, List ignoredTraitNames, boolean insideInterface) throws InterruptedException { - - /*List 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 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 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 fullyQualifiedNames, boolean parallel, List ignoredTraitNames, boolean insideInterface) throws InterruptedException { List 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(); } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/usages/multinames/ConstVarMultinameUsage.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/usages/multinames/ConstVarMultinameUsage.java index a0073f63a..10ff35c50 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/usages/multinames/ConstVarMultinameUsage.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/usages/multinames/ConstVarMultinameUsage.java @@ -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 } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/usages/multinames/MethodMultinameUsage.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/usages/multinames/MethodMultinameUsage.java index 27334a05e..3dd98b9ff 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/usages/multinames/MethodMultinameUsage.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/usages/multinames/MethodMultinameUsage.java @@ -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(); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/importers/FFDecAs3ScriptReplacer.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/importers/FFDecAs3ScriptReplacer.java index 885053cc7..600778256 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/importers/FFDecAs3ScriptReplacer.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/importers/FFDecAs3ScriptReplacer.java @@ -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) { diff --git a/src/com/jpexs/decompiler/flash/gui/abc/TraitsListItem.java b/src/com/jpexs/decompiler/flash/gui/abc/TraitsListItem.java index ab40ed395..f0e4e38c9 100644 --- a/src/com/jpexs/decompiler/flash/gui/abc/TraitsListItem.java +++ b/src/com/jpexs/decompiler/flash/gui/abc/TraitsListItem.java @@ -25,6 +25,7 @@ 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.flash.search.ABCSearchResult; +import com.jpexs.decompiler.graph.DottedChain; import java.util.ArrayList; import java.util.List; import java.util.logging.Level; @@ -110,7 +111,7 @@ public class TraitsListItem { if (classIndex > -1) { insideInterface = abc.instance_info.get(classIndex).isInterface(); } - trait.toStringHeader(null, convertData, "", abc, true, ScriptExportMode.AS, scriptIndex, classIndex, writer, new ArrayList<>(), false, insideInterface); + trait.toStringHeader(null, DottedChain.EMPTY /*??*/, convertData, "", abc, true, ScriptExportMode.AS, scriptIndex, classIndex, writer, new ArrayList<>(), false, insideInterface); writer.finishHilights(); s = writer.toString(); } else { @@ -126,7 +127,7 @@ public class TraitsListItem { if (classIndex > -1) { insideInterface = abc.instance_info.get(classIndex).isInterface(); } - trait.toStringHeader(null, convertData, "", abc, false, ScriptExportMode.AS, scriptIndex, classIndex, writer, new ArrayList<>(), false, insideInterface); + trait.toStringHeader(null, DottedChain.EMPTY /*??*/, convertData, "", abc, false, ScriptExportMode.AS, scriptIndex, classIndex, writer, new ArrayList<>(), false, insideInterface); writer.finishHilights(); s = writer.toString(); }