Skip to content

Commit 1e205de

Browse files
committed
IDE: Support imports when renaming
1 parent 2f49c52 commit 1e205de

File tree

3 files changed

+56
-5
lines changed

3 files changed

+56
-5
lines changed

compiler/src/dotty/tools/dotc/interactive/Interactive.scala

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ object Interactive {
2929
val definitions: Int = 8 // include definitions
3030
val linkedClass: Int = 16 // include `symbol.linkedClass`
3131
val imports: Int = 32 // include imports in the results
32+
val renamingImports: Int = 64 // Include renamed symbols and renaming part of imports in the results
3233
}
3334

3435
/** Does this tree define a symbol ? */
@@ -318,6 +319,7 @@ object Interactive {
318319
(implicit ctx: Context): List[SourceNamedTree] = safely {
319320
val includeReferences = (include & Include.references) != 0
320321
val includeImports = (include & Include.imports) != 0
322+
val includeRenamingImports = (include & Include.renamingImports) != 0
321323
val buf = new mutable.ListBuffer[SourceNamedTree]
322324

323325
def traverser(source: SourceFile) = {
@@ -328,7 +330,8 @@ object Interactive {
328330
case id: untpd.Ident =>
329331
importedSymbols(imp.expr, id.name).map((_, id, None))
330332
case Thicket((id: untpd.Ident) :: (newName: untpd.Ident) :: Nil) =>
331-
importedSymbols(imp.expr, id.name).map((_, id, Some(newName)))
333+
val renaming = if (includeRenamingImports) Some(newName) else None
334+
importedSymbols(imp.expr, id.name).map((_, id, renaming))
332335
}
333336
imported match {
334337
case Nil =>
@@ -386,9 +389,11 @@ object Interactive {
386389
val linkedSym = symbol.linkedClass
387390
val includeDeclaration = (includes & Include.definitions) != 0
388391
val includeLinkedClass = (includes & Include.linkedClass) != 0
392+
val includeRenamingImports = (includes & Include.renamingImports) != 0
389393
val predicate: NameTree => Boolean = tree =>
390394
( !tree.symbol.isPrimaryConstructor
391395
&& (includeDeclaration || !Interactive.isDefinition(tree))
396+
&& (includeRenamingImports || !isRenamed(tree))
392397
&& ( Interactive.matchSymbol(tree, symbol, includes)
393398
|| ( includeDeclaration
394399
&& includeLinkedClass
@@ -609,4 +614,17 @@ object Interactive {
609614
myTpe = NoType
610615
}
611616

617+
/**
618+
* Is this tree using a renaming introduced by an import statement?
619+
*
620+
* @param tree The tree to inspect
621+
* @return True, if this tree's name is different than its symbol's name, indicating that
622+
* it uses a renaming introduced by an import statement.
623+
*/
624+
private def isRenamed(tree: NameTree)(implicit ctx: Context): Boolean = {
625+
val symbol = tree.symbol
626+
symbol.exists &&
627+
tree.name.stripModuleClassSuffix != symbol.name.stripModuleClassSuffix
628+
}
629+
612630
}

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

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -309,7 +309,8 @@ class DottyLanguageServer extends LanguageServer
309309

310310
val includes = {
311311
val includeDeclaration = params.getContext.isIncludeDeclaration
312-
Include.references | Include.overriding | Include.imports | (if (includeDeclaration) Include.definitions else 0)
312+
Include.references | Include.overriding | Include.imports | Include.renamingImports |
313+
(if (includeDeclaration) Include.definitions else 0)
313314
}
314315

315316
val uriTrees = driver.openedTrees(uri)
@@ -353,7 +354,7 @@ class DottyLanguageServer extends LanguageServer
353354
val syms = Interactive.enclosingSourceSymbols(path, pos)
354355
val newName = params.getNewName
355356
val includes =
356-
Include.references | Include.definitions | Include.linkedClass | Include.overriding
357+
Include.references | Include.definitions | Include.linkedClass | Include.overriding | Include.imports
357358

358359
val refs = syms.flatMap { sym =>
359360
val trees = driver.allTreesContaining(sym.name.sourceModuleName.toString)
@@ -365,7 +366,7 @@ class DottyLanguageServer extends LanguageServer
365366
.flatMap((uriOpt, ref) => uriOpt.map(uri => (uri.toString, ref)))
366367
.mapValues(refs =>
367368
refs.flatMap(ref =>
368-
range(ref.namePos, positionMapperFor(ref.source)).map(nameRange => new TextEdit(nameRange, newName))).asJava)
369+
range(ref.namePos, positionMapperFor(ref.source)).map(nameRange => new TextEdit(nameRange, newName))).distinct.asJava)
369370

370371
new WorkspaceEdit(changes.asJava)
371372
}
@@ -379,7 +380,7 @@ class DottyLanguageServer extends LanguageServer
379380
val uriTrees = driver.openedTrees(uri)
380381
val path = Interactive.pathTo(uriTrees, pos)
381382
val syms = Interactive.enclosingSourceSymbols(path, pos)
382-
val includes = Include.definitions | Include.references | Include.imports
383+
val includes = Include.definitions | Include.references | Include.imports | Include.renamingImports
383384

384385
syms.flatMap { sym =>
385386
val refs = Interactive.findTreesMatching(uriTrees, includes, sym)

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

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,38 @@ class RenameTest {
7070

7171
testRenameFrom(m1)
7272
testRenameFrom(m2)
73+
testRenameFrom(m3)
74+
testRenameFrom(m4)
75+
}
76+
77+
@Test def renameImport: Unit = {
78+
def testRenameFrom(m: CodeMarker) =
79+
withSources(
80+
code"""object A { class ${m1}C${m2} }""",
81+
code"""import A.${m3}C${m4}
82+
object B"""
83+
).rename(m, "NewName", Set(m1 to m2, m3 to m4))
84+
85+
testRenameFrom(m1)
86+
testRenameFrom(m2)
87+
testRenameFrom(m3)
88+
testRenameFrom(m4)
89+
}
90+
91+
@Test def renameRenamedImport: Unit = {
92+
def testRenameFrom(m: CodeMarker) =
93+
withSources(
94+
code"""object A { class ${m1}C${m2} }""",
95+
code"""import A.{${m3}C${m4} => D}
96+
object B { new ${m5}D${m6} }"""
97+
).rename(m, "NewName", Set(m1 to m2, m3 to m4))
98+
99+
testRenameFrom(m1)
100+
testRenameFrom(m2)
101+
testRenameFrom(m3)
102+
testRenameFrom(m4)
103+
testRenameFrom(m5)
104+
testRenameFrom(m6)
73105
}
74106

75107
}

0 commit comments

Comments
 (0)