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. 15
      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
public ExpressionResult FindExpression(string inText, int offset) 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) if (inText == null || offset >= inText.Length)
return ExpressionResult.Empty; return ExpressionResult.Empty;
// OK, first try a kind of "quick find" // OK, first try a kind of "quick find"

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

@ -98,7 +98,7 @@ namespace CSharpBinding
if (cursor > 1 && !char.IsLetterOrDigit(editor.Document.GetCharAt(cursor - 1)) if (cursor > 1 && !char.IsLetterOrDigit(editor.Document.GetCharAt(cursor - 1))
&& !IsInComment(editor)) && !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); LoggingService.Debug("CC: Beginning to type a word, result=" + result);
if (result.Context != ExpressionContext.IdentifierExpected) { if (result.Context != ExpressionContext.IdentifierExpected) {
editor.ShowCompletionWindow(new CtrlSpaceCompletionDataProvider(result.Context), '\0'); editor.ShowCompletionWindow(new CtrlSpaceCompletionDataProvider(result.Context), '\0');
@ -162,7 +162,7 @@ namespace CSharpBinding
{ {
CSharpExpressionFinder ef = CreateExpressionFinder(editor.FileName); CSharpExpressionFinder ef = CreateExpressionFinder(editor.FileName);
int cursor = editor.ActiveTextAreaControl.Caret.Offset; 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); LoggingService.Debug("ShowNewCompletion: expression is " + expressionResult);
if (expressionResult.Context.IsObjectCreation) { if (expressionResult.Context.IsObjectCreation) {
editor.ShowCompletionWindow(new CtrlSpaceCompletionDataProvider(expressionResult.Context), ' '); 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
if (expressionFinder == null) { if (expressionFinder == null) {
return new ExpressionResult(TextUtilities.GetExpressionBeforeOffset(textArea, textArea.Caret.Offset)); return new ExpressionResult(TextUtilities.GetExpressionBeforeOffset(textArea, textArea.Caret.Offset));
} else { } 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) if (overrideContext != null)
res.Context = overrideContext; res.Context = overrideContext;
return res; return res;

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

@ -102,7 +102,8 @@ namespace ICSharpCode.SharpDevelop.DefaultEditor.Gui.Editor
if (expressionFinder == null) if (expressionFinder == null)
expressionResult = new ExpressionResult(TextUtilities.GetExpressionBeforeOffset(textArea, useOffset)); expressionResult = new ExpressionResult(TextUtilities.GetExpressionBeforeOffset(textArea, useOffset));
else 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 if (expressionResult.Expression == null) // expression is null when cursor is in string/comment
return; return;
expressionResult.Expression = expressionResult.Expression.Trim(); expressionResult.Expression = expressionResult.Expression.Trim();

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

@ -294,7 +294,45 @@ class Main {
void M() { void M() {
StringBuilder b = new"; 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()); Assert.AreEqual(ExpressionContext.ObjectCreation.ToString(), result.Context.ToString());
} }

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

@ -107,6 +107,14 @@ namespace ICSharpCode.SharpDevelop.Dom.CSharp
internal ExpressionContext context; internal ExpressionContext context;
internal IReturnType expectedType; internal IReturnType expectedType;
internal bool InExpressionMode {
get {
return type == FrameType.Statements
|| type == FrameType.Expression
|| state == FrameState.Initializer;
}
}
internal void SetContext(ExpressionContext context) internal void SetContext(ExpressionContext context)
{ {
this.context = context; this.context = context;
@ -230,7 +238,6 @@ namespace ICSharpCode.SharpDevelop.Dom.CSharp
public ExpressionResult FindExpression(string text, int offset) public ExpressionResult FindExpression(string text, int offset)
{ {
offset++;
Init(text, offset); Init(text, offset);
Token token; Token token;
while ((token = lexer.NextToken()) != null) { while ((token = lexer.NextToken()) != null) {
@ -362,7 +369,7 @@ namespace ICSharpCode.SharpDevelop.Dom.CSharp
frame.SetExpectedType(projectContent.SystemTypes.Exception); frame.SetExpectedType(projectContent.SystemTypes.Exception);
break; break;
case Tokens.New: case Tokens.New:
if (frame.type == FrameType.Statements || frame.type == FrameType.Expression) { if (frame.InExpressionMode) {
frame.SetContext(ExpressionContext.TypeDerivingFrom(frame.expectedType, true)); frame.SetContext(ExpressionContext.TypeDerivingFrom(frame.expectedType, true));
} }
break; break;
@ -459,13 +466,17 @@ namespace ICSharpCode.SharpDevelop.Dom.CSharp
frame.state = FrameState.FieldDecl; frame.state = FrameState.FieldDecl;
frame.childType = FrameType.Property; frame.childType = FrameType.Property;
} }
if (!(frame.state == FrameState.Initializer && frame.context.IsObjectCreation)) {
frame.SetContext(ExpressionContext.IdentifierExpected); frame.SetContext(ExpressionContext.IdentifierExpected);
}
} else if (frame.type == FrameType.ParameterList } else if (frame.type == FrameType.ParameterList
|| frame.type == FrameType.Statements) || frame.type == FrameType.Statements)
{ {
if (!frame.context.IsObjectCreation) {
frame.SetContext(ExpressionContext.IdentifierExpected); frame.SetContext(ExpressionContext.IdentifierExpected);
} }
} }
}
break; break;
} }
} }

6
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) 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.text = FilterComments(inText, ref offset);
this.offset = this.lastAccept = offset; this.offset = this.lastAccept = offset;
this.state = START; this.state = START;
@ -66,7 +70,7 @@ namespace ICSharpCode.SharpDevelop.Dom.VBNet
public ExpressionResult FindFullExpression(string inText, int offset) public ExpressionResult FindFullExpression(string inText, int offset)
{ {
string expressionBeforeOffset = FindExpressionInternal(inText, offset); string expressionBeforeOffset = FindExpressionInternal(inText, offset + 1);
if (expressionBeforeOffset == null || expressionBeforeOffset.Length == 0) if (expressionBeforeOffset == null || expressionBeforeOffset.Length == 0)
return CreateResult(null); return CreateResult(null);
StringBuilder b = new StringBuilder(expressionBeforeOffset); StringBuilder b = new StringBuilder(expressionBeforeOffset);

Loading…
Cancel
Save