例如,我想知道如何检测InvocationExpressionSyntax
是来自我的代码还是来自外部代码。
我试着找出怎么做,但没有成功。
示例:
public async Task MyMethodAsync1()
{
await MyMethodAsync2(); // How to know that this 'InvocationExpressionSyntax' is mine using roslyn ?
}
public async Task MyMethodAsync2()
{
await Task.Delay(1); // How to know that this 'InvocationExpressionSyntax' is NOT mine using roslyn ?
}
谢谢
发布于 2019-04-21 04:57:42
要实现这一点,您可以检查InvocationExpressionSyntax
下接收到的ISymbol
的DeclaringSyntaxReferences
是否为空。更清楚地说,您还可以通过检查IsImplicitlyDeclared
是否为假来确保此符号不是由编译器生成的
public static bool IsDeclareInMetadata(this SemanticModel semanticModel, SyntaxNode node)
{
var info = semanticModel.GetSymbolInfo(node);
return !(info.Symbol is null) && info.Symbol.DeclaringSyntaxReferences.IsDefaultOrEmpty && !info.Symbol.IsImplicitlyDeclared;
}
发布于 2019-04-25 20:25:44
当你说“我的代码”或“外部代码”时,你需要定义它到底是什么意思。
假设“我的代码”表示“编译到当前程序集中的代码”,而外部代码表示“来自引用的程序集的代码”,找到它的最简单方法是比较程序集。
假设您有一个SyntaxNodeAnalysisContext context
和一个InvocationExpressionSyntax node
,您可以按如下方式找到要调用的方法的符号:
var symbol = context.SemanticModel.GetSymbolInfo(node, context.Cancellationtoken);
请记住,该符号可能为空,因此请对其进行测试。
现在,您可以比较程序集:
bool fromSameAssembly = context.Compilation.Assembly.Equals(symbol.ContainingAssembly);
另一种选择是查看符号的位置:
bool isInMetadata = symbol.Locations.Any(loc => loc.IsInMetadata);
bool isInSource = symbol.Locations.Any(loc => loc.IsInSource);
https://stackoverflow.com/questions/55777163
复制相似问题