Skip to content

Commit

Permalink
bugfix: Extension method completion with name conflict
Browse files Browse the repository at this point in the history
  • Loading branch information
jkciesluk committed Dec 11, 2023
1 parent 3d06d9f commit 26a01d9
Show file tree
Hide file tree
Showing 4 changed files with 61 additions and 0 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -261,6 +261,10 @@ class CompletionProvider(
mkItem(
"{" + sym.fullNameBackticked + completionTextSuffix + "}"
)
case _ if v.isExtensionMethod =>
mkItem(
ident.backticked(backtickSoftKeyword) + completionTextSuffix
)
case _ =>
mkItem(
sym.fullNameBackticked(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,7 @@ object CompletionValue:
def symbol: Symbol
def isFromWorkspace: Boolean = false
def completionItemDataKind = CompletionItemData.None
def isExtensionMethod: Boolean = false

override def completionData(
buildTargetIdentifier: String
Expand Down Expand Up @@ -125,6 +126,7 @@ object CompletionValue:
) extends Symbolic:
override def completionItemKind(using Context): CompletionItemKind =
CompletionItemKind.Method
override def isExtensionMethod: Boolean = true
override def description(printer: MetalsPrinter)(using Context): String =
s"${printer.completionSymbol(symbol)} (extension)"

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -130,6 +130,36 @@ class CompletionExtensionMethodSuite extends BaseCompletionSuite {
|""".stripMargin
)

checkEdit(
"name-conflict",
"""|package example
|
|import example.enrichments.*
|
|object enrichments:
| extension (num: Int)
| def plus(other: Int): Int = num + other
|
|def main = {
| val plus = 100.plus(19)
| val y = 19.pl@@
|}
|""".stripMargin,
"""|package example
|
|import example.enrichments.*
|
|object enrichments:
| extension (num: Int)
| def plus(other: Int): Int = num + other
|
|def main = {
| val plus = 100.plus(19)
| val y = 19.plus($0)
|}
|""".stripMargin
)

// NOTE: In 3.1.3, package object name includes the whole path to file
// eg. in 3.2.2 we get `A$package`, but in 3.1.3 `/some/path/to/file/A$package`
check(
Expand Down
25 changes: 25 additions & 0 deletions tests/cross/src/test/scala/tests/pc/CompletionWorkspaceSuite.scala
Original file line number Diff line number Diff line change
Expand Up @@ -988,4 +988,29 @@ class CompletionWorkspaceSuite extends BaseCompletionSuite {
|MyType - demo.other""".stripMargin
)

checkEdit(
"method-name-conflict".tag(IgnoreScala2),
"""|package demo
|
|object O {
| def mmmm(x: Int) = x + 3
| class Test {
| val mmmm = "abc"
| val foo = mmmm@@
| }
|}
|""".stripMargin,
"""|package demo
|
|object O {
| def mmmm(x: Int) = x + 3
| class Test {
| val mmmm = "abc"
| val foo = demo.O.mmmm($0)
| }
|}
|""".stripMargin,
filter = _.contains("mmmm(x: Int)")
)

}

0 comments on commit 26a01d9

Please sign in to comment.