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; } }