Browse Source

Fixed CSharpExpressionFinder

git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/trunk@2535 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61
shortcuts
Daniel Grunwald 18 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 { @@ -172,7 +172,7 @@ class Main {
public void GlobalNamespace()
{
// 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, "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 @@ -291,7 +291,11 @@ namespace ICSharpCode.SharpDevelop.Dom.CSharp
if (Tokens.ValidInsideTypeName[lastToken]) {
frame = new Frame(frame);
frame.bracketType = '<';
frame.SetContext(ExpressionContext.Type);
if (frame.parent.type == FrameType.Statements) {
frame.SetContext(ExpressionContext.Default);
} else {
frame.SetContext(ExpressionContext.Type);
}
}
break;
case Tokens.GreaterThan:
@ -439,7 +443,8 @@ namespace ICSharpCode.SharpDevelop.Dom.CSharp @@ -439,7 +443,8 @@ namespace ICSharpCode.SharpDevelop.Dom.CSharp
Frame resultFrame = frame;
int resultStartOffset = -1;
int resultEndOffset = -1;
ExpressionContext context = ExpressionContext.Default;
ExpressionContext prevContext = ExpressionContext.Default;
ExpressionContext resultContext = ExpressionContext.Default;
Token token;
while ((token = lexer.NextToken()) != null) {
@ -448,7 +453,7 @@ namespace ICSharpCode.SharpDevelop.Dom.CSharp @@ -448,7 +453,7 @@ namespace ICSharpCode.SharpDevelop.Dom.CSharp
if (state == SEARCHING_OFFSET) {
if (targetPosition < token.Location) {
resultFrame = frame;
context = frame.context;
resultContext = frame.context;
resultStartOffset = LocationToOffset(frame.lastExpressionStart);
if (resultStartOffset < 0)
break;
@ -456,11 +461,12 @@ namespace ICSharpCode.SharpDevelop.Dom.CSharp @@ -456,11 +461,12 @@ namespace ICSharpCode.SharpDevelop.Dom.CSharp
state = SEARCHING_END;
}
}
prevContext = frame.context;
ApplyToken(token);
if (state == SEARCHING_OFFSET) {
if (targetPosition < token.EndLocation) {
resultFrame = frame;
context = frame.context;
resultContext = prevContext;
resultStartOffset = LocationToOffset(frame.lastExpressionStart);
resultEndOffset = LocationToOffset(token.EndLocation);
if (resultStartOffset < 0)
@ -472,13 +478,17 @@ namespace ICSharpCode.SharpDevelop.Dom.CSharp @@ -472,13 +478,17 @@ namespace ICSharpCode.SharpDevelop.Dom.CSharp
resultStartOffset != LocationToOffset(resultFrame.lastExpressionStart) ||
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]) {
// the expression got aborted because of an identifier. This means the
// 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 {
resultEndOffset = LocationToOffset(token.EndLocation);
}

Loading…
Cancel
Save