[509616] wip better TypedElement.isRequired
diff --git a/plugins/org.eclipse.ocl.pivot/emf-gen/org/eclipse/ocl/pivot/internal/PropertyImpl.java b/plugins/org.eclipse.ocl.pivot/emf-gen/org/eclipse/ocl/pivot/internal/PropertyImpl.java
index 6d49d6f..18f47cc 100644
--- a/plugins/org.eclipse.ocl.pivot/emf-gen/org/eclipse/ocl/pivot/internal/PropertyImpl.java
+++ b/plugins/org.eclipse.ocl.pivot/emf-gen/org/eclipse/ocl/pivot/internal/PropertyImpl.java
@@ -1699,4 +1699,22 @@
}
setType(null); // Easier to set them all than just the base_xxx ones
}
+
+ @Override
+ public void setName(String newName) {
+ if ("children".equals(newName)) {
+ super.setName(newName);
+ }
+ else {
+ super.setName(newName);
+ }
+ }
+
+ @Override
+ public void setIsRequired(boolean newIsRequired) {
+ if ("children".equals(name) && !newIsRequired) {
+ toString();
+ }
+ super.setIsRequired(newIsRequired);
+ }
} //PropertyImpl
diff --git a/plugins/org.eclipse.ocl.pivot/src/org/eclipse/ocl/pivot/internal/context/AbstractBase2ASConversion.java b/plugins/org.eclipse.ocl.pivot/src/org/eclipse/ocl/pivot/internal/context/AbstractBase2ASConversion.java
index a8f17b4..01714bc 100644
--- a/plugins/org.eclipse.ocl.pivot/src/org/eclipse/ocl/pivot/internal/context/AbstractBase2ASConversion.java
+++ b/plugins/org.eclipse.ocl.pivot/src/org/eclipse/ocl/pivot/internal/context/AbstractBase2ASConversion.java
@@ -17,6 +17,7 @@
import org.eclipse.jdt.annotation.NonNull;
import org.eclipse.jdt.annotation.Nullable;
+import org.eclipse.ocl.pivot.CollectionType;
import org.eclipse.ocl.pivot.ExpressionInOCL;
import org.eclipse.ocl.pivot.NamedElement;
import org.eclipse.ocl.pivot.OCLExpression;
@@ -214,6 +215,9 @@
}
}
public void setType(@NonNull TypedElement pivotElement, Type type, boolean isRequired) {
+ if (type instanceof CollectionType) {
+ // assert isRequired;
+ }
Type primaryType = type != null ? metamodelManager.getPrimaryType(type) : null;
if (primaryType != pivotElement.getType()) {
pivotElement.setType(primaryType);
diff --git a/plugins/org.eclipse.ocl.pivot/src/org/eclipse/ocl/pivot/utilities/PivotUtil.java b/plugins/org.eclipse.ocl.pivot/src/org/eclipse/ocl/pivot/utilities/PivotUtil.java
index a51312f..c9803b7 100644
--- a/plugins/org.eclipse.ocl.pivot/src/org/eclipse/ocl/pivot/utilities/PivotUtil.java
+++ b/plugins/org.eclipse.ocl.pivot/src/org/eclipse/ocl/pivot/utilities/PivotUtil.java
@@ -553,14 +553,27 @@
Property pivotProperty = PivotFactory.eINSTANCE.createProperty();
pivotProperty.setName(eFeature.getName());
pivotProperty.setType(type);
+ pivotProperty.setIsRequired(eFeature.isMany() || eFeature.isRequired());
((PivotObjectImpl)pivotProperty).setESObject(eFeature);
return pivotProperty;
}
+ /**
+ * @deprecated provide isRequired argument
+ */
+ @Deprecated
public static @NonNull Property createProperty(@NonNull String name, @NonNull Type type) {
+ return createProperty(name, type, type instanceof CollectionType);
+ }
+
+ /**
+ * @since 1.3
+ */
+ public static @NonNull Property createProperty(@NonNull String name, @NonNull Type type, boolean isRequired) {
Property pivotProperty = PivotFactory.eINSTANCE.createProperty();
pivotProperty.setName(name);
pivotProperty.setType(type);
+ pivotProperty.setIsRequired(isRequired);
return pivotProperty;
}
diff --git a/plugins/org.eclipse.ocl.xtext.base/src/org/eclipse/ocl/xtext/base/cs2as/BaseCSPreOrderVisitor.java b/plugins/org.eclipse.ocl.xtext.base/src/org/eclipse/ocl/xtext/base/cs2as/BaseCSPreOrderVisitor.java
index 8ff8804..faf9a07 100644
--- a/plugins/org.eclipse.ocl.xtext.base/src/org/eclipse/ocl/xtext/base/cs2as/BaseCSPreOrderVisitor.java
+++ b/plugins/org.eclipse.ocl.xtext.base/src/org/eclipse/ocl/xtext/base/cs2as/BaseCSPreOrderVisitor.java
@@ -584,6 +584,12 @@
}
@Override
+ public Continuation<?> visitTuplePartCS(@NonNull TuplePartCS object) {
+ // TODO Auto-generated method stub
+ return super.visitTuplePartCS(object);
+ }
+
+ @Override
public Continuation<?> visitTupleTypeCS(@NonNull TupleTypeCS csTupleType) {
return new TupleContinuation(context, csTupleType);
}
diff --git a/plugins/org.eclipse.ocl.xtext.base/src/org/eclipse/ocl/xtext/base/utilities/ElementUtil.java b/plugins/org.eclipse.ocl.xtext.base/src/org/eclipse/ocl/xtext/base/utilities/ElementUtil.java
index 7048c10..70b1f39 100644
--- a/plugins/org.eclipse.ocl.xtext.base/src/org/eclipse/ocl/xtext/base/utilities/ElementUtil.java
+++ b/plugins/org.eclipse.ocl.xtext.base/src/org/eclipse/ocl/xtext/base/utilities/ElementUtil.java
@@ -475,6 +475,14 @@
if (lower > 0) {
return true;
}
+ int upper = csMultiplicity.getUpper();
+ if (upper > 1) {
+ return true;
+ }
+ }
+ Element variableType = csTypeRef.getPivot();
+ if (variableType instanceof CollectionType) {
+ return true;
}
}
return false;
diff --git a/plugins/org.eclipse.ocl.xtext.essentialocl/src/org/eclipse/ocl/xtext/essentialocl/cs2as/EssentialOCLCSLeft2RightVisitor.java b/plugins/org.eclipse.ocl.xtext.essentialocl/src/org/eclipse/ocl/xtext/essentialocl/cs2as/EssentialOCLCSLeft2RightVisitor.java
index 88b38e5..860cf14 100644
--- a/plugins/org.eclipse.ocl.xtext.essentialocl/src/org/eclipse/ocl/xtext/essentialocl/cs2as/EssentialOCLCSLeft2RightVisitor.java
+++ b/plugins/org.eclipse.ocl.xtext.essentialocl/src/org/eclipse/ocl/xtext/essentialocl/cs2as/EssentialOCLCSLeft2RightVisitor.java
@@ -871,7 +871,7 @@
else {
accType = initType;
}
- context.setType(acc, accType, false, null);
+ context.setType(acc, accType, accType instanceof CollectionType, null);
}
acc.setRepresentedParameter(iteration.getOwnedAccumulators().get(pivotAccumulators.size()));
pivotAccumulators.add(acc);
@@ -2120,7 +2120,8 @@
pivotElement.setOwnedInit(initExpression);
TypedRefCS csType = csTupleLiteralPart.getOwnedType();
Type type = csType != null ? PivotUtil.getPivot(Type.class, csType) : initExpression != null ? initExpression.getType() : null;
- context.setType(pivotElement, type, (initExpression != null) && initExpression.isIsRequired(), null);
+ boolean isRequired = csType != null ? ElementUtil.isRequired(csType) : (initExpression != null) && initExpression.isIsRequired();
+ context.setType(pivotElement, type, isRequired, null);
}
}
return pivotElement;
diff --git a/tests/org.eclipse.ocl.examples.xtext.tests/src/org/eclipse/ocl/examples/pivot/tests/EvaluateClassifierOperationsTest4.java b/tests/org.eclipse.ocl.examples.xtext.tests/src/org/eclipse/ocl/examples/pivot/tests/EvaluateClassifierOperationsTest4.java
index 4f62c62..00f18f3 100644
--- a/tests/org.eclipse.ocl.examples.xtext.tests/src/org/eclipse/ocl/examples/pivot/tests/EvaluateClassifierOperationsTest4.java
+++ b/tests/org.eclipse.ocl.examples.xtext.tests/src/org/eclipse/ocl/examples/pivot/tests/EvaluateClassifierOperationsTest4.java
@@ -109,6 +109,9 @@
MetamodelManager metamodelManager = ocl.getMetamodelManager();
try {
org.eclipse.ocl.pivot.Class classType = metamodelManager.getStandardLibrary().getClassType();
+ ocl.assertSemanticErrorQuery(classType, "Tuple{a:Integer[1]=1}.allInstances()", PivotMessagesInternal.UnresolvedOperationCall_ERROR_, "Tuple(a:Integer[1])", "allInstances", "");
+
+
ocl.assertQueryResults(null, "Set{CollectionKind::Bag,CollectionKind::Collection,CollectionKind::_'OrderedSet',CollectionKind::_'Sequence',CollectionKind::_'Set'}", "CollectionKind.allInstances()");
ocl.assertQueryResults(null, "Set{true,false}", "Boolean.allInstances()");
ocl.assertQueryResults(null, "Set{null}", "OclVoid.allInstances()");
@@ -117,14 +120,14 @@
ocl.assertSemanticErrorQuery(classType, "Integer.allInstances()", PivotMessagesInternal.UnresolvedStaticOperationCall_ERROR_, "Integer", "allInstances", "");
ocl.assertSemanticErrorQuery(classType, "String.allInstances()", PivotMessagesInternal.UnresolvedStaticOperationCall_ERROR_, "String", "allInstances", "");
ocl.assertSemanticErrorQuery(classType, "Set(Integer).allInstances()", PivotMessagesInternal.UnresolvedStaticOperationCall_ERROR_, "Set(Integer)", "allInstances", "");
- ocl.assertSemanticErrorQuery(classType, "Tuple(a:Integer).allInstances()", PivotMessagesInternal.UnresolvedStaticOperationCall_ERROR_, "Tuple(a:Integer[1])", "allInstances", "");
+ ocl.assertSemanticErrorQuery(classType, "Tuple(a:Integer).allInstances()", PivotMessagesInternal.UnresolvedStaticOperationCall_ERROR_, "Tuple(a:Integer[?])", "allInstances", "");
ocl.assertSemanticErrorQuery(classType, "OclAny.allInstances()", PivotMessagesInternal.UnresolvedStaticOperationCall_ERROR_, "OclAny", "allInstances", "");
ocl.assertSemanticErrorQuery(classType, "4.allInstances()", PivotMessagesInternal.UnresolvedOperationCall_ERROR_, "Integer", "allInstances", "");
ocl.assertSemanticErrorQuery(classType, "true.allInstances()", PivotMessagesInternal.UnresolvedOperationCall_ERROR_, "Boolean", "allInstances", "");
// ocl.assertQueryInvalid(null, "true.allInstances()");
// ocl.assertQueryResults(null, "Set{true,false}", "true.allInstances()");
ocl.assertSemanticErrorQuery(classType, "Set{1}.allInstances()", PivotMessagesInternal.UnresolvedOperationCall_ERROR_, "Set(Integer)", "allInstances", "");
- ocl.assertSemanticErrorQuery(classType, "Tuple{a:Integer=1}.allInstances()", PivotMessagesInternal.UnresolvedOperationCall_ERROR_, "Tuple(a:Integer[1])", "allInstances", "");
+ ocl.assertSemanticErrorQuery(classType, "Tuple{a:Integer[1]=1}.allInstances()", PivotMessagesInternal.UnresolvedOperationCall_ERROR_, "Tuple(a:Integer[1])", "allInstances", "");
ocl.assertQueryInvalid(null, "OclInvalid.allInstances()");
} finally {
ocl.dispose();
diff --git a/tests/org.eclipse.ocl.examples.xtext.tests/src/org/eclipse/ocl/examples/pivot/tests/EvaluateOclAnyOperationsTest4.java b/tests/org.eclipse.ocl.examples.xtext.tests/src/org/eclipse/ocl/examples/pivot/tests/EvaluateOclAnyOperationsTest4.java
index 6a97ccb..70b1a2c 100644
--- a/tests/org.eclipse.ocl.examples.xtext.tests/src/org/eclipse/ocl/examples/pivot/tests/EvaluateOclAnyOperationsTest4.java
+++ b/tests/org.eclipse.ocl.examples.xtext.tests/src/org/eclipse/ocl/examples/pivot/tests/EvaluateOclAnyOperationsTest4.java
@@ -894,8 +894,8 @@
ocl.assertQueryEquals(null, tupleType, "Tuple{a:Integer=3}.oclType()");
ocl.assertQueryEquals(null, tupleType, "Tuple(a:Integer)");
ocl.assertQueryEquals(null, tupleTypeClass, "Tuple(a:Integer).oclType()");
- ocl.assertSemanticErrorQuery(null, "Tuple(a:Integer).allInstances()", PivotMessagesInternal.UnresolvedStaticOperationCall_ERROR_, "Tuple(a:Integer[1])", "allInstances", "");
- ocl.assertSemanticErrorQuery(null, "Tuple{a:Integer=3}.oclType().allInstances()", PivotMessagesInternal.UnresolvedStaticOperationCall_ERROR_, "Tuple(a:Integer[1])", "allInstances", ""); // FIXME
+ ocl.assertSemanticErrorQuery(null, "Tuple(a:Integer).allInstances()", PivotMessagesInternal.UnresolvedStaticOperationCall_ERROR_, "Tuple(a:Integer[?])", "allInstances", "");
+ ocl.assertSemanticErrorQuery(null, "Tuple{a:Integer=3}.oclType().allInstances()", PivotMessagesInternal.UnresolvedStaticOperationCall_ERROR_, "Tuple(a:Integer[?])", "allInstances", ""); // FIXME
ocl.assertQueryResults(null, "Set{}", "Tuple(a:Integer).oclType().allInstances()");
ocl.assertQueryEquals(null, "Tuple", "Tuple{a:Integer=3}.oclType().name");
ocl.dispose();