From d33ca43e17dc7afd66f91f4b9d3be2daf31c157a Mon Sep 17 00:00:00 2001
From: Ryan Murfitt <rmurfitt@gmail.com>
Date: Mon, 23 Sep 2019 14:29:51 +1000
Subject: [PATCH] feat(gradle): Support Kotlin DSL extra properties (#4493)

---
 lib/manager/gradle/build-gradle.ts       | 19 ++++++++++
 test/manager/gradle/build-gradle.spec.ts | 44 ++++++++++++++++++++++++
 2 files changed, 63 insertions(+)

diff --git a/lib/manager/gradle/build-gradle.ts b/lib/manager/gradle/build-gradle.ts
index d3e48abf34..d22b7ac493 100644
--- a/lib/manager/gradle/build-gradle.ts
+++ b/lib/manager/gradle/build-gradle.ts
@@ -33,6 +33,7 @@ export function updateGradleVersion(
       updateLocalVariables,
       updateGlobalVariables,
       updatePropertyFileGlobalVariables,
+      updateKotlinVariablesByExtra,
     ];
 
     // eslint-disable-next-line guard-for-in
@@ -142,6 +143,24 @@ function updateGlobalVariables(
   return null;
 }
 
+function updateKotlinVariablesByExtra(
+  dependency: GradleDependency,
+  buildGradleContent: string,
+  newVersion: string
+): string | null {
+  const variable = variables[`${dependency.group}:${dependency.name}`];
+  if (variable) {
+    const regex = new RegExp(
+      `(val ${variable} by extra(?: {|\\()\\s*")(.*)("\\s*[})])`
+    );
+    const match = buildGradleContent.match(regex);
+    if (match) {
+      return buildGradleContent.replace(regex, `$1${newVersion}$3`);
+    }
+  }
+  return null;
+}
+
 function updatePropertyFileGlobalVariables(
   dependency: GradleDependency,
   buildGradleContent: string,
diff --git a/test/manager/gradle/build-gradle.spec.ts b/test/manager/gradle/build-gradle.spec.ts
index 4dd451f6c1..f6344814ce 100644
--- a/test/manager/gradle/build-gradle.spec.ts
+++ b/test/manager/gradle/build-gradle.spec.ts
@@ -289,4 +289,48 @@ describe('lib/manager/gradle/updateGradleVersion', () => {
     );
     expect(updatedGradleFile).toEqual('String mysqlVersion = "7.0.0"');
   });
+
+  it('should replace a external extra variable assigned to a Kotlin named argument dependency', () => {
+    const gradleFile = `compile(group  = "mysql"               ,
+               name           = "mysql-connector-java",
+               version        = mysqlVersion)
+               `;
+    const mysqlDependency = {
+      group: 'mysql',
+      depGroup: 'mysql',
+      name: 'mysql-connector-java',
+      version: '6.0.5',
+    };
+    collectVersionVariables([mysqlDependency], gradleFile);
+
+    const gradleWithVersionFile = 'val mysqlVersion by extra("6.0.5")';
+    const updatedGradleFile = updateGradleVersion(
+      gradleWithVersionFile,
+      mysqlDependency,
+      '7.0.0'
+    );
+    expect(updatedGradleFile).toEqual('val mysqlVersion by extra("7.0.0")');
+  });
+
+  it('should replace a external lazy extra variable assigned to a Kotlin named argument dependency', () => {
+    const gradleFile = `compile(group  = "mysql"               ,
+               name           = "mysql-connector-java",
+               version        = mysqlVersion)
+               `;
+    const mysqlDependency = {
+      group: 'mysql',
+      depGroup: 'mysql',
+      name: 'mysql-connector-java',
+      version: '6.0.5',
+    };
+    collectVersionVariables([mysqlDependency], gradleFile);
+
+    const gradleWithVersionFile = 'val mysqlVersion by extra { "6.0.5" }';
+    const updatedGradleFile = updateGradleVersion(
+      gradleWithVersionFile,
+      mysqlDependency,
+      '7.0.0'
+    );
+    expect(updatedGradleFile).toEqual('val mysqlVersion by extra { "7.0.0" }');
+  });
 });
-- 
GitLab