This is an automated email from the ASF dual-hosted git repository. joshtynjala pushed a commit to branch develop in repository https://gitbox.apache.org/repos/asf/royale-compiler.git
commit c605ace5d32456e7ab1f0754363bea284aaa6aa0 Author: Josh Tynjala <[email protected]> AuthorDate: Tue Jun 20 13:09:20 2023 -0700 TernaryOperator: resolving type of ?: ternary operator now accounts for the common base type, using the same algorithm as type inference --- .../royale/compiler/internal/tree/as/TernaryOperatorNode.java | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/compiler/src/main/java/org/apache/royale/compiler/internal/tree/as/TernaryOperatorNode.java b/compiler/src/main/java/org/apache/royale/compiler/internal/tree/as/TernaryOperatorNode.java index e8c9301a8..01fa93368 100644 --- a/compiler/src/main/java/org/apache/royale/compiler/internal/tree/as/TernaryOperatorNode.java +++ b/compiler/src/main/java/org/apache/royale/compiler/internal/tree/as/TernaryOperatorNode.java @@ -21,6 +21,7 @@ package org.apache.royale.compiler.internal.tree.as; import org.apache.royale.compiler.constants.IASLanguageConstants.BuiltinType; import org.apache.royale.compiler.definitions.ITypeDefinition; +import org.apache.royale.compiler.internal.semantics.SemanticUtils; import org.apache.royale.compiler.parsing.IASToken; import org.apache.royale.compiler.projects.ICompilerProject; import org.apache.royale.compiler.tree.ASTNodeID; @@ -145,11 +146,15 @@ public class TernaryOperatorNode extends BinaryOperatorNodeBase implements ITern // The old compiler simply considered the type of (a ? b : c) to be *. // We'll do a bit better: if b and c have identical type // then we'll consider (a ? b : c) to be that type. - // We should probably determine the common base type of b and c, - // but if either or both types are interfaces rather than classes, - // it isn't obvious what this means. + // If the types are not identical, we'll try to find a common base type, + // and only then, fall back to the * type. ITypeDefinition leftType = getLeftOperandNode().resolveType(project); ITypeDefinition rightType = getRightOperandNode().resolveType(project); + ITypeDefinition commonType = SemanticUtils.resolveCommonType(leftType, rightType, project); + if (commonType != null) + { + return commonType; + } if (leftType == rightType) return leftType;
