From fefa1b3b07206218edcd2216e2c0e819c3a6c3ff Mon Sep 17 00:00:00 2001 From: nick_battle Date: Mon, 11 Apr 2022 10:38:13 +0100 Subject: [PATCH] Allow partial function assignment to total function, with subtype PO --- .../overture/typechecker/TypeComparator.java | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/core/typechecker/src/main/java/org/overture/typechecker/TypeComparator.java b/core/typechecker/src/main/java/org/overture/typechecker/TypeComparator.java index be3b610363..a3b482fcf6 100644 --- a/core/typechecker/src/main/java/org/overture/typechecker/TypeComparator.java +++ b/core/typechecker/src/main/java/org/overture/typechecker/TypeComparator.java @@ -232,7 +232,7 @@ private Result searchCompatible(PType to, PType from, boolean paramOnly) } // The pair.result is "Maybe" until this call returns. - pair.result = test(to, from, paramOnly); + pair.result = comptest(to, from, paramOnly); return pair.result; } @@ -257,7 +257,7 @@ private Result searchCompatible(PType to, PType from, boolean paramOnly) * @return Yes or No. */ - private Result test(PType to, PType from, boolean paramOnly) + private Result comptest(PType to, PType from, boolean paramOnly) { if (to instanceof AUnresolvedType) { @@ -487,10 +487,10 @@ && searchCompatible(ma.getTo(), mb.getTo(), paramOnly) == Result.Yes ? Result.Ye AFunctionType fa = (AFunctionType) to; AFunctionType fb = (AFunctionType) from; - if (fb.getPartial() && !fa.getPartial()) - { - return Result.No; - } +// if (fb.getPartial() && !fa.getPartial()) +// { +// return Result.No; +// } return allCompatible(fa.getParameters(), fb.getParameters(), paramOnly) == Result.Yes && (paramOnly || searchCompatible(fa.getResult(), fb.getResult(), paramOnly) == Result.Yes) ? Result.Yes @@ -946,6 +946,11 @@ && searchSubType(subm.getTo(), supm.getTo(), invignore) == Result.Yes) AFunctionType subf = (AFunctionType) sub; AFunctionType supf = (AFunctionType) sup; + if (subf.getPartial() && !supf.getPartial()) + { + return Result.No; + } + return allSubTypes(subf.getParameters(), supf.getParameters(), invignore) == Result.Yes && searchSubType(subf.getResult(), supf.getResult(), invignore) == Result.Yes ? Result.Yes : Result.No;