@Override public void process(CtClass<?> cl) { String className = cl.getQualifiedName().replace('.', '_'); try { writer = new PrintWriter( new BufferedWriter(new FileWriter("src/main/resources/alloyGen/gen.als", true))); } catch (IOException e) { e.printStackTrace(); } if (writer != null) { // writer.println("one sig " + className + " extends Type{}\n"); linesToAdd.add(className); for (CtMethod<?> method : cl.getAllMethods()) { if (method.hasModifier(ModifierKind.PUBLIC)) { boolean addMethod = true; final StringBuilder signatureBuilder = new StringBuilder(); String methodName = className + "_" + method.getSimpleName() + "_" + method.getPosition().getLine(); signatureBuilder.append("one sig " + methodName + " extends Method{}\n"); // writer.println("one sig " + methodName + " extends // Method{}"); signatureBuilder.append("fact{\n"); // writer.println("fact{"); signatureBuilder.append( "#" + methodName + ".paramTypes=" + method.getParameters().size() + "\n"); // writer.println("#" + methodName + ".paramTypes=" + // method.getParameters().size()); int i = 0; for (CtParameter<?> param : method.getParameters()) { if (!param.getType().isPrimitive()) { String name = param.getType().toString().replace(".", "_"); if (name.contains("[]") || name.contains("<")) { addMethod = false; } signatureBuilder.append(methodName + ".paramTypes[" + (i++) + "]=" + name + "\n"); // writer.println(methodName + ".paramTypes[" + // (i++) + // "]=" + name); if (addMethod) { linesToAdd.add(name); } } else { if (param.getType().getQualifiedName().equals(int.class.getName()) | param.getType().getQualifiedName().equals(Integer.class.getName())) { signatureBuilder.append(methodName + ".paramTypes[" + (i++) + "]=Gen_Integer\n"); // writer.println(methodName + ".paramTypes[" + // (i++) + "]=Gen_Integer"); } else if (param.getType().getQualifiedName().equals(float.class.getName()) | param.getType().getQualifiedName().equals(Float.class.getName())) { signatureBuilder.append(methodName + ".paramTypes[" + (i++) + "]=Gen_Float\n"); // writer.println(methodName + ".paramTypes[" + // (i++) + "]=Gen_Float"); } else if (param.getType().getQualifiedName().equals(boolean.class.getName()) | param.getType().getQualifiedName().equals(Boolean.class.getName())) { signatureBuilder.append(methodName + ".paramTypes[" + (i++) + "]=Gen_Boolean\n"); // writer.println(methodName + ".paramTypes[" + // (i++) + "]=Gen_Boolean"); } else if (param.getType().getQualifiedName().equals(byte.class.getName()) | param.getType().getQualifiedName().equals(Byte.class.getName())) { signatureBuilder.append(methodName + ".paramTypes[" + (i++) + "]=Gen_Byte\n"); // writer.println(methodName + ".paramTypes[" + // (i++) + "]=Gen_Byte"); } else if (param.getType().getQualifiedName().equals(short.class.getName()) | param.getType().getQualifiedName().equals(Short.class.getName())) { signatureBuilder.append(methodName + ".paramTypes[" + (i++) + "]=Gen_Short\n"); // writer.println(methodName + ".paramTypes[" + // (i++) + "]=Gen_Short"); } else if (param.getType().getQualifiedName().equals(double.class.getName()) | param.getType().getQualifiedName().equals(Double.class.getName())) { signatureBuilder.append(methodName + ".paramTypes[" + (i++) + "]=Gen_Double\n"); // writer.println(methodName + ".paramTypes[" + // (i++) + "]=Gen_Double"); } else if (param.getType().getQualifiedName().equals(char.class.getName()) | param.getType().getQualifiedName().equals(Character.class.getName())) { signatureBuilder.append(methodName + ".paramTypes[" + (i++) + "]=Gen_Character\n"); // writer.println(methodName + ".paramTypes[" + // (i++) + "]=Gen_Character"); } else if (param.getType().getQualifiedName().equals(long.class.getName()) | param.getType().getQualifiedName().equals(Long.class.getName())) { signatureBuilder.append(methodName + ".paramTypes[" + (i++) + "]=Gen_Long\n"); // writer.println(methodName + ".paramTypes[" + // (i++) + "]=Gen_Long"); } else { final String type = param.getType().getQualifiedName().replace('.', '_'); signatureBuilder.append( methodName + ".paramTypes[" + (i++) + "]=Gen_" + type + "\n"); // writer.println(methodName + ".paramTypes[" + // (i++) + "]=Gen_" + type); } } } signatureBuilder.append(methodName + ".receiverType=" + className + "\n"); // writer.println(methodName + ".receiverType=" + // className); signatureBuilder.append("}\n\n"); // writer.println("}\n"); if (addMethod) { writer.println(signatureBuilder.toString()); } // writer.flush(); } } int cpt = 1; for (final CtConstructor<?> constructor : cl.getConstructors()) { if (constructor.hasModifier(ModifierKind.PUBLIC)) { String constructorName = className + "_" + constructor.getSimpleName() + "" + (cpt++) + "_" + constructor.getPosition().getLine(); constructorName = constructorName.replace("<", ""); constructorName = constructorName.replace(">", ""); boolean addConstructor = true; final StringBuilder signatureBuilder = new StringBuilder(); signatureBuilder.append("one sig " + constructorName + " extends ConstructorCall{}\n"); // writer.println("one sig " + methodName + " extends // Method{}"); signatureBuilder.append("fact{\n"); // writer.println("fact{"); signatureBuilder.append( "#" + constructorName + ".paramTypes=" + constructor.getParameters().size() + "\n"); // writer.println("#" + methodName + ".paramTypes=" + // method.getParameters().size()); int i = 0; for (CtParameter<?> param : constructor.getParameters()) { if (!param.getType().isPrimitive()) { String name = param.getType().toString().replace(".", "_"); if (name.contains("[]") || name.contains("<")) { addConstructor = false; } signatureBuilder.append( constructorName + ".paramTypes[" + (i++) + "]=" + name + "\n"); // writer.println(methodName + ".paramTypes[" + // (i++) + // "]=" + name); if (addConstructor) { linesToAdd.add(name); } } else { if (param.getType().getQualifiedName().equals(int.class.getName()) | param.getType().getQualifiedName().equals(Integer.class.getName())) { signatureBuilder.append( constructorName + ".paramTypes[" + (i++) + "]=Gen_Integer\n"); // writer.println(methodName + ".paramTypes[" + // (i++) + "]=Gen_Integer"); } else if (param.getType().getQualifiedName().equals(float.class.getName()) | param.getType().getQualifiedName().equals(Float.class.getName())) { signatureBuilder.append(constructorName + ".paramTypes[" + (i++) + "]=Gen_Float\n"); // writer.println(methodName + ".paramTypes[" + // (i++) + "]=Gen_Float"); } else if (param.getType().getQualifiedName().equals(boolean.class.getName()) | param.getType().getQualifiedName().equals(Boolean.class.getName())) { signatureBuilder.append( constructorName + ".paramTypes[" + (i++) + "]=Gen_Boolean\n"); // writer.println(methodName + ".paramTypes[" + // (i++) + "]=Gen_Boolean"); } else if (param.getType().getQualifiedName().equals(byte.class.getName()) | param.getType().getQualifiedName().equals(Byte.class.getName())) { signatureBuilder.append(constructorName + ".paramTypes[" + (i++) + "]=Gen_Byte\n"); // writer.println(methodName + ".paramTypes[" + // (i++) + "]=Gen_Byte"); } else if (param.getType().getQualifiedName().equals(short.class.getName()) | param.getType().getQualifiedName().equals(Short.class.getName())) { signatureBuilder.append(constructorName + ".paramTypes[" + (i++) + "]=Gen_Short\n"); // writer.println(methodName + ".paramTypes[" + // (i++) + "]=Gen_Short"); } else if (param.getType().getQualifiedName().equals(double.class.getName()) | param.getType().getQualifiedName().equals(Double.class.getName())) { signatureBuilder.append( constructorName + ".paramTypes[" + (i++) + "]=Gen_Double\n"); // writer.println(methodName + ".paramTypes[" + // (i++) + "]=Gen_Double"); } else if (param.getType().getQualifiedName().equals(char.class.getName()) | param.getType().getQualifiedName().equals(Character.class.getName())) { signatureBuilder.append( constructorName + ".paramTypes[" + (i++) + "]=Gen_Character\n"); // writer.println(methodName + ".paramTypes[" + // (i++) + "]=Gen_Character"); } else if (param.getType().getQualifiedName().equals(long.class.getName()) | param.getType().getQualifiedName().equals(Long.class.getName())) { signatureBuilder.append(constructorName + ".paramTypes[" + (i++) + "]=Gen_Long\n"); // writer.println(methodName + ".paramTypes[" + // (i++) + "]=Gen_Long"); } else { final String type = param.getType().getQualifiedName().replace('.', '_'); signatureBuilder.append( constructorName + ".paramTypes[" + (i++) + "]=Gen_" + type + "\n"); // writer.println(methodName + ".paramTypes[" + // (i++) + "]=Gen_" + type); } } } // writer.println(methodName + ".receiverType=" + // className); signatureBuilder.append("}\n\n"); // writer.println("}\n"); if (addConstructor) { writer.println(signatureBuilder.toString()); } } } writer.flush(); } }