AS3: class trait imports refactor

This commit is contained in:
Jindra Petk
2012-12-30 14:16:58 +01:00
parent e1f02f1e66
commit 691935f5d3

View File

@@ -48,7 +48,7 @@ public class TraitClass extends Trait {
return "Class " + abc.constants.constant_multiname[name_index].toString(abc.constants) + " slot=" + slot_id + " class_info=" + class_info + " metadata=" + Helper.intArrToString(metadata);
}
private void parseImportFromNS(List<DoABCTag> abcTags, ABC abc, List imports, List<String> uses, int namespace_index, String ignorePackage, String name) {
private void parseImportsUsagesFromNS(List<DoABCTag> abcTags, ABC abc, List imports, List<String> uses, int namespace_index, String ignorePackage, String name) {
Namespace ns = abc.constants.constant_namespace[namespace_index];
if (name.equals("")) {
name = "*";
@@ -107,65 +107,65 @@ public class TraitClass extends Trait {
}
}
private void parseImportFromMultiname(List<DoABCTag> abcTags, ABC abc, List<String> imports, List<String> uses, Multiname m, String ignorePackage) {
private void parseImportsUsagesFromMultiname(List<DoABCTag> abcTags, ABC abc, List<String> imports, List<String> uses, Multiname m, String ignorePackage) {
if (m != null) {
Namespace ns = m.getNamespace(abc.constants);
String name = m.getName(abc.constants);
NamespaceSet nss = m.getNamespaceSet(abc.constants);
if (ns != null) {
parseImportFromNS(abcTags, abc, imports,uses, m.namespace_index, ignorePackage, name);
parseImportsUsagesFromNS(abcTags, abc, imports,uses, m.namespace_index, ignorePackage, name);
}
if (nss != null) {
for (int ni : nss.namespaces) {
parseImportFromNS(abcTags, abc, imports,uses, ni, ignorePackage, name);
parseImportsUsagesFromNS(abcTags, abc, imports,uses, ni, ignorePackage, name);
}
}
}
}
private void parseImportsFromMethodInfo(List<DoABCTag> abcTags, ABC abc, int method_index, List<String> imports, List<String> uses, String ignorePackage) {
private void parseImportsUsagesFromMethodInfo(List<DoABCTag> abcTags, ABC abc, int method_index, List<String> imports, List<String> uses, String ignorePackage) {
if (abc.method_info[method_index].ret_type != 0) {
parseImportFromMultiname(abcTags, abc, imports,uses, abc.constants.constant_multiname[abc.method_info[method_index].ret_type], ignorePackage);
parseImportsUsagesFromMultiname(abcTags, abc, imports,uses, abc.constants.constant_multiname[abc.method_info[method_index].ret_type], ignorePackage);
}
for (int t : abc.method_info[method_index].param_types) {
if (t != 0) {
parseImportFromMultiname(abcTags, abc, imports,uses, abc.constants.constant_multiname[t], ignorePackage);
parseImportsUsagesFromMultiname(abcTags, abc, imports,uses, abc.constants.constant_multiname[t], ignorePackage);
}
}
MethodBody body = abc.findBody(method_index);
if (body != null) {
for (ABCException ex : body.exceptions) {
parseImportFromMultiname(abcTags, abc, imports,uses, abc.constants.constant_multiname[ex.type_index], ignorePackage);
parseImportsUsagesFromMultiname(abcTags, abc, imports,uses, abc.constants.constant_multiname[ex.type_index], ignorePackage);
}
for (AVM2Instruction ins : body.code.code) {
if (ins.definition instanceof NewFunctionIns) {
parseImportsFromMethodInfo(abcTags, abc, ins.operands[0], imports,uses, ignorePackage);
parseImportsUsagesFromMethodInfo(abcTags, abc, ins.operands[0], imports,uses, ignorePackage);
}
for (int k = 0; k < ins.definition.operands.length; k++) {
if (ins.definition.operands[k] == AVM2Code.DAT_MULTINAME_INDEX) {
int multinameIndex = ins.operands[k];
parseImportFromMultiname(abcTags, abc, imports,uses, abc.constants.constant_multiname[multinameIndex], ignorePackage);
parseImportsUsagesFromMultiname(abcTags, abc, imports,uses, abc.constants.constant_multiname[multinameIndex], ignorePackage);
}
}
}
}
}
private void parseImportsFromTrait(List<DoABCTag> abcTags, ABC abc, Trait t, List<String> imports, List<String> uses, String ignorePackage) {
private void parseImportsUsagesFromTrait(List<DoABCTag> abcTags, ABC abc, Trait t, List<String> imports, List<String> uses, String ignorePackage) {
if (t instanceof TraitMethodGetterSetter) {
TraitMethodGetterSetter tm = (TraitMethodGetterSetter) t;
if (tm.method_info != 0) {
parseImportsFromMethodInfo(abcTags, abc, tm.method_info, imports,uses, ignorePackage);
parseImportsUsagesFromMethodInfo(abcTags, abc, tm.method_info, imports,uses, ignorePackage);
}
}
parseImportFromMultiname(abcTags, abc, imports,uses, t.getName(abc), ignorePackage);
parseImportsUsagesFromMultiname(abcTags, abc, imports,uses, t.getName(abc), ignorePackage);
if (t instanceof TraitSlotConst) {
TraitSlotConst ts = (TraitSlotConst) t;
parseImportFromMultiname(abcTags, abc, imports,uses, abc.constants.constant_multiname[ts.type_index], ignorePackage);
parseImportsUsagesFromMultiname(abcTags, abc, imports,uses, abc.constants.constant_multiname[ts.type_index], ignorePackage);
}
}
private List getImports(List<DoABCTag> abcTags, ABC abc,List<String> imports,List<String> uses) {
private List getImportsUsages(List<DoABCTag> abcTags, ABC abc,List<String> imports,List<String> uses) {
//constructor
//parseImportFromMultiname(imports, constants.constant_multiname[instance_info[instanceIndex].name_index]);
@@ -173,27 +173,27 @@ public class TraitClass extends Trait {
String packageName = abc.instance_info[class_info].getName(abc.constants).getNamespace(abc.constants).getName(abc.constants);
if (abc.instance_info[class_info].super_index > 0) {
parseImportFromMultiname(abcTags, abc, imports,uses, abc.constants.constant_multiname[abc.instance_info[class_info].super_index], packageName);
parseImportsUsagesFromMultiname(abcTags, abc, imports,uses, abc.constants.constant_multiname[abc.instance_info[class_info].super_index], packageName);
}
for (int i : abc.instance_info[class_info].interfaces) {
parseImportFromMultiname(abcTags, abc, imports,uses, abc.constants.constant_multiname[i], packageName);
parseImportsUsagesFromMultiname(abcTags, abc, imports,uses, abc.constants.constant_multiname[i], packageName);
}
//static
for (Trait t : abc.class_info[class_info].static_traits.traits) {
parseImportsFromTrait(abcTags, abc, t, imports, uses, packageName);
parseImportsUsagesFromTrait(abcTags, abc, t, imports, uses, packageName);
}
//static initializer
parseImportsFromMethodInfo(abcTags, abc, abc.class_info[class_info].cinit_index, imports, uses, packageName);
parseImportsUsagesFromMethodInfo(abcTags, abc, abc.class_info[class_info].cinit_index, imports, uses, packageName);
//instance
for (Trait t : abc.instance_info[class_info].instance_traits.traits) {
parseImportsFromTrait(abcTags, abc, t, imports, uses, packageName);
parseImportsUsagesFromTrait(abcTags, abc, t, imports, uses, packageName);
}
//instance initializer
parseImportsFromMethodInfo(abcTags, abc, abc.instance_info[class_info].iinit_index, imports, uses, packageName);
parseImportsUsagesFromMethodInfo(abcTags, abc, abc.instance_info[class_info].iinit_index, imports, uses, packageName);
return imports;
}
@@ -208,7 +208,7 @@ public class TraitClass extends Trait {
//imports
List<String> imports = new ArrayList<String>();
List<String> uses = new ArrayList<String>();
getImports(abcTags, abc,imports,uses);
getImportsUsages(abcTags, abc,imports,uses);
for (String imp : imports) {
out.println(ABC.IDENT_STRING + "import " + imp + ";");
}