diff --git a/src/Libraries/NRefactory/NRefactoryASTGenerator/Main.cs b/src/Libraries/NRefactory/NRefactoryASTGenerator/Main.cs index 3e06996d84..60d595ebc3 100644 --- a/src/Libraries/NRefactory/NRefactoryASTGenerator/Main.cs +++ b/src/Libraries/NRefactory/NRefactoryASTGenerator/Main.cs @@ -223,13 +223,7 @@ namespace NRefactoryASTGenerator CodeVariableReferenceExpression var = new CodeVariableReferenceExpression(GetFieldName(type.Name)); assertions.Add(AssertIsNotNull(var)); - Type t = type; - do { - foreach (FieldInfo field in t.GetFields(BindingFlags.Instance | BindingFlags.NonPublic)) { - AddVisitCode(m, field, var, assertions, transformer); - } - t = t.BaseType; - } while (t != null); + AddFieldVisitCode(m, type, var, assertions, transformer); if (type.GetCustomAttributes(typeof(HasChildrenAttribute), true).Length > 0) { if (transformer) { @@ -262,6 +256,21 @@ namespace NRefactoryASTGenerator return td; } + static void AddFieldVisitCode(CodeMemberMethod m, Type type, CodeVariableReferenceExpression var, List assertions, bool transformer) + { + if (type != null) { + if (type.BaseType != typeof(StatementWithEmbeddedStatement)) { + AddFieldVisitCode(m, type.BaseType, var, assertions, transformer); + } + foreach (FieldInfo field in type.GetFields(BindingFlags.Instance | BindingFlags.NonPublic)) { + AddVisitCode(m, field, var, assertions, transformer); + } + if (type.BaseType == typeof(StatementWithEmbeddedStatement)) { + AddFieldVisitCode(m, type.BaseType, var, assertions, transformer); + } + } + } + static CodeStatement AssertIsNotNull(CodeExpression expr) { CodeExpression bop = new CodeBinaryOperatorExpression(expr, diff --git a/src/Libraries/NRefactory/Project/Src/Output/AbstractOutputFormatter.cs b/src/Libraries/NRefactory/Project/Src/Output/AbstractOutputFormatter.cs index b3a69c2bb2..c03a64f6c6 100644 --- a/src/Libraries/NRefactory/Project/Src/Output/AbstractOutputFormatter.cs +++ b/src/Libraries/NRefactory/Project/Src/Output/AbstractOutputFormatter.cs @@ -92,6 +92,7 @@ namespace ICSharpCode.NRefactory.PrettyPrinter } int lastLineStart = 0; + int lineBeforeLastStart = 0; public bool LastCharacterIsNewLine { get { @@ -102,6 +103,9 @@ namespace ICSharpCode.NRefactory.PrettyPrinter public virtual void NewLine() { if (DoNewLine) { + if (!LastCharacterIsNewLine) { + lineBeforeLastStart = lastLineStart; + } text.AppendLine(); lastLineStart = text.Length; } @@ -111,19 +115,31 @@ namespace ICSharpCode.NRefactory.PrettyPrinter { } - protected void WriteInPreviousLine(string txt) + protected void WriteInPreviousLine(string txt, bool forceWriteInPreviousBlock) { - if (LastCharacterIsNewLine) { - Indent(); - text.AppendLine(txt); - lastLineStart = text.Length; - } else { - string lastLine = text.ToString(lastLineStart, text.Length - lastLineStart); - text.Remove(lastLineStart, text.Length - lastLineStart); - Indent(); - text.AppendLine(txt); + bool lastCharacterWasNewLine = LastCharacterIsNewLine; + if (lastCharacterWasNewLine) { + if (forceWriteInPreviousBlock == false) { + Indent(); + text.AppendLine(txt); + lineBeforeLastStart = lastLineStart; + lastLineStart = text.Length; + return; + } + lastLineStart = lineBeforeLastStart; + } + string lastLine = text.ToString(lastLineStart, text.Length - lastLineStart); + text.Remove(lastLineStart, text.Length - lastLineStart); + if (forceWriteInPreviousBlock) ++indentationLevel; + Indent(); + if (forceWriteInPreviousBlock) --indentationLevel; + text.AppendLine(txt); + lineBeforeLastStart = lastLineStart; + lastLineStart = text.Length; + text.Append(lastLine); + if (lastCharacterWasNewLine) { + lineBeforeLastStart = lastLineStart; lastLineStart = text.Length; - text.Append(lastLine); } } @@ -135,14 +151,14 @@ namespace ICSharpCode.NRefactory.PrettyPrinter } } - public abstract void PrintComment(Comment comment); + public abstract void PrintComment(Comment comment, bool forceWriteInPreviousBlock); - public virtual void PrintPreProcessingDirective(PreProcessingDirective directive) + public virtual void PrintPreProcessingDirective(PreProcessingDirective directive, bool forceWriteInPreviousBlock) { if (string.IsNullOrEmpty(directive.Arg)) - WriteInPreviousLine(directive.Cmd); + WriteInPreviousLine(directive.Cmd, forceWriteInPreviousBlock); else - WriteInPreviousLine(directive.Cmd + " " + directive.Arg); + WriteInPreviousLine(directive.Cmd + " " + directive.Arg, forceWriteInPreviousBlock); } public abstract void PrintToken(int token); diff --git a/src/Libraries/NRefactory/Project/Src/Output/CSharp/CSharpOutputVisitor.cs b/src/Libraries/NRefactory/Project/Src/Output/CSharp/CSharpOutputVisitor.cs index fb1b860413..1a394ff7e0 100644 --- a/src/Libraries/NRefactory/Project/Src/Output/CSharp/CSharpOutputVisitor.cs +++ b/src/Libraries/NRefactory/Project/Src/Output/CSharp/CSharpOutputVisitor.cs @@ -95,8 +95,6 @@ namespace ICSharpCode.NRefactory.PrettyPrinter return "float"; case "System.Decimal": return "decimal"; - case "System.DateTime": - return "System.DateTime"; case "System.Int64": return "long"; case "System.Int32": @@ -725,7 +723,10 @@ namespace ICSharpCode.NRefactory.PrettyPrinter outputFormatter.Indent(); OutputModifier(destructorDeclaration.Modifier); outputFormatter.PrintToken(Tokens.BitwiseComplement); - outputFormatter.PrintIdentifier(destructorDeclaration.Name); + if (currentType != null) + outputFormatter.PrintIdentifier(currentType.Name); + else + outputFormatter.PrintIdentifier(destructorDeclaration.Name); if (prettyPrintOptions.BeforeConstructorDeclarationParentheses) { outputFormatter.Space(); } @@ -881,15 +882,17 @@ namespace ICSharpCode.NRefactory.PrettyPrinter public object Visit(EraseStatement eraseStatement, object data) { - foreach (Expression expr in eraseStatement.Expressions) { - outputFormatter.Indent(); - expr.AcceptVisitor(this, data); + for (int i = 0; i < eraseStatement.Expressions.Count; i++) { + if (i > 0) { + outputFormatter.NewLine(); + outputFormatter.Indent(); + } + nodeTracker.TrackedVisit(eraseStatement.Expressions[i], data); outputFormatter.Space(); outputFormatter.PrintToken(Tokens.Assign); outputFormatter.Space(); outputFormatter.PrintToken(Tokens.Null); outputFormatter.PrintToken(Tokens.Semicolon); - outputFormatter.NewLine(); } return null; } diff --git a/src/Libraries/NRefactory/Project/Src/Output/CSharp/OutputFormatter.cs b/src/Libraries/NRefactory/Project/Src/Output/CSharp/OutputFormatter.cs index d9d55ddf60..1837cc9c51 100644 --- a/src/Libraries/NRefactory/Project/Src/Output/CSharp/OutputFormatter.cs +++ b/src/Libraries/NRefactory/Project/Src/Output/CSharp/OutputFormatter.cs @@ -114,19 +114,23 @@ namespace ICSharpCode.NRefactory.PrettyPrinter PrintText(identifier); } - public override void PrintComment(Comment comment) + public override void PrintComment(Comment comment, bool forceWriteInPreviousBlock) { switch (comment.CommentType) { - case CommentType.Block: - PrintText("/*"); - PrintText(comment.CommentText); - PrintText("*/"); + case CommentType.Block: + if (forceWriteInPreviousBlock) { + WriteInPreviousLine("/*" + comment.CommentText + "*/", forceWriteInPreviousBlock); + } else { + PrintText("/*"); + PrintText(comment.CommentText); + PrintText("*/"); + } break; case CommentType.Documentation: - WriteInPreviousLine("///" + comment.CommentText); + WriteInPreviousLine("///" + comment.CommentText, forceWriteInPreviousBlock); break; default: - WriteInPreviousLine("//" + comment.CommentText); + WriteInPreviousLine("//" + comment.CommentText, forceWriteInPreviousBlock); break; } } diff --git a/src/Libraries/NRefactory/Project/Src/Output/IOutputASTVisitor.cs b/src/Libraries/NRefactory/Project/Src/Output/IOutputASTVisitor.cs index 9c8bed3369..7bf454969e 100644 --- a/src/Libraries/NRefactory/Project/Src/Output/IOutputASTVisitor.cs +++ b/src/Libraries/NRefactory/Project/Src/Output/IOutputASTVisitor.cs @@ -52,7 +52,7 @@ namespace ICSharpCode.NRefactory.PrettyPrinter } void NewLine(); void Indent(); - void PrintComment(Comment comment); - void PrintPreProcessingDirective(PreProcessingDirective directive); + void PrintComment(Comment comment, bool forceWriteInPreviousBlock); + void PrintPreProcessingDirective(PreProcessingDirective directive, bool forceWriteInPreviousBlock); } } diff --git a/src/Libraries/NRefactory/Project/Src/Output/SpecialNodesInserter.cs b/src/Libraries/NRefactory/Project/Src/Output/SpecialNodesInserter.cs index 20fe2949a8..52e8fb5127 100644 --- a/src/Libraries/NRefactory/Project/Src/Output/SpecialNodesInserter.cs +++ b/src/Libraries/NRefactory/Project/Src/Output/SpecialNodesInserter.cs @@ -22,6 +22,8 @@ namespace ICSharpCode.NRefactory.PrettyPrinter this.formatter = formatter; } + public bool ForceWriteInPreviousLine; + public object Visit(ISpecial special, object data) { Console.WriteLine("Warning: SpecialOutputVisitor.Visit(ISpecial) called with " + special); @@ -36,13 +38,13 @@ namespace ICSharpCode.NRefactory.PrettyPrinter public object Visit(Comment special, object data) { - formatter.PrintComment(special); + formatter.PrintComment(special, ForceWriteInPreviousLine); return data; } public object Visit(PreProcessingDirective special, object data) { - formatter.PrintPreProcessingDirective(special); + formatter.PrintPreProcessingDirective(special, ForceWriteInPreviousLine); return data; } } @@ -50,7 +52,7 @@ namespace ICSharpCode.NRefactory.PrettyPrinter /// /// This class inserts specials between INodes. /// - public class SpecialNodesInserter + public class SpecialNodesInserter : IDisposable { IEnumerator enumerator; SpecialOutputVisitor visitor; @@ -84,7 +86,9 @@ namespace ICSharpCode.NRefactory.PrettyPrinter /// public void AcceptNodeEnd(INode node) { + visitor.ForceWriteInPreviousLine = true; AcceptPoint(node.EndLocation); + visitor.ForceWriteInPreviousLine = false; } /// @@ -111,5 +115,23 @@ namespace ICSharpCode.NRefactory.PrettyPrinter WriteCurrent(); } } + + void IDisposable.Dispose() + { + Finish(); + } + + /// + /// Registers a new SpecialNodesInserter with the output visitor. + /// Make sure to call Finish() on the returned SpecialNodesInserter when the output + /// is finished. + /// + public static SpecialNodesInserter Install(IEnumerable specials, IOutputASTVisitor outputVisitor) + { + SpecialNodesInserter sni = new SpecialNodesInserter(specials, new SpecialOutputVisitor(outputVisitor.OutputFormatter)); + outputVisitor.NodeTracker.NodeVisiting += sni.AcceptNodeStart; + outputVisitor.NodeTracker.NodeVisited += sni.AcceptNodeEnd; + return sni; + } } } diff --git a/src/Libraries/NRefactory/Project/Src/Output/VBNet/VBNetOutputFormatter.cs b/src/Libraries/NRefactory/Project/Src/Output/VBNet/VBNetOutputFormatter.cs index 839ab32be2..3a5087cbe2 100644 --- a/src/Libraries/NRefactory/Project/Src/Output/VBNet/VBNetOutputFormatter.cs +++ b/src/Libraries/NRefactory/Project/Src/Output/VBNet/VBNetOutputFormatter.cs @@ -42,17 +42,17 @@ namespace ICSharpCode.NRefactory.PrettyPrinter } } - public override void PrintComment(Comment comment) + public override void PrintComment(Comment comment, bool forceWriteInPreviousLine) { switch (comment.CommentType) { case CommentType.Block: - WriteInPreviousLine("'" + comment.CommentText.Replace("\n", "\n'")); + WriteInPreviousLine("'" + comment.CommentText.Replace("\n", "\n'"), forceWriteInPreviousLine); break; case CommentType.Documentation: - WriteInPreviousLine("'''" + comment.CommentText); + WriteInPreviousLine("'''" + comment.CommentText, forceWriteInPreviousLine); break; default: - WriteInPreviousLine("'" + comment.CommentText); + WriteInPreviousLine("'" + comment.CommentText, forceWriteInPreviousLine); break; } } diff --git a/src/Libraries/NRefactory/Project/Src/Output/VBNet/VBNetOutputVisitor.cs b/src/Libraries/NRefactory/Project/Src/Output/VBNet/VBNetOutputVisitor.cs index 9ef70745c0..52c8a2313d 100644 --- a/src/Libraries/NRefactory/Project/Src/Output/VBNet/VBNetOutputVisitor.cs +++ b/src/Libraries/NRefactory/Project/Src/Output/VBNet/VBNetOutputVisitor.cs @@ -561,7 +561,6 @@ namespace ICSharpCode.NRefactory.PrettyPrinter outputFormatter.PrintToken(Tokens.End); outputFormatter.Space(); outputFormatter.PrintToken(Tokens.Property); - outputFormatter.Space(); outputFormatter.NewLine(); } @@ -867,7 +866,6 @@ namespace ICSharpCode.NRefactory.PrettyPrinter outputFormatter.PrintToken(Tokens.End); outputFormatter.Space(); outputFormatter.PrintToken(Tokens.Sub); - outputFormatter.Space(); outputFormatter.NewLine(); return null; @@ -939,19 +937,36 @@ namespace ICSharpCode.NRefactory.PrettyPrinter public object Visit(DestructorDeclaration destructorDeclaration, object data) { outputFormatter.Indent(); - - outputFormatter.PrintToken(Tokens.Overrides); - outputFormatter.Space(); - outputFormatter.PrintToken(Tokens.Protected); - outputFormatter.Space(); - outputFormatter.PrintIdentifier("Finalize"); - outputFormatter.PrintToken(Tokens.OpenParenthesis); - outputFormatter.PrintToken(Tokens.CloseParenthesis); + outputFormatter.PrintText("Protected Overrides Sub Finalize()"); outputFormatter.NewLine(); ++outputFormatter.IndentationLevel; exitTokenStack.Push(Tokens.Sub); + + outputFormatter.Indent(); + outputFormatter.PrintToken(Tokens.Try); + outputFormatter.NewLine(); + + ++outputFormatter.IndentationLevel; nodeTracker.TrackedVisit(destructorDeclaration.Body, data); + --outputFormatter.IndentationLevel; + + outputFormatter.Indent(); + outputFormatter.PrintToken(Tokens.Finally); + outputFormatter.NewLine(); + + ++outputFormatter.IndentationLevel; + outputFormatter.Indent(); + outputFormatter.PrintText("MyBase.Finalize()"); + outputFormatter.NewLine(); + --outputFormatter.IndentationLevel; + + outputFormatter.Indent(); + outputFormatter.PrintToken(Tokens.End); + outputFormatter.Space(); + outputFormatter.PrintToken(Tokens.Try); + outputFormatter.NewLine(); + exitTokenStack.Pop(); --outputFormatter.IndentationLevel; @@ -959,7 +974,6 @@ namespace ICSharpCode.NRefactory.PrettyPrinter outputFormatter.PrintToken(Tokens.End); outputFormatter.Space(); outputFormatter.PrintToken(Tokens.Sub); - outputFormatter.Space(); outputFormatter.NewLine(); return null; diff --git a/src/Libraries/NRefactory/Project/Src/Parser/AST/General/BlockStatement.cs b/src/Libraries/NRefactory/Project/Src/Parser/AST/General/BlockStatement.cs index f5ecf2bb2e..1e2d4174c0 100644 --- a/src/Libraries/NRefactory/Project/Src/Parser/AST/General/BlockStatement.cs +++ b/src/Libraries/NRefactory/Project/Src/Parser/AST/General/BlockStatement.cs @@ -21,11 +21,6 @@ namespace ICSharpCode.NRefactory.Parser.AST } } - public static BlockStatement CheckNull(BlockStatement blockStatement) - { - return blockStatement == null ? NullBlockStatement.Instance : blockStatement; - } - public override object AcceptVisitor(IAstVisitor visitor, object data) { return visitor.Visit(this, data); diff --git a/src/Libraries/NRefactory/Project/Src/Parser/Visitors/AbstractASTVisitor.cs b/src/Libraries/NRefactory/Project/Src/Parser/Visitors/AbstractASTVisitor.cs index f558b4c826..e81fe2c363 100644 --- a/src/Libraries/NRefactory/Project/Src/Parser/Visitors/AbstractASTVisitor.cs +++ b/src/Libraries/NRefactory/Project/Src/Parser/Visitors/AbstractASTVisitor.cs @@ -181,21 +181,20 @@ namespace ICSharpCode.NRefactory.Parser { public virtual object Visit(ConstructorDeclaration constructorDeclaration, object data) { Debug.Assert((constructorDeclaration != null)); + Debug.Assert((constructorDeclaration.Attributes != null)); + Debug.Assert((constructorDeclaration.Parameters != null)); Debug.Assert((constructorDeclaration.ConstructorInitializer != null)); Debug.Assert((constructorDeclaration.Body != null)); - Debug.Assert((constructorDeclaration.Parameters != null)); - Debug.Assert((constructorDeclaration.Attributes != null)); - constructorDeclaration.ConstructorInitializer.AcceptVisitor(this, data); - constructorDeclaration.Body.AcceptVisitor(this, data); - foreach (ParameterDeclarationExpression o in constructorDeclaration.Parameters) { + foreach (AttributeSection o in constructorDeclaration.Attributes) { Debug.Assert(o != null); o.AcceptVisitor(this, data); } - foreach (AttributeSection o in constructorDeclaration.Attributes) { + foreach (ParameterDeclarationExpression o in constructorDeclaration.Parameters) { Debug.Assert(o != null); o.AcceptVisitor(this, data); } - return null; + constructorDeclaration.ConstructorInitializer.AcceptVisitor(this, data); + return constructorDeclaration.Body.AcceptVisitor(this, data); } public virtual object Visit(ConstructorInitializer constructorInitializer, object data) { @@ -215,19 +214,18 @@ namespace ICSharpCode.NRefactory.Parser { public virtual object Visit(DeclareDeclaration declareDeclaration, object data) { Debug.Assert((declareDeclaration != null)); - Debug.Assert((declareDeclaration.TypeReference != null)); - Debug.Assert((declareDeclaration.Parameters != null)); Debug.Assert((declareDeclaration.Attributes != null)); - declareDeclaration.TypeReference.AcceptVisitor(this, data); - foreach (ParameterDeclarationExpression o in declareDeclaration.Parameters) { + Debug.Assert((declareDeclaration.Parameters != null)); + Debug.Assert((declareDeclaration.TypeReference != null)); + foreach (AttributeSection o in declareDeclaration.Attributes) { Debug.Assert(o != null); o.AcceptVisitor(this, data); } - foreach (AttributeSection o in declareDeclaration.Attributes) { + foreach (ParameterDeclarationExpression o in declareDeclaration.Parameters) { Debug.Assert(o != null); o.AcceptVisitor(this, data); } - return null; + return declareDeclaration.TypeReference.AcceptVisitor(this, data); } public virtual object Visit(DefaultValueExpression defaultValueExpression, object data) { @@ -238,20 +236,20 @@ namespace ICSharpCode.NRefactory.Parser { public virtual object Visit(DelegateDeclaration delegateDeclaration, object data) { Debug.Assert((delegateDeclaration != null)); + Debug.Assert((delegateDeclaration.Attributes != null)); Debug.Assert((delegateDeclaration.ReturnType != null)); Debug.Assert((delegateDeclaration.Parameters != null)); Debug.Assert((delegateDeclaration.Templates != null)); - Debug.Assert((delegateDeclaration.Attributes != null)); - delegateDeclaration.ReturnType.AcceptVisitor(this, data); - foreach (ParameterDeclarationExpression o in delegateDeclaration.Parameters) { + foreach (AttributeSection o in delegateDeclaration.Attributes) { Debug.Assert(o != null); o.AcceptVisitor(this, data); } - foreach (TemplateDefinition o in delegateDeclaration.Templates) { + delegateDeclaration.ReturnType.AcceptVisitor(this, data); + foreach (ParameterDeclarationExpression o in delegateDeclaration.Parameters) { Debug.Assert(o != null); o.AcceptVisitor(this, data); } - foreach (AttributeSection o in delegateDeclaration.Attributes) { + foreach (TemplateDefinition o in delegateDeclaration.Templates) { Debug.Assert(o != null); o.AcceptVisitor(this, data); } @@ -260,14 +258,13 @@ namespace ICSharpCode.NRefactory.Parser { public virtual object Visit(DestructorDeclaration destructorDeclaration, object data) { Debug.Assert((destructorDeclaration != null)); - Debug.Assert((destructorDeclaration.Body != null)); Debug.Assert((destructorDeclaration.Attributes != null)); - destructorDeclaration.Body.AcceptVisitor(this, data); + Debug.Assert((destructorDeclaration.Body != null)); foreach (AttributeSection o in destructorDeclaration.Attributes) { Debug.Assert(o != null); o.AcceptVisitor(this, data); } - return null; + return destructorDeclaration.Body.AcceptVisitor(this, data); } public virtual object Visit(DirectionExpression directionExpression, object data) { @@ -320,15 +317,15 @@ namespace ICSharpCode.NRefactory.Parser { public virtual object Visit(EventAddRegion eventAddRegion, object data) { Debug.Assert((eventAddRegion != null)); + Debug.Assert((eventAddRegion.Attributes != null)); Debug.Assert((eventAddRegion.Block != null)); Debug.Assert((eventAddRegion.Parameters != null)); - Debug.Assert((eventAddRegion.Attributes != null)); - eventAddRegion.Block.AcceptVisitor(this, data); - foreach (ParameterDeclarationExpression o in eventAddRegion.Parameters) { + foreach (AttributeSection o in eventAddRegion.Attributes) { Debug.Assert(o != null); o.AcceptVisitor(this, data); } - foreach (AttributeSection o in eventAddRegion.Attributes) { + eventAddRegion.Block.AcceptVisitor(this, data); + foreach (ParameterDeclarationExpression o in eventAddRegion.Parameters) { Debug.Assert(o != null); o.AcceptVisitor(this, data); } @@ -337,43 +334,42 @@ namespace ICSharpCode.NRefactory.Parser { public virtual object Visit(EventDeclaration eventDeclaration, object data) { Debug.Assert((eventDeclaration != null)); + Debug.Assert((eventDeclaration.Attributes != null)); + Debug.Assert((eventDeclaration.Parameters != null)); Debug.Assert((eventDeclaration.TypeReference != null)); Debug.Assert((eventDeclaration.InterfaceImplementations != null)); Debug.Assert((eventDeclaration.AddRegion != null)); Debug.Assert((eventDeclaration.RemoveRegion != null)); Debug.Assert((eventDeclaration.RaiseRegion != null)); - Debug.Assert((eventDeclaration.Parameters != null)); - Debug.Assert((eventDeclaration.Attributes != null)); - eventDeclaration.TypeReference.AcceptVisitor(this, data); - foreach (InterfaceImplementation o in eventDeclaration.InterfaceImplementations) { + foreach (AttributeSection o in eventDeclaration.Attributes) { Debug.Assert(o != null); o.AcceptVisitor(this, data); } - eventDeclaration.AddRegion.AcceptVisitor(this, data); - eventDeclaration.RemoveRegion.AcceptVisitor(this, data); - eventDeclaration.RaiseRegion.AcceptVisitor(this, data); foreach (ParameterDeclarationExpression o in eventDeclaration.Parameters) { Debug.Assert(o != null); o.AcceptVisitor(this, data); } - foreach (AttributeSection o in eventDeclaration.Attributes) { + eventDeclaration.TypeReference.AcceptVisitor(this, data); + foreach (InterfaceImplementation o in eventDeclaration.InterfaceImplementations) { Debug.Assert(o != null); o.AcceptVisitor(this, data); } - return null; + eventDeclaration.AddRegion.AcceptVisitor(this, data); + eventDeclaration.RemoveRegion.AcceptVisitor(this, data); + return eventDeclaration.RaiseRegion.AcceptVisitor(this, data); } public virtual object Visit(EventRaiseRegion eventRaiseRegion, object data) { Debug.Assert((eventRaiseRegion != null)); + Debug.Assert((eventRaiseRegion.Attributes != null)); Debug.Assert((eventRaiseRegion.Block != null)); Debug.Assert((eventRaiseRegion.Parameters != null)); - Debug.Assert((eventRaiseRegion.Attributes != null)); - eventRaiseRegion.Block.AcceptVisitor(this, data); - foreach (ParameterDeclarationExpression o in eventRaiseRegion.Parameters) { + foreach (AttributeSection o in eventRaiseRegion.Attributes) { Debug.Assert(o != null); o.AcceptVisitor(this, data); } - foreach (AttributeSection o in eventRaiseRegion.Attributes) { + eventRaiseRegion.Block.AcceptVisitor(this, data); + foreach (ParameterDeclarationExpression o in eventRaiseRegion.Parameters) { Debug.Assert(o != null); o.AcceptVisitor(this, data); } @@ -382,15 +378,15 @@ namespace ICSharpCode.NRefactory.Parser { public virtual object Visit(EventRemoveRegion eventRemoveRegion, object data) { Debug.Assert((eventRemoveRegion != null)); + Debug.Assert((eventRemoveRegion.Attributes != null)); Debug.Assert((eventRemoveRegion.Block != null)); Debug.Assert((eventRemoveRegion.Parameters != null)); - Debug.Assert((eventRemoveRegion.Attributes != null)); - eventRemoveRegion.Block.AcceptVisitor(this, data); - foreach (ParameterDeclarationExpression o in eventRemoveRegion.Parameters) { + foreach (AttributeSection o in eventRemoveRegion.Attributes) { Debug.Assert(o != null); o.AcceptVisitor(this, data); } - foreach (AttributeSection o in eventRemoveRegion.Attributes) { + eventRemoveRegion.Block.AcceptVisitor(this, data); + foreach (ParameterDeclarationExpression o in eventRemoveRegion.Parameters) { Debug.Assert(o != null); o.AcceptVisitor(this, data); } @@ -404,15 +400,15 @@ namespace ICSharpCode.NRefactory.Parser { public virtual object Visit(FieldDeclaration fieldDeclaration, object data) { Debug.Assert((fieldDeclaration != null)); + Debug.Assert((fieldDeclaration.Attributes != null)); Debug.Assert((fieldDeclaration.TypeReference != null)); Debug.Assert((fieldDeclaration.Fields != null)); - Debug.Assert((fieldDeclaration.Attributes != null)); - fieldDeclaration.TypeReference.AcceptVisitor(this, data); - foreach (VariableDeclaration o in fieldDeclaration.Fields) { + foreach (AttributeSection o in fieldDeclaration.Attributes) { Debug.Assert(o != null); o.AcceptVisitor(this, data); } - foreach (AttributeSection o in fieldDeclaration.Attributes) { + fieldDeclaration.TypeReference.AcceptVisitor(this, data); + foreach (VariableDeclaration o in fieldDeclaration.Fields) { Debug.Assert(o != null); o.AcceptVisitor(this, data); } @@ -527,12 +523,16 @@ namespace ICSharpCode.NRefactory.Parser { public virtual object Visit(IndexerDeclaration indexerDeclaration, object data) { Debug.Assert((indexerDeclaration != null)); + Debug.Assert((indexerDeclaration.Attributes != null)); Debug.Assert((indexerDeclaration.Parameters != null)); Debug.Assert((indexerDeclaration.InterfaceImplementations != null)); Debug.Assert((indexerDeclaration.TypeReference != null)); Debug.Assert((indexerDeclaration.GetRegion != null)); Debug.Assert((indexerDeclaration.SetRegion != null)); - Debug.Assert((indexerDeclaration.Attributes != null)); + foreach (AttributeSection o in indexerDeclaration.Attributes) { + Debug.Assert(o != null); + o.AcceptVisitor(this, data); + } foreach (ParameterDeclarationExpression o in indexerDeclaration.Parameters) { Debug.Assert(o != null); o.AcceptVisitor(this, data); @@ -543,12 +543,7 @@ namespace ICSharpCode.NRefactory.Parser { } indexerDeclaration.TypeReference.AcceptVisitor(this, data); indexerDeclaration.GetRegion.AcceptVisitor(this, data); - indexerDeclaration.SetRegion.AcceptVisitor(this, data); - foreach (AttributeSection o in indexerDeclaration.Attributes) { - Debug.Assert(o != null); - o.AcceptVisitor(this, data); - } - return null; + return indexerDeclaration.SetRegion.AcceptVisitor(this, data); } public virtual object Visit(IndexerExpression indexerExpression, object data) { @@ -618,27 +613,27 @@ namespace ICSharpCode.NRefactory.Parser { public virtual object Visit(MethodDeclaration methodDeclaration, object data) { Debug.Assert((methodDeclaration != null)); + Debug.Assert((methodDeclaration.Attributes != null)); + Debug.Assert((methodDeclaration.Parameters != null)); Debug.Assert((methodDeclaration.TypeReference != null)); Debug.Assert((methodDeclaration.Body != null)); Debug.Assert((methodDeclaration.InterfaceImplementations != null)); Debug.Assert((methodDeclaration.Templates != null)); - Debug.Assert((methodDeclaration.Parameters != null)); - Debug.Assert((methodDeclaration.Attributes != null)); - methodDeclaration.TypeReference.AcceptVisitor(this, data); - methodDeclaration.Body.AcceptVisitor(this, data); - foreach (InterfaceImplementation o in methodDeclaration.InterfaceImplementations) { + foreach (AttributeSection o in methodDeclaration.Attributes) { Debug.Assert(o != null); o.AcceptVisitor(this, data); } - foreach (TemplateDefinition o in methodDeclaration.Templates) { + foreach (ParameterDeclarationExpression o in methodDeclaration.Parameters) { Debug.Assert(o != null); o.AcceptVisitor(this, data); } - foreach (ParameterDeclarationExpression o in methodDeclaration.Parameters) { + methodDeclaration.TypeReference.AcceptVisitor(this, data); + methodDeclaration.Body.AcceptVisitor(this, data); + foreach (InterfaceImplementation o in methodDeclaration.InterfaceImplementations) { Debug.Assert(o != null); o.AcceptVisitor(this, data); } - foreach (AttributeSection o in methodDeclaration.Attributes) { + foreach (TemplateDefinition o in methodDeclaration.Templates) { Debug.Assert(o != null); o.AcceptVisitor(this, data); } @@ -676,14 +671,18 @@ namespace ICSharpCode.NRefactory.Parser { public virtual object Visit(OperatorDeclaration operatorDeclaration, object data) { Debug.Assert((operatorDeclaration != null)); - Debug.Assert((operatorDeclaration.ReturnTypeAttributes != null)); + Debug.Assert((operatorDeclaration.Attributes != null)); + Debug.Assert((operatorDeclaration.Parameters != null)); Debug.Assert((operatorDeclaration.TypeReference != null)); Debug.Assert((operatorDeclaration.Body != null)); Debug.Assert((operatorDeclaration.InterfaceImplementations != null)); Debug.Assert((operatorDeclaration.Templates != null)); - Debug.Assert((operatorDeclaration.Parameters != null)); - Debug.Assert((operatorDeclaration.Attributes != null)); - foreach (AttributeSection o in operatorDeclaration.ReturnTypeAttributes) { + Debug.Assert((operatorDeclaration.ReturnTypeAttributes != null)); + foreach (AttributeSection o in operatorDeclaration.Attributes) { + Debug.Assert(o != null); + o.AcceptVisitor(this, data); + } + foreach (ParameterDeclarationExpression o in operatorDeclaration.Parameters) { Debug.Assert(o != null); o.AcceptVisitor(this, data); } @@ -697,11 +696,7 @@ namespace ICSharpCode.NRefactory.Parser { Debug.Assert(o != null); o.AcceptVisitor(this, data); } - foreach (ParameterDeclarationExpression o in operatorDeclaration.Parameters) { - Debug.Assert(o != null); - o.AcceptVisitor(this, data); - } - foreach (AttributeSection o in operatorDeclaration.Attributes) { + foreach (AttributeSection o in operatorDeclaration.ReturnTypeAttributes) { Debug.Assert(o != null); o.AcceptVisitor(this, data); } @@ -745,53 +740,51 @@ namespace ICSharpCode.NRefactory.Parser { public virtual object Visit(PropertyDeclaration propertyDeclaration, object data) { Debug.Assert((propertyDeclaration != null)); + Debug.Assert((propertyDeclaration.Attributes != null)); + Debug.Assert((propertyDeclaration.Parameters != null)); Debug.Assert((propertyDeclaration.InterfaceImplementations != null)); Debug.Assert((propertyDeclaration.TypeReference != null)); Debug.Assert((propertyDeclaration.GetRegion != null)); Debug.Assert((propertyDeclaration.SetRegion != null)); - Debug.Assert((propertyDeclaration.Parameters != null)); - Debug.Assert((propertyDeclaration.Attributes != null)); - foreach (InterfaceImplementation o in propertyDeclaration.InterfaceImplementations) { + foreach (AttributeSection o in propertyDeclaration.Attributes) { Debug.Assert(o != null); o.AcceptVisitor(this, data); } - propertyDeclaration.TypeReference.AcceptVisitor(this, data); - propertyDeclaration.GetRegion.AcceptVisitor(this, data); - propertyDeclaration.SetRegion.AcceptVisitor(this, data); foreach (ParameterDeclarationExpression o in propertyDeclaration.Parameters) { Debug.Assert(o != null); o.AcceptVisitor(this, data); } - foreach (AttributeSection o in propertyDeclaration.Attributes) { + foreach (InterfaceImplementation o in propertyDeclaration.InterfaceImplementations) { Debug.Assert(o != null); o.AcceptVisitor(this, data); } - return null; + propertyDeclaration.TypeReference.AcceptVisitor(this, data); + propertyDeclaration.GetRegion.AcceptVisitor(this, data); + return propertyDeclaration.SetRegion.AcceptVisitor(this, data); } public virtual object Visit(PropertyGetRegion propertyGetRegion, object data) { Debug.Assert((propertyGetRegion != null)); - Debug.Assert((propertyGetRegion.Block != null)); Debug.Assert((propertyGetRegion.Attributes != null)); - propertyGetRegion.Block.AcceptVisitor(this, data); + Debug.Assert((propertyGetRegion.Block != null)); foreach (AttributeSection o in propertyGetRegion.Attributes) { Debug.Assert(o != null); o.AcceptVisitor(this, data); } - return null; + return propertyGetRegion.Block.AcceptVisitor(this, data); } public virtual object Visit(PropertySetRegion propertySetRegion, object data) { Debug.Assert((propertySetRegion != null)); - Debug.Assert((propertySetRegion.Parameters != null)); - Debug.Assert((propertySetRegion.Block != null)); Debug.Assert((propertySetRegion.Attributes != null)); - foreach (ParameterDeclarationExpression o in propertySetRegion.Parameters) { + Debug.Assert((propertySetRegion.Block != null)); + Debug.Assert((propertySetRegion.Parameters != null)); + foreach (AttributeSection o in propertySetRegion.Attributes) { Debug.Assert(o != null); o.AcceptVisitor(this, data); } propertySetRegion.Block.AcceptVisitor(this, data); - foreach (AttributeSection o in propertySetRegion.Attributes) { + foreach (ParameterDeclarationExpression o in propertySetRegion.Parameters) { Debug.Assert(o != null); o.AcceptVisitor(this, data); } @@ -886,13 +879,13 @@ namespace ICSharpCode.NRefactory.Parser { public virtual object Visit(TemplateDefinition templateDefinition, object data) { Debug.Assert((templateDefinition != null)); - Debug.Assert((templateDefinition.Bases != null)); Debug.Assert((templateDefinition.Attributes != null)); - foreach (TypeReference o in templateDefinition.Bases) { + Debug.Assert((templateDefinition.Bases != null)); + foreach (AttributeSection o in templateDefinition.Attributes) { Debug.Assert(o != null); o.AcceptVisitor(this, data); } - foreach (AttributeSection o in templateDefinition.Attributes) { + foreach (TypeReference o in templateDefinition.Bases) { Debug.Assert(o != null); o.AcceptVisitor(this, data); } @@ -925,18 +918,18 @@ namespace ICSharpCode.NRefactory.Parser { public virtual object Visit(TypeDeclaration typeDeclaration, object data) { Debug.Assert((typeDeclaration != null)); + Debug.Assert((typeDeclaration.Attributes != null)); Debug.Assert((typeDeclaration.BaseTypes != null)); Debug.Assert((typeDeclaration.Templates != null)); - Debug.Assert((typeDeclaration.Attributes != null)); - foreach (TypeReference o in typeDeclaration.BaseTypes) { + foreach (AttributeSection o in typeDeclaration.Attributes) { Debug.Assert(o != null); o.AcceptVisitor(this, data); } - foreach (TemplateDefinition o in typeDeclaration.Templates) { + foreach (TypeReference o in typeDeclaration.BaseTypes) { Debug.Assert(o != null); o.AcceptVisitor(this, data); } - foreach (AttributeSection o in typeDeclaration.Attributes) { + foreach (TemplateDefinition o in typeDeclaration.Templates) { Debug.Assert(o != null); o.AcceptVisitor(this, data); } diff --git a/src/Libraries/NRefactory/Project/Src/Parser/Visitors/AbstractAstTransformer.cs b/src/Libraries/NRefactory/Project/Src/Parser/Visitors/AbstractAstTransformer.cs index 8f11728505..5f2c0c23e9 100644 --- a/src/Libraries/NRefactory/Project/Src/Parser/Visitors/AbstractAstTransformer.cs +++ b/src/Libraries/NRefactory/Project/Src/Parser/Visitors/AbstractAstTransformer.cs @@ -322,38 +322,38 @@ namespace ICSharpCode.NRefactory.Parser { public virtual object Visit(ConstructorDeclaration constructorDeclaration, object data) { Debug.Assert((constructorDeclaration != null)); + Debug.Assert((constructorDeclaration.Attributes != null)); + Debug.Assert((constructorDeclaration.Parameters != null)); Debug.Assert((constructorDeclaration.ConstructorInitializer != null)); Debug.Assert((constructorDeclaration.Body != null)); - Debug.Assert((constructorDeclaration.Parameters != null)); - Debug.Assert((constructorDeclaration.Attributes != null)); - nodeStack.Push(constructorDeclaration.ConstructorInitializer); - constructorDeclaration.ConstructorInitializer.AcceptVisitor(this, data); - constructorDeclaration.ConstructorInitializer = ((ConstructorInitializer)(nodeStack.Pop())); - nodeStack.Push(constructorDeclaration.Body); - constructorDeclaration.Body.AcceptVisitor(this, data); - constructorDeclaration.Body = ((BlockStatement)(nodeStack.Pop())); - for (int i = 0; i < constructorDeclaration.Parameters.Count; i++) { - ParameterDeclarationExpression o = constructorDeclaration.Parameters[i]; + for (int i = 0; i < constructorDeclaration.Attributes.Count; i++) { + AttributeSection o = constructorDeclaration.Attributes[i]; Debug.Assert(o != null); nodeStack.Push(o); o.AcceptVisitor(this, data); - o = (ParameterDeclarationExpression)nodeStack.Pop(); + o = (AttributeSection)nodeStack.Pop(); if (o == null) - constructorDeclaration.Parameters.RemoveAt(i--); + constructorDeclaration.Attributes.RemoveAt(i--); else - constructorDeclaration.Parameters[i] = o; + constructorDeclaration.Attributes[i] = o; } - for (int i = 0; i < constructorDeclaration.Attributes.Count; i++) { - AttributeSection o = constructorDeclaration.Attributes[i]; + for (int i = 0; i < constructorDeclaration.Parameters.Count; i++) { + ParameterDeclarationExpression o = constructorDeclaration.Parameters[i]; Debug.Assert(o != null); nodeStack.Push(o); o.AcceptVisitor(this, data); - o = (AttributeSection)nodeStack.Pop(); + o = (ParameterDeclarationExpression)nodeStack.Pop(); if (o == null) - constructorDeclaration.Attributes.RemoveAt(i--); + constructorDeclaration.Parameters.RemoveAt(i--); else - constructorDeclaration.Attributes[i] = o; + constructorDeclaration.Parameters[i] = o; } + nodeStack.Push(constructorDeclaration.ConstructorInitializer); + constructorDeclaration.ConstructorInitializer.AcceptVisitor(this, data); + constructorDeclaration.ConstructorInitializer = ((ConstructorInitializer)(nodeStack.Pop())); + nodeStack.Push(constructorDeclaration.Body); + constructorDeclaration.Body.AcceptVisitor(this, data); + constructorDeclaration.Body = ((BlockStatement)(nodeStack.Pop())); return null; } @@ -381,34 +381,34 @@ namespace ICSharpCode.NRefactory.Parser { public virtual object Visit(DeclareDeclaration declareDeclaration, object data) { Debug.Assert((declareDeclaration != null)); - Debug.Assert((declareDeclaration.TypeReference != null)); - Debug.Assert((declareDeclaration.Parameters != null)); Debug.Assert((declareDeclaration.Attributes != null)); - nodeStack.Push(declareDeclaration.TypeReference); - declareDeclaration.TypeReference.AcceptVisitor(this, data); - declareDeclaration.TypeReference = ((TypeReference)(nodeStack.Pop())); - for (int i = 0; i < declareDeclaration.Parameters.Count; i++) { - ParameterDeclarationExpression o = declareDeclaration.Parameters[i]; + Debug.Assert((declareDeclaration.Parameters != null)); + Debug.Assert((declareDeclaration.TypeReference != null)); + for (int i = 0; i < declareDeclaration.Attributes.Count; i++) { + AttributeSection o = declareDeclaration.Attributes[i]; Debug.Assert(o != null); nodeStack.Push(o); o.AcceptVisitor(this, data); - o = (ParameterDeclarationExpression)nodeStack.Pop(); + o = (AttributeSection)nodeStack.Pop(); if (o == null) - declareDeclaration.Parameters.RemoveAt(i--); + declareDeclaration.Attributes.RemoveAt(i--); else - declareDeclaration.Parameters[i] = o; + declareDeclaration.Attributes[i] = o; } - for (int i = 0; i < declareDeclaration.Attributes.Count; i++) { - AttributeSection o = declareDeclaration.Attributes[i]; + for (int i = 0; i < declareDeclaration.Parameters.Count; i++) { + ParameterDeclarationExpression o = declareDeclaration.Parameters[i]; Debug.Assert(o != null); nodeStack.Push(o); o.AcceptVisitor(this, data); - o = (AttributeSection)nodeStack.Pop(); + o = (ParameterDeclarationExpression)nodeStack.Pop(); if (o == null) - declareDeclaration.Attributes.RemoveAt(i--); + declareDeclaration.Parameters.RemoveAt(i--); else - declareDeclaration.Attributes[i] = o; + declareDeclaration.Parameters[i] = o; } + nodeStack.Push(declareDeclaration.TypeReference); + declareDeclaration.TypeReference.AcceptVisitor(this, data); + declareDeclaration.TypeReference = ((TypeReference)(nodeStack.Pop())); return null; } @@ -423,10 +423,21 @@ namespace ICSharpCode.NRefactory.Parser { public virtual object Visit(DelegateDeclaration delegateDeclaration, object data) { Debug.Assert((delegateDeclaration != null)); + Debug.Assert((delegateDeclaration.Attributes != null)); Debug.Assert((delegateDeclaration.ReturnType != null)); Debug.Assert((delegateDeclaration.Parameters != null)); Debug.Assert((delegateDeclaration.Templates != null)); - Debug.Assert((delegateDeclaration.Attributes != null)); + for (int i = 0; i < delegateDeclaration.Attributes.Count; i++) { + AttributeSection o = delegateDeclaration.Attributes[i]; + Debug.Assert(o != null); + nodeStack.Push(o); + o.AcceptVisitor(this, data); + o = (AttributeSection)nodeStack.Pop(); + if (o == null) + delegateDeclaration.Attributes.RemoveAt(i--); + else + delegateDeclaration.Attributes[i] = o; + } nodeStack.Push(delegateDeclaration.ReturnType); delegateDeclaration.ReturnType.AcceptVisitor(this, data); delegateDeclaration.ReturnType = ((TypeReference)(nodeStack.Pop())); @@ -452,27 +463,13 @@ namespace ICSharpCode.NRefactory.Parser { else delegateDeclaration.Templates[i] = o; } - for (int i = 0; i < delegateDeclaration.Attributes.Count; i++) { - AttributeSection o = delegateDeclaration.Attributes[i]; - Debug.Assert(o != null); - nodeStack.Push(o); - o.AcceptVisitor(this, data); - o = (AttributeSection)nodeStack.Pop(); - if (o == null) - delegateDeclaration.Attributes.RemoveAt(i--); - else - delegateDeclaration.Attributes[i] = o; - } return null; } public virtual object Visit(DestructorDeclaration destructorDeclaration, object data) { Debug.Assert((destructorDeclaration != null)); - Debug.Assert((destructorDeclaration.Body != null)); Debug.Assert((destructorDeclaration.Attributes != null)); - nodeStack.Push(destructorDeclaration.Body); - destructorDeclaration.Body.AcceptVisitor(this, data); - destructorDeclaration.Body = ((BlockStatement)(nodeStack.Pop())); + Debug.Assert((destructorDeclaration.Body != null)); for (int i = 0; i < destructorDeclaration.Attributes.Count; i++) { AttributeSection o = destructorDeclaration.Attributes[i]; Debug.Assert(o != null); @@ -484,6 +481,9 @@ namespace ICSharpCode.NRefactory.Parser { else destructorDeclaration.Attributes[i] = o; } + nodeStack.Push(destructorDeclaration.Body); + destructorDeclaration.Body.AcceptVisitor(this, data); + destructorDeclaration.Body = ((BlockStatement)(nodeStack.Pop())); return null; } @@ -560,9 +560,20 @@ namespace ICSharpCode.NRefactory.Parser { public virtual object Visit(EventAddRegion eventAddRegion, object data) { Debug.Assert((eventAddRegion != null)); + Debug.Assert((eventAddRegion.Attributes != null)); Debug.Assert((eventAddRegion.Block != null)); Debug.Assert((eventAddRegion.Parameters != null)); - Debug.Assert((eventAddRegion.Attributes != null)); + for (int i = 0; i < eventAddRegion.Attributes.Count; i++) { + AttributeSection o = eventAddRegion.Attributes[i]; + Debug.Assert(o != null); + nodeStack.Push(o); + o.AcceptVisitor(this, data); + o = (AttributeSection)nodeStack.Pop(); + if (o == null) + eventAddRegion.Attributes.RemoveAt(i--); + else + eventAddRegion.Attributes[i] = o; + } nodeStack.Push(eventAddRegion.Block); eventAddRegion.Block.AcceptVisitor(this, data); eventAddRegion.Block = ((BlockStatement)(nodeStack.Pop())); @@ -577,52 +588,29 @@ namespace ICSharpCode.NRefactory.Parser { else eventAddRegion.Parameters[i] = o; } - for (int i = 0; i < eventAddRegion.Attributes.Count; i++) { - AttributeSection o = eventAddRegion.Attributes[i]; - Debug.Assert(o != null); - nodeStack.Push(o); - o.AcceptVisitor(this, data); - o = (AttributeSection)nodeStack.Pop(); - if (o == null) - eventAddRegion.Attributes.RemoveAt(i--); - else - eventAddRegion.Attributes[i] = o; - } return null; } public virtual object Visit(EventDeclaration eventDeclaration, object data) { Debug.Assert((eventDeclaration != null)); + Debug.Assert((eventDeclaration.Attributes != null)); + Debug.Assert((eventDeclaration.Parameters != null)); Debug.Assert((eventDeclaration.TypeReference != null)); Debug.Assert((eventDeclaration.InterfaceImplementations != null)); Debug.Assert((eventDeclaration.AddRegion != null)); Debug.Assert((eventDeclaration.RemoveRegion != null)); Debug.Assert((eventDeclaration.RaiseRegion != null)); - Debug.Assert((eventDeclaration.Parameters != null)); - Debug.Assert((eventDeclaration.Attributes != null)); - nodeStack.Push(eventDeclaration.TypeReference); - eventDeclaration.TypeReference.AcceptVisitor(this, data); - eventDeclaration.TypeReference = ((TypeReference)(nodeStack.Pop())); - for (int i = 0; i < eventDeclaration.InterfaceImplementations.Count; i++) { - InterfaceImplementation o = eventDeclaration.InterfaceImplementations[i]; + for (int i = 0; i < eventDeclaration.Attributes.Count; i++) { + AttributeSection o = eventDeclaration.Attributes[i]; Debug.Assert(o != null); nodeStack.Push(o); o.AcceptVisitor(this, data); - o = (InterfaceImplementation)nodeStack.Pop(); + o = (AttributeSection)nodeStack.Pop(); if (o == null) - eventDeclaration.InterfaceImplementations.RemoveAt(i--); + eventDeclaration.Attributes.RemoveAt(i--); else - eventDeclaration.InterfaceImplementations[i] = o; + eventDeclaration.Attributes[i] = o; } - nodeStack.Push(eventDeclaration.AddRegion); - eventDeclaration.AddRegion.AcceptVisitor(this, data); - eventDeclaration.AddRegion = ((EventAddRegion)(nodeStack.Pop())); - nodeStack.Push(eventDeclaration.RemoveRegion); - eventDeclaration.RemoveRegion.AcceptVisitor(this, data); - eventDeclaration.RemoveRegion = ((EventRemoveRegion)(nodeStack.Pop())); - nodeStack.Push(eventDeclaration.RaiseRegion); - eventDeclaration.RaiseRegion.AcceptVisitor(this, data); - eventDeclaration.RaiseRegion = ((EventRaiseRegion)(nodeStack.Pop())); for (int i = 0; i < eventDeclaration.Parameters.Count; i++) { ParameterDeclarationExpression o = eventDeclaration.Parameters[i]; Debug.Assert(o != null); @@ -634,25 +622,48 @@ namespace ICSharpCode.NRefactory.Parser { else eventDeclaration.Parameters[i] = o; } - for (int i = 0; i < eventDeclaration.Attributes.Count; i++) { - AttributeSection o = eventDeclaration.Attributes[i]; + nodeStack.Push(eventDeclaration.TypeReference); + eventDeclaration.TypeReference.AcceptVisitor(this, data); + eventDeclaration.TypeReference = ((TypeReference)(nodeStack.Pop())); + for (int i = 0; i < eventDeclaration.InterfaceImplementations.Count; i++) { + InterfaceImplementation o = eventDeclaration.InterfaceImplementations[i]; Debug.Assert(o != null); nodeStack.Push(o); o.AcceptVisitor(this, data); - o = (AttributeSection)nodeStack.Pop(); + o = (InterfaceImplementation)nodeStack.Pop(); if (o == null) - eventDeclaration.Attributes.RemoveAt(i--); + eventDeclaration.InterfaceImplementations.RemoveAt(i--); else - eventDeclaration.Attributes[i] = o; + eventDeclaration.InterfaceImplementations[i] = o; } + nodeStack.Push(eventDeclaration.AddRegion); + eventDeclaration.AddRegion.AcceptVisitor(this, data); + eventDeclaration.AddRegion = ((EventAddRegion)(nodeStack.Pop())); + nodeStack.Push(eventDeclaration.RemoveRegion); + eventDeclaration.RemoveRegion.AcceptVisitor(this, data); + eventDeclaration.RemoveRegion = ((EventRemoveRegion)(nodeStack.Pop())); + nodeStack.Push(eventDeclaration.RaiseRegion); + eventDeclaration.RaiseRegion.AcceptVisitor(this, data); + eventDeclaration.RaiseRegion = ((EventRaiseRegion)(nodeStack.Pop())); return null; } public virtual object Visit(EventRaiseRegion eventRaiseRegion, object data) { Debug.Assert((eventRaiseRegion != null)); + Debug.Assert((eventRaiseRegion.Attributes != null)); Debug.Assert((eventRaiseRegion.Block != null)); Debug.Assert((eventRaiseRegion.Parameters != null)); - Debug.Assert((eventRaiseRegion.Attributes != null)); + for (int i = 0; i < eventRaiseRegion.Attributes.Count; i++) { + AttributeSection o = eventRaiseRegion.Attributes[i]; + Debug.Assert(o != null); + nodeStack.Push(o); + o.AcceptVisitor(this, data); + o = (AttributeSection)nodeStack.Pop(); + if (o == null) + eventRaiseRegion.Attributes.RemoveAt(i--); + else + eventRaiseRegion.Attributes[i] = o; + } nodeStack.Push(eventRaiseRegion.Block); eventRaiseRegion.Block.AcceptVisitor(this, data); eventRaiseRegion.Block = ((BlockStatement)(nodeStack.Pop())); @@ -667,25 +678,25 @@ namespace ICSharpCode.NRefactory.Parser { else eventRaiseRegion.Parameters[i] = o; } - for (int i = 0; i < eventRaiseRegion.Attributes.Count; i++) { - AttributeSection o = eventRaiseRegion.Attributes[i]; - Debug.Assert(o != null); - nodeStack.Push(o); - o.AcceptVisitor(this, data); - o = (AttributeSection)nodeStack.Pop(); - if (o == null) - eventRaiseRegion.Attributes.RemoveAt(i--); - else - eventRaiseRegion.Attributes[i] = o; - } return null; } public virtual object Visit(EventRemoveRegion eventRemoveRegion, object data) { Debug.Assert((eventRemoveRegion != null)); + Debug.Assert((eventRemoveRegion.Attributes != null)); Debug.Assert((eventRemoveRegion.Block != null)); Debug.Assert((eventRemoveRegion.Parameters != null)); - Debug.Assert((eventRemoveRegion.Attributes != null)); + for (int i = 0; i < eventRemoveRegion.Attributes.Count; i++) { + AttributeSection o = eventRemoveRegion.Attributes[i]; + Debug.Assert(o != null); + nodeStack.Push(o); + o.AcceptVisitor(this, data); + o = (AttributeSection)nodeStack.Pop(); + if (o == null) + eventRemoveRegion.Attributes.RemoveAt(i--); + else + eventRemoveRegion.Attributes[i] = o; + } nodeStack.Push(eventRemoveRegion.Block); eventRemoveRegion.Block.AcceptVisitor(this, data); eventRemoveRegion.Block = ((BlockStatement)(nodeStack.Pop())); @@ -700,17 +711,6 @@ namespace ICSharpCode.NRefactory.Parser { else eventRemoveRegion.Parameters[i] = o; } - for (int i = 0; i < eventRemoveRegion.Attributes.Count; i++) { - AttributeSection o = eventRemoveRegion.Attributes[i]; - Debug.Assert(o != null); - nodeStack.Push(o); - o.AcceptVisitor(this, data); - o = (AttributeSection)nodeStack.Pop(); - if (o == null) - eventRemoveRegion.Attributes.RemoveAt(i--); - else - eventRemoveRegion.Attributes[i] = o; - } return null; } @@ -721,9 +721,20 @@ namespace ICSharpCode.NRefactory.Parser { public virtual object Visit(FieldDeclaration fieldDeclaration, object data) { Debug.Assert((fieldDeclaration != null)); + Debug.Assert((fieldDeclaration.Attributes != null)); Debug.Assert((fieldDeclaration.TypeReference != null)); Debug.Assert((fieldDeclaration.Fields != null)); - Debug.Assert((fieldDeclaration.Attributes != null)); + for (int i = 0; i < fieldDeclaration.Attributes.Count; i++) { + AttributeSection o = fieldDeclaration.Attributes[i]; + Debug.Assert(o != null); + nodeStack.Push(o); + o.AcceptVisitor(this, data); + o = (AttributeSection)nodeStack.Pop(); + if (o == null) + fieldDeclaration.Attributes.RemoveAt(i--); + else + fieldDeclaration.Attributes[i] = o; + } nodeStack.Push(fieldDeclaration.TypeReference); fieldDeclaration.TypeReference.AcceptVisitor(this, data); fieldDeclaration.TypeReference = ((TypeReference)(nodeStack.Pop())); @@ -738,17 +749,6 @@ namespace ICSharpCode.NRefactory.Parser { else fieldDeclaration.Fields[i] = o; } - for (int i = 0; i < fieldDeclaration.Attributes.Count; i++) { - AttributeSection o = fieldDeclaration.Attributes[i]; - Debug.Assert(o != null); - nodeStack.Push(o); - o.AcceptVisitor(this, data); - o = (AttributeSection)nodeStack.Pop(); - if (o == null) - fieldDeclaration.Attributes.RemoveAt(i--); - else - fieldDeclaration.Attributes[i] = o; - } return null; } @@ -947,12 +947,23 @@ namespace ICSharpCode.NRefactory.Parser { public virtual object Visit(IndexerDeclaration indexerDeclaration, object data) { Debug.Assert((indexerDeclaration != null)); + Debug.Assert((indexerDeclaration.Attributes != null)); Debug.Assert((indexerDeclaration.Parameters != null)); Debug.Assert((indexerDeclaration.InterfaceImplementations != null)); Debug.Assert((indexerDeclaration.TypeReference != null)); Debug.Assert((indexerDeclaration.GetRegion != null)); Debug.Assert((indexerDeclaration.SetRegion != null)); - Debug.Assert((indexerDeclaration.Attributes != null)); + for (int i = 0; i < indexerDeclaration.Attributes.Count; i++) { + AttributeSection o = indexerDeclaration.Attributes[i]; + Debug.Assert(o != null); + nodeStack.Push(o); + o.AcceptVisitor(this, data); + o = (AttributeSection)nodeStack.Pop(); + if (o == null) + indexerDeclaration.Attributes.RemoveAt(i--); + else + indexerDeclaration.Attributes[i] = o; + } for (int i = 0; i < indexerDeclaration.Parameters.Count; i++) { ParameterDeclarationExpression o = indexerDeclaration.Parameters[i]; Debug.Assert(o != null); @@ -984,17 +995,6 @@ namespace ICSharpCode.NRefactory.Parser { nodeStack.Push(indexerDeclaration.SetRegion); indexerDeclaration.SetRegion.AcceptVisitor(this, data); indexerDeclaration.SetRegion = ((PropertySetRegion)(nodeStack.Pop())); - for (int i = 0; i < indexerDeclaration.Attributes.Count; i++) { - AttributeSection o = indexerDeclaration.Attributes[i]; - Debug.Assert(o != null); - nodeStack.Push(o); - o.AcceptVisitor(this, data); - o = (AttributeSection)nodeStack.Pop(); - if (o == null) - indexerDeclaration.Attributes.RemoveAt(i--); - else - indexerDeclaration.Attributes[i] = o; - } return null; } @@ -1107,12 +1107,34 @@ namespace ICSharpCode.NRefactory.Parser { public virtual object Visit(MethodDeclaration methodDeclaration, object data) { Debug.Assert((methodDeclaration != null)); + Debug.Assert((methodDeclaration.Attributes != null)); + Debug.Assert((methodDeclaration.Parameters != null)); Debug.Assert((methodDeclaration.TypeReference != null)); Debug.Assert((methodDeclaration.Body != null)); Debug.Assert((methodDeclaration.InterfaceImplementations != null)); Debug.Assert((methodDeclaration.Templates != null)); - Debug.Assert((methodDeclaration.Parameters != null)); - Debug.Assert((methodDeclaration.Attributes != null)); + for (int i = 0; i < methodDeclaration.Attributes.Count; i++) { + AttributeSection o = methodDeclaration.Attributes[i]; + Debug.Assert(o != null); + nodeStack.Push(o); + o.AcceptVisitor(this, data); + o = (AttributeSection)nodeStack.Pop(); + if (o == null) + methodDeclaration.Attributes.RemoveAt(i--); + else + methodDeclaration.Attributes[i] = o; + } + for (int i = 0; i < methodDeclaration.Parameters.Count; i++) { + ParameterDeclarationExpression o = methodDeclaration.Parameters[i]; + Debug.Assert(o != null); + nodeStack.Push(o); + o.AcceptVisitor(this, data); + o = (ParameterDeclarationExpression)nodeStack.Pop(); + if (o == null) + methodDeclaration.Parameters.RemoveAt(i--); + else + methodDeclaration.Parameters[i] = o; + } nodeStack.Push(methodDeclaration.TypeReference); methodDeclaration.TypeReference.AcceptVisitor(this, data); methodDeclaration.TypeReference = ((TypeReference)(nodeStack.Pop())); @@ -1141,28 +1163,6 @@ namespace ICSharpCode.NRefactory.Parser { else methodDeclaration.Templates[i] = o; } - for (int i = 0; i < methodDeclaration.Parameters.Count; i++) { - ParameterDeclarationExpression o = methodDeclaration.Parameters[i]; - Debug.Assert(o != null); - nodeStack.Push(o); - o.AcceptVisitor(this, data); - o = (ParameterDeclarationExpression)nodeStack.Pop(); - if (o == null) - methodDeclaration.Parameters.RemoveAt(i--); - else - methodDeclaration.Parameters[i] = o; - } - for (int i = 0; i < methodDeclaration.Attributes.Count; i++) { - AttributeSection o = methodDeclaration.Attributes[i]; - Debug.Assert(o != null); - nodeStack.Push(o); - o.AcceptVisitor(this, data); - o = (AttributeSection)nodeStack.Pop(); - if (o == null) - methodDeclaration.Attributes.RemoveAt(i--); - else - methodDeclaration.Attributes[i] = o; - } return null; } @@ -1223,23 +1223,34 @@ namespace ICSharpCode.NRefactory.Parser { public virtual object Visit(OperatorDeclaration operatorDeclaration, object data) { Debug.Assert((operatorDeclaration != null)); - Debug.Assert((operatorDeclaration.ReturnTypeAttributes != null)); + Debug.Assert((operatorDeclaration.Attributes != null)); + Debug.Assert((operatorDeclaration.Parameters != null)); Debug.Assert((operatorDeclaration.TypeReference != null)); Debug.Assert((operatorDeclaration.Body != null)); Debug.Assert((operatorDeclaration.InterfaceImplementations != null)); Debug.Assert((operatorDeclaration.Templates != null)); - Debug.Assert((operatorDeclaration.Parameters != null)); - Debug.Assert((operatorDeclaration.Attributes != null)); - for (int i = 0; i < operatorDeclaration.ReturnTypeAttributes.Count; i++) { - AttributeSection o = operatorDeclaration.ReturnTypeAttributes[i]; + Debug.Assert((operatorDeclaration.ReturnTypeAttributes != null)); + for (int i = 0; i < operatorDeclaration.Attributes.Count; i++) { + AttributeSection o = operatorDeclaration.Attributes[i]; Debug.Assert(o != null); nodeStack.Push(o); o.AcceptVisitor(this, data); o = (AttributeSection)nodeStack.Pop(); if (o == null) - operatorDeclaration.ReturnTypeAttributes.RemoveAt(i--); + operatorDeclaration.Attributes.RemoveAt(i--); else - operatorDeclaration.ReturnTypeAttributes[i] = o; + operatorDeclaration.Attributes[i] = o; + } + for (int i = 0; i < operatorDeclaration.Parameters.Count; i++) { + ParameterDeclarationExpression o = operatorDeclaration.Parameters[i]; + Debug.Assert(o != null); + nodeStack.Push(o); + o.AcceptVisitor(this, data); + o = (ParameterDeclarationExpression)nodeStack.Pop(); + if (o == null) + operatorDeclaration.Parameters.RemoveAt(i--); + else + operatorDeclaration.Parameters[i] = o; } nodeStack.Push(operatorDeclaration.TypeReference); operatorDeclaration.TypeReference.AcceptVisitor(this, data); @@ -1269,27 +1280,16 @@ namespace ICSharpCode.NRefactory.Parser { else operatorDeclaration.Templates[i] = o; } - for (int i = 0; i < operatorDeclaration.Parameters.Count; i++) { - ParameterDeclarationExpression o = operatorDeclaration.Parameters[i]; - Debug.Assert(o != null); - nodeStack.Push(o); - o.AcceptVisitor(this, data); - o = (ParameterDeclarationExpression)nodeStack.Pop(); - if (o == null) - operatorDeclaration.Parameters.RemoveAt(i--); - else - operatorDeclaration.Parameters[i] = o; - } - for (int i = 0; i < operatorDeclaration.Attributes.Count; i++) { - AttributeSection o = operatorDeclaration.Attributes[i]; + for (int i = 0; i < operatorDeclaration.ReturnTypeAttributes.Count; i++) { + AttributeSection o = operatorDeclaration.ReturnTypeAttributes[i]; Debug.Assert(o != null); nodeStack.Push(o); o.AcceptVisitor(this, data); o = (AttributeSection)nodeStack.Pop(); if (o == null) - operatorDeclaration.Attributes.RemoveAt(i--); + operatorDeclaration.ReturnTypeAttributes.RemoveAt(i--); else - operatorDeclaration.Attributes[i] = o; + operatorDeclaration.ReturnTypeAttributes[i] = o; } return null; } @@ -1349,32 +1349,23 @@ namespace ICSharpCode.NRefactory.Parser { public virtual object Visit(PropertyDeclaration propertyDeclaration, object data) { Debug.Assert((propertyDeclaration != null)); + Debug.Assert((propertyDeclaration.Attributes != null)); + Debug.Assert((propertyDeclaration.Parameters != null)); Debug.Assert((propertyDeclaration.InterfaceImplementations != null)); Debug.Assert((propertyDeclaration.TypeReference != null)); Debug.Assert((propertyDeclaration.GetRegion != null)); Debug.Assert((propertyDeclaration.SetRegion != null)); - Debug.Assert((propertyDeclaration.Parameters != null)); - Debug.Assert((propertyDeclaration.Attributes != null)); - for (int i = 0; i < propertyDeclaration.InterfaceImplementations.Count; i++) { - InterfaceImplementation o = propertyDeclaration.InterfaceImplementations[i]; + for (int i = 0; i < propertyDeclaration.Attributes.Count; i++) { + AttributeSection o = propertyDeclaration.Attributes[i]; Debug.Assert(o != null); nodeStack.Push(o); o.AcceptVisitor(this, data); - o = (InterfaceImplementation)nodeStack.Pop(); + o = (AttributeSection)nodeStack.Pop(); if (o == null) - propertyDeclaration.InterfaceImplementations.RemoveAt(i--); + propertyDeclaration.Attributes.RemoveAt(i--); else - propertyDeclaration.InterfaceImplementations[i] = o; + propertyDeclaration.Attributes[i] = o; } - nodeStack.Push(propertyDeclaration.TypeReference); - propertyDeclaration.TypeReference.AcceptVisitor(this, data); - propertyDeclaration.TypeReference = ((TypeReference)(nodeStack.Pop())); - nodeStack.Push(propertyDeclaration.GetRegion); - propertyDeclaration.GetRegion.AcceptVisitor(this, data); - propertyDeclaration.GetRegion = ((PropertyGetRegion)(nodeStack.Pop())); - nodeStack.Push(propertyDeclaration.SetRegion); - propertyDeclaration.SetRegion.AcceptVisitor(this, data); - propertyDeclaration.SetRegion = ((PropertySetRegion)(nodeStack.Pop())); for (int i = 0; i < propertyDeclaration.Parameters.Count; i++) { ParameterDeclarationExpression o = propertyDeclaration.Parameters[i]; Debug.Assert(o != null); @@ -1386,27 +1377,33 @@ namespace ICSharpCode.NRefactory.Parser { else propertyDeclaration.Parameters[i] = o; } - for (int i = 0; i < propertyDeclaration.Attributes.Count; i++) { - AttributeSection o = propertyDeclaration.Attributes[i]; + for (int i = 0; i < propertyDeclaration.InterfaceImplementations.Count; i++) { + InterfaceImplementation o = propertyDeclaration.InterfaceImplementations[i]; Debug.Assert(o != null); nodeStack.Push(o); o.AcceptVisitor(this, data); - o = (AttributeSection)nodeStack.Pop(); + o = (InterfaceImplementation)nodeStack.Pop(); if (o == null) - propertyDeclaration.Attributes.RemoveAt(i--); + propertyDeclaration.InterfaceImplementations.RemoveAt(i--); else - propertyDeclaration.Attributes[i] = o; + propertyDeclaration.InterfaceImplementations[i] = o; } + nodeStack.Push(propertyDeclaration.TypeReference); + propertyDeclaration.TypeReference.AcceptVisitor(this, data); + propertyDeclaration.TypeReference = ((TypeReference)(nodeStack.Pop())); + nodeStack.Push(propertyDeclaration.GetRegion); + propertyDeclaration.GetRegion.AcceptVisitor(this, data); + propertyDeclaration.GetRegion = ((PropertyGetRegion)(nodeStack.Pop())); + nodeStack.Push(propertyDeclaration.SetRegion); + propertyDeclaration.SetRegion.AcceptVisitor(this, data); + propertyDeclaration.SetRegion = ((PropertySetRegion)(nodeStack.Pop())); return null; } public virtual object Visit(PropertyGetRegion propertyGetRegion, object data) { Debug.Assert((propertyGetRegion != null)); - Debug.Assert((propertyGetRegion.Block != null)); Debug.Assert((propertyGetRegion.Attributes != null)); - nodeStack.Push(propertyGetRegion.Block); - propertyGetRegion.Block.AcceptVisitor(this, data); - propertyGetRegion.Block = ((BlockStatement)(nodeStack.Pop())); + Debug.Assert((propertyGetRegion.Block != null)); for (int i = 0; i < propertyGetRegion.Attributes.Count; i++) { AttributeSection o = propertyGetRegion.Attributes[i]; Debug.Assert(o != null); @@ -1418,38 +1415,41 @@ namespace ICSharpCode.NRefactory.Parser { else propertyGetRegion.Attributes[i] = o; } + nodeStack.Push(propertyGetRegion.Block); + propertyGetRegion.Block.AcceptVisitor(this, data); + propertyGetRegion.Block = ((BlockStatement)(nodeStack.Pop())); return null; } public virtual object Visit(PropertySetRegion propertySetRegion, object data) { Debug.Assert((propertySetRegion != null)); - Debug.Assert((propertySetRegion.Parameters != null)); - Debug.Assert((propertySetRegion.Block != null)); Debug.Assert((propertySetRegion.Attributes != null)); - for (int i = 0; i < propertySetRegion.Parameters.Count; i++) { - ParameterDeclarationExpression o = propertySetRegion.Parameters[i]; + Debug.Assert((propertySetRegion.Block != null)); + Debug.Assert((propertySetRegion.Parameters != null)); + for (int i = 0; i < propertySetRegion.Attributes.Count; i++) { + AttributeSection o = propertySetRegion.Attributes[i]; Debug.Assert(o != null); nodeStack.Push(o); o.AcceptVisitor(this, data); - o = (ParameterDeclarationExpression)nodeStack.Pop(); + o = (AttributeSection)nodeStack.Pop(); if (o == null) - propertySetRegion.Parameters.RemoveAt(i--); + propertySetRegion.Attributes.RemoveAt(i--); else - propertySetRegion.Parameters[i] = o; + propertySetRegion.Attributes[i] = o; } nodeStack.Push(propertySetRegion.Block); propertySetRegion.Block.AcceptVisitor(this, data); propertySetRegion.Block = ((BlockStatement)(nodeStack.Pop())); - for (int i = 0; i < propertySetRegion.Attributes.Count; i++) { - AttributeSection o = propertySetRegion.Attributes[i]; + for (int i = 0; i < propertySetRegion.Parameters.Count; i++) { + ParameterDeclarationExpression o = propertySetRegion.Parameters[i]; Debug.Assert(o != null); nodeStack.Push(o); o.AcceptVisitor(this, data); - o = (AttributeSection)nodeStack.Pop(); + o = (ParameterDeclarationExpression)nodeStack.Pop(); if (o == null) - propertySetRegion.Attributes.RemoveAt(i--); + propertySetRegion.Parameters.RemoveAt(i--); else - propertySetRegion.Attributes[i] = o; + propertySetRegion.Parameters[i] = o; } return null; } @@ -1602,29 +1602,29 @@ namespace ICSharpCode.NRefactory.Parser { public virtual object Visit(TemplateDefinition templateDefinition, object data) { Debug.Assert((templateDefinition != null)); - Debug.Assert((templateDefinition.Bases != null)); Debug.Assert((templateDefinition.Attributes != null)); - for (int i = 0; i < templateDefinition.Bases.Count; i++) { - TypeReference o = templateDefinition.Bases[i]; + Debug.Assert((templateDefinition.Bases != null)); + for (int i = 0; i < templateDefinition.Attributes.Count; i++) { + AttributeSection o = templateDefinition.Attributes[i]; Debug.Assert(o != null); nodeStack.Push(o); o.AcceptVisitor(this, data); - o = (TypeReference)nodeStack.Pop(); + o = (AttributeSection)nodeStack.Pop(); if (o == null) - templateDefinition.Bases.RemoveAt(i--); + templateDefinition.Attributes.RemoveAt(i--); else - templateDefinition.Bases[i] = o; + templateDefinition.Attributes[i] = o; } - for (int i = 0; i < templateDefinition.Attributes.Count; i++) { - AttributeSection o = templateDefinition.Attributes[i]; + for (int i = 0; i < templateDefinition.Bases.Count; i++) { + TypeReference o = templateDefinition.Bases[i]; Debug.Assert(o != null); nodeStack.Push(o); o.AcceptVisitor(this, data); - o = (AttributeSection)nodeStack.Pop(); + o = (TypeReference)nodeStack.Pop(); if (o == null) - templateDefinition.Attributes.RemoveAt(i--); + templateDefinition.Bases.RemoveAt(i--); else - templateDefinition.Attributes[i] = o; + templateDefinition.Bases[i] = o; } return null; } @@ -1670,9 +1670,20 @@ namespace ICSharpCode.NRefactory.Parser { public virtual object Visit(TypeDeclaration typeDeclaration, object data) { Debug.Assert((typeDeclaration != null)); + Debug.Assert((typeDeclaration.Attributes != null)); Debug.Assert((typeDeclaration.BaseTypes != null)); Debug.Assert((typeDeclaration.Templates != null)); - Debug.Assert((typeDeclaration.Attributes != null)); + for (int i = 0; i < typeDeclaration.Attributes.Count; i++) { + AttributeSection o = typeDeclaration.Attributes[i]; + Debug.Assert(o != null); + nodeStack.Push(o); + o.AcceptVisitor(this, data); + o = (AttributeSection)nodeStack.Pop(); + if (o == null) + typeDeclaration.Attributes.RemoveAt(i--); + else + typeDeclaration.Attributes[i] = o; + } for (int i = 0; i < typeDeclaration.BaseTypes.Count; i++) { TypeReference o = typeDeclaration.BaseTypes[i]; Debug.Assert(o != null); @@ -1695,17 +1706,6 @@ namespace ICSharpCode.NRefactory.Parser { else typeDeclaration.Templates[i] = o; } - for (int i = 0; i < typeDeclaration.Attributes.Count; i++) { - AttributeSection o = typeDeclaration.Attributes[i]; - Debug.Assert(o != null); - nodeStack.Push(o); - o.AcceptVisitor(this, data); - o = (AttributeSection)nodeStack.Pop(); - if (o == null) - typeDeclaration.Attributes.RemoveAt(i--); - else - typeDeclaration.Attributes[i] = o; - } for (int i = 0; i < typeDeclaration.Children.Count; i++) { INode o = typeDeclaration.Children[i]; Debug.Assert(o != null); diff --git a/src/Libraries/NRefactory/Project/Src/Parser/Visitors/PrefixFieldsVisitor.cs b/src/Libraries/NRefactory/Project/Src/Parser/Visitors/PrefixFieldsVisitor.cs index ad37a69342..66fb689605 100644 --- a/src/Libraries/NRefactory/Project/Src/Parser/Visitors/PrefixFieldsVisitor.cs +++ b/src/Libraries/NRefactory/Project/Src/Parser/Visitors/PrefixFieldsVisitor.cs @@ -29,7 +29,7 @@ namespace ICSharpCode.NRefactory.Parser public void Run(TypeDeclaration typeDeclaration) { - base.Visit(typeDeclaration, null); + typeDeclaration.AcceptChildren(this, null); foreach (VariableDeclaration decl in fields) { decl.Name = prefix + decl.Name; } @@ -37,8 +37,10 @@ namespace ICSharpCode.NRefactory.Parser public override object Visit(TypeDeclaration typeDeclaration, object data) { - // TODO: treat fields of base types like locals - return base.Visit(typeDeclaration, data); + Push(); + object result = base.Visit(typeDeclaration, data); + Pop(); + return result; } public override object Visit(BlockStatement blockStatement, object data) @@ -57,18 +59,10 @@ namespace ICSharpCode.NRefactory.Parser return result; } - public override object Visit(PropertyGetRegion p, object data) - { - Push(); - object result = base.Visit(p, data); - Pop(); - return result; - } - - public override object Visit(PropertySetRegion p, object data) + public override object Visit(PropertyDeclaration propertyDeclaration, object data) { Push(); - object result = base.Visit(p, data); + object result = base.Visit(propertyDeclaration, data); Pop(); return result; } @@ -92,13 +86,14 @@ namespace ICSharpCode.NRefactory.Parser curBlock = blocks.Pop(); } - public override object Visit(LocalVariableDeclaration localVariableDeclaration, object data) + public override object Visit(VariableDeclaration variableDeclaration, object data) { - foreach (VariableDeclaration decl in localVariableDeclaration.Variables) { - //print("add variable ${decl.Name} to block") - curBlock.Add(decl.Name); + // process local variables only + if (fields.Contains(variableDeclaration)) { + return null; } - return base.Visit(localVariableDeclaration, data); + curBlock.Add(variableDeclaration.Name); + return base.Visit(variableDeclaration, data); } public override object Visit(ParameterDeclarationExpression parameterDeclarationExpression, object data) @@ -108,6 +103,12 @@ namespace ICSharpCode.NRefactory.Parser return base.Visit(parameterDeclarationExpression, data); } + public override object Visit(ForeachStatement foreachStatement, object data) + { + curBlock.Add(foreachStatement.VariableName); + return base.Visit(foreachStatement, data); + } + public override object Visit(IdentifierExpression identifierExpression, object data) { string name = identifierExpression.Identifier; diff --git a/src/Libraries/NRefactory/Project/Src/Parser/Visitors/VBNetConstructsConvertVisitor.cs b/src/Libraries/NRefactory/Project/Src/Parser/Visitors/VBNetConstructsConvertVisitor.cs index 58b73ee01b..70e6e2fd81 100644 --- a/src/Libraries/NRefactory/Project/Src/Parser/Visitors/VBNetConstructsConvertVisitor.cs +++ b/src/Libraries/NRefactory/Project/Src/Parser/Visitors/VBNetConstructsConvertVisitor.cs @@ -26,6 +26,7 @@ namespace ICSharpCode.NRefactory.Parser // The following conversions are implemented: // MyBase.New() and MyClass.New() calls inside the constructor are converted to :base() and :this() // Add Public Modifier to methods and properties + // Override Finalize => Destructor // The following conversions should be implemented in the future: // Function A() \n A = SomeValue \n End Function -> convert to return statement @@ -74,7 +75,7 @@ namespace ICSharpCode.NRefactory.Parser if (ie != null) { FieldReferenceExpression fre = ie.TargetObject as FieldReferenceExpression; if (fre != null && "New".Equals(fre.FieldName, StringComparison.InvariantCultureIgnoreCase)) { - if (fre.TargetObject is BaseReferenceExpression || fre.TargetObject is ClassReferenceExpression) { + if (fre.TargetObject is BaseReferenceExpression || fre.TargetObject is ClassReferenceExpression || fre.TargetObject is ThisReferenceExpression) { body.Children.RemoveAt(0); ConstructorInitializer ci = new ConstructorInitializer(); ci.Arguments = ie.Arguments; @@ -144,6 +145,36 @@ namespace ICSharpCode.NRefactory.Parser if ((methodDeclaration.Modifier & Modifier.Visibility) == 0) methodDeclaration.Modifier |= Modifier.Public; + if ("Finalize".Equals(methodDeclaration.Name, StringComparison.InvariantCultureIgnoreCase) + && methodDeclaration.Parameters.Count == 0 + && methodDeclaration.Modifier == (Modifier.Protected | Modifier.Override) + && methodDeclaration.Body.Children.Count == 1) + { + TryCatchStatement tcs = methodDeclaration.Body.Children[0] as TryCatchStatement; + if (tcs != null + && tcs.StatementBlock is BlockStatement + && tcs.CatchClauses.Count == 0 + && tcs.FinallyBlock is BlockStatement + && tcs.FinallyBlock.Children.Count == 1) + { + StatementExpression se = tcs.FinallyBlock.Children[0] as StatementExpression; + if (se != null) { + InvocationExpression ie = se.Expression as InvocationExpression; + if (ie != null + && ie.Arguments.Count == 0 + && ie.TargetObject is FieldReferenceExpression + && (ie.TargetObject as FieldReferenceExpression).TargetObject is BaseReferenceExpression + && "Finalize".Equals((ie.TargetObject as FieldReferenceExpression).FieldName, StringComparison.InvariantCultureIgnoreCase)) + { + DestructorDeclaration des = new DestructorDeclaration("Destructor", Modifier.None, methodDeclaration.Attributes); + ReplaceCurrentNode(des); + des.Body = (BlockStatement)tcs.StatementBlock; + return base.Visit(des, data); + } + } + } + } + if ((methodDeclaration.Modifier & (Modifier.Static | Modifier.Extern)) == Modifier.Static && methodDeclaration.Body.Children.Count == 0) { diff --git a/src/Libraries/NRefactory/Test/NRefactoryTests.csproj b/src/Libraries/NRefactory/Test/NRefactoryTests.csproj index 0a7bb9416c..5a8010f4b0 100644 --- a/src/Libraries/NRefactory/Test/NRefactoryTests.csproj +++ b/src/Libraries/NRefactory/Test/NRefactoryTests.csproj @@ -142,6 +142,7 @@ + diff --git a/src/Libraries/NRefactory/Test/Output/CSharp/CSharpOutputTest.cs b/src/Libraries/NRefactory/Test/Output/CSharp/CSharpOutputTest.cs index be4a5507d3..e1c5a728b6 100644 --- a/src/Libraries/NRefactory/Test/Output/CSharp/CSharpOutputTest.cs +++ b/src/Libraries/NRefactory/Test/Output/CSharp/CSharpOutputTest.cs @@ -28,7 +28,7 @@ namespace ICSharpCode.NRefactory.Tests.PrettyPrinter Assert.AreEqual(StripWhitespace(program), StripWhitespace(outputVisitor.Text)); } - string StripWhitespace(string text) + internal static string StripWhitespace(string text) { return text.Trim().Replace("\t", "").Replace("\r", "").Replace("\n", " ").Replace(" ", " "); } @@ -54,6 +54,21 @@ namespace ICSharpCode.NRefactory.Tests.PrettyPrinter Assert.AreEqual(StripWhitespace(expression), StripWhitespace(outputVisitor.Text)); } + [Test] + public void Namespace() + { + TestProgram("namespace System { }"); + } + + [Test] + public void CustomEvent() + { + TestTypeMember("public event EventHandler Click {" + + " add { obj.Click += value; }" + + " remove { obj.Click -= value; } " + + "}"); + } + [Test] public void Field() { @@ -130,6 +145,69 @@ namespace ICSharpCode.NRefactory.Tests.PrettyPrinter TestExpression("a = b"); } + [Test] + public void UnaryOperator() + { + TestExpression("a = -b"); + } + + [Test] + public void BlockStatements() + { + TestStatement("checked { }"); + TestStatement("unchecked { }"); + TestStatement("unsafe { }"); + } + + [Test] + public void ExceptionHandling() + { + TestStatement("try { throw new Exception(); } " + + "catch (FirstException e) { } " + + "catch (SecondException) { } " + + "catch { throw; } " + + "finally { }"); + } + + [Test] + public void LoopStatements() + { + TestStatement("foreach (Type var in col) { }"); + TestStatement("while (true) { }"); + TestStatement("do { } while (true);"); + } + + [Test] + public void SizeOf() + { + TestExpression("sizeof(IntPtr)"); + } + + [Test] + public void ParenthesizedExpression() + { + TestExpression("(a)"); + } + + [Test] + public void MethodOnGenericClass() + { + TestExpression("Container.CreateInstance()"); + } + + [Test] + public void EmptyStatement() + { + TestStatement(";"); + } + + [Test] + public void Yield() + { + TestStatement("yield break;"); + TestStatement("yield return null;"); + } + [Test] public void Integer() { @@ -191,6 +269,12 @@ namespace ICSharpCode.NRefactory.Tests.PrettyPrinter TestExpression("@class"); } + [Test] + public void InnerClassTypeReference() + { + TestExpression("typeof(List.Enumerator)"); + } + [Test] public void GenericDelegate() { @@ -247,5 +331,12 @@ namespace ICSharpCode.NRefactory.Tests.PrettyPrinter " string InterfaceMethod2();\n" + "}"); } + + [Test] + public void IndexerDeclaration() + { + TestTypeMember("public string this[int index] { get { return index.ToString(); } set { } }"); + TestTypeMember("public string IList.this[int index] { get { return index.ToString(); } set { } }"); + } } } diff --git a/src/Libraries/NRefactory/Test/Output/CSharp/VBToCSharpConverterTest.cs b/src/Libraries/NRefactory/Test/Output/CSharp/VBToCSharpConverterTest.cs index 5d4f688961..0448885f16 100644 --- a/src/Libraries/NRefactory/Test/Output/CSharp/VBToCSharpConverterTest.cs +++ b/src/Libraries/NRefactory/Test/Output/CSharp/VBToCSharpConverterTest.cs @@ -75,6 +75,23 @@ namespace ICSharpCode.NRefactory.Tests.PrettyPrinter TestProgram("Class tmp1 \n Sub tmp2() \n" + input + "\n End Sub \n End Class", b.ToString()); } + [Test] + public void ReferenceEquality() + { + TestStatement("b = a Is Nothing", + "b = a == null;"); + TestStatement("b = a IsNot Nothing", + "b = a != null;"); + TestStatement("b = Nothing Is a", + "b = null == a;"); + TestStatement("b = Nothing IsNot a", + "b = null != a;"); + TestStatement("c = a Is b", + "c = object.ReferenceEquals(a, b);"); + TestStatement("c = a IsNot b", + "c = !object.ReferenceEquals(a, b);"); + } + [Test] public void AddHandler() { @@ -100,6 +117,13 @@ namespace ICSharpCode.NRefactory.Tests.PrettyPrinter "if (someEvent != null) {\n\tsomeEvent(this, EventArgs.Empty);\n}"); } + [Test] + public void EraseStatement() + { + TestStatement("Erase a, b", + "a = null;\nb = null;"); + } + [Test] public void StaticMethod() { @@ -107,6 +131,13 @@ namespace ICSharpCode.NRefactory.Tests.PrettyPrinter "public static void A()\n{\n}"); } + [Test] + public void Property() + { + TestMember("ReadOnly Property A()\nGet\nReturn Nothing\nEnd Get\nEnd Property", + "public object A {\n\tget {\n\t\treturn null;\n\t}\n}"); + } + [Test] public void PInvoke() { @@ -120,11 +151,42 @@ namespace ICSharpCode.NRefactory.Tests.PrettyPrinter "static extern IntPtr SendMessage(IntPtr hWnd, int Msg, UIntPtr wParam, IntPtr lParam);", "System.Runtime.InteropServices"); + TestMember("Declare Auto Function SendMessage Lib \"user32.dll\" (ByVal hWnd As IntPtr, ByVal Msg As Integer, ByVal wParam As UIntPtr, ByVal lParam As IntPtr) As IntPtr", + "[DllImport(\"user32.dll\", CharSet = CharSet.Auto, SetLastError = true, ExactSpelling = true)]\n" + + "static extern IntPtr SendMessage(IntPtr hWnd, int Msg, UIntPtr wParam, IntPtr lParam);", + "System.Runtime.InteropServices"); + TestMember(" _\n" + "Shared Function MessageBox(ByVal hwnd As IntPtr, ByVal t As String, ByVal caption As String, ByVal t2 As UInt32) As Integer\n" + "End Function", "[DllImport(\"user32.dll\", CharSet = CharSet.Auto)]\n" + "public static extern int MessageBox(IntPtr hwnd, string t, string caption, UInt32 t2);"); } + + [Test] + public void Constructor() + { + TestMember("Sub New()\n\tMyBase.New(1)\nEnd Sub", + "public tmp1() : base(1)\n{\n}"); + TestMember("Public Sub New()\n\tMe.New(1)\nEnd Sub", + "public tmp1() : this(1)\n{\n}"); + } + + [Test] + public void Destructor() + { + TestMember("Protected Overrides Sub Finalize()\n" + + "\tTry\n" + + "\t\tDead()\n" + + "\tFinally\n" + + "\t\tMyBase.Finalize()\n" + + "\tEnd Try\n" + + "End Sub", + + "~tmp1()\n" + + "{\n" + + "\tDead();\n" + + "}"); + } } } diff --git a/src/Libraries/NRefactory/Test/Output/SpecialOutputVisitor.cs b/src/Libraries/NRefactory/Test/Output/SpecialOutputVisitor.cs new file mode 100644 index 0000000000..5d98507f83 --- /dev/null +++ b/src/Libraries/NRefactory/Test/Output/SpecialOutputVisitor.cs @@ -0,0 +1,67 @@ +/* + * Created by SharpDevelop. + * User: Daniel Grunwald + * Date: 06.02.2006 + * Time: 14:41 + */ + +using System; +using System.IO; +using NUnit.Framework; +using ICSharpCode.NRefactory.Parser; +using ICSharpCode.NRefactory.Parser.AST; +using ICSharpCode.NRefactory.PrettyPrinter; + +namespace ICSharpCode.NRefactory.Tests.PrettyPrinter +{ + [TestFixture] + public class SpecialOutputVisitorTest + { + void TestProgram(string program) + { + IParser parser = ParserFactory.CreateParser(SupportedLanguage.CSharp, new StringReader(program)); + parser.Parse(); + Assert.AreEqual("", parser.Errors.ErrorOutput); + CSharpOutputVisitor outputVisitor = new CSharpOutputVisitor(); + using (SpecialNodesInserter.Install(parser.Lexer.SpecialTracker.RetrieveSpecials(), + outputVisitor)) { + outputVisitor.Visit(parser.CompilationUnit, null); + } + Assert.AreEqual("", outputVisitor.Errors.ErrorOutput); + Assert.AreEqual(program, outputVisitor.Text.TrimEnd().Replace("\r", "")); + parser.Dispose(); + } + + [Test] + public void SimpleComments() + { + TestProgram("// before class\n" + + "class A\n" + + "{\n" + + "\t// in class\n" + + "}\n" + + "// after class"); + } + + [Test, Ignore("Requires BlankLine to work correctly")] + public void BlockComment() + { + TestProgram("/* before class */\n" + + "class A\n" + + "{\n" + + "\t/* in class */\n" + + "}\n" + + "/* after class */"); + } + + [Test] + public void PreProcessing() + { + TestProgram("#if WITH_A\n" + + "class A\n" + + "{\n" + + "}\n" + + "#end if"); + } + } +} diff --git a/src/Libraries/NRefactory/Test/Output/VBNet/CSharpToVBConverterTest.cs b/src/Libraries/NRefactory/Test/Output/VBNet/CSharpToVBConverterTest.cs index 74827f7321..892065d31f 100644 --- a/src/Libraries/NRefactory/Test/Output/VBNet/CSharpToVBConverterTest.cs +++ b/src/Libraries/NRefactory/Test/Output/VBNet/CSharpToVBConverterTest.cs @@ -215,5 +215,56 @@ namespace ICSharpCode.NRefactory.Tests.PrettyPrinter "public static extern IntPtr SendMessage(IntPtr hWnd, int Msg, UIntPtr wParam, IntPtr lParam);", "Public Declare Auto Function SendMessage Lib \"user32.dll\" Alias \"SendMessageW\" (ByVal hWnd As IntPtr, ByVal Msg As Integer, ByVal wParam As UIntPtr, ByVal lParam As IntPtr) As IntPtr"); } + + [Test] + public void Constructor() + { + TestMember("public tmp1() : base(1) { }", + "Public Sub New()\n\tMyBase.New(1)\nEnd Sub"); + TestMember("public tmp1() : this(1) { }", + "Public Sub New()\n\tMe.New(1)\nEnd Sub"); + } + + [Test] + public void Destructor() + { + TestMember("~tmp1() { Dead(); }", + "Protected Overrides Sub Finalize()\n" + + "\tTry\n" + + "\t\tDead()\n" + + "\tFinally\n" + + "\t\tMyBase.Finalize()\n" + + "\tEnd Try\n" + + "End Sub"); + } + + [Test] + public void RenameConflictingNames() + { + TestMember("int count;" + + "public int Count { get { return count; } }" + + "void Test1(int count) { count = 3; }" + + "void Test2() { int count; count = 3; }" + + "void Test3() { foreach (int count in someList) { count = 3; } }", + + "Private m_count As Integer\n" + + "Public ReadOnly Property Count() As Integer\n" + + "\tGet\n" + + "\t\tReturn m_count\n" + + "\tEnd Get\n" + + "End Property\n" + + "Private Sub Test1(ByVal count As Integer)\n" + + "\tcount = 3\n" + + "End Sub\n" + + "Private Sub Test2()\n" + + "\tDim count As Integer\n" + + "\tcount = 3\n" + + "End Sub\n" + + "Private Sub Test3()\n" + + "\tFor Each count As Integer In someList\n" + + "\t\tcount = 3\n" + + "\tNext\n" + + "End Sub"); + } } }