RFR: JDK-8324182 Deprecate for removal SimpleSelector and CompoundSelector classes [v2]

Kevin Rushforth kcr at openjdk.org
Fri Feb 2 19:30:11 UTC 2024


On Fri, 2 Feb 2024 19:04:33 GMT, John Hendrikx <jhendrikx at openjdk.org> wrote:

>>> My conclusion is that we either need two rounds to get this right (to first free up our first choice getStyleClasses), or we can settle on one of: getStyleClassNames, getStyles, getStyleNames, getClasses, getClassNames.
>> 
>> Let's settle on one of these names. I think `getClasses` is fine. My second choice would be `getClassNames`.
>> 
>> There is one other method used by SceneBuilder's `CssInternal` class, `CompoundSelector::getSelectors`. I think you need to add a method to the `Selector` base class that returns a `List<Selector>` instead of the `List<SimpleSelector>` returned by the existing `CompoundSelector` method. Maybe `getChildSelectors` or similar? That method would be overridden in the subclasses with `CompoundSelector` wrapping the existing selectors list in an unmodifiable list and `SimpleSelectors` returning an empty List.
>
>> There is one other method used by SceneBuilder's `CssInternal` class, `CompoundSelector::getSelectors`. I think you need to add a method to the `Selector` base class that returns a `List<Selector>` instead of the `List<SimpleSelector>` returned by the existing `CompoundSelector` method. Maybe `getChildSelectors` or similar? That method would be overridden in the subclasses with `CompoundSelector` wrapping the existing selectors list in an unmodifiable list and `SimpleSelectors` returning an empty List.
> 
> @kevinrushforth if I'm correct, SceneBuilder won't need that anymore.  Since it shouldn't need to do an `instanceof` check (which will break once they're moved to internal packages), the fragment that gets all the selectors should be changed to:
> 
>         for (Rule r : s.getRules()) {
>             for (Selector ss : r.getSelectors()) {
>                 styleClasses.addAll(ss.getClasses());   // provisional name getClasses
>             }
>         }
> 
> Old SceneBuilder code fragment:
> 
>         for (Rule r : s.getRules()) {
>             for (Selector ss : r.getSelectors()) {
>                 if (ss instanceof SimpleSelector) {
>                     SimpleSelector simple = (SimpleSelector) ss;
>                     styleClasses.addAll(simple.getStyleClasses());
>                 } else {
>                     if (ss instanceof CompoundSelector) {
>                         CompoundSelector cs = (CompoundSelector) ss;
>                         for (Selector selector : cs.getSelectors()) {
>                             if (selector instanceof SimpleSelector) {
>                                 SimpleSelector simple = (SimpleSelector) selector;
>                                 styleClasses.addAll(simple.getStyleClasses());
>                             }
>                         }
>                     }
>                 }
>             }
>         }
> 
> Note that in this old code, there is some unnecessary casting going on (`cs.getSelectors()` already returns `SimpleSelector`s, which makes it seem like `CompoundSelector` could contain something other than `SimpleSelector`s, which is not the case (they can't be nested or anything).

@hjohn since the implementation of `getClasses` in `CompoundSelector` aggregates the style classes for all of its `SimpleSelectors`, then I think you are right that a `getChildSelectors` is unnecessary.

@jperedadnr Will this work for you?

-------------

PR Comment: https://git.openjdk.org/jfx/pull/1340#issuecomment-1924543785


More information about the openjfx-dev mailing list