Was this page helpful?
Your feedback about this content is important. Let us know what you think.
Additional feedback?
1500 characters remaining
ExpansionProvider Class

ExpansionProvider Class

Provides support for inserting code snippets into source code.

This API is not CLS-compliant. 


Namespace:  Microsoft.VisualStudio.Package
Assemblies:   Microsoft.VisualStudio.Package.LanguageService.10.0 (in Microsoft.VisualStudio.Package.LanguageService.10.0.dll)
  Microsoft.VisualStudio.Package.LanguageService.12.0 (in Microsoft.VisualStudio.Package.LanguageService.12.0.dll)
  Microsoft.VisualStudio.Package.LanguageService.11.0 (in Microsoft.VisualStudio.Package.LanguageService.11.0.dll)
  Microsoft.VisualStudio.Package.LanguageService.14.0 (in Microsoft.VisualStudio.Package.LanguageService.14.0.dll)

public class ExpansionProvider : IDisposable, 

The ExpansionProvider type exposes the following members.

Public methodExpansionProviderInitializes a new instance of the ExpansionProvider class.

Public propertyExpansionReturns the IVsExpansion object used for inserting snippets into a buffer.
Public propertyExpansionSessionReturns the expansion session created to manage editing the code snippet.
Public propertyInTemplateEditingModeIndicates whether the code snippet is currently being edited.
Public propertySourceReturns the Source object associated with this expansion provider.
Public propertyTextViewReturns the text view containing the source file being manipulated by the expansion provider.

Public methodBeginTemplateEditingInserts the previously prepared code snippet and starts the snippet editing mode.
Public methodDisplayExpansionBrowserDisplays a list of expansion templates of the specified type and kind.
Public methodDisposeCleans up allocated resource just before the ExpansionProvider object is destroyed.
Public methodEndExpansionCalled when an expansion session has ended.
Public methodEndTemplateEditingEnds the current snippet editing mode.
Public methodEqualsDetermines whether the specified object is equal to the current object. (Inherited from Object.)
Protected methodFinalizeCleans up all resources just before the ExpansionProvider object is destroyed. (Overrides Object.Finalize().)
Public methodFindExpansionByShortcutObtains the path and title of a code snippet given the snippet's shortcut name.
Public methodFormatSpanFormats the specified text span.
Public methodGetExpansionFunction(XmlElement, String)Returns an IVsExpansionFunction object representing the expansion function described in the given XML template node.
Public methodGetExpansionFunction(IXMLDOMNode, String, IVsExpansionFunction)Returns a IVsExpansionFunction object representing the expansion function described in the given XML template node (COM implementation).
Public methodGetExpansionSpanReturns the span occupied by the snippet currently being edited.
Public methodGetFieldSpanGets the field span of the specified field
Public methodGetFieldValueReturns the value of the specified field.
Public methodGetHashCodeServes as the default hash function. (Inherited from Object.)
Public methodGetTypeGets the Type of the current instance. (Inherited from Object.)
Public methodHandlePostExecCalled after a command has been executed.
Public methodHandlePreExecCalled before a command is executed.
Public methodHandleQueryStatusDetermines if the specified command is handled by the ExpansionProvider class.
Public methodInsertNamedExpansionInserts the specified snippet into the source at the given position.
Public methodInsertSpecificExpansionInserts the specific snippet into the source at the specified position.
Public methodIsValidKindDetermines whether this is valid text for expansion. This method should be overridden if you want to specify where in the source document the expansion can take place.
Public methodIsValidTypeDetermines whether or not a given type is valid for expansion purposes. This method should be overridden if you want to specify where in the source document the expansion can take place.
Protected methodMemberwiseCloneCreates a shallow copy of the current Object. (Inherited from Object.)
Public methodOnAfterInsertionCalled after a snippet has been inserted into the source.
Public methodOnBeforeInsertionCalled just before the snippet has been inserted into the source.
Public methodOnItemChosenCalled when an item is chosen in a snippet browser.
Public methodPositionCaretForEditingPuts the caret in a position suitable for editing.
Public methodPrepareTemplatePrepares for insertion of the specified snippet.
Public methodToStringReturns a string that represents the current object. (Inherited from Object.)

A code snippet is a template that is expanded into full code when the user inserts the snippet. When the snippet is first expanded, the Visual Studio core editor enters a special template editing mode where the snippet can be modified in place. That is, certain parts of the snippet are designated as fields, and these fields can easily be changed by the user before the snippet is committed to the editor's buffer. The fields are highlighted and can feature drop-down boxes offering choices to the user.

A snippet has a name to identify it and a template file containing the snippet itself. The template file contains XML tags indicating specific elements of the template, from the code to substitution fields to functions (known as expansion functions). See Code Snippets for more details on code snippets.

Notes to Implementers

The ExpansionProvider class provides all the support for selecting and inserting a code snippet into a source file. The base class provides all the basic functionality; however, if you want to support context-sensitive snippet insertion (that is, a snippet with the same name might behave differently depending on the context into which it is inserted), then you must derive a class from the ExpansionProvider class and override the IsValidType and IsValidKind methods to report the appropriate snippet type and kind that are allowed in a particular context. Be sure to override the CreateExpansionProvider method in your version of the LanguageService class to return your version of the ExpansionProvider class.

Notes to Callers

An instance of the ExpansionProvider class is returned from the CreateExpansionProvider method in the LanguageService class that is called from the GetExpansionProvider method in the Source class. The ViewFilter class calls its own GetExpansionProvider that in turn forwards the call to the GetExpansionProvider method in the Source class. The ViewFilter class calls the GetExpansionProvider method any time a command is executed to allow the ExpansionProvider class a chance to act.

Expansions are inserted in three ways:

  1. The code snippet browser,

  2. Selecting a snippet shortcut name from a completion list, or

  3. By typing a shortcut and entering a completion character such as a tab or space.

The following example shows one way to handle auto-expansion that is triggered by typing an expansion shortcut followed by the tab key. This method is called every time a tab key is typed.

using Microsoft.VisualStudio.Package;
using Microsoft.VisualStudio;

namespace MyLanguagePackage
    class MyViewFilter : ViewFilter
        // This is called from our HandlePreExec when a tab key is pressed
        bool HandleTabKey()
            ExpansionProvider ep = GetExpansionProvider();
            if (ep == null || ep.InTemplateEditingMode)
                // No expansion provider or already editing a template,
                // so nothing to do.
                return false;

            TokenInfo tokenInfo = Source.GetTokenInfo(TextView);
            if (tokenInfo.StartLine != tokenInfo.EndLine ||
                tokenInfo.StartIndex == tokenInfo.EndIndex)
                // No shortcut found before caret, so nothing to do.
                // Note that the above test does not allow for single
                // character tokens to be shortcut names.
                return false;

            int line;
            int col;
            int hr;
            hr = TextView.GetCaretPos(out line,out col);
            if (hr != VsConstants.S_OK)
                // Could not get current position, so nothing to do.
                // GetCaretPos is used in Source.GetTokenInfo so if
                // GetCaretPos fails, GetTokenInfo fails. However,
                // better to be thorough and test again here.
                return false;

            // Get shortcut text that was just typed.
            string shortcut = Source.GetText(line,
            if (shortcut == null || shortcut == "")
                // No text was found at the position. This failure is
                // is not likely if GetTokenInfo returned a valid token
                // but better to be thorough.
                return false;

            string snippetTitle;
            string snippetPath;
            TextSpan pos = new TextSpan();
            pos.iStartLine = line;
            pos.iStartIndex = tokenInfo.StartIndex;
            pos.iEndLine = line;
            pos.iEndIndex = tokenInfo.EndIndex;
            if (ep.FindExpansionByShortcut(TextView,
                                            out title,
                                            out path) != VSConstants.S_OK)
                // No snippet matched the shortcut, so nothing to do.
                return false;

            // If InsertNamedExpansion returns true, snippet was
            // inserted and therefore the Tab key was handled.
            // Otherwise, false is returned and the Tab key will be
            // passed on to someone else.
            return ep.InsertNamedExpansion(TextView,

Any public static (Shared in Visual Basic) members of this type are thread safe. Any instance members are not guaranteed to be thread safe.
© 2015 Microsoft