From 5e784f6cec297ff21037cdc2e840d7180f663f7a Mon Sep 17 00:00:00 2001 From: azerr Date: Fri, 10 Feb 2023 19:40:17 +0100 Subject: [PATCH] Definition for user tag parameter Fixes #789 Signed-off-by: azerr --- .../com/redhat/qute/project/tags/UserTag.java | 20 +++- .../redhat/qute/services/QuteDefinition.java | 95 +++++++++++++------ .../QuteDefinitionInForUserTagTest.java | 19 ++++ 3 files changed, 102 insertions(+), 32 deletions(-) diff --git a/qute.ls/com.redhat.qute.ls/src/main/java/com/redhat/qute/project/tags/UserTag.java b/qute.ls/com.redhat.qute.ls/src/main/java/com/redhat/qute/project/tags/UserTag.java index 67fc1e8ff..042533b41 100644 --- a/qute.ls/com.redhat.qute.ls/src/main/java/com/redhat/qute/project/tags/UserTag.java +++ b/qute.ls/com.redhat.qute.ls/src/main/java/com/redhat/qute/project/tags/UserTag.java @@ -164,6 +164,24 @@ public Collection getParameters() { return parameters.values(); } + /** + * Returns the parameter which have the given name parameterName + * and null otherwise. + * + * @param parameterName the parameter name. + * + * @return the parameter which have the given name parameterName + * and null otherwise. + */ + public UserTagParameter findParameter(String parameterName) { + for (UserTagParameter parameter : getParameters()) { + if (parameterName.equals(parameter.getPartName())) { + return parameter; + } + } + return null; + } + /** * Returns parameters of the user tag. * @@ -189,7 +207,7 @@ private Template getTemplate() { if (content == null) { return null; } - return TemplateParser.parse(content, getFileName()); + return TemplateParser.parse(content, getUri()); } /** diff --git a/qute.ls/com.redhat.qute.ls/src/main/java/com/redhat/qute/services/QuteDefinition.java b/qute.ls/com.redhat.qute.ls/src/main/java/com/redhat/qute/services/QuteDefinition.java index 770946f4f..87a95c02d 100644 --- a/qute.ls/com.redhat.qute.ls/src/main/java/com/redhat/qute/services/QuteDefinition.java +++ b/qute.ls/com.redhat.qute.ls/src/main/java/com/redhat/qute/services/QuteDefinition.java @@ -55,6 +55,7 @@ import com.redhat.qute.project.datamodel.JavaDataModelCache; import com.redhat.qute.project.indexing.QuteIndex; import com.redhat.qute.project.tags.UserTag; +import com.redhat.qute.project.tags.UserTagParameter; import com.redhat.qute.services.definition.DefinitionRequest; import com.redhat.qute.utils.QutePositionUtility; import com.redhat.qute.utils.QuteSearchUtils; @@ -86,22 +87,24 @@ public CompletableFuture> findDefinition(Template t } int offset = definitionRequest.getOffset(); switch (node.getKind()) { - case Section: - // - Start end tag definition - // - Java data model definition - return findDefinitionFromSection(offset, (Section) node, template, cancelChecker); - case ParameterDeclaration: - // Return Java class definition - return findDefinitionFromParameterDeclaration(offset, (ParameterDeclaration) node, template, - cancelChecker); - case Expression: - return findDefinitionFromExpression(offset, (Expression) node, template, cancelChecker); - case ExpressionPart: - Part part = (Part) node; - return findDefinitionFromPart(part, template, cancelChecker); - default: - // no definitions - return NO_DEFINITION; + case Section: + // - Start end tag definition + // - Java data model definition + return findDefinitionFromSection(offset, (Section) node, template, cancelChecker); + case ParameterDeclaration: + // Return Java class definition + return findDefinitionFromParameterDeclaration(offset, (ParameterDeclaration) node, template, + cancelChecker); + case Expression: + return findDefinitionFromExpression(offset, (Expression) node, template, cancelChecker); + case ExpressionPart: + Part part = (Part) node; + return findDefinitionFromPart(part, template, cancelChecker); + case Parameter: + return findDefinitionFromParameter(offset, (Parameter) node, template, cancelChecker); + default: + // no definitions + return NO_DEFINITION; } } catch (BadLocationException e) { @@ -262,14 +265,14 @@ private CompletableFuture> findDefinitionFromPart(P } switch (part.getPartKind()) { - case Object: - return findDefinitionFromObjectPart((ObjectPart) part, template, cancelChecker); - case Property: - return findDefinitionFromPropertyPart((PropertyPart) part, template, cancelChecker); - case Method: - return findDefinitionFromPropertyPart((MethodPart) part, template, cancelChecker); - default: - return NO_DEFINITION; + case Object: + return findDefinitionFromObjectPart((ObjectPart) part, template, cancelChecker); + case Property: + return findDefinitionFromPropertyPart((PropertyPart) part, template, cancelChecker); + case Method: + return findDefinitionFromPropertyPart((MethodPart) part, template, cancelChecker); + default: + return NO_DEFINITION; } } @@ -435,16 +438,46 @@ private CompletableFuture> findDefinitionFromJavaMe QuteJavaDefinitionParams params = new QuteJavaDefinitionParams(sourceType, projectUri); if (member != null) { switch (member.getJavaElementKind()) { - case FIELD: - params.setSourceField(member.getName()); - break; - case METHOD: - params.setSourceMethod(member.getName()); - break; - default: + case FIELD: + params.setSourceField(member.getName()); + break; + case METHOD: + params.setSourceMethod(member.getName()); + break; + default: } } return findJavaDefinition(params, cancelChecker, () -> QutePositionUtility.createRange(part)); } + private CompletableFuture> findDefinitionFromParameter(int offset, Parameter parameter, + Template template, CancelChecker cancelChecker) { + if (!parameter.isInName(offset)) { + return NO_DEFINITION; + } + Section section = parameter.getOwnerSection(); + if (section == null || section.getSectionKind() != SectionKind.CUSTOM) { + return NO_DEFINITION; + } + QuteProject project = template.getProject(); + if (project == null) { + return NO_DEFINITION; + } + UserTag userTag = project.findUserTag(section.getTag()); + if (userTag == null) { + return NO_DEFINITION; + } + UserTagParameter userTagParameter = userTag.findParameter(parameter.getName()); + if (userTagParameter == null) { + return NO_DEFINITION; + } + ObjectPart part = userTagParameter.getPart(); + List locations = new ArrayList<>(); + String targetUri = part.getOwnerTemplate().getUri(); + Range targetRange = QutePositionUtility.createRange(part); + Range originSelectionRange = QutePositionUtility.selectParameterName(parameter); + LocationLink locationLink = new LocationLink(targetUri, targetRange, targetRange, originSelectionRange); + locations.add(locationLink); + return CompletableFuture.completedFuture(locations); + } } \ No newline at end of file diff --git a/qute.ls/com.redhat.qute.ls/src/test/java/com/redhat/qute/services/definition/QuteDefinitionInForUserTagTest.java b/qute.ls/com.redhat.qute.ls/src/test/java/com/redhat/qute/services/definition/QuteDefinitionInForUserTagTest.java index 8f1853b09..d1eb67e9f 100644 --- a/qute.ls/com.redhat.qute.ls/src/test/java/com/redhat/qute/services/definition/QuteDefinitionInForUserTagTest.java +++ b/qute.ls/com.redhat.qute.ls/src/test/java/com/redhat/qute/services/definition/QuteDefinitionInForUserTagTest.java @@ -15,6 +15,8 @@ import static com.redhat.qute.QuteAssert.r; import static com.redhat.qute.QuteAssert.testDefinitionFor; +import java.nio.file.Paths; + import org.junit.jupiter.api.Test; /** @@ -51,4 +53,21 @@ public void noIt() throws Exception { testDefinitionFor(template); } + @Test + public void inputName() throws Exception { + String inputUri = getUserTagUri("input"); + String template = "{#input na|me=\"name\"}"; + testDefinitionFor(template, "test.html", // + ll(inputUri, r(0, 8, 0, 12), r(0, 14, 0, 18))); + } + + @Test + public void inputNoDef() throws Exception { + String template = "{#input na|me2=\"name\"}"; + testDefinitionFor(template); + } + + private static String getUserTagUri(String name) { + return Paths.get("src/test/resources/templates/tags/" + name + ".html").toUri().toString(); + } }