package eu.bibl.cfide.engine.compiler.parser.cfideimpl.tokens.member;
import java.util.ArrayList;
import java.util.List;
import eu.bibl.banalysis.filter.Filter;
import eu.bibl.cfide.engine.compiler.parser.ParserException;
import eu.bibl.cfide.engine.decompiler.ClassNodeDecompilationUnit;
import eu.bibl.cfide.engine.util.FilterCollection;
import eu.bibl.cfide.engine.util.StringArrayReader;
public class ClassMemberToken extends MemberToken {
protected String name;
protected String superName;
protected String[] interfaces;
public ClassMemberToken(int access, String name, String superName, String[] interfaces) {
super(access);
this.name = name;
this.superName = superName;
this.interfaces = interfaces;
}
public String getName() {
return name;
}
public String getSuperName() {
return superName;
}
public String[] getInterfaces() {
return interfaces;
}
@Override
public String toString() {
StringBuilder sb = new StringBuilder();
sb.append(ClassNodeDecompilationUnit.getAccessString(access));
sb.append(" ");
sb.append(name);
sb.append(" extends ");
sb.append(superName);
if (interfaces.length > 0) {
sb.append(" implements");
for (String i : interfaces) {
sb.append(" ");
sb.append(i);
}
}
return sb.toString();
}
public static final List<String> CLASS_HEADER_MEMBERS = new ArrayList<String>();
static {
CLASS_HEADER_MEMBERS.add("EXTENDS");
CLASS_HEADER_MEMBERS.add("IMPLEMENTS");
}
public static final Filter<String> EXTENDS_IMPLEMENTS_FILTER = new Filter<String>() {
@Override
public boolean accept(String s) {
s = s.toUpperCase().replace(",", "");
return s.equals("EXTENDS") || s.equals("IMPLEMENTS") || s.equals("{");
}
};
/**
* Creates a new ClassMemberToken by parsing the tokens via backwards processing.
* @param tokens Raw lexed text tokens.
* @param memberEndIndex Must be the index of the last '{' before called.
* @return A ClassMemberToken configured correctly.
*/
public static ClassMemberToken create(StringArrayReader reader) throws ParserException {
int access = 0;
List<String> interfaces = new ArrayList<String>();
String name = "";
String superName = "";
mainWhile: while (reader.canReadNext()) {
String sToken = reader.read(FilterCollection.NON_NULL_NON_NEWLINE_FILTER);
String uToken = sToken.toUpperCase();
if (ACCESS_VALUES.containsKey(uToken)) {
access |= ACCESS_VALUES.get(uToken);
} else if (CLASS_HEADER_MEMBERS.contains(uToken)) {
if (uToken.equals("EXTENDS")) {
reader.markPos();
reader.move(-2);
name = reader.read(FilterCollection.NON_NULL_NON_NEWLINE_FILTER);
reader.resetPos();
superName = reader.read(FilterCollection.NON_NULL_NON_NEWLINE_FILTER);
} else if (uToken.equals("IMPLEMENTS")) {
while (reader.canReadNext()) {
String jToken = reader.read(FilterCollection.NON_NULL_NON_NEWLINE_FILTER);
if (jToken.equals("{")) {// pretty sure this will never happen
break mainWhile;
}
interfaces.add(jToken);
}
} else if (uToken.equals("{")) {// pretty sure this will never happen
break;
}
} else if (sToken.equals("{")) {
break;
}
}
ClassMemberToken token = new ClassMemberToken(access, name, superName, interfaces.toArray(new String[interfaces.size()]));
return token;
}
}