public void AnalyzeProgram_ConsiderAutoPropertyAndFieldsAsSafe() { //language=cs const string sample = @"using System; using HotPathAllocationAnalyzer.Support; public abstract class FooBase { public string FullName; public string Name { get; } = ""Hello""; public int[] Data { get; } = new int[10]; } public class Foo : FooBase { public int[] Data { get; } = new int[10]; } [HotPathAllocationAnalyzer.Support.NoAllocation] public int PerfCritical(Foo f) { return f.Name.Length + + f.FullName.Length + f.Data.Length; }"; var analyser = new MethodCallAnalyzer(); analyser.AddToWhiteList("string.Length"); analyser.AddToWhiteList("System.Array.Length"); var info = ProcessCode(analyser, sample, ImmutableArray.Create(SyntaxKind.InvocationExpression)); Assert.AreEqual(0, info.Allocations.Count); }
public void AnalyzeProgram_NotAllowCallingExternalMethod_UnlessItIsWhitelisted() { //language=cs const string sample = @"using System; using HotPathAllocationAnalyzer.Support; [HotPathAllocationAnalyzer.Support.NoAllocation] public bool PerfCritical(string str) { return str.Contains(""zig""); }"; var analyser = new MethodCallAnalyzer(); analyser.AddToWhiteList("string.IsNormalized()"); analyser.AddToWhiteList("string.Contains(string)"); var info = ProcessCode(analyser, sample, ImmutableArray.Create(SyntaxKind.InvocationExpression, SyntaxKind.ClassDeclaration)); Assert.AreEqual(0, info.Allocations.Count); }
public void AnalyzeProgram_NotAllowCallingNonGenericWhitelistedMethods() { //language=cs const string sample = @" using System; using System.Collections.Generic; using HotPathAllocationAnalyzer.Support; [HotPathAllocationAnalyzer.Support.NoAllocation] public int PerfCritical<T>(List<T> l, T val) { return l.IndexOf(val); } "; var analyser = new MethodCallAnalyzer(); analyser.AddToWhiteList("System.Collections.Generic.List<double>.IndexOf(double)"); var info = ProcessCode(analyser, sample, ImmutableArray.Create(SyntaxKind.InvocationExpression)); Assert.AreEqual(1, info.Allocations.Count); }
public void AnalyzeProgram_AllowCallingGenericWhitelistedProperty() { //language=cs const string sample = @"using System; using HotPathAllocationAnalyzer; public class DateProvider { public DateTime? Date { [HotPathAllocationAnalyzer.Support.NoAllocation] get; } } [HotPathAllocationAnalyzer.Support.NoAllocation] public DateTime PerfCritical(DateProvider dp) { return dp.Date.Value; }"; var analyser = new MethodCallAnalyzer(); analyser.AddToWhiteList("System.Nullable<T>.Value"); var info = ProcessCode(analyser, sample, ImmutableArray.Create(SyntaxKind.InvocationExpression)); Assert.AreEqual(0, info.Allocations.Count); }