private void RunMappingTest(string resourceFileName, Platform platform) { var analyzerResult = RoslynCompiler.Run(resourceFileName, platform); AnalyzerModel analyzerModel = new AnalyzerModel() { CallGraph = analyzerResult.CallGraph }; CodeModel codeModel = new CodeModel() { AnalyzerModel = analyzerModel }; var cache = new Cache() { SemanticModel = analyzerResult.SemanticModel, SyntaxRoot = analyzerResult.SemanticModel.SyntaxTree.GetRoot() }; foreach (SyntaxNode node in analyzerResult.SemanticModel.SyntaxTree.GetRoot().DescendantNodes()) { var symbol = cache.SemanticModel.GetSymbolInfo(node).Symbol; if (symbol == null || (symbol.Kind != SymbolKind.Method && symbol.Kind != SymbolKind.Property && symbol.Kind != SymbolKind.NamedType)) { continue; } if ((symbol as IMethodSymbol)?.MethodKind == MethodKind.BuiltinOperator) { continue; } if (symbol.Kind == SymbolKind.NamedType && node.FirstAncestorOrSelf <ObjectCreationExpressionSyntax>() == null || node.FirstAncestorOrSelf <TypeArgumentListSyntax>() != null) { continue; } var method = codeModel.GetMethodCall(cache, node.Span); if (method == null) { Console.WriteLine("Platform " + platform); Console.WriteLine("No mapped Method found for " + node.ToString()); Console.WriteLine("Events:\r\n"); foreach (var e in analyzerResult.CallGraph.EventDetails) { Console.WriteLine(e.ToString()); } Assert.Fail("No mapped Method found for " + node.ToString()); } } }
public void ResolvedSignaturesMatchEtwSignatures(Platform platform) { string source = GetSampleSource(); var model = RoslynCompiler.GetSemanticModel(source); var analyzerResult = RoslynCompiler.Run("Tests.Model.SignatureResolverSamples.cs", platform); var jitType = analyzerResult.CallGraph.GetJitType("Tests.Model.SignatureResolverSamples"); var innerType = analyzerResult.CallGraph.GetJitType("Tests.Model.SignatureResolverSamples+InnerClass"); foreach (SyntaxNode node in model.SyntaxTree.GetRoot().DescendantNodes()) { if (!(node is ConstructorDeclarationSyntax || node is MethodDeclarationSyntax)) { continue; } var methodSymbol = model.GetDeclaredSymbol(node); string signature = SignatureResolver.BuildSignature((IMethodSymbol)methodSymbol); MethodGroup jitMethodGroup; if (jitType.Methods.ContainsKey(methodSymbol.Name)) { jitMethodGroup = jitType.Methods[methodSymbol.Name]; } else { jitMethodGroup = innerType.Methods[methodSymbol.Name]; } var overload = jitMethodGroup.GetAllMethods().FirstOrDefault(m => m.Signature == signature); if (overload == null) { var allMethods = jitMethodGroup.GetAllMethods().ToList(); string expected; if (allMethods.Count == 1) { expected = allMethods[0].Signature; } else { expected = string.Join("\r\n", allMethods.Select(m => m.Signature)); } Assert.Fail("Method: " + methodSymbol.Name + "\r\nExpected / Actual:\r\n" + expected + "\r\n" + signature + "\r\n"); } } }