Skip to content

Commit d68762b

Browse files
committed
优化代码,优化kotlin空格计算及排序
1 parent f159cf2 commit d68762b

19 files changed

+459
-325
lines changed

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

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import com.intellij.lang.Language
1313
import com.intellij.lang.java.JavaLanguage
1414
import com.intellij.lang.javascript.JavaScriptFileType
1515
import com.intellij.lang.javascript.TypeScriptFileType
16+
import com.intellij.openapi.fileTypes.FileType
1617
import com.intellij.openapi.project.Project
1718
import com.intellij.openapi.startup.StartupActivity
1819
import com.intellij.psi.codeStyle.CodeStyleSettings
@@ -125,13 +126,7 @@ class PostStart : StartupActivity {
125126
XmlFileType.INSTANCE, CssFileType.INSTANCE
126127
)
127128
setIndentFileTypes.forEach { fileType ->
128-
settings.getIndentOptions(fileType)
129-
.apply {
130-
INDENT_SIZE = DEFAULT_INDENT_SPACE_COUNT
131-
CONTINUATION_INDENT_SIZE = DEFAULT_CONTINUATION_INDENT_SPACE_COUNT
132-
TAB_SIZE = DEFAULT_INDENT_SPACE_COUNT
133-
USE_TAB_CHARACTER = false
134-
}
129+
setIndent(fileType, settings)
135130
}
136131
}
137132

@@ -145,5 +140,16 @@ class PostStart : StartupActivity {
145140
}
146141
}
147142

143+
companion object {
144+
fun setIndent(fileType: FileType, settings: CodeStyleSettings) {
145+
settings.getIndentOptions(fileType).apply {
146+
INDENT_SIZE = DEFAULT_INDENT_SPACE_COUNT
147+
CONTINUATION_INDENT_SIZE = DEFAULT_CONTINUATION_INDENT_SPACE_COUNT
148+
TAB_SIZE = DEFAULT_INDENT_SPACE_COUNT
149+
USE_TAB_CHARACTER = false
150+
}
151+
}
152+
}
153+
148154
}
149155

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

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,20 +6,21 @@ package com.wuhao.code.check
66

77
import com.intellij.psi.PsiElement
88
import com.intellij.psi.PsiElementVisitor
9+
import com.intellij.psi.PsiRecursiveVisitor
910

