Skip to content

Commit 10c29c4

Browse files
Reduce bundle size on JS disable inlining of "visit" and "visitAndFinalize" functions.
1 parent ec7bda6 commit 10c29c4

21 files changed

+1002
-962
lines changed

buildSrc/src/main/kotlin/kotlinx/html/generate/tagsgen.kt

+1-1
Original file line numberDiff line numberDiff line change
@@ -342,7 +342,7 @@ private fun tagBuilderFunctionArguments(tag: TagInfo, blockOrContent : Boolean)
342342
}
343343

344344
fun addBlockParameter() {
345-
arguments.add(Var("block", "${tag.className}.() -> Unit", defaultValue = "{}"))
345+
arguments.add(Var("crossinline block", "${tag.className}.() -> Unit", defaultValue = "{}"))
346346
}
347347

348348
fun addContentParameter() {

src/commonMain/kotlin/api.kt

+3-18
Original file line numberDiff line numberDiff line change
@@ -74,25 +74,10 @@ interface AttributeEnum {
7474
val realValue: String
7575
}
7676

77-
inline fun <T : Tag> T.visit(block: T.() -> Unit) {
78-
consumer.onTagStart(this)
79-
try {
80-
this.block()
81-
} catch (err: Throwable) {
82-
consumer.onTagError(this, err)
83-
} finally {
84-
consumer.onTagEnd(this)
85-
}
86-
}
77+
inline fun <T : Tag> T.visit(crossinline block: T.() -> Unit) = visitTag { block() }
8778

88-
inline fun <T : Tag, R> T.visitAndFinalize(consumer: TagConsumer<R>, block: T.() -> Unit): R {
89-
if (this.consumer !== consumer) {
90-
throw IllegalArgumentException("Wrong exception")
91-
}
92-
93-
visit(block)
94-
return consumer.finalize()
95-
}
79+
inline fun <T : Tag, R> T.visitAndFinalize(consumer: TagConsumer<R>, crossinline block: T.() -> Unit): R
80+
= visitTagAndFinalize(consumer) { block() }
9681

9782
fun attributesMapOf() = emptyMap
9883
fun attributesMapOf(key: String, value: String?): Map<String, String> = when (value) {

src/commonMain/kotlin/generated/gen-consumer-tags.kt

+107-107
Large diffs are not rendered by default.

src/commonMain/kotlin/generated/gen-tag-groups.kt

+24-24
Original file line numberDiff line numberDiff line change
@@ -31,128 +31,128 @@ interface SectioningContent : SectioningOrFlowContent, Tag {
3131
* Information on author
3232
*/
3333
@HtmlTagMarker
34-
inline fun FlowContent.address(classes : String? = null, block : ADDRESS.() -> Unit = {}) : Unit = ADDRESS(attributesMapOf("class", classes), consumer).visit(block)
34+
inline fun FlowContent.address(classes : String? = null, crossinline block : ADDRESS.() -> Unit = {}) : Unit = ADDRESS(attributesMapOf("class", classes), consumer).visit(block)
3535

3636
/**
3737
* Long quotation
3838
*/
3939
@HtmlTagMarker
40-
inline fun FlowContent.blockQuote(classes : String? = null, block : BLOCKQUOTE.() -> Unit = {}) : Unit = BLOCKQUOTE(attributesMapOf("class", classes), consumer).visit(block)
40+
inline fun FlowContent.blockQuote(classes : String? = null, crossinline block : BLOCKQUOTE.() -> Unit = {}) : Unit = BLOCKQUOTE(attributesMapOf("class", classes), consumer).visit(block)
4141

4242
/**
4343
* Dialog box or window
4444
*/
4545
@HtmlTagMarker
46-
inline fun FlowContent.dialog(classes : String? = null, block : DIALOG.() -> Unit = {}) : Unit = DIALOG(attributesMapOf("class", classes), consumer).visit(block)
46+
inline fun FlowContent.dialog(classes : String? = null, crossinline block : DIALOG.() -> Unit = {}) : Unit = DIALOG(attributesMapOf("class", classes), consumer).visit(block)
4747

4848
/**
4949
* Generic language/style container
5050
*/
5151
@HtmlTagMarker
52-
inline fun FlowContent.div(classes : String? = null, block : DIV.() -> Unit = {}) : Unit = DIV(attributesMapOf("class", classes), consumer).visit(block)
52+
inline fun FlowContent.div(classes : String? = null, crossinline block : DIV.() -> Unit = {}) : Unit = DIV(attributesMapOf("class", classes), consumer).visit(block)
5353

5454
/**
5555
* Definition list
5656
*/
5757
@HtmlTagMarker
58-
inline fun FlowContent.dl(classes : String? = null, block : DL.() -> Unit = {}) : Unit = DL(attributesMapOf("class", classes), consumer).visit(block)
58+
inline fun FlowContent.dl(classes : String? = null, crossinline block : DL.() -> Unit = {}) : Unit = DL(attributesMapOf("class", classes), consumer).visit(block)
5959

6060
/**
6161
* Form control group
6262
*/
6363
@HtmlTagMarker
64-
inline fun FlowContent.fieldSet(classes : String? = null, block : FIELDSET.() -> Unit = {}) : Unit = FIELDSET(attributesMapOf("class", classes), consumer).visit(block)
64+
inline fun FlowContent.fieldSet(classes : String? = null, crossinline block : FIELDSET.() -> Unit = {}) : Unit = FIELDSET(attributesMapOf("class", classes), consumer).visit(block)
6565

6666
/**
6767
* Figure with optional caption
6868
*/
6969
@HtmlTagMarker
70-
inline fun FlowContent.figure(classes : String? = null, block : FIGURE.() -> Unit = {}) : Unit = FIGURE(attributesMapOf("class", classes), consumer).visit(block)
70+
inline fun FlowContent.figure(classes : String? = null, crossinline block : FIGURE.() -> Unit = {}) : Unit = FIGURE(attributesMapOf("class", classes), consumer).visit(block)
7171

7272
/**
7373
* Caption for
7474
*/
7575
@HtmlTagMarker
76-
inline fun FlowContent.figcaption(classes : String? = null, block : FIGCAPTION.() -> Unit = {}) : Unit = FIGCAPTION(attributesMapOf("class", classes), consumer).visit(block)
76+
inline fun FlowContent.figcaption(classes : String? = null, crossinline block : FIGCAPTION.() -> Unit = {}) : Unit = FIGCAPTION(attributesMapOf("class", classes), consumer).visit(block)
7777

7878
/**
7979
* Footer for a page or section
8080
*/
8181
@HtmlTagMarker
82-
inline fun FlowContent.footer(classes : String? = null, block : FOOTER.() -> Unit = {}) : Unit = FOOTER(attributesMapOf("class", classes), consumer).visit(block)
82+
inline fun FlowContent.footer(classes : String? = null, crossinline block : FOOTER.() -> Unit = {}) : Unit = FOOTER(attributesMapOf("class", classes), consumer).visit(block)
8383

8484
/**
8585
* Interactive form
8686
*/
8787
@HtmlTagMarker
88-
inline fun FlowContent.form(action : String? = null, encType : FormEncType? = null, method : FormMethod? = null, classes : String? = null, block : FORM.() -> Unit = {}) : Unit = FORM(attributesMapOf("action", action,"enctype", encType?.enumEncode(),"method", method?.enumEncode(),"class", classes), consumer).visit(block)
88+
inline fun FlowContent.form(action : String? = null, encType : FormEncType? = null, method : FormMethod? = null, classes : String? = null, crossinline block : FORM.() -> Unit = {}) : Unit = FORM(attributesMapOf("action", action,"enctype", encType?.enumEncode(),"method", method?.enumEncode(),"class", classes), consumer).visit(block)
8989
@HtmlTagMarker
90-
inline fun FlowContent.getForm(action : String? = null, encType : FormEncType? = null, classes : String? = null, block : FORM.() -> Unit = {}) : Unit = FORM(attributesMapOf("action", action,"enctype", encType?.enumEncode(),"method", FormMethod.get.realValue,"class", classes), consumer).visit(block)
90+
inline fun FlowContent.getForm(action : String? = null, encType : FormEncType? = null, classes : String? = null, crossinline block : FORM.() -> Unit = {}) : Unit = FORM(attributesMapOf("action", action,"enctype", encType?.enumEncode(),"method", FormMethod.get.realValue,"class", classes), consumer).visit(block)
9191
@HtmlTagMarker
92-
inline fun FlowContent.postForm(action : String? = null, encType : FormEncType? = null, classes : String? = null, block : FORM.() -> Unit = {}) : Unit = FORM(attributesMapOf("action", action,"enctype", encType?.enumEncode(),"method", FormMethod.post.realValue,"class", classes), consumer).visit(block)
92+
inline fun FlowContent.postForm(action : String? = null, encType : FormEncType? = null, classes : String? = null, crossinline block : FORM.() -> Unit = {}) : Unit = FORM(attributesMapOf("action", action,"enctype", encType?.enumEncode(),"method", FormMethod.post.realValue,"class", classes), consumer).visit(block)
9393
@Suppress("DEPRECATION")
9494
@HtmlTagMarker
95-
inline fun FlowContent.putForm(action : String? = null, encType : FormEncType? = null, classes : String? = null, block : FORM.() -> Unit = {}) : Unit = FORM(attributesMapOf("action", action,"enctype", encType?.enumEncode(),"method", FormMethod.put.realValue,"class", classes), consumer).visit(block)
95+
inline fun FlowContent.putForm(action : String? = null, encType : FormEncType? = null, classes : String? = null, crossinline block : FORM.() -> Unit = {}) : Unit = FORM(attributesMapOf("action", action,"enctype", encType?.enumEncode(),"method", FormMethod.put.realValue,"class", classes), consumer).visit(block)
9696
@Suppress("DEPRECATION")
9797
@HtmlTagMarker
98-
inline fun FlowContent.deleteForm(action : String? = null, encType : FormEncType? = null, classes : String? = null, block : FORM.() -> Unit = {}) : Unit = FORM(attributesMapOf("action", action,"enctype", encType?.enumEncode(),"method", FormMethod.delete.realValue,"class", classes), consumer).visit(block)
98+
inline fun FlowContent.deleteForm(action : String? = null, encType : FormEncType? = null, classes : String? = null, crossinline block : FORM.() -> Unit = {}) : Unit = FORM(attributesMapOf("action", action,"enctype", encType?.enumEncode(),"method", FormMethod.delete.realValue,"class", classes), consumer).visit(block)
9999
@Suppress("DEPRECATION")
100100
@HtmlTagMarker
101-
inline fun FlowContent.patchForm(action : String? = null, encType : FormEncType? = null, classes : String? = null, block : FORM.() -> Unit = {}) : Unit = FORM(attributesMapOf("action", action,"enctype", encType?.enumEncode(),"method", FormMethod.patch.realValue,"class", classes), consumer).visit(block)
101+
inline fun FlowContent.patchForm(action : String? = null, encType : FormEncType? = null, classes : String? = null, crossinline block : FORM.() -> Unit = {}) : Unit = FORM(attributesMapOf("action", action,"enctype", encType?.enumEncode(),"method", FormMethod.patch.realValue,"class", classes), consumer).visit(block)
102102

103103
/**
104104
* Introductory or navigational aids for a page or section
105105
*/
106106
@HtmlTagMarker
107-
inline fun FlowContent.header(classes : String? = null, block : HEADER.() -> Unit = {}) : Unit = HEADER(attributesMapOf("class", classes), consumer).visit(block)
107+
inline fun FlowContent.header(classes : String? = null, crossinline block : HEADER.() -> Unit = {}) : Unit = HEADER(attributesMapOf("class", classes), consumer).visit(block)
108108

109109
/**
110110
* Horizontal rule
111111
*/
112112
@HtmlTagMarker
113-
inline fun FlowContent.hr(classes : String? = null, block : HR.() -> Unit = {}) : Unit = HR(attributesMapOf("class", classes), consumer).visit(block)
113+
inline fun FlowContent.hr(classes : String? = null, crossinline block : HR.() -> Unit = {}) : Unit = HR(attributesMapOf("class", classes), consumer).visit(block)
114114

115115
/**
116116
* Ordered list
117117
*/
118118
@HtmlTagMarker
119-
inline fun FlowContent.ol(classes : String? = null, block : OL.() -> Unit = {}) : Unit = OL(attributesMapOf("class", classes), consumer).visit(block)
119+
inline fun FlowContent.ol(classes : String? = null, crossinline block : OL.() -> Unit = {}) : Unit = OL(attributesMapOf("class", classes), consumer).visit(block)
120120

121121
/**
122122
* Paragraph
123123
*/
124124
@HtmlTagMarker
125-
inline fun FlowContent.p(classes : String? = null, block : P.() -> Unit = {}) : Unit = P(attributesMapOf("class", classes), consumer).visit(block)
125+
inline fun FlowContent.p(classes : String? = null, crossinline block : P.() -> Unit = {}) : Unit = P(attributesMapOf("class", classes), consumer).visit(block)
126126

127127
/**
128128
* Preformatted text
129129
*/
130130
@HtmlTagMarker
131-
inline fun FlowContent.pre(classes : String? = null, block : PRE.() -> Unit = {}) : Unit = PRE(attributesMapOf("class", classes), consumer).visit(block)
131+
inline fun FlowContent.pre(classes : String? = null, crossinline block : PRE.() -> Unit = {}) : Unit = PRE(attributesMapOf("class", classes), consumer).visit(block)
132132

133133
/**
134134
*
135135
*/
136136
@HtmlTagMarker
137-
inline fun FlowContent.table(classes : String? = null, block : TABLE.() -> Unit = {}) : Unit = TABLE(attributesMapOf("class", classes), consumer).visit(block)
137+
inline fun FlowContent.table(classes : String? = null, crossinline block : TABLE.() -> Unit = {}) : Unit = TABLE(attributesMapOf("class", classes), consumer).visit(block)
138138

139139
/**
140140
* Unordered list
141141
*/
142142
@HtmlTagMarker
143-
inline fun FlowContent.ul(classes : String? = null, block : UL.() -> Unit = {}) : Unit = UL(attributesMapOf("class", classes), consumer).visit(block)
143+
inline fun FlowContent.ul(classes : String? = null, crossinline block : UL.() -> Unit = {}) : Unit = UL(attributesMapOf("class", classes), consumer).visit(block)
144144

145145
/**
146146
* Document base URI
147147
*/
148148
@HtmlTagMarker
149-
inline fun MetaDataContent.base(classes : String? = null, block : BASE.() -> Unit = {}) : Unit = BASE(attributesMapOf("class", classes), consumer).visit(block)
149+
inline fun MetaDataContent.base(classes : String? = null, crossinline block : BASE.() -> Unit = {}) : Unit = BASE(attributesMapOf("class", classes), consumer).visit(block)
150150

151151
/**
152152
* Document title
153153
*/
154154
@HtmlTagMarker
155-
inline fun MetaDataContent.title(block : TITLE.() -> Unit = {}) : Unit = TITLE(emptyMap, consumer).visit(block)
155+
inline fun MetaDataContent.title(crossinline block : TITLE.() -> Unit = {}) : Unit = TITLE(emptyMap, consumer).visit(block)
156156
/**
157157
* Document title
158158
*/

0 commit comments

Comments
 (0)