From 248098112e440ab652eb6fd10ed1dca8f649f41a Mon Sep 17 00:00:00 2001 From: Kris De Volder Date: Mon, 22 Oct 2018 16:49:39 -0700 Subject: [PATCH] Take inherited pojo properties into account In yaml / properties editor. --- .../classpath/ClasspathListenerManager.java | 1 - .../vscode/boot/metadata/types/TypeUtil.java | 11 ++- .../boot/test/ApplicationYamlEditorTest.java | 17 ++++ .../cloud-rabbit-project/.gitignore | 25 ++++++ .../cloud-rabbit-project/pom.xml | 80 +++++++++++++++++++ .../demo/CloudRabbitProjectApplication.java | 12 +++ .../src/main/resources/application.yml | 9 +++ .../CloudRabbitProjectApplicationTests.java | 16 ++++ 8 files changed, 167 insertions(+), 4 deletions(-) create mode 100644 headless-services/spring-boot-language-server/src/test/resources/test-projects/cloud-rabbit-project/.gitignore create mode 100644 headless-services/spring-boot-language-server/src/test/resources/test-projects/cloud-rabbit-project/pom.xml create mode 100644 headless-services/spring-boot-language-server/src/test/resources/test-projects/cloud-rabbit-project/src/main/java/com/example/demo/CloudRabbitProjectApplication.java create mode 100644 headless-services/spring-boot-language-server/src/test/resources/test-projects/cloud-rabbit-project/src/main/resources/application.yml create mode 100644 headless-services/spring-boot-language-server/src/test/resources/test-projects/cloud-rabbit-project/src/test/java/com/example/demo/CloudRabbitProjectApplicationTests.java diff --git a/headless-services/jdt-ls-extension/org.springframework.tooling.jdt.ls.commons/src/org/springframework/tooling/jdt/ls/commons/classpath/ClasspathListenerManager.java b/headless-services/jdt-ls-extension/org.springframework.tooling.jdt.ls.commons/src/org/springframework/tooling/jdt/ls/commons/classpath/ClasspathListenerManager.java index 957ec2775..94467d6bb 100644 --- a/headless-services/jdt-ls-extension/org.springframework.tooling.jdt.ls.commons/src/org/springframework/tooling/jdt/ls/commons/classpath/ClasspathListenerManager.java +++ b/headless-services/jdt-ls-extension/org.springframework.tooling.jdt.ls.commons/src/org/springframework/tooling/jdt/ls/commons/classpath/ClasspathListenerManager.java @@ -42,7 +42,6 @@ public class ClasspathListenerManager { @Override public void elementChanged(ElementChangedEvent event) { - logger.log("changeEvent = "+event); visit(event.getDelta()); } diff --git a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/metadata/types/TypeUtil.java b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/metadata/types/TypeUtil.java index 6f35a5f16..ce73a5e29 100644 --- a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/metadata/types/TypeUtil.java +++ b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/metadata/types/TypeUtil.java @@ -573,7 +573,7 @@ public class TypeUtil { private IType findType(String typeName) { try { - if (javaProject!=null) { + if (javaProject!=null && typeName!=null) { return javaProject.findType(typeName); } } catch (Exception e) { @@ -587,6 +587,8 @@ public class TypeUtil { } private static final Map VALUE_HINTERS = new HashMap<>(); + private static final Object JL_OBJECT = Object.class.getName(); + static { valueHints("java.nio.charset.Charset", new LazyProvider() { @Override @@ -721,8 +723,8 @@ public class TypeUtil { } private Stream getGetterMethods(IType eclipseType) { - if (eclipseType != null && eclipseType.isClass()) { - return eclipseType.getMethods().filter(m -> { + if (eclipseType != null && eclipseType.isClass() && !JL_OBJECT.equals(eclipseType.getFullyQualifiedName())) { + Stream getters = eclipseType.getMethods().filter(m -> { if (!isStatic(m) && isPublic(m)) { String mname = m.getElementName(); if ((mname.startsWith("get") && mname.length() >= 4) @@ -736,6 +738,9 @@ public class TypeUtil { } return false; }); + IType superType = findType(eclipseType.getSuperclassName()); + Stream superGetters = getGetterMethods(superType); + return Stream.concat(getters, superGetters); } return Stream.empty(); } diff --git a/headless-services/spring-boot-language-server/src/test/java/org/springframework/ide/vscode/boot/test/ApplicationYamlEditorTest.java b/headless-services/spring-boot-language-server/src/test/java/org/springframework/ide/vscode/boot/test/ApplicationYamlEditorTest.java index 6fbc106f3..9e5c117fa 100644 --- a/headless-services/spring-boot-language-server/src/test/java/org/springframework/ide/vscode/boot/test/ApplicationYamlEditorTest.java +++ b/headless-services/spring-boot-language-server/src/test/java/org/springframework/ide/vscode/boot/test/ApplicationYamlEditorTest.java @@ -63,6 +63,23 @@ public class ApplicationYamlEditorTest extends AbstractPropsEditorTest { //////////////////////////////////////////////////////////////////////////////////////// + @Test public void inheritedPojoProperties() throws Exception { + //See https://github.com/spring-projects/sts4/issues/116 + useProject(createPredefinedMavenProject("cloud-rabbit-project")); + + Editor editor = newEditor( + "spring:\n" + + " cloud:\n" + + " stream:\n" + + " rabbit:\n" + + " bindings:\n" + + " input:\n" + + " consumer:\n" + + " auto-bind-dlq: true" + ); + editor.assertProblems(/*NONE*/); + } + @Test public void bug_158348104() throws Exception { //See: https://www.pivotaltracker.com/story/show/158348104 data("spring.activemq.close-timeout", "java.time.Duration", null, null); diff --git a/headless-services/spring-boot-language-server/src/test/resources/test-projects/cloud-rabbit-project/.gitignore b/headless-services/spring-boot-language-server/src/test/resources/test-projects/cloud-rabbit-project/.gitignore new file mode 100644 index 000000000..82eca336e --- /dev/null +++ b/headless-services/spring-boot-language-server/src/test/resources/test-projects/cloud-rabbit-project/.gitignore @@ -0,0 +1,25 @@ +/target/ +!.mvn/wrapper/maven-wrapper.jar + +### STS ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache + +### IntelliJ IDEA ### +.idea +*.iws +*.iml +*.ipr + +### NetBeans ### +/nbproject/private/ +/build/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ \ No newline at end of file diff --git a/headless-services/spring-boot-language-server/src/test/resources/test-projects/cloud-rabbit-project/pom.xml b/headless-services/spring-boot-language-server/src/test/resources/test-projects/cloud-rabbit-project/pom.xml new file mode 100644 index 000000000..aaa7fd1b2 --- /dev/null +++ b/headless-services/spring-boot-language-server/src/test/resources/test-projects/cloud-rabbit-project/pom.xml @@ -0,0 +1,80 @@ + + + 4.0.0 + + com.example + cloud-rabbit-project + 0.0.1-SNAPSHOT + jar + + cloud-rabbit-project + Demo project for Spring Boot + + + org.springframework.boot + spring-boot-starter-parent + 2.0.6.RELEASE + + + + + UTF-8 + UTF-8 + 1.8 + Finchley.SR1 + + + + + org.springframework.boot + spring-boot-starter-amqp + + + org.springframework.cloud + spring-cloud-stream + + + org.springframework.cloud + spring-cloud-stream-binder-rabbit + + + + org.springframework.boot + spring-boot-starter-test + test + + + org.springframework.cloud + spring-cloud-stream-test-support + test + + + org.springframework.boot + spring-boot-starter-web + + + + + + + org.springframework.cloud + spring-cloud-dependencies + ${spring-cloud.version} + pom + import + + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + + + diff --git a/headless-services/spring-boot-language-server/src/test/resources/test-projects/cloud-rabbit-project/src/main/java/com/example/demo/CloudRabbitProjectApplication.java b/headless-services/spring-boot-language-server/src/test/resources/test-projects/cloud-rabbit-project/src/main/java/com/example/demo/CloudRabbitProjectApplication.java new file mode 100644 index 000000000..3063b1ca6 --- /dev/null +++ b/headless-services/spring-boot-language-server/src/test/resources/test-projects/cloud-rabbit-project/src/main/java/com/example/demo/CloudRabbitProjectApplication.java @@ -0,0 +1,12 @@ +package com.example.demo; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class CloudRabbitProjectApplication { + + public static void main(String[] args) { + SpringApplication.run(CloudRabbitProjectApplication.class, args); + } +} diff --git a/headless-services/spring-boot-language-server/src/test/resources/test-projects/cloud-rabbit-project/src/main/resources/application.yml b/headless-services/spring-boot-language-server/src/test/resources/test-projects/cloud-rabbit-project/src/main/resources/application.yml new file mode 100644 index 000000000..6c51d6ec3 --- /dev/null +++ b/headless-services/spring-boot-language-server/src/test/resources/test-projects/cloud-rabbit-project/src/main/resources/application.yml @@ -0,0 +1,9 @@ +spring: + cloud: + stream: + rabbit: + bindings: + input: + consumer: + auto-bing-dlq: true + \ No newline at end of file diff --git a/headless-services/spring-boot-language-server/src/test/resources/test-projects/cloud-rabbit-project/src/test/java/com/example/demo/CloudRabbitProjectApplicationTests.java b/headless-services/spring-boot-language-server/src/test/resources/test-projects/cloud-rabbit-project/src/test/java/com/example/demo/CloudRabbitProjectApplicationTests.java new file mode 100644 index 000000000..9746ea453 --- /dev/null +++ b/headless-services/spring-boot-language-server/src/test/resources/test-projects/cloud-rabbit-project/src/test/java/com/example/demo/CloudRabbitProjectApplicationTests.java @@ -0,0 +1,16 @@ +package com.example.demo; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.junit4.SpringRunner; + +@RunWith(SpringRunner.class) +@SpringBootTest +public class CloudRabbitProjectApplicationTests { + + @Test + public void contextLoads() { + } + +}