Skip to content

Commit 2a3f39f

Browse files
committed
增加了多个代码格式检查点和修复功能:
vue模板中,v-on和v-bind属性应该缩写(代码格式化时自动修复) vue模板中,v-for应当和:key一起使用 vue模板中,v-for和v-if不能出现在同一标签上 格式化代码时: kotlin文件中,具名类的左括号之后和右括号之前保留一个空白行 kotlin文件中,方法体的左括号之后和右括号之前去除空白行
1 parent d68762b commit 2a3f39f

32 files changed

+646
-214
lines changed

AegisCodeCheckPlugin.zip

21.3 KB
Binary file not shown.

resources/META-INF/plugin.xml

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
<idea-plugin>
66
<id>com.wuhao.code.check</id>
77
<name>Aegis Code Check Plugin</name>
8-
<version>1.3.0.10</version>
8+
<version>1.3.1</version>
99
<vendor email="wuhao@aegis-data.cn"/>
1010

1111
<description><![CDATA[
@@ -55,8 +55,10 @@
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.FixVueAttributesProcessor"
59-
id="FixVueAttributesProcessor" order="last"/>
58+
<preFormatProcessor implementation="com.wuhao.code.check.processors.VueAttrFixProcessor"
59+
id="VueAttrFixProcessor" order="last"/>
60+
<postFormatProcessor implementation="com.wuhao.code.check.processors.VueAttrsWhitespaceFixProcessor"
61+
id="VueAttrsWhitespaceFixProcessor" order="last"/>
6062
<postFormatProcessor implementation="com.wuhao.code.check.processors.FixVueTemplateExpressionProcessor"
6163
id="FixVueTemplateExpressionProcessor" order="first"/>
6264
<!--<postFormatProcessor implementation="com.wuhao.code.check.processors.FixJavaElementOrder"-->

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

Lines changed: 77 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,17 @@
44

55
package com.wuhao.code.check
66

7+
import com.intellij.codeInspection.LocalQuickFix
8+
import com.intellij.codeInspection.ProblemHighlightType
9+
import com.intellij.codeInspection.ProblemsHolder
710
import com.intellij.psi.PsiElement
11+
import com.intellij.psi.PsiWhiteSpace
812
import com.intellij.psi.impl.PsiElementFactoryImpl
913
import com.intellij.psi.impl.PsiManagerEx
1014
import org.jetbrains.kotlin.lexer.KtTokens
15+
import org.jetbrains.kotlin.psi.KtBlockExpression
16+
import org.jetbrains.kotlin.psi.KtNamedFunction
17+
import org.jetbrains.kotlin.psi.psiUtil.getChildOfType
1118
import java.util.logging.Logger
1219

1320

@@ -20,6 +27,76 @@ const val JUNIT_TEST_ANNOTATION_CLASS_NAME = "org.junit.Test"
2027
*/
2128
const val DEFAULT_VUE_TEMPLATE_URL = "http://git2.aegis-info.com/template/aegis-vue-template/repository/archive.zip?ref=master"
2229

30+
/**
31+
* 获取当前元素之前的第一个非空白元素
32+
*/
33+
val PsiElement.prevSiblingIgnoreWhitespace: PsiElement?
34+
get() {
35+
var sibling = this.prevSibling
36+
while (sibling != null && sibling is PsiWhiteSpace) {
37+
sibling = sibling.prevSibling
38+
}
39+
return sibling
40+
}
41+
42+
/**
43+
* 获取ktolin方法的方法体(包含括号)
44+
*/
45+
val KtNamedFunction.body: KtBlockExpression?
46+
get() {
47+
return this.getChildOfType<KtBlockExpression>()
48+
}
49+
50+
/**
51+
* 获取当前元素之前指定类型的所有同级元素
52+
* @return 符合条件的元素结合
53+
*/
54+
inline fun <reified T> PsiElement.getPrevSiblingsOfType(): List<T> {
55+
var sibling = this.prevSibling
56+
val list = arrayListOf<T>()
57+
while (sibling != null) {
58+
if (sibling is T) {
59+
list.add(sibling)
60+
}
61+
sibling = sibling.prevSibling
62+
}
63+
return list
64+
}
65+
66+
/**
67+
* 是否是父元素的第一个子元素
68+
*/
69+
val PsiElement.isFirstChild: Boolean
70+
get() {
71+
return this.parent != null && this.parent.firstChild == this
72+
}
73+
74+
/**
75+
* 注册元素错误提示信息
76+
* @param element 提示错误的元素
77+
* @param message 注册错误提示
78+
*/
79+
fun ProblemsHolder.registerError(elemenet: PsiElement, message: String) {
80+
this.registerProblem(elemenet, message, ProblemHighlightType.ERROR)
81+
}
82+
83+
/**
84+
* 注册元素错误提示信息,并提供修复方法
85+
* @param elemenet 错误元素
86+
* @param message 错误提示信息
87+
* @param fix 修复方法
88+
*/
89+
fun ProblemsHolder.registerError(elemenet: PsiElement, message: String, fix: LocalQuickFix) {
90+
this.registerProblem(elemenet, message, ProblemHighlightType.ERROR, fix)
91+
}
92+
93+
/**
94+
*
95+
*/
96+
inline fun <reified T> PsiElement.isFirstChildOfType(): Boolean {
97+
return this.parent != null && this.parent.children.firstOrNull { it is T } == this
98+
}
99+
23100
/**
24101
* 源码及资源文件基本路径
25102
*/
@@ -47,7 +124,6 @@ const val DEFAULT_INDENT_SPACE_COUNT = 2
47124
*/
48125
const val DEFAULT_CONTINUATION_INDENT_SPACE_COUNT = DEFAULT_INDENT_SPACE_COUNT * 2
49126

50-
51127
/**
52128
* 获取java psi元素的工厂类
53129
* @param element psi元素

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

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,17 @@
55
package com.wuhao.code.check
66

77
object Messages {
8-
const val commentRequired = "必须添加注释"
8+
99
const val classCommentRequired = "缺少类注释"
10+
const val commentRequired = "必须添加注释"
1011
const val fixSpace = "修复空格"
12+
const val forShort = "应该进行缩写"
13+
const val ifAndForNotTogether = "不要把 v-if 和 v-for 同时用在同一个元素上"
1114
const val jumpToInterface = "跳转至接口"
15+
const val nameMustNotLessThan2Chars = "名称不能少于2个字符"
16+
const val redundantComment = "多余的注释"
17+
const val forTagShouldHaveKeyAttr = "v-for应该与:key配合使用"
18+
const val missingAttrValue = "缺少属性值"
1219

1320
}
21+

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

Lines changed: 25 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -10,13 +10,16 @@ import com.intellij.ide.highlighter.JavaFileType
1010
import com.intellij.ide.highlighter.XmlFileType
1111
import com.intellij.ide.util.PropertiesComponent
1212
import com.intellij.lang.Language
13+
import com.intellij.lang.css.CSSLanguage
1314
import com.intellij.lang.java.JavaLanguage
1415
import com.intellij.lang.javascript.JavaScriptFileType
16+
import com.intellij.lang.javascript.JavascriptLanguage
1517
import com.intellij.lang.javascript.TypeScriptFileType
1618
import com.intellij.openapi.fileTypes.FileType
1719
import com.intellij.openapi.project.Project
1820
import com.intellij.openapi.startup.StartupActivity
1921
import com.intellij.psi.codeStyle.CodeStyleSettings
22+
import com.intellij.psi.codeStyle.LanguageCodeStyleSettingsProvider
2023
import com.intellij.psi.codeStyle.arrangement.group.ArrangementGroupingRule
2124
import com.intellij.psi.codeStyle.arrangement.match.ArrangementSectionRule
2225
import com.intellij.psi.codeStyle.arrangement.match.StdArrangementEntryMatcher
@@ -42,7 +45,7 @@ import org.jetbrains.vuejs.VueFileType
4245
import org.jetbrains.vuejs.VueLanguage
4346

4447
/**
45-
* 项目启动时运行
48+
* 项目启动时运行,主要对代码格式的配置按公司规范进行重写
4649
* @author 吴昊
4750
* @since 1.2.6
4851
*/
@@ -121,12 +124,25 @@ class PostStart : StartupActivity {
121124

122125
private fun setIndent(settings: CodeStyleSettings) {
123126
val setIndentFileTypes = listOf(
124-
JavaFileType.INSTANCE, KotlinFileType.INSTANCE, JavaScriptFileType.INSTANCE,
125-
TypeScriptFileType.INSTANCE, VueFileType.INSTANCE,
126-
XmlFileType.INSTANCE, CssFileType.INSTANCE
127+
JavaFileType.INSTANCE,
128+
KotlinFileType.INSTANCE,
129+
JavaScriptFileType.INSTANCE,
130+
TypeScriptFileType.INSTANCE,
131+
VueFileType.INSTANCE,
132+
XmlFileType.INSTANCE,
133+
CssFileType.INSTANCE
127134
)
128135
setIndentFileTypes.forEach { fileType ->
129-
setIndent(fileType, settings)
136+
val language = when (fileType) {
137+
is JavaFileType -> JavaLanguage.INSTANCE
138+
is KotlinFileType -> KotlinLanguage.INSTANCE
139+
is JavaScriptFileType -> JavascriptLanguage.INSTANCE
140+
is VueFileType -> VueLanguage.INSTANCE
141+
is CssFileType -> CSSLanguage.INSTANCE
142+
else -> null
143+
}
144+
145+
setIndent(fileType, language, settings)
130146
}
131147
}
132148

@@ -141,13 +157,16 @@ class PostStart : StartupActivity {
141157
}
142158

143159
companion object {
144-
fun setIndent(fileType: FileType, settings: CodeStyleSettings) {
160+
fun setIndent(fileType: FileType, language: Language?, settings: CodeStyleSettings) {
145161
settings.getIndentOptions(fileType).apply {
146162
INDENT_SIZE = DEFAULT_INDENT_SPACE_COUNT
147163
CONTINUATION_INDENT_SIZE = DEFAULT_CONTINUATION_INDENT_SPACE_COUNT
148164
TAB_SIZE = DEFAULT_INDENT_SPACE_COUNT
149165
USE_TAB_CHARACTER = false
150166
}
167+
if (language != null) {
168+
LanguageCodeStyleSettingsProvider.getDefaultCommonSettings(language)?.LINE_COMMENT_AT_FIRST_COLUMN = true
169+
}
151170
}
152171
}
153172

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

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,16 +36,18 @@ val KOTLIN_VALUE_ANNOTATION_PATTERN: PsiElementPattern.Capture<LeafPsiElement> =
3636
.withSuperParent(5, psiElement(KtAnnotationEntry::class.java)
3737
.withChild(psiElement(KtConstructorCalleeExpression::class.java)
3838
.withText(VALUE_ANNOTATION_NAME)))
39+
3940
/**
4041
* 是否一等kotlin属性
4142
*/
4243
fun PsiElement.isFirstLevelProperty(): Boolean {
43-
return this is KtProperty && this.parent is KtFile
44+
return this is KtProperty && this.parent is KtFile
4445
}
4546

4647
/**
4748
* 判断是否有文档型注释
4849
*/
49-
fun PsiElement.hasDocComment():Boolean {
50+
fun PsiElement.hasDocComment(): Boolean {
5051
return this.firstChild is KDoc || this.firstChild is PsiDocComment
5152
}
53+

src/com/wuhao/code/check/gotohandler/GotoSpringBootConfigPropertyDeclarationHandler.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,8 @@ import com.intellij.psi.PsiElement
1515
import com.intellij.spring.boot.SpringBootConfigFileConstants
1616
import com.wuhao.code.check.JAVA_VALUE_ANNOTATION_PATTERN
1717
import com.wuhao.code.check.RESOURCES_PATH
18-
import com.wuhao.code.check.RecursiveVisitor
1918
import com.wuhao.code.check.ancestors
19+
import com.wuhao.code.check.lang.RecursiveVisitor
2020
import org.jetbrains.kotlin.idea.refactoring.toPsiFile
2121
import org.jetbrains.yaml.psi.YAMLKeyValue
2222

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
/*
2+
* ©2009-2018 南京擎盾信息科技有限公司 All rights reserved.
3+
*/
4+
5+
package com.wuhao.code.check.inspection.fix
6+
7+
import com.intellij.codeInspection.LocalQuickFix
8+
import com.intellij.codeInspection.ProblemDescriptor
9+
import com.intellij.openapi.project.Project
10+
11+
/**
12+
* 删除元素修复
13+
* @author 吴昊
14+
* @since 1.3.1
15+
*/
16+
class DeleteFix : LocalQuickFix {
17+
18+
override fun applyFix(project: Project, descriptor: ProblemDescriptor) {
19+
descriptor.psiElement.delete()
20+
}
21+
22+
override fun getFamilyName(): String {
23+
return "删除"
24+
}
25+
26+
}
27+
Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
/*
2+
* ©2009-2018 南京擎盾信息科技有限公司 All rights reserved.
3+
*/
4+
5+
/*
6+
* ©2009-2018 南京擎盾信息科技有限公司 All rights reserved.
7+
*/
8+
9+
package com.wuhao.code.check.inspection.fix
10+
11+
import com.intellij.codeInspection.LocalQuickFix
12+
import com.intellij.codeInspection.ProblemDescriptor
13+
import com.intellij.openapi.project.Project
14+
import com.intellij.psi.PsiWhiteSpace
15+
import com.wuhao.code.check.Messages
16+
import com.wuhao.code.check.insertElementAfter
17+
import com.wuhao.code.check.insertElementBefore
18+
import org.jetbrains.kotlin.psi.KtPsiFactory
19+
20+
/**
21+
* 修复空格
22+
* @author 吴昊
23+
* @since 1.2.1
24+
*/
25+
class SpaceQuickFix(private val type: Type) : LocalQuickFix {
26+
27+
override fun applyFix(project: Project, descriptor: ProblemDescriptor) {
28+
val element = descriptor.psiElement
29+
val factory = KtPsiFactory(project)
30+
if (type == Type.BeforeParent) {
31+
element.parent.insertElementBefore(factory.createWhiteSpace(" "))
32+
}
33+
if (type in listOf(Type.Both, Type.After) && element.nextSibling !is PsiWhiteSpace) {
34+
element.insertElementAfter(factory.createWhiteSpace(" "))
35+
}
36+
if (type in listOf(Type.Both, Type.Before) && element.prevSibling !is PsiWhiteSpace) {
37+
element.insertElementBefore(factory.createWhiteSpace(" "))
38+
}
39+
}
40+
41+
override fun getFamilyName(): String {
42+
return Messages.fixSpace
43+
}
44+
45+
/**
46+
*
47+
* @author 吴昊
48+
* @since 1.2.1
49+
*/
50+
enum class Type {
51+
After,
52+
53+
AfterParent,
54+
55+
Before,
56+
57+
BeforeParent,
58+
59+
Both
60+
}
61+
62+
}
63+

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

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -69,8 +69,9 @@ class CommonCodeFormatVisitor(protected val holder: ProblemsHolder) : PsiElement
6969
val continuationIndent = styleContainer.getContinuationIndentSize(element.fileType)
7070
if (indent != DEFAULT_INDENT_SPACE_COUNT) {
7171
val indentFix = object : LocalQuickFix {
72+
7273
override fun applyFix(project: Project, descriptor: ProblemDescriptor) {
73-
PostStart.setIndent(element.fileType, CodeStyle.getSettings(element.project))
74+
PostStart.setIndent(element.fileType, element.language, CodeStyle.getSettings(element.project))
7475
}
7576

7677
override fun getFamilyName(): String {
@@ -92,5 +93,6 @@ class CommonCodeFormatVisitor(protected val holder: ProblemsHolder) : PsiElement
9293
const val CUSTOM_ATTR_PREFIX = ":"
9394
const val DIRECTIVE_PREFIX = "v-"
9495
}
96+
9597
}
9698

0 commit comments

Comments
 (0)