Search in sources :

Example 6 with ObjectPart

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

the class QuteDiagnostics method validateExpressionParts.

private ResolvedJavaTypeInfo validateExpressionParts(Parts parts, Section ownerSection, Template template, String projectUri, QuteValidationSettings validationSettings, ResolutionContext resolutionContext, ResolvingJavaTypeContext resolvingJavaTypeContext, List<Diagnostic> diagnostics) {
    ResolvedJavaTypeInfo resolvedJavaType = null;
    String namespace = null;
    for (int i = 0; i < parts.getChildCount(); i++) {
        Part current = parts.getChild(i);
        if (current.isLast()) {
            // It's the last part, check if it is not ended with '.'
            int end = current.getEnd();
            String text = template.getText();
            if (end < text.length()) {
                char c = text.charAt(end);
                if (c == '.') {
                    Range range = QutePositionUtility.createRange(end, end + 1, template);
                    Diagnostic diagnostic = createDiagnostic(range, DiagnosticSeverity.Error, QuteErrorCode.SyntaxError, "Unexpected '.' token.");
                    diagnostics.add(diagnostic);
                }
            }
        }
        switch(current.getPartKind()) {
            case Namespace:
                {
                    NamespacePart namespacePart = (NamespacePart) current;
                    namespace = validateNamespace(namespacePart, projectUri, validationSettings, resolvingJavaTypeContext, diagnostics);
                    if (namespace == null) {
                        // Invalid namespace
                        return null;
                    }
                    break;
                }
            case Object:
                {
                    ObjectPart objectPart = (ObjectPart) current;
                    resolvedJavaType = validateObjectPart(namespace, objectPart, ownerSection, template, projectUri, validationSettings, resolutionContext, diagnostics, resolvingJavaTypeContext);
                    if (resolvedJavaType == null) {
                        // property, method.
                        return null;
                    }
                    break;
                }
            case Method:
            case Property:
                {
                    // java.util.List<org.acme.Item>
                    ResolvedJavaTypeInfo iter = resolvedJavaType;
                    if (resolvedJavaType != null && resolvedJavaType.isIterable() && !resolvedJavaType.isArray()) {
                        // Expression uses iterable type
                        // {@java.util.List<org.acme.Item items>
                        // {items.size()}
                        // Property, method to validate must be done for iterable type (ex :
                        // java.util.List
                        String iterableType = resolvedJavaType.getIterableType();
                        resolvedJavaType = resolveJavaType(iterableType, projectUri, resolvingJavaTypeContext);
                        if (resolvedJavaType == null || isResolvingJavaType(resolvedJavaType)) {
                            // The java type doesn't exists or it is resolving, stop the validation
                            return null;
                        }
                    }
                    resolvedJavaType = validateMemberPart(current, ownerSection, template, projectUri, validationSettings, resolutionContext, resolvedJavaType, iter, diagnostics, resolvingJavaTypeContext);
                    if (resolvedJavaType == null) {
                        // followings property, method.
                        return null;
                    }
                    break;
                }
        }
    }
    return resolvedJavaType;
}
Also used : ObjectPart(com.redhat.qute.parser.expression.ObjectPart) MethodPart(com.redhat.qute.parser.expression.MethodPart) Part(com.redhat.qute.parser.expression.Part) PropertyPart(com.redhat.qute.parser.expression.PropertyPart) ObjectPart(com.redhat.qute.parser.expression.ObjectPart) NamespacePart(com.redhat.qute.parser.expression.NamespacePart) NamespacePart(com.redhat.qute.parser.expression.NamespacePart) ResolvedJavaTypeInfo(com.redhat.qute.commons.ResolvedJavaTypeInfo) DiagnosticDataFactory.createDiagnostic(com.redhat.qute.services.diagnostics.DiagnosticDataFactory.createDiagnostic) Diagnostic(org.eclipse.lsp4j.Diagnostic) Range(org.eclipse.lsp4j.Range)

Example 7 with ObjectPart

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

the class QuteHighlighting method findDocumentHighlights.

