package cd.transform.optimizers; import cd.ir.Ast.ClassDecl; import cd.ir.Symbol.ArrayTypeSymbol; import cd.ir.Symbol.TypeSymbol; import cd.transform.analysis.ClassUsage; import java.util.HashSet; import java.util.List; import java.util.Set; public class UnusedClassRemoval extends GlobalOptimizerVisitor { public boolean go(List classDecls, List typeList) { Set used = new ClassUsage().go(classDecls); Set toRemove = new HashSet<>(classDecls); toRemove.removeAll(used); // Remove classes from list of declarations classDecls.clear(); classDecls.addAll(used); // Remove corresponding types and array types for (ClassDecl classDecl : toRemove) { typeList.remove(classDecl.sym); TypeSymbol arrayType = null; for (TypeSymbol type : typeList) { if (type instanceof ArrayTypeSymbol && ((ArrayTypeSymbol) type).elementType == classDecl.sym) { arrayType = type; break; } } assert arrayType != null; typeList.remove(arrayType); } return !toRemove.isEmpty(); } }