From b57e6e098bb2e4bd7095d76129750c381c8cc8eb Mon Sep 17 00:00:00 2001 From: Bas Leijdekkers Date: Wed, 19 Feb 2025 18:24:19 +0100 Subject: [PATCH] Java: report missing @param on records (IDEA-310177) GitOrigin-RevId: c79523e30672943fb0901be3460977d503847bf3 --- .../javaDoc/MissingJavadocInspection.java | 32 ++++++++++++++++--- .../missingJavadoc/InnerClassEnabled.java | 5 +++ .../daemon/JavadocSettingsMergerTest.kt | 4 +-- 3 files changed, 35 insertions(+), 6 deletions(-) diff --git a/java/java-impl/src/com/intellij/codeInspection/javaDoc/MissingJavadocInspection.java b/java/java-impl/src/com/intellij/codeInspection/javaDoc/MissingJavadocInspection.java index b92bde877be2..d5ffae208faf 100644 --- a/java/java-impl/src/com/intellij/codeInspection/javaDoc/MissingJavadocInspection.java +++ b/java/java-impl/src/com/intellij/codeInspection/javaDoc/MissingJavadocInspection.java @@ -40,7 +40,7 @@ public final class MissingJavadocInspection extends LocalInspectionTool { public Options PACKAGE_SETTINGS = new Options(); public Options MODULE_SETTINGS = new Options(); public Options TOP_LEVEL_CLASS_SETTINGS = new Options("@param"); - public Options INNER_CLASS_SETTINGS = new Options(); + public Options INNER_CLASS_SETTINGS = new Options("@param"); public Options METHOD_SETTINGS = new Options("@return@param@throws or @exception"); public Options FIELD_SETTINGS = new Options(); @@ -73,7 +73,7 @@ public final class MissingJavadocInspection extends LocalInspectionTool { List.of(PUBLIC, PROTECTED, PACKAGE_LOCAL, PRIVATE), List.of()) .prefix("FIELD_SETTINGS"), INNER_CLASS_SETTINGS.getComponent(JavaBundle.message("inspection.javadoc.option.tab.title.inner.class"), - List.of(PUBLIC, PROTECTED, PACKAGE_LOCAL, PRIVATE), List.of()) + List.of(PUBLIC, PROTECTED, PACKAGE_LOCAL, PRIVATE), List.of("@param")) .prefix("INNER_CLASS_SETTINGS") ) ); @@ -206,10 +206,12 @@ public final class MissingJavadocInspection extends LocalInspectionTool { if (docComment != null) { PsiDocTag[] tags = docComment.getTags(); - checkRequiredTags(tags, options, docComment.getFirstChild(), holder); + PsiElement toHighlight = docComment.getFirstChild(); + checkRequiredTags(tags, options, toHighlight, holder); if (options.isTagRequired("param")) { - checkMissingTypeParamTags(aClass, tags, docComment.getFirstChild(), holder); + checkMissingTypeParamTags(aClass, tags, toHighlight, holder); + checkMissingParamTags(aClass, tags, toHighlight, holder); } } else { @@ -395,6 +397,22 @@ public final class MissingJavadocInspection extends LocalInspectionTool { } } + private static void checkMissingParamTags(@NotNull PsiClass aClass, + PsiDocTag @NotNull [] tags, + @NotNull PsiElement toHighlight, + @NotNull ProblemsHolder holder) { + if (!aClass.isRecord()) return; + List absentParameters = null; + + for (PsiRecordComponent param : aClass.getRecordComponents()) { + if (!hasTagForParameter(tags, param)) { + (absentParameters = list(absentParameters)).add(param); + } + } + + reportMissingParamTags(absentParameters, toHighlight, holder); + } + private static void checkMissingParamTags(@NotNull PsiMethod psiMethod, PsiDocTag @NotNull [] tags, @NotNull PsiElement toHighlight, @@ -407,6 +425,12 @@ public final class MissingJavadocInspection extends LocalInspectionTool { } } + reportMissingParamTags(absentParameters, toHighlight, holder); + } + + private static void reportMissingParamTags(List absentParameters, + @NotNull PsiElement toHighlight, + @NotNull ProblemsHolder holder) { if (absentParameters != null) { for (PsiNamedElement parameter : absentParameters) { String name = parameter.getName(); diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/missingJavadoc/InnerClassEnabled.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/missingJavadoc/InnerClassEnabled.java index 0417ef61cd86..05ed7fd4ca69 100644 --- a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/missingJavadoc/InnerClassEnabled.java +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/missingJavadoc/InnerClassEnabled.java @@ -26,4 +26,9 @@ public class InnerClassEnabled { private static class Inner2 { } + + /** + * You have a point. + */ + public record Point(int x, int y) {} } diff --git a/java/java-tests/testSrc/com/intellij/java/codeInsight/daemon/JavadocSettingsMergerTest.kt b/java/java-tests/testSrc/com/intellij/java/codeInsight/daemon/JavadocSettingsMergerTest.kt index b3fe5839d418..7a2f60bede63 100644 --- a/java/java-tests/testSrc/com/intellij/java/codeInsight/daemon/JavadocSettingsMergerTest.kt +++ b/java/java-tests/testSrc/com/intellij/java/codeInsight/daemon/JavadocSettingsMergerTest.kt @@ -1,4 +1,4 @@ -// Copyright 2000-2022 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license. +// Copyright 2000-2025 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license. package com.intellij.java.codeInsight.daemon import com.intellij.codeInspection.InspectionProfileEntry @@ -232,7 +232,7 @@ class JavadocSettingsMergerTest: LightJavaCodeInsightFixtureTestCase5() {