diff --git a/gradle.properties b/gradle.properties index 3c366e3f..6abf99eb 100644 --- a/gradle.properties +++ b/gradle.properties @@ -25,4 +25,4 @@ assertj_version = 3.21.0 junit_version = 5.8.2 # Version of published artifacts -version = 7.8.20 +version = 7.8.21 diff --git a/language/src/main/java/de/monticore/lang/sysmlv2/types3/SysMLOCLExpressionsTypeVisitor.java b/language/src/main/java/de/monticore/lang/sysmlv2/types3/SysMLOCLExpressionsTypeVisitor.java index bb40eaf3..b5c8247e 100644 --- a/language/src/main/java/de/monticore/lang/sysmlv2/types3/SysMLOCLExpressionsTypeVisitor.java +++ b/language/src/main/java/de/monticore/lang/sysmlv2/types3/SysMLOCLExpressionsTypeVisitor.java @@ -1,6 +1,7 @@ package de.monticore.lang.sysmlv2.types3; import de.monticore.lang.sysmlexpressions._ast.ASTConditionalAndExpression2; +import de.monticore.lang.sysmlexpressions._ast.ASTConditionalOrExpression2; import de.monticore.lang.sysmlexpressions._ast.ASTExistsExpression; import de.monticore.lang.sysmlexpressions._visitor.SysMLExpressionsVisitor2; import de.monticore.ocl.oclexpressions.types3.OCLExpressionsTypeVisitor; @@ -26,12 +27,24 @@ public void endVisit(ASTConditionalAndExpression2 expr) { SymTypeExpression result = TypeVisitorLifting.liftDefault( - this::calculateAndExpression) + this::calculateBooleanBinaryExpression) .apply(left, right); getType4Ast().setTypeOfExpression(expr, result); } - protected SymTypeExpression calculateAndExpression( + @Override + public void endVisit(ASTConditionalOrExpression2 expr) { + SymTypeExpression left = getType4Ast().getPartialTypeOfExpr(expr.getLeft()); + SymTypeExpression right = getType4Ast().getPartialTypeOfExpr(expr.getRight()); + + SymTypeExpression result = + TypeVisitorLifting.liftDefault( + this::calculateBooleanBinaryExpression) + .apply(left, right); + getType4Ast().setTypeOfExpression(expr, result); + } + + protected SymTypeExpression calculateBooleanBinaryExpression( SymTypeExpression left, SymTypeExpression right) { if (SymTypeRelations.isCompatible(left, right) diff --git a/language/src/test/java/typecheck/TypeCheck3Test.java b/language/src/test/java/typecheck/TypeCheck3Test.java index 21d64edc..940847e8 100644 --- a/language/src/test/java/typecheck/TypeCheck3Test.java +++ b/language/src/test/java/typecheck/TypeCheck3Test.java @@ -4,14 +4,17 @@ import de.monticore.expressions.commonexpressions._visitor.CommonExpressionsVisitor2; import de.monticore.expressions.commonexpressions.types3.CommonExpressionsTypeVisitor; import de.monticore.expressions.streamexpressions.types3.StreamExpressionsTypeVisitor; +import de.monticore.lang.sysmlconstraints._ast.ASTConstraintUsage; import de.monticore.lang.sysmlv2.SysMLv2Mill; import de.monticore.lang.sysmlv2.SysMLv2Tool; import de.monticore.literals.mccommonliterals.types3.MCCommonLiteralsTypeVisitor; import de.monticore.ocl.oclexpressions.types3.OCLExpressionsTypeVisitor; +import de.monticore.types.check.SymTypeExpression; import de.monticore.types.mcbasictypes.types3.MCBasicTypesTypeVisitor; import de.monticore.types3.Type4Ast; import de.monticore.types3.TypeCheck3; import de.monticore.types3.util.MapBasedTypeCheck3; +import de.se_rwth.commons.logging.Log; import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; @@ -95,4 +98,67 @@ void testTypeCheck3() throws IOException { assertThat(printer.content).isEqualTo("Übersetzung der length-Funktion"); } + @Test + public void testConditionalAnd2Type() throws IOException { + var tool = new SysMLv2Tool(); + Log.getFindings().clear(); + tool.init(); + + var astExp = SysMLv2Mill.parser().parse_String("constraint { true & false }").get(); + tool.createSymbolTable(astExp); + tool.completeSymbolTable(astExp); + + SymTypeExpression type = TypeCheck3.typeOf(((ASTConstraintUsage)astExp.getSysMLElement(0)).getExpression()); + + assertThat(Log.getFindings().isEmpty()).isTrue(); + assertThat(type.isPrimitive()).isTrue(); + assertThat(type.asPrimitive().getPrimitiveName()).isEqualTo("boolean"); + } + + @Test + public void testConditionalAnd2TypeExpressionOnly() throws IOException { + var tool = new SysMLv2Tool(); + Log.getFindings().clear(); + tool.init(); + + var astExp = SysMLv2Mill.parser().parse_StringExpression("true & false").get(); + + SymTypeExpression type = TypeCheck3.typeOf(astExp); + + assertThat(Log.getFindings().isEmpty()).isTrue(); + assertThat(type.isPrimitive()).isTrue(); + assertThat(type.asPrimitive().getPrimitiveName()).isEqualTo("boolean"); + } + + @Test + public void testConditionalOr2Type() throws IOException { + var tool = new SysMLv2Tool(); + Log.getFindings().clear(); + tool.init(); + + var astExp = SysMLv2Mill.parser().parse_String("constraint { true | false }").get(); + tool.createSymbolTable(astExp); + tool.completeSymbolTable(astExp); + + SymTypeExpression type = TypeCheck3.typeOf(((ASTConstraintUsage)astExp.getSysMLElement(0)).getExpression()); + + assertThat(Log.getFindings().isEmpty()).isTrue(); + assertThat(type.isPrimitive()).isTrue(); + assertThat(type.asPrimitive().getPrimitiveName()).isEqualTo("boolean"); + } + + @Test + public void testConditionalOr2TypeExpressionOnly() throws IOException { + var tool = new SysMLv2Tool(); + Log.getFindings().clear(); + tool.init(); + + var astExp = SysMLv2Mill.parser().parse_StringExpression("true | false").get(); + + SymTypeExpression type = TypeCheck3.typeOf(astExp); + + assertThat(Log.getFindings().isEmpty()).isTrue(); + assertThat(type.isPrimitive()).isTrue(); + assertThat(type.asPrimitive().getPrimitiveName()).isEqualTo("boolean"); + } }