Correctly parse constant expressions in dds style properties (#11282)

* Correctly parse constant expressions in dds style properties

Closes #10849

* Clarify
This commit is contained in:
Anand Thakker
2018-02-21 21:39:33 -05:00
committed by GitHub
parent 0525fd1e4a
commit b16893f903
2 changed files with 22 additions and 3 deletions

View File

@@ -8,6 +8,8 @@
#include <mbgl/style/expression/is_expression.hpp>
#include <mbgl/style/expression/is_constant.hpp>
#include <mbgl/style/expression/find_zoom_curve.hpp>
#include <mbgl/style/expression/literal.hpp>
#include <mbgl/style/expression/value.hpp>
#include <unordered_set>
@@ -32,12 +34,25 @@ struct Converter<DataDrivenPropertyValue<T>> {
return {};
}
if (isFeatureConstant(**expression)) {
bool featureConstant = isFeatureConstant(**expression);
bool zoomConstant = isZoomConstant(**expression);
if (featureConstant && !zoomConstant) {
return DataDrivenPropertyValue<T>(CameraFunction<T>(std::move(*expression)));
} else if (isZoomConstant(**expression)) {
} else if (!featureConstant && zoomConstant) {
return DataDrivenPropertyValue<T>(SourceFunction<T>(std::move(*expression)));
} else {
} else if (!featureConstant && !zoomConstant) {
return DataDrivenPropertyValue<T>(CompositeFunction<T>(std::move(*expression)));
} else {
// If an expression is neither zoom- nor feature-dependent, it
// should have been reduced to a Literal when it was parsed.
auto literal = dynamic_cast<Literal*>(expression->get());
assert(literal);
optional<T> constant = fromExpressionValue<T>(literal->getValue());
if (!constant) {
return {};
}
return DataDrivenPropertyValue<T>(*constant);
}
} else if (!isObject(value)) {
optional<T> constant = convert<T>(value, error);

View File

@@ -32,6 +32,10 @@ public:
std::vector<optional<Value>> possibleOutputs() const override {
return {{ value }};
}
Value getValue() const {
return value;
}
private:
Value value;