Browse Source

Implemented Code Completion support of -> Operator

git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/branches/3.0@3591 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61
shortcuts
Siegfried Pammer 18 years ago
parent
commit
1710bc9334
  1. 37
      src/AddIns/BackendBindings/CSharpBinding/Project/Src/CSharpCompletionBinding.cs
  2. 2
      src/Main/Base/Project/Src/TextEditor/Gui/Editor/CompletionWindow/AbstractCompletionDataProvider.cs
  3. 7
      src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/CSharp/ExpressionFinder.cs
  4. 12
      src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/NRefactoryResolver/ResolveVisitor.cs

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

@ -94,8 +94,17 @@ namespace CSharpBinding
} }
} else if (ch == '.') { } else if (ch == '.') {
editor.ShowCompletionWindow(new CSharpCodeCompletionDataProvider(), ch); editor.ShowCompletionWindow(new CSharpCodeCompletionDataProvider(), ch);
return true;
} else if (ch == '>') {
if (IsInComment(editor)) return false;
LineSegment segment = editor.Document.GetLineSegmentForOffset(editor.ActiveTextAreaControl.Caret.Offset);
TextWord sign = segment.GetWord(editor.ActiveTextAreaControl.Caret.Column - 1);
if (sign.Word == "-") {
editor.ShowCompletionWindow(new PointerArrowCompletionDataProvider(), ch);
return true; return true;
} }
}
if (char.IsLetter(ch) && CodeCompletionOptions.CompleteWhenTyping) { if (char.IsLetter(ch) && CodeCompletionOptions.CompleteWhenTyping) {
char prevChar = cursor > 1 ? editor.Document.GetCharAt(cursor - 1) : ' '; char prevChar = cursor > 1 ? editor.Document.GetCharAt(cursor - 1) : ' ';
@ -131,6 +140,34 @@ namespace CSharpBinding
} }
} }
class PointerArrowCompletionDataProvider : CodeCompletionDataProvider
{
protected override ResolveResult Resolve(ExpressionResult expressionResult, int caretLineNumber, int caretColumn, string fileName, string fileContent)
{
ResolveResult rr = base.Resolve(expressionResult, caretLineNumber, caretColumn, fileName, fileContent);
if (rr != null && rr.ResolvedType != null) {
PointerReturnType prt = rr.ResolvedType.CastToDecoratingReturnType<PointerReturnType>();
if (prt != null)
return new ResolveResult(rr.CallingClass, rr.CallingMember, prt.BaseType);
}
return null;
}
protected override ExpressionResult GetExpression(ICSharpCode.TextEditor.TextArea textArea)
{
ICSharpCode.TextEditor.Document.IDocument document = textArea.Document;
IExpressionFinder expressionFinder = ParserService.GetExpressionFinder(fileName);
if (expressionFinder == null) {
return new ExpressionResult(TextUtilities.GetExpressionBeforeOffset(textArea, textArea.Caret.Offset - 1));
} else {
ExpressionResult res = expressionFinder.FindExpression(document.GetText(0, textArea.Caret.Offset - 1), textArea.Caret.Offset - 1);
if (overrideContext != null)
res.Context = overrideContext;
return res;
}
}
}
bool IsInComment(SharpDevelopTextAreaControl editor) bool IsInComment(SharpDevelopTextAreaControl editor)
{ {
CSharpExpressionFinder ef = CreateExpressionFinder(editor.FileName); CSharpExpressionFinder ef = CreateExpressionFinder(editor.FileName);

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

@ -128,7 +128,7 @@ namespace ICSharpCode.SharpDevelop.DefaultEditor.Gui.Editor
return completionData.ToArray(); return completionData.ToArray();
} }
protected ExpressionResult GetExpression(TextArea textArea) protected virtual ExpressionResult GetExpression(TextArea textArea)
{ {
IDocument document = textArea.Document; IDocument document = textArea.Document;
IExpressionFinder expressionFinder = ParserService.GetExpressionFinder(fileName); IExpressionFinder expressionFinder = ParserService.GetExpressionFinder(fileName);

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

@ -492,13 +492,14 @@ namespace ICSharpCode.SharpDevelop.Dom.CSharp
// do not reset context - TrackCurrentContext will take care of this // do not reset context - TrackCurrentContext will take care of this
frame.lastExpressionStart = Location.Empty; frame.lastExpressionStart = Location.Empty;
break; break;
case Tokens.Pointer:
case Tokens.Dot: case Tokens.Dot:
case Tokens.DoubleColon: case Tokens.DoubleColon:
// let the current expression continue // let the current expression continue
break; break;
default: default:
if (Tokens.IdentifierTokens[token.kind]) { if (Tokens.IdentifierTokens[token.kind]) {
if (lastToken != Tokens.Dot && lastToken != Tokens.DoubleColon) { if (lastToken != Tokens.Dot && lastToken != Tokens.DoubleColon && lastToken != Tokens.Pointer) {
if (Tokens.ValidInsideTypeName[lastToken]) { if (Tokens.ValidInsideTypeName[lastToken]) {
frame.SetDefaultContext(); frame.SetDefaultContext();
} }
@ -821,7 +822,7 @@ namespace ICSharpCode.SharpDevelop.Dom.CSharp
resultStartOffset = lastExpressionStartOffset; resultStartOffset = lastExpressionStartOffset;
if (resultFrame.type == FrameType.Popped || if (resultFrame.type == FrameType.Popped ||
lastExpressionStartOffset != resultStartOffset || lastExpressionStartOffset != resultStartOffset ||
token.kind == Tokens.Dot || token.kind == Tokens.DoubleColon) token.kind == Tokens.Dot || token.kind == Tokens.DoubleColon || token.kind == Tokens.Pointer)
{ {
// now we can change the context based on the next token // now we can change the context based on the next token
@ -865,7 +866,7 @@ namespace ICSharpCode.SharpDevelop.Dom.CSharp
if (token.kind == Tokens.EOF) break; if (token.kind == Tokens.EOF) break;
if (frame.parent == null) { if (frame.parent == null) {
if (token.kind == Tokens.Dot || token.kind == Tokens.DoubleColon if (token.kind == Tokens.Dot || token.kind == Tokens.DoubleColon || token.kind == Tokens.Pointer
|| token.kind == Tokens.OpenParenthesis || token.kind == Tokens.OpenSquareBracket) || token.kind == Tokens.OpenParenthesis || token.kind == Tokens.OpenSquareBracket)
{ {
lastValidPos = LocationToOffset(token.Location); lastValidPos = LocationToOffset(token.Location);

12
src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/NRefactoryResolver/ResolveVisitor.cs

@ -522,6 +522,18 @@ namespace ICSharpCode.SharpDevelop.Dom.NRefactoryResolver
public override object VisitPointerReferenceExpression(PointerReferenceExpression pointerReferenceExpression, object data) public override object VisitPointerReferenceExpression(PointerReferenceExpression pointerReferenceExpression, object data)
{ {
ResolveResult targetRR = Resolve(pointerReferenceExpression.TargetObject);
if (targetRR == null)
return null;
PointerReturnType type = targetRR.ResolvedType.CastToDecoratingReturnType<PointerReturnType>();
if (type != null) {
TypeResolveResult typeRR = targetRR as TypeResolveResult;
return resolver.ResolveMember(type.BaseType, pointerReferenceExpression.Identifier,
pointerReferenceExpression.TypeArguments,
NRefactoryResolver.IsInvoked(pointerReferenceExpression),
true, null
);
}
return null; return null;
} }

Loading…
Cancel
Save