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);
}