Scoping with Xtext/TMF 0.8

Usually I hate it when APIs break. TMF 0.8 introduces a different scoping API than Xtext 0.7. It took me a while to figure out. So I’ll show the changes below:

The default code completion will traverse all defined Ports for the references p and p2 in the Connection rule. A better behaviour would be:

  • Show only the ports in the instances (in, in2)
  • For p, show only “OUT”-Ports, for p2, show only “IN”-ports.

To do this, we need to define methods in a class derived from AbstractDeclarativeScopeProvider. The method names follow the signature scope_<rule>_<element>, so the the old code fragment for was:

One of the important changes that I use different imports, because some are deprecated and some are generally nice to use. Newly introduced are:

import static org.eclipse.xtext.scoping.Scopes.*;

for helpful functions and

import com.google.common.base.Predicate;
import com.google.common.collect.Iterables;
import com.google.inject.Inject;

for working with lists. So the new code looks like this:

Note that the scopeFor helper takes away the work of creating the newly introduced IEObjectDescription that I struggled with at first. Once you know how, migrating seems not too bad.

Leave a Reply

Your email address will not be published. Required fields are marked *