anchor.diff:          r = spell;
           break;
         default:
  -        throw new ArgumentError("$i is not in the range 0-3");
  +        throw new ArgumentError("$i is not in the range 0-3 for $champName");
       }
     }
   }
  
positive.code: 
    String summaryStringForRank(int rank) {
      int rankIndex = rank - 1;
      double baseDamage = baseByRank[rankIndex];
      String summary = baseDamage == 0.0 ? '' : '${baseDamage} ';
      for (var ratio in ratios) {
        summary += '+${ratio.ratioByRank[rankIndex]} ';
  
negative.code: Iterable<DamageEffect> parseEffects(Map data) sync* {
    String tooltip = data['tooltip'];
    for (TooltipMatch match in parseTooltip(tooltip, data['name'])) {
      List<int> baseByRank;
      if (match.baseVar.startsWith('e')) {
        baseByRank = lookupEffectArray(data, match.baseVar);
      } else {
        // Treat baseVar as a scaleVar instead:
        if (match.secondScaleVar != null)
          throw new ArgumentError(
              'MATCHED too many variables in ${data["name"]}');
        match.secondScaleVar = match.firstScaleVar;
        match.firstScaleVar = match.baseVar;
        match.baseVar = null;
        baseByRank = new List.filled(data['maxrank'], 0);
      }
      var effect = new DamageEffect(
        damageType: damageTypeFromString(match.damageType),
  