Browse Source

Fixed two problems in C# expression finder (wrong context detected for property setters and nested types)

git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/trunk@2620 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61
shortcuts
Daniel Grunwald 18 years ago
parent
commit
ecfed88c5b
  1. 45
      src/Main/Base/Test/CSharpExpressionFinderTests.cs
  2. 20
      src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/CSharp/ExpressionFinder.cs

45
src/Main/Base/Test/CSharpExpressionFinderTests.cs

@ -240,6 +240,51 @@ class Main {
{ {
FindFull(program3, "oo2)", "foo2", ExpressionContext.Default); 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);
}
} }
} }

20
src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/CSharp/ExpressionFinder.cs

@ -87,6 +87,10 @@ namespace ICSharpCode.SharpDevelop.Dom.CSharp
/// parsing a field initializer (TypeDecl) /// parsing a field initializer (TypeDecl)
/// </summary> /// </summary>
Initializer, Initializer,
/// <summary>
/// Between class/struct/enum keyword and body of the type declaration
/// </summary>
TypeDecl
} }
/// <summary> /// <summary>
@ -167,6 +171,14 @@ namespace ICSharpCode.SharpDevelop.Dom.CSharp
this.parent = parent; this.parent = parent;
if (parent != null) { if (parent != null) {
this.type = parent.childType; this.type = parent.childType;
}
ResetChildType();
SetDefaultContext();
}
public void ResetChildType()
{
if (parent != null) {
switch (this.type) { switch (this.type) {
case FrameType.Property: case FrameType.Property:
case FrameType.Event: case FrameType.Event:
@ -176,8 +188,9 @@ namespace ICSharpCode.SharpDevelop.Dom.CSharp
this.childType = this.type; this.childType = this.type;
break; break;
} }
} else {
this.childType = this.type;
} }
SetDefaultContext();
} }
} }
@ -258,7 +271,7 @@ namespace ICSharpCode.SharpDevelop.Dom.CSharp
case Tokens.OpenCurlyBrace: case Tokens.OpenCurlyBrace:
frame.lastExpressionStart = Location.Empty; frame.lastExpressionStart = Location.Empty;
frame = new Frame(frame); frame = new Frame(frame);
frame.parent.childType = frame.parent.type; frame.parent.ResetChildType();
frame.bracketType = '{'; frame.bracketType = '{';
break; break;
case Tokens.CloseCurlyBrace: case Tokens.CloseCurlyBrace:
@ -375,18 +388,21 @@ namespace ICSharpCode.SharpDevelop.Dom.CSharp
case Tokens.Class: case Tokens.Class:
case Tokens.Struct: case Tokens.Struct:
if (frame.type == FrameType.Global || frame.type == FrameType.TypeDecl) { if (frame.type == FrameType.Global || frame.type == FrameType.TypeDecl) {
frame.state = FrameState.TypeDecl;
frame.childType = FrameType.TypeDecl; frame.childType = FrameType.TypeDecl;
frame.SetContext(ExpressionContext.IdentifierExpected); frame.SetContext(ExpressionContext.IdentifierExpected);
} }
break; break;
case Tokens.Interface: case Tokens.Interface:
if (frame.type == FrameType.Global || frame.type == FrameType.TypeDecl) { if (frame.type == FrameType.Global || frame.type == FrameType.TypeDecl) {
frame.state = FrameState.TypeDecl;
frame.childType = FrameType.Interface; frame.childType = FrameType.Interface;
frame.SetContext(ExpressionContext.IdentifierExpected); frame.SetContext(ExpressionContext.IdentifierExpected);
} }
break; break;
case Tokens.Enum: case Tokens.Enum:
if (frame.type == FrameType.Global || frame.type == FrameType.TypeDecl) { if (frame.type == FrameType.Global || frame.type == FrameType.TypeDecl) {
frame.state = FrameState.TypeDecl;
frame.childType = FrameType.Enum; frame.childType = FrameType.Enum;
frame.SetContext(ExpressionContext.IdentifierExpected); frame.SetContext(ExpressionContext.IdentifierExpected);
} }

Loading…
Cancel
Save