隐含声明

时间:2015-04-02 08:30:56

标签: xtext

我正在尝试使用隐式声明来创建语法。在阅读论坛条目(http://www.eclipse.org/forums/index.php?t=msg&S=2e4a29d7fff0322e71b35e3a3aa63e3f&th=198813&goto=634090#msg_634090)后,我编写了自己的LinkingService:

public class OntMLLinkingService extends DefaultLinkingService {
    private final Map<Rule, Resource> implicitVariables = new HashMap<>();

    public List<EObject> getLinkedObjects(EObject context, EReference ref, INode node) throws IllegalNodeException {
        List<EObject> linking = super.getLinkedObjects(context, ref, node);
        if (!linking.isEmpty())
            return linking;

        if (context instanceof VariableReference && ref.equals(OntMLPackage.eINSTANCE.getVariableReference_Variable())) {
            // Find the rule, the references is used in
            EObject container = context.eContainer();
            while (!(container instanceof Rule))
                container = container.eContainer();

            Rule rule = (Rule) container;

            // Check, if a resource was already created for the rule
            Resource res = implicitVariables.get(rule);
            if (res == null) {
                // Create and register new resource
                res =
                        rule.eResource().getResourceSet()
                                .createResource(URI.createURI("http://wwwcs.vs.hs-rm.de/OntML/Variable/" + UUID.randomUUID()));
                implicitVariables.put(rule, res);
            }

            // Get the cross ref string
            final String crossRefString = getCrossRefNodeAsString(node);
            if (crossRefString != null && !crossRefString.equals("")) {

                // Search for the variable in the resource
                Optional<Variable> existingVar =
                        res.getContents().stream().map(eobj -> (Variable) eobj).filter(var -> var.getName().equals(crossRefString))
                                .findAny();

                if (!existingVar.isPresent()) {
                    // Create and register new variable, if the variable does not exist yet
                    Variable newvar = OntMLFactory.eINSTANCE.createVariable();
                    newvar.setName(crossRefString);
                    res.getContents().add(newvar);
                }
            }

            // Add all contents of the resource to the linked objects
            linking.addAll(res.getContents());
        }

        return linking;
    }
}

我调试了“getLinkedObjects”方法,一切似乎都运行正常,但是我的编辑器不再显示错误,即使我编写无效代码并且我的编译器在调用“getName”方法时获取空指针任何“变量”。我认为这是LazyLinker和EMF代理的问题。

0 个答案:

没有答案