diff --git a/src/style-spec/expression/compound_expression.js b/src/style-spec/expression/compound_expression.js index f8065d2d84e..d9dd2b7223d 100644 --- a/src/style-spec/expression/compound_expression.js +++ b/src/style-spec/expression/compound_expression.js @@ -70,23 +70,32 @@ class CompoundExpression implements Expression { let signatureContext: ParsingContext = (null: any); for (const [params, evaluate] of overloads) { + // Use a fresh context for each attempted signature so that, if + // we eventually succeed, we haven't polluted `context.errors`. + signatureContext = new ParsingContext(context.registry, context.path, null, context.scope); + // First parse all the args, potentially coercing to the // types expected by this overload. const parsedArgs: Array = []; + let argParseFailed = false; for (let i = 1; i < args.length; i++) { const arg = args[i]; const expectedType = Array.isArray(params) ? params[i - 1] : params.type; - const parsed = context.parse(arg, 1 + parsedArgs.length, expectedType); - if (!parsed) return null; + const parsed = signatureContext.parse(arg, 1 + parsedArgs.length, expectedType); + if (!parsed) { + argParseFailed = true; + break; + } parsedArgs.push(parsed); } - - // Use a fresh context for each attempted signature so that, if - // we eventually succeed, we haven't polluted `context.errors`. - signatureContext = new ParsingContext(context.registry, context.path, null, context.scope); + if (argParseFailed) { + // Couldn't coerce args of this overload to expected type, move + // on to next one. + continue; + } if (Array.isArray(params)) { if (params.length !== parsedArgs.length) { diff --git a/test/integration/expression-tests/greater/value/test.json b/test/integration/expression-tests/greater/value/test.json index 0cf1194110c..f8ba0fd8690 100644 --- a/test/integration/expression-tests/greater/value/test.json +++ b/test/integration/expression-tests/greater/value/test.json @@ -2,13 +2,11 @@ "expression": [">", ["string", ["get", "x"]], ["get", "y"]], "expected": { "compiled": { - "result": "error", - "errors": [ - { - "key": "", - "error": "Expected arguments of type (number, number) | (string, string), but found (string, value) instead." - } - ] - } + "result": "success", + "isFeatureConstant": false, + "isZoomConstant": true, + "type": "boolean" + }, + "serialized": [">", ["string", ["get", "x"]], ["string", ["get", "y"]]] } } diff --git a/test/integration/expression-tests/greater_or_equal/value/test.json b/test/integration/expression-tests/greater_or_equal/value/test.json index b37b9c96cdf..582cb2bb3f1 100644 --- a/test/integration/expression-tests/greater_or_equal/value/test.json +++ b/test/integration/expression-tests/greater_or_equal/value/test.json @@ -2,13 +2,11 @@ "expression": [">=", ["string", ["get", "x"]], ["get", "y"]], "expected": { "compiled": { - "result": "error", - "errors": [ - { - "key": "", - "error": "Expected arguments of type (number, number) | (string, string), but found (string, value) instead." - } - ] - } + "result": "success", + "isFeatureConstant": false, + "isZoomConstant": true, + "type": "boolean" + }, + "serialized": [">=", ["string", ["get", "x"]], ["string", ["get", "y"]]] } } diff --git a/test/integration/expression-tests/less/value/test.json b/test/integration/expression-tests/less/value/test.json index fef2cab5a9c..46dc0e1ff46 100644 --- a/test/integration/expression-tests/less/value/test.json +++ b/test/integration/expression-tests/less/value/test.json @@ -2,13 +2,11 @@ "expression": ["<", ["string", ["get", "x"]], ["get", "y"]], "expected": { "compiled": { - "result": "error", - "errors": [ - { - "key": "", - "error": "Expected arguments of type (number, number) | (string, string), but found (string, value) instead." - } - ] - } + "result": "success", + "isFeatureConstant": false, + "isZoomConstant": true, + "type": "boolean" + }, + "serialized": ["<", ["string", ["get", "x"]], ["string", ["get", "y"]]] } } diff --git a/test/integration/expression-tests/less_or_equal/value/test.json b/test/integration/expression-tests/less_or_equal/value/test.json index 035d457e759..7358f7945b4 100644 --- a/test/integration/expression-tests/less_or_equal/value/test.json +++ b/test/integration/expression-tests/less_or_equal/value/test.json @@ -2,13 +2,11 @@ "expression": ["<=", ["string", ["get", "x"]], ["get", "y"]], "expected": { "compiled": { - "result": "error", - "errors": [ - { - "key": "", - "error": "Expected arguments of type (number, number) | (string, string), but found (string, value) instead." - } - ] - } + "result": "success", + "isFeatureConstant": false, + "isZoomConstant": true, + "type": "boolean" + }, + "serialized": ["<=", ["string", ["get", "x"]], ["string", ["get", "y"]]] } }