summaryrefslogtreecommitdiff
path: root/include
diff options
context:
space:
mode:
authorAnand Thakker <anandthakker@users.noreply.github.com>2018-02-21 21:39:33 -0500
committerGitHub <noreply@github.com>2018-02-21 21:39:33 -0500
commitb16893f903b3f81803d59cdfa3253a3fb09cfd3e (patch)
tree565ba4b762b796d7c6a18f850f2c3d2c7babdc5e /include
parent0525fd1e4a207040b6268ee0b2a9634d8fa37753 (diff)
downloadqtlocation-mapboxgl-b16893f903b3f81803d59cdfa3253a3fb09cfd3e.tar.gz
Correctly parse constant expressions in dds style properties (#11282)
* Correctly parse constant expressions in dds style properties Closes #10849 * Clarify
Diffstat (limited to 'include')
-rw-r--r--include/mbgl/style/conversion/data_driven_property_value.hpp21
-rw-r--r--include/mbgl/style/expression/literal.hpp4
2 files changed, 22 insertions, 3 deletions
diff --git a/include/mbgl/style/conversion/data_driven_property_value.hpp b/include/mbgl/style/conversion/data_driven_property_value.hpp
index 8880d28fb1..5f4395f35a 100644
--- a/include/mbgl/style/conversion/data_driven_property_value.hpp
+++ b/include/mbgl/style/conversion/data_driven_property_value.hpp
@@ -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);
diff --git a/include/mbgl/style/expression/literal.hpp b/include/mbgl/style/expression/literal.hpp
index 82983d78af..a5c5fa109d 100644
--- a/include/mbgl/style/expression/literal.hpp
+++ b/include/mbgl/style/expression/literal.hpp
@@ -32,6 +32,10 @@ public:
std::vector<optional<Value>> possibleOutputs() const override {
return {{ value }};
}
+
+ Value getValue() const {
+ return value;
+ }
private:
Value value;