From 6cc541ff3ad5e7b2f226c04265fdef60fe4758b4 Mon Sep 17 00:00:00 2001 From: Sung-Shik Jongmans Date: Wed, 9 Sep 2026 09:57:31 +0200 Subject: [PATCH] Add catch clauses to `getTypeInScopeFromName`, `getTypeInScope`, and `getTypeInType` to avoid leaking `NoBinding()` exceptions out of the solver --- src/analysis/typepal/Solver.rsc | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/src/analysis/typepal/Solver.rsc b/src/analysis/typepal/Solver.rsc index 18d4e5a..4dbeb54 100644 --- a/src/analysis/typepal/Solver.rsc +++ b/src/analysis/typepal/Solver.rsc @@ -752,8 +752,11 @@ Solver newSolver(map[str,Tree] namedTrees, TModel tm){ AType solver_getTypeInScopeFromName(str name, loc scope, set[IdRole] idRoles){ try { return getTypeInScopeFromName0(name, getLogicalLoc(scope), idRoles); - } catch NoSuchKey(value _): - throw TypeUnavailable(); + } + catch NoSuchKey(value _): + throw TypeUnavailable(); + catch NoBinding(): + throw TypeUnavailable(); } AType getTypeInScope0(Tree occ, loc scope, set[IdRole] idRoles){ @@ -790,7 +793,10 @@ Solver newSolver(map[str,Tree] namedTrees, TModel tm){ AType solver_getTypeInScope(Tree occ, loc scope, set[IdRole] idRoles){ try { return getTypeInScope0(occ, getLogicalLoc(scope), idRoles); - } catch NoSuchKey(_): + } + catch NoSuchKey(_): + throw TypeUnavailable(); + catch NoBinding(): throw TypeUnavailable(); } @@ -812,7 +818,13 @@ Solver newSolver(map[str,Tree] namedTrees, TModel tm){ } AType solver_getTypeInType(Tree container, Tree selector, set[IdRole] idRolesSel, loc scope){ + try { return getTypeInType(solver_getType(getLogicalLoc(container)), selector, idRolesSel, scope); + } + catch NoSuchKey(_): + throw TypeUnavailable(); + catch NoBinding(): + throw TypeUnavailable(); } AType getTypeInType(AType containerType, Tree selector, set[IdRole] idRolesSel, loc scope){