From 0ff7b5f2def94105b6bf6923eefe8a12bf16bd13 Mon Sep 17 00:00:00 2001 From: Cameron McCormack Date: Mon, 5 Dec 2016 13:47:09 -1000 Subject: [PATCH] Support declaring keyword property Gecko coverage as inexhaustive. This allows us to control whether the catchall case in the match expression that maps Gecko const to Servo enum will be generated. MozReview-Commit-ID: L65IjTONdfl --- components/style/properties/data.py | 8 ++++++-- components/style/properties/gecko.mako.rs | 5 ++++- components/style/properties/helpers.mako.rs | 2 +- components/style/properties/longhand/border.mako.rs | 2 ++ components/style/properties/longhand/box.mako.rs | 1 + .../style/properties/longhand/inherited_svg.mako.rs | 2 ++ components/style/properties/longhand/pointing.mako.rs | 3 +++ components/style/properties/longhand/ui.mako.rs | 1 + components/style/properties/longhand/xul.mako.rs | 1 + 9 files changed, 21 insertions(+), 4 deletions(-) diff --git a/components/style/properties/data.py b/components/style/properties/data.py index afddf0f4bb7..cdf4560783b 100644 --- a/components/style/properties/data.py +++ b/components/style/properties/data.py @@ -28,7 +28,9 @@ def to_camel_case(ident): class Keyword(object): def __init__(self, name, values, gecko_constant_prefix=None, gecko_enum_prefix=None, custom_consts=None, - extra_gecko_values=None, extra_servo_values=None): + extra_gecko_values=None, extra_servo_values=None, + gecko_strip_moz_prefix=True, + gecko_inexhaustive=None): self.name = name self.values = values.split() if gecko_constant_prefix and gecko_enum_prefix: @@ -39,6 +41,8 @@ class Keyword(object): self.extra_gecko_values = (extra_gecko_values or "").split() self.extra_servo_values = (extra_servo_values or "").split() self.consts_map = {} if custom_consts is None else custom_consts + self.gecko_strip_moz_prefix = gecko_strip_moz_prefix + self.gecko_inexhaustive = gecko_inexhaustive or (gecko_enum_prefix is None) def gecko_values(self): return self.values + self.extra_gecko_values @@ -55,7 +59,7 @@ class Keyword(object): raise Exception("Bad product: " + product) def gecko_constant(self, value): - moz_stripped = value.replace("-moz-", '') + moz_stripped = value.replace("-moz-", '') if self.gecko_strip_moz_prefix else value parts = moz_stripped.split('-') if self.gecko_enum_prefix: parts = [p.title() for p in parts] diff --git a/components/style/properties/gecko.mako.rs b/components/style/properties/gecko.mako.rs index a9afd64c5b0..95cd6409c37 100644 --- a/components/style/properties/gecko.mako.rs +++ b/components/style/properties/gecko.mako.rs @@ -255,7 +255,9 @@ def set_gecko_property(ffi_name, expr): % for value in keyword.values_for('gecko'): structs::${keyword.gecko_constant(value)} => Keyword::${to_rust_ident(value)}, % endfor + % if keyword.gecko_inexhaustive: x => panic!("Found unexpected value in style struct for ${ident} property: {:?}", x), + % endif } } @@ -1027,7 +1029,8 @@ fn static_assert() { "table-header-group table-footer-group table-row table-column-group " + "table-column table-cell table-caption list-item flex none " + "-moz-box -moz-inline-box", - gecko_enum_prefix="StyleDisplay") %> + gecko_enum_prefix="StyleDisplay", + gecko_inexhaustive=True) %> ${impl_keyword('display', 'mDisplay', display_keyword, True)} // overflow-y is implemented as a newtype of overflow-x, so we need special handling. diff --git a/components/style/properties/helpers.mako.rs b/components/style/properties/helpers.mako.rs index 4fdbeda88c8..5d58fd6db5c 100644 --- a/components/style/properties/helpers.mako.rs +++ b/components/style/properties/helpers.mako.rs @@ -329,7 +329,7 @@ keyword_kwargs = {a: kwargs.pop(a, None) for a in [ 'gecko_constant_prefix', 'gecko_enum_prefix', 'extra_gecko_values', 'extra_servo_values', - 'custom_consts', + 'custom_consts', 'gecko_inexhaustive', ]} %> diff --git a/components/style/properties/longhand/border.mako.rs b/components/style/properties/longhand/border.mako.rs index c4ccfeb032f..0393064d532 100644 --- a/components/style/properties/longhand/border.mako.rs +++ b/components/style/properties/longhand/border.mako.rs @@ -58,11 +58,13 @@ ${helpers.single_keyword("box-decoration-break", "slice clone", gecko_enum_prefix="StyleBoxDecorationBreak", + gecko_inexhaustive=True, products="gecko", animatable=False)} ${helpers.single_keyword("-moz-float-edge", "content-box margin-box", gecko_ffi_name="mFloatEdge", gecko_enum_prefix="StyleFloatEdge", + gecko_inexhaustive=True, products="gecko", animatable=False)} diff --git a/components/style/properties/longhand/box.mako.rs b/components/style/properties/longhand/box.mako.rs index c48d4948376..486105e33dd 100644 --- a/components/style/properties/longhand/box.mako.rs +++ b/components/style/properties/longhand/box.mako.rs @@ -92,6 +92,7 @@ ${helpers.single_keyword("position", "static absolute relative fixed", animatable="False" need_clone="True" gecko_enum_prefix="StyleFloat" + gecko_inexhaustive="True" gecko_ffi_name="mFloat"> use values::NoViewportPercentage; impl NoViewportPercentage for SpecifiedValue {} diff --git a/components/style/properties/longhand/inherited_svg.mako.rs b/components/style/properties/longhand/inherited_svg.mako.rs index 8bff77f9c37..6a0b00eced9 100644 --- a/components/style/properties/longhand/inherited_svg.mako.rs +++ b/components/style/properties/longhand/inherited_svg.mako.rs @@ -35,6 +35,7 @@ ${helpers.predefined_type("fill-opacity", "Opacity", "1.0", ${helpers.single_keyword("fill-rule", "nonzero evenodd", gecko_enum_prefix="StyleFillRule", + gecko_inexhaustive=True, products="gecko", animatable=False)} ${helpers.single_keyword("shape-rendering", @@ -60,4 +61,5 @@ ${helpers.predefined_type("stroke-opacity", "Opacity", "1.0", ${helpers.single_keyword("clip-rule", "nonzero evenodd", products="gecko", gecko_enum_prefix="StyleFillRule", + gecko_inexhaustive=True, animatable=False)} diff --git a/components/style/properties/longhand/pointing.mako.rs b/components/style/properties/longhand/pointing.mako.rs index d5306f376a9..412e2fe080c 100644 --- a/components/style/properties/longhand/pointing.mako.rs +++ b/components/style/properties/longhand/pointing.mako.rs @@ -151,15 +151,18 @@ ${helpers.single_keyword("pointer-events", "auto none", animatable=False)} ${helpers.single_keyword("-moz-user-input", "none enabled disabled", products="gecko", gecko_ffi_name="mUserInput", gecko_enum_prefix="StyleUserInput", + gecko_inexhaustive=True, animatable=False)} ${helpers.single_keyword("-moz-user-modify", "read-only read-write write-only", products="gecko", gecko_ffi_name="mUserModify", gecko_enum_prefix="StyleUserModify", + gecko_inexhaustive=True, animatable=False)} ${helpers.single_keyword("-moz-user-focus", "ignore normal select-after select-before select-menu select-same select-all none", products="gecko", gecko_ffi_name="mUserFocus", gecko_enum_prefix="StyleUserFocus", + gecko_inexhaustive=True, animatable=False)} diff --git a/components/style/properties/longhand/ui.mako.rs b/components/style/properties/longhand/ui.mako.rs index f815c1d8518..cd537677f6f 100644 --- a/components/style/properties/longhand/ui.mako.rs +++ b/components/style/properties/longhand/ui.mako.rs @@ -16,4 +16,5 @@ ${helpers.single_keyword("ime-mode", "normal auto active disabled inactive", ${helpers.single_keyword("-moz-user-select", "auto text none all", products="gecko", gecko_ffi_name="mUserSelect", gecko_enum_prefix="StyleUserSelect", + gecko_inexhaustive=True, animatable=False)} diff --git a/components/style/properties/longhand/xul.mako.rs b/components/style/properties/longhand/xul.mako.rs index 23c1da1246b..bc64308a115 100644 --- a/components/style/properties/longhand/xul.mako.rs +++ b/components/style/properties/longhand/xul.mako.rs @@ -11,6 +11,7 @@ ${helpers.single_keyword("-moz-box-align", "stretch start center baseline end", products="gecko", gecko_ffi_name="mBoxAlign", gecko_enum_prefix="StyleBoxAlign", + gecko_inexhaustive=True, animatable=False)} ${helpers.predefined_type("-moz-box-flex", "Number", "0.0", "parse_non_negative",