diff --git a/dagger-compiler/main/java/dagger/internal/codegen/binding/ComponentRequirement.java b/dagger-compiler/main/java/dagger/internal/codegen/binding/ComponentRequirement.java index d7cdb1f48b7..146f623a5e0 100644 --- a/dagger-compiler/main/java/dagger/internal/codegen/binding/ComponentRequirement.java +++ b/dagger-compiler/main/java/dagger/internal/codegen/binding/ComponentRequirement.java @@ -21,6 +21,7 @@ import static dagger.internal.codegen.binding.SourceFiles.simpleVariableName; import static dagger.internal.codegen.xprocessing.XElements.getSimpleName; import static dagger.internal.codegen.xprocessing.XElements.hasAnyAnnotation; +import static dagger.internal.codegen.xprocessing.XElements.isPrivate; import static dagger.internal.codegen.xprocessing.XTypeElements.isNested; import static dagger.internal.codegen.xprocessing.XTypes.isDeclared; @@ -254,6 +255,6 @@ private static boolean requiresEnclosingInstance(XTypeElement typeElement) { private static boolean hasVisibleDefaultConstructor(XTypeElement typeElement) { return typeElement.getConstructors().stream() - .anyMatch(constructor -> !constructor.isPrivate() && constructor.getParameters().isEmpty()); + .anyMatch(constructor -> !isPrivate(constructor) && constructor.getParameters().isEmpty()); } } diff --git a/dagger-compiler/main/java/dagger/internal/codegen/validation/BindingMethodValidator.java b/dagger-compiler/main/java/dagger/internal/codegen/validation/BindingMethodValidator.java index d957f1daf38..1acfd5116d3 100644 --- a/dagger-compiler/main/java/dagger/internal/codegen/validation/BindingMethodValidator.java +++ b/dagger-compiler/main/java/dagger/internal/codegen/validation/BindingMethodValidator.java @@ -17,6 +17,7 @@ package dagger.internal.codegen.validation; import static dagger.internal.codegen.xprocessing.XElements.hasAnyAnnotation; +import static dagger.internal.codegen.xprocessing.XElements.isPrivate; import static dagger.internal.codegen.xprocessing.XMethodElements.getEnclosingTypeElement; import static dagger.internal.codegen.xprocessing.XMethodElements.hasTypeParameters; import static dagger.internal.codegen.xprocessing.XTypes.isSubtype; @@ -189,7 +190,7 @@ private void checkTypeParameters() { /** Adds an error if the method is private. */ private void checkNotPrivate() { - if (method.isPrivate()) { + if (isPrivate(method)) { report.addError(bindingMethods("cannot be private")); } } diff --git a/dagger-compiler/main/java/dagger/internal/codegen/validation/ComponentCreatorValidator.java b/dagger-compiler/main/java/dagger/internal/codegen/validation/ComponentCreatorValidator.java index ace1a12cb08..4d688d25c50 100644 --- a/dagger-compiler/main/java/dagger/internal/codegen/validation/ComponentCreatorValidator.java +++ b/dagger-compiler/main/java/dagger/internal/codegen/validation/ComponentCreatorValidator.java @@ -20,6 +20,7 @@ import static com.google.common.collect.Iterables.getOnlyElement; import static dagger.internal.codegen.base.ComponentCreatorAnnotation.getCreatorAnnotations; import static dagger.internal.codegen.base.Util.reentrantComputeIfAbsent; +import static dagger.internal.codegen.xprocessing.XElements.isPrivate; import static dagger.internal.codegen.xprocessing.XMethodElements.hasTypeParameters; import static dagger.internal.codegen.xprocessing.XTypeElements.getAllUnimplementedMethods; import static dagger.internal.codegen.xprocessing.XTypeElements.hasTypeParameters; @@ -197,7 +198,7 @@ private boolean validateTypeRequirements() { report.addError(messages.generics()); isClean = false; } - if (creator.isPrivate()) { + if (isPrivate(creator)) { report.addError(messages.isPrivate()); isClean = false; } diff --git a/dagger-compiler/main/java/dagger/internal/codegen/validation/InjectValidator.java b/dagger-compiler/main/java/dagger/internal/codegen/validation/InjectValidator.java index 6f7837ad5cd..e4c633044a6 100644 --- a/dagger-compiler/main/java/dagger/internal/codegen/validation/InjectValidator.java +++ b/dagger-compiler/main/java/dagger/internal/codegen/validation/InjectValidator.java @@ -25,6 +25,7 @@ import static dagger.internal.codegen.binding.SourceFiles.membersInjectorNameForType; import static dagger.internal.codegen.extension.DaggerStreams.toImmutableList; import static dagger.internal.codegen.xprocessing.XElements.closestEnclosingTypeElement; +import static dagger.internal.codegen.xprocessing.XElements.isPrivate; import static dagger.internal.codegen.xprocessing.XMethodElements.hasTypeParameters; import static dagger.internal.codegen.xprocessing.XTypeElements.isEffectivelyPrivate; import static dagger.internal.codegen.xprocessing.XTypes.isSubtype; @@ -213,7 +214,7 @@ private ValidationReport validateConstructor(XConstructorElement constructorElem "No @Inject or @AssistedInject annotation found: " + constructorElement); } - if (constructorElement.isPrivate()) { + if (isPrivate(constructorElement)) { builder.addError( "Dagger does not support injection into private constructors", constructorElement); } @@ -328,7 +329,7 @@ private ValidationReport validateField(XFieldElement fieldElement) { builder.addError("@Inject fields may not be final", fieldElement); } - if (fieldElement.isPrivate()) { + if (isPrivate(fieldElement)) { builder.addItem( "Dagger does not support injection into private fields", privateMemberDiagnosticKind, @@ -361,7 +362,7 @@ private ValidationReport validateMethod(XMethodElement methodElement) { builder.addError("Methods with @Inject may not be abstract", methodElement); } - if (methodElement.isPrivate()) { + if (isPrivate(methodElement)) { builder.addItem( "Dagger does not support injection into private methods", privateMemberDiagnosticKind, diff --git a/dagger-compiler/main/java/dagger/internal/codegen/validation/ModuleValidator.java b/dagger-compiler/main/java/dagger/internal/codegen/validation/ModuleValidator.java index 9e38f33855c..213e0bbb36c 100644 --- a/dagger-compiler/main/java/dagger/internal/codegen/validation/ModuleValidator.java +++ b/dagger-compiler/main/java/dagger/internal/codegen/validation/ModuleValidator.java @@ -31,6 +31,7 @@ import static dagger.internal.codegen.xprocessing.XAnnotations.getClassName; import static dagger.internal.codegen.xprocessing.XElements.getSimpleName; import static dagger.internal.codegen.xprocessing.XElements.hasAnyAnnotation; +import static dagger.internal.codegen.xprocessing.XElements.isPrivate; import static dagger.internal.codegen.xprocessing.XTypeElements.hasTypeParameters; import static dagger.internal.codegen.xprocessing.XTypeElements.isEffectivelyPrivate; import static dagger.internal.codegen.xprocessing.XTypeElements.isEffectivelyPublic; @@ -538,7 +539,7 @@ private void validateBindingMethodOverrides( private void validateModuleVisibility( XTypeElement moduleElement, ModuleKind moduleKind, ValidationReport.Builder reportBuilder) { - if (moduleElement.isPrivate() || moduleElement.isKtPrivate()) { + if (isPrivate(moduleElement)) { reportBuilder.addError("Modules cannot be private.", moduleElement); } else if (isEffectivelyPrivate(moduleElement)) { reportBuilder.addError("Modules cannot be enclosed in private types.", moduleElement); diff --git a/dagger-compiler/main/java/dagger/internal/codegen/xprocessing/XElements.java b/dagger-compiler/main/java/dagger/internal/codegen/xprocessing/XElements.java index cd9b20f96d6..36608a27e6b 100644 --- a/dagger-compiler/main/java/dagger/internal/codegen/xprocessing/XElements.java +++ b/dagger-compiler/main/java/dagger/internal/codegen/xprocessing/XElements.java @@ -179,7 +179,8 @@ public static boolean isPublic(XElement element) { } public static boolean isPrivate(XElement element) { - return asHasModifiers(element).isPrivate(); + XHasModifiers modifiers = asHasModifiers(element); + return modifiers.isPrivate() || modifiers.isKtPrivate(); } public static boolean isInternal(XElement element) { diff --git a/dagger-compiler/main/java/dagger/internal/codegen/xprocessing/XTypeElements.java b/dagger-compiler/main/java/dagger/internal/codegen/xprocessing/XTypeElements.java index 027e724c8df..e274cf38d39 100644 --- a/dagger-compiler/main/java/dagger/internal/codegen/xprocessing/XTypeElements.java +++ b/dagger-compiler/main/java/dagger/internal/codegen/xprocessing/XTypeElements.java @@ -20,6 +20,7 @@ import static com.google.common.base.Preconditions.checkState; import static com.google.common.collect.Iterables.getOnlyElement; import static dagger.internal.codegen.extension.DaggerStreams.toImmutableList; +import static dagger.internal.codegen.xprocessing.XElements.isPrivate; import static java.util.stream.Collectors.joining; import static kotlin.streams.jdk8.StreamsKt.asStream; @@ -50,7 +51,7 @@ private enum Visibility { /** Returns the visibility of the given {@link XTypeElement}. */ private static Visibility of(XTypeElement element) { checkNotNull(element); - if (element.isPrivate()) { + if (isPrivate(element)) { return Visibility.PRIVATE; } else if (element.isPublic()) { return Visibility.PUBLIC; @@ -88,7 +89,7 @@ public static ImmutableList getAllUnimplementedMethods(XTypeElem /** Returns all non-private, non-static methods in {@code type}. */ public static ImmutableList getAllNonPrivateInstanceMethods(XTypeElement type) { return getAllMethods(type).stream() - .filter(method -> !method.isPrivate() && !method.isStatic()) + .filter(method -> !isPrivate(method) && !method.isStatic()) .collect(toImmutableList()); } @@ -110,7 +111,7 @@ private static boolean isAccessibleFrom(XMethodElement method, XTypeElement type if (method.isPublic() || method.isProtected()) { return true; } - if (method.isPrivate()) { + if (isPrivate(method)) { return false; } return method diff --git a/javatests/dagger/internal/codegen/PrivateTopLevelClassTest.java b/javatests/dagger/internal/codegen/PrivateTopLevelClassTest.java index 1b22487ac39..372a2ab95d4 100644 --- a/javatests/dagger/internal/codegen/PrivateTopLevelClassTest.java +++ b/javatests/dagger/internal/codegen/PrivateTopLevelClassTest.java @@ -60,25 +60,16 @@ public void testPrivateKotlinClass() { .withProcessingOptions(compilerMode.processorOptions()) .compile( subject -> { - switch (CompilerTests.backend(subject)) { - case JAVAC: - // TODO: b/539661501 - This should fail once this bug is fixed. - subject.hasErrorCount(0); - break; - case KSP: - subject.hasErrorCount(2); - subject - .hasErrorContaining("Dagger does not support injection into private classes") - .onSource(src) - .onLineContaining("private class Foo"); - subject - .hasErrorContaining( - "Foo cannot be provided without an @Inject constructor or an" - + " @Provides-annotated method") - .onSource(src) - .onLineContaining("interface TestComponent"); - break; - } + subject.hasErrorCount(2); + subject + .hasErrorContaining("Dagger does not support injection into private classes") + .onSource(src) + .onLineContaining("private class Foo"); + subject + .hasErrorContaining( + "Foo cannot be provided without an @Inject constructor or an" + + " @Provides-annotated method") + .onSource(src); }); } }