@Override
 public void endVisit(JsBinaryOperation expr, JsContext ctx) {
   if (expr.getOperator() != JsBinaryOperator.ASG
       || !(expr.getArg1() instanceof JsNameRef)
       || !(expr.getArg2() instanceof JsNameRef)) {
     return;
   }
   assignments.put(expr.getArg1().toString(), ((JsNameRef) expr.getArg2()).getName());
 }
Example #2
0
    @Override
    public void endVisit(JsBinaryOperation x, JsContext ctx) {
      // Look for the patern a.f = o.@C::m();
      if (!x.getOperator().isAssignment()) {
        return;
      }
      if (!(x.getArg1() instanceof JsNameRef) || !(x.getArg2() instanceof JsNameRef)) {
        return;
      }

      JsNameRef lhs = (JsNameRef) x.getArg1();
      JsNameRef rhs = (JsNameRef) x.getArg2();

      if (!rhs.isJsniReference() || !(jsniRefs.get(rhs.getIdent()) instanceof MethodBinding)) {
        // Not a reference to a JSNI method.
        return;
      }

      if (rhs.getQualifier() == null) {
        // Unqualified JSNI reference is OK.
        return;
      }

      if (lhs.getQualifier() == null) {
        // Assignment to unqualified variable is OK.
        return;
      }

      // Here we have a qualified JSNI method reference assigned to a field.
      JsniRef jsniRef = JsniRef.parse(rhs.getIdent());
      emitWarning(
          "unsafe",
          WARN_NOT_CAPTURING_QUALIFIER,
          x.getSourceInfo(),
          jsniRef,
          rhs.getQualifier().toSource());
    }
 private Node transform(JsBinaryOperation x) {
   JsBinaryOperator op = x.getOperator();
   Node n = new Node(getTokenForOp(op), transform(x.getArg1()), transform(x.getArg2()));
   return applySourceInfo(n, x);
 }