| /******************************************************************************* |
| * 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.qvtimperative.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.CollectionType; |
| 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.Property; |
| import org.eclipse.ocl.pivot.Type; |
| import org.eclipse.ocl.pivot.Variable; |
| import org.eclipse.ocl.pivot.VoidType; |
| 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.pivot.utilities.PivotUtil; |
| 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.basecs.TypedRefCS; |
| import org.eclipse.ocl.xtext.essentialoclcs.EssentialOCLCSPackage; |
| import org.eclipse.ocl.xtext.essentialoclcs.ExpCS; |
| import org.eclipse.ocl.xtext.essentialoclcs.VariableCS; |
| 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.qvtbase.utilities.QVTbaseUtil; |
| import org.eclipse.qvtd.pivot.qvtimperative.AddStatement; |
| import org.eclipse.qvtd.pivot.qvtimperative.AppendParameter; |
| import org.eclipse.qvtd.pivot.qvtimperative.AppendParameterBinding; |
| import org.eclipse.qvtd.pivot.qvtimperative.BufferStatement; |
| import org.eclipse.qvtd.pivot.qvtimperative.CheckStatement; |
| import org.eclipse.qvtd.pivot.qvtimperative.ConnectionVariable; |
| import org.eclipse.qvtd.pivot.qvtimperative.DeclareStatement; |
| import org.eclipse.qvtd.pivot.qvtimperative.GuardParameter; |
| import org.eclipse.qvtd.pivot.qvtimperative.GuardParameterBinding; |
| import org.eclipse.qvtd.pivot.qvtimperative.ImperativeModel; |
| import org.eclipse.qvtd.pivot.qvtimperative.ImperativeTransformation; |
| import org.eclipse.qvtd.pivot.qvtimperative.ImperativeTypedModel; |
| import org.eclipse.qvtd.pivot.qvtimperative.LoopParameterBinding; |
| import org.eclipse.qvtd.pivot.qvtimperative.LoopVariable; |
| import org.eclipse.qvtd.pivot.qvtimperative.Mapping; |
| import org.eclipse.qvtd.pivot.qvtimperative.MappingCall; |
| import org.eclipse.qvtd.pivot.qvtimperative.MappingLoop; |
| import org.eclipse.qvtd.pivot.qvtimperative.MappingParameter; |
| import org.eclipse.qvtd.pivot.qvtimperative.MappingParameterBinding; |
| import org.eclipse.qvtd.pivot.qvtimperative.MappingStatement; |
| import org.eclipse.qvtd.pivot.qvtimperative.NewStatement; |
| import org.eclipse.qvtd.pivot.qvtimperative.ObservableStatement; |
| import org.eclipse.qvtd.pivot.qvtimperative.SetStatement; |
| import org.eclipse.qvtd.pivot.qvtimperative.SimpleParameter; |
| import org.eclipse.qvtd.pivot.qvtimperative.SimpleParameterBinding; |
| import org.eclipse.qvtd.pivot.qvtimperative.Statement; |
| import org.eclipse.qvtd.pivot.qvtimperative.VariableStatement; |
| import org.eclipse.qvtd.pivot.qvtimperative.util.QVTimperativeVisitor; |
| import org.eclipse.qvtd.pivot.qvtimperative.utilities.QVTimperativeUtil; |
| 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.qvtimperativecs.AddStatementCS; |
| import org.eclipse.qvtd.xtext.qvtimperativecs.AppendParameterBindingCS; |
| import org.eclipse.qvtd.xtext.qvtimperativecs.AppendParameterCS; |
| import org.eclipse.qvtd.xtext.qvtimperativecs.BufferStatementCS; |
| import org.eclipse.qvtd.xtext.qvtimperativecs.CheckStatementCS; |
| import org.eclipse.qvtd.xtext.qvtimperativecs.DeclareStatementCS; |
| import org.eclipse.qvtd.xtext.qvtimperativecs.DirectionCS; |
| import org.eclipse.qvtd.xtext.qvtimperativecs.GuardParameterBindingCS; |
| import org.eclipse.qvtd.xtext.qvtimperativecs.GuardParameterCS; |
| import org.eclipse.qvtd.xtext.qvtimperativecs.LoopParameterBindingCS; |
| import org.eclipse.qvtd.xtext.qvtimperativecs.MappingCS; |
| import org.eclipse.qvtd.xtext.qvtimperativecs.MappingCallCS; |
| import org.eclipse.qvtd.xtext.qvtimperativecs.MappingLoopCS; |
| import org.eclipse.qvtd.xtext.qvtimperativecs.MappingParameterBindingCS; |
| import org.eclipse.qvtd.xtext.qvtimperativecs.MappingParameterCS; |
| import org.eclipse.qvtd.xtext.qvtimperativecs.MappingStatementCS; |
| import org.eclipse.qvtd.xtext.qvtimperativecs.NewStatementCS; |
| import org.eclipse.qvtd.xtext.qvtimperativecs.ParamDeclarationCS; |
| import org.eclipse.qvtd.xtext.qvtimperativecs.QVTimperativeCSPackage; |
| import org.eclipse.qvtd.xtext.qvtimperativecs.QueryCS; |
| import org.eclipse.qvtd.xtext.qvtimperativecs.SetStatementCS; |
| import org.eclipse.qvtd.xtext.qvtimperativecs.SimpleParameterBindingCS; |
| import org.eclipse.qvtd.xtext.qvtimperativecs.SimpleParameterCS; |
| import org.eclipse.qvtd.xtext.qvtimperativecs.StatementCS; |
| import org.eclipse.qvtd.xtext.qvtimperativecs.TopLevelCS; |
| import org.eclipse.qvtd.xtext.qvtimperativecs.TransformationCS; |
| |
| public class QVTimperativeDeclarationVisitor extends QVTbaseDeclarationVisitor implements QVTimperativeVisitor<ElementCS> |
| { |
| /** |
| * QVTimperativeAliasAnalysis revises AliasAnalysis to support only those names explicitly defined (as a consequence |
| * of Unit AS elements). |
| */ |
| public static class QVTimperativeAliasAnalysis extends AliasAnalysis |
| { |
| public static @NonNull QVTimperativeAliasAnalysis getAdapter(@NonNull Resource resource, @NonNull EnvironmentFactoryInternal environmentFactory) { |
| List<Adapter> eAdapters = resource.eAdapters(); |
| for (Adapter adapter : eAdapters) { |
| if (adapter instanceof QVTimperativeAliasAnalysis) { |
| QVTimperativeAliasAnalysis aliasAnalysis = (QVTimperativeAliasAnalysis)adapter; |
| if (aliasAnalysis.environmentFactory == environmentFactory) { |
| return aliasAnalysis; |
| } |
| } |
| } |
| return new QVTimperativeAliasAnalysis(resource, environmentFactory); |
| } |
| |
| public QVTimperativeAliasAnalysis(@NonNull Resource resource, @NonNull EnvironmentFactoryInternal environmentFactory) { |
| super(resource, environmentFactory); |
| } |
| } |
| |
| 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; |
| } |
| |
| public QVTimperativeDeclarationVisitor(@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 void gatherTransformations(@NonNull List<@NonNull ImperativeTransformation> 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 ImperativeTransformation) { |
| asTransformations.add((ImperativeTransformation) asClass); |
| } |
| } |
| gatherTransformations(asTransformations, asPackage.getOwnedPackages()); |
| } |
| } |
| |
| /** |
| * 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); |
| QVTimperativeAliasAnalysis aliasAdapter = QVTimperativeAliasAnalysis.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 refreshObservedProperties(@NonNull ObservableStatement asStatement, /*@NonNull*/ List<PathNameCS> csPathNames, /*@NonNull*/ List<@NonNull Property> asProperties) { |
| List<PathNameCS> pathNames = new ArrayList<PathNameCS>(); |
| for (@NonNull Property asProperty : asProperties) { |
| @NonNull PathNameCS csPathName = BaseCSFactory.eINSTANCE.createPathNameCS(); |
| pathNames.add(csPathName); |
| context.refreshPathName(csPathName, asProperty, PivotUtil.getContainingNamespace(asStatement)); |
| } |
| context.refreshList(csPathNames, pathNames); |
| } |
| |
| 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); |
| } |
| } |
| |
| protected void refreshReferredMapping(@NonNull MappingCallCS csMappingCall, @NonNull MappingCall asMappingCall) { |
| Mapping asMapping = asMappingCall.getReferredMapping(); |
| if (asMapping != null) { |
| @NonNull PathNameCS csPathName = BaseCSFactory.eINSTANCE.createPathNameCS(); |
| csMappingCall.setOwnedPathName(csPathName); |
| context.refreshPathName(csPathName, asMapping, QVTbaseUtil.getContainingTransformation(asMappingCall)); |
| } |
| else { |
| csMappingCall.setOwnedPathName(null); |
| } |
| } |
| |
| protected void refreshUsedProperties(@NonNull Transformation asTransformation, /*@NonNull*/ List<PathNameCS> csPathNames, /*@NonNull*/ List<@NonNull Property> asProperties) { |
| List<PathNameCS> pathNames = new ArrayList<PathNameCS>(); |
| for (@NonNull Property asProperty : asProperties) { |
| @NonNull PathNameCS csPathName = BaseCSFactory.eINSTANCE.createPathNameCS(); |
| pathNames.add(csPathName); |
| context.refreshPathName(csPathName, asProperty, asTransformation); |
| } |
| context.refreshList(csPathNames, pathNames); |
| } |
| |
| @Override |
| public ElementCS visitAddStatement(@NonNull AddStatement asAddStatement) { |
| AddStatementCS csStatement = context.refreshElement(AddStatementCS.class, QVTimperativeCSPackage.Literals.ADD_STATEMENT_CS, asAddStatement); |
| csStatement.setPivot(asAddStatement); |
| ConnectionVariable asVariable = asAddStatement.getTargetVariable(); |
| assert asVariable != null; |
| csStatement.setTargetVariable(asVariable); |
| csStatement.setOwnedExpression(context.visitDeclaration(ExpCS.class, asAddStatement.getOwnedExpression())); |
| refreshObservedProperties(asAddStatement, csStatement.getObservedProperties(), ClassUtil.nullFree(asAddStatement.getObservedProperties())); |
| return csStatement; |
| } |
| |
| @Override |
| public ElementCS visitAppendParameter(@NonNull AppendParameter asVariable) { |
| AppendParameterCS csVariable = context.refreshNamedElement(AppendParameterCS.class, QVTimperativeCSPackage.Literals.APPEND_PARAMETER_CS, asVariable); |
| csVariable.setPivot(asVariable); |
| csVariable.setOwnedType(createTypeRefCS(asVariable.getType(), null)); //getScope(asVariable))); |
| return csVariable; |
| } |
| |
| @Override |
| public ElementCS visitAppendParameterBinding(@NonNull AppendParameterBinding asMappingParameterBinding) { |
| AppendParameterBindingCS csMappingParameterBinding = context.refreshElement(AppendParameterBindingCS.class, QVTimperativeCSPackage.Literals.APPEND_PARAMETER_BINDING_CS, asMappingParameterBinding); |
| csMappingParameterBinding.setPivot(asMappingParameterBinding); |
| csMappingParameterBinding.setReferredVariable((AppendParameter) asMappingParameterBinding.getBoundVariable()); |
| csMappingParameterBinding.setValue(asMappingParameterBinding.getValue()); |
| return csMappingParameterBinding; |
| } |
| |
| @Override |
| public ElementCS visitBaseModel(@NonNull BaseModel object) { |
| throw new UnsupportedOperationException(); |
| } |
| |
| @Override |
| public ElementCS visitBufferStatement(@NonNull BufferStatement asVariable) { |
| BufferStatementCS csVariable = context.refreshNamedElement(BufferStatementCS.class, QVTimperativeCSPackage.Literals.BUFFER_STATEMENT_CS, asVariable); |
| csVariable.setPivot(asVariable); |
| csVariable.setOwnedType(createTypeRefCS(asVariable.getType(), null)); //getScope(asVariable))); |
| csVariable.setOwnedExpression(context.visitDeclaration(ExpCS.class, asVariable.getOwnedExpression())); |
| return csVariable; |
| } |
| |
| @Override |
| public ElementCS visitCheckStatement(@NonNull CheckStatement asPredicate) { |
| assert asPredicate.eContainer() instanceof Mapping; |
| CheckStatementCS csPredicate = context.refreshElement(CheckStatementCS.class, QVTimperativeCSPackage.Literals.CHECK_STATEMENT_CS, asPredicate); |
| csPredicate.setPivot(asPredicate); |
| csPredicate.setOwnedCondition(createExpCS(asPredicate.getOwnedExpression())); |
| refreshObservedProperties(asPredicate, csPredicate.getObservedProperties(), ClassUtil.nullFree(asPredicate.getObservedProperties())); |
| return csPredicate; |
| } |
| |
| @Override |
| public ElementCS visitConnectionVariable(@NonNull ConnectionVariable object) { |
| throw new UnsupportedOperationException(); |
| } |
| |
| @Override |
| public ElementCS visitDeclareStatement(@NonNull DeclareStatement asVariable) { |
| DeclareStatementCS csVariable = refreshTypedElement(DeclareStatementCS.class, QVTimperativeCSPackage.Literals.DECLARE_STATEMENT_CS, asVariable); |
| csVariable.setOwnedExpression(context.visitDeclaration(ExpCS.class, asVariable.getOwnedExpression())); |
| csVariable.setIsCheck(asVariable.isIsCheck()); |
| refreshObservedProperties(asVariable, csVariable.getObservedProperties(), ClassUtil.nullFree(asVariable.getObservedProperties())); |
| return csVariable; |
| } |
| |
| @Override |
| public ElementCS visitDomain(@NonNull Domain object) { |
| throw new UnsupportedOperationException(); |
| } |
| |
| @Override |
| public ElementCS visitFunction(@NonNull Function asFunction) { |
| QueryCS csQuery = refreshTypedElement(QueryCS.class, QVTimperativeCSPackage.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, QVTimperativeCSPackage.Literals.PARAM_DECLARATION_CS, asFunctionParameter); |
| return csParamDeclaration; |
| } |
| |
| @Override |
| public ElementCS visitGuardParameter(@NonNull GuardParameter asVariable) { |
| ImperativeTypedModel asTypedModel = asVariable.getReferredTypedModel(); |
| org.eclipse.ocl.pivot.Package asUsedPackage = asTypedModel.getUsedPackage().size() > 0 ? asTypedModel.getUsedPackage().get(0) : null; |
| Mapping containingMapping = QVTimperativeUtil.getContainingMapping(asVariable); |
| assert containingMapping != null; |
| GuardParameterCS csUnrealizedVariable = context.refreshNamedElement(GuardParameterCS.class, QVTimperativeCSPackage.Literals.GUARD_PARAMETER_CS, asVariable); |
| csUnrealizedVariable.setPivot(asVariable); |
| csUnrealizedVariable.setReferredTypedModel(asTypedModel); |
| csUnrealizedVariable.setOwnedType(createTypeRefCS(asVariable.getType(), asUsedPackage)); |
| return csUnrealizedVariable; |
| } |
| |
| @Override |
| public ElementCS visitGuardParameterBinding(@NonNull GuardParameterBinding asMappingParameterBinding) { |
| GuardParameterBindingCS csMappingParameterBinding = context.refreshElement(GuardParameterBindingCS.class, QVTimperativeCSPackage.Literals.GUARD_PARAMETER_BINDING_CS, asMappingParameterBinding); |
| csMappingParameterBinding.setPivot(asMappingParameterBinding); |
| csMappingParameterBinding.setReferredVariable((GuardParameter) asMappingParameterBinding.getBoundVariable()); |
| csMappingParameterBinding.setValue(asMappingParameterBinding.getValue()); |
| csMappingParameterBinding.setIsCheck(asMappingParameterBinding.isIsCheck()); |
| return csMappingParameterBinding; |
| } |
| |
| @Override |
| public ElementCS visitImperativeModel(@NonNull ImperativeModel asModel) { |
| assert asModel.eContainer() == null; |
| TopLevelCS csDocument = context.refreshElement(TopLevelCS.class, QVTimperativeCSPackage.Literals.TOP_LEVEL_CS, asModel); |
| csDocument.setPivot(asModel); |
| context.refreshList(csDocument.getOwnedImports(), context.visitDeclarations(ImportCS.class, asModel.getOwnedImports(), null)); |
| |
| buildModel(csDocument, asModel); |
| |
| List<@NonNull Mapping> asMappings = null; |
| List<@NonNull Function> asQueries = null; |
| List<@NonNull ImperativeTransformation> asTransformations = new ArrayList<>(); |
| gatherTransformations(asTransformations, asModel.getOwnedPackages()); |
| for (@NonNull ImperativeTransformation asTransformation : asTransformations) { |
| for (@NonNull Mapping asMapping : QVTimperativeUtil.getOwnedMappings(asTransformation)) { |
| if (asMappings == null) { |
| asMappings = new ArrayList<>(); |
| } |
| asMappings.add(asMapping); |
| } |
| for (Operation asOperation : asTransformation.getOwnedOperations()) { |
| if (asOperation instanceof Function) { |
| if (asQueries == null) { |
| asQueries = new ArrayList<>(); |
| } |
| 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 visitImperativeTransformation(@NonNull ImperativeTransformation asTransformation) { |
| TransformationCS csTransformation = context.refreshNamedElement(TransformationCS.class, QVTimperativeCSPackage.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 visitImperativeTypedModel(@NonNull ImperativeTypedModel asTypedModel) { |
| DirectionCS csDirection = context.refreshNamedElement(DirectionCS.class, QVTimperativeCSPackage.Literals.DIRECTION_CS, asTypedModel, null); |
| if ("".equals(asTypedModel.getName())) { |
| csDirection.setName(null); |
| } |
| csDirection.setIsChecked(asTypedModel.isIsChecked()); |
| csDirection.setIsEnforced(asTypedModel.isIsEnforced()); |
| 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 visitLoopParameterBinding(@NonNull LoopParameterBinding asMappingParameterBinding) { |
| LoopParameterBindingCS csMappingParameterBinding = context.refreshElement(LoopParameterBindingCS.class, QVTimperativeCSPackage.Literals.LOOP_PARAMETER_BINDING_CS, asMappingParameterBinding); |
| csMappingParameterBinding.setPivot(asMappingParameterBinding); |
| csMappingParameterBinding.setReferredVariable((GuardParameter) asMappingParameterBinding.getBoundVariable()); |
| csMappingParameterBinding.setValue(asMappingParameterBinding.getValue()); |
| csMappingParameterBinding.setIsCheck(asMappingParameterBinding.isIsCheck()); |
| return csMappingParameterBinding; |
| } |
| |
| @Override |
| public ElementCS visitLoopVariable(@NonNull LoopVariable asVariable) { |
| VariableCS csVariable = context.refreshNamedElement(VariableCS.class, EssentialOCLCSPackage.Literals.VARIABLE_CS, asVariable); |
| Type type = asVariable.getType(); |
| if ((type instanceof CollectionType) && (((CollectionType)type).getUnspecializedElement() != context.getMetamodelManager().getStandardLibrary().getCollectionType())) { |
| PivotUtil.debugWellContainedness(type); |
| type = ((CollectionType)type).getElementType(); |
| } |
| else if (type instanceof VoidType) { |
| type = null; |
| } |
| if (type != null) { |
| PivotUtil.debugWellContainedness(type); |
| TypedRefCS typeRef = context.visitReference(TypedRefCS.class, type, null); |
| csVariable.setOwnedType(typeRef); |
| } |
| else { |
| csVariable.setOwnedType(null); |
| } |
| return csVariable; |
| } |
| |
| @Override |
| public ElementCS visitMapping(@NonNull Mapping asMapping) { |
| MappingCS csMapping = context.refreshNamedElement(MappingCS.class, QVTimperativeCSPackage.Literals.MAPPING_CS, asMapping); |
| csMapping.setPivot(asMapping); |
| refreshOwnedInTransformation(csMapping, asMapping); |
| context.refreshList(csMapping.getOwnedParameters(), context.visitDeclarations(MappingParameterCS.class, asMapping.getOwnedParameters(), null)); |
| context.refreshList(csMapping.getOwnedStatements(), context.visitDeclarations(StatementCS.class, asMapping.getOwnedStatements(), null)); |
| return csMapping; |
| } |
| |
| @Override |
| public ElementCS visitMappingCall(@NonNull MappingCall asMappingCall) { |
| MappingCallCS csMappingCall = context.refreshElement(MappingCallCS.class, QVTimperativeCSPackage.Literals.MAPPING_CALL_CS, asMappingCall); |
| csMappingCall.setPivot(asMappingCall); |
| context.refreshList(csMappingCall.getOwnedBindings(), context.visitDeclarations(MappingParameterBindingCS.class, asMappingCall.getBinding(), null)); |
| csMappingCall.setIsInfinite(asMappingCall.isIsInfinite()); |
| csMappingCall.setIsInstall(asMappingCall.isIsInstall()); |
| csMappingCall.setIsInvoke(asMappingCall.isIsInvoke()); |
| refreshReferredMapping(csMappingCall, asMappingCall); |
| return csMappingCall; |
| } |
| |
| @Override |
| public ElementCS visitMappingLoop(@NonNull MappingLoop asMappingLoop) { |
| MappingLoopCS csMappingLoop = context.refreshElement(MappingLoopCS.class, QVTimperativeCSPackage.Literals.MAPPING_LOOP_CS, asMappingLoop); |
| csMappingLoop.setPivot(asMappingLoop); |
| csMappingLoop.setOwnedIterator(context.visitDeclaration(VariableCS.class, asMappingLoop.getOwnedIterators().get(0))); |
| csMappingLoop.setOwnedInExpression(createExpCS(asMappingLoop.getOwnedExpression())); |
| context.refreshList(csMappingLoop.getOwnedMappingStatements(), context.visitDeclarations(MappingStatementCS.class, asMappingLoop.getOwnedMappingStatements(), null)); |
| refreshObservedProperties(asMappingLoop, csMappingLoop.getObservedProperties(), ClassUtil.nullFree(asMappingLoop.getObservedProperties())); |
| return csMappingLoop; |
| } |
| |
| @Override |
| public ElementCS visitMappingParameter(@NonNull MappingParameter object) { |
| return visiting(object); |
| } |
| |
| @Override |
| public ElementCS visitMappingParameterBinding(@NonNull MappingParameterBinding object) { |
| return visiting(object); |
| } |
| |
| @Override |
| public ElementCS visitMappingStatement(@NonNull MappingStatement object) { |
| return visiting(object); |
| } |
| |
| @Override |
| public ElementCS visitNewStatement(@NonNull NewStatement asNewStatement) { |
| ImperativeTypedModel asTypedModel = asNewStatement.getReferredTypedModel(); |
| org.eclipse.ocl.pivot.Package asUsedPackage = asTypedModel.getUsedPackage().size() > 0 ? asTypedModel.getUsedPackage().get(0) : null; |
| NewStatementCS csNewStatement = context.refreshNamedElement(NewStatementCS.class, QVTimperativeCSPackage.Literals.NEW_STATEMENT_CS, asNewStatement); |
| csNewStatement.setOwnedType(createTypeRefCS(asNewStatement.getType(), asUsedPackage)); |
| csNewStatement.setReferredTypedModel(asTypedModel); |
| csNewStatement.setOwnedExpression(context.visitDeclaration(ExpCS.class, asNewStatement.getOwnedExpression())); |
| refreshObservedProperties(asNewStatement, csNewStatement.getObservedProperties(), ClassUtil.nullFree(asNewStatement.getObservedProperties())); |
| return csNewStatement; |
| } |
| |
| @Override |
| public ElementCS visitObservableStatement(@NonNull ObservableStatement object) { |
| return visiting(object); |
| } |
| |
| @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) { |
| throw new UnsupportedOperationException(); |
| } |
| |
| @Override |
| public ElementCS visitRule(@NonNull Rule object) { |
| throw new UnsupportedOperationException(); |
| } |
| |
| @Override |
| public ElementCS visitSetStatement(@NonNull SetStatement asSetStatement) { |
| SetStatementCS csStatement = context.refreshElement(SetStatementCS.class, QVTimperativeCSPackage.Literals.SET_STATEMENT_CS, asSetStatement); |
| csStatement.setReferredVariable(asSetStatement.getTargetVariable()); |
| csStatement.setReferredProperty(QVTimperativeUtil.getTargetProperty(asSetStatement)); |
| csStatement.setOwnedExpression(createExpCS(asSetStatement.getOwnedExpression())); |
| csStatement.setIsNotify(asSetStatement.isIsNotify()); |
| refreshObservedProperties(asSetStatement, csStatement.getObservedProperties(), ClassUtil.nullFree(asSetStatement.getObservedProperties())); |
| return csStatement; |
| } |
| |
| @Override |
| public ElementCS visitSimpleParameter(@NonNull SimpleParameter asVariable) { |
| ImperativeTypedModel asTypedModel = asVariable.getReferredTypedModel(); |
| org.eclipse.ocl.pivot.Package asUsedPackage = asTypedModel.getUsedPackage().size() > 0 ? asTypedModel.getUsedPackage().get(0) : null; |
| Mapping containingMapping = QVTimperativeUtil.getContainingMapping(asVariable); |
| assert containingMapping != null; |
| SimpleParameterCS csUnrealizedVariable = context.refreshNamedElement(SimpleParameterCS.class, QVTimperativeCSPackage.Literals.SIMPLE_PARAMETER_CS, asVariable); |
| csUnrealizedVariable.setPivot(asVariable); |
| csUnrealizedVariable.setReferredTypedModel(asTypedModel); |
| csUnrealizedVariable.setOwnedType(createTypeRefCS(asVariable.getType(), asUsedPackage)); |
| return csUnrealizedVariable; |
| } |
| |
| @Override |
| public ElementCS visitSimpleParameterBinding(@NonNull SimpleParameterBinding asMappingParameterBinding) { |
| SimpleParameterBindingCS csMappingParameterBinding = context.refreshElement(SimpleParameterBindingCS.class, QVTimperativeCSPackage.Literals.SIMPLE_PARAMETER_BINDING_CS, asMappingParameterBinding); |
| csMappingParameterBinding.setPivot(asMappingParameterBinding); |
| csMappingParameterBinding.setReferredVariable((SimpleParameter) asMappingParameterBinding.getBoundVariable()); |
| csMappingParameterBinding.setOwnedValue(createExpCS(asMappingParameterBinding.getValue())); |
| csMappingParameterBinding.setIsCheck(asMappingParameterBinding.isIsCheck()); |
| return csMappingParameterBinding; |
| } |
| |
| @Override |
| public ElementCS visitStatement(@NonNull Statement object) { |
| return visiting(object); |
| } |
| |
| @Override |
| public ElementCS visitTransformation(@NonNull Transformation object) { |
| return visiting(object); |
| } |
| |
| @Override |
| public ElementCS visitTypedModel(@NonNull TypedModel object) { |
| return visiting(object); |
| } |
| |
| @Override |
| public ElementCS visitVariable(@NonNull Variable asVariable) { |
| assert !(asVariable.eContainer() instanceof Mapping); |
| /* if (asVariable.eContainer() instanceof Mapping) { |
| Mapping containingMapping = QVTimperativeUtil.getContainingMapping(asVariable); |
| assert containingMapping != null; |
| for (CheckStatement asPredicate : containingMapping.getGuardPredicates()) { |
| if (asPredicate instanceof VariablePredicate) { |
| VariablePredicate asVariablePredicate = (VariablePredicate)asPredicate; |
| if (asVariablePredicate.getTargetVariable() == asVariable) { |
| OCLExpression ownedExpression = asVariablePredicate.getConditionExpression(); |
| PredicateVariableCS csUnrealizedVariable = context.refreshNamedElement(PredicateVariableCS.class, QVTimperativeCSPackage.Literals.PREDICATE_VARIABLE_CS, asVariable); |
| csUnrealizedVariable.setPivot(asVariable); |
| csUnrealizedVariable.setOwnedType(createTypeRefCS(asVariable.getType(), getScope(asVariable))); |
| csUnrealizedVariable.setOwnedExpressionExpression(context.visitDeclaration(ExpCS.class, ownedExpression)); |
| return csUnrealizedVariable; |
| } |
| } |
| } |
| throw new UnsupportedOperationException(); // Should be GuardVariable |
| } |
| else { */ |
| return super.visitVariable(asVariable); |
| // } |
| } |
| |
| @Override |
| public ElementCS visitVariableStatement(@NonNull VariableStatement object) { |
| return visiting(object); |
| } |
| } |