blob: f3d6a5262327e9bfe099feb9f2d26d48f4254fb7 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
|
package rba.tool.editor.linking
import com.google.inject.Inject
import java.util.Collections
import org.apache.log4j.Logger
import org.eclipse.emf.ecore.EObject
import org.eclipse.emf.ecore.EReference
import org.eclipse.xtext.EcoreUtil2
import org.eclipse.xtext.linking.impl.DefaultLinkingService
import org.eclipse.xtext.linking.impl.IllegalNodeException
import org.eclipse.xtext.naming.IQualifiedNameConverter
import org.eclipse.xtext.nodemodel.INode
import rba.core.ObjectReference
import rba.core.Package
import rba.core.RBACorePackage
import rba.core.RuleObject
class RBAModelLinkingService extends DefaultLinkingService {
private static final Logger logger = Logger.getLogger(RBAModelLinkingService);
@Inject
private IQualifiedNameConverter qualifiedNameConverter;
override getLinkedObjects(EObject context, EReference ref, INode node) throws IllegalNodeException {
val requiredType = ref.getEReferenceType();
if(requiredType === null) {
return Collections.<EObject>emptyList();
}
val crossRefString = getCrossRefNodeAsString(node);
if(crossRefString === null || crossRefString.equals("")) {
return Collections.<EObject>emptyList();
}
if(logger.isDebugEnabled()) {
logger.debug("before getLinkedObjects: node: '" + crossRefString + "'");
}
if(context instanceof ObjectReference && ref === RBACorePackage.Literals.OBJECT_REFERENCE__REF_OBJECT && crossRefString.equals("this")) {
val containers = EcoreUtil2.getAllContainers(context).filter [ c |
c instanceof RuleObject && c.eContainer instanceof Package
].toList;
if(containers !== null && containers.size === 1) {
return Collections.singletonList(containers.get(0));
} else {
return Collections.emptyList();
}
}
val scope = getScope(context, ref);
if(scope === null) {
throw new AssertionError(
"Scope provider " + scopeProvider.getClass().getName() + " must not return null for context " + context + ", reference " + ref + "! Consider to return IScope.NULLSCOPE instead.");
}
val qualifiedLinkName = qualifiedNameConverter.toQualifiedName(crossRefString);
val eObjectDescription = scope.getSingleElement(qualifiedLinkName);
if(logger.isDebugEnabled()) {
logger.debug("after getLinkedObjects: node: '" + crossRefString + "' result: " + eObjectDescription);
}
if(eObjectDescription === null) {
return Collections.emptyList();
}
val result = eObjectDescription.getEObjectOrProxy();
return Collections.singletonList(result);
}
}
|