From 11a6f0a9e853a9b0cca14bcb02d9d93f0f9ae57b Mon Sep 17 00:00:00 2001 From: 110416 Date: Mon, 11 Mar 2024 22:14:15 +0900 Subject: [PATCH] fix(#16610): warn ignored Scaladoc on multiple enum cases (#19555) close #16610 Before this commit, the compiler ignored Scaladoc comment on multiple enum cases without warning. This is partly expected because the case to which the doc is attached is ambiguous, but we should at least warn users that the comment is ignored by compiler due to ambiguity and they should take an action if they want the doc to be displayed. --- .../dotty/tools/dotc/config/ScalaSettings.scala | 1 + .../src/dotty/tools/dotc/parsing/Parsers.scala | 8 ++++++++ tests/warn/i16610.check | 5 +++++ tests/warn/i16610.scala | 16 ++++++++++++++++ 4 files changed, 30 insertions(+) create mode 100644 tests/warn/i16610.check create mode 100644 tests/warn/i16610.scala diff --git a/compiler/src/dotty/tools/dotc/config/ScalaSettings.scala b/compiler/src/dotty/tools/dotc/config/ScalaSettings.scala index 07efc18a772b..1129d6bbe0e3 100644 --- a/compiler/src/dotty/tools/dotc/config/ScalaSettings.scala +++ b/compiler/src/dotty/tools/dotc/config/ScalaSettings.scala @@ -168,6 +168,7 @@ private sealed trait WarningSettings: val XfatalWarnings: Setting[Boolean] = BooleanSetting("-Werror", "Fail the compilation if there are any warnings.", aliases = List("-Xfatal-warnings")) val WvalueDiscard: Setting[Boolean] = BooleanSetting("-Wvalue-discard", "Warn when non-Unit expression results are unused.") val WNonUnitStatement = BooleanSetting("-Wnonunit-statement", "Warn when block statements are non-Unit expressions.") + val WenumCommentDiscard = BooleanSetting("-Wenum-comment-discard", "Warn when a comment ambiguously assigned to multiple enum cases is discarded.") val WimplausiblePatterns = BooleanSetting("-Wimplausible-patterns", "Warn if comparison with a pattern value looks like it might always fail.") val WunstableInlineAccessors = BooleanSetting("-WunstableInlineAccessors", "Warn an inline methods has references to non-stable binary APIs.") val Wunused: Setting[List[ChoiceWithHelp[String]]] = MultiChoiceHelpSetting( diff --git a/compiler/src/dotty/tools/dotc/parsing/Parsers.scala b/compiler/src/dotty/tools/dotc/parsing/Parsers.scala index 6c2e69658927..4880c7704f0e 100644 --- a/compiler/src/dotty/tools/dotc/parsing/Parsers.scala +++ b/compiler/src/dotty/tools/dotc/parsing/Parsers.scala @@ -3997,6 +3997,14 @@ object Parsers { if (in.token == COMMA) { in.nextToken() val ids = commaSeparated(() => termIdent()) + if ctx.settings.WenumCommentDiscard.value then + in.getDocComment(start).foreach: comm => + warning( + em"""Ambiguous Scaladoc comment on multiple cases is ignored. + |Remove the comment or make separate cases to add Scaladoc comments to each of them.""", + comm.span.start + ) + PatDef(mods1, id :: ids, TypeTree(), EmptyTree) } else { diff --git a/tests/warn/i16610.check b/tests/warn/i16610.check new file mode 100644 index 000000000000..4eb69b5c551a --- /dev/null +++ b/tests/warn/i16610.check @@ -0,0 +1,5 @@ +-- Warning: tests/warn/i16610.scala:12:2 ------------------------------------------------------------------------------- +12 | /** // warn + | ^ + | Ambiguous Scaladoc comment on multiple cases is ignored. + | Remove the comment or make separate cases to add Scaladoc comments to each of them. diff --git a/tests/warn/i16610.scala b/tests/warn/i16610.scala new file mode 100644 index 000000000000..7657d23b7fd2 --- /dev/null +++ b/tests/warn/i16610.scala @@ -0,0 +1,16 @@ +//> using options -Wenum-comment-discard +/** + * Description of enum + */ +enum MyEnum { + + /** + * Description of case 1 + */ + case MyCase1 + + /** // warn + * Description of case 2 and 3 + */ + case MyCase2, MyCase3 +} \ No newline at end of file