diff --git a/qute.ls/com.redhat.qute.ls/src/main/java/com/redhat/qute/project/extensions/roq/data/RoqDataFile.java b/qute.ls/com.redhat.qute.ls/src/main/java/com/redhat/qute/project/extensions/roq/data/RoqDataFile.java index 5c7b83660..8947061ae 100644 --- a/qute.ls/com.redhat.qute.ls/src/main/java/com/redhat/qute/project/extensions/roq/data/RoqDataFile.java +++ b/qute.ls/com.redhat.qute.ls/src/main/java/com/redhat/qute/project/extensions/roq/data/RoqDataFile.java @@ -31,6 +31,7 @@ import com.redhat.qute.services.hover.HoverRequest; import com.redhat.qute.utils.DocumentationUtils; import com.redhat.qute.utils.QutePositionUtility; +import static com.redhat.qute.project.extensions.roq.JsonVertxConstants.IO_VERTX_CORE_JSON_JSON_OBJECT_CLASS; /** * Represents a Roq data file (YAML, JSON, etc.) as a top-level value resolver @@ -157,6 +158,11 @@ public RoqDataFile(Path filePath, String namespace, DataLoader dataLoader) { dataLoader.load(this); } } + + @Override + public String getSignature() { + return getJavaElementType(); + } /** * Creates a clone of this data file with a different namespace. @@ -181,7 +187,6 @@ public RoqDataFile create(String namespace) { // Copy the fields from this instance resolver.setFields(getFields()); - resolver.setSignature("name : Object"); return resolver; } @@ -201,19 +206,9 @@ public String getName() { return name; } - /** - * Returns the Java element type for this resolver. - * - *

- * Data files don't have a specific Java type (they're dynamic), so this returns - * null. The actual types are in the individual fields. - *

- * - * @return null - no specific Java type - */ @Override public String getJavaElementType() { - return null; + return IO_VERTX_CORE_JSON_JSON_OBJECT_CLASS; } /** diff --git a/qute.ls/com.redhat.qute.ls/src/main/resources/com/redhat/qute/project/datamodel/resolvers/qute-resolvers.jsonc b/qute.ls/com.redhat.qute.ls/src/main/resources/com/redhat/qute/project/datamodel/resolvers/qute-resolvers.jsonc index 90046a50f..473ae1c37 100644 --- a/qute.ls/com.redhat.qute.ls/src/main/resources/com/redhat/qute/project/datamodel/resolvers/qute-resolvers.jsonc +++ b/qute.ls/com.redhat.qute.ls/src/main/resources/com/redhat/qute/project/datamodel/resolvers/qute-resolvers.jsonc @@ -204,6 +204,27 @@ }, // ------------- Vert.x Integration -------------- // See https://quarkus.io/guides/qute-reference#vertx_integration + // https://github.com/quarkusio/quarkus/blob/main/extensions/qute/runtime/src/main/java/io/quarkus/qute/runtime/jsonobject/JsonObjectValueResolver.java + { + "signature": "fieldNames(base : io.vertx.core.json.JsonObject) : java.util.Set", + "url": "https://quarkus.io/guides/qute-reference#vertx_integration" + }, + { + "signature": "fields(base : io.vertx.core.json.JsonObject) : java.util.Set", + "url": "https://quarkus.io/guides/qute-reference#vertx_integration" + }, + { + "signature": "size(base : io.vertx.core.json.JsonObject) : int", + "url": "https://quarkus.io/guides/qute-reference#vertx_integration" + }, + { + "signature": "empty(base : io.vertx.core.json.JsonObject) : boolean", + "url": "https://quarkus.io/guides/qute-reference#vertx_integration" + }, + { + "signature": "isEmpty(base : io.vertx.core.json.JsonObject) : boolean", + "url": "https://quarkus.io/guides/qute-reference#vertx_integration" + }, { "signature": "get(base : io.vertx.core.json.JsonObject, key : java.lang.String) : java.lang.Object", "matchNames": [ @@ -214,6 +235,10 @@ { "signature": "get(base : io.vertx.core.json.JsonObject, key : java.lang.String) : java.lang.Object", "url": "https://quarkus.io/guides/qute-reference#vertx_integration" + }, + { + "signature": "containsKey(base : io.vertx.core.json.JsonObject) : boolean", + "url": "https://quarkus.io/guides/qute-reference#vertx_integration" } ] } \ No newline at end of file diff --git a/qute.ls/com.redhat.qute.ls/src/test/java/com/redhat/qute/services/diagnostics/roq/RoqDataJsonDiagnosticsTest.java b/qute.ls/com.redhat.qute.ls/src/test/java/com/redhat/qute/services/diagnostics/roq/RoqDataJsonDiagnosticsTest.java index 159d19875..e69c818d3 100644 --- a/qute.ls/com.redhat.qute.ls/src/test/java/com/redhat/qute/services/diagnostics/roq/RoqDataJsonDiagnosticsTest.java +++ b/qute.ls/com.redhat.qute.ls/src/test/java/com/redhat/qute/services/diagnostics/roq/RoqDataJsonDiagnosticsTest.java @@ -44,6 +44,23 @@ public void validInjectDataFile() throws Exception { testDiagnosticsFor(template); } + @Test + public void validInjectDataFileWithJsonObjectValueResolver() throws Exception { + // https://github.com/quarkusio/quarkus/blob/main/extensions/qute/runtime/src/main/java/io/quarkus/qute/runtime/jsonobject/JsonObjectValueResolver.java + + // data/books.yaml + String template = "{inject:books-json.get('foo')}"; + testDiagnosticsFor(template); + template = "{inject:books-json.list}"; + testDiagnosticsFor(template); + + // data/sandwiches.yaml + template = "{inject:sandwiches}"; + testDiagnosticsFor(template); + template = "{inject:sandwiches.sandwiches}"; + testDiagnosticsFor(template); + } + @Test public void invalidInjectDataFile() throws Exception { String template = "{inject:books-jsonXXX}"; @@ -51,10 +68,7 @@ public void invalidInjectDataFile() throws Exception { d(0, 8, 0, 21, QuteErrorCode.UndefinedObject, "`books-jsonXXX` cannot be resolved to an object.", // "qute", DiagnosticSeverity.Warning)); template = "{inject:books-json.listXXX}"; - testDiagnosticsFor(template, // - d(0, 19, 0, 26, QuteErrorCode.UnknownProperty, - "`listXXX` cannot be resolved or is not a field of `null` Java type.", // - "qute", DiagnosticSeverity.Error)); + testDiagnosticsFor(template); } @Test @@ -81,7 +95,8 @@ public void nestedFields() throws Exception { @Test public void invalidInjectDataFileInForSection() throws Exception { // With JsonObject signature, any property is valid via get() value resolver - // So b.titleXXX doesn't generate an error - it resolves to JsonObject.get("titleXXX") + // So b.titleXXX doesn't generate an error - it resolves to + // JsonObject.get("titleXXX") String template = "{#for b in inject:books-json.list}\r\n" + // " {b.titleXXX}\r\n" + // "{/for}"; @@ -92,7 +107,5 @@ private static void testDiagnosticsFor(String value, Diagnostic... expected) { QuteAssert.testDiagnosticsFor(value, QuteAssert.FILE_URI, null, RoqProject.PROJECT_URI, QuteAssert.TEMPLATE_BASE_DIR, false, null, expected); } - - } diff --git a/qute.ls/com.redhat.qute.ls/src/test/java/com/redhat/qute/services/diagnostics/roq/RoqDataYamlDiagnosticsTest.java b/qute.ls/com.redhat.qute.ls/src/test/java/com/redhat/qute/services/diagnostics/roq/RoqDataYamlDiagnosticsTest.java index facc9c010..92e4c0ff5 100644 --- a/qute.ls/com.redhat.qute.ls/src/test/java/com/redhat/qute/services/diagnostics/roq/RoqDataYamlDiagnosticsTest.java +++ b/qute.ls/com.redhat.qute.ls/src/test/java/com/redhat/qute/services/diagnostics/roq/RoqDataYamlDiagnosticsTest.java @@ -51,10 +51,7 @@ public void invalidInjectDataFile() throws Exception { d(0, 8, 0, 16, QuteErrorCode.UndefinedObject, "`booksXXX` cannot be resolved to an object.", // "qute", DiagnosticSeverity.Warning)); template = "{inject:books.listXXX}"; - testDiagnosticsFor(template, // - d(0, 14, 0, 21, QuteErrorCode.UnknownProperty, - "`listXXX` cannot be resolved or is not a field of `null` Java type.", // - "qute", DiagnosticSeverity.Error)); + testDiagnosticsFor(template); } @Test diff --git a/qute.ls/com.redhat.qute.ls/src/test/java/com/redhat/qute/services/hover/roq/RoqDataJsonHoverTest.java b/qute.ls/com.redhat.qute.ls/src/test/java/com/redhat/qute/services/hover/roq/RoqDataJsonHoverTest.java index 8d525db83..96c8dd092 100644 --- a/qute.ls/com.redhat.qute.ls/src/test/java/com/redhat/qute/services/hover/roq/RoqDataJsonHoverTest.java +++ b/qute.ls/com.redhat.qute.ls/src/test/java/com/redhat/qute/services/hover/roq/RoqDataJsonHoverTest.java @@ -40,7 +40,12 @@ public void books() throws Exception { @Test public void books_invalid() throws Exception { String template = "{inject:books-json.li|s}"; - assertHover(template, null, null); + assertHover(template, // + "```java" + System.lineSeparator() + // + "Object get()" + System.lineSeparator() + // + "```" + System.lineSeparator() + // + "See [here](https://quarkus.io/guides/qute-reference#vertx_integration) for more informations.", // + r(0, 19, 0, 22)); } @Test diff --git a/qute.ls/com.redhat.qute.ls/src/test/java/com/redhat/qute/services/hover/roq/RoqDataYamlHoverTest.java b/qute.ls/com.redhat.qute.ls/src/test/java/com/redhat/qute/services/hover/roq/RoqDataYamlHoverTest.java index 5c279bc56..9ce454399 100644 --- a/qute.ls/com.redhat.qute.ls/src/test/java/com/redhat/qute/services/hover/roq/RoqDataYamlHoverTest.java +++ b/qute.ls/com.redhat.qute.ls/src/test/java/com/redhat/qute/services/hover/roq/RoqDataYamlHoverTest.java @@ -40,7 +40,12 @@ public void books() throws Exception { @Test public void books_invalid() throws Exception { String template = "{inject:books.li|s}"; - assertHover(template, null, null); + assertHover(template, // + "```java" + System.lineSeparator() + // + "Object get()" + System.lineSeparator() + // + "```" + System.lineSeparator() + // + "See [here](https://quarkus.io/guides/qute-reference#vertx_integration) for more informations.", // + r(0, 14, 0, 17)); } @Test