Browse Source

C# parser: add support for named arguments in attributes.

git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/trunk@5779 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61
pull/1/head
Daniel Grunwald 16 years ago
parent
commit
91e9ba0b9e
  1. 2369
      src/Libraries/NRefactory/Project/Src/Parser/CSharp/Parser.cs
  2. 54
      src/Libraries/NRefactory/Project/Src/Parser/CSharp/cs.ATG
  3. 33
      src/Libraries/NRefactory/Project/Src/PrettyPrinter/CSharp/CSharpOutputVisitor.cs
  4. 12
      src/Libraries/NRefactory/Test/Output/CSharp/CSharpOutputTest.cs
  5. 19
      src/Libraries/NRefactory/Test/Parser/GlobalScope/AttributeSectionTests.cs

2369
src/Libraries/NRefactory/Project/Src/Parser/CSharp/Parser.cs

File diff suppressed because it is too large Load Diff

54
src/Libraries/NRefactory/Project/Src/Parser/CSharp/cs.ATG

@ -252,39 +252,47 @@ Attribute<out ASTAttribute attribute> @@ -252,39 +252,47 @@ Attribute<out ASTAttribute attribute>
.
AttributeArguments<List<Expression> positional, List<NamedArgumentExpression> named>
(.
bool nameFound = false;
string name = "";
Expression expr;
.)
=
"("
[
[
IF (IsAssignment()) (. nameFound = true; .)
Identifier (. name = t.val; .)
"="
] Expr<out expr> (. if (expr != null) {if(name == "") positional.Add(expr);
else { named.Add(new NamedArgumentExpression(name, expr)); name = ""; }
}
.)
AttributeArgument<positional, named>
{
","
(
IF (IsAssignment()) (. nameFound = true; .)
Identifier (. name = t.val; .)
"="
| /*Empty*/ (. if (nameFound) Error("no positional argument after named argument"); .)
) Expr<out expr> (. if (expr != null) { if(name == "") positional.Add(expr);
else { named.Add(new NamedArgumentExpression(name, expr)); name = ""; }
}
.)
AttributeArgument<positional, named>
}
]
")"
.
AttributeArgument<List<Expression> positional, List<NamedArgumentExpression> named>
(. string name = null; bool isNamed = false; Expression expr; .)
=
(
IF (IsAssignment()) (. isNamed = true; .)
Identifier (. name = t.val; .)
"="
|
IF (IdentAndColon())
Identifier (. name = t.val; .)
":"
| /* empty */
)
Expr<out expr>
(.
if (expr != null) {
if (isNamed) {
named.Add(new NamedArgumentExpression(name, expr));
} else {
if (named.Count > 0)
Error("positional argument after named argument is not allowed");
if (name != null)
expr = new NamedArgumentExpression(name, expr);
positional.Add(expr);
}
}
.)
.
AttributeSection<out AttributeSection section>
(.
string attributeTarget = "";

33
src/Libraries/NRefactory/Project/Src/PrettyPrinter/CSharp/CSharpOutputVisitor.cs

@ -276,7 +276,14 @@ namespace ICSharpCode.NRefactory.PrettyPrinter @@ -276,7 +276,14 @@ namespace ICSharpCode.NRefactory.PrettyPrinter
PrintFormattedComma();
}
for (int i = 0; i < attribute.NamedArguments.Count; ++i) {
TrackVisit((INode)attribute.NamedArguments[i], data);
NamedArgumentExpression nae = attribute.NamedArguments[i];
outputFormatter.PrintIdentifier(nae.Name);
if (prettyPrintOptions.AroundAssignmentParentheses)
outputFormatter.Space();
outputFormatter.PrintToken(Tokens.Assign);
if (prettyPrintOptions.AroundAssignmentParentheses)
outputFormatter.Space();
nae.Expression.AcceptVisitor(this, data);
if (i + 1 < attribute.NamedArguments.Count) {
PrintFormattedComma();
}
@ -292,10 +299,7 @@ namespace ICSharpCode.NRefactory.PrettyPrinter @@ -292,10 +299,7 @@ namespace ICSharpCode.NRefactory.PrettyPrinter
public override object TrackedVisitNamedArgumentExpression(NamedArgumentExpression namedArgumentExpression, object data)
{
outputFormatter.PrintIdentifier(namedArgumentExpression.Name);
if (this.prettyPrintOptions.AroundAssignmentParentheses) {
outputFormatter.Space();
}
outputFormatter.PrintToken(Tokens.Assign);
outputFormatter.PrintToken(Tokens.Colon);
if (this.prettyPrintOptions.AroundAssignmentParentheses) {
outputFormatter.Space();
}
@ -2878,7 +2882,24 @@ namespace ICSharpCode.NRefactory.PrettyPrinter @@ -2878,7 +2882,24 @@ namespace ICSharpCode.NRefactory.PrettyPrinter
outputFormatter.NewLine ();
outputFormatter.Indent ();
}
this.AppendCommaSeparatedList (arrayInitializerExpression.CreateExpressions, true);
var createExprs = arrayInitializerExpression.CreateExpressions;
for (int i = 0; i < createExprs.Count; i++) {
if (i > 0) {
PrintFormattedCommaAndNewLine();
}
NamedArgumentExpression nae = createExprs[i] as NamedArgumentExpression;
if (nae != null) {
outputFormatter.PrintIdentifier(nae.Name);
if (prettyPrintOptions.AroundAssignmentParentheses)
outputFormatter.Space();
outputFormatter.PrintToken(Tokens.Assign);
if (prettyPrintOptions.AroundAssignmentParentheses)
outputFormatter.Space();
nae.Expression.AcceptVisitor(this, data);
} else {
createExprs[i].AcceptVisitor(this, data);
}
}
if (arrayInitializerExpression.CreateExpressions.Count == 1) {
outputFormatter.Space ();
} else {

12
src/Libraries/NRefactory/Test/Output/CSharp/CSharpOutputTest.cs

@ -789,5 +789,17 @@ namespace ICSharpCode.NRefactory.Tests.PrettyPrinter @@ -789,5 +789,17 @@ namespace ICSharpCode.NRefactory.Tests.PrettyPrinter
{
TestTypeMember("void M(int x = 0);");
}
[Test]
public void NamedArguments()
{
TestExpression("M(x: 1)");
}
[Test]
public void TestAttributeWithNamedArgument()
{
TestProgram("[assembly: Foo(1, namedArg: 2, prop = 3)]");
}
}
}

