Browse Source

Fixed forum-7302: InvalidOperationException for code completion after new keyword.

DynamicHelpPad: invoke UpdateTick on main thread to avoid race condition.

git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/trunk@2935 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61
shortcuts
Daniel Grunwald 18 years ago
parent
commit
52c182c990
  1. 2
      src/AddIns/BackendBindings/CSharpBinding/Project/Src/CSharpCompletionBinding.cs
  2. 10
      src/AddIns/Misc/HtmlHelp2/Project/src/BaseControls/DynamicHelpPad.cs
  3. 4
      src/Main/Base/Project/Src/Gui/Workbench/DefaultWorkbench.cs
  4. 6
      src/Main/Base/Project/Src/Project/BuildEngine.cs
  5. 2
      src/Main/Base/Project/Src/TextEditor/Gui/Editor/CompletionWindow/AbstractCompletionDataProvider.cs
  6. 53
      src/Main/Base/Project/Src/TextEditor/Gui/Editor/CompletionWindow/CtrlSpaceCompletionDataProvider.cs

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

@ -101,7 +101,7 @@ namespace CSharpBinding @@ -101,7 +101,7 @@ namespace CSharpBinding
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');
editor.ShowCompletionWindow(new CtrlSpaceCompletionDataProvider(result.Context) { ShowTemplates = true }, '\0');
}
}
}

10
src/AddIns/Misc/HtmlHelp2/Project/src/BaseControls/DynamicHelpPad.cs

@ -38,7 +38,7 @@ namespace HtmlHelp2 @@ -38,7 +38,7 @@ namespace HtmlHelp2
public class HtmlHelp2DynamicHelpPad : AbstractPadContent
{
HtmlHelp2DynamicHelpBrowserControl dynamicHelpBrowser;
private StringCollection dynamicHelpTerms = new StringCollection();
private List<string> dynamicHelpTerms = new List<string>();
private TextLocation lastPoint = TextLocation.Empty;
private string debugPreElement = String.Empty;
private bool enableDebugInfo = HtmlHelp2Environment.Config.DynamicHelpDebugInfos;
@ -154,9 +154,13 @@ namespace HtmlHelp2 @@ -154,9 +154,13 @@ namespace HtmlHelp2
#region Taken from DefinitionView.cs
private void UpdateTick(object sender, ParserUpdateStepEventArgs e)
{
WorkbenchSingleton.SafeThreadAsyncCall(UpdateTick, e);
}
void UpdateTick(ParserUpdateStepEventArgs e)
{
this.dynamicHelpTerms.Clear();
ResolveResult res = ResolveAtCaret(e);
if (res == null) return;
@ -187,7 +191,7 @@ namespace HtmlHelp2 @@ -187,7 +191,7 @@ namespace HtmlHelp2
this.AddToStringCollection(0, types.ResolvedClass.FullyQualifiedName);
}
WorkbenchSingleton.SafeThreadAsyncCall(BuildDynamicHelpList);
BuildDynamicHelpList();
}
private ResolveResult ResolveAtCaret(ParserUpdateStepEventArgs e)

4
src/Main/Base/Project/Src/Gui/Workbench/DefaultWorkbench.cs

@ -144,7 +144,7 @@ namespace ICSharpCode.SharpDevelop.Gui @@ -144,7 +144,7 @@ namespace ICSharpCode.SharpDevelop.Gui
public IWorkbenchWindow ActiveWorkbenchWindow {
get {
WorkbenchSingleton.DebugAssertMainThread();
WorkbenchSingleton.AssertMainThread();
return activeWorkbenchWindow;
}
private set {
@ -187,7 +187,7 @@ namespace ICSharpCode.SharpDevelop.Gui @@ -187,7 +187,7 @@ namespace ICSharpCode.SharpDevelop.Gui
/// </summary>
public IViewContent ActiveViewContent {
get {
WorkbenchSingleton.DebugAssertMainThread();
WorkbenchSingleton.AssertMainThread();
return activeViewContent;
}
private set {

6
src/Main/Base/Project/Src/Project/BuildEngine.cs

@ -27,7 +27,7 @@ namespace ICSharpCode.SharpDevelop.Project @@ -27,7 +27,7 @@ namespace ICSharpCode.SharpDevelop.Project
public static void BuildInGui(IBuildable project, BuildOptions options)
{
WorkbenchSingleton.DebugAssertMainThread();
WorkbenchSingleton.AssertMainThread();
if (guiBuildProgressMonitor != null) {
BuildResults results = new BuildResults();
results.Add(new BuildError(null, Core.ResourceService.GetString("MainWindow.CompilerMessages.MSBuildAlreadyRunning")));
@ -44,14 +44,14 @@ namespace ICSharpCode.SharpDevelop.Project @@ -44,14 +44,14 @@ namespace ICSharpCode.SharpDevelop.Project
public static bool IsGuiBuildRunning {
get {
WorkbenchSingleton.DebugAssertMainThread();
WorkbenchSingleton.AssertMainThread();
return guiBuildProgressMonitor != null;
}
}
public static void CancelGuiBuild()
{
WorkbenchSingleton.DebugAssertMainThread();
WorkbenchSingleton.AssertMainThread();
if (guiBuildProgressMonitor != null) {
guiBuildProgressMonitor.Cancel();
}

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

@ -167,7 +167,7 @@ namespace ICSharpCode.SharpDevelop.DefaultEditor.Gui.Editor @@ -167,7 +167,7 @@ namespace ICSharpCode.SharpDevelop.DefaultEditor.Gui.Editor
}
}
if (suggestedData != null) {
completionData.Sort();
completionData.Sort(DefaultCompletionData.Compare);
this.DefaultIndex = completionData.IndexOf(suggestedData);
}
}

53
src/Main/Base/Project/Src/TextEditor/Gui/Editor/CompletionWindow/CtrlSpaceCompletionDataProvider.cs

@ -38,6 +38,40 @@ namespace ICSharpCode.SharpDevelop.DefaultEditor.Gui.Editor @@ -38,6 +38,40 @@ namespace ICSharpCode.SharpDevelop.DefaultEditor.Gui.Editor
set { allowCompleteExistingExpression = value; }
}
/// <summary>
/// Gets/Sets whether code templates should be included in code completion.
/// </summary>
public bool ShowTemplates { get; set; }
void AddTemplates(TextArea textArea, char charTyped)
{
if (!ShowTemplates)
return;
ICompletionData suggestedData = DefaultIndex >= 0 ? completionData[DefaultIndex] : null;
ICompletionData[] templateCompletionData = new TemplateCompletionDataProvider().GenerateCompletionData(fileName, textArea, charTyped);
for (int i = 0; i < completionData.Count; i++) {
if (completionData[i].ImageIndex == ClassBrowserIconService.KeywordIndex) {
string text = completionData[i].Text;
for (int j = 0; j < templateCompletionData.Length; j++) {
if (templateCompletionData[j] != null && templateCompletionData[j].Text == text) {
// replace keyword with template
completionData[i] = templateCompletionData[j];
templateCompletionData[j] = null;
}
}
}
}
// add non-keyword code templates
for (int j = 0; j < templateCompletionData.Length; j++) {
if (templateCompletionData[j] != null)
completionData.Add(templateCompletionData[j]);
}
if (suggestedData != null) {
completionData.Sort(DefaultCompletionData.Compare);
DefaultIndex = completionData.IndexOf(suggestedData);
}
}
protected override void GenerateCompletionData(TextArea textArea, char charTyped)
{
#if DEBUG
@ -53,24 +87,7 @@ namespace ICSharpCode.SharpDevelop.DefaultEditor.Gui.Editor @@ -53,24 +87,7 @@ namespace ICSharpCode.SharpDevelop.DefaultEditor.Gui.Editor
}
ExpressionContext context = overrideContext ?? ExpressionContext.Default;
AddResolveResults(ParserService.CtrlSpace(caretLineNumber, caretColumn, fileName, textArea.Document.TextContent, context), context);
ICompletionData[] templateCompletionData = new TemplateCompletionDataProvider().GenerateCompletionData(fileName, textArea, charTyped);
for (int i = 0; i < completionData.Count; i++) {
if (completionData[i].ImageIndex == ClassBrowserIconService.KeywordIndex) {
string text = completionData[i].Text;
for (int j = 0; j < templateCompletionData.Length; j++) {
if (templateCompletionData[j] != null && templateCompletionData[j].Text == text) {
// replace keyword with template
completionData[i] = templateCompletionData[j];
templateCompletionData[j] = null;
}
}
}
}
// add non-keyword code templates
for (int j = 0; j < templateCompletionData.Length; j++) {
if (templateCompletionData[j] != null)
completionData.Add(templateCompletionData[j]);
}
AddTemplates(textArea, charTyped);
return;
}

Loading…
Cancel
Save