Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 14 additions & 4 deletions java/gazelle/configure.go
Original file line number Diff line number Diff line change
Expand Up @@ -71,6 +71,7 @@ func (jc *Configurer) KnownDirectives() []string {
javaconfig.JavaResolveToJavaExports,
javaconfig.JavaSourcesetRoot,
javaconfig.JavaStripResourcesPrefix,
javaconfig.JavaGenerateBinary,
}
}

Expand All @@ -83,6 +84,8 @@ func (jc *Configurer) initRootConfig(c *config.Config) javaconfig.Configs {
return c.Exts[languageName].(javaconfig.Configs)
}

const binaryConfigError string = "invalid value for directive %q: %s: possible values are true/false"

func (jc *Configurer) Configure(c *config.Config, rel string, f *rule.File) {
cfgs := jc.initRootConfig(c)
cfg, exists := cfgs[rel]
Expand Down Expand Up @@ -178,8 +181,16 @@ func (jc *Configurer) Configure(c *config.Config, rel string, f *rule.File) {
case "false":
cfg.SetGenerateProto(false)
default:
jc.lang.logger.Fatal().Msgf("invalid value for directive %q: %s: possible values are true/false",
javaconfig.JavaGenerateProto, d.Value)
jc.lang.logger.Fatal().Msgf(binaryConfigError, javaconfig.JavaGenerateProto, d.Value)
}
case javaconfig.JavaGenerateBinary:
switch d.Value {
case "true":
cfg.SetGenerateBinary(true)
case "false":
cfg.SetGenerateBinary(false)
default:
jc.lang.logger.Fatal().Msgf(binaryConfigError, javaconfig.JavaGenerateBinary, d.Value)
}
case javaconfig.JavaAnnotationProcessorPlugin:
// Format: # gazelle:java_annotation_processor_plugin com.example.AnnotationName com.example.AnnotationProcessorImpl
Expand Down Expand Up @@ -214,8 +225,7 @@ func (jc *Configurer) Configure(c *config.Config, rel string, f *rule.File) {
case "false":
cfg.SetResolveToJavaExports(false)
default:
jc.lang.logger.Fatal().Msgf("invalid value for directive %q: %s: possible values are true/false",
javaconfig.JavaResolveToJavaExports, d.Value)
jc.lang.logger.Fatal().Msgf(binaryConfigError, javaconfig.JavaResolveToJavaExports, d.Value)
}

case javaconfig.JavaSourcesetRoot:
Expand Down
38 changes: 22 additions & 16 deletions java/gazelle/generate.go
Original file line number Diff line number Diff line change
Expand Up @@ -308,22 +308,8 @@ func (l javaLang) GenerateRules(args language.GenerateArgs) language.GenerateRes
l.generateJavaLibrary(args.File, args.Rel, filepath.Base(args.Rel), productionJavaFiles.SortedSlice(), resourcesDirectRef, resourcesRuntimeDep, allPackageNames, nonLocalProductionJavaImports, nonLocalJavaExports, annotationProcessorClasses, false, javaLibraryKind, &res, cfg, args.Config.RepoName)
}

var testHelperJavaClasses *sorted_set.SortedSet[types.ClassName]
for _, m := range allMains.SortedSlice() {
// Lazily populate because java_binaries are pretty rare
if testHelperJavaClasses == nil {
testHelperJavaClasses = sorted_set.NewSortedSetFn[types.ClassName]([]types.ClassName{}, types.ClassNameLess)
for _, testHelperJavaFile := range testHelperJavaFiles.SortedSlice() {
testHelperJavaClasses.Add(*testHelperJavaFile.ClassName())
}
}
isTestOnly := false
libName := filepath.Base(args.Rel)
if testHelperJavaClasses.Contains(m) {
isTestOnly = true
libName = testHelperLibname(libName)
}
l.generateJavaBinary(args.File, m, libName, isTestOnly, &res)
if cfg.GenerateBinary() {
l.processJavaBinary(args.File, args.Rel, allMains, testHelperJavaFiles, &res)
}

// We add special packages to point to testonly libraries which - this accumulates them,
Expand Down Expand Up @@ -636,6 +622,26 @@ func (l javaLang) generateJavaLibrary(file *rule.File, pathToPackageRelativeToBa
}
}

