HOWTO: Get the conditional compile symbols defined in the project for a source file (ITextView) in a Visual Studio Extension
Monday, August 31, 2015Fortunately the Visual Studio SDK provides a way at these values. Unfortunately, it's not as straight forward as I would have liked.
Conditionals given an ITextView
Here's a quick extension method I whipped up to pull the "defines" out of the project file given an ITextView/IWpfTextView.
private static IEnumerable<string> Conditionals([NotNull] this ITextView textView)
{
if (textView == null) throw new ArgumentNullException(nameof(textView));
// Get the text document from the text buffer (if it has one)
ITextDocument textDocument;
if (textView.TextBuffer.Properties.TryGetProperty(typeof (ITextDocument), out textDocument))
yield break;
var componentModel = ServiceProvider.GlobalProvider.GetService(typeof(SComponentModel)) as IComponentModel;
// Get the VsServiceProvider
var vsServiceProvider = componentModel?.DefaultExportProvider?.GetExportedValue<SVsServiceProvider>();
if (vsServiceProvider == null) yield break;
// Get the DTE ...
var dte = (DTE) vsServiceProvider.GetService(typeof (DTE));
ProjectItem projectItem = dte.Solution.FindProjectItem(textDocument.FilePath);
Configuration activeConfiguration = projectItem?.ContainingProject?.ConfigurationManager?.ActiveConfiguration;
var defineConstants = activeConfiguration?.Properties?.Item("DefineConstants")?.Value as string;
if (defineConstants == null)
yield break;
// DefineConstants entries are listed semicolon and comma delimiated, so we need to split on both.
string[] constantSplit = defineConstants.Split(new[] { ';', ',' }, StringSplitOptions.RemoveEmptyEntries);
foreach (var item in constantSplit)
yield return item.Trim(); // They can contain whitespace on either end, so we'll strip 'em.
}
Of course, you could get some of those services via an Export and eliminate the GetService / GetExported value calls, but I thought I'd include them since I don't know what you've decided to get from MEF.Have a lot of fun!
Subscribe to:
Post Comments
(
Atom
)
No comments :
Post a Comment