1
1
package org.jetbrains.kotlinx.dataframe.api
2
2
3
3
import org.jetbrains.kotlinx.dataframe.DataFrame
4
+ import org.jetbrains.kotlinx.dataframe.annotations.ColumnName
5
+ import org.jetbrains.kotlinx.dataframe.annotations.DataSchema
4
6
import org.jetbrains.kotlinx.dataframe.codeGen.CodeGenerator
5
7
import org.jetbrains.kotlinx.dataframe.codeGen.MarkerVisibility
6
8
import org.jetbrains.kotlinx.dataframe.codeGen.NameNormalizer
9
+ import org.jetbrains.kotlinx.dataframe.columns.ColumnGroup
10
+ import org.jetbrains.kotlinx.dataframe.columns.FrameColumn
11
+ import org.jetbrains.kotlinx.dataframe.documentation.DocumentationUrls
12
+ import org.jetbrains.kotlinx.dataframe.documentation.ExcludeFromSources
7
13
import org.jetbrains.kotlinx.dataframe.impl.codeGen.from
8
14
import org.jetbrains.kotlinx.dataframe.schema.DataFrameSchema
9
15
16
+ // region Docs
17
+
18
+ /* *
19
+ * Generates a [CodeString] containing generated [@DataSchema][DataSchema] $[TYPES]
20
+ * for the given $[RECEIVER]
21
+ * (including all nested [frame columns][FrameColumn] and [column groups][ColumnGroup]).
22
+ *
23
+ * These generated declarations can also be called "markers".
24
+ *
25
+ * This is useful when working with the compiler plugin in cases where the schema
26
+ * cannot be inferred automatically from the source.
27
+ *
28
+ * This function is a simplified wrapper for the more advanced and customizable
29
+ * [CodeGenerator] API.
30
+ * For more customizability, have a look at [CodeGenerator.create()][CodeGenerator.create].
31
+ *
32
+ * For more information: {@include [DocumentationUrls.DataSchemaGeneration]}
33
+ *
34
+ * @return [CodeString] – A value class wrapper for [String], containing
35
+ * the generated Kotlin code of data schema declarations (markers).
36
+ */
37
+ @ExcludeFromSources
38
+ private interface CommonGenerateCodeDocs {
39
+
40
+ // "interfaces" or "data classes"
41
+ interface TYPES
42
+
43
+ // "DataFrameSchema" or "DataFrame"
44
+ interface RECEIVER
45
+ }
46
+
47
+ @ExcludeFromSources
48
+ private interface Params {
49
+
50
+ /* * @param markerName The base name to use for generated data schema declarations (markers). */
51
+ interface MarkerName
52
+
53
+ /* * @include [MarkerName] If not specified, generates a name from type [T]. */
54
+ interface MarkerNameOptional
55
+
56
+ /* * @param fields Whether to generate fields (`val ...:`) inside the generated data schema declarations (markers). */
57
+ interface Fields
58
+
59
+ /* * @param extensionProperties Whether to generate extension properties in addition to data schema declarations (markers). */
60
+ interface ExtensionProperties
61
+
62
+ /* * @param visibility Visibility modifier for the generated declarations (markers). */
63
+ interface Visibility
64
+
65
+ /* * @param useFqNames If `true`, fully qualified type names will be used in generated code. */
66
+ interface UseFqNames
67
+
68
+ /* *
69
+ * @param nameNormalizer Strategy for converting column names (with spaces, underscores, etc.) to valid Kotlin identifiers.
70
+ * Columns will keep their original name inside the dataframe via [@ColumnName][ColumnName].
71
+ */
72
+ interface NameNormalizer
73
+ }
74
+
75
+ // endregion
76
+
10
77
// region DataFrame
11
78
79
+ /* *
80
+ * @include [CommonGenerateCodeDocs]
81
+ * {@set [CommonGenerateCodeDocs.RECEIVER] [DataFrame's][this] [schema][DataFrameSchema]}
82
+ * {@set [CommonGenerateCodeDocs.TYPES] interfaces and extension properties}
83
+ *
84
+ * @include [Params.Fields] Default is `true`.
85
+ * @include [Params.ExtensionProperties] Default is `true`.
86
+ */
12
87
public inline fun <reified T > DataFrame<T>.generateCode (
13
88
fields : Boolean = true,
14
89
extensionProperties : Boolean = true,
@@ -19,6 +94,16 @@ public inline fun <reified T> DataFrame<T>.generateCode(
19
94
extensionProperties = extensionProperties,
20
95
)
21
96
97
+ /* *
98
+ * @include [CommonGenerateCodeDocs]
99
+ * {@set [CommonGenerateCodeDocs.RECEIVER] [DataFrame's][this] [schema][DataFrameSchema]}
100
+ * {@set [CommonGenerateCodeDocs.TYPES] interfaces and extension properties}
101
+ *
102
+ * @include [Params.MarkerName]
103
+ * @include [Params.Fields] Default is `true`.
104
+ * @include [Params.ExtensionProperties] Default is `true`.
105
+ * @include [Params.Visibility] Default is [MarkerVisibility.IMPLICIT_PUBLIC].
106
+ */
22
107
public fun <T > DataFrame<T>.generateCode (
23
108
markerName : String ,
24
109
fields : Boolean = true,
@@ -32,11 +117,39 @@ public fun <T> DataFrame<T>.generateCode(
32
117
visibility = visibility,
33
118
)
34
119
120
+ /* *
121
+ * @include [CommonGenerateCodeDocs]
122
+ * {@set [CommonGenerateCodeDocs.RECEIVER] [DataFrame's][this] [schema][DataFrameSchema]}
123
+ * {@set [CommonGenerateCodeDocs.TYPES] interfaces}
124
+ *
125
+ * @include [Params.MarkerNameOptional]
126
+ */
35
127
public inline fun <reified T > DataFrame<T>.generateInterfaces (): CodeString =
36
128
schema().generateInterfaces(
37
129
markerName = markerName<T >(),
38
130
)
39
131
132
+ /* *
133
+ * @include [CommonGenerateCodeDocs]
134
+ * {@set [CommonGenerateCodeDocs.RECEIVER] [DataFrame's][this] [schema][DataFrameSchema]}
135
+ * {@set [CommonGenerateCodeDocs.TYPES] interfaces}
136
+ *
137
+ * @include [Params.MarkerNameOptional]
138
+ */
139
+ public fun <T > DataFrame<T>.generateInterfaces (markerName : String ): CodeString =
140
+ schema().generateInterfaces(markerName = markerName)
141
+
142
+ /* *
143
+ * @include [CommonGenerateCodeDocs]
144
+ * {@set [CommonGenerateCodeDocs.RECEIVER] [DataFrame's][this] [schema][DataFrameSchema]}
145
+ * {@set [CommonGenerateCodeDocs.TYPES] data classes}
146
+ *
147
+ * @include [Params.MarkerNameOptional]
148
+ * @include [Params.ExtensionProperties] Default is `false`.
149
+ * @include [Params.Visibility] Default is [MarkerVisibility.IMPLICIT_PUBLIC].
150
+ * @include [Params.UseFqNames] Default is `false`.
151
+ * @include [Params.NameNormalizer] Default is [NameNormalizer.default][NameNormalizer.Companion.default].
152
+ */
40
153
public inline fun <reified T > DataFrame<T>.generateDataClasses (
41
154
markerName : String? = null,
42
155
extensionProperties : Boolean = false,
@@ -45,20 +158,27 @@ public inline fun <reified T> DataFrame<T>.generateDataClasses(
45
158
nameNormalizer : NameNormalizer = NameNormalizer .default,
46
159
): CodeString =
47
160
schema().generateDataClasses(
48
- name = markerName ? : markerName<T >(),
161
+ markerName = markerName ? : markerName<T >(),
49
162
extensionProperties = extensionProperties,
50
163
visibility = visibility,
51
164
useFqNames = useFqNames,
52
165
nameNormalizer = nameNormalizer,
53
166
)
54
167
55
- public fun <T > DataFrame<T>.generateInterfaces (markerName : String ): CodeString =
56
- schema().generateInterfaces(markerName = markerName)
57
-
58
168
// endregion
59
169
60
170
// region DataFrameSchema
61
171
172
+ /* *
173
+ * @include [CommonGenerateCodeDocs]
174
+ * {@set [CommonGenerateCodeDocs.RECEIVER] [DataFrameSchema][this]}
175
+ * {@set [CommonGenerateCodeDocs.TYPES] interfaces and extension properties}
176
+ *
177
+ * @include [Params.MarkerName]
178
+ * @include [Params.Fields] Default is `true`.
179
+ * @include [Params.ExtensionProperties] Default is `true`.
180
+ * @include [Params.Visibility] Default is [MarkerVisibility.IMPLICIT_PUBLIC].
181
+ */
62
182
@JvmName(" generateCodeForSchema" )
63
183
public fun DataFrameSchema.generateCode (
64
184
markerName : String ,
@@ -77,6 +197,13 @@ public fun DataFrameSchema.generateCode(
77
197
).code.declarations.toCodeString()
78
198
}
79
199
200
+ /* *
201
+ * @include [CommonGenerateCodeDocs]
202
+ * {@set [CommonGenerateCodeDocs.RECEIVER] [DataFrameSchema][this]}
203
+ * {@set [CommonGenerateCodeDocs.TYPES] interfaces}
204
+ *
205
+ * @include [Params.MarkerName]
206
+ */
80
207
@JvmName(" generateInterfacesForSchema" )
81
208
public fun DataFrameSchema.generateInterfaces (markerName : String ): CodeString =
82
209
generateCode(
@@ -85,9 +212,20 @@ public fun DataFrameSchema.generateInterfaces(markerName: String): CodeString =
85
212
extensionProperties = false ,
86
213
)
87
214
215
+ /* *
216
+ * @include [CommonGenerateCodeDocs]
217
+ * {@set [CommonGenerateCodeDocs.RECEIVER] [DataFrameSchema][this]}
218
+ * {@set [CommonGenerateCodeDocs.TYPES] data classes}
219
+ *
220
+ * @include [Params.MarkerName]
221
+ * @include [Params.ExtensionProperties] Default is `false`.
222
+ * @include [Params.Visibility] Default is [MarkerVisibility.IMPLICIT_PUBLIC].
223
+ * @include [Params.UseFqNames] Default is `false`.
224
+ * @include [Params.NameNormalizer] Default is [NameNormalizer.default][NameNormalizer.Companion.default].
225
+ */
88
226
@JvmName(" generateDataClassesForSchema" )
89
227
public fun DataFrameSchema.generateDataClasses (
90
- name : String ,
228
+ markerName : String ,
91
229
extensionProperties : Boolean = false,
92
230
visibility : MarkerVisibility = MarkerVisibility .IMPLICIT_PUBLIC ,
93
231
useFqNames : Boolean = false,
@@ -96,7 +234,7 @@ public fun DataFrameSchema.generateDataClasses(
96
234
val codeGen = CodeGenerator .create(useFqNames)
97
235
return codeGen.generate(
98
236
schema = this ,
99
- name = name ,
237
+ name = markerName ,
100
238
fields = true ,
101
239
extensionProperties = extensionProperties,
102
240
isOpen = false ,
@@ -121,6 +259,10 @@ internal inline fun <reified T> markerName(): String =
121
259
*/
122
260
public val NameNormalizer .Companion .default: NameNormalizer get() = NameNormalizer .from(setOf (' \t ' , ' ' , ' _' ))
123
261
262
+ /* *
263
+ * A value class wrapper for [String], containing
264
+ * generated Kotlin code of data schema declarations (markers) and optionally extension properties.
265
+ */
124
266
@JvmInline
125
267
public value class CodeString (public val value : String ) {
126
268
override fun toString (): String = value
0 commit comments