Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Add support for methods taking literal constant args in Access Paths. (…
…#285) Consider the code below: ``` if (x.get(0) != null && x.get(0).foo() != null) { return x.get(0).foo().bar(); } ``` This code is safe, but NullAway would miss that before this change, due to `get(0)` taking an argument. We handle `foo()` (a zero-arguments method) just fine. This patch extends our support for method calls with only literal values (and boxed literal values) being passed as arguments. I don't see a case where this would add unsoundness that isn't present on the zero-args case.
- Loading branch information
1 parent
4a4b591
commit 0b9cdef
Showing
6 changed files
with
220 additions
and
25 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
67 changes: 67 additions & 0 deletions
67
nullaway/src/main/java/com/uber/nullaway/dataflow/AccessPathElement.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,67 @@ | ||
package com.uber.nullaway.dataflow; | ||
|
||
import com.google.common.collect.ImmutableList; | ||
import java.util.Arrays; | ||
import java.util.List; | ||
import javax.annotation.Nullable; | ||
import javax.lang.model.element.Element; | ||
|
||
/** | ||
* Represents a (non-root) element of an AccessPath. | ||
* | ||
* <p>This is just a java Element (field, method, etc) in the access-path chain (e.g. f or g() in | ||
* x.f.g()). Plus, optionally, a list of constant arguments, allowing access path elements for | ||
* method calls with constant values (e.g. h(3) or k("STR_KEY") in x.h(3).g().k("STR_KEY")). | ||
*/ | ||
public final class AccessPathElement { | ||
private final Element javaElement; | ||
@Nullable private final ImmutableList<String> constantArguments; | ||
|
||
public AccessPathElement(Element javaElement, List<String> constantArguments) { | ||
this.javaElement = javaElement; | ||
this.constantArguments = ImmutableList.copyOf(constantArguments); | ||
} | ||
|
||
public AccessPathElement(Element javaElement) { | ||
this.javaElement = javaElement; | ||
this.constantArguments = null; | ||
} | ||
|
||
public Element getJavaElement() { | ||
return this.javaElement; | ||
} | ||
|
||
public ImmutableList<String> getConstantArguments() { | ||
return this.constantArguments; | ||
} | ||
|
||
@Override | ||
public boolean equals(Object obj) { | ||
if (obj instanceof AccessPathElement) { | ||
AccessPathElement otherNode = (AccessPathElement) obj; | ||
return this.javaElement.equals(otherNode.javaElement) | ||
&& (constantArguments == null | ||
? otherNode.constantArguments == null | ||
: constantArguments.equals(otherNode.constantArguments)); | ||
} else { | ||
return false; | ||
} | ||
} | ||
|
||
@Override | ||
public int hashCode() { | ||
int result = javaElement.hashCode(); | ||
result = 31 * result + (constantArguments != null ? constantArguments.hashCode() : 0); | ||
return result; | ||
} | ||
|
||
@Override | ||
public String toString() { | ||
return "APElement{" | ||
+ "javaElement=" | ||
+ javaElement.toString() | ||
+ ", constantArguments=" | ||
+ Arrays.deepToString(constantArguments.toArray()) | ||
+ '}'; | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters