package org.develnext.jphp.core.opcode;
import org.objectweb.asm.ClassReader;
import php.runtime.reflection.ClassEntity;
import php.runtime.reflection.FunctionEntity;
import php.runtime.reflection.ModuleEntity;
import php.runtime.reflection.helper.ClosureEntity;
import php.runtime.reflection.helper.GeneratorEntity;
import java.io.*;
public class ModuleOpcodePrinter {
private final ModuleEntity module;
public ModuleOpcodePrinter(ModuleEntity module){
this.module = module;
}
public ModuleEntity getModule() {
return module;
}
public void toOutput(Writer writer, int flags){
try {
OpcodePrinter opcodePrinter = new OpcodePrinter(module);
writer.write("#### Module class: " + module.getContext().getModuleName() + "\n");
opcodePrinter.toWriter(writer, flags);
writer.write("#### /Module class \n\n\n");
for(ClosureEntity closure : module.getClosures()){
opcodePrinter = new OpcodePrinter(closure);
writer.write("#### Closure: " + closure.getInternalName() + "\n");
opcodePrinter.toWriter(writer);
writer.write("#### /Closure \n\n\n");
}
for(GeneratorEntity generator : module.getGenerators()){
opcodePrinter = new OpcodePrinter(generator);
writer.write("#### Generator: " + generator.getInternalName() + "\n");
opcodePrinter.toWriter(writer);
writer.write("#### /Generator \n\n\n");
}
for(ClassEntity clazz : module.getClasses()){
if (clazz.isClass() || clazz.isTrait()){
opcodePrinter = new OpcodePrinter(clazz);
writer.write("#### " + (clazz.isTrait() ? "Trait" : "Class") + ": " + clazz.getName() + "\n");
opcodePrinter.toWriter(writer);
writer.write("#### /" + (clazz.isTrait() ? "Trait" : "Class") + " \n\n\n");
}
}
for(FunctionEntity function : module.getFunctions()){
opcodePrinter = new OpcodePrinter(function);
writer.write("#### Function: " + function.getName() + "\n");
opcodePrinter.toWriter(writer);
writer.write("#### /Function \n\n\n");
}
} catch (IOException e) {
throw new RuntimeException(e);
}
}
public void toOutput(Writer writer){
toOutput(writer, ClassReader.SKIP_DEBUG);
}
public String toString(int flags){
StringWriter stringWriter = new StringWriter();
toOutput(stringWriter, flags);
return stringWriter.toString();
}
@Override
public String toString(){
return toString(ClassReader.SKIP_DEBUG);
}
public void toFile(File file, int flags) throws IOException {
FileWriter writer = new FileWriter(file);
try {
toOutput(writer, flags);
} finally {
writer.close();
}
}
public void toFile(File file) throws IOException {
toFile(file, ClassReader.SKIP_DEBUG);
}
}