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); }