whole_func_string: function enteringString(cm, pos, ch) {
      var line = cm.getLine(pos.line);
      var token = cm.getTokenAt(pos);
      if (/\bstring2?\b/.test(token.type)) return false;
      var stream = new CodeMirror.StringStream(line.slice(0, pos.ch) + ch + line.slice(pos.ch), 4);
      stream.pos = stream.start = token.start;
      for (;;) {
        var type1 = cm.getMode().token(stream, token.state);
        if (stream.pos >= pos.ch + 1) return /\bstring2?\b/.test(type1);
        stream.start = stream.pos;
      }
    }
func_code_string: function enteringString(cm, pos, ch) {
      var line = cm.getLine(pos.line);
      var token = cm.getTokenAt(pos);
      if (/\bstring2?\b/.test(token.type)) return false;
      var stream = new CodeMirror.StringStream(line.slice(0, pos.ch) + ch + line.slice(pos.ch), 4);
      stream.pos = stream.start = token.start;
      for (;;) {
        var type1 = cm.getMode().token(stream, token.state);
        if (stream.pos >= pos.ch + 1) return /\bstring2?\b/.test(type1);
        stream.start = stream.pos;
      }
    }
func_documentation_string: Project the token type that will exists after the given char is typed, and use it to determine whether it would cause the start of a string token.