[ide] Added cancel indicator to new semantic highlighting API

Signed-off-by: Miro Spönemann <miro.spoenemann@itemis.de>
This commit is contained in:
Miro Spönemann 2015-07-15 17:44:54 +02:00
parent 9434407af1
commit 84d7d3927c
3 changed files with 24 additions and 10 deletions

View file

@ -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();

View file

@ -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);
}

View file

@ -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());