Implement Kotlin configurator for GSK

#KT-14965 Fixed
This commit is contained in:
Vyacheslav Gerasimov
2017-05-31 14:30:04 +03:00
parent 2116877991
commit 2ec1a4311a
32 changed files with 1266 additions and 337 deletions
@@ -14,79 +14,70 @@
* limitations under the License.
*/
package org.jetbrains.kotlin.android.configure;
package org.jetbrains.kotlin.android.configure
import com.intellij.openapi.module.Module;
import com.intellij.openapi.projectRoots.JavaSdk;
import com.intellij.openapi.projectRoots.JavaSdkVersion;
import com.intellij.openapi.projectRoots.Sdk;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.kotlin.idea.KotlinPluginUtil;
import org.jetbrains.kotlin.idea.configuration.KotlinWithGradleConfigurator;
import org.jetbrains.kotlin.idea.versions.KotlinRuntimeLibraryUtilKt;
import org.jetbrains.kotlin.resolve.TargetPlatform;
import org.jetbrains.kotlin.resolve.jvm.platform.JvmPlatform;
import org.jetbrains.plugins.groovy.lang.psi.GroovyFile;
import com.intellij.openapi.module.Module
import com.intellij.openapi.projectRoots.JavaSdk
import com.intellij.openapi.projectRoots.JavaSdkVersion
import com.intellij.openapi.projectRoots.Sdk
import com.intellij.psi.PsiFile
import org.jetbrains.kotlin.idea.KotlinPluginUtil
import org.jetbrains.kotlin.idea.configuration.KotlinWithGradleConfigurator
import org.jetbrains.kotlin.idea.versions.*
import org.jetbrains.kotlin.psi.KtFile
import org.jetbrains.kotlin.resolve.TargetPlatform
import org.jetbrains.kotlin.resolve.jvm.platform.JvmPlatform
import org.jetbrains.plugins.groovy.lang.psi.GroovyFile
public class KotlinAndroidGradleModuleConfigurator extends KotlinWithGradleConfigurator {
public static final String NAME = "android-gradle";
class KotlinAndroidGradleModuleConfigurator internal constructor() : KotlinWithGradleConfigurator() {
private static final String APPLY_KOTLIN_ANDROID = "apply plugin: 'kotlin-android'";
override val name: String = NAME
@NotNull
@Override
public String getName() {
return NAME;
}
override val targetPlatform: TargetPlatform = JvmPlatform
@NotNull
@Override
public TargetPlatform getTargetPlatform() {
return JvmPlatform.INSTANCE;
}
override val presentableText: String = "Android with Gradle"
@NotNull
@Override
public String getPresentableText() {
return "Android with Gradle";
}
public override fun isApplicable(module: Module): Boolean = KotlinPluginUtil.isAndroidGradleModule(module)
@Override
public boolean isApplicable(@NotNull Module module) {
return KotlinPluginUtil.isAndroidGradleModule(module);
}
override val kotlinPluginName: String = KOTLIN_ANDROID
@Override
protected String getApplyPluginDirective() {
return APPLY_KOTLIN_ANDROID;
}
@Override
protected boolean addElementsToFile(@NotNull GroovyFile groovyFile, boolean isTopLevelProjectFile, @NotNull String version) {
if (isTopLevelProjectFile) {
return Companion.addElementsToProjectFile(groovyFile, version);
}
else {
return addElementsToModuleFile(groovyFile, version);
}
}
@NotNull
@Override
public String getRuntimeLibrary(@Nullable Sdk sdk, @NotNull String version) {
if (sdk != null && KotlinRuntimeLibraryUtilKt.hasJreSpecificRuntime(version)) {
JavaSdkVersion sdkVersion = JavaSdk.getInstance().getVersion(sdk);
if (sdkVersion != null && sdkVersion.isAtLeast(JavaSdkVersion.JDK_1_8)) {
// Android dex can't convert our kotlin-stdlib-jre8 artifact, so use jre7 instead (KT-16530)
return KotlinWithGradleConfigurator.Companion.getDependencySnippet(
KotlinRuntimeLibraryUtilKt.getMAVEN_STDLIB_ID_JRE7());
override fun addElementsToFile(file: PsiFile, isTopLevelProjectFile: Boolean, version: String): Boolean {
if (file is GroovyFile) {
if (isTopLevelProjectFile) {
return addElementsToProjectGroovyFile(file, version)
}
else {
return addElementsToModuleGroovyFile(file, version)
}
}
return super.getRuntimeLibrary(sdk, version);
if (file is KtFile) {
if (isTopLevelProjectFile) {
return addElementsToProjectGSKFile(file, version)
}
else {
return addElementsToModuleGSKFile(file, version)
}
}
return false
}
KotlinAndroidGradleModuleConfigurator() {
override fun getStdlibArtifactName(sdk: Sdk?, version: String): String {
if (sdk != null && hasJreSpecificRuntime(version)) {
val sdkVersion = JavaSdk.getInstance().getVersion(sdk)
if (sdkVersion != null && sdkVersion.isAtLeast(JavaSdkVersion.JDK_1_8)) {
// Android dex can't convert our kotlin-stdlib-jre8 artifact, so use jre7 instead (KT-16530)
return MAVEN_STDLIB_ID_JRE7
}
}
return super.getStdlibArtifactName(sdk, version)
}
companion object {
private val NAME = "android-gradle"
private val KOTLIN_ANDROID = "kotlin-android"
}
}
@@ -28,139 +28,163 @@ import java.util.regex.Pattern;
/** This class is generated by {@link org.jetbrains.kotlin.generators.tests.TestsPackage}. DO NOT MODIFY MANUALLY */
@SuppressWarnings("all")
@TestMetadata("idea/testData/configuration/android-gradle")
@TestDataPath("$PROJECT_ROOT")
@RunWith(JUnit3RunnerWithInners.class)
public class ConfigureProjectTestGenerated extends AbstractConfigureProjectTest {
public void testAllFilesPresentInAndroid_gradle() throws Exception {
KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("idea/testData/configuration/android-gradle"), Pattern.compile("(\\w+)_before\\.gradle$"), TargetBackend.ANY, true);
}
@TestMetadata("androidStudioDefault_before.gradle")
public void testAndroidStudioDefault() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/configuration/android-gradle/androidStudioDefault_before.gradle");
doTestAndroidGradle(fileName);
}
@TestMetadata("androidStudioDefaultShapshot_before.gradle")
public void testAndroidStudioDefaultShapshot() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/configuration/android-gradle/androidStudioDefaultShapshot_before.gradle");
doTestAndroidGradle(fileName);
}
@TestMetadata("buildConfigs_before.gradle")
public void testBuildConfigs() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/configuration/android-gradle/buildConfigs_before.gradle");
doTestAndroidGradle(fileName);
}
@TestMetadata("emptyDependencyList_before.gradle")
public void testEmptyDependencyList() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/configuration/android-gradle/emptyDependencyList_before.gradle");
doTestAndroidGradle(fileName);
}
@TestMetadata("emptyFile_before.gradle")
public void testEmptyFile() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/configuration/android-gradle/emptyFile_before.gradle");
doTestAndroidGradle(fileName);
}
@TestMetadata("helloWorld_before.gradle")
public void testHelloWorld() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/configuration/android-gradle/helloWorld_before.gradle");
doTestAndroidGradle(fileName);
}
@TestMetadata("libraryFile_before.gradle")
public void testLibraryFile() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/configuration/android-gradle/libraryFile_before.gradle");
doTestAndroidGradle(fileName);
}
@TestMetadata("missedApplyAndroidStatement_before.gradle")
public void testMissedApplyAndroidStatement() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/configuration/android-gradle/missedApplyAndroidStatement_before.gradle");
doTestAndroidGradle(fileName);
}
@TestMetadata("missedBuildscriptBlock_before.gradle")
public void testMissedBuildscriptBlock() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/configuration/android-gradle/missedBuildscriptBlock_before.gradle");
doTestAndroidGradle(fileName);
}
@TestMetadata("missedRepositoriesInBuildscriptBlock_before.gradle")
public void testMissedRepositoriesInBuildscriptBlock() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/configuration/android-gradle/missedRepositoriesInBuildscriptBlock_before.gradle");
doTestAndroidGradle(fileName);
}
@TestMetadata("productFlavor_before.gradle")
public void testProductFlavor() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/configuration/android-gradle/productFlavor_before.gradle");
doTestAndroidGradle(fileName);
}
@TestMetadata("idea/testData/configuration/android-gradle/gradleExamples")
@TestMetadata("idea/testData/configuration/android-gradle")
@TestDataPath("$PROJECT_ROOT")
@RunWith(JUnit3RunnerWithInners.class)
public static class GradleExamples extends AbstractConfigureProjectTest {
public void testAllFilesPresentInGradleExamples() throws Exception {
KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("idea/testData/configuration/android-gradle/gradleExamples"), Pattern.compile("(\\w+)_before\\.gradle$"), TargetBackend.ANY, true);
public static class Android_gradle extends AbstractConfigureProjectTest {
public void testAllFilesPresentInAndroid_gradle() throws Exception {
KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("idea/testData/configuration/android-gradle"), Pattern.compile("(\\w+)_before\\.gradle$"), TargetBackend.ANY, true);
}
@TestMetadata("gradleExample0_before.gradle")
public void testGradleExample0() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/configuration/android-gradle/gradleExamples/gradleExample0_before.gradle");
@TestMetadata("androidStudioDefault_before.gradle")
public void testAndroidStudioDefault() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/configuration/android-gradle/androidStudioDefault_before.gradle");
doTestAndroidGradle(fileName);
}
@TestMetadata("gradleExample18_before.gradle")
public void testGradleExample18() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/configuration/android-gradle/gradleExamples/gradleExample18_before.gradle");
@TestMetadata("androidStudioDefaultShapshot_before.gradle")
public void testAndroidStudioDefaultShapshot() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/configuration/android-gradle/androidStudioDefaultShapshot_before.gradle");
doTestAndroidGradle(fileName);
}
@TestMetadata("gradleExample22_before.gradle")
public void testGradleExample22() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/configuration/android-gradle/gradleExamples/gradleExample22_before.gradle");
@TestMetadata("buildConfigs_before.gradle")
public void testBuildConfigs() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/configuration/android-gradle/buildConfigs_before.gradle");
doTestAndroidGradle(fileName);
}
@TestMetadata("gradleExample44_before.gradle")
public void testGradleExample44() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/configuration/android-gradle/gradleExamples/gradleExample44_before.gradle");
@TestMetadata("emptyDependencyList_before.gradle")
public void testEmptyDependencyList() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/configuration/android-gradle/emptyDependencyList_before.gradle");
doTestAndroidGradle(fileName);
}
@TestMetadata("gradleExample5_before.gradle")
public void testGradleExample5() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/configuration/android-gradle/gradleExamples/gradleExample5_before.gradle");
@TestMetadata("emptyFile_before.gradle")
public void testEmptyFile() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/configuration/android-gradle/emptyFile_before.gradle");
doTestAndroidGradle(fileName);
}
@TestMetadata("gradleExample50_before.gradle")
public void testGradleExample50() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/configuration/android-gradle/gradleExamples/gradleExample50_before.gradle");
@TestMetadata("helloWorld_before.gradle")
public void testHelloWorld() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/configuration/android-gradle/helloWorld_before.gradle");
doTestAndroidGradle(fileName);
}
@TestMetadata("gradleExample58_before.gradle")
public void testGradleExample58() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/configuration/android-gradle/gradleExamples/gradleExample58_before.gradle");
@TestMetadata("libraryFile_before.gradle")
public void testLibraryFile() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/configuration/android-gradle/libraryFile_before.gradle");
doTestAndroidGradle(fileName);
}
@TestMetadata("gradleExample65_before.gradle")
public void testGradleExample65() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/configuration/android-gradle/gradleExamples/gradleExample65_before.gradle");
@TestMetadata("missedApplyAndroidStatement_before.gradle")
public void testMissedApplyAndroidStatement() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/configuration/android-gradle/missedApplyAndroidStatement_before.gradle");
doTestAndroidGradle(fileName);
}
@TestMetadata("gradleExample8_before.gradle")
public void testGradleExample8() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/configuration/android-gradle/gradleExamples/gradleExample8_before.gradle");
@TestMetadata("missedBuildscriptBlock_before.gradle")
public void testMissedBuildscriptBlock() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/configuration/android-gradle/missedBuildscriptBlock_before.gradle");
doTestAndroidGradle(fileName);
}
@TestMetadata("missedRepositoriesInBuildscriptBlock_before.gradle")
public void testMissedRepositoriesInBuildscriptBlock() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/configuration/android-gradle/missedRepositoriesInBuildscriptBlock_before.gradle");
doTestAndroidGradle(fileName);
}
@TestMetadata("productFlavor_before.gradle")
public void testProductFlavor() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/configuration/android-gradle/productFlavor_before.gradle");
doTestAndroidGradle(fileName);
}
@TestMetadata("idea/testData/configuration/android-gradle/gradleExamples")
@TestDataPath("$PROJECT_ROOT")
@RunWith(JUnit3RunnerWithInners.class)
public static class GradleExamples extends AbstractConfigureProjectTest {
public void testAllFilesPresentInGradleExamples() throws Exception {
KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("idea/testData/configuration/android-gradle/gradleExamples"), Pattern.compile("(\\w+)_before\\.gradle$"), TargetBackend.ANY, true);
}
@TestMetadata("gradleExample0_before.gradle")
public void testGradleExample0() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/configuration/android-gradle/gradleExamples/gradleExample0_before.gradle");
doTestAndroidGradle(fileName);
}
@TestMetadata("gradleExample18_before.gradle")
public void testGradleExample18() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/configuration/android-gradle/gradleExamples/gradleExample18_before.gradle");
doTestAndroidGradle(fileName);
}
@TestMetadata("gradleExample22_before.gradle")
public void testGradleExample22() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/configuration/android-gradle/gradleExamples/gradleExample22_before.gradle");
doTestAndroidGradle(fileName);
}
@TestMetadata("gradleExample44_before.gradle")
public void testGradleExample44() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/configuration/android-gradle/gradleExamples/gradleExample44_before.gradle");
doTestAndroidGradle(fileName);
}
@TestMetadata("gradleExample5_before.gradle")
public void testGradleExample5() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/configuration/android-gradle/gradleExamples/gradleExample5_before.gradle");
doTestAndroidGradle(fileName);
}
@TestMetadata("gradleExample50_before.gradle")
public void testGradleExample50() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/configuration/android-gradle/gradleExamples/gradleExample50_before.gradle");
doTestAndroidGradle(fileName);
}
@TestMetadata("gradleExample58_before.gradle")
public void testGradleExample58() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/configuration/android-gradle/gradleExamples/gradleExample58_before.gradle");
doTestAndroidGradle(fileName);
}
@TestMetadata("gradleExample65_before.gradle")
public void testGradleExample65() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/configuration/android-gradle/gradleExamples/gradleExample65_before.gradle");
doTestAndroidGradle(fileName);
}
@TestMetadata("gradleExample8_before.gradle")
public void testGradleExample8() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/configuration/android-gradle/gradleExamples/gradleExample8_before.gradle");
doTestAndroidGradle(fileName);
}
}
}
@TestMetadata("idea/testData/configuration/android-gsk")
@TestDataPath("$PROJECT_ROOT")
@RunWith(JUnit3RunnerWithInners.class)
public static class Android_gsk extends AbstractConfigureProjectTest {
public void testAllFilesPresentInAndroid_gsk() throws Exception {
KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("idea/testData/configuration/android-gsk"), Pattern.compile("(\\w+)_before\\.gradle.kts$"), TargetBackend.ANY, true);
}
@TestMetadata("emptyFile_before.gradle.kts")
public void testEmptyFile() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/configuration/android-gsk/emptyFile_before.gradle.kts");
doTestAndroidGradle(fileName);
}
@TestMetadata("helloWorld_before.gradle.kts")
public void testHelloWorld() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/configuration/android-gsk/helloWorld_before.gradle.kts");
doTestAndroidGradle(fileName);
}
}