19
src/Libraries/NRefactory/Test/Parser/GlobalScope/AttributeSectionTests.cs

@ -81,6 +81,25 @@ public class Form1 { @@ -81,6 +81,25 @@ public class Form1 {
Assert.AreEqual("assembly", decl.AttributeTarget);
}
[Test]
public void AssemblyAttributeCSharpWithNamedArguments()
{
string program = @"[assembly: Foo(1, namedArg: 2, prop = 3)]";
AttributeSection decl = ParseUtilCSharp.ParseGlobal<AttributeSection>(program);
Assert.AreEqual("assembly", decl.AttributeTarget);
var a = decl.Attributes[0];
Assert.AreEqual("Foo", a.Name);
Assert.AreEqual(2, a.PositionalArguments.Count);
Assert.AreEqual(1, a.NamedArguments.Count);
Assert.AreEqual(1, ((PrimitiveExpression)a.PositionalArguments[0]).Value);
NamedArgumentExpression nae = a.PositionalArguments[1] as NamedArgumentExpression;
Assert.AreEqual("namedArg", nae.Name);
Assert.AreEqual(2, ((PrimitiveExpression)nae.Expression).Value);
nae = a.NamedArguments[0];
Assert.AreEqual("prop", nae.Name);
Assert.AreEqual(3, ((PrimitiveExpression)nae.Expression).Value);
}
[Test]
public void ModuleAttributeCSharp()
{

Loading…
Cancel
Save