mirror of
https://github.com/sigmasternchen/xtext-core
synced 2025-03-16 16:58:56 +00:00
[ide] Added cancel indicator to new semantic highlighting API
Signed-off-by: Miro Spönemann <miro.spoenemann@itemis.de>
This commit is contained in:
parent
9434407af1
commit
84d7d3927c
3 changed files with 24 additions and 10 deletions
|
@ -19,8 +19,10 @@ import org.eclipse.xtext.nodemodel.INode;
|
|||
import org.eclipse.xtext.nodemodel.util.NodeModelUtils;
|
||||
import org.eclipse.xtext.parser.IParseResult;
|
||||
import org.eclipse.xtext.resource.XtextResource;
|
||||
import org.eclipse.xtext.service.OperationCanceledManager;
|
||||
import org.eclipse.xtext.tasks.ITaskFinder;
|
||||
import org.eclipse.xtext.tasks.Task;
|
||||
import org.eclipse.xtext.util.CancelIndicator;
|
||||
import org.eclipse.xtext.util.ITextRegion;
|
||||
|
||||
import com.google.inject.Inject;
|
||||
|
@ -33,15 +35,19 @@ public class DefaultSemanticHighlightingCalculator implements ISemanticHighlight
|
|||
|
||||
@Inject
|
||||
private ITaskFinder taskFinder;
|
||||
|
||||
@Inject
|
||||
private OperationCanceledManager operationCanceledManager;
|
||||
|
||||
@Override
|
||||
public void provideHighlightingFor(XtextResource resource, IHighlightedPositionAcceptor acceptor) {
|
||||
public void provideHighlightingFor(XtextResource resource, IHighlightedPositionAcceptor acceptor,
|
||||
CancelIndicator cancelIndicator) {
|
||||
if (resource == null)
|
||||
return;
|
||||
IParseResult parseResult = resource.getParseResult();
|
||||
if (parseResult == null || parseResult.getRootASTElement() == null)
|
||||
return;
|
||||
doProvideHighlightingFor(resource, acceptor);
|
||||
doProvideHighlightingFor(resource, acceptor, cancelIndicator);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -63,22 +69,26 @@ public class DefaultSemanticHighlightingCalculator implements ISemanticHighlight
|
|||
* @param acceptor
|
||||
* the acceptor. Is never <code>null</code>.
|
||||
*/
|
||||
protected void doProvideHighlightingFor(XtextResource resource, IHighlightedPositionAcceptor acceptor) {
|
||||
searchAndHighlightElements(resource, acceptor);
|
||||
protected void doProvideHighlightingFor(XtextResource resource, IHighlightedPositionAcceptor acceptor,
|
||||
CancelIndicator cancelIndicator) {
|
||||
searchAndHighlightElements(resource, acceptor, cancelIndicator);
|
||||
highlightTasks(resource, acceptor);
|
||||
}
|
||||
|
||||
protected void searchAndHighlightElements(XtextResource resource, IHighlightedPositionAcceptor acceptor) {
|
||||
protected void searchAndHighlightElements(XtextResource resource, IHighlightedPositionAcceptor acceptor,
|
||||
CancelIndicator cancelIndicator) {
|
||||
IParseResult parseResult = resource.getParseResult();
|
||||
if (parseResult == null)
|
||||
throw new IllegalStateException("resource#parseResult may not be null");
|
||||
EObject element = parseResult.getRootASTElement();
|
||||
highlightElementRecursively(element, acceptor);
|
||||
highlightElementRecursively(element, acceptor, cancelIndicator);
|
||||
}
|
||||
|
||||
protected void highlightElementRecursively(EObject element, IHighlightedPositionAcceptor acceptor) {
|
||||
protected void highlightElementRecursively(EObject element, IHighlightedPositionAcceptor acceptor,
|
||||
CancelIndicator cancelIndicator) {
|
||||
TreeIterator<EObject> iterator = EcoreUtil2.eAll(element);
|
||||
while (iterator.hasNext()) {
|
||||
operationCanceledManager.checkCanceled(cancelIndicator);
|
||||
EObject object = iterator.next();
|
||||
if (highlightElement(object, acceptor)) {
|
||||
iterator.prune();
|
||||
|
|
|
@ -8,6 +8,7 @@
|
|||
package org.eclipse.xtext.ide.editor.syntaxcoloring;
|
||||
|
||||
import org.eclipse.xtext.resource.XtextResource;
|
||||
import org.eclipse.xtext.util.CancelIndicator;
|
||||
|
||||
import com.google.inject.ImplementedBy;
|
||||
|
||||
|
@ -24,7 +25,9 @@ public interface ISemanticHighlightingCalculator {
|
|||
/**
|
||||
* @param resource the resource that will be highlighted. May be <code>null</code> in some rare cases.
|
||||
* @param acceptor used to announce the mapping from text-range to the style's id. The acceptor will never be <code>null</code>.
|
||||
* @param cancelIndicator used to determine whether we should stop searching for highlighting positions
|
||||
* (use {@code OperationCanceledManager} to check)
|
||||
*/
|
||||
void provideHighlightingFor(XtextResource resource, IHighlightedPositionAcceptor acceptor);
|
||||
void provideHighlightingFor(XtextResource resource, IHighlightedPositionAcceptor acceptor, CancelIndicator cancelIndicator);
|
||||
|
||||
}
|
||||
|
|
|
@ -12,6 +12,7 @@ import java.util.Collections;
|
|||
import java.util.List;
|
||||
|
||||
import org.eclipse.xtext.resource.XtextResource;
|
||||
import org.eclipse.xtext.util.CancelIndicator;
|
||||
import org.eclipse.xtext.ide.editor.syntaxcoloring.LightweightPosition.IntToStringArray;
|
||||
|
||||
import com.google.common.collect.Lists;
|
||||
|
@ -57,9 +58,9 @@ public class MergingHighlightedPositionAcceptor implements IHighlightedPositionA
|
|||
}
|
||||
|
||||
@Override
|
||||
public void provideHighlightingFor(XtextResource resource, IHighlightedPositionAcceptor acceptor) {
|
||||
public void provideHighlightingFor(XtextResource resource, IHighlightedPositionAcceptor acceptor, CancelIndicator cancelIndicator) {
|
||||
initialize();
|
||||
delegate.provideHighlightingFor(resource, this);
|
||||
delegate.provideHighlightingFor(resource, this, cancelIndicator);
|
||||
mergePositions();
|
||||
for(LightweightPosition pos: getPositions())
|
||||
acceptor.addPosition(pos.getOffset(), pos.getLength(), pos.getIds());
|
||||
|
|
Loading…
Reference in a new issue