/**
* Copyright (c) 2016 Eclipse contributors and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*/
package org.eclipse.emf.ecore.xcore.serializer;
import java.util.Iterator;
import java.util.List;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.xtext.CrossReference;
import org.eclipse.xtext.conversion.IValueConverterService;
import org.eclipse.xtext.conversion.ValueConverterException;
import org.eclipse.xtext.linking.impl.LinkingHelper;
import org.eclipse.xtext.naming.IQualifiedNameConverter;
import org.eclipse.xtext.naming.IQualifiedNameProvider;
import org.eclipse.xtext.naming.QualifiedName;
import org.eclipse.xtext.resource.IEObjectDescription;
import org.eclipse.xtext.scoping.IScope;
import org.eclipse.xtext.serializer.diagnostic.ISerializationDiagnostic;
import org.eclipse.xtext.serializer.diagnostic.ISerializationDiagnostic.Acceptor;
import org.eclipse.xtext.serializer.tokens.CrossReferenceSerializer;
import com.google.common.collect.Lists;
import com.google.inject.Inject;
public class XcoreCrossReferenceSerializer extends CrossReferenceSerializer
{
@Inject
private LinkingHelper linkingHelper;
@Inject
private IQualifiedNameConverter qualifiedNameConverter;
@Inject
private IValueConverterService valueConverter;
@Inject
private IQualifiedNameProvider qualifiedNameProvider;
@Override
protected String getCrossReferenceNameFromScope(EObject semanticObject, CrossReference crossref, EObject target, IScope scope, Acceptor errors)
{
String ruleName = linkingHelper.getRuleNameFrom(crossref);
List<ISerializationDiagnostic> recordedErrros = null;
Iterator<IEObjectDescription> elements = scope.getElements(target).iterator();
QualifiedName qualifiedName = elements.hasNext() ? elements.next().getName() : qualifiedNameProvider.getFullyQualifiedName(target);
if (qualifiedName != null)
{
String unconverted = qualifiedNameConverter.toString(qualifiedName);
try
{
return valueConverter.toString(unconverted, ruleName);
}
catch (ValueConverterException e)
{
if (errors != null)
{
if (recordedErrros == null)
{
recordedErrros = Lists.newArrayList();
}
recordedErrros.add(diagnostics.getValueConversionExceptionDiagnostic(semanticObject, crossref, unconverted, e));
}
}
}
if (errors != null)
{
if (recordedErrros != null)
{
for (ISerializationDiagnostic diag : recordedErrros)
{
errors.accept(diag);
}
}
if (qualifiedName == null)
{
errors.accept(diagnostics.getNoEObjectDescriptionFoundDiagnostic(semanticObject, crossref, target, scope));
}
}
return null;
}
}