Browse Source

member initialization for VB.NET object creation expressions

git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/trunk@3371 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61
shortcuts
Markus Palme 17 years ago
parent
commit
e3733a8709
  1. 1
      src/Libraries/NRefactory/NRefactoryASTGenerator/AST/Expressions.cs
  2. 5
      src/Libraries/NRefactory/Project/Src/Ast/Generated.cs
  3. 971
      src/Libraries/NRefactory/Project/Src/Parser/VBNet/Parser.cs
  4. 41
      src/Libraries/NRefactory/Project/Src/Parser/VBNet/VBNET.ATG
  5. 14
      src/Libraries/NRefactory/Test/Parser/Expressions/ObjectCreateExpressionTests.cs

1
src/Libraries/NRefactory/NRefactoryASTGenerator/AST/Expressions.cs

@ -35,6 +35,7 @@ namespace NRefactoryASTGenerator.Ast @@ -35,6 +35,7 @@ namespace NRefactoryASTGenerator.Ast
string name;
Expression expression;
public NamedArgumentExpression() { }
public NamedArgumentExpression(string name, Expression expression) {}
}

5
src/Libraries/NRefactory/Project/Src/Ast/Generated.cs

@ -2791,6 +2791,11 @@ public Location ExtendedEndLocation { get; set; } @@ -2791,6 +2791,11 @@ public Location ExtendedEndLocation { get; set; }
}
}
public NamedArgumentExpression() {
name = "";
expression = Expression.Null;
}
public NamedArgumentExpression(string name, Expression expression) {
Name = name;
Expression = expression;

971
src/Libraries/NRefactory/Project/Src/Parser/VBNet/Parser.cs

File diff suppressed because it is too large Load Diff

41
src/Libraries/NRefactory/Project/Src/Parser/VBNet/VBNET.ATG

@ -1962,6 +1962,47 @@ ObjectCreateExpression<out Expression oce> @@ -1962,6 +1962,47 @@ ObjectCreateExpression<out Expression oce>
oce = ace;
}
.)
[
(.
NamedArgumentExpression memberInitializer = null;
.)
"With"
(.
CollectionInitializerExpression memberInitializers = new CollectionInitializerExpression();
memberInitializers.StartLocation = la.Location;
.)
"{"
MemberInitializer<out memberInitializer>
(. memberInitializers.CreateExpressions.Add(memberInitializer); .)
{ ","
MemberInitializer<out memberInitializer>
(. memberInitializers.CreateExpressions.Add(memberInitializer); .)
}
"}"
(.
memberInitializers.EndLocation = t.Location;
if(oce is ObjectCreateExpression)
{
((ObjectCreateExpression)oce).ObjectInitializer = memberInitializers;
}
.)
]
.
MemberInitializer<out NamedArgumentExpression memberInitializer>
(.
memberInitializer = new NamedArgumentExpression();
memberInitializer.StartLocation = la.Location;
Expression initExpr = null;
string name = null;
.) =
"." IdentifierOrKeyword<out name> "=" Expr<out initExpr>
(.
memberInitializer.Name = name;
memberInitializer.Expression = initExpr;
memberInitializer.EndLocation = t.EndLocation;
.)
.
/* 9.3.2 */

14
src/Libraries/NRefactory/Test/Parser/Expressions/ObjectCreateExpressionTests.cs

@ -212,6 +212,20 @@ namespace ICSharpCode.NRefactory.Tests.Ast @@ -212,6 +212,20 @@ namespace ICSharpCode.NRefactory.Tests.Ast
Assert.AreEqual(1, typeRef.GenericTypes.Count);
Assert.AreEqual("Integer", typeRef.GenericTypes[0].Type);
}
[Test]
public void VBNetMemberInitializationTest()
{
ObjectCreateExpression oce = ParseUtilVBNet.ParseExpression<ObjectCreateExpression>("new Contact() With { .FirstName = \"Bill\", .LastName = \"Gates\" }");
Assert.AreEqual(2, oce.ObjectInitializer.CreateExpressions.Count);
Assert.AreEqual("FirstName", ((NamedArgumentExpression)oce.ObjectInitializer.CreateExpressions[0]).Name);
Assert.AreEqual("LastName", ((NamedArgumentExpression)oce.ObjectInitializer.CreateExpressions[1]).Name);
Assert.IsInstanceOfType(typeof(PrimitiveExpression), ((NamedArgumentExpression)oce.ObjectInitializer.CreateExpressions[0]).Expression);
Assert.IsInstanceOfType(typeof(PrimitiveExpression), ((NamedArgumentExpression)oce.ObjectInitializer.CreateExpressions[1]).Expression);
}
#endregion
}
}

Loading…
Cancel
Save