2020package org .sonar .java .checks ;
2121
2222import com .google .common .collect .ImmutableList ;
23+ import org .apache .commons .lang .ArrayUtils ;
2324import org .sonar .api .server .rule .RulesDefinition ;
2425import org .sonar .check .Priority ;
2526import org .sonar .check .Rule ;
3940import org .sonar .plugins .java .api .tree .ParameterizedTypeTree ;
4041import org .sonar .plugins .java .api .tree .ReturnStatementTree ;
4142import org .sonar .plugins .java .api .tree .Tree ;
43+ import org .sonar .plugins .java .api .tree .Tree .Kind ;
4244import org .sonar .plugins .java .api .tree .TypeCastTree ;
4345import org .sonar .plugins .java .api .tree .TypeTree ;
4446import org .sonar .plugins .java .api .tree .VariableTree ;
6163@ SqaleConstantRemediation ("1min" )
6264public class DiamondOperatorCheck extends SubscriptionBaseVisitor implements JavaVersionAwareVisitor {
6365
66+ private static final Tree .Kind [] JAVA_7_KINDS = new Tree .Kind [] {
67+ Tree .Kind .VARIABLE ,
68+ Tree .Kind .TYPE_CAST ,
69+ Tree .Kind .RETURN_STATEMENT ,
70+ Tree .Kind .ASSIGNMENT };
71+ private static final Tree .Kind [] JAVA_8_KINDS = (Tree .Kind []) ArrayUtils .addAll (JAVA_7_KINDS , new Tree .Kind [] {
72+ Tree .Kind .CONDITIONAL_EXPRESSION });
73+ private Tree .Kind [] expressionKindsToCheck = JAVA_7_KINDS ;
74+
6475 @ Override
6576 public boolean isCompatibleWithJavaVersion (@ Nullable Integer version ) {
77+ if (JavaVersionHelper .java8Compatible (version )) {
78+ expressionKindsToCheck = JAVA_8_KINDS ;
79+ }
6680 return JavaVersionHelper .java7Compatible (version );
6781 }
6882
@@ -76,7 +90,7 @@ public void visitNode(Tree tree) {
7690 NewClassTree newClassTree = (NewClassTree ) tree ;
7791 TypeTree newTypeTree = newClassTree .identifier ();
7892 if (newClassTree .classBody () == null && isParameterizedType (newTypeTree )) {
79- TypeTree type = getTypeFromExpression (tree .parent ());
93+ TypeTree type = getTypeFromExpression (tree .parent (), expressionKindsToCheck );
8094 if (type != null && isParameterizedType (type )) {
8195 reportIssue (
8296 ((ParameterizedTypeTree ) newTypeTree ).typeArguments (),
@@ -87,9 +101,9 @@ public void visitNode(Tree tree) {
87101 }
88102
89103 @ CheckForNull
90- private static TypeTree getTypeFromExpression (Tree expression ) {
91- if (expression .is (Tree . Kind . VARIABLE , Tree . Kind . TYPE_CAST , Tree . Kind . RETURN_STATEMENT , Tree . Kind . ASSIGNMENT , Tree . Kind . CONDITIONAL_EXPRESSION )) {
92- TypeTreeLocator visitor = new TypeTreeLocator ();
104+ private static TypeTree getTypeFromExpression (Tree expression , Tree . Kind [] kinds ) {
105+ if (expression .is (kinds )) {
106+ TypeTreeLocator visitor = new TypeTreeLocator (kinds );
93107 expression .accept (visitor );
94108 return visitor .type ;
95109 }
@@ -105,8 +119,15 @@ private static boolean isParameterizedType(TypeTree type) {
105119
106120 private static class TypeTreeLocator extends BaseTreeVisitor {
107121
122+ private final Tree .Kind [] kinds ;
123+
124+ @ Nullable
108125 private TypeTree type = null ;
109126
127+ public TypeTreeLocator (Kind [] kinds ) {
128+ this .kinds = kinds ;
129+ }
130+
110131 @ Override
111132 public void visitReturnStatement (ReturnStatementTree tree ) {
112133 type = getMethodReturnType (tree );
@@ -121,7 +142,7 @@ public void visitTypeCast(TypeCastTree tree) {
121142 public void visitAssignmentExpression (AssignmentExpressionTree tree ) {
122143 Tree assignedVariable = getAssignedVariable (tree .variable ());
123144 if (assignedVariable != null ) {
124- type = getTypeFromExpression (assignedVariable );
145+ type = getTypeFromExpression (assignedVariable , kinds );
125146 }
126147 }
127148
@@ -132,7 +153,7 @@ public void visitVariable(VariableTree tree) {
132153
133154 @ Override
134155 public void visitConditionalExpression (ConditionalExpressionTree tree ) {
135- type = getTypeFromExpression (tree .parent ());
156+ type = getTypeFromExpression (tree .parent (), kinds );
136157 }
137158
138159 private static TypeTree getMethodReturnType (ReturnStatementTree returnStatementTree ) {
0 commit comments