Adds a VSPackage project that builds a VS extension to run clang-format over a selection / the line at the cursor.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@189955 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/tools/clang-format-vs/ClangFormat.sln b/tools/clang-format-vs/ClangFormat.sln
new file mode 100644
index 0000000..d6b211f
--- /dev/null
+++ b/tools/clang-format-vs/ClangFormat.sln
@@ -0,0 +1,20 @@
+

+Microsoft Visual Studio Solution File, Format Version 12.00

+# Visual Studio 2012

+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ClangFormat", "ClangFormat\ClangFormat.csproj", "{7FD1783E-2D31-4D05-BF23-6EBE1B42B608}"

+EndProject

+Global

+	GlobalSection(SolutionConfigurationPlatforms) = preSolution

+		Debug|Any CPU = Debug|Any CPU

+		Release|Any CPU = Release|Any CPU

+	EndGlobalSection

+	GlobalSection(ProjectConfigurationPlatforms) = postSolution

+		{7FD1783E-2D31-4D05-BF23-6EBE1B42B608}.Debug|Any CPU.ActiveCfg = Debug|Any CPU

+		{7FD1783E-2D31-4D05-BF23-6EBE1B42B608}.Debug|Any CPU.Build.0 = Debug|Any CPU

+		{7FD1783E-2D31-4D05-BF23-6EBE1B42B608}.Release|Any CPU.ActiveCfg = Release|Any CPU

+		{7FD1783E-2D31-4D05-BF23-6EBE1B42B608}.Release|Any CPU.Build.0 = Release|Any CPU

+	EndGlobalSection

+	GlobalSection(SolutionProperties) = preSolution

+		HideSolutionNode = FALSE

+	EndGlobalSection

+EndGlobal

diff --git a/tools/clang-format-vs/ClangFormat/ClangFormat.csproj b/tools/clang-format-vs/ClangFormat/ClangFormat.csproj
new file mode 100644
index 0000000..51e1382
--- /dev/null
+++ b/tools/clang-format-vs/ClangFormat/ClangFormat.csproj
@@ -0,0 +1,190 @@
+<?xml version="1.0" encoding="utf-8"?>

+<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="4.0">

+  <PropertyGroup>

+    <MinimumVisualStudioVersion>11.0</MinimumVisualStudioVersion>

+    <VisualStudioVersion Condition="'$(VisualStudioVersion)' == ''">11.0</VisualStudioVersion>

+    <VSToolsPath Condition="'$(VSToolsPath)' == ''">$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)</VSToolsPath>

+  </PropertyGroup>

+  <PropertyGroup>

+    <DelaySign>false</DelaySign>

+  </PropertyGroup>

+  <Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />

+  <PropertyGroup>

+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>

+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>

+    <SchemaVersion>2.0</SchemaVersion>

+    <ProjectGuid>{7FD1783E-2D31-4D05-BF23-6EBE1B42B608}</ProjectGuid>

+    <ProjectTypeGuids>{82b43b9b-a64c-4715-b499-d71e9ca2bd60};{60dc8134-eba5-43b8-bcc9-bb4bc16c2548};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>

+    <OutputType>Library</OutputType>

+    <AppDesignerFolder>Properties</AppDesignerFolder>

+    <RootNamespace>LLVM.ClangFormat</RootNamespace>

+    <AssemblyName>ClangFormat</AssemblyName>

+    <SignAssembly>true</SignAssembly>

+    <AssemblyOriginatorKeyFile>Key.snk</AssemblyOriginatorKeyFile>

+    <TargetFrameworkVersion>v4.5</TargetFrameworkVersion>

+  </PropertyGroup>

+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">

+    <DebugSymbols>true</DebugSymbols>

+    <DebugType>full</DebugType>

+    <Optimize>false</Optimize>

+    <OutputPath>bin\Debug\</OutputPath>

+    <DefineConstants>DEBUG;TRACE</DefineConstants>

+    <ErrorReport>prompt</ErrorReport>

+    <WarningLevel>4</WarningLevel>

+    <CodeAnalysisIgnoreGeneratedCode>false</CodeAnalysisIgnoreGeneratedCode>

+    <RunCodeAnalysis>false</RunCodeAnalysis>

+  </PropertyGroup>

+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">

+    <DebugType>pdbonly</DebugType>

+    <Optimize>true</Optimize>

+    <OutputPath>bin\Release\</OutputPath>

+    <DefineConstants>TRACE</DefineConstants>

+    <ErrorReport>prompt</ErrorReport>

+    <WarningLevel>4</WarningLevel>

+    <RunCodeAnalysis>true</RunCodeAnalysis>

+  </PropertyGroup>

+  <ItemGroup>

+    <Reference Include="Microsoft.CSharp" />

+    <Reference Include="Microsoft.VisualStudio.CoreUtility, Version=11.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL" />

+    <Reference Include="Microsoft.VisualStudio.Editor, Version=11.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL" />

+    <Reference Include="Microsoft.VisualStudio.OLE.Interop" />

+    <Reference Include="Microsoft.VisualStudio.Shell.Interop" />

+    <Reference Include="Microsoft.VisualStudio.Shell.Interop.8.0" />

+    <Reference Include="Microsoft.VisualStudio.Shell.Interop.9.0" />

+    <Reference Include="Microsoft.VisualStudio.Shell.Interop.10.0" />

+    <Reference Include="Microsoft.VisualStudio.Shell.Interop.11.0">

+      <EmbedInteropTypes>true</EmbedInteropTypes>

+    </Reference>

+    <Reference Include="Microsoft.VisualStudio.Text.Data, Version=11.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL" />

+    <Reference Include="Microsoft.VisualStudio.Text.Logic, Version=11.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL" />

