@@ -776,20 +776,27 @@ public Description matchParameterizedType(ParameterizedTypeTree tree, VisitorSta
776
776
* LambdaExpressionTree}; otherwise {@code null}
777
777
* @param memberReferenceTree if the overriding method is a member reference (which "overrides" a
778
778
* functional interface method), the {@link MemberReferenceTree}; otherwise {@code null}
779
+ * @param state visitor state
780
+ * @param overridingMethod if available, the symbol for the overriding method
779
781
* @return discovered error, or {@link Description#NO_MATCH} if no error
780
782
*/
781
783
private Description checkParamOverriding (
782
784
List <VarSymbol > overridingParamSymbols ,
783
785
Symbol .MethodSymbol overriddenMethod ,
784
786
@ Nullable LambdaExpressionTree lambdaExpressionTree ,
785
787
@ Nullable MemberReferenceTree memberReferenceTree ,
786
- VisitorState state ) {
788
+ VisitorState state ,
789
+ Symbol .@ Nullable MethodSymbol overridingMethod ) {
787
790
com .sun .tools .javac .util .List <VarSymbol > superParamSymbols = overriddenMethod .getParameters ();
788
791
boolean unboundMemberRef =
789
792
(memberReferenceTree != null )
790
793
&& ((JCTree .JCMemberReference ) memberReferenceTree ).kind .isUnbound ();
791
794
boolean isOverriddenMethodAnnotated =
792
795
!codeAnnotationInfo .isSymbolUnannotated (overriddenMethod , config , handler );
796
+ boolean isOverridingMethodAnnotated =
797
+ (overridingMethod != null
798
+ && !codeAnnotationInfo .isSymbolUnannotated (overridingMethod , config , handler ))
799
+ || lambdaExpressionTree != null ;
793
800
794
801
// Get argument nullability for the overridden method. If overriddenMethodArgNullnessMap[i] is
795
802
// null, parameter i is treated as unannotated.
@@ -885,7 +892,7 @@ private Description checkParamOverriding(
885
892
lambdaExpressionTree != null
886
893
&& NullabilityUtil .lambdaParamIsImplicitlyTyped (
887
894
lambdaExpressionTree .getParameters ().get (methodParamInd ));
888
- if (!Nullness . hasNullableAnnotation (paramSymbol , config ) && ! implicitlyTypedLambdaParam ) {
895
+ if (!implicitlyTypedLambdaParam && paramIsNonNull (paramSymbol , isOverridingMethodAnnotated ) ) {
889
896
String message =
890
897
"parameter "
891
898
+ paramSymbol .name .toString ()
@@ -915,6 +922,16 @@ private Description checkParamOverriding(
915
922
return Description .NO_MATCH ;
916
923
}
917
924
925
+ private boolean paramIsNonNull (VarSymbol paramSymbol , boolean isMethodAnnotated ) {
926
+ if (isMethodAnnotated ) {
927
+ return !Nullness .hasNullableAnnotation (paramSymbol , config );
928
+ } else if (config .acknowledgeRestrictiveAnnotations ()) {
929
+ // can still be @NonNull if there is a restrictive annotation
930
+ return Nullness .hasNonNullAnnotation (paramSymbol , config );
931
+ }
932
+ return false ;
933
+ }
934
+
918
935
static Trees getTreesInstance (VisitorState state ) {
919
936
return Trees .instance (JavacProcessingEnvironment .instance (state .context ));
920
937
}
@@ -1023,7 +1040,8 @@ public Description matchLambdaExpression(LambdaExpressionTree tree, VisitorState
1023
1040
funcInterfaceMethod ,
1024
1041
tree ,
1025
1042
null ,
1026
- state );
1043
+ state ,
1044
+ null );
1027
1045
if (description != Description .NO_MATCH ) {
1028
1046
return description ;
1029
1047
}
@@ -1117,7 +1135,12 @@ && getMethodReturnNullness(overridingMethod, state, Nullness.NONNULL)
1117
1135
// if any parameter in the super method is annotated @Nullable,
1118
1136
// overriding method cannot assume @Nonnull
1119
1137
return checkParamOverriding (
1120
- overridingMethod .getParameters (), overriddenMethod , null , memberReferenceTree , state );
1138
+ overridingMethod .getParameters (),
1139
+ overriddenMethod ,
1140
+ null ,
1141
+ memberReferenceTree ,
1142
+ state ,
1143
+ overridingMethod );
1121
1144
}
1122
1145
1123
1146
private boolean overriddenMethodReturnsNonNull (
0 commit comments