PT #166315444: XML content assist for VSCode and Theia

This commit is contained in:
BoykoAlex
2019-05-28 19:11:15 -04:00
parent 7c3cce32a9
commit 5468e43963
8 changed files with 174 additions and 1167 deletions

View File

@@ -48,6 +48,12 @@
id="sts.java.hierarchy.supertypes">
</command>
</delegateCommandHandler>
<delegateCommandHandler
class="org.springframework.tooling.jdt.ls.extension.JavaCodeCompletionHandler">
<command
id="sts.java.code.completions">
</command>
</delegateCommandHandler>
</extension>
</plugin>

View File

@@ -0,0 +1,32 @@
/*******************************************************************************
* Copyright (c) 2019 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.tooling.jdt.ls.extension;
import java.util.List;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.jdt.ls.core.internal.IDelegateCommandHandler;
import org.springframework.ide.vscode.commons.protocol.java.JavaCodeCompleteParams;
import com.google.gson.Gson;
@SuppressWarnings("restriction")
public class JavaCodeCompletionHandler implements IDelegateCommandHandler {
private Gson gson = new Gson();
@Override
public Object executeCommand(String commandId, List<Object> arguments, IProgressMonitor monitor) throws Exception {
JavaCodeCompleteParams params = gson.fromJson(gson.toJson(arguments.get(0)), JavaCodeCompleteParams.class);
return JavaHelpers.CODE_COMPLETIONS.get().codeComplete(params.getProjectUri(), params.getPrefix(), params.isIncludeTypes(), params.isIncludePackages());
}
}

View File

@@ -12,6 +12,7 @@ package org.springframework.tooling.jdt.ls.extension;
import org.eclipse.jdt.ls.core.internal.HoverInfoProvider;
import org.springframework.tooling.jdt.ls.commons.Logger;
import org.springframework.tooling.jdt.ls.commons.java.JavaCodeCompletion;
import org.springframework.tooling.jdt.ls.commons.java.JavaData;
import org.springframework.tooling.jdt.ls.commons.java.JavaFluxSearch;
import org.springframework.tooling.jdt.ls.commons.java.TypeHierarchy;
@@ -29,5 +30,7 @@ public class JavaHelpers {
final public static Supplier<JavaFluxSearch> SEARCH = Suppliers.memoize(() -> new JavaFluxSearch(logger, DATA.get()));
final public static Supplier<TypeHierarchy> HIERARCHY = Suppliers.memoize(() -> new TypeHierarchy(logger, DATA.get()));
final public static Supplier<JavaCodeCompletion> CODE_COMPLETIONS = Suppliers.memoize(() -> new JavaCodeCompletion());
}

View File

@@ -21,6 +21,8 @@ import org.eclipse.lsp4j.CompletionItemKind;
import org.eclipse.lsp4xml.dom.DOMAttr;
import org.eclipse.lsp4xml.dom.DOMNode;
import org.eclipse.lsp4xml.dom.parser.Scanner;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.ide.vscode.boot.xml.XMLCompletionProvider;
import org.springframework.ide.vscode.commons.java.IJavaProject;
import org.springframework.ide.vscode.commons.languageserver.completion.DocumentEdits;
@@ -36,6 +38,8 @@ import org.springframework.ide.vscode.commons.util.text.TextDocument;
* @author Martin Lippert
*/
public class TypeCompletionProposalProvider implements XMLCompletionProvider {
private static final Logger log = LoggerFactory.getLogger(TypeCompletionProposalProvider.class);
private final JavaProjectFinder projectFinder;
private final SimpleLanguageServer server;
@@ -80,7 +84,8 @@ public class TypeCompletionProposalProvider implements XMLCompletionProvider {
final String finalPrefix = prefix;
try {
return completions.get().stream()
List<JavaCodeCompleteData> list = completions.get();
return list.stream()
.filter(proposal -> {
if (proposal.isClassProposal()) return classesAllowed;
if (proposal.isInterfaceProposal()) return interfacesAllowed;
@@ -93,7 +98,7 @@ public class TypeCompletionProposalProvider implements XMLCompletionProvider {
.collect(Collectors.toList());
}
catch (Exception e) {
// TODO: logging
log.error("{}", e);
}
};
@@ -113,19 +118,25 @@ public class TypeCompletionProposalProvider implements XMLCompletionProvider {
}
private TypeCompletionProposal createPackageProposal(JavaCodeCompleteData proposal, TextDocument doc, String prefix, int offset) {
String label = proposal.getFullyQualifiedName();
String fqName = proposal.getFullyQualifiedName();
String label = fqName;
CompletionItemKind kind = CompletionItemKind.Module;
DocumentEdits edits = new DocumentEdits(doc, false);
edits.replace(offset - prefix.length(), offset, proposal.getFullyQualifiedName());
if (fqName.startsWith(prefix)) {
edits.insert(offset, fqName.substring(prefix.length()));
} else {
edits.replace(offset - prefix.length(), offset, fqName);
}
Renderable renderable = null;
return new TypeCompletionProposal(label, kind, edits, proposal.getFullyQualifiedName(), renderable, proposal.getRelevance());
return new TypeCompletionProposal(label, kind, edits, fqName, renderable, proposal.getRelevance());
}
private TypeCompletionProposal createTypeProposal(JavaCodeCompleteData proposal, TextDocument doc, String prefix, int offset) {
String label = proposal.getFullyQualifiedName();
String fqName = proposal.getFullyQualifiedName();
String label = fqName;
int splitIndex = Math.max(label.lastIndexOf("."), label.lastIndexOf("$"));
@@ -142,11 +153,15 @@ public class TypeCompletionProposalProvider implements XMLCompletionProvider {
}
DocumentEdits edits = new DocumentEdits(doc, false);
edits.replace(offset - prefix.length(), offset, proposal.getFullyQualifiedName());
if (fqName.startsWith(prefix)) {
edits.insert(offset, fqName.substring(prefix.length()));
} else {
edits.replace(offset - prefix.length(), offset, fqName);
}
Renderable renderable = null;
return new TypeCompletionProposal(label, kind, edits, proposal.getFullyQualifiedName(), renderable, proposal.getRelevance());
return new TypeCompletionProposal(label, kind, edits, fqName, renderable, proposal.getRelevance());
}
}

View File

@@ -20,6 +20,7 @@ export const SEARCH_TYPES_REQUEST_TYPE = 'sts/javaSearchTypes';
export const SEACH_PACKAGES_REQUEST_TYPE = 'sts/javaSearchPackages';
export const SUBTYPES_REQUEST_TYPE = 'sts/javaSubTypes';
export const SUPERTYPES_REQUEST_TYPE = 'sts/javaSuperTypes';
export const CODE_COMPLETE_REQUEST_TYPE = 'sts/javaCodeComplete';
@injectable()
export class JavaDataService {
@@ -38,6 +39,7 @@ export class JavaDataService {
client.onRequest(SEACH_PACKAGES_REQUEST_TYPE, (params: JavaSearchParams) => this.commands.executeCommand('sts.java.search.packages', params));
client.onRequest(SUBTYPES_REQUEST_TYPE, (params: JavaTypeHierarchyParams) => this.commands.executeCommand('sts.java.hierarchy.subtypes', params));
client.onRequest(SUPERTYPES_REQUEST_TYPE, (params: JavaTypeHierarchyParams) => this.commands.executeCommand('sts.java.hierarchy.supertypes', params));
client.onRequest(CODE_COMPLETE_REQUEST_TYPE, (params: JavaCodeCompleteParams) => this.commands.executeCommand('sts.java.code.completions', params));
}
}
@@ -61,4 +63,11 @@ interface JavaTypeHierarchyParams {
projectUri?: string;
fqName: string;
includeFocusType: boolean;
}
interface JavaCodeCompleteParams {
projectUri: string;
prefix: string;
includeTypes: boolean;
includePackages: boolean;
}

File diff suppressed because it is too large Load Diff

View File

@@ -42,6 +42,11 @@ export function registerJavaDataService(client : LanguageClient) : void {
client.onRequest(javaSuperTypes, async (params: JavaTypeHierarchyParams) =>
<any> await VSCode.commands.executeCommand("java.execute.workspaceCommand", "sts.java.hierarchy.supertypes", params)
);
const javaCodeCompletion = new RequestType<JavaCodeCompleteParams, any, void, void>('sts/javaCodeComplete');
client.onRequest(javaCodeCompletion, async (params: JavaCodeCompleteParams) =>
<any> await VSCode.commands.executeCommand("java.execute.workspaceCommand", "sts.java.code.completions", params)
);
}
interface JavaDataParams {
@@ -63,4 +68,11 @@ interface JavaTypeHierarchyParams {
projectUri?: string;
fqName: string;
includeFocusType: boolean;
}
interface JavaCodeCompleteParams {
projectUri: string;
prefix: string;
includeTypes: boolean;
includePackages: boolean;
}

View File

@@ -1,12 +1,12 @@
{
"name": "vscode-spring-boot",
"version": "1.7.0",
"version": "1.8.0",
"lockfileVersion": 1,
"requires": true,
"dependencies": {
"@pivotal-tools/commons-vscode": {
"version": "file:../commons-vscode/pivotal-tools-commons-vscode-0.2.2.tgz",
"integrity": "sha512-cMT+x/NOLnIhyUPV5rF4CGLrCdUlX+fGCz7DoegnmxVhiD9Y0yKsUP14gwRU12qRTm8o7H0MJbZaA9h+bw5okw==",
"integrity": "sha512-wpuWx/wm1LYQ6vF2lfiLzETLzPFlNiUtzqoQd8eMhd5MQLeqJIAB9P2s3TggdD6bdpP+z2cknaAr5bpnTfMd2Q==",
"requires": {
"@pivotal-tools/jvm-launch-utils": "0.0.12",
"deep-equal": "^1.0.1",