+    <Reference Include="Microsoft.VisualStudio.Text.UI, Version=11.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL" />

+    <Reference Include="Microsoft.VisualStudio.Text.UI.Wpf, Version=11.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL" />

+    <Reference Include="Microsoft.VisualStudio.TextManager.Interop" />

+    <Reference Include="Microsoft.VisualStudio.Shell.11.0" />

+    <Reference Include="Microsoft.VisualStudio.Shell.Immutable.10.0" />

+    <Reference Include="Microsoft.VisualStudio.Shell.Immutable.11.0" />

+    <Reference Include="System" />

+    <Reference Include="System.Core" />

+    <Reference Include="System.Data" />

+    <Reference Include="System.Design" />

+    <Reference Include="System.Drawing" />

+    <Reference Include="System.Windows.Forms" />

+    <Reference Include="System.Xml" />

+    <Reference Include="System.Xml.Linq" />

+  </ItemGroup>

+  <ItemGroup>

+    <COMReference Include="EnvDTE">

+      <Guid>{80CC9F66-E7D8-4DDD-85B6-D9E6CD0E93E2}</Guid>

+      <VersionMajor>8</VersionMajor>

+      <VersionMinor>0</VersionMinor>

+      <Lcid>0</Lcid>

+      <WrapperTool>primary</WrapperTool>

+      <Isolated>False</Isolated>

+      <EmbedInteropTypes>False</EmbedInteropTypes>

+    </COMReference>

+    <COMReference Include="EnvDTE100">

+      <Guid>{26AD1324-4B7C-44BC-84F8-B86AED45729F}</Guid>

+      <VersionMajor>10</VersionMajor>

+      <VersionMinor>0</VersionMinor>

+      <Lcid>0</Lcid>

+      <WrapperTool>primary</WrapperTool>

+      <Isolated>False</Isolated>

+      <EmbedInteropTypes>False</EmbedInteropTypes>

+    </COMReference>

+    <COMReference Include="EnvDTE80">

+      <Guid>{1A31287A-4D7D-413E-8E32-3B374931BD89}</Guid>

+      <VersionMajor>8</VersionMajor>

+      <VersionMinor>0</VersionMinor>

+      <Lcid>0</Lcid>

+      <WrapperTool>primary</WrapperTool>

+      <Isolated>False</Isolated>

+      <EmbedInteropTypes>False</EmbedInteropTypes>

+    </COMReference>

+    <COMReference Include="EnvDTE90">

+      <Guid>{2CE2370E-D744-4936-A090-3FFFE667B0E1}</Guid>

+      <VersionMajor>9</VersionMajor>

+      <VersionMinor>0</VersionMinor>

+      <Lcid>0</Lcid>

+      <WrapperTool>primary</WrapperTool>

+      <Isolated>False</Isolated>

+      <EmbedInteropTypes>False</EmbedInteropTypes>

+    </COMReference>

+    <COMReference Include="Microsoft.VisualStudio.CommandBars">

+      <Guid>{1CBA492E-7263-47BB-87FE-639000619B15}</Guid>

+      <VersionMajor>8</VersionMajor>

+      <VersionMinor>0</VersionMinor>

+      <Lcid>0</Lcid>

+      <WrapperTool>primary</WrapperTool>

+      <Isolated>False</Isolated>

+      <EmbedInteropTypes>False</EmbedInteropTypes>

+    </COMReference>

+    <COMReference Include="stdole">

+      <Guid>{00020430-0000-0000-C000-000000000046}</Guid>

+      <VersionMajor>2</VersionMajor>

+      <VersionMinor>0</VersionMinor>

+      <Lcid>0</Lcid>

+      <WrapperTool>primary</WrapperTool>

+      <Isolated>False</Isolated>

+      <EmbedInteropTypes>False</EmbedInteropTypes>

+    </COMReference>

+  </ItemGroup>

+  <ItemGroup>

+    <Compile Include="Guids.cs" />

+    <Compile Include="Resources.Designer.cs">

+      <AutoGen>True</AutoGen>

+      <DesignTime>True</DesignTime>

+      <DependentUpon>Resources.resx</DependentUpon>

+    </Compile>

+    <Compile Include="GlobalSuppressions.cs" />

+    <Compile Include="ClangFormatPackage.cs">

+      <SubType>Component</SubType>

+    </Compile>

+    <Compile Include="Properties\AssemblyInfo.cs" />

+    <Compile Include="PkgCmdID.cs" />

+  </ItemGroup>

+  <ItemGroup>

+    <EmbeddedResource Include="Resources.resx">

+      <Generator>ResXFileCodeGenerator</Generator>

+      <LastGenOutput>Resources.Designer.cs</LastGenOutput>

+      <SubType>Designer</SubType>

+    </EmbeddedResource>

+    <EmbeddedResource Include="VSPackage.resx">

+      <MergeWithCTO>true</MergeWithCTO>

+      <ManifestResourceName>VSPackage</ManifestResourceName>

+    </EmbeddedResource>

+  </ItemGroup>

+  <ItemGroup>

+    <None Include="Key.snk" />

+    <None Include="source.extension.vsixmanifest">

+      <SubType>Designer</SubType>

+    </None>

+  </ItemGroup>

+  <ItemGroup>

+    <VSCTCompile Include="ClangFormat.vsct">

+      <ResourceName>Menus.ctmenu</ResourceName>

+    </VSCTCompile>

+  </ItemGroup>

+  <ItemGroup>

+    <None Include="Resources\Images.png" />

+  </ItemGroup>

+  <ItemGroup>

+    <Content Include="Resources\Package.ico" />

+  </ItemGroup>

+  <PropertyGroup>

+    <UseCodebase>true</UseCodebase>

+  </PropertyGroup>

+  <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />

