diff --git a/mtags-java/src/main/scala/scala/meta/internal/pc/JavaCompletionProvider.scala b/mtags-java/src/main/scala/scala/meta/internal/pc/JavaCompletionProvider.scala index 326c3de1ec4..b1fe39e9382 100644 --- a/mtags-java/src/main/scala/scala/meta/internal/pc/JavaCompletionProvider.scala +++ b/mtags-java/src/main/scala/scala/meta/internal/pc/JavaCompletionProvider.scala @@ -36,7 +36,9 @@ class JavaCompletionProvider( lazy val identifier = extractIdentifier.toLowerCase def completions(): CompletionList = { val nextIsWhitespace = - params.text().charAt(params.offset()).isWhitespace + if (params.offset() < params.text().length()) + params.text().charAt(params.offset()).isWhitespace + else false val textWithSemicolon = if (nextIsWhitespace) params.text().substring(0, params.offset()) + diff --git a/mtags/src/main/scala/scala/meta/internal/mtags/JavaToplevelMtags.scala b/mtags/src/main/scala/scala/meta/internal/mtags/JavaToplevelMtags.scala index 8a5bf0550e4..80fee852cfb 100644 --- a/mtags/src/main/scala/scala/meta/internal/mtags/JavaToplevelMtags.scala +++ b/mtags/src/main/scala/scala/meta/internal/mtags/JavaToplevelMtags.scala @@ -80,7 +80,7 @@ class JavaToplevelMtags(val input: Input.VirtualFile) extends MtagsIndexer { @tailrec def kwOrIdent(start: Int, builder: StringBuilder): Token = { val ch = reader.ch - if (Character.isJavaIdentifierPart(ch)) { + if (ch != SU && Character.isJavaIdentifierPart(ch)) { reader.nextChar() kwOrIdent(start, builder.append(ch)) } else if (builder.isEmpty) { diff --git a/tests/javapc/src/test/scala/pc/CompletionKeywordSuite.scala b/tests/javapc/src/test/scala/pc/CompletionKeywordSuite.scala index fb1ea5686cc..820a7a85ffa 100644 --- a/tests/javapc/src/test/scala/pc/CompletionKeywordSuite.scala +++ b/tests/javapc/src/test/scala/pc/CompletionKeywordSuite.scala @@ -53,6 +53,15 @@ class CompletionKeywordSuite extends BaseJavaCompletionSuite { |""".stripMargin, ) + check( + "end of file", + """ + |pac@@""".stripMargin, + """ + |package + |""".stripMargin, + ) + check( "extends", """