Skip to content

Commit 0984f29

Browse files
Refactor and move YGNodeToString implementation to different file
Reviewed By: emilsjolander Differential Revision: D6397372 fbshipit-source-id: 79e701efe7f19db6dac1aea6328ebf0ac84a7ac3
1 parent e7bd0f0 commit 0984f29

File tree

7 files changed

+488
-409
lines changed

7 files changed

+488
-409
lines changed

React/React.xcodeproj/project.pbxproj

+12
Original file line numberDiff line numberDiff line change
@@ -981,6 +981,10 @@
981981
3DFE0D1B1DF8575800459392 /* YGMacros.h in Copy Headers */ = {isa = PBXBuildFile; fileRef = 130A77041DF767AF001F9587 /* YGMacros.h */; };
982982
3DFE0D1C1DF8575800459392 /* Yoga.h in Copy Headers */ = {isa = PBXBuildFile; fileRef = 130A77081DF767AF001F9587 /* Yoga.h */; };
983983
3EDCA8A51D3591E700450C31 /* RCTErrorInfo.m in Sources */ = {isa = PBXBuildFile; fileRef = 3EDCA8A41D3591E700450C31 /* RCTErrorInfo.m */; };
984+
5376C5E41FC6DDBC0083513D /* YGNodePrint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 5376C5E11FC6DDB20083513D /* YGNodePrint.cpp */; };
985+
5376C5E51FC6DDBD0083513D /* YGNodePrint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 5376C5E11FC6DDB20083513D /* YGNodePrint.cpp */; };
986+
5376C5E61FC6DDC10083513D /* YGNodePrint.h in Headers */ = {isa = PBXBuildFile; fileRef = 5376C5E01FC6DDB20083513D /* YGNodePrint.h */; };
987+
5376C5E71FC6DDC20083513D /* YGNodePrint.h in Headers */ = {isa = PBXBuildFile; fileRef = 5376C5E01FC6DDB20083513D /* YGNodePrint.h */; };
984988
53D123971FBF1DF5001B8A10 /* libyoga.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 3D3C059A1DE3340900C268FA /* libyoga.a */; };
985989
53D1239A1FBF1EF2001B8A10 /* YGEnums.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 53CBF1861FB4FE80002CBB31 /* YGEnums.cpp */; };
986990
53D1239B1FBF1EF4001B8A10 /* YGEnums.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 53CBF1861FB4FE80002CBB31 /* YGEnums.cpp */; };
@@ -2051,6 +2055,8 @@
20512055
3EDCA8A21D3591E700450C31 /* RCTErrorCustomizer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RCTErrorCustomizer.h; sourceTree = "<group>"; };
20522056
3EDCA8A31D3591E700450C31 /* RCTErrorInfo.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RCTErrorInfo.h; sourceTree = "<group>"; };
20532057
3EDCA8A41D3591E700450C31 /* RCTErrorInfo.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = RCTErrorInfo.m; sourceTree = "<group>"; };
2058+
5376C5E01FC6DDB20083513D /* YGNodePrint.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = YGNodePrint.h; sourceTree = "<group>"; };
2059+
5376C5E11FC6DDB20083513D /* YGNodePrint.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = YGNodePrint.cpp; sourceTree = "<group>"; };
20542060
53CBF1851FB4FE80002CBB31 /* Yoga-internal.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "Yoga-internal.h"; sourceTree = "<group>"; };
20552061
53CBF1861FB4FE80002CBB31 /* YGEnums.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = YGEnums.cpp; sourceTree = "<group>"; };
20562062
53CBF1871FB4FE80002CBB31 /* Yoga.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Yoga.cpp; sourceTree = "<group>"; };
@@ -2215,6 +2221,8 @@
22152221
130A77021DF767AF001F9587 /* yoga */ = {
22162222
isa = PBXGroup;
22172223
children = (
2224+
5376C5E11FC6DDB20083513D /* YGNodePrint.cpp */,
2225+
5376C5E01FC6DDB20083513D /* YGNodePrint.h */,
22182226
53CBF1861FB4FE80002CBB31 /* YGEnums.cpp */,
22192227
53CBF1881FB4FE80002CBB31 /* YGNodeList.cpp */,
22202228
53CBF1851FB4FE80002CBB31 /* Yoga-internal.h */,
@@ -3100,6 +3108,7 @@
31003108
3DFE0D161DF8574D00459392 /* YGEnums.h in Headers */,
31013109
3DFE0D171DF8574D00459392 /* YGMacros.h in Headers */,
31023110
3DFE0D181DF8574D00459392 /* YGNodeList.h in Headers */,
3111+
5376C5E71FC6DDC20083513D /* YGNodePrint.h in Headers */,
31033112
3DFE0D191DF8574D00459392 /* Yoga.h in Headers */,
31043113
);
31053114
runOnlyForDeploymentPostprocessing = 0;
@@ -3177,6 +3186,7 @@
31773186
133957881DF76D3500EC27BE /* YGEnums.h in Headers */,
31783187
1339578B1DF76D3500EC27BE /* Yoga.h in Headers */,
31793188
1339578A1DF76D3500EC27BE /* YGNodeList.h in Headers */,
3189+
5376C5E61FC6DDC10083513D /* YGNodePrint.h in Headers */,
31803190
133957891DF76D3500EC27BE /* YGMacros.h in Headers */,
31813191
);
31823192
runOnlyForDeploymentPostprocessing = 0;
@@ -4053,6 +4063,7 @@
40534063
53D123A01FBF1EFF001B8A10 /* Yoga.cpp in Sources */,
40544064
53D1239A1FBF1EF2001B8A10 /* YGEnums.cpp in Sources */,
40554065
53D1239C1FBF1EF7001B8A10 /* YGNodeList.cpp in Sources */,
4066+
5376C5E41FC6DDBC0083513D /* YGNodePrint.cpp in Sources */,
40564067
);
40574068
runOnlyForDeploymentPostprocessing = 0;
40584069
};
@@ -4063,6 +4074,7 @@
40634074
53D123A11FBF1EFF001B8A10 /* Yoga.cpp in Sources */,
40644075
53D1239B1FBF1EF4001B8A10 /* YGEnums.cpp in Sources */,
40654076
53D1239D1FBF1EF7001B8A10 /* YGNodeList.cpp in Sources */,
4077+
5376C5E51FC6DDBD0083513D /* YGNodePrint.cpp in Sources */,
40664078
);
40674079
runOnlyForDeploymentPostprocessing = 0;
40684080
};

