diff options
author | Ed Willink | 2019-04-22 11:46:20 +0000 |
---|---|---|
committer | Ed Willink | 2019-04-28 12:52:46 +0000 |
commit | 086317b15984a2d1a66c9753569464b675d977db (patch) | |
tree | 9f77cfbe1d526151dc47348d59fe369402dd78f1 | |
parent | cf1f9bd8be0515bcd0194239be56f33698635a58 (diff) | |
download | org.eclipse.qvtd-086317b15984a2d1a66c9753569464b675d977db.tar.gz org.eclipse.qvtd-086317b15984a2d1a66c9753569464b675d977db.tar.xz org.eclipse.qvtd-086317b15984a2d1a66c9753569464b675d977db.zip |
QVTrQVTs for DataType when connection
-rw-r--r-- | plugins/org.eclipse.qvtd.compiler/src/org/eclipse/qvtd/compiler/internal/qvtr2qvts/NonTopWhenOnlyClassInvocationAnalysis.java (renamed from plugins/org.eclipse.qvtd.compiler/src/org/eclipse/qvtd/compiler/internal/qvtr2qvts/NonTopWhenOnlyInvocationAnalysis.java) | 8 | ||||
-rw-r--r-- | plugins/org.eclipse.qvtd.compiler/src/org/eclipse/qvtd/compiler/internal/qvtr2qvts/NonTopWhenOnlyDataTypeInvocationAnalysis.java | 41 | ||||
-rw-r--r-- | plugins/org.eclipse.qvtd.compiler/src/org/eclipse/qvtd/compiler/internal/qvtr2qvts/RelationAnalysis.java | 21 |
3 files changed, 65 insertions, 5 deletions
diff --git a/plugins/org.eclipse.qvtd.compiler/src/org/eclipse/qvtd/compiler/internal/qvtr2qvts/NonTopWhenOnlyInvocationAnalysis.java b/plugins/org.eclipse.qvtd.compiler/src/org/eclipse/qvtd/compiler/internal/qvtr2qvts/NonTopWhenOnlyClassInvocationAnalysis.java index aef884f79..330660c17 100644 --- a/plugins/org.eclipse.qvtd.compiler/src/org/eclipse/qvtd/compiler/internal/qvtr2qvts/NonTopWhenOnlyInvocationAnalysis.java +++ b/plugins/org.eclipse.qvtd.compiler/src/org/eclipse/qvtd/compiler/internal/qvtr2qvts/NonTopWhenOnlyClassInvocationAnalysis.java @@ -15,12 +15,12 @@ import org.eclipse.qvtd.pivot.qvtschedule.ClassDatum; import org.eclipse.qvtd.pivot.qvtschedule.Node; /** - * A NonTopWhenOnlyInvocationAnalysis identifies the invocation of a non-top Relation by a when clause in another. - * The Relation is is not invoked by a where clause anywhere else. + * A NonTopWhenOnlyClassInvocationAnalysis identifies the invocation of a non-top Relation by a when clause in another. + * The Relation has a non-DataType root varioable and is not invoked by a where clause anywhere else. */ -public class NonTopWhenOnlyInvocationAnalysis extends AbstractWhenInvocationAnalysis +public class NonTopWhenOnlyClassInvocationAnalysis extends AbstractWhenInvocationAnalysis { - public NonTopWhenOnlyInvocationAnalysis(@NonNull RelationAnalysis invokingRelationAnalysis, @NonNull RelationAnalysis invokedRelationAnalysis) { + public NonTopWhenOnlyClassInvocationAnalysis(@NonNull RelationAnalysis invokingRelationAnalysis, @NonNull RelationAnalysis invokedRelationAnalysis) { super(invokingRelationAnalysis, invokedRelationAnalysis); } diff --git a/plugins/org.eclipse.qvtd.compiler/src/org/eclipse/qvtd/compiler/internal/qvtr2qvts/NonTopWhenOnlyDataTypeInvocationAnalysis.java b/plugins/org.eclipse.qvtd.compiler/src/org/eclipse/qvtd/compiler/internal/qvtr2qvts/NonTopWhenOnlyDataTypeInvocationAnalysis.java new file mode 100644 index 000000000..6c506368b --- /dev/null +++ b/plugins/org.eclipse.qvtd.compiler/src/org/eclipse/qvtd/compiler/internal/qvtr2qvts/NonTopWhenOnlyDataTypeInvocationAnalysis.java @@ -0,0 +1,41 @@ +/******************************************************************************* + * Copyright (c) 2019 Willink Transformations and others. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v2.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v20.html + * + * Contributors: + * E.D.Willink - Initial API and implementation + *******************************************************************************/ +package org.eclipse.qvtd.compiler.internal.qvtr2qvts; + +import org.eclipse.jdt.annotation.NonNull; +import org.eclipse.qvtd.pivot.qvtschedule.ClassDatum; +import org.eclipse.qvtd.pivot.qvtschedule.Node; + +/** + * A NonTopWhenOnlyDataTypeInvocationAnalysis identifies the invocation of a non-top Relation by a when clause in another. + * The Relation has only DataTyped root variables and is not invoked by a where clause anywhere else. + */ +public class NonTopWhenOnlyDataTypeInvocationAnalysis extends AbstractWhenInvocationAnalysis +{ + public NonTopWhenOnlyDataTypeInvocationAnalysis(@NonNull RelationAnalysis invokingRelationAnalysis, @NonNull RelationAnalysis invokedRelationAnalysis) { + super(invokingRelationAnalysis, invokedRelationAnalysis); + } + + @Override + protected @NonNull Node createInvocationNode(@NonNull String name, @NonNull ClassDatum classDatum, boolean isMatched) { + return invokingRelationAnalysis.createPredicatedNode(name, classDatum, isMatched); + } + + @Override + public boolean isTop() { + return false; + } + + @Override + public @NonNull String toString() { + return invokingRelationAnalysis.getRule().getName() + "==when-only==non-top==>" + invokedRelationAnalysis.getRule().getName(); + } +}
\ No newline at end of file diff --git a/plugins/org.eclipse.qvtd.compiler/src/org/eclipse/qvtd/compiler/internal/qvtr2qvts/RelationAnalysis.java b/plugins/org.eclipse.qvtd.compiler/src/org/eclipse/qvtd/compiler/internal/qvtr2qvts/RelationAnalysis.java index 36ef44c27..ec126fb09 100644 --- a/plugins/org.eclipse.qvtd.compiler/src/org/eclipse/qvtd/compiler/internal/qvtr2qvts/RelationAnalysis.java +++ b/plugins/org.eclipse.qvtd.compiler/src/org/eclipse/qvtd/compiler/internal/qvtr2qvts/RelationAnalysis.java @@ -20,10 +20,12 @@ import java.util.Set; import org.eclipse.emf.ecore.EObject; import org.eclipse.jdt.annotation.NonNull; import org.eclipse.jdt.annotation.Nullable; +import org.eclipse.ocl.pivot.DataType; import org.eclipse.ocl.pivot.OCLExpression; import org.eclipse.ocl.pivot.Operation; import org.eclipse.ocl.pivot.OperationCallExp; import org.eclipse.ocl.pivot.Property; +import org.eclipse.ocl.pivot.Type; import org.eclipse.ocl.pivot.Variable; import org.eclipse.ocl.pivot.VariableDeclaration; import org.eclipse.ocl.pivot.VariableExp; @@ -758,7 +760,24 @@ public class RelationAnalysis extends RuleAnalysis invocationAnalysis = new NonTopWhenAfterWhereInvocationAnalysis(this, invokedRelationAnalysis); } else { - invocationAnalysis = new NonTopWhenOnlyInvocationAnalysis(this, invokedRelationAnalysis); + boolean hasClassInput = false; + Relation rule2 = invokedRelationAnalysis.getRule(); + for (@NonNull RelationDomain relationDomain : QVTrelationUtil.getOwnedDomains(rule2)) { + if (scheduleManager.isInput(relationDomain)) { + for (@NonNull VariableDeclaration rootVariable : QVTrelationUtil.getRootVariables(relationDomain)) { + Type type = QVTrelationUtil.getType(rootVariable); + if (!(type instanceof DataType)) { + hasClassInput = true; + } + } + } + } + if (hasClassInput) { + invocationAnalysis = new NonTopWhenOnlyClassInvocationAnalysis(this, invokedRelationAnalysis); + } + else { + invocationAnalysis = new NonTopWhenOnlyDataTypeInvocationAnalysis(this, invokedRelationAnalysis); + } } } else { |