summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJason Zaugg <jzaugg@gmail.com>2016-11-29 10:45:32 +1000
committerGitHub <noreply@github.com>2016-11-29 10:45:32 +1000
commit57290a1c72d4565892f3595d9d8c3fba1086ec6b (patch)
tree5167cd44ac06cb64826d07751d9d303d4a1d9f15
parent73687e9a6fa817838cd6ef47f3552785b3270805 (diff)
parent76155fa4e9ef103de4b8283097f6cde18c6f1e08 (diff)
downloadscala-57290a1c72d4565892f3595d9d8c3fba1086ec6b.tar.gz
scala-57290a1c72d4565892f3595d9d8c3fba1086ec6b.tar.bz2
scala-57290a1c72d4565892f3595d9d8c3fba1086ec6b.zip
Merge pull request #5553 from retronym/ticket/SD-271
Improve performance of REPL autocompletion
-rw-r--r--src/interactive/scala/tools/nsc/interactive/Global.scala3
-rw-r--r--test/junit/scala/tools/nsc/interpreter/CompletionTest.scala8
2 files changed, 10 insertions, 1 deletions
diff --git a/src/interactive/scala/tools/nsc/interactive/Global.scala b/src/interactive/scala/tools/nsc/interactive/Global.scala
index 27a02c46a2..5c00d67888 100644
--- a/src/interactive/scala/tools/nsc/interactive/Global.scala
+++ b/src/interactive/scala/tools/nsc/interactive/Global.scala
@@ -1202,7 +1202,8 @@ class Global(settings: Settings, _reporter: Reporter, projectName: String = "")
case Nil => entered.isEmpty && matchCount > 0
case head :: tail =>
val enteredAlternatives = Set(entered, entered.capitalize)
- head.inits.filter(_.length <= entered.length).exists(init =>
+ val n = (head, entered).zipped.count {case (c, e) => c == e || (c.isUpper && c == e.toUpper)}
+ head.take(n).inits.exists(init =>
enteredAlternatives.exists(entered =>
lenientMatch(entered.stripPrefix(init), tail, matchCount + (if (init.isEmpty) 0 else 1))
)
diff --git a/test/junit/scala/tools/nsc/interpreter/CompletionTest.scala b/test/junit/scala/tools/nsc/interpreter/CompletionTest.scala
index 78ebb7cf9c..7c37be126d 100644
--- a/test/junit/scala/tools/nsc/interpreter/CompletionTest.scala
+++ b/test/junit/scala/tools/nsc/interpreter/CompletionTest.scala
@@ -174,6 +174,14 @@ class CompletionTest {
checkExact(completer, "case class D(a: Int, b: Int) { this.a")("a", "asInstanceOf")
}
+ @Test
+ def performanceOfLenientMatch(): Unit = {
+ val intp = newIMain()
+ val completer = new PresentationCompilerCompleter(intp)
+ val ident: String = "thisIsAReallyLongMethodNameWithManyManyManyManyChunks"
+ checkExact(completer, s"($ident: Int) => tia")(ident)
+ }
+
def checkExact(completer: PresentationCompilerCompleter, before: String, after: String = "")(expected: String*): Unit = {
assertEquals(expected.toSet, completer.complete(before, after).candidates.toSet)
}