func (l javaLang) processJavaBinary(file *rule.File, rel string, allMains *sorted_set.SortedSet[types.ClassName], testHelperJavaFiles *sorted_set.SortedSet[javaFile], res *language.GenerateResult) {
var testHelperJavaClasses *sorted_set.SortedSet[types.ClassName]
for _, m := range allMains.SortedSlice() {
// Lazily populate because java_binaries are pretty rare
if testHelperJavaClasses == nil {
testHelperJavaClasses = sorted_set.NewSortedSetFn[types.ClassName]([]types.ClassName{}, types.ClassNameLess)
for _, testHelperJavaFile := range testHelperJavaFiles.SortedSlice() {
testHelperJavaClasses.Add(*testHelperJavaFile.ClassName())
}
}
isTestOnly := false
libName := filepath.Base(rel)
if testHelperJavaClasses.Contains(m) {
isTestOnly = true
libName = testHelperLibname(libName)
}
l.generateJavaBinary(file, m, libName, isTestOnly, res)
}
}

func (l javaLang) generateJavaBinary(file *rule.File, m types.ClassName, libName string, testonly bool, res *language.GenerateResult) {
const ruleKind = "java_binary"
name := m.BareOuterClassName()
Expand Down
15 changes: 15 additions & 0 deletions java/gazelle/javaconfig/config.go
Original file line number Diff line number Diff line change
Expand Up @@ -70,6 +70,10 @@ const (
// This is a direct way to specify the resource_strip_prefix for all resources in a directory.
// Example: # gazelle:java_strip_resources_prefix my/data/config
JavaStripResourcesPrefix = "java_strip_resources_prefix"

//JavaGenerateBinary tells the code generator to generate the `java_binary` rules
// Can be either "true" or "false". Defaults to "true"
JavaGenerateBinary = "java_generate_binary"
)

// Configs is an extension of map[string]*Config. It provides finding methods
Expand All @@ -92,6 +96,7 @@ func (c *Config) NewChild() *Config {
extensionEnabled: c.extensionEnabled,
isModuleRoot: false,
generateProto: true,
generateBinary: c.generateBinary,
resolveToJavaExports: c.resolveToJavaExports,
mavenInstallFile: c.mavenInstallFile,
moduleGranularity: c.moduleGranularity,
Expand Down Expand Up @@ -123,6 +128,7 @@ type Config struct {
extensionEnabled bool
isModuleRoot bool
generateProto bool
generateBinary bool
resolveToJavaExports *types.LateInit[bool]
mavenInstallFile string
moduleGranularity string
Expand All @@ -149,6 +155,7 @@ func New(repoRoot string) *Config {
extensionEnabled: true,
isModuleRoot: false,
generateProto: true,
generateBinary: true,
resolveToJavaExports: types.NewLateInit[bool](true),
mavenInstallFile: "maven_install.json",
moduleGranularity: "package",
Expand Down Expand Up @@ -187,6 +194,14 @@ func (c *Config) SetGenerateProto(generate bool) {
c.generateProto = generate
}

func (c *Config) GenerateBinary() bool {
return c.generateBinary
}

func (c *Config) SetGenerateBinary(generate bool) {
c.generateBinary = generate
}

func (c *Config) MavenRepositoryName() string {
return c.mavenRepositoryName
}
Expand Down
Empty file.
1 change: 1 addition & 0 deletions java/gazelle/testdata/bin_disable_bin/maven_install.json
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
{"version": "2"}
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
# gazelle:java_generate_binary false
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
load("@rules_java//java:defs.bzl", "java_library")

# gazelle:java_generate_binary false

java_library(
name = "hello",
srcs = ["Hello.java"],
visibility = ["//:__subpackages__"],
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package gazelle.testdata.bin_disable_bin.src.main.java.com.example.hello;

public class Hello {
public static void main(String[] args) {
System.out.println("Hello, World!");
}
}
2 changes: 2 additions & 0 deletions java/gazelle/testdata/bin_in_test_disable_bin/BUILD.in
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
# gazelle:resolve java org.junit @maven//:junit_junit
# gazelle:java_generate_binary false
2 changes: 2 additions & 0 deletions java/gazelle/testdata/bin_in_test_disable_bin/BUILD.out
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
# gazelle:resolve java org.junit @maven//:junit_junit
# gazelle:java_generate_binary false
Empty file.
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
{"version": "2"}
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
load("@contrib_rules_jvm//java:defs.bzl", "java_test_suite")

java_test_suite(
name = "test",
srcs = [
"SomeOtherTest.java",
"SomeTestBinary.java",
],
deps = ["@maven//:junit_junit"],
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package gazelle.testdata.bin_in_test_disable_bin.src.test.java.com.example.test;

import org.junit.Test;

public class SomeOtherTest {
@Test
public void testPasses() {}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package gazelle.testdata.bin_in_test_disable_bin.src.test.java.com.example.test;

public class SomeTestBinary {
public static void main(String[] args) {
System.out.println("Test passed!");
}
}
Loading