Skip to main content
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSergey Prigogin2010-09-11 17:45:12 +0000
committerSergey Prigogin2010-09-11 17:45:12 +0000
commit7b5f6e1c4e27b4f7cf1145856fbfa4e93cb582b5 (patch)
tree6c777e0ff95174c9bbc7d528d74ebb1b10a9bb9e
parent80dc4eb803dcbc8e13b6276d9929af17ca33d87b (diff)
downloadorg.eclipse.cdt-7b5f6e1c4e27b4f7cf1145856fbfa4e93cb582b5.tar.gz
org.eclipse.cdt-7b5f6e1c4e27b4f7cf1145856fbfa4e93cb582b5.tar.xz
org.eclipse.cdt-7b5f6e1c4e27b4f7cf1145856fbfa4e93cb582b5.zip
Bug 324232 - CElementHyperlinkDetector blocks UI thread waiting for an AST
-rw-r--r--core/org.eclipse.cdt.ui.tests/ui/org/eclipse/cdt/ui/tests/text/HyperlinkTest.java33
-rw-r--r--core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/editor/CElementHyperlinkDetector.java4
2 files changed, 28 insertions, 9 deletions
diff --git a/core/org.eclipse.cdt.ui.tests/ui/org/eclipse/cdt/ui/tests/text/HyperlinkTest.java b/core/org.eclipse.cdt.ui.tests/ui/org/eclipse/cdt/ui/tests/text/HyperlinkTest.java
index 2f81bdbabf6..f3290e9892d 100644
--- a/core/org.eclipse.cdt.ui.tests/ui/org/eclipse/cdt/ui/tests/text/HyperlinkTest.java
+++ b/core/org.eclipse.cdt.ui.tests/ui/org/eclipse/cdt/ui/tests/text/HyperlinkTest.java
@@ -7,6 +7,7 @@
*
* Contributors:
* IBM Corporation - initial API and implementation
+ * Sergey Prigogin (Google)
*******************************************************************************/
package org.eclipse.cdt.ui.tests.text;
@@ -15,17 +16,27 @@ import junit.framework.TestSuite;
import org.eclipse.core.resources.IContainer;
import org.eclipse.core.resources.IFile;
+import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.NullProgressMonitor;
+import org.eclipse.core.runtime.Status;
import org.eclipse.jface.text.IRegion;
import org.eclipse.jface.text.Region;
import org.eclipse.jface.text.hyperlink.IHyperlink;
import org.eclipse.cdt.core.dom.IPDOMManager;
+import org.eclipse.cdt.core.dom.ast.IASTTranslationUnit;
import org.eclipse.cdt.core.model.ICContainer;
import org.eclipse.cdt.core.model.ICProject;
+import org.eclipse.cdt.core.model.ILanguage;
+import org.eclipse.cdt.core.model.IWorkingCopy;
import org.eclipse.cdt.core.testplugin.CProjectHelper;
+import org.eclipse.cdt.ui.CUIPlugin;
+import org.eclipse.cdt.ui.IWorkingCopyManager;
import org.eclipse.cdt.ui.testplugin.EditorTestHelper;
+import org.eclipse.cdt.internal.core.model.ASTCache.ASTRunnable;
+
+import org.eclipse.cdt.internal.ui.editor.ASTProvider;
import org.eclipse.cdt.internal.ui.editor.CEditor;
import org.eclipse.cdt.internal.ui.editor.CElementHyperlinkDetector;
@@ -37,7 +48,6 @@ import org.eclipse.cdt.internal.ui.editor.CElementHyperlinkDetector;
* @author Mike Kucera
*/
public class HyperlinkTest extends TestCase {
-
private static final String CPP_FILE_NAME = "hyperlink_test_cpp.cpp";
private static final String CPP_CODE =
"#include <stdio.h> \n" +
@@ -76,7 +86,6 @@ public class HyperlinkTest extends TestCase {
private ICProject project;
private CEditor editor;
-
public static TestSuite suite() {
return new TestSuite(HyperlinkTest.class);
}
@@ -85,12 +94,21 @@ public class HyperlinkTest extends TestCase {
super.setUp();
project= CProjectHelper.createCCProject(super.getName(), "unused", IPDOMManager.ID_NO_INDEXER);
ICContainer cContainer= CProjectHelper.addCContainer(project, "src");
- IFile file= EditorTestHelper.createFile((IContainer)cContainer.getResource(), fileName, code, new NullProgressMonitor());
+ IFile file= EditorTestHelper.createFile((IContainer) cContainer.getResource(), fileName, code, new NullProgressMonitor());
assertNotNull(file);
assertTrue(file.exists());
- editor = (CEditor)EditorTestHelper.openInEditor(file, true);
+ editor = (CEditor) EditorTestHelper.openInEditor(file, true);
EditorTestHelper.joinReconciler(EditorTestHelper.getSourceViewer(editor), 10, 1000, 10);
+ // Since CElementHyperlinkDetector doesn't wait for an AST to be created,
+ // we trigger AST creation ahead of time.
+ IWorkingCopyManager manager = CUIPlugin.getDefault().getWorkingCopyManager();
+ IWorkingCopy workingCopy = manager.getWorkingCopy(editor.getEditorInput());
+ IStatus status= ASTProvider.getASTProvider().runOnAST(workingCopy, ASTProvider.WAIT_IF_OPEN, null, new ASTRunnable() {
+ public IStatus runOnAST(ILanguage lang, IASTTranslationUnit ast) {
+ return Status.OK_STATUS;
+ }
+ });
}
@Override
@@ -119,8 +137,7 @@ public class HyperlinkTest extends TestCase {
IHyperlink[] links = getHyperlinks(mouseOffset);
assertNull(links);
}
-
-
+
public void testHyperlinksCpp() throws Exception {
// entire include highlighted
setUpEditor(CPP_FILE_NAME, CPP_CODE);
@@ -129,9 +146,9 @@ public class HyperlinkTest extends TestCase {
assertHyperlink(CPP_CODE.indexOf("<stdio.h>") + 2, 0, "#include <stdio.h>".length());
assertHyperlink(CPP_CODE.indexOf("<stdio.h>") + "<stdio.h".length(), 0, "#include <stdio.h>".length());
- // hovering over the whitspace inside an include still results in a hyperlink
+ // hovering over the whitespace inside an include still results in a hyperlink
assertHyperlink(CPP_CODE.indexOf("<stdio.h>") - 1, 0, "#include <stdio.h>".length());
-
+
// no hyperlinks in macro bodies
assertNotHyperlink(CPP_CODE.indexOf("#define") + 1);
assertHyperlink(CPP_CODE.indexOf("SOMEMACRO"), CPP_CODE.indexOf("SOMEMACRO"), "SOMEMACRO".length());
diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/editor/CElementHyperlinkDetector.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/editor/CElementHyperlinkDetector.java
index 173845d6b62..7d5b262a3f4 100644
--- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/editor/CElementHyperlinkDetector.java
+++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/editor/CElementHyperlinkDetector.java
@@ -73,7 +73,9 @@ public class CElementHyperlinkDetector extends AbstractHyperlinkDetector {
}
final IHyperlink[] result= {null};
- IStatus status= ASTProvider.getASTProvider().runOnAST(workingCopy, ASTProvider.WAIT_ACTIVE_ONLY, null, new ASTRunnable() {
+ // Do not wait for AST if it's not available yet. Waiting for AST would block the UI thread
+ // for the duration of the parsing.
+ IStatus status= ASTProvider.getASTProvider().runOnAST(workingCopy, ASTProvider.WAIT_NO, null, new ASTRunnable() {
public IStatus runOnAST(ILanguage lang, IASTTranslationUnit ast) {
if (ast != null) {
final int offset= region.getOffset();

Back to the top