From 16750b6528efb247ad0e656088eca2dc3c6486c9 Mon Sep 17 00:00:00 2001 From: Jonah Graham Date: Fri, 18 Sep 2020 10:48:16 -0400 Subject: [PATCH] Bug 567124: Disable QML Analyzer relatively quietly on Java 15 Instead of pop-up NPEs and hung UI, log once that QML Analyzer is unsupported. Change-Id: I4ad599e870bd73f5cbda8992dedb14405af545f4 (cherry picked from commit 6d76cc5839e435482c7c711c11db36e617738101) --- .../.settings/.api_filters | 11 ++++++++ .../cdt/internal/qt/core/QMLAnalyzer.java | 25 ++++++++++++++++--- .../org/eclipse/cdt/qt/core/IQMLAnalyzer.java | 8 ++++++ .../ui/editor/QMLContentAssistProcessor.java | 3 +++ .../cdt/internal/qt/ui/editor/QMLEditor.java | 16 ++++++------ .../internal/qt/ui/editor/QMLHyperlink.java | 4 +++ .../qt/ui/editor/QMLHyperlinkDetector.java | 7 ++++++ .../qt/ui/resources/QMLTernFileUpdateJob.java | 3 +++ 8 files changed, 67 insertions(+), 10 deletions(-) create mode 100644 qt/org.eclipse.cdt.qt.core/.settings/.api_filters diff --git a/qt/org.eclipse.cdt.qt.core/.settings/.api_filters b/qt/org.eclipse.cdt.qt.core/.settings/.api_filters new file mode 100644 index 00000000000..b7f2c7cf936 --- /dev/null +++ b/qt/org.eclipse.cdt.qt.core/.settings/.api_filters @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/qt/org.eclipse.cdt.qt.core/src/org/eclipse/cdt/internal/qt/core/QMLAnalyzer.java b/qt/org.eclipse.cdt.qt.core/src/org/eclipse/cdt/internal/qt/core/QMLAnalyzer.java index b347e5404e8..5f04092fcf3 100644 --- a/qt/org.eclipse.cdt.qt.core/src/org/eclipse/cdt/internal/qt/core/QMLAnalyzer.java +++ b/qt/org.eclipse.cdt.qt.core/src/org/eclipse/cdt/internal/qt/core/QMLAnalyzer.java @@ -39,6 +39,7 @@ public class QMLAnalyzer implements IQMLAnalyzer { private QMLModuleResolver moduleResolver; private ScriptEngine engine; + private Boolean supported; private Invocable invoke; private Object tern; @@ -46,6 +47,14 @@ public class QMLAnalyzer implements IQMLAnalyzer { public void load() throws ScriptException, IOException, NoSuchMethodException { moduleResolver = new QMLModuleResolver(this); engine = new ScriptEngineManager().getEngineByName("nashorn"); + if (engine == null) { + synchronized (this) { + supported = false; + notifyAll(); + } + throw new ScriptException( + "Nashorn script engine is not available in Java 15 and above. The QML Analyzer is not supported."); + } invoke = (Invocable) engine; loadDep("/tern-qml/node_modules/acorn/dist/acorn.js"); @@ -100,6 +109,7 @@ public class QMLAnalyzer implements IQMLAnalyzer { synchronized (this) { tern = invoke.invokeFunction("newTernServer", options); + supported = tern != null; notifyAll(); } } @@ -126,16 +136,25 @@ public class QMLAnalyzer implements IQMLAnalyzer { } } - private void waitUntilLoaded() { + @Override + public boolean isSupported() { synchronized (this) { - while (tern == null) { + while (supported == null) { try { wait(); } catch (InterruptedException e) { Activator.log(e); - return; + return false; } } + return supported; + } + } + + private void waitUntilLoaded() throws ScriptException { + if (!isSupported()) { + throw new ScriptException( + "Nashorn script engine is not available in Java 15 and above. The QML Analyzer is not supported."); } } diff --git a/qt/org.eclipse.cdt.qt.core/src/org/eclipse/cdt/qt/core/IQMLAnalyzer.java b/qt/org.eclipse.cdt.qt.core/src/org/eclipse/cdt/qt/core/IQMLAnalyzer.java index 88f7b2a7213..6a4e5591731 100644 --- a/qt/org.eclipse.cdt.qt.core/src/org/eclipse/cdt/qt/core/IQMLAnalyzer.java +++ b/qt/org.eclipse.cdt.qt.core/src/org/eclipse/cdt/qt/core/IQMLAnalyzer.java @@ -24,6 +24,14 @@ import org.eclipse.cdt.qt.core.qmljs.IQmlASTNode; public interface IQMLAnalyzer { + /** + * Added in CDT 10.0.1 with no version bump. See Bug 567124. + * @since 2.3 + */ + default boolean isSupported() { + return true; + } + void addFile(String fileName, String code) throws NoSuchMethodException, ScriptException; void deleteFile(String fileName) throws NoSuchMethodException, ScriptException; diff --git a/qt/org.eclipse.cdt.qt.ui/src/org/eclipse/cdt/internal/qt/ui/editor/QMLContentAssistProcessor.java b/qt/org.eclipse.cdt.qt.ui/src/org/eclipse/cdt/internal/qt/ui/editor/QMLContentAssistProcessor.java index 1a6fa9c1d3a..1d7dde76579 100644 --- a/qt/org.eclipse.cdt.qt.ui/src/org/eclipse/cdt/internal/qt/ui/editor/QMLContentAssistProcessor.java +++ b/qt/org.eclipse.cdt.qt.ui/src/org/eclipse/cdt/internal/qt/ui/editor/QMLContentAssistProcessor.java @@ -41,6 +41,9 @@ public class QMLContentAssistProcessor implements IContentAssistProcessor { @Override public ICompletionProposal[] computeCompletionProposals(ITextViewer viewer, int offset) { + if (analyzer == null || !analyzer.isSupported()) { + return NO_COMPLETIONS; + } IDocument document = viewer.getDocument(); String prefix = lastWord(document, offset); // Save the file diff --git a/qt/org.eclipse.cdt.qt.ui/src/org/eclipse/cdt/internal/qt/ui/editor/QMLEditor.java b/qt/org.eclipse.cdt.qt.ui/src/org/eclipse/cdt/internal/qt/ui/editor/QMLEditor.java index a076895130b..5a501835227 100644 --- a/qt/org.eclipse.cdt.qt.ui/src/org/eclipse/cdt/internal/qt/ui/editor/QMLEditor.java +++ b/qt/org.eclipse.cdt.qt.ui/src/org/eclipse/cdt/internal/qt/ui/editor/QMLEditor.java @@ -81,13 +81,15 @@ public class QMLEditor extends TextEditor { String fileName = new File(fileInput.getFile().getLocationURI()).getAbsolutePath(); IDocument document = getSourceViewer().getDocument(); - try { - analyzer.deleteFile(fileName); - analyzer.addFile(fileName, document.get()); - } catch (NoSuchMethodException e) { - Activator.log(e); - } catch (ScriptException e) { - Activator.log(e); + if (analyzer != null && analyzer.isSupported()) { + try { + analyzer.deleteFile(fileName); + analyzer.addFile(fileName, document.get()); + } catch (NoSuchMethodException e) { + Activator.log(e); + } catch (ScriptException e) { + Activator.log(e); + } } super.doSave(progressMonitor); } diff --git a/qt/org.eclipse.cdt.qt.ui/src/org/eclipse/cdt/internal/qt/ui/editor/QMLHyperlink.java b/qt/org.eclipse.cdt.qt.ui/src/org/eclipse/cdt/internal/qt/ui/editor/QMLHyperlink.java index 49f5c624bf4..3b76d00a591 100644 --- a/qt/org.eclipse.cdt.qt.ui/src/org/eclipse/cdt/internal/qt/ui/editor/QMLHyperlink.java +++ b/qt/org.eclipse.cdt.qt.ui/src/org/eclipse/cdt/internal/qt/ui/editor/QMLHyperlink.java @@ -61,6 +61,10 @@ public class QMLHyperlink implements IHyperlink { @Override public void open() { IQMLAnalyzer analyzer = Activator.getService(IQMLAnalyzer.class); + if (analyzer == null || !analyzer.isSupported()) { + return; + } + try { IDocument document = viewer.getDocument(); String selected = document.get(region.getOffset(), region.getLength()); diff --git a/qt/org.eclipse.cdt.qt.ui/src/org/eclipse/cdt/internal/qt/ui/editor/QMLHyperlinkDetector.java b/qt/org.eclipse.cdt.qt.ui/src/org/eclipse/cdt/internal/qt/ui/editor/QMLHyperlinkDetector.java index de8a3cb723f..a5174e6d0eb 100644 --- a/qt/org.eclipse.cdt.qt.ui/src/org/eclipse/cdt/internal/qt/ui/editor/QMLHyperlinkDetector.java +++ b/qt/org.eclipse.cdt.qt.ui/src/org/eclipse/cdt/internal/qt/ui/editor/QMLHyperlinkDetector.java @@ -10,6 +10,8 @@ *******************************************************************************/ package org.eclipse.cdt.internal.qt.ui.editor; +import org.eclipse.cdt.internal.qt.core.Activator; +import org.eclipse.cdt.qt.core.IQMLAnalyzer; import org.eclipse.jface.text.IRegion; import org.eclipse.jface.text.ITextViewer; import org.eclipse.jface.text.hyperlink.AbstractHyperlinkDetector; @@ -20,6 +22,11 @@ public class QMLHyperlinkDetector extends AbstractHyperlinkDetector { @Override public IHyperlink[] detectHyperlinks(ITextViewer textViewer, IRegion region, boolean canShowMultipleHyperlinks) { + IQMLAnalyzer analyzer = Activator.getService(IQMLAnalyzer.class); + if (analyzer == null || !analyzer.isSupported()) { + return null; + } + // TODO is length of region ever > 0? IRegion wordRegion = QMLEditor.findWord(textViewer.getDocument(), region.getOffset()); if (wordRegion != null) { diff --git a/qt/org.eclipse.cdt.qt.ui/src/org/eclipse/cdt/internal/qt/ui/resources/QMLTernFileUpdateJob.java b/qt/org.eclipse.cdt.qt.ui/src/org/eclipse/cdt/internal/qt/ui/resources/QMLTernFileUpdateJob.java index c0c6c7cfaaa..26eac6509c1 100644 --- a/qt/org.eclipse.cdt.qt.ui/src/org/eclipse/cdt/internal/qt/ui/resources/QMLTernFileUpdateJob.java +++ b/qt/org.eclipse.cdt.qt.ui/src/org/eclipse/cdt/internal/qt/ui/resources/QMLTernFileUpdateJob.java @@ -42,6 +42,9 @@ public class QMLTernFileUpdateJob extends Job { @Override protected IStatus run(IProgressMonitor monitor) { + if (analyzer == null || !analyzer.isSupported()) { + return Status.OK_STATUS; + } for (IResourceDelta delta : deltaList) { IResource resource = delta.getResource(); String fileName = resource.getFullPath().toString().substring(1);