public void ConcatenationAllocation_Basic()
        {
            var sampleProgram =
                @"using System;

var withBoxing = 5.ToString() + ':' + 8.ToString(); // Boxing on ':'
var withoutBoxing = 5.ToString() + "":"" + 8.ToString();
";

            var analyser = new ConcatenationAllocationAnalyzer();
            var info     = ProcessCode(analyser, sampleProgram, ImmutableArray.Create(SyntaxKind.AddExpression, SyntaxKind.AddAssignmentExpression));

            Assert.Equal(1, info.Allocations.Count(d => d.Id == "PAAHeapAnalyzerBoxingRule"));
            Assert.Equal(4, info.Allocations.Count(d => d.Id == "PAAHeapAnalyzerStringConcatRule"));

            //### CODE ### 5.ToString() + ':' + 8.ToString()
            //*** Diagnostic: (9,45): warning HeapAnalyzerBoxingRule: Value type (char) is being boxed to a reference type for a string concatenation.
            AssertEx.ContainsDiagnostic(info.Allocations, id: ConcatenationAllocationAnalyzer.ValueTypeToReferenceTypeInAStringConcatenationRule.Id, line: 3, character: 33);
            // Diagnostic: (9,43): warning HeapAnalyzerStringConcatRule: Considering using StringBuilder
            AssertEx.ContainsDiagnostic(info.Allocations, id: ConcatenationAllocationAnalyzer.StringConcatenationAllocationRule.Id, line: 3, character: 31);
            // Diagnostic: (9,49): warning HeapAnalyzerStringConcatRule: Considering using StringBuilder
            AssertEx.ContainsDiagnostic(info.Allocations, id: ConcatenationAllocationAnalyzer.StringConcatenationAllocationRule.Id, line: 3, character: 37);

            //### CODE ### 5.ToString() + ":" + 8.ToString()
            // Diagnostic: (10,46): warning HeapAnalyzerStringConcatRule: Considering using StringBuilder
            AssertEx.ContainsDiagnostic(info.Allocations, id: ConcatenationAllocationAnalyzer.StringConcatenationAllocationRule.Id, line: 4, character: 34);
            // Diagnostic: (10,52): warning HeapAnalyzerStringConcatRule: Considering using StringBuilder
            AssertEx.ContainsDiagnostic(info.Allocations, id: ConcatenationAllocationAnalyzer.StringConcatenationAllocationRule.Id, line: 4, character: 40);
        }
Пример #2
0
        public void Non_constant_value_types_in_CSharp_string_concatenation()
        {
            var @script =
                @"char c = 'c'; //F();
                string s1 = ""char value will box"" + c;";
            var analyser = new ConcatenationAllocationAnalyzer();
            var info     = ProcessCode(analyser, @script, ImmutableArray.Create(SyntaxKind.AddExpression, SyntaxKind.AddAssignmentExpression));

            Assert.AreEqual(1, info.Allocations.Count);
            //Diagnostic: (2,53): warning HeapAnalyzerBoxingRule: Value type (char) is being boxed to a reference type for a string concatenation.
            AssertEx.ContainsDiagnostic(info.Allocations, ConcatenationAllocationAnalyzer.ValueTypeToReferenceTypeInAStringConcatenationRule.Id, line: 2, character: 53);
        }
Пример #3
0
        public void ConcatenationAllocation_Basic()
        {
            var snippet0 = @"string s0 = ""hello"" + 0.ToString() + ""world"" + 1.ToString();";
            var snippet1 = @"string s2 = ""ohell"" + 2.ToString() + ""world"" + 3.ToString() + 4.ToString();";

            var analyser = new ConcatenationAllocationAnalyzer();
            var info0    = ProcessCode(analyser, snippet0, ImmutableArray.Create(SyntaxKind.AddExpression, SyntaxKind.AddAssignmentExpression));
            var info1    = ProcessCode(analyser, snippet1, ImmutableArray.Create(SyntaxKind.AddExpression, SyntaxKind.AddAssignmentExpression));

            Assert.AreEqual(0, info0.Allocations.Count(d => d.Id == AllocationRules.StringConcatenationAllocationRule.Id));
            Assert.AreEqual(1, info1.Allocations.Count(d => d.Id == AllocationRules.StringConcatenationAllocationRule.Id));
            AssertEx.ContainsDiagnostic(info1.Allocations, id: AllocationRules.StringConcatenationAllocationRule.Id, line: 1, character: 13);
        }
Пример #4
0
        public void ConcatenationAllocation_DoNotWarnForConst()
        {
            var snippets = new[]
            {
                @"const string s0 = nameof(System.String) + ""."" + nameof(System.String);",
                @"const string s0 = nameof(System.String) + ""."";",
                @"string s0 = nameof(System.String) + ""."" + nameof(System.String);",
                @"string s0 = nameof(System.String) + ""."";"
            };

            var analyser = new ConcatenationAllocationAnalyzer();

            foreach (var snippet in snippets)
            {
                var info = ProcessCode(analyser, snippet, ImmutableArray.Create(SyntaxKind.AddExpression, SyntaxKind.AddAssignmentExpression));
                Assert.AreEqual(0, info.Allocations.Count);
            }
        }
Пример #5
0
        public void ConcatenationAllocation_DoNotWarnForOptimizedValueTypes()
        {
            var snippets = new[]
            {
                @"string s0 = nameof(System.String) + '-';",
                @"string s0 = nameof(System.String) + true;",
                @"string s0 = nameof(System.String) + new System.IntPtr();",
                @"string s0 = nameof(System.String) + new System.UIntPtr();"
            };

            var analyser = new ConcatenationAllocationAnalyzer();

            foreach (var snippet in snippets)
            {
                var info = ProcessCode(analyser, snippet, ImmutableArray.Create(SyntaxKind.AddExpression, SyntaxKind.AddAssignmentExpression));
                Assert.AreEqual(0, info.Allocations.Count(x => x.Id == AllocationRules.ValueTypeToReferenceTypeInAStringConcatenationRule.Id));
            }
        }