From 8e50444ba6a3161f3c18e5ba45764664a91539e7 Mon Sep 17 00:00:00 2001 From: Loredana Crusoveanu Date: Sun, 12 Nov 2017 22:31:39 +0200 Subject: [PATCH] smaller methods --- .../com/baeldung/javac/SampleJavacPlugin.java | 113 +++++++++--------- 1 file changed, 56 insertions(+), 57 deletions(-) diff --git a/core-java/src/main/java/com/baeldung/javac/SampleJavacPlugin.java b/core-java/src/main/java/com/baeldung/javac/SampleJavacPlugin.java index c85b04f0cf..eb48d6a216 100644 --- a/core-java/src/main/java/com/baeldung/javac/SampleJavacPlugin.java +++ b/core-java/src/main/java/com/baeldung/javac/SampleJavacPlugin.java @@ -26,10 +26,9 @@ public class SampleJavacPlugin implements Plugin { public static final String NAME = "MyPlugin"; private static Set TARGET_TYPES = new HashSet<>(Arrays.asList( - // Use only primitive types for simplicity - byte.class.getName(), short.class.getName(), char.class.getName(), int.class.getName(), - long.class.getName(), float.class.getName(), double.class.getName() - )); + // Use only primitive types for simplicity + byte.class.getName(), short.class.getName(), char.class.getName(), + int.class.getName(), long.class.getName(), float.class.getName(), double.class.getName())); @Override public String getName() { @@ -49,34 +48,35 @@ public class SampleJavacPlugin implements Plugin { if (e.getKind() != TaskEvent.Kind.PARSE) { return; } - e.getCompilationUnit().accept(new TreeScanner() { - @Override - public Void visitMethod(MethodTree method, Void v) { - List parametersToInstrument = method.getParameters() - .stream() - .filter(SampleJavacPlugin.this::shouldInstrument) - .collect(Collectors.toList()); - if (!parametersToInstrument.isEmpty()) { - // There is a possible case that more than one argument is marked by @Positive, - // as the checks are added to the method's body beginning, we process parameters RTL - // to ensure correct order. - Collections.reverse(parametersToInstrument); - parametersToInstrument.forEach(p -> addCheck(method, p, context)); + e.getCompilationUnit() + .accept(new TreeScanner() { + @Override + public Void visitMethod(MethodTree method, Void v) { + List parametersToInstrument = method.getParameters() + .stream() + .filter(SampleJavacPlugin.this::shouldInstrument) + .collect(Collectors.toList()); + if (!parametersToInstrument.isEmpty()) { + // There is a possible case that more than one argument is marked by @Positive, + // as the checks are added to the method's body beginning, we process parameters RTL + // to ensure correct order. + Collections.reverse(parametersToInstrument); + parametersToInstrument.forEach(p -> addCheck(method, p, context)); + } + // There is a possible case that there is a nested class declared in a method's body, + // hence, we want to proceed with method body AST as well. + return super.visitMethod(method, v); } - // There is a possible case that there is a nested class declared in a method's body, - // hence, we want to proceed with method body AST as well. - return super.visitMethod(method, v); - } - }, null); + }, null); } }); } private boolean shouldInstrument(VariableTree parameter) { return TARGET_TYPES.contains(parameter.getType().toString()) - && parameter.getModifiers().getAnnotations() - .stream() - .anyMatch(a -> Positive.class.getSimpleName().equals(a.getAnnotationType().toString())); + && parameter.getModifiers().getAnnotations() + .stream() + .anyMatch(a -> Positive.class.getSimpleName().equals(a.getAnnotationType().toString())); } private void addCheck(MethodTree method, VariableTree parameter, Context context) { @@ -88,37 +88,36 @@ public class SampleJavacPlugin implements Plugin { private static JCTree.JCIf createCheck(VariableTree parameter, Context context) { TreeMaker factory = TreeMaker.instance(context); Names symbolsTable = Names.instance(context); - String parameterName = parameter.getName().toString(); - String errorMessagePrefix = String.format("Argument '%s' of type %s is marked by @%s but got '", - parameterName, parameter.getType(), Positive.class.getSimpleName()); - String errorMessageSuffix = "' for it"; - Name parameterId = symbolsTable.fromString(parameterName); - return factory.at(((JCTree) parameter).pos).If( - factory.Parens( - factory.Binary( - JCTree.Tag.LE, - factory.Ident(parameterId), - factory.Literal(TypeTag.INT, 0)) - ), - factory.Block(0, com.sun.tools.javac.util.List.of( - factory.Throw( - factory.NewClass( - null, - nil(), - factory.Ident( - symbolsTable.fromString(IllegalArgumentException.class.getSimpleName()) - ), - com.sun.tools.javac.util.List.of( - factory.Binary(JCTree.Tag.PLUS, - factory.Binary(JCTree.Tag.PLUS, - factory.Literal(TypeTag.CLASS, errorMessagePrefix), - factory.Ident(parameterId)), - factory.Literal(TypeTag.CLASS, errorMessageSuffix))), - null - ) - ) - )), - null - ); + + return factory.at(((JCTree) parameter).pos) + .If(factory.Parens(createIfCondition(factory, symbolsTable, parameter)), + createIfBlock(factory, symbolsTable, parameter), + null); } + + private static JCTree.JCBinary createIfCondition(TreeMaker factory, Names symbolsTable, VariableTree parameter) { + Name parameterId = symbolsTable.fromString(parameter.getName().toString()); + return factory.Binary(JCTree.Tag.LE, + factory.Ident(parameterId), + factory.Literal(TypeTag.INT, 0)); + } + + private static JCTree.JCBlock createIfBlock(TreeMaker factory, Names symbolsTable, VariableTree parameter) { + String parameterName = parameter.getName().toString(); + Name parameterId = symbolsTable.fromString(parameterName); + + String errorMessagePrefix = String.format("Argument '%s' of type %s is marked by @%s but got '", + parameterName, parameter.getType(), Positive.class.getSimpleName()); + String errorMessageSuffix = "' for it"; + + return factory.Block(0, com.sun.tools.javac.util.List.of( + factory.Throw( + factory.NewClass(null, nil(), + factory.Ident(symbolsTable.fromString(IllegalArgumentException.class.getSimpleName())), + com.sun.tools.javac.util.List.of(factory.Binary(JCTree.Tag.PLUS, + factory.Binary(JCTree.Tag.PLUS, factory.Literal(TypeTag.CLASS, errorMessagePrefix), + factory.Ident(parameterId)), + factory.Literal(TypeTag.CLASS, errorMessageSuffix))), null)))); + } + }