PT #171932358 Flag for detailed java type data for sub/super types
This commit is contained in:
@@ -1,5 +1,5 @@
|
|||||||
/*******************************************************************************
|
/*******************************************************************************
|
||||||
* Copyright (c) 2019 Pivotal, Inc.
|
* Copyright (c) 2019, 2020 Pivotal, Inc.
|
||||||
* All rights reserved. This program and the accompanying materials
|
* All rights reserved. This program and the accompanying materials
|
||||||
* are made available under the terms of the Eclipse Public License v1.0
|
* are made available under the terms of the Eclipse Public License v1.0
|
||||||
* which accompanies this distribution, and is available at
|
* which accompanies this distribution, and is available at
|
||||||
@@ -144,8 +144,8 @@ public class JavaLangugeClientTest {
|
|||||||
@Test
|
@Test
|
||||||
public void map_Subtypes() throws Exception {
|
public void map_Subtypes() throws Exception {
|
||||||
List<TypeDescriptorData> data = client
|
List<TypeDescriptorData> data = client
|
||||||
.javaSubTypes(new JavaTypeHierarchyParams(project.getLocationURI().toString(), "java.util.Map", false))
|
.javaSubTypes(new JavaTypeHierarchyParams(project.getLocationURI().toString(), "java.util.Map", false, false))
|
||||||
.get(10, TimeUnit.SECONDS);
|
.get(10, TimeUnit.SECONDS).stream().map(e -> e.getLeft()).collect(Collectors.toList());
|
||||||
assertNotNull(data);
|
assertNotNull(data);
|
||||||
assertTrue(data.size() > 200);
|
assertTrue(data.size() > 200);
|
||||||
assertTrue(data.stream().filter(t -> "java.util.AbstractMap".equals(t.getFqName())).findFirst().isPresent());
|
assertTrue(data.stream().filter(t -> "java.util.AbstractMap".equals(t.getFqName())).findFirst().isPresent());
|
||||||
@@ -154,8 +154,8 @@ public class JavaLangugeClientTest {
|
|||||||
@Test
|
@Test
|
||||||
public void map_Subtypes_with_Itself() throws Exception {
|
public void map_Subtypes_with_Itself() throws Exception {
|
||||||
List<TypeDescriptorData> data = client
|
List<TypeDescriptorData> data = client
|
||||||
.javaSubTypes(new JavaTypeHierarchyParams(project.getLocationURI().toString(), "java.util.Map", true))
|
.javaSubTypes(new JavaTypeHierarchyParams(project.getLocationURI().toString(), "java.util.Map", true, false))
|
||||||
.get(10, TimeUnit.SECONDS);
|
.get(10, TimeUnit.SECONDS).stream().map(e -> e.getLeft()).collect(Collectors.toList());
|
||||||
assertNotNull(data);
|
assertNotNull(data);
|
||||||
assertTrue(data.size() > 200);
|
assertTrue(data.size() > 200);
|
||||||
assertTrue(data.stream().filter(t -> "java.util.Map".equals(t.getFqName())).findFirst().isPresent());
|
assertTrue(data.stream().filter(t -> "java.util.Map".equals(t.getFqName())).findFirst().isPresent());
|
||||||
@@ -164,8 +164,8 @@ public class JavaLangugeClientTest {
|
|||||||
@Test
|
@Test
|
||||||
public void arrayList_SuperTypes() throws Exception {
|
public void arrayList_SuperTypes() throws Exception {
|
||||||
List<TypeDescriptorData> data = client
|
List<TypeDescriptorData> data = client
|
||||||
.javaSuperTypes(new JavaTypeHierarchyParams(project.getLocationURI().toString(), "java.util.ArrayList", false))
|
.javaSuperTypes(new JavaTypeHierarchyParams(project.getLocationURI().toString(), "java.util.ArrayList", false, false))
|
||||||
.get(10, TimeUnit.SECONDS);
|
.get(10, TimeUnit.SECONDS).stream().map(e -> e.getLeft()).collect(Collectors.toList());
|
||||||
assertNotNull(data);
|
assertNotNull(data);
|
||||||
Set<String> actual = data.stream().map(t -> t.getFqName()).collect(Collectors.toSet());
|
Set<String> actual = data.stream().map(t -> t.getFqName()).collect(Collectors.toSet());
|
||||||
Set<String> expected = new HashSet<>(Arrays.asList(
|
Set<String> expected = new HashSet<>(Arrays.asList(
|
||||||
@@ -185,8 +185,8 @@ public class JavaLangugeClientTest {
|
|||||||
@Test
|
@Test
|
||||||
public void anonymousInnerType_SuperTypes() throws Exception {
|
public void anonymousInnerType_SuperTypes() throws Exception {
|
||||||
List<TypeDescriptorData> data = client
|
List<TypeDescriptorData> data = client
|
||||||
.javaSuperTypes(new JavaTypeHierarchyParams(project.getLocationURI().toString(), "org.test.Application$1", false))
|
.javaSuperTypes(new JavaTypeHierarchyParams(project.getLocationURI().toString(), "org.test.Application$1", false, false))
|
||||||
.get(1000000000, TimeUnit.SECONDS);
|
.get(1000000000, TimeUnit.SECONDS).stream().map(e -> e.getLeft()).collect(Collectors.toList());
|
||||||
assertNotNull(data);
|
assertNotNull(data);
|
||||||
Set<String> actual = data.stream().map(t -> t.getFqName()).collect(Collectors.toSet());
|
Set<String> actual = data.stream().map(t -> t.getFqName()).collect(Collectors.toSet());
|
||||||
Set<String> expected = new HashSet<>(Arrays.asList(
|
Set<String> expected = new HashSet<>(Arrays.asList(
|
||||||
@@ -206,8 +206,8 @@ public class JavaLangugeClientTest {
|
|||||||
@Test
|
@Test
|
||||||
public void arrayList_SuperTypes_with_Itself() throws Exception {
|
public void arrayList_SuperTypes_with_Itself() throws Exception {
|
||||||
List<TypeDescriptorData> data = client
|
List<TypeDescriptorData> data = client
|
||||||
.javaSuperTypes(new JavaTypeHierarchyParams(project.getLocationURI().toString(), "java.util.ArrayList", true))
|
.javaSuperTypes(new JavaTypeHierarchyParams(project.getLocationURI().toString(), "java.util.ArrayList", true, false))
|
||||||
.get(10, TimeUnit.SECONDS);
|
.get(10, TimeUnit.SECONDS).stream().map(e -> e.getLeft()).collect(Collectors.toList());
|
||||||
assertNotNull(data);
|
assertNotNull(data);
|
||||||
Set<String> actual = data.stream().map(t -> t.getFqName()).collect(Collectors.toSet());
|
Set<String> actual = data.stream().map(t -> t.getFqName()).collect(Collectors.toSet());
|
||||||
Set<String> expected = new HashSet<>(Arrays.asList(
|
Set<String> expected = new HashSet<>(Arrays.asList(
|
||||||
@@ -229,7 +229,7 @@ public class JavaLangugeClientTest {
|
|||||||
public void taskExecutorFactoryBean_SuperTypes() throws Exception {
|
public void taskExecutorFactoryBean_SuperTypes() throws Exception {
|
||||||
List<TypeDescriptorData> data = client
|
List<TypeDescriptorData> data = client
|
||||||
.javaSuperTypes(new JavaTypeHierarchyParams(project.getLocationURI().toString(), "org.springframework.scheduling.config.TaskExecutorFactoryBean"))
|
.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);
|
assertNotNull(data);
|
||||||
Set<String> actual = data.stream().map(t -> t.getFqName()).collect(Collectors.toSet());
|
Set<String> actual = data.stream().map(t -> t.getFqName()).collect(Collectors.toSet());
|
||||||
Set<String> expected = new HashSet<>(Arrays.asList(
|
Set<String> expected = new HashSet<>(Arrays.asList(
|
||||||
|
|||||||
@@ -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
|
* All rights reserved. This program and the accompanying materials
|
||||||
* are made available under the terms of the Eclipse Public License v1.0
|
* are made available under the terms of the Eclipse Public License v1.0
|
||||||
* which accompanies this distribution, and is available at
|
* 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.MarkupContent;
|
||||||
import org.eclipse.lsp4j.MarkupKind;
|
import org.eclipse.lsp4j.MarkupKind;
|
||||||
import org.eclipse.lsp4j.Range;
|
import org.eclipse.lsp4j.Range;
|
||||||
|
import org.eclipse.lsp4j.jsonrpc.messages.Either;
|
||||||
import org.eclipse.swt.widgets.Display;
|
import org.eclipse.swt.widgets.Display;
|
||||||
import org.eclipse.ui.IEditorPart;
|
import org.eclipse.ui.IEditorPart;
|
||||||
import org.eclipse.ui.IEditorReference;
|
import org.eclipse.ui.IEditorReference;
|
||||||
@@ -518,17 +519,13 @@ public class STS4LanguageClientImpl extends LanguageClientImpl implements STS4La
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public CompletableFuture<List<TypeDescriptorData>> javaSubTypes(JavaTypeHierarchyParams params) {
|
public CompletableFuture<List<Either<TypeDescriptorData, TypeData>>> javaSubTypes(JavaTypeHierarchyParams params) {
|
||||||
return CompletableFuture.supplyAsync(() ->
|
return CompletableFuture.supplyAsync(() -> typeHierarchy.subTypes(params).collect(Collectors.toList()));
|
||||||
typeHierarchy.subTypes(params).collect(Collectors.toList())
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public CompletableFuture<List<TypeDescriptorData>> javaSuperTypes(JavaTypeHierarchyParams params) {
|
public CompletableFuture<List<Either<TypeDescriptorData, TypeData>>> javaSuperTypes(JavaTypeHierarchyParams params) {
|
||||||
return CompletableFuture.supplyAsync(() ->
|
return CompletableFuture.supplyAsync(() -> typeHierarchy.superTypes(params).collect(Collectors.toList()));
|
||||||
typeHierarchy.superTypes(params).collect(Collectors.toList())
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@@ -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
|
* All rights reserved. This program and the accompanying materials
|
||||||
* are made available under the terms of the Eclipse Public License v1.0
|
* are made available under the terms of the Eclipse Public License v1.0
|
||||||
* which accompanies this distribution, and is available at
|
* which accompanies this distribution, and is available at
|
||||||
@@ -118,7 +118,7 @@ public final class JandexClasspath implements ClasspathIndex {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Flux<IType> allSubtypesOf(String fqName, boolean includeFocusType) {
|
public Flux<IType> allSubtypesOf(String fqName, boolean includeFocusType, boolean detailed) {
|
||||||
IType type = javaIndex.get().findType(fqName);
|
IType type = javaIndex.get().findType(fqName);
|
||||||
if (type == null) {
|
if (type == null) {
|
||||||
return Flux.empty();
|
return Flux.empty();
|
||||||
@@ -164,7 +164,7 @@ public final class JandexClasspath implements ClasspathIndex {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Flux<IType> allSuperTypesOf(String fqName, boolean includeFocusType) {
|
public Flux<IType> allSuperTypesOf(String fqName, boolean includeFocusType, boolean detailed) {
|
||||||
Queue<String> queue = new LinkedList<>();
|
Queue<String> queue = new LinkedList<>();
|
||||||
HashSet<String> visited = new HashSet<>();
|
HashSet<String> visited = new HashSet<>();
|
||||||
queue.add(fqName);
|
queue.add(fqName);
|
||||||
|
|||||||
@@ -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
|
* All rights reserved. This program and the accompanying materials
|
||||||
* are made available under the terms of the Eclipse Public License v1.0
|
* are made available under the terms of the Eclipse Public License v1.0
|
||||||
* which accompanies this distribution, and is available at
|
* which accompanies this distribution, and is available at
|
||||||
@@ -20,8 +20,8 @@ public interface ClasspathIndex extends Disposable {
|
|||||||
Flux<Tuple2<IType, Double>> fuzzySearchTypes(String searchTerm, boolean includeBinaries, boolean includeSystemLibs);
|
Flux<Tuple2<IType, Double>> fuzzySearchTypes(String searchTerm, boolean includeBinaries, boolean includeSystemLibs);
|
||||||
Flux<Tuple2<IType, Double>> camelcaseSearchTypes(String searchTerm, boolean includeBinaries, boolean includeSystemLibs);
|
Flux<Tuple2<IType, Double>> camelcaseSearchTypes(String searchTerm, boolean includeBinaries, boolean includeSystemLibs);
|
||||||
Flux<Tuple2<String, Double>> fuzzySearchPackages(String searchTerm, boolean includeBinaries, boolean includeSystemLibs);
|
Flux<Tuple2<String, Double>> fuzzySearchPackages(String searchTerm, boolean includeBinaries, boolean includeSystemLibs);
|
||||||
Flux<IType> allSubtypesOf(String fqName, boolean includeFocusType);
|
Flux<IType> allSubtypesOf(String fqName, boolean includeFocusType, boolean detailed);
|
||||||
Flux<IType> allSuperTypesOf(String fqName, boolean includeFocusType);
|
Flux<IType> allSuperTypesOf(String fqName, boolean includeFocusType, boolean detailed);
|
||||||
IJavaModuleData findClasspathResourceContainer(String fqName);
|
IJavaModuleData findClasspathResourceContainer(String fqName);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*******************************************************************************
|
/*******************************************************************************
|
||||||
* Copyright (c) 2019 Pivotal, Inc.
|
* Copyright (c) 2019, 2020 Pivotal, Inc.
|
||||||
* All rights reserved. This program and the accompanying materials
|
* All rights reserved. This program and the accompanying materials
|
||||||
* are made available under the terms of the Eclipse Public License v1.0
|
* are made available under the terms of the Eclipse Public License v1.0
|
||||||
* which accompanies this distribution, and is available at
|
* which accompanies this distribution, and is available at
|
||||||
@@ -11,13 +11,13 @@
|
|||||||
package org.springframework.ide.vscode.commons.jdtls;
|
package org.springframework.ide.vscode.commons.jdtls;
|
||||||
|
|
||||||
import java.net.URI;
|
import java.net.URI;
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Objects;
|
import java.util.Objects;
|
||||||
import java.util.Optional;
|
import java.util.Optional;
|
||||||
import java.util.concurrent.CompletableFuture;
|
import java.util.concurrent.CompletableFuture;
|
||||||
import java.util.concurrent.ExecutionException;
|
import java.util.concurrent.ExecutionException;
|
||||||
import java.util.concurrent.TimeUnit;
|
import java.util.concurrent.TimeUnit;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
@@ -167,22 +167,13 @@ public class JdtLsIndex implements ClasspathIndex {
|
|||||||
.filter(tuple -> tuple.getT2() != 0.0);
|
.filter(tuple -> tuple.getT2() != 0.0);
|
||||||
}
|
}
|
||||||
|
|
||||||
private List<IType> convertTypeDescriptors(List<TypeDescriptorData> descriptors) {
|
|
||||||
List<IType> types = new ArrayList<>(descriptors.size());
|
|
||||||
for (TypeDescriptorData data : descriptors) {
|
|
||||||
if (data != null) {
|
|
||||||
types.add(toTypeFromDescriptor(data));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return types;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Flux<IType> allSubtypesOf(String fqName, boolean includeFocusType) {
|
public Flux<IType> allSubtypesOf(String fqName, boolean includeFocusType, boolean detailed) {
|
||||||
JavaTypeHierarchyParams searchParams = new JavaTypeHierarchyParams(projectUri.toString(), fqName, includeFocusType);
|
JavaTypeHierarchyParams searchParams = new JavaTypeHierarchyParams(projectUri.toString(), fqName, includeFocusType, detailed);
|
||||||
try {
|
try {
|
||||||
CompletableFuture<List<IType>> future = subtypesCache.get(searchParams, () -> client
|
CompletableFuture<List<IType>> 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)
|
return Mono.fromFuture(future)
|
||||||
.flatMapMany(results -> Flux.fromIterable(results));
|
.flatMapMany(results -> Flux.fromIterable(results));
|
||||||
} catch (ExecutionException e) {
|
} catch (ExecutionException e) {
|
||||||
@@ -192,11 +183,12 @@ public class JdtLsIndex implements ClasspathIndex {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Flux<IType> allSuperTypesOf(String fqName, boolean includeFocusType) {
|
public Flux<IType> allSuperTypesOf(String fqName, boolean includeFocusType, boolean detailed) {
|
||||||
JavaTypeHierarchyParams searchParams = new JavaTypeHierarchyParams(projectUri.toString(), fqName, includeFocusType);
|
JavaTypeHierarchyParams searchParams = new JavaTypeHierarchyParams(projectUri.toString(), fqName, includeFocusType, detailed);
|
||||||
try {
|
try {
|
||||||
CompletableFuture<List<IType>> future = supertypesCache.get(searchParams, () -> client
|
CompletableFuture<List<IType>> 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)
|
return Mono.fromFuture(future)
|
||||||
.flatMapMany(results -> Flux.fromIterable(results));
|
.flatMapMany(results -> Flux.fromIterable(results));
|
||||||
} catch (ExecutionException e) {
|
} catch (ExecutionException e) {
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*******************************************************************************
|
/*******************************************************************************
|
||||||
* Copyright (c) 2019 Pivotal, Inc.
|
* Copyright (c) 2019, 2020 Pivotal, Inc.
|
||||||
* All rights reserved. This program and the accompanying materials
|
* All rights reserved. This program and the accompanying materials
|
||||||
* are made available under the terms of the Eclipse Public License v1.0
|
* are made available under the terms of the Eclipse Public License v1.0
|
||||||
* which accompanies this distribution, and is available at
|
* 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.Location;
|
||||||
import org.eclipse.lsp4j.MarkupContent;
|
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.JsonNotification;
|
||||||
import org.eclipse.lsp4j.jsonrpc.services.JsonRequest;
|
import org.eclipse.lsp4j.jsonrpc.services.JsonRequest;
|
||||||
import org.eclipse.lsp4j.services.LanguageClient;
|
import org.eclipse.lsp4j.services.LanguageClient;
|
||||||
@@ -68,10 +70,12 @@ public interface STS4LanguageClient extends LanguageClient {
|
|||||||
CompletableFuture<List<String>> javaSearchPackages(JavaSearchParams params);
|
CompletableFuture<List<String>> javaSearchPackages(JavaSearchParams params);
|
||||||
|
|
||||||
@JsonRequest("sts/javaSubTypes")
|
@JsonRequest("sts/javaSubTypes")
|
||||||
CompletableFuture<List<TypeDescriptorData>> javaSubTypes(JavaTypeHierarchyParams params);
|
@ResponseJsonAdapter(TypeHierarchyResponseAdapter.class)
|
||||||
|
CompletableFuture<List<Either<TypeDescriptorData, TypeData>>> javaSubTypes(JavaTypeHierarchyParams params);
|
||||||
|
|
||||||
@JsonRequest("sts/javaSuperTypes")
|
@JsonRequest("sts/javaSuperTypes")
|
||||||
CompletableFuture<List<TypeDescriptorData>> javaSuperTypes(JavaTypeHierarchyParams params);
|
@ResponseJsonAdapter(TypeHierarchyResponseAdapter.class)
|
||||||
|
CompletableFuture<List<Either<TypeDescriptorData, TypeData>>> javaSuperTypes(JavaTypeHierarchyParams params);
|
||||||
|
|
||||||
@JsonRequest("sts/javaCodeComplete")
|
@JsonRequest("sts/javaCodeComplete")
|
||||||
CompletableFuture<List<JavaCodeCompleteData>> javaCodeComplete(JavaCodeCompleteParams params);
|
CompletableFuture<List<JavaCodeCompleteData>> javaCodeComplete(JavaCodeCompleteParams params);
|
||||||
|
|||||||
@@ -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 <code>Either<TypeDescriptorData, TypeData></code>.
|
||||||
|
* Creates either {@link TypeData} or {@link TypeDescriptorData} based on
|
||||||
|
* {@link JsonObject} properties.
|
||||||
|
*
|
||||||
|
* @author Alex Boyko
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public class TypeHierarchyResponseAdapter implements TypeAdapterFactory {
|
||||||
|
|
||||||
|
private static final TypeToken<Either<TypeDescriptorData, TypeData>> ELEMENT_TYPE = new TypeToken<Either<TypeDescriptorData, TypeData>>() {
|
||||||
|
};
|
||||||
|
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
|
@Override
|
||||||
|
public <T> TypeAdapter<T> create(Gson gson, TypeToken<T> type) {
|
||||||
|
Predicate<JsonElement> rightChecker = new PropertyChecker("classpathEntry", JsonObject.class)
|
||||||
|
.or(new PropertyChecker("bindingKey", JsonPrimitive.class));
|
||||||
|
Predicate<JsonElement> leftChecker = new PropertyChecker("fqName", JsonPrimitive.class)
|
||||||
|
.and(rightChecker.negate());
|
||||||
|
TypeAdapter<Either<TypeDescriptorData, TypeData>> elementTypeAdapter = new EitherTypeAdapter<>(gson,
|
||||||
|
ELEMENT_TYPE, leftChecker, rightChecker);
|
||||||
|
return (TypeAdapter<T>) new CollectionTypeAdapter<>(gson, ELEMENT_TYPE.getType(), elementTypeAdapter,
|
||||||
|
ArrayList::new);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
/*******************************************************************************
|
/*******************************************************************************
|
||||||
* Copyright (c) 2019 Pivotal, Inc.
|
* Copyright (c) 2019, 2020 Pivotal, Inc.
|
||||||
* All rights reserved. This program and the accompanying materials
|
* All rights reserved. This program and the accompanying materials
|
||||||
* are made available under the terms of the Eclipse Public License v1.0
|
* are made available under the terms of the Eclipse Public License v1.0
|
||||||
* which accompanies this distribution, and is available at
|
* which accompanies this distribution, and is available at
|
||||||
@@ -15,16 +15,18 @@ public class JavaTypeHierarchyParams {
|
|||||||
private String projectUri;
|
private String projectUri;
|
||||||
private String fqName;
|
private String fqName;
|
||||||
private boolean includeFocusType;
|
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();
|
super();
|
||||||
this.projectUri = projectUri;
|
this.projectUri = projectUri;
|
||||||
this.fqName = fqName;
|
this.fqName = fqName;
|
||||||
|
this.setDetailed(detailed);
|
||||||
this.setIncludeFocusType(includeFocusType);
|
this.setIncludeFocusType(includeFocusType);
|
||||||
}
|
}
|
||||||
|
|
||||||
public JavaTypeHierarchyParams(String projectUri, String fqName) {
|
public JavaTypeHierarchyParams(String projectUri, String fqName) {
|
||||||
this(projectUri, fqName, false);
|
this(projectUri, fqName, false, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
public String getProjectUri() {
|
public String getProjectUri() {
|
||||||
@@ -51,6 +53,17 @@ public class JavaTypeHierarchyParams {
|
|||||||
this.includeFocusType = includeFocusType;
|
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
|
@Override
|
||||||
public int hashCode() {
|
public int hashCode() {
|
||||||
final int prime = 31;
|
final int prime = 31;
|
||||||
@@ -61,6 +74,9 @@ public class JavaTypeHierarchyParams {
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* IMPORTANT: Do not include 'detailed' flag in the {@link #hashCode()} and {@link #equals(Object)}
|
||||||
|
*/
|
||||||
@Override
|
@Override
|
||||||
public boolean equals(Object obj) {
|
public boolean equals(Object obj) {
|
||||||
if (this == obj)
|
if (this == obj)
|
||||||
|
|||||||
@@ -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
|
* All rights reserved. This program and the accompanying materials
|
||||||
* are made available under the terms of the Eclipse Public License v1.0
|
* are made available under the terms of the Eclipse Public License v1.0
|
||||||
* which accompanies this distribution, and is available at
|
* which accompanies this distribution, and is available at
|
||||||
@@ -163,7 +163,7 @@ public class JavaIndexTest {
|
|||||||
@Test
|
@Test
|
||||||
public void testFindAllSuperTypes() throws Exception {
|
public void testFindAllSuperTypes() throws Exception {
|
||||||
MavenJavaProject project = mavenProjectsCache.get("gs-rest-service-cors-boot-1.4.1-with-classpath-file");
|
MavenJavaProject project = mavenProjectsCache.get("gs-rest-service-cors-boot-1.4.1-with-classpath-file");
|
||||||
Set<String> actual = project.getIndex().allSuperTypesOf("java.util.ArrayList", false).map(t -> t.getFullyQualifiedName()).collect(Collectors.toSet()).block();
|
Set<String> actual = project.getIndex().allSuperTypesOf("java.util.ArrayList", false, true).map(t -> t.getFullyQualifiedName()).collect(Collectors.toSet()).block();
|
||||||
Set<String> expected = new HashSet<>(Arrays.asList(
|
Set<String> expected = new HashSet<>(Arrays.asList(
|
||||||
"java.util.List",
|
"java.util.List",
|
||||||
"java.util.RandomAccess",
|
"java.util.RandomAccess",
|
||||||
@@ -181,7 +181,7 @@ public class JavaIndexTest {
|
|||||||
@Test
|
@Test
|
||||||
public void testFindAllSuperTypesWithFocusType() throws Exception {
|
public void testFindAllSuperTypesWithFocusType() throws Exception {
|
||||||
MavenJavaProject project = mavenProjectsCache.get("gs-rest-service-cors-boot-1.4.1-with-classpath-file");
|
MavenJavaProject project = mavenProjectsCache.get("gs-rest-service-cors-boot-1.4.1-with-classpath-file");
|
||||||
Set<String> actual = project.getIndex().allSuperTypesOf("java.util.ArrayList", true).map(t -> t.getFullyQualifiedName()).collect(Collectors.toSet()).block();
|
Set<String> actual = project.getIndex().allSuperTypesOf("java.util.ArrayList", true, true).map(t -> t.getFullyQualifiedName()).collect(Collectors.toSet()).block();
|
||||||
Set<String> expected = new HashSet<>(Arrays.asList(
|
Set<String> expected = new HashSet<>(Arrays.asList(
|
||||||
"java.util.ArrayList",
|
"java.util.ArrayList",
|
||||||
"java.util.List",
|
"java.util.List",
|
||||||
|
|||||||
@@ -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
|
* All rights reserved. This program and the accompanying materials
|
||||||
* are made available under the terms of the Eclipse Public License v1.0
|
* are made available under the terms of the Eclipse Public License v1.0
|
||||||
* which accompanies this distribution, and is available at
|
* which accompanies this distribution, and is available at
|
||||||
@@ -379,12 +379,12 @@ public class LanguageServerHarness {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public CompletableFuture<List<TypeDescriptorData>> javaSubTypes(JavaTypeHierarchyParams params) {
|
public CompletableFuture<List<Either<TypeDescriptorData, TypeData>>> javaSubTypes(JavaTypeHierarchyParams params) {
|
||||||
return CompletableFuture.completedFuture(Collections.emptyList());
|
return CompletableFuture.completedFuture(Collections.emptyList());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public CompletableFuture<List<TypeDescriptorData>> javaSuperTypes(JavaTypeHierarchyParams params) {
|
public CompletableFuture<List<Either<TypeDescriptorData, TypeData>>> javaSuperTypes(JavaTypeHierarchyParams params) {
|
||||||
return CompletableFuture.completedFuture(Collections.emptyList());
|
return CompletableFuture.completedFuture(Collections.emptyList());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -15,7 +15,8 @@ Require-Bundle: org.eclipse.core.runtime,
|
|||||||
org.eclipse.lsp4j,
|
org.eclipse.lsp4j,
|
||||||
org.eclipse.lsp4j.jsonrpc,
|
org.eclipse.lsp4j.jsonrpc,
|
||||||
io.projectreactor.reactor-core,
|
io.projectreactor.reactor-core,
|
||||||
org.reactivestreams.reactive-streams
|
org.reactivestreams.reactive-streams,
|
||||||
|
com.google.gson
|
||||||
Export-Package: org.springframework.ide.vscode.commons.protocol,
|
Export-Package: org.springframework.ide.vscode.commons.protocol,
|
||||||
org.springframework.ide.vscode.commons.protocol.java,
|
org.springframework.ide.vscode.commons.protocol.java,
|
||||||
org.springframework.tooling.jdt.ls.commons,
|
org.springframework.tooling.jdt.ls.commons,
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*******************************************************************************
|
/*******************************************************************************
|
||||||
* Copyright (c) 2019 Pivotal, Inc.
|
* Copyright (c) 2019, 2020 Pivotal, Inc.
|
||||||
* All rights reserved. This program and the accompanying materials
|
* All rights reserved. This program and the accompanying materials
|
||||||
* are made available under the terms of the Eclipse Public License v1.0
|
* are made available under the terms of the Eclipse Public License v1.0
|
||||||
* which accompanies this distribution, and is available at
|
* 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.IJavaProject;
|
||||||
import org.eclipse.jdt.core.IType;
|
import org.eclipse.jdt.core.IType;
|
||||||
import org.eclipse.jdt.core.ITypeHierarchy;
|
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.JavaTypeHierarchyParams;
|
||||||
|
import org.springframework.ide.vscode.commons.protocol.java.TypeData;
|
||||||
import org.springframework.ide.vscode.commons.protocol.java.TypeDescriptorData;
|
import org.springframework.ide.vscode.commons.protocol.java.TypeDescriptorData;
|
||||||
import org.springframework.tooling.jdt.ls.commons.Logger;
|
import org.springframework.tooling.jdt.ls.commons.Logger;
|
||||||
import org.springframework.tooling.jdt.ls.commons.resources.ResourceUtils;
|
import org.springframework.tooling.jdt.ls.commons.resources.ResourceUtils;
|
||||||
@@ -61,26 +63,26 @@ public class TypeHierarchy {
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
public Stream<TypeDescriptorData> subTypes(JavaTypeHierarchyParams params) {
|
public Stream<Either<TypeDescriptorData, TypeData>> subTypes(JavaTypeHierarchyParams params) {
|
||||||
URI projectUri = params.getProjectUri() == null ? null : URI.create(params.getProjectUri());
|
URI projectUri = params.getProjectUri() == null ? null : URI.create(params.getProjectUri());
|
||||||
ITypeHierarchy hierarchy = hierarchy(projectUri, params.getFqName(), false);
|
ITypeHierarchy hierarchy = hierarchy(projectUri, params.getFqName(), false);
|
||||||
if (hierarchy != null) {
|
if (hierarchy != null) {
|
||||||
IType focusType = hierarchy.getType();
|
IType focusType = hierarchy.getType();
|
||||||
return Stream.concat(params.isIncludeFocusType() ? Stream.of(focusType) : Stream.empty(), Stream.of(hierarchy.getAllSubtypes(focusType)))
|
return Stream.concat(params.isIncludeFocusType() ? Stream.of(focusType) : Stream.empty(), Stream.of(hierarchy.getAllSubtypes(focusType)))
|
||||||
.parallel()
|
.parallel()
|
||||||
.map(javaData::createTypeDescriptorData);
|
.map(type -> params.isDetailed() ? Either.forRight(javaData.createTypeData(type)) : Either.forLeft(javaData.createTypeDescriptorData(type)));
|
||||||
}
|
}
|
||||||
return Stream.of();
|
return Stream.of();
|
||||||
}
|
}
|
||||||
|
|
||||||
public Stream<TypeDescriptorData> superTypes(JavaTypeHierarchyParams params) {
|
public Stream<Either<TypeDescriptorData, TypeData>> superTypes(JavaTypeHierarchyParams params) {
|
||||||
URI projectUri = params.getProjectUri() == null ? null : URI.create(params.getProjectUri());
|
URI projectUri = params.getProjectUri() == null ? null : URI.create(params.getProjectUri());
|
||||||
ITypeHierarchy hierarchy = hierarchy(projectUri, params.getFqName(), true);
|
ITypeHierarchy hierarchy = hierarchy(projectUri, params.getFqName(), true);
|
||||||
if (hierarchy != null) {
|
if (hierarchy != null) {
|
||||||
IType focusType = hierarchy.getType();
|
IType focusType = hierarchy.getType();
|
||||||
return Stream.concat(params.isIncludeFocusType() ? Stream.of(focusType) : Stream.empty(), Stream.of(hierarchy.getAllSupertypes(focusType)))
|
return Stream.concat(params.isIncludeFocusType() ? Stream.of(focusType) : Stream.empty(), Stream.of(hierarchy.getAllSupertypes(focusType)))
|
||||||
.parallel()
|
.parallel()
|
||||||
.map(javaData::createTypeDescriptorData);
|
.map(type -> params.isDetailed() ? Either.forRight(javaData.createTypeData(type)) : Either.forLeft(javaData.createTypeDescriptorData(type)));
|
||||||
}
|
}
|
||||||
return Stream.of();
|
return Stream.of();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -12,4 +12,5 @@ Require-Bundle: org.eclipse.jdt.ls.core,
|
|||||||
org.springframework.tooling.jdt.ls.commons,
|
org.springframework.tooling.jdt.ls.commons,
|
||||||
com.google.guava,
|
com.google.guava,
|
||||||
com.google.gson,
|
com.google.gson,
|
||||||
org.eclipse.lsp4j
|
org.eclipse.lsp4j,
|
||||||
|
org.eclipse.lsp4j.jsonrpc
|
||||||
|
|||||||
@@ -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
|
* All rights reserved. This program and the accompanying materials
|
||||||
* are made available under the terms of the Eclipse Public License v1.0
|
* are made available under the terms of the Eclipse Public License v1.0
|
||||||
* which accompanies this distribution, and is available at
|
* 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
|
// Trim the generic parameters part if it's present
|
||||||
String liveBeanTypeFQName = idx < 0 ? rawLiveBeanFqName : rawLiveBeanFqName.substring(0, idx);
|
String liveBeanTypeFQName = idx < 0 ? rawLiveBeanFqName : rawLiveBeanFqName.substring(0, idx);
|
||||||
if (liveBeanTypeFQName != null) {
|
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;
|
.filter(fqn -> bindingQualifiedName.equals(fqn)).blockFirst() != null;
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
|
|||||||
@@ -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
|
* All rights reserved. This program and the accompanying materials
|
||||||
* are made available under the terms of the Eclipse Public License v1.0
|
* are made available under the terms of the Eclipse Public License v1.0
|
||||||
* which accompanies this distribution, and is available at
|
* which accompanies this distribution, and is available at
|
||||||
@@ -141,7 +141,7 @@ public class ClassReferenceProvider extends CachingValueProvider {
|
|||||||
if (target == null) {
|
if (target == null) {
|
||||||
typesWithScoresFlux = javaProject.getIndex().fuzzySearchTypes(query, true, false);
|
typesWithScoresFlux = javaProject.getIndex().fuzzySearchTypes(query, true, false);
|
||||||
} else {
|
} else {
|
||||||
typesWithScoresFlux = javaProject.getIndex().allSubtypesOf(target, true)
|
typesWithScoresFlux = javaProject.getIndex().allSubtypesOf(target, true, false)
|
||||||
.filter(t -> Flags.isPublic(t.getFlags()) && !concrete || !isAbstract(t))
|
.filter(t -> Flags.isPublic(t.getFlags()) && !concrete || !isAbstract(t))
|
||||||
.map(type -> Tuples.of(type, FuzzyMatcher.matchScore(query, type.getFullyQualifiedName())));
|
.map(type -> Tuples.of(type, FuzzyMatcher.matchScore(query, type.getFullyQualifiedName())));
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -136,7 +136,7 @@ public class PropertyNameCompletionProposalProvider implements XMLCompletionProv
|
|||||||
}
|
}
|
||||||
|
|
||||||
public static Stream<IMethod> propertyNameCandidateMethods(IJavaProject project, String beanClassFqName) {
|
public static Stream<IMethod> propertyNameCandidateMethods(IJavaProject project, String beanClassFqName) {
|
||||||
return project.getIndex().allSuperTypesOf(beanClassFqName, true)
|
return project.getIndex().allSuperTypesOf(beanClassFqName, true, true)
|
||||||
.toStream()
|
.toStream()
|
||||||
.flatMap(type -> type.getMethods())
|
.flatMap(type -> type.getMethods())
|
||||||
.filter(PropertyNameCompletionProposalProvider::isPropertyWriteMethod);
|
.filter(PropertyNameCompletionProposalProvider::isPropertyWriteMethod);
|
||||||
|
|||||||
Reference in New Issue
Block a user