+  <Import Project="$(VSToolsPath)\VSSDK\Microsoft.VsSDK.targets" Condition="'$(VSToolsPath)' != ''" />

+  <PropertyGroup>

+    <PreBuildEvent>if not exist $(ProjectDir)Key.snk (

+  "$(FrameworkSDKDir)Bin\NETFX 4.0 Tools\sn.exe" -k $(ProjectDir)Key.snk

+)</PreBuildEvent>

+  </PropertyGroup>

+  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 

+       Other similar extension points exist, see Microsoft.Common.targets.

+  <Target Name="BeforeBuild">

+  </Target>

+  <Target Name="AfterBuild">

+  </Target>

+  -->

+</Project>
\ No newline at end of file
diff --git a/tools/clang-format-vs/ClangFormat/ClangFormat.vsct b/tools/clang-format-vs/ClangFormat/ClangFormat.vsct
new file mode 100644
index 0000000..9037ecd
--- /dev/null
+++ b/tools/clang-format-vs/ClangFormat/ClangFormat.vsct
@@ -0,0 +1,119 @@
+<?xml version="1.0" encoding="utf-8"?>

+<CommandTable xmlns="http://schemas.microsoft.com/VisualStudio/2005-10-18/CommandTable" xmlns:xs="http://www.w3.org/2001/XMLSchema">

+

+  <!--  This is the file that defines the actual layout and type of the commands.

+        It is divided in different sections (e.g. command definition, command

+        placement, ...), with each defining a specific set of properties.

+        See the comment before each section for more details about how to

+        use it. -->

+

+  <!--  The VSCT compiler (the tool that translates this file into the binary 

+        format that VisualStudio will consume) has the ability to run a preprocessor 

+        on the vsct file; this preprocessor is (usually) the C++ preprocessor, so 

+        it is possible to define includes and macros with the same syntax used 

+        in C++ files. Using this ability of the compiler here, we include some files 

+        defining some of the constants that we will use inside the file. -->

+

+  <!--This is the file that defines the IDs for all the commands exposed by VisualStudio. -->

+  <Extern href="stdidcmd.h"/>

+

+  <!--This header contains the command ids for the menus provided by the shell. -->

+  <Extern href="vsshlids.h"/>

+

+

+

+

+  <!--The Commands section is where we the commands, menus and menu groups are defined.

+      This section uses a Guid to identify the package that provides the command defined inside it. -->

+  <Commands package="guidClangFormatPkg">

+    <!-- Inside this section we have different sub-sections: one for the menus, another  

+    for the menu groups, one for the buttons (the actual commands), one for the combos 

+    and the last one for the bitmaps used. Each element is identified by a command id that  

+    is a unique pair of guid and numeric identifier; the guid part of the identifier is usually  

+    called "command set" and is used to group different command inside a logically related  

+    group; your package should define its own command set in order to avoid collisions  

+    with command ids defined by other packages. -->

+

+    

+    <!-- In this section you can define new menu groups. A menu group is a container for 

+         other menus or buttons (commands); from a visual point of view you can see the 

+         group as the part of a menu contained between two lines. The parent of a group 

+         must be a menu. -->

+    <Groups>

+

+      <Group guid="guidClangFormatCmdSet" id="MyMenuGroup" priority="0x0600">

+        <Parent guid="guidSHLMainMenu" id="IDM_VS_MENU_TOOLS"/>

+      </Group>

+      

+

+

+    </Groups>

+    

+    <!--Buttons section. -->

+    <!--This section defines the elements the user can interact with, like a menu command or a button 

+        or combo box in a toolbar. -->

+    <Buttons>

+      <!--To define a menu group you have to specify its ID, the parent menu and its display priority. 

+          The command is visible and enabled by default. If you need to change the visibility, status, etc, you can use

+          the CommandFlag node.

+          You can add more than one CommandFlag node e.g.:

+              <CommandFlag>DefaultInvisible</CommandFlag>

+              <CommandFlag>DynamicVisibility</CommandFlag>

+          If you do not want an image next to your command, remove the Icon node /> -->

+

+      <Button guid="guidClangFormatCmdSet" id="cmdidClangFormat" priority="0x0100" type="Button">

+        <Parent guid="guidClangFormatCmdSet" id="MyMenuGroup" />

+        <Icon guid="guidImages" id="bmpPic1" />

+        <Strings>

+          <ButtonText>ClangFormat</ButtonText>

+        </Strings>

+      </Button>

+

+

+

+    </Buttons>

+   

+    <!--The bitmaps section is used to define the bitmaps that are used for the commands.-->

+    <Bitmaps>

+      <!--  The bitmap id is defined in a way that is a little bit different from the others: 

+            the declaration starts with a guid for the bitmap strip, then there is the resource id of the 

+            bitmap strip containing the bitmaps and then there are the numeric ids of the elements used 

+            inside a button definition. An important aspect of this declaration is that the element id 

+            must be the actual index (1-based) of the bitmap inside the bitmap strip. -->

+      <Bitmap guid="guidImages" href="Resources\Images.png" usedList="bmpPic1, bmpPic2, bmpPicSearch, bmpPicX, bmpPicArrows"/>

+      

+    </Bitmaps>

+ 

+  </Commands>

+

+

+  <KeyBindings>

+    <KeyBinding guid="guidClangFormatCmdSet" id="cmdidClangFormat" editor="guidVSStd97" key1="R" mod1="Control" key2="F" mod2="Control"/>

+  </KeyBindings>

+

+

+

+  <Symbols>

+    <!-- This is the package guid. -->

+    <GuidSymbol name="guidClangFormatPkg" value="{c5286038-25d3-4f65-83a8-51fa2df4a146}" />

+    

+    <!-- This is the guid used to group the menu commands together -->

