blob: 66b114e2bf2e4354dd692df8f33430f24d278aec [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2014, 2016 Willink Transformations 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
*
* Contributors:
* E.D.Willink - initial API and implementation
* E.D.Willink (Obeo) - Bug 416287 - tuple-valued constraints
*******************************************************************************/
package org.eclipse.qvtd.xtext.qvtcore.as2cs;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import org.eclipse.emf.common.notify.Adapter;
import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.EPackage;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.emf.ecore.util.EcoreUtil;
import org.eclipse.jdt.annotation.NonNull;
import org.eclipse.jdt.annotation.Nullable;
import org.eclipse.ocl.pivot.Element;
import org.eclipse.ocl.pivot.Import;
import org.eclipse.ocl.pivot.Model;
import org.eclipse.ocl.pivot.NamedElement;
import org.eclipse.ocl.pivot.Namespace;
import org.eclipse.ocl.pivot.Operation;
import org.eclipse.ocl.pivot.Package;
import org.eclipse.ocl.pivot.Variable;
import org.eclipse.ocl.pivot.internal.manager.Orphanage;
import org.eclipse.ocl.pivot.internal.utilities.EnvironmentFactoryInternal;
import org.eclipse.ocl.pivot.internal.utilities.PivotUtilInternal;
import org.eclipse.ocl.pivot.utilities.ClassUtil;
import org.eclipse.ocl.xtext.base.as2cs.AS2CSConversion;
import org.eclipse.ocl.xtext.base.as2cs.AliasAnalysis;
import org.eclipse.ocl.xtext.base.utilities.BaseCSResource;
import org.eclipse.ocl.xtext.basecs.BaseCSFactory;
import org.eclipse.ocl.xtext.basecs.BaseCSPackage;
import org.eclipse.ocl.xtext.basecs.ClassCS;
import org.eclipse.ocl.xtext.basecs.ElementCS;
import org.eclipse.ocl.xtext.basecs.ImportCS;
import org.eclipse.ocl.xtext.basecs.PackageCS;
import org.eclipse.ocl.xtext.basecs.PackageOwnerCS;
import org.eclipse.ocl.xtext.basecs.PathElementCS;
import org.eclipse.ocl.xtext.basecs.PathElementWithURICS;
import org.eclipse.ocl.xtext.basecs.PathNameCS;
import org.eclipse.ocl.xtext.basecs.RootPackageCS;
import org.eclipse.ocl.xtext.essentialoclcs.ExpCS;
import org.eclipse.ocl.xtext.essentialoclcs.NameExpCS;
import org.eclipse.qvtd.pivot.qvtbase.BaseModel;
import org.eclipse.qvtd.pivot.qvtbase.Domain;
import org.eclipse.qvtd.pivot.qvtbase.Function;
import org.eclipse.qvtd.pivot.qvtbase.FunctionParameter;
import org.eclipse.qvtd.pivot.qvtbase.Pattern;
import org.eclipse.qvtd.pivot.qvtbase.Predicate;
import org.eclipse.qvtd.pivot.qvtbase.Rule;
import org.eclipse.qvtd.pivot.qvtbase.Transformation;
import org.eclipse.qvtd.pivot.qvtbase.TypedModel;
import org.eclipse.qvtd.pivot.qvtcore.Assignment;
import org.eclipse.qvtd.pivot.qvtcore.BottomPattern;
import org.eclipse.qvtd.pivot.qvtcore.BottomVariable;
import org.eclipse.qvtd.pivot.qvtcore.CoreDomain;
import org.eclipse.qvtd.pivot.qvtcore.CoreModel;
import org.eclipse.qvtd.pivot.qvtcore.CorePattern;
import org.eclipse.qvtd.pivot.qvtcore.EnforcementOperation;
import org.eclipse.qvtd.pivot.qvtcore.GuardPattern;
import org.eclipse.qvtd.pivot.qvtcore.GuardVariable;
import org.eclipse.qvtd.pivot.qvtcore.Mapping;
import org.eclipse.qvtd.pivot.qvtcore.NavigationAssignment;
import org.eclipse.qvtd.pivot.qvtcore.OppositePropertyAssignment;
import org.eclipse.qvtd.pivot.qvtcore.PropertyAssignment;
import org.eclipse.qvtd.pivot.qvtcore.RealizedVariable;
import org.eclipse.qvtd.pivot.qvtcore.VariableAssignment;
import org.eclipse.qvtd.pivot.qvtcore.util.QVTcoreVisitor;
import org.eclipse.qvtd.pivot.qvtcore.utilities.QVTcoreUtil;
import org.eclipse.qvtd.xtext.qvtbase.as2cs.QVTbaseDeclarationVisitor;
import org.eclipse.qvtd.xtext.qvtbasecs.AbstractTransformationCS;
import org.eclipse.qvtd.xtext.qvtbasecs.QVTbaseCSPackage;
import org.eclipse.qvtd.xtext.qvtbasecs.QualifiedPackageCS;
import org.eclipse.qvtd.xtext.qvtcorecs.BottomPatternCS;
import org.eclipse.qvtd.xtext.qvtcorecs.DirectionCS;
import org.eclipse.qvtd.xtext.qvtcorecs.DomainCS;
import org.eclipse.qvtd.xtext.qvtcorecs.GuardPatternCS;
import org.eclipse.qvtd.xtext.qvtcorecs.MappingCS;
import org.eclipse.qvtd.xtext.qvtcorecs.ParamDeclarationCS;
import org.eclipse.qvtd.xtext.qvtcorecs.PredicateCS;
import org.eclipse.qvtd.xtext.qvtcorecs.PredicateOrAssignmentCS;
import org.eclipse.qvtd.xtext.qvtcorecs.QVTcoreCSPackage;
import org.eclipse.qvtd.xtext.qvtcorecs.QueryCS;
import org.eclipse.qvtd.xtext.qvtcorecs.RealizedVariableCS;
import org.eclipse.qvtd.xtext.qvtcorecs.TopLevelCS;
import org.eclipse.qvtd.xtext.qvtcorecs.TransformationCS;
import org.eclipse.qvtd.xtext.qvtcorecs.UnrealizedVariableCS;
public class QVTcoreDeclarationVisitor extends QVTbaseDeclarationVisitor implements QVTcoreVisitor<ElementCS>
{
public static @Nullable PathNameCS createPathNameCS(@Nullable List<? extends @NonNull NamedElement> csPath) {
PathNameCS csPathName = null;
if (csPath != null) {
csPathName = BaseCSFactory.eINSTANCE.createPathNameCS();
List<@NonNull PathElementCS> csPathElements = ClassUtil.nullFree(csPathName.getOwnedPathElements());
for (@NonNull NamedElement csElement : csPath) {
PathElementCS csPathElement = BaseCSFactory.eINSTANCE.createPathElementCS();
csPathElement.setReferredElement(csElement);
csPathElements.add(csPathElement);
}
}
return csPathName;
}
/**
* QVTcoreAliasAnalysis revises AliasAnalysis to support only those names explicitly defined (as a consequence
* of Unit AS elements).
*/
public static class QVTcoreAliasAnalysis extends AliasAnalysis
{
public static @NonNull QVTcoreAliasAnalysis getAdapter(@NonNull Resource resource, @NonNull EnvironmentFactoryInternal environmentFactory) {
List<Adapter> eAdapters = resource.eAdapters();
for (Adapter adapter : eAdapters) {
if (adapter instanceof QVTcoreAliasAnalysis) {
QVTcoreAliasAnalysis aliasAnalysis = (QVTcoreAliasAnalysis)adapter;
if (aliasAnalysis.environmentFactory == environmentFactory) {
return aliasAnalysis;
}
}
}
return new QVTcoreAliasAnalysis(resource, environmentFactory);
}
public QVTcoreAliasAnalysis(@NonNull Resource resource, @NonNull EnvironmentFactoryInternal environmentFactory) {
super(resource, environmentFactory);
}
}
public QVTcoreDeclarationVisitor(@NonNull AS2CSConversion context) {
super(context);
}
protected void addClass(@NonNull PackageOwnerCS csParentPackage, @NonNull ClassCS csClass) {
/*if (csParentPackage instanceof AbstractTopLevelCS) {
((AbstractTopLevelCS)csParentPackage).getOwnedClasses().add(csClass);
}
else*/ if (csParentPackage instanceof PackageCS) {
((PackageCS)csParentPackage).getOwnedClasses().add(csClass);
}
else {
throw new UnsupportedOperationException(getClass().getSimpleName() + " addClass for a " + csClass.eClass().getName());
}
}
protected void addPackage(@NonNull PackageOwnerCS csParentPackage, @NonNull QualifiedPackageCS csPackage) {
csParentPackage.getOwnedPackages().add(csPackage);
}
protected void addTransformation(@NonNull PackageOwnerCS csParentPackage, @NonNull AbstractTransformationCS csTransformation) {
if (csParentPackage instanceof TopLevelCS) {
((TopLevelCS)csParentPackage).getOwnedTransformations().add((TransformationCS)csTransformation);
}
else if (csParentPackage instanceof PackageCS) {
((PackageCS)csParentPackage).getOwnedClasses().add(csTransformation);
}
else {
throw new UnsupportedOperationException(getClass().getSimpleName() + " addClass for a " + csTransformation.eClass().getName());
}
}
public void buildModel(@NonNull RootPackageCS csRootPackage, @NonNull Model asModel) {
for (org.eclipse.ocl.pivot.@NonNull Package asPackage : ClassUtil.nullFree(asModel.getOwnedPackages())) {
if (!Orphanage.isTypeOrphanage(asPackage)) {
buildPackage(csRootPackage, null, asPackage);
}
}
}
private void buildPackage(@NonNull PackageOwnerCS csParentPackage, @Nullable List<@NonNull NamedElement> csParentPath, org.eclipse.ocl.pivot.@NonNull Package asPackage) {
if (needsQualifiedPackageCS(asPackage)) {
QualifiedPackageCS csPackage = context.visitDeclaration(QualifiedPackageCS.class, asPackage);
if (csPackage != null) {
csPackage.setOwnedPathName(createPathNameCS(csParentPath));
addPackage(csParentPackage, csPackage);
csParentPackage = csPackage;
}
csParentPath = null;
}
else {
List<@NonNull NamedElement> csPath = new ArrayList<>();
if (csParentPath != null) {
csPath.addAll(csParentPath);
}
csPath.add(asPackage);
csParentPath = csPath;
}
for (org.eclipse.ocl.pivot.@NonNull Package asChildPackage : ClassUtil.nullFree(asPackage.getOwnedPackages())) {
buildPackage(csParentPackage, csParentPath, asChildPackage);
}
for (org.eclipse.ocl.pivot.@NonNull Class asChildClass : ClassUtil.nullFree(asPackage.getOwnedClasses())) {
buildClass(csParentPackage, csParentPath, asChildClass);
}
}
private void buildClass(@NonNull PackageOwnerCS csParentPackage, @Nullable List<@NonNull NamedElement> csPath, org.eclipse.ocl.pivot.@NonNull Class asClass) {
ClassCS csClass = context.visitDeclaration(ClassCS.class, asClass);
if (csClass instanceof AbstractTransformationCS) {
AbstractTransformationCS csTransformation = (AbstractTransformationCS)csClass;
if ((csPath != null) && ((csParentPackage instanceof QualifiedPackageCS) || (csPath.size() != 1) || !"".equals(csPath.get(0).getName()))) {
csTransformation.setOwnedPathName(createPathNameCS(csPath));
}
addTransformation(csParentPackage, csTransformation);
}
else if (csClass != null) {
addClass(csParentPackage, csClass);
}
}
protected @NonNull DomainCS createCoreDomain(@NonNull CoreDomain asCoreDomain) {
return context.refreshElement(DomainCS.class, QVTcoreCSPackage.Literals.DOMAIN_CS, asCoreDomain);
}
protected void gatherTransformations(@NonNull List<Transformation> asTransformations, @NonNull List<Package> ownedPackages) {
for (org.eclipse.ocl.pivot.Package asPackage : ownedPackages) {
for (org.eclipse.ocl.pivot.Class asClass : asPackage.getOwnedClasses()) {
if (asClass instanceof Transformation) {
asTransformations.add((Transformation) asClass);
}
}
gatherTransformations(asTransformations, asPackage.getOwnedPackages());
}
}
protected @Nullable Package getScope(@NonNull Variable asVariable) {
TypedModel typedModel = QVTcoreUtil.basicGetTypedModel(QVTcoreUtil.getContainingArea(asVariable));
if (typedModel == null) {
return null;
}
List<Package> usedPackages = typedModel.getUsedPackage();
if (usedPackages.isEmpty()) {
return null;
}
return usedPackages.get(0);
}
/**
* Return true if a QualifiedPackageCS is needed to avoid information loss when serializing asPackage.
*/
protected boolean needsQualifiedPackageCS(org.eclipse.ocl.pivot.@NonNull Package asPackage) {
if (asPackage.getNsPrefix() != null) {
return true;
}
if (asPackage.getURI() != null) {
return true;
}
if (asPackage.getOwnedPackages().size() > 1) {
return true;
}
for (org.eclipse.ocl.pivot.@NonNull Class asClass : ClassUtil.nullFree(asPackage.getOwnedClasses())) {
if (!(asClass instanceof Transformation)) {
return true;
}
}
return false;
}
/**
* Post-processing sets up the AliasAdapter with the names from the Unit declarations
*/
@Override
public void postProcess(@NonNull BaseCSResource csResource, @NonNull Map<@NonNull Namespace, @NonNull List<@NonNull String>> importedNamespaces) {
AliasAnalysis.dispose(csResource);
QVTcoreAliasAnalysis aliasAdapter = QVTcoreAliasAnalysis.getAdapter(csResource, context.getEnvironmentFactory());
List<EObject> contents = csResource.getContents();
if (contents.size() > 0) {
EObject root = contents.get(0);
if (root instanceof RootPackageCS) {
for (ImportCS csImport : ((RootPackageCS)root).getOwnedImports()) {
Element pivot = csImport.getPivot();
if (pivot instanceof Import) {
Import asImport = (Import)pivot;
String alias = asImport.getName();
Namespace asNamespace = asImport.getImportedNamespace();
if ((asNamespace != null) && (alias != null)) {
aliasAdapter.getAlias(asNamespace, alias);
}
}
}
}
}
}
protected void refreshOwnedInTransformation(@NonNull MappingCS csMapping, @NonNull Mapping asMapping) {
Transformation asTransformation = asMapping.getTransformation();
if (asTransformation != null) {
PathNameCS csPathName = BaseCSFactory.eINSTANCE.createPathNameCS();
csMapping.setOwnedInPathName(csPathName);
org.eclipse.ocl.pivot.Package asPackage = asTransformation.getOwningPackage();
String asPackageName = asPackage != null ? asPackage.getName() : null;
if ((asPackageName == null) || "".equals(asPackageName)) {
PathElementCS csPathElement = BaseCSFactory.eINSTANCE.createPathElementCS();
csPathName.getOwnedPathElements().add(csPathElement);
csPathElement.setReferredElement(asTransformation);
}
else {
context.refreshPathName(csPathName, asTransformation, null);
}
}
else {
csMapping.setOwnedInPathName(null);
}
}
@Override
public ElementCS visitAssignment(@NonNull Assignment object) {
throw new UnsupportedOperationException();
}
@Override
public ElementCS visitBaseModel(@NonNull BaseModel object) {
throw new UnsupportedOperationException();
}
@Override
public ElementCS visitBottomPattern(@NonNull BottomPattern asBottomPattern) {
BottomPatternCS csBottomPattern = context.refreshElement(BottomPatternCS.class, QVTcoreCSPackage.Literals.BOTTOM_PATTERN_CS, asBottomPattern);
csBottomPattern.setPivot(asBottomPattern);
List<Element> asConstraints = new ArrayList<Element>(asBottomPattern.getAssignment());
asConstraints.addAll(asBottomPattern.getPredicate());
context.refreshList(csBottomPattern.getOwnedConstraints(), context.visitDeclarations(PredicateOrAssignmentCS.class, asConstraints, null));
context.refreshList(csBottomPattern.getOwnedRealizedVariables(), context.visitDeclarations(RealizedVariableCS.class, asBottomPattern.getRealizedVariable(), null));
context.refreshList(csBottomPattern.getOwnedUnrealizedVariables(), context.visitDeclarations(UnrealizedVariableCS.class, asBottomPattern.getVariable(), null));
return csBottomPattern;
}
@Override
public ElementCS visitBottomVariable(@NonNull BottomVariable object) {
return visitVariable(object);
}
@Override
public ElementCS visitCoreDomain(@NonNull CoreDomain asCoreDomain) {
DomainCS csDomain = createCoreDomain(asCoreDomain);
csDomain.setPivot(asCoreDomain);
csDomain.setOwnedBottomPattern(context.visitDeclaration(BottomPatternCS.class, asCoreDomain.getBottomPattern()));
csDomain.setOwnedGuardPattern(context.visitDeclaration(GuardPatternCS.class, asCoreDomain.getGuardPattern()));
csDomain.setIsCheck(asCoreDomain.isIsCheckable());
csDomain.setDirection(asCoreDomain.getTypedModel());
csDomain.setIsEnforce(asCoreDomain.isIsEnforceable());
return csDomain;
}
@Override
public ElementCS visitCoreModel(@NonNull CoreModel asModel) {
assert asModel.eContainer() == null;
TopLevelCS csDocument = context.refreshElement(TopLevelCS.class, QVTcoreCSPackage.Literals.TOP_LEVEL_CS, asModel);
csDocument.setPivot(asModel);
context.refreshList(csDocument.getOwnedImports(), context.visitDeclarations(ImportCS.class, asModel.getOwnedImports(), null));
buildModel(csDocument, asModel);
List<Mapping> asMappings = null;
List<Function> asQueries = null;
List<Transformation> asTransformations = new ArrayList<Transformation>();
gatherTransformations(asTransformations, asModel.getOwnedPackages());
for (Transformation asTransformation : asTransformations) {
for (Rule asRule : asTransformation.getRule()) {
if (asRule instanceof Mapping) {
if (asMappings == null) {
asMappings = new ArrayList<Mapping>();
}
asMappings.add((Mapping) asRule);
}
}
for (Operation asOperation : asTransformation.getOwnedOperations()) {
if (asOperation instanceof Function) {
if (asQueries == null) {
asQueries = new ArrayList<Function>();
}
asQueries.add((Function) asOperation);
}
}
}
// context.refreshList(csDocument.getOwnedTransformations(), context.visitDeclarations(TransformationCS.class, asTransformations, null));
if (asMappings != null) {
context.refreshList(csDocument.getOwnedMappings(), context.visitDeclarations(MappingCS.class, asMappings, null));
}
else {
csDocument.getOwnedMappings().clear();
}
if (asQueries != null) {
context.refreshList(csDocument.getOwnedQueries(), context.visitDeclarations(QueryCS.class, asQueries, null));
}
else {
csDocument.getOwnedQueries().clear();
}
return csDocument;
}
@Override
public ElementCS visitCorePattern(@NonNull CorePattern object) {
throw new UnsupportedOperationException();
}
@Override
public ElementCS visitDomain(@NonNull Domain object) {
throw new UnsupportedOperationException();
}
@Override
public ElementCS visitEnforcementOperation(@NonNull EnforcementOperation object) {
throw new UnsupportedOperationException(); // FIXME
}
@Override
public ElementCS visitFunction(@NonNull Function asFunction) {
QueryCS csQuery = refreshTypedElement(QueryCS.class, QVTcoreCSPackage.Literals.QUERY_CS, asFunction);
csQuery.setOwnedPathName(createPathNameCS(asFunction.getOwningClass()));
context.refreshList(csQuery.getOwnedParameters(), context.visitDeclarations(ParamDeclarationCS.class, asFunction.getOwnedParameters(), null));
csQuery.setOwnedExpression(createExpCS(asFunction.getQueryExpression()));
csQuery.setIsTransient(asFunction.isIsTransient());
return csQuery;
}
@Override
public ElementCS visitFunctionParameter(@NonNull FunctionParameter asFunctionParameter) {
ParamDeclarationCS csParamDeclaration = refreshTypedElement(ParamDeclarationCS.class, QVTcoreCSPackage.Literals.PARAM_DECLARATION_CS, asFunctionParameter);
return csParamDeclaration;
}
@Override
public ElementCS visitGuardPattern(@NonNull GuardPattern asGuardPattern) {
GuardPatternCS csGuardPattern = context.refreshElement(GuardPatternCS.class, QVTcoreCSPackage.Literals.GUARD_PATTERN_CS, asGuardPattern);
csGuardPattern.setPivot(asGuardPattern);
context.refreshList(csGuardPattern.getOwnedPredicates(), context.visitDeclarations(PredicateCS.class, asGuardPattern.getPredicate(), null));
context.refreshList(csGuardPattern.getOwnedUnrealizedVariables(), context.visitDeclarations(UnrealizedVariableCS.class, asGuardPattern.getVariable(), null));
return csGuardPattern;
}
@Override
public ElementCS visitGuardVariable(@NonNull GuardVariable object) {
return visitVariable(object);
}
@Override
public ElementCS visitMapping(@NonNull Mapping asMapping) {
String defaultName = asMapping.getContext() != null ? null : "«null»";
MappingCS csMapping = context.refreshNamedElement(MappingCS.class, QVTcoreCSPackage.Literals.MAPPING_CS, asMapping, defaultName);
csMapping.setPivot(asMapping);
csMapping.setIsDefault(asMapping.isIsDefault());
refreshOwnedInTransformation(csMapping, asMapping);
context.refreshList(csMapping.getOwnedDomains(), context.visitDeclarations(DomainCS.class, asMapping.getDomain(), null));
DomainCS csDomain = context.refreshElement(DomainCS.class, QVTcoreCSPackage.Literals.DOMAIN_CS, asMapping);
csDomain.setPivot(null); // stop comment duplication
csDomain.setOwnedBottomPattern(context.visitDeclaration(BottomPatternCS.class, asMapping.getBottomPattern()));
csDomain.setOwnedGuardPattern(context.visitDeclaration(GuardPatternCS.class, asMapping.getGuardPattern()));
csMapping.setOwnedMiddle(csDomain);
context.refreshList(csMapping.getOwnedComposedMappings(), context.visitDeclarations(MappingCS.class, asMapping.getLocal(), null));
PivotUtilInternal.refreshList(csMapping.getRefines(), asMapping.getSpecification());
return csMapping;
}
@Override
public ElementCS visitNavigationAssignment(@NonNull NavigationAssignment asNavigationAssignment) {
PredicateOrAssignmentCS csAssignment = context.refreshElement(PredicateOrAssignmentCS.class, QVTcoreCSPackage.Literals.PREDICATE_OR_ASSIGNMENT_CS, asNavigationAssignment);
ExpCS csSlotExp = createExpCS(asNavigationAssignment.getSlotExpression());
NameExpCS csPropName = createNameExpCS(QVTcoreUtil.getTargetProperty(asNavigationAssignment));
csAssignment.setOwnedTarget(createInfixExpCS(csSlotExp, ".", csPropName));
csAssignment.setOwnedInitExpression(createExpCS(asNavigationAssignment.getValue()));
csAssignment.setIsDefault(asNavigationAssignment.isIsDefault());
return csAssignment;
}
@Override
public ElementCS visitOppositePropertyAssignment(@NonNull OppositePropertyAssignment asNavigationAssignment) {
return visitNavigationAssignment(asNavigationAssignment);
}
@Override
public ElementCS visitPackage(org.eclipse.ocl.pivot.@NonNull Package asPackage) {
// List<org.eclipse.ocl.pivot.@NonNull Class> asClasses = ClassUtil.nullFree(asPackage.getOwnedClasses());
// List<org.eclipse.ocl.pivot.@NonNull Package> asPackages = ClassUtil.nullFree(asPackage.getOwnedPackages());
// if (needsQualifiedPackageCS(asPackage)) {
// assert needsQualifiedPackageCS(asPackage);
QualifiedPackageCS csPackage = context.refreshNamedElement(QualifiedPackageCS.class, QVTbaseCSPackage.Literals.QUALIFIED_PACKAGE_CS, asPackage);
// context.refreshList(csPackage.getOwnedClasses(), context.visitDeclarations(ClassCS.class, asClasses, null));
csPackage.setNsPrefix(asPackage.getNsPrefix());
csPackage.setNsURI(asPackage.getURI());
// context.refreshList(csPackage.getOwnedPackages(), context.visitDeclarations(QualifiedPackageCS.class, asPackages, null));
return csPackage;
// }
// else {
// PackageCS csPackage = context.refreshNamedElement(PackageCS.class, BaseCSPackage.Literals.PACKAGE_CS, asPackage);
// context.refreshList(csPackage.getOwnedClasses(), context.visitDeclarations(ClassCS.class, asClasses, null));
// csPackage.setNsPrefix(asPackage.getNsPrefix());
// csPackage.setNsURI(asPackage.getURI());
// context.refreshList(csPackage.getOwnedPackages(), context.visitDeclarations(PackageCS.class, asPackages, null));
// return csPackage;
// }
}
@Override
public ElementCS visitPattern(@NonNull Pattern object) {
throw new UnsupportedOperationException();
}
@Override
public ElementCS visitPredicate(@NonNull Predicate asPredicate) {
if (asPredicate.eContainer() instanceof GuardPattern) {
PredicateCS csPredicate = context.refreshElement(PredicateCS.class, QVTcoreCSPackage.Literals.PREDICATE_CS, asPredicate);
csPredicate.setPivot(asPredicate);
csPredicate.setOwnedCondition(createExpCS(asPredicate.getConditionExpression()));
return csPredicate;
}
else {
PredicateOrAssignmentCS csPredicate = context.refreshElement(PredicateOrAssignmentCS.class, QVTcoreCSPackage.Literals.PREDICATE_OR_ASSIGNMENT_CS, asPredicate);
csPredicate.setPivot(asPredicate);
csPredicate.setOwnedTarget(createExpCS(asPredicate.getConditionExpression()));
return csPredicate;
}
}
@Override
public ElementCS visitPropertyAssignment(@NonNull PropertyAssignment asNavigationAssignment) {
return visitNavigationAssignment(asNavigationAssignment);
}
@Override
public ElementCS visitRealizedVariable(@NonNull RealizedVariable asRealizedVariable) {
RealizedVariableCS csRealizedVariable = refreshTypedElement(RealizedVariableCS.class, QVTcoreCSPackage.Literals.REALIZED_VARIABLE_CS, asRealizedVariable);
return csRealizedVariable;
}
@Override
public ElementCS visitRule(@NonNull Rule object) {
throw new UnsupportedOperationException();
}
@Override
public ElementCS visitTransformation(@NonNull Transformation asTransformation) {
TransformationCS csTransformation = context.refreshNamedElement(TransformationCS.class, QVTcoreCSPackage.Literals.TRANSFORMATION_CS, asTransformation);
// csTransformation.setPivot(asTransformation);
// org.eclipse.ocl.pivot.Package owningPackage = asTransformation.getOwningPackage();
// if ((owningPackage == null) || "".equals(owningPackage.getName()) || (owningPackage.getName() == null)) {
// csTransformation.setOwnedPathName(null);
// }
// else {
// PathNameCS csPathName = BaseCSFactory.eINSTANCE.createPathNameCS();
// csTransformation.setOwnedPathName(csPathName);
// context.refreshPathName(csPathName, owningPackage, null);
// }
context.refreshList(csTransformation.getOwnedDirections(), context.visitDeclarations(DirectionCS.class, asTransformation.getModelParameter(), null));
return csTransformation;
}
@Override
public ElementCS visitTypedModel(@NonNull TypedModel asTypedModel) {
DirectionCS csDirection = context.refreshNamedElement(DirectionCS.class, QVTcoreCSPackage.Literals.DIRECTION_CS, asTypedModel, null);
if ("".equals(asTypedModel.getName())) {
csDirection.setName(null);
}
PivotUtilInternal.refreshList(csDirection.getImports(), asTypedModel.getUsedPackage());
// PivotUtil.refreshList(csDirection.getUses(), asTypedModel.getDependsOn());
return csDirection;
}
@Override
public @Nullable ElementCS visitImport(@NonNull Import asUnit) {
BaseCSResource csResource = context.getCSResource();
Namespace asNamespace = asUnit.getImportedNamespace();
EObject eObject = asNamespace.getESObject();
String importURI = null;
if (eObject instanceof EPackage) {
EPackage ePackage = (EPackage)eObject;
Resource resource = ePackage.eResource();
if (ClassUtil.isRegistered(resource)) {
importURI = ePackage.getNsURI();
}
}
if ((importURI == null) && (csResource != null)) {
URI fullURI = EcoreUtil.getURI(eObject != null ? eObject : asNamespace);
URI csURI = csResource.getURI();
URI deresolvedURI = fullURI.deresolve(csURI, true, true, false);
importURI = deresolvedURI.toString();
}
ImportCS csImport = context.refreshElement(ImportCS.class, BaseCSPackage.Literals.IMPORT_CS, asUnit);
csImport.setPivot(asUnit);
csImport.setName(asUnit.getName());
PathNameCS csPathName = BaseCSFactory.eINSTANCE.createPathNameCS();
List<PathElementCS> csPath = csPathName.getOwnedPathElements();
PathElementWithURICS csSimpleRef = BaseCSFactory.eINSTANCE.createPathElementWithURICS();
csSimpleRef.setReferredElement(asNamespace);
csSimpleRef.setUri(importURI);
csPath.add(csSimpleRef);
csImport.setOwnedPathName(csPathName);
return csImport;
}
@Override
public ElementCS visitVariable(@NonNull Variable asVariable) {
if (asVariable.eContainer() instanceof CorePattern) {
UnrealizedVariableCS csUnrealizedVariable = refreshTypedElement(UnrealizedVariableCS.class, QVTcoreCSPackage.Literals.UNREALIZED_VARIABLE_CS, asVariable);
csUnrealizedVariable.setOwnedInitExpression(context.visitDeclaration(ExpCS.class, asVariable.getOwnedInit()));
return csUnrealizedVariable;
}
else {
return super.visitVariable(asVariable);
}
}
@Override
public ElementCS visitVariableAssignment(@NonNull VariableAssignment asVariableAssignment) {
PredicateOrAssignmentCS csAssignment = context.refreshElement(PredicateOrAssignmentCS.class, QVTcoreCSPackage.Literals.PREDICATE_OR_ASSIGNMENT_CS, asVariableAssignment);
Variable asVariable = asVariableAssignment.getTargetVariable();
if (asVariable != null) {
csAssignment.setOwnedTarget(createNameExpCS(asVariable));
}
csAssignment.setOwnedInitExpression(context.visitDeclaration(ExpCS.class, asVariableAssignment.getValue()));
csAssignment.setIsDefault(asVariableAssignment.isIsDefault());
return csAssignment;
}
}