Ticket #18964: 18964.patch

File 18964.patch, 2.4 KB (added by GerdP, 4 months ago)
  • src/org/openstreetmap/josm/gui/mappaint/mapcss/ConditionFactory.java

     
    447447    public static class IndexCondition implements Condition {
    448448        final String index;
    449449        final Op op;
     450        final boolean isFirstOrLast;
    450451
    451452        /**
    452453         * Constructs a new {@code IndexCondition}.
     
    456457        public IndexCondition(String index, Op op) {
    457458            this.index = index;
    458459            this.op = op;
     460            isFirstOrLast = op == Op.EQ && ("1".equals(index) || "-1".equals(index));
    459461        }
    460462
    461463        @Override
  • src/org/openstreetmap/josm/gui/mappaint/mapcss/Selector.java

     
    3434import org.openstreetmap.josm.data.validation.tests.CrossingWays;
    3535import org.openstreetmap.josm.gui.mappaint.Environment;
    3636import org.openstreetmap.josm.gui.mappaint.Range;
     37import org.openstreetmap.josm.gui.mappaint.mapcss.ConditionFactory.IndexCondition;
    3738import org.openstreetmap.josm.gui.mappaint.mapcss.ConditionFactory.OpenEndPseudoClassCondition;
    3839import org.openstreetmap.josm.tools.CheckParameterUtil;
    3940import org.openstreetmap.josm.tools.CompositeList;
     
    219220                    e.count = count;
    220221                    return;
    221222                }
    222                 for (int i = 0; i < count; i++) {
     223                // see #18964
     224                boolean firstAndLastOnly = true;
     225                for (Condition c : link.conds) {
     226                    if (!(c instanceof IndexCondition) || !((IndexCondition) c).isFirstOrLast) {
     227                        firstAndLastOnly = false;
     228                        break;
     229                    }
     230                }
     231                int step = firstAndLastOnly ? count - 1 : 1;
     232
     233                for (int i = 0; i < count; i += step) {
    223234                    if (getter.apply(i).equals(e.osm) && link.matches(e.withParentAndIndexAndLinkContext(parent, i, count))) {
    224235                        e.parent = parent;
    225236                        e.index = i;