diff --git a/README.md b/README.md index 01a7a0d..bb2f07e 100644 --- a/README.md +++ b/README.md @@ -11,7 +11,7 @@ - Laura Schleicher: Grammatik entwickeln, Records, Statements als Liste zurückgeben, Generator, Syntactic Sugar auflösen - Julian Kraus: Grammatik entwickeln, Generator, Syntactic Sugar auflösen, Parser Exceptions sammeln - Ahmad Juha: Typcheck -- Simon Wittmann: Codegen und Tool für ASM +- Simon Wittmann: Codegen, Logging, CommandLine Nutzung - Jonathan Fleischmann: - Schreiben von Tests, die die einzelnen Features abdecken - Umwandlung der Testfiles in AST und TypedAST diff --git a/src/main/java/de/maishai/Compiler.java b/src/main/java/de/maishai/Compiler.java index 092cbff..ec54be2 100644 --- a/src/main/java/de/maishai/Compiler.java +++ b/src/main/java/de/maishai/Compiler.java @@ -5,6 +5,7 @@ import de.maishai.antlr.DecafParser; import de.maishai.ast.records.Class; import de.maishai.ast.records.Program; import de.maishai.typedast.CodeGenUtils; +import de.maishai.typedast.MethodContext; import de.maishai.typedast.typedclass.TypedClass; import de.maishai.typedast.typedclass.TypedProgram; import org.antlr.v4.runtime.*; @@ -13,6 +14,8 @@ import org.apache.commons.cli.*; import java.io.IOException; import java.util.ArrayList; import java.util.List; +import java.util.logging.Formatter; +import java.util.logging.Handler; import java.util.logging.Level; import java.util.logging.Logger; @@ -21,11 +24,11 @@ public class Compiler { private static final String JAVA_FILE_EXTENSION = ".java"; private static final Logger LOGGER = Logger.getLogger(Compiler.class.getName()); - public static Program generateAST(List fromSources) { + public static Program generateAST(List sourcePaths) { List classes = new ArrayList<>(); CollectingErrorListener errorListener = new CollectingErrorListener(); - for (String fromSource : fromSources) { - CharStream input = CharStreams.fromString(fromSource); + for (String sourcePath : sourcePaths) { + CharStream input = CharStreams.fromString(sourcePath); DecafLexer lexer = new DecafLexer(input); //add custom error listener @@ -109,7 +112,12 @@ public class Compiler { Logger rootLog = Logger.getLogger(""); rootLog.setLevel( Level.FINEST ); rootLog.getHandlers()[0].setLevel( Level.FINEST ); - LOGGER.finest("Debug logging enabled"); + Formatter logFormatter = new LogFormatter(); + for (Handler handler : rootLog.getHandlers()) { + handler.setFormatter(logFormatter); + } + MethodContext.DEBUG = true; + LOGGER.info("Debug logging enabled"); } if (cmd.getArgs().length == 0) { diff --git a/src/main/java/de/maishai/LogFormatter.java b/src/main/java/de/maishai/LogFormatter.java new file mode 100644 index 0000000..1dd4dc1 --- /dev/null +++ b/src/main/java/de/maishai/LogFormatter.java @@ -0,0 +1,18 @@ +package de.maishai; + +import java.text.MessageFormat; +import java.util.logging.Formatter; +import java.util.logging.Level; +import java.util.logging.LogRecord; + +public class LogFormatter extends Formatter { + @Override + public String format(LogRecord logRecord) { + String formattedMessage = MessageFormat.format(logRecord.getMessage(), logRecord.getParameters()); + + if (logRecord.getLevel() == Level.FINEST) { + return formattedMessage + "\n"; + } + return logRecord.getLevel() + ": " + formattedMessage + "\n"; + } +} \ No newline at end of file diff --git a/src/main/java/de/maishai/typedast/LoggingMethodVisitor.java b/src/main/java/de/maishai/typedast/LoggingMethodVisitor.java index 7d7870a..baa386e 100644 --- a/src/main/java/de/maishai/typedast/LoggingMethodVisitor.java +++ b/src/main/java/de/maishai/typedast/LoggingMethodVisitor.java @@ -6,14 +6,16 @@ import org.objectweb.asm.Opcodes; import java.util.HashMap; import java.util.Map; +import java.util.logging.Level; +import java.util.logging.Logger; public class LoggingMethodVisitor extends MethodVisitor { + private static final Logger LOGGER = Logger.getLogger(LoggingMethodVisitor.class.getName()); private final Map labelNames = new HashMap<>(); private int labelCounter = 0; public LoggingMethodVisitor(MethodVisitor methodVisitor) { super(Opcodes.ASM9, methodVisitor); - System.out.println("\n--- Visiting Method ---"); } private String getLabelName(Label label) { @@ -22,7 +24,7 @@ public class LoggingMethodVisitor extends MethodVisitor { @Override public void visitJumpInsn(int opcode, Label label) { - System.out.println("visitJumpInsn: " + opcodeToString(opcode) + ", " + getLabelName(label)); + LOGGER.log(Level.FINEST, "visitJumpInsn: {0}, {1}", new Object[]{opcodeToString(opcode), getLabelName(label)}); super.visitJumpInsn(opcode, label); } @@ -41,63 +43,63 @@ public class LoggingMethodVisitor extends MethodVisitor { @Override public void visitMethodInsn(int opcode, String owner, String name, String descriptor, boolean isInterface) { - System.out.println("visitMethodInsn: " + opcodeToString(opcode) + ", " + owner + ", " + name + ", " + descriptor + ", " + isInterface); + LOGGER.log(Level.FINEST, "visitMethodInsn: {0}, {1}, {2}, {3}, {4}", new Object[]{opcodeToString(opcode), owner, name, descriptor, isInterface}); super.visitMethodInsn(opcode, owner, name, descriptor, isInterface); } @Override public void visitVarInsn(int opcode, int varIndex) { - System.out.println("visitVarInsn: " + opcodeToString(opcode) + ", " + varIndex); + LOGGER.log(Level.FINEST, "visitVarInsn: {0}, {1}", new Object[]{opcodeToString(opcode), varIndex}); super.visitVarInsn(opcode, varIndex); } @Override public void visitTypeInsn(int opcode, String type) { - System.out.println("visitTypeInsn: " + opcodeToString(opcode) + ", " + type); + LOGGER.log(Level.FINEST, "visitTypeInsn: {0}, {1}", new Object[]{opcodeToString(opcode), type}); super.visitTypeInsn(opcode, type); } @Override public void visitInsn(int opcode) { - System.out.println("visitInsn: " + opcodeToString(opcode)); + LOGGER.log(Level.FINEST, "visitInsn: {0}", opcodeToString(opcode)); super.visitInsn(opcode); } @Override public void visitMethodInsn(int opcode, String owner, String name, String descriptor) { - System.out.println("visitMethodInsn: " + opcodeToString(opcode) + ", " + owner + ", " + name + ", " + descriptor); + LOGGER.log(Level.FINEST, "visitMethodInsn: {0}, {1}, {2}, {3}", new Object[]{opcodeToString(opcode), owner, name, descriptor}); super.visitMethodInsn(opcode, owner, name, descriptor); } @Override public void visitFieldInsn(int opcode, String owner, String name, String descriptor) { - System.out.println("visitFieldInsn: " + opcodeToString(opcode) + ", " + owner + ", " + name + ", " + descriptor); + LOGGER.log(Level.FINEST, "visitFieldInsn: {0}, {1}, {2}, {3}", new Object[]{opcodeToString(opcode), owner, name, descriptor}); super.visitFieldInsn(opcode, owner, name, descriptor); } @Override public void visitMaxs(int maxStack, int maxLocals) { - System.out.println("visitMaxs: " + maxStack + ", " + maxLocals); + LOGGER.log(Level.FINEST, "visitMaxs: {0}, {1}", new Object[]{maxStack, maxLocals}); super.visitMaxs(maxStack, maxLocals); } @Override public void visitIntInsn(int opcode, int operand) { String opcodeString = opcode == Opcodes.BIPUSH ? "BIPUSH" : "SIPUSH"; - System.out.println("visitIntInsn: " + opcodeString + ", " + operand); + LOGGER.log(Level.FINEST, "visitIntInsn: {0}, {1}", new Object[]{opcodeString, operand}); super.visitIntInsn(opcode, operand); } @Override public void visitLabel(Label label) { String labelName = getLabelName(label); - System.out.println("visitLabel: " + labelName); + LOGGER.log(Level.FINEST, "visitLabel: {0}", labelName); super.visitLabel(label); } @Override public void visitLdcInsn(Object value) { - System.out.println("visitLdcInsn: " + value); + LOGGER.log(Level.FINEST, "visitLdcInsn: {0}", value); super.visitLdcInsn(value); } } diff --git a/src/main/java/de/maishai/typedast/MethodContext.java b/src/main/java/de/maishai/typedast/MethodContext.java index 3d31096..8f1cd12 100644 --- a/src/main/java/de/maishai/typedast/MethodContext.java +++ b/src/main/java/de/maishai/typedast/MethodContext.java @@ -12,6 +12,7 @@ import java.util.logging.Logger; @Getter public class MethodContext { private static final Logger LOGGER = Logger.getLogger(MethodContext.class.getName()); + public static boolean DEBUG = false; public record LocalVariable(String name, int index, Type type) { } @@ -28,7 +29,7 @@ public class MethodContext { private final Deque