如何在 Xtext 中实现 SemanticHighlightingCalculator
How to implement SemanticHighlightingCalculator in Xtext
我想为我的领域特定语言 (DSL) 自定义语法突出显示。
我想实现 YourDslSemanticHighlightingCalculator。
我在网上找到这段代码:
public class MySemanticHighlightingCalculator implements ISemanticHighlightingCalculator
{
@Override
public void provideHighlightingFor(XtextResource resource, IHighlightedPositionAcceptor acceptor)
{
if (resource == null || resource.getParseResult() == null)
return;
INode root = resource.getParseResult().getRootNode();
for (INode node : root.getAsTreeIterable())
{
if (node.getSemanticElement() instanceof DocCommentElement)
{
acceptor.addPosition(node.getOffset(), node.getLength(),
MyHighlightingConfiguration.DOCUMENTATION_COMMENT_ID);
}
}
}
}
来自这边:
https://www.eclipse.org/forums/index.php/t/1067057/
据我所知,Java 不再是可实现的语言。我们应该在Xtend中实现。
通过进一步研究和查看文档:
https://www.eclipse.org/Xtext/documentation/310_eclipse_support.html#highlighting
我最终得到了以下文件:
package org.xtext.example.mydsl.ui;
import java.util.Iterator;
import java.util.List;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.EStructuralFeature;
import org.eclipse.emf.ecore.util.EcoreUtil;
import org.eclipse.xtext.nodemodel.ILeafNode;
import org.eclipse.xtext.nodemodel.INode;
import org.eclipse.xtext.nodemodel.util.NodeModelUtils;
import org.eclipse.xtext.resource.XtextResource;
import org.eclipse.xtext.ui.editor.syntaxcoloring.IHighlightedPositionAcceptor;
import org.eclipse.xtext.ui.editor.syntaxcoloring.ISemanticHighlightingCalculator;
public class YourDslSemanticHighlightingCalculator implements ISemanticHighlightingCalculator {
override provideHighlightingFor(XtextResource resource, IHighlightedPositionAcceptor acceptor) {
if (resource == null || resource.getParseResult() == null)
return;
// INode root = resource.getParseResult().getRootNode();
// for (INode node : root.getAsTreeIterable()) {
// if (node.getGrammarElement() instanceof CrossReference) {
// acceptor.addPosition(node.getOffset(), node.getLength(),
// MyHighlightingConfiguration.CROSS_REF);
// }
INode root = resource.getParseResult().getRootNode();
for (INode node : root.getAsTreeIterable())
{
if (node.getSemanticElement() instanceof DocCommentElement)
{
acceptor.addPosition(node.getOffset(), node.getLength(),
MyHighlightingConfiguration.DOCUMENTATION_COMMENT_ID);
}
}
}
}
我有以下问题:
- IHighlightedPositionAcceptor 已弃用
- ISemanticHighlightingCalculator 已弃用
- 可以导入 INode,但“此上下文中不允许使用该表达式,因为它不会导致任何副作用”
但在“语义高亮”下的官方文档中,他们也使用 INode。
总的来说,我觉得我没有按照预期的方式去做。那么,预期的方式是什么?我应该怎么做语义高亮?
可以使用以下方式修复导入:
import org.eclipse.xtext.ide.editor.syntaxcoloring.IHighlightedPositionAcceptor;
import org.eclipse.xtext.ide.editor.syntaxcoloring.ISemanticHighlightingCalculator;
感谢克里斯蒂安的评论。大多数人 post 他们的代码没有导入。所以我不知道从哪里进口。
尽管在项目文件夹的上下文菜单中它们只列出了“new Xtend class”,但使用 java 似乎更好:INode 错误可以由此解决。
我想为我的领域特定语言 (DSL) 自定义语法突出显示。 我想实现 YourDslSemanticHighlightingCalculator。 我在网上找到这段代码:
public class MySemanticHighlightingCalculator implements ISemanticHighlightingCalculator
{
@Override
public void provideHighlightingFor(XtextResource resource, IHighlightedPositionAcceptor acceptor)
{
if (resource == null || resource.getParseResult() == null)
return;
INode root = resource.getParseResult().getRootNode();
for (INode node : root.getAsTreeIterable())
{
if (node.getSemanticElement() instanceof DocCommentElement)
{
acceptor.addPosition(node.getOffset(), node.getLength(),
MyHighlightingConfiguration.DOCUMENTATION_COMMENT_ID);
}
}
}
}
来自这边: https://www.eclipse.org/forums/index.php/t/1067057/
据我所知,Java 不再是可实现的语言。我们应该在Xtend中实现。
通过进一步研究和查看文档: https://www.eclipse.org/Xtext/documentation/310_eclipse_support.html#highlighting 我最终得到了以下文件:
package org.xtext.example.mydsl.ui;
import java.util.Iterator;
import java.util.List;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.EStructuralFeature;
import org.eclipse.emf.ecore.util.EcoreUtil;
import org.eclipse.xtext.nodemodel.ILeafNode;
import org.eclipse.xtext.nodemodel.INode;
import org.eclipse.xtext.nodemodel.util.NodeModelUtils;
import org.eclipse.xtext.resource.XtextResource;
import org.eclipse.xtext.ui.editor.syntaxcoloring.IHighlightedPositionAcceptor;
import org.eclipse.xtext.ui.editor.syntaxcoloring.ISemanticHighlightingCalculator;
public class YourDslSemanticHighlightingCalculator implements ISemanticHighlightingCalculator {
override provideHighlightingFor(XtextResource resource, IHighlightedPositionAcceptor acceptor) {
if (resource == null || resource.getParseResult() == null)
return;
// INode root = resource.getParseResult().getRootNode();
// for (INode node : root.getAsTreeIterable()) {
// if (node.getGrammarElement() instanceof CrossReference) {
// acceptor.addPosition(node.getOffset(), node.getLength(),
// MyHighlightingConfiguration.CROSS_REF);
// }
INode root = resource.getParseResult().getRootNode();
for (INode node : root.getAsTreeIterable())
{
if (node.getSemanticElement() instanceof DocCommentElement)
{
acceptor.addPosition(node.getOffset(), node.getLength(),
MyHighlightingConfiguration.DOCUMENTATION_COMMENT_ID);
}
}
}
}
我有以下问题:
- IHighlightedPositionAcceptor 已弃用
- ISemanticHighlightingCalculator 已弃用
- 可以导入 INode,但“此上下文中不允许使用该表达式,因为它不会导致任何副作用”
但在“语义高亮”下的官方文档中,他们也使用 INode。
总的来说,我觉得我没有按照预期的方式去做。那么,预期的方式是什么?我应该怎么做语义高亮?
可以使用以下方式修复导入:
import org.eclipse.xtext.ide.editor.syntaxcoloring.IHighlightedPositionAcceptor;
import org.eclipse.xtext.ide.editor.syntaxcoloring.ISemanticHighlightingCalculator;
感谢克里斯蒂安的评论。大多数人 post 他们的代码没有导入。所以我不知道从哪里进口。
尽管在项目文件夹的上下文菜单中它们只列出了“new Xtend class”,但使用 java 似乎更好:INode 错误可以由此解决。