whole_func_string: function(msgId, pos) {
        msgId = "qx.tool.compiler." + msgId;
        
        // Give each marker a unique key based on msgId and the line; use this to suppress
        //  multiple markers
        let key = msgId + "#";
        if (pos) {
          if (pos.line) {
            key += pos.line; 
          } else if (pos.start && pos.start.line) {
            key += pos.start.line;
          }
        }
        if (this.__haveMarkersFor[key]) {
          return; 
        }
        this.__haveMarkersFor[key] = true;
        
        let marker = {
          msgId: msgId
        };
        
        // Extract position
        if (pos) {
          if (pos.line) {
            pos = { start: pos };
          }
          if (pos.start) {
            let tmp = { line: pos.start.line };
            if (pos.start.column) {
              tmp.column = pos.start.column;
            }
            marker.pos = { start: tmp };
            if (pos.end && pos.end.line) {
              let tmp = { line: pos.end.line };
              if (pos.end.column) {
                tmp.column = pos.end.column; 
              }
              marker.pos.end = tmp;
            }
          }
        }
        let args = qx.lang.Array.fromArguments(arguments, 2);
        if (args.length) {
          marker.args = args; 
        }
        this.__markers.push(marker);
      }
func_code_string: function(msgId, pos) {
        msgId = "qx.tool.compiler." + msgId;
        
        // Give each marker a unique key based on msgId and the line; use this to suppress
        //  multiple markers
        let key = msgId + "#";
        if (pos) {
          if (pos.line) {
            key += pos.line; 
          } else if (pos.start && pos.start.line) {
            key += pos.start.line;
          }
        }
        if (this.__haveMarkersFor[key]) {
          return; 
        }
        this.__haveMarkersFor[key] = true;
        
        let marker = {
          msgId: msgId
        };
        
        // Extract position
        if (pos) {
          if (pos.line) {
            pos = { start: pos };
          }
          if (pos.start) {
            let tmp = { line: pos.start.line };
            if (pos.start.column) {
              tmp.column = pos.start.column;
            }
            marker.pos = { start: tmp };
            if (pos.end && pos.end.line) {
              let tmp = { line: pos.end.line };
              if (pos.end.column) {
                tmp.column = pos.end.column; 
              }
              marker.pos.end = tmp;
            }
          }
        }
        let args = qx.lang.Array.fromArguments(arguments, 2);
        if (args.length) {
          marker.args = args; 
        }
        this.__markers.push(marker);
      }
func_documentation_string: Adds a marker (eg warning or error)
  
  @param msgId {String} the marker message ID (@see qx.tool.compiler.Marker)
  @param pos {Object||null} position map; may contain a Map containing
  {line,column?}, or a Map {start:{line,column}, end: {line,column}}.
  @param arguments? {Object...} variable argument list, specific to the msgId