1 package com.uber.nullaway.dataflow; 2 3 import com.google.common.collect.ImmutableList; 4 import java.util.Arrays; 5 import java.util.List; 6 import javax.annotation.Nullable; 7 import javax.lang.model.element.Element; 8 9 /** 10 * Represents a (non-root) element of an AccessPath. 11 * 12 * <p>This is just a java Element (field, method, etc) in the access-path chain (e.g. f or g() in 13 * x.f.g()). Plus, optionally, a list of constant arguments, allowing access path elements for 14 * method calls with constant values (e.g. h(3) or k("STR_KEY") in x.h(3).g().k("STR_KEY")). 15 */ 16 public final class AccessPathElement { 17 private final Element javaElement; 18 @Nullable private final ImmutableList<String> constantArguments; 19 AccessPathElement(Element javaElement, List<String> constantArguments)20 public AccessPathElement(Element javaElement, List<String> constantArguments) { 21 this.javaElement = javaElement; 22 this.constantArguments = ImmutableList.copyOf(constantArguments); 23 } 24 AccessPathElement(Element javaElement)25 public AccessPathElement(Element javaElement) { 26 this.javaElement = javaElement; 27 this.constantArguments = null; 28 } 29 getJavaElement()30 public Element getJavaElement() { 31 return this.javaElement; 32 } 33 getConstantArguments()34 public ImmutableList<String> getConstantArguments() { 35 return this.constantArguments; 36 } 37 38 @Override equals(Object obj)39 public boolean equals(Object obj) { 40 if (obj instanceof AccessPathElement) { 41 AccessPathElement otherNode = (AccessPathElement) obj; 42 return this.javaElement.equals(otherNode.javaElement) 43 && (constantArguments == null 44 ? otherNode.constantArguments == null 45 : constantArguments.equals(otherNode.constantArguments)); 46 } else { 47 return false; 48 } 49 } 50 51 @Override hashCode()52 public int hashCode() { 53 int result = javaElement.hashCode(); 54 result = 31 * result + (constantArguments != null ? constantArguments.hashCode() : 0); 55 return result; 56 } 57 58 @Override toString()59 public String toString() { 60 return "APElement{" 61 + "javaElement=" 62 + javaElement.toString() 63 + ", constantArguments=" 64 + Arrays.deepToString(constantArguments != null ? constantArguments.toArray() : null) 65 + '}'; 66 } 67 } 68