public List<DocumentHighlight> findDocumentHighlights(Template template, Position position, CancelChecker cancelChecker) {
    try {
        List<DocumentHighlight> highlights = new ArrayList<>();
        int offset = template.offsetAt(position);
        Node node = template.findNodeAt(offset);
        if (node == null) {
            return Collections.emptyList();
        }
        node = QutePositionUtility.findBestNode(offset, node);
        switch(node.getKind()) {
            case ParameterDeclaration:
            case Parameter:
                highlightReferenceObjectPart(node, offset, highlights, cancelChecker);
                break;
            case ExpressionPart:
                Part part = (Part) node;
                if (part.getPartKind() == PartKind.Object) {
                    highlightDeclaredObject((ObjectPart) part, highlights, cancelChecker);
                }
                break;
            case Section:
                higlightSection((Section) node, offset, position, highlights, cancelChecker);
                break;
            default:
        }
        return highlights;
    } catch (BadLocationException e) {
        LOGGER.log(Level.SEVERE, "In QuteHighlighting the client provided Position is at a BadLocation", e);
        return Collections.emptyList();
    }
}
Also used : DocumentHighlight(org.eclipse.lsp4j.DocumentHighlight) ObjectPart(com.redhat.qute.parser.expression.ObjectPart) Part(com.redhat.qute.parser.expression.Part) Node(com.redhat.qute.parser.template.Node) ArrayList(java.util.ArrayList) BadLocationException(com.redhat.qute.ls.commons.BadLocationException)

Example 8 with ObjectPart

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

the class UserTagUtils method collectUserTagParameters.

private static void collectUserTagParameters(Expression expression, Set<String> extistingObjectParts, Consumer<ObjectPart> collector, CancelChecker cancelChecker) {
    ObjectPart objectPart = expression.getObjectPart();
    if (objectPart != null && expression.getNamespacePart() == null) {
        String partName = objectPart.getPartName();
        if (!extistingObjectParts.contains(partName)) {
            extistingObjectParts.add(partName);
            collector.accept(objectPart);
        }
    }
}
Also used : ObjectPart(com.redhat.qute.parser.expression.ObjectPart)

Example 9 with ObjectPart

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

the class QuteSearchUtils method tryToCollectObjectPartOrParameter.

public static void tryToCollectObjectPartOrParameter(String partName, PartNameMatcher matcher, Expression expression, Node ownerNode, BiConsumer<Node, Range> collector) {
    // object part)
    if (!tryToCollectObjectParts(partName, matcher, expression, collector)) {
        if (ownerNode.getKind() == NodeKind.Section) {
            Section onwerSection = (Section) ownerNode;
            // Check the current expression references a metadata of the section
            ObjectPart objectPart = expression.getObjectPart();
            if (objectPart != null) {
                JavaTypeInfoProvider metadata = onwerSection.getMetadata(objectPart.getPartName());
                if (metadata != null) {
                    // Adjust the object part range with the given part name
                    // Example if expression is like {item_count}
                    // Range should be {|item|_count}
                    Range range = QutePositionUtility.createRange(objectPart.getStart(), objectPart.getStart() + partName.length(), objectPart.getOwnerTemplate());
                    collector.accept(objectPart, range);
                }
            }
        }
    }
}
Also used : JavaTypeInfoProvider(com.redhat.qute.parser.template.JavaTypeInfoProvider) ObjectPart(com.redhat.qute.parser.expression.ObjectPart) Range(org.eclipse.lsp4j.Range) LoopSection(com.redhat.qute.parser.template.sections.LoopSection) BaseWhenSection(com.redhat.qute.parser.template.sections.BaseWhenSection) WithSection(com.redhat.qute.parser.template.sections.WithSection) Section(com.redhat.qute.parser.template.Section)

Aggregations

ObjectPart (com.redhat.qute.parser.expression.ObjectPart)9 Part (com.redhat.qute.parser.expression.Part)6 Expression (com.redhat.qute.parser.template.Expression)5 Node (com.redhat.qute.parser.template.Node)5 ResolvedJavaTypeInfo (com.redhat.qute.commons.ResolvedJavaTypeInfo)4 JavaTypeInfoProvider (com.redhat.qute.parser.template.JavaTypeInfoProvider)4 Range (org.eclipse.lsp4j.Range)4 JavaMemberInfo (com.redhat.qute.commons.JavaMemberInfo)3 MethodPart (com.redhat.qute.parser.expression.MethodPart)3 NamespacePart (com.redhat.qute.parser.expression.NamespacePart)3 Parts (com.redhat.qute.parser.expression.Parts)3 Parameter (com.redhat.qute.parser.template.Parameter)3 Section (com.redhat.qute.parser.template.Section)3 List (java.util.List)3 InvalidMethodReason (com.redhat.qute.commons.InvalidMethodReason)2 JavaElementInfo (com.redhat.qute.commons.JavaElementInfo)2 JavaTypeInfo (com.redhat.qute.commons.JavaTypeInfo)2 QuteJavaDefinitionParams (com.redhat.qute.commons.QuteJavaDefinitionParams)2 QuteJavaTypesParams (com.redhat.qute.commons.QuteJavaTypesParams)2 NamespaceResolverInfo (com.redhat.qute.commons.datamodel.resolvers.NamespaceResolverInfo)2