diff --git a/tools/processors/immutability/src/android/processor/immutability/ImmutabilityProcessor.kt b/tools/processors/immutability/src/android/processor/immutability/ImmutabilityProcessor.kt index dfebdccf1d637..f29d9b2a6e81a 100644 --- a/tools/processors/immutability/src/android/processor/immutability/ImmutabilityProcessor.kt +++ b/tools/processors/immutability/src/android/processor/immutability/ImmutabilityProcessor.kt @@ -323,8 +323,15 @@ class ImmutabilityProcessor : AbstractProcessor() { parentPolicyExceptions: Set, nonInterfaceClassFailure: () -> String = { MessageUtils.nonInterfaceReturnFailure() }, ): Boolean { + // Skip if the symbol being considered is itself ignored if (isIgnored(symbol)) return false + + // Skip if the type being checked, like for a typeArg or return type, is ignored if (isIgnored(type)) return false + + // Skip if that typeArg is itself ignored when inspected at the class header level + if (isIgnored(type.asElement())) return false + if (type.isPrimitive) return false if (type.isPrimitiveOrVoid) { printError(parentChain, symbol, MessageUtils.voidReturnFailure()) @@ -355,6 +362,8 @@ class ImmutabilityProcessor : AbstractProcessor() { var anyError = false type.typeArguments.forEachIndexed { index, typeArg -> + if (isIgnored(typeArg.asElement())) return@forEachIndexed + val argError = visitType(parentChain, seenTypesByPolicy, symbol, typeArg, newPolicyExceptions) { MessageUtils.nonInterfaceReturnFailure( diff --git a/tools/processors/immutability/test/android/processor/ImmutabilityProcessorTest.kt b/tools/processors/immutability/test/android/processor/ImmutabilityProcessorTest.kt index 2f7d59a7f0e58..43caa456a0931 100644 --- a/tools/processors/immutability/test/android/processor/ImmutabilityProcessorTest.kt +++ b/tools/processors/immutability/test/android/processor/ImmutabilityProcessorTest.kt @@ -287,6 +287,42 @@ class ImmutabilityProcessorTest { ) } + @Test + fun ignoredClass() = test( + JavaFileObjects.forSourceString( + "$PACKAGE_PREFIX.$DATA_CLASS_NAME", + /* language=JAVA */ """ + package $PACKAGE_PREFIX; + + import java.util.List; + import java.util.Map; + + @Immutable + public interface $DATA_CLASS_NAME { + IgnoredClass getInnerClassOne(); + NotIgnoredClass getInnerClassTwo(); + Map getInnerClassThree(); + Map getInnerClassFour(); + + @Immutable.Ignore + final class IgnoredClass { + public String innerField; + } + + final class NotIgnoredClass { + public String innerField; + } + } + """.trimIndent() + ), errors = listOf( + nonInterfaceReturnFailure(line = 9), + nonInterfaceReturnFailure(line = 11, prefix = "Value NotIgnoredClass"), + classNotImmutableFailure(line = 18, className = "NotIgnoredClass"), + nonInterfaceClassFailure(line = 18), + memberNotMethodFailure(line = 19), + ) + ) + private fun test( source: JavaFileObject, errors: List,