code: function getSessionHints(query, cursor, type, token, $deferredHints) {
  
          var hintResults = session.getHints(query, getStringMatcher());
          if (hintResults.needGuesses) {
              var guessesResponse = ScopeManager.requestGuesses(session,
                  session.editor.document);
  
              if (!$deferredHints) {
                  $deferredHints = $.Deferred();
              }
  
              guessesResponse.done(function () {
                  if (hintsArePending($deferredHints)) {
                      hintResults = session.getHints(query, getStringMatcher());
                      setCachedHintContext(hintResults.hints, cursor, type, token);
                      var hintResponse = getHintResponse(cachedHints, query, type);
                      $deferredHints.resolveWith(null, [hintResponse]);
                  }
              }).fail(function () {
                  if (hintsArePending($deferredHints)) {
                      $deferredHints.reject();
                  }
              });
  
              return $deferredHints;
          } else if (hintsArePending($deferredHints)) {
              setCachedHintContext(hintResults.hints, cursor, type, token);
              var hintResponse    = getHintResponse(cachedHints, query, type);
              $deferredHints.resolveWith(null, [hintResponse]);
              return null;
          } else {
              setCachedHintContext(hintResults.hints, cursor, type, token);
              return getHintResponse(cachedHints, query, type);
          }
      }
docs: Common code to get the session hints. Will get guesses if there were
  no completions for the query.
  
  @param {string} query - user text to search hints with
  @param {{line:number, ch:number}} cursor - the location where the hints
  were created.
  @param {{property: boolean,
  showFunctionType:boolean,
  context: string,
  functionCallPos: {line:number, ch:number}}} type -
  type information about the hints
  @param {Object} token - CodeMirror token
  @param {jQuery.Deferred=} $deferredHints - existing Deferred we need to
  resolve (optional). If not supplied a new Deferred will be created if
  needed.
  @return {Object + jQuery.Deferred} - hint response (immediate or
  deferred) as defined by the CodeHintManager API