2
// <copyright see="prj:///doc/copyright.txt"/>
3
// <license see="prj:///doc/license.txt"/>
4
// <owner name="Daniel Grunwald" email="daniel@danielgrunwald.de"/>
5
// <version>$Revision: 4482 $</version>
9
using System.Collections.Generic;
10
using ICSharpCode.OldNRefactory.Ast;
12
namespace ICSharpCode.OldNRefactory.Visitors
15
/// Prefixes the names of the specified fields with the prefix and replaces the use.
17
public class PrefixFieldsVisitor : AbstractAstVisitor
19
List<VariableDeclaration> fields;
20
List<string> curBlock = new List<string>();
21
Stack<List<string>> blocks = new Stack<List<string>>();
24
public PrefixFieldsVisitor(List<VariableDeclaration> fields, string prefix)
30
public void Run(INode typeDeclaration)
32
typeDeclaration.AcceptVisitor(this, null);
33
foreach (VariableDeclaration decl in fields) {
34
decl.Name = prefix + decl.Name;
38
public override object VisitTypeDeclaration(TypeDeclaration typeDeclaration, object data)
41
object result = base.VisitTypeDeclaration(typeDeclaration, data);
46
public override object VisitBlockStatement(BlockStatement blockStatement, object data)
49
object result = base.VisitBlockStatement(blockStatement, data);
54
public override object VisitMethodDeclaration(MethodDeclaration methodDeclaration, object data)
57
object result = base.VisitMethodDeclaration(methodDeclaration, data);
62
public override object VisitPropertyDeclaration(PropertyDeclaration propertyDeclaration, object data)
65
object result = base.VisitPropertyDeclaration(propertyDeclaration, data);
70
public override object VisitConstructorDeclaration(ConstructorDeclaration constructorDeclaration, object data)
73
object result = base.VisitConstructorDeclaration(constructorDeclaration, data);
80
blocks.Push(curBlock);
81
curBlock = new List<string>();
86
curBlock = blocks.Pop();
89
public override object VisitVariableDeclaration(VariableDeclaration variableDeclaration, object data)
91
// process local variables only
92
if (fields.Contains(variableDeclaration)) {
95
curBlock.Add(variableDeclaration.Name);
96
return base.VisitVariableDeclaration(variableDeclaration, data);
99
public override object VisitParameterDeclarationExpression(ParameterDeclarationExpression parameterDeclarationExpression, object data)
101
curBlock.Add(parameterDeclarationExpression.ParameterName);
102
//print("add parameter ${parameterDeclarationExpression.ParameterName} to block")
103
return base.VisitParameterDeclarationExpression(parameterDeclarationExpression, data);
106
public override object VisitForeachStatement(ForeachStatement foreachStatement, object data)
108
curBlock.Add(foreachStatement.VariableName);
109
return base.VisitForeachStatement(foreachStatement, data);
112
public override object VisitIdentifierExpression(IdentifierExpression identifierExpression, object data)
114
string name = identifierExpression.Identifier;
115
foreach (VariableDeclaration var in fields) {
116
if (var.Name == name && !IsLocal(name)) {
117
identifierExpression.Identifier = prefix + name;
121
return base.VisitIdentifierExpression(identifierExpression, data);
124
public override object VisitMemberReferenceExpression(MemberReferenceExpression fieldReferenceExpression, object data)
126
if (fieldReferenceExpression.TargetObject is ThisReferenceExpression) {
127
string name = fieldReferenceExpression.MemberName;
128
foreach (VariableDeclaration var in fields) {
129
if (var.Name == name) {
130
fieldReferenceExpression.MemberName = prefix + name;
135
return base.VisitMemberReferenceExpression(fieldReferenceExpression, data);
138
bool IsLocal(string name)
140
foreach (List<string> block in blocks) {
141
if (block.Contains(name))
144
return curBlock.Contains(name);