Skip to content

Commit

Permalink
Fix finding references for anonymous inherited classes
Browse files Browse the repository at this point in the history
  • Loading branch information
kpbochenek committed Feb 7, 2020
1 parent 38243cc commit 34e387d
Show file tree
Hide file tree
Showing 4 changed files with 48 additions and 55 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -143,40 +143,37 @@ final class ImplementationProvider(
}

def topMethodParents(
doc: TextDocument,
symbol: String
): Seq[Location] = {
val textDocument = findSemanticDbForSymbol(symbol).getOrElse(doc)

findSemanticDbForSymbol(symbol) match {
case Some(textDocument) =>
def findClassInfo(owner: String) = {
if (owner.nonEmpty) {
findSymbol(textDocument, owner)
} else {
textDocument.symbols.find { sym =>
sym.signature match {
case sig: ClassSignature =>
sig.declarations.exists(_.symlinks.contains(symbol))
case _ => false
}
}
}
}

val results = for {
currentInfo <- findSymbol(textDocument, symbol)
if !isClassLike(currentInfo)
classInfo <- findClassInfo(symbol.owner)
} yield {
classInfo.signature match {
def findClassInfo(owner: String) = {
if (owner.nonEmpty) {
findSymbol(textDocument, owner)
} else {
textDocument.symbols.find { sym =>
sym.signature match {
case sig: ClassSignature =>
methodInParentSignature(sig, currentInfo)
case _ => Nil
sig.declarations.exists(_.symlinks.contains(symbol))
case _ => false
}
}
results.getOrElse(Seq.empty)
}
}

case None => Seq.empty
val results = for {
currentInfo <- findSymbol(textDocument, symbol)
if !isClassLike(currentInfo)
classInfo <- findClassInfo(symbol.owner)
} yield {
classInfo.signature match {
case sig: ClassSignature =>
methodInParentSignature(sig, currentInfo)
case _ => Nil
}
}
results.getOrElse(Seq.empty)
}

private def methodInParentSignature(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -88,7 +88,7 @@ final class ReferenceProvider(
} else {
ReferencesResult(
occurrence.symbol,
allRefs(occurrence, _ => true, params)
allRefs(occurrence, doc, _ => true, params)
)
}
case None =>
Expand Down Expand Up @@ -154,6 +154,7 @@ final class ReferenceProvider(

def allRefs(
symbolOccurrence: SymbolOccurrence,
doc: TextDocument,
fnIncludeSynthetics: Synthetic => Boolean,
textParams: TextDocumentPositionParams
): Seq[Location] = {
Expand All @@ -165,7 +166,7 @@ final class ReferenceProvider(
}

val parentSymbols = implementation
.topMethodParents(symbolOccurrence.symbol)
.topMethodParents(doc, symbolOccurrence.symbol)
val txtParams = {
if (parentSymbols.isEmpty) List(textParams)
else parentSymbols.map(toTextParams)
Expand Down Expand Up @@ -208,30 +209,24 @@ final class ReferenceProvider(
includeSynthetics: Synthetic => Boolean = _ => true
): ReferencesResult = {
val source = params.getTextDocument.getUri.toAbsolutePath
semanticdbs.textDocument(source).documentIncludingStale match {
case Some(doc) =>
val ResolvedSymbolOccurrence(distance, maybeOccurrence) =
definition.positionOccurrence(source, params.getPosition, doc)
maybeOccurrence match {
case Some(occurrence) =>
val alternatives = referenceAlternatives(doc, occurrence)
val locations = references(
params,
doc,
distance,
occurrence,
alternatives,
params.getContext.isIncludeDeclaration,
checkMatchesText,
includeSynthetics
)
ReferencesResult(occurrence.symbol, locations)
case None =>
ReferencesResult.empty
}
case None =>
ReferencesResult.empty
}
val referencesResult = for {
doc <- semanticdbs.textDocument(source).documentIncludingStale
ResolvedSymbolOccurrence(distance, maybeOccurrence) = definition
.positionOccurrence(source, params.getPosition, doc)
occurrence <- maybeOccurrence
alternatives = referenceAlternatives(doc, occurrence)
locations = references(
params,
doc,
distance,
occurrence,
alternatives,
params.getContext.isIncludeDeclaration,
checkMatchesText,
includeSynthetics
)
} yield ReferencesResult(occurrence.symbol, locations)
referencesResult.getOrElse(ReferencesResult.empty)
}

// Returns alternatives symbols for which "goto definition" resolves to the occurrence symbol.
Expand All @@ -240,7 +235,6 @@ final class ReferenceProvider(
occ: SymbolOccurrence
): Set[String] = {
val name = occ.symbol.desc.name.value
val isCopyOrApply = Set("apply", "copy")
// Returns true if `info` is the companion object matching the occurrence class symbol.
def isCompanionObject(info: SymbolInformation): Boolean =
info.isObject &&
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -89,6 +89,7 @@ final class RenameProvider(
if canRenameSymbol(occurrence.symbol, Some(params.getNewName)) =>
referenceProvider.allRefs(
occurrence,
doc,
includeSynthetic,
textParams
) ++ companionReferences(
Expand Down
5 changes: 3 additions & 2 deletions tests/unit/src/test/scala/tests/RenameLspSuite.scala
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package tests
import scala.concurrent.Future
import munit.Location
import munit.TestOptions

class RenameLspSuite extends BaseLspSuite("rename") {

Expand Down Expand Up @@ -515,7 +516,7 @@ class RenameLspSuite extends BaseLspSuite("rename") {
)

def renamed(
name: String,
name: TestOptions,
input: String,
newName: String,
nonOpened: Set[String] = Set.empty,
Expand Down Expand Up @@ -544,7 +545,7 @@ class RenameLspSuite extends BaseLspSuite("rename") {
)

def check(
name: String,
name: TestOptions,
input: String,
newName: String,
notRenamed: Boolean = false,
Expand Down

0 comments on commit 34e387d

Please sign in to comment.