~ubuntu-branches/ubuntu/trusty/monodevelop/trusty-proposed

« back to all changes in this revision

Viewing changes to contrib/NRefactory/Project/Src/Visitors/PrefixFieldsVisitor.cs

  • Committer: Package Import Robot
  • Author(s): Jo Shields
  • Date: 2013-05-12 09:46:03 UTC
  • mto: This revision was merged to the branch mainline in revision 29.
  • Revision ID: package-import@ubuntu.com-20130512094603-mad323bzcxvmcam0
Tags: upstream-4.0.5+dfsg
ImportĀ upstreamĀ versionĀ 4.0.5+dfsg

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
// <file>
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>
6
 
// </file>
7
 
 
8
 
using System;
9
 
using System.Collections.Generic;
10
 
using ICSharpCode.OldNRefactory.Ast;
11
 
 
12
 
namespace ICSharpCode.OldNRefactory.Visitors
13
 
{
14
 
        /// <summary>
15
 
        /// Prefixes the names of the specified fields with the prefix and replaces the use.
16
 
        /// </summary>
17
 
        public class PrefixFieldsVisitor : AbstractAstVisitor
18
 
        {
19
 
                List<VariableDeclaration> fields;
20
 
                List<string> curBlock = new List<string>();
21
 
                Stack<List<string>> blocks = new Stack<List<string>>();
22
 
                string prefix;
23
 
                
24
 
                public PrefixFieldsVisitor(List<VariableDeclaration> fields, string prefix)
25
 
                {
26
 
                        this.fields = fields;
27
 
                        this.prefix = prefix;
28
 
                }
29
 
                
30
 
                public void Run(INode typeDeclaration)
31
 
                {
32
 
                        typeDeclaration.AcceptVisitor(this, null);
33
 
                        foreach (VariableDeclaration decl in fields) {
34
 
                                decl.Name = prefix + decl.Name;
35
 
                        }
36
 
                }
37
 
                
38
 
                public override object VisitTypeDeclaration(TypeDeclaration typeDeclaration, object data)
39
 
                {
40
 
                        Push();
41
 
                        object result = base.VisitTypeDeclaration(typeDeclaration, data);
42
 
                        Pop();
43
 
                        return result;
44
 
                }
45
 
                
46
 
                public override object VisitBlockStatement(BlockStatement blockStatement, object data)
47
 
                {
48
 
                        Push();
49
 
                        object result = base.VisitBlockStatement(blockStatement, data);
50
 
                        Pop();
51
 
                        return result;
52
 
                }
53
 
                
54
 
                public override object VisitMethodDeclaration(MethodDeclaration methodDeclaration, object data)
55
 
                {
56
 
                        Push();
57
 
                        object result = base.VisitMethodDeclaration(methodDeclaration, data);
58
 
                        Pop();
59
 
                        return result;
60
 
                }
61
 
                
62
 
                public override object VisitPropertyDeclaration(PropertyDeclaration propertyDeclaration, object data)
63
 
                {
64
 
                        Push();
65
 
                        object result = base.VisitPropertyDeclaration(propertyDeclaration, data);
66
 
                        Pop();
67
 
                        return result;
68
 
                }
69
 
                
70
 
                public override object VisitConstructorDeclaration(ConstructorDeclaration constructorDeclaration, object data)
71
 
                {
72
 
                        Push();
73
 
                        object result = base.VisitConstructorDeclaration(constructorDeclaration, data);
74
 
                        Pop();
75
 
                        return result;
76
 
                }
77
 
                
78
 
                private void Push()
79
 
                {
80
 
                        blocks.Push(curBlock);
81
 
                        curBlock = new List<string>();
82
 
                }
83
 
                
84
 
                private void Pop()
85
 
                {
86
 
                        curBlock = blocks.Pop();
87
 
                }
88
 
                
89
 
                public override object VisitVariableDeclaration(VariableDeclaration variableDeclaration, object data)
90
 
                {
91
 
                        // process local variables only
92
 
                        if (fields.Contains(variableDeclaration)) {
93
 
                                return null;
94
 
                        }
95
 
                        curBlock.Add(variableDeclaration.Name);
96
 
                        return base.VisitVariableDeclaration(variableDeclaration, data);
97
 
                }
98
 
                
99
 
                public override object VisitParameterDeclarationExpression(ParameterDeclarationExpression parameterDeclarationExpression, object data)
100
 
                {
101
 
                        curBlock.Add(parameterDeclarationExpression.ParameterName);
102
 
                        //print("add parameter ${parameterDeclarationExpression.ParameterName} to block")
103
 
                        return base.VisitParameterDeclarationExpression(parameterDeclarationExpression, data);
104
 
                }
105
 
                
106
 
                public override object VisitForeachStatement(ForeachStatement foreachStatement, object data)
107
 
                {
108
 
                        curBlock.Add(foreachStatement.VariableName);
109
 
                        return base.VisitForeachStatement(foreachStatement, data);
110
 
                }
111
 
                
112
 
                public override object VisitIdentifierExpression(IdentifierExpression identifierExpression, object data)
113
 
                {
114
 
                        string name = identifierExpression.Identifier;
115
 
                        foreach (VariableDeclaration var in fields) {
116
 
                                if (var.Name == name && !IsLocal(name)) {
117
 
                                        identifierExpression.Identifier = prefix + name;
118
 
                                        break;
119
 
                                }
120
 
                        }
121
 
                        return base.VisitIdentifierExpression(identifierExpression, data);
122
 
                }
123
 
                
124
 
                public override object VisitMemberReferenceExpression(MemberReferenceExpression fieldReferenceExpression, object data)
125
 
                {
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;
131
 
                                                break;
132
 
                                        }
133
 
                                }
134
 
                        }
135
 
                        return base.VisitMemberReferenceExpression(fieldReferenceExpression, data);
136
 
                }
137
 
                
138
 
                bool IsLocal(string name)
139
 
                {
140
 
                        foreach (List<string> block in blocks) {
141
 
                                if (block.Contains(name))
142
 
                                        return true;
143
 
                        }
144
 
                        return curBlock.Contains(name);
145
 
                }
146
 
        }
147
 
}