code: private void traverseObjectDefinePropertiesCall(Node callNode, Scope scope) {
      // First child is Object.defineProperties or some equivalent of it.
      Node callee = callNode.getFirstChild();
      Node targetObject = callNode.getSecondChild();
      Node propertyDefinitions = targetObject.getNext();
  
      if ((targetObject.isName() || isNameDotPrototype(targetObject))
          && !NodeUtil.isExpressionResultUsed(callNode)) {
        // NOTE: Object.defineProperties() returns its first argument, so if its return value is used
        // that counts as a use of the targetObject.
        Node nameNode = targetObject.isName() ? targetObject : targetObject.getFirstChild();
        VarInfo varInfo = traverseNameNode(nameNode, scope);
        RemovableBuilder builder = new RemovableBuilder();
        // TODO(bradfordcsmith): Is it really necessary to traverse the callee
        // (aka. Object.defineProperties)?
        builder.addContinuation(new Continuation(callee, scope));
        if (NodeUtil.mayHaveSideEffects(propertyDefinitions, compiler)) {
          traverseNode(propertyDefinitions, scope);
        } else {
          builder.addContinuation(new Continuation(propertyDefinitions, scope));
        }
        varInfo.addRemovable(builder.buildClassSetupCall(callNode));
      } else {
        // TODO(bradfordcsmith): Is it really necessary to traverse the callee
        // (aka. Object.defineProperties)?
        traverseNode(callee, scope);
        traverseNode(targetObject, scope);
        traverseNode(propertyDefinitions, scope);
      }
    }
docs: Traverse `Object.defineProperties(someObject, propertyDefinitions);`.