Skip to content

Commit fb2ac33

Browse files
committed
IDE: Support imports when renaming
1 parent 182072d commit fb2ac33

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
@@ -558,4 +563,17 @@ object Interactive {
558563
myTpe = NoType
559564
}
560565

566+
/**
567+
* Is this tree using a renaming introduced by an import statement?
568+
*
569+
* @param tree The tree to inspect
570+
* @return True, if this tree's name is different than its symbol's name, indicating that
571+
* it uses a renaming introduced by an import statement.
572+
*/
573+
private def isRenamed(tree: NameTree)(implicit ctx: Context): Boolean = {
574+
val symbol = tree.symbol
575+
symbol.exists &&
576+
tree.name.stripModuleClassSuffix != symbol.name.stripModuleClassSuffix
577+
}
578+
561579
}

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

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -293,7 +293,8 @@ class DottyLanguageServer extends LanguageServer
293293
val trees = driver.allTreesContaining(sym.name.sourceModuleName.toString)
294294
val includeDeclaration = params.getContext.isIncludeDeclaration
295295
val includes =
296-
Include.references | Include.overriding | Include.imports | (if (includeDeclaration) Include.definitions else 0)
296+
Include.references | Include.overriding | Include.imports | Include.renamingImports |
297+
(if (includeDeclaration) Include.definitions else 0)
297298
val refs = Interactive.findTreesMatching(trees, includes, sym)
298299

299300
refs.flatMap(ref => location(ref.namePos, positionMapperFor(ref.source)))
@@ -311,7 +312,7 @@ class DottyLanguageServer extends LanguageServer
311312
val syms = Interactive.enclosingSourceSymbols(path, pos)
312313
val newName = params.getNewName
313314
val includes =
314-
Include.references | Include.definitions | Include.linkedClass | Include.overriding
315+
Include.references | Include.definitions | Include.linkedClass | Include.overriding | Include.imports
315316

316317
val refs = syms.flatMap { sym =>
317318
val trees = driver.allTreesContaining(sym.name.sourceModuleName.toString)
@@ -322,7 +323,7 @@ class DottyLanguageServer extends LanguageServer
322323
refs.groupBy(ref => toUri(ref.source).toString)
323324
.mapValues(refs =>
324325
refs.flatMap(ref =>
325-
range(ref.namePos, positionMapperFor(ref.source)).map(nameRange => new TextEdit(nameRange, newName))).asJava)
326+
range(ref.namePos, positionMapperFor(ref.source)).map(nameRange => new TextEdit(nameRange, newName))).distinct.asJava)
326327

327328
new WorkspaceEdit(changes.asJava)
328329
}
@@ -336,7 +337,7 @@ class DottyLanguageServer extends LanguageServer
336337
val uriTrees = driver.openedTrees(uri)
337338
val path = Interactive.pathTo(uriTrees, pos)
338339
val syms = Interactive.enclosingSourceSymbols(path, pos)
339-
val includes = Include.definitions | Include.references | Include.imports
340+
val includes = Include.definitions | Include.references | Include.imports | Include.renamingImports
340341

341342
syms.flatMap { sym =>
342343
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)