From 9be56a19189308f22c682fc4b1732706b873fcc0 Mon Sep 17 00:00:00 2001
From: Shawn Garner <BusyByte@users.noreply.github.com>
Date: Fri, 4 Jun 2021 14:27:18 -0500
Subject: [PATCH] Parse dependency definitions inside single and multi-line
 Sequences inside Scala dependency file (#10306)

---
 .../sbt/__fixtures__/dependency-file.scala    |  7 +++++
 .../sbt/__snapshots__/extract.spec.ts.snap    | 30 +++++++++++++++++++
 lib/manager/sbt/extract.ts                    | 22 ++++++++++++++
 3 files changed, 59 insertions(+)

diff --git a/lib/manager/sbt/__fixtures__/dependency-file.scala b/lib/manager/sbt/__fixtures__/dependency-file.scala
index d9046d1219..bdd6f9fcd0 100644
--- a/lib/manager/sbt/__fixtures__/dependency-file.scala
+++ b/lib/manager/sbt/__fixtures__/dependency-file.scala
@@ -10,4 +10,11 @@ object Dependencies {
   val ujson = "com.example" %% "foo" % "0.7.1"
 
   lazy val abc = "com.abc" % "abc" % abcVersion
+
+  val relatedDeps = Seq(
+    "com.abc" % "abc-a" % abcVersion,
+    "com.abc" % "abc-b" % abcVersion
+  )
+
+  val aloneDepInSeq = Seq("com.abc" % "abc-c" % abcVersion)
 }
diff --git a/lib/manager/sbt/__snapshots__/extract.spec.ts.snap b/lib/manager/sbt/__snapshots__/extract.spec.ts.snap
index c05ae39e1c..38bb61b805 100644
--- a/lib/manager/sbt/__snapshots__/extract.spec.ts.snap
+++ b/lib/manager/sbt/__snapshots__/extract.spec.ts.snap
@@ -69,6 +69,36 @@ Object {
         "https://repo.maven.apache.org/maven2",
       ],
     },
+    Object {
+      "currentValue": "1.2.3",
+      "datasource": "sbt-package",
+      "depName": "com.abc:abc-a",
+      "groupName": "abcVersion for com.abc",
+      "lookupName": "com.abc:abc-a",
+      "registryUrls": Array [
+        "https://repo.maven.apache.org/maven2",
+      ],
+    },
+    Object {
+      "currentValue": "1.2.3",
+      "datasource": "sbt-package",
+      "depName": "com.abc:abc-b",
+      "groupName": "abcVersion for com.abc",
+      "lookupName": "com.abc:abc-b",
+      "registryUrls": Array [
+        "https://repo.maven.apache.org/maven2",
+      ],
+    },
+    Object {
+      "currentValue": "1.2.3",
+      "datasource": "sbt-package",
+      "depName": "com.abc:abc-c",
+      "groupName": "abcVersion for com.abc",
+      "lookupName": "com.abc:abc-c",
+      "registryUrls": Array [
+        "https://repo.maven.apache.org/maven2",
+      ],
+    },
   ],
   "packageFileVersion": undefined,
 }
diff --git a/lib/manager/sbt/extract.ts b/lib/manager/sbt/extract.ts
index 6b6b2dc5d2..f83f81648c 100644
--- a/lib/manager/sbt/extract.ts
+++ b/lib/manager/sbt/extract.ts
@@ -86,6 +86,16 @@ const isVarDef = (str: string): boolean =>
     str
   );
 
+const isVarSeqSingleLine = (str: string): boolean =>
+  /^\s*(private\s*)?(lazy\s*)?val\s+[_a-zA-Z][_a-zA-Z0-9]*\s*=\s*Seq\(.*\).*\s*$/.test(
+    str
+  );
+
+const isVarSeqMultipleLine = (str: string): boolean =>
+  /^\s*(private\s*)?(lazy\s*)?val\s+[_a-zA-Z][_a-zA-Z0-9]*\s*=\s*Seq\(.*[^)]*.*$/.test(
+    str
+  );
+
 const getVarName = (str: string): string =>
   str
     .replace(/^\s*(private\s*)?(lazy\s*)?val\s+/, '')
@@ -231,6 +241,18 @@ function parseSbtLine(
       isMultiDeps = false;
       const url = getResolverUrl(line);
       registryUrls.push(url);
+    } else if (isVarSeqSingleLine(line)) {
+      isMultiDeps = false;
+      const depExpr = line.replace(/^.*Seq\(\s*/, '').replace(/\).*$/, '');
+      dep = parseDepExpr(depExpr, {
+        ...ctx,
+      });
+    } else if (isVarSeqMultipleLine(line)) {
+      isMultiDeps = true;
+      const depExpr = line.replace(/^.*Seq\(\s*/, '');
+      dep = parseDepExpr(depExpr, {
+        ...ctx,
+      });
     } else if (isVarDef(line)) {
       variables[getVarName(line)] = getVarInfo(line, ctx);
     } else if (isVarDependency(line)) {
-- 
GitLab