+    <GuidSymbol name="guidClangFormatCmdSet" value="{e39cbab1-0f96-4022-a2bc-da5a9db7eb78}">

+

+      <IDSymbol name="MyMenuGroup" value="0x1020" />

+      <IDSymbol name="cmdidClangFormat" value="0x0100" />

+    </GuidSymbol>

+    

+    

+    

+    <GuidSymbol name="guidImages" value="{6d53937b-9ae1-42e1-8849-d876dcdbad7b}" >

+      <IDSymbol name="bmpPic1" value="1" />

+      <IDSymbol name="bmpPic2" value="2" />

+      <IDSymbol name="bmpPicSearch" value="3" />

+      <IDSymbol name="bmpPicX" value="4" />

+      <IDSymbol name="bmpPicArrows" value="5" />

+      <IDSymbol name="bmpPicStrikethrough" value="6" />

+    </GuidSymbol>

+  </Symbols>

+

+</CommandTable>

diff --git a/tools/clang-format-vs/ClangFormat/ClangFormatPackage.cs b/tools/clang-format-vs/ClangFormat/ClangFormatPackage.cs
new file mode 100644
index 0000000..61cc644
--- /dev/null
+++ b/tools/clang-format-vs/ClangFormat/ClangFormatPackage.cs
@@ -0,0 +1,210 @@
+//===-- ClangFormatPackages.cs - VSPackage for clang-format ------*- C# -*-===//

+//

+//                     The LLVM Compiler Infrastructure

+//

+// This file is distributed under the University of Illinois Open Source

+// License. See LICENSE.TXT for details.

+//

+//===----------------------------------------------------------------------===//

+//

+// This class contains a VS extension package that runs clang-format over a

+// selection in a VS text editor.

+//

+//===----------------------------------------------------------------------===//

+

+using Microsoft.VisualStudio.Editor;

+using Microsoft.VisualStudio.Shell;

+using Microsoft.VisualStudio.Shell.Interop;

+using Microsoft.VisualStudio.Text;

+using Microsoft.VisualStudio.Text.Editor;

+using Microsoft.VisualStudio.TextManager.Interop;

+using System;

+using System.ComponentModel;

+using System.ComponentModel.Design;

+using System.IO;

+using System.Runtime.InteropServices;

+using System.Xml.Linq;

+

+namespace LLVM.ClangFormat

