From b6c95c8c87ae99fdb21436a33838686e6ea1b4dd Mon Sep 17 00:00:00 2001 From: Daniel Grunwald Date: Sat, 27 Oct 2007 15:37:02 +0000 Subject: [PATCH] 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 --- .../Project/Src/Gui/AbstractPadContent.cs | 3 ++- .../Project/Src/Gui/Pads/DefinitionViewPad.cs | 8 ++----- .../Base/Test/CSharpExpressionFinderTests.cs | 24 +++++++++++++++++++ .../Project/Src/CSharp/ExpressionFinder.cs | 20 ++++++++++++---- 4 files changed, 44 insertions(+), 11 deletions(-) diff --git a/src/Main/Base/Project/Src/Gui/AbstractPadContent.cs b/src/Main/Base/Project/Src/Gui/AbstractPadContent.cs index e63baea272..9bc0fb133b 100644 --- a/src/Main/Base/Project/Src/Gui/AbstractPadContent.cs +++ b/src/Main/Base/Project/Src/Gui/AbstractPadContent.cs @@ -26,7 +26,8 @@ namespace ICSharpCode.SharpDevelop.Gui public bool IsVisible { get { - return Control.Visible && Control.Width > 0 && Control.Height > 0; + Control ctl = this.Control; + return ctl.Visible && ctl.Width > 0 && ctl.Height > 0; } } } diff --git a/src/Main/Base/Project/Src/Gui/Pads/DefinitionViewPad.cs b/src/Main/Base/Project/Src/Gui/Pads/DefinitionViewPad.cs index 5be81453b1..2877a14dbd 100644 --- a/src/Main/Base/Project/Src/Gui/Pads/DefinitionViewPad.cs +++ b/src/Main/Base/Project/Src/Gui/Pads/DefinitionViewPad.cs @@ -98,12 +98,8 @@ namespace ICSharpCode.SharpDevelop.Gui if (expressionFinder == null) return null; Caret caret = ctl.ActiveTextAreaControl.Caret; string content = (e == null) ? ctl.Text : e.Content; - if (caret.Offset >= content.Length) { - #if DEBUG - // 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 + if (caret.Offset > content.Length) { + LoggingService.Debug("caret.Offset = " + caret.Offset + ", content.Length=" + content.Length); return null; } ExpressionResult expr = expressionFinder.FindFullExpression(content, caret.Offset); diff --git a/src/Main/Base/Test/CSharpExpressionFinderTests.cs b/src/Main/Base/Test/CSharpExpressionFinderTests.cs index 443475d71e..72d5975d72 100644 --- a/src/Main/Base/Test/CSharpExpressionFinderTests.cs +++ b/src/Main/Base/Test/CSharpExpressionFinderTests.cs @@ -615,6 +615,18 @@ class Main { 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] public void ObjectInitializer6() { @@ -798,6 +810,18 @@ class Main { ExpressionResult result = ef.FindExpression(program, program.Length); 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); + } } } diff --git a/src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/CSharp/ExpressionFinder.cs b/src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/CSharp/ExpressionFinder.cs index a552daaf6f..15e0dfada7 100644 --- a/src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/CSharp/ExpressionFinder.cs +++ b/src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/CSharp/ExpressionFinder.cs @@ -111,7 +111,11 @@ namespace ICSharpCode.SharpDevelop.Dom.CSharp /// /// Between "new" and "(" / "{". /// - ObjectCreation + ObjectCreation, + /// + /// In object initializer, in the value part (after "=") + /// + ObjectInitializerValue } /// @@ -195,7 +199,11 @@ namespace ICSharpCode.SharpDevelop.Dom.CSharp SetContext(ExpressionContext.ParameterType); break; case FrameType.ObjectInitializer: - SetContext(ExpressionContext.ObjectInitializer); + if (state == FrameState.ObjectInitializerValue) { + SetContext(ExpressionContext.Default); + } else { + SetContext(ExpressionContext.ObjectInitializer); + } break; case FrameType.AttributeSection: SetContext(ExpressionContext.Attribute); @@ -420,7 +428,7 @@ namespace ICSharpCode.SharpDevelop.Dom.CSharp } 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; } else { frame.lastExpressionStart = Location.Empty; @@ -488,7 +496,8 @@ namespace ICSharpCode.SharpDevelop.Dom.CSharp frame.ResetCurlyChildType(); break; } else if (frame.type == FrameType.ObjectInitializer) { - frame.SetContext(ExpressionContext.Default); + frame.state = FrameState.ObjectInitializerValue; + frame.SetDefaultContext(); break; } else { goto default; @@ -551,6 +560,9 @@ namespace ICSharpCode.SharpDevelop.Dom.CSharp if (frame.state == FrameState.FieldDecl || frame.state == FrameState.Initializer) { frame.state = FrameState.FieldDecl; frame.SetContext(ExpressionContext.IdentifierExpected); + } else if (frame.state == FrameState.ObjectInitializerValue) { + frame.state = FrameState.Normal; + frame.SetDefaultContext(); } break; case Tokens.Where: