From 45e4eb526dc6cd7975f0314165b6bf282ec06951 Mon Sep 17 00:00:00 2001 From: ghostbuster91 Date: Tue, 5 Oct 2021 21:20:47 +0200 Subject: [PATCH 1/3] Do not perform completion on higher kinded trees --- .../tools/dotc/interactive/Completion.scala | 11 ++++++----- .../interactive/CustomCompletionTests.scala | 18 ++++++++++++++++++ 2 files changed, 24 insertions(+), 5 deletions(-) diff --git a/compiler/src/dotty/tools/dotc/interactive/Completion.scala b/compiler/src/dotty/tools/dotc/interactive/Completion.scala index 7a808aafb481..3b609a9f5760 100644 --- a/compiler/src/dotty/tools/dotc/interactive/Completion.scala +++ b/compiler/src/dotty/tools/dotc/interactive/Completion.scala @@ -114,11 +114,12 @@ object Completion { val completions = path match { // Ignore synthetic select from `This` because in code it was `Ident` // See example in dotty.tools.languageserver.CompletionTest.syntheticThis - case Select(qual @ This(_), _) :: _ if qual.span.isSynthetic => completer.scopeCompletions - case Select(qual, _) :: _ => completer.selectionCompletions(qual) - case Import(expr, _) :: _ => completer.directMemberCompletions(expr) - case (_: untpd.ImportSelector) :: Import(expr, _) :: _ => completer.directMemberCompletions(expr) - case _ => completer.scopeCompletions + case Select(qual @ This(_), _) :: _ if qual.span.isSynthetic => completer.scopeCompletions + case Select(qual, _) :: _ if !qual.tpe.hasSimpleKind => Map.empty + case Select(qual, _) :: _ => completer.selectionCompletions(qual) + case Import(expr, _) :: _ => completer.directMemberCompletions(expr) + case (_: untpd.ImportSelector) :: Import(expr, _) :: _ => completer.directMemberCompletions(expr) + case _ => completer.scopeCompletions } val describedCompletions = describeCompletions(completions) diff --git a/compiler/test/dotty/tools/dotc/interactive/CustomCompletionTests.scala b/compiler/test/dotty/tools/dotc/interactive/CustomCompletionTests.scala index ddd44ea7daf0..736c25bdd969 100644 --- a/compiler/test/dotty/tools/dotc/interactive/CustomCompletionTests.scala +++ b/compiler/test/dotty/tools/dotc/interactive/CustomCompletionTests.scala @@ -169,3 +169,21 @@ class CustomCompletionTests extends DottyTest: assert(offset == prefix.length) assert(labels.contains("scala.Function2")) + + @Test def i12465_hkt(): Unit = + val prefix = "???.asInstanceOf[scala.collection.Seq]" + val input = prefix + "." + + val (offset, completions0) = completions(input) + val labels = completions0.map(_.label) + + assert(labels.isEmpty) + + @Test def i12465_hkt_alias(): Unit = + val prefix = "???.asInstanceOf[Seq]" + val input = prefix + "." + + val (offset, completions0) = completions(input) + val labels = completions0.map(_.label) + + assert(labels.isEmpty) From beaaab5c95694af0473c71a37ced464595eb4ecb Mon Sep 17 00:00:00 2001 From: ghostbuster91 Date: Wed, 6 Oct 2021 17:30:23 +0200 Subject: [PATCH 2/3] Simplify code by reordering conditions --- .../dotty/tools/dotc/interactive/Completion.scala | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/compiler/src/dotty/tools/dotc/interactive/Completion.scala b/compiler/src/dotty/tools/dotc/interactive/Completion.scala index 3b609a9f5760..68cc0b37fd56 100644 --- a/compiler/src/dotty/tools/dotc/interactive/Completion.scala +++ b/compiler/src/dotty/tools/dotc/interactive/Completion.scala @@ -114,12 +114,12 @@ object Completion { val completions = path match { // Ignore synthetic select from `This` because in code it was `Ident` // See example in dotty.tools.languageserver.CompletionTest.syntheticThis - case Select(qual @ This(_), _) :: _ if qual.span.isSynthetic => completer.scopeCompletions - case Select(qual, _) :: _ if !qual.tpe.hasSimpleKind => Map.empty - case Select(qual, _) :: _ => completer.selectionCompletions(qual) - case Import(expr, _) :: _ => completer.directMemberCompletions(expr) - case (_: untpd.ImportSelector) :: Import(expr, _) :: _ => completer.directMemberCompletions(expr) - case _ => completer.scopeCompletions + case Select(qual @ This(_), _) :: _ if qual.span.isSynthetic => completer.scopeCompletions + case Select(qual, _) :: _ if qual.tpe.hasSimpleKind => completer.selectionCompletions(qual) + case Select(qual, _) :: _ => Map.empty + case Import(expr, _) :: _ => completer.directMemberCompletions(expr) + case (_: untpd.ImportSelector) :: Import(expr, _) :: _ => completer.directMemberCompletions(expr) + case _ => completer.scopeCompletions } val describedCompletions = describeCompletions(completions) From f64a0fece465088f77f25a74318e229870c9f4a2 Mon Sep 17 00:00:00 2001 From: ghostbuster91 Date: Wed, 6 Oct 2021 17:38:19 +0200 Subject: [PATCH 3/3] Move tests to CompletionTests --- .../interactive/CustomCompletionTests.scala | 17 ----------------- .../tools/languageserver/CompletionTest.scala | 8 ++++++++ 2 files changed, 8 insertions(+), 17 deletions(-) diff --git a/compiler/test/dotty/tools/dotc/interactive/CustomCompletionTests.scala b/compiler/test/dotty/tools/dotc/interactive/CustomCompletionTests.scala index 736c25bdd969..ccf211136d51 100644 --- a/compiler/test/dotty/tools/dotc/interactive/CustomCompletionTests.scala +++ b/compiler/test/dotty/tools/dotc/interactive/CustomCompletionTests.scala @@ -170,20 +170,3 @@ class CustomCompletionTests extends DottyTest: assert(offset == prefix.length) assert(labels.contains("scala.Function2")) - @Test def i12465_hkt(): Unit = - val prefix = "???.asInstanceOf[scala.collection.Seq]" - val input = prefix + "." - - val (offset, completions0) = completions(input) - val labels = completions0.map(_.label) - - assert(labels.isEmpty) - - @Test def i12465_hkt_alias(): Unit = - val prefix = "???.asInstanceOf[Seq]" - val input = prefix + "." - - val (offset, completions0) = completions(input) - val labels = completions0.map(_.label) - - assert(labels.isEmpty) diff --git a/language-server/test/dotty/tools/languageserver/CompletionTest.scala b/language-server/test/dotty/tools/languageserver/CompletionTest.scala index ebeff2f44a29..7e71c0a4c2b1 100644 --- a/language-server/test/dotty/tools/languageserver/CompletionTest.scala +++ b/language-server/test/dotty/tools/languageserver/CompletionTest.scala @@ -887,4 +887,12 @@ class CompletionTest { ) ) } + + @Test def i12465_hkt: Unit = + code"""???.asInstanceOf[scala.collection.Seq].${m1}""".withSource + .completion(m1, Set()) + + @Test def i12465_hkt_alias: Unit = + code"""???.asInstanceOf[Seq].${m1}""".withSource + .completion(m1, Set()) }