From ab899e48d54bb058d9cfc92785569d22176d25eb Mon Sep 17 00:00:00 2001 From: Rob Bygrave Date: Thu, 19 May 2022 13:33:24 +1200 Subject: [PATCH] #213 - BUG: reference to Builder is ambiguous ... when injecting a class with simple name of Builder --- .../org/example/myapp/config/AppConfig.java | 16 ++++++++++ .../java/org/example/myapp/config/Silly.java | 17 +++++++++++ .../io/avaje/inject/generator/BeanReader.java | 30 +++++++++++++++++-- .../io/avaje/inject/generator/Constants.java | 1 + .../inject/generator/SimpleBeanWriter.java | 6 ++-- 5 files changed, 64 insertions(+), 6 deletions(-) create mode 100644 blackbox-test-inject/src/main/java/org/example/myapp/config/Silly.java diff --git a/blackbox-test-inject/src/main/java/org/example/myapp/config/AppConfig.java b/blackbox-test-inject/src/main/java/org/example/myapp/config/AppConfig.java index e3666ca5a..a67974f61 100644 --- a/blackbox-test-inject/src/main/java/org/example/myapp/config/AppConfig.java +++ b/blackbox-test-inject/src/main/java/org/example/myapp/config/AppConfig.java @@ -19,4 +19,20 @@ public String helloData() { return "AppHelloData"; } } + + @Bean + Builder newBuilder() { + return new Builder(); + } + + @Bean + Generated newGenerated() { + return new Generated(); + } + + public static class Builder { + } + + public static class Generated { + } } diff --git a/blackbox-test-inject/src/main/java/org/example/myapp/config/Silly.java b/blackbox-test-inject/src/main/java/org/example/myapp/config/Silly.java new file mode 100644 index 000000000..fd21040ee --- /dev/null +++ b/blackbox-test-inject/src/main/java/org/example/myapp/config/Silly.java @@ -0,0 +1,17 @@ +package org.example.myapp.config; + +import io.avaje.inject.Component; + +public class Silly { + + @Component + public static class Builder { + public Builder() { + } + } + + @Component + public static class Generated { + + } +} diff --git a/inject-generator/src/main/java/io/avaje/inject/generator/BeanReader.java b/inject-generator/src/main/java/io/avaje/inject/generator/BeanReader.java index 0b404c698..3db9d531e 100644 --- a/inject-generator/src/main/java/io/avaje/inject/generator/BeanReader.java +++ b/inject-generator/src/main/java/io/avaje/inject/generator/BeanReader.java @@ -32,6 +32,8 @@ class BeanReader { private final boolean proxy; private final BeanAspects aspects; private boolean writtenToFile; + private boolean suppressBuilderImport; + private boolean suppressGeneratedImport; BeanReader(TypeElement beanType, ProcessingContext context, boolean factory) { this.beanType = beanType; @@ -210,8 +212,6 @@ private void prototypeNotSupported(Append writer, String lifecycle) { } private Set importTypes() { - importTypes.add(Constants.GENERATED); - importTypes.add(Constants.BUILDER); if (Util.validImportType(type)) { importTypes.add(type); } @@ -230,10 +230,34 @@ private Set importTypes() { } } } - + checkImports(); + if (!suppressGeneratedImport){ + importTypes.add(Constants.GENERATED); + } + if (!suppressBuilderImport) { + importTypes.add(Constants.BUILDER); + } return importTypes; } + private void checkImports() { + for (String type : importTypes) { + if (type.endsWith(".Builder")) { + suppressBuilderImport = true; + } else if (type.endsWith(".Generated")) { + suppressGeneratedImport = true; + } + } + } + + String builderType() { + return suppressBuilderImport ? Constants.BUILDER : "Builder"; + } + + String generatedType() { + return suppressGeneratedImport ? "@io.avaje.inject.spi.Generated" : "@Generated"; + } + void writeImports(Append writer) { for (String importType : importTypes()) { if (Util.validImportType(importType)) { diff --git a/inject-generator/src/main/java/io/avaje/inject/generator/Constants.java b/inject-generator/src/main/java/io/avaje/inject/generator/Constants.java index b29002f3e..14fae95f4 100644 --- a/inject-generator/src/main/java/io/avaje/inject/generator/Constants.java +++ b/inject-generator/src/main/java/io/avaje/inject/generator/Constants.java @@ -23,6 +23,7 @@ class Constants { static final String AT_SINGLETON = "@Singleton"; static final String AT_PROXY = "@Proxy"; static final String AT_GENERATED = "@Generated(\"io.avaje.inject.generator\")"; + static final String AT_GENERATED_COMMENT = "(\"io.avaje.inject.generator\")"; static final String META_INF_MODULE = "META-INF/services/io.avaje.inject.spi.Module"; static final String META_INF_TESTMODULE = "META-INF/services/io.avaje.inject.test.TestModule"; static final String META_INF_CUSTOM = "META-INF/services/io.avaje.inject.spi.Module.Custom"; diff --git a/inject-generator/src/main/java/io/avaje/inject/generator/SimpleBeanWriter.java b/inject-generator/src/main/java/io/avaje/inject/generator/SimpleBeanWriter.java index 1f4391a06..39646cb0c 100644 --- a/inject-generator/src/main/java/io/avaje/inject/generator/SimpleBeanWriter.java +++ b/inject-generator/src/main/java/io/avaje/inject/generator/SimpleBeanWriter.java @@ -119,7 +119,7 @@ private void writeStaticFactoryBeanMethods() { private void writeFactoryBeanMethod(MethodReader method) { method.commentBuildMethod(writer); - writer.append(" public static void build_%s(Builder builder) {", method.getName()).eol(); + writer.append(" public static void build_%s(%s builder) {", method.getName(), beanReader.builderType()).eol(); method.buildAddFor(writer); writer.append(method.builderGetFactory()).eol(); writer.append(method.builderBuildBean()).eol(); @@ -171,7 +171,7 @@ private void writeBuildMethodStart(MethodReader constructor) { } else { writer.append(CODE_COMMENT_BUILD, shortName).eol(); } - writer.append(" public static void build(Builder builder"); + writer.append(" public static void build(%s builder", beanReader.builderType()); for (MethodReader.MethodParam param : constructor.getParams()) { if (param.isGenericParam()) { param.addProviderParam(writer, providerIndex++); @@ -250,7 +250,7 @@ private void writeClassStart() { } else { writer.append(CODE_COMMENT, shortName).eol(); } - writer.append(Constants.AT_GENERATED).eol(); + writer.append(beanReader.generatedType()).append(Constants.AT_GENERATED_COMMENT).eol(); if (beanReader.isRequestScopedController()) { writer.append(Constants.AT_SINGLETON).eol(); }