Ticket #17695: 17695.patch

File 17695.patch, 2.5 KB (added by GerdP, 5 years ago)

Possible solution

  • src/org/openstreetmap/josm/data/validation/tests/MapCSSTagChecker.java

     
    4141import org.openstreetmap.josm.data.osm.INode;
    4242import org.openstreetmap.josm.data.osm.IRelation;
    4343import org.openstreetmap.josm.data.osm.IWay;
     44import org.openstreetmap.josm.data.osm.Node;
    4445import org.openstreetmap.josm.data.osm.OsmPrimitive;
    4546import org.openstreetmap.josm.data.osm.OsmUtils;
    4647import org.openstreetmap.josm.data.osm.Relation;
     
    6970import org.openstreetmap.josm.gui.mappaint.mapcss.MapCSSStyleSource.MapCSSRuleIndex;
    7071import org.openstreetmap.josm.gui.mappaint.mapcss.Selector;
    7172import org.openstreetmap.josm.gui.mappaint.mapcss.Selector.AbstractSelector;
     73import org.openstreetmap.josm.gui.mappaint.mapcss.Selector.ChildOrParentSelector;
     74import org.openstreetmap.josm.gui.mappaint.mapcss.Selector.ChildOrParentSelectorType;
    7275import org.openstreetmap.josm.gui.mappaint.mapcss.Selector.GeneralSelector;
    7376import org.openstreetmap.josm.gui.mappaint.mapcss.Selector.OptimizedGeneralSelector;
    7477import org.openstreetmap.josm.gui.mappaint.mapcss.parsergen.MapCSSParser;
     
    854857        while (candidates.hasNext()) {
    855858            MapCSSRule r = candidates.next();
    856859            env.clearSelectorMatchingInformation();
     860            if (partialSelection && r.selector instanceof Selector.ChildOrParentSelector) {
     861                ChildOrParentSelector sel = (Selector.ChildOrParentSelector) r.selector;
     862                if (sel.type == ChildOrParentSelectorType.ELEMENT_OF && p instanceof Node && p.getDataSet() != null) {
     863                    List<OsmPrimitive> toCheck = new ArrayList<>();
     864                    toCheck.addAll(p.getDataSet().searchWays(p.getBBox()));
     865                    toCheck.addAll(p.getDataSet().searchRelations(p.getBBox()));
     866                    toCheck.removeIf(OsmPrimitive::isSelected);
     867                    Set<Set<TagCheck>> checksCol = Collections.singleton(Collections.singleton(indexData.getCheck(r)));
     868                    toCheck.forEach(p2 -> res.addAll(getErrorsForPrimitive(p2, includeOtherSeverity, checksCol)));
     869                }
     870            }
    857871            if (r.selector.matches(env)) { // as side effect env.parent will be set (if s is a child selector)
    858872                TagCheck check = indexData.getCheck(r);
    859873                if (check != null) {