/******************************************************************************* * Copyright (c) 2017 itemis AG and others. * * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * Tamas Miklossy (itemis AG) - initial API and implementation (bug #321775) * *******************************************************************************/ package org.eclipse.gef.dot.internal.ui.language.highlighting; import java.io.InputStream; import org.eclipse.emf.common.util.URI; import org.eclipse.emf.ecore.util.EcoreUtil; import org.eclipse.gef.dot.internal.ui.language.internal.DotActivator; import org.eclipse.xtext.linking.lazy.LazyLinkingResource; import org.eclipse.xtext.resource.IResourceFactory; import org.eclipse.xtext.resource.XtextResource; import org.eclipse.xtext.resource.XtextResourceSet; import org.eclipse.xtext.ui.editor.syntaxcoloring.IHighlightedPositionAcceptor; import org.eclipse.xtext.ui.editor.syntaxcoloring.ISemanticHighlightingCalculator; import org.eclipse.xtext.util.CancelIndicator; import org.eclipse.xtext.util.StringInputStream; import com.google.inject.Injector; public class DotSubgrammarHighlighter { private String language; public DotSubgrammarHighlighter(String language) { this.language = language; } public void provideHightlightingFor(String text, int startOffset, IHighlightedPositionAcceptor hostGrammarAcceptor) { Injector injector = DotActivator.getInstance().getInjector(language); ISemanticHighlightingCalculator subgrammarCalculator = injector .getInstance(ISemanticHighlightingCalculator.class); XtextResource xtextResource = null; try { xtextResource = doGetResource(injector, new StringInputStream(text), URI.createURI("dummy:/example.mydsl")); //$NON-NLS-1$ } catch (Exception e) { e.printStackTrace(); } subgrammarCalculator.provideHighlightingFor(xtextResource, new IHighlightedPositionAcceptor() { @Override public void addPosition(int offset, int length, String... id) { hostGrammarAcceptor.addPosition(startOffset + offset, length, id); } }); } private XtextResource doGetResource(Injector injector, InputStream in, URI uri) throws Exception { XtextResourceSet rs = injector.getInstance(XtextResourceSet.class); rs.setClasspathURIContext(getClass()); XtextResource resource = (XtextResource) injector .getInstance(IResourceFactory.class).createResource(uri); rs.getResources().add(resource); resource.load(in, null); if (resource instanceof LazyLinkingResource) { ((LazyLinkingResource) resource) .resolveLazyCrossReferences(CancelIndicator.NullImpl); } else { EcoreUtil.resolveAll(resource); } return resource; } }