From 671d51a6e865b6a751d46a47af73ffbc11e678a6 Mon Sep 17 00:00:00 2001 From: Daniel Grunwald Date: Thu, 19 Jul 2007 20:57:16 +0000 Subject: [PATCH] Fixed method insight for constructors. git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/trunk@2622 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61 --- .../Src/CodeCompletion/ExpressionFinder.cs | 4 ++ .../Project/Src/CSharpCompletionBinding.cs | 4 +- .../AbstractCompletionDataProvider.cs | 2 +- .../MethodInsightDataProvider.cs | 3 +- .../Base/Test/CSharpExpressionFinderTests.cs | 40 ++++++++++++++++++- .../Project/Src/CSharp/ExpressionFinder.cs | 19 +++++++-- .../Project/Src/VBNet/ExpressionFinder.cs | 6 ++- 7 files changed, 68 insertions(+), 10 deletions(-) diff --git a/src/AddIns/BackendBindings/Boo/BooBinding/Project/Src/CodeCompletion/ExpressionFinder.cs b/src/AddIns/BackendBindings/Boo/BooBinding/Project/Src/CodeCompletion/ExpressionFinder.cs index 0778a91510..1aebe15285 100644 --- a/src/AddIns/BackendBindings/Boo/BooBinding/Project/Src/CodeCompletion/ExpressionFinder.cs +++ b/src/AddIns/BackendBindings/Boo/BooBinding/Project/Src/CodeCompletion/ExpressionFinder.cs @@ -80,6 +80,10 @@ namespace Grunwald.BooBinding.CodeCompletion public ExpressionResult FindExpression(string inText, int offset) { + offset--; // earlier all ExpressionFinder calls had an inexplicable "cursor - 1". + // The IExpressionFinder API to use normal cursor offsets, so we need to adjust the offset + // because Boo ExpressionFinder still uses an implementation that expects old offsets + if (inText == null || offset >= inText.Length) return ExpressionResult.Empty; // OK, first try a kind of "quick find" diff --git a/src/AddIns/BackendBindings/CSharpBinding/Project/Src/CSharpCompletionBinding.cs b/src/AddIns/BackendBindings/CSharpBinding/Project/Src/CSharpCompletionBinding.cs index 1028742e0c..92bef12d41 100644 --- a/src/AddIns/BackendBindings/CSharpBinding/Project/Src/CSharpCompletionBinding.cs +++ b/src/AddIns/BackendBindings/CSharpBinding/Project/Src/CSharpCompletionBinding.cs @@ -98,7 +98,7 @@ namespace CSharpBinding if (cursor > 1 && !char.IsLetterOrDigit(editor.Document.GetCharAt(cursor - 1)) && !IsInComment(editor)) { - ExpressionResult result = ef.FindExpression(editor.Text, cursor - 1); + ExpressionResult result = ef.FindExpression(editor.Text, cursor); LoggingService.Debug("CC: Beginning to type a word, result=" + result); if (result.Context != ExpressionContext.IdentifierExpected) { editor.ShowCompletionWindow(new CtrlSpaceCompletionDataProvider(result.Context), '\0'); @@ -162,7 +162,7 @@ namespace CSharpBinding { CSharpExpressionFinder ef = CreateExpressionFinder(editor.FileName); int cursor = editor.ActiveTextAreaControl.Caret.Offset; - ExpressionResult expressionResult = ef.FindExpression(editor.Document.GetText(0, cursor), cursor - 1); + ExpressionResult expressionResult = ef.FindExpression(editor.Document.GetText(0, cursor), cursor); LoggingService.Debug("ShowNewCompletion: expression is " + expressionResult); if (expressionResult.Context.IsObjectCreation) { editor.ShowCompletionWindow(new CtrlSpaceCompletionDataProvider(expressionResult.Context), ' '); diff --git a/src/Main/Base/Project/Src/TextEditor/Gui/Editor/CompletionWindow/AbstractCompletionDataProvider.cs b/src/Main/Base/Project/Src/TextEditor/Gui/Editor/CompletionWindow/AbstractCompletionDataProvider.cs index 92f1678f56..83af99adc5 100644 --- a/src/Main/Base/Project/Src/TextEditor/Gui/Editor/CompletionWindow/AbstractCompletionDataProvider.cs +++ b/src/Main/Base/Project/Src/TextEditor/Gui/Editor/CompletionWindow/AbstractCompletionDataProvider.cs @@ -133,7 +133,7 @@ namespace ICSharpCode.SharpDevelop.DefaultEditor.Gui.Editor if (expressionFinder == null) { return new ExpressionResult(TextUtilities.GetExpressionBeforeOffset(textArea, textArea.Caret.Offset)); } else { - ExpressionResult res = expressionFinder.FindExpression(document.GetText(0, textArea.Caret.Offset), textArea.Caret.Offset - 1); + ExpressionResult res = expressionFinder.FindExpression(document.GetText(0, textArea.Caret.Offset), textArea.Caret.Offset); if (overrideContext != null) res.Context = overrideContext; return res; diff --git a/src/Main/Base/Project/Src/TextEditor/Gui/Editor/InsightWindow/MethodInsightDataProvider.cs b/src/Main/Base/Project/Src/TextEditor/Gui/Editor/InsightWindow/MethodInsightDataProvider.cs index 2f95feb0a8..288aa2df81 100644 --- a/src/Main/Base/Project/Src/TextEditor/Gui/Editor/InsightWindow/MethodInsightDataProvider.cs +++ b/src/Main/Base/Project/Src/TextEditor/Gui/Editor/InsightWindow/MethodInsightDataProvider.cs @@ -102,7 +102,8 @@ namespace ICSharpCode.SharpDevelop.DefaultEditor.Gui.Editor if (expressionFinder == null) expressionResult = new ExpressionResult(TextUtilities.GetExpressionBeforeOffset(textArea, useOffset)); else - expressionResult = expressionFinder.FindExpression(textArea.Document.TextContent, useOffset - 1); + expressionResult = expressionFinder.FindExpression(textArea.Document.TextContent, useOffset); + if (expressionResult.Expression == null) // expression is null when cursor is in string/comment return; expressionResult.Expression = expressionResult.Expression.Trim(); diff --git a/src/Main/Base/Test/CSharpExpressionFinderTests.cs b/src/Main/Base/Test/CSharpExpressionFinderTests.cs index c20e248bf9..f928fff8d8 100644 --- a/src/Main/Base/Test/CSharpExpressionFinderTests.cs +++ b/src/Main/Base/Test/CSharpExpressionFinderTests.cs @@ -294,7 +294,45 @@ class Main { void M() { StringBuilder b = new"; - ExpressionResult result = ef.FindExpression(program, program.Length - 1); + ExpressionResult result = ef.FindExpression(program, program.Length); + Assert.AreEqual(ExpressionContext.ObjectCreation.ToString(), result.Context.ToString()); + } + + [Test] + public void FindObjectCreationContextForConstructorInsight() + { + const string program = @"using System; using System.Text; +class Main { + void M() { + StringBuilder b = new StringBuilder"; + + ExpressionResult result = ef.FindExpression(program, program.Length); + Assert.AreEqual("StringBuilder", result.Expression); + Assert.AreEqual(ExpressionContext.ObjectCreation.ToString(), result.Context.ToString()); + } + + [Test] + public void FindObjectCreationContextForConstructorInsight2() + { + const string program = @"using System; using System.Text; +class Main { + StringBuilder field = new StringBuilder"; + + ExpressionResult result = ef.FindExpression(program, program.Length); + Assert.AreEqual("StringBuilder", result.Expression); + Assert.AreEqual(ExpressionContext.ObjectCreation.ToString(), result.Context.ToString()); + } + + [Test] + public void FindObjectCreationContextForConstructorInsight3() + { + const string program = @"using System; +class Main { + void M() { + System.Text.StringBuilder b = new System.Text.StringBuilder"; + + ExpressionResult result = ef.FindExpression(program, program.Length); + Assert.AreEqual("System.Text.StringBuilder", result.Expression); Assert.AreEqual(ExpressionContext.ObjectCreation.ToString(), result.Context.ToString()); } 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 300adf913f..a250f1ba8b 100644 --- a/src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/CSharp/ExpressionFinder.cs +++ b/src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/CSharp/ExpressionFinder.cs @@ -107,6 +107,14 @@ namespace ICSharpCode.SharpDevelop.Dom.CSharp internal ExpressionContext context; internal IReturnType expectedType; + internal bool InExpressionMode { + get { + return type == FrameType.Statements + || type == FrameType.Expression + || state == FrameState.Initializer; + } + } + internal void SetContext(ExpressionContext context) { this.context = context; @@ -230,7 +238,6 @@ namespace ICSharpCode.SharpDevelop.Dom.CSharp public ExpressionResult FindExpression(string text, int offset) { - offset++; Init(text, offset); Token token; while ((token = lexer.NextToken()) != null) { @@ -362,7 +369,7 @@ namespace ICSharpCode.SharpDevelop.Dom.CSharp frame.SetExpectedType(projectContent.SystemTypes.Exception); break; case Tokens.New: - if (frame.type == FrameType.Statements || frame.type == FrameType.Expression) { + if (frame.InExpressionMode) { frame.SetContext(ExpressionContext.TypeDerivingFrom(frame.expectedType, true)); } break; @@ -459,11 +466,15 @@ namespace ICSharpCode.SharpDevelop.Dom.CSharp frame.state = FrameState.FieldDecl; frame.childType = FrameType.Property; } - frame.SetContext(ExpressionContext.IdentifierExpected); + if (!(frame.state == FrameState.Initializer && frame.context.IsObjectCreation)) { + frame.SetContext(ExpressionContext.IdentifierExpected); + } } else if (frame.type == FrameType.ParameterList || frame.type == FrameType.Statements) { - frame.SetContext(ExpressionContext.IdentifierExpected); + if (!frame.context.IsObjectCreation) { + frame.SetContext(ExpressionContext.IdentifierExpected); + } } } break; diff --git a/src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/VBNet/ExpressionFinder.cs b/src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/VBNet/ExpressionFinder.cs index 3aa5985ccb..d4fe8a7ab6 100644 --- a/src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/VBNet/ExpressionFinder.cs +++ b/src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/VBNet/ExpressionFinder.cs @@ -32,6 +32,10 @@ namespace ICSharpCode.SharpDevelop.Dom.VBNet public string FindExpressionInternal(string inText, int offset) { + offset--; // earlier all ExpressionFinder calls had an inexplicable "cursor - 1". + // The IExpressionFinder API to use normal cursor offsets, so we need to adjust the offset + // because VBExpressionFinder still uses an implementation that expects old offsets + this.text = FilterComments(inText, ref offset); this.offset = this.lastAccept = offset; this.state = START; @@ -66,7 +70,7 @@ namespace ICSharpCode.SharpDevelop.Dom.VBNet public ExpressionResult FindFullExpression(string inText, int offset) { - string expressionBeforeOffset = FindExpressionInternal(inText, offset); + string expressionBeforeOffset = FindExpressionInternal(inText, offset + 1); if (expressionBeforeOffset == null || expressionBeforeOffset.Length == 0) return CreateResult(null); StringBuilder b = new StringBuilder(expressionBeforeOffset);