Пример #1
0
        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());
                }
            }
        }
Пример #2
0
        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");
                }
            }
        }