code: private void extractMessageFromVariable(
        Builder builder, Node nameNode, Node parentNode,
        @Nullable Node grandParentNode) throws MalformedException {
  
      // Determine the message's value
      Node valueNode = nameNode.getFirstChild();
      switch (valueNode.getToken()) {
        case STRING:
        case ADD:
          maybeInitMetaDataFromJsDocOrHelpVar(builder, parentNode,
              grandParentNode);
          builder.appendStringPart(extractStringFromStringExprNode(valueNode));
          break;
        case FUNCTION:
          maybeInitMetaDataFromJsDocOrHelpVar(builder, parentNode,
              grandParentNode);
          extractFromFunctionNode(builder, valueNode);
          break;
        case CALL:
          maybeInitMetaDataFromJsDoc(builder, parentNode);
          extractFromCallNode(builder, valueNode);
          break;
        default:
          throw new MalformedException("Cannot parse value of message "
              + builder.getKey(), valueNode);
      }
    }
docs: Creates a {@link JsMessage} for a JS message defined using a JS variable
  declaration (e.g <code>var MSG_X = ...;</code>).
  
  @param builder the message builder
  @param nameNode a NAME node for a JS message variable
  @param parentNode a VAR node, parent of {@code nameNode}
  @param grandParentNode the grandparent of {@code nameNode}. This node is
  only used to get meta data about the message that might be
  surrounding it (e.g. a message description). This argument may be
  null if the meta data is not needed.
  @throws MalformedException if {@code varNode} does not
  correspond to a valid JS message VAR node