From 81ce79345d62e50a99f10a3d9c56e66d9fbdac9a Mon Sep 17 00:00:00 2001 From: aboyko Date: Fri, 31 Mar 2023 11:47:29 -0400 Subject: [PATCH] Test to ensure resolved types in JavaData --- .../jdt/ls/commons/test/JavaDataTest.java | 60 ++++++++++++++++ .../test-projects/java-data/pom.xml | 5 ++ .../src/main/java/com/java/data/C.java | 17 +++++ .../java/com/java/data/ExampleProperties.java | 72 +++++++++++++++++++ .../tooling/jdt/ls/commons/java/JavaData.java | 15 +--- 5 files changed, 157 insertions(+), 12 deletions(-) create mode 100644 headless-services/jdt-ls-extension/org.springframework.tooling.jdt.ls.commons.test/test-projects/java-data/src/main/java/com/java/data/C.java create mode 100644 headless-services/jdt-ls-extension/org.springframework.tooling.jdt.ls.commons.test/test-projects/java-data/src/main/java/com/java/data/ExampleProperties.java diff --git a/headless-services/jdt-ls-extension/org.springframework.tooling.jdt.ls.commons.test/src/org/springframework/tooling/jdt/ls/commons/test/JavaDataTest.java b/headless-services/jdt-ls-extension/org.springframework.tooling.jdt.ls.commons.test/src/org/springframework/tooling/jdt/ls/commons/test/JavaDataTest.java index a921212b6..e85a3916e 100644 --- a/headless-services/jdt-ls-extension/org.springframework.tooling.jdt.ls.commons.test/src/org/springframework/tooling/jdt/ls/commons/test/JavaDataTest.java +++ b/headless-services/jdt-ls-extension/org.springframework.tooling.jdt.ls.commons.test/src/org/springframework/tooling/jdt/ls/commons/test/JavaDataTest.java @@ -12,6 +12,7 @@ package org.springframework.tooling.jdt.ls.commons.test; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertTrue; import org.eclipse.core.resources.IProject; import org.eclipse.jdt.core.IJavaElement; @@ -21,8 +22,10 @@ import org.junit.After; import org.junit.Rule; import org.junit.Test; import org.junit.rules.TemporaryFolder; +import org.springframework.ide.vscode.commons.protocol.java.JavaTypeData.JavaTypeKind; import org.springframework.ide.vscode.commons.protocol.java.TypeData; import org.springframework.ide.vscode.commons.protocol.java.TypeData.FieldData; +import org.springframework.ide.vscode.commons.protocol.java.TypeData.MethodData; import org.springframework.tooling.jdt.ls.commons.Logger; import org.springframework.tooling.jdt.ls.commons.java.JavaData; @@ -106,4 +109,61 @@ public class JavaDataTest { assertEquals("roles", f.getName()); assertEquals("Ljava/util/List;", f.getType().getName()); } + + @Test public void resolvedTypeForMembers() throws Exception { + IProject project = TestUtils.createTestProject("java-data", tmp); + TypeData d = javaData.typeData(project.getLocationURI().toASCIIString(), "Lcom/java/data/ExampleProperties$SomeProperties;", false); + assertNotNull(d); + assertEquals(2, d.getFields().size()); + assertEquals(4, d.getMethods().size()); + + FieldData field = d.getFields().get(0); + assertEquals("enumValue", field.getName()); + assertEquals(JavaTypeKind.CLASS, field.getType().getKind()); + assertEquals("Lcom/java/data/C$E;", field.getType().getName()); + + TypeData enumData = javaData.typeData(project.getLocationURI().toASCIIString(), "Lcom/java/data/C$E;", false); + assertNotNull(enumData); + assertTrue(enumData.isEnum()); + assertEquals(2, enumData.getFields().size()); + + field = d.getFields().get(1); + assertEquals("listOfEnums", field.getName()); + assertEquals(JavaTypeKind.PARAMETERIZED, field.getType().getKind()); + assertEquals("Ljava/util/Set;", field.getType().getName()); + + MethodData m = d.getMethods().get(2); + assertEquals("getListOfEnums", m.getName()); + assertEquals(JavaTypeKind.PARAMETERIZED, m.getReturnType().getKind()); + assertEquals("Ljava/util/Set;", m.getReturnType().getName()); + + d = javaData.typeData(project.getLocationURI().toASCIIString(), "Lcom/java/data/ExampleProperties;", false); + assertNotNull(d); + assertEquals(5, d.getFields().size()); + + field = d.getFields().get(0); + assertEquals("PREFIX", field.getName()); + assertEquals(JavaTypeKind.CLASS, field.getType().getKind()); + assertEquals("Ljava/lang/String;", field.getType().getName()); + + field = d.getFields().get(1); + assertEquals("enumValue", field.getName()); + assertEquals(JavaTypeKind.CLASS, field.getType().getKind()); + assertEquals("Lcom/java/data/C$E;", field.getType().getName()); + + field = d.getFields().get(2); + assertEquals("listOfEnums", field.getName()); + assertEquals(JavaTypeKind.PARAMETERIZED, field.getType().getKind()); + assertEquals("Ljava/util/Set;", field.getType().getName()); + + field = d.getFields().get(3); + assertEquals("listProperties", field.getName()); + assertEquals(JavaTypeKind.PARAMETERIZED, field.getType().getKind()); + assertEquals("Ljava/util/Set;", field.getType().getName()); + + field = d.getFields().get(4); + assertEquals("mapProperties", field.getName()); + assertEquals(JavaTypeKind.PARAMETERIZED, field.getType().getKind()); + assertEquals("Ljava/util/Map;", field.getType().getName()); + } } diff --git a/headless-services/jdt-ls-extension/org.springframework.tooling.jdt.ls.commons.test/test-projects/java-data/pom.xml b/headless-services/jdt-ls-extension/org.springframework.tooling.jdt.ls.commons.test/test-projects/java-data/pom.xml index 5e4a0d607..51f18320d 100644 --- a/headless-services/jdt-ls-extension/org.springframework.tooling.jdt.ls.commons.test/test-projects/java-data/pom.xml +++ b/headless-services/jdt-ls-extension/org.springframework.tooling.jdt.ls.commons.test/test-projects/java-data/pom.xml @@ -27,6 +27,11 @@ spring-boot-starter-test test + + org.springframework.boot + spring-boot-configuration-processor + true + diff --git a/headless-services/jdt-ls-extension/org.springframework.tooling.jdt.ls.commons.test/test-projects/java-data/src/main/java/com/java/data/C.java b/headless-services/jdt-ls-extension/org.springframework.tooling.jdt.ls.commons.test/test-projects/java-data/src/main/java/com/java/data/C.java new file mode 100644 index 000000000..661276ee8 --- /dev/null +++ b/headless-services/jdt-ls-extension/org.springframework.tooling.jdt.ls.commons.test/test-projects/java-data/src/main/java/com/java/data/C.java @@ -0,0 +1,17 @@ +package com.java.data; + +public class C { + + public enum E { + /** + * Javadoc for YES here + */ + YES, + + /** + * Javadoc for NO here + */ + NO + } + +} diff --git a/headless-services/jdt-ls-extension/org.springframework.tooling.jdt.ls.commons.test/test-projects/java-data/src/main/java/com/java/data/ExampleProperties.java b/headless-services/jdt-ls-extension/org.springframework.tooling.jdt.ls.commons.test/test-projects/java-data/src/main/java/com/java/data/ExampleProperties.java new file mode 100644 index 000000000..069c1b735 --- /dev/null +++ b/headless-services/jdt-ls-extension/org.springframework.tooling.jdt.ls.commons.test/test-projects/java-data/src/main/java/com/java/data/ExampleProperties.java @@ -0,0 +1,72 @@ +package com.java.data; + +import java.util.Map; +import java.util.Set; + +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.validation.annotation.Validated; + +@ConfigurationProperties(prefix = ExampleProperties.PREFIX) +@Validated +public class ExampleProperties { + + public static final String PREFIX = "app"; + + public C.E enumValue; + + private Set listOfEnums; + + private Set listProperties; + + private Map mapProperties; + + public C.E getEnumValue() { + return enumValue; + } + + public void setEnumValue(C.E enumValue) { + this.enumValue = enumValue; + } + + public Set getListOfEnums() { + return listOfEnums; + } + + public void setListOfEnums(Set listOfEnums) { + this.listOfEnums = listOfEnums; + } + + public Set getListProperties() { + return listProperties; + } + + public void setListProperties(Set listProperties) { + this.listProperties = listProperties; + } + + public Map getMapProperties() { + return mapProperties; + } + + public void setMapProperties(Map mapProperties) { + this.mapProperties = mapProperties; + } + + public static class SomeProperties { + private C.E enumValue; + private Set listOfEnums; + public C.E getEnumValue() { + return enumValue; + } + public void setEnumValue(C.E enumValue) { + this.enumValue = enumValue; + } + public Set getListOfEnums() { + return listOfEnums; + } + public void setListOfEnums(Set listOfEnums) { + this.listOfEnums = listOfEnums; + } + } + +} diff --git a/headless-services/jdt-ls-extension/org.springframework.tooling.jdt.ls.commons/src/org/springframework/tooling/jdt/ls/commons/java/JavaData.java b/headless-services/jdt-ls-extension/org.springframework.tooling.jdt.ls.commons/src/org/springframework/tooling/jdt/ls/commons/java/JavaData.java index ef952081a..aee3d899f 100644 --- a/headless-services/jdt-ls-extension/org.springframework.tooling.jdt.ls.commons/src/org/springframework/tooling/jdt/ls/commons/java/JavaData.java +++ b/headless-services/jdt-ls-extension/org.springframework.tooling.jdt.ls.commons/src/org/springframework/tooling/jdt/ls/commons/java/JavaData.java @@ -486,21 +486,12 @@ public class JavaData { if (type != null) { // Attempt to resolve type. For some reason JDT has them unresolved for type members try { - String[][] resolved = type.resolveType(signature.substring(1, signature.length() - 1)); - if (resolved == null) { - String signatureSimpleName = Signature.getSignatureSimpleName(signature); - String resolvedType = resolveFQName(type, signatureSimpleName); - if (resolvedType != null) { - data.setKind(JavaTypeKind.CLASS); - nameToSet = "L" + resolvedType + ";"; - break; - } - } else { + String resolvedType = resolveFQName(type, signature.substring(1, signature.length() - 1)); + if (resolvedType != null) { data.setKind(JavaTypeKind.CLASS); - nameToSet = "L" + resolved[0][0] + '.' + resolved[0][1] + ";"; + nameToSet = "L" + resolvedType + ";"; break; } - } catch (JavaModelException e) { data.setKind(JavaTypeKind.UNRESOLVED); }