Skip to content

Commit

Permalink
Fix typeuse annotations not getting trimmed properly (#363)
Browse files Browse the repository at this point in the history
* fix annotations not getting trimmed

* use regex for annotation trimming

* even better regex

* Update Util.java

* Update Util.java

* Update UtilTest.java

* correct trimming

* Update Util.java
  • Loading branch information
SentryMan authored Jul 4, 2023
1 parent 95fbc1c commit a251c89
Show file tree
Hide file tree
Showing 5 changed files with 80 additions and 9 deletions.
41 changes: 32 additions & 9 deletions inject-generator/src/main/java/io/avaje/inject/generator/Util.java
Original file line number Diff line number Diff line change
@@ -1,15 +1,23 @@
package io.avaje.inject.generator;

import java.util.Optional;
import static io.avaje.inject.generator.ProcessingContext.isImportedType;

import java.util.Optional;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import javax.lang.model.element.AnnotationMirror;
import javax.lang.model.element.Element;
import javax.lang.model.type.DeclaredType;
import javax.lang.model.type.TypeMirror;

final class Util {

// whitespace not in quotes
private static final Pattern WHITE_SPACE_REGEX =
Pattern.compile("\\s+(?=([^\"]*\"[^\"]*\")*[^\"]*$)");
// comma not in quotes
private static final Pattern COMMA_PATTERN =
Pattern.compile(", (?=(?:[^\\\"]*\\\"[^\\\"]*\\\")*[^\\\"]*$)");
static final String ASPECT_PROVIDER_PREFIX = "io.avaje.inject.aop.AspectProvider<";
static final String PROVIDER_PREFIX = "jakarta.inject.Provider<";
private static final String OPTIONAL_PREFIX = "java.util.Optional<";
Expand Down Expand Up @@ -49,23 +57,38 @@ static String trimGenerics(String type) {
return type.substring(0, i);
}


/** Trim off annotations from the raw type if present. */
public static String trimAnnotations(String type) {
final int pos = type.indexOf(".@");
public static String trimAnnotations(String input) {

input = COMMA_PATTERN.matcher(input).replaceAll(",");

return cutAnnotations(input);
}

private static String cutAnnotations(String input) {
final int pos = input.indexOf("@");
if (pos == -1) {
return type;
return input;
}
return type.substring(0, pos + 1) + type.substring(type.lastIndexOf(' ') + 1);

final Matcher matcher = WHITE_SPACE_REGEX.matcher(input);

int currentIndex = 0;
if (matcher.find()) {
currentIndex = matcher.start();
}
final var result = input.substring(0, pos) + input.substring(currentIndex + 1);

return cutAnnotations(result);
}

public static String sanitizeImports(String type) {
final int pos = type.indexOf("@");
if (pos == -1) {
return type.replace("[]", "");
return type.replaceAll("[^\\n\\r\\t $;\\w.]", "");
}
final var start = pos == 0 ? type.substring(0, pos) : "";
return start + type.substring(type.lastIndexOf(' ') + 1).replace("[]", "");
return start + type.substring(type.lastIndexOf(' ') + 1).replaceAll("[^\\n\\r\\t $;\\w.]", "");
}

static String nestedPackageOf(String cls) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -120,6 +120,26 @@ void validImportType() {
assertTrue(Util.validImportType("other.pack.Foo"));
}

@Test
void trimmedAnnotation() {

assertEquals(
"java.util.Map<java.lang.String,java.lang.String>",
Util.trimAnnotations(
"java.util.@io.avaje.validation.constraints.NotEmpty(message=\"sus \", groups={io.avaje.validation.generator.models.valid.Ship.class}) Map<java.lang.@io.avaje.validation.constraints.NotEmpty(groups={io.avaje.validation.generator.models.valid.Ship.class}),@io.avaje.validation.constraints.NotBlank String,java.lang.@io.avaje.validation.constraints.NotBlank(groups={io.avaje.validation.generator.models.valid.Ship.class}),@io.avaje.validation.Valid String>"));

assertEquals(
"java.util.List<java.lang.String>",
Util.trimAnnotations(
"java.util.@jakarta.validation.constraints.NotEmpty(\"message(); ,\") List<java.lang.@jakarta.validation.constraints.NotNull String>"));
assertEquals("int", Util.trimAnnotations("@jakarta.validation.constraints.Positive int"));
assertEquals(
"java.util.Map<java.lang.String,java.lang.String>",
Util.trimAnnotations(
"java.util.Map<@jakarta.validation.constraints.Positive(message=\"sus \", groups=1) java.lang.String,java.lang.String>"));

}

@Test
void validImportType_not() {
assertFalse(Util.validImportType("void"));
Expand Down Expand Up @@ -159,5 +179,6 @@ void sanitizeImports() {
assertEquals("my.Foo", Util.sanitizeImports("@annotationMcgee my.Foo"));
assertEquals("my.Foo", Util.sanitizeImports("@org.bar.annotationMcgee my.Foo[]"));
assertEquals("my.Foo", Util.sanitizeImports("@org.bar.annotationMcgee my.Foo"));
assertEquals("java.util.String", Util.sanitizeImports("java.util.String>"));
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package io.avaje.inject.generator.models.valid.aspect;

import java.util.Map;

import io.avaje.inject.Component;
import io.avaje.inject.generator.models.valid.Timed;

@Component
public class MethodTest {

@Timed
void test(@Param Map<@TypeUse String, String> str, @Param int inty, String regular) {}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
package io.avaje.inject.generator.models.valid.aspect;

public @interface Param {}
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package io.avaje.inject.generator.models.valid.aspect;

import static java.lang.annotation.ElementType.TYPE_USE;
import static java.lang.annotation.RetentionPolicy.RUNTIME;

import java.lang.annotation.Retention;
import java.lang.annotation.Target;

@Target(TYPE_USE)
@Retention(RUNTIME)
public @interface TypeUse {}

0 comments on commit a251c89

Please sign in to comment.