diff options
author | Christoph Läubrich | 2021-01-29 10:30:09 +0000 |
---|---|---|
committer | Mickael Istria | 2021-01-31 17:23:47 +0000 |
commit | 013925a7e22618bef7ed8e968ee4a935d8a61d68 (patch) | |
tree | 4f9385fe05d399f3c163e370ce0f8cd987f829b2 | |
parent | 81ce03674338571701849d494577cf55101c26b2 (diff) | |
download | eclipse.platform.text-013925a7e22618bef7ed8e968ee4a935d8a61d68.tar.gz eclipse.platform.text-013925a7e22618bef7ed8e968ee4a935d8a61d68.tar.xz eclipse.platform.text-013925a7e22618bef7ed8e968ee4a935d8a61d68.zip |
Bug 570727 - [codemining] Codeminings computed multiple timesI20210131-1800
if the same CodminingReconciler is added multiple times (e.g. for
different content-type, from different plugins for the same content
type) the codeminings are calculated for every change multiple times.
To fix this a check is added that the reconcilingstrategy is only
installed once for a given viewer.
Change-Id: Id9609ac4453c4760b7a835fde1e39205e8ababb1
Signed-off-by: Christoph Läubrich <laeubi@laeubi-soft.de>
-rw-r--r-- | org.eclipse.jface.text/src/org/eclipse/jface/text/codemining/CodeMiningReconciler.java | 26 | ||||
-rw-r--r-- | org.eclipse.jface.text/src/org/eclipse/jface/text/codemining/CodeMiningStrategy.java | 24 |
2 files changed, 30 insertions, 20 deletions
diff --git a/org.eclipse.jface.text/src/org/eclipse/jface/text/codemining/CodeMiningReconciler.java b/org.eclipse.jface.text/src/org/eclipse/jface/text/codemining/CodeMiningReconciler.java index afe0799b3b3..cf66a7d2824 100644 --- a/org.eclipse.jface.text/src/org/eclipse/jface/text/codemining/CodeMiningReconciler.java +++ b/org.eclipse.jface.text/src/org/eclipse/jface/text/codemining/CodeMiningReconciler.java @@ -1,5 +1,5 @@ /** - * Copyright (c) 2017 Angelo ZERR. + * Copyright (c) 2017, 2021 Angelo ZERR. * * This program and the accompanying materials * are made available under the terms of the Eclipse Public License 2.0 @@ -10,12 +10,14 @@ * * Contributors: * Angelo Zerr <angelo.zerr@gmail.com> - [CodeMining] Provide extension point for CodeMining - Bug 528419 + * Christoph Läubrich - Bug 570727 - [codemining] Codeminings computed multiple times */ package org.eclipse.jface.text.codemining; import org.eclipse.jface.text.IDocument; import org.eclipse.jface.text.ITextViewer; import org.eclipse.jface.text.reconciler.Reconciler; +import org.eclipse.jface.text.source.ISourceViewerExtension5; /** * A reconciler which update code minings. @@ -24,24 +26,32 @@ import org.eclipse.jface.text.reconciler.Reconciler; */ public class CodeMiningReconciler extends Reconciler { - private CodeMiningStrategy fStrategy; + private static final String KEY= CodeMiningReconciler.class.getName(); public CodeMiningReconciler() { super.setIsIncrementalReconciler(false); - fStrategy= new CodeMiningStrategy(); - this.setReconcilingStrategy(fStrategy, IDocument.DEFAULT_CONTENT_TYPE); + this.setReconcilingStrategy(new CodeMiningStrategy(() -> getTextViewer()), IDocument.DEFAULT_CONTENT_TYPE); } @Override public void install(ITextViewer textViewer) { - super.install(textViewer); - fStrategy.install(textViewer); + if (mustInstall(textViewer)) { + super.install(textViewer); + textViewer.getTextWidget().setData(KEY, this); + } } @Override public void uninstall() { - super.uninstall(); - fStrategy.uninstall(); + ITextViewer viewer= getTextViewer(); + if (viewer != null && viewer.getTextWidget().getData(KEY) == this) { + super.uninstall(); + viewer.getTextWidget().setData(KEY, null); + } } + + private static boolean mustInstall(ITextViewer textViewer) { + return textViewer instanceof ISourceViewerExtension5 && textViewer.getTextWidget().getData(KEY) == null; + } } diff --git a/org.eclipse.jface.text/src/org/eclipse/jface/text/codemining/CodeMiningStrategy.java b/org.eclipse.jface.text/src/org/eclipse/jface/text/codemining/CodeMiningStrategy.java index 50290aa106f..be2e49bdc98 100644 --- a/org.eclipse.jface.text/src/org/eclipse/jface/text/codemining/CodeMiningStrategy.java +++ b/org.eclipse.jface.text/src/org/eclipse/jface/text/codemining/CodeMiningStrategy.java @@ -1,5 +1,5 @@ /** - * Copyright (c) 2017 Angelo ZERR. + * Copyright (c) 2017, 2021 Angelo ZERR. * * This program and the accompanying materials * are made available under the terms of the Eclipse Public License 2.0 @@ -10,9 +10,12 @@ * * Contributors: * Angelo Zerr <angelo.zerr@gmail.com> - [CodeMining] Provide extension point for CodeMining - Bug 528419 + * Christoph Läubrich - Bug 570727 - [codemining] Codeminings computed multiple times */ package org.eclipse.jface.text.codemining; +import java.util.function.Supplier; + import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.jface.text.IDocument; @@ -30,14 +33,14 @@ import org.eclipse.jface.text.source.ISourceViewerExtension5; */ class CodeMiningStrategy implements IReconcilingStrategy, IReconcilingStrategyExtension { - private ISourceViewerExtension5 fViewer; - public void install(ITextViewer viewer) { - if (viewer instanceof ISourceViewerExtension5) { - fViewer= (ISourceViewerExtension5) viewer; - } + private Supplier<ITextViewer> fViewerSupplier; + + public CodeMiningStrategy(Supplier<ITextViewer> viewerSupplier) { + fViewerSupplier= viewerSupplier; } + @Override public void initialReconcile() { // Do nothing @@ -48,15 +51,12 @@ class CodeMiningStrategy implements IReconcilingStrategy, IReconcilingStrategyEx @Override public void reconcile(IRegion partition) { - if (fViewer != null) { - fViewer.updateCodeMinings(); + ITextViewer viewer= fViewerSupplier.get(); + if (viewer instanceof ISourceViewerExtension5) { + ((ISourceViewerExtension5) viewer).updateCodeMinings(); } } - public void uninstall() { - fViewer= null; - } - @Override public void setProgressMonitor(IProgressMonitor monitor) { // Do nothing |