public void findValues()

in nullaway/src/main/java/com/uber/nullaway/fixserialization/out/ClassAndMemberInfo.java [67:126]


  public void findValues() {
    if (this.member != null || path == null) {
      // Values are already computed.
      return;
    }
    MethodTree enclosingMethod;
    // If the error is reported on a method, that method itself is the relevant program point.
    // Otherwise, use the enclosing method (if present).
    enclosingMethod =
        path.getLeaf() instanceof MethodTree
            ? (MethodTree) path.getLeaf()
            : ASTHelpers.findEnclosingNode(path, MethodTree.class);
    // If the error is reported on a class, that class itself is the relevant program point.
    // Otherwise, use the enclosing class.
    ClassTree classTree =
        path.getLeaf() instanceof ClassTree
            ? (ClassTree) path.getLeaf()
            : ASTHelpers.findEnclosingNode(path, ClassTree.class);
    if (classTree != null) {
      clazz = ASTHelpers.getSymbol(classTree);
      if (enclosingMethod != null) {
        // It is possible that the computed method is not enclosed by the computed class, e.g., for
        // the following case:
        //  class C {
        //    void foo() {
        //      class Local {
        //        Object f = null; // error
        //      }
        //    }
        //  }
        // Here the above code will compute clazz to be Local and method as foo().  In such cases,
        // set method to null, we always want the corresponding method to be nested in the
        // corresponding class.
        Symbol.MethodSymbol methodSymbol = ASTHelpers.getSymbol(enclosingMethod);
        if (!methodSymbol.isEnclosedBy(clazz)) {
          enclosingMethod = null;
        }
      }
      if (enclosingMethod != null) {
        member = ASTHelpers.getSymbol(enclosingMethod);
      } else {
        // Node is not enclosed by any method, can be a field declaration or enclosed by it.
        Symbol sym = ASTHelpers.getSymbol(path.getLeaf());
        Symbol.VarSymbol fieldSymbol = null;
        if (sym != null && sym.getKind().isField() && sym.isEnclosedBy(clazz)) {
          // Directly on a field declaration.
          fieldSymbol = (Symbol.VarSymbol) sym;
        } else {
          // Can be enclosed by a field declaration tree.
          VariableTree fieldDeclTree = ASTHelpers.findEnclosingNode(path, VariableTree.class);
          if (fieldDeclTree != null) {
            fieldSymbol = ASTHelpers.getSymbol(fieldDeclTree);
          }
        }
        if (fieldSymbol != null && fieldSymbol.isEnclosedBy(clazz)) {
          member = fieldSymbol;
        }
      }
    }
  }