From 0522583602b6e272c733a345bb89b5591ec8a33e Mon Sep 17 00:00:00 2001 From: Ivan Gavrilovic Date: Fri, 27 Nov 2020 11:22:33 +0000 Subject: [PATCH] Incremental KAPT: add test for isolating AP with classpath origin Add a regression test for KT-34340 that allows APs to have classpath types as origins. --- .../KaptIncrementalWithAggregatingApt.kt | 1 - .../gradle/KaptIncrementalWithIsolatingApt.kt | 40 +++++++++++++++---- .../baseLibrary/build.gradle | 29 ++++++++++++++ .../baseLibrary/src/main/AndroidManifest.xml | 5 +++ .../lib2/basemodule/BaseClassParcel.java | 8 ++++ .../lib2/basemodule/FieldClassParcel.java | 7 ++++ .../kaptIncrementalWithParceler/build.gradle | 20 ++++++++++ .../mylibrary/build.gradle | 30 ++++++++++++++ .../mylibrary/src/main/AndroidManifest.xml | 5 +++ .../java/com/example/lib/ExampleParcel.java | 31 ++++++++++++++ .../settings.gradle | 3 ++ 11 files changed, 171 insertions(+), 8 deletions(-) create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kaptIncrementalWithParceler/baseLibrary/build.gradle create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kaptIncrementalWithParceler/baseLibrary/src/main/AndroidManifest.xml create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kaptIncrementalWithParceler/baseLibrary/src/main/java/com/example/lib2/basemodule/BaseClassParcel.java create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kaptIncrementalWithParceler/baseLibrary/src/main/java/com/example/lib2/basemodule/FieldClassParcel.java create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kaptIncrementalWithParceler/build.gradle create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kaptIncrementalWithParceler/mylibrary/build.gradle create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kaptIncrementalWithParceler/mylibrary/src/main/AndroidManifest.xml create mode 100755 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kaptIncrementalWithParceler/mylibrary/src/main/java/com/example/lib/ExampleParcel.java create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kaptIncrementalWithParceler/settings.gradle diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/KaptIncrementalWithAggregatingApt.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/KaptIncrementalWithAggregatingApt.kt index 156d4ac1650..632bf06045d 100644 --- a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/KaptIncrementalWithAggregatingApt.kt +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/KaptIncrementalWithAggregatingApt.kt @@ -27,7 +27,6 @@ class KaptIncrementalWithAggregatingApt : KaptIncrementalIT() { override fun defaultBuildOptions(): BuildOptions = super.defaultBuildOptions().copy( incremental = true, - debug=false, kaptOptions = KaptOptions( verbose = true, useWorkers = true, diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/KaptIncrementalWithIsolatingApt.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/KaptIncrementalWithIsolatingApt.kt index 4ef3d4bd631..b5213788956 100644 --- a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/KaptIncrementalWithIsolatingApt.kt +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/KaptIncrementalWithIsolatingApt.kt @@ -7,13 +7,11 @@ package org.jetbrains.kotlin.gradle import org.jetbrains.kotlin.gradle.incapt.IncrementalProcessor import org.jetbrains.kotlin.gradle.incapt.IncrementalProcessorReferencingClasspath +import org.jetbrains.kotlin.gradle.util.AGPVersion import org.jetbrains.kotlin.gradle.util.modify import org.junit.Assert.assertEquals import org.junit.Assume import org.junit.Test -import org.objectweb.asm.ClassWriter -import org.objectweb.asm.Opcodes -import org.objectweb.asm.Type import test.kt33617.MyClass import java.io.File import java.util.zip.ZipEntry @@ -229,7 +227,7 @@ class KaptIncrementalWithIsolatingApt : KaptIncrementalIT() { } """.trimIndent() ) - project.build("clean", "kaptKotlin") { + project.build("clean", "build") { assertSuccessful() } @@ -249,13 +247,41 @@ class KaptIncrementalWithIsolatingApt : KaptIncrementalIT() { ) } } + + /** Regression test for KT-34340. */ + @Test + fun testIsolatingWithOriginsInClasspath() { + val project = Project("kaptIncrementalWithParceler", GradleVersionRequired.None).apply { + setupWorkingDir() + } + val options = defaultBuildOptions().copy(androidGradlePluginVersion = AGPVersion.v3_4_1) + project.build("clean", ":mylibrary:assembleDebug", options = options) { + assertSuccessful() + } + + project.projectFile("BaseClassParcel.java").modify { current -> + current.replace("protected FieldClassParcel", "private FieldClassParcel") + } + + project.build(":mylibrary:assembleDebug", options = options) { + assertSuccessful() + assertEquals( + setOf( + fileInWorkingDir("mylibrary/src/main/java/com/example/lib/ExampleParcel.java").canonicalPath, + fileInWorkingDir("baseLibrary/src/main/java/com/example/lib2/basemodule/BaseClassParcel.java").canonicalPath, + ), + getProcessedSources(output) + ) + } + } } private const val patternApt = "Processing java sources with annotation processors:" fun getProcessedSources(output: String): Set { - val logging = output.lines().single { it.contains(patternApt) } - val indexOf = logging.indexOf(patternApt) + patternApt.length - return logging.drop(indexOf).split(",").map { it.trim() }.filter { !it.isEmpty() }.toSet() + return output.lines().filter { it.contains(patternApt) }.flatMapTo(HashSet()) { logging -> + val indexOf = logging.indexOf(patternApt) + patternApt.length + logging.drop(indexOf).split(",").map { it.trim() }.filter { !it.isEmpty() }.toSet() + } } fun BaseGradleIT.Project.setupIncrementalAptProject( diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kaptIncrementalWithParceler/baseLibrary/build.gradle b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kaptIncrementalWithParceler/baseLibrary/build.gradle new file mode 100644 index 00000000000..de1826342f2 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kaptIncrementalWithParceler/baseLibrary/build.gradle @@ -0,0 +1,29 @@ +plugins { + id 'com.android.library' + id 'kotlin-android' + id 'kotlin-kapt' +} + +android { + compileSdkVersion 30 + + defaultConfig { + minSdkVersion 16 + targetSdkVersion 30 + versionCode 1 + versionName "1.0" + + testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" + consumerProguardFiles "consumer-rules.pro" + } + + compileOptions { + sourceCompatibility JavaVersion.VERSION_1_8 + targetCompatibility JavaVersion.VERSION_1_8 + } +} + +dependencies { + kapt 'org.parceler:parceler:1.1.12' + implementation 'org.parceler:parceler-api:1.1.12' +} \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kaptIncrementalWithParceler/baseLibrary/src/main/AndroidManifest.xml b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kaptIncrementalWithParceler/baseLibrary/src/main/AndroidManifest.xml new file mode 100644 index 00000000000..55745af377f --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kaptIncrementalWithParceler/baseLibrary/src/main/AndroidManifest.xml @@ -0,0 +1,5 @@ + + + + \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kaptIncrementalWithParceler/baseLibrary/src/main/java/com/example/lib2/basemodule/BaseClassParcel.java b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kaptIncrementalWithParceler/baseLibrary/src/main/java/com/example/lib2/basemodule/BaseClassParcel.java new file mode 100644 index 00000000000..7cc85c4f82b --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kaptIncrementalWithParceler/baseLibrary/src/main/java/com/example/lib2/basemodule/BaseClassParcel.java @@ -0,0 +1,8 @@ +package com.example.lib2.basemodule; + +import org.parceler.Parcel; + +@Parcel +public class BaseClassParcel { + protected FieldClassParcel testField; +} diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kaptIncrementalWithParceler/baseLibrary/src/main/java/com/example/lib2/basemodule/FieldClassParcel.java b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kaptIncrementalWithParceler/baseLibrary/src/main/java/com/example/lib2/basemodule/FieldClassParcel.java new file mode 100644 index 00000000000..b06171ef3c4 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kaptIncrementalWithParceler/baseLibrary/src/main/java/com/example/lib2/basemodule/FieldClassParcel.java @@ -0,0 +1,7 @@ +package com.example.lib2.basemodule; + +import org.parceler.Parcel; + +@Parcel +public class FieldClassParcel { +} diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kaptIncrementalWithParceler/build.gradle b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kaptIncrementalWithParceler/build.gradle new file mode 100644 index 00000000000..a5eb46aae03 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kaptIncrementalWithParceler/build.gradle @@ -0,0 +1,20 @@ +// Top-level build file where you can add configuration options common to all sub-projects/modules. +buildscript { + repositories { + mavenLocal() + maven { url 'https://maven.google.com' } + jcenter() + } + dependencies { + classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" + classpath "com.android.tools.build:gradle:$android_tools_version" + } +} + +allprojects { + repositories { + mavenLocal() + maven { url 'https://maven.google.com' } + jcenter() + } +} \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kaptIncrementalWithParceler/mylibrary/build.gradle b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kaptIncrementalWithParceler/mylibrary/build.gradle new file mode 100644 index 00000000000..af869d82f01 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kaptIncrementalWithParceler/mylibrary/build.gradle @@ -0,0 +1,30 @@ +plugins { + id 'com.android.library' + id 'kotlin-android' + id 'kotlin-kapt' +} + +android { + compileSdkVersion 30 + + defaultConfig { + minSdkVersion 16 + targetSdkVersion 30 + versionCode 1 + versionName "1.0" + + testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" + consumerProguardFiles "consumer-rules.pro" + } + + compileOptions { + sourceCompatibility JavaVersion.VERSION_1_8 + targetCompatibility JavaVersion.VERSION_1_8 + } +} + +dependencies { + kapt 'org.parceler:parceler:1.1.12' + implementation 'org.parceler:parceler-api:1.1.12' + implementation project(":baseLibrary") +} \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kaptIncrementalWithParceler/mylibrary/src/main/AndroidManifest.xml b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kaptIncrementalWithParceler/mylibrary/src/main/AndroidManifest.xml new file mode 100644 index 00000000000..ed91afc87d1 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kaptIncrementalWithParceler/mylibrary/src/main/AndroidManifest.xml @@ -0,0 +1,5 @@ + + + + \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kaptIncrementalWithParceler/mylibrary/src/main/java/com/example/lib/ExampleParcel.java b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kaptIncrementalWithParceler/mylibrary/src/main/java/com/example/lib/ExampleParcel.java new file mode 100755 index 00000000000..b24f28ed940 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kaptIncrementalWithParceler/mylibrary/src/main/java/com/example/lib/ExampleParcel.java @@ -0,0 +1,31 @@ +// Sample project obtained from https://youtrack.jetbrains.com/issue/KT-34340, +// originally obtained from https://github.com/johncarl81/parceler. +package com.example.lib; + + +import com.example.lib2.basemodule.BaseClassParcel; + +import org.parceler.Parcel; +import org.parceler.ParcelFactory; + +/** + * Intentionally in a different package to make sure we don't accidentally match it with org.parceler Proguard matchers. + */ +@Parcel +public class ExampleParcel extends BaseClassParcel { + + private final String message; + + @ParcelFactory + public static ExampleParcel create(String message) { + return new ExampleParcel(message); + } + + public ExampleParcel(String message) { + this.message = message; + } + + public String getMessage(){ + return message; + } +} \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kaptIncrementalWithParceler/settings.gradle b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kaptIncrementalWithParceler/settings.gradle new file mode 100644 index 00000000000..ce68b0e9dc5 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kaptIncrementalWithParceler/settings.gradle @@ -0,0 +1,3 @@ +rootProject.name = "PrarclerIncapKapt" +include ':mylibrary' +include ':baseLibrary'