From 9a968de5014302572251d72aee071dacdb3479e7 Mon Sep 17 00:00:00 2001 From: Daniel Grunwald Date: Mon, 23 Jul 2012 18:31:13 +0200 Subject: [PATCH] Introduce AstNodeCollection.AcceptVisitor() to simplify CSharpSemanticHighlighter. --- .../Project/Src/CSharpSemanticHighlighter.cs | 48 ++++++++----------- .../Ast/AstNodeCollection.cs | 16 +++++++ 2 files changed, 36 insertions(+), 28 deletions(-) diff --git a/src/AddIns/BackendBindings/CSharpBinding/Project/Src/CSharpSemanticHighlighter.cs b/src/AddIns/BackendBindings/CSharpBinding/Project/Src/CSharpSemanticHighlighter.cs index 377e8b3560..ed7da3128d 100644 --- a/src/AddIns/BackendBindings/CSharpBinding/Project/Src/CSharpSemanticHighlighter.cs +++ b/src/AddIns/BackendBindings/CSharpBinding/Project/Src/CSharpSemanticHighlighter.cs @@ -308,8 +308,7 @@ namespace CSharpBinding public override void VisitSimpleType(SimpleType simpleType) { Colorize(simpleType.IdentifierToken, GetColor(resolver.Resolve(simpleType))); - foreach (AstNode node in simpleType.TypeArguments) - node.AcceptVisitor(this); + simpleType.TypeArguments.AcceptVisitor(this); } public override void VisitMemberType(MemberType memberType) @@ -318,8 +317,7 @@ namespace CSharpBinding // This is required so that the resulting HighlightedSections are sorted correctly. memberType.Target.AcceptVisitor(this); Colorize(memberType.MemberNameToken, GetColor(resolver.Resolve(memberType))); - foreach (AstNode node in memberType.TypeArguments) - node.AcceptVisitor(this); + memberType.TypeArguments.AcceptVisitor(this); } public override void VisitIdentifierExpression(IdentifierExpression identifierExpression) @@ -332,8 +330,7 @@ namespace CSharpBinding Colorize(ident, GetColor(rr)); } - foreach (AstNode node in identifierExpression.TypeArguments) - node.AcceptVisitor(this); + identifierExpression.TypeArguments.AcceptVisitor(this); } public override void VisitMemberReferenceExpression(MemberReferenceExpression memberReferenceExpression) @@ -343,8 +340,7 @@ namespace CSharpBinding ResolveResult rr = resolver.Resolve(memberReferenceExpression); Colorize(memberReferenceExpression.MemberNameToken, GetColor(rr)); - foreach (AstNode node in memberReferenceExpression.TypeArguments) - node.AcceptVisitor(this); + memberReferenceExpression.TypeArguments.AcceptVisitor(this); } public override void VisitInvocationExpression(InvocationExpression invocationExpression) @@ -364,14 +360,12 @@ namespace CSharpBinding Colorize(identifier, GetColor(targetRR)); } - foreach (AstNode node in target.GetChildrenByRole(Roles.TypeArgument)) - node.AcceptVisitor(this); + target.GetChildrenByRole(Roles.TypeArgument).AcceptVisitor(this); } else { target.AcceptVisitor(this); } - foreach (AstNode node in invocationExpression.Arguments) - node.AcceptVisitor(this); + invocationExpression.Arguments.AcceptVisitor(this); } public override void VisitAccessor(Accessor accessor) @@ -386,37 +380,35 @@ namespace CSharpBinding public override void VisitMethodDeclaration(MethodDeclaration methodDeclaration) { + //methodDeclaration.Attributes.AcceptVisitor(this); methodDeclaration.ReturnType.AcceptVisitor(this); methodDeclaration.PrivateImplementationType.AcceptVisitor(this); Colorize(methodDeclaration.NameToken, methodCallColor); - foreach (var node in methodDeclaration.TypeParameters) - node.AcceptVisitor(this); - foreach (var node in methodDeclaration.Parameters) - node.AcceptVisitor(this); - foreach (var node in methodDeclaration.Constraints) - node.AcceptVisitor(this); + methodDeclaration.TypeParameters.AcceptVisitor(this); + methodDeclaration.Parameters.AcceptVisitor(this); + methodDeclaration.Constraints.AcceptVisitor(this); methodDeclaration.Body.AcceptVisitor(this); } public override void VisitTypeDeclaration(TypeDeclaration typeDeclaration) { + //typeDeclaration.Attributes.AcceptVisitor(this); + if (typeDeclaration.ClassType == ClassType.Enum || typeDeclaration.ClassType == ClassType.Struct) Colorize(typeDeclaration.NameToken, valueTypeColor); else Colorize(typeDeclaration.NameToken, referenceTypeColor); - foreach (var node in typeDeclaration.TypeParameters) - node.AcceptVisitor(this); - foreach (var node in typeDeclaration.BaseTypes) - node.AcceptVisitor(this); - foreach (var node in typeDeclaration.Constraints) - node.AcceptVisitor(this); - foreach (var node in typeDeclaration.Members) - node.AcceptVisitor(this); + typeDeclaration.TypeParameters.AcceptVisitor(this); + typeDeclaration.BaseTypes.AcceptVisitor(this); + typeDeclaration.Constraints.AcceptVisitor(this); + typeDeclaration.Members.AcceptVisitor(this); } public override void VisitTypeParameterDeclaration(TypeParameterDeclaration typeParameterDeclaration) { + //typeParameterDeclaration.Attributes.AcceptVisitor(this); + if (typeParameterDeclaration.Variance == VarianceModifier.Contravariant) Colorize(typeParameterDeclaration.VarianceToken, parameterModifierColor); @@ -437,8 +429,8 @@ namespace CSharpBinding bool isValueType = constraint.BaseTypes.OfType().Any(p => p.Keyword == "struct"); Colorize(constraint.GetChildByRole(Roles.Identifier), isValueType ? valueTypeColor : referenceTypeColor); } - foreach (var baseType in constraint.BaseTypes) - baseType.AcceptVisitor(this); + + constraint.BaseTypes.AcceptVisitor(this); } public override void VisitVariableInitializer(VariableInitializer variableInitializer) diff --git a/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/Ast/AstNodeCollection.cs b/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/Ast/AstNodeCollection.cs index 4e28849be4..b727dc2112 100644 --- a/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/Ast/AstNodeCollection.cs +++ b/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/Ast/AstNodeCollection.cs @@ -204,5 +204,21 @@ namespace ICSharpCode.NRefactory.CSharp { node.InsertChildBefore(existingItem, newItem, role); } + + /// + /// Applies the to all nodes in this collection. + /// + public void AcceptVisitor(IAstVisitor visitor) + { + AstNode next; + for (AstNode cur = node.FirstChild; cur != null; cur = next) { + Debug.Assert(cur.Parent == node); + // Remember next before yielding cur. + // This allows removing/replacing nodes while iterating through the list. + next = cur.NextSibling; + if (cur.Role == role) + cur.AcceptVisitor(visitor); + } + } } }