+{

+    [ClassInterface(ClassInterfaceType.AutoDual)]

+    [CLSCompliant(false), ComVisible(true)]

+    public class OptionPageGrid : DialogPage

+    {

+        private string style = "File";

+

+        [Category("LLVM/Clang")]

+        [DisplayName("Style")]

+        [Description("Coding style, currently supports:\n" +

+                     "  - Predefined styles ('LLVM', 'Google', 'Chromium', 'Mozilla').\n" +

+                     "  - 'File' to search for a YAML .clang-format configuration.\n" +

+                     "  - A YAML configuration snippet.\n\n" +

+                     "'File':\n" +

+                     "  Searches for a .clang-format configuration in the source file's\n" +

+                     "  directory and its parents.\n\n" +

+                     "YAML configuration snippet:\n" +

+                     "  The content of a .clang-format configuration file, as string.\n" +

+                     "  Example: '{BasedOnStyle: \"LLVM\", IndentWidth: 8}'\n\n" +

+                     "See also: http://clang.llvm.org/docs/ClangFormatStyleOptions.html.")]

+        public string Style

+        {

+            get { return style; }

+            set { style = value; }

+        }

+    }

+

+    [PackageRegistration(UseManagedResourcesOnly = true)]

+    [InstalledProductRegistration("#110", "#112", "1.0", IconResourceID = 400)]

+    [ProvideMenuResource("Menus.ctmenu", 1)]

+    [Guid(GuidList.guidClangFormatPkgString)]

+    [ProvideOptionPage(typeof(OptionPageGrid), "LLVM/Clang", "ClangFormat", 0, 0, true)]

+    public sealed class ClangFormatPackage : Package

+    {

+        #region Package Members

+        protected override void Initialize()

+        {

+            base.Initialize();

+

+            var commandService = GetService(typeof(IMenuCommandService)) as OleMenuCommandService;

+            if (commandService != null)

+            {

+                var menuCommandID = new CommandID(GuidList.guidClangFormatCmdSet, (int)PkgCmdIDList.cmdidClangFormat);

+                var menuItem = new MenuCommand(MenuItemCallback, menuCommandID);

+                commandService.AddCommand(menuItem);

+            }

+        }

+        #endregion

+

+        private void MenuItemCallback(object sender, EventArgs args)

+        {

+            IWpfTextView view = GetCurrentView();

+            if (view == null)

+                // We're not in a text view.

+                return;

+            string text = view.TextBuffer.CurrentSnapshot.GetText();

+            int start = view.Selection.Start.Position.GetContainingLine().Start.Position;

+            int end = view.Selection.End.Position.GetContainingLine().End.Position;

+            int length = end - start;

+            // clang-format doesn't support formatting a range that starts at the end

+            // of the file.

+            if (start >= text.Length && text.Length > 0)

+                start = text.Length - 1;

+            string path = GetDocumentParent(view);

+            try

+            {

+                var root = XElement.Parse(RunClangFormat(text, start, length, path));

+                var edit = view.TextBuffer.CreateEdit();

+                foreach (XElement replacement in root.Descendants("replacement"))

+                {

+                    var span = new Span(

+                        int.Parse(replacement.Attribute("offset").Value),

+                        int.Parse(replacement.Attribute("length").Value));

+                    edit.Replace(span, replacement.Value);

+                }

+                edit.Apply();

+            }

+            catch (Exception e)

+            {

+                var uiShell = (IVsUIShell)GetService(typeof(SVsUIShell));

+                var id = Guid.Empty;

+                int result;

+                uiShell.ShowMessageBox(

+                        0, ref id,

+                        "Error while running clang-format:",

+                        e.Message,

+                        string.Empty, 0,

+                        OLEMSGBUTTON.OLEMSGBUTTON_OK,

+                        OLEMSGDEFBUTTON.OLEMSGDEFBUTTON_FIRST,

+                        OLEMSGICON.OLEMSGICON_INFO,

+                        0, out result);

+            }

+        }

+

+        /// <summary>

+        /// Runs the given text through clang-format and returns the replacements as XML.

+        /// 

+        /// Formats the text range starting at offset of the given length.

+        /// </summary>

+        private string RunClangFormat(string text, int offset, int length, string path)

+        {

+            System.Diagnostics.Process process = new System.Diagnostics.Process();

+            process.StartInfo.UseShellExecute = false;

+            process.StartInfo.FileName = "clang-format.exe";

+            // Poor man's escaping - this will not work when quotes are already escaped

+            // in the input (but we don't need more).

+            string style = GetStyle().Replace("\"", "\\\"");

+            process.StartInfo.Arguments = " -offset " + offset +

+                                          " -length " + length +

+                                          " -output-replacements-xml " +

+                                          " -style \"" + style + "\"";

+            process.StartInfo.CreateNoWindow = true;

+            process.StartInfo.RedirectStandardInput = true;

+            process.StartInfo.RedirectStandardOutput = true;

+            process.StartInfo.RedirectStandardError = true;

+            if (path != null)

+                process.StartInfo.WorkingDirectory = path;

+            // We have to be careful when communicating via standard input / output,

+            // as writes to the buffers will block until they are read from the other side.

+            // Thus, we:

+            // 1. Start the process - clang-format.exe will start to read the input from the

+            //    standard input.

+            process.Start();

+            // 2. We write everything to the standard output - this cannot block, as clang-format

+            //    reads the full standard input before analyzing it without writing anything to the

+            //    standard output.

+            process.StandardInput.Write(text);

+            // 3. We notify clang-format that the input is done - after this point clang-format

+            //    will start analyzing the input and eventually write the output.

+            process.StandardInput.Close();

+            // 4. We must read clang-format's output before waiting for it to exit; clang-format

+            //    will close the channel by exiting.

+            string output = process.StandardOutput.ReadToEnd();

+            // 5. clang-format is done, wait until it is fully shut down.

+            process.WaitForExit();

+            if (process.ExitCode != 0)

+            {

+                // FIXME: If clang-format writes enough to the standard error stream to block,

+                // we will never reach this point; instead, read the standard error asynchronously.

+                throw new Exception(process.StandardError.ReadToEnd());

+            }

+            return output;

+        }

+

+        /// <summary>

+        /// Returns the currently active view if it is a IWpfTextView.

+        /// </summary>

+        private IWpfTextView GetCurrentView()

+        {

+            // The SVsTextManager is a service through which we can get the active view.

+            var textManager = (IVsTextManager)Package.GetGlobalService(typeof(SVsTextManager));

+            IVsTextView textView;

+            textManager.GetActiveView(1, null, out textView);

+

+            // Now we have the active view as IVsTextView, but the text interfaces we need

+            // are in the IWpfTextView.

+            var userData = (IVsUserData)textView;

+            if (userData == null)

+                return null;

+            Guid guidWpfViewHost = DefGuidList.guidIWpfTextViewHost;

+            object host;

+            userData.GetData(ref guidWpfViewHost, out host);

+            return ((IWpfTextViewHost)host).TextView;

+        }

+

+        private string GetStyle()

+        {

+            var page = (OptionPageGrid)GetDialogPage(typeof(OptionPageGrid));

+            return page.Style;

+        }

+

+        private string GetDocumentParent(IWpfTextView view)

+        {

+            ITextDocument document;

+            if (view.TextBuffer.Properties.TryGetProperty(typeof(ITextDocument), out document))

+            {

+                return Directory.GetParent(document.FilePath).ToString();

+            }

+            return null;

+        }

+    }

+}

diff --git a/tools/clang-format-vs/ClangFormat/GlobalSuppressions.cs b/tools/clang-format-vs/ClangFormat/GlobalSuppressions.cs
new file mode 100644
index 0000000..175a74e
--- /dev/null
+++ b/tools/clang-format-vs/ClangFormat/GlobalSuppressions.cs
@@ -0,0 +1,11 @@
+// This file is used by Code Analysis to maintain SuppressMessage

+// attributes that are applied to this project. Project-level

+// suppressions either have no target or are given a specific target

+// and scoped to a namespace, type, member, etc.

+//

+// To add a suppression to this file, right-click the message in the

+// Error List, point to "Suppress Message(s)", and click "In Project

+// Suppression File". You do not need to add suppressions to this

+// file manually.

+

