From 9dacd4378cdb7c5a1222e564a22aa99a676af526 Mon Sep 17 00:00:00 2001 From: Sebastian Hartte Date: Sun, 14 Dec 2025 12:48:04 +0100 Subject: [PATCH] Fix interface injection deduplication when all injected interfaces are already present --- .../jst/interfaceinjection/InjectInterfacesVisitor.java | 4 ++++ .../deduplication/expected/pkg/Example.java | 6 ++++++ .../deduplication/injectedinterfaces.json | 3 +++ .../deduplication/source/pkg/Example.java | 6 ++++++ .../src/test/java/net/neoforged/jst/tests/EmbeddedTest.java | 5 +++++ 5 files changed, 24 insertions(+) create mode 100644 tests/data/interfaceinjection/deduplication/expected/pkg/Example.java create mode 100644 tests/data/interfaceinjection/deduplication/injectedinterfaces.json create mode 100644 tests/data/interfaceinjection/deduplication/source/pkg/Example.java diff --git a/interfaceinjection/src/main/java/net/neoforged/jst/interfaceinjection/InjectInterfacesVisitor.java b/interfaceinjection/src/main/java/net/neoforged/jst/interfaceinjection/InjectInterfacesVisitor.java index f129240..314fc07 100644 --- a/interfaceinjection/src/main/java/net/neoforged/jst/interfaceinjection/InjectInterfacesVisitor.java +++ b/interfaceinjection/src/main/java/net/neoforged/jst/interfaceinjection/InjectInterfacesVisitor.java @@ -79,6 +79,10 @@ private void inject(PsiClass psiClass, Collection targets) { .sorted(Comparator.naturalOrder()) .collect(Collectors.joining(", ")); + if (interfaceImplementation.isEmpty()) { + return; // Nothing to do, all injected interfaces are already present + } + if (implementsList.getChildren().length == 0) { StringBuilder text = new StringBuilder(); diff --git a/tests/data/interfaceinjection/deduplication/expected/pkg/Example.java b/tests/data/interfaceinjection/deduplication/expected/pkg/Example.java new file mode 100644 index 0000000..2b0642d --- /dev/null +++ b/tests/data/interfaceinjection/deduplication/expected/pkg/Example.java @@ -0,0 +1,6 @@ +package pkg; + +import java.util.Set; + +public class Example implements Set { +} diff --git a/tests/data/interfaceinjection/deduplication/injectedinterfaces.json b/tests/data/interfaceinjection/deduplication/injectedinterfaces.json new file mode 100644 index 0000000..b9b77c7 --- /dev/null +++ b/tests/data/interfaceinjection/deduplication/injectedinterfaces.json @@ -0,0 +1,3 @@ +{ + "pkg/Example": "java/util/Set" +} diff --git a/tests/data/interfaceinjection/deduplication/source/pkg/Example.java b/tests/data/interfaceinjection/deduplication/source/pkg/Example.java new file mode 100644 index 0000000..2b0642d --- /dev/null +++ b/tests/data/interfaceinjection/deduplication/source/pkg/Example.java @@ -0,0 +1,6 @@ +package pkg; + +import java.util.Set; + +public class Example implements Set { +} diff --git a/tests/src/test/java/net/neoforged/jst/tests/EmbeddedTest.java b/tests/src/test/java/net/neoforged/jst/tests/EmbeddedTest.java index 34372f8..3f195b8 100644 --- a/tests/src/test/java/net/neoforged/jst/tests/EmbeddedTest.java +++ b/tests/src/test/java/net/neoforged/jst/tests/EmbeddedTest.java @@ -316,6 +316,11 @@ void testSimpleInjection() throws Exception { runInterfaceInjectionTest("simple_injection", tempDir); } + @Test + void testDeduplication() throws Exception { + runInterfaceInjectionTest("deduplication", tempDir); + } + @Test void testAdditiveInjection() throws Exception { runInterfaceInjectionTest("additive_injection", tempDir);