From 8186996c40542ad1254c87883249ede5da1d8913 Mon Sep 17 00:00:00 2001 From: Daniel Grunwald Date: Fri, 11 Feb 2011 15:36:33 +0100 Subject: [PATCH] Add NamedArgumentExpression; cleanup the AST a bit. --- .../CSharp/AstStructureTest.cs | 31 ++++++++++++++++++ ICSharpCode.NRefactory/CSharp/Ast/AstNode.cs | 1 + .../CSharp/Ast/AstVisitor.cs | 5 +++ .../Expressions/AnonymousMethodExpression.cs | 6 ++-- .../Ast/Expressions/ArrayCreateExpression.cs | 2 +- .../Ast/Expressions/ConditionalExpression.cs | 2 +- .../Expressions/NamedArgumentExpression.cs | 32 +++++++++++++++++++ .../Expressions/ParenthesizedExpression.cs | 1 + .../CSharp/Ast/PrimitiveType.cs | 12 +++++++ .../CSharp/Parser/CSharpParser.cs | 8 ++--- .../ICSharpCode.NRefactory.csproj | 3 +- 11 files changed, 91 insertions(+), 12 deletions(-) create mode 100644 ICSharpCode.NRefactory.Tests/CSharp/AstStructureTest.cs create mode 100644 ICSharpCode.NRefactory/CSharp/Ast/Expressions/NamedArgumentExpression.cs diff --git a/ICSharpCode.NRefactory.Tests/CSharp/AstStructureTest.cs b/ICSharpCode.NRefactory.Tests/CSharp/AstStructureTest.cs new file mode 100644 index 0000000000..94e707f9dc --- /dev/null +++ b/ICSharpCode.NRefactory.Tests/CSharp/AstStructureTest.cs @@ -0,0 +1,31 @@ +// Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt) +// This code is distributed under MIT X11 license (for details please see \doc\license.txt) + +using System; +using System.Reflection; +using NUnit.Framework; + +namespace ICSharpCode.NRefactory.CSharp +{ + [TestFixture] + public class AstStructureTest + { + [Test] + public void RolesAreStaticReadOnly() + { + foreach (Type type in typeof(AstNode).Assembly.GetExportedTypes()) { + if (type.IsSubclassOf(typeof(AstNode))) { + foreach (FieldInfo field in type.GetFields()) { + if (field.FieldType.IsSubclassOf(typeof(Role))) { + Assert.IsTrue(field.IsPublic); + Assert.IsTrue(field.IsStatic); + Assert.IsTrue(field.IsInitOnly); + Assert.IsTrue(field.Name.EndsWith("Role", StringComparison.Ordinal)); + Assert.IsNotNull(field.GetValue(null)); + } + } + } + } + } + } +} diff --git a/ICSharpCode.NRefactory/CSharp/Ast/AstNode.cs b/ICSharpCode.NRefactory/CSharp/Ast/AstNode.cs index 53f745929e..a62e11312a 100644 --- a/ICSharpCode.NRefactory/CSharp/Ast/AstNode.cs +++ b/ICSharpCode.NRefactory/CSharp/Ast/AstNode.cs @@ -565,6 +565,7 @@ namespace ICSharpCode.NRefactory.CSharp public static readonly Role Comma = new Role("Comma", CSharpTokenNode.Null); public static readonly Role Semicolon = new Role("Semicolon", CSharpTokenNode.Null); public static readonly Role Assign = new Role("Assign", CSharpTokenNode.Null); + public static readonly Role Colon = new Role("Colon", CSharpTokenNode.Null); public static readonly Role Comment = new Role("Comment"); diff --git a/ICSharpCode.NRefactory/CSharp/Ast/AstVisitor.cs b/ICSharpCode.NRefactory/CSharp/Ast/AstVisitor.cs index 5ddc7ba1fc..963ba86244 100644 --- a/ICSharpCode.NRefactory/CSharp/Ast/AstVisitor.cs +++ b/ICSharpCode.NRefactory/CSharp/Ast/AstVisitor.cs @@ -508,5 +508,10 @@ namespace ICSharpCode.NRefactory.CSharp { return VisitChildren (arrayInitializerExpression, data); } + + public virtual S VisitNamedArgumentExpression(NamedArgumentExpression namedArgumentExpression, T data) + { + return VisitChildren (namedArgumentExpression, data); + } } } diff --git a/ICSharpCode.NRefactory/CSharp/Ast/Expressions/AnonymousMethodExpression.cs b/ICSharpCode.NRefactory/CSharp/Ast/Expressions/AnonymousMethodExpression.cs index d425e6d4f5..28b05edb0f 100644 --- a/ICSharpCode.NRefactory/CSharp/Ast/Expressions/AnonymousMethodExpression.cs +++ b/ICSharpCode.NRefactory/CSharp/Ast/Expressions/AnonymousMethodExpression.cs @@ -34,8 +34,6 @@ namespace ICSharpCode.NRefactory.CSharp /// public class AnonymousMethodExpression : Expression { - public static readonly Role BodyRole = new Role("Body", BlockStatement.Null); - // used to make a difference between delegate {} and delegate () {} public bool HasParameterList { get; set; @@ -47,8 +45,8 @@ namespace ICSharpCode.NRefactory.CSharp } public BlockStatement Body { - get { return GetChildByRole (BodyRole); } - set { SetChildByRole (BodyRole, value); } + get { return GetChildByRole (Roles.Body); } + set { SetChildByRole (Roles.Body, value); } } public override S AcceptVisitor (AstVisitor visitor, T data) diff --git a/ICSharpCode.NRefactory/CSharp/Ast/Expressions/ArrayCreateExpression.cs b/ICSharpCode.NRefactory/CSharp/Ast/Expressions/ArrayCreateExpression.cs index 60ac7334dd..8a63d03acb 100644 --- a/ICSharpCode.NRefactory/CSharp/Ast/Expressions/ArrayCreateExpression.cs +++ b/ICSharpCode.NRefactory/CSharp/Ast/Expressions/ArrayCreateExpression.cs @@ -16,7 +16,7 @@ namespace ICSharpCode.NRefactory.CSharp set { SetChildByRole (Roles.Type, value); } } - public IEnumerable Dimensions { + public IEnumerable Arguments { get { return GetChildrenByRole (Roles.Argument); } set { SetChildrenByRole (Roles.Argument, value); } } diff --git a/ICSharpCode.NRefactory/CSharp/Ast/Expressions/ConditionalExpression.cs b/ICSharpCode.NRefactory/CSharp/Ast/Expressions/ConditionalExpression.cs index bf0ef42f19..5634804f7d 100644 --- a/ICSharpCode.NRefactory/CSharp/Ast/Expressions/ConditionalExpression.cs +++ b/ICSharpCode.NRefactory/CSharp/Ast/Expressions/ConditionalExpression.cs @@ -34,7 +34,7 @@ namespace ICSharpCode.NRefactory.CSharp public readonly static Role ConditionRole = Roles.Condition; public readonly static Role QuestionMarkRole = new Role("QuestionMark", CSharpTokenNode.Null); public readonly static Role TrueRole = new Role("True", Expression.Null); - public readonly static Role ColonRole = new Role("Colon", CSharpTokenNode.Null); + public readonly static Role ColonRole = Roles.Colon; public readonly static Role FalseRole = new Role("False", Expression.Null); public Expression Condition { diff --git a/ICSharpCode.NRefactory/CSharp/Ast/Expressions/NamedArgumentExpression.cs b/ICSharpCode.NRefactory/CSharp/Ast/Expressions/NamedArgumentExpression.cs new file mode 100644 index 0000000000..d63775e58e --- /dev/null +++ b/ICSharpCode.NRefactory/CSharp/Ast/Expressions/NamedArgumentExpression.cs @@ -0,0 +1,32 @@ +// Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt) +// This code is distributed under MIT X11 license (for details please see \doc\license.txt) + +using System; + +namespace ICSharpCode.NRefactory.CSharp +{ + /// + /// Represents a named argument passed to a method or attribute. + /// + public class NamedArgumentExpression : Expression + { + public string Identifier { + get { + return GetChildByRole (Roles.Identifier).Name; + } + set { + SetChildByRole(Roles.Identifier, new Identifier(value, AstLocation.Empty)); + } + } + + public Expression Expression { + get { return GetChildByRole (Roles.Expression); } + set { SetChildByRole (Roles.Expression, value); } + } + + public override S AcceptVisitor(AstVisitor visitor, T data) + { + return visitor.VisitNamedArgumentExpression(this, data); + } + } +} diff --git a/ICSharpCode.NRefactory/CSharp/Ast/Expressions/ParenthesizedExpression.cs b/ICSharpCode.NRefactory/CSharp/Ast/Expressions/ParenthesizedExpression.cs index 74dc2ead69..cf303fe6c0 100644 --- a/ICSharpCode.NRefactory/CSharp/Ast/Expressions/ParenthesizedExpression.cs +++ b/ICSharpCode.NRefactory/CSharp/Ast/Expressions/ParenthesizedExpression.cs @@ -30,6 +30,7 @@ namespace ICSharpCode.NRefactory.CSharp { public Expression Expression { get { return GetChildByRole (Roles.Expression); } + set { SetChildByRole (Roles.Expression, value); } } public override S AcceptVisitor (AstVisitor visitor, T data) diff --git a/ICSharpCode.NRefactory/CSharp/Ast/PrimitiveType.cs b/ICSharpCode.NRefactory/CSharp/Ast/PrimitiveType.cs index c705b3a755..5706f9b973 100644 --- a/ICSharpCode.NRefactory/CSharp/Ast/PrimitiveType.cs +++ b/ICSharpCode.NRefactory/CSharp/Ast/PrimitiveType.cs @@ -32,6 +32,18 @@ namespace ICSharpCode.NRefactory.CSharp public class PrimitiveType : AstType { public string Keyword { get; set; } + public AstLocation Location { get; set; } + + public override AstLocation StartLocation { + get { + return Location; + } + } + public override AstLocation EndLocation { + get { + return new AstLocation (Location.Line, Location.Column + Keyword != null ? Keyword.Length : 0); + } + } public override S AcceptVisitor (AstVisitor visitor, T data) { diff --git a/ICSharpCode.NRefactory/CSharp/Parser/CSharpParser.cs b/ICSharpCode.NRefactory/CSharp/Parser/CSharpParser.cs index 3dfe612542..55d1d2a4f4 100644 --- a/ICSharpCode.NRefactory/CSharp/Parser/CSharpParser.cs +++ b/ICSharpCode.NRefactory/CSharp/Parser/CSharpParser.cs @@ -1398,6 +1398,7 @@ namespace ICSharpCode.NRefactory.CSharp public override object Visit (TypeExpression typeExpression) { var result = new PrimitiveType (); + result.Location = Convert (typeExpression.Location); if (typeExpression.Type == TypeManager.void_type) { result.Keyword = "void"; } else if (typeExpression.Type == TypeManager.string_type) { @@ -1429,9 +1430,6 @@ namespace ICSharpCode.NRefactory.CSharp } else { throw new NotImplementedException(); } - if (result.Keyword != null) { - result.AddChild (new CSharpTokenNode (Convert (typeExpression.Location), result.Keyword.Length), PrimitiveType.Roles.Keyword); - } return result; } @@ -1927,9 +1925,9 @@ namespace ICSharpCode.NRefactory.CSharp if (arrayCreationExpression.Arguments != null) { var commaLocations = LocationsBag.GetLocations (arrayCreationExpression.Arguments); for (int i = 0 ;i < arrayCreationExpression.Arguments.Count; i++) { - result.AddChild ((Expression)arrayCreationExpression.Arguments[i].Accept (this), ObjectCreateExpression.Roles.Argument); + result.AddChild ((Expression)arrayCreationExpression.Arguments[i].Accept (this), ArrayCreateExpression.Roles.Argument); if (commaLocations != null && i > 0) - result.AddChild (new CSharpTokenNode (Convert (commaLocations [commaLocations.Count - i]), 1), IndexerExpression.Roles.Comma); + result.AddChild (new CSharpTokenNode (Convert (commaLocations [commaLocations.Count - i]), 1), ArrayCreateExpression.Roles.Comma); } } if (location != null) diff --git a/ICSharpCode.NRefactory/ICSharpCode.NRefactory.csproj b/ICSharpCode.NRefactory/ICSharpCode.NRefactory.csproj index 7b3c8e9fac..fd941abb20 100644 --- a/ICSharpCode.NRefactory/ICSharpCode.NRefactory.csproj +++ b/ICSharpCode.NRefactory/ICSharpCode.NRefactory.csproj @@ -1,4 +1,4 @@ - + {3B2A5653-EC97-4001-BB9B-D90F1AF2C371} @@ -80,6 +80,7 @@ +