package org.psjava.judgesubmit;
import com.abbajoa.codecombine.util.StringUtil;
import japa.parser.JavaParser;
import japa.parser.ParseException;
import japa.parser.ast.CompilationUnit;
import japa.parser.ast.body.*;
import java.io.ByteArrayInputStream;
import java.io.UnsupportedEncodingException;
public class JavaShrinker {
public static String cunstructShirinked(String original) throws ParseException {
CompilationUnit cu = null;
try {
cu = JavaParser.parse(new ByteArrayInputStream(original.getBytes("UTF-8")), "UTF-8");
} catch (UnsupportedEncodingException e) {
throw new RuntimeException(e);
}
for (TypeDeclaration td : cu.getTypes())
processType(td);
original = cu.toString();
original = shrink(original);
return original;
}
private static String shrink(String lines) {
StringBuilder sb = new StringBuilder();
for (String line : StringUtil.toLineList(lines))
sb.append(line.trim() + "\n");
return sb.toString();
}
private static void processType(TypeDeclaration td) {
if (td.getJavaDoc() != null)
td.setJavaDoc(null);
if (td.getMembers() != null) {
int ccount = 0;
for (BodyDeclaration bd : td.getMembers()) {
if (bd instanceof TypeDeclaration)
processType((TypeDeclaration) bd);
if (bd.getJavaDoc() != null)
bd.setJavaDoc(null);
if (bd.getAnnotations() != null)
for (int i = bd.getAnnotations().size() - 1; i >= 0; i--)
if (bd.getAnnotations().get(i).getName().getName().equals("SuppressWarnings"))
bd.getAnnotations().remove(i);
if (bd instanceof MethodDeclaration) {
MethodDeclaration md = (MethodDeclaration) bd;
md.setModifiers(removeUnnecessaryModifiers(md.getModifiers()));
}
if (bd instanceof ConstructorDeclaration) {
ConstructorDeclaration cd = (ConstructorDeclaration) bd;
cd.setModifiers(removeUnnecessaryModifiers(cd.getModifiers()));
ccount++;
}
if (bd instanceof FieldDeclaration) {
FieldDeclaration fd = (FieldDeclaration) bd;
fd.setModifiers(removeUnnecessaryModifiers(fd.getModifiers()));
}
}
if (ccount == 1) {
ConstructorDeclaration toRemove = null;
for (BodyDeclaration bd : td.getMembers()) {
if (bd instanceof ConstructorDeclaration) {
ConstructorDeclaration cd = (ConstructorDeclaration) bd;
if (cd.getParameters() == null && cd.getBlock().getStmts() == null)
toRemove = cd;
}
}
if (toRemove != null)
td.getMembers().remove(toRemove);
}
}
}
private static int removeUnnecessaryModifiers(int oldSet) {
if (ModifierSet.isPrivate(oldSet))
oldSet = ModifierSet.removeModifier(oldSet, ModifierSet.PRIVATE);
if (ModifierSet.isFinal((oldSet)))
oldSet = ModifierSet.removeModifier(oldSet, ModifierSet.FINAL);
return oldSet;
}
}