+[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1017:MarkAssembliesWithComVisible")]

diff --git a/tools/clang-format-vs/ClangFormat/Guids.cs b/tools/clang-format-vs/ClangFormat/Guids.cs
new file mode 100644
index 0000000..c045224
--- /dev/null
+++ b/tools/clang-format-vs/ClangFormat/Guids.cs
@@ -0,0 +1,12 @@
+using System;

+

+namespace LLVM.ClangFormat

+{

+    static class GuidList

+    {

+        public const string guidClangFormatPkgString = "c5286038-25d3-4f65-83a8-51fa2df4a146";

+        public const string guidClangFormatCmdSetString = "e39cbab1-0f96-4022-a2bc-da5a9db7eb78";

+

+        public static readonly Guid guidClangFormatCmdSet = new Guid(guidClangFormatCmdSetString);

+    };

+}
\ No newline at end of file
diff --git a/tools/clang-format-vs/ClangFormat/PkgCmdID.cs b/tools/clang-format-vs/ClangFormat/PkgCmdID.cs
new file mode 100644
index 0000000..bb6b455
--- /dev/null
+++ b/tools/clang-format-vs/ClangFormat/PkgCmdID.cs
@@ -0,0 +1,7 @@
+namespace LLVM.ClangFormat

+{

+    static class PkgCmdIDList

+    {

+        public const uint cmdidClangFormat = 0x100;

+    };

+}
\ No newline at end of file
diff --git a/tools/clang-format-vs/ClangFormat/Properties/AssemblyInfo.cs b/tools/clang-format-vs/ClangFormat/Properties/AssemblyInfo.cs
new file mode 100644
index 0000000..e6e4de4
--- /dev/null
+++ b/tools/clang-format-vs/ClangFormat/Properties/AssemblyInfo.cs
@@ -0,0 +1,33 @@
+using System;

+using System.Reflection;

+using System.Resources;

+using System.Runtime.CompilerServices;

+using System.Runtime.InteropServices;

+

+// General Information about an assembly is controlled through the following 

+// set of attributes. Change these attribute values to modify the information

+// associated with an assembly.

+[assembly: AssemblyTitle("ClangFormat")]

+[assembly: AssemblyDescription("")]

+[assembly: AssemblyConfiguration("")]

+[assembly: AssemblyCompany("LLVM")]

+[assembly: AssemblyProduct("ClangFormat")]

+[assembly: AssemblyCopyright("")]

+[assembly: AssemblyTrademark("")]

+[assembly: AssemblyCulture("")]

+[assembly: ComVisible(false)]

+[assembly: CLSCompliant(false)]

+[assembly: NeutralResourcesLanguage("en-US")]

+

+// Version information for an assembly consists of the following four values:

+//

+//      Major Version

+//      Minor Version 

+//      Build Number

+//      Revision

+//

+// You can specify all the values or you can default the Revision and Build Numbers 

+// by using the '*' as shown below:

+

+[assembly: AssemblyVersion("1.0.0.0")]

+[assembly: AssemblyFileVersion("1.0.0.0")]

diff --git a/tools/clang-format-vs/ClangFormat/Resources.Designer.cs b/tools/clang-format-vs/ClangFormat/Resources.Designer.cs
new file mode 100644
index 0000000..d5d7d3f
--- /dev/null
+++ b/tools/clang-format-vs/ClangFormat/Resources.Designer.cs
@@ -0,0 +1,64 @@
+//------------------------------------------------------------------------------

+// <auto-generated>

+//     This code was generated by a tool.

+//     Runtime Version:2.0.50727.42

+//

+//     Changes to this file may cause incorrect behavior and will be lost if

+//     the code is regenerated.

+// </auto-generated>

+//------------------------------------------------------------------------------

+

+namespace LLVM.ClangFormat {

+    using System;

+    

+    

+    /// <summary>

+    ///   A strongly-typed resource class, for looking up localized strings, etc.

+    /// </summary>

+    // This class was auto-generated by the StronglyTypedResourceBuilder

+    // class via a tool like ResGen or Visual Studio.

+    // To add or remove a member, edit your .ResX file then rerun ResGen

+    // with the /str option, or rebuild your VS project.

+    [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "2.0.0.0")]

+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]

+    [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]

+    internal class Resources {

+        

+        private static global::System.Resources.ResourceManager resourceMan;

+        

+        private static global::System.Globalization.CultureInfo resourceCulture;

+        

+        [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]

+        internal Resources() {

+        }

+        

+        /// <summary>

+        ///   Returns the cached ResourceManager instance used by this class.

+        /// </summary>

+        [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]

+        internal static global::System.Resources.ResourceManager ResourceManager {

+            get {

+                if (object.ReferenceEquals(resourceMan, null)) {

+                    global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("LLVM.ClangFormat.Resources", typeof(Resources).Assembly);

+                    resourceMan = temp;

+                }

+                return resourceMan;

+            }

+        }

+        

+        /// <summary>

+        ///   Overrides the current thread's CurrentUICulture property for all

+        ///   resource lookups using this strongly typed resource class.

+        /// </summary>

+        [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]

+        internal static global::System.Globalization.CultureInfo Culture {

+            get {

+                return resourceCulture;

+            }

+            set {

+                resourceCulture = value;

+            }

+        }

+        

+    }

+}

diff --git a/tools/clang-format-vs/ClangFormat/Resources.resx b/tools/clang-format-vs/ClangFormat/Resources.resx
new file mode 100644
index 0000000..352987a
--- /dev/null
+++ b/tools/clang-format-vs/ClangFormat/Resources.resx
@@ -0,0 +1,129 @@
+<?xml version="1.0" encoding="utf-8"?>

+<!--

+    VS SDK Notes: This resx file contains the resources that will be consumed directly by your package.

+    For example, if you chose to create a tool window, there is a resource with ID 'CanNotCreateWindow'. This

+    is used in VsPkg.cs to determine the string to show the user if there is an error when attempting to create

+    the tool window.

+

+    Resources that are accessed directly from your package *by Visual Studio* are stored in the VSPackage.resx 

+    file.

+-->

+<root>

+  <!-- 

+    Microsoft ResX Schema 

+    

+    Version 2.0

+    

+    The primary goals of this format is to allow a simple XML format 

+    that is mostly human readable. The generation and parsing of the 

+    various data types are done through the TypeConverter classes 

+    associated with the data types.

+    

+    Example:

+    

+    ... ado.net/XML headers & schema ...

+    <resheader name="resmimetype">text/microsoft-resx</resheader>

+    <resheader name="version">2.0</resheader>

+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>

+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>

+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>

