From 15bc532254e5e56dacbfa6736a72781de290736c Mon Sep 17 00:00:00 2001 From: azerr Date: Tue, 9 Jul 2024 19:57:40 +0200 Subject: [PATCH] fix: Qute highlight errors due to formatting Fixes #966 Signed-off-by: azerr --- .../redhat/qute/services/QuteDiagnostics.java | 49 +++++++++-------- .../qute/project/QuteQuickStartProject.java | 2 + ...ctionsBracketIntegerValueResolverTest.java | 3 +- .../CollectionsIntegerValueResolverTest.java | 3 +- ...nosticsInExpressionWithForSectionTest.java | 55 +++++++++++++++++-- 5 files changed, 84 insertions(+), 28 deletions(-) diff --git a/qute.ls/com.redhat.qute.ls/src/main/java/com/redhat/qute/services/QuteDiagnostics.java b/qute.ls/com.redhat.qute.ls/src/main/java/com/redhat/qute/services/QuteDiagnostics.java index 678a71ddf..681bd85df 100644 --- a/qute.ls/com.redhat.qute.ls/src/main/java/com/redhat/qute/services/QuteDiagnostics.java +++ b/qute.ls/com.redhat.qute.ls/src/main/java/com/redhat/qute/services/QuteDiagnostics.java @@ -52,6 +52,7 @@ import com.redhat.qute.parser.expression.PropertyPart; import com.redhat.qute.parser.template.CaseOperator; import com.redhat.qute.parser.template.Expression; +import com.redhat.qute.parser.template.ExpressionParameter; import com.redhat.qute.parser.template.JavaTypeInfoProvider; import com.redhat.qute.parser.template.LiteralSupport; import com.redhat.qute.parser.template.Node; @@ -232,7 +233,8 @@ private void validateDataModel(Node parent, Template template, QuteValidationSet // validate expression parameters boolean checkValidOperator = section.getSectionKind() == SectionKind.IF; boolean shouldBeAnOperator = false; - for (Parameter parameter : parameters) { + for (int i = 0; i < parameters.size(); i++) { + Parameter parameter = parameters.get(i); if (shouldBeAnOperator) { // #if section, the current parameter name must be an operator String operatorName = parameter.getName(); @@ -256,6 +258,11 @@ private void validateDataModel(Node parent, Template template, QuteValidationSet switch (section.getSectionKind()) { case FOR: case EACH: + Part lastPart = expression.getLastPart(); + if (result != null) { + result = validateIterable(lastPart, section, result, result.getSignature(), + diagnostics); + } String alias = ((LoopSection) section).getAlias(); currentContext.put(alias, result); break; @@ -461,10 +468,11 @@ private static boolean canChangeContext(Section section) { * Validate #include section. * * @param includeSection the include section - * @param project + * @param project * @param diagnostics the diagnostics to fill. */ - private static void validateIncludeSection(IncludeSection includeSection, QuteProject project, List diagnostics) { + private static void validateIncludeSection(IncludeSection includeSection, QuteProject project, + List diagnostics) { Parameter templateParameter = includeSection.getTemplateParameter(); if (templateParameter != null) { // Validate template id, only if project exists. @@ -563,8 +571,7 @@ private ResolvedJavaTypeInfo validateExpression(Expression expression, Section o if (QuteCompletableFutures.isResolvingJavaTypeOrNull(resolvedLiteralType)) { return null; } - return validateIterable(expression.getLastPart(), ownerSection, resolvedLiteralType, - resolvedLiteralType.getName(), diagnostics); + return resolvedLiteralType; } // The expression reference Java data model (ex : {item}) ResolvedJavaTypeInfo resolvedJavaType = null; @@ -911,7 +918,7 @@ private ResolvedJavaTypeInfo validatePropertyPart(PropertyPart part, Section own } } } - + if (javaMember.getJavaElementKind() == JavaElementKind.METHOD && ((JavaMethodInfo) javaMember).isVoidMethod()) { return null; } @@ -1232,26 +1239,24 @@ private ResolvedJavaTypeInfo validateJavaTypePart(Part part, Section ownerSectio return null; } - return validateIterable(part, ownerSection, resolvedJavaType, javaTypeToResolve, diagnostics); + return resolvedJavaType; } private ResolvedJavaTypeInfo validateIterable(Part part, Section ownerSection, ResolvedJavaTypeInfo resolvedJavaType, String javaTypeToResolve, List diagnostics) { - if (part != null && part.isLast() && ownerSection != null && ownerSection.isIterable()) { - // The expression is declared inside an iterable section like #for, #each. - // Ex: {#for item in items} - if (!resolvedJavaType.isIterable() && !resolvedJavaType.isInteger()) { - // The Java class is not an iterable class like - // - java.util.List - // - object array - // - integer - String expression = part.getParent().getContent(); - Range range = QutePositionUtility.createRange(part); - Diagnostic diagnostic = createDiagnostic(range, DiagnosticSeverity.Error, QuteErrorCode.IterationError, - expression, javaTypeToResolve); - diagnostics.add(diagnostic); - return null; - } + // The expression is declared inside an iterable section like #for, #each. + // Ex: {#for item in items} + if (!resolvedJavaType.isIterable() && !resolvedJavaType.isInteger()) { + // The Java class is not an iterable class like + // - java.util.List + // - object array + // - integer + String expression = part.getParent().getContent(); + Range range = QutePositionUtility.createRange(part); + Diagnostic diagnostic = createDiagnostic(range, DiagnosticSeverity.Error, QuteErrorCode.IterationError, + expression, javaTypeToResolve); + diagnostics.add(diagnostic); + return null; } return resolvedJavaType; } diff --git a/qute.ls/com.redhat.qute.ls/src/test/java/com/redhat/qute/project/QuteQuickStartProject.java b/qute.ls/com.redhat.qute.ls/src/test/java/com/redhat/qute/project/QuteQuickStartProject.java index 80730a13d..c0aeede4e 100644 --- a/qute.ls/com.redhat.qute.ls/src/test/java/com/redhat/qute/project/QuteQuickStartProject.java +++ b/qute.ls/com.redhat.qute.ls/src/test/java/com/redhat/qute/project/QuteQuickStartProject.java @@ -103,6 +103,7 @@ private void createBinaryTypes(List cache) { list.setExtendedTypes(Arrays.asList("java.util.Collection")); registerMethod("size() : int", list); registerMethod("get(index : int) : E", list); + registerMethod("subList(fromIndex : int, toIndex: int) : java.util.List", list); // Set ResolvedJavaTypeInfo set = createResolvedJavaTypeInfo("java.util.Set", cache, true); @@ -113,6 +114,7 @@ private void createBinaryTypes(List cache) { registerMethod("keySet() : java.util.Set", map); registerMethod("values() : java.util.Collection", map); registerMethod("entrySet() : java.util.Set>", map); + registerMethod("get(key : K) : V", map); // Map.Entry ResolvedJavaTypeInfo mapEntry = createResolvedJavaTypeInfo("java.util.Map$Entry", cache, true); diff --git a/qute.ls/com.redhat.qute.ls/src/test/java/com/redhat/qute/resolvers/collections/CollectionsBracketIntegerValueResolverTest.java b/qute.ls/com.redhat.qute.ls/src/test/java/com/redhat/qute/resolvers/collections/CollectionsBracketIntegerValueResolverTest.java index cf4f25fff..da4b602cd 100644 --- a/qute.ls/com.redhat.qute.ls/src/test/java/com/redhat/qute/resolvers/collections/CollectionsBracketIntegerValueResolverTest.java +++ b/qute.ls/com.redhat.qute.ls/src/test/java/com/redhat/qute/resolvers/collections/CollectionsBracketIntegerValueResolverTest.java @@ -47,10 +47,11 @@ public void completion() throws Exception { // test to check @java.lang.Integer(base : T[]) : T is not returned by the // completion testCompletionFor(template, // - 11, // + 12, // c("iterator() : Iterator", "iterator", r(1, 13, 1, 13)), // c("size() : int", "size", r(1, 13, 1, 13)), // c("get(index : int) : Item", "get(${1:index})$0", r(1, 13, 1, 13)), // + c("subList(fromIndex : int, toIndex : int) : List", "subList(${1:fromIndex}, ${2:toIndex})$0", r(1, 13, 1, 13)), // c("raw(base : Object) : RawString", "raw", r(1, 13, 1, 13)), // c("safe(base : Object) : RawString", "safe", r(1, 13, 1, 13))); diff --git a/qute.ls/com.redhat.qute.ls/src/test/java/com/redhat/qute/resolvers/collections/CollectionsIntegerValueResolverTest.java b/qute.ls/com.redhat.qute.ls/src/test/java/com/redhat/qute/resolvers/collections/CollectionsIntegerValueResolverTest.java index 6e282357b..f8e73dd66 100644 --- a/qute.ls/com.redhat.qute.ls/src/test/java/com/redhat/qute/resolvers/collections/CollectionsIntegerValueResolverTest.java +++ b/qute.ls/com.redhat.qute.ls/src/test/java/com/redhat/qute/resolvers/collections/CollectionsIntegerValueResolverTest.java @@ -47,10 +47,11 @@ public void completion() throws Exception { // test to check @java.lang.Integer(base : T[]) : T is not returned by the // completion testCompletionFor(template, // - 11, // + 12, // c("iterator() : Iterator", "iterator", r(1, 13, 1, 13)), // c("size() : int", "size", r(1, 13, 1, 13)), // c("get(index : int) : Item", "get(${1:index})$0", r(1, 13, 1, 13)), // + c("subList(fromIndex : int, toIndex : int) : List", "subList(${1:fromIndex}, ${2:toIndex})$0", r(1, 13, 1, 13)), // c("raw(base : Object) : RawString", "raw", r(1, 13, 1, 13)), // c("safe(base : Object) : RawString", "safe", r(1, 13, 1, 13))); diff --git a/qute.ls/com.redhat.qute.ls/src/test/java/com/redhat/qute/services/diagnostics/QuteDiagnosticsInExpressionWithForSectionTest.java b/qute.ls/com.redhat.qute.ls/src/test/java/com/redhat/qute/services/diagnostics/QuteDiagnosticsInExpressionWithForSectionTest.java index 9a7a2f445..a1e0eb407 100644 --- a/qute.ls/com.redhat.qute.ls/src/test/java/com/redhat/qute/services/diagnostics/QuteDiagnosticsInExpressionWithForSectionTest.java +++ b/qute.ls/com.redhat.qute.ls/src/test/java/com/redhat/qute/services/diagnostics/QuteDiagnosticsInExpressionWithForSectionTest.java @@ -11,7 +11,6 @@ *******************************************************************************/ package com.redhat.qute.services.diagnostics; -import static com.redhat.qute.QuteAssert.c; import static com.redhat.qute.QuteAssert.ca; import static com.redhat.qute.QuteAssert.d; import static com.redhat.qute.QuteAssert.te; @@ -22,9 +21,6 @@ import org.eclipse.lsp4j.DiagnosticSeverity; import org.junit.jupiter.api.Test; -import com.redhat.qute.ls.commons.client.ConfigurationItemEditType; -import com.redhat.qute.services.commands.QuteClientCommandConstants; - /** * Test with #for section * @@ -252,4 +248,55 @@ public void twoManyTypeParameter() { "{/for}"; testDiagnosticsFor(template); } + + @Test + public void listFromMethodWithIntParameter() throws Exception { + String template = "{@java.util.List items}\r\n" + // + " \r\n" + // + "{#for item in items.subList(0,5)}\r\n" + // + " {item.name} \r\n" + // + "{/for}}"; + testDiagnosticsFor(template); + + template = "{@java.util.List items}\r\n" + // + " \r\n" + // + "{#for item in items.subList(0,5).subList(0,5)}\r\n" + // + " {item.name} \r\n" + // + "{/for}}"; + testDiagnosticsFor(template); + } + + @Test + public void listFromMethodWithIntParameterAndLet() throws Exception { + String template = "{@java.util.List items}\r\n" + // + "{#let index = 0 }\r\n" + // + " \r\n" + // + "{#for item in items.subList(index,index)}\r\n" + // + " {item.name} \r\n" + // + "{/for}}"; + testDiagnosticsFor(template); + } + + @Test + public void listFromMethodWithStringParameter() throws Exception { + String template = "{@java.util.Map> items}\r\n" + // + " \r\n" + // + "{#for item in items.get('foo')}\r\n" + // + " {item.name} \r\n" + // + "{/for}}"; + testDiagnosticsFor(template); + } + + + @Test + public void listFromMethodWithStringParameterAndLet() throws Exception { + String template = "{@java.util.Map> items}\r\n" + // + "{#let key = 'foo' }\r\n" + // + " \r\n" + // + "{#for item in items.get(key)}\r\n" + // + " {item.name} \r\n" + // + "{/for}}"; + testDiagnosticsFor(template); + + } }