Fixed #1892 AS3 - Package internal custom namespaces

This commit is contained in:
Jindra Petřík
2022-11-26 21:12:19 +01:00
parent e415945490
commit f24b132ae2
14 changed files with 53 additions and 12 deletions

View File

@@ -2128,10 +2128,13 @@ public class ABC implements Openable {
return null;
}
Namespace ns = constants.getNamespace(link_ns_index);
if (ns.kind != Namespace.KIND_NAMESPACE) {
if (ns.kind != Namespace.KIND_NAMESPACE && ns.kind != Namespace.KIND_PACKAGE_INTERNAL) {
return null;
}
String name = constants.getString(ns.name_index);
if (name.equals("http://adobe.com/AS3/2006/builtin")) {
return null;
}
for (ABCContainerTag abcTag : getAbcTags()) {
DottedChain dc = abcTag.getABC().nsValueToName(name);
nsname = dc.getLast();

View File

@@ -135,7 +135,7 @@ public class FullMultinameAVM2Item extends AVM2Item {
AVM2ConstantPool constants = localData.constantsAvm2;
List<DottedChain> fullyQualifiedNames = property ? new ArrayList<>() : localData.fullyQualifiedNames;
if (multinameIndex > 0 && multinameIndex < constants.getMultinameCount()) {
writer.append(constants.getMultiname(multinameIndex).getName(constants, fullyQualifiedNames, false, true));
writer.append(constants.getMultiname(multinameIndex).getNameWithCustomNamespace(localData.abc, fullyQualifiedNames, false, true));
} else {
writer.append("§§multiname(").append(multinameIndex).append(")");
}

View File

@@ -363,7 +363,8 @@ public class Multiname {
} else {
String name = abc.constants.getString(name_index);
if (namespace_index > 0 && getNamespace(abc.constants).kind == Namespace.KIND_NAMESPACE) {
int nskind = namespace_index <= 0 ? -1 : getNamespace(abc.constants).kind;
if (nskind == Namespace.KIND_NAMESPACE || nskind == Namespace.KIND_PACKAGE_INTERNAL) {
DottedChain dc = abc.findCustomNs(namespace_index);
String nsname = dc != null ? dc.getLast() : null;

View File

@@ -190,6 +190,21 @@ public abstract class Trait implements Cloneable, Serializable {
return false;
}
public void writeUses(int scriptIndex, int classIndex, boolean isStatic, ABC abc, GraphTextWriter writer) throws InterruptedException {
List<Dependency> dependencies = new ArrayList<>();
List<String> uses = new ArrayList<>();
String customNs = null;
Namespace ns = getName(abc).getNamespace(abc.constants);
if (ns.kind == Namespace.KIND_NAMESPACE) {
customNs = ns.getName(abc.constants).toRawString();
}
getDependencies(scriptIndex, classIndex, isStatic, customNs, abc, dependencies, uses, null, new ArrayList<>());
for (String us : uses) {
writer.appendNoHilight("use namespace " + us + ";").newLine();
}
}
public void writeImportsUsages(int scriptIndex, int classIndex, boolean isStatic, ABC abc, GraphTextWriter writer, DottedChain ignorePackage, List<DottedChain> fullyQualifiedNames) throws InterruptedException {
List<String> namesInThisPackage = new ArrayList<>();
@@ -275,12 +290,12 @@ public abstract class Trait implements Cloneable, Serializable {
if (hasImport) {
writer.newLine();
}
for (String us : uses) {
/*for (String us : uses) {
writer.appendNoHilight("use namespace " + us + ";").newLine();
}
if (uses.size() > 0) {
writer.newLine();
}
}*/
}
public final GraphTextWriter getMetaData(Trait parent, ConvertData convertData, ABC abc, GraphTextWriter writer) {

View File

@@ -90,6 +90,7 @@ public class TraitFunction extends Trait implements TraitWithSlot {
writer.startBlock();
int bodyIndex = abc.findBodyIndex(method_info);
if (bodyIndex != -1) {
//writeUses(scriptIndex, classIndex, isStatic, abc, writer);
abc.bodies.get(bodyIndex).toString(abcIndex,path + "." + abc.constants.getMultiname(name_index).getName(abc.constants, fullyQualifiedNames, false, true), exportMode, abc, this, writer, fullyQualifiedNames, new HashSet<>());
}
writer.endBlock();

View File

@@ -145,6 +145,7 @@ public class TraitMethodGetterSetter extends Trait {
convertTraitHeader(abc, writer);
}
if (bodyIndex != -1) {
//writeUses(scriptIndex, classIndex, isStatic, abc, writer);
abc.bodies.get(bodyIndex).toString(abcIndex, path, exportMode, abc, this, writer, fullyQualifiedNames, new HashSet<>());
}
} else {

View File

@@ -189,7 +189,7 @@ public class DependencyParser {
private static boolean parseUsagesFromNS(String ignoredCustom, ABC abc, List<Dependency> dependencies, List<String> uses, int namespace_index, DottedChain ignorePackage, String name) {
Namespace ns = abc.constants.getNamespace(namespace_index);
if (ns.kind == Namespace.KIND_NAMESPACE) {
if (ns.kind == Namespace.KIND_NAMESPACE || ns.kind == Namespace.KIND_PACKAGE_INTERNAL) {
String nsVal = ns.getName(abc.constants).toRawString();
for (ABCContainerTag abcTag : abc.getAbcTags()) {
DottedChain nsimport = abcTag.getABC().nsValueToName(nsVal);
@@ -199,7 +199,7 @@ public class DependencyParser {
if (!nsimport.isEmpty()) {
Dependency depNs = new Dependency(nsimport, DependencyType.NAMESPACE);
if (!nsimport.getWithoutLast().equals(ignorePackage) && !dependencies.contains(depNs)) {
if ((ignorePackage == null || !nsimport.getWithoutLast().equals(ignorePackage)) && !dependencies.contains(depNs)) {
dependencies.add(depNs);
}
if (ignoredCustom != null && nsVal.equals(ignoredCustom)) {