@@ -28,6 +28,7 @@ import com.orange.ouds.core.theme.OudsTheme
2828import com.orange.ouds.core.theme.OudsTypography
2929import com.orange.ouds.foundation.extensions.asOrNull
3030import kotlin.reflect.KClass
31+ import kotlin.reflect.KParameter
3132import kotlin.reflect.KProperty1
3233import kotlin.reflect.full.declaredMemberProperties
3334import kotlin.reflect.full.primaryConstructor
@@ -85,7 +86,13 @@ sealed class TokenProperty<T>(
8586 tokens = getTokens<OudsColorScheme .Content >(),
8687 categoryClass = TokenCategory .Color : :class
8788 )
88-
89+
90+ data object ColorOpacity : TokenProperty <TokenCategory .Color >(
91+ nameRes = R .string.app_tokens_color_opacity_label,
92+ tokens = getTokens<OudsColorScheme .Opacity >(),
93+ categoryClass = TokenCategory .Color : :class
94+ )
95+
8996 data object ColorOverlay : TokenProperty <TokenCategory .Color >(
9097 nameRes = R .string.app_tokens_color_overlay_label,
9198 tokens = getTokens<OudsColorScheme .Overlay >(),
@@ -124,19 +131,19 @@ sealed class TokenProperty<T>(
124131
125132 data object SizeIconWithText : TokenProperty <TokenCategory .Dimension .Size >(
126133 nameRes = R .string.app_tokens_dimension_size_iconWith_label,
127- tokens = listOf(
128- OudsSizes . Icon . WithLabel . Small ::class,
129- OudsSizes . Icon . WithLabel . Medium ::class,
130- OudsSizes . Icon . WithLabel . Large ::class,
131- OudsSizes . Icon . WithLabel . ExtraLarge ::class,
132- OudsSizes . Icon . WithBody . Small ::class ,
133- OudsSizes .Icon . WithBody . Medium ::class ,
134- OudsSizes . Icon . WithBody . Large ::class,
135- OudsSizes . Icon . WithHeading . Small ::class,
136- OudsSizes . Icon . WithHeading . Medium ::class,
137- OudsSizes . Icon . WithHeading . Large ::class,
138- OudsSizes . Icon . WithHeading . ExtraLarge ::class ,
139- ).flatMap { getTokens(it) },
134+ tokens = getTokens< OudsSizes . Icon > { clazz, _ -> clazz != OudsSizes . Icon . Decorative : :class },
135+ categoryClass = TokenCategory . Dimension . Size : :class
136+ )
137+
138+ data object SizeMaxWidth : TokenProperty < TokenCategory . Dimension . Size >(
139+ nameRes = R .string.app_tokens_dimension_size_maxWidth_label ,
140+ tokens = getTokens< OudsSizes .MaxWidth >() ,
141+ categoryClass = TokenCategory . Dimension . Size : :class
142+ )
143+
144+ data object SizeMinInteractiveArea : TokenProperty < TokenCategory . Dimension . Size >(
145+ nameRes = R .string.app_tokens_dimension_size_minInteractiveArea_label ,
146+ tokens = getTokens< OudsSizes > { _, parameter -> parameter.name == OudsSizes : :minInteractiveArea.name },
140147 categoryClass = TokenCategory .Dimension .Size : :class
141148 )
142149
@@ -158,14 +165,14 @@ sealed class TokenProperty<T>(
158165 categoryClass = TokenCategory .Dimension .Space : :class
159166 )
160167
161- data object SpacePaddingInset : TokenProperty <TokenCategory .Dimension .Space >(
162- nameRes = R .string.app_tokens_dimension_space_paddingInset_label ,
168+ data object SpaceInset : TokenProperty <TokenCategory .Dimension .Space >(
169+ nameRes = R .string.app_tokens_dimension_space_inset_label ,
163170 tokens = getTokens<OudsSpaces .Inset >(),
164171 categoryClass = TokenCategory .Dimension .Space : :class
165172 )
166173
167- data object SpacePaddingStack : TokenProperty <TokenCategory .Dimension .Space >(
168- nameRes = R .string.app_tokens_dimension_space_paddingStack_label ,
174+ data object SpacePaddingBlock : TokenProperty <TokenCategory .Dimension .Space >(
175+ nameRes = R .string.app_tokens_dimension_space_paddingBlock_label ,
169176 tokens = getTokens<OudsSpaces .PaddingBlock >(),
170177 categoryClass = TokenCategory .Dimension .Space : :class
171178 )
@@ -189,15 +196,15 @@ sealed class TokenProperty<T>(
189196 )
190197}
191198
192- inline fun <reified T : Any > getTokens () = getTokens(T ::class )
199+ inline fun <reified T : Any > getTokens (noinline predicate : ( KClass < * >, KParameter ) -> Boolean = { _, _ -> true }) = getTokens(T ::class , predicate )
193200
194- fun <T : Any > getTokens (clazz : KClass <T >): List <Token <* >> {
201+ fun <T : Any > getTokens (clazz : KClass <T >, predicate : ( KClass < * >, KParameter ) -> Boolean = { _, _ -> true } ): List <Token <* >> {
195202 val packageName = clazz.java.`package`?.name.orEmpty()
196203 val rootClassName = clazz.java.nestedName.substringBefore(" ." )
197204 val rootClass = Class .forName(" $packageName .$rootClassName " ).kotlin
198205 val rootPath = getPath(rootClass)
199206
200- return getTokenPaths(rootClass, clazz.takeIf { it != rootClass }, rootPath).map { tokenPath ->
207+ return getTokenPaths(rootClass, clazz.takeIf { it != rootClass }, rootPath, predicate ).map { tokenPath ->
201208 Token (tokenPath, getTokenRelativeName(tokenPath, clazz), { getTokenValue(tokenPath) })
202209 }
203210}
@@ -220,8 +227,9 @@ private fun getPath(clazz: KClass<*>): String {
220227 * will generate tokens for all children objects of [OudsColorScheme.Action] in the class tree. Other tokens in [OudsColorScheme] such as tokens in
221228 * [OudsColorScheme.Background] will be skipped. Pass `null` to take all tokens into account.
222229 * @param parentPath The path of the parent object in the class tree.
230+ * @param predicate A function that takes the class containing the token and its associated constructor parameter, and returns the result of predicate evaluation for this token.
223231 */
224- private fun getTokenPaths (clazz : KClass <* >, fromClass : KClass <* >? , parentPath : String ): List <String > {
232+ private fun getTokenPaths (clazz : KClass <* >, fromClass : KClass <* >? , parentPath : String , predicate : ( KClass < * >, KParameter ) -> Boolean ): List <String > {
225233 return clazz.primaryConstructor
226234 ?.parameters // Use primary constructor parameters instead of declaredMemberProperties because parameters are sorted as they are declared
227235 .orEmpty()
@@ -237,12 +245,13 @@ private fun getTokenPaths(clazz: KClass<*>, fromClass: KClass<*>?, parentPath: S
237245 getTokenPaths(
238246 parameterClass,
239247 fromClass.takeIf { parameterClass != fromClass },
240- path
248+ path,
249+ predicate
241250 )
242251 }
243252 // parameter is not a nested class thus a token value, we take the token path into account if fromClass is null
244253 // meaning we already encountered fromClass when browsing the class tree
245- fromClass == null -> listOf (path)
254+ fromClass == null && predicate(clazz, parameter) -> listOf (path)
246255 else -> emptyList()
247256 }
248257 }
0 commit comments