diff --git a/java/gazelle/lang.go b/java/gazelle/lang.go index c293d8eb..8cf5b261 100644 --- a/java/gazelle/lang.go +++ b/java/gazelle/lang.go @@ -84,6 +84,7 @@ var kindWithRuntimeDeps = rule.KindInfo{ MergeableAttrs: map[string]bool{"srcs": true}, ResolveAttrs: map[string]bool{ "deps": true, + "plugins": true, "runtime_deps": true, }, } @@ -94,7 +95,8 @@ var kindWithoutRuntimeDeps = rule.KindInfo{ }, MergeableAttrs: map[string]bool{"srcs": true}, ResolveAttrs: map[string]bool{ - "deps": true, + "deps": true, + "plugins": true, }, } @@ -108,6 +110,7 @@ var javaLibraryKind = rule.KindInfo{ ResolveAttrs: map[string]bool{ "deps": true, "exports": true, + "plugins": true, "runtime_deps": true, }, } diff --git a/java/gazelle/testdata/additional_annotation_processor/BUILD.in b/java/gazelle/testdata/additional_annotation_processor/BUILD.in new file mode 100644 index 00000000..18eaef04 --- /dev/null +++ b/java/gazelle/testdata/additional_annotation_processor/BUILD.in @@ -0,0 +1,2 @@ +# gazelle:java_annotation_processor_plugin com.google.auto.value.AutoValue com.google.auto.value.processor.AutoValueProcessor +# gazelle:java_annotation_processor_plugin org.apache.logging.log4j.core.config.plugins.Plugin org.apache.logging.log4j.core.config.plugins.processor.PluginProcessor diff --git a/java/gazelle/testdata/additional_annotation_processor/WORKSPACE b/java/gazelle/testdata/additional_annotation_processor/WORKSPACE new file mode 100644 index 00000000..ea4968a4 --- /dev/null +++ b/java/gazelle/testdata/additional_annotation_processor/WORKSPACE @@ -0,0 +1,39 @@ +load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") + +RULES_JVM_EXTERNAL_TAG = "6.1" + +RULES_JVM_EXTERNAL_SHA = "08ea921df02ffe9924123b0686dc04fd0ff875710bfadb7ad42badb931b0fd50" + +http_archive( + name = "rules_jvm_external", + sha256 = RULES_JVM_EXTERNAL_SHA, + strip_prefix = "rules_jvm_external-%s" % RULES_JVM_EXTERNAL_TAG, + url = "https://github.com/bazelbuild/rules_jvm_external/releases/download/%s/rules_jvm_external-%s.tar.gz" % (RULES_JVM_EXTERNAL_TAG, RULES_JVM_EXTERNAL_TAG), +) + +load("@rules_jvm_external//:repositories.bzl", "rules_jvm_external_deps") + +rules_jvm_external_deps() + +load("@rules_jvm_external//:setup.bzl", "rules_jvm_external_setup") + +rules_jvm_external_setup() + +load("@rules_jvm_external//:defs.bzl", "maven_install") + +maven_install( + name = "maven", + artifacts = [ + "com.google.auto.value:auto-value:1.10.4", + "com.google.auto.value:auto-value-annotations:1.10.4", + "org.apache.logging.log4j:log4j-core:2.23.1", + ], + maven_install_json = "@//:maven_install.json", + repositories = [ + "https://repo1.maven.org/maven2", + ], +) + +load("@maven//:defs.bzl", "pinned_maven_install") + +pinned_maven_install() diff --git a/java/gazelle/testdata/additional_annotation_processor/maven_install.json b/java/gazelle/testdata/additional_annotation_processor/maven_install.json new file mode 100644 index 00000000..3f4c89b5 --- /dev/null +++ b/java/gazelle/testdata/additional_annotation_processor/maven_install.json @@ -0,0 +1,242 @@ +{ + "__AUTOGENERATED_FILE_DO_NOT_MODIFY_THIS_FILE_MANUALLY": "THERE_IS_NO_DATA_ONLY_ZUUL", + "__INPUT_ARTIFACTS_HASH": -925168523, + "__RESOLVED_ARTIFACTS_HASH": -749883653, + "artifacts": { + "com.google.auto.value:auto-value": { + "shasums": { + "jar": "f3c438d1f82904bbcb452084d488b660f3c7488e9274c3a58f049e121632d434" + }, + "version": "1.10.4" + }, + "com.google.auto.value:auto-value-annotations": { + "shasums": { + "jar": "e1c45e6beadaef9797cb0d9afd5a45621ad061cd8632012f85582853a3887825" + }, + "version": "1.10.4" + }, + "org.apache.logging.log4j:log4j-api": { + "shasums": { + "jar": "92ec1fd36ab3bc09de6198d2d7c0914685c0f7127ea931acc32fd2ecdd82ea89" + }, + "version": "2.23.1" + }, + "org.apache.logging.log4j:log4j-core": { + "shasums": { + "jar": "7079368005fc34f56248f57f8a8a53361c3a53e9007d556dbc66fc669df081b5" + }, + "version": "2.23.1" + } + }, + "dependencies": { + "org.apache.logging.log4j:log4j-core": [ + "org.apache.logging.log4j:log4j-api" + ] + }, + "packages": { + "com.google.auto.value:auto-value": [ + "autovalue.shaded.com.google.auto.common", + "autovalue.shaded.com.google.auto.service", + "autovalue.shaded.com.google.common.annotations", + "autovalue.shaded.com.google.common.base", + "autovalue.shaded.com.google.common.cache", + "autovalue.shaded.com.google.common.collect", + "autovalue.shaded.com.google.common.escape", + "autovalue.shaded.com.google.common.eventbus", + "autovalue.shaded.com.google.common.graph", + "autovalue.shaded.com.google.common.hash", + "autovalue.shaded.com.google.common.html", + "autovalue.shaded.com.google.common.io", + "autovalue.shaded.com.google.common.math", + "autovalue.shaded.com.google.common.net", + "autovalue.shaded.com.google.common.primitives", + "autovalue.shaded.com.google.common.reflect", + "autovalue.shaded.com.google.common.util.concurrent", + "autovalue.shaded.com.google.common.xml", + "autovalue.shaded.com.google.errorprone.annotations", + "autovalue.shaded.com.google.errorprone.annotations.concurrent", + "autovalue.shaded.com.google.escapevelocity", + "autovalue.shaded.com.google.j2objc.annotations", + "autovalue.shaded.com.squareup.javapoet", + "autovalue.shaded.kotlin", + "autovalue.shaded.kotlin.annotation", + "autovalue.shaded.kotlin.collections", + "autovalue.shaded.kotlin.collections.builders", + "autovalue.shaded.kotlin.collections.unsigned", + "autovalue.shaded.kotlin.comparisons", + "autovalue.shaded.kotlin.contracts", + "autovalue.shaded.kotlin.coroutines", + "autovalue.shaded.kotlin.coroutines.intrinsics", + "autovalue.shaded.kotlin.coroutines.jvm.internal", + "autovalue.shaded.kotlin.enums", + "autovalue.shaded.kotlin.experimental", + "autovalue.shaded.kotlin.internal", + "autovalue.shaded.kotlin.internal.jdk7", + "autovalue.shaded.kotlin.internal.jdk8", + "autovalue.shaded.kotlin.jvm", + "autovalue.shaded.kotlin.jvm.functions", + "autovalue.shaded.kotlin.jvm.internal", + "autovalue.shaded.kotlin.jvm.internal.markers", + "autovalue.shaded.kotlin.random", + "autovalue.shaded.kotlin.random.jdk8", + "autovalue.shaded.kotlin.ranges", + "autovalue.shaded.kotlin.reflect", + "autovalue.shaded.kotlin.sequences", + "autovalue.shaded.kotlin.text", + "autovalue.shaded.kotlinx.metadata", + "autovalue.shaded.kotlinx.metadata.internal", + "autovalue.shaded.kotlinx.metadata.internal.common", + "autovalue.shaded.kotlinx.metadata.internal.extensions", + "autovalue.shaded.kotlinx.metadata.internal.metadata", + "autovalue.shaded.kotlinx.metadata.internal.metadata.deserialization", + "autovalue.shaded.kotlinx.metadata.internal.metadata.jvm", + "autovalue.shaded.kotlinx.metadata.internal.metadata.jvm.deserialization", + "autovalue.shaded.kotlinx.metadata.internal.metadata.jvm.serialization", + "autovalue.shaded.kotlinx.metadata.internal.metadata.serialization", + "autovalue.shaded.kotlinx.metadata.internal.protobuf", + "autovalue.shaded.kotlinx.metadata.jvm", + "autovalue.shaded.kotlinx.metadata.jvm.internal", + "autovalue.shaded.net.ltgt.gradle.incap", + "autovalue.shaded.org.checkerframework.checker.nullness.qual", + "autovalue.shaded.org.checkerframework.framework.qual", + "autovalue.shaded.org.jetbrains.annotations", + "autovalue.shaded.org.objectweb.asm", + "com.google.auto.value.extension", + "com.google.auto.value.extension.memoized.processor", + "com.google.auto.value.extension.serializable.processor", + "com.google.auto.value.extension.serializable.serializer", + "com.google.auto.value.extension.serializable.serializer.impl", + "com.google.auto.value.extension.serializable.serializer.interfaces", + "com.google.auto.value.extension.serializable.serializer.runtime", + "com.google.auto.value.extension.toprettystring.processor", + "com.google.auto.value.processor" + ], + "com.google.auto.value:auto-value-annotations": [ + "com.google.auto.value", + "com.google.auto.value.extension.memoized", + "com.google.auto.value.extension.serializable", + "com.google.auto.value.extension.toprettystring" + ], + "org.apache.logging.log4j:log4j-api": [ + "org.apache.logging.log4j", + "org.apache.logging.log4j.internal", + "org.apache.logging.log4j.message", + "org.apache.logging.log4j.simple", + "org.apache.logging.log4j.spi", + "org.apache.logging.log4j.status", + "org.apache.logging.log4j.util", + "org.apache.logging.log4j.util.internal" + ], + "org.apache.logging.log4j:log4j-core": [ + "org.apache.logging.log4j.core", + "org.apache.logging.log4j.core.appender", + "org.apache.logging.log4j.core.appender.db", + "org.apache.logging.log4j.core.appender.db.jdbc", + "org.apache.logging.log4j.core.appender.mom", + "org.apache.logging.log4j.core.appender.mom.jeromq", + "org.apache.logging.log4j.core.appender.mom.kafka", + "org.apache.logging.log4j.core.appender.nosql", + "org.apache.logging.log4j.core.appender.rewrite", + "org.apache.logging.log4j.core.appender.rolling", + "org.apache.logging.log4j.core.appender.rolling.action", + "org.apache.logging.log4j.core.appender.routing", + "org.apache.logging.log4j.core.async", + "org.apache.logging.log4j.core.config", + "org.apache.logging.log4j.core.config.arbiters", + "org.apache.logging.log4j.core.config.builder.api", + "org.apache.logging.log4j.core.config.builder.impl", + "org.apache.logging.log4j.core.config.composite", + "org.apache.logging.log4j.core.config.json", + "org.apache.logging.log4j.core.config.plugins", + "org.apache.logging.log4j.core.config.plugins.convert", + "org.apache.logging.log4j.core.config.plugins.processor", + "org.apache.logging.log4j.core.config.plugins.util", + "org.apache.logging.log4j.core.config.plugins.validation", + "org.apache.logging.log4j.core.config.plugins.validation.constraints", + "org.apache.logging.log4j.core.config.plugins.validation.validators", + "org.apache.logging.log4j.core.config.plugins.visitors", + "org.apache.logging.log4j.core.config.properties", + "org.apache.logging.log4j.core.config.status", + "org.apache.logging.log4j.core.config.xml", + "org.apache.logging.log4j.core.config.yaml", + "org.apache.logging.log4j.core.filter", + "org.apache.logging.log4j.core.filter.mutable", + "org.apache.logging.log4j.core.impl", + "org.apache.logging.log4j.core.jackson", + "org.apache.logging.log4j.core.jmx", + "org.apache.logging.log4j.core.layout", + "org.apache.logging.log4j.core.layout.internal", + "org.apache.logging.log4j.core.lookup", + "org.apache.logging.log4j.core.message", + "org.apache.logging.log4j.core.net", + "org.apache.logging.log4j.core.net.ssl", + "org.apache.logging.log4j.core.osgi", + "org.apache.logging.log4j.core.parser", + "org.apache.logging.log4j.core.pattern", + "org.apache.logging.log4j.core.script", + "org.apache.logging.log4j.core.selector", + "org.apache.logging.log4j.core.time", + "org.apache.logging.log4j.core.time.internal", + "org.apache.logging.log4j.core.tools", + "org.apache.logging.log4j.core.tools.picocli", + "org.apache.logging.log4j.core.util", + "org.apache.logging.log4j.core.util.datetime", + "org.apache.logging.log4j.core.util.internal" + ] + }, + "repositories": { + "https://repo1.maven.org/maven2/": [ + "com.google.auto.value:auto-value", + "com.google.auto.value:auto-value-annotations", + "org.apache.logging.log4j:log4j-api", + "org.apache.logging.log4j:log4j-core" + ] + }, + "services": { + "com.google.auto.value:auto-value": { + "autovalue.shaded.kotlinx.metadata.internal.extensions.MetadataExtensions": [ + "autovalue.shaded.kotlinx.metadata.jvm.internal.JvmMetadataExtensions" + ], + "com.google.auto.value.extension.AutoValueExtension": [ + "com.google.auto.value.extension.memoized.processor.MemoizeExtension", + "com.google.auto.value.extension.serializable.processor.SerializableAutoValueExtension", + "com.google.auto.value.extension.toprettystring.processor.ToPrettyStringExtension" + ], + "com.google.auto.value.extension.serializable.serializer.interfaces.SerializerExtension": [ + "com.google.auto.value.extension.serializable.serializer.impl.ImmutableListSerializerExtension", + "com.google.auto.value.extension.serializable.serializer.impl.ImmutableMapSerializerExtension", + "com.google.auto.value.extension.serializable.serializer.impl.OptionalSerializerExtension" + ], + "javax.annotation.processing.Processor": [ + "com.google.auto.value.extension.memoized.processor.MemoizedValidator", + "com.google.auto.value.extension.toprettystring.processor.ToPrettyStringValidator", + "com.google.auto.value.processor.AutoAnnotationProcessor", + "com.google.auto.value.processor.AutoBuilderProcessor", + "com.google.auto.value.processor.AutoOneOfProcessor", + "com.google.auto.value.processor.AutoValueBuilderProcessor", + "com.google.auto.value.processor.AutoValueProcessor" + ] + }, + "org.apache.logging.log4j:log4j-api": { + "org.apache.logging.log4j.util.PropertySource": [ + "org.apache.logging.log4j.util.EnvironmentPropertySource", + "org.apache.logging.log4j.util.SystemPropertiesPropertySource" + ] + }, + "org.apache.logging.log4j:log4j-core": { + "javax.annotation.processing.Processor": [ + "org.apache.logging.log4j.core.config.plugins.processor.PluginProcessor" + ], + "org.apache.logging.log4j.core.util.ContextDataProvider": [ + "org.apache.logging.log4j.core.impl.ThreadContextDataProvider" + ], + "org.apache.logging.log4j.message.ThreadDumpMessage$ThreadInfoFactory": [ + "org.apache.logging.log4j.core.message.ExtendedThreadInfoFactory" + ], + "org.apache.logging.log4j.spi.Provider": [ + "org.apache.logging.log4j.core.impl.Log4jProvider" + ] + } + }, + "version": "2" +} diff --git a/java/gazelle/testdata/additional_annotation_processor/src/main/java/com/example/BUILD.in b/java/gazelle/testdata/additional_annotation_processor/src/main/java/com/example/BUILD.in new file mode 100644 index 00000000..0d61c04e --- /dev/null +++ b/java/gazelle/testdata/additional_annotation_processor/src/main/java/com/example/BUILD.in @@ -0,0 +1,16 @@ +load("@rules_java//java:defs.bzl", "java_binary", "java_library") + +java_library( + name = "example", + srcs = ["Main.java"], + plugins = ["@maven//:com_google_auto_value_auto_value__java_plugin__com_google_auto_value_processor_AutoValueProcessor"], + visibility = ["//:__subpackages__"], + deps = ["@maven//:com_google_auto_value_auto_value_annotations"], +) + +java_binary( + name = "Main", + main_class = "com.example.Main", + visibility = ["//visibility:public"], + runtime_deps = [":example"], +) diff --git a/java/gazelle/testdata/additional_annotation_processor/src/main/java/com/example/BUILD.out b/java/gazelle/testdata/additional_annotation_processor/src/main/java/com/example/BUILD.out new file mode 100644 index 00000000..0fe0a211 --- /dev/null +++ b/java/gazelle/testdata/additional_annotation_processor/src/main/java/com/example/BUILD.out @@ -0,0 +1,25 @@ +load("@rules_java//java:defs.bzl", "java_binary", "java_library") + +java_library( + name = "example", + srcs = [ + "LogProcessor.java", + "Main.java", + ], + plugins = [ + "@maven//:com_google_auto_value_auto_value__java_plugin__com_google_auto_value_processor_AutoValueProcessor", + "@maven//:org_apache_logging_log4j_log4j_core__java_plugin__org_apache_logging_log4j_core_config_plugins_processor_PluginProcessor", + ], + visibility = ["//:__subpackages__"], + deps = [ + "@maven//:com_google_auto_value_auto_value_annotations", + "@maven//:org_apache_logging_log4j_log4j_core", + ], +) + +java_binary( + name = "Main", + main_class = "com.example.Main", + visibility = ["//visibility:public"], + runtime_deps = [":example"], +) diff --git a/java/gazelle/testdata/additional_annotation_processor/src/main/java/com/example/LogProcessor.java b/java/gazelle/testdata/additional_annotation_processor/src/main/java/com/example/LogProcessor.java new file mode 100644 index 00000000..e9f9ad49 --- /dev/null +++ b/java/gazelle/testdata/additional_annotation_processor/src/main/java/com/example/LogProcessor.java @@ -0,0 +1,19 @@ +package com.example; + +import org.apache.logging.log4j.core.LogEvent; +import org.apache.logging.log4j.core.appender.AbstractAppender; +import org.apache.logging.log4j.core.config.plugins.Plugin; +import org.apache.logging.log4j.core.config.plugins.PluginFactory; + +@Plugin(name = "LogProcessor") +public class LogProcessor extends AbstractAppender { + @PluginFactory + public static LogProcessor create() { + return new LogProcessor(); + } + + @Override + public void append(LogEvent event) { + // This is not a very useful log appender, and that's ok. + } +} diff --git a/java/gazelle/testdata/additional_annotation_processor/src/main/java/com/example/Main.java b/java/gazelle/testdata/additional_annotation_processor/src/main/java/com/example/Main.java new file mode 100644 index 00000000..3ea1ad03 --- /dev/null +++ b/java/gazelle/testdata/additional_annotation_processor/src/main/java/com/example/Main.java @@ -0,0 +1,21 @@ +package com.example; + +import com.google.auto.value.AutoValue; + +class Main { + public static void main(String[] args) { + Animal pig = Animal.create("pig", 4); + Animal chicken = Animal.create("chicken", 2); + System.out.printf("Checking if %s has same legs as %s: %s%n", pig, chicken, pig.numberOfLegs() == chicken.numberOfLegs()); + } + + @AutoValue + public abstract static class Animal { + static Animal create(String name, int numberOfLegs) { + return new AutoValue_Main_Animal(name, numberOfLegs); + } + + abstract String name(); + abstract int numberOfLegs(); + } +}