Browse Source

corrected conversion of entity references

git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/branches/vbnet@6052 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61
pull/1/head
Siegfried Pammer 16 years ago
parent
commit
6ee267417b
  1. 26
      src/Libraries/NRefactory/Project/Src/Visitors/VBNetConstructsConvertVisitor.cs
  2. 22
      src/Libraries/NRefactory/Test/Output/CSharp/VBNetToCSharpConverterTest.cs

26
src/Libraries/NRefactory/Project/Src/Visitors/VBNetConstructsConvertVisitor.cs

@ -533,25 +533,30 @@ namespace ICSharpCode.NRefactory.Visitors
public override object VisitXmlContentExpression(XmlContentExpression xmlContentExpression, object data) public override object VisitXmlContentExpression(XmlContentExpression xmlContentExpression, object data)
{ {
ObjectCreateExpression newNode = ConvertXmlContentExpression(xmlContentExpression); Expression newNode = ConvertXmlContentExpression(xmlContentExpression);
if (newNode == null) if (newNode == null)
return base.VisitXmlContentExpression(xmlContentExpression, data); return base.VisitXmlContentExpression(xmlContentExpression, data);
ReplaceCurrentNode(newNode); ReplaceCurrentNode(newNode);
return base.VisitObjectCreateExpression(newNode, data); if (newNode is ObjectCreateExpression)
return base.VisitObjectCreateExpression((ObjectCreateExpression)newNode, data);
else if (newNode is PrimitiveExpression)
return base.VisitPrimitiveExpression((PrimitiveExpression)newNode , data);
return null;
} }
ObjectCreateExpression ConvertXmlContentExpression(XmlContentExpression xmlContentExpression) Expression ConvertXmlContentExpression(XmlContentExpression xmlContentExpression)
{ {
ObjectCreateExpression newNode = null; Expression newNode = null;
switch (xmlContentExpression.Type) { switch (xmlContentExpression.Type) {
case XmlContentType.Comment: case XmlContentType.Comment:
newNode = new ObjectCreateExpression(new TypeReference("XComment"), Expressions(xmlContentExpression.Content)); newNode = new ObjectCreateExpression(new TypeReference("XComment"), Expressions(xmlContentExpression.Content));
break; break;
case XmlContentType.Text: case XmlContentType.Text:
newNode = new ObjectCreateExpression(new TypeReference("XText"), Expressions(xmlContentExpression.Content)); newNode = new PrimitiveExpression(ConvertEntities(xmlContentExpression.Content));
break; break;
case XmlContentType.CData: case XmlContentType.CData:
newNode = new ObjectCreateExpression(new TypeReference("XCData"), Expressions(xmlContentExpression.Content)); newNode = new ObjectCreateExpression(new TypeReference("XCData"), Expressions(xmlContentExpression.Content));
@ -578,6 +583,15 @@ namespace ICSharpCode.NRefactory.Visitors
return newNode; return newNode;
} }
string ConvertEntities(string content)
{
try {
return XElement.Parse("<Dummy>" + content + "</Dummy>").Value;
} catch (XmlException) {
return content;
}
}
public override object VisitXmlDocumentExpression(XmlDocumentExpression xmlDocumentExpression, object data) public override object VisitXmlDocumentExpression(XmlDocumentExpression xmlDocumentExpression, object data)
{ {
var newNode = new ObjectCreateExpression(new TypeReference("XDocument"), null); var newNode = new ObjectCreateExpression(new TypeReference("XDocument"), null);
@ -608,7 +622,7 @@ namespace ICSharpCode.NRefactory.Visitors
var a = attr as XmlAttributeExpression; var a = attr as XmlAttributeExpression;
newNode.Parameters.Add(new ObjectCreateExpression(new TypeReference("XAttribute"), new List<Expression> { newNode.Parameters.Add(new ObjectCreateExpression(new TypeReference("XAttribute"), new List<Expression> {
new PrimitiveExpression(a.Name), new PrimitiveExpression(a.Name),
a.IsLiteralValue ? new PrimitiveExpression(a.LiteralValue) : a.ExpressionValue a.IsLiteralValue ? new PrimitiveExpression(ConvertEntities(a.LiteralValue)) : a.ExpressionValue
})); }));
} else if (attr is XmlEmbeddedExpression) { } else if (attr is XmlEmbeddedExpression) {
newNode.Parameters.Add((attr as XmlEmbeddedExpression).InlineVBExpression); newNode.Parameters.Add((attr as XmlEmbeddedExpression).InlineVBExpression);

22
src/Libraries/NRefactory/Test/Output/CSharp/VBNetToCSharpConverterTest.cs

@ -811,21 +811,21 @@ static bool InitStaticVariableHelper(Microsoft.VisualBasic.CompilerServices.Stat
public void XmlNestedElement2() public void XmlNestedElement2()
{ {
TestStatement("Dim xml = <Test> <Test2 /> hello </Test>", TestStatement("Dim xml = <Test> <Test2 /> hello </Test>",
@"var xml = new XElement(""Test"", new XElement(""Test2""), new XText("" hello ""));"); @"var xml = new XElement(""Test"", new XElement(""Test2""), "" hello "");");
} }
[Test] [Test]
public void XmlNestedElement3() public void XmlNestedElement3()
{ {
TestStatement("Dim xml = <Test> <Test2 a='b' /> hello </Test>", TestStatement("Dim xml = <Test> <Test2 a='b' /> hello </Test>",
@"var xml = new XElement(""Test"", new XElement(""Test2"", new XAttribute(""a"", ""b"")), new XText("" hello ""));"); @"var xml = new XElement(""Test"", new XElement(""Test2"", new XAttribute(""a"", ""b"")), "" hello "");");
} }
[Test] [Test]
public void XmlNestedElement4() public void XmlNestedElement4()
{ {
TestStatement("Dim xml = <Test> <Test2 a='b' /> hello \t<![CDATA[any & <>]]></Test>", TestStatement("Dim xml = <Test> <Test2 a='b' /> hello \t<![CDATA[any & <>]]></Test>",
@"var xml = new XElement(""Test"", new XElement(""Test2"", new XAttribute(""a"", ""b"")), new XText("" hello \t""), new XCData(""any & <>""));"); @"var xml = new XElement(""Test"", new XElement(""Test2"", new XAttribute(""a"", ""b"")), "" hello \t"", new XCData(""any & <>""));");
} }
[Test] [Test]
@ -882,7 +882,7 @@ static bool InitStaticVariableHelper(Microsoft.VisualBasic.CompilerServices.Stat
public void XmlEmbeddedExpression() public void XmlEmbeddedExpression()
{ {
TestStatement(@"Dim xml = <<%= name %>>Test</>", TestStatement(@"Dim xml = <<%= name %>>Test</>",
@"var xml = new XElement(name, new XText(""Test""));"); @"var xml = new XElement(name, ""Test"");");
} }
[Test] [Test]
@ -891,5 +891,19 @@ static bool InitStaticVariableHelper(Microsoft.VisualBasic.CompilerServices.Stat
TestStatement(@"Dim xml = <<%= name %>><%= content %></>", TestStatement(@"Dim xml = <<%= name %>><%= content %></>",
@"var xml = new XElement(name, content);"); @"var xml = new XElement(name, content);");
} }
[Test]
public void XmlEntityReference()
{
TestStatement(@"Dim xml = <A b=""&quot;""/>",
@"var xml = new XElement(""A"", new XAttribute(""b"", ""\""""));");
}
[Test]
public void XmlEntityReference2()
{
TestStatement(@"Dim xml = <A>&quot;</A>",
@"var xml = new XElement(""A"", ""\"""");");
}
} }
} }

Loading…
Cancel
Save