XML bean property names: include super classes in the lookup

This commit is contained in:
BoykoAlex
2019-05-09 15:50:54 -04:00
parent 1999f7b159
commit 14dfc325c8
4 changed files with 38 additions and 23 deletions

View File

@@ -25,7 +25,6 @@ import org.eclipse.lsp4xml.dom.parser.Scanner;
import org.springframework.ide.vscode.boot.xml.XMLCompletionProvider;
import org.springframework.ide.vscode.commons.java.IJavaProject;
import org.springframework.ide.vscode.commons.java.IMethod;
import org.springframework.ide.vscode.commons.java.IType;
import org.springframework.ide.vscode.commons.languageserver.completion.DocumentEdits;
import org.springframework.ide.vscode.commons.languageserver.completion.ICompletionProposal;
import org.springframework.ide.vscode.commons.languageserver.java.JavaProjectFinder;
@@ -33,6 +32,8 @@ import org.springframework.ide.vscode.commons.util.Renderable;
import org.springframework.ide.vscode.commons.util.StringUtil;
import org.springframework.ide.vscode.commons.util.text.TextDocument;
import reactor.core.publisher.Flux;
/**
* @author Martin Lippert
*/
@@ -63,16 +64,12 @@ public class PropertyNameCompletionProposalProvider implements XMLCompletionProv
String beanClass = identifyBeanClass(node);
if (beanClass != null && beanClass.length() > 0) {
IType beanType = project.getIndex().findType(beanClass);
if (beanType != null) {
final String searchPrefix = prefix;
return beanType.getMethods()
.filter(method -> isPropertyWriteMethod(method))
.filter(method -> getPropertyName(method).startsWith(searchPrefix))
.map(method -> createProposal(method, doc, offset, tokenOffset, tokenEnd))
.collect(Collectors.toList());
}
final String searchPrefix = prefix;
propertyNameCandidateMethods(project, beanClass)
.filter(method -> getPropertyName(method).startsWith(searchPrefix))
.map(method -> createProposal(method, doc, offset, tokenOffset, tokenEnd))
.toStream()
.collect(Collectors.toList());
}
};
@@ -110,7 +107,7 @@ public class PropertyNameCompletionProposalProvider implements XMLCompletionProv
return new TypeCompletionProposal(label, kind, edits, label, renderable, 1d);
}
private boolean isPropertyWriteMethod(IMethod method) {
private static boolean isPropertyWriteMethod(IMethod method) {
return method != null
&& method.getElementName().startsWith("set")
&& method.getElementName().length() > 3;
@@ -126,5 +123,11 @@ public class PropertyNameCompletionProposalProvider implements XMLCompletionProv
}
return methodName;
}
public static Flux<IMethod> propertyNameCandidateMethods(IJavaProject project, String beanClassFqName) {
return project.getIndex().allSuperTypesOf(beanClassFqName, true)
.flatMap(type -> Flux.fromStream(type.getMethods()))
.filter(PropertyNameCompletionProposalProvider::isPropertyWriteMethod);
}
}

View File

@@ -18,7 +18,6 @@ import org.eclipse.lsp4xml.dom.DOMNode;
import org.springframework.ide.vscode.boot.java.links.JavaElementLocationProvider;
import org.springframework.ide.vscode.boot.xml.completions.PropertyNameCompletionProposalProvider;
import org.springframework.ide.vscode.commons.java.IJavaProject;
import org.springframework.ide.vscode.commons.java.IType;
import org.springframework.ide.vscode.commons.languageserver.java.JavaProjectFinder;
import org.springframework.ide.vscode.commons.util.text.TextDocument;
@@ -45,15 +44,10 @@ public class PropertyNameHyperlinkProvider implements XMLHyperlinkProvider {
IJavaProject project = foundProject.get();
String beanClass = PropertyNameCompletionProposalProvider.identifyBeanClass(node);
if (beanClass != null && beanClass.length() > 0) {
IType beanType = project.getIndex().findType(beanClass);
if (beanType != null) {
return beanType.getMethods()
.filter(method -> propertyName.equals(PropertyNameCompletionProposalProvider.getPropertyName(method)))
.map(method -> locationProvider.findLocation(project, method))
.findFirst()
.orElse(null);
}
return PropertyNameCompletionProposalProvider.propertyNameCandidateMethods(project, beanClass)
.filter(method -> propertyName.equals(PropertyNameCompletionProposalProvider.getPropertyName(method)))
.map(method -> locationProvider.findLocation(project, method))
.blockFirst();
}
}
return null;

View File

@@ -116,6 +116,24 @@ public class XmlBeansHyperlinkTest {
definitionLinkAsserts.assertLinkTargets(editor, "age", project, DefinitionLinkAsserts.method("u.t.r.TestBean", "setAge", "int"));
}
@Test
public void testBeanPropertyNameFromSuperClassHyperlink() throws Exception {
Path xmlFilePath = Paths.get(project.getLocationUri()).resolve("beans.xml");
Editor editor = harness.newEditor(LanguageId.XML,
"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" +
"<beans xmlns=\"http://www.springframework.org/schema/beans\"\n" +
"xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n" +
"xsi:schemaLocation=\"http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd\">\n" +
"<bean id=\"someBean\" class=\"u.t.r.TestBean\"\n" +
"<property name=\"message\" value=\"Hello\" />\n" +
"</bean>\n" +
"</beans>\n",
UriUtil.toUri(xmlFilePath.toFile()).toString()
);
definitionLinkAsserts.assertLinkTargets(editor, "message", project, DefinitionLinkAsserts.method("u.t.r.SuperTestBean", "setMessage", "java.lang.String"));
}
@Test
public void testBeanRefHyperlink() throws Exception {
Path xmlFilePath = Paths.get(project.getLocationUri()).resolve("beans.xml");

View File

@@ -1,6 +1,6 @@
package u.t.r;
public class TestBean {
public class TestBean extends SuperTestBean {
private int age = 5;