Browse Source

r7319@daniel-notebook (orig r3350): daniel | 2008-08-14 16:05:14 +0200

Fixed SD2-1440: C# expression finder fails when cast follows if statement


git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/trunk@3352 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61
shortcuts
Daniel Grunwald 17 years ago
parent
commit
5d2378597d
  1. 26
      src/Main/Base/Test/CSharpExpressionFinderTests.cs
  2. 21
      src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/CSharp/ExpressionFinder.cs

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

@ -1091,6 +1091,32 @@ void Test<T>(ref T name) where "; @@ -1091,6 +1091,32 @@ void Test<T>(ref T name) where ";
Assert.AreEqual("where ", result.Expression);
Assert.AreEqual(ExpressionContext.Constraints, result.Context);
}
[Test]
public void FindFullExpressionAfterCastAfterForLoop()
{
const string program = @"using System; using System.Text;
class Main {
void M() {
for (;;) ((TargetType)variable).MethodCall()
}}";
ExpressionResult result = ef.FindFullExpression(program, program.IndexOf("Call"));
Assert.AreEqual(" ((TargetType)variable).MethodCall()", result.Expression);
}
[Test]
public void FindFullExpressionAfterCastAfterCondition()
{
const string program = @"using System; using System.Text;
class Main {
void M() {
if (true) ((TargetType)variable).MethodCall()
}}";
ExpressionResult result = ef.FindFullExpression(program, program.IndexOf("Call"));
Assert.AreEqual(" ((TargetType)variable).MethodCall()", result.Expression);
}
}
}

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

@ -163,7 +163,11 @@ namespace ICSharpCode.SharpDevelop.Dom.CSharp @@ -163,7 +163,11 @@ namespace ICSharpCode.SharpDevelop.Dom.CSharp
/// <summary>
/// In object initializer, in the value part (after "=")
/// </summary>
ObjectInitializerValue
ObjectInitializerValue,
/// <summary>
/// After a keyword like "if","while","using" etc., but before the embedded statement.
/// </summary>
StatementWithEmbeddedStatement
}
/// <summary>
@ -540,6 +544,15 @@ namespace ICSharpCode.SharpDevelop.Dom.CSharp @@ -540,6 +544,15 @@ namespace ICSharpCode.SharpDevelop.Dom.CSharp
case Tokens.Catch:
if (frame.type == FrameType.Statements) {
frame.parenthesisChildType = FrameType.Statements;
frame.state = FrameState.StatementWithEmbeddedStatement;
}
break;
case Tokens.If:
case Tokens.While:
case Tokens.Switch:
case Tokens.Lock:
if (frame.type == FrameType.Statements) {
frame.state = FrameState.StatementWithEmbeddedStatement;
}
break;
case Tokens.Throw:
@ -667,6 +680,12 @@ namespace ICSharpCode.SharpDevelop.Dom.CSharp @@ -667,6 +680,12 @@ namespace ICSharpCode.SharpDevelop.Dom.CSharp
frame.parent.curlyChildType = FrameType.Statements;
}
break;
case Tokens.CloseParenthesis:
if (frame.state == FrameState.StatementWithEmbeddedStatement) {
frame.state = FrameState.Normal;
frame.lastExpressionStart = token.EndLocation;
}
break;
case Tokens.Question:
// IdentifierExpected = this is after a type name = the ? was a nullable marker
if (frame.context != ExpressionContext.IdentifierExpected) {

Loading…
Cancel
Save