diff --git a/epilogue-processor/src/main/java/edu/wpi/first/epilogue/processor/AnnotationProcessor.java b/epilogue-processor/src/main/java/edu/wpi/first/epilogue/processor/AnnotationProcessor.java index cd7ba625fd2..8a7ec2bdcf5 100644 --- a/epilogue-processor/src/main/java/edu/wpi/first/epilogue/processor/AnnotationProcessor.java +++ b/epilogue-processor/src/main/java/edu/wpi/first/epilogue/processor/AnnotationProcessor.java @@ -355,13 +355,15 @@ private void processEpilogue(RoundEnvironment roundEnv) { for (TypeElement clazz : classes) { try { warnOfNonLoggableElements(clazz); - m_loggerGenerator.writeLoggerFile(clazz); - + boolean isMainRobotClass = false; if (processingEnv.getTypeUtils().isAssignable(clazz.getSuperclass(), robotBaseClass)) { mainRobotClasses.add(clazz); + isMainRobotClass = true; + } + boolean canBeLogged = m_loggerGenerator.writeLoggerFile(clazz, isMainRobotClass); + if (canBeLogged) { + loggerClassNames.add(StringUtils.loggerClassName(clazz)); } - - loggerClassNames.add(StringUtils.loggerClassName(clazz)); } catch (IOException e) { processingEnv .getMessager() diff --git a/epilogue-processor/src/main/java/edu/wpi/first/epilogue/processor/LoggableHandler.java b/epilogue-processor/src/main/java/edu/wpi/first/epilogue/processor/LoggableHandler.java index a39bee7e8b0..4087ce00181 100644 --- a/epilogue-processor/src/main/java/edu/wpi/first/epilogue/processor/LoggableHandler.java +++ b/epilogue-processor/src/main/java/edu/wpi/first/epilogue/processor/LoggableHandler.java @@ -56,7 +56,7 @@ public String logInvocation(Element element) { var loggableSubtypes = m_loggedTypes.stream() .filter( - l -> m_processingEnv.getTypeUtils().isAssignable(l.asType(), declaredType.asType())) + l -> l.getAnnotation(Logged.class) != null && m_processingEnv.getTypeUtils().isAssignable(l.asType(), declaredType.asType())) .sorted(inheritanceComparatorFor(declaredType)) .toList(); diff --git a/epilogue-processor/src/main/java/edu/wpi/first/epilogue/processor/LoggerGenerator.java b/epilogue-processor/src/main/java/edu/wpi/first/epilogue/processor/LoggerGenerator.java index 2e7d4536a80..b86be2f0ed4 100644 --- a/epilogue-processor/src/main/java/edu/wpi/first/epilogue/processor/LoggerGenerator.java +++ b/epilogue-processor/src/main/java/edu/wpi/first/epilogue/processor/LoggerGenerator.java @@ -79,7 +79,7 @@ private static boolean isBuiltInJavaMethod(ExecutableElement e) { * @param clazz the data type that the logger should support. * @throws IOException if the file could not be written */ - public void writeLoggerFile(TypeElement clazz) throws IOException { + public boolean writeLoggerFile(TypeElement clazz, boolean isMainRobotClass) throws IOException { var config = clazz.getAnnotation(Logged.class); if (config == null) { config = kDefaultConfig; } boolean requireExplicitOptIn = config.strategy() == Logged.Strategy.OPT_IN; @@ -118,6 +118,12 @@ public void writeLoggerFile(TypeElement clazz) throws IOException { .filter(this::isLoggable) .filter(e -> !isSimpleGetterMethodForLoggedField(e, fieldsToLog)) .toList(); + + // Nothing to log; continue + // Robot classes must have a generated logger + if (fieldsToLog.isEmpty() && methodsToLog.isEmpty() && !isMainRobotClass) { + return false; + } // Validate no name collisions Map> usedNames = @@ -160,6 +166,7 @@ public void writeLoggerFile(TypeElement clazz) throws IOException { }); writeLoggerFile(clazz.getQualifiedName().toString(), config, fieldsToLog, methodsToLog); + return true; } private void writeLoggerFile( diff --git a/epilogue-processor/src/test/java/edu/wpi/first/epilogue/processor/AnnotationProcessorTest.java b/epilogue-processor/src/test/java/edu/wpi/first/epilogue/processor/AnnotationProcessorTest.java index 4eabc899d08..8f906305b1d 100644 --- a/epilogue-processor/src/test/java/edu/wpi/first/epilogue/processor/AnnotationProcessorTest.java +++ b/epilogue-processor/src/test/java/edu/wpi/first/epilogue/processor/AnnotationProcessorTest.java @@ -67,7 +67,8 @@ void basicOptInLogging() { class Example { @Logged double x; - @Logged double y; + @Logged public double y; + public double z; } """; diff --git a/epilogue-processor/src/test/java/edu/wpi/first/epilogue/processor/EpilogueGeneratorTest.java b/epilogue-processor/src/test/java/edu/wpi/first/epilogue/processor/EpilogueGeneratorTest.java index c30da2deefb..4442e9d8387 100644 --- a/epilogue-processor/src/test/java/edu/wpi/first/epilogue/processor/EpilogueGeneratorTest.java +++ b/epilogue-processor/src/test/java/edu/wpi/first/epilogue/processor/EpilogueGeneratorTest.java @@ -38,8 +38,6 @@ class Example { public final class Epilogue { private static final EpilogueConfiguration config = new EpilogueConfiguration(); - public static final ExampleLogger exampleLogger = new ExampleLogger(); - public static void configure(java.util.function.Consumer configurator) { configurator.accept(config); } @@ -73,6 +71,7 @@ class Example extends edu.wpi.first.wpilibj.RobotBase { public void startCompetition() {} @Override public void endCompetition() {} + private double x = 0.0; } """; @@ -116,8 +115,7 @@ void timedRobot() { package edu.wpi.first.epilogue; @Logged - class Example extends edu.wpi.first.wpilibj.TimedRobot { - } + class Example extends edu.wpi.first.wpilibj.TimedRobot { } """; String expected = @@ -192,10 +190,14 @@ void multipleRobots() { package edu.wpi.first.epilogue; @Logged - class AlphaBot extends edu.wpi.first.wpilibj.TimedRobot { } + class AlphaBot extends edu.wpi.first.wpilibj.TimedRobot { + double x = 0.0; + } @Logged - class BetaBot extends edu.wpi.first.wpilibj.TimedRobot { } + class BetaBot extends edu.wpi.first.wpilibj.TimedRobot { + double x = 0.0; + } """; String expected =