From 37d1f9e3b45ad6c06bc0403545b5bb70c212682b Mon Sep 17 00:00:00 2001 From: Emily Date: Tue, 10 Sep 2024 22:53:09 -0300 Subject: [PATCH 1/2] Fix infinite recursion when a `@Suggestions` method returns a CompletableFuture --- .../suggestion/MethodSuggestionProvider.java | 2 +- .../feature/MethodSuggestionProviderTest.java | 13 +++++++++++++ 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/cloud-annotations/src/main/java/org/incendo/cloud/annotations/suggestion/MethodSuggestionProvider.java b/cloud-annotations/src/main/java/org/incendo/cloud/annotations/suggestion/MethodSuggestionProvider.java index e34139554..a626d6611 100644 --- a/cloud-annotations/src/main/java/org/incendo/cloud/annotations/suggestion/MethodSuggestionProvider.java +++ b/cloud-annotations/src/main/java/org/incendo/cloud/annotations/suggestion/MethodSuggestionProvider.java @@ -87,7 +87,7 @@ public MethodSuggestionProvider( @SuppressWarnings("rawtypes") public static @NonNull CompletableFuture> mapSuggestions(final @NonNull Object input) { if (input instanceof CompletableFuture) { - return mapSuggestions((CompletableFuture) input); + return mapFuture((CompletableFuture) input); } return CompletableFuture.completedFuture(mapCompleted(input)); } diff --git a/cloud-annotations/src/test/java/org/incendo/cloud/annotations/feature/MethodSuggestionProviderTest.java b/cloud-annotations/src/test/java/org/incendo/cloud/annotations/feature/MethodSuggestionProviderTest.java index 3788af0fb..a470aaf7f 100644 --- a/cloud-annotations/src/test/java/org/incendo/cloud/annotations/feature/MethodSuggestionProviderTest.java +++ b/cloud-annotations/src/test/java/org/incendo/cloud/annotations/feature/MethodSuggestionProviderTest.java @@ -26,6 +26,7 @@ import java.util.Collections; import java.util.List; import java.util.Set; +import java.util.concurrent.CompletableFuture; import java.util.stream.Stream; import org.checkerframework.checker.nullness.qual.NonNull; import org.incendo.cloud.CommandManager; @@ -94,6 +95,7 @@ void testSuggestions(final @NonNull Object instance) { named("set source", new TestClassSet()), named("stream source", new TestClassStream()), named("iterable source", new TestClassIterable()), + named("future list source", new TestClassFutureList()), named("string list source", new TestClassListString()), named("source with CommandInput injected", new TestClassCommandInput()), named("source with injected value", new TestInjectedValue()) @@ -156,6 +158,17 @@ public static final class TestClassListString { } } + public static final class TestClassFutureList { + + @Suggestions("suggestions") + public @NonNull CompletableFuture<@NonNull Iterable<@NonNull Suggestion>> suggestions( + final @NonNull CommandContext context, + final @NonNull String input + ) { + return CompletableFuture.completedFuture(Collections.singletonList(Suggestion.suggestion("foo"))); + } + } + public static final class TestClassCommandInput { @Suggestions("suggestions") From c9e7dd49542dc791346fb753bf1cee576f73a002 Mon Sep 17 00:00:00 2001 From: Emily Date: Tue, 10 Sep 2024 23:08:57 -0300 Subject: [PATCH 2/2] Name future test suggestion source more properly --- .../cloud/annotations/feature/MethodSuggestionProviderTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cloud-annotations/src/test/java/org/incendo/cloud/annotations/feature/MethodSuggestionProviderTest.java b/cloud-annotations/src/test/java/org/incendo/cloud/annotations/feature/MethodSuggestionProviderTest.java index a470aaf7f..3e9fea28e 100644 --- a/cloud-annotations/src/test/java/org/incendo/cloud/annotations/feature/MethodSuggestionProviderTest.java +++ b/cloud-annotations/src/test/java/org/incendo/cloud/annotations/feature/MethodSuggestionProviderTest.java @@ -95,7 +95,7 @@ void testSuggestions(final @NonNull Object instance) { named("set source", new TestClassSet()), named("stream source", new TestClassStream()), named("iterable source", new TestClassIterable()), - named("future list source", new TestClassFutureList()), + named("list future source", new TestClassFutureList()), named("string list source", new TestClassListString()), named("source with CommandInput injected", new TestClassCommandInput()), named("source with injected value", new TestInjectedValue())