1011
/**
1112
* 递归访问psi元素
1213
* @author 吴昊
1314
* @since 1.2
1415
*/
15-
abstract class RecursiveVisitor : PsiElementVisitor() {
16-
17-
abstract override fun visitElement(element: PsiElement)
16+
abstract class RecursiveVisitor : PsiElementVisitor(), PsiRecursiveVisitor {
1817

1918
fun visit(element: PsiElement) {
2019
recursiveVisit(element)
2120
}
2221

22+
abstract override fun visitElement(element: PsiElement)
23+
2324
private fun recursiveVisit(element: PsiElement) {
2425
visitElement(element)
2526
element.children.forEach {

src/com/wuhao/code/check/inspection/CodeFormatVisitor.kt

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ import com.wuhao.code.check.inspection.visitor.*
1515
open class CodeFormatVisitor(holder: ProblemsHolder) : PsiElementVisitor() {
1616

1717
private val visitors = listOf(
18+
CommonCodeFormatVisitor(holder),
1819
JavaOrKotlinCodeFormatVisitor(holder),
1920
JavaCodeFormatVisitor(holder),
2021
KotlinCodeFormatVisitor(holder),
@@ -26,9 +27,10 @@ open class CodeFormatVisitor(holder: ProblemsHolder) : PsiElementVisitor() {
2627
override fun visitElement(element: PsiElement) {
2728
super.visitElement(element)
2829
visitors.forEach { visitor ->
29-
if (visitor.support(element.language)) {
30-
visitor.visit(element)
30+
if (visitor is BaseCodeFormatVisitor && visitor is PsiElementVisitor && visitor.support(element.language)) {
31+
element.accept(visitor)
3132
}
3233
}
3334
}
3435
}
36+

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

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ import com.intellij.psi.xml.XmlAttribute
1212
import com.intellij.psi.xml.XmlDocument
1313
import com.intellij.psi.xml.XmlTag
1414
import com.wuhao.code.check.ancestors
15-
import com.wuhao.code.check.inspection.visitor.BaseCodeFormatVisitor
15+
import com.wuhao.code.check.inspection.visitor.CommonCodeFormatVisitor
1616
import org.jetbrains.kotlin.psi.KtPsiFactory
1717

1818
/**
@@ -87,23 +87,23 @@ class VueTemplateTagFix(private val sortedAttributes: List<XmlAttribute>) : Loca
8787
-1
8888
} else if (attr2.value == null) {
8989
1
90-
} else if (nameList.any { it.startsWith(BaseCodeFormatVisitor.DIRECTIVE_PREFIX) }) {
91-
comparePrefix(nameList, BaseCodeFormatVisitor.DIRECTIVE_PREFIX)
90+
} else if (nameList.any { it.startsWith(CommonCodeFormatVisitor.DIRECTIVE_PREFIX) }) {
91+
comparePrefix(nameList, CommonCodeFormatVisitor.DIRECTIVE_PREFIX)
9292
} else if (nameList.any {
93-
!it.startsWith(BaseCodeFormatVisitor.CUSTOM_ATTR_PREFIX) && !it.startsWith(BaseCodeFormatVisitor.ACTION_PREFIX)
93+
!it.startsWith(CommonCodeFormatVisitor.CUSTOM_ATTR_PREFIX) && !it.startsWith(CommonCodeFormatVisitor.ACTION_PREFIX)
9494
}) {
95-
if (!name1.startsWith(BaseCodeFormatVisitor.CUSTOM_ATTR_PREFIX) && !name1.startsWith(BaseCodeFormatVisitor.ACTION_PREFIX)
96-
&& !name2.startsWith(BaseCodeFormatVisitor.CUSTOM_ATTR_PREFIX) && !name2.startsWith(BaseCodeFormatVisitor.ACTION_PREFIX)) {
95+
if (!name1.startsWith(CommonCodeFormatVisitor.CUSTOM_ATTR_PREFIX) && !name1.startsWith(CommonCodeFormatVisitor.ACTION_PREFIX)
96+
&& !name2.startsWith(CommonCodeFormatVisitor.CUSTOM_ATTR_PREFIX) && !name2.startsWith(CommonCodeFormatVisitor.ACTION_PREFIX)) {
9797
name1.compareTo(name2)
98-
} else if (!name1.startsWith(BaseCodeFormatVisitor.CUSTOM_ATTR_PREFIX) && !name1.startsWith(BaseCodeFormatVisitor.ACTION_PREFIX)) {
98+
} else if (!name1.startsWith(CommonCodeFormatVisitor.CUSTOM_ATTR_PREFIX) && !name1.startsWith(CommonCodeFormatVisitor.ACTION_PREFIX)) {
9999
-1
100100
} else {
101101
1
102102
}
103-
} else if (nameList.any { it.startsWith(BaseCodeFormatVisitor.CUSTOM_ATTR_PREFIX) }) {
104-
comparePrefix(nameList, BaseCodeFormatVisitor.CUSTOM_ATTR_PREFIX)
105-
} else if (nameList.any { it.startsWith(BaseCodeFormatVisitor.ACTION_PREFIX) }) {
106-
comparePrefix(nameList, BaseCodeFormatVisitor.ACTION_PREFIX)
103+
} else if (nameList.any { it.startsWith(CommonCodeFormatVisitor.CUSTOM_ATTR_PREFIX) }) {
104+
comparePrefix(nameList, CommonCodeFormatVisitor.CUSTOM_ATTR_PREFIX)
105+
} else if (nameList.any { it.startsWith(CommonCodeFormatVisitor.ACTION_PREFIX) }) {
106+
comparePrefix(nameList, CommonCodeFormatVisitor.ACTION_PREFIX)
107107
} else {
108108
0
109109
}

src/com/wuhao/code/check/inspection/visitor/BaseCodeFormatVisitor.kt

Lines changed: 10 additions & 73 deletions
Original file line numberDiff line numberDiff line change
@@ -4,84 +4,21 @@
44

55
package com.wuhao.code.check.inspection.visitor
66

7-
import com.intellij.application.options.CodeStyle
8-
import com.intellij.application.options.JavaCodeStyleSettingsProvider
9-
import com.intellij.codeInspection.LocalQuickFix
10-
import com.intellij.codeInspection.ProblemDescriptor
11-
import com.intellij.codeInspection.ProblemHighlightType
12-
import com.intellij.codeInspection.ProblemsHolder
137
import com.intellij.lang.Language
14-
import com.intellij.openapi.options.newEditor.SettingsDialogFactory
15-
import com.intellij.openapi.project.Project
16-
import com.intellij.psi.PsiElement
17-
import com.intellij.psi.PsiFile
18-
import com.intellij.psi.codeStyle.JavaCodeStyleSettings
19-
import com.wuhao.code.check.DEFAULT_CONTINUATION_INDENT_SPACE_COUNT
20-
import com.wuhao.code.check.DEFAULT_INDENT_SPACE_COUNT
21-
import com.wuhao.code.check.inspection.checker.ClassCommentChecker
22-
import java.nio.charset.StandardCharsets
238

249
/**
25-
* 基本的代码格式检查访问器,主要检查了文件缩进及文件编码
26-
* 文件缩进强制为2个空格,持续缩进为4个空格,文件编码为UTF-8
27-
*
28-
* Created by 吴昊 on 18-4-26.
10+
* 代码格式检查访问器基础接口
2911
* @author 吴昊
30-
* @since 1.1
12+
* @since 1.3.2
3113
*/
32-
abstract class BaseCodeFormatVisitor(protected val holder: ProblemsHolder) {
14+
interface BaseCodeFormatVisitor {
3315

34-
protected val classCommentChecker = ClassCommentChecker(holder)
16+
/**
17+
* 访问器是否支持某种语言
18+
* @param language 所要检查的语言
19+
* @return 如果支持该语言返回true,不支持返回false
20+
*/
21+
fun support(language: Language): Boolean
3522

36-
protected abstract fun visitElement(element: PsiElement)
37-
38-
private fun checkIndent(element: PsiElement) {
39-
if (element is PsiFile) {
40-
val styleContainer = JavaCodeStyleSettings.getInstance(element.project)
41-
.container
42-
val indent = styleContainer.getIndentSize(element.fileType)
43-
val continuationIndent = styleContainer.getContinuationIndentSize(element.fileType)
44-
if (indent != DEFAULT_INDENT_SPACE_COUNT) {
45-
holder.registerProblem(element, "${element.fileType.name}文件的缩进必须为${DEFAULT_INDENT_SPACE_COUNT}个空格",
46-
ProblemHighlightType.ERROR, object : LocalQuickFix {
47-
override fun getFamilyName(): String {
48-
return "打开设置"
49-
}
50-
51-
override fun applyFix(project: Project, descriptor: ProblemDescriptor) {
52-
SettingsDialogFactory.getInstance().create(project, "", JavaCodeStyleSettingsProvider().createSettingsPage(
53-
CodeStyle.getDefaultSettings(), CodeStyle.getDefaultSettings()
54-
), true, false).show()
55-
}
56-
})
57-
}
58-
if (continuationIndent != DEFAULT_CONTINUATION_INDENT_SPACE_COUNT) {
59-
holder.registerProblem(element, "${element.fileType.name}文件的持续缩进必须为${DEFAULT_CONTINUATION_INDENT_SPACE_COUNT}个空格",
60-
ProblemHighlightType.ERROR)
61-
}
62-
}
63-
64-
}
65-
66-
abstract fun support(language: Language): Boolean
67-
68-
fun visit(element: PsiElement) {
69-
this.checkEncoding(element)
70-
this.checkIndent(element)
71-
this.visitElement(element)
72-
}
73-
74-
private fun checkEncoding(element: PsiElement) {
75-
if (element is PsiFile && element.virtualFile != null && element.virtualFile.charset != StandardCharsets.UTF_8) {
76-
holder.registerProblem(element, "${element.name}的编码为${element.virtualFile.charset},应该使用UTF-8",
77-
ProblemHighlightType.ERROR)
78-
}
79-
}
80-
81-
companion object {
82-
const val MAX_TEMPLATE_LINES = 150
83-
const val DIRECTIVE_PREFIX = "v-"
84-
const val ACTION_PREFIX = "@"
85-
const val CUSTOM_ATTR_PREFIX = ":"
86-
}
8723
}
24+
Lines changed: 96 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,96 @@
1+
/*
2+
* ©2009-2018 南京擎盾信息科技有限公司 All rights reserved.
3+
*/
4+
5+
package com.wuhao.code.check.inspection.visitor
6+
7+
import com.intellij.application.options.CodeStyle
8+
import com.intellij.codeInspection.LocalQuickFix
9+
import com.intellij.codeInspection.ProblemDescriptor
10+
import com.intellij.codeInspection.ProblemHighlightType
11+
import com.intellij.codeInspection.ProblemsHolder
12+
import com.intellij.lang.Language
13+
import com.intellij.lang.java.JavaLanguage
14+
import com.intellij.lang.javascript.JavascriptLanguage
15+
import com.intellij.lang.javascript.dialects.ECMA6LanguageDialect
16+
import com.intellij.lang.javascript.dialects.TypeScriptLanguageDialect
17+
import com.intellij.openapi.project.Project
18+
import com.intellij.psi.PsiElement
19+
import com.intellij.psi.PsiElementVisitor
20+
import com.intellij.psi.PsiFile
21+
import com.intellij.psi.codeStyle.JavaCodeStyleSettings
22+
import com.wuhao.code.check.DEFAULT_CONTINUATION_INDENT_SPACE_COUNT
23+
import com.wuhao.code.check.DEFAULT_INDENT_SPACE_COUNT
24+
import com.wuhao.code.check.PostStart
25+
import org.apache.xmlbeans.XmlLanguage
26+
import org.jetbrains.kotlin.idea.KotlinLanguage
27+
import org.jetbrains.vuejs.VueLanguage
28+
import org.jetbrains.vuejs.language.VueJSLanguage
29+
import java.nio.charset.StandardCharsets
30+
31+
/**
32+
* 基本的代码格式检查访问器,主要检查了文件缩进及文件编码
33+
* 文件缩进强制为2个空格,持续缩进为4个空格,文件编码为UTF-8
34+
*
35+
* Created by 吴昊 on 18-4-26.
36+
* @author 吴昊
37+
* @since 1.1
38+
*/
39+
class CommonCodeFormatVisitor(protected val holder: ProblemsHolder) : PsiElementVisitor(), BaseCodeFormatVisitor {
40+
41+
override fun support(language: Language): Boolean {
42+
return language is KotlinLanguage
43+
|| language is JavaLanguage
44+
|| language is JavascriptLanguage
45+
|| language is TypeScriptLanguageDialect
46+
|| language is ECMA6LanguageDialect
47+
|| language is VueLanguage
48+
|| language is XmlLanguage
49+
|| language is VueJSLanguage
50+
}
51+
52+
override fun visitFile(file: PsiFile) {
53+
this.checkEncoding(file)
54+
this.checkIndent(file)
55+
}
56+
57+
private fun checkEncoding(element: PsiElement) {
58+
if (element is PsiFile && element.virtualFile != null && element.virtualFile.charset != StandardCharsets.UTF_8) {
59+
holder.registerProblem(element, "${element.name}的编码为${element.virtualFile.charset},应该使用UTF-8",
60+
ProblemHighlightType.ERROR)
61+
}
62+
}
63+
64+
private fun checkIndent(element: PsiElement) {
65+
if (element is PsiFile) {
66+
val styleContainer = JavaCodeStyleSettings.getInstance(element.project)
67+
.container
68+
val indent = styleContainer.getIndentSize(element.fileType)
69+
val continuationIndent = styleContainer.getContinuationIndentSize(element.fileType)
70+
if (indent != DEFAULT_INDENT_SPACE_COUNT) {
71+
val indentFix = object : LocalQuickFix {
72+
override fun applyFix(project: Project, descriptor: ProblemDescriptor) {
73+
PostStart.setIndent(element.fileType, CodeStyle.getSettings(element.project))
74+
}
75+
76+
override fun getFamilyName(): String {
77+
return "设置缩进"
78+
}
79+
}
80+
holder.registerProblem(element, "${element.fileType.name}文件的缩进必须为${DEFAULT_INDENT_SPACE_COUNT}个空格",
81+
ProblemHighlightType.ERROR, indentFix)
82+
}
83+
if (continuationIndent != DEFAULT_CONTINUATION_INDENT_SPACE_COUNT) {
84+
holder.registerProblem(element, "${element.fileType.name}文件的持续缩进必须为${DEFAULT_CONTINUATION_INDENT_SPACE_COUNT}个空格",
85+
ProblemHighlightType.ERROR)
86+
}
87+
}
88+
}
89+
90+
companion object {
91+
const val ACTION_PREFIX = "@"
92+
const val CUSTOM_ATTR_PREFIX = ":"
93+
const val DIRECTIVE_PREFIX = "v-"
94+
}
95+
}
96+

0 commit comments

Comments
 (0)