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