Search in sources :

Example 1 with Parts

use of com.redhat.qute.parser.expression.Parts in project quarkus-ls by redhat-developer.

the class QuteCompletions method doComplete.

/**
 * Returns completion list for the given position
 *
 * @param template           the Qute template
 * @param position           the position where completion was triggered
 * @param completionSettings the completion settings.
 * @param formattingSettings the formatting settings.
 * @param cancelChecker      the cancel checker
 * @return completion list for the given position
 */
public CompletableFuture<CompletionList> doComplete(Template template, Position position, QuteCompletionSettings completionSettings, QuteFormattingSettings formattingSettings, CancelChecker cancelChecker) {
    CompletionRequest completionRequest = null;
    try {
        completionRequest = new CompletionRequest(template, position, completionSettings, formattingSettings);
    } catch (BadLocationException e) {
        LOGGER.log(Level.SEVERE, "Creation of CompletionRequest failed", e);
        return EMPTY_FUTURE_COMPLETION;
    }
    Node node = completionRequest.getNode();
    if (node == null) {
        return EMPTY_FUTURE_COMPLETION;
    }
    String text = template.getText();
    int offset = completionRequest.getOffset();
    if (node.getKind() == NodeKind.Expression || node.getKind() == NodeKind.ExpressionParts || node.getKind() == NodeKind.ExpressionPart) {
        Expression expression = null;
        Node nodeExpression = null;
        if (node.getKind() == NodeKind.Expression) {
            expression = (Expression) node;
        } else if (node.getKind() == NodeKind.ExpressionParts) {
            nodeExpression = node;
            expression = ((Parts) node).getParent();
        } else if (node.getKind() == NodeKind.ExpressionPart) {
            nodeExpression = node;
            expression = ((Part) node).getParent().getParent();
        }
        return completionForExpression.doCompleteExpression(completionRequest, expression, nodeExpression, template, offset, completionSettings, formattingSettings, cancelChecker);
    } else if (node.getKind() == NodeKind.Text) {
        // The completion is triggered in text node (before node)
        Section parent = node.getParentSection();
        if (parent != null && (parent.isInEndTagName(offset))) {
            // The completion is triggered inside end tag
            return EMPTY_FUTURE_COMPLETION;
        }
        // The completion is triggered in text node
        // Check if completion is triggered after a start bracket character and if it's
        // a valid expression
        int nbBrackets = 0;
        int bracketOffset = offset - 1;
        char previousChar = text.charAt(bracketOffset);
        if (previousChar == '#') {
            // {#
            bracketOffset--;
        }
        while (bracketOffset >= 0 && text.charAt(bracketOffset) == '{') {
            bracketOffset--;
            nbBrackets++;
        }
        if (nbBrackets > 0) {
            if (nbBrackets % 2 != 0) {
                // The completion is triggered in text node after bracket '{' character
                return completionForExpression.doCompleteExpression(completionRequest, null, node, template, offset, completionSettings, formattingSettings, cancelChecker);
            }
            return EMPTY_FUTURE_COMPLETION;
        }
    } else if (node.getKind() == NodeKind.ParameterDeclaration) {
        return completionsForParameterDeclaration.doCollectJavaClassesSuggestions((ParameterDeclaration) node, template, offset, completionSettings);
    } else if (node.getKind() == NodeKind.Section) {
        // {#|}
        return completionForTagSection.doCompleteTagSection(completionRequest, completionSettings, formattingSettings, cancelChecker);
    }
    return collectSnippetSuggestions(completionRequest);
}
Also used : Expression(com.redhat.qute.parser.template.Expression) QuteCompletionsForExpression(com.redhat.qute.services.completions.QuteCompletionsForExpression) Parts(com.redhat.qute.parser.expression.Parts) Part(com.redhat.qute.parser.expression.Part) Node(com.redhat.qute.parser.template.Node) CompletionRequest(com.redhat.qute.services.completions.CompletionRequest) QuteCompletionForTagSection(com.redhat.qute.services.completions.QuteCompletionForTagSection) Section(com.redhat.qute.parser.template.Section) BadLocationException(com.redhat.qute.ls.commons.BadLocationException)

Example 2 with Parts

use of com.redhat.qute.parser.expression.Parts in project quarkus-ls by redhat-developer.

the class QuteDiagnostics method validateExpression.

private ResolvedJavaTypeInfo validateExpression(Expression expression, Section ownerSection, Template template, QuteValidationSettings validationSettings, ResolutionContext resolutionContext, ResolvingJavaTypeContext resolvingJavaTypeContext, List<Diagnostic> diagnostics) {
    try {
        String projectUri = template.getProjectUri();
        String literalJavaType = expression.getLiteralJavaType();
        if (literalJavaType != null) {
            // The expression is a literal:
            // - {'abcd'} : string literal
            // - {true} : boolean literal
            // - {null} : null literal
            // - {123} : integer literal
            ResolvedJavaTypeInfo resolvedLiteralType = javaCache.resolveJavaType(literalJavaType, projectUri).getNow(null);
            if (resolvedLiteralType == null) {
                return null;
            }
            return validateIterable(expression.getLastPart(), ownerSection, resolvedLiteralType, resolvedLiteralType.getName(), diagnostics);
        }
        // The expression reference Java data model (ex : {item})
        ResolvedJavaTypeInfo resolvedJavaType = null;
        List<Node> expressionChildren = expression.getExpressionContent();
        for (Node expressionChild : expressionChildren) {
            if (expressionChild.getKind() == NodeKind.ExpressionParts) {
                Parts parts = (Parts) expressionChild;
                resolvedJavaType = validateExpressionParts(parts, ownerSection, template, projectUri, validationSettings, resolutionContext, resolvingJavaTypeContext, diagnostics);
            }
        }
        return resolvedJavaType;
    } catch (CancellationException e) {
        throw e;
    } catch (Exception e) {
        LOGGER.log(Level.SEVERE, "Error while validating expression '" + expression.getContent() + "' in '" + template.getUri() + "'.", e);
        return null;
    }
}
Also used : Parts(com.redhat.qute.parser.expression.Parts) CancellationException(java.util.concurrent.CancellationException) Node(com.redhat.qute.parser.template.Node) ResolvedJavaTypeInfo(com.redhat.qute.commons.ResolvedJavaTypeInfo) CancellationException(java.util.concurrent.CancellationException)

Example 3 with Parts

use of com.redhat.qute.parser.expression.Parts in project quarkus-ls by redhat-developer.

the class QuteHover method doHoverForPropertyPart.

private CompletableFuture<Hover> doHoverForPropertyPart(Part part, String projectUri, HoverRequest hoverRequest) {
    Parts parts = part.getParent();
    Part previousPart = parts.getPreviousPart(part);
    return // 
    javaCache.resolveJavaType(previousPart, projectUri).thenCompose(resolvedJavaType -> {
        if (resolvedJavaType != null) {
            if (resolvedJavaType.isIterable() && !resolvedJavaType.isArray()) {
                // Expression uses iterable type
                // {@java.util.List<org.acme.Item items>
                // {items.si|ze()}
                // Property, method to find as hover must be done for iterable type (ex :
                // java.util.List>
                String iterableType = resolvedJavaType.getIterableType();
                CompletableFuture<ResolvedJavaTypeInfo> iterableResolvedTypeFuture = javaCache.resolveJavaType(iterableType, projectUri);
                return iterableResolvedTypeFuture.thenApply((iterableResolvedType) -> {
                    return doHoverForPropertyPart(part, projectUri, iterableResolvedType, resolvedJavaType, hoverRequest);
                });
            }
            Hover hover = doHoverForPropertyPart(part, projectUri, resolvedJavaType, null, hoverRequest);
            return CompletableFuture.completedFuture(hover);
        }
        return NO_HOVER;
    });
}
Also used : Parts(com.redhat.qute.parser.expression.Parts) NamespacePart(com.redhat.qute.parser.expression.NamespacePart) Part(com.redhat.qute.parser.expression.Part) Hover(org.eclipse.lsp4j.Hover) ResolvedJavaTypeInfo(com.redhat.qute.commons.ResolvedJavaTypeInfo)

Example 4 with Parts

use of com.redhat.qute.parser.expression.Parts in project quarkus-ls by redhat-developer.

the class JavaDataModelCache method resolveJavaType.