+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>

+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">

+        <value>[base64 mime encoded serialized .NET Framework object]</value>

+    </data>

+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">

+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>

+        <comment>This is a comment</comment>

+    </data>

+                

+    There are any number of "resheader" rows that contain simple 

+    name/value pairs.

+    

+    Each data row contains a name, and value. The row also contains a 

+    type or mimetype. Type corresponds to a .NET class that support 

+    text/value conversion through the TypeConverter architecture. 

+    Classes that don't support this are serialized and stored with the 

+    mimetype set.

+    

+    The mimetype is used for serialized objects, and tells the 

+    ResXResourceReader how to depersist the object. This is currently not 

+    extensible. For a given mimetype the value must be set accordingly:

+    

+    Note - application/x-microsoft.net.object.binary.base64 is the format 

+    that the ResXResourceWriter will generate, however the reader can 

+    read any of the formats listed below.

+    

+    mimetype: application/x-microsoft.net.object.binary.base64

+    value   : The object must be serialized with 

+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter

+            : and then encoded with base64 encoding.

+    

+    mimetype: application/x-microsoft.net.object.soap.base64

+    value   : The object must be serialized with 

+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter

+            : and then encoded with base64 encoding.

+

+    mimetype: application/x-microsoft.net.object.bytearray.base64

+    value   : The object must be serialized into a byte array 

+            : using a System.ComponentModel.TypeConverter

+            : and then encoded with base64 encoding.

+    -->

+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">

+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />

+    <xsd:element name="root" msdata:IsDataSet="true">

+      <xsd:complexType>

+        <xsd:choice maxOccurs="unbounded">

+          <xsd:element name="metadata">

+            <xsd:complexType>

+              <xsd:sequence>

+                <xsd:element name="value" type="xsd:string" minOccurs="0" />

+              </xsd:sequence>

+              <xsd:attribute name="name" use="required" type="xsd:string" />

+              <xsd:attribute name="type" type="xsd:string" />

+              <xsd:attribute name="mimetype" type="xsd:string" />

+              <xsd:attribute ref="xml:space" />

+            </xsd:complexType>

+          </xsd:element>

+          <xsd:element name="assembly">

+            <xsd:complexType>

+              <xsd:attribute name="alias" type="xsd:string" />

+              <xsd:attribute name="name" type="xsd:string" />

+            </xsd:complexType>

+          </xsd:element>

+          <xsd:element name="data">

+            <xsd:complexType>

+              <xsd:sequence>

+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />

+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />

+              </xsd:sequence>

+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />

+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />

+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />

+              <xsd:attribute ref="xml:space" />

+            </xsd:complexType>

+          </xsd:element>

+          <xsd:element name="resheader">

+            <xsd:complexType>

+              <xsd:sequence>

+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />

+              </xsd:sequence>

+              <xsd:attribute name="name" type="xsd:string" use="required" />

+            </xsd:complexType>

+          </xsd:element>

+        </xsd:choice>

+      </xsd:complexType>

+    </xsd:element>

+  </xsd:schema>

+  <resheader name="resmimetype">

+    <value>text/microsoft-resx</value>

+  </resheader>

+  <resheader name="version">

+    <value>2.0</value>

+  </resheader>

+  <resheader name="reader">

+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>

+  </resheader>

+  <resheader name="writer">

+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>

+  </resheader>

+</root>
\ No newline at end of file
diff --git a/tools/clang-format-vs/ClangFormat/Resources/Images.png b/tools/clang-format-vs/ClangFormat/Resources/Images.png
new file mode 100644
index 0000000..51fe0d1
--- /dev/null
+++ b/tools/clang-format-vs/ClangFormat/Resources/Images.png
Binary files differ
diff --git a/tools/clang-format-vs/ClangFormat/Resources/Package.ico b/tools/clang-format-vs/ClangFormat/Resources/Package.ico
new file mode 100644
index 0000000..449296f
--- /dev/null
+++ b/tools/clang-format-vs/ClangFormat/Resources/Package.ico
Binary files differ
diff --git a/tools/clang-format-vs/ClangFormat/VSPackage.resx b/tools/clang-format-vs/ClangFormat/VSPackage.resx
new file mode 100644
index 0000000..81102d3
--- /dev/null
+++ b/tools/clang-format-vs/ClangFormat/VSPackage.resx
@@ -0,0 +1,140 @@
+<?xml version="1.0" encoding="utf-8"?>

+<!--

+    VS SDK Notes: This resx file contains the resources that will be consumed from your package by Visual Studio.

+    For example, Visual Studio will attempt to load resource '400' from this resource stream when it needs to

+    load your package's icon. Because Visual Studio will always look in the VSPackage.resources stream first for

+    resources it needs, you should put additional resources that Visual Studio will load directly into this resx 

+    file. 

+

+    Resources that you would like to access directly from your package in a strong-typed fashion should be stored 

+    in Resources.resx or another resx file.

+-->

+<root>

+  <!-- 

+    Microsoft ResX Schema 

+    

+    Version 2.0

+    

+    The primary goals of this format is to allow a simple XML format 

+    that is mostly human readable. The generation and parsing of the 

+    various data types are done through the TypeConverter classes 

+    associated with the data types.

+    

+    Example:

+    

+    ... ado.net/XML headers & schema ...

+    <resheader name="resmimetype">text/microsoft-resx</resheader>

+    <resheader name="version">2.0</resheader>

+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>

+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>

+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>

+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>

+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">

+        <value>[base64 mime encoded serialized .NET Framework object]</value>

+    </data>

+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">

+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>

+        <comment>This is a comment</comment>

+    </data>

+                

+    There are any number of "resheader" rows that contain simple 

+    name/value pairs.

+    

