Browse Source

Fixed code completion after string literals ("hello, world".Length), fixed code completion in object initializers that use binary operators in the value (new MyType { P1 = someValue + someOtherValue }).

git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/trunk@2731 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61
shortcuts
Daniel Grunwald 18 years ago
parent
commit
b6c95c8c87
  1. 3
      src/Main/Base/Project/Src/Gui/AbstractPadContent.cs
  2. 8
      src/Main/Base/Project/Src/Gui/Pads/DefinitionViewPad.cs
  3. 24
      src/Main/Base/Test/CSharpExpressionFinderTests.cs
  4. 20
      src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/CSharp/ExpressionFinder.cs

3
src/Main/Base/Project/Src/Gui/AbstractPadContent.cs

@ -26,7 +26,8 @@ namespace ICSharpCode.SharpDevelop.Gui
public bool IsVisible { public bool IsVisible {
get { get {
return Control.Visible && Control.Width > 0 && Control.Height > 0; Control ctl = this.Control;
return ctl.Visible && ctl.Width > 0 && ctl.Height > 0;
} }
} }
} }

8
src/Main/Base/Project/Src/Gui/Pads/DefinitionViewPad.cs

@ -98,12 +98,8 @@ namespace ICSharpCode.SharpDevelop.Gui
if (expressionFinder == null) return null; if (expressionFinder == null) return null;
Caret caret = ctl.ActiveTextAreaControl.Caret; Caret caret = ctl.ActiveTextAreaControl.Caret;
string content = (e == null) ? ctl.Text : e.Content; string content = (e == null) ? ctl.Text : e.Content;
if (caret.Offset >= content.Length) { if (caret.Offset > content.Length) {
#if DEBUG LoggingService.Debug("caret.Offset = " + caret.Offset + ", content.Length=" + content.Length);
// the caret offset should not be invalid here - try to find out the when the text editor
// doesn't validate the caret position
System.Diagnostics.Debugger.Break();
#endif
return null; return null;
} }
ExpressionResult expr = expressionFinder.FindFullExpression(content, caret.Offset); ExpressionResult expr = expressionFinder.FindFullExpression(content, caret.Offset);

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

@ -615,6 +615,18 @@ class Main {
Assert.AreEqual(ExpressionContext.Default, result.Context); Assert.AreEqual(ExpressionContext.Default, result.Context);
} }
[Test]
public void ObjectInitializer5b()
{
const string program = @"using System;
class Main {
void M() {
a = new MyType { P1 = someBoolean == ";
ExpressionResult result = ef.FindExpression(program, program.Length);
Assert.AreEqual(ExpressionContext.Default, result.Context);
}
[Test] [Test]
public void ObjectInitializer6() public void ObjectInitializer6()
{ {
@ -798,6 +810,18 @@ class Main {
ExpressionResult result = ef.FindExpression(program, program.Length); ExpressionResult result = ef.FindExpression(program, program.Length);
Assert.AreEqual(ExpressionContext.MethodBody, result.Context); Assert.AreEqual(ExpressionContext.MethodBody, result.Context);
} }
[Test]
public void StringLiteral()
{
const string program = @"using System;
class Main {
string a = ""hello, world!""";
ExpressionResult result = ef.FindExpression(program, program.Length);
Assert.AreEqual("\"hello, world!\"", result.Expression);
Assert.AreEqual(ExpressionContext.Default, result.Context);
}
} }
} }

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

@ -111,7 +111,11 @@ namespace ICSharpCode.SharpDevelop.Dom.CSharp
/// <summary> /// <summary>
/// Between "new" and "(" / "{". /// Between "new" and "(" / "{".
/// </summary> /// </summary>
ObjectCreation ObjectCreation,
/// <summary>
/// In object initializer, in the value part (after "=")
/// </summary>
ObjectInitializerValue
} }
/// <summary> /// <summary>
@ -195,7 +199,11 @@ namespace ICSharpCode.SharpDevelop.Dom.CSharp
SetContext(ExpressionContext.ParameterType); SetContext(ExpressionContext.ParameterType);
break; break;
case FrameType.ObjectInitializer: case FrameType.ObjectInitializer:
SetContext(ExpressionContext.ObjectInitializer); if (state == FrameState.ObjectInitializerValue) {
SetContext(ExpressionContext.Default);
} else {
SetContext(ExpressionContext.ObjectInitializer);
}
break; break;
case FrameType.AttributeSection: case FrameType.AttributeSection:
SetContext(ExpressionContext.Attribute); SetContext(ExpressionContext.Attribute);
@ -420,7 +428,7 @@ namespace ICSharpCode.SharpDevelop.Dom.CSharp
} }
frame.lastExpressionStart = token.Location; frame.lastExpressionStart = token.Location;
} }
} else if (Tokens.SimpleTypeName[token.kind] || Tokens.ExpressionStart[token.kind]) { } else if (Tokens.SimpleTypeName[token.kind] || Tokens.ExpressionStart[token.kind] || token.kind == Tokens.Literal) {
frame.lastExpressionStart = token.Location; frame.lastExpressionStart = token.Location;
} else { } else {
frame.lastExpressionStart = Location.Empty; frame.lastExpressionStart = Location.Empty;
@ -488,7 +496,8 @@ namespace ICSharpCode.SharpDevelop.Dom.CSharp
frame.ResetCurlyChildType(); frame.ResetCurlyChildType();
break; break;
} else if (frame.type == FrameType.ObjectInitializer) { } else if (frame.type == FrameType.ObjectInitializer) {
frame.SetContext(ExpressionContext.Default); frame.state = FrameState.ObjectInitializerValue;
frame.SetDefaultContext();
break; break;
} else { } else {
goto default; goto default;
@ -551,6 +560,9 @@ namespace ICSharpCode.SharpDevelop.Dom.CSharp
if (frame.state == FrameState.FieldDecl || frame.state == FrameState.Initializer) { if (frame.state == FrameState.FieldDecl || frame.state == FrameState.Initializer) {
frame.state = FrameState.FieldDecl; frame.state = FrameState.FieldDecl;
frame.SetContext(ExpressionContext.IdentifierExpected); frame.SetContext(ExpressionContext.IdentifierExpected);
} else if (frame.state == FrameState.ObjectInitializerValue) {
frame.state = FrameState.Normal;
frame.SetDefaultContext();
} }
break; break;
case Tokens.Where: case Tokens.Where:

Loading…
Cancel
Save