use of org.eclipse.n4js.n4JS.LabelRef in project n4js by eclipse.
the class N4JSLinker method createProxy.
/**
* Creates the proxy with a custom encoded URI format (starting with "|"). The object used to produce the encoded
* URI are collected as tuple inside {@link N4JSResource}. Then the node text is checked if it is convertible to a
* valid value. If there is a {@link BadEscapementException} is thrown then there is either a warning or an error
* produced via the diagnosticProducer.
*
* @param resource
* the N4JSResource
* @param obj
* the EObject containing the cross reference
* @param node
* the node representing the EObject
* @param eRef
* the cross reference in the domain model
* @param xref
* the cross reference in the node model
* @param diagnosticProducer
* to produce errors or warnings
* @return the created proxy
*/
private EObject createProxy(N4JSResource resource, EObject obj, INode node, EReference eRef, CrossReference xref, IDiagnosticProducer diagnosticProducer) {
final URI uri = resource.getURI();
/*
* as otherwise with 0 the EObjectDescription created for Script would be fetched
*/
final int fragmentNumber = resource.addLazyProxyInformation(obj, eRef, node);
final URI encodedLink = uri.appendFragment("|" + fragmentNumber);
EClass referenceType = findInstantiableCompatible(eRef.getEReferenceType());
final EObject proxy = EcoreUtil.create(referenceType);
((InternalEObject) proxy).eSetProxyURI(encodedLink);
AbstractElement terminal = xref.getTerminal();
if (!(terminal instanceof RuleCall)) {
throw new IllegalArgumentException(String.valueOf(xref));
}
AbstractRule rule = ((RuleCall) terminal).getRule();
try {
String tokenText = NodeModelUtils.getTokenText(node);
Object value = valueConverterService.toValue(tokenText, rule.getName(), node);
if (obj instanceof IdentifierRef && value instanceof String) {
((IdentifierRef) obj).setIdAsText((String) value);
} else if (obj instanceof LabelRef && value instanceof String) {
((LabelRef) obj).setLabelAsText((String) value);
} else if (obj instanceof ParameterizedPropertyAccessExpression && value instanceof String) {
((ParameterizedPropertyAccessExpression) obj).setPropertyAsText((String) value);
} else if (obj instanceof NamedImportSpecifier && value instanceof String) {
((NamedImportSpecifier) obj).setImportedElementAsText((String) value);
} else if ((obj instanceof JSXPropertyAttribute) && (value instanceof String)) {
((JSXPropertyAttribute) obj).setPropertyAsText((String) value);
} else {
setOtherElementAsText(tokenText, obj, value);
}
} catch (BadEscapementException e) {
diagnosticProducer.addDiagnostic(new DiagnosticMessage(e.getMessage(), e.getSeverity(), e.getIssueCode(), Strings.EMPTY_ARRAY));
} catch (N4JSValueConverterException vce) {
diagnosticProducer.addDiagnostic(new DiagnosticMessage(vce.getMessage(), vce.getSeverity(), vce.getIssueCode(), Strings.EMPTY_ARRAY));
} catch (N4JSValueConverterWithValueException vcwve) {
diagnosticProducer.addDiagnostic(new DiagnosticMessage(vcwve.getMessage(), vcwve.getSeverity(), vcwve.getIssueCode(), Strings.EMPTY_ARRAY));
}
return proxy;
}
Aggregations