Browse Source

Introduce AstNodeCollection.AcceptVisitor() to simplify CSharpSemanticHighlighter.

newNRvisualizers
Daniel Grunwald 13 years ago
parent
commit
9a968de501
  1. 48
      src/AddIns/BackendBindings/CSharpBinding/Project/Src/CSharpSemanticHighlighter.cs
  2. 16
      src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/Ast/AstNodeCollection.cs

48
src/AddIns/BackendBindings/CSharpBinding/Project/Src/CSharpSemanticHighlighter.cs

@ -308,8 +308,7 @@ namespace CSharpBinding
public override void VisitSimpleType(SimpleType simpleType) public override void VisitSimpleType(SimpleType simpleType)
{ {
Colorize(simpleType.IdentifierToken, GetColor(resolver.Resolve(simpleType))); Colorize(simpleType.IdentifierToken, GetColor(resolver.Resolve(simpleType)));
foreach (AstNode node in simpleType.TypeArguments) simpleType.TypeArguments.AcceptVisitor(this);
node.AcceptVisitor(this);
} }
public override void VisitMemberType(MemberType memberType) public override void VisitMemberType(MemberType memberType)
@ -318,8 +317,7 @@ namespace CSharpBinding
// This is required so that the resulting HighlightedSections are sorted correctly. // This is required so that the resulting HighlightedSections are sorted correctly.
memberType.Target.AcceptVisitor(this); memberType.Target.AcceptVisitor(this);
Colorize(memberType.MemberNameToken, GetColor(resolver.Resolve(memberType))); Colorize(memberType.MemberNameToken, GetColor(resolver.Resolve(memberType)));
foreach (AstNode node in memberType.TypeArguments) memberType.TypeArguments.AcceptVisitor(this);
node.AcceptVisitor(this);
} }
public override void VisitIdentifierExpression(IdentifierExpression identifierExpression) public override void VisitIdentifierExpression(IdentifierExpression identifierExpression)
@ -332,8 +330,7 @@ namespace CSharpBinding
Colorize(ident, GetColor(rr)); Colorize(ident, GetColor(rr));
} }
foreach (AstNode node in identifierExpression.TypeArguments) identifierExpression.TypeArguments.AcceptVisitor(this);
node.AcceptVisitor(this);
} }
public override void VisitMemberReferenceExpression(MemberReferenceExpression memberReferenceExpression) public override void VisitMemberReferenceExpression(MemberReferenceExpression memberReferenceExpression)
@ -343,8 +340,7 @@ namespace CSharpBinding
ResolveResult rr = resolver.Resolve(memberReferenceExpression); ResolveResult rr = resolver.Resolve(memberReferenceExpression);
Colorize(memberReferenceExpression.MemberNameToken, GetColor(rr)); Colorize(memberReferenceExpression.MemberNameToken, GetColor(rr));
foreach (AstNode node in memberReferenceExpression.TypeArguments) memberReferenceExpression.TypeArguments.AcceptVisitor(this);
node.AcceptVisitor(this);
} }
public override void VisitInvocationExpression(InvocationExpression invocationExpression) public override void VisitInvocationExpression(InvocationExpression invocationExpression)
@ -364,14 +360,12 @@ namespace CSharpBinding
Colorize(identifier, GetColor(targetRR)); Colorize(identifier, GetColor(targetRR));
} }
foreach (AstNode node in target.GetChildrenByRole(Roles.TypeArgument)) target.GetChildrenByRole(Roles.TypeArgument).AcceptVisitor(this);
node.AcceptVisitor(this);
} else { } else {
target.AcceptVisitor(this); target.AcceptVisitor(this);
} }
foreach (AstNode node in invocationExpression.Arguments) invocationExpression.Arguments.AcceptVisitor(this);
node.AcceptVisitor(this);
} }
public override void VisitAccessor(Accessor accessor) public override void VisitAccessor(Accessor accessor)
@ -386,37 +380,35 @@ namespace CSharpBinding
public override void VisitMethodDeclaration(MethodDeclaration methodDeclaration) public override void VisitMethodDeclaration(MethodDeclaration methodDeclaration)
{ {
//methodDeclaration.Attributes.AcceptVisitor(this);
methodDeclaration.ReturnType.AcceptVisitor(this); methodDeclaration.ReturnType.AcceptVisitor(this);
methodDeclaration.PrivateImplementationType.AcceptVisitor(this); methodDeclaration.PrivateImplementationType.AcceptVisitor(this);
Colorize(methodDeclaration.NameToken, methodCallColor); Colorize(methodDeclaration.NameToken, methodCallColor);
foreach (var node in methodDeclaration.TypeParameters) methodDeclaration.TypeParameters.AcceptVisitor(this);
node.AcceptVisitor(this); methodDeclaration.Parameters.AcceptVisitor(this);
foreach (var node in methodDeclaration.Parameters) methodDeclaration.Constraints.AcceptVisitor(this);
node.AcceptVisitor(this);
foreach (var node in methodDeclaration.Constraints)
node.AcceptVisitor(this);
methodDeclaration.Body.AcceptVisitor(this); methodDeclaration.Body.AcceptVisitor(this);
} }
public override void VisitTypeDeclaration(TypeDeclaration typeDeclaration) public override void VisitTypeDeclaration(TypeDeclaration typeDeclaration)
{ {
//typeDeclaration.Attributes.AcceptVisitor(this);
if (typeDeclaration.ClassType == ClassType.Enum || typeDeclaration.ClassType == ClassType.Struct) if (typeDeclaration.ClassType == ClassType.Enum || typeDeclaration.ClassType == ClassType.Struct)
Colorize(typeDeclaration.NameToken, valueTypeColor); Colorize(typeDeclaration.NameToken, valueTypeColor);
else else
Colorize(typeDeclaration.NameToken, referenceTypeColor); Colorize(typeDeclaration.NameToken, referenceTypeColor);
foreach (var node in typeDeclaration.TypeParameters) typeDeclaration.TypeParameters.AcceptVisitor(this);
node.AcceptVisitor(this); typeDeclaration.BaseTypes.AcceptVisitor(this);
foreach (var node in typeDeclaration.BaseTypes) typeDeclaration.Constraints.AcceptVisitor(this);
node.AcceptVisitor(this); typeDeclaration.Members.AcceptVisitor(this);
foreach (var node in typeDeclaration.Constraints)
node.AcceptVisitor(this);
foreach (var node in typeDeclaration.Members)
node.AcceptVisitor(this);
} }
public override void VisitTypeParameterDeclaration(TypeParameterDeclaration typeParameterDeclaration) public override void VisitTypeParameterDeclaration(TypeParameterDeclaration typeParameterDeclaration)
{ {
//typeParameterDeclaration.Attributes.AcceptVisitor(this);
if (typeParameterDeclaration.Variance == VarianceModifier.Contravariant) if (typeParameterDeclaration.Variance == VarianceModifier.Contravariant)
Colorize(typeParameterDeclaration.VarianceToken, parameterModifierColor); Colorize(typeParameterDeclaration.VarianceToken, parameterModifierColor);
@ -437,8 +429,8 @@ namespace CSharpBinding
bool isValueType = constraint.BaseTypes.OfType<PrimitiveType>().Any(p => p.Keyword == "struct"); bool isValueType = constraint.BaseTypes.OfType<PrimitiveType>().Any(p => p.Keyword == "struct");
Colorize(constraint.GetChildByRole(Roles.Identifier), isValueType ? valueTypeColor : referenceTypeColor); 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) public override void VisitVariableInitializer(VariableInitializer variableInitializer)

16
src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/Ast/AstNodeCollection.cs

@ -204,5 +204,21 @@ namespace ICSharpCode.NRefactory.CSharp
{ {
node.InsertChildBefore(existingItem, newItem, role); node.InsertChildBefore(existingItem, newItem, role);
} }
/// <summary>
/// Applies the <paramref name="visitor"/> to all nodes in this collection.
/// </summary>
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);
}
}
} }
} }

Loading…
Cancel
Save