Skip to content

Commit f074dce

Browse files
committed
create type and package nodes for package-info declarations
1 parent 5115030 commit f074dce

File tree

3 files changed

+41
-1
lines changed

3 files changed

+41
-1
lines changed

headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/stereotypes/StereotypesIndexer.java

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
import org.eclipse.jdt.core.dom.IPackageBinding;
2727
import org.eclipse.jdt.core.dom.ITypeBinding;
2828
import org.eclipse.jdt.core.dom.MethodDeclaration;
29+
import org.eclipse.jdt.core.dom.Name;
2930
import org.eclipse.jdt.core.dom.PackageDeclaration;
3031
import org.eclipse.jdt.core.dom.RecordDeclaration;
3132
import org.eclipse.jdt.core.dom.SimpleName;
@@ -83,6 +84,15 @@ public void addSymbols(RecordDeclaration recordDeclaration, SpringIndexerJavaCon
8384

8485
@Override
8586
public void addSymbols(PackageDeclaration packageDeclaration, SpringIndexerJavaContext context, TextDocument doc) {
87+
try {
88+
createStereotypeElementForPackage(packageDeclaration, context, doc);
89+
}
90+
catch (BadLocationException e) {
91+
log.error("error identifying location of type declaration", e);
92+
}
93+
}
94+
95+
private void createStereotypeElementForPackage(PackageDeclaration packageDeclaration, SpringIndexerJavaContext context, TextDocument doc) throws BadLocationException {
8696
if (!context.getDocURI().endsWith("package-info.java")) {
8797
return;
8898
}
@@ -103,6 +113,11 @@ public void addSymbols(PackageDeclaration packageDeclaration, SpringIndexerJavaC
103113

104114
StereotypePackageElement packageElement = new StereotypePackageElement(packageBinding.getName(), annotationTypes);
105115
context.getBeans().add(new CachedBean(context.getDocURI(), packageElement));
116+
117+
Name astNodeForLocation = packageDeclaration.getName();
118+
Location location = new Location(doc.getUri(), doc.toRange(astNodeForLocation.getStartPosition(), astNodeForLocation.getLength()));
119+
StereotypeClassElement classElement = new StereotypeClassElement(packageBinding.getName() + ".package-info", location, Set.of(), annotationTypes);
120+
context.getBeans().add(new CachedBean(context.getDocURI(), classElement));
106121
}
107122

108123
@Override

headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/utils/SpringIndexerJava.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -94,7 +94,7 @@ public class SpringIndexerJava implements SpringIndexer {
9494

9595
// whenever the implementation of the indexer changes in a way that the stored data in the cache is no longer valid,
9696
// we need to change the generation - this will result in a re-indexing due to no up-to-date cache data being found
97-
private static final String GENERATION = "GEN-25";
97+
private static final String GENERATION = "GEN-26";
9898
private static final String INDEX_FILES_TASK_ID = "index-java-source-files-task-";
9999

100100
private static final String SYMBOL_KEY = "symbols";

headless-services/spring-boot-language-server/src/test/java/org/springframework/ide/vscode/boot/java/stereotypes/StereotypesIndexerTest.java

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -91,8 +91,33 @@ void testOverallExistenceOfTypeElements() throws Exception {
9191

9292
@Test
9393
void testPackageElement() throws Exception {
94+
// check package elements for package-info
9495
List<StereotypePackageElement> packages = springIndex.getNodesOfType(StereotypePackageElement.class);
9596
assertEquals(2, packages.size()); // package nodes are created for package declarations in package-info.java files only
97+
98+
StereotypePackageElement packageElement1 = packages.stream().filter(packageElement -> packageElement.getPackageName().equals(("example"))).findFirst().get();
99+
StereotypePackageElement packageElement2 = packages.stream().filter(packageElement -> packageElement.getPackageName().equals(("example.application"))).findFirst().get();
100+
101+
List<String> annotationTypes1 = packageElement1.getAnnotationTypes();
102+
assertEquals(1, annotationTypes1.size());
103+
assertEquals("org.jmolecules.architecture.hexagonal.Port", annotationTypes1.get(0));
104+
105+
List<String> annotationTypes2 = packageElement2.getAnnotationTypes();
106+
assertEquals(1, annotationTypes2.size());
107+
assertEquals("org.jmolecules.architecture.hexagonal.Application", annotationTypes2.get(0));
108+
109+
// check type elements for package-info
110+
List<StereotypeClassElement> packagesTypeElements = springIndex.getNodesOfType(StereotypeClassElement.class);
111+
StereotypeClassElement packageClassElement1 = packagesTypeElements.stream().filter(packageType -> packageType.getType().equals(("example.package-info"))).findFirst().get();
112+
StereotypeClassElement packageClassElement2 = packagesTypeElements.stream().filter(packageType -> packageType.getType().equals(("example.application.package-info"))).findFirst().get();
113+
114+
List<String> packageTypeAnnotations1 = packageClassElement1.getAnnotationTypes();
115+
assertEquals(1, packageTypeAnnotations1.size());
116+
assertEquals("org.jmolecules.architecture.hexagonal.Port", packageTypeAnnotations1.get(0));
117+
118+
List<String> packageTypeAnnotations2 = packageClassElement2.getAnnotationTypes();
119+
assertEquals(1, packageTypeAnnotations2.size());
120+
assertEquals("org.jmolecules.architecture.hexagonal.Application", packageTypeAnnotations2.get(0));
96121
}
97122

98123
@Test

0 commit comments

Comments
 (0)