Skip to content
Merged
Changes from 1 commit
Commits
Show all changes
73 commits
Select commit Hold shift + click to select a range
d804e2e
WIP
msridhar Jan 6, 2026
2c9c3f1
tweaks
msridhar Jan 6, 2026
a5ee613
Merge branch 'master' into lambda-poly-expression
msridhar Jan 6, 2026
808fb74
tweak
msridhar Jan 6, 2026
642a623
refactor
msridhar Jan 6, 2026
b6cb584
fix test case
msridhar Jan 6, 2026
cd9a4e3
Merge branch 'master' into lambda-poly-expression
msridhar Jan 7, 2026
3a36420
WIP
msridhar Jan 7, 2026
f528062
bug fix
msridhar Jan 7, 2026
a104dcc
comment and test case for #1307
msridhar Jan 7, 2026
c2c5808
fix nullaway error
msridhar Jan 7, 2026
9cd8239
Merge branch 'master' into method-ref-improve
msridhar Jan 7, 2026
fd64445
improve test
msridhar Jan 7, 2026
cae7447
remove unnecessary code and fix test
msridhar Jan 8, 2026
b84dd93
rename test file and move tests
msridhar Jan 8, 2026
6667ae3
a failing test we will handle in a follow up
msridhar Jan 8, 2026
05ec1ae
tweaks
msridhar Jan 8, 2026
c0031e0
cleanup
msridhar Jan 8, 2026
9a95c56
further cleanup
msridhar Jan 8, 2026
8d47ece
Merge branch 'master' into method-ref-improve
msridhar Jan 11, 2026
1a53741
Merge branch 'master' into method-ref-improve
msridhar Jan 12, 2026
6afc36b
Merge branch 'master' into method-ref-improve
msridhar Jan 13, 2026
468c520
WIP
msridhar Jan 11, 2026
a01a513
Merge branch 'master' into method-ref-generic-inference
msridhar Jan 14, 2026
2d7fa93
failing test
msridhar Jan 14, 2026
d67c661
fix test
msridhar Jan 14, 2026
9091dd1
Merge branch 'master' into method-ref-generic-inference
msridhar Jan 15, 2026
b736fe2
Merge branch 'master' into method-ref-generic-inference
msridhar Jan 15, 2026
fa16569
re-jigger logic
msridhar Jan 18, 2026
741de42
todos
msridhar Jan 18, 2026
fb60aee
WIP
msridhar Jan 19, 2026
ced8cae
WIP
msridhar Jan 19, 2026
029aa72
fix
msridhar Jan 19, 2026
dc1d9aa
complete test
msridhar Jan 19, 2026
659f169
another test
msridhar Jan 19, 2026
2c0cab4
WIP
msridhar Jan 19, 2026
4dfb323
fix test
msridhar Jan 19, 2026
4d50575
more tests
msridhar Jan 20, 2026
93a208d
WIP
msridhar Jan 20, 2026
ac4673b
cleanup and docs
msridhar Jan 20, 2026
ef71582
fix npe
msridhar Jan 20, 2026
6918968
Merge branch 'master' into method-ref-generic-inference
msridhar Jan 23, 2026
c4e25b3
Merge branch 'master' into method-ref-generic-inference
msridhar Jan 25, 2026
a8b1917
Merge branch 'master' into method-ref-generic-inference
msridhar Jan 25, 2026
4abedaf
Merge branch 'master' into method-ref-generic-inference
msridhar Feb 5, 2026
238a3e2
add a test for stream with values mapped to @Nullable; doesn't work yet
msridhar Feb 5, 2026
0e1b7ec
Merge branch 'master' into method-ref-generic-inference
msridhar Feb 5, 2026
1e9ab99
some improvements
msridhar Feb 5, 2026
16942b2
more cleanup
msridhar Feb 5, 2026
28bf098
add issue link
msridhar Feb 5, 2026
c76fbd5
Merge branch 'master' into method-ref-generic-inference
msridhar Feb 9, 2026
b90e54d
Merge branch 'master' into method-ref-generic-inference
msridhar Feb 10, 2026
2f924bb
add comment
msridhar Feb 10, 2026
de6b0ce
cleanup and todos
msridhar Feb 10, 2026
f695f56
test
msridhar Feb 11, 2026
8b4f0d0
another test case
msridhar Feb 12, 2026
3406847
yet another test
msridhar Feb 12, 2026
e2e735c
Add TODO comment
msridhar Feb 12, 2026
23bfde7
another comment
msridhar Feb 12, 2026
9a989da
add issue link
msridhar Feb 12, 2026
839d22c
comment and remove unnecessary check
msridhar Feb 13, 2026
a2d2b5d
test for new bug
msridhar Feb 13, 2026
5ce5c46
initial fix
msridhar Feb 13, 2026
d800190
WIP
msridhar Feb 13, 2026
69914e2
move method
msridhar Feb 14, 2026
5b2b3dd
refactoring and docs
msridhar Feb 14, 2026
93c4820
more cleanup
msridhar Feb 14, 2026
6ecb972
add a contract
msridhar Feb 14, 2026
d7e4772
remove incorrect comment in test
msridhar Feb 14, 2026
724e54c
tweak diagnostic message that is matched on
msridhar Feb 15, 2026
81f844f
Merge branch 'master' into method-ref-generic-inference
msridhar Feb 16, 2026
0fdd94d
review feedback
msridhar Feb 16, 2026
f952e8a
augment tests
msridhar Feb 16, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
refactoring and docs
  • Loading branch information
