Index: editor/tools/plugins/com.google.dart.tools.ui/src/com/google/dart/tools/ui/internal/text/dart/DartReconcilingStrategy.java |
=================================================================== |
--- editor/tools/plugins/com.google.dart.tools.ui/src/com/google/dart/tools/ui/internal/text/dart/DartReconcilingStrategy.java (revision 25990) |
+++ editor/tools/plugins/com.google.dart.tools.ui/src/com/google/dart/tools/ui/internal/text/dart/DartReconcilingStrategy.java (working copy) |
@@ -68,6 +68,11 @@ |
private IDocument document; |
/** |
+ * The display in which the editor is visible. |
+ */ |
+ private final Display display; |
+ |
+ /** |
* The time when the context was last notified of a source change. |
*/ |
private volatile long notifyContextTime; |
@@ -103,7 +108,7 @@ |
/** |
* Listen for changes to the source to clear the cached AST and record the last modification time. |
*/ |
- final IDocumentListener documentListener = new IDocumentListener() { |
+ private final IDocumentListener documentListener = new IDocumentListener() { |
@Override |
public void documentAboutToBeChanged(DocumentEvent event) { |
} |
@@ -114,7 +119,6 @@ |
editor.applyCompilationUnitElement(null); |
// Start analysis immediately if "." pressed to improve code completion response |
- // TODO (danrubel): do the same for ctrl-space ? |
// This may need to be modified or removed |
// if we enable/set content assist immediate-activation character(s) |
@@ -132,6 +136,7 @@ |
*/ |
public DartReconcilingStrategy(DartReconcilingEditor editor) { |
this.editor = editor; |
+ this.display = Display.getDefault(); |
// Prioritize analysis when editor becomes active |
editor.addViewerFocusListener(new FocusListener() { |
@@ -262,30 +267,36 @@ |
/** |
* Answer the list of sources associated with the specified context that are open and visible. |
+ * This method blocks until the information can be retrieved on the UI thread. |
* |
* @param context the context (not {@code null}) |
* @return a list of sources (not {@code null}, contains no {@code null}s) |
*/ |
- private List<Source> getVisibleSourcesForContext(AnalysisContext context) { |
- ArrayList<Source> sources = new ArrayList<Source>(); |
- IWorkbench workbench = PlatformUI.getWorkbench(); |
- for (IWorkbenchWindow window : workbench.getWorkbenchWindows()) { |
- for (IWorkbenchPage page : window.getPages()) { |
- IEditorReference[] allEditors = page.getEditorReferences(); |
- for (IEditorReference editorRef : allEditors) { |
- IEditorPart part = editorRef.getEditor(false); |
- if (part instanceof DartEditor) { |
- DartEditor otherEditor = (DartEditor) part; |
- if (otherEditor.getInputAnalysisContext() == context && otherEditor.isVisible()) { |
- Source otherSource = otherEditor.getInputSource(); |
- if (otherSource != null) { |
- sources.add(otherSource); |
+ private List<Source> getVisibleSourcesForContext(final AnalysisContext context) { |
+ final ArrayList<Source> sources = new ArrayList<Source>(); |
+ display.syncExec(new Runnable() { |
+ @Override |
+ public void run() { |
+ IWorkbench workbench = PlatformUI.getWorkbench(); |
+ for (IWorkbenchWindow window : workbench.getWorkbenchWindows()) { |
+ for (IWorkbenchPage page : window.getPages()) { |
+ IEditorReference[] allEditors = page.getEditorReferences(); |
+ for (IEditorReference editorRef : allEditors) { |
+ IEditorPart part = editorRef.getEditor(false); |
+ if (part instanceof DartEditor) { |
+ DartEditor otherEditor = (DartEditor) part; |
+ if (otherEditor.getInputAnalysisContext() == context && otherEditor.isVisible()) { |
+ Source otherSource = otherEditor.getInputSource(); |
+ if (otherSource != null) { |
+ sources.add(otherSource); |
+ } |
+ } |
} |
} |
} |
} |
} |
- } |
+ }); |
return sources; |
} |
@@ -306,7 +317,7 @@ |
/** |
* Clear the cached compilation unit and notify the context that the source has changed. |
* |
- * @param code the new source code (not {@code null}) |
+ * @param code the new source code or {@code null} if the source should be pulled from disk |
*/ |
private void sourceChanged(String code) { |
notifyContextTime = System.currentTimeMillis(); |
@@ -328,51 +339,40 @@ |
* from the priority list. |
*/ |
private void updateAnalysisPriorityOrder(final boolean isOpen) { |
- Display.getDefault().asyncExec(new Runnable() { |
- @Override |
- public void run() { |
- // TODO (danrubel): Revisit when reviewing performance of startup, open, and activate |
- AnalysisContext context = editor.getInputAnalysisContext(); |
- Source source = editor.getInputSource(); |
- if (context != null && source != null) { |
- List<Source> sources = getVisibleSourcesForContext(context); |
- sources.remove(source); |
- if (isOpen) { |
- sources.add(0, source); |
- } |
- updateAnalysisPriorityOrderInBackground(sources); |
- } |
+ // TODO (danrubel): Revisit when reviewing performance of startup, open, and activate |
+ AnalysisContext context = editor.getInputAnalysisContext(); |
+ Source source = editor.getInputSource(); |
+ if (context != null && source != null) { |
+ final List<Source> sources = getVisibleSourcesForContext(context); |
+ sources.remove(source); |
+ if (isOpen) { |
+ sources.add(0, source); |
} |
- }); |
+ // TODO (danrubel): Keep this off the UI thread until lock contention has been resolved |
+ if (Display.getCurrent() == null) { |
+ context.setAnalysisPriorityOrder(sources); |
+ } else { |
+ new Thread("updateAnalysisPriorityOrder") { |
+ @Override |
+ public void run() { |
+ AnalysisContext context = editor.getInputAnalysisContext(); |
+ if (context != null) { |
+ context.setAnalysisPriorityOrder(sources); |
+ } |
+ }; |
+ }.start(); |
+ } |
+ } |
} |
/** |
- * Update the order in which sources are analyzed in the context associated with the editor. |
- * |
- * @param sources the list of sources to be analyzed first (not <code>null</code>, contains no |
- * <code>null</code>s) |
- */ |
- private void updateAnalysisPriorityOrderInBackground(final List<Source> sources) { |
- // TODO (danrubel): Put this back on UI thread once analysis lock contention has been resolved |
- new Thread("updateAnalysisPriorityOrderInBackground") { |
- @Override |
- public void run() { |
- AnalysisContext context = editor.getInputAnalysisContext(); |
- if (context != null) { |
- context.setAnalysisPriorityOrder(sources); |
- } |
- }; |
- }.start(); |
- } |
- |
- /** |
* Update the source being analyzed in the context associated with the editor. |
* |
* @param isOpen {@code true} if the editor is open and the source should be cached or |
* {@code false} if the editor is closed and the source should read from disk. |
*/ |
private void updateSourceInBackground(final boolean isOpen) { |
- // TODO (danrubel): Put this back on UI thread once analysis lock contention has been resolved |
+ // TODO (danrubel): Keep this off the UI thread until lock contention has been resolved |
new Thread("updateSourceInBackground") { |
@Override |
public void run() { |