+    Each data row contains a name, and value. The row also contains a 

+    type or mimetype. Type corresponds to a .NET class that support 

+    text/value conversion through the TypeConverter architecture. 

+    Classes that don't support this are serialized and stored with the 

+    mimetype set.

+    

+    The mimetype is used for serialized objects, and tells the 

+    ResXResourceReader how to depersist the object. This is currently not 

+    extensible. For a given mimetype the value must be set accordingly:

+    

+    Note - application/x-microsoft.net.object.binary.base64 is the format 

+    that the ResXResourceWriter will generate, however the reader can 

+    read any of the formats listed below.

+    

+    mimetype: application/x-microsoft.net.object.binary.base64

+    value   : The object must be serialized with 

+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter

+            : and then encoded with base64 encoding.

+    

+    mimetype: application/x-microsoft.net.object.soap.base64

+    value   : The object must be serialized with 

+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter

+            : and then encoded with base64 encoding.

+

+    mimetype: application/x-microsoft.net.object.bytearray.base64

+    value   : The object must be serialized into a byte array 

+            : using a System.ComponentModel.TypeConverter

+            : and then encoded with base64 encoding.

+    -->

+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">

+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />

+    <xsd:element name="root" msdata:IsDataSet="true">

+      <xsd:complexType>

+        <xsd:choice maxOccurs="unbounded">

+          <xsd:element name="metadata">

+            <xsd:complexType>

+              <xsd:sequence>

+                <xsd:element name="value" type="xsd:string" minOccurs="0" />

+              </xsd:sequence>

+              <xsd:attribute name="name" use="required" type="xsd:string" />

+              <xsd:attribute name="type" type="xsd:string" />

+              <xsd:attribute name="mimetype" type="xsd:string" />

+              <xsd:attribute ref="xml:space" />

+            </xsd:complexType>

+          </xsd:element>

+          <xsd:element name="assembly">

+            <xsd:complexType>

+              <xsd:attribute name="alias" type="xsd:string" />

+              <xsd:attribute name="name" type="xsd:string" />

+            </xsd:complexType>

+          </xsd:element>

+          <xsd:element name="data">

+            <xsd:complexType>

+              <xsd:sequence>

+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />

+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />

+              </xsd:sequence>

+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />

+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />

+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />

+              <xsd:attribute ref="xml:space" />

+            </xsd:complexType>

+          </xsd:element>

+          <xsd:element name="resheader">

+            <xsd:complexType>

+              <xsd:sequence>

+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />

+              </xsd:sequence>

+              <xsd:attribute name="name" type="xsd:string" use="required" />

+            </xsd:complexType>

+          </xsd:element>

+        </xsd:choice>

+      </xsd:complexType>

+    </xsd:element>

+  </xsd:schema>

+  <resheader name="resmimetype">

+    <value>text/microsoft-resx</value>

+  </resheader>

+  <resheader name="version">

+    <value>2.0</value>

+  </resheader>

+  <resheader name="reader">

+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>

+  </resheader>

+  <resheader name="writer">

+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>

+  </resheader>

+  <assembly alias="System.Windows.Forms" name="System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />

+  <data name="110" xml:space="preserve">

+    <value>ClangFormat</value>

+  </data>

+  <data name="112" xml:space="preserve">

+    <value>Formats code by calling the clang-format executable.</value>

+  </data>

+  <data name="400" type="System.Resources.ResXFileRef, System.Windows.Forms">

+    <value>Resources\Package.ico;System.Drawing.Icon, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>

+  </data>

+</root>
\ No newline at end of file
diff --git a/tools/clang-format-vs/ClangFormat/source.extension.vsixmanifest b/tools/clang-format-vs/ClangFormat/source.extension.vsixmanifest
new file mode 100644
index 0000000..274c028
--- /dev/null
+++ b/tools/clang-format-vs/ClangFormat/source.extension.vsixmanifest
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="utf-8"?>

+<PackageManifest Version="2.0.0" xmlns="http://schemas.microsoft.com/developer/vsx-schema/2011" xmlns:d="http://schemas.microsoft.com/developer/vsx-schema-design/2011">

+  <Metadata>

+    <Identity Id="c5286038-25d3-4f65-83a8-51fa2df4a146" Version="1.0" Language="en-US" Publisher="LLVM" />

+    <DisplayName>ClangFormat</DisplayName>

+    <Description>Formats code by calling the clang-format executable.</Description>

+  </Metadata>

+  <Installation InstalledByMsi="false">

+    <InstallationTarget Id="Microsoft.VisualStudio.Pro" Version="11.0" />

+  </Installation>

+  <Dependencies>

+    <Dependency Id="Microsoft.Framework.NDP" DisplayName="Microsoft .NET Framework" d:Source="Manual" Version="4.5" />

+    <Dependency Id="Microsoft.VisualStudio.MPF.11.0" DisplayName="Visual Studio MPF 11.0" d:Source="Installed" Version="11.0" />

+  </Dependencies>

+  <Assets>

+    <Asset Type="Microsoft.VisualStudio.VsPackage" d:Source="Project" d:ProjectName="%CurrentProject%" Path="|%CurrentProject%;PkgdefProjectOutputGroup|" />

+  </Assets>

+</PackageManifest>

diff --git a/tools/clang-format-vs/README b/tools/clang-format-vs/README
new file mode 100644
index 0000000..240821c
--- /dev/null
+++ b/tools/clang-format-vs/README
@@ -0,0 +1,6 @@
+This directory contains a VSPackage project to generate a visual studio extension

+for clang-format.

+

+Build prerequisites are:

+- Visual Studio 2012 Professional

+- Visual Studio SDK (http://www.microsoft.com/en-us/download/details.aspx?id=30668)
\ No newline at end of file