Ticket #19875: 19875.patch

File 19875.patch, 3.7 KB (added by GerdP, 4 years ago)

POC: stop parsing when first non-meta rule was read

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

     
    356356            final MapCSSStyleSource source = new MapCSSStyleSource("");
    357357            final MapCSSParser preprocessor = new MapCSSParser(css, MapCSSParser.LexicalState.PREPROCESSOR);
    358358            try (StringReader mapcss = new StringReader(preprocessor.pp_root(source))) {
    359                 new MapCSSParser(mapcss, MapCSSParser.LexicalState.DEFAULT).sheet(source);
     359                new MapCSSParser(mapcss, MapCSSParser.LexicalState.DEFAULT).sheet(source, false);
    360360            }
    361361            // Ignore "meta" rule(s) from external rules of JOSM wiki
    362362            source.removeMetaRules();
  • src/org/openstreetmap/josm/gui/mappaint/mapcss/MapCSSParser.jj

     
    618618/**
    619619 * entry point for the main parser
    620620 * @param sheet MapCSS style source
     621 * @param metadataOnly if true, stop reading after first rule that is not a meta rule
    621622 * @throws ParseException in case of parsing error
    622623 */
    623 void sheet(MapCSSStyleSource sheet):
     624void sheet(MapCSSStyleSource sheet, boolean metadataOnly):
    624625{
    625626}
    626627{
     
    629630    (
    630631        try {
    631632            rule() w()
     633            {
     634            if (metadataOnly && !sheet.rules.isEmpty()) {
     635                // get first selector of last rule
     636                Selector sel = sheet.rules.get(sheet.rules.size() - 1).selectors.get(0);
     637                if (!(sel instanceof GeneralSelector) || !Selector.BASE_META.equals(sel.getBase()))
     638                  return;
     639            }
     640            }
    632641        } catch (MapCSSException mex) {
    633642            Logging.error(mex);
    634643            error_skipto(RBRACE, mex);
  • src/org/openstreetmap/josm/gui/mappaint/mapcss/MapCSSStyleSource.java

     
    168168
    169169                    // do the actual mapcss parsing
    170170                    try (Reader in2 = new StringReader(preprocessor.pp_root(this))) {
    171                         new MapCSSParser(in2, MapCSSParser.LexicalState.DEFAULT).sheet(this);
     171                        new MapCSSParser(in2, MapCSSParser.LexicalState.DEFAULT).sheet(this, metadataOnly);
    172172                    }
    173173
    174174                    loadMeta();
     
    175175                    if (!metadataOnly) {
    176176                        loadCanvas();
    177177                        loadSettings();
     178                    } else {
     179                        rules.clear();
    178180                    }
    179181                } finally {
    180182                    closeSourceInputStream(in);
  • scripts/TagInfoExtract.java

     
    354354                MapCSSParser parser = new MapCSSParser(reader, MapCSSParser.LexicalState.DEFAULT);
    355355                styleSource = new MapCSSStyleSource("");
    356356                styleSource.url = "";
    357                 parser.sheet(styleSource);
     357                parser.sheet(styleSource, false);
    358358            }
    359359        }
    360360