Skip to content

Commit 2a64545

Browse files
committed
IDE: Support multi-project rename
Fixes scala#4994
1 parent 47d4b44 commit 2a64545

File tree

2 files changed

+92
-7
lines changed

2 files changed

+92
-7
lines changed

language-server/src/dotty/tools/languageserver/DottyLanguageServer.scala

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -380,18 +380,24 @@ class DottyLanguageServer extends LanguageServer
380380
List(
381381
RENAME_OVERRIDDEN -> (() => (Include.all, syms.flatMap(s => s :: s.allOverriddenSymbols.toList))),
382382
RENAME_NO_OVERRIDDEN -> (() => (Include.all.except(Include.overridden), syms)))
383-
).get.getOrElse((Include.empty, List.empty[Symbol]))
383+
).get.getOrElse((Include.empty, Nil))
384384
} else {
385385
(Include.all, syms)
386386
}
387387

388388
val names = allSymbols.map(_.name.sourceModuleName).toSet
389-
val trees = names.flatMap(name => driver.allTreesContaining(name.toString)).toList
390-
allSymbols.flatMap { sym =>
391-
Interactive.findTreesMatching(trees,
392-
include,
393-
sym,
394-
t => names.exists(Interactive.sameName(t.name, _)))
389+
val definitions = Interactive.findDefinitions(allSymbols, driver, include.isOverridden, includeExternal = true)
390+
val perProjectInfo = inProjectsSeeing(driver, definitions, allSymbols)
391+
392+
perProjectInfo.flatMap { (remoteDriver, ctx, definitions) =>
393+
definitions.flatMap { definition =>
394+
val name = definition.name(ctx).sourceModuleName.toString
395+
val trees = remoteDriver.sourceTreesContaining(name)(ctx)
396+
Interactive.findTreesMatching(trees,
397+
include,
398+
definition,
399+
t => names.exists(Interactive.sameName(t.name, _)))(ctx)
400+
}
395401
}
396402
}
397403

language-server/test/dotty/tools/languageserver/RenameTest.scala

Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -236,6 +236,85 @@ class RenameTest {
236236

237237
}
238238

239+
@Test def renameValMultiProject: Unit = {
240+
def testRename(m: CodeMarker, expectations: Set[CodeRange]) = {
241+
val p0 = Project.withSources(
242+
code"""object A { val ${m1}foo${m2} = 0 }"""
243+
)
244+
245+
val p1 = Project.dependingOn(p0).withSources(
246+
code"""object B { val ${m3}bar${m4} = A.${m5}foo${m6} }"""
247+
)
248+
249+
val p2 = Project.dependingOn(p1).withSources(
250+
code"""object C { val ${m7}baz${m8} = A.${m9}foo${m10} + B.${m11}bar${m12} }"""
251+
)
252+
253+
withProjects(p0, p1, p2).rename(m, "NewName", expectations)
254+
}
255+
256+
testRename(m1, Set(m1 to m2, m5 to m6, m9 to m10))
257+
testRename(m5, Set(m1 to m2, m5 to m6, m9 to m10))
258+
testRename(m9, Set(m1 to m2, m5 to m6, m9 to m10))
259+
260+
testRename(m3, Set(m3 to m4, m11 to m12))
261+
testRename(m11, Set(m3 to m4, m11 to m12))
262+
263+
testRename(m7, Set(m7 to m8))
264+
}
265+
266+
@Test def renameClassMultiProject: Unit = {
267+
val m21 = new CodeMarker("m21")
268+
val m22 = new CodeMarker("m22")
269+
val m23 = new CodeMarker("m23")
270+
val m24 = new CodeMarker("m24")
271+
val m25 = new CodeMarker("m25")
272+
val m26 = new CodeMarker("m26")
273+
val m27 = new CodeMarker("m27")
274+
val m28 = new CodeMarker("m28")
275+
def testRename(m: CodeMarker, expectations: Set[CodeRange]) = {
276+
val p0 = Project.withSources(
277+
code"""package a
278+
object ${m1}A${m2} { class ${m3}B${m4} }"""
279+
)
280+
281+
val p1 = Project.dependingOn(p0).withSources(
282+
code"""package b
283+
import a.${m5}A${m6}.{${m7}B${m8} => ${m9}AB${m10}}
284+
object ${m11}B${m12} { class ${m13}C${m14} extends ${m15}AB${m16} }"""
285+
)
286+
287+
val p2 = Project.dependingOn(p1).withSources(
288+
code"""package c
289+
import b.${m17}B${m18}.{${m19}C${m20} => ${m21}BC${m22}}
290+
object ${m23}C${m24} { class ${m25}D${m26} extends ${m27}BC${m28} }"""
291+
)
292+
293+
withProjects(p0, p1, p2).rename(m, "NewName", expectations)
294+
}
295+
296+
testRename(m1, Set(m1 to m2, m5 to m6))
297+
testRename(m5, Set(m1 to m2, m5 to m6))
298+
299+
testRename(m3, Set(m3 to m4, m7 to m8))
300+
testRename(m7, Set(m3 to m4, m7 to m8))
301+
302+
testRename(m9, Set(m9 to m10, m15 to m16))
303+
testRename(m15, Set(m9 to m10, m15 to m16))
239304

305+
testRename(m11, Set(m11 to m12, m17 to m18))
306+
testRename(m17, Set(m11 to m12, m17 to m18))
307+
308+
testRename(m13, Set(m13 to m14, m19 to m20))
309+
testRename(m19, Set(m13 to m14, m19 to m20))
310+
311+
testRename(m21, Set(m21 to m22, m27 to m28))
312+
testRename(m27, Set(m21 to m22, m27 to m28))
313+
314+
testRename(m23, Set(m23 to m24))
315+
316+
testRename(m25, Set(m25 to m26))
317+
318+
}
240319

241320
}

0 commit comments

Comments
 (0)