View Javadoc
1   ///////////////////////////////////////////////////////////////////////////////////////////////
2   // checkstyle: Checks Java source code and other text files for adherence to a set of rules.
3   // Copyright (C) 2001-2025 the original author or authors.
4   //
5   // This library is free software; you can redistribute it and/or
6   // modify it under the terms of the GNU Lesser General Public
7   // License as published by the Free Software Foundation; either
8   // version 2.1 of the License, or (at your option) any later version.
9   //
10  // This library is distributed in the hope that it will be useful,
11  // but WITHOUT ANY WARRANTY; without even the implied warranty of
12  // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13  // Lesser General Public License for more details.
14  //
15  // You should have received a copy of the GNU Lesser General Public
16  // License along with this library; if not, write to the Free Software
17  // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
18  ///////////////////////////////////////////////////////////////////////////////////////////////
19  
20  package com.puppycrawl.tools.checkstyle.grammar.javadoc;
21  
22  import static com.google.common.truth.Truth.assertWithMessage;
23  
24  import java.lang.reflect.Field;
25  import java.lang.reflect.Modifier;
26  import java.util.Arrays;
27  import java.util.List;
28  import java.util.Set;
29  
30  import org.junit.jupiter.api.Test;
31  
32  /**
33   * GeneratedJavadocTokenTypesTest.
34   *
35   * @noinspection ClassIndependentOfModule
36   * @noinspectionreason ClassIndependentOfModule - architecture of test modules
37   *      requires this structure
38   */
39  public class GeneratedJavadocCommentsTokenTypesTest {
40  
41      private static final List<String> INTERNAL_TOKENS = List.of(
42          "WS",
43          "CODE",
44          "LINK",
45          "AUTHOR",
46          "DEPRECATED",
47          "RETURN",
48          "PARAM",
49          "VALUE",
50          "SUMMARY",
51          "SYSTEM_PROPERTY",
52          "INDEX",
53          "EXCEPTION",
54          "THROWS",
55          "SINCE",
56          "VERSION",
57          "SEE",
58          "LITERAL_HIDDEN",
59          "SERIAL",
60          "SERIAL_DATA",
61          "SERIAL_FIELD",
62          "USES",
63          "PROVIDES",
64          "LITERAL",
65          "CUSTOM_NAME",
66          "Snippet_ATTRIBUTE",
67          "See_TAG_OPEN",
68          "ATTRIBUTE",
69          "Link_COMMA"
70      );
71  
72      private static final String MSG = "Ensure that token numbers generated for the elements"
73              + "present in JavadocParser are consistent with what the tests assert.";
74  
75      /**
76       * This method checks that the numbers generated for tokens in <tt>JavadocLexer.g4</tt> don't
77       * change with the lexer grammar itself.
78       * <br>ANTLR maps all the lexer elements to compile-time constants used internally by ANTLR.
79       * Compatibility damage is incurred <i>(with respect to the previous checkstyle versions)
80       * </i> if these compile-time constants keep changing with the grammar.
81       *
82       * @see "https://github.com/checkstyle/checkstyle/issues/5139"
83       * @see "https://github.com/checkstyle/checkstyle/issues/5186"
84       */
85      @Test
86      public void testTokenNumbers() {
87          assertWithMessage(MSG)
88              .that(JavadocCommentsLexer.JAVADOC)
89              .isEqualTo(1);
90          assertWithMessage(MSG)
91              .that(JavadocCommentsLexer.LEADING_ASTERISK)
92              .isEqualTo(2);
93          assertWithMessage(MSG)
94              .that(JavadocCommentsLexer.NEWLINE)
95              .isEqualTo(3);
96          assertWithMessage(MSG)
97              .that(JavadocCommentsLexer.TEXT)
98              .isEqualTo(4);
99          assertWithMessage(MSG)
100             .that(JavadocCommentsLexer.JAVADOC_INLINE_TAG)
101             .isEqualTo(6);
102         assertWithMessage(MSG)
103             .that(JavadocCommentsLexer.JAVADOC_INLINE_TAG_START)
104             .isEqualTo(7);
105         assertWithMessage(MSG)
106             .that(JavadocCommentsLexer.JAVADOC_INLINE_TAG_END)
107             .isEqualTo(8);
108         assertWithMessage(MSG)
109             .that(JavadocCommentsLexer.IDENTIFIER)
110             .isEqualTo(11);
111         assertWithMessage(MSG)
112             .that(JavadocCommentsLexer.HASH)
113             .isEqualTo(12);
114         assertWithMessage(MSG)
115             .that(JavadocCommentsLexer.LPAREN)
116             .isEqualTo(13);
117         assertWithMessage(MSG)
118             .that(JavadocCommentsLexer.RPAREN)
119             .isEqualTo(14);
120         assertWithMessage(MSG)
121             .that(JavadocCommentsLexer.COMMA)
122             .isEqualTo(15);
123         assertWithMessage(MSG)
124             .that(JavadocCommentsLexer.TAG_OPEN)
125             .isEqualTo(21);
126         assertWithMessage(MSG)
127             .that(JavadocCommentsLexer.TAG_CLOSE)
128             .isEqualTo(22);
129         assertWithMessage(MSG)
130             .that(JavadocCommentsLexer.TAG_SLASH_CLOSE)
131             .isEqualTo(23);
132         assertWithMessage(MSG)
133             .that(JavadocCommentsLexer.TAG_SLASH)
134             .isEqualTo(24);
135         assertWithMessage(MSG)
136             .that(JavadocCommentsLexer.EQUALS)
137             .isEqualTo(25);
138         assertWithMessage(MSG)
139             .that(JavadocCommentsLexer.TAG_NAME)
140             .isEqualTo(26);
141         assertWithMessage(MSG)
142             .that(JavadocCommentsLexer.ATTRIBUTE_VALUE)
143             .isEqualTo(27);
144         assertWithMessage(MSG)
145             .that(JavadocCommentsLexer.SLASH)
146             .isEqualTo(28);
147         assertWithMessage(MSG)
148             .that(JavadocCommentsLexer.PARAMETER_TYPE)
149             .isEqualTo(29);
150         assertWithMessage(MSG)
151             .that(JavadocCommentsLexer.LT)
152             .isEqualTo(30);
153         assertWithMessage(MSG)
154             .that(JavadocCommentsLexer.GT)
155             .isEqualTo(31);
156         assertWithMessage(MSG)
157             .that(JavadocCommentsLexer.EXTENDS)
158             .isEqualTo(32);
159         assertWithMessage(MSG)
160             .that(JavadocCommentsLexer.SUPER)
161             .isEqualTo(33);
162         assertWithMessage(MSG)
163             .that(JavadocCommentsLexer.QUESTION)
164             .isEqualTo(34);
165         assertWithMessage(MSG)
166             .that(JavadocCommentsLexer.FORMAT_SPECIFIER)
167             .isEqualTo(36);
168         assertWithMessage(MSG)
169             .that(JavadocCommentsLexer.INHERIT_DOC)
170             .isEqualTo(37);
171         assertWithMessage(MSG)
172             .that(JavadocCommentsLexer.INDEX_TERM)
173             .isEqualTo(41);
174         assertWithMessage(MSG)
175             .that(JavadocCommentsLexer.SNIPPET)
176             .isEqualTo(42);
177         assertWithMessage(MSG)
178             .that(JavadocCommentsLexer.SNIPPET_ATTR_NAME)
179             .isEqualTo(43);
180         assertWithMessage(MSG)
181             .that(JavadocCommentsLexer.COLON)
182             .isEqualTo(44);
183         assertWithMessage(MSG)
184             .that(JavadocCommentsLexer.PARAMETER_NAME)
185             .isEqualTo(47);
186         assertWithMessage(MSG)
187             .that(JavadocCommentsLexer.STRING_LITERAL)
188             .isEqualTo(51);
189         assertWithMessage(MSG)
190             .that(JavadocCommentsLexer.FIELD_TYPE)
191             .isEqualTo(56);
192         assertWithMessage(MSG)
193             .that(JavadocCommentsLexer.AT_SIGN)
194             .isEqualTo(57);
195         assertWithMessage(MSG)
196             .that(JavadocCommentsLexer.TYPE_NAME)
197             .isEqualTo(58);
198         assertWithMessage(MSG)
199             .that(JavadocCommentsLexer.REFERENCE)
200             .isEqualTo(59);
201         assertWithMessage(MSG)
202             .that(JavadocCommentsLexer.MEMBER_REFERENCE)
203             .isEqualTo(60);
204         assertWithMessage(MSG)
205             .that(JavadocCommentsLexer.PARAMETER_TYPE_LIST)
206             .isEqualTo(61);
207         assertWithMessage(MSG)
208             .that(JavadocCommentsLexer.TYPE_ARGUMENTS)
209             .isEqualTo(62);
210         assertWithMessage(MSG)
211             .that(JavadocCommentsLexer.TYPE_ARGUMENT)
212             .isEqualTo(63);
213         assertWithMessage(MSG)
214             .that(JavadocCommentsLexer.DESCRIPTION)
215             .isEqualTo(64);
216         assertWithMessage(MSG)
217             .that(JavadocCommentsLexer.SNIPPET_ATTRIBUTES)
218             .isEqualTo(65);
219         assertWithMessage(MSG)
220             .that(JavadocCommentsLexer.SNIPPET_ATTRIBUTE)
221             .isEqualTo(66);
222         assertWithMessage(MSG)
223             .that(JavadocCommentsLexer.SNIPPET_BODY)
224             .isEqualTo(67);
225         assertWithMessage(MSG)
226             .that(JavadocCommentsLexer.HTML_ELEMENT)
227             .isEqualTo(68);
228         assertWithMessage(MSG)
229             .that(JavadocCommentsLexer.VOID_ELEMENT)
230             .isEqualTo(69);
231         assertWithMessage(MSG)
232             .that(JavadocCommentsLexer.HTML_CONTENT)
233             .isEqualTo(70);
234         assertWithMessage(MSG)
235             .that(JavadocCommentsLexer.HTML_TAG_START)
236             .isEqualTo(71);
237         assertWithMessage(MSG)
238             .that(JavadocCommentsLexer.HTML_TAG_END)
239             .isEqualTo(72);
240         assertWithMessage(MSG)
241             .that(JavadocCommentsLexer.HTML_ATTRIBUTES)
242             .isEqualTo(73);
243         assertWithMessage(MSG)
244             .that(JavadocCommentsLexer.HTML_ATTRIBUTE)
245             .isEqualTo(74);
246         assertWithMessage(MSG)
247             .that(JavadocCommentsLexer.JAVADOC_BLOCK_TAG)
248             .isEqualTo(75);
249         assertWithMessage(MSG)
250             .that(JavadocCommentsLexer.CODE_INLINE_TAG)
251             .isEqualTo(76);
252         assertWithMessage(MSG)
253             .that(JavadocCommentsLexer.LINK_INLINE_TAG)
254             .isEqualTo(77);
255         assertWithMessage(MSG)
256             .that(JavadocCommentsLexer.LINKPLAIN_INLINE_TAG)
257             .isEqualTo(78);
258         assertWithMessage(MSG)
259             .that(JavadocCommentsLexer.VALUE_INLINE_TAG)
260             .isEqualTo(79);
261         assertWithMessage(MSG)
262             .that(JavadocCommentsLexer.INHERIT_DOC_INLINE_TAG)
263             .isEqualTo(80);
264         assertWithMessage(MSG)
265             .that(JavadocCommentsLexer.SUMMARY_INLINE_TAG)
266             .isEqualTo(81);
267         assertWithMessage(MSG)
268             .that(JavadocCommentsLexer.SYSTEM_PROPERTY_INLINE_TAG)
269             .isEqualTo(82);
270         assertWithMessage(MSG)
271             .that(JavadocCommentsLexer.INDEX_INLINE_TAG)
272             .isEqualTo(83);
273         assertWithMessage(MSG)
274             .that(JavadocCommentsLexer.RETURN_INLINE_TAG)
275             .isEqualTo(84);
276         assertWithMessage(MSG)
277             .that(JavadocCommentsLexer.LITERAL_INLINE_TAG)
278             .isEqualTo(85);
279         assertWithMessage(MSG)
280             .that(JavadocCommentsLexer.SNIPPET_INLINE_TAG)
281             .isEqualTo(86);
282         assertWithMessage(MSG)
283             .that(JavadocCommentsLexer.CUSTOM_INLINE_TAG)
284             .isEqualTo(87);
285         assertWithMessage(MSG)
286             .that(JavadocCommentsLexer.AUTHOR_BLOCK_TAG)
287             .isEqualTo(88);
288         assertWithMessage(MSG)
289             .that(JavadocCommentsLexer.DEPRECATED_BLOCK_TAG)
290             .isEqualTo(89);
291         assertWithMessage(MSG)
292             .that(JavadocCommentsLexer.RETURN_BLOCK_TAG)
293             .isEqualTo(90);
294         assertWithMessage(MSG)
295             .that(JavadocCommentsLexer.PARAM_BLOCK_TAG)
296             .isEqualTo(91);
297         assertWithMessage(MSG)
298             .that(JavadocCommentsLexer.EXCEPTION_BLOCK_TAG)
299             .isEqualTo(92);
300         assertWithMessage(MSG)
301             .that(JavadocCommentsLexer.THROWS_BLOCK_TAG)
302             .isEqualTo(93);
303         assertWithMessage(MSG)
304             .that(JavadocCommentsLexer.SINCE_BLOCK_TAG)
305             .isEqualTo(94);
306         assertWithMessage(MSG)
307             .that(JavadocCommentsLexer.VERSION_BLOCK_TAG)
308             .isEqualTo(95);
309         assertWithMessage(MSG)
310             .that(JavadocCommentsLexer.SEE_BLOCK_TAG)
311             .isEqualTo(96);
312         assertWithMessage(MSG)
313             .that(JavadocCommentsLexer.HIDDEN_BLOCK_TAG)
314             .isEqualTo(97);
315         assertWithMessage(MSG)
316             .that(JavadocCommentsLexer.USES_BLOCK_TAG)
317             .isEqualTo(98);
318         assertWithMessage(MSG)
319             .that(JavadocCommentsLexer.PROVIDES_BLOCK_TAG)
320             .isEqualTo(99);
321         assertWithMessage(MSG)
322             .that(JavadocCommentsLexer.SERIAL_BLOCK_TAG)
323             .isEqualTo(100);
324         assertWithMessage(MSG)
325             .that(JavadocCommentsLexer.SERIAL_DATA_BLOCK_TAG)
326             .isEqualTo(101);
327         assertWithMessage(MSG)
328             .that(JavadocCommentsLexer.SERIAL_FIELD_BLOCK_TAG)
329             .isEqualTo(102);
330         assertWithMessage(MSG)
331             .that(JavadocCommentsLexer.CUSTOM_BLOCK_TAG)
332             .isEqualTo(103);
333         assertWithMessage(MSG)
334             .that(JavadocCommentsLexer.HTML_COMMENT_START)
335             .isEqualTo(104);
336         assertWithMessage(MSG)
337             .that(JavadocCommentsLexer.HTML_COMMENT_END)
338             .isEqualTo(105);
339         assertWithMessage(MSG)
340             .that(JavadocCommentsLexer.HTML_COMMENT)
341             .isEqualTo(106);
342         assertWithMessage(MSG)
343             .that(JavadocCommentsLexer.HTML_COMMENT_CONTENT)
344             .isEqualTo(107);
345         assertWithMessage(MSG)
346             .that(JavadocCommentsLexer.TAG_ATTR_NAME)
347             .isEqualTo(114);
348 
349         final Set<String> modeNames = Set.of(JavadocCommentsLexer.modeNames);
350         final Set<String> channelNames = Set.of(JavadocCommentsLexer.channelNames);
351 
352         final int tokenCount = (int) Arrays.stream(JavadocCommentsLexer.class.getDeclaredFields())
353                 .filter(GeneratedJavadocCommentsTokenTypesTest::isPublicStaticFinalInt)
354                 .filter(field -> !modeNames.contains(field.getName()))
355                 .filter(field -> !channelNames.contains(field.getName()))
356                 .filter(field -> !INTERNAL_TOKENS.contains(field.getName()))
357                 .count();
358 
359         // Read JavaDoc before changing count below
360         assertWithMessage("all tokens must be added to list in"
361                         + " 'GeneratedJavadocTokenTypesTest' and verified"
362                         + " that their old numbering didn't change")
363             .that(tokenCount)
364             .isEqualTo(88);
365     }
366 
367     /**
368      * Checks that a given field is 'public static final int'.
369      *
370      * @param field field to verify type and visibility of
371      * @return true if field is declared as 'public static final int'
372      */
373     private static boolean isPublicStaticFinalInt(Field field) {
374         final Class<?> fieldType = field.getType();
375         final int mods = field.getModifiers();
376         return fieldType.equals(Integer.TYPE)
377                 && Modifier.isPublic(mods)
378                 && Modifier.isStatic(mods)
379                 && Modifier.isFinal(mods);
380     }
381 
382 }