msridhar committed Feb 14, 2026
commit 5b2b3dd92116b4280fae82072a8abf465dc9f60c
71 changes: 55 additions & 16 deletions nullaway/src/main/java/com/uber/nullaway/NullAway.java
Original file line number Diff line number Diff line change
Expand Up @@ -959,6 +959,21 @@ private Description checkParamOverriding(
return Description.NO_MATCH;
}

/**
* Checks if the parameter of the overriding method is {@code @NonNull}
*
* @param paramSymbol the symbol for the parameter of the overriding method
* @param methodParamInd the index of the parameter in the method signature of the overriding
* method (adjusted for unbound member references)
* @param overridingMethod if available, the symbol for the overriding method
* @param isMethodAnnotated whether the overriding method is annotated
* @param memberReferenceTree if the overriding method is a member reference, the tree for the
* member reference; otherwise {@code null}
* @param memberReferenceMethodType if the overriding method is a member reference, the method
* type of the member reference after handling generics; otherwise {@code null}
* @return true if the parameter of the overriding method is effectively {@code @NonNull}, false
* otherwise
*/
private boolean paramOfOverridingMethodIsNonNull(
VarSymbol paramSymbol,
int methodParamInd,
Expand All @@ -979,23 +994,13 @@ private boolean paramOfOverridingMethodIsNonNull(
// of the member reference after handling generics
com.sun.tools.javac.util.List<Type> parameterTypes =
memberReferenceMethodType.getParameterTypes();
int memberRefParamIndex = methodParamInd;
if (memberReferenceTree != null
&& overridingMethod != null
&& overridingMethod.isVarArgs()
&& ((JCTree.JCMemberReference) memberReferenceTree).varargsElement != null) {
// With varargs adaptation, one or more functional-interface parameters can map to the
// varargs element type of the referenced method.
int varargsParamIndex = overridingMethod.getParameters().size() - 1;
if (methodParamInd >= varargsParamIndex) {
memberRefParamIndex = varargsParamIndex;
}
}
int memberRefParamIndex =
getMemberRefParamIndex(methodParamInd, overridingMethod, memberReferenceTree);
Type paramType = parameterTypes.get(memberRefParamIndex);
if (memberReferenceTree != null
&& overridingMethod != null
&& overridingMethod.isVarArgs()
&& ((JCTree.JCMemberReference) memberReferenceTree).varargsElement != null
// if we have a method reference to a varargs method where varargs are passed individually
// (not as an array), and this parameter is the varargs
// parameter, then we need to check the nullability of the varargs element type
if (memberRefToVarargsPassedIndividually(overridingMethod, memberReferenceTree)
&& methodParamInd >= overridingMethod.getParameters().size() - 1) {
Verify.verify(
paramType.getKind() == TypeKind.ARRAY,
Expand All @@ -1009,6 +1014,40 @@ private boolean paramOfOverridingMethodIsNonNull(
return result;
}

/**
* Checks if we have a member reference to a varargs method where the varargs are passed
* individually rather than as an array
*
* @param referencedMethod if available, the symbol for the referenced method
* @param memberReferenceTree the tree for the member reference
* @return true if we have a member reference to a varargs method where the varargs are passed
* individually
*/
private static boolean memberRefToVarargsPassedIndividually(
Symbol.@Nullable MethodSymbol referencedMethod,
@Nullable MemberReferenceTree memberReferenceTree) {
return memberReferenceTree != null
&& referencedMethod != null
&& referencedMethod.isVarArgs()
&& ((JCTree.JCMemberReference) memberReferenceTree).varargsElement != null;
}

private static int getMemberRefParamIndex(
int methodParamInd,
Symbol.@Nullable MethodSymbol overridingMethod,
@Nullable MemberReferenceTree memberReferenceTree) {
int memberRefParamIndex = methodParamInd;
if (memberRefToVarargsPassedIndividually(overridingMethod, memberReferenceTree)) {
// With varargs adaptation, one or more functional-interface parameters can map to the
// varargs element type of the referenced method.
int varargsParamIndex = overridingMethod.getParameters().size() - 1;
if (methodParamInd >= varargsParamIndex) {
memberRefParamIndex = varargsParamIndex;
}
}
return memberRefParamIndex;
}

static Trees getTreesInstance(VisitorState state) {
return Trees.instance(JavacProcessingEnvironment.instance(state.context));
}
Expand Down