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);
            });
        }
    }
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.