Browse Source

Fixed method insight for constructors.

git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/trunk@2622 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61
shortcuts
Daniel Grunwald 18 years ago
parent
commit
671d51a6e8
  1. 4
      src/AddIns/BackendBindings/Boo/BooBinding/Project/Src/CodeCompletion/ExpressionFinder.cs
  2. 4
      src/AddIns/BackendBindings/CSharpBinding/Project/Src/CSharpCompletionBinding.cs
  3. 2
      src/Main/Base/Project/Src/TextEditor/Gui/Editor/CompletionWindow/AbstractCompletionDataProvider.cs
  4. 3
      src/Main/Base/Project/Src/TextEditor/Gui/Editor/InsightWindow/MethodInsightDataProvider.cs
  5. 40
      src/Main/Base/Test/CSharpExpressionFinderTests.cs
  6. 19
      src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/CSharp/ExpressionFinder.cs
  7. 6
      src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/VBNet/ExpressionFinder.cs

4
src/AddIns/BackendBindings/Boo/BooBinding/Project/Src/CodeCompletion/ExpressionFinder.cs

@ -80,6 +80,10 @@ namespace Grunwald.BooBinding.CodeCompletion @@ -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"

4
src/AddIns/BackendBindings/CSharpBinding/Project/Src/CSharpCompletionBinding.cs

@ -98,7 +98,7 @@ namespace CSharpBinding @@ -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 @@ -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), ' ');

2
src/Main/Base/Project/Src/TextEditor/Gui/Editor/CompletionWindow/AbstractCompletionDataProvider.cs

@ -133,7 +133,7 @@ namespace ICSharpCode.SharpDevelop.DefaultEditor.Gui.Editor @@ -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;

3
src/Main/Base/Project/Src/TextEditor/Gui/Editor/InsightWindow/MethodInsightDataProvider.cs

@ -102,7 +102,8 @@ namespace ICSharpCode.SharpDevelop.DefaultEditor.Gui.Editor @@ -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();

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

@ -294,7 +294,45 @@ class Main { @@ -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());
}

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

@ -107,6 +107,14 @@ namespace ICSharpCode.SharpDevelop.Dom.CSharp @@ -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 @@ -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 @@ -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 @@ -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;

6
src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/VBNet/ExpressionFinder.cs

@ -32,6 +32,10 @@ namespace ICSharpCode.SharpDevelop.Dom.VBNet @@ -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 @@ -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);

Loading…
Cancel
Save