Changeset 15275 in josm


Ignore:
Timestamp:
2019-08-04T21:15:10+02:00 (3 weeks ago)
Author:
Don-vip
Message:

fix #17845 - refactor evaluate code in ExpressionFactory to allow for varargs in functions (patch by taylor.smock)

Location:
trunk
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/org/openstreetmap/josm/gui/mappaint/mapcss/ExpressionFactory.java

    r15245 r15275  
    339339            Object[] convertedArgs;
    340340
     341            int start = 0;
     342            int offset = 0;
    341343            if (needsEnvironment) {
    342                 convertedArgs = new Object[args.size()+1];
     344                start = 1;
     345                offset = 1;
     346                convertedArgs = new Object[args.size() + 1];
    343347                convertedArgs[0] = env;
    344                 for (int i = 1; i < convertedArgs.length; ++i) {
    345                     convertedArgs[i] = Cascade.convertTo(args.get(i-1).evaluate(env), expectedParameterTypes[i]);
    346                     if (convertedArgs[i] == null && !nullable) {
    347                         return null;
    348                     }
    349                 }
    350348            } else {
    351349                convertedArgs = new Object[args.size()];
    352                 for (int i = 0; i < convertedArgs.length; ++i) {
    353                     convertedArgs[i] = Cascade.convertTo(args.get(i).evaluate(env), expectedParameterTypes[i]);
    354                     if (convertedArgs[i] == null && !nullable) {
    355                         return null;
     350            }
     351
     352            for (int i = start; i < convertedArgs.length; ++i) {
     353                if (!expectedParameterTypes[i].isArray()) {
     354                    convertedArgs[i] = Cascade.convertTo(args.get(i - offset).evaluate(env), expectedParameterTypes[i]);
     355                } else {
     356                    Class<?> clazz = expectedParameterTypes[i].getComponentType();
     357                    Object[] varargs = (Object[]) Array.newInstance(clazz, args.size() - i + 1);
     358                    for (int j = 0; j < args.size() - i + 1; ++j) {
     359                        varargs[j] = Cascade.convertTo(args.get(j + i - 1).evaluate(env), clazz);
    356360                    }
    357                 }
    358             }
     361                    convertedArgs[i] = expectedParameterTypes[i].cast(varargs);
     362                    break;
     363                }
     364                if (convertedArgs[i] == null && !nullable) {
     365                    return null;
     366                }
     367            }
     368
    359369            Object result = null;
    360370            try {
  • trunk/src/org/openstreetmap/josm/gui/mappaint/mapcss/Functions.java

    r15246 r15275  
    505505
    506506    /**
    507      * Returns true if role is in relation. Returns false if not a relation or it does not have the role.
     507     * Returns the number of primitives in a relation with the specified roles.
    508508     * @param env the environment
    509509     * @param roles The roles to count in the relation
  • trunk/test/unit/org/openstreetmap/josm/gui/mappaint/mapcss/MapCSSParserTest.java

    r15245 r15275  
    446446        e = new Environment(way1, new MultiCascade(), Environment.DEFAULT_LAYER, null);
    447447        assertEquals(0, Functions.count_roles(e, "from", "to"));
     448
     449        /* Check with actual call to mapcss functions */
     450        MapCSSStyleSource source = new MapCSSStyleSource("relation[type=destination_sign] {roles: count_roles(\"from\");}");
     451        source.loadStyleSource();
     452        assertEquals(1, source.rules.size());
     453        e = new Environment(rel1, new MultiCascade(), Environment.DEFAULT_LAYER, null);
     454        assertTrue(source.rules.get(0).selector.matches(e));
     455        source.rules.get(0).declaration.execute(e);
     456        assertEquals((Integer) 1, e.getCascade(Environment.DEFAULT_LAYER).get("roles", null, Integer.class));
    448457    }
    449458
Note: See TracChangeset for help on using the changeset viewer.