From d118198d46dc3cc90f992340fdf5c0c45decd2f6 Mon Sep 17 00:00:00 2001 From: Rafael Chaves Date: Tue, 1 Oct 2019 12:10:20 -0300 Subject: [PATCH] arithmetic operands should be null safe #163 --- .../models/libraries/mdd_types.tuml | 34 +++++++++---------- ...mpleInitializationExpressionProcessor.java | 5 ++- 2 files changed, 21 insertions(+), 18 deletions(-) diff --git a/plugins/com.abstratt.mdd.core/models/libraries/mdd_types.tuml b/plugins/com.abstratt.mdd.core/models/libraries/mdd_types.tuml index 275d1468..f891c097 100755 --- a/plugins/com.abstratt.mdd.core/models/libraries/mdd_types.tuml +++ b/plugins/com.abstratt.mdd.core/models/libraries/mdd_types.tuml @@ -64,37 +64,37 @@ end; class Boolean specializes Primitive query \not() : Boolean; - query \and(b : Boolean[1]) : Boolean; - query \or(b : Boolean[1]) : Boolean; - query \xor(b : Boolean[1]) : Boolean; - query implies(b : Boolean[1]) : Boolean; + query \and(b : Boolean[0,1] := false) : Boolean; + query \or(b : Boolean[0,1] := false) : Boolean; + query \xor(b : Boolean[0,1] := false) : Boolean; + query implies(b : Boolean[0,1] := false) : Boolean; end; class Number specializes Primitive - query add(r : Number[1]) : Number; - query subtract(r : Number[1]) : Number; + query add(r : Number[0,1] := 0) : Number; + query subtract(r : Number[0,1] := 0) : Number; query subtract() : Number; - query multiply(r : Number[1]) : Number; - query divide(r : Number[1]) : Number; + query multiply(r : Number[0,1] := 1) : Number; + query divide(r : Number[0,1] := 1) : Number; query asInteger() : Integer; query asDouble() : Double; end; class Integer specializes Double - query add(r : Integer[1]) : Integer; - query subtract(r : Integer[1]) : Integer; + query add(r : Integer[0,1] := 0) : Integer; + query subtract(r : Integer[0,1] := 0) : Integer; query subtract() : Integer; - query multiply(r : Integer[1]) : Integer; - query divide(r : Integer[1]) : Integer; - query modulo(r : Integer[1]) : Integer; + query multiply(r : Integer[0,1] := 1) : Integer; + query divide(r : Integer[0,1] := 1) : Integer; + query modulo(r : Integer[0,1] := 0) : Integer; query absolute() : Integer; end; class Double specializes Number - query add(r : Number[1]) : Double; - query subtract(r : Number[1]) : Double; - query multiply(r : Number[1]) : Double; - query divide(r : Number[1]) : Double; + query add(r : Number[0,1] := 0) : Double; + query subtract(r : Number[0,1] := 0) : Double; + query multiply(r : Number[0,1] := 1) : Double; + query divide(r : Number[0,1] := 1) : Double; query subtract() : Double; query fractionalPart() : Double; query absolute() : Double; diff --git a/plugins/com.abstratt.mdd.frontend.textuml.core/src/com/abstratt/mdd/internal/frontend/textuml/SimpleInitializationExpressionProcessor.java b/plugins/com.abstratt.mdd.frontend.textuml.core/src/com/abstratt/mdd/internal/frontend/textuml/SimpleInitializationExpressionProcessor.java index cc3518b7..45e12c04 100755 --- a/plugins/com.abstratt.mdd.frontend.textuml.core/src/com/abstratt/mdd/internal/frontend/textuml/SimpleInitializationExpressionProcessor.java +++ b/plugins/com.abstratt.mdd.frontend.textuml.core/src/com/abstratt/mdd/internal/frontend/textuml/SimpleInitializationExpressionProcessor.java @@ -13,6 +13,7 @@ import com.abstratt.mdd.core.IRepository; import com.abstratt.mdd.core.Step; +import com.abstratt.mdd.core.util.TypeUtils; import com.abstratt.mdd.frontend.core.TypeMismatch; import com.abstratt.mdd.frontend.core.UnknownType; import com.abstratt.mdd.frontend.core.spi.AbortedScopeCompilationException; @@ -33,11 +34,13 @@ public class SimpleInitializationExpressionProcessor { private IReferenceTracker referenceTracker; private ProblemBuilder problemBuilder; private Namespace currentNamespace; + private IRepository repository; SimpleInitializationExpressionProcessor(SourceCompilationContext sourceContext, Namespace currentNamespace) { this.referenceTracker = sourceContext.getReferenceTracker(); this.problemBuilder = sourceContext.getProblemBuilder(); this.currentNamespace = currentNamespace; + this.repository = sourceContext.getContext().getRepository(); } protected ValueSpecification parseValueSpecification(PLiteralOrIdentifier node, final Type expectedType) { @@ -85,7 +88,7 @@ protected void onBind(Type element) { final ValueSpecification valueSpec = parseValueSpecification(initializationExpression, typedElement.getType()); if (valueSpec != null) { - if (typedElement.getType() != valueSpec.getType()) + if (!TypeUtils.isCompatible(repository, valueSpec, typedElement, null)) problemBuilder.addProblem(new TypeMismatch(typedElement.getType().getQualifiedName(), valueSpec .getType().getQualifiedName()), typeIdentifierNode); else {