From 12a84a13beb7d541c634e9224db8c44bd689a0f2 Mon Sep 17 00:00:00 2001 From: Steven Looman Date: Sun, 9 Jul 2023 13:38:31 +0200 Subject: [PATCH] MethodReturnMatchesDocCheck points to the actual type-doc part --- CHANGES.md | 1 + .../analysis/typing/types/TypeString.java | 2 +- .../MethodReturnMatchesDocTypedCheck.java | 59 ++++++++++++------- 3 files changed, 40 insertions(+), 22 deletions(-) diff --git a/CHANGES.md b/CHANGES.md index a7581eec..22f06ace 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -16,6 +16,7 @@ Changes - Add type hierarchy provider to magik-language-server. - Add inlay hint provider to magik-language-server. - Add code actions for @parameter and @return type-doc parts. +- MethodReturnMatchesDocCheck points to the actual type-doc part. - Various small fixes. diff --git a/magik-squid/src/main/java/nl/ramsolutions/sw/magik/analysis/typing/types/TypeString.java b/magik-squid/src/main/java/nl/ramsolutions/sw/magik/analysis/typing/types/TypeString.java index 2b72a8b5..a988c4af 100644 --- a/magik-squid/src/main/java/nl/ramsolutions/sw/magik/analysis/typing/types/TypeString.java +++ b/magik-squid/src/main/java/nl/ramsolutions/sw/magik/analysis/typing/types/TypeString.java @@ -289,7 +289,7 @@ public String toString() { return String.format( "%s@%s(%s, %s)", this.getClass().getName(), Integer.toHexString(this.hashCode()), - this.getPakkage(), this.getString()); + this.currentPackage, this.string); } } diff --git a/magik-typed-checks/src/main/java/nl/ramsolutions/sw/magik/typedchecks/checks/MethodReturnMatchesDocTypedCheck.java b/magik-typed-checks/src/main/java/nl/ramsolutions/sw/magik/typedchecks/checks/MethodReturnMatchesDocTypedCheck.java index e4e90997..27533bae 100644 --- a/magik-typed-checks/src/main/java/nl/ramsolutions/sw/magik/typedchecks/checks/MethodReturnMatchesDocTypedCheck.java +++ b/magik-typed-checks/src/main/java/nl/ramsolutions/sw/magik/typedchecks/checks/MethodReturnMatchesDocTypedCheck.java @@ -1,17 +1,19 @@ package nl.ramsolutions.sw.magik.typedchecks.checks; import com.sonar.sslr.api.AstNode; -import java.util.List; -import java.util.Objects; -import java.util.stream.Collectors; +import java.util.Map; import nl.ramsolutions.sw.magik.analysis.helpers.MethodDefinitionNodeHelper; import nl.ramsolutions.sw.magik.analysis.typing.ITypeKeeper; import nl.ramsolutions.sw.magik.analysis.typing.LocalTypeReasoner; import nl.ramsolutions.sw.magik.analysis.typing.TypeReader; import nl.ramsolutions.sw.magik.analysis.typing.types.AbstractType; import nl.ramsolutions.sw.magik.analysis.typing.types.ExpressionResult; +import nl.ramsolutions.sw.magik.analysis.typing.types.ExpressionResultString; +import nl.ramsolutions.sw.magik.analysis.typing.types.TypeString; +import nl.ramsolutions.sw.magik.api.TypeDocGrammar; import nl.ramsolutions.sw.magik.parser.TypeDocParser; import nl.ramsolutions.sw.magik.typedchecks.MagikTypedCheck; +import nl.ramsolutions.sw.magik.utils.StreamUtils; /** * Check to check if the @return types from method doc matches the reasoned return types. @@ -27,30 +29,45 @@ protected void walkPostMethodDefinition(final AstNode node) { return; } - final ExpressionResult docExpressionResult = this.extractMethodDocResult(node); - final ExpressionResult reasonedReturnResult = this.extractReasonedResult(node); - if (!docExpressionResult.equals(reasonedReturnResult)) { - final String docTypesStr = docExpressionResult.getTypeNames(", "); - final String reasonedTypesStr = reasonedReturnResult.getTypeNames(", "); - final String message = String.format(MESSAGE, docTypesStr, reasonedTypesStr); - this.addIssue(node, message); - } + final ExpressionResultString methodResultString = this.extractReasonedResult(node); + final Map typeDocNodes = this.extractMethodDocResult(node); + final ITypeKeeper typeKeeper = this.getTypeKeeper(); + final TypeReader typeReader = new TypeReader(typeKeeper); + StreamUtils.zip(methodResultString.stream(), typeDocNodes.entrySet().stream()) + .forEach(entry -> { + if (entry.getKey() == null + || entry.getValue() == null) { + // Only bother use with type-doc returns. + return; + } + + final TypeString methodReturnTypeString = entry.getKey(); + final AbstractType methodReturnType = typeReader.parseTypeString(methodReturnTypeString); + + final Map.Entry typeDocEntry = entry.getValue(); + final TypeString docReturnTypeString = typeDocEntry.getValue(); + final AbstractType docReturnType = typeReader.parseTypeString(docReturnTypeString); + + if (!methodReturnType.equals(docReturnType)) { + final String message = String.format(MESSAGE, docReturnTypeString, methodReturnTypeString); + final AstNode returnTypeNode = typeDocEntry.getKey(); + final AstNode typeValueNode = returnTypeNode.getFirstChild(TypeDocGrammar.TYPE_VALUE); + this.addIssue(typeValueNode, message); + } + }); } - private ExpressionResult extractReasonedResult(final AstNode node) { + private ExpressionResultString extractReasonedResult(final AstNode node) { final LocalTypeReasoner reasoner = this.getReasoner(); - ExpressionResult result = reasoner.getNodeTypeSilent(node); - return Objects.requireNonNullElse(result, new ExpressionResult()); + final ExpressionResult result = reasoner.getNodeType(node); + return result.stream() + .map(AbstractType::getTypeString) + .collect(ExpressionResultString.COLLECTOR); } - private ExpressionResult extractMethodDocResult(final AstNode node) { + private Map extractMethodDocResult(final AstNode node) { final TypeDocParser docParser = new TypeDocParser(node); - final ITypeKeeper typeKeeper = this.getTypeKeeper(); - final TypeReader typeParser = new TypeReader(typeKeeper); - final List docReturnTypes = docParser.getReturnTypes().stream() - .map(typeParser::parseTypeString) - .collect(Collectors.toList()); - return new ExpressionResult(docReturnTypes); + return docParser.getReturnTypeNodes(); } }