diff --git a/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/types/BIntersectionType.java b/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/types/BIntersectionType.java index 3c3e96917c66..5f96c1e1f040 100644 --- a/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/types/BIntersectionType.java +++ b/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/types/BIntersectionType.java @@ -26,6 +26,7 @@ import io.ballerina.runtime.api.types.Type; import io.ballerina.runtime.api.types.semtype.Builder; import io.ballerina.runtime.api.types.semtype.Context; +import io.ballerina.runtime.api.types.semtype.Core; import io.ballerina.runtime.api.types.semtype.SemType; import java.util.ArrayList; @@ -225,7 +226,21 @@ SemType createSemType(Context cx) { if (effectiveType instanceof SemType semType) { return semType; } - return Builder.from(cx, effectiveType); + if (constituentTypes.isEmpty()) { + return Builder.neverType(); + } + SemType result = Builder.from(cx, constituentTypes.get(0)); + boolean hasBType = Core.containsBasicType(Builder.from(cx, effectiveType), Builder.bType()); + result = Core.intersect(result, Core.SEMTYPE_TOP); + for (int i = 1; i < constituentTypes.size(); i++) { + SemType memberType = Builder.from(cx, constituentTypes.get(i)); +// hasBType |= Core.containsBasicType(memberType, Builder.bType()); + result = Core.intersect(result, memberType); + } + if (hasBType) { + return Core.union(result, BTypeConverter.wrapAsPureBType((BType) effectiveType)); + } + return result; } @Override diff --git a/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/types/BTypeConverter.java b/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/types/BTypeConverter.java index 2eadeeddc7f4..0e3640df57b3 100644 --- a/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/types/BTypeConverter.java +++ b/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/types/BTypeConverter.java @@ -122,7 +122,7 @@ private static BTypeParts split(Context cx, Type type) { } else if (type instanceof BTypeReferenceType referenceType) { return split(cx, referenceType.getReferredType()); } else if (type instanceof BIntersectionType intersectionType) { - return split(cx, intersectionType.getEffectiveType()); + return splitIntersection(cx, intersectionType); } else if (type instanceof BReadonlyType readonlyType) { return splitReadonly(readonlyType); } else if (type instanceof BFiniteType finiteType) { @@ -134,6 +134,17 @@ private static BTypeParts split(Context cx, Type type) { } } + private static BTypeParts splitIntersection(Context cx, BIntersectionType intersectionType) { + List members = Collections.unmodifiableList(intersectionType.getConstituentTypes()); + SemType semTypePart = Builder.valType(); + for (Type member : members) { + BTypeParts memberParts = split(cx, member); + semTypePart = Core.intersect(memberParts.semTypePart(), semTypePart); + } + BTypeParts effectiveTypeParts = split(cx, intersectionType.getEffectiveType()); + return new BTypeParts(semTypePart, effectiveTypeParts.bTypeParts()); + } + private static BTypeParts splitSemTypeSupplier(Context cx, PartialSemTypeSupplier supplier) { int startingIndex = cx.addProvisionalType((BType) supplier); SemType semtype = supplier.get(cx);