private CompletableFuture<ResolvedJavaTypeInfo> resolveJavaType(Parts parts, int partIndex, String projectUri, boolean nullIfDontMatchWithIterable) {
    CompletableFuture<ResolvedJavaTypeInfo> future = null;
    for (int i = 0; i < partIndex + 1; i++) {
        Part current = ((Part) parts.getChild(i));
        switch(current.getPartKind()) {
            case Object:
                ObjectPart objectPart = (ObjectPart) current;
                future = resolveJavaType(objectPart, projectUri, nullIfDontMatchWithIterable);
                break;
            case Property:
            case Method:
                if (future != null) {
                    future = // 
                    future.thenCompose(resolvedType -> {
                        if (resolvedType == null) {
                            return RESOLVED_JAVA_TYPE_INFO_NULL_FUTURE;
                        }
                        return resolveJavaType(current, projectUri, resolvedType);
                    });
                }
                break;
            default:
        }
    }
    return future != null ? future : RESOLVED_JAVA_TYPE_INFO_NULL_FUTURE;
}
Also used : Template(com.redhat.qute.parser.template.Template) ValueResolver(com.redhat.qute.project.datamodel.resolvers.ValueResolver) MethodValueResolver(com.redhat.qute.project.datamodel.resolvers.MethodValueResolver) ObjectPart(com.redhat.qute.parser.expression.ObjectPart) StringUtils(com.redhat.qute.utils.StringUtils) CompletableFuture(java.util.concurrent.CompletableFuture) QuteJavaTypesParams(com.redhat.qute.commons.QuteJavaTypesParams) NodeKind(com.redhat.qute.parser.template.NodeKind) Parameter(com.redhat.qute.parser.template.Parameter) QuteProjectRegistry(com.redhat.qute.project.QuteProjectRegistry) Expression(com.redhat.qute.parser.template.Expression) Section(com.redhat.qute.parser.template.Section) Location(org.eclipse.lsp4j.Location) Parts(com.redhat.qute.parser.expression.Parts) JavaMemberInfo(com.redhat.qute.commons.JavaMemberInfo) InvalidMethodReason(com.redhat.qute.commons.InvalidMethodReason) NamespaceResolverInfo(com.redhat.qute.commons.datamodel.resolvers.NamespaceResolverInfo) Node(com.redhat.qute.parser.template.Node) JavaTypeInfo(com.redhat.qute.commons.JavaTypeInfo) JavaMemberResult(com.redhat.qute.project.JavaMemberResult) JavaTypeInfoProvider(com.redhat.qute.parser.template.JavaTypeInfoProvider) List(java.util.List) CompletionStage(java.util.concurrent.CompletionStage) Part(com.redhat.qute.parser.expression.Part) ResolvedJavaTypeInfo(com.redhat.qute.commons.ResolvedJavaTypeInfo) JavaElementInfo(com.redhat.qute.commons.JavaElementInfo) QuteJavaDefinitionParams(com.redhat.qute.commons.QuteJavaDefinitionParams) ObjectPart(com.redhat.qute.parser.expression.ObjectPart) ObjectPart(com.redhat.qute.parser.expression.ObjectPart) Part(com.redhat.qute.parser.expression.Part) ResolvedJavaTypeInfo(com.redhat.qute.commons.ResolvedJavaTypeInfo)

Example 5 with Parts

use of com.redhat.qute.parser.expression.Parts in project quarkus-ls by redhat-developer.

the class Expression method getLastPart.

/**
 * Returns the last part of the expression and null otherwise.
 *
 * @return the last part of the expression and null otherwise.
 */
public Part getLastPart() {
    List<Node> nodes = getExpressionContent();
    if (nodes.isEmpty()) {
        return null;
    }
    Parts parts = (Parts) nodes.get(0);
    return (Part) parts.getLastChild();
}
Also used : Parts(com.redhat.qute.parser.expression.Parts) Part(com.redhat.qute.parser.expression.Part) ObjectPart(com.redhat.qute.parser.expression.ObjectPart) NamespacePart(com.redhat.qute.parser.expression.NamespacePart)

Aggregations

Parts (com.redhat.qute.parser.expression.Parts)10 Part (com.redhat.qute.parser.expression.Part)6 ResolvedJavaTypeInfo (com.redhat.qute.commons.ResolvedJavaTypeInfo)4 NamespacePart (com.redhat.qute.parser.expression.NamespacePart)4 ObjectPart (com.redhat.qute.parser.expression.ObjectPart)4 Node (com.redhat.qute.parser.template.Node)4 Expression (com.redhat.qute.parser.template.Expression)3 MethodPart (com.redhat.qute.parser.expression.MethodPart)2 Parameter (com.redhat.qute.parser.template.Parameter)2 Section (com.redhat.qute.parser.template.Section)2 List (java.util.List)2 InvalidMethodReason (com.redhat.qute.commons.InvalidMethodReason)1 JavaElementInfo (com.redhat.qute.commons.JavaElementInfo)1 JavaMemberInfo (com.redhat.qute.commons.JavaMemberInfo)1 JavaTypeInfo (com.redhat.qute.commons.JavaTypeInfo)1 QuteJavaDefinitionParams (com.redhat.qute.commons.QuteJavaDefinitionParams)1 QuteJavaTypesParams (com.redhat.qute.commons.QuteJavaTypesParams)1 NamespaceResolverInfo (com.redhat.qute.commons.datamodel.resolvers.NamespaceResolverInfo)1 BadLocationException (com.redhat.qute.ls.commons.BadLocationException)1 PropertyPart (com.redhat.qute.parser.expression.PropertyPart)1