From 01a69232d99c82c5746700787ad17dc014762e93 Mon Sep 17 00:00:00 2001 From: Sung-Shik Jongmans Date: Tue, 4 Aug 2026 09:54:59 +0200 Subject: [PATCH] Add `filterUnused` as a faster alternative to `reportUnused` --- src/analysis/typepal/ConfigurableScopeGraph.rsc | 7 +++++++ src/analysis/typepal/Solver.rsc | 13 +++++-------- 2 files changed, 12 insertions(+), 8 deletions(-) diff --git a/src/analysis/typepal/ConfigurableScopeGraph.rsc b/src/analysis/typepal/ConfigurableScopeGraph.rsc index d6df65c..c6d1b5d 100644 --- a/src/analysis/typepal/ConfigurableScopeGraph.rsc +++ b/src/analysis/typepal/ConfigurableScopeGraph.rsc @@ -75,6 +75,11 @@ bool defaultReportUnused (loc _, TModel _) { return false; } +list[loc] defaultFilterUnused(list[loc] defs, TModel tm) { + bool(loc, TModel) reportUnused = tm.config.reportUnused; + return [d | loc d <- defs, reportUnused(d, tm)]; +} + // https://en.wikipedia.org/wiki/Uniform_Resource_Identifier#:~:text=A%20URI%20is%20composed%20from,)%2C%20and%20the%20character%20%25%20. // gen-delims: : / ? # [ ] @ // sub-delims: ! $ & ' ( ) * + , ; @@ -157,6 +162,8 @@ data TypePalConfig( bool(loc def, TModel tm) reportUnused = defaultReportUnused, + list[loc](list[loc] defs, TModel tm) filterUnused = defaultFilterUnused, + loc (Define def, str modelName, PathConfig pcfg) createLogicalLoc = defaultLogicalLoc, list[str] (Use u, TModel tm) similarNames = defaultSimilarNames, diff --git a/src/analysis/typepal/Solver.rsc b/src/analysis/typepal/Solver.rsc index 2a118e9..36e030b 100644 --- a/src/analysis/typepal/Solver.rsc +++ b/src/analysis/typepal/Solver.rsc @@ -141,7 +141,7 @@ Solver newSolver(map[str,Tree] namedTrees, TModel tm){ AType(AType containerType, Tree selector, loc scope, Solver s) getTypeInNamelessTypeFun = defaultGetTypeInNamelessType; - bool(loc def, TModel tm) reportUnused = defaultReportUnused; + list[loc](list[loc] defs, TModel tm) filterUnused = defaultFilterUnused; map[loc,loc] logical2physical = tm.logical2physical; @@ -177,7 +177,7 @@ Solver newSolver(map[str,Tree] namedTrees, TModel tm){ getTypeNamesAndRole = tc.getTypeNamesAndRole; getTypeInTypeFromDefineFun = tc.getTypeInTypeFromDefine; getTypeInNamelessTypeFun = tc.getTypeInNamelessType; - reportUnused = tc.reportUnused; + filterUnused = tc.filterUnused; } TypePalConfig solver_getConfig() = tm.config; @@ -1823,12 +1823,9 @@ Solver newSolver(map[str,Tree] namedTrees, TModel tm){ }; tm.defines = toSet(ldefines); - for(Define def <- tm.defines){ - defdefined = solver_toPhysicalLoc(def.defined); - if(defdefined notin def2uses && defdefined notin doubleDefs && reportUnused(defdefined, tm)){ - messages += warning("Unused ``", defdefined); - } - } + list[loc] unused = filterUnused([l | Define def <- tm.defines, loc l := solver_toPhysicalLoc(def.defined), l notin def2uses, l notin doubleDefs], tm); + messages += [warning("Unused ``", l) | loc l <- unused, Define def := definitions[l]]; + messages = visit(messages) { case loc l => solver_toPhysicalLoc(l) }; tm.messages = sortMostPrecise(toList(toSet(messages)));