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.AreEqual(1, info.Allocations.Count(d => d.Id == "HeapAnalyzerBoxingRule")); Assert.AreEqual(4, info.Allocations.Count(d => d.Id == "HeapAnalyzerStringConcatRule")); //### 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(2, 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); //Diagnostic: (2,51): warning HeapAnalyzerStringConcatRule: Considering using StringBuilder AssertEx.ContainsDiagnostic(info.Allocations, ConcatenationAllocationAnalyzer.StringConcatenationAllocationRule.Id, line: 2, character: 51); }