From 7c8caf9ef5702258ffda5db6d5eac9c7ee058278 Mon Sep 17 00:00:00 2001
From: Andy Wilkinson <wilkinsona@vmware.com>
Date: Wed, 7 Apr 2021 11:43:39 +0100
Subject: [PATCH] Configure Kotlin compilation to use 1.3 apiVersion and
 languageVersion

Closes gh-25793
---
 buildSrc/build.gradle                         |  2 +
 .../boot/build/ConventionsPlugin.java         |  1 +
 .../boot/build/KotlinConventions.java         | 48 +++++++++++++++++++
 3 files changed, 51 insertions(+)
 create mode 100644 buildSrc/src/main/java/org/springframework/boot/build/KotlinConventions.java

diff --git a/buildSrc/build.gradle b/buildSrc/build.gradle
index 0a41ffbac325..3fbcc5e0e257 100644
--- a/buildSrc/build.gradle
+++ b/buildSrc/build.gradle
@@ -21,6 +21,8 @@ dependencies {
 	implementation("org.asciidoctor:asciidoctor-gradle-jvm:3.0.0")
 	implementation("org.asciidoctor:asciidoctor-gradle-jvm-pdf:3.0.0")
 	implementation("org.gradle:test-retry-gradle-plugin:1.1.9")
+	implementation("org.jetbrains.kotlin:kotlin-gradle-plugin:1.3.72")
+	implementation("org.jetbrains.kotlin:kotlin-compiler-embeddable:1.3.72")
 	implementation("org.springframework:spring-core:5.2.2.RELEASE")
 	implementation("org.springframework:spring-web:5.2.2.RELEASE")
 	implementation("io.spring.javaformat:spring-javaformat-gradle-plugin:${javaFormatVersion}")
diff --git a/buildSrc/src/main/java/org/springframework/boot/build/ConventionsPlugin.java b/buildSrc/src/main/java/org/springframework/boot/build/ConventionsPlugin.java
index 3454a2efa511..66aecc879376 100644
--- a/buildSrc/src/main/java/org/springframework/boot/build/ConventionsPlugin.java
+++ b/buildSrc/src/main/java/org/springframework/boot/build/ConventionsPlugin.java
@@ -46,6 +46,7 @@ public void apply(Project project) {
 		new JavaConventions().apply(project);
 		new MavenPublishingConventions().apply(project);
 		new AsciidoctorConventions().apply(project);
+		new KotlinConventions().apply(project);
 	}
 
 }
diff --git a/buildSrc/src/main/java/org/springframework/boot/build/KotlinConventions.java b/buildSrc/src/main/java/org/springframework/boot/build/KotlinConventions.java
new file mode 100644
index 000000000000..6f6c8e35c137
--- /dev/null
+++ b/buildSrc/src/main/java/org/springframework/boot/build/KotlinConventions.java
@@ -0,0 +1,48 @@
+/*
+ * Copyright 2012-2021 the original author or authors.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.springframework.boot.build;
+
+import org.gradle.api.Project;
+import org.jetbrains.kotlin.gradle.dsl.KotlinJvmOptions;
+import org.jetbrains.kotlin.gradle.tasks.KotlinCompile;
+
+/**
+ * Conventions that are applied in the presence of the {@code org.jetbrains.kotlin.jvm}
+ * plugin. When the plugin is applied:
+ *
+ * <ul>
+ * <li>{@link KotlinCompile} tasks are configured to use {@code apiVersion} and
+ * {@code languageVersion} 1.3.
+ * </ul>
+ *
+ * <p/>
+ *
+ * @author Andy Wilkinson
+ */
+class KotlinConventions {
+
+	void apply(Project project) {
+		project.getPlugins().withId("org.jetbrains.kotlin.jvm", (plugin) -> {
+			project.getTasks().withType(KotlinCompile.class, (compile) -> {
+				KotlinJvmOptions kotlinOptions = compile.getKotlinOptions();
+				kotlinOptions.setApiVersion("1.3");
+				kotlinOptions.setLanguageVersion("1.3");
+			});
+		});
+	}
+
+}