Skip to content

Commit

Permalink
fix: Implement all members with end marker
Browse files Browse the repository at this point in the history
  • Loading branch information
jkciesluk committed Jul 21, 2023
1 parent 9a191b7 commit 0a0cede
Show file tree
Hide file tree
Showing 2 changed files with 88 additions and 8 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -317,8 +317,8 @@ object OverrideCompletions:
.sortBy(_.sourcePos.start)
val source = indexedContext.ctx.source

val shouldCompleteBraces = decls.isEmpty && hasBraces(text, defn).isEmpty

val shouldCompleteBraces =
decls.isEmpty && hasBracesOrColon(text, defn).isEmpty
val (startIndent, indent, lastIndent) =
calcIndent(defn, decls, source, text, shouldCompleteBraces)

Expand Down Expand Up @@ -475,7 +475,7 @@ object OverrideCompletions:
private def inferEditPosition(text: String, defn: TargetDef)(using
Context
): SourcePosition =
val span = hasBraces(text, defn)
val span = hasBracesOrColon(text, defn)
.map { offset =>
defn.sourcePos.span.withStart(offset + 1).withEnd(offset + 1)
}
Expand All @@ -485,7 +485,9 @@ object OverrideCompletions:
defn.sourcePos.withSpan(span)
end inferEditPosition

private def hasBraces(text: String, defn: TargetDef): Option[Int] =
private def hasBracesOrColon(text: String, defn: TargetDef)(using
Context
): Option[Int] =
def hasSelfTypeAnnot = defn match
case td: TypeDef =>
td.rhs match
Expand All @@ -494,12 +496,20 @@ object OverrideCompletions:
case _ => false
case _ => false
val start = defn.span.start
val offset =
val braceOffset =
if hasSelfTypeAnnot then text.indexOf("=>", start) + 1
else text.indexOf("{", start)
if offset > 0 && offset < defn.span.end then Some(offset)
else None
end hasBraces
if braceOffset > 0 && braceOffset < defn.span.end then Some(braceOffset)
else hasColon(text, defn)
end hasBracesOrColon

private def hasColon(text: String, defn: TargetDef)(using
Context
): Option[Int] =
defn match
case td: TypeDef if text.charAt(td.rhs.span.end) == ':' =>
Some(td.rhs.span.end)
case _ => None

private def fallbackFromParent(parent: Tree, name: String)(using Context) =
val stats = parent match
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1201,6 +1201,76 @@ class AutoImplementAbstractMembersSuite extends BaseCodeActionSuite {
|""".stripMargin,
)

checkEdit(
"end-marker".tag(IgnoreScala2),
"""|package a
|
|object A {
| trait Base:
| def foo(x: Int): Int
| def bar(x: String): String
|
| class <<Concrete>> extends Base:
|
| end Concrete
|
|}
|""".stripMargin,
"""|package a
|
|object A {
| trait Base:
| def foo(x: Int): Int
| def bar(x: String): String
|
| class Concrete extends Base:
|
| override def foo(x: Int): Int = ???
|
| override def bar(x: String): String = ???
|
|
| end Concrete
|
|}
|""".stripMargin,
)

checkEdit(
"end-marker2".tag(IgnoreScala2),
"""|package a
|
|object A {
| trait Base:
| def foo(x: Int): Int
| def bar(x: String): String
|
| class <<Concrete>>(x: Int, y: String) extends Base:
|
| end Concrete
|
|}
|""".stripMargin,
"""|package a
|
|object A {
| trait Base:
| def foo(x: Int): Int
| def bar(x: String): String
|
| class Concrete(x: Int, y: String) extends Base:
|
| override def foo(x: Int): Int = ???
|
| override def bar(x: String): String = ???
|
|
| end Concrete
|
|}
|""".stripMargin,
)

def checkEdit(
name: TestOptions,
original: String,
Expand Down

0 comments on commit 0a0cede

Please sign in to comment.