public static Hover getHover(EventPositionContext context) {
        Node node = CSTUtils.getSymbolAtPosition(context.document.getRootNode(), context.position);
        
        if (node != null && node.isSchemaNode()) {
            SchemaNode schemaNode = node.getSchemaNode();
            Hover symbolHover = getSymbolHover(schemaNode, context);

            if (schemaNode.getLanguageType() == LanguageType.RANK_EXPRESSION) {
                var content = symbolHover.getContents();
                if (content.isRight()) {
                    MarkupContent markupContent = content.getRight();
                    if (markupContent.getValue() == "builtin") {

                        Optional<Hover> builtinHover = rankFeatureHover(schemaNode, context);
                        if (builtinHover.isPresent()) {
                            return builtinHover.get();
                        }
                    }
                }
            }

            return symbolHover;
        }

        node = CSTUtils.getLeafNodeAtPosition(context.document.getRootNode(), context.position);
        if (node == null || !node.isSchemaNode()) return null;
        SchemaNode schemaNode = node.getSchemaNode();

        if (schemaNode.getLanguageType() == LanguageType.INDEXING) {
            return getIndexingHover(schemaNode, context);
        }

        Optional<Hover> hoverInfo = getFileHoverInformation("schema", schemaNode.getClassLeafIdentifierString(), schemaNode.getRange());
        if (hoverInfo.isEmpty()) {
            return null;
        }
        return hoverInfo.get();
    }
Public interface to be used by {@link SchemaCompletion}
@param function
@return Hover with empty range
integration/schema-language-server/language-server/src/main/java/ai/vespa/schemals/lsp/schema/hover/SchemaHover.java