Skip to content

Commit f159cf2

Browse files
committed
使用jetbrains原生的排序接口对vue的属性排序
1 parent 41e2bd1 commit f159cf2

15 files changed

Lines changed: 363 additions & 219 deletions

resources/META-INF/plugin.xml

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -55,10 +55,8 @@
5555
<gotoDeclarationHandler
5656
implementation="com.wuhao.code.check.gotohandler.GotoSpringBootConfigPropertyDeclarationHandler"/>
5757
<gotoDeclarationHandler implementation="com.wuhao.code.check.gotohandler.MyGotoDeclarationHandler2"/>
58-
<postFormatProcessor implementation="com.wuhao.code.check.processors.ReorderVueAttributesProcessor"
59-
id="RerangeVueAttributesProcessor" order="first"/>
6058
<postFormatProcessor implementation="com.wuhao.code.check.processors.FixVueAttributesProcessor"
61-
id="FixVueAttributesProcessor" order="after RerangeVueAttributesProcessor"/>
59+
id="FixVueAttributesProcessor" order="last"/>
6260
<postFormatProcessor implementation="com.wuhao.code.check.processors.FixVueTemplateExpressionProcessor"
6361
id="FixVueTemplateExpressionProcessor" order="first"/>
6462
<!--<postFormatProcessor implementation="com.wuhao.code.check.processors.FixJavaElementOrder"-->

src/com/wuhao/code/check/PostStart.kt

Lines changed: 6 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,6 @@ import com.intellij.psi.codeStyle.arrangement.match.StdArrangementEntryMatcher
2222
import com.intellij.psi.codeStyle.arrangement.match.StdArrangementMatchRule
2323
import com.intellij.psi.codeStyle.arrangement.model.ArrangementAtomMatchCondition
2424
import com.intellij.psi.codeStyle.arrangement.model.ArrangementCompositeMatchCondition
25-
import com.intellij.psi.codeStyle.arrangement.std.ArrangementSettingsToken
2625
import com.intellij.psi.codeStyle.arrangement.std.StdArrangementExtendableSettings
2726
import com.intellij.psi.codeStyle.arrangement.std.StdArrangementRuleAliasToken
2827
import com.intellij.psi.codeStyle.arrangement.std.StdArrangementSettings
@@ -34,6 +33,8 @@ import com.wuhao.code.check.style.KotlinModifier.LATEINIT
3433
import com.wuhao.code.check.style.KotlinModifier.OPEN
3534
import com.wuhao.code.check.style.arrangement.JavaRearrangeRules
3635
import com.wuhao.code.check.style.arrangement.KotlinRearrangeRules
36+
import com.wuhao.code.check.style.arrangement.RuleDescription
37+
import com.wuhao.code.check.style.arrangement.VueRearrangeRules
3738
import org.jetbrains.kotlin.idea.KotlinFileType
3839
import org.jetbrains.kotlin.idea.KotlinLanguage
3940
import org.jetbrains.vuejs.VueFileType
@@ -90,7 +91,7 @@ class PostStart : StartupActivity {
9091
return StdArrangementExtendableSettings(listOf(), sections, tokens)
9192
}
9293

93-
private fun createMatcher(rule: PostStart.RuleDescription): StdArrangementEntryMatcher {
94+
private fun createMatcher(rule: RuleDescription): StdArrangementEntryMatcher {
9495
return StdArrangementEntryMatcher(
9596
ArrangementCompositeMatchCondition().apply {
9697
rule.template.forEach { token ->
@@ -100,7 +101,7 @@ class PostStart : StartupActivity {
100101
)
101102
}
102103

103-
private fun createSections(rules: List<PostStart.RuleDescription>): List<ArrangementSectionRule> {
104+
private fun createSections(rules: List<RuleDescription>): List<ArrangementSectionRule> {
104105
return rules.map { rule ->
105106
if (rule.order == null) {
106107
StdArrangementMatchRule(createMatcher(rule), BY_NAME)
@@ -113,7 +114,8 @@ class PostStart : StartupActivity {
113114
}
114115

115116
private fun createVueSettings(): StdArrangementSettings {
116-
return StdArrangementExtendableSettings(listOf(), listOf(), listOf())
117+
val sections = createSections(VueRearrangeRules.get())
118+
return StdArrangementExtendableSettings(listOf(), sections, listOf())
117119
}
118120

119121
private fun setIndent(settings: CodeStyleSettings) {
@@ -143,19 +145,5 @@ class PostStart : StartupActivity {
143145
}
144146
}
145147

146-
/**
147-
* java代码排序规则描述
148-
* @author 吴昊
149-
* @since 1.2.6
150-
*/
151-
class RuleDescription(val template: List<ArrangementSettingsToken>) {
152-
153-
var order: ArrangementSettingsToken? = null
154-
155-
constructor(template: List<ArrangementSettingsToken>, order: ArrangementSettingsToken)
156-
: this(template) {
157-
this.order = order
158-
}
159-
}
160148
}
161149

src/com/wuhao/code/check/inspection/fix/VueTemplateTagFix.kt

Lines changed: 30 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -22,23 +22,46 @@ import org.jetbrains.kotlin.psi.KtPsiFactory
2222
*/
2323
class VueTemplateTagFix(private val sortedAttributes: List<XmlAttribute>) : LocalQuickFix {
2424

25-
override fun getFamilyName(): String {
26-
return "属性重新排序"
27-
}
28-
2925
override fun applyFix(project: Project, descriptor: ProblemDescriptor) {
3026
val el = descriptor.psiElement as XmlTag
3127
fixElement(el, sortedAttributes)
3228
}
3329

30+
override fun getFamilyName(): String {
31+
return "属性重新排序"
32+
}
33+
3434
companion object {
3535

36+
fun comparePrefix(nameList: List<String>, prefix: String): Int {
37+
return when {
38+
nameList.all { it.startsWith(prefix) } -> nameList[0].compareTo(nameList[1])
39+
nameList[0].startsWith(prefix) -> -1
40+
else -> 1
41+
}
42+
}
43+
44+
fun fixElement(el: XmlTag, sortedAttributes: List<XmlAttribute>) {
45+
reorderAttributes(el, sortedAttributes)
46+
fixWhitespace(el)
47+
}
48+
3649
fun fixElement(el: XmlTag) {
3750
fixElement(el, sortAttributes(el))
3851
}
3952

40-
fun reorderAttributes(el: XmlTag) {
41-
reorderAttributes(el, sortAttributes(el))
53+
fun fixWhitespace(el: XmlTag) {
54+
val factory = KtPsiFactory(el.project)
55+
el.attributes.forEachIndexed { index, it ->
56+
val spaceBefore = it.prevSibling as PsiWhiteSpace
57+
if (it.value == null && spaceBefore.textContains('\n')) {
58+
spaceBefore.replace(factory.createWhiteSpace(" "))
59+
} else if (it.value != null && index != 0 && !spaceBefore.textContains('\n')) {
60+
spaceBefore.replace(factory.createWhiteSpace("\n"))
61+
} else if (index == 0 && spaceBefore.textContains('\n')) {
62+
spaceBefore.replace(factory.createWhiteSpace(" "))
63+
}
64+
}
4265
}
4366

4467
private fun reorderAttributes(el: XmlTag, sortedAttributes: List<XmlAttribute>) {
@@ -53,27 +76,6 @@ class VueTemplateTagFix(private val sortedAttributes: List<XmlAttribute>) : Loca
5376
}
5477
}
5578

56-
fun fixElement(el: XmlTag, sortedAttributes: List<XmlAttribute>) {
57-
reorderAttributes(el, sortedAttributes)
58-
fixWhitespace(el)
59-
}
60-
61-
fun fixWhitespace(el: XmlTag) {
62-
val factory = KtPsiFactory(el.project)
63-
el.attributes.forEachIndexed { index, it ->
64-
val spaceBefore = it.prevSibling as PsiWhiteSpace
65-
if (index != 0 && !spaceBefore.textContains('\n')) {
66-
spaceBefore.replace(factory.createWhiteSpace("\n"))
67-
}
68-
val spaceAfter = it.nextSibling
69-
if (spaceAfter != null
70-
&& spaceAfter is PsiWhiteSpace
71-
&& !spaceAfter.textContains('\n')) {
72-
spaceAfter.replace(factory.createWhiteSpace("\n"))
73-
}
74-
}
75-
}
76-
7779
private fun sortAttributes(element: XmlTag): List<XmlAttribute> {
7880
return element.attributes.sortedWith(Comparator { attr1, attr2 ->
7981
val name1 = attr1.name
@@ -107,13 +109,6 @@ class VueTemplateTagFix(private val sortedAttributes: List<XmlAttribute>) : Loca
107109
}
108110
}).filter { it.value != null }
109111
}
110-
111-
private fun comparePrefix(nameList: List<String>, prefix: String): Int {
112-
return when {
113-
nameList.all { it.startsWith(prefix) } -> nameList[0].compareTo(nameList[1])
114-
nameList[0].startsWith(prefix) -> -1
115-
else -> 1
116-
}
117-
}
118112
}
119113
}
114+

src/com/wuhao/code/check/processors/FixVueAttributesProcessor.kt

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -24,11 +24,6 @@ import org.jetbrains.kotlin.psi.psiUtil.endOffset
2424
class FixVueAttributesProcessor : PostFormatProcessor {
2525

2626
override fun processElement(el: PsiElement, styleSettings: CodeStyleSettings): PsiElement {
27-
if (el.language.displayName == LanguageNames.vue) {
28-
if (el is XmlTag) {
29-
VueTemplateTagFix.fixElement(el)
30-
}
31-
}
3227
return el
3328
}
3429

src/com/wuhao/code/check/processors/ReorderVueAttributesProcessor.kt

Lines changed: 0 additions & 47 deletions
This file was deleted.

src/com/wuhao/code/check/style/arrangement/Rules.kt renamed to src/com/wuhao/code/check/style/arrangement/BaseRules.kt

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,11 @@
44

55
package com.wuhao.code.check.style.arrangement
66

7-
import com.wuhao.code.check.PostStart
8-
97
/**
108
* 排序规则列表类
119
* @author 吴昊
1210
* @since 1.3.1
1311
*/
14-
abstract class Rules {
15-
abstract fun get(): List<PostStart.RuleDescription>
12+
abstract class BaseRules {
13+
abstract fun get(): List<RuleDescription>
1614
}

src/com/wuhao/code/check/style/arrangement/JavaRearrangeRules.kt

Lines changed: 46 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -4,62 +4,63 @@
44

55
package com.wuhao.code.check.style.arrangement
66

7-
import com.intellij.psi.codeStyle.arrangement.std.StdArrangementTokens
8-
import com.wuhao.code.check.PostStart
7+
import com.intellij.psi.codeStyle.arrangement.std.StdArrangementTokens.EntryType.*
8+
import com.intellij.psi.codeStyle.arrangement.std.StdArrangementTokens.Modifier.*
9+
import com.intellij.psi.codeStyle.arrangement.std.StdArrangementTokens.Order.BY_NAME
910

1011
/**
1112
*
1213
* @author 吴昊
1314
* @since 1.3.1
1415
*/
15-
object JavaRearrangeRules: Rules() {
16+
object JavaRearrangeRules: BaseRules() {
1617

17-
override fun get(): List<PostStart.RuleDescription> {
18+
override fun get(): List<RuleDescription> {
1819
return listOf(
19-
PostStart.RuleDescription(listOf(StdArrangementTokens.EntryType.FIELD, StdArrangementTokens.Modifier.PUBLIC, StdArrangementTokens.Modifier.STATIC, StdArrangementTokens.Modifier.FINAL), StdArrangementTokens.Order.BY_NAME),
20-
PostStart.RuleDescription(listOf(StdArrangementTokens.EntryType.FIELD, StdArrangementTokens.Modifier.PROTECTED, StdArrangementTokens.Modifier.STATIC, StdArrangementTokens.Modifier.FINAL), StdArrangementTokens.Order.BY_NAME),
21-
PostStart.RuleDescription(listOf(StdArrangementTokens.EntryType.FIELD, StdArrangementTokens.Modifier.PACKAGE_PRIVATE, StdArrangementTokens.Modifier.STATIC, StdArrangementTokens.Modifier.FINAL), StdArrangementTokens.Order.BY_NAME),
22-
PostStart.RuleDescription(listOf(StdArrangementTokens.EntryType.FIELD, StdArrangementTokens.Modifier.PRIVATE, StdArrangementTokens.Modifier.STATIC, StdArrangementTokens.Modifier.FINAL), StdArrangementTokens.Order.BY_NAME),
23-
PostStart.RuleDescription(listOf(StdArrangementTokens.EntryType.FIELD, StdArrangementTokens.Modifier.PUBLIC, StdArrangementTokens.Modifier.STATIC), StdArrangementTokens.Order.BY_NAME),
24-
PostStart.RuleDescription(listOf(StdArrangementTokens.EntryType.FIELD, StdArrangementTokens.Modifier.PROTECTED, StdArrangementTokens.Modifier.STATIC), StdArrangementTokens.Order.BY_NAME),
25-
PostStart.RuleDescription(listOf(StdArrangementTokens.EntryType.FIELD, StdArrangementTokens.Modifier.PACKAGE_PRIVATE, StdArrangementTokens.Modifier.STATIC), StdArrangementTokens.Order.BY_NAME),
26-
PostStart.RuleDescription(listOf(StdArrangementTokens.EntryType.FIELD, StdArrangementTokens.Modifier.PRIVATE, StdArrangementTokens.Modifier.STATIC), StdArrangementTokens.Order.BY_NAME),
27-
PostStart.RuleDescription(listOf(StdArrangementTokens.EntryType.INIT_BLOCK, StdArrangementTokens.Modifier.STATIC)),
28-
PostStart.RuleDescription(listOf(StdArrangementTokens.EntryType.FIELD, StdArrangementTokens.Modifier.PUBLIC, StdArrangementTokens.Modifier.FINAL), StdArrangementTokens.Order.BY_NAME),
29-
PostStart.RuleDescription(listOf(StdArrangementTokens.EntryType.FIELD, StdArrangementTokens.Modifier.PROTECTED, StdArrangementTokens.Modifier.FINAL), StdArrangementTokens.Order.BY_NAME),
30-
PostStart.RuleDescription(listOf(StdArrangementTokens.EntryType.FIELD, StdArrangementTokens.Modifier.PACKAGE_PRIVATE, StdArrangementTokens.Modifier.FINAL), StdArrangementTokens.Order.BY_NAME),
31-
PostStart.RuleDescription(listOf(StdArrangementTokens.EntryType.FIELD, StdArrangementTokens.Modifier.PRIVATE, StdArrangementTokens.Modifier.FINAL), StdArrangementTokens.Order.BY_NAME),
20+
RuleDescription(listOf(FIELD, PUBLIC, STATIC, FINAL), BY_NAME),
21+
RuleDescription(listOf(FIELD, PROTECTED, STATIC, FINAL), BY_NAME),
22+
RuleDescription(listOf(FIELD, PACKAGE_PRIVATE, STATIC, FINAL), BY_NAME),
23+
RuleDescription(listOf(FIELD, PRIVATE, STATIC, FINAL), BY_NAME),
24+
RuleDescription(listOf(FIELD, PUBLIC, STATIC), BY_NAME),
25+
RuleDescription(listOf(FIELD, PROTECTED, STATIC), BY_NAME),
26+
RuleDescription(listOf(FIELD, PACKAGE_PRIVATE, STATIC), BY_NAME),
27+
RuleDescription(listOf(FIELD, PRIVATE, STATIC), BY_NAME),
28+
RuleDescription(listOf(INIT_BLOCK, STATIC)),
29+
RuleDescription(listOf(FIELD, PUBLIC, FINAL), BY_NAME),
30+
RuleDescription(listOf(FIELD, PROTECTED, FINAL), BY_NAME),
31+
RuleDescription(listOf(FIELD, PACKAGE_PRIVATE, FINAL), BY_NAME),
32+
RuleDescription(listOf(FIELD, PRIVATE, FINAL), BY_NAME),
3233

33-
PostStart.RuleDescription(listOf(StdArrangementTokens.EntryType.FIELD, StdArrangementTokens.Modifier.PUBLIC), StdArrangementTokens.Order.BY_NAME),
34-
PostStart.RuleDescription(listOf(StdArrangementTokens.EntryType.FIELD, StdArrangementTokens.Modifier.PROTECTED), StdArrangementTokens.Order.BY_NAME),
35-
PostStart.RuleDescription(listOf(StdArrangementTokens.EntryType.FIELD, StdArrangementTokens.Modifier.PACKAGE_PRIVATE), StdArrangementTokens.Order.BY_NAME),
36-
PostStart.RuleDescription(listOf(StdArrangementTokens.EntryType.FIELD, StdArrangementTokens.Modifier.PRIVATE), StdArrangementTokens.Order.BY_NAME),
37-
PostStart.RuleDescription(listOf(StdArrangementTokens.EntryType.FIELD), StdArrangementTokens.Order.BY_NAME),
38-
PostStart.RuleDescription(listOf(StdArrangementTokens.EntryType.INIT_BLOCK)),
39-
PostStart.RuleDescription(listOf(StdArrangementTokens.EntryType.CONSTRUCTOR)),
34+
RuleDescription(listOf(FIELD, PUBLIC), BY_NAME),
35+
RuleDescription(listOf(FIELD, PROTECTED), BY_NAME),
36+
RuleDescription(listOf(FIELD, PACKAGE_PRIVATE), BY_NAME),
37+
RuleDescription(listOf(FIELD, PRIVATE), BY_NAME),
38+
RuleDescription(FIELD, BY_NAME),
39+
RuleDescription(INIT_BLOCK),
40+
RuleDescription(CONSTRUCTOR),
4041

41-
PostStart.RuleDescription(listOf(StdArrangementTokens.EntryType.METHOD, StdArrangementTokens.Modifier.PUBLIC, StdArrangementTokens.Modifier.STATIC, StdArrangementTokens.Modifier.FINAL), StdArrangementTokens.Order.BY_NAME),
42-
PostStart.RuleDescription(listOf(StdArrangementTokens.EntryType.METHOD, StdArrangementTokens.Modifier.PACKAGE_PRIVATE, StdArrangementTokens.Modifier.STATIC, StdArrangementTokens.Modifier.FINAL), StdArrangementTokens.Order.BY_NAME),
43-
PostStart.RuleDescription(listOf(StdArrangementTokens.EntryType.METHOD, StdArrangementTokens.Modifier.PROTECTED, StdArrangementTokens.Modifier.STATIC, StdArrangementTokens.Modifier.FINAL), StdArrangementTokens.Order.BY_NAME),
44-
PostStart.RuleDescription(listOf(StdArrangementTokens.EntryType.METHOD, StdArrangementTokens.Modifier.PRIVATE, StdArrangementTokens.Modifier.STATIC, StdArrangementTokens.Modifier.FINAL), StdArrangementTokens.Order.BY_NAME),
42+
RuleDescription(listOf(METHOD, PUBLIC, STATIC, FINAL), BY_NAME),
43+
RuleDescription(listOf(METHOD, PACKAGE_PRIVATE, STATIC, FINAL), BY_NAME),
44+
RuleDescription(listOf(METHOD, PROTECTED, STATIC, FINAL), BY_NAME),
45+
RuleDescription(listOf(METHOD, PRIVATE, STATIC, FINAL), BY_NAME),
4546

46-
PostStart.RuleDescription(listOf(StdArrangementTokens.EntryType.METHOD, StdArrangementTokens.Modifier.PUBLIC, StdArrangementTokens.Modifier.STATIC), StdArrangementTokens.Order.BY_NAME),
47-
PostStart.RuleDescription(listOf(StdArrangementTokens.EntryType.METHOD, StdArrangementTokens.Modifier.PACKAGE_PRIVATE, StdArrangementTokens.Modifier.STATIC), StdArrangementTokens.Order.BY_NAME),
48-
PostStart.RuleDescription(listOf(StdArrangementTokens.EntryType.METHOD, StdArrangementTokens.Modifier.PROTECTED, StdArrangementTokens.Modifier.STATIC), StdArrangementTokens.Order.BY_NAME),
49-
PostStart.RuleDescription(listOf(StdArrangementTokens.EntryType.METHOD, StdArrangementTokens.Modifier.PRIVATE, StdArrangementTokens.Modifier.STATIC), StdArrangementTokens.Order.BY_NAME),
50-
PostStart.RuleDescription(listOf(StdArrangementTokens.EntryType.METHOD, StdArrangementTokens.Modifier.PUBLIC, StdArrangementTokens.Modifier.FINAL), StdArrangementTokens.Order.BY_NAME),
51-
PostStart.RuleDescription(listOf(StdArrangementTokens.EntryType.METHOD, StdArrangementTokens.Modifier.PACKAGE_PRIVATE, StdArrangementTokens.Modifier.FINAL), StdArrangementTokens.Order.BY_NAME),
52-
PostStart.RuleDescription(listOf(StdArrangementTokens.EntryType.METHOD, StdArrangementTokens.Modifier.PROTECTED, StdArrangementTokens.Modifier.FINAL), StdArrangementTokens.Order.BY_NAME),
53-
PostStart.RuleDescription(listOf(StdArrangementTokens.EntryType.METHOD, StdArrangementTokens.Modifier.PRIVATE, StdArrangementTokens.Modifier.FINAL), StdArrangementTokens.Order.BY_NAME),
54-
PostStart.RuleDescription(listOf(StdArrangementTokens.EntryType.METHOD, StdArrangementTokens.Modifier.PUBLIC), StdArrangementTokens.Order.BY_NAME),
55-
PostStart.RuleDescription(listOf(StdArrangementTokens.EntryType.METHOD, StdArrangementTokens.Modifier.PACKAGE_PRIVATE), StdArrangementTokens.Order.BY_NAME),
56-
PostStart.RuleDescription(listOf(StdArrangementTokens.EntryType.METHOD, StdArrangementTokens.Modifier.PROTECTED), StdArrangementTokens.Order.BY_NAME),
57-
PostStart.RuleDescription(listOf(StdArrangementTokens.EntryType.METHOD, StdArrangementTokens.Modifier.PRIVATE), StdArrangementTokens.Order.BY_NAME),
58-
PostStart.RuleDescription(listOf(StdArrangementTokens.EntryType.METHOD), StdArrangementTokens.Order.BY_NAME),
59-
PostStart.RuleDescription(listOf(StdArrangementTokens.EntryType.ENUM), StdArrangementTokens.Order.BY_NAME),
60-
PostStart.RuleDescription(listOf(StdArrangementTokens.EntryType.INTERFACE), StdArrangementTokens.Order.BY_NAME),
61-
PostStart.RuleDescription(listOf(StdArrangementTokens.EntryType.CLASS, StdArrangementTokens.Modifier.STATIC), StdArrangementTokens.Order.BY_NAME),
62-
PostStart.RuleDescription(listOf(StdArrangementTokens.EntryType.CLASS, StdArrangementTokens.EntryType.CLASS), StdArrangementTokens.Order.BY_NAME))
47+
RuleDescription(listOf(METHOD, PUBLIC, STATIC), BY_NAME),
48+
RuleDescription(listOf(METHOD, PACKAGE_PRIVATE, STATIC), BY_NAME),
49+
RuleDescription(listOf(METHOD, PROTECTED, STATIC), BY_NAME),
50+
RuleDescription(listOf(METHOD, PRIVATE, STATIC), BY_NAME),
51+
RuleDescription(listOf(METHOD, PUBLIC, FINAL), BY_NAME),
52+
RuleDescription(listOf(METHOD, PACKAGE_PRIVATE, FINAL), BY_NAME),
53+
RuleDescription(listOf(METHOD, PROTECTED, FINAL), BY_NAME),
54+
RuleDescription(listOf(METHOD, PRIVATE, FINAL), BY_NAME),
55+
RuleDescription(listOf(METHOD, PUBLIC), BY_NAME),
56+
RuleDescription(listOf(METHOD, PACKAGE_PRIVATE), BY_NAME),
57+
RuleDescription(listOf(METHOD, PROTECTED), BY_NAME),
58+
RuleDescription(listOf(METHOD, PRIVATE), BY_NAME),
59+
RuleDescription(METHOD, BY_NAME),
60+
RuleDescription(ENUM, BY_NAME),
61+
RuleDescription(INTERFACE, BY_NAME),
62+
RuleDescription(listOf(CLASS, STATIC), BY_NAME),
63+
RuleDescription(listOf(CLASS, CLASS), BY_NAME))
6364
}
6465
}
6566

0 commit comments

Comments
 (0)