code: function registerHintProvider(providerInfo, languageIds, priority) {
          var providerObj = { provider: providerInfo,
                              priority: priority || 0 };
  
          if (languageIds.indexOf("all") !== -1) {
              // Ignore anything else in languageIds and just register for every language. This includes
              // the special "all" language since its key is in the hintProviders map from the beginning.
              var languageId;
              for (languageId in hintProviders) {
                  if (hintProviders.hasOwnProperty(languageId)) {
                      hintProviders[languageId].push(providerObj);
                      hintProviders[languageId].sort(_providerSort);
                  }
              }
          } else {
              languageIds.forEach(function (languageId) {
                  if (!hintProviders[languageId]) {
                      // Initialize provider list with any existing all-language providers
                      hintProviders[languageId] = Array.prototype.concat(hintProviders.all);
                  }
                  hintProviders[languageId].push(providerObj);
                  hintProviders[languageId].sort(_providerSort);
              });
          }
      }
docs: The method by which a CodeHintProvider registers its willingness to
  providing hints for editors in a given language.
  
  @param {!CodeHintProvider} provider
  The hint provider to be registered, described below.
  
  @param {!Array.<string>} languageIds
  The set of language ids for which the provider is capable of
  providing hints. If the special language id name "all" is included then
  the provider may be called for any language.
  
  @param {?number} priority
  Used to break ties among hint providers for a particular language.
  Providers with a higher number will be asked for hints before those
  with a lower priority value. Defaults to zero.