如何在诊断代码修复项目中获得有关当前工作区(例如项目路径、解决方案路径)的信息?
我正在实现ISyntaxNodeAnalyzer类型的诊断
我需要访问SymbolFinder.FindImplementationsAsync,但要做到这一点,我需要解决方案实例
编辑:我有这样的代码:
var syntax = (LocalDeclarationStatementSyntax) node;
var type = syntax.Declaration.Type;
var typeSymbol = semanticModel.GetTypeInfo(type).ConvertedType;
我想找出typeSymbol的所有用法/引用。TypeSymbol表示位于源代码中的类。
为此,我想使用SymbolFinder,但是SymbolFinder的方法需要解决方案的实例.在较早版本的Roslyn中,文档作为诊断的方法参数,您可以获得项目和解决方案。
发布于 2014-04-21 10:56:58
在实现诊断分析器时,没有当前获取工作区或进行多项目分析的方法,因为这些方法需要能够只使用命令行编译器对单个编译运行。但是,一旦确定了诊断,就可以在代码修复提供程序中完成此工作。
如果您只想找到一旦类实现另一个的所有地方,您可以在决定诊断之前做一个编译范围的诊断分析器并检查所有声明。您可以通过实现ICompilationStartedAnalyzer和ICompilationEndedAnalyzer来做到这一点。
发布于 2017-05-24 07:37:06
如果你真的需要这样做,你可以这样做,但它通过反思,没有被驱逐者,它将工作在所有的环境或任何未来的版本等等。我只在windows环境中测试过这个。
public static class RoslynExtensions
{
public static Solution GetSolution(this SyntaxNodeAnalysisContext context)
{
var workspace = context.Options.GetPrivatePropertyValue<object>("Workspace");
return workspace.GetPrivatePropertyValue<Solution>("CurrentSolution");
}
public static T GetPrivatePropertyValue<T>(this object obj, string propName)
{
if (obj == null)
{
throw new ArgumentNullException(nameof(obj));
}
var pi = obj.GetType().GetRuntimeProperty(propName);
if (pi == null)
{
throw new ArgumentOutOfRangeException(nameof(propName), $"Property {propName} was not found in Type {obj.GetType().FullName}");
}
return (T)pi.GetValue(obj, null);
}
}
从像这样的分析器中调用:
public override void Initialize(AnalysisContext context)
{
context.RegisterSyntaxNodeAction(AnalyzeConstDeclaration, SyntaxKind.FieldDeclaration);
}
public static void AnalyzeConstDeclaration(SyntaxNodeAnalysisContext context)
{
var solution = context.GetSolution();
}
https://stackoverflow.com/questions/23203206
复制相似问题