Branch: 
refs/heads/eng/Add-support-for-unbounded-repetition-terms-in-the-new-property-parser-generator
  Home:   https://github.com/WebKit/WebKit
  Commit: 02a34cfc0d94f36198572c21cfe8b1507c12ac36
      
https://github.com/WebKit/WebKit/commit/02a34cfc0d94f36198572c21cfe8b1507c12ac36
  Author: Sam Weinig <wei...@apple.com>
  Date:   2022-11-26 (Sat, 26 Nov 2022)

  Changed paths:
    M Source/WebCore/css/process-css-properties.py

  Log Message:
  -----------
  Add utilities to process-css-properties to make generation simpler
https://bugs.webkit.org/show_bug.cgi?id=248362
rdar://102682125

Reviewed by NOBODY (OOPS!).

Adds a few utilities to make code generation a bit more streamlined.

- `Writer` class replaces direct use of file output and now automatically
  handles newlines and indentation for callers. Includes a `context manager`,
  a python object that can be used with a `with` statement to scope some
  activity, call `Indent` to support easy scoped indentation.

  As an example. this snippet shows off both automatic newlines and the
  indentation context manager:

  ```
    writer.write("void foo(int x)")
    writer.write("{")
    with writer.indent():
        writer.write("use(x);")
    writer.write("}")
  ```

  and results in output of:

  ```
    void foo(int x)
    {
        use(x);
    }
  ```

- Additionally, the GenerationContext got some new utilities for creating common
  constructs like includes, forward declarations and namespaces. For namespaces,
  another context manager was added to allow automatic closing of the namespace
  when the `with` block ends.

The new utilities and Writer class still allow for use of custom whitespace 
where
it is more practical or creates more readable code, so some parts, notably parts
of StyleBuilderGenerated.cpp don't fully adopt the indentation mechanism (though
they do make use of the newline generation).

* Source/WebCore/css/process-css-properties.py:
(Writer):
(Writer.__init__):
(Writer._current_indent):
(Writer.write):
(Writer.write_block):
(Writer.write_lines):
(Writer.newline):
(Writer.Indent):
(Writer.Indent.__init__):
(Writer.Indent.__enter__):
(Writer.Indent.__exit__):
(Writer.indent):
(KeywordTerm.perform_fixups):
(MatchOneTerm.__init__):
(MatchOneTerm):
(MatchOneTerm.terms):
(MatchOneTerm.from_json):
(GenerationContext.generate_heading):
(GenerationContext):
(GenerationContext.generate_required_header_pragma):
(GenerationContext.generate_open_namespaces):
(GenerationContext.generate_close_namespaces):
(GenerationContext.generate_open_namespace):
(GenerationContext.generate_close_namespace):
(GenerationContext.Namespaces):
(GenerationContext.Namespaces.__init__):
(GenerationContext.Namespaces.__enter__):
(GenerationContext.Namespaces.__exit__):
(GenerationContext.namespace):
(GenerationContext.namespaces):
(GenerationContext.generate_using_namespace_declarations):
(GenerationContext.generate_includes):
(GenerationContext.generate_cpp_required_includes):
(GenerationContext.generate_forward_declarations):
(GenerationContext.generate_property_id_switch_function):
(GenerationContext.generate_property_id_switch_function_bool):
(GenerateCSSPropertyNames._generate_css_property_names_gperf_prelude):
(GenerateCSSPropertyNames):
(GenerateCSSPropertyNames._generate_css_property_names_gperf_heading): Deleted.


  Commit: 4eefce8617e9d525435c34a73d0d7d18dd8bbfe3
      
https://github.com/WebKit/WebKit/commit/4eefce8617e9d525435c34a73d0d7d18dd8bbfe3
  Author: Sam Weinig <wei...@apple.com>
  Date:   2022-11-26 (Sat, 26 Nov 2022)

  Changed paths:
    M Source/WebCore/css/CSSProperties.json
    M Source/WebCore/css/parser/CSSPropertyParser.cpp
    M Source/WebCore/css/parser/CSSPropertyParserHelpers.cpp
    M Source/WebCore/css/parser/CSSPropertyParserHelpers.h
    M Source/WebCore/css/process-css-properties.py
    M Tools/Scripts/webkitpy/style/checkers/jsonchecker.py

  Log Message:
  -----------
  Add support for unbounded repetition terms in the new property parser 
generator
https://bugs.webkit.org/show_bug.cgi?id=248355
rdar://102675501

Reviewed by NOBODY (OOPS!).

Adds support for parsing unbounded comma separated lists via CSSProperties.json.
Specifically, this adds support for the `#` operator without range refinement
(e.g. no #{1,4}):

  """
   A hash mark (#) indicates that the preceding type, word, or group occurs
   one or more times, separated by comma tokens (which may optionally be
   surrounded by white space and/or comments).
  """
    -  https://www.w3.org/TR/css-values-4/#mult-comma

This brings with it support for a large collection (29) of longhands in the
animation, transition, background and mask families of properties.

To generate the matching for one of these lists, a new term type can be
specified in CSSProperties.json with 'kind' set to 'repetition' and 'value'
set to whatever should be repeatedly matched. For instance, 
'animation-duration'.
which has a specified grammar of:

  `<'animation-duration'> = <time [0s,∞]>`

uses the following:

  "parser-grammar": {
      "kind": "repetition",
      "value": "<time [0,inf]>",
      "single-value-optimization": true
  }

The single-value-optimization bit indicates that if only a single value is
present, it should be returned directly, rather than a CSSValueList with
one element. In all other valid parses, a CSSValueList is returned.

* Source/WebCore/css/CSSProperties.json:
Replaces use of custom-parser/parser-function with parser-grammar for the
newly supported properties and adds a set of new shared grammar rules for
implementing them.

* Source/WebCore/css/parser/CSSPropertyParser.cpp:
(WebCore::consumeCounterStyleRange): Adopt new consumeCommaSeparatedList* 
helper.
(WebCore::consumeCounterStyleAdditiveSymbols): Ditto.
(WebCore::consumeOverrideColorsDescriptor): Ditto.
(WebCore::isValidAnimationPropertyList): Moved from CSSPropertyParserHelpers as
now the only caller is in this file.
(WebCore::consumeAnimationValueForShorthand): Ditto. Also now implemented using
more exported shared grammar rules.
(WebCore::CSSPropertyParser::consumeAnimationShorthand): Adopt new
consumeCommaSeparatedList* helper
(WebCore::addBackgroundValue): Moved from CSSPropertyParserHelpers as now the 
only
caller is in this file.
(WebCore::CSSPropertyParser::consumeBackgroundShorthand): Split background-size 
and
mask size as they now have separate consume functions (though at the moment 
identical).

* Source/WebCore/css/parser/CSSPropertyParserHelpers.cpp:
(WebCore::CSSPropertyParserHelpers::consumeFontVariationSettings): Adopt new
consumeCommaSeparatedList* helper.
(WebCore::CSSPropertyParserHelpers::consumeFontFamily): Ditto.
(WebCore::CSSPropertyParserHelpers::consumeKeyframesName): Added to allow 
"animation-name"
to be mostly generated. Unused CSSParserContext parameteter is a by product 
consumers called
from generated consumers are expected to take a CSSParserContext for the 
moment. This should
be refined to not be required in the future.
(WebCore::CSSPropertyParserHelpers::consumeSingleTransitionPropertyIdent):
(WebCore::CSSPropertyParserHelpers::consumeSingleTransitionPropertyOrNone):
(WebCore::CSSPropertyParserHelpers::consumeSingleTransitionProperty):
Split out shorthand and longhand behaviors into separate functions (with a 
shared
helper between them). Previously, the shorthand version (allowing "none") was 
used
in both places, and then a post consume check if any values were "none" was 
done.
Now that we are generating the repetition, doing the post consume check is 
non-trivial
so just doing the parse right makes more sense.
(WebCore::CSSPropertyParserHelpers::consumeSteps): Make static (and remove 
forward
declaration from header. Nothing outside this file uses this function.
(WebCore::CSSPropertyParserHelpers::consumeCubicBezier): Ditto.
(WebCore::CSSPropertyParserHelpers::consumeSpringFunction): Ditto.
(WebCore::CSSPropertyParserHelpers::consumeTimingFunction): Renamed from
consumeAnimationTimingFunction to better reflect the spec naming and to 
indicate it used
for more than just animation as it transtions also use it.
(WebCore::CSSPropertyParserHelpers::consumeShadow): Make static (and remove 
forward
declaration from header. Nothing outside this file uses this function.
(WebCore::CSSPropertyParserHelpers::consumeScrollSnapType): Use auto.
(WebCore::CSSPropertyParserHelpers::consumeBasicShapeOrBox): Use a generated 
helper and
add a note about the spec ambiguity along with link to spec github issue filed:
https://github.com/w3c/fxtf-drafts/issues/481
(WebCore::CSSPropertyParserHelpers::consumeBaselineKeyword): Make static (and 
remove forward
declaration from header. Nothing outside this file uses this function
(WebCore::CSSPropertyParserHelpers::consumeBackgroundSize): Make this a 
template function
generic on CSSPropertyID as the callers all statically know which variant they 
want.
(WebCore::CSSPropertyParserHelpers::consumeRepeatStyle): Make static (and 
remove forward
declaration from header. Nothing outside this file uses this function
(WebCore::CSSPropertyParserHelpers::consumeSingleBackgroundRepeat): Added to 
make it a bit
more clear in consumeBackgroundComponent() what the behavior for each property 
is.
(WebCore::CSSPropertyParserHelpers::consumeSingleBackgroundPositionX): Ditto.
(WebCore::CSSPropertyParserHelpers::consumeSingleBackgroundPositionY): Ditto.
(WebCore::CSSPropertyParserHelpers::consumeSingleBackgroundSize): Ditto.
(WebCore::CSSPropertyParserHelpers::consumeSingleMaskRepeat): Ditto.
(WebCore::CSSPropertyParserHelpers::consumeSingleMaskSize): Ditto.
(WebCore::CSSPropertyParserHelpers::consumeSingleWebkitBackgroundSize): Ditto.
(WebCore::CSSPropertyParserHelpers::consumeSingleWebkitMaskPositionX): Ditto.
(WebCore::CSSPropertyParserHelpers::consumeSingleWebkitMaskPositionY): Ditto.
(WebCore::CSSPropertyParserHelpers::consumeBackgroundComponent): Reordered to 
group families
of properties together and updated to use generated consumers where possible or 
the new
named consumers above.
(WebCore::CSSPropertyParserHelpers::consumeCommaSeparatedBackgroundComponent): 
Adopt new
consumeCommaSeparatedList* helper

(WebCore::CSSPropertyParserHelpers::consumeAutoOrLengthOrPercent): Deleted.
(WebCore::CSSPropertyParserHelpers::consumeMarginSide): Deleted.
(WebCore::CSSPropertyParserHelpers::consumeSide): Deleted.
(WebCore::CSSPropertyParserHelpers::consumeAnimationIterationCount): Deleted.
(WebCore::CSSPropertyParserHelpers::consumeAnimationName): Deleted.
(WebCore::CSSPropertyParserHelpers::consumeTransitionProperty): Deleted.
(WebCore::CSSPropertyParserHelpers::consumeAnimationTimingFunction): Deleted.
(WebCore::CSSPropertyParserHelpers::consumeAnimationValue): Deleted.
(WebCore::CSSPropertyParserHelpers::isValidAnimationPropertyList): Deleted.
(WebCore::CSSPropertyParserHelpers::consumeAnimationPropertyList): Deleted.
(WebCore::CSSPropertyParserHelpers::consumeBackgroundBlendMode): Deleted.
(WebCore::CSSPropertyParserHelpers::consumeBackgroundAttachment): Deleted.
(WebCore::CSSPropertyParserHelpers::consumeBackgroundBox): Deleted.
(WebCore::CSSPropertyParserHelpers::consumeMaskClip): Deleted.
(WebCore::CSSPropertyParserHelpers::consumeBackgroundClip): Deleted.
(WebCore::CSSPropertyParserHelpers::consumePrefixedMaskComposite): Deleted.
(WebCore::CSSPropertyParserHelpers::consumeMaskComposite): Deleted.
(WebCore::CSSPropertyParserHelpers::consumeWebkitMaskSourceType): Deleted.
(WebCore::CSSPropertyParserHelpers::consumeWebkitMaskMode): Deleted.
(WebCore::CSSPropertyParserHelpers::consumePrefixedBackgroundBox): Deleted.
(WebCore::CSSPropertyParserHelpers::addBackgroundValue): Deleted.
Replaced by generated shared grammar rules or generated properties..

* Source/WebCore/css/parser/CSSPropertyParserHelpers.h:
(WebCore::CSSPropertyParserHelpers::consumeCommaSeparatedListWithSingleValueOptimization):
(WebCore::CSSPropertyParserHelpers::consumeCommaSeparatedListWithoutSingleValueOptimization):
Add two helpers which can consume a comma separated list, one with an 
optimization to return
the underlying CSSValue if there was only one element in the list (and a 
CSSValueList otherwise)
and the other which always returns a CSSValueList. This allows callers to 
maintain their
existing behavior.

* Source/WebCore/css/process-css-properties.py:
(Term.from_json): Create a RepetitionTerm if the 'kind' is 'repetition'.
(RepetitionTerm): RepetitionTerm has a unique 'single-value-optimization' flag
that can be set on it to indicate that it should the variant of 
consumeCommaSeparatedList*
that does the single value optimizaton.
(TermGeneratorRepetitionTerm:) To generate code for a RepetitionTerm, we 
utilize one of the
consumeCommaSeparatedList* functions and pass it a lambda which contains the 
submatch. The
new automatic indentation support really came in handy here to allow an 
arbitrarty set of
terms to generate inside the lambda without issue.


Compare: https://github.com/WebKit/WebKit/compare/02a34cfc0d94%5E...4eefce8617e9
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to