diff --git a/eclipse-language-servers/org.springframework.tooling.ls.eclipse.commons.test/src/org/springframework/tooling/ls/eclipse/commons/test/JavaLangugeClientTest.java b/eclipse-language-servers/org.springframework.tooling.ls.eclipse.commons.test/src/org/springframework/tooling/ls/eclipse/commons/test/JavaLangugeClientTest.java index b7a3080a5..d608b04f9 100644 --- a/eclipse-language-servers/org.springframework.tooling.ls.eclipse.commons.test/src/org/springframework/tooling/ls/eclipse/commons/test/JavaLangugeClientTest.java +++ b/eclipse-language-servers/org.springframework.tooling.ls.eclipse.commons.test/src/org/springframework/tooling/ls/eclipse/commons/test/JavaLangugeClientTest.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2019 Pivotal, Inc. + * Copyright (c) 2019, 2020 Pivotal, Inc. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at @@ -144,8 +144,8 @@ public class JavaLangugeClientTest { @Test public void map_Subtypes() throws Exception { List data = client - .javaSubTypes(new JavaTypeHierarchyParams(project.getLocationURI().toString(), "java.util.Map", false)) - .get(10, TimeUnit.SECONDS); + .javaSubTypes(new JavaTypeHierarchyParams(project.getLocationURI().toString(), "java.util.Map", false, false)) + .get(10, TimeUnit.SECONDS).stream().map(e -> e.getLeft()).collect(Collectors.toList()); assertNotNull(data); assertTrue(data.size() > 200); assertTrue(data.stream().filter(t -> "java.util.AbstractMap".equals(t.getFqName())).findFirst().isPresent()); @@ -154,8 +154,8 @@ public class JavaLangugeClientTest { @Test public void map_Subtypes_with_Itself() throws Exception { List data = client - .javaSubTypes(new JavaTypeHierarchyParams(project.getLocationURI().toString(), "java.util.Map", true)) - .get(10, TimeUnit.SECONDS); + .javaSubTypes(new JavaTypeHierarchyParams(project.getLocationURI().toString(), "java.util.Map", true, false)) + .get(10, TimeUnit.SECONDS).stream().map(e -> e.getLeft()).collect(Collectors.toList()); assertNotNull(data); assertTrue(data.size() > 200); assertTrue(data.stream().filter(t -> "java.util.Map".equals(t.getFqName())).findFirst().isPresent()); @@ -164,8 +164,8 @@ public class JavaLangugeClientTest { @Test public void arrayList_SuperTypes() throws Exception { List data = client - .javaSuperTypes(new JavaTypeHierarchyParams(project.getLocationURI().toString(), "java.util.ArrayList", false)) - .get(10, TimeUnit.SECONDS); + .javaSuperTypes(new JavaTypeHierarchyParams(project.getLocationURI().toString(), "java.util.ArrayList", false, false)) + .get(10, TimeUnit.SECONDS).stream().map(e -> e.getLeft()).collect(Collectors.toList()); assertNotNull(data); Set actual = data.stream().map(t -> t.getFqName()).collect(Collectors.toSet()); Set expected = new HashSet<>(Arrays.asList( @@ -185,8 +185,8 @@ public class JavaLangugeClientTest { @Test public void anonymousInnerType_SuperTypes() throws Exception { List data = client - .javaSuperTypes(new JavaTypeHierarchyParams(project.getLocationURI().toString(), "org.test.Application$1", false)) - .get(1000000000, TimeUnit.SECONDS); + .javaSuperTypes(new JavaTypeHierarchyParams(project.getLocationURI().toString(), "org.test.Application$1", false, false)) + .get(1000000000, TimeUnit.SECONDS).stream().map(e -> e.getLeft()).collect(Collectors.toList()); assertNotNull(data); Set actual = data.stream().map(t -> t.getFqName()).collect(Collectors.toSet()); Set expected = new HashSet<>(Arrays.asList( @@ -206,8 +206,8 @@ public class JavaLangugeClientTest { @Test public void arrayList_SuperTypes_with_Itself() throws Exception { List data = client - .javaSuperTypes(new JavaTypeHierarchyParams(project.getLocationURI().toString(), "java.util.ArrayList", true)) - .get(10, TimeUnit.SECONDS); + .javaSuperTypes(new JavaTypeHierarchyParams(project.getLocationURI().toString(), "java.util.ArrayList", true, false)) + .get(10, TimeUnit.SECONDS).stream().map(e -> e.getLeft()).collect(Collectors.toList()); assertNotNull(data); Set actual = data.stream().map(t -> t.getFqName()).collect(Collectors.toSet()); Set expected = new HashSet<>(Arrays.asList( @@ -229,7 +229,7 @@ public class JavaLangugeClientTest { public void taskExecutorFactoryBean_SuperTypes() throws Exception { List data = client .javaSuperTypes(new JavaTypeHierarchyParams(project.getLocationURI().toString(), "org.springframework.scheduling.config.TaskExecutorFactoryBean")) - .get(10, TimeUnit.SECONDS); + .get(10, TimeUnit.SECONDS).stream().map(e -> e.getLeft()).collect(Collectors.toList()); assertNotNull(data); Set actual = data.stream().map(t -> t.getFqName()).collect(Collectors.toSet()); Set expected = new HashSet<>(Arrays.asList( diff --git a/eclipse-language-servers/org.springframework.tooling.ls.eclipse.commons/src/org/springframework/tooling/ls/eclipse/commons/STS4LanguageClientImpl.java b/eclipse-language-servers/org.springframework.tooling.ls.eclipse.commons/src/org/springframework/tooling/ls/eclipse/commons/STS4LanguageClientImpl.java index 416ff8192..b7285a792 100644 --- a/eclipse-language-servers/org.springframework.tooling.ls.eclipse.commons/src/org/springframework/tooling/ls/eclipse/commons/STS4LanguageClientImpl.java +++ b/eclipse-language-servers/org.springframework.tooling.ls.eclipse.commons/src/org/springframework/tooling/ls/eclipse/commons/STS4LanguageClientImpl.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2017, 2019 Pivotal, Inc. + * Copyright (c) 2017, 2020 Pivotal, Inc. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at @@ -53,6 +53,7 @@ import org.eclipse.lsp4j.Location; import org.eclipse.lsp4j.MarkupContent; import org.eclipse.lsp4j.MarkupKind; import org.eclipse.lsp4j.Range; +import org.eclipse.lsp4j.jsonrpc.messages.Either; import org.eclipse.swt.widgets.Display; import org.eclipse.ui.IEditorPart; import org.eclipse.ui.IEditorReference; @@ -518,17 +519,13 @@ public class STS4LanguageClientImpl extends LanguageClientImpl implements STS4La } @Override - public CompletableFuture> javaSubTypes(JavaTypeHierarchyParams params) { - return CompletableFuture.supplyAsync(() -> - typeHierarchy.subTypes(params).collect(Collectors.toList()) - ); + public CompletableFuture>> javaSubTypes(JavaTypeHierarchyParams params) { + return CompletableFuture.supplyAsync(() -> typeHierarchy.subTypes(params).collect(Collectors.toList())); } @Override - public CompletableFuture> javaSuperTypes(JavaTypeHierarchyParams params) { - return CompletableFuture.supplyAsync(() -> - typeHierarchy.superTypes(params).collect(Collectors.toList()) - ); + public CompletableFuture>> javaSuperTypes(JavaTypeHierarchyParams params) { + return CompletableFuture.supplyAsync(() -> typeHierarchy.superTypes(params).collect(Collectors.toList())); } @Override diff --git a/headless-services/commons/commons-java/src/main/java/org/springframework/ide/vscode/commons/jandex/JandexClasspath.java b/headless-services/commons/commons-java/src/main/java/org/springframework/ide/vscode/commons/jandex/JandexClasspath.java index 5a53065c4..daa3e59f1 100644 --- a/headless-services/commons/commons-java/src/main/java/org/springframework/ide/vscode/commons/jandex/JandexClasspath.java +++ b/headless-services/commons/commons-java/src/main/java/org/springframework/ide/vscode/commons/jandex/JandexClasspath.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2017, 2019 Pivotal, Inc. + * Copyright (c) 2017, 2020 Pivotal, Inc. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at @@ -118,7 +118,7 @@ public final class JandexClasspath implements ClasspathIndex { } @Override - public Flux allSubtypesOf(String fqName, boolean includeFocusType) { + public Flux allSubtypesOf(String fqName, boolean includeFocusType, boolean detailed) { IType type = javaIndex.get().findType(fqName); if (type == null) { return Flux.empty(); @@ -164,7 +164,7 @@ public final class JandexClasspath implements ClasspathIndex { } @Override - public Flux allSuperTypesOf(String fqName, boolean includeFocusType) { + public Flux allSuperTypesOf(String fqName, boolean includeFocusType, boolean detailed) { Queue queue = new LinkedList<>(); HashSet visited = new HashSet<>(); queue.add(fqName); diff --git a/headless-services/commons/commons-java/src/main/java/org/springframework/ide/vscode/commons/java/ClasspathIndex.java b/headless-services/commons/commons-java/src/main/java/org/springframework/ide/vscode/commons/java/ClasspathIndex.java index 8ce62f621..86f2501c4 100644 --- a/headless-services/commons/commons-java/src/main/java/org/springframework/ide/vscode/commons/java/ClasspathIndex.java +++ b/headless-services/commons/commons-java/src/main/java/org/springframework/ide/vscode/commons/java/ClasspathIndex.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2018, 2019 Pivotal, Inc. + * Copyright (c) 2018, 2020 Pivotal, Inc. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at @@ -20,8 +20,8 @@ public interface ClasspathIndex extends Disposable { Flux> fuzzySearchTypes(String searchTerm, boolean includeBinaries, boolean includeSystemLibs); Flux> camelcaseSearchTypes(String searchTerm, boolean includeBinaries, boolean includeSystemLibs); Flux> fuzzySearchPackages(String searchTerm, boolean includeBinaries, boolean includeSystemLibs); - Flux allSubtypesOf(String fqName, boolean includeFocusType); - Flux allSuperTypesOf(String fqName, boolean includeFocusType); + Flux allSubtypesOf(String fqName, boolean includeFocusType, boolean detailed); + Flux allSuperTypesOf(String fqName, boolean includeFocusType, boolean detailed); IJavaModuleData findClasspathResourceContainer(String fqName); } diff --git a/headless-services/commons/commons-java/src/main/java/org/springframework/ide/vscode/commons/jdtls/JdtLsIndex.java b/headless-services/commons/commons-java/src/main/java/org/springframework/ide/vscode/commons/jdtls/JdtLsIndex.java index 04a269c04..c9008c9d0 100644 --- a/headless-services/commons/commons-java/src/main/java/org/springframework/ide/vscode/commons/jdtls/JdtLsIndex.java +++ b/headless-services/commons/commons-java/src/main/java/org/springframework/ide/vscode/commons/jdtls/JdtLsIndex.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2019 Pivotal, Inc. + * Copyright (c) 2019, 2020 Pivotal, Inc. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at @@ -11,13 +11,13 @@ package org.springframework.ide.vscode.commons.jdtls; import java.net.URI; -import java.util.ArrayList; import java.util.List; import java.util.Objects; import java.util.Optional; import java.util.concurrent.CompletableFuture; import java.util.concurrent.ExecutionException; import java.util.concurrent.TimeUnit; +import java.util.stream.Collectors; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -167,22 +167,13 @@ public class JdtLsIndex implements ClasspathIndex { .filter(tuple -> tuple.getT2() != 0.0); } - private List convertTypeDescriptors(List descriptors) { - List types = new ArrayList<>(descriptors.size()); - for (TypeDescriptorData data : descriptors) { - if (data != null) { - types.add(toTypeFromDescriptor(data)); - } - } - return types; - } - @Override - public Flux allSubtypesOf(String fqName, boolean includeFocusType) { - JavaTypeHierarchyParams searchParams = new JavaTypeHierarchyParams(projectUri.toString(), fqName, includeFocusType); + public Flux allSubtypesOf(String fqName, boolean includeFocusType, boolean detailed) { + JavaTypeHierarchyParams searchParams = new JavaTypeHierarchyParams(projectUri.toString(), fqName, includeFocusType, detailed); try { CompletableFuture> future = subtypesCache.get(searchParams, () -> client - .javaSubTypes(searchParams).handle((results, exception) -> convertTypeDescriptors(results))); + .javaSubTypes(searchParams) + .handle((results, exception) -> results.stream().map(e -> detailed ? toType(e.getRight()) : toTypeFromDescriptor(e.getLeft())).collect(Collectors.toList()))); return Mono.fromFuture(future) .flatMapMany(results -> Flux.fromIterable(results)); } catch (ExecutionException e) { @@ -192,11 +183,12 @@ public class JdtLsIndex implements ClasspathIndex { } @Override - public Flux allSuperTypesOf(String fqName, boolean includeFocusType) { - JavaTypeHierarchyParams searchParams = new JavaTypeHierarchyParams(projectUri.toString(), fqName, includeFocusType); + public Flux allSuperTypesOf(String fqName, boolean includeFocusType, boolean detailed) { + JavaTypeHierarchyParams searchParams = new JavaTypeHierarchyParams(projectUri.toString(), fqName, includeFocusType, detailed); try { CompletableFuture> future = supertypesCache.get(searchParams, () -> client - .javaSuperTypes(searchParams).handle((results, exception) -> convertTypeDescriptors(results))); + .javaSuperTypes(searchParams) + .handle((results, exception) -> results.stream().map(e -> detailed ? toType(e.getRight()) : toTypeFromDescriptor(e.getLeft())).collect(Collectors.toList()))); return Mono.fromFuture(future) .flatMapMany(results -> Flux.fromIterable(results)); } catch (ExecutionException e) { diff --git a/headless-services/commons/commons-lsp-extensions/src/main/java/org/springframework/ide/vscode/commons/protocol/STS4LanguageClient.java b/headless-services/commons/commons-lsp-extensions/src/main/java/org/springframework/ide/vscode/commons/protocol/STS4LanguageClient.java index 626590859..a874195ff 100644 --- a/headless-services/commons/commons-lsp-extensions/src/main/java/org/springframework/ide/vscode/commons/protocol/STS4LanguageClient.java +++ b/headless-services/commons/commons-lsp-extensions/src/main/java/org/springframework/ide/vscode/commons/protocol/STS4LanguageClient.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2019 Pivotal, Inc. + * Copyright (c) 2019, 2020 Pivotal, Inc. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at @@ -15,6 +15,8 @@ import java.util.concurrent.CompletableFuture; import org.eclipse.lsp4j.Location; import org.eclipse.lsp4j.MarkupContent; +import org.eclipse.lsp4j.jsonrpc.json.ResponseJsonAdapter; +import org.eclipse.lsp4j.jsonrpc.messages.Either; import org.eclipse.lsp4j.jsonrpc.services.JsonNotification; import org.eclipse.lsp4j.jsonrpc.services.JsonRequest; import org.eclipse.lsp4j.services.LanguageClient; @@ -68,10 +70,12 @@ public interface STS4LanguageClient extends LanguageClient { CompletableFuture> javaSearchPackages(JavaSearchParams params); @JsonRequest("sts/javaSubTypes") - CompletableFuture> javaSubTypes(JavaTypeHierarchyParams params); + @ResponseJsonAdapter(TypeHierarchyResponseAdapter.class) + CompletableFuture>> javaSubTypes(JavaTypeHierarchyParams params); @JsonRequest("sts/javaSuperTypes") - CompletableFuture> javaSuperTypes(JavaTypeHierarchyParams params); + @ResponseJsonAdapter(TypeHierarchyResponseAdapter.class) + CompletableFuture>> javaSuperTypes(JavaTypeHierarchyParams params); @JsonRequest("sts/javaCodeComplete") CompletableFuture> javaCodeComplete(JavaCodeCompleteParams params); diff --git a/headless-services/commons/commons-lsp-extensions/src/main/java/org/springframework/ide/vscode/commons/protocol/TypeHierarchyResponseAdapter.java b/headless-services/commons/commons-lsp-extensions/src/main/java/org/springframework/ide/vscode/commons/protocol/TypeHierarchyResponseAdapter.java new file mode 100644 index 000000000..ccfa39f86 --- /dev/null +++ b/headless-services/commons/commons-lsp-extensions/src/main/java/org/springframework/ide/vscode/commons/protocol/TypeHierarchyResponseAdapter.java @@ -0,0 +1,57 @@ +/******************************************************************************* + * Copyright (c) 2020 Pivotal, Inc. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * https://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Pivotal, Inc. - initial API and implementation + *******************************************************************************/ +package org.springframework.ide.vscode.commons.protocol; + +import java.util.ArrayList; +import java.util.function.Predicate; + +import org.eclipse.lsp4j.jsonrpc.json.adapters.CollectionTypeAdapter; +import org.eclipse.lsp4j.jsonrpc.json.adapters.EitherTypeAdapter; +import org.eclipse.lsp4j.jsonrpc.json.adapters.EitherTypeAdapter.PropertyChecker; +import org.eclipse.lsp4j.jsonrpc.messages.Either; +import org.springframework.ide.vscode.commons.protocol.java.TypeData; +import org.springframework.ide.vscode.commons.protocol.java.TypeDescriptorData; + +import com.google.gson.Gson; +import com.google.gson.JsonElement; +import com.google.gson.JsonObject; +import com.google.gson.JsonPrimitive; +import com.google.gson.TypeAdapter; +import com.google.gson.TypeAdapterFactory; +import com.google.gson.reflect.TypeToken; + +/** + * Helps to parse JSON for Either. + * Creates either {@link TypeData} or {@link TypeDescriptorData} based on + * {@link JsonObject} properties. + * + * @author Alex Boyko + * + */ +public class TypeHierarchyResponseAdapter implements TypeAdapterFactory { + + private static final TypeToken> ELEMENT_TYPE = new TypeToken>() { + }; + + @SuppressWarnings("unchecked") + @Override + public TypeAdapter create(Gson gson, TypeToken type) { + Predicate rightChecker = new PropertyChecker("classpathEntry", JsonObject.class) + .or(new PropertyChecker("bindingKey", JsonPrimitive.class)); + Predicate leftChecker = new PropertyChecker("fqName", JsonPrimitive.class) + .and(rightChecker.negate()); + TypeAdapter> elementTypeAdapter = new EitherTypeAdapter<>(gson, + ELEMENT_TYPE, leftChecker, rightChecker); + return (TypeAdapter) new CollectionTypeAdapter<>(gson, ELEMENT_TYPE.getType(), elementTypeAdapter, + ArrayList::new); + } + +} diff --git a/headless-services/commons/commons-lsp-extensions/src/main/java/org/springframework/ide/vscode/commons/protocol/java/JavaTypeHierarchyParams.java b/headless-services/commons/commons-lsp-extensions/src/main/java/org/springframework/ide/vscode/commons/protocol/java/JavaTypeHierarchyParams.java index 969c126af..ae13b9b00 100644 --- a/headless-services/commons/commons-lsp-extensions/src/main/java/org/springframework/ide/vscode/commons/protocol/java/JavaTypeHierarchyParams.java +++ b/headless-services/commons/commons-lsp-extensions/src/main/java/org/springframework/ide/vscode/commons/protocol/java/JavaTypeHierarchyParams.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2019 Pivotal, Inc. + * Copyright (c) 2019, 2020 Pivotal, Inc. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at @@ -15,16 +15,18 @@ public class JavaTypeHierarchyParams { private String projectUri; private String fqName; private boolean includeFocusType; + private boolean detailed; - public JavaTypeHierarchyParams(String projectUri, String fqName, boolean includeFocusType) { + public JavaTypeHierarchyParams(String projectUri, String fqName, boolean includeFocusType, boolean detailed) { super(); this.projectUri = projectUri; this.fqName = fqName; + this.setDetailed(detailed); this.setIncludeFocusType(includeFocusType); } public JavaTypeHierarchyParams(String projectUri, String fqName) { - this(projectUri, fqName, false); + this(projectUri, fqName, false, false); } public String getProjectUri() { @@ -51,6 +53,17 @@ public class JavaTypeHierarchyParams { this.includeFocusType = includeFocusType; } + public boolean isDetailed() { + return detailed; + } + + public void setDetailed(boolean detailed) { + this.detailed = detailed; + } + + /** + * IMPORTANT: Do not include 'detailed' flag in the {@link #hashCode()} and {@link #equals(Object)} + */ @Override public int hashCode() { final int prime = 31; @@ -61,6 +74,9 @@ public class JavaTypeHierarchyParams { return result; } + /** + * IMPORTANT: Do not include 'detailed' flag in the {@link #hashCode()} and {@link #equals(Object)} + */ @Override public boolean equals(Object obj) { if (this == obj) @@ -84,5 +100,5 @@ public class JavaTypeHierarchyParams { return false; return true; } - + } diff --git a/headless-services/commons/commons-maven/src/test/java/org/springframework/ide/vscode/commons/maven/JavaIndexTest.java b/headless-services/commons/commons-maven/src/test/java/org/springframework/ide/vscode/commons/maven/JavaIndexTest.java index fc19eaff9..5ec4ebc5f 100644 --- a/headless-services/commons/commons-maven/src/test/java/org/springframework/ide/vscode/commons/maven/JavaIndexTest.java +++ b/headless-services/commons/commons-maven/src/test/java/org/springframework/ide/vscode/commons/maven/JavaIndexTest.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2016, 2019 Pivotal, Inc. + * Copyright (c) 2016, 2020 Pivotal, Inc. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at @@ -163,7 +163,7 @@ public class JavaIndexTest { @Test public void testFindAllSuperTypes() throws Exception { MavenJavaProject project = mavenProjectsCache.get("gs-rest-service-cors-boot-1.4.1-with-classpath-file"); - Set actual = project.getIndex().allSuperTypesOf("java.util.ArrayList", false).map(t -> t.getFullyQualifiedName()).collect(Collectors.toSet()).block(); + Set actual = project.getIndex().allSuperTypesOf("java.util.ArrayList", false, true).map(t -> t.getFullyQualifiedName()).collect(Collectors.toSet()).block(); Set expected = new HashSet<>(Arrays.asList( "java.util.List", "java.util.RandomAccess", @@ -181,7 +181,7 @@ public class JavaIndexTest { @Test public void testFindAllSuperTypesWithFocusType() throws Exception { MavenJavaProject project = mavenProjectsCache.get("gs-rest-service-cors-boot-1.4.1-with-classpath-file"); - Set actual = project.getIndex().allSuperTypesOf("java.util.ArrayList", true).map(t -> t.getFullyQualifiedName()).collect(Collectors.toSet()).block(); + Set actual = project.getIndex().allSuperTypesOf("java.util.ArrayList", true, true).map(t -> t.getFullyQualifiedName()).collect(Collectors.toSet()).block(); Set expected = new HashSet<>(Arrays.asList( "java.util.ArrayList", "java.util.List", diff --git a/headless-services/commons/language-server-test-harness/src/main/java/org/springframework/ide/vscode/languageserver/testharness/LanguageServerHarness.java b/headless-services/commons/language-server-test-harness/src/main/java/org/springframework/ide/vscode/languageserver/testharness/LanguageServerHarness.java index 6661080ff..a82e2d6b9 100644 --- a/headless-services/commons/language-server-test-harness/src/main/java/org/springframework/ide/vscode/languageserver/testharness/LanguageServerHarness.java +++ b/headless-services/commons/language-server-test-harness/src/main/java/org/springframework/ide/vscode/languageserver/testharness/LanguageServerHarness.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2016, 2019 Pivotal, Inc. + * Copyright (c) 2016, 2020 Pivotal, Inc. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at @@ -379,12 +379,12 @@ public class LanguageServerHarness { } @Override - public CompletableFuture> javaSubTypes(JavaTypeHierarchyParams params) { + public CompletableFuture>> javaSubTypes(JavaTypeHierarchyParams params) { return CompletableFuture.completedFuture(Collections.emptyList()); } @Override - public CompletableFuture> javaSuperTypes(JavaTypeHierarchyParams params) { + public CompletableFuture>> javaSuperTypes(JavaTypeHierarchyParams params) { return CompletableFuture.completedFuture(Collections.emptyList()); } diff --git a/headless-services/jdt-ls-extension/org.springframework.tooling.jdt.ls.commons/META-INF/MANIFEST.MF b/headless-services/jdt-ls-extension/org.springframework.tooling.jdt.ls.commons/META-INF/MANIFEST.MF index 0777e8e77..b74740f78 100644 --- a/headless-services/jdt-ls-extension/org.springframework.tooling.jdt.ls.commons/META-INF/MANIFEST.MF +++ b/headless-services/jdt-ls-extension/org.springframework.tooling.jdt.ls.commons/META-INF/MANIFEST.MF @@ -15,7 +15,8 @@ Require-Bundle: org.eclipse.core.runtime, org.eclipse.lsp4j, org.eclipse.lsp4j.jsonrpc, io.projectreactor.reactor-core, - org.reactivestreams.reactive-streams + org.reactivestreams.reactive-streams, + com.google.gson Export-Package: org.springframework.ide.vscode.commons.protocol, org.springframework.ide.vscode.commons.protocol.java, org.springframework.tooling.jdt.ls.commons, diff --git a/headless-services/jdt-ls-extension/org.springframework.tooling.jdt.ls.commons/src/org/springframework/tooling/jdt/ls/commons/java/TypeHierarchy.java b/headless-services/jdt-ls-extension/org.springframework.tooling.jdt.ls.commons/src/org/springframework/tooling/jdt/ls/commons/java/TypeHierarchy.java index faa939346..d2fc25a23 100644 --- a/headless-services/jdt-ls-extension/org.springframework.tooling.jdt.ls.commons/src/org/springframework/tooling/jdt/ls/commons/java/TypeHierarchy.java +++ b/headless-services/jdt-ls-extension/org.springframework.tooling.jdt.ls.commons/src/org/springframework/tooling/jdt/ls/commons/java/TypeHierarchy.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2019 Pivotal, Inc. + * Copyright (c) 2019, 2020 Pivotal, Inc. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at @@ -17,7 +17,9 @@ import org.eclipse.core.runtime.NullProgressMonitor; import org.eclipse.jdt.core.IJavaProject; import org.eclipse.jdt.core.IType; import org.eclipse.jdt.core.ITypeHierarchy; +import org.eclipse.lsp4j.jsonrpc.messages.Either; import org.springframework.ide.vscode.commons.protocol.java.JavaTypeHierarchyParams; +import org.springframework.ide.vscode.commons.protocol.java.TypeData; import org.springframework.ide.vscode.commons.protocol.java.TypeDescriptorData; import org.springframework.tooling.jdt.ls.commons.Logger; import org.springframework.tooling.jdt.ls.commons.resources.ResourceUtils; @@ -61,26 +63,26 @@ public class TypeHierarchy { return null; } - public Stream subTypes(JavaTypeHierarchyParams params) { + public Stream> subTypes(JavaTypeHierarchyParams params) { URI projectUri = params.getProjectUri() == null ? null : URI.create(params.getProjectUri()); ITypeHierarchy hierarchy = hierarchy(projectUri, params.getFqName(), false); if (hierarchy != null) { IType focusType = hierarchy.getType(); return Stream.concat(params.isIncludeFocusType() ? Stream.of(focusType) : Stream.empty(), Stream.of(hierarchy.getAllSubtypes(focusType))) .parallel() - .map(javaData::createTypeDescriptorData); + .map(type -> params.isDetailed() ? Either.forRight(javaData.createTypeData(type)) : Either.forLeft(javaData.createTypeDescriptorData(type))); } return Stream.of(); } - public Stream superTypes(JavaTypeHierarchyParams params) { + public Stream> superTypes(JavaTypeHierarchyParams params) { URI projectUri = params.getProjectUri() == null ? null : URI.create(params.getProjectUri()); ITypeHierarchy hierarchy = hierarchy(projectUri, params.getFqName(), true); if (hierarchy != null) { IType focusType = hierarchy.getType(); return Stream.concat(params.isIncludeFocusType() ? Stream.of(focusType) : Stream.empty(), Stream.of(hierarchy.getAllSupertypes(focusType))) .parallel() - .map(javaData::createTypeDescriptorData); + .map(type -> params.isDetailed() ? Either.forRight(javaData.createTypeData(type)) : Either.forLeft(javaData.createTypeDescriptorData(type))); } return Stream.of(); } diff --git a/headless-services/jdt-ls-extension/org.springframework.tooling.jdt.ls.extension/META-INF/MANIFEST.MF b/headless-services/jdt-ls-extension/org.springframework.tooling.jdt.ls.extension/META-INF/MANIFEST.MF index d3d17929f..6fc2f24ab 100644 --- a/headless-services/jdt-ls-extension/org.springframework.tooling.jdt.ls.extension/META-INF/MANIFEST.MF +++ b/headless-services/jdt-ls-extension/org.springframework.tooling.jdt.ls.extension/META-INF/MANIFEST.MF @@ -12,4 +12,5 @@ Require-Bundle: org.eclipse.jdt.ls.core, org.springframework.tooling.jdt.ls.commons, com.google.guava, com.google.gson, - org.eclipse.lsp4j + org.eclipse.lsp4j, + org.eclipse.lsp4j.jsonrpc diff --git a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/autowired/AutowiredHoverProvider.java b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/autowired/AutowiredHoverProvider.java index 00e65fd17..af3c103e3 100644 --- a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/autowired/AutowiredHoverProvider.java +++ b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/autowired/AutowiredHoverProvider.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2017, 2019 Pivotal, Inc. + * Copyright (c) 2017, 2020 Pivotal, Inc. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at @@ -269,7 +269,7 @@ public class AutowiredHoverProvider implements HoverProvider { // Trim the generic parameters part if it's present String liveBeanTypeFQName = idx < 0 ? rawLiveBeanFqName : rawLiveBeanFqName.substring(0, idx); if (liveBeanTypeFQName != null) { - return jp.getIndex().allSuperTypesOf(liveBeanTypeFQName, true).map(IType::getFullyQualifiedName) + return jp.getIndex().allSuperTypesOf(liveBeanTypeFQName, true, false).map(IType::getFullyQualifiedName) .filter(fqn -> bindingQualifiedName.equals(fqn)).blockFirst() != null; } return false; diff --git a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/metadata/ClassReferenceProvider.java b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/metadata/ClassReferenceProvider.java index 6cf9fcec8..545dfc03f 100644 --- a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/metadata/ClassReferenceProvider.java +++ b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/metadata/ClassReferenceProvider.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2016, 2019 Pivotal, Inc. + * Copyright (c) 2016, 2020 Pivotal, Inc. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at @@ -141,7 +141,7 @@ public class ClassReferenceProvider extends CachingValueProvider { if (target == null) { typesWithScoresFlux = javaProject.getIndex().fuzzySearchTypes(query, true, false); } else { - typesWithScoresFlux = javaProject.getIndex().allSubtypesOf(target, true) + typesWithScoresFlux = javaProject.getIndex().allSubtypesOf(target, true, false) .filter(t -> Flags.isPublic(t.getFlags()) && !concrete || !isAbstract(t)) .map(type -> Tuples.of(type, FuzzyMatcher.matchScore(query, type.getFullyQualifiedName()))); } diff --git a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/xml/completions/PropertyNameCompletionProposalProvider.java b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/xml/completions/PropertyNameCompletionProposalProvider.java index 06bf8a3c2..a1c6a2784 100644 --- a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/xml/completions/PropertyNameCompletionProposalProvider.java +++ b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/xml/completions/PropertyNameCompletionProposalProvider.java @@ -136,7 +136,7 @@ public class PropertyNameCompletionProposalProvider implements XMLCompletionProv } public static Stream propertyNameCandidateMethods(IJavaProject project, String beanClassFqName) { - return project.getIndex().allSuperTypesOf(beanClassFqName, true) + return project.getIndex().allSuperTypesOf(beanClassFqName, true, true) .toStream() .flatMap(type -> type.getMethods()) .filter(PropertyNameCompletionProposalProvider::isPropertyWriteMethod);