diff --git a/src/Main/Base/Test/CSharpExpressionFinderTests.cs b/src/Main/Base/Test/CSharpExpressionFinderTests.cs index fdfd678cdf..8af2ece4b9 100644 --- a/src/Main/Base/Test/CSharpExpressionFinderTests.cs +++ b/src/Main/Base/Test/CSharpExpressionFinderTests.cs @@ -240,6 +240,51 @@ class Main { { FindFull(program3, "oo2)", "foo2", ExpressionContext.Default); } + + + [Test] + public void NestedClass() + { + const string nestedClassProgram = @"using System; using System.Collections.Generic; +class Main { + /* in main */ + class Nested { + /* in nested */ + } + /* still in main */ + enum NestedEnum { + /* in enum */ + } +}"; + + FindExpr(nestedClassProgram, "\t/* in main", null, ExpressionContext.TypeDeclaration); + FindExpr(nestedClassProgram, "\t/* in nested ", null, ExpressionContext.TypeDeclaration); + FindExpr(nestedClassProgram, "\t/* still in main", null, ExpressionContext.TypeDeclaration); + FindExpr(nestedClassProgram, "\t/* in enum", null, ExpressionContext.IdentifierExpected); + } + + [Test] + public void PropertyClass() + { + const string propertyProgram = @"using System; using System.Collections.Generic; +class Main { + public int Prop { + /* in prop */ + get { + /* in getter */ + } + set { + /* in setter */ + } + /* still in prop */ + } +}"; + + FindExpr(propertyProgram, "\t/* in prop", null, ExpressionContext.PropertyDeclaration); + FindExpr(propertyProgram, "\t/* in getter ", null, ExpressionContext.MethodBody); + FindExpr(propertyProgram, "\t/* in setter", null, ExpressionContext.MethodBody); + FindExpr(propertyProgram, "\t/* still in prop", null, ExpressionContext.PropertyDeclaration); + } } } diff --git a/src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/CSharp/ExpressionFinder.cs b/src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/CSharp/ExpressionFinder.cs index 0745ee6dc9..b9911f48e8 100644 --- a/src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/CSharp/ExpressionFinder.cs +++ b/src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/CSharp/ExpressionFinder.cs @@ -87,6 +87,10 @@ namespace ICSharpCode.SharpDevelop.Dom.CSharp /// parsing a field initializer (TypeDecl) /// Initializer, + /// + /// Between class/struct/enum keyword and body of the type declaration + /// + TypeDecl } /// @@ -167,6 +171,14 @@ namespace ICSharpCode.SharpDevelop.Dom.CSharp this.parent = parent; if (parent != null) { this.type = parent.childType; + } + ResetChildType(); + SetDefaultContext(); + } + + public void ResetChildType() + { + if (parent != null) { switch (this.type) { case FrameType.Property: case FrameType.Event: @@ -176,8 +188,9 @@ namespace ICSharpCode.SharpDevelop.Dom.CSharp this.childType = this.type; break; } + } else { + this.childType = this.type; } - SetDefaultContext(); } } @@ -258,7 +271,7 @@ namespace ICSharpCode.SharpDevelop.Dom.CSharp case Tokens.OpenCurlyBrace: frame.lastExpressionStart = Location.Empty; frame = new Frame(frame); - frame.parent.childType = frame.parent.type; + frame.parent.ResetChildType(); frame.bracketType = '{'; break; case Tokens.CloseCurlyBrace: @@ -375,18 +388,21 @@ namespace ICSharpCode.SharpDevelop.Dom.CSharp case Tokens.Class: case Tokens.Struct: if (frame.type == FrameType.Global || frame.type == FrameType.TypeDecl) { + frame.state = FrameState.TypeDecl; frame.childType = FrameType.TypeDecl; frame.SetContext(ExpressionContext.IdentifierExpected); } break; case Tokens.Interface: if (frame.type == FrameType.Global || frame.type == FrameType.TypeDecl) { + frame.state = FrameState.TypeDecl; frame.childType = FrameType.Interface; frame.SetContext(ExpressionContext.IdentifierExpected); } break; case Tokens.Enum: if (frame.type == FrameType.Global || frame.type == FrameType.TypeDecl) { + frame.state = FrameState.TypeDecl; frame.childType = FrameType.Enum; frame.SetContext(ExpressionContext.IdentifierExpected); }