diff --git a/src/AddIns/BackendBindings/Boo/NRefactoryToBooConverter/Project/ConvertVisitor.cs b/src/AddIns/BackendBindings/Boo/NRefactoryToBooConverter/Project/ConvertVisitor.cs
index edf8dfc1f6..e50182dc05 100644
--- a/src/AddIns/BackendBindings/Boo/NRefactoryToBooConverter/Project/ConvertVisitor.cs
+++ b/src/AddIns/BackendBindings/Boo/NRefactoryToBooConverter/Project/ConvertVisitor.cs
@@ -265,7 +265,7 @@ namespace NRefactoryToBooConverter
throw new NotImplementedException();
}
- public object VisitXmlAttribute(XmlAttribute xmlAttribute, object data)
+ public object VisitXmlAttributeExpression(XmlAttributeExpression xmlAttributeExpression, object data)
{
throw new NotImplementedException();
}
diff --git a/src/Libraries/NRefactory/NRefactoryASTGenerator/AST/Expressions.cs b/src/Libraries/NRefactory/NRefactoryASTGenerator/AST/Expressions.cs
index 1ed5d8f2c5..4f46e56926 100644
--- a/src/Libraries/NRefactory/NRefactoryASTGenerator/AST/Expressions.cs
+++ b/src/Libraries/NRefactory/NRefactoryASTGenerator/AST/Expressions.cs
@@ -431,7 +431,7 @@ namespace NRefactoryASTGenerator.Ast
}
[IncludeBoolProperty("IsLiteralValue", "return expressionValue.IsNull;")]
- class XmlAttribute : XmlExpression {
+ class XmlAttributeExpression : XmlExpression {
string name;
string literalValue;
bool useDoubleQuotes;
diff --git a/src/Libraries/NRefactory/Project/NRefactory.csproj b/src/Libraries/NRefactory/Project/NRefactory.csproj
index 4df2a26d86..6595babc14 100644
--- a/src/Libraries/NRefactory/Project/NRefactory.csproj
+++ b/src/Libraries/NRefactory/Project/NRefactory.csproj
@@ -55,6 +55,9 @@
3.5
+
+ 3.5
+
diff --git a/src/Libraries/NRefactory/Project/Src/Ast/Generated.cs b/src/Libraries/NRefactory/Project/Src/Ast/Generated.cs
index be221f67a1..1ce85dd0fe 100644
--- a/src/Libraries/NRefactory/Project/Src/Ast/Generated.cs
+++ b/src/Libraries/NRefactory/Project/Src/Ast/Generated.cs
@@ -5458,7 +5458,7 @@ public UsingDeclaration(string @namespace, TypeReference alias) { usings = new L
}
}
- public class XmlAttribute : XmlExpression {
+ public class XmlAttributeExpression : XmlExpression {
string name;
@@ -5505,7 +5505,7 @@ public UsingDeclaration(string @namespace, TypeReference alias) { usings = new L
}
}
- public XmlAttribute() {
+ public XmlAttributeExpression() {
name = "";
literalValue = "";
expressionValue = Expression.Null;
@@ -5518,11 +5518,12 @@ public UsingDeclaration(string @namespace, TypeReference alias) { usings = new L
}
public override object AcceptVisitor(IAstVisitor visitor, object data) {
- return visitor.VisitXmlAttribute(this, data);
+ return visitor.VisitXmlAttributeExpression(this, data);
}
public override string ToString() {
- return string.Format("[XmlAttribute Name={0} LiteralValue={1} UseDoubleQuotes={2} ExpressionValue={3}]", Name, LiteralValue, UseDoubleQuotes, ExpressionValue);
+ return string.Format("[XmlAttributeExpression Name={0} LiteralValue={1} UseDoubleQuotes={2} ExpressionV" +
+ "alue={3}]", Name, LiteralValue, UseDoubleQuotes, ExpressionValue);
}
}
diff --git a/src/Libraries/NRefactory/Project/Src/IAstVisitor.cs b/src/Libraries/NRefactory/Project/Src/IAstVisitor.cs
index eac50291f0..b0bc662112 100644
--- a/src/Libraries/NRefactory/Project/Src/IAstVisitor.cs
+++ b/src/Libraries/NRefactory/Project/Src/IAstVisitor.cs
@@ -261,7 +261,7 @@ namespace ICSharpCode.NRefactory {
object VisitWithStatement(WithStatement withStatement, object data);
- object VisitXmlAttribute(XmlAttribute xmlAttribute, object data);
+ object VisitXmlAttributeExpression(XmlAttributeExpression xmlAttributeExpression, object data);
object VisitXmlContentExpression(XmlContentExpression xmlContentExpression, object data);
diff --git a/src/Libraries/NRefactory/Project/Src/Parser/VBNet/Parser.cs b/src/Libraries/NRefactory/Project/Src/Parser/VBNet/Parser.cs
index d1cec23aa7..41beea046d 100644
--- a/src/Libraries/NRefactory/Project/Src/Parser/VBNet/Parser.cs
+++ b/src/Libraries/NRefactory/Project/Src/Parser/VBNet/Parser.cs
@@ -4794,7 +4794,7 @@ out expressionValue);
} else SynErr(290);
#line 1847 "VBNET.ATG"
- attrs.Add(new XmlAttribute() { Name = name, ExpressionValue = expressionValue, LiteralValue = literalValue, UseDoubleQuotes = useDoubleQuotes, StartLocation = start, EndLocation = t.EndLocation });
+ attrs.Add(new XmlAttributeExpression() { Name = name, ExpressionValue = expressionValue, LiteralValue = literalValue, UseDoubleQuotes = useDoubleQuotes, StartLocation = start, EndLocation = t.EndLocation });
} else if (la.kind == 12) {
lexer.NextToken();
diff --git a/src/Libraries/NRefactory/Project/Src/Parser/VBNet/VBNET.ATG b/src/Libraries/NRefactory/Project/Src/Parser/VBNet/VBNET.ATG
index f892d0df4e..8383fbdac7 100644
--- a/src/Libraries/NRefactory/Project/Src/Parser/VBNet/VBNET.ATG
+++ b/src/Libraries/NRefactory/Project/Src/Parser/VBNet/VBNET.ATG
@@ -1844,7 +1844,7 @@ XmlAttribute attrs>
Identifier (. string name = t.val; .) "="
(. string literalValue = null; Expression expressionValue = null; bool useDoubleQuotes = false; .)
( LiteralString (. literalValue = t.literalValue.ToString(); useDoubleQuotes = t.val[0] == '"'; .) | XmlStartInlineVB Expr XmlEndInlineVB )
- (. attrs.Add(new XmlAttribute() { Name = name, ExpressionValue = expressionValue, LiteralValue = literalValue, UseDoubleQuotes = useDoubleQuotes, StartLocation = start, EndLocation = t.EndLocation }); .)
+ (. attrs.Add(new XmlAttributeExpression() { Name = name, ExpressionValue = expressionValue, LiteralValue = literalValue, UseDoubleQuotes = useDoubleQuotes, StartLocation = start, EndLocation = t.EndLocation }); .)
|
XmlStartInlineVB (. Expression innerExpression; .) Expr XmlEndInlineVB
(. attrs.Add(new XmlEmbeddedExpression() { InlineVBExpression = innerExpression, StartLocation = start, EndLocation = t.EndLocation }); .)
diff --git a/src/Libraries/NRefactory/Project/Src/PrettyPrinter/VBNet/VBNetOutputVisitor.cs b/src/Libraries/NRefactory/Project/Src/PrettyPrinter/VBNet/VBNetOutputVisitor.cs
index 6c0f78f10e..e2ad05aa2a 100644
--- a/src/Libraries/NRefactory/Project/Src/PrettyPrinter/VBNet/VBNetOutputVisitor.cs
+++ b/src/Libraries/NRefactory/Project/Src/PrettyPrinter/VBNet/VBNetOutputVisitor.cs
@@ -3188,22 +3188,22 @@ namespace ICSharpCode.NRefactory.PrettyPrinter
return null;
}
- public override object TrackedVisitXmlAttribute(XmlAttribute xmlAttribute, object data)
+ public override object TrackedVisitXmlAttributeExpression(XmlAttributeExpression xmlAttributeExpression, object data)
{
- outputFormatter.PrintText(xmlAttribute.Name);
+ outputFormatter.PrintText(xmlAttributeExpression.Name);
outputFormatter.PrintToken(Tokens.Assign);
- if (xmlAttribute.IsLiteralValue) {
- if (xmlAttribute.UseDoubleQuotes)
+ if (xmlAttributeExpression.IsLiteralValue) {
+ if (xmlAttributeExpression.UseDoubleQuotes)
outputFormatter.PrintText("\"");
else
outputFormatter.PrintText("'");
- outputFormatter.PrintText(xmlAttribute.LiteralValue);
- if (xmlAttribute.UseDoubleQuotes)
+ outputFormatter.PrintText(xmlAttributeExpression.LiteralValue);
+ if (xmlAttributeExpression.UseDoubleQuotes)
outputFormatter.PrintText("\"");
else
outputFormatter.PrintText("'");
} else
- xmlAttribute.ExpressionValue.AcceptVisitor(this, data);
+ xmlAttributeExpression.ExpressionValue.AcceptVisitor(this, data);
return null;
}
diff --git a/src/Libraries/NRefactory/Project/Src/Visitors/AbstractASTVisitor.cs b/src/Libraries/NRefactory/Project/Src/Visitors/AbstractASTVisitor.cs
index 875e2b5928..c1f876d666 100644
--- a/src/Libraries/NRefactory/Project/Src/Visitors/AbstractASTVisitor.cs
+++ b/src/Libraries/NRefactory/Project/Src/Visitors/AbstractASTVisitor.cs
@@ -1251,10 +1251,10 @@ namespace ICSharpCode.NRefactory.Visitors {
return withStatement.Body.AcceptVisitor(this, data);
}
- public virtual object VisitXmlAttribute(XmlAttribute xmlAttribute, object data) {
- Debug.Assert((xmlAttribute != null));
- Debug.Assert((xmlAttribute.ExpressionValue != null));
- return xmlAttribute.ExpressionValue.AcceptVisitor(this, data);
+ public virtual object VisitXmlAttributeExpression(XmlAttributeExpression xmlAttributeExpression, object data) {
+ Debug.Assert((xmlAttributeExpression != null));
+ Debug.Assert((xmlAttributeExpression.ExpressionValue != null));
+ return xmlAttributeExpression.ExpressionValue.AcceptVisitor(this, data);
}
public virtual object VisitXmlContentExpression(XmlContentExpression xmlContentExpression, object data) {
diff --git a/src/Libraries/NRefactory/Project/Src/Visitors/AbstractAstTransformer.cs b/src/Libraries/NRefactory/Project/Src/Visitors/AbstractAstTransformer.cs
index 7aab97572a..ee4f8208de 100644
--- a/src/Libraries/NRefactory/Project/Src/Visitors/AbstractAstTransformer.cs
+++ b/src/Libraries/NRefactory/Project/Src/Visitors/AbstractAstTransformer.cs
@@ -2244,12 +2244,12 @@ namespace ICSharpCode.NRefactory.Visitors {
return null;
}
- public virtual object VisitXmlAttribute(XmlAttribute xmlAttribute, object data) {
- Debug.Assert((xmlAttribute != null));
- Debug.Assert((xmlAttribute.ExpressionValue != null));
- nodeStack.Push(xmlAttribute.ExpressionValue);
- xmlAttribute.ExpressionValue.AcceptVisitor(this, data);
- xmlAttribute.ExpressionValue = ((Expression)(nodeStack.Pop()));
+ public virtual object VisitXmlAttributeExpression(XmlAttributeExpression xmlAttributeExpression, object data) {
+ Debug.Assert((xmlAttributeExpression != null));
+ Debug.Assert((xmlAttributeExpression.ExpressionValue != null));
+ nodeStack.Push(xmlAttributeExpression.ExpressionValue);
+ xmlAttributeExpression.ExpressionValue.AcceptVisitor(this, data);
+ xmlAttributeExpression.ExpressionValue = ((Expression)(nodeStack.Pop()));
return null;
}
diff --git a/src/Libraries/NRefactory/Project/Src/Visitors/NodeTrackingAstVisitor.cs b/src/Libraries/NRefactory/Project/Src/Visitors/NodeTrackingAstVisitor.cs
index 26bde2b941..84b3621bda 100644
--- a/src/Libraries/NRefactory/Project/Src/Visitors/NodeTrackingAstVisitor.cs
+++ b/src/Libraries/NRefactory/Project/Src/Visitors/NodeTrackingAstVisitor.cs
@@ -892,10 +892,10 @@ namespace ICSharpCode.NRefactory.Visitors {
return result;
}
- public sealed override object VisitXmlAttribute(XmlAttribute xmlAttribute, object data) {
- this.BeginVisit(xmlAttribute);
- object result = this.TrackedVisitXmlAttribute(xmlAttribute, data);
- this.EndVisit(xmlAttribute);
+ public sealed override object VisitXmlAttributeExpression(XmlAttributeExpression xmlAttributeExpression, object data) {
+ this.BeginVisit(xmlAttributeExpression);
+ object result = this.TrackedVisitXmlAttributeExpression(xmlAttributeExpression, data);
+ this.EndVisit(xmlAttributeExpression);
return result;
}
@@ -1433,8 +1433,8 @@ namespace ICSharpCode.NRefactory.Visitors {
return base.VisitWithStatement(withStatement, data);
}
- public virtual object TrackedVisitXmlAttribute(XmlAttribute xmlAttribute, object data) {
- return base.VisitXmlAttribute(xmlAttribute, data);
+ public virtual object TrackedVisitXmlAttributeExpression(XmlAttributeExpression xmlAttributeExpression, object data) {
+ return base.VisitXmlAttributeExpression(xmlAttributeExpression, data);
}
public virtual object TrackedVisitXmlContentExpression(XmlContentExpression xmlContentExpression, object data) {
diff --git a/src/Libraries/NRefactory/Project/Src/Visitors/NotImplementedAstVisitor.cs b/src/Libraries/NRefactory/Project/Src/Visitors/NotImplementedAstVisitor.cs
index 4adc9b2677..71dd07cdce 100644
--- a/src/Libraries/NRefactory/Project/Src/Visitors/NotImplementedAstVisitor.cs
+++ b/src/Libraries/NRefactory/Project/Src/Visitors/NotImplementedAstVisitor.cs
@@ -510,8 +510,8 @@ namespace ICSharpCode.NRefactory.Visitors {
throw new global::System.NotImplementedException("WithStatement");
}
- public virtual object VisitXmlAttribute(XmlAttribute xmlAttribute, object data) {
- throw new global::System.NotImplementedException("XmlAttribute");
+ public virtual object VisitXmlAttributeExpression(XmlAttributeExpression xmlAttributeExpression, object data) {
+ throw new global::System.NotImplementedException("XmlAttributeExpression");
}
public virtual object VisitXmlContentExpression(XmlContentExpression xmlContentExpression, object data) {
diff --git a/src/Libraries/NRefactory/Project/Src/Visitors/VBNetConstructsConvertVisitor.cs b/src/Libraries/NRefactory/Project/Src/Visitors/VBNetConstructsConvertVisitor.cs
index 89459f4c6b..f7ea2ce4e6 100644
--- a/src/Libraries/NRefactory/Project/Src/Visitors/VBNetConstructsConvertVisitor.cs
+++ b/src/Libraries/NRefactory/Project/Src/Visitors/VBNetConstructsConvertVisitor.cs
@@ -5,11 +5,15 @@
// $Revision$
//
-using ICSharpCode.NRefactory.AstBuilder;
using System;
using System.Collections.Generic;
+using System.Linq;
using System.Reflection;
+using System.Xml;
+using System.Xml.Linq;
+
using ICSharpCode.NRefactory.Ast;
+using ICSharpCode.NRefactory.AstBuilder;
using Attribute = ICSharpCode.NRefactory.Ast.Attribute;
namespace ICSharpCode.NRefactory.Visitors
@@ -29,6 +33,7 @@ namespace ICSharpCode.NRefactory.Visitors
// Array creation => add 1 to upper bound to get array length
// Comparison with empty string literal -> string.IsNullOrEmpty
// Add default value to local variable declarations without initializer
+ // XML literals -> XLinq
///
/// Specifies whether the "Add default value to local variable declarations without initializer"
@@ -524,5 +529,117 @@ namespace ICSharpCode.NRefactory.Visitors
OptionStrict = optionDeclaration.OptionValue;
return base.VisitOptionDeclaration(optionDeclaration, data);
}
+
+ public override object VisitXmlContentExpression(XmlContentExpression xmlContentExpression, object data)
+ {
+
+ ObjectCreateExpression newNode = ConvertXmlContentExpression(xmlContentExpression);
+
+ if (newNode == null)
+ return base.VisitXmlContentExpression(xmlContentExpression, data);
+
+ ReplaceCurrentNode(newNode);
+
+ return base.VisitObjectCreateExpression(newNode, data);
+ }
+
+ ObjectCreateExpression ConvertXmlContentExpression(XmlContentExpression xmlContentExpression)
+ {
+ ObjectCreateExpression newNode = null;
+ switch (xmlContentExpression.Type) {
+ case XmlContentType.Comment:
+ newNode = new ObjectCreateExpression(new TypeReference("XComment"), Expressions(xmlContentExpression.Content));
+ break;
+ case XmlContentType.Text:
+ newNode = new ObjectCreateExpression(new TypeReference("XText"), Expressions(xmlContentExpression.Content));
+ break;
+ case XmlContentType.CData:
+ newNode = new ObjectCreateExpression(new TypeReference("XCData"), Expressions(xmlContentExpression.Content));
+ break;
+ case XmlContentType.ProcessingInstruction:
+ string content = xmlContentExpression.Content.Trim();
+ if (content.StartsWith("xml", StringComparison.OrdinalIgnoreCase)) {
+ XDeclaration decl;
+ try {
+ decl = XDocument.Parse("" + content + "?>").Declaration;
+ } catch (XmlException) {
+ decl = new XDeclaration(null, null, null);
+ }
+ newNode = new ObjectCreateExpression(new TypeReference("XDeclaration"), Expressions(decl.Version, decl.Encoding, decl.Standalone));
+ } else {
+ string target = content.Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries).FirstOrDefault() ?? "";
+ string piData = content.IndexOf(' ') > -1 ? content.Substring(content.IndexOf(' ')) : "";
+ newNode = new ObjectCreateExpression(new TypeReference("XProcessingInstruction"), Expressions(target, piData));
+ }
+ break;
+ default:
+ throw new Exception("Invalid value for XmlContentType");
+ }
+ return newNode;
+ }
+
+ public override object VisitXmlDocumentExpression(XmlDocumentExpression xmlDocumentExpression, object data)
+ {
+ var newNode = new ObjectCreateExpression(new TypeReference("XDocument"), null);
+
+ foreach (XmlExpression expr in xmlDocumentExpression.Expressions)
+ newNode.Parameters.Add(ConvertXmlExpression(expr));
+
+ ReplaceCurrentNode(newNode);
+
+ return base.VisitObjectCreateExpression(newNode, data);
+ }
+
+ public override object VisitXmlElementExpression(XmlElementExpression xmlElementExpression, object data)
+ {
+ ObjectCreateExpression newNode = ConvertXmlElementExpression(xmlElementExpression);
+
+ ReplaceCurrentNode(newNode);
+
+ return base.VisitObjectCreateExpression(newNode, data);
+ }
+
+ ObjectCreateExpression ConvertXmlElementExpression(XmlElementExpression xmlElementExpression)
+ {
+ var newNode = new ObjectCreateExpression(new TypeReference("XElement"), xmlElementExpression.NameIsExpression ? new List { xmlElementExpression.NameExpression } : Expressions(xmlElementExpression.XmlName));
+
+ foreach (XmlExpression attr in xmlElementExpression.Attributes) {
+ if (attr is XmlAttributeExpression) {
+ var a = attr as XmlAttributeExpression;
+ newNode.Parameters.Add(new ObjectCreateExpression(new TypeReference("XAttribute"), new List {
+ new PrimitiveExpression(a.Name),
+ a.IsLiteralValue ? new PrimitiveExpression(a.LiteralValue) : a.ExpressionValue
+ }));
+ } else if (attr is XmlEmbeddedExpression) {
+ newNode.Parameters.Add((attr as XmlEmbeddedExpression).InlineVBExpression);
+ }
+ }
+
+ foreach (XmlExpression expr in xmlElementExpression.Children) {
+ XmlContentExpression c = expr as XmlContentExpression;
+ // skip whitespace text
+ if (!(expr is XmlContentExpression && c.Type == XmlContentType.Text && string.IsNullOrWhiteSpace(c.Content)))
+ newNode.Parameters.Add(ConvertXmlExpression(expr));
+ }
+
+ return newNode;
+ }
+
+ Expression ConvertXmlExpression(XmlExpression expr)
+ {
+ if (expr is XmlElementExpression)
+ return ConvertXmlElementExpression(expr as XmlElementExpression);
+ else if (expr is XmlContentExpression)
+ return ConvertXmlContentExpression(expr as XmlContentExpression);
+ else if (expr is XmlEmbeddedExpression)
+ return (expr as XmlEmbeddedExpression).InlineVBExpression;
+
+ throw new Exception();
+ }
+
+ List Expressions(params string[] exprs)
+ {
+ return new List(exprs.Select(expr => new PrimitiveExpression(expr)));
+ }
}
}
diff --git a/src/Libraries/NRefactory/Test/Output/CSharp/VBNetToCSharpConverterTest.cs b/src/Libraries/NRefactory/Test/Output/CSharp/VBNetToCSharpConverterTest.cs
index c2b4eac1ef..562aa0b9b8 100644
--- a/src/Libraries/NRefactory/Test/Output/CSharp/VBNetToCSharpConverterTest.cs
+++ b/src/Libraries/NRefactory/Test/Output/CSharp/VBNetToCSharpConverterTest.cs
@@ -779,18 +779,117 @@ static bool InitStaticVariableHelper(Microsoft.VisualBasic.CompilerServices.Stat
TestStatement("Dim x As Integer = CInt(obj)", "int x = Convert.ToInt32(obj);");
}
- [Test, Ignore]
+ [Test]
public void XmlElement()
{
TestStatement("Dim xml = ",
@"var xml = new XElement(""Test"");");
}
- [Test, Ignore]
+ [Test]
+ public void XmlElement2()
+ {
+ TestStatement(@"Dim xml = />",
+ @"var xml = new XElement(""Test"", new XAttribute(""name"", ""test""), new XAttribute(""name2"", testVal));");
+ }
+
+ [Test]
+ public void XmlElement3()
+ {
+ TestStatement(@"Dim xml = <%= testVal2 %> />",
+ @"var xml = new XElement(""Test"", new XAttribute(""name"", ""test""), new XAttribute(""name2"", testVal), testVal2);");
+ }
+
+ [Test]
+ public void XmlNestedElement()
+ {
+ TestStatement("Dim xml = ",
+ @"var xml = new XElement(""Test"", new XElement(""Test2""));");
+ }
+
+ [Test]
+ public void XmlNestedElement2()
+ {
+ TestStatement("Dim xml = hello ",
+ @"var xml = new XElement(""Test"", new XElement(""Test2""), new XText("" hello ""));");
+ }
+
+ [Test]
+ public void XmlNestedElement3()
+ {
+ TestStatement("Dim xml = hello ",
+ @"var xml = new XElement(""Test"", new XElement(""Test2"", new XAttribute(""a"", ""b"")), new XText("" hello ""));");
+ }
+
+ [Test]
+ public void XmlNestedElement4()
+ {
+ TestStatement("Dim xml = hello \t]]>",
+ @"var xml = new XElement(""Test"", new XElement(""Test2"", new XAttribute(""a"", ""b"")), new XText("" hello \t""), new XCData(""any & <>""));");
+ }
+
+ [Test]
public void XmlComment()
{
TestStatement("Dim xml = ",
@"var xml = new XComment("" test "");");
}
+
+ [Test]
+ public void XmlCData()
+ {
+ TestStatement("Dim xml = char]]>",
+ @"var xml = new XCData(""any & <> char"");");
+ }
+
+ [Test]
+ public void XmlProcessingInstruction()
+ {
+ TestStatement("Dim xml = ",
+ @"var xml = new XProcessingInstruction(""target"", "" testcontent"");");
+ }
+
+ [Test]
+ public void XmlDocumentTest()
+ {
+ TestStatement(@"Dim xml = ",
+ @"var xml = new XDocument(new XDeclaration(""1.0"", null, null), new XComment("" test ""), new XElement(""Data"", new XAttribute(""a"", ""true""), new XElement(""A"")), new XComment("" test ""));");
+ }
+
+
+ [Test]
+ public void XmlDocumentTest2()
+ {
+ TestStatement(@"Dim xml = ",
+ @"var xml = new XDocument(new XDeclaration(null, null, null), new XComment("" test ""), new XElement(""Data"", new XAttribute(""a"", ""true""), new XElement(""A"")), new XComment("" test ""));");
+ }
+
+ [Test]
+ public void XmlDocumentTest3()
+ {
+ TestStatement(@"Dim xml = ",
+ @"var xml = new XDocument(new XDeclaration(""1.0"", ""utf-8"", null), new XComment("" test ""), new XElement(""Data"", new XAttribute(""a"", ""true""), new XElement(""A"")), new XComment("" test ""));");
+ }
+
+ [Test]
+ public void XmlDocumentTest4()
+ {
+ TestStatement(@"Dim xml = />",
+ @"var xml = new XDocument(new XDeclaration(""1.0"", ""utf-8"", ""yes""), new XComment("" test ""), new XElement(""Data"", new XAttribute(""a"", ""true""), new XElement(""A"", content)), new XComment("" test ""));");
+ }
+
+ [Test]
+ public void XmlEmbeddedExpression()
+ {
+ TestStatement(@"Dim xml = <<%= name %>>Test>",
+ @"var xml = new XElement(name, new XText(""Test""));");
+ }
+
+ [Test]
+ public void XmlEmbeddedExpression2()
+ {
+ TestStatement(@"Dim xml = <<%= name %>><%= content %>>",
+ @"var xml = new XElement(name, content);");
+ }
}
}
diff --git a/src/Libraries/NRefactory/Test/Output/VBNet/VBNetOutputTest.cs b/src/Libraries/NRefactory/Test/Output/VBNet/VBNetOutputTest.cs
index 174a9e4c2a..f1c5c39a70 100644
--- a/src/Libraries/NRefactory/Test/Output/VBNet/VBNetOutputTest.cs
+++ b/src/Libraries/NRefactory/Test/Output/VBNet/VBNetOutputTest.cs
@@ -598,7 +598,8 @@ End Using");
[Test]
public void XmlSimple()
{
- TestExpression("\n" +
+ TestExpression("\n" +
+ "\n" +
"\n" +
" \n" +
" />\n" +
diff --git a/src/Libraries/NRefactory/Test/Parser/Expressions/XmlExpressionTests.cs b/src/Libraries/NRefactory/Test/Parser/Expressions/XmlExpressionTests.cs
index 60cc4bd81e..2f7895ceea 100644
--- a/src/Libraries/NRefactory/Test/Parser/Expressions/XmlExpressionTests.cs
+++ b/src/Libraries/NRefactory/Test/Parser/Expressions/XmlExpressionTests.cs
@@ -73,8 +73,8 @@ namespace ICSharpCode.NRefactory.Tests.Ast
Assert.AreEqual("Test", element.XmlName);
Assert.IsNotEmpty(element.Attributes);
Assert.AreEqual(1, element.Attributes.Count);
- Assert.IsTrue(element.Attributes[0] is XmlAttribute);
- XmlAttribute attribute = element.Attributes[0] as XmlAttribute;
+ Assert.IsTrue(element.Attributes[0] is XmlAttributeExpression);
+ XmlAttributeExpression attribute = element.Attributes[0] as XmlAttributeExpression;
Assert.AreEqual("id", attribute.Name);
Assert.IsTrue(attribute.IsLiteralValue);
Assert.IsTrue(attribute.ExpressionValue.IsNull);
@@ -94,8 +94,8 @@ namespace ICSharpCode.NRefactory.Tests.Ast
Assert.IsNotEmpty(element.Attributes);
Assert.AreEqual(3, element.Attributes.Count);
- Assert.IsTrue(element.Attributes[0] is XmlAttribute);
- XmlAttribute attribute = element.Attributes[0] as XmlAttribute;
+ Assert.IsTrue(element.Attributes[0] is XmlAttributeExpression);
+ XmlAttributeExpression attribute = element.Attributes[0] as XmlAttributeExpression;
Assert.AreEqual("id", attribute.Name);
Assert.IsTrue(attribute.IsLiteralValue);
Assert.IsTrue(attribute.ExpressionValue.IsNull);
@@ -103,8 +103,8 @@ namespace ICSharpCode.NRefactory.Tests.Ast
Assert.AreEqual(new Location(7,1), attribute.StartLocation);
Assert.AreEqual(new Location(13,1), attribute.EndLocation);
- Assert.IsTrue(element.Attributes[1] is XmlAttribute);
- XmlAttribute attribute2 = element.Attributes[1] as XmlAttribute;
+ Assert.IsTrue(element.Attributes[1] is XmlAttributeExpression);
+ XmlAttributeExpression attribute2 = element.Attributes[1] as XmlAttributeExpression;
Assert.AreEqual("name", attribute2.Name);
Assert.IsFalse(attribute2.IsLiteralValue);
Assert.IsFalse(attribute2.ExpressionValue.IsNull);
@@ -140,16 +140,16 @@ namespace ICSharpCode.NRefactory.Tests.Ast
public void VBNetElementWithAttributeTest()
{
XmlElementExpression element = ParseUtilVBNet.ParseExpression("\n" +
- " \n" +
- " \n" +
- "");
+ " \n" +
+ " \n" +
+ "");
Assert.IsFalse(element.NameIsExpression);
Assert.AreEqual("Test", element.XmlName);
Assert.IsNotEmpty(element.Attributes);
Assert.AreEqual(1, element.Attributes.Count);
- Assert.IsTrue(element.Attributes[0] is XmlAttribute);
- XmlAttribute attribute = element.Attributes[0] as XmlAttribute;
+ Assert.IsTrue(element.Attributes[0] is XmlAttributeExpression);
+ XmlAttributeExpression attribute = element.Attributes[0] as XmlAttributeExpression;
Assert.AreEqual("id", attribute.Name);
Assert.IsTrue(attribute.IsLiteralValue);
Assert.IsTrue(attribute.ExpressionValue.IsNull);
@@ -175,18 +175,18 @@ namespace ICSharpCode.NRefactory.Tests.Ast
public void VBNetElementWithMixedContentTest()
{
XmlElementExpression element = ParseUtilVBNet.ParseExpression("\n" +
- " \n" +
- " \n" +
- " \n" +
- " section]]>\n" +
- "");
+ " \n" +
+ " \n" +
+ " \n" +
+ " section]]>\n" +
+ "");
Assert.IsFalse(element.NameIsExpression);
Assert.AreEqual("Test", element.XmlName);
Assert.IsNotEmpty(element.Attributes);
Assert.AreEqual(1, element.Attributes.Count);
- Assert.IsTrue(element.Attributes[0] is XmlAttribute);
- XmlAttribute attribute = element.Attributes[0] as XmlAttribute;
+ Assert.IsTrue(element.Attributes[0] is XmlAttributeExpression);
+ XmlAttributeExpression attribute = element.Attributes[0] as XmlAttributeExpression;
Assert.AreEqual("id", attribute.Name);
Assert.IsTrue(attribute.IsLiteralValue);
Assert.IsTrue(attribute.ExpressionValue.IsNull);
@@ -212,16 +212,29 @@ namespace ICSharpCode.NRefactory.Tests.Ast
Assert.AreEqual(new Location(8,6), element.EndLocation);
}
+ [Test]
+ public void VBNetElementWithMixedContentTest2()
+ {
+ XmlElementExpression element = ParseUtilVBNet.ParseExpression(" aaaa ");
+ Assert.IsFalse(element.NameIsExpression);
+ Assert.AreEqual("Test", element.XmlName);
+
+ Assert.IsNotEmpty(element.Children);
+ Assert.AreEqual(1, element.Children.Count);
+
+ CheckContent(element.Children[0], " aaaa ", XmlContentType.Text, new Location(7,1), new Location(14,1));
+ }
+
[Test]
public void VBNetProcessingInstructionAndCommentAtEndTest()
{
XmlDocumentExpression document = ParseUtilVBNet.ParseExpression("\n" +
- "\n" +
- "");
+ "\n" +
+ "");
Assert.IsNotEmpty(document.Expressions);
Assert.AreEqual(3, document.Expressions.Count);
- CheckElement(document.Expressions[0], "Test", new Location(1,1), new Location(9,1));
+ CheckElement(document.Expressions[0], "Test", new Location(1,1), new Location(9,1));
CheckContent(document.Expressions[1], " test ", XmlContentType.Comment, new Location(1,2), new Location(14,2));
CheckContent(document.Expressions[2], "target some text", XmlContentType.ProcessingInstruction, new Location(1,3), new Location(21,3));
}