Skip to content

Commit 0225666

Browse files
authored
Handle local version variables in UpgradePluginVersion for kotlin plugins (#6746)
1 parent 3f0f7d9 commit 0225666

2 files changed

Lines changed: 93 additions & 4 deletions

File tree

rewrite-gradle/src/main/java/org/openrewrite/gradle/plugins/UpgradePluginVersion.java

Lines changed: 33 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -133,15 +133,30 @@ public TreeVisitor<?, ExecutionContext> getScanner(DependencyVersionState acc) {
133133
@Nullable
134134
private GradleSettings gradleSettings;
135135

136+
private final Map<String, String> localVariableValues = new HashMap<>();
137+
136138
@Override
137139
public @Nullable J visit(@Nullable Tree tree, ExecutionContext ctx) {
138140
if (tree instanceof SourceFile) {
139141
gradleProject = tree.getMarkers().findFirst(GradleProject.class).orElse(null);
140142
gradleSettings = tree.getMarkers().findFirst(GradleSettings.class).orElse(null);
143+
localVariableValues.clear();
141144
}
142145
return super.visit(tree, ctx);
143146
}
144147

148+
@Override
149+
public J visitVariable(J.VariableDeclarations.NamedVariable variable, ExecutionContext ctx) {
150+
J.VariableDeclarations.NamedVariable v = (J.VariableDeclarations.NamedVariable) super.visitVariable(variable, ctx);
151+
if (v.getInitializer() instanceof J.Literal) {
152+
String value = literalValue(v.getInitializer());
153+
if (value != null) {
154+
localVariableValues.put(v.getSimpleName(), value);
155+
}
156+
}
157+
return v;
158+
}
159+
145160
@Override
146161
public J visitMethodInvocation(J.MethodInvocation method, ExecutionContext ctx) {
147162
J.MethodInvocation m = (J.MethodInvocation) super.visitMethodInvocation(method, ctx);
@@ -185,20 +200,34 @@ public J visitMethodInvocation(J.MethodInvocation method, ExecutionContext ctx)
185200

186201
G.GString.Value gStringValue = (G.GString.Value) gString.getStrings().get(0);
187202
String versionVariableName = gStringValue.getTree().toString();
203+
String resolverPluginId = pluginId;
204+
if ("kotlin".equals(pluginId)) {
205+
resolverPluginId = String.format("org.jetbrains.%s.%s", pluginId, literalValue(pluginArgs.get(0)));
206+
}
188207
String resolvedPluginVersion = new DependencyVersionSelector(metadataFailures, gradleProject, gradleSettings)
189-
.select(new GroupArtifact(pluginId, pluginId + ".gradle.plugin"), "classpath", newVersion, versionPattern, ctx);
208+
.select(new GroupArtifact(resolverPluginId, resolverPluginId + ".gradle.plugin"), "classpath", newVersion, versionPattern, ctx);
190209

191210
acc.versionPropNameToPluginId.put(versionVariableName, pluginId);
192211
assert resolvedPluginVersion != null;
193212
acc.pluginIdToNewVersion.put(pluginId, resolvedPluginVersion);
194213
} else if (versionArgs.get(0) instanceof J.Identifier) {
195214
J.Identifier identifier = (J.Identifier) versionArgs.get(0);
196215
String versionVariableName = identifier.getSimpleName();
197-
String resolvedPluginVersion = new DependencyVersionSelector(metadataFailures, gradleProject, gradleSettings)
198-
.select(new GroupArtifact(pluginId, pluginId + ".gradle.plugin"), "classpath", newVersion, versionPattern, ctx);
216+
String resolverPluginId = pluginId;
217+
if ("kotlin".equals(pluginId)) {
218+
resolverPluginId = String.format("org.jetbrains.%s.%s", pluginId, literalValue(pluginArgs.get(0)));
219+
}
220+
String localCurrentVersion = localVariableValues.get(versionVariableName);
221+
String resolvedPluginVersion;
222+
if (localCurrentVersion != null) {
223+
resolvedPluginVersion = new DependencyVersionSelector(metadataFailures, gradleProject, gradleSettings)
224+
.select(new GroupArtifactVersion(resolverPluginId, resolverPluginId + ".gradle.plugin", localCurrentVersion), "classpath", newVersion, versionPattern, ctx);
225+
} else {
226+
resolvedPluginVersion = new DependencyVersionSelector(metadataFailures, gradleProject, gradleSettings)
227+
.select(new GroupArtifact(resolverPluginId, resolverPluginId + ".gradle.plugin"), "classpath", newVersion, versionPattern, ctx);
228+
}
199229

200230
acc.versionPropNameToPluginId.put(versionVariableName, pluginId);
201-
assert resolvedPluginVersion != null;
202231
acc.pluginIdToNewVersion.put(pluginId, resolvedPluginVersion);
203232
}
204233
} catch (MavenDownloadingException e) {

rewrite-gradle/src/test/java/org/openrewrite/gradle/plugins/UpgradePluginVersionTest.java

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,66 @@ void upgradeKotlinPlugin() {
9898
);
9999
}
100100

101+
@Test
102+
void upgradeKotlinPluginLocalVariable() {
103+
rewriteRun(
104+
spec -> spec.recipe(new UpgradePluginVersion("kotlin", "2.1.0", null)),
105+
buildGradleKts(
106+
"""
107+
plugins {
108+
val kotlinVersion = "1.9.25"
109+
kotlin("jvm") version kotlinVersion
110+
kotlin("plugin.allopen") version kotlinVersion
111+
kotlin("plugin.spring") version kotlinVersion
112+
}
113+
""",
114+
"""
115+
plugins {
116+
val kotlinVersion = "2.1.0"
117+
kotlin("jvm") version kotlinVersion
118+
kotlin("plugin.allopen") version kotlinVersion
119+
kotlin("plugin.spring") version kotlinVersion
120+
}
121+
"""
122+
)
123+
);
124+
}
125+
126+
@Test
127+
void upgradeKotlinPluginLocalVariableWithSemverSelector() {
128+
rewriteRun(
129+
spec -> spec.recipe(new UpgradePluginVersion("kotlin", "latest.minor", null)),
130+
buildGradleKts(
131+
"""
132+
plugins {
133+
val kotlinVersion = "2.0.0"
134+
kotlin("jvm") version kotlinVersion
135+
}
136+
""",
137+
spec -> spec.after(s -> {
138+
assertThat(s).doesNotContain("2.0.0");
139+
assertThat(s).containsPattern("val kotlinVersion = \"2.\\d+.\\d+\"");
140+
return s;
141+
})
142+
)
143+
);
144+
}
145+
146+
@Test
147+
void dontDowngradeKotlinPluginLocalVariable() {
148+
rewriteRun(
149+
spec -> spec.recipe(new UpgradePluginVersion("kotlin", "1.9.0", null)),
150+
buildGradleKts(
151+
"""
152+
plugins {
153+
val kotlinVersion = "1.9.25"
154+
kotlin("jvm") version kotlinVersion
155+
}
156+
"""
157+
)
158+
);
159+
}
160+
101161
@Test
102162
void upgradeGradleSettingsPlugin() {
103163
rewriteRun(

0 commit comments

Comments
 (0)