5
// Mike KrĆ¼ger <mkrueger@novell.com>
7
// Copyright (C) 2008 Novell, Inc (http://www.novell.com)
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:
17
// The above copyright notice and this permission notice shall be
18
// included in all copies or substantial portions of the Software.
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.
30
using System.Collections;
31
using System.Collections.Generic;
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;
44
namespace MonoDevelop.CSharp.Parser
46
public class NRefactoryParser : AbstractParser
48
public override bool CanParse (string fileName)
50
return Path.GetExtension (fileName) == ".cs";
53
public NRefactoryParser () : base("C#", "text/x-csharp")
57
public override IExpressionFinder CreateExpressionFinder (ProjectDom dom)
59
return new NewCSharpExpressionFinder (dom);
62
public override IResolver CreateResolver (ProjectDom dom, object editor, string fileName)
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);
68
class SpecialTracker : ICSharpCode.NRefactory.ISpecialVisitor
70
ParsedDocument result;
72
public SpecialTracker (ParsedDocument result)
77
public object Visit (ICSharpCode.NRefactory.ISpecial special, object data)
82
public object Visit (ICSharpCode.NRefactory.BlankLine special, object data)
87
public object Visit (ICSharpCode.NRefactory.Comment comment, object data)
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;
99
case ICSharpCode.NRefactory.CommentType.Documentation:
100
newComment.CommentType = MonoDevelop.Projects.Dom.CommentType.SingleLine;
101
newComment.IsDocumentation = true;
104
newComment.CommentType = MonoDevelop.Projects.Dom.CommentType.SingleLine;
108
result.Add (newComment);
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;
117
Stack<ConditionalRegion> conditionalRegions = new Stack<ConditionalRegion> ();
118
ConditionalRegion ConditionalRegion {
120
return conditionalRegions.Count > 0 ? conditionalRegions.Peek () : null;
124
void CloseConditionBlock (DomLocation loc)
126
if (ConditionalRegion == null || ConditionalRegion.ConditionBlocks.Count == 0 || !ConditionalRegion.ConditionBlocks[ConditionalRegion.ConditionBlocks.Count - 1].End.IsEmpty)
128
ConditionalRegion.ConditionBlocks[ConditionalRegion.ConditionBlocks.Count - 1].End = loc;
131
void AddCurRegion (ICSharpCode.NRefactory.Location loc)
133
if (ConditionalRegion == null)
135
ConditionalRegion.End = new DomLocation (loc.Line, loc.Column);
136
result.Add (ConditionalRegion);
137
conditionalRegions.Pop ();
140
static ICSharpCode.NRefactory.PrettyPrinter.CSharpOutputVisitor visitor = new ICSharpCode.NRefactory.PrettyPrinter.CSharpOutputVisitor ();
142
public object Visit (ICSharpCode.NRefactory.PreprocessingDirective directive, object data)
144
DomLocation loc = new DomLocation (directive.StartPosition.Line, directive.StartPosition.Column);
145
switch (directive.Cmd) {
147
directive.Expression.AcceptVisitor (visitor, null);
148
conditionalRegions.Push (new ConditionalRegion (visitor.Text));
150
ifBlocks.Push (directive);
151
ConditionalRegion.Start = loc;
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));
159
// elifBlocks.Add (directive);
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;
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));
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));
189
result.Add (new PreProcessorDefine (directive.Arg, loc));
192
regions.Push (directive);
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));
206
public ICSharpCode.NRefactory.Ast.CompilationUnit LastUnit {
211
public override ParsedDocument Parse (ProjectDom dom, string fileName, string content)
213
using (ICSharpCode.NRefactory.IParser parser = ICSharpCode.NRefactory.ParserFactory.CreateParser (ICSharpCode.NRefactory.SupportedLanguage.CSharp, new StringReader (content))) {
215
ParsedDocument result = new ParsedDocument (fileName);
216
result.CompilationUnit = new MonoDevelop.Projects.Dom.CompilationUnit (fileName);
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;
225
parser.Lexer.SetConditionalCompilationSymbols (par.DefineSymbols);
229
SpecialTracker tracker = new SpecialTracker (result);
230
foreach (ICSharpCode.NRefactory.ISpecial special in parser.Lexer.SpecialTracker.CurrentSpecials) {
231
special.AcceptVisitor (tracker, null);
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)));
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;
245
class ConversionVisitior : ICSharpCode.NRefactory.Visitors.AbstractAstVisitor
247
MonoDevelop.Projects.Dom.ParsedDocument result;
249
List<ISpecial> specials;
251
public ConversionVisitior (MonoDevelop.Projects.Dom.ParsedDocument result, List<ISpecial> specials)
253
this.specials = specials;
254
this.result = result;
255
namespaceEndLocationStack.Push (new Location (Int32.MaxValue, Int32.MaxValue));
258
string RetrieveDocumentation (int upToLine)
260
StringBuilder result = null;
261
while (lastSpecial < specials.Count) {
262
ISpecial cur = specials[lastSpecial];
263
if (cur.StartPosition.Line >= upToLine)
265
ICSharpCode.NRefactory.Comment comment = cur as ICSharpCode.NRefactory.Comment;
266
if (comment != null && comment.CommentType == ICSharpCode.NRefactory.CommentType.Documentation) {
268
result = new StringBuilder ();
269
result.Append (comment.CommentText);
273
return result == null ? null : result.ToString ();
276
static DomRegion ConvertRegion (ICSharpCode.NRefactory.Location start, ICSharpCode.NRefactory.Location end)
278
return new DomRegion (start.Line, start.Column, end.Line, end.Column);
281
static DomLocation ConvertLocation (ICSharpCode.NRefactory.Location location)
283
return new DomLocation (location.Line, location.Column);
286
static Modifiers ConvertModifiers (ICSharpCode.NRefactory.Ast.Modifiers modifiers)
288
return (Modifiers)modifiers;
291
static ClassType ConvertClassType (ICSharpCode.NRefactory.Ast.ClassType nrClassType)
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;
303
return ClassType.Class;
306
static DomReturnType ConvertReturnType (ICSharpCode.NRefactory.Ast.TypeReference typeReference)
308
return typeReference.ConvertToReturnType ();
311
static void AddAttributes (AbstractMember member, IEnumerable<ICSharpCode.NRefactory.Ast.AttributeSection> attributes)
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));
329
static void AddExplicitInterfaces (AbstractMember member, IEnumerable<ICSharpCode.NRefactory.Ast.InterfaceImplementation> interfaceImplementations)
331
if (interfaceImplementations == null)
334
foreach (ICSharpCode.NRefactory.Ast.InterfaceImplementation impl in interfaceImplementations) {
335
member.AddExplicitInterface (ConvertReturnType (impl.InterfaceType));
339
public override object VisitUsingDeclaration (ICSharpCode.NRefactory.Ast.UsingDeclaration usingDeclaration, object data)
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) {
346
domUsing.Add (u.Name, ConvertReturnType (u.Alias));
348
domUsing.Add (u.Name);
351
((CompilationUnit)result.CompilationUnit).Add (domUsing);
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)
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);
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 ();
376
Stack<DomType> typeStack = new Stack<DomType> ();
377
public override object VisitTypeDeclaration (ICSharpCode.NRefactory.Ast.TypeDeclaration typeDeclaration, object data)
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);
389
AddAttributes (newType, typeDeclaration.Attributes);
391
foreach (ICSharpCode.NRefactory.Ast.TemplateDefinition template in typeDeclaration.Templates) {
392
TypeParameter parameter = ConvertTemplateDefinition (template);
393
newType.AddTypeParameter (parameter);
396
if (typeDeclaration.BaseTypes != null) {
398
foreach (ICSharpCode.NRefactory.Ast.TypeReference type in typeDeclaration.BaseTypes) {
399
if (type == typeDeclaration.BaseTypes[0]) {
400
newType.BaseType = ConvertReturnType (type);
402
newType.AddInterfaceImplementation (ConvertReturnType (type));
409
typeStack.Push (newType);
410
typeDeclaration.AcceptChildren (this, data);
416
TypeParameter ConvertTemplateDefinition (ICSharpCode.NRefactory.Ast.TemplateDefinition template)
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);
431
void AddType (DomType type)
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);
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);
451
static ParameterModifiers ConvertParameterModifiers (ICSharpCode.NRefactory.Ast.ParameterModifiers modifier)
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;
462
static DomParameter ConvertParameter (IMember declaringMember, ICSharpCode.NRefactory.Ast.ParameterDeclarationExpression pde)
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);
473
static List<IParameter> ConvertParameterList (IMember declaringMember, IEnumerable<ICSharpCode.NRefactory.Ast.ParameterDeclarationExpression> parameters)
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));
484
public override object VisitDelegateDeclaration (ICSharpCode.NRefactory.Ast.DelegateDeclaration delegateDeclaration, object data)
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);
493
foreach (DomParameter p in parameter) {
494
p.DeclaringMember = delegateType;
497
if (delegateDeclaration.Templates != null && delegateDeclaration.Templates.Count > 0) {
498
foreach (ICSharpCode.NRefactory.Ast.TemplateDefinition template in delegateDeclaration.Templates) {
499
delegateType.AddTypeParameter (ConvertTemplateDefinition (template));
502
AddType (delegateType);
507
public override object VisitConstructorDeclaration (ICSharpCode.NRefactory.Ast.ConstructorDeclaration constructorDeclaration, object data)
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));
519
constructor.DeclaringType = typeStack.Peek ();
520
typeStack.Peek ().Add (constructor);
524
public override object VisitMethodDeclaration (ICSharpCode.NRefactory.Ast.MethodDeclaration methodDeclaration, object data)
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);
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);
545
method.DeclaringType = typeStack.Peek ();
546
typeStack.Peek ().Add (method);
550
public override object VisitDestructorDeclaration (ICSharpCode.NRefactory.Ast.DestructorDeclaration destructorDeclaration, object data)
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;
561
destructor.DeclaringType = typeStack.Peek ();
562
typeStack.Peek ().Add (destructor);
567
static string GetOperatorName (ICSharpCode.NRefactory.Ast.OperatorDeclaration operatorDeclaration)
569
if (operatorDeclaration == 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:
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";
599
case ICSharpCode.NRefactory.Ast.OverloadableOperatorType.ShiftLeft:
600
return "op_LeftShift";
601
case ICSharpCode.NRefactory.Ast.OverloadableOperatorType.ShiftRight:
602
return "op_RightShift";
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";
617
case ICSharpCode.NRefactory.Ast.OverloadableOperatorType.Increment:
618
return "op_Increment";
619
case ICSharpCode.NRefactory.Ast.OverloadableOperatorType.Decrement:
620
return "op_Decrement";
622
case ICSharpCode.NRefactory.Ast.OverloadableOperatorType.IsTrue:
624
case ICSharpCode.NRefactory.Ast.OverloadableOperatorType.IsFalse:
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";
639
public override object VisitOperatorDeclaration (ICSharpCode.NRefactory.Ast.OperatorDeclaration operatorDeclaration, object data)
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);
654
if (operatorDeclaration.Templates != null && operatorDeclaration.Templates.Count > 0) {
655
foreach (ICSharpCode.NRefactory.Ast.TemplateDefinition td in operatorDeclaration.Templates) {
656
method.AddTypeParameter (ConvertTemplateDefinition (td));
659
method.DeclaringType = typeStack.Peek ();
660
typeStack.Peek ().Add (method);
665
public override object VisitFieldDeclaration (ICSharpCode.NRefactory.Ast.FieldDeclaration fieldDeclaration, object data)
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 ());
677
field.ReturnType = ConvertReturnType (fieldDeclaration.TypeReference);
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;
689
typeStack.Peek ().Add (field);
694
public override object VisitPropertyDeclaration (ICSharpCode.NRefactory.Ast.PropertyDeclaration propertyDeclaration, object data)
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);
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);
717
property.DeclaringType = typeStack.Peek ();
718
typeStack.Peek ().Add (property);
722
public override object VisitIndexerDeclaration (ICSharpCode.NRefactory.Ast.IndexerDeclaration indexerDeclaration, object data)
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));
734
AddAttributes (indexer, indexerDeclaration.Attributes);
735
AddExplicitInterfaces (indexer, indexerDeclaration.InterfaceImplementations);
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);
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);
749
indexer.DeclaringType = typeStack.Peek ();
750
typeStack.Peek ().Add (indexer);
754
public override object VisitEventDeclaration (ICSharpCode.NRefactory.Ast.EventDeclaration eventDeclaration, object data)
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;
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;
775
AddAttributes (evt, eventDeclaration.Attributes);
776
AddExplicitInterfaces (evt, eventDeclaration.InterfaceImplementations);
777
evt.DeclaringType = typeStack.Peek ();
778
typeStack.Peek ().Add (evt);