ExpansionProvider Class

ExpansionProvider Class


Provides support for inserting code snippets into source code.

Namespace:   Microsoft.VisualStudio.Package
Assembly:  Microsoft.VisualStudio.Package.LanguageService.14.0 (in Microsoft.VisualStudio.Package.LanguageService.14.0.dll)


public class ExpansionProvider : IDisposable, IVsExpansionClient


Initializes a new instance of the ExpansionProvider class.


Returns the IVsExpansion object used for inserting snippets into a buffer.


Returns the expansion session created to manage editing the code snippet.


Indicates whether the code snippet is currently being edited.


Returns the Source object associated with this expansion provider.


Returns the text view containing the source file being manipulated by the expansion provider.

System_CAPS_pubmethodBeginTemplateEditing(Int32, Int32)

Inserts the previously prepared code snippet and starts the snippet editing mode.

System_CAPS_pubmethodDisplayExpansionBrowser(IVsTextView, String, String[], Boolean, String[], Boolean)

Displays a list of expansion templates of the specified type and kind.


Cleans up allocated resource just before the ExpansionProvider object is destroyed.


Called when an expansion session has ended.


Ends the current snippet editing mode.


(Inherited from Object.)


Cleans up all resources just before the ExpansionProvider object is destroyed.(Overrides Object.Finalize().)

System_CAPS_pubmethodFindExpansionByShortcut(IVsTextView, String, TextSpan, Boolean, String, String)

Obtains the path and title of a code snippet given the snippet's shortcut name.

System_CAPS_pubmethodFormatSpan(IVsTextLines, TextSpan[])

Formats the specified text span.

System_CAPS_pubmethodGetExpansionFunction(IXMLDOMNode, String, IVsExpansionFunction)

Returns a IVsExpansionFunction object representing the expansion function described in the given XML template node (COM implementation).

System_CAPS_pubmethodGetExpansionFunction(XmlElement, String)

Returns an IVsExpansionFunction object representing the expansion function described in the given XML template node.


Returns the span occupied by the snippet currently being edited.

System_CAPS_pubmethodGetFieldSpan(String, TextSpan)

Gets the field span of the specified field

System_CAPS_pubmethodGetFieldValue(String, String)

Returns the value of the specified field.


(Inherited from Object.)


(Inherited from Object.)

System_CAPS_pubmethodHandlePostExec(Guid, UInt32, UInt32, Boolean, IntPtr, IntPtr)

Called after a command has been executed.

System_CAPS_pubmethodHandlePreExec(Guid, UInt32, UInt32, IntPtr, IntPtr)

Called before a command is executed.

System_CAPS_pubmethodHandleQueryStatus(Guid, UInt32, Int32)

Determines if the specified command is handled by the ExpansionProvider class.

System_CAPS_pubmethodInsertNamedExpansion(IVsTextView, String, String, TextSpan, Boolean)

Inserts the specified snippet into the source at the given position.

System_CAPS_pubmethodInsertSpecificExpansion(IVsTextView, XmlElement, TextSpan, String)

Inserts the specific snippet into the source at the specified position.

System_CAPS_pubmethodIsValidKind(IVsTextLines, TextSpan[], String, Int32)

Determines 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.

System_CAPS_pubmethodIsValidType(IVsTextLines, TextSpan[], String[], Int32, Int32)

Determines 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.


(Inherited from Object.)


Called after a snippet has been inserted into the source.


Called just before the snippet has been inserted into the source.

System_CAPS_pubmethodOnItemChosen(String, String)

Called when an item is chosen in a snippet browser.

System_CAPS_pubmethodPositionCaretForEditing(IVsTextLines, TextSpan[])

Puts the caret in a position suitable for editing.

System_CAPS_pubmethodPrepareTemplate(String, String)

Prepares for insertion of the specified snippet.


(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.

Return to top
© 2016 Microsoft