Skip to content

Commit

Permalink
Breaking a string on many lines produce incorrect result if followed …
Browse files Browse the repository at this point in the history
…by a call (#96948)
  • Loading branch information
pedrobsaila committed Feb 14, 2024
1 parent b2e93f8 commit 9844faa
Show file tree
Hide file tree
Showing 3 changed files with 56 additions and 15 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -96,6 +96,7 @@ private string QuoteSnippetStringCStyle(string value)

b.Append('\"');

bool isStringMultiline = false;
int i = 0;
while (i < value.Length)
{
Expand Down Expand Up @@ -144,16 +145,26 @@ private string QuoteSnippetStringCStyle(string value)
b.Append(value[++i]);
}

b.Append("\" +");
b.Append(Environment.NewLine);
b.Append(indentObj.IndentationString);
b.Append('\"');
if (i != value.Length - 1)
{
b.Append("\" +");
b.Append(Environment.NewLine);
b.Append(indentObj.IndentationString);
b.Append('\"');
isStringMultiline = true;
}
}
++i;
}

b.Append('\"');

if (isStringMultiline)
{
b.Insert(0, '(');
b.Append(')');
}

return b.ToString();
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -539,11 +539,11 @@ public static IEnumerable<object[]> GenerateCodeFromExpression_TestData()
yield return new object[] { new CodePrimitiveExpression("\uDC00"), null, "\"\uDC00\"" };
yield return new object[] { new CodePrimitiveExpression("\uD800"), null, "\"\uD800\"" };
yield return new object[] { new CodePrimitiveExpression("01234567890123456789012345678901234567890123456789012345678901234567890123456789"), null, $"\"01234567890123456789012345678901234567890123456789012345678901234567890123456789\"" };
yield return new object[] { new CodePrimitiveExpression("01234567890123456789012345678901234567890123456789012345678901234567890123456789\uD800"), null, $"\"01234567890123456789012345678901234567890123456789012345678901234567890123456789\uD800\" +{nl} \"\"" };
yield return new object[] { new CodePrimitiveExpression("01234567890123456789012345678901234567890123456789012345678901234567890123456789\uD800\uDC00"), null, $"\"01234567890123456789012345678901234567890123456789012345678901234567890123456789\uD800\uDC00\" +{nl} \"\"" };
yield return new object[] { new CodePrimitiveExpression("01234567890123456789012345678901234567890123456789012345678901234567890123456789\uD800a"), null, $"\"01234567890123456789012345678901234567890123456789012345678901234567890123456789\uD800\" +{nl} \"a\"" };
yield return new object[] { new CodePrimitiveExpression("012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789"), null, $"\"012345678901234567890123456789012345678901234567890123456789012345678901234567890\" +{nl} \"123456789\"" };
yield return new object[] { new CodePrimitiveExpression("012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789"), customOptions, $"\"012345678901234567890123456789012345678901234567890123456789012345678901234567890\" +{nl}$\"123456789\"" };
yield return new object[] { new CodePrimitiveExpression("01234567890123456789012345678901234567890123456789012345678901234567890123456789\uD800"), null, $"\"01234567890123456789012345678901234567890123456789012345678901234567890123456789\uD800\"" };
yield return new object[] { new CodePrimitiveExpression("01234567890123456789012345678901234567890123456789012345678901234567890123456789\uD800\uDC00"), null, $"\"01234567890123456789012345678901234567890123456789012345678901234567890123456789\uD800\uDC00\"" };
yield return new object[] { new CodePrimitiveExpression("01234567890123456789012345678901234567890123456789012345678901234567890123456789\uD800a"), null, $"(\"01234567890123456789012345678901234567890123456789012345678901234567890123456789\uD800\" +{nl} \"a\")" };
yield return new object[] { new CodePrimitiveExpression("012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789"), null, $"(\"012345678901234567890123456789012345678901234567890123456789012345678901234567890\" +{nl} \"123456789\")" };
yield return new object[] { new CodePrimitiveExpression("012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789"), customOptions, $"(\"012345678901234567890123456789012345678901234567890123456789012345678901234567890\" +{nl}$\"123456789\")" };
yield return new object[] { new CodePrimitiveExpression(new string('a', 256)), null, $"@\"{new string('a', 256)}\"" };
yield return new object[] { new CodePrimitiveExpression("\"" + new string('a', 254) + "\""), null, $"@\"\"\"{new string('a', 254)}\"\"\"" };
yield return new object[] { new CodePrimitiveExpression("\"" + new string('a', 1498) + "\""), null, $"@\"\"\"{new string('a', 1498)}\"\"\"" };
Expand Down Expand Up @@ -918,7 +918,7 @@ public static IEnumerable<object[]> GenerateCodeFromStatement_TestData()
new CodeConditionStatement(
new CodePrimitiveExpression(1),
new CodeExpressionStatement(new CodePrimitiveExpression(new string('a', 82)))
), null, $"if (1) {{{nl} \"{new string('a', 81)}\" +{nl} \"a\";{nl}}}{nl}"
), null, $"if (1) {{{nl} (\"{new string('a', 81)}\" +{nl} \"a\");{nl}}}{nl}"
};
yield return new object[]
{
Expand All @@ -928,7 +928,7 @@ public static IEnumerable<object[]> GenerateCodeFromStatement_TestData()
new CodePrimitiveExpression(2),
new CodeExpressionStatement(new CodePrimitiveExpression(new string('a', 82)))
)
), null, $"if (1) {{{nl} if (2) {{{nl} \"{new string('a', 81)}\" +{nl} \"a\";{nl} }}{nl}}}{nl}"
), null, $"if (1) {{{nl} if (2) {{{nl} (\"{new string('a', 81)}\" +{nl} \"a\");{nl} }}{nl}}}{nl}"
};
yield return new object[]
{
Expand All @@ -941,7 +941,7 @@ public static IEnumerable<object[]> GenerateCodeFromStatement_TestData()
new CodeExpressionStatement(new CodePrimitiveExpression(new string('a', 82)))
)
)
), null, $"if (1) {{{nl} if (2) {{{nl} if (3) {{{nl} \"{new string('a', 81)}\" +{nl} \"a\";{nl} }}{nl} }}{nl}}}{nl}"
), null, $"if (1) {{{nl} if (2) {{{nl} if (3) {{{nl} (\"{new string('a', 81)}\" +{nl} \"a\");{nl} }}{nl} }}{nl}}}{nl}"
};
yield return new object[]
{
Expand All @@ -957,7 +957,7 @@ public static IEnumerable<object[]> GenerateCodeFromStatement_TestData()
)
)
)
), null, $"if (1) {{{nl} if (2) {{{nl} if (3) {{{nl} if (4) {{{nl} \"{new string('a', 81)}\" +{nl} \"a\";{nl} }}{nl} }}{nl} }}{nl}}}{nl}"
), null, $"if (1) {{{nl} if (2) {{{nl} if (3) {{{nl} if (4) {{{nl} (\"{new string('a', 81)}\" +{nl} \"a\");{nl} }}{nl} }}{nl} }}{nl}}}{nl}"
};

yield return new object[]
Expand Down Expand Up @@ -1308,6 +1308,7 @@ public static IEnumerable<object[]> GenerateCodeFromStatement_TestData()

[Theory]
[MemberData(nameof(GenerateCodeFromStatement_TestData))]
[SkipOnTargetFramework(TargetFrameworkMonikers.NetFramework, ".NET Framework has different string breakup handling")]
public void GenerateCodeFromStatement_Invoke_Success(CodeStatement e, CodeGeneratorOptions o, string expected)
{
ICodeGenerator generator = GetGenerator();
Expand Down Expand Up @@ -2708,6 +2709,35 @@ public void ValidateIdentifier_InvokeInvalid_ThrowsArgumentException(string valu
AssertExtensions.Throws<ArgumentException>("value", null, () => generator.ValidateIdentifier(value));
}

[Fact]
[SkipOnTargetFramework(TargetFrameworkMonikers.NetFramework, ".NET Framework has different string breakup handling")]
public void LineBreaksShouldPreserveTheWholeStringAsOneValue()
{
CodeStatement e = new CodeAssignStatement(
new CodeFieldReferenceExpression
{
FieldName = "Value",
TargetObject = new CodeTypeReferenceExpression("PF")
},
new CodeMethodInvokeExpression
{
Parameters =
{
new CodePrimitiveExpression('|')
},
Method = new CodeMethodReferenceExpression
{
MethodName = "MethodName",
TargetObject = new CodePrimitiveExpression(new string('*', 82))
}
}
);
ICodeGenerator generator = GetGenerator();
var writer = new StringWriter();
generator.GenerateCodeFromStatement(e, writer, new CodeGeneratorOptions());
AssertEqualLong("PF.Value = (\"*********************************************************************************\" +" + writer.NewLine + " \"*\").MethodName('|');" + writer.NewLine, writer.ToString());
}

private static ICodeGenerator GetGenerator()
{
#pragma warning disable 0618
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -59,7 +59,7 @@ public void DefaultScenario()
Assert.Contains(@"public partial class SerializableSquare : object, System.Runtime.Serialization.IExtensibleDataObject", code);

Assert.Contains(@"namespace System.Runtime.Serialization.Schema.Tests.DataContracts", code);
Assert.Matches(@"\[System.Runtime.Serialization.DataContractAttribute\(Name\s*=\s*""SerializableNode"", Namespace\s*=\s*""http://schemas.datacontract.org/2004/07/System.Runtime.Serialization.Schema.Tests""\s*\+\s*"".DataContracts""\)\]\s*public partial class SerializableNode : object, System.Runtime.Serialization.IExtensibleDataObject", code);
Assert.Matches(@"\[System.Runtime.Serialization.DataContractAttribute\(Name\s*=\s*""SerializableNode"", Namespace\s*=\s*\(""http://schemas.datacontract.org/2004/07/System.Runtime.Serialization.Schema.Tests""\s*\+\s*"".DataContracts""\)\)\]\s*public partial class SerializableNode : object, System.Runtime.Serialization.IExtensibleDataObject", code);
Assert.Matches(@"\[System.Xml.Serialization.XmlSchemaProviderAttribute\(""ExportSchema""\)\]\s*\[System.Xml.Serialization.XmlRootAttribute\(ElementName\s*=\s*""XmlSerializerPersonElement"", Namespace\s*=\s*""""\)\]\s*public partial class XmlSerializerPerson : object, System.Xml.Serialization.IXmlSerializable", code);
}

Expand Down Expand Up @@ -92,7 +92,7 @@ public void WithReferencedType()
Assert.Matches(@"\[System.Runtime.Serialization.DataMemberAttribute\(\)\]\s*public System.Runtime.Serialization.Schema.Tests.DataContracts.SerializableCircle Circle", code);

Assert.Contains(@"namespace System.Runtime.Serialization.Schema.Tests.DataContracts", code);
Assert.Matches(@"\[System.Runtime.Serialization.DataContractAttribute\(Name\s*=\s*""SerializableNode"", Namespace\s*=\s*""http://schemas.datacontract.org/2004/07/System.Runtime.Serialization.Schema.Tests""\s*\+\s*"".DataContracts""\)\]\s*public partial class SerializableNode : object, System.Runtime.Serialization.IExtensibleDataObject", code);
Assert.Matches(@"\[System.Runtime.Serialization.DataContractAttribute\(Name\s*=\s*""SerializableNode"", Namespace\s*=\s*\(""http://schemas.datacontract.org/2004/07/System.Runtime.Serialization.Schema.Tests""\s*\+\s*"".DataContracts""\)\)\]\s*public partial class SerializableNode : object, System.Runtime.Serialization.IExtensibleDataObject", code);
Assert.Matches(@"\[System.Xml.Serialization.XmlSchemaProviderAttribute\(""ExportSchema""\)\]\s*\[System.Xml.Serialization.XmlRootAttribute\(ElementName\s*=\s*""XmlSerializerPersonElement"", Namespace\s*=\s*""""\)\]\s*public partial class XmlSerializerPerson : object, System.Xml.Serialization.IXmlSerializable", code);
Assert.DoesNotContain(@"public partial class SerializableSquare : object, System.Runtime.Serialization.IExtensibleDataObject", code);
}
Expand Down

0 comments on commit 9844faa

Please sign in to comment.