From 7b0a7ac4996b750b2a0eab99964dcdfb251f717a Mon Sep 17 00:00:00 2001 From: guwirth Date: Mon, 7 Jun 2021 17:42:34 +0200 Subject: [PATCH] fix #2180 - NPE in case of unqualifiedid - improved error message: create id from declaratorId token stream (instead of IDENTIFIER only) - closd #2180 --- .../visitors/AbstractCxxPublicApiVisitor.java | 18 +++++++----------- .../cxx/visitors/CxxPublicApiVisitorTest.java | 2 +- .../src/test/resources/metrics/template.h | 6 ++++++ 3 files changed, 14 insertions(+), 12 deletions(-) diff --git a/cxx-squid/src/main/java/org/sonar/cxx/visitors/AbstractCxxPublicApiVisitor.java b/cxx-squid/src/main/java/org/sonar/cxx/visitors/AbstractCxxPublicApiVisitor.java index 0b373877be..eaca15fbf6 100644 --- a/cxx-squid/src/main/java/org/sonar/cxx/visitors/AbstractCxxPublicApiVisitor.java +++ b/cxx-squid/src/main/java/org/sonar/cxx/visitors/AbstractCxxPublicApiVisitor.java @@ -21,17 +21,16 @@ import com.sonar.sslr.api.AstNode; import com.sonar.sslr.api.GenericTokenType; -import static com.sonar.sslr.api.GenericTokenType.IDENTIFIER; import com.sonar.sslr.api.Grammar; import com.sonar.sslr.api.Token; import com.sonar.sslr.impl.ast.AstXmlPrinter; import java.util.ArrayList; import java.util.List; +import java.util.stream.Collectors; import javax.annotation.CheckForNull; import org.sonar.api.utils.log.Logger; import org.sonar.api.utils.log.Loggers; import org.sonar.cxx.parser.CxxGrammarImpl; -import static org.sonar.cxx.parser.CxxGrammarImpl.qualifiedId; import org.sonar.cxx.parser.CxxKeyword; import org.sonar.cxx.parser.CxxPunctuator; import org.sonar.cxx.squidbridge.checks.SquidCheck; @@ -646,13 +645,10 @@ private void visitTemplateDeclaration(AstNode templateDeclaration) { if (declId == null) { return; } - var idNode = declId.getLastChild(qualifiedId); - if (idNode != null) { - idNode = idNode.getLastChild(IDENTIFIER); - } else { - idNode = declId; - } - String id = idNode.getTokenValue(); + + String id = declId.getTokens().stream() + .map(Token::getValue) + .collect(Collectors.joining()); // handle cascaded template declarations AstNode node = templateDeclaration; @@ -815,7 +811,7 @@ private void visitEnumSpecifier(AstNode enumSpecifierNode) { docNode = enumSpecifierNode; } - visitPublicApi(enumSpecifierNode, enumId,getBlockDocumentation(docNode)); + visitPublicApi(enumSpecifierNode, enumId, getBlockDocumentation(docNode)); // deal with enumeration values AstNode enumeratorList = enumSpecifierNode.getFirstDescendant(CxxGrammarImpl.enumeratorList); @@ -841,7 +837,7 @@ private void visitEnumSpecifier(AstNode enumSpecifierNode) { } } - visitPublicApi(definition, definition.getFirstDescendant( GenericTokenType.IDENTIFIER).getTokenValue(), comments); + visitPublicApi(definition, definition.getFirstDescendant(GenericTokenType.IDENTIFIER).getTokenValue(), comments); } } } diff --git a/cxx-squid/src/test/java/org/sonar/cxx/visitors/CxxPublicApiVisitorTest.java b/cxx-squid/src/test/java/org/sonar/cxx/visitors/CxxPublicApiVisitorTest.java index 11bb6687ea..707ef0059d 100644 --- a/cxx-squid/src/test/java/org/sonar/cxx/visitors/CxxPublicApiVisitorTest.java +++ b/cxx-squid/src/test/java/org/sonar/cxx/visitors/CxxPublicApiVisitorTest.java @@ -83,7 +83,7 @@ public void no_doc() throws IOException { @Test public void template() throws IOException { - assertThat(verifyPublicApiOfFile("src/test/resources/metrics/template.h")).isEqualTo(tuple(14, 4)); + assertThat(verifyPublicApiOfFile("src/test/resources/metrics/template.h")).isEqualTo(tuple(15, 4)); } @Test diff --git a/cxx-squid/src/test/resources/metrics/template.h b/cxx-squid/src/test/resources/metrics/template.h index edfd009e01..60e08d95ec 100644 --- a/cxx-squid/src/test/resources/metrics/template.h +++ b/cxx-squid/src/test/resources/metrics/template.h @@ -75,3 +75,9 @@ struct A { * @brief issue #2138 */ template<> Formatter& LogMsg_applyFormat(Formatter& format, int i); + +/** + * @brief issue #2180 + */ +template +A::~A() = default;