React/ReactLegacy.xcodeproj/project.pbxproj

+12
Original file line numberDiff line numberDiff line change
@@ -679,6 +679,10 @@
679679
3DFE0D1B1DF8575800459392 /* YGMacros.h in Copy Headers */ = {isa = PBXBuildFile; fileRef = 130A77041DF767AF001F9587 /* YGMacros.h */; };
680680
3DFE0D1C1DF8575800459392 /* Yoga.h in Copy Headers */ = {isa = PBXBuildFile; fileRef = 130A77081DF767AF001F9587 /* Yoga.h */; };
681681
3EDCA8A51D3591E700450C31 /* RCTErrorInfo.m in Sources */ = {isa = PBXBuildFile; fileRef = 3EDCA8A41D3591E700450C31 /* RCTErrorInfo.m */; };
682+
53330EE71FC6EE74008D7FA9 /* YGNodePrint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 53330EE41FC6EE70008D7FA9 /* YGNodePrint.cpp */; };
683+
53330EE81FC6EE75008D7FA9 /* YGNodePrint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 53330EE41FC6EE70008D7FA9 /* YGNodePrint.cpp */; };
684+
53330EEA1FC6EE7F008D7FA9 /* YGNodePrint.h in Headers */ = {isa = PBXBuildFile; fileRef = 53330EE31FC6EE70008D7FA9 /* YGNodePrint.h */; };
685+
53330EEB1FC6EE7F008D7FA9 /* YGNodePrint.h in Headers */ = {isa = PBXBuildFile; fileRef = 53330EE31FC6EE70008D7FA9 /* YGNodePrint.h */; };
682686
53CBF1BF1FB50263002CBB31 /* Yoga-internal.h in Headers */ = {isa = PBXBuildFile; fileRef = 53CBF1BB1FB50262002CBB31 /* Yoga-internal.h */; };
683687
53CBF1C01FB50263002CBB31 /* YGEnums.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 53CBF1BC1FB50263002CBB31 /* YGEnums.cpp */; };
684688
53CBF1C11FB50263002CBB31 /* Yoga.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 53CBF1BD1FB50263002CBB31 /* Yoga.cpp */; };
@@ -1347,6 +1351,8 @@
13471351
3EDCA8A21D3591E700450C31 /* RCTErrorCustomizer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RCTErrorCustomizer.h; sourceTree = "<group>"; };
13481352
3EDCA8A31D3591E700450C31 /* RCTErrorInfo.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RCTErrorInfo.h; sourceTree = "<group>"; };
13491353
3EDCA8A41D3591E700450C31 /* RCTErrorInfo.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = RCTErrorInfo.m; sourceTree = "<group>"; };
1354+
53330EE31FC6EE70008D7FA9 /* YGNodePrint.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = YGNodePrint.h; sourceTree = "<group>"; };
1355+
53330EE41FC6EE70008D7FA9 /* YGNodePrint.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = YGNodePrint.cpp; sourceTree = "<group>"; };
13501356
53CBF1BB1FB50262002CBB31 /* Yoga-internal.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "Yoga-internal.h"; sourceTree = "<group>"; };
13511357
53CBF1BC1FB50263002CBB31 /* YGEnums.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = YGEnums.cpp; sourceTree = "<group>"; };
13521358
53CBF1BD1FB50263002CBB31 /* Yoga.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Yoga.cpp; sourceTree = "<group>"; };
@@ -1464,6 +1470,8 @@
14641470
130A77021DF767AF001F9587 /* yoga */ = {
14651471
isa = PBXGroup;
14661472
children = (
1473+
53330EE41FC6EE70008D7FA9 /* YGNodePrint.cpp */,
1474+
53330EE31FC6EE70008D7FA9 /* YGNodePrint.h */,
14671475
53CBF1BC1FB50263002CBB31 /* YGEnums.cpp */,
14681476
53CBF1BE1FB50263002CBB31 /* YGNodeList.cpp */,
14691477
53CBF1BB1FB50262002CBB31 /* Yoga-internal.h */,
@@ -2048,6 +2056,7 @@
20482056
3DFE0D171DF8574D00459392 /* YGMacros.h in Headers */,
20492057
3DFE0D181DF8574D00459392 /* YGNodeList.h in Headers */,
20502058
3DFE0D191DF8574D00459392 /* Yoga.h in Headers */,
2059+
53330EEB1FC6EE7F008D7FA9 /* YGNodePrint.h in Headers */,
20512060
);
20522061
runOnlyForDeploymentPostprocessing = 0;
20532062
};
@@ -2077,6 +2086,7 @@
20772086
1339578B1DF76D3500EC27BE /* Yoga.h in Headers */,
20782087
1339578A1DF76D3500EC27BE /* YGNodeList.h in Headers */,
20792088
133957891DF76D3500EC27BE /* YGMacros.h in Headers */,
2089+
53330EEA1FC6EE7F008D7FA9 /* YGNodePrint.h in Headers */,
20802090
);
20812091
runOnlyForDeploymentPostprocessing = 0;
20822092
};
@@ -2615,13 +2625,15 @@
26152625
isa = PBXSourcesBuildPhase;
26162626
buildActionMask = 2147483647;
26172627
files = (
2628+
53330EE71FC6EE74008D7FA9 /* YGNodePrint.cpp in Sources */,
26182629
);
26192630
runOnlyForDeploymentPostprocessing = 0;
26202631
};
26212632
3D3C06181DE3340C00C268FA /* Sources */ = {
26222633
isa = PBXSourcesBuildPhase;
26232634
buildActionMask = 2147483647;
26242635
files = (
2636+
53330EE81FC6EE75008D7FA9 /* YGNodePrint.cpp in Sources */,
26252637
);
26262638
runOnlyForDeploymentPostprocessing = 0;
26272639
};

ReactCommon/yoga/Android.mk

+2-1
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,8 @@ LOCAL_MODULE := yogacore
77
LOCAL_SRC_FILES := \
88
yoga/Yoga.cpp \
99
yoga/YGEnums.cpp \
10-
yoga/YGNodeList.cpp
10+
yoga/YGNodeList.cpp \
11+
yoga/YGNodePrint.cpp
1112

1213
LOCAL_C_INCLUDES := $(LOCAL_PATH)
1314
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_C_INCLUDES)

ReactCommon/yoga/yoga/YGNodePrint.cpp

+220
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,220 @@
1+
/*
2+
* Copyright (c) 2017-present, Facebook, Inc.
3+
* All rights reserved.
4+
*
5+
* This source code is licensed under the BSD-style license found in the
6+
* LICENSE file in the root directory of this source tree. An additional grant
7+
* of patent rights can be found in the PATENTS file in the same directory.
8+
*/
9+
10+
#include "YGNodePrint.h"
11+
#include <stdarg.h>
12+
#include "YGEnums.h"
13+
#include "Yoga-internal.h"
14+
15+
namespace facebook {
16+
namespace yoga {
17+
typedef std::string string;
18+
19+
static void indent(string* base, uint32_t level) {
20+
for (uint32_t i = 0; i < level; ++i) {
21+
base->append(" ");
22+
}
23+
}
24+
25+
static bool areFourValuesEqual(const YGValue four[4]) {
26+
return YGValueEqual(four[0], four[1]) && YGValueEqual(four[0], four[2]) &&
27+
YGValueEqual(four[0], four[3]);
28+
}
29+
30+
static void appendFormatedString(string* str, const char* fmt, ...) {
31+
char buffer[1024];
32+
va_list args;
33+
va_start(args, fmt);
34+
va_list argsCopy;
35+
va_copy(argsCopy, args);
36+
va_end(args);
37+
vsnprintf(buffer, 1024, fmt, argsCopy);
38+
va_end(argsCopy);
39+
string result = string(buffer);
40+
str->append(result);
41+
}
42+
43+
static void
44+
appendFloatIfNotUndefined(string* base, const string key, const float num) {
45+
if (!YGFloatIsUndefined(num)) {
46+
appendFormatedString(base, "%s: %g; ", key.c_str(), num);
47+
}
48+
}
49+
50+
static void appendNumberIfNotUndefined(
51+
string* base,
52+
const string key,
53+
const YGValue* const number) {
54+
if (number->unit != YGUnitUndefined) {
55+
if (number->unit == YGUnitAuto) {
56+
base->append(key + ": auto; ");
57+
} else {
58+
string unit = number->unit == YGUnitPoint ? "px" : "%%";
59+
appendFormatedString(
60+
base, "%s: %g%s; ", key.c_str(), number->value, unit.c_str());
61+
}
62+
}
63+
}
64+
65+
static void appendNumberIfNotAuto(
66+
string* base,
67+
const string key,
68+
const YGValue* const number) {
69+
if (number->unit != YGUnitAuto) {
70+
appendNumberIfNotUndefined(base, key, number);
71+
}
72+
}
73+
74+
static void appendNumberIfNotZero(
75+
string* base,
76+
const string str,
77+
const YGValue* const number) {
78+
if (!YGFloatsEqual(number->value, 0)) {
79+
appendNumberIfNotUndefined(base, str, number);
80+
}
81+
}
82+
83+
static void appendEdges(string* base, const string key, const YGValue* edges) {
84+
if (areFourValuesEqual(edges)) {
85+
appendNumberIfNotZero(base, key, &edges[YGEdgeLeft]);
86+
} else {
87+
for (int edge = YGEdgeLeft; edge != YGEdgeAll; ++edge) {
88+
string str = key + "-" + YGEdgeToString(static_cast<YGEdge>(edge));
89+
appendNumberIfNotZero(base, str, &edges[edge]);
90+
}
91+
}
92+
}
93+
94+
static void appendEdgeIfNotUndefined(
95+
string* base,
96+
const string str,
97+
const YGValue* edges,
98+
const YGEdge edge) {
99+
appendNumberIfNotUndefined(
100+
base, str, YGComputedEdgeValue(edges, edge, &YGValueUndefined));
101+
}
102+
103+
void YGNodeToString(
104+
std::string* str,
105+
YGNodeRef node,
106+
YGPrintOptions options,
107+
uint32_t level) {
108+
indent(str, level);
109+
appendFormatedString(str, "<div ");
110+
if (node->print != nullptr) {
111+
node->print(node);
112+
}
113+
114+
if (options & YGPrintOptionsLayout) {
115+
appendFormatedString(str, "layout=\"");
116+
appendFormatedString(
117+
str, "width: %g; ", node->layout.dimensions[YGDimensionWidth]);
118+
appendFormatedString(
119+
str, "height: %g; ", node->layout.dimensions[YGDimensionHeight]);
120+
appendFormatedString(str, "top: %g; ", node->layout.position[YGEdgeTop]);
121+
appendFormatedString(str, "left: %g;", node->layout.position[YGEdgeLeft]);
122+
appendFormatedString(str, "\" ");
123+
}
124+
125+
if (options & YGPrintOptionsStyle) {
126+
appendFormatedString(str, "style=\"");
127+
if (node->style.flexDirection != gYGNodeDefaults.style.flexDirection) {
128+
appendFormatedString(
129+
str,
130+
"flex-direction: %s; ",
131+
YGFlexDirectionToString(node->style.flexDirection));
132+
}
133+
if (node->style.justifyContent != gYGNodeDefaults.style.justifyContent) {
134+
appendFormatedString(
135+
str,
136+
"justify-content: %s; ",
137+
YGJustifyToString(node->style.justifyContent));
138+
}
139+
if (node->style.alignItems != gYGNodeDefaults.style.alignItems) {
140+
appendFormatedString(
141+
str, "align-items: %s; ", YGAlignToString(node->style.alignItems));
142+
}
143+
if (node->style.alignContent != gYGNodeDefaults.style.alignContent) {
144+
appendFormatedString(
145+
str,
146+
"align-content: %s; ",
147+
YGAlignToString(node->style.alignContent));
148+
}
149+
if (node->style.alignSelf != gYGNodeDefaults.style.alignSelf) {
150+
appendFormatedString(
151+
str, "align-self: %s; ", YGAlignToString(node->style.alignSelf));
152+
}
153+
appendFloatIfNotUndefined(str, "flex-grow", node->style.flexGrow);
154+
appendFloatIfNotUndefined(str, "flex-shrink", node->style.flexShrink);
155+
appendNumberIfNotAuto(str, "flex-basis", &node->style.flexBasis);
156+
appendFloatIfNotUndefined(str, "flex", node->style.flex);
157+
158+
if (node->style.flexWrap != gYGNodeDefaults.style.flexWrap) {
159+
appendFormatedString(
160+
str, "flexWrap: %s; ", YGWrapToString(node->style.flexWrap));
161+
}
162+
163+
if (node->style.overflow != gYGNodeDefaults.style.overflow) {
164+
appendFormatedString(
165+
str, "overflow: %s; ", YGOverflowToString(node->style.overflow));
166+
}
167+
168+
if (node->style.display != gYGNodeDefaults.style.display) {
169+
appendFormatedString(
170+
str, "display: %s; ", YGDisplayToString(node->style.display));
171+
}
172+
appendEdges(str, "margin", node->style.margin);
173+
appendEdges(str, "padding", node->style.padding);
174+
appendEdges(str, "border", node->style.border);
175+
176+
appendNumberIfNotAuto(
177+
str, "width", &node->style.dimensions[YGDimensionWidth]);
178+
appendNumberIfNotAuto(
179+
str, "height", &node->style.dimensions[YGDimensionHeight]);
180+
appendNumberIfNotAuto(
181+
str, "max-width", &node->style.maxDimensions[YGDimensionWidth]);
182+
appendNumberIfNotAuto(
183+
str, "max-height", &node->style.maxDimensions[YGDimensionHeight]);
184+
appendNumberIfNotAuto(
185+
str, "min-width", &node->style.minDimensions[YGDimensionWidth]);
186+
appendNumberIfNotAuto(
187+
str, "min-height", &node->style.minDimensions[YGDimensionHeight]);
188+
189+
if (node->style.positionType != gYGNodeDefaults.style.positionType) {
190+
appendFormatedString(
191+
str,
192+
"position: %s; ",
193+
YGPositionTypeToString(node->style.positionType));
194+
}
195+
196+
appendEdgeIfNotUndefined(str, "left", node->style.position, YGEdgeLeft);
197+
appendEdgeIfNotUndefined(str, "right", node->style.position, YGEdgeRight);
198+
appendEdgeIfNotUndefined(str, "top", node->style.position, YGEdgeTop);
199+
appendEdgeIfNotUndefined(str, "bottom", node->style.position, YGEdgeBottom);
200+
appendFormatedString(str, "\" ");
201+
202+
if (node->measure != nullptr) {
203+
appendFormatedString(str, "has-custom-measure=\"true\"");
204+
}
205+
}
206+
appendFormatedString(str, ">");
207+
208+
const uint32_t childCount = YGNodeListCount(node->children);
209+
if (options & YGPrintOptionsChildren && childCount > 0) {
210+
for (uint32_t i = 0; i < childCount; i++) {
211+
appendFormatedString(str, "\n");
212+
YGNodeToString(str, YGNodeGetChild(node, i), options, level + 1);
213+
}
214+
appendFormatedString(str, "\n");
215+
indent(str, level);
216+
}
217+
appendFormatedString(str, "</div>");
218+
}
219+
} // namespace yoga
220+
} // namespace facebook

ReactCommon/yoga/yoga/YGNodePrint.h

+24
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
/**
2+
* Copyright (c) 2014-present, Facebook, Inc.
3+
* All rights reserved.
4+
*
5+
* This source code is licensed under the BSD-style license found in the
6+
* LICENSE file in the root directory of this source tree. An additional grant
7+
* of patent rights can be found in the PATENTS file in the same directory.
8+
*/
9+
#pragma once
10+
#include <string>
11+
12+
#include "Yoga.h"
13+
14+
namespace facebook {
15+
namespace yoga {
16+
17+
void YGNodeToString(
18+
std::string* str,
19+
YGNodeRef node,
20+
YGPrintOptions options,
21+
uint32_t level);
22+
23+
} // namespace yoga
24+
} // namespace facebook

0 commit comments

Comments
 (0)