diff options
author | Ed.Willink | 2013-02-02 20:22:24 +0000 |
---|---|---|
committer | Ed.Willink | 2013-02-02 20:23:57 +0000 |
commit | 40510f38ff669787bbd5c25986a4fc8bab25a9b9 (patch) | |
tree | 253f07dcdd60b2b2b37502e45a02e296c8af122a | |
parent | 15ccd2dfa327e700feaf8a51808c145b84acb417 (diff) | |
download | org.eclipse.qvtd-40510f38ff669787bbd5c25986a4fc8bab25a9b9.tar.gz org.eclipse.qvtd-40510f38ff669787bbd5c25986a4fc8bab25a9b9.tar.xz org.eclipse.qvtd-40510f38ff669787bbd5c25986a4fc8bab25a9b9.zip |
[unrelated] Fix validation errors, primitive type rootVariable
4 files changed, 120 insertions, 13 deletions
diff --git a/plugins/org.eclipse.qvtd.xtext.qvtrelation/src/org/eclipse/qvtd/xtext/qvtrelation/attributes/RelationCallExpCSAttribution.java b/plugins/org.eclipse.qvtd.xtext.qvtrelation/src/org/eclipse/qvtd/xtext/qvtrelation/attributes/RelationCallExpCSAttribution.java index a04490e16..3708a17f0 100644 --- a/plugins/org.eclipse.qvtd.xtext.qvtrelation/src/org/eclipse/qvtd/xtext/qvtrelation/attributes/RelationCallExpCSAttribution.java +++ b/plugins/org.eclipse.qvtd.xtext.qvtrelation/src/org/eclipse/qvtd/xtext/qvtrelation/attributes/RelationCallExpCSAttribution.java @@ -26,7 +26,6 @@ import org.eclipse.ocl.examples.pivot.CallExp; import org.eclipse.ocl.examples.pivot.OCLExpression; import org.eclipse.ocl.examples.pivot.PivotPackage; import org.eclipse.ocl.examples.pivot.Type; -import org.eclipse.ocl.examples.pivot.manager.MetaModelManager; import org.eclipse.ocl.examples.pivot.scoping.EnvironmentView; import org.eclipse.ocl.examples.pivot.scoping.ScopeFilter; import org.eclipse.ocl.examples.pivot.scoping.ScopeView; @@ -53,9 +52,8 @@ public class RelationCallExpCSAttribution extends InvocationExpCSAttribution } @Override -// @Deprecated // going obsolete - protected @NonNull ScopeFilter createInvocationFilter(@NonNull MetaModelManager metaModelManager, @NonNull InvocationExpCS targetElement, @Nullable Type type) { - return new OperationFilter(metaModelManager, type, targetElement) + protected @NonNull ScopeFilter createInvocationFilter(@NonNull InvocationExpCS targetElement, @Nullable Type type) { + return new OperationFilter(type, targetElement) { @Override public boolean matches(@NonNull EnvironmentView environmentView, @NonNull DomainElement eObject) { diff --git a/plugins/org.eclipse.qvtd.xtext.qvtrelation/src/org/eclipse/qvtd/xtext/qvtrelation/cs2pivot/QVTrelationContainmentVisitor.java b/plugins/org.eclipse.qvtd.xtext.qvtrelation/src/org/eclipse/qvtd/xtext/qvtrelation/cs2pivot/QVTrelationContainmentVisitor.java index 1b9ad3d3e..a278c3afd 100644 --- a/plugins/org.eclipse.qvtd.xtext.qvtrelation/src/org/eclipse/qvtd/xtext/qvtrelation/cs2pivot/QVTrelationContainmentVisitor.java +++ b/plugins/org.eclipse.qvtd.xtext.qvtrelation/src/org/eclipse/qvtd/xtext/qvtrelation/cs2pivot/QVTrelationContainmentVisitor.java @@ -107,12 +107,6 @@ public class QVTrelationContainmentVisitor extends AbstractQVTrelationContainmen @NonNull DomainElement match2, @Nullable Map<TemplateParameter, ParameterableElement> bindings2) { return 0; } - - @Deprecated // Going obsolete - public int compareMatches(@NonNull DomainElement match1, @Nullable Map<TemplateParameter, ParameterableElement> bindings1, - @NonNull DomainElement match2, @Nullable Map<TemplateParameter, ParameterableElement> bindings2) { - return 0; - } public boolean matches(@NonNull EnvironmentView environmentView, @NonNull DomainElement eObject) { return (eObject instanceof Operation) || (eObject instanceof Rule); @@ -279,6 +273,15 @@ public class QVTrelationContainmentVisitor extends AbstractQVTrelationContainmen if (pivotElement != null) { pivotElement.setPattern(PivotUtil.getPivot(DomainPattern.class, csElement.getPattern())); context.refreshPivotList(RelationDomainAssignment.class, pivotElement.getDefaultAssignment(), csElement.getDefaultValues()); + Variable rootVariable = null; + DomainPattern rootPattern = pivotElement.getPattern(); + if (rootPattern != null) { + TemplateExp rootTemplate = rootPattern.getTemplateExpression(); + if (rootTemplate != null) { + rootVariable = rootTemplate.getBindsTo(); + } + } + pivotElement.setRootVariable(rootVariable); } return new DomainContentContinuation(context, csElement); } @@ -388,8 +391,23 @@ public class QVTrelationContainmentVisitor extends AbstractQVTrelationContainmen @Override public Continuation<?> visitPrimitiveTypeDomainCS(@NonNull PrimitiveTypeDomainCS csElement) { - @SuppressWarnings("unused") RelationDomain pivotElement = context.refreshModelElement(RelationDomain.class, QVTrelationPackage.Literals.RELATION_DOMAIN, csElement); + if (pivotElement != null) { + DomainPattern pattern = context.refreshModelElement(DomainPattern.class, QVTrelationPackage.Literals.DOMAIN_PATTERN, null); + if (pattern != null) { + pivotElement.setPattern(pattern); + TemplateExp template = context.refreshModelElement(TemplateExp.class, QVTtemplatePackage.Literals.OBJECT_TEMPLATE_EXP, null); + if (template != null) { + pattern.setTemplateExpression(template); + Variable rootVariable = context.refreshModelElement(Variable.class, PivotPackage.Literals.VARIABLE, null); + if (rootVariable != null) { + context.refreshName(rootVariable, csElement.getName()); + template.setBindsTo(rootVariable); + } + pivotElement.setRootVariable(rootVariable); + } + } + } return null; } @@ -426,13 +444,20 @@ public class QVTrelationContainmentVisitor extends AbstractQVTrelationContainmen } } for (Domain domain : pivotElement.getDomain()) { - DomainPattern pattern = ((RelationDomain)domain).getPattern(); + RelationDomain relationDomain = (RelationDomain)domain; + DomainPattern pattern = relationDomain.getPattern(); if (pattern != null) { TemplateExp templateExpression = pattern.getTemplateExpression(); if (templateExpression != null) { gatherVariables(pivotVariables, templateExpression); } } + else { + Variable variable = relationDomain.getRootVariable(); + if (variable != null) { + pivotVariables.add(variable); + } + } } PivotUtil.refreshList(pivotElement.getVariable(), pivotVariables); pivotElement.setWhen(PivotUtil.getPivot(Pattern.class, csElement.getWhen())); diff --git a/plugins/org.eclipse.qvtd.xtext.qvtrelation/src/org/eclipse/qvtd/xtext/qvtrelation/cs2pivot/QVTrelationLeft2RightVisitor.java b/plugins/org.eclipse.qvtd.xtext.qvtrelation/src/org/eclipse/qvtd/xtext/qvtrelation/cs2pivot/QVTrelationLeft2RightVisitor.java index 83685395c..f96f20b64 100644 --- a/plugins/org.eclipse.qvtd.xtext.qvtrelation/src/org/eclipse/qvtd/xtext/qvtrelation/cs2pivot/QVTrelationLeft2RightVisitor.java +++ b/plugins/org.eclipse.qvtd.xtext.qvtrelation/src/org/eclipse/qvtd/xtext/qvtrelation/cs2pivot/QVTrelationLeft2RightVisitor.java @@ -14,8 +14,12 @@ */ package org.eclipse.qvtd.xtext.qvtrelation.cs2pivot; +import java.util.ArrayList; +import java.util.List; + import org.eclipse.jdt.annotation.NonNull; import org.eclipse.jdt.annotation.Nullable; +import org.eclipse.ocl.examples.domain.utilities.DomainUtil; import org.eclipse.ocl.examples.pivot.Element; import org.eclipse.ocl.examples.pivot.Feature; import org.eclipse.ocl.examples.pivot.NamedElement; @@ -23,17 +27,23 @@ import org.eclipse.ocl.examples.pivot.OCLExpression; import org.eclipse.ocl.examples.pivot.OperationCallExp; import org.eclipse.ocl.examples.pivot.PivotPackage; import org.eclipse.ocl.examples.pivot.VariableDeclaration; +import org.eclipse.ocl.examples.pivot.messages.OCLMessages; import org.eclipse.ocl.examples.pivot.utilities.PivotUtil; import org.eclipse.ocl.examples.xtext.base.baseCST.ModelElementCS; import org.eclipse.ocl.examples.xtext.base.cs2pivot.CS2PivotConversion; import org.eclipse.ocl.examples.xtext.essentialocl.essentialOCLCST.InvocationExpCS; +import org.eclipse.ocl.examples.xtext.essentialocl.essentialOCLCST.NavigatingArgCS; +import org.eclipse.ocl.examples.xtext.essentialocl.essentialOCLCST.NavigationRole; +import org.eclipse.qvtd.pivot.qvtbase.Domain; import org.eclipse.qvtd.pivot.qvtbase.Function; import org.eclipse.qvtd.pivot.qvtrelation.QVTrelationPackage; import org.eclipse.qvtd.pivot.qvtrelation.Relation; import org.eclipse.qvtd.pivot.qvtrelation.RelationCallExp; +import org.eclipse.qvtd.pivot.qvtrelation.RelationDomainAssignment; import org.eclipse.qvtd.pivot.qvttemplate.CollectionTemplateExp; import org.eclipse.qvtd.pivot.qvttemplate.ObjectTemplateExp; import org.eclipse.qvtd.xtext.qvtrelationcst.CollectionTemplateCS; +import org.eclipse.qvtd.xtext.qvtrelationcst.DefaultValueCS; import org.eclipse.qvtd.xtext.qvtrelationcst.ObjectTemplateCS; public class QVTrelationLeft2RightVisitor extends AbstractQVTrelationLeft2RightVisitor @@ -57,6 +67,7 @@ public class QVTrelationLeft2RightVisitor extends AbstractQVTrelationLeft2RightV RelationCallExp relationCallExp = context.refreshModelElement(RelationCallExp.class, QVTrelationPackage.Literals.RELATION_CALL_EXP, csInvocationExp); if (relationCallExp != null) { relationCallExp.setReferredRelation(relation); + resolveRelationArguments(csInvocationExp, null, relation, relationCallExp); context.installPivotUsage(csInvocationExp, relationCallExp); return relationCallExp; } @@ -81,6 +92,38 @@ public class QVTrelationLeft2RightVisitor extends AbstractQVTrelationLeft2RightV } return super.resolveOperationReference(namedElement, csInvocationExp); } + + protected void resolveRelationArguments(@NonNull InvocationExpCS csInvocationExp, + @Nullable OCLExpression source, @NonNull Relation relation, @NonNull RelationCallExp relationCallExp) { + List<OCLExpression> pivotArguments = new ArrayList<OCLExpression>(); + List<NavigatingArgCS> csArguments = csInvocationExp.getArgument(); + List<Domain> ownedDomains = relation.getDomain(); + int domainsCount = ownedDomains.size(); + int csArgumentCount = csArguments.size(); + if (csArgumentCount > 0) { + if (csArguments.get(0).getRole() != NavigationRole.EXPRESSION) { + context.addDiagnostic(csInvocationExp, "Relation calls can only specify expressions"); + } + for (int argIndex = 0; argIndex < csArgumentCount; argIndex++) { + NavigatingArgCS csArgument = csArguments.get(argIndex); + if (csArgument.getInit() != null) { + context.addDiagnostic(csArgument, "Unexpected initializer for expression"); + } + if (csArgument.getOwnedType() != null) { + context.addDiagnostic(csArgument, "Unexpected type for expression"); + } + OCLExpression arg = PivotUtil.getPivot(OCLExpression.class, csArgument); + if (arg != null) { + pivotArguments.add(arg); + } + } + } + if ((csArgumentCount != domainsCount) && (relation != getBadOperation())) { + String boundMessage = DomainUtil.bind(OCLMessages.MismatchedArgumentCount_ERROR_, csArgumentCount, domainsCount); + context.addDiagnostic(csInvocationExp, boundMessage); + } + context.refreshList(relationCallExp.getArgument(), pivotArguments); + } @Override public Element visitCollectionTemplateCS(@NonNull CollectionTemplateCS csElement) { @@ -88,6 +131,12 @@ public class QVTrelationLeft2RightVisitor extends AbstractQVTrelationLeft2RightV } @Override + public Element visitDefaultValueCS(@NonNull DefaultValueCS csElement) { + RelationDomainAssignment pivotElement = PivotUtil.getPivot(RelationDomainAssignment.class, csElement); + return pivotElement; + } + + @Override public Element visitObjectTemplateCS(@NonNull ObjectTemplateCS csElement) { return PivotUtil.getPivot(ObjectTemplateExp.class, csElement); } diff --git a/plugins/org.eclipse.qvtd.xtext.qvtrelation/src/org/eclipse/qvtd/xtext/qvtrelation/cs2pivot/QVTrelationPostOrderVisitor.java b/plugins/org.eclipse.qvtd.xtext.qvtrelation/src/org/eclipse/qvtd/xtext/qvtrelation/cs2pivot/QVTrelationPostOrderVisitor.java index 262311085..4bebebd29 100644 --- a/plugins/org.eclipse.qvtd.xtext.qvtrelation/src/org/eclipse/qvtd/xtext/qvtrelation/cs2pivot/QVTrelationPostOrderVisitor.java +++ b/plugins/org.eclipse.qvtd.xtext.qvtrelation/src/org/eclipse/qvtd/xtext/qvtrelation/cs2pivot/QVTrelationPostOrderVisitor.java @@ -30,11 +30,15 @@ import org.eclipse.ocl.examples.xtext.base.cs2pivot.SingleContinuation; import org.eclipse.ocl.examples.xtext.essentialocl.essentialOCLCST.ExpCS; import org.eclipse.qvtd.pivot.qvtbase.Function; import org.eclipse.qvtd.pivot.qvtbase.Predicate; +import org.eclipse.qvtd.pivot.qvtrelation.DomainPattern; +import org.eclipse.qvtd.pivot.qvtrelation.RelationDomain; import org.eclipse.qvtd.pivot.qvtrelation.RelationDomainAssignment; +import org.eclipse.qvtd.pivot.qvttemplate.ObjectTemplateExp; import org.eclipse.qvtd.pivot.qvttemplate.PropertyTemplateItem; import org.eclipse.qvtd.pivot.qvttemplate.TemplateExp; import org.eclipse.qvtd.xtext.qvtrelationcst.DefaultValueCS; import org.eclipse.qvtd.xtext.qvtrelationcst.PredicateCS; +import org.eclipse.qvtd.xtext.qvtrelationcst.PrimitiveTypeDomainCS; import org.eclipse.qvtd.xtext.qvtrelationcst.PropertyTemplateCS; import org.eclipse.qvtd.xtext.qvtrelationcst.QueryCS; import org.eclipse.qvtd.xtext.qvtrelationcst.TemplateCS; @@ -138,11 +142,42 @@ public class QVTrelationPostOrderVisitor extends AbstractQVTrelationPostOrderVis } @Override + public Continuation<?> visitDefaultValueCS(@NonNull DefaultValueCS csElement) { + RelationDomainAssignment pivotElement = PivotUtil.getPivot(RelationDomainAssignment.class, csElement); + if (pivotElement != null) { + ExpCS initialiser = csElement.getInitialiser(); + OCLExpression oclExpression = initialiser != null ? context.visitLeft2Right(OCLExpression.class, initialiser) : null; + pivotElement.setValueExp(oclExpression); + } + return null; + } + + @Override public Continuation<?> visitPredicateCS(@NonNull PredicateCS csElement) { return new PredicateExpressionCompletion(context, csElement); } @Override + public Continuation<?> visitPrimitiveTypeDomainCS(@NonNull PrimitiveTypeDomainCS csElement) { + RelationDomain pivotElement = PivotUtil.getPivot(RelationDomain.class, csElement); + if (pivotElement != null) { + Type type = PivotUtil.getPivot(Type.class, csElement.getType()); + Variable rootVariable = pivotElement.getRootVariable(); + if (rootVariable != null) { + context.setType(rootVariable, type, true); + } + DomainPattern pattern = pivotElement.getPattern(); + if (pattern != null) { + TemplateExp template = pattern.getTemplateExpression(); + if (template instanceof ObjectTemplateExp) { + ((ObjectTemplateExp)template).setReferredClass((org.eclipse.ocl.examples.pivot.Class)type); + } + } + } + return null; + } + + @Override public Continuation<?> visitPropertyTemplateCS(@NonNull PropertyTemplateCS csElement) { return new PropertyTemplateExpressionCompletion(context, csElement); } @@ -166,7 +201,7 @@ public class QVTrelationPostOrderVisitor extends AbstractQVTrelationPostOrderVis for (VarDeclarationIdCS csVarDeclarationId : csElement.getVarDeclarationIds()) { Variable pivotVariable = PivotUtil.getPivot(Variable.class, csVarDeclarationId); if (pivotVariable != null) { - context.setType(pivotVariable, pivotType); + context.setType(pivotVariable, pivotType, false); } } return null; |