/*
* Copyright (C) 2010-2016 JPEXS, All rights reserved.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 3.0 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library.
*/
package com.jpexs.decompiler.flash.abc.types;
import com.jpexs.decompiler.flash.abc.ABC;
import com.jpexs.decompiler.flash.abc.avm2.AVM2ConstantPool;
import com.jpexs.decompiler.flash.abc.types.traits.Traits;
import com.jpexs.decompiler.flash.helpers.GraphTextWriter;
import com.jpexs.decompiler.flash.helpers.hilight.HighlightSpecialType;
import com.jpexs.decompiler.flash.types.annotations.Internal;
import com.jpexs.decompiler.graph.DottedChain;
import com.jpexs.helpers.Helper;
import java.util.List;
/**
*
* @author JPEXS
*/
public class InstanceInfo {
public int name_index;
public int super_index;
public int flags; // 1 = sealed, 0 = dynamic, 2 = final, 4 = interface, 8 = ProtectedNs, 16 = non nullable
public int protectedNS; //if flags & 8
public int[] interfaces;
public int iinit_index; // MethodInfo - constructor
public Traits instance_traits;
public static final int CLASS_SEALED = 1; //not dynamic
public static final int CLASS_FINAL = 2;
public static final int CLASS_INTERFACE = 4;
public static final int CLASS_PROTECTEDNS = 8;
public static final int CLASS_NON_NULLABLE = 16; //This is somehow used in Flex, propably through annotations or something with Vector datatype (?)
@Internal
public boolean deleted;
public InstanceInfo() {
instance_traits = new Traits();
}
public InstanceInfo(Traits traits) {
instance_traits = traits;
}
@Override
public String toString() {
return "name_index=" + name_index + " super_index=" + super_index + " flags=" + flags + " protectedNS=" + protectedNS + " interfaces=" + Helper.intArrToString(interfaces) + " method_index=" + iinit_index + "\r\n" + instance_traits.toString();
}
public String toString(ABC abc, List<DottedChain> fullyQualifiedNames) {
String supIndexStr = "[nothing]";
if (super_index > 0) {
supIndexStr = abc.constants.getMultiname(super_index).toString(abc.constants, fullyQualifiedNames);
}
return "name_index=" + abc.constants.getMultiname(name_index).toString(abc.constants, fullyQualifiedNames) + " super_index=" + supIndexStr + " flags=" + flags + " protectedNS=" + protectedNS + " interfaces=" + Helper.intArrToString(interfaces) + " method_index=" + iinit_index + "\r\n" + instance_traits.toString(abc, fullyQualifiedNames);
}
public GraphTextWriter getClassHeaderStr(GraphTextWriter writer, ABC abc, List<DottedChain> fullyQualifiedNames, boolean allowPrivate) {
String modifiers;
Namespace ns = abc.constants.getMultiname(name_index).getNamespace(abc.constants);
modifiers = ns.getPrefix(abc);
if (!allowPrivate && modifiers.equals("private")) {
modifiers = "";
}
if (!modifiers.isEmpty()) {
modifiers += " ";
}
if (isFinal()) {
modifiers += "final ";
}
if (!isInterface() && isDynamic()) {
modifiers += "dynamic ";
}
String objType = "class ";
if (isInterface()) {
objType = "interface ";
}
writer.appendNoHilight(modifiers + objType);
writer.hilightSpecial(abc.constants.getMultiname(name_index).getName(abc.constants, null/* No full names here*/, false, true), HighlightSpecialType.CLASS_NAME);
if (super_index > 0) {
String typeName = abc.constants.getMultiname(super_index).getNameWithNamespace(abc.constants, true).toRawString();
String parentName = abc.constants.getMultiname(super_index).getName(abc.constants, fullyQualifiedNames, false, true);
if (!parentName.equals("Object")) {
writer.appendNoHilight(" extends ");
writer.hilightSpecial(parentName, HighlightSpecialType.TYPE_NAME, typeName);
}
}
if (interfaces.length > 0) {
if (isInterface()) {
writer.appendNoHilight(" extends ");
} else {
writer.appendNoHilight(" implements ");
}
for (int i = 0; i < interfaces.length; i++) {
if (i > 0) {
writer.append(", ");
}
String typeName = abc.constants.getMultiname(interfaces[i]).getNameWithNamespace(abc.constants, true).toRawString();
writer.hilightSpecial(abc.constants.getMultiname(interfaces[i]).getName(abc.constants, fullyQualifiedNames, false, true), HighlightSpecialType.TYPE_NAME, typeName);
}
}
return writer;
}
public Multiname getName(AVM2ConstantPool constants) {
return constants.getMultiname(name_index);
}
public boolean isInterface() {
return ((flags & CLASS_INTERFACE) == CLASS_INTERFACE);
}
public boolean isDynamic() {
return (flags & CLASS_SEALED) == 0;
}
public boolean isFinal() {
return (flags & CLASS_FINAL) == CLASS_FINAL;
}
public boolean isNullable() {
return (flags & CLASS_NON_NULLABLE) != CLASS_NON_NULLABLE;
}
}