Handlers and testcases for @Slf4j

This commit is contained in:
Maarten Mulders committed 2014-02-08 15:18:23 +01:00
1 parent d269cdcaf1
commit c38a64a556
6 files changed
+62 -26

No files matched your search

+16 -10
View File
@@ -38,6 +38,7 @@ import org.eclipse.jdt.internal.compiler.ast.FieldDeclaration;
import org.eclipse.jdt.internal.compiler.ast.MessageSend;
import org.eclipse.jdt.internal.compiler.ast.QualifiedTypeReference;
import org.eclipse.jdt.internal.compiler.ast.SingleTypeReference;
import org.eclipse.jdt.internal.compiler.ast.StringLiteral;
import org.eclipse.jdt.internal.compiler.ast.TypeDeclaration;
import org.eclipse.jdt.internal.compiler.ast.TypeReference;
import org.eclipse.jdt.internal.compiler.classfmt.ClassFileConstants;
@@ -48,7 +49,7 @@ public class HandleLog {
throw new UnsupportedOperationException();
}
public static void processAnnotation(LoggingFramework framework, AnnotationValues<? extends java.lang.annotation.Annotation> annotation, Annotation source, EclipseNode annotationNode) {
public static void processAnnotation(LoggingFramework framework, AnnotationValues<? extends java.lang.annotation.Annotation> annotation, Annotation source, EclipseNode annotationNode, String loggerCategory) {
EclipseNode owner = annotationNode.up();
switch (owner.getKind()) {
case TYPE:
@@ -71,7 +72,7 @@ public class HandleLog {
ClassLiteralAccess loggingType = selfType(owner, source);
FieldDeclaration fieldDeclaration = createField(framework, source, loggingType);
FieldDeclaration fieldDeclaration = createField(framework, source, loggingType, loggerCategory);
fieldDeclaration.traverse(new SetGeneratedByVisitor(source), typeDecl.staticInitializerScope);
// TODO temporary workaround for issue 217. http://code.google.com/p/projectlombok/issues/detail?id=217
// injectFieldSuppressWarnings(owner, fieldDeclaration);
@@ -97,7 +98,7 @@ public class HandleLog {
return result;
}
public static FieldDeclaration createField(LoggingFramework framework, Annotation source, ClassLiteralAccess loggingType) {
public static FieldDeclaration createField(LoggingFramework framework, Annotation source, ClassLiteralAccess loggingType, String loggerCategory) {
int pS = source.sourceStart, pE = source.sourceEnd;
long p = (long)pS << 32 | pE;
@@ -116,7 +117,12 @@ public class HandleLog {
factoryMethodCall.receiver = createNameReference(framework.getLoggerFactoryTypeName(), source);
factoryMethodCall.selector = framework.getLoggerFactoryMethodName().toCharArray();
Expression parameter = framework.createFactoryParameter(loggingType, source);
Expression parameter;
if (loggerCategory == null || loggerCategory.trim().length() == 0) {
parameter = framework.createFactoryParameter(loggingType, source);
} else {
parameter = new StringLiteral(loggerCategory.toCharArray(), pS, pE, 0);
}
factoryMethodCall.arguments = new Expression[] { parameter };
factoryMethodCall.nameSourcePosition = p;
@@ -155,7 +161,7 @@ public class HandleLog {
@ProviderFor(EclipseAnnotationHandler.class)
public static class HandleCommonsLog extends EclipseAnnotationHandler<lombok.extern.apachecommons.CommonsLog> {
@Override public void handle(AnnotationValues<lombok.extern.apachecommons.CommonsLog> annotation, Annotation source, EclipseNode annotationNode) {
processAnnotation(LoggingFramework.COMMONS, annotation, source, annotationNode);
processAnnotation(LoggingFramework.COMMONS, annotation, source, annotationNode, "");
}
}
@@ -165,7 +171,7 @@ public class HandleLog {
@ProviderFor(EclipseAnnotationHandler.class)
public static class HandleJulLog extends EclipseAnnotationHandler<lombok.extern.java.Log> {
@Override public void handle(AnnotationValues<lombok.extern.java.Log> annotation, Annotation source, EclipseNode annotationNode) {
processAnnotation(LoggingFramework.JUL, annotation, source, annotationNode);
processAnnotation(LoggingFramework.JUL, annotation, source, annotationNode, "");
}
}
@@ -175,7 +181,7 @@ public class HandleLog {
@ProviderFor(EclipseAnnotationHandler.class)
public static class HandleLog4jLog extends EclipseAnnotationHandler<lombok.extern.log4j.Log4j> {
@Override public void handle(AnnotationValues<lombok.extern.log4j.Log4j> annotation, Annotation source, EclipseNode annotationNode) {
processAnnotation(LoggingFramework.LOG4J, annotation, source, annotationNode);
processAnnotation(LoggingFramework.LOG4J, annotation, source, annotationNode, "");
}
}
@@ -185,7 +191,7 @@ public class HandleLog {
@ProviderFor(EclipseAnnotationHandler.class)
public static class HandleLog4j2Log extends EclipseAnnotationHandler<lombok.extern.log4j.Log4j2> {
@Override public void handle(AnnotationValues<lombok.extern.log4j.Log4j2> annotation, Annotation source, EclipseNode annotationNode) {
processAnnotation(LoggingFramework.LOG4J2, annotation, source, annotationNode);
processAnnotation(LoggingFramework.LOG4J2, annotation, source, annotationNode, "");
}
}
@@ -195,7 +201,7 @@ public class HandleLog {
@ProviderFor(EclipseAnnotationHandler.class)
public static class HandleSlf4jLog extends EclipseAnnotationHandler<lombok.extern.slf4j.Slf4j> {
@Override public void handle(AnnotationValues<lombok.extern.slf4j.Slf4j> annotation, Annotation source, EclipseNode annotationNode) {
processAnnotation(LoggingFramework.SLF4J, annotation, source, annotationNode);
processAnnotation(LoggingFramework.SLF4J, annotation, source, annotationNode, annotation.getInstance().value());
}
}
@@ -205,7 +211,7 @@ public class HandleLog {
@ProviderFor(EclipseAnnotationHandler.class)
public static class HandleXSlf4jLog extends EclipseAnnotationHandler<lombok.extern.slf4j.XSlf4j> {
@Override public void handle(AnnotationValues<lombok.extern.slf4j.XSlf4j> annotation, Annotation source, EclipseNode annotationNode) {
processAnnotation(LoggingFramework.XSLF4J, annotation, source, annotationNode);
processAnnotation(LoggingFramework.XSLF4J, annotation, source, annotationNode, "");
}
}
+4
View File
@@ -57,4 +57,8 @@ import java.lang.annotation.Target;
@Retention(RetentionPolicy.SOURCE)
@Target(ElementType.TYPE)
public @interface Slf4j {
/**
* Sets the category of the constructed Logger. By default, it will use the type where the annotation is placed.
*/
String value() default "";
}
+24 -16
View File
@@ -25,7 +25,9 @@ import static lombok.javac.handlers.JavacHandlerUtil.*;
import java.lang.annotation.Annotation;
import lombok.NoArgsConstructor;
import lombok.core.AnnotationValues;
import lombok.extern.slf4j.Slf4j;
import lombok.javac.JavacAnnotationHandler;
import lombok.javac.JavacNode;
import lombok.javac.JavacTreeMaker;
@@ -47,10 +49,10 @@ public class HandleLog {
private HandleLog() {
throw new UnsupportedOperationException();
}
public static void processAnnotation(LoggingFramework framework, AnnotationValues<?> annotation, JavacNode annotationNode) {
public static void processAnnotation(LoggingFramework framework, AnnotationValues<?> annotation, JavacNode annotationNode, String loggerCategory) {
deleteAnnotationIfNeccessary(annotationNode, framework.getAnnotationClass());
JavacNode typeNode = annotationNode.up();
switch (typeNode.getKind()) {
case TYPE:
@@ -58,14 +60,14 @@ public class HandleLog {
annotationNode.addError("@Log is legal only on classes and enums.");
return;
}
if (fieldExists("log", typeNode)!= MemberExistsResult.NOT_EXISTS) {
annotationNode.addWarning("Field 'log' already exists.");
return;
}
JCFieldAccess loggingType = selfType(typeNode);
createField(framework, typeNode, loggingType, annotationNode.get());
createField(framework, typeNode, loggingType, annotationNode.get(), loggerCategory);
break;
default:
annotationNode.addError("@Log is legal only on types.");
@@ -79,16 +81,22 @@ public class HandleLog {
return maker.Select(maker.Ident(name), typeNode.toName("class"));
}
public static boolean createField(LoggingFramework framework, JavacNode typeNode, JCFieldAccess loggingType, JCTree source) {
public static boolean createField(LoggingFramework framework, JavacNode typeNode, JCFieldAccess loggingType, JCTree source, String loggerCategory) {
JavacTreeMaker maker = typeNode.getTreeMaker();
// private static final <loggerType> log = <factoryMethod>(<parameter>);
JCExpression loggerType = chainDotsString(typeNode, framework.getLoggerTypeName());
JCExpression factoryMethod = chainDotsString(typeNode, framework.getLoggerFactoryMethodName());
JCExpression loggerName = framework.createFactoryParameter(typeNode, loggingType);
JCExpression loggerName;
if (loggerCategory == null || loggerCategory.trim().length() == 0) {
loggerName = framework.createFactoryParameter(typeNode, loggingType);
} else {
loggerName = maker.Literal(loggerCategory);
}
JCMethodInvocation factoryMethodCall = maker.Apply(List.<JCExpression>nil(), factoryMethod, List.<JCExpression>of(loggerName));
JCVariableDecl fieldDecl = recursiveSetGeneratedBy(maker.VarDef(
maker.Modifiers(Flags.PRIVATE | Flags.FINAL | Flags.STATIC),
typeNode.toName("log"), loggerType, factoryMethodCall), source, typeNode.getContext());
@@ -103,7 +111,7 @@ public class HandleLog {
@ProviderFor(JavacAnnotationHandler.class)
public static class HandleCommonsLog extends JavacAnnotationHandler<lombok.extern.apachecommons.CommonsLog> {
@Override public void handle(AnnotationValues<lombok.extern.apachecommons.CommonsLog> annotation, JCAnnotation ast, JavacNode annotationNode) {
processAnnotation(LoggingFramework.COMMONS, annotation, annotationNode);
processAnnotation(LoggingFramework.COMMONS, annotation, annotationNode, "");
}
}
@@ -113,7 +121,7 @@ public class HandleLog {
@ProviderFor(JavacAnnotationHandler.class)
public static class HandleJulLog extends JavacAnnotationHandler<lombok.extern.java.Log> {
@Override public void handle(AnnotationValues<lombok.extern.java.Log> annotation, JCAnnotation ast, JavacNode annotationNode) {
processAnnotation(LoggingFramework.JUL, annotation, annotationNode);
processAnnotation(LoggingFramework.JUL, annotation, annotationNode, "");
}
}
@@ -123,7 +131,7 @@ public class HandleLog {
@ProviderFor(JavacAnnotationHandler.class)
public static class HandleLog4jLog extends JavacAnnotationHandler<lombok.extern.log4j.Log4j> {
@Override public void handle(AnnotationValues<lombok.extern.log4j.Log4j> annotation, JCAnnotation ast, JavacNode annotationNode) {
processAnnotation(LoggingFramework.LOG4J, annotation, annotationNode);
processAnnotation(LoggingFramework.LOG4J, annotation, annotationNode, "");
}
}
@@ -133,7 +141,7 @@ public class HandleLog {
@ProviderFor(JavacAnnotationHandler.class)
public static class HandleLog4j2Log extends JavacAnnotationHandler<lombok.extern.log4j.Log4j2> {
@Override public void handle(AnnotationValues<lombok.extern.log4j.Log4j2> annotation, JCAnnotation ast, JavacNode annotationNode) {
processAnnotation(LoggingFramework.LOG4J2, annotation, annotationNode);
processAnnotation(LoggingFramework.LOG4J2, annotation, annotationNode, "");
}
}
@@ -143,7 +151,7 @@ public class HandleLog {
@ProviderFor(JavacAnnotationHandler.class)
public static class HandleSlf4jLog extends JavacAnnotationHandler<lombok.extern.slf4j.Slf4j> {
@Override public void handle(AnnotationValues<lombok.extern.slf4j.Slf4j> annotation, JCAnnotation ast, JavacNode annotationNode) {
processAnnotation(LoggingFramework.SLF4J, annotation, annotationNode);
processAnnotation(LoggingFramework.SLF4J, annotation, annotationNode, annotation.getInstance().value());
}
}
@@ -153,7 +161,7 @@ public class HandleLog {
@ProviderFor(JavacAnnotationHandler.class)
public static class HandleXSlf4jLog extends JavacAnnotationHandler<lombok.extern.slf4j.XSlf4j> {
@Override public void handle(AnnotationValues<lombok.extern.slf4j.XSlf4j> annotation, JCAnnotation ast, JavacNode annotationNode) {
processAnnotation(LoggingFramework.XSLF4J, annotation, annotationNode);
processAnnotation(LoggingFramework.XSLF4J, annotation, annotationNode, "");
}
}
@@ -11,4 +11,9 @@ class LoggerSlf4jOuter {
@java.lang.SuppressWarnings("all")
private static final org.slf4j.Logger log = org.slf4j.LoggerFactory.getLogger(Inner.class);
}
}
class LoggerSlf4jWithDifferentLoggerName {
@java.lang.SuppressWarnings("all")
private static final org.slf4j.Logger log = org.slf4j.LoggerFactory.getLogger("DifferentLogger");
}
@@ -27,4 +27,13 @@ class LoggerSlf4jOuter {
LoggerSlf4jOuter() {
super();
}
}
@Slf4j("DifferentLogger") class LoggerSlf4jWithDifferentLoggerName {
private static final org.slf4j.Logger log = org.slf4j.LoggerFactory.getLogger("DifferentLogger");
<clinit>() {
}
LoggerSlf4jWithDifferentLoggerName() {
super();
}
}
@@ -13,4 +13,8 @@ class LoggerSlf4jOuter {
static class Inner {
}
}
@Slf4j("DifferentLogger")
class LoggerSlf4jWithDifferentLoggerName {
}