Skip to content

Commit 72053ca

Browse files
committed
IDE: Support multi-project rename
Fixes #4994
1 parent 4f88a96 commit 72053ca

File tree

2 files changed

+94
-7
lines changed

2 files changed

+94
-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
@@ -381,18 +381,24 @@ class DottyLanguageServer extends LanguageServer
381381
List(
382382
RENAME_OVERRIDDEN -> (() => (Include.all, syms.flatMap(s => s :: s.allOverriddenSymbols.toList))),
383383
RENAME_NO_OVERRIDDEN -> (() => (Include.all.except(Include.overridden), syms)))
384-
).get.getOrElse((Include.empty, List.empty[Symbol]))
384+
).get.getOrElse((Include.empty, Nil))
385385
} else {
386386
(Include.all, syms)
387387
}
388388

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

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

Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -251,4 +251,85 @@ class RenameTest {
251251
testRename(m2)
252252
}
253253

254+
@Test def renameValMultiProject: Unit = {
255+
def testRename(m: CodeMarker, expectations: Set[CodeRange]) = {
256+
val p0 = Project.withSources(
257+
code"""object A { val ${m1}foo${m2} = 0 }"""
258+
)
259+
260+
val p1 = Project.dependingOn(p0).withSources(
261+
code"""object B { val ${m3}bar${m4} = A.${m5}foo${m6} }"""
262+
)
263+
264+
val p2 = Project.dependingOn(p1).withSources(
265+
code"""object C { val ${m7}baz${m8} = A.${m9}foo${m10} + B.${m11}bar${m12} }"""
266+
)
267+
268+
withProjects(p0, p1, p2).rename(m, "NewName", expectations)
269+
}
270+
271+
testRename(m1, Set(m1 to m2, m5 to m6, m9 to m10))
272+
testRename(m5, Set(m1 to m2, m5 to m6, m9 to m10))
273+
testRename(m9, Set(m1 to m2, m5 to m6, m9 to m10))
274+
275+
testRename(m3, Set(m3 to m4, m11 to m12))
276+
testRename(m11, Set(m3 to m4, m11 to m12))
277+
278+
testRename(m7, Set(m7 to m8))
279+
}
280+
281+
@Test def renameClassMultiProject: Unit = {
282+
val m21 = new CodeMarker("m21")
283+
val m22 = new CodeMarker("m22")
284+
val m23 = new CodeMarker("m23")
285+
val m24 = new CodeMarker("m24")
286+
val m25 = new CodeMarker("m25")
287+
val m26 = new CodeMarker("m26")
288+
val m27 = new CodeMarker("m27")
289+
val m28 = new CodeMarker("m28")
290+
def testRename(m: CodeMarker, expectations: Set[CodeRange]) = {
291+
val p0 = Project.withSources(
292+
code"""package a
293+
object ${m1}A${m2} { class ${m3}B${m4} }"""
294+
)
295+
296+
val p1 = Project.dependingOn(p0).withSources(
297+
code"""package b
298+
import a.${m5}A${m6}.{${m7}B${m8} => ${m9}AB${m10}}
299+
object ${m11}B${m12} { class ${m13}C${m14} extends ${m15}AB${m16} }"""
300+
)
301+
302+
val p2 = Project.dependingOn(p1).withSources(
303+
code"""package c
304+
import b.${m17}B${m18}.{${m19}C${m20} => ${m21}BC${m22}}
305+
object ${m23}C${m24} { class ${m25}D${m26} extends ${m27}BC${m28} }"""
306+
)
307+
308+
withProjects(p0, p1, p2).rename(m, "NewName", expectations)
309+
}
310+
311+
testRename(m1, Set(m1 to m2, m5 to m6))
312+
testRename(m5, Set(m1 to m2, m5 to m6))
313+
314+
testRename(m3, Set(m3 to m4, m7 to m8))
315+
testRename(m7, Set(m3 to m4, m7 to m8))
316+
317+
testRename(m9, Set(m9 to m10, m15 to m16))
318+
testRename(m15, Set(m9 to m10, m15 to m16))
319+
320+
testRename(m11, Set(m11 to m12, m17 to m18))
321+
testRename(m17, Set(m11 to m12, m17 to m18))
322+
323+
testRename(m13, Set(m13 to m14, m19 to m20))
324+
testRename(m19, Set(m13 to m14, m19 to m20))
325+
326+
testRename(m21, Set(m21 to m22, m27 to m28))
327+
testRename(m27, Set(m21 to m22, m27 to m28))
328+
329+
testRename(m23, Set(m23 to m24))
330+
331+
testRename(m25, Set(m25 to m26))
332+
333+
}
334+
254335
}

0 commit comments

Comments
 (0)