From d9e8a0cadc263c49b5c25e6a4eaa5b1bbd359493 Mon Sep 17 00:00:00 2001 From: Martin Lippert Date: Mon, 3 Feb 2025 13:23:37 +0100 Subject: [PATCH] GH-1461: add event type hierarchy to publisher index element --- .../java/beans/ComponentSymbolProvider.java | 5 ++++- .../events/EventPublisherIndexElement.java | 10 ++++++++- .../events/test/SpringIndexerEventsTest.java | 22 +++++++++++++++++++ .../events/demo/SpecializedCustomEvent.java | 6 ++++- 4 files changed, 40 insertions(+), 3 deletions(-) diff --git a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/beans/ComponentSymbolProvider.java b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/beans/ComponentSymbolProvider.java index ae5be1d2b..3bb788c11 100644 --- a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/beans/ComponentSymbolProvider.java +++ b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/beans/ComponentSymbolProvider.java @@ -172,7 +172,10 @@ public class ComponentSymbolProvider extends AbstractSymbolProvider { Location location; location = new Location(doc.getUri(), nodeRegion.asRange()); - EventPublisherIndexElement eventPublisherIndexElement = new EventPublisherIndexElement(eventTypeBinding.getQualifiedName(), location); + Set typesFromhierarchy = new HashSet<>(); + ASTUtils.findSupertypes(eventTypeBinding, typesFromhierarchy); + + EventPublisherIndexElement eventPublisherIndexElement = new EventPublisherIndexElement(eventTypeBinding.getQualifiedName(), location, typesFromhierarchy); Bean publisherBeanElement = findBean(node, methodInvocation, context, doc); if (publisherBeanElement != null) { publisherBeanElement.addChild(eventPublisherIndexElement); diff --git a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/events/EventPublisherIndexElement.java b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/events/EventPublisherIndexElement.java index efe94ff98..3756f4cfb 100644 --- a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/events/EventPublisherIndexElement.java +++ b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/events/EventPublisherIndexElement.java @@ -10,6 +10,8 @@ *******************************************************************************/ package org.springframework.ide.vscode.boot.java.events; +import java.util.Set; + import org.eclipse.lsp4j.Location; import org.springframework.ide.vscode.commons.protocol.spring.AbstractSpringIndexElement; @@ -20,10 +22,12 @@ public class EventPublisherIndexElement extends AbstractSpringIndexElement { private final String eventType; private final Location location; + private final Set eventTypesFromHierarchy; - public EventPublisherIndexElement(String eventType, Location location) { + public EventPublisherIndexElement(String eventType, Location location, Set eventTypesFromHierarchy) { this.eventType = eventType; this.location = location; + this.eventTypesFromHierarchy = eventTypesFromHierarchy; } public String getEventType() { @@ -34,4 +38,8 @@ public class EventPublisherIndexElement extends AbstractSpringIndexElement { return location; } + public Set getEventTypesFromHierarchy() { + return eventTypesFromHierarchy; + } + } diff --git a/headless-services/spring-boot-language-server/src/test/java/org/springframework/ide/vscode/boot/java/events/test/SpringIndexerEventsTest.java b/headless-services/spring-boot-language-server/src/test/java/org/springframework/ide/vscode/boot/java/events/test/SpringIndexerEventsTest.java index b016dbd3f..b0c7af7a8 100644 --- a/headless-services/spring-boot-language-server/src/test/java/org/springframework/ide/vscode/boot/java/events/test/SpringIndexerEventsTest.java +++ b/headless-services/spring-boot-language-server/src/test/java/org/springframework/ide/vscode/boot/java/events/test/SpringIndexerEventsTest.java @@ -10,6 +10,7 @@ *******************************************************************************/ package org.springframework.ide.vscode.boot.java.events.test; +import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertTrue; import static org.junit.jupiter.api.Assertions.assertEquals; @@ -17,6 +18,7 @@ import static org.junit.jupiter.api.Assertions.assertEquals; import java.io.File; import java.util.Arrays; import java.util.List; +import java.util.Set; import java.util.concurrent.CompletableFuture; import java.util.concurrent.TimeUnit; @@ -168,4 +170,24 @@ public class SpringIndexerEventsTest { assertEquals(new Range(new Position(15, 2), new Position(15, 48)), location.getRange()); } + @Test + void testEventPublisherWithEventTypeHierarchyIndexElements() throws Exception { + String docUri = directory.toPath().resolve("src/main/java/com/example/events/demo/SpecializedCustomEventPublisher.java").toUri().toString(); + + Bean[] beans = springIndex.getBeansOfDocument(docUri); + Bean listenerComponentBean = Arrays.stream(beans).filter(bean -> bean.getName().equals("specializedCustomEventPublisher")).findFirst().get(); + assertEquals("com.example.events.demo.SpecializedCustomEventPublisher", listenerComponentBean.getType()); + + List children = listenerComponentBean.getChildren(); + assertEquals(1, children.size()); + assertTrue(children.get(0) instanceof EventPublisherIndexElement); + + EventPublisherIndexElement publisherElement = (EventPublisherIndexElement) children.get(0); + assertEquals("com.example.events.demo.SpecializedCustomEvent", publisherElement.getEventType()); + Set eventTypesFromHierarchy = publisherElement.getEventTypesFromHierarchy(); + assertTrue(eventTypesFromHierarchy.contains("com.example.events.demo.CustomEvent")); + assertTrue(eventTypesFromHierarchy.contains("java.io.Serializable")); + assertFalse(eventTypesFromHierarchy.contains("java.lang.String")); + } + } diff --git a/headless-services/spring-boot-language-server/src/test/resources/test-projects/test-events-indexing/src/main/java/com/example/events/demo/SpecializedCustomEvent.java b/headless-services/spring-boot-language-server/src/test/resources/test-projects/test-events-indexing/src/main/java/com/example/events/demo/SpecializedCustomEvent.java index bd005f936..a80c5df2e 100644 --- a/headless-services/spring-boot-language-server/src/test/resources/test-projects/test-events-indexing/src/main/java/com/example/events/demo/SpecializedCustomEvent.java +++ b/headless-services/spring-boot-language-server/src/test/resources/test-projects/test-events-indexing/src/main/java/com/example/events/demo/SpecializedCustomEvent.java @@ -1,4 +1,8 @@ package com.example.events.demo; -public class SpecializedCustomEvent extends CustomEvent { +import java.io.Serializable; + +public class SpecializedCustomEvent extends CustomEvent implements Serializable { + + private static final long serialVersionUID = -6867577412741709537L; }