private void visitInterfacePropertyAssignment(Node object, Node lvalue) {
    if (!lvalue.getParent().isAssign()) {
      // assignments to interface properties cannot be in destructuring patterns or for-of loops
      reportInvalidInterfaceMemberDeclaration(object);
      return;
    }
    Node assign = lvalue.getParent();
    Node rvalue = assign.getSecondChild();
    JSType rvalueType = getJSType(rvalue);

    // Only 2 values are allowed for interface methods:
    //    goog.abstractMethod
    //    function () {};
    // Other (non-method) interface properties must be stub declarations without assignments, e.g.
    //     someinterface.prototype.nonMethodProperty;
    // which is why we enforce that `rvalueType.isFunctionType()`.
    if (!rvalueType.isFunctionType()) {
      reportInvalidInterfaceMemberDeclaration(object);
    }

    if (rvalue.isFunction() && !NodeUtil.isEmptyBlock(NodeUtil.getFunctionBody(rvalue))) {
      String abstractMethodName = compiler.getCodingConvention().getAbstractMethodName();
      compiler.report(JSError.make(object, INTERFACE_METHOD_NOT_EMPTY, abstractMethodName));
    }
  }
private void visitInterfacePropertyAssignment ( Node object , Node lvalue ) { if ( ! lvalue . getParent ( ) . isAssign ( ) ) { reportInvalidInterfaceMemberDeclaration ( object ) ; return ; } Node assign = lvalue . getParent ( ) ; Node rvalue = assign . getSecondChild ( ) ; JSType rvalueType = getJSType ( rvalue ) ; if ( ! rvalueType . isFunctionType ( ) ) { reportInvalidInterfaceMemberDeclaration ( object ) ; } if ( rvalue . isFunction ( ) && ! NodeUtil . isEmptyBlock ( NodeUtil . getFunctionBody ( rvalue ) ) ) { String abstractMethodName = compiler . getCodingConvention ( ) . getAbstractMethodName ( ) ; compiler . report ( JSError . make ( object , INTERFACE_METHOD_NOT_EMPTY , abstractMethodName ) ) ; } }
Visits an lvalue node for cases such as

<pre>
interface.prototype.property = ...;
</pre>