~ubuntu-branches/ubuntu/oneiric/monodevelop/oneiric

« back to all changes in this revision

Viewing changes to src/addins/CSharpBinding/MonoDevelop.CSharp.Parser/NRefactoryParser.cs

  • Committer: Bazaar Package Importer
  • Author(s): Jo Shields
  • Date: 2011-06-27 17:03:13 UTC
  • mto: (1.8.1 upstream)
  • mto: This revision was merged to the branch mainline in revision 54.
  • Revision ID: james.westby@ubuntu.com-20110627170313-6cvz3s19x6e9hqe9
ImportĀ upstreamĀ versionĀ 2.5.92+dfsg

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
//
2
 
// NRefactoryParser.cs
3
 
//
4
 
// Author:
5
 
//   Mike KrĆ¼ger <mkrueger@novell.com>
6
 
//
7
 
// Copyright (C) 2008 Novell, Inc (http://www.novell.com)
8
 
//
9
 
// Permission is hereby granted, free of charge, to any person obtaining
10
 
// a copy of this software and associated documentation files (the
11
 
// "Software"), to deal in the Software without restriction, including
12
 
// without limitation the rights to use, copy, modify, merge, publish,
13
 
// distribute, sublicense, and/or sell copies of the Software, and to
14
 
// permit persons to whom the Software is furnished to do so, subject to
15
 
// the following conditions:
16
 
// 
17
 
// The above copyright notice and this permission notice shall be
18
 
// included in all copies or substantial portions of the Software.
19
 
// 
20
 
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
21
 
// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
22
 
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
23
 
// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
24
 
// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
25
 
// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
26
 
// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
27
 
//
28
 
 
29
 
using System;
30
 
using System.Collections;
31
 
using System.Collections.Generic;
32
 
using System.IO;
33
 
using System.Text;
34
 
using System.CodeDom;
35
 
using MonoDevelop.Projects;
36
 
using MonoDevelop.Projects.Dom;
37
 
using MonoDevelop.Projects.Dom.Parser;
38
 
using MonoDevelop.Refactoring;
39
 
using ICSharpCode.NRefactory.Visitors;
40
 
using ICSharpCode.NRefactory;
41
 
using MonoDevelop.CSharp.Resolver;
42
 
using MonoDevelop.CSharp.Project;
43
 
 
44
 
namespace MonoDevelop.CSharp.Parser
45
 
{
46
 
        public class NRefactoryParser : AbstractParser
47
 
        {
48
 
                public override bool CanParse (string fileName)
49
 
                {
50
 
                        return Path.GetExtension (fileName) == ".cs";
51
 
                }
52
 
 
53
 
                public NRefactoryParser () : base("C#", "text/x-csharp")
54
 
                {
55
 
                }
56
 
 
57
 
                public override IExpressionFinder CreateExpressionFinder (ProjectDom dom)
58
 
                {
59
 
                        return new NewCSharpExpressionFinder (dom);
60
 
                }
61
 
 
62
 
                public override IResolver CreateResolver (ProjectDom dom, object editor, string fileName)
63
 
                {
64
 
                        MonoDevelop.Ide.Gui.Document doc = (MonoDevelop.Ide.Gui.Document)editor;
65
 
                        return new NRefactoryResolver (dom, doc.CompilationUnit, ICSharpCode.NRefactory.SupportedLanguage.CSharp, doc.TextEditor, fileName);
66
 
                }
67
 
 
68
 
                class SpecialTracker : ICSharpCode.NRefactory.ISpecialVisitor
69
 
                {
70
 
                        ParsedDocument result;
71
 
 
72
 
                        public SpecialTracker (ParsedDocument result)
73
 
                        {
74
 
                                this.result = result;
75
 
                        }
76
 
 
77
 
                        public object Visit (ICSharpCode.NRefactory.ISpecial special, object data)
78
 
                        {
79
 
                                return null;
80
 
                        }
81
 
 
82
 
                        public object Visit (ICSharpCode.NRefactory.BlankLine special, object data)
83
 
                        {
84
 
                                return null;
85
 
                        }
86
 
 
87
 
                        public object Visit (ICSharpCode.NRefactory.Comment comment, object data)
88
 
                        {
89
 
                                MonoDevelop.Projects.Dom.Comment newComment = new MonoDevelop.Projects.Dom.Comment ();
90
 
                                newComment.CommentStartsLine = comment.CommentStartsLine;
91
 
                                newComment.Text = comment.CommentText;
92
 
                                int commentTagLength = comment.CommentType == ICSharpCode.NRefactory.CommentType.Documentation ? 3 : 2;
93
 
                                int commentEndOffset = comment.CommentType == ICSharpCode.NRefactory.CommentType.Block ? 0 : 1;
94
 
                                newComment.Region = new DomRegion (comment.StartPosition.Line, comment.StartPosition.Column - commentTagLength, comment.EndPosition.Line, comment.EndPosition.Column - commentEndOffset);
95
 
                                switch (comment.CommentType) {
96
 
                                case ICSharpCode.NRefactory.CommentType.Block:
97
 
                                        newComment.CommentType = MonoDevelop.Projects.Dom.CommentType.MultiLine;
98
 
                                        break;
99
 
                                case ICSharpCode.NRefactory.CommentType.Documentation:
100
 
                                        newComment.CommentType = MonoDevelop.Projects.Dom.CommentType.SingleLine;
101
 
                                        newComment.IsDocumentation = true;
102
 
                                        break;
103
 
                                default:
104
 
                                        newComment.CommentType = MonoDevelop.Projects.Dom.CommentType.SingleLine;
105
 
                                        break;
106
 
                                }
107
 
 
108
 
                                result.Add (newComment);
109
 
                                return null;
110
 
                        }
111
 
 
112
 
                        Stack<ICSharpCode.NRefactory.PreprocessingDirective> regions = new Stack<ICSharpCode.NRefactory.PreprocessingDirective> ();
113
 
                        Stack<ICSharpCode.NRefactory.PreprocessingDirective> ifBlocks = new Stack<ICSharpCode.NRefactory.PreprocessingDirective> ();
114
 
                        List<ICSharpCode.NRefactory.PreprocessingDirective> elifBlocks = new List<ICSharpCode.NRefactory.PreprocessingDirective> ();
115
 
                        ICSharpCode.NRefactory.PreprocessingDirective elseBlock = null;
116
 
 
117
 
                        Stack<ConditionalRegion> conditionalRegions = new Stack<ConditionalRegion> ();
118
 
                        ConditionalRegion ConditionalRegion {
119
 
                                get {
120
 
                                        return conditionalRegions.Count > 0 ? conditionalRegions.Peek () : null;
121
 
                                }
122
 
                        }
123
 
 
124
 
                        void CloseConditionBlock (DomLocation loc)
125
 
                        {
126
 
                                if (ConditionalRegion == null || ConditionalRegion.ConditionBlocks.Count == 0 || !ConditionalRegion.ConditionBlocks[ConditionalRegion.ConditionBlocks.Count - 1].End.IsEmpty)
127
 
                                        return;
128
 
                                ConditionalRegion.ConditionBlocks[ConditionalRegion.ConditionBlocks.Count - 1].End = loc;
129
 
                        }
130
 
 
131
 
                        void AddCurRegion (ICSharpCode.NRefactory.Location loc)
132
 
                        {
133
 
                                if (ConditionalRegion == null)
134
 
                                        return;
135
 
                                ConditionalRegion.End = new DomLocation (loc.Line, loc.Column);
136
 
                                result.Add (ConditionalRegion);
137
 
                                conditionalRegions.Pop ();
138
 
                        }
139
 
 
140
 
                        static ICSharpCode.NRefactory.PrettyPrinter.CSharpOutputVisitor visitor = new ICSharpCode.NRefactory.PrettyPrinter.CSharpOutputVisitor ();
141
 
 
142
 
                        public object Visit (ICSharpCode.NRefactory.PreprocessingDirective directive, object data)
143
 
                        {
144
 
                                DomLocation loc = new DomLocation (directive.StartPosition.Line, directive.StartPosition.Column);
145
 
                                switch (directive.Cmd) {
146
 
                                case "#if":
147
 
                                        directive.Expression.AcceptVisitor (visitor, null);
148
 
                                        conditionalRegions.Push (new ConditionalRegion (visitor.Text));
149
 
                                        visitor.Reset ();
150
 
                                        ifBlocks.Push (directive);
151
 
                                        ConditionalRegion.Start = loc;
152
 
                                        break;
153
 
                                case "#elif":
154
 
                                        CloseConditionBlock (new DomLocation (directive.LastLineEnd.Line, directive.LastLineEnd.Column));
155
 
                                        directive.Expression.AcceptVisitor (visitor, null);
156
 
                                        if (ConditionalRegion != null)
157
 
                                                ConditionalRegion.ConditionBlocks.Add (new ConditionBlock (visitor.Text, loc));
158
 
                                        visitor.Reset ();
159
 
                                        //                                              elifBlocks.Add (directive);
160
 
                                        break;
161
 
                                case "#else":
162
 
                                        CloseConditionBlock (new DomLocation (directive.LastLineEnd.Line, directive.LastLineEnd.Column));
163
 
                                        if (ConditionalRegion != null)
164
 
                                                ConditionalRegion.ElseBlock = new DomRegion (loc, DomLocation.Empty);
165
 
                                        //                                              elseBlock = directive;
166
 
                                        break;
167
 
                                case "#endif":
168
 
                                        DomLocation endLoc = new DomLocation (directive.LastLineEnd.Line, directive.LastLineEnd.Column);
169
 
                                        CloseConditionBlock (endLoc);
170
 
                                        if (ConditionalRegion != null && !ConditionalRegion.ElseBlock.Start.IsEmpty)
171
 
                                                ConditionalRegion.ElseBlock = new DomRegion (ConditionalRegion.ElseBlock.Start, endLoc);
172
 
                                        AddCurRegion (directive.EndPosition);
173
 
                                        if (ifBlocks.Count > 0) {
174
 
                                                ICSharpCode.NRefactory.PreprocessingDirective ifBlock = ifBlocks.Pop ();
175
 
                                                DomRegion dr = new DomRegion (ifBlock.StartPosition.Line, ifBlock.StartPosition.Column, directive.EndPosition.Line, directive.EndPosition.Column);
176
 
                                                result.Add (new FoldingRegion ("#if " + ifBlock.Arg.Trim (), dr, FoldType.UserRegion, false));
177
 
                                                foreach (ICSharpCode.NRefactory.PreprocessingDirective d in elifBlocks) {
178
 
                                                        dr.Start = new DomLocation (d.StartPosition.Line, d.StartPosition.Column);
179
 
                                                        result.Add (new FoldingRegion ("#elif " + ifBlock.Arg.Trim (), dr, FoldType.UserRegion, false));
180
 
                                                }
181
 
                                                if (elseBlock != null) {
182
 
                                                        dr.Start = new DomLocation (elseBlock.StartPosition.Line, elseBlock.StartPosition.Column);
183
 
                                                        result.Add (new FoldingRegion ("#else", dr, FoldType.UserRegion, false));
184
 
                                                }
185
 
                                        }
186
 
                                        elseBlock = null;
187
 
                                        break;
188
 
                                case "#define":
189
 
                                        result.Add (new PreProcessorDefine (directive.Arg, loc));
190
 
                                        break;
191
 
                                case "#region":
192
 
                                        regions.Push (directive);
193
 
                                        break;
194
 
                                case "#endregion":
195
 
                                        if (regions.Count > 0) {
196
 
                                                ICSharpCode.NRefactory.PreprocessingDirective start = regions.Pop ();
197
 
                                                DomRegion dr = new DomRegion (start.StartPosition.Line, start.StartPosition.Column, directive.EndPosition.Line, directive.EndPosition.Column);
198
 
                                                result.Add (new FoldingRegion (start.Arg, dr, FoldType.UserRegion, true));
199
 
                                        }
200
 
                                        break;
201
 
                                }
202
 
                                return null;
203
 
                        }
204
 
                }
205
 
 
206
 
                public ICSharpCode.NRefactory.Ast.CompilationUnit LastUnit {
207
 
                        get;
208
 
                        set;
209
 
                }
210
 
 
211
 
                public override ParsedDocument Parse (ProjectDom dom, string fileName, string content)
212
 
                {
213
 
                        using (ICSharpCode.NRefactory.IParser parser = ICSharpCode.NRefactory.ParserFactory.CreateParser (ICSharpCode.NRefactory.SupportedLanguage.CSharp, new StringReader (content))) {
214
 
 
215
 
                                ParsedDocument result = new ParsedDocument (fileName);
216
 
                                result.CompilationUnit = new MonoDevelop.Projects.Dom.CompilationUnit (fileName);
217
 
                                
218
 
                                parser.Errors.Error += delegate(int line, int col, string message) { result.Add (new Error (ErrorType.Error, line, col, message)); };
219
 
                                parser.Lexer.SpecialCommentTags = LexerTags;
220
 
                                parser.Lexer.EvaluateConditionalCompilation = true;
221
 
                                if (dom != null && dom.Project != null) {
222
 
                                        DotNetProjectConfiguration conf = dom.Project.DefaultConfiguration as DotNetProjectConfiguration;
223
 
                                        CSharpCompilerParameters par = conf != null ? conf.CompilationParameters as CSharpCompilerParameters : null;
224
 
                                        if (par != null)
225
 
                                                parser.Lexer.SetConditionalCompilationSymbols (par.DefineSymbols);
226
 
                                }
227
 
                                parser.Parse ();
228
 
                                
229
 
                                SpecialTracker tracker = new SpecialTracker (result);
230
 
                                foreach (ICSharpCode.NRefactory.ISpecial special in parser.Lexer.SpecialTracker.CurrentSpecials) {
231
 
                                        special.AcceptVisitor (tracker, null);
232
 
                                }
233
 
 
234
 
                                foreach (ICSharpCode.NRefactory.Parser.TagComment tagComment in parser.Lexer.TagComments) {
235
 
                                        result.Add (new Tag (tagComment.Tag, tagComment.CommentText, new DomRegion (tagComment.StartPosition.Y, tagComment.StartPosition.X, tagComment.EndPosition.Y, tagComment.EndPosition.X)));
236
 
                                }
237
 
                                ConversionVisitior visitor = new ConversionVisitior (result, parser.Lexer.SpecialTracker.CurrentSpecials);
238
 
                                visitor.VisitCompilationUnit (parser.CompilationUnit, null);
239
 
                                result.CompilationUnit.Tag = parser.CompilationUnit;
240
 
                                LastUnit = parser.CompilationUnit;
241
 
                                return result;
242
 
                        }
243
 
                }
244
 
 
245
 
                class ConversionVisitior : ICSharpCode.NRefactory.Visitors.AbstractAstVisitor
246
 
                {
247
 
                        MonoDevelop.Projects.Dom.ParsedDocument result;
248
 
                        int lastSpecial = 0;
249
 
                        List<ISpecial> specials;
250
 
                        
251
 
                        public ConversionVisitior (MonoDevelop.Projects.Dom.ParsedDocument result, List<ISpecial> specials)
252
 
                        {
253
 
                                this.specials = specials;
254
 
                                this.result = result;
255
 
                                namespaceEndLocationStack.Push (new Location (Int32.MaxValue, Int32.MaxValue));
256
 
                        }
257
 
 
258
 
                        string RetrieveDocumentation (int upToLine)
259
 
                        {
260
 
                                StringBuilder result = null;
261
 
                                while (lastSpecial < specials.Count) {
262
 
                                        ISpecial cur = specials[lastSpecial];
263
 
                                        if (cur.StartPosition.Line >= upToLine)
264
 
                                                break;
265
 
                                        ICSharpCode.NRefactory.Comment comment = cur as ICSharpCode.NRefactory.Comment;
266
 
                                        if (comment != null && comment.CommentType == ICSharpCode.NRefactory.CommentType.Documentation) {
267
 
                                                if (result == null)
268
 
                                                        result = new StringBuilder ();
269
 
                                                result.Append (comment.CommentText);
270
 
                                        }
271
 
                                        lastSpecial++;
272
 
                                }
273
 
                                return result == null ? null : result.ToString ();
274
 
                        }
275
 
                        
276
 
                        static DomRegion ConvertRegion (ICSharpCode.NRefactory.Location start, ICSharpCode.NRefactory.Location end)
277
 
                        {
278
 
                                return new DomRegion (start.Line, start.Column, end.Line, end.Column);
279
 
                        }
280
 
 
281
 
                        static DomLocation ConvertLocation (ICSharpCode.NRefactory.Location location)
282
 
                        {
283
 
                                return new DomLocation (location.Line, location.Column);
284
 
                        }
285
 
 
286
 
                        static Modifiers ConvertModifiers (ICSharpCode.NRefactory.Ast.Modifiers modifiers)
287
 
                        {
288
 
                                return (Modifiers)modifiers;
289
 
                        }
290
 
 
291
 
                        static ClassType ConvertClassType (ICSharpCode.NRefactory.Ast.ClassType nrClassType)
292
 
                        {
293
 
                                switch (nrClassType) {
294
 
                                case ICSharpCode.NRefactory.Ast.ClassType.Class:
295
 
                                        return ClassType.Class;
296
 
                                case ICSharpCode.NRefactory.Ast.ClassType.Struct:
297
 
                                        return ClassType.Struct;
298
 
                                case ICSharpCode.NRefactory.Ast.ClassType.Interface:
299
 
                                        return ClassType.Interface;
300
 
                                case ICSharpCode.NRefactory.Ast.ClassType.Enum:
301
 
                                        return ClassType.Enum;
302
 
                                }
303
 
                                return ClassType.Class;
304
 
                        }
305
 
 
306
 
                        static DomReturnType ConvertReturnType (ICSharpCode.NRefactory.Ast.TypeReference typeReference)
307
 
                        {
308
 
                                return typeReference.ConvertToReturnType ();
309
 
                        }
310
 
 
311
 
                        static void AddAttributes (AbstractMember member, IEnumerable<ICSharpCode.NRefactory.Ast.AttributeSection> attributes)
312
 
                        {
313
 
                                CodeDomVisitor domVisitor = new CodeDomVisitor ();
314
 
                                foreach (ICSharpCode.NRefactory.Ast.AttributeSection attributeSection in attributes) {
315
 
                                        foreach (ICSharpCode.NRefactory.Ast.Attribute attribute in attributeSection.Attributes) {
316
 
                                                DomAttribute domAttribute = new DomAttribute ();
317
 
                                                domAttribute.Name = attribute.Name;
318
 
                                                domAttribute.Region = ConvertRegion (attribute.StartLocation, attribute.EndLocation);
319
 
                                                domAttribute.AttributeType = new DomReturnType (attribute.Name);
320
 
                                                member.Add (domAttribute);
321
 
                                                foreach (ICSharpCode.NRefactory.Ast.Expression exp in attribute.PositionalArguments)
322
 
                                                        domAttribute.AddPositionalArgument ((CodeExpression)exp.AcceptVisitor (domVisitor, null));
323
 
                                                foreach (ICSharpCode.NRefactory.Ast.NamedArgumentExpression nexp in attribute.NamedArguments)
324
 
                                                        domAttribute.AddNamedArgument (nexp.Name, (CodeExpression)nexp.Expression.AcceptVisitor (domVisitor, null));
325
 
                                        }
326
 
                                }
327
 
                        }
328
 
 
329
 
                        static void AddExplicitInterfaces (AbstractMember member, IEnumerable<ICSharpCode.NRefactory.Ast.InterfaceImplementation> interfaceImplementations)
330
 
                        {
331
 
                                if (interfaceImplementations == null)
332
 
                                        return;
333
 
 
334
 
                                foreach (ICSharpCode.NRefactory.Ast.InterfaceImplementation impl in interfaceImplementations) {
335
 
                                        member.AddExplicitInterface (ConvertReturnType (impl.InterfaceType));
336
 
                                }
337
 
                        }
338
 
 
339
 
                        public override object VisitUsingDeclaration (ICSharpCode.NRefactory.Ast.UsingDeclaration usingDeclaration, object data)
340
 
                        {
341
 
                                DomUsing domUsing = new DomUsing ();
342
 
                                domUsing.Region = ConvertRegion (usingDeclaration.StartLocation, usingDeclaration.EndLocation);
343
 
                                domUsing.ValidRegion = ConvertRegion (usingDeclaration.StartLocation, namespaceEndLocationStack.Peek ()); 
344
 
                                foreach (ICSharpCode.NRefactory.Ast.Using u in usingDeclaration.Usings) {
345
 
                                        if (u.IsAlias) {
346
 
                                                domUsing.Add (u.Name, ConvertReturnType (u.Alias));
347
 
                                        } else {
348
 
                                                domUsing.Add (u.Name);
349
 
                                        }
350
 
                                }
351
 
                                ((CompilationUnit)result.CompilationUnit).Add (domUsing);
352
 
                                return data;
353
 
                        }
354
 
 
355
 
                        Stack<string> namespaceStack = new Stack<string> ();
356
 
                        Stack<Location> namespaceEndLocationStack = new Stack<Location> ();
357
 
                        public override object VisitNamespaceDeclaration (ICSharpCode.NRefactory.Ast.NamespaceDeclaration namespaceDeclaration, object data)
358
 
                        {
359
 
                                string[] splittedNamespace = namespaceDeclaration.Name.Split ('.');
360
 
                                for (int i = splittedNamespace.Length; i > 0; i--) {
361
 
                                        DomUsing domUsing = new DomUsing ();
362
 
                                        domUsing.IsFromNamespace = true;
363
 
                                        domUsing.Region = ConvertRegion (namespaceDeclaration.StartLocation, namespaceDeclaration.EndLocation);
364
 
                                        domUsing.ValidRegion = domUsing.Region;
365
 
                                        domUsing.Add (String.Join (".", splittedNamespace, 0, i));
366
 
                                        ((CompilationUnit)result.CompilationUnit).Add (domUsing);
367
 
                                }
368
 
                                namespaceEndLocationStack.Push (namespaceDeclaration.EndLocation);
369
 
                                namespaceStack.Push (namespaceStack.Count == 0 ? namespaceDeclaration.Name : namespaceStack.Peek () + "." + namespaceDeclaration.Name);
370
 
                                namespaceDeclaration.AcceptChildren (this, data);
371
 
                                namespaceStack.Pop ();
372
 
                                namespaceEndLocationStack.Pop ();
373
 
                                return null;
374
 
                        }
375
 
                        
376
 
                        Stack<DomType> typeStack = new Stack<DomType> ();
377
 
                        public override object VisitTypeDeclaration (ICSharpCode.NRefactory.Ast.TypeDeclaration typeDeclaration, object data)
378
 
                        {
379
 
                                DomType newType = new DomType ();
380
 
                                newType.Name = typeDeclaration.Name;
381
 
                                newType.Documentation = RetrieveDocumentation (typeDeclaration.StartLocation.Line);
382
 
                                newType.Location = ConvertLocation (typeDeclaration.StartLocation);
383
 
                                newType.ClassType = ConvertClassType (typeDeclaration.Type);
384
 
                                DomRegion region = ConvertRegion (typeDeclaration.BodyStartLocation, typeDeclaration.EndLocation);
385
 
                                region.End = new DomLocation (region.End.Line, region.End.Column + 1);
386
 
                                newType.BodyRegion = region;
387
 
                                newType.Modifiers = ConvertModifiers (typeDeclaration.Modifier);
388
 
 
389
 
                                AddAttributes (newType, typeDeclaration.Attributes);
390
 
 
391
 
                                foreach (ICSharpCode.NRefactory.Ast.TemplateDefinition template in typeDeclaration.Templates) {
392
 
                                        TypeParameter parameter = ConvertTemplateDefinition (template);
393
 
                                        newType.AddTypeParameter (parameter);
394
 
                                }
395
 
 
396
 
                                if (typeDeclaration.BaseTypes != null) {
397
 
 
398
 
                                        foreach (ICSharpCode.NRefactory.Ast.TypeReference type in typeDeclaration.BaseTypes) {
399
 
                                                if (type == typeDeclaration.BaseTypes[0]) {
400
 
                                                        newType.BaseType = ConvertReturnType (type);
401
 
                                                } else {
402
 
                                                        newType.AddInterfaceImplementation (ConvertReturnType (type));
403
 
                                                }
404
 
                                        }
405
 
                                }
406
 
                                AddType (newType);
407
 
 
408
 
                                // visit members
409
 
                                typeStack.Push (newType);
410
 
                                typeDeclaration.AcceptChildren (this, data);
411
 
                                typeStack.Pop ();
412
 
 
413
 
                                return null;
414
 
                        }
415
 
 
416
 
                        TypeParameter ConvertTemplateDefinition (ICSharpCode.NRefactory.Ast.TemplateDefinition template)
417
 
                        {
418
 
                                TypeParameter parameter = new TypeParameter (template.Name);
419
 
                                foreach (ICSharpCode.NRefactory.Ast.TypeReference typeRef in template.Bases) {
420
 
                                        if (typeRef.Type == "constraint: struct")
421
 
                                                parameter.ValueTypeRequired = true; else if (typeRef.Type == "constraint: class")
422
 
                                                parameter.ClassRequired = true; else if (typeRef.Type == "constraint: new")
423
 
                                                parameter.ConstructorRequired = true; else {
424
 
                                                DomReturnType rt = ConvertReturnType (typeRef);
425
 
                                                parameter.AddConstraint (rt);
426
 
                                        }
427
 
                                }
428
 
                                return parameter;
429
 
                        }
430
 
 
431
 
                        void AddType (DomType type)
432
 
                        {
433
 
                                // add type to compilation unit or outer type
434
 
                                if (typeStack.Count > 0) {
435
 
                                        // Nested types are private by default
436
 
                                        if ((type.Modifiers & Modifiers.VisibilityMask) == 0)
437
 
                                                type.Modifiers |= Modifiers.Private;
438
 
                                        DomType outerType = typeStack.Peek ();
439
 
                                        type.DeclaringType = outerType;
440
 
                                        outerType.Add (type);
441
 
                                } else {
442
 
                                        // Types are internal by default
443
 
                                        if ((type.Modifiers & Modifiers.VisibilityMask) == 0)
444
 
                                                type.Modifiers |= Modifiers.Internal;
445
 
                                        if (namespaceStack.Count > 0)
446
 
                                                type.Namespace = namespaceStack.Peek ();
447
 
                                        ((CompilationUnit)result.CompilationUnit).Add (type);
448
 
                                }
449
 
                        }
450
 
 
451
 
                        static ParameterModifiers ConvertParameterModifiers (ICSharpCode.NRefactory.Ast.ParameterModifiers modifier)
452
 
                        {
453
 
                                if ((modifier & ICSharpCode.NRefactory.Ast.ParameterModifiers.Out) != 0)
454
 
                                        return ParameterModifiers.Out;
455
 
                                if ((modifier & ICSharpCode.NRefactory.Ast.ParameterModifiers.Ref) != 0)
456
 
                                        return ParameterModifiers.Ref;
457
 
                                if ((modifier & ICSharpCode.NRefactory.Ast.ParameterModifiers.Params) != 0)
458
 
                                        return ParameterModifiers.Params;
459
 
                                return ParameterModifiers.None;
460
 
                        }
461
 
 
462
 
                        static DomParameter ConvertParameter (IMember declaringMember, ICSharpCode.NRefactory.Ast.ParameterDeclarationExpression pde)
463
 
                        {
464
 
                                DomParameter result = new DomParameter ();
465
 
                                result.Name = pde.ParameterName;
466
 
                                result.Location = ConvertLocation (pde.StartLocation);
467
 
                                result.DeclaringMember = declaringMember;
468
 
                                result.ReturnType = ConvertReturnType (pde.TypeReference);
469
 
                                result.ParameterModifiers = ConvertParameterModifiers (pde.ParamModifier);
470
 
                                return result;
471
 
                        }
472
 
 
473
 
                        static List<IParameter> ConvertParameterList (IMember declaringMember, IEnumerable<ICSharpCode.NRefactory.Ast.ParameterDeclarationExpression> parameters)
474
 
                        {
475
 
                                List<IParameter> result = new List<IParameter> ();
476
 
                                if (parameters != null) {
477
 
                                        foreach (ICSharpCode.NRefactory.Ast.ParameterDeclarationExpression pde in parameters) {
478
 
                                                result.Add (ConvertParameter (declaringMember, pde));
479
 
                                        }
480
 
                                }
481
 
                                return result;
482
 
                        }
483
 
 
484
 
                        public override object VisitDelegateDeclaration (ICSharpCode.NRefactory.Ast.DelegateDeclaration delegateDeclaration, object data)
485
 
                        {
486
 
                                List<IParameter> parameter = ConvertParameterList (null, delegateDeclaration.Parameters);
487
 
                                DomType delegateType = DomType.CreateDelegate (result.CompilationUnit, delegateDeclaration.Name, ConvertLocation (delegateDeclaration.StartLocation), ConvertReturnType (delegateDeclaration.ReturnType), parameter);
488
 
                                delegateType.Documentation = RetrieveDocumentation (delegateDeclaration.StartLocation.Line);
489
 
                                delegateType.Location = ConvertLocation (delegateDeclaration.StartLocation);
490
 
                                delegateType.Modifiers = ConvertModifiers (delegateDeclaration.Modifier);
491
 
                                AddAttributes (delegateType, delegateDeclaration.Attributes);
492
 
 
493
 
                                foreach (DomParameter p in parameter) {
494
 
                                        p.DeclaringMember = delegateType;
495
 
                                }
496
 
                                
497
 
                                if (delegateDeclaration.Templates != null && delegateDeclaration.Templates.Count > 0) {
498
 
                                        foreach (ICSharpCode.NRefactory.Ast.TemplateDefinition template in delegateDeclaration.Templates) {
499
 
                                                delegateType.AddTypeParameter (ConvertTemplateDefinition (template));
500
 
                                        }
501
 
                                }
502
 
                                AddType (delegateType);
503
 
 
504
 
                                return null;
505
 
                        }
506
 
 
507
 
                        public override object VisitConstructorDeclaration (ICSharpCode.NRefactory.Ast.ConstructorDeclaration constructorDeclaration, object data)
508
 
                        {
509
 
                                DomMethod constructor = new DomMethod ();
510
 
                                constructor.Documentation = RetrieveDocumentation (constructorDeclaration.StartLocation.Line);
511
 
                                constructor.Name = ".ctor";
512
 
                                constructor.MethodModifier |= MethodModifier.IsConstructor;
513
 
                                constructor.Location = ConvertLocation (constructorDeclaration.StartLocation);
514
 
                                constructor.BodyRegion = ConvertRegion (constructorDeclaration.EndLocation, constructorDeclaration.Body != null ? constructorDeclaration.Body.EndLocation : new ICSharpCode.NRefactory.Location (-1, -1));
515
 
                                constructor.Modifiers = ConvertModifiers (constructorDeclaration.Modifier);
516
 
                                AddAttributes (constructor, constructorDeclaration.Attributes);
517
 
                                constructor.Add (ConvertParameterList (constructor, constructorDeclaration.Parameters));
518
 
 
519
 
                                constructor.DeclaringType = typeStack.Peek ();
520
 
                                typeStack.Peek ().Add (constructor);
521
 
                                return null;
522
 
                        }
523
 
 
524
 
                        public override object VisitMethodDeclaration (ICSharpCode.NRefactory.Ast.MethodDeclaration methodDeclaration, object data)
525
 
                        {
526
 
                                DomMethod method = new DomMethod ();
527
 
                                method.Name = methodDeclaration.Name;
528
 
                                method.Documentation = RetrieveDocumentation (methodDeclaration.StartLocation.Line);
529
 
                                method.Location = ConvertLocation (methodDeclaration.StartLocation);
530
 
                                method.BodyRegion = ConvertRegion (methodDeclaration.EndLocation, methodDeclaration.Body != null ? methodDeclaration.Body.EndLocation : new ICSharpCode.NRefactory.Location (-1, -1));
531
 
                                method.Modifiers = ConvertModifiers (methodDeclaration.Modifier);
532
 
                                if (methodDeclaration.IsExtensionMethod)
533
 
                                        method.MethodModifier |= MethodModifier.IsExtension;
534
 
                                method.ReturnType = ConvertReturnType (methodDeclaration.TypeReference);
535
 
                                AddAttributes (method, methodDeclaration.Attributes);
536
 
                                method.Add (ConvertParameterList (method, methodDeclaration.Parameters));
537
 
                                AddExplicitInterfaces (method, methodDeclaration.InterfaceImplementations);
538
 
 
539
 
                                if (methodDeclaration.Templates != null && methodDeclaration.Templates.Count > 0) {
540
 
                                        foreach (ICSharpCode.NRefactory.Ast.TemplateDefinition template in methodDeclaration.Templates) {
541
 
                                                TypeParameter parameter = ConvertTemplateDefinition (template);
542
 
                                                method.AddTypeParameter (parameter);
543
 
                                        }
544
 
                                }
545
 
                                method.DeclaringType = typeStack.Peek ();
546
 
                                typeStack.Peek ().Add (method);
547
 
                                return null;
548
 
                        }
549
 
 
550
 
                        public override object VisitDestructorDeclaration (ICSharpCode.NRefactory.Ast.DestructorDeclaration destructorDeclaration, object data)
551
 
                        {
552
 
                                DomMethod destructor = new DomMethod ();
553
 
                                destructor.Name = ".dtor";
554
 
                                destructor.Documentation = RetrieveDocumentation (destructorDeclaration.StartLocation.Line);
555
 
                                destructor.Location = ConvertLocation (destructorDeclaration.StartLocation);
556
 
                                destructor.BodyRegion = ConvertRegion (destructorDeclaration.EndLocation, destructorDeclaration.Body != null ? destructorDeclaration.Body.EndLocation : new ICSharpCode.NRefactory.Location (-1, -1));
557
 
                                destructor.Modifiers = ConvertModifiers (destructorDeclaration.Modifier);
558
 
                                AddAttributes (destructor, destructorDeclaration.Attributes);
559
 
                                destructor.MethodModifier |= MethodModifier.IsFinalizer;
560
 
 
561
 
                                destructor.DeclaringType = typeStack.Peek ();
562
 
                                typeStack.Peek ().Add (destructor);
563
 
 
564
 
                                return null;
565
 
                        }
566
 
 
567
 
                        static string GetOperatorName (ICSharpCode.NRefactory.Ast.OperatorDeclaration operatorDeclaration)
568
 
                        {
569
 
                                if (operatorDeclaration == null)
570
 
                                        return null;
571
 
                                bool isBinary = operatorDeclaration.Parameters.Count == 2;
572
 
                                switch (operatorDeclaration.OverloadableOperator) {
573
 
                                case ICSharpCode.NRefactory.Ast.OverloadableOperatorType.UnaryMinus:
574
 
                                        return "op_UnaryNegation";
575
 
                                case ICSharpCode.NRefactory.Ast.OverloadableOperatorType.UnaryPlus:
576
 
                                        return "op_UnaryPlus";
577
 
                                case ICSharpCode.NRefactory.Ast.OverloadableOperatorType.Add:
578
 
                                        return isBinary ? "op_Addition" : "op_UnaryPlus";
579
 
                                case ICSharpCode.NRefactory.Ast.OverloadableOperatorType.Subtract:
580
 
                                        return isBinary ? "op_Subtraction" : "op_UnaryNegation";
581
 
                                case ICSharpCode.NRefactory.Ast.OverloadableOperatorType.Multiply:
582
 
                                        return "op_Multiply";
583
 
                                case ICSharpCode.NRefactory.Ast.OverloadableOperatorType.Divide:
584
 
                                        return "op_Division";
585
 
                                case ICSharpCode.NRefactory.Ast.OverloadableOperatorType.Modulus:
586
 
                                        return "op_Modulus";
587
 
 
588
 
                                case ICSharpCode.NRefactory.Ast.OverloadableOperatorType.Not:
589
 
                                        return "op_LogicalNot";
590
 
                                case ICSharpCode.NRefactory.Ast.OverloadableOperatorType.BitNot:
591
 
                                        return "op_OnesComplement";
592
 
                                case ICSharpCode.NRefactory.Ast.OverloadableOperatorType.BitwiseAnd:
593
 
                                        return "op_BitwiseAnd";
594
 
                                case ICSharpCode.NRefactory.Ast.OverloadableOperatorType.BitwiseOr:
595
 
                                        return "op_BitwiseOr";
596
 
                                case ICSharpCode.NRefactory.Ast.OverloadableOperatorType.ExclusiveOr:
597
 
                                        return "op_ExclusiveOr";
598
 
 
599
 
                                case ICSharpCode.NRefactory.Ast.OverloadableOperatorType.ShiftLeft:
600
 
                                        return "op_LeftShift";
601
 
                                case ICSharpCode.NRefactory.Ast.OverloadableOperatorType.ShiftRight:
602
 
                                        return "op_RightShift";
603
 
 
604
 
                                case ICSharpCode.NRefactory.Ast.OverloadableOperatorType.GreaterThan:
605
 
                                        return "op_GreaterThan";
606
 
                                case ICSharpCode.NRefactory.Ast.OverloadableOperatorType.GreaterThanOrEqual:
607
 
                                        return "op_GreaterThanOrEqual";
608
 
                                case ICSharpCode.NRefactory.Ast.OverloadableOperatorType.Equality:
609
 
                                        return "op_Equality";
610
 
                                case ICSharpCode.NRefactory.Ast.OverloadableOperatorType.InEquality:
611
 
                                        return "op_Inequality";
612
 
                                case ICSharpCode.NRefactory.Ast.OverloadableOperatorType.LessThan:
613
 
                                        return "op_LessThan";
614
 
                                case ICSharpCode.NRefactory.Ast.OverloadableOperatorType.LessThanOrEqual:
615
 
                                        return "op_LessThanOrEqual";
616
 
 
617
 
                                case ICSharpCode.NRefactory.Ast.OverloadableOperatorType.Increment:
618
 
                                        return "op_Increment";
619
 
                                case ICSharpCode.NRefactory.Ast.OverloadableOperatorType.Decrement:
620
 
                                        return "op_Decrement";
621
 
 
622
 
                                case ICSharpCode.NRefactory.Ast.OverloadableOperatorType.IsTrue:
623
 
                                        return "op_True";
624
 
                                case ICSharpCode.NRefactory.Ast.OverloadableOperatorType.IsFalse:
625
 
                                        return "op_False";
626
 
 
627
 
                                case ICSharpCode.NRefactory.Ast.OverloadableOperatorType.None:
628
 
                                        switch (operatorDeclaration.ConversionType) {
629
 
                                        case ICSharpCode.NRefactory.Ast.ConversionType.Implicit:
630
 
                                                return "op_Implicit";
631
 
                                        case ICSharpCode.NRefactory.Ast.ConversionType.Explicit:
632
 
                                                return "op_Explicit";
633
 
                                        }
634
 
                                        break;
635
 
                                }
636
 
                                return null;
637
 
                        }
638
 
 
639
 
                        public override object VisitOperatorDeclaration (ICSharpCode.NRefactory.Ast.OperatorDeclaration operatorDeclaration, object data)
640
 
                        {
641
 
                                DomMethod method = new DomMethod ();
642
 
                                method.Name = GetOperatorName (operatorDeclaration);
643
 
                                method.Documentation = RetrieveDocumentation (operatorDeclaration.StartLocation.Line);
644
 
                                method.Location = ConvertLocation (operatorDeclaration.StartLocation);
645
 
                                method.BodyRegion = ConvertRegion (operatorDeclaration.EndLocation, operatorDeclaration.Body != null ? operatorDeclaration.Body.EndLocation : new ICSharpCode.NRefactory.Location (-1, -1));
646
 
                                method.Modifiers = ConvertModifiers (operatorDeclaration.Modifier) | Modifiers.SpecialName;
647
 
                                if (operatorDeclaration.IsExtensionMethod)
648
 
                                        method.MethodModifier |= MethodModifier.IsExtension;
649
 
                                method.ReturnType = ConvertReturnType (operatorDeclaration.TypeReference);
650
 
                                AddAttributes (method, operatorDeclaration.Attributes);
651
 
                                method.Add (ConvertParameterList (method, operatorDeclaration.Parameters));
652
 
                                AddExplicitInterfaces (method, operatorDeclaration.InterfaceImplementations);
653
 
 
654
 
                                if (operatorDeclaration.Templates != null && operatorDeclaration.Templates.Count > 0) {
655
 
                                        foreach (ICSharpCode.NRefactory.Ast.TemplateDefinition td in operatorDeclaration.Templates) {
656
 
                                                method.AddTypeParameter (ConvertTemplateDefinition (td));
657
 
                                        }
658
 
                                }
659
 
                                method.DeclaringType = typeStack.Peek ();
660
 
                                typeStack.Peek ().Add (method);
661
 
 
662
 
                                return null;
663
 
                        }
664
 
 
665
 
                        public override object VisitFieldDeclaration (ICSharpCode.NRefactory.Ast.FieldDeclaration fieldDeclaration, object data)
666
 
                        {
667
 
                                foreach (ICSharpCode.NRefactory.Ast.VariableDeclaration varDecl in fieldDeclaration.Fields) {
668
 
                                        DomField field = new DomField ();
669
 
                                        field.Name = varDecl.Name;
670
 
                                        field.Documentation = RetrieveDocumentation (fieldDeclaration.StartLocation.Line);
671
 
                                        field.Location = ConvertLocation (fieldDeclaration.StartLocation);
672
 
                                        field.BodyRegion = ConvertRegion (varDecl.StartLocation, varDecl.EndLocation);
673
 
                                        field.Modifiers = ConvertModifiers (fieldDeclaration.Modifier);
674
 
                                        if (typeStack.Peek ().ClassType == ClassType.Enum) {
675
 
                                                field.ReturnType = new DomReturnType (typeStack.Peek ());
676
 
                                        } else {
677
 
                                                field.ReturnType = ConvertReturnType (fieldDeclaration.TypeReference);
678
 
                                        }
679
 
                                        // Enum fields have an empty type.
680
 
                                        if (field.ReturnType != null && string.IsNullOrEmpty (field.ReturnType.FullName))
681
 
                                                field.ReturnType = null;
682
 
                                        AddAttributes (field, fieldDeclaration.Attributes);
683
 
                                        field.DeclaringType = typeStack.Peek ();
684
 
                                        if (field.DeclaringType.ClassType == ClassType.Enum) {
685
 
                                                field.Modifiers |= Modifiers.Const;
686
 
                                                field.Modifiers |= Modifiers.SpecialName;
687
 
                                                field.Modifiers |= Modifiers.Public;
688
 
                                        }
689
 
                                        typeStack.Peek ().Add (field);
690
 
                                }
691
 
                                return null;
692
 
                        }
693
 
 
694
 
                        public override object VisitPropertyDeclaration (ICSharpCode.NRefactory.Ast.PropertyDeclaration propertyDeclaration, object data)
695
 
                        {
696
 
                                DomProperty property = new DomProperty ();
697
 
                                property.Name = propertyDeclaration.Name;
698
 
                                property.Documentation = RetrieveDocumentation (propertyDeclaration.StartLocation.Line);
699
 
                                property.Location = ConvertLocation (propertyDeclaration.StartLocation);
700
 
                                property.BodyRegion = ConvertRegion (propertyDeclaration.EndLocation, propertyDeclaration.BodyEnd);
701
 
                                property.GetterModifier = property.SetterModifier = ConvertModifiers (propertyDeclaration.Modifier);
702
 
                                property.ReturnType = ConvertReturnType (propertyDeclaration.TypeReference);
703
 
                                AddAttributes (property, propertyDeclaration.Attributes);
704
 
                                AddExplicitInterfaces (property, propertyDeclaration.InterfaceImplementations);
705
 
                                if (propertyDeclaration.HasGetRegion) {
706
 
                                        property.PropertyModifier |= PropertyModifier.HasGet;
707
 
                                        if (propertyDeclaration.GetRegion.Modifier != ICSharpCode.NRefactory.Ast.Modifiers.None)
708
 
                                                property.GetterModifier = ConvertModifiers (propertyDeclaration.GetRegion.Modifier);
709
 
                                        property.GetRegion = ConvertRegion (propertyDeclaration.GetRegion.StartLocation, propertyDeclaration.GetRegion.EndLocation);
710
 
                                }
711
 
                                if (propertyDeclaration.HasSetRegion) {
712
 
                                        property.PropertyModifier |= PropertyModifier.HasSet;
713
 
                                        if (propertyDeclaration.SetRegion.Modifier != ICSharpCode.NRefactory.Ast.Modifiers.None)
714
 
                                                property.SetterModifier = ConvertModifiers (propertyDeclaration.SetRegion.Modifier);
715
 
                                        property.SetRegion = ConvertRegion (propertyDeclaration.SetRegion.StartLocation, propertyDeclaration.SetRegion.EndLocation);
716
 
                                }
717
 
                                property.DeclaringType = typeStack.Peek ();
718
 
                                typeStack.Peek ().Add (property);
719
 
                                return null;
720
 
                        }
721
 
 
722
 
                        public override object VisitIndexerDeclaration (ICSharpCode.NRefactory.Ast.IndexerDeclaration indexerDeclaration, object data)
723
 
                        {
724
 
                                DomProperty indexer = new DomProperty ();
725
 
                                indexer.Name = "this";
726
 
                                indexer.Documentation = RetrieveDocumentation (indexerDeclaration.StartLocation.Line);
727
 
                                indexer.PropertyModifier |= PropertyModifier.IsIndexer;
728
 
                                indexer.Location = ConvertLocation (indexerDeclaration.StartLocation);
729
 
                                indexer.BodyRegion = ConvertRegion (indexerDeclaration.EndLocation, indexerDeclaration.BodyEnd);
730
 
                                indexer.GetterModifier = indexer.SetterModifier = ConvertModifiers (indexerDeclaration.Modifier);
731
 
                                indexer.ReturnType = ConvertReturnType (indexerDeclaration.TypeReference);
732
 
                                indexer.Add (ConvertParameterList (indexer, indexerDeclaration.Parameters));
733
 
 
734
 
                                AddAttributes (indexer, indexerDeclaration.Attributes);
735
 
                                AddExplicitInterfaces (indexer, indexerDeclaration.InterfaceImplementations);
736
 
 
737
 
                                if (indexerDeclaration.HasGetRegion) {
738
 
                                        indexer.PropertyModifier |= PropertyModifier.HasGet;
739
 
                                        if (indexerDeclaration.GetRegion.Modifier != ICSharpCode.NRefactory.Ast.Modifiers.None)
740
 
                                                indexer.GetterModifier = ConvertModifiers (indexerDeclaration.GetRegion.Modifier);
741
 
                                        indexer.GetRegion = ConvertRegion (indexerDeclaration.GetRegion.StartLocation, indexerDeclaration.GetRegion.EndLocation);
742
 
                                }
743
 
                                if (indexerDeclaration.HasSetRegion) {
744
 
                                        indexer.PropertyModifier |= PropertyModifier.HasSet;
745
 
                                        if (indexerDeclaration.SetRegion.Modifier != ICSharpCode.NRefactory.Ast.Modifiers.None)
746
 
                                                indexer.SetterModifier = ConvertModifiers (indexerDeclaration.SetRegion.Modifier);
747
 
                                        indexer.SetRegion = ConvertRegion (indexerDeclaration.SetRegion.StartLocation, indexerDeclaration.SetRegion.EndLocation);
748
 
                                }
749
 
                                indexer.DeclaringType = typeStack.Peek ();
750
 
                                typeStack.Peek ().Add (indexer);
751
 
                                return null;
752
 
                        }
753
 
 
754
 
                        public override object VisitEventDeclaration (ICSharpCode.NRefactory.Ast.EventDeclaration eventDeclaration, object data)
755
 
                        {
756
 
                                DomEvent evt = new DomEvent ();
757
 
                                evt.Name = eventDeclaration.Name;
758
 
                                evt.Documentation = RetrieveDocumentation (eventDeclaration.StartLocation.Line);
759
 
                                evt.Location = ConvertLocation (eventDeclaration.StartLocation);
760
 
                                evt.Modifiers = ConvertModifiers (eventDeclaration.Modifier);
761
 
                                evt.ReturnType = ConvertReturnType (eventDeclaration.TypeReference);
762
 
                                evt.BodyRegion = ConvertRegion (eventDeclaration.BodyStart, eventDeclaration.BodyEnd);
763
 
                                if (eventDeclaration.AddRegion != null && !eventDeclaration.AddRegion.IsNull) {
764
 
                                        DomMethod addMethod = new DomMethod ();
765
 
                                        addMethod.Name = "add";
766
 
                                        addMethod.BodyRegion = ConvertRegion (eventDeclaration.AddRegion.StartLocation, eventDeclaration.AddRegion.EndLocation);
767
 
                                        evt.AddMethod = addMethod;
768
 
                                }
769
 
                                if (eventDeclaration.RemoveRegion != null && !eventDeclaration.RemoveRegion.IsNull) {
770
 
                                        DomMethod removeMethod = new DomMethod ();
771
 
                                        removeMethod.Name = "remove";
772
 
                                        removeMethod.BodyRegion = ConvertRegion (eventDeclaration.RemoveRegion.StartLocation, eventDeclaration.RemoveRegion.EndLocation);
773
 
                                        evt.RemoveMethod = removeMethod;
774
 
                                }
775
 
                                AddAttributes (evt, eventDeclaration.Attributes);
776
 
                                AddExplicitInterfaces (evt, eventDeclaration.InterfaceImplementations);
777
 
                                evt.DeclaringType = typeStack.Peek ();
778
 
                                typeStack.Peek ().Add (evt);
779
 
                                return null;
780
 
                        }
781
 
                }
782
 
        }
783
 
}