Browse Source

Fixed CSharpExpressionFinder

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

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

@ -172,7 +172,7 @@ class Main {
public void GlobalNamespace() public void GlobalNamespace()
{ {
// context = context after the found word // context = context after the found word
FindFull(program3, "global", "global", ExpressionContext.IdentifierExpected); FindFull(program3, "global", "global", ExpressionContext.FirstParameterType);
FindFull(program3, "System.Ex", "global::System", ExpressionContext.IdentifierExpected); FindFull(program3, "System.Ex", "global::System", ExpressionContext.IdentifierExpected);
FindFull(program3, "Excep", "global::System.Exception", ExpressionContext.Type); FindFull(program3, "Excep", "global::System.Exception", ExpressionContext.Type);
} }

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

@ -291,7 +291,11 @@ namespace ICSharpCode.SharpDevelop.Dom.CSharp
if (Tokens.ValidInsideTypeName[lastToken]) { if (Tokens.ValidInsideTypeName[lastToken]) {
frame = new Frame(frame); frame = new Frame(frame);
frame.bracketType = '<'; frame.bracketType = '<';
frame.SetContext(ExpressionContext.Type); if (frame.parent.type == FrameType.Statements) {
frame.SetContext(ExpressionContext.Default);
} else {
frame.SetContext(ExpressionContext.Type);
}
} }
break; break;
case Tokens.GreaterThan: case Tokens.GreaterThan:
@ -439,7 +443,8 @@ namespace ICSharpCode.SharpDevelop.Dom.CSharp
Frame resultFrame = frame; Frame resultFrame = frame;
int resultStartOffset = -1; int resultStartOffset = -1;
int resultEndOffset = -1; int resultEndOffset = -1;
ExpressionContext context = ExpressionContext.Default; ExpressionContext prevContext = ExpressionContext.Default;
ExpressionContext resultContext = ExpressionContext.Default;
Token token; Token token;
while ((token = lexer.NextToken()) != null) { while ((token = lexer.NextToken()) != null) {
@ -448,7 +453,7 @@ namespace ICSharpCode.SharpDevelop.Dom.CSharp
if (state == SEARCHING_OFFSET) { if (state == SEARCHING_OFFSET) {
if (targetPosition < token.Location) { if (targetPosition < token.Location) {
resultFrame = frame; resultFrame = frame;
context = frame.context; resultContext = frame.context;
resultStartOffset = LocationToOffset(frame.lastExpressionStart); resultStartOffset = LocationToOffset(frame.lastExpressionStart);
if (resultStartOffset < 0) if (resultStartOffset < 0)
break; break;
@ -456,11 +461,12 @@ namespace ICSharpCode.SharpDevelop.Dom.CSharp
state = SEARCHING_END; state = SEARCHING_END;
} }
} }
prevContext = frame.context;
ApplyToken(token); ApplyToken(token);
if (state == SEARCHING_OFFSET) { if (state == SEARCHING_OFFSET) {
if (targetPosition < token.EndLocation) { if (targetPosition < token.EndLocation) {
resultFrame = frame; resultFrame = frame;
context = frame.context; resultContext = prevContext;
resultStartOffset = LocationToOffset(frame.lastExpressionStart); resultStartOffset = LocationToOffset(frame.lastExpressionStart);
resultEndOffset = LocationToOffset(token.EndLocation); resultEndOffset = LocationToOffset(token.EndLocation);
if (resultStartOffset < 0) if (resultStartOffset < 0)
@ -472,13 +478,17 @@ namespace ICSharpCode.SharpDevelop.Dom.CSharp
resultStartOffset != LocationToOffset(resultFrame.lastExpressionStart) || resultStartOffset != LocationToOffset(resultFrame.lastExpressionStart) ||
token.kind == Tokens.Dot || token.kind == Tokens.DoubleColon) token.kind == Tokens.Dot || token.kind == Tokens.DoubleColon)
{ {
// now we can change the context based on the next token
if (frame == resultFrame && Tokens.IdentifierTokens[token.kind]) { if (frame == resultFrame && Tokens.IdentifierTokens[token.kind]) {
// the expression got aborted because of an identifier. This means the // the expression got aborted because of an identifier. This means the
// expression was a type reference // expression was a type reference
context = ExpressionContext.Type; resultContext = ExpressionContext.Type;
} else if (resultFrame.bracketType == '<' && token.kind == Tokens.GreaterThan) {
// expression was a type argument
resultContext = ExpressionContext.Type;
} }
return new ExpressionResult(text.Substring(resultStartOffset, resultEndOffset - resultStartOffset), context); return new ExpressionResult(text.Substring(resultStartOffset, resultEndOffset - resultStartOffset), resultContext);
} else { } else {
resultEndOffset = LocationToOffset(token.EndLocation); resultEndOffset = LocationToOffset(token.EndLocation);
} }

Loading…
Cancel
Save