ReSharper DevGuide

Edit page

Implementing IQuickDocProvider

The IQuickDocProvider interface provides two methods:

public interface IQuickDocProvider { bool CanNavigate(IDataContext context); void Resolve(IDataContext context, Action<IQuickDocPresenter, PsiLanguageType> resolved); }

CanNavigate is called to see if the provider can generate documentation based on the given IDataContext. If it returns true, no other providers are checked. If it returns false, the QuickDocManager continues to other providers.

The provider queries the passed in IDataContext to find data that it needs to provide documentation. This might be using DataConstants.DOCUMENT and DataConstants.DOCUMENT_OFFSET to get the current document and offset, in order to get the PSI tree node at the text caret location, or it might be using DataConstants.DECLARED_ELEMENTS to get the IDeclaredElement at the text caret. The requirements here depend on what the provider wants to document. (See IDataContext for more details.)

Resolve is called by the QuickDocManager when initially displaying the documentation (the name makes more sense when dealing with navigation from one presenter to another). The IDataContext is passed in, from which the provider should extract whatever data is required in order to be able to display documentation, and this data is used to create an instance of IQuickDocPresenter. The provider then retrieves the PsiLanguageType of the item being documented, and calls the passed in resolved action. (This action, provided by ShowQuickDocAction, is responsible for creating and managing the popup window and the web browser used to host the HTML).

You need to decorate your IQuickDocProvider class with QuickDocProviderAttribute, and pass a priority into the constructor. The list of providers maintained by QuickDocManager is an ordered list, with the lowest priority being at the start of the list (any new items being added to the QuickDocManager’s IViewable<IQuickDocProvider> are inserted in the correct position in the list). The majority of the default providers have a priority of 0. You only need to provide a higher or lower priority if the items you’re intending to document are also handled by the default providers, and you wish to override or provide a fallback.

public class QuickDocProviderAttribute : SolutionComponentAttribute { public QuickDocProviderAttribute(int priority); public int Priority { get; } }
Last modified: 10 July 2017