【发布时间】:2015-03-01 19:46:54
【问题描述】:
我正在使用 Roslyn 收集方法中的所有方法调用,并在该方法的相应测试方法中将它们替换为 shim。问题是,尽管使用项目的所有引用和语法树适当地初始化了编译对象,它还是会抛出一个 ArgumentException,上面写着“语法节点不在语法树内”。
这是我用来初始化语义模型的代码:
public TestMethodCodeGenerator(string code, Project project = null)
{
if (!string.IsNullOrWhiteSpace(code))
{
var syntaxTree = CSharpSyntaxTree.ParseText(code);
if (null != project)
{
var syntaxTreesOfDocumentsInProject = new List<SyntaxTree>();
foreach (var document in project.Documents)
{
syntaxTreesOfDocumentsInProject.Add(CSharpSyntaxTree.ParseFile(document.FilePath));
}
var compilation = CSharpCompilation.Create("Demo").AddReferences(project.MetadataReferences).AddSyntaxTrees(syntaxTreesOfDocumentsInProject);
this.semanticModel = compilation.GetSemanticModel(syntaxTreesOfDocumentsInProject[0]);
}
}
else
{
var compilation = CSharpCompilation.Create("Demo").AddSyntaxTrees(syntaxTree);
this.semanticModel = compilation.GetSemanticModel(syntaxTree);
}
}
}
这就是我使用语义模型为所有调用生成填充程序的方式:
private string PopulateMethodBodyWithShims(MethodDeclarationSyntax methodDeclarationSyntax)
{
if (null != methodDeclarationSyntax)
{
var stringBuilder = new StringBuilder();
var methodBlock = methodDeclarationSyntax.Body;
foreach (var statement in methodBlock.Statements)
{
var invocationSyntax = this.ExtractMethodInvocationSyntaxFromStatement(statement);
if (null != invocationSyntax)
{
var call = invocationSyntax.Expression as MemberAccessExpressionSyntax;
if (null != call)
{
try
{
IMethodSymbol methodSymbol;
**methodSymbol = this.semanticModel.GetSymbolInfo(call).Symbol as IMethodSymbol;**
if (null != methodSymbol)
{
var shimMethod = this.GenerateShimMethod(methodSymbol);
stringBuilder.AppendLine(GeneratedTestClassConstants.IndentationSpaceToken + GeneratedTestClassConstants.IndentationSpaceToken + shimMethod);
}
}
catch (ArgumentException ex)
{
////This exception can be thrown if the syntax node is not within the syntax tree
var message = ex.Message;
throw new ArgumentException(message + " : " + call);
}
}
}
}
.
.
.
第二个代码 sn-p 中突出显示的区域是发生异常并且执行流向 catch 块的地方。有什么问题,我在这里错过了什么?
【问题讨论】: