code: private boolean isSafeValue(Scope scope, Node argument) {
      if (NodeUtil.isSomeCompileTimeConstStringValue(argument)) {
        return true;
      } else if (argument.isAdd()) {
        Node left = argument.getFirstChild();
        Node right = argument.getLastChild();
        return isSafeValue(scope, left) && isSafeValue(scope, right);
      } else if (argument.isName()) {
        String name = argument.getString();
        Var var = scope.getVar(name);
        if (var == null || !var.isInferredConst()) {
          return false;
        }
        Node initialValue = var.getInitialValue();
        if (initialValue == null) {
          return false;
        }
        return isSafeValue(var.getScope(), initialValue);
      }
      return false;
    }
docs: Checks if the method call argument is made of constant string literals.
  
  <p>This function argument checker will return true if:
  
  <ol>
  <li>The argument is a constant variable assigned from a string literal, or
  <li>The argument is an expression that is a string literal, or
  <li>The argument is a ternary expression choosing between string literals, or
  <li>The argument is a concatenation of the above.
  </ol>
  
  @param scope The scope chain to use in name lookups.
  @param argument The node of function argument to check.