コード例 #1
0
        public static IEnumerable <ISymbol> AnalyzeCode(string code)
        {
            var syntaxTree  = CSharpSyntaxTree.ParseText(code);
            var compilation = CSharpCompilation.Create("CoreFX", new[] { syntaxTree })
                              .AddReferences(MetadataReference.CreateFromFile(typeof(object).Assembly.Location))
                              .AddReferences(MetadataReference.CreateFromFile(typeof(List <>).Assembly.Location));

            var semanticModel = compilation.GetSemanticModel(syntaxTree);

            var root = syntaxTree.GetRoot();

            var locksAndObjectCreationsWalker = new LocksAndObjectCreationsWalker(semanticModel);

            locksAndObjectCreationsWalker.Visit(root);
            var newObjectsAndLocks = locksAndObjectCreationsWalker.NewObjectsAndLocks;

            if (newObjectsAndLocks.Count > 0)
            {
                var lockWalker = new NonLockedObjectsWalker(newObjectsAndLocks, semanticModel);

                lockWalker.Visit(root);
                return(lockWalker.PotentialIssuesFound);
            }

            return(Enumerable.Empty <ISymbol>());
        }
        public void InvokeWithSomeCode(string code, int objectsCount, string expectedName)
        {
            var syntaxTree    = GetSyntaxTree(code);
            var semanticModel = GetSemanticModel(syntaxTree);

            var locksAndObjectCreationWalkerDebug = new LocksAndObjectCreationsWalker(semanticModel);

            locksAndObjectCreationWalkerDebug.Visit(syntaxTree.GetRoot());
            Assert.AreEqual(objectsCount, locksAndObjectCreationWalkerDebug.NewObjectsAndLocks.Count);
            Assert.AreEqual(expectedName, locksAndObjectCreationWalkerDebug.NewObjectsAndLocks.First().Key.Name);
        }