private void WriteUCFG <TDeclarationSyntax>(SyntaxNodeAnalysisContext context, Func <TDeclarationSyntax, CSharpSyntaxNode> getBody) where TDeclarationSyntax : SyntaxNode { var declaration = (TDeclarationSyntax)context.Node; var symbol = context.SemanticModel.GetDeclaredSymbol(declaration); var methodSymbol = (symbol is IPropertySymbol propertySymbol) ? propertySymbol.GetMethod // We are in PropertyDeclarationSyntax : symbol as IMethodSymbol; // all other are methods if (methodSymbol == null || methodSymbol.IsAbstract || methodSymbol.IsExtern || !CSharpControlFlowGraph.TryGet(getBody(declaration), context.SemanticModel, out var cfg)) { return; } var ucfg = new UcfgFactory(context.SemanticModel) .Create(declaration, methodSymbol, cfg); if (IsValid(ucfg)) { var fileName = $"{projectBuildId}_{Interlocked.Increment(ref protobufFileIndex)}"; WriteProtobuf(ucfg, Path.Combine(protobufDirectory, $"ucfg_{fileName}.pb")); if (ShouldGenerateDot) { WriteDot(Path.Combine(protobufDirectory, $"ucfg_{fileName}.dot"), writer => UcfgSerializer.Serialize(ucfg, writer)); WriteDot(Path.Combine(protobufDirectory, $"cfg_{fileName}.dot"), writer => CfgSerializer.Serialize(ucfg.MethodId, cfg, writer)); } } }
public void Create_DecoratesAndReThrowsExceptions() { // Arrange const string code = @" namespace Ns1 { class MyClass { void DoStuff(){} } } "; var(syntaxTree, semanticModel) = TestHelper.Compile(code); var factory = new UcfgFactory(semanticModel); var methodNode = syntaxTree.GetRoot() .DescendantNodes() .OfType <MethodDeclarationSyntax>() .First(); var methodSymbol = (IMethodSymbol)semanticModel.GetDeclaredSymbol(methodNode); var mockCFG = new Mock <IControlFlowGraph>(MockBehavior.Strict); // strict -> throw on any usage Action act = () => factory.Create(methodNode, methodSymbol, mockCFG.Object); // Act act.Should().ThrowExactly <UcfgException>().And.Message.Should().ContainAll("Error processing method: DoStuff", "Inner exception: "); }
private static UCFG BuildUcfg(CSharpSyntaxNode cfgStartNode, CSharpSyntaxNode ucfgStartNode, IMethodSymbol methodSymbol, SemanticModel semanticModel) { var builder = new UcfgFactory(semanticModel); var cfg = CSharpControlFlowGraph.Create(cfgStartNode, semanticModel); var ucfg = builder.Create(ucfgStartNode, methodSymbol, cfg); //var serializedCfg = CfgSerializer.Serialize(methodName, cfg); //var serializedUcfg = UcfgSerializer.Serialize(ucfg); return(ucfg); }