Let's say I have simple project
class Program : TestBase
{
static void Main(string[] args)
{
}
public void Test()
{
AddItem(new Item());
AddItem(new Item());
}
}
public class Item { }
public class TestBase
{
public virtual void AddItem(Item vertex) { }
}
How can I extract AddItem(new Item());
using VSSDK? I want to know what parameters are passed to it and at what line it is in the text editor.
I tried looking for CodeElement.Kind
, but unfortunately vsCMElement.vsCMElementFunctionInvokeStmt
doesn't return anything. Is there any other way of extracting this information?
public static async Task InitializeAsync(AsyncPackage package)
{
// ...
_dte = (await package.GetServiceAsync(typeof(DTE))) as DTE2;
await ThreadHelper.JoinableTaskFactory.SwitchToMainThreadAsync(package.DisposalToken);
var sandboxProject = _dte.Solution.Projects;
var codeItems = new List<string>();
if (!ThreadHelper.CheckAccess())
return;
foreach (Project project in sandboxProject)
{
var projectItems = GetProjectItemsRecursively(project.ProjectItems);
foreach (ProjectItem projectItem in projectItems)
{
foreach (CodeElement element in projectItem.FileCodeModel.CodeElements)
{
codeItems.AddRange(GetItems(element).Select(codeItem => $"{codeItem.FullName} : {codeItem.Kind.ToString()}"));
}
}
}
}
private static IEnumerable<CodeElement> GetItems(CodeElement items)
{
var ret = new List<CodeElement>();
if (items == null)
return ret;
foreach (CodeElement item in items.Children)
{
ret.Add(item);
ret.AddRange(GetItems(item));
}
return ret;
}
private static List<ProjectItem> GetProjectItemsRecursively(ProjectItems items)
{
var ret = new List<EnvDTE.ProjectItem>();
if (items == null) return ret;
foreach (ProjectItem item in items)
{
ret.Add(item);
ret.AddRange(GetProjectItemsRecursively(item.ProjectItems));
}
return ret;
}