1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 package com.puppycrawl.tools.checkstyle.checks.javadoc;
21
22 import java.util.Set;
23
24 import com.puppycrawl.tools.checkstyle.StatelessCheck;
25 import com.puppycrawl.tools.checkstyle.api.AbstractCheck;
26 import com.puppycrawl.tools.checkstyle.api.DetailAST;
27 import com.puppycrawl.tools.checkstyle.api.FileContents;
28 import com.puppycrawl.tools.checkstyle.api.Scope;
29 import com.puppycrawl.tools.checkstyle.api.TextBlock;
30 import com.puppycrawl.tools.checkstyle.api.TokenTypes;
31 import com.puppycrawl.tools.checkstyle.utils.AnnotationUtil;
32 import com.puppycrawl.tools.checkstyle.utils.CommonUtil;
33 import com.puppycrawl.tools.checkstyle.utils.ScopeUtil;
34
35
36
37
38
39
40
41
42
43
44
45 @StatelessCheck
46 public class MissingJavadocTypeCheck extends AbstractCheck {
47
48
49
50
51
52 public static final String MSG_JAVADOC_MISSING = "javadoc.missing";
53
54
55 private Scope scope = Scope.PUBLIC;
56
57 private Scope excludeScope;
58
59
60
61
62
63
64 private Set<String> skipAnnotations = Set.of("Generated");
65
66
67
68
69
70
71
72 public void setScope(Scope scope) {
73 this.scope = scope;
74 }
75
76
77
78
79
80
81
82 public void setExcludeScope(Scope excludeScope) {
83 this.excludeScope = excludeScope;
84 }
85
86
87
88
89
90
91
92
93
94 public void setSkipAnnotations(String... userAnnotations) {
95 skipAnnotations = Set.of(userAnnotations);
96 }
97
98 @Override
99 public int[] getDefaultTokens() {
100 return getAcceptableTokens();
101 }
102
103 @Override
104 public int[] getAcceptableTokens() {
105 return new int[] {
106 TokenTypes.INTERFACE_DEF,
107 TokenTypes.CLASS_DEF,
108 TokenTypes.ENUM_DEF,
109 TokenTypes.ANNOTATION_DEF,
110 TokenTypes.RECORD_DEF,
111 };
112 }
113
114 @Override
115 public int[] getRequiredTokens() {
116 return CommonUtil.EMPTY_INT_ARRAY;
117 }
118
119
120 @Override
121 @SuppressWarnings("deprecation")
122 public void visitToken(DetailAST ast) {
123 if (shouldCheck(ast)) {
124 final FileContents contents = getFileContents();
125 final int lineNo = ast.getLineNo();
126 final TextBlock textBlock = contents.getJavadocBefore(lineNo);
127 if (textBlock == null) {
128 log(ast, MSG_JAVADOC_MISSING);
129 }
130 }
131 }
132
133
134
135
136
137
138
139 private boolean shouldCheck(final DetailAST ast) {
140 final Scope surroundingScope = ScopeUtil.getSurroundingScope(ast);
141
142 return surroundingScope.isIn(scope)
143 && (excludeScope == null || !surroundingScope.isIn(excludeScope))
144 && !AnnotationUtil.containsAnnotation(ast, skipAnnotations);
145 }
146
147 }