Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

C++ Cleanup 4/N: Reorganize Log and YGNodePrint #1354

Closed
wants to merge 4 commits into from

Commits on Aug 30, 2023

  1. C++ Cleanup 1/N: Reorganize YGStyle

    Summary:
    X-link: facebook/react-native#39171
    
    ## This diff
    
    This diff adds a `style` directory for code related to storing and manipulating styles. `YGStyle`, which is not a public API, is renamed to `yoga::Style` and moved into this folder, alongside `CompactValue`. We will eventually add `ValuePool` alongside this for the next generation style representation.
    
    ## This stack
    
    The organization of the C++ internals of Yoga are in need of attention.
    1. Some of the C++ internals are namespaced, but others not.
    2. Some of the namespaces include `detail`, but are meant to be used outside of the translation unit (FB Clang Tidy rules warn on any usage of these)
    2. Most of the files are in a flat hierarchy, except for event tracing in its own folder
    3. Some files and functions begin with YG, others don’t
    4. Some functions are uppercase, others are not
    5. Almost all of the interesting logic is in Yoga.cpp, and the file is too large to reason about
    6. There are multiple grab bag files where folks put random functions they need in (Utils, BitUtils, Yoga-Internal.h)
    7. There is no clear indication from file structure or type naming what is private vs not
    8. Handles like `YGNodeRef` and `YGConfigRef` can be used to access internals just by importing headers
    
    This stack does some much needed spring cleaning:
    1. All non-public headers and C++ implementation details are in separate folders from the root level `yoga`. This will give us room to split up logic and add more files without too large a flat hierarchy
    3. All private C++ internals are under the `facebook::yoga` namespace. Details namespaces are only ever used within the same header, as they are intended
    4. Utils files are split
    5. Most C++ internals drop the YG prefix
    6. Most C++ internal function names are all lower camel case
    7. We start to split up Yoga.cpp
    8. Every header beginning with YG or at the top-level directory is public and C only, with the exception of Yoga-Internal.h which has non-public functions for bindings
    9. It is not possible to use private APIs without static casting handles to internal classes
    
    This will give us more leeway to continue splitting monolithic files, and consistent guidelines for style in new files as well.
    
    These changes should not be breaking to any project using only public Yoga headers. This includes every usage of Yoga in fbsource except for RN Fabric which is currently tied to internals. This refactor should make that boundary clearer.
    
    Changelog: [Internal]
    
    Differential Revision: https://www.internalfb.com/diff/D48710084?entry_point=27
    
    fbshipit-source-id: 767607a3bcbc94e0d1c52272d94e732dab2e2fdb
    NickGerleman authored and facebook-github-bot committed Aug 30, 2023
    Configuration menu
    Copy the full SHA
    2a688a5 View commit details
    Browse the repository at this point in the history
  2. Reorganize YGConfig

    Differential Revision: D48710796
    
    fbshipit-source-id: a5a312f013df4ec868f9be0d4247039b1dda2386
    NickGerleman authored and facebook-github-bot committed Aug 30, 2023
    Configuration menu
    Copy the full SHA
    22f31e6 View commit details
    Browse the repository at this point in the history
  3. Reorganize YGNode

    Differential Revision: D48712710
    
    fbshipit-source-id: 19df7c88d2630623aaba64762cd18c56711d7822
    NickGerleman authored and facebook-github-bot committed Aug 30, 2023
    Configuration menu
    Copy the full SHA
    f2bb211 View commit details
    Browse the repository at this point in the history
  4. C++ Cleanup 4/N: Reorganize Log and YGNodePrint (facebook#1354)

    Summary:
    Pull Request resolved: facebook#1354
    
    X-link: facebook/react-native#39197
    
    ## This diff
    
    Moves these files to a `yoga/debug` subdirectory and does some mild renaming, namespace adjustment, and removes Yoga internal log function from list of library exports.
    
    ## This stack
    
    The organization of the C++ internals of Yoga are in need of attention.
    1. Some of the C++ internals are namespaced, but others not.
    2. Some of the namespaces include `detail`, but are meant to be used outside of the translation unit (FB Clang Tidy rules warn on any usage of these)
    2. Most of the files are in a flat hierarchy, except for event tracing in its own folder
    3. Some files and functions begin with YG, others don’t
    4. Some functions are uppercase, others are not
    5. Almost all of the interesting logic is in Yoga.cpp, and the file is too large to reason about
    6. There are multiple grab bag files where folks put random functions they need in (Utils, BitUtils, Yoga-Internal.h)
    7. There is no clear indication from file structure or type naming what is private vs not
    8. Handles like `YGNodeRef` and `YGConfigRef` can be used to access internals just by importing headers
    
    This stack does some much needed spring cleaning:
    1. All non-public headers and C++ implementation details are in separate folders from the root level `yoga`. This will give us room to split up logic and add more files without too large a flat hierarchy
    3. All private C++ internals are under the `facebook::yoga` namespace. Details namespaces are only ever used within the same header, as they are intended
    4. Utils files are split
    5. Most C++ internals drop the YG prefix
    6. Most C++ internal function names are all lower camel case
    7. We start to split up Yoga.cpp
    8. Every header beginning with YG or at the top-level directory is public and C only, with the exception of Yoga-Internal.h which has non-public functions for bindings
    9. It is not possible to use private APIs without static casting handles to internal classes
    
    This will give us more leeway to continue splitting monolithic files, and consistent guidelines for style in new files as well.
    
    These changes should not be breaking to any project using only public Yoga headers. This includes every usage of Yoga in fbsource except for RN Fabric which is currently tied to internals. This refactor should make that boundary clearer.
    
    Reviewed By: rshest
    
    Differential Revision: D48763820
    
    fbshipit-source-id: 0db57ac19cea25806a914635eddc1eb1a760f783
    NickGerleman authored and facebook-github-bot committed Aug 30, 2023
    Configuration menu
    Copy the full SHA
    73b8cb2 View commit details
    Browse the repository at this point in the history