scope ai_gazelle_analyzeStatementsForRule. sclass #Data { MultiSet statements; Set possibleVars, usedVars, unusedVars, varsUsedInGood, varsUsedInBad, varsUsedInGoodOnly, varsUsedInBadOnly; Set unclearVars; // used in good and bad mappings MultiMap goodMappings, badMappings, // per var alwaysGoodMappings, alwaysBadMappings; L completeGoodMappings, completeBadMappings; Map varScores; } static Data ai_gazelle_analyzeStatementsForRule(Collection l) { Set possibleVars = asCISet(matchAny_firstGroups("possible variable *", l)); Set usedVars = asCISet(matchX_any_firstGroups("... variable * was used", l)); Set unusedVars = asCISet(listMinusSet(possibleVars, usedVars)); Set varsUsedInGood = asCISet(matchX_any_firstGroups("in a good mapping, variable * was used", l)); Set varsUsedInBad = asCISet(matchX_any_firstGroups("in a bad mapping, variable * was used", l)); Set unclearVars = setIntersection(varsUsedInGood, varsUsedInBad); MultiMap goodMappings = uniquifyMultiMapValues(pairsToMultiMap(matchX_any_firstAndSecondGroups("in a good mapping, variable * was mapped to *", l))); MultiMap badMappings = uniquifyMultiMapValues(pairsToMultiMap(matchX_any_firstAndSecondGroups("in a bad mapping, variable * was mapped to *", l))); MultiMap alwaysGoodMappings = multiMapDiff(goodMappings, badMappings); MultiMap alwaysBadMappings = multiMapDiff(badMappings, goodMappings); L completeGoodMappings = (L) map safeUnstruct(matchX_any_firstGroups("a good mapping is *", l)); L completeBadMappings = (L) map safeUnstruct(matchX_any_firstGroups("a bad mapping is *", l)); ret nu(Data, +possibleVars, +usedVars, +unusedVars, +varsUsedInGood, +varsUsedInBad, +unclearVars, varsUsedInGoodOnly := setDiff(varsUsedInGood, varsUsedInBad), varsUsedInBadOnly := setDiff(varsUsedInBad, varsUsedInGood), +goodMappings, +badMappings, +alwaysGoodMappings, +alwaysBadMappings, +completeGoodMappings, +completeBadMappings); } end scope