
This change adds a feature to the clang-format VS extension that optionally enables the automatic formatting of documents when saving. Since developers always need to save their files, this eases the workflow of making sure source files are properly formatted. Differential Revision: https://reviews.llvm.org/D29221 llvm-svn: 299543
97 lines
3.4 KiB
C#
97 lines
3.4 KiB
C#
using EnvDTE;
|
|
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.IO;
|
|
|
|
namespace LLVM.ClangFormat
|
|
{
|
|
internal sealed class Vsix
|
|
{
|
|
/// <summary>
|
|
/// Returns the currently active view if it is a IWpfTextView.
|
|
/// </summary>
|
|
public static 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.
|
|
return VsToWpfTextView(textView);
|
|
}
|
|
|
|
public static bool IsDocumentDirty(Document document)
|
|
{
|
|
var textView = GetDocumentView(document);
|
|
var textDocument = GetTextDocument(textView);
|
|
return textDocument?.IsDirty == true;
|
|
}
|
|
|
|
public static IWpfTextView GetDocumentView(Document document)
|
|
{
|
|
var textView = GetVsTextViewFrompPath(document.FullName);
|
|
return VsToWpfTextView(textView);
|
|
}
|
|
|
|
public static IWpfTextView VsToWpfTextView(IVsTextView textView)
|
|
{
|
|
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;
|
|
}
|
|
|
|
public static IVsTextView GetVsTextViewFrompPath(string filePath)
|
|
{
|
|
// From http://stackoverflow.com/a/2427368/4039972
|
|
var dte2 = (EnvDTE80.DTE2)Package.GetGlobalService(typeof(SDTE));
|
|
var sp = (Microsoft.VisualStudio.OLE.Interop.IServiceProvider)dte2;
|
|
var serviceProvider = new Microsoft.VisualStudio.Shell.ServiceProvider(sp);
|
|
|
|
IVsUIHierarchy uiHierarchy;
|
|
uint itemID;
|
|
IVsWindowFrame windowFrame;
|
|
if (VsShellUtilities.IsDocumentOpen(serviceProvider, filePath, Guid.Empty,
|
|
out uiHierarchy, out itemID, out windowFrame))
|
|
{
|
|
// Get the IVsTextView from the windowFrame.
|
|
return VsShellUtilities.GetTextView(windowFrame);
|
|
}
|
|
return null;
|
|
}
|
|
|
|
public static ITextDocument GetTextDocument(IWpfTextView view)
|
|
{
|
|
ITextDocument document;
|
|
if (view != null && view.TextBuffer.Properties.TryGetProperty(typeof(ITextDocument), out document))
|
|
return document;
|
|
return null;
|
|
}
|
|
|
|
public static string GetDocumentParent(IWpfTextView view)
|
|
{
|
|
ITextDocument document = GetTextDocument(view);
|
|
if (document != null)
|
|
{
|
|
return Directory.GetParent(document.FilePath).ToString();
|
|
}
|
|
return null;
|
|
}
|
|
|
|
public static string GetDocumentPath(IWpfTextView view)
|
|
{
|
|
return GetTextDocument(view)?.FilePath;
|
|
}
|
|
}
|
|
}
|