1
2
3
4
5 package com.qulice.checkstyle;
6
7 import com.puppycrawl.tools.checkstyle.api.DetailAST;
8 import com.puppycrawl.tools.checkstyle.api.TokenTypes;
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32 public final class ParameterNumberCheck
33 extends com.puppycrawl.tools.checkstyle.checks.sizes.ParameterNumberCheck {
34
35
36
37
38 public ParameterNumberCheck() {
39
40 }
41
42 @Override
43 public void visitToken(final DetailAST ast) {
44 if (!ParameterNumberCheck.tolerated(ast)) {
45 super.visitToken(ast);
46 }
47 }
48
49 private static boolean tolerated(final DetailAST ast) {
50 final boolean answer;
51 if (ast.getType() == TokenTypes.CTOR_DEF) {
52 answer = ParameterNumberCheck.parameters(ast)
53 <= ParameterNumberCheck.attributes(ast);
54 } else {
55 answer = ast.findFirstToken(TokenTypes.MODIFIERS)
56 .findFirstToken(TokenTypes.LITERAL_PRIVATE) != null
57 || new JnaBinding(ast).is();
58 }
59 return answer;
60 }
61
62 private static int parameters(final DetailAST ctor) {
63 return ctor.findFirstToken(TokenTypes.PARAMETERS)
64 .getChildCount(TokenTypes.PARAMETER_DEF);
65 }
66
67 private static long attributes(final DetailAST ctor) {
68 final DetailAST block = ctor.getParent();
69 return ParameterNumberCheck.components(block.getParent())
70 + new ChildStream(block).children().filter(
71 node -> node.getType() == TokenTypes.VARIABLE_DEF
72 && node.findFirstToken(TokenTypes.MODIFIERS)
73 .findFirstToken(TokenTypes.LITERAL_STATIC) == null
74 ).count();
75 }
76
77 private static int components(final DetailAST type) {
78 final DetailAST components = type.findFirstToken(TokenTypes.RECORD_COMPONENTS);
79 final int count;
80 if (components == null) {
81 count = 0;
82 } else {
83 count = components.getChildCount(TokenTypes.RECORD_COMPONENT_DEF);
84 }
85 return count;
86 }
87 }