
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
80 lines
2.7 KiB
C#
80 lines
2.7 KiB
C#
using EnvDTE;
|
|
using Microsoft.VisualStudio;
|
|
using Microsoft.VisualStudio.Shell;
|
|
using Microsoft.VisualStudio.Shell.Interop;
|
|
using System.Linq;
|
|
|
|
namespace LLVM.ClangFormat
|
|
{
|
|
// Exposes event sources for IVsRunningDocTableEvents3 events.
|
|
internal sealed class RunningDocTableEventsDispatcher : IVsRunningDocTableEvents3
|
|
{
|
|
private RunningDocumentTable _runningDocumentTable;
|
|
private DTE _dte;
|
|
|
|
public delegate void OnBeforeSaveHander(object sender, Document document);
|
|
public event OnBeforeSaveHander BeforeSave;
|
|
|
|
public RunningDocTableEventsDispatcher(Package package)
|
|
{
|
|
_runningDocumentTable = new RunningDocumentTable(package);
|
|
_runningDocumentTable.Advise(this);
|
|
_dte = (DTE)Package.GetGlobalService(typeof(DTE));
|
|
}
|
|
|
|
public int OnAfterAttributeChange(uint docCookie, uint grfAttribs)
|
|
{
|
|
return VSConstants.S_OK;
|
|
}
|
|
|
|
public int OnAfterAttributeChangeEx(uint docCookie, uint grfAttribs, IVsHierarchy pHierOld, uint itemidOld, string pszMkDocumentOld, IVsHierarchy pHierNew, uint itemidNew, string pszMkDocumentNew)
|
|
{
|
|
return VSConstants.S_OK;
|
|
}
|
|
|
|
public int OnAfterDocumentWindowHide(uint docCookie, IVsWindowFrame pFrame)
|
|
{
|
|
return VSConstants.S_OK;
|
|
}
|
|
|
|
public int OnAfterFirstDocumentLock(uint docCookie, uint dwRDTLockType, uint dwReadLocksRemaining, uint dwEditLocksRemaining)
|
|
{
|
|
return VSConstants.S_OK;
|
|
}
|
|
|
|
public int OnAfterSave(uint docCookie)
|
|
{
|
|
return VSConstants.S_OK;
|
|
}
|
|
|
|
public int OnBeforeDocumentWindowShow(uint docCookie, int fFirstShow, IVsWindowFrame pFrame)
|
|
{
|
|
return VSConstants.S_OK;
|
|
}
|
|
|
|
public int OnBeforeLastDocumentUnlock(uint docCookie, uint dwRDTLockType, uint dwReadLocksRemaining, uint dwEditLocksRemaining)
|
|
{
|
|
return VSConstants.S_OK;
|
|
}
|
|
|
|
public int OnBeforeSave(uint docCookie)
|
|
{
|
|
if (BeforeSave != null)
|
|
{
|
|
var document = FindDocumentByCookie(docCookie);
|
|
if (document != null) // Not sure why this happens sometimes
|
|
{
|
|
BeforeSave(this, FindDocumentByCookie(docCookie));
|
|
}
|
|
}
|
|
return VSConstants.S_OK;
|
|
}
|
|
|
|
private Document FindDocumentByCookie(uint docCookie)
|
|
{
|
|
var documentInfo = _runningDocumentTable.GetDocumentInfo(docCookie);
|
|
return _dte.Documents.Cast<Document>().FirstOrDefault(doc => doc.FullName == documentInfo.Moniker);
|
|
}
|
|
}
|
|
}
|