Browse Source

Fixed SD2-511: Code completion in inserted line

git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/trunk@3023 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61
shortcuts
Daniel Grunwald 18 years ago
parent
commit
46ff714cc1
  1. 15
      src/AddIns/BackendBindings/CSharpBinding/Project/Src/CSharpCompletionBinding.cs
  2. 11
      src/Main/Base/Project/Src/TextEditor/Gui/Editor/CompletionWindow/CodeCompletionDataProvider.cs
  3. 30
      src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/NRefactoryResolver/NRefactoryResolver.cs

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

@ -92,6 +92,9 @@ namespace CSharpBinding @@ -92,6 +92,9 @@ namespace CSharpBinding
}
}
}
} else if (ch == '.') {
editor.ShowCompletionWindow(new CSharpCodeCompletionDataProvider(), ch);
return true;
}
if (char.IsLetter(ch) && CodeCompletionOptions.CompleteWhenTyping) {
@ -108,6 +111,18 @@ namespace CSharpBinding @@ -108,6 +111,18 @@ namespace CSharpBinding
return base.HandleKeyPress(editor, ch);
}
class CSharpCodeCompletionDataProvider : CodeCompletionDataProvider
{
protected override ResolveResult Resolve(ExpressionResult expressionResult, int caretLineNumber, int caretColumn, string fileName, string fileContent)
{
// bypass ParserService.Resolve and set resolver.LimitMethodExtractionUntilCaretLine
ParseInformation parseInfo = ParserService.GetParseInformation(fileName);
NRefactoryResolver resolver = new NRefactoryResolver(LanguageProperties.CSharp);
resolver.LimitMethodExtractionUntilLine = caretLineNumber;
return resolver.Resolve(expressionResult, parseInfo, fileContent);
}
}
bool IsInComment(SharpDevelopTextAreaControl editor)
{
CSharpExpressionFinder ef = CreateExpressionFinder(editor.FileName);

11
src/Main/Base/Project/Src/TextEditor/Gui/Editor/CompletionWindow/CodeCompletionDataProvider.cs

@ -66,8 +66,15 @@ namespace ICSharpCode.SharpDevelop.DefaultEditor.Gui.Editor @@ -66,8 +66,15 @@ namespace ICSharpCode.SharpDevelop.DefaultEditor.Gui.Editor
LoggingService.DebugFormatted("GenerateCompletionData for >>{0}<<, context={1}", expressionResult.Expression, expressionResult.Context);
}
string textContent = textArea.Document.TextContent;
AddResolveResults(ParserService.Resolve(expressionResult, caretLineNumber, caretColumn, fileName, textContent),
expressionResult.Context);
ResolveResult rr = Resolve(expressionResult, caretLineNumber, caretColumn, fileName, textContent);
AddResolveResults(rr, expressionResult.Context);
}
protected virtual ResolveResult Resolve(ExpressionResult expressionResult,
int caretLineNumber, int caretColumn,
string fileName, string fileContent)
{
return ParserService.Resolve(expressionResult, caretLineNumber, caretColumn, fileName, fileContent);
}
}
}

30
src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/NRefactoryResolver/NRefactoryResolver.cs

@ -390,11 +390,16 @@ namespace ICSharpCode.SharpDevelop.Dom.NRefactoryResolver @@ -390,11 +390,16 @@ namespace ICSharpCode.SharpDevelop.Dom.NRefactoryResolver
return resolveVisitor.Resolve(expr);
}
/// <summary>
/// Used for the fix for SD2-511.
/// </summary>
public int LimitMethodExtractionUntilLine;
public TextReader ExtractCurrentMethod(string fileContent)
{
if (callingMember == null)
return null;
return ExtractMethod(fileContent, callingMember, language, caretLine);
return ExtractMethod(fileContent, callingMember, language, LimitMethodExtractionUntilLine);
}
/// <summary>
@ -403,7 +408,7 @@ namespace ICSharpCode.SharpDevelop.Dom.NRefactoryResolver @@ -403,7 +408,7 @@ namespace ICSharpCode.SharpDevelop.Dom.NRefactoryResolver
/// as all fields etc. are already prepared in the AST.
/// </summary>
public static TextReader ExtractMethod(string fileContent, IMember member,
NR.SupportedLanguage language, int caretLine)
NR.SupportedLanguage language, int extractUntilLine)
{
// As the parse information is always some seconds old, the end line could be wrong
// if the user just inserted a line in the method.
@ -438,25 +443,8 @@ namespace ICSharpCode.SharpDevelop.Dom.NRefactoryResolver @@ -438,25 +443,8 @@ namespace ICSharpCode.SharpDevelop.Dom.NRefactoryResolver
int endLine = bodyRegion.EndLine;
// Fix for SD2-511 (Code completion in inserted line)
if (language == NR.SupportedLanguage.CSharp) {
// Do not do this for VB: the parser does not correctly create the
// ForEachStatement when the method in truncated in the middle.
// VB does not have the "inserted line looks like variable declaration"-problem
// anyways.
// Fix removed because it causes problems with type inference for "variable" in these examples:
// - var variable = multilineInitializer;
// - foreach (var variable in multilineCollectionExpression)
// - var query = from variable in multilineExpression
// Also a bug (caused because we use caretLine=expression.StartLocation.Line, would be fixed
// with the cutoff at expression.EndLocation.Line):
// - any multiline expression that contains lambdas in lines after the first
// does not resolve if the expression's return type depends on the types
// of implicitly typed lambda parameters.
// if (caretLine > startLine && caretLine < endLine)
// endLine = caretLine;
}
if (extractUntilLine > startLine && extractUntilLine < endLine)
endLine = extractUntilLine;
int offset = 0;
for (int i = 0; i < startLine - 1; ++i) { // -1 because the startLine must be included

Loading…
Cancel
Save