From 83e9ba6480f927b358050edd84c649e8e631f6a5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=A2=81=E5=85=B8=E5=85=B8?= <413153189@qq.com> Date: Tue, 23 Apr 2024 15:57:14 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0antd=20=E8=A1=A8=E5=8D=95?= =?UTF-8?q?=E7=94=9F=E6=88=90=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CHANGELOG.md | 5 + build.gradle.kts | 19 +-- .../action/GenerateAntdFormAction.kt | 26 +++ .../salvorstool/action/GenerateDtoAction.kt | 13 +- .../action/GenerateRouterAction.kt | 12 +- .../action/GenerateServiceAction.kt | 12 +- .../dialog/GenerateAntdFormDialog.kt | 35 ++++ .../salvorstool/dialog/GenerateDtoDialog.kt | 2 +- .../itbug/salvorstool/tool/AntdFactory.kt | 112 +++++++++++++ .../salvorstool/tool/ExtendedFuntions.kt | 12 ++ .../salvorstool/tool/MyRsPsiElementManager.kt | 156 ++++++++++++++++-- .../shop/itbug/salvorstool/widget/RsEditor.kt | 5 +- .../widget/TypeJavaScriptEditor.kt | 16 ++ src/main/resources/META-INF/plugin.xml | 5 + 14 files changed, 373 insertions(+), 57 deletions(-) create mode 100644 src/main/kotlin/shop/itbug/salvorstool/action/GenerateAntdFormAction.kt create mode 100644 src/main/kotlin/shop/itbug/salvorstool/dialog/GenerateAntdFormDialog.kt create mode 100644 src/main/kotlin/shop/itbug/salvorstool/tool/AntdFactory.kt create mode 100644 src/main/kotlin/shop/itbug/salvorstool/widget/TypeJavaScriptEditor.kt diff --git a/CHANGELOG.md b/CHANGELOG.md index 1770836..b36163a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,11 @@ ## [Unreleased] +## [1.3.0] - 2024-04-23 + +- Add antd from form generation function +- 添加生成antd pro from表单功能 + ## [1.1.2] - 2024-04-19 - upload test diff --git a/build.gradle.kts b/build.gradle.kts index b190e81..51b52e7 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -5,17 +5,16 @@ plugins { } group = "shop.itbug" -version = "1.1.2" +version = "1.3.0" repositories { mavenCentral() } -// intellij { version.set("LATEST-EAP-SNAPSHOT") type.set("RR") - plugins.set(listOf("com.jetbrains.rust")) + plugins.set(listOf("com.jetbrains.rust","JavaScript")) } val pushToken: String? = System.getenv("PUBLISH_TOKEN") @@ -32,19 +31,9 @@ tasks { patchPluginXml { sinceBuild.set("232") untilBuild.set("242.*") - changeNotes.set(""" -
-

1.1.0

-

- Optimize the presentation of underlined database table names, which will be changed to camel case naming method -

-
- """.trimIndent()) } signPlugin { -// certificateChainFile.set(file("chain.crt")) -// privateKeyFile.set(file("private.key")) certificateChain.set(System.getenv("CERTIFICATE_CHAIN")) privateKey.set(System.getenv("PRIVATE_KEY")) password.set(System.getenv("PRIVATE_KEY_PASSWORD")) @@ -60,4 +49,8 @@ tasks { jvmArgs = listOf("-XX:+AllowEnhancedClassRedefinition") } + dependencies { + implementation("com.alibaba.fastjson2:fastjson2-kotlin:2.0.49") + implementation("cn.hutool:hutool-extra:5.8.27") + } } diff --git a/src/main/kotlin/shop/itbug/salvorstool/action/GenerateAntdFormAction.kt b/src/main/kotlin/shop/itbug/salvorstool/action/GenerateAntdFormAction.kt new file mode 100644 index 0000000..c3feda3 --- /dev/null +++ b/src/main/kotlin/shop/itbug/salvorstool/action/GenerateAntdFormAction.kt @@ -0,0 +1,26 @@ +package shop.itbug.salvorstool.action + +import com.intellij.openapi.actionSystem.ActionUpdateThread +import com.intellij.openapi.actionSystem.AnAction +import com.intellij.openapi.actionSystem.AnActionEvent +import shop.itbug.salvorstool.dialog.GenerateAntdFormDialog +import shop.itbug.salvorstool.tool.tryGetRsStructPsiElement + + +///生成antd表单 +class GenerateAntdFormAction : AnAction() { + override fun actionPerformed(e: AnActionEvent) { + e.tryGetRsStructPsiElement()?.let { + GenerateAntdFormDialog(e.project!!, it).show() + } + } + + override fun update(e: AnActionEvent) { + e.presentation.isVisible = e.tryGetRsStructPsiElement() != null + super.update(e) + } + + override fun getActionUpdateThread(): ActionUpdateThread { + return ActionUpdateThread.BGT + } +} diff --git a/src/main/kotlin/shop/itbug/salvorstool/action/GenerateDtoAction.kt b/src/main/kotlin/shop/itbug/salvorstool/action/GenerateDtoAction.kt index 538594e..4917824 100644 --- a/src/main/kotlin/shop/itbug/salvorstool/action/GenerateDtoAction.kt +++ b/src/main/kotlin/shop/itbug/salvorstool/action/GenerateDtoAction.kt @@ -3,21 +3,18 @@ package shop.itbug.salvorstool.action import com.intellij.openapi.actionSystem.ActionUpdateThread import com.intellij.openapi.actionSystem.AnAction import com.intellij.openapi.actionSystem.AnActionEvent -import com.intellij.openapi.actionSystem.CommonDataKeys -import org.rust.lang.core.psi.impl.RsStructItemImpl import shop.itbug.salvorstool.dialog.GenerateDtoDialog import shop.itbug.salvorstool.i18n.MyI18n -import shop.itbug.salvorstool.tool.myManager +import shop.itbug.salvorstool.tool.tryGetRsStructPsiElement class GenerateDtoAction : AnAction() { override fun actionPerformed(e: AnActionEvent) { - val psiElement = e.getData(CommonDataKeys.PSI_ELEMENT) - GenerateDtoDialog(e.project!!,psiElement as RsStructItemImpl).show() + e.tryGetRsStructPsiElement()?.let { + GenerateDtoDialog(e.project!!,it).show() + } } - override fun update(e: AnActionEvent) { - val psiElement = e.getData(CommonDataKeys.PSI_ELEMENT) - e.presentation.isVisible = e.project != null && psiElement != null && psiElement.myManager.isStruct + e.presentation.isVisible = e.project != null && e.tryGetRsStructPsiElement()!=null e.presentation.text = MyI18n.getMessage("g_dto") super.update(e) } diff --git a/src/main/kotlin/shop/itbug/salvorstool/action/GenerateRouterAction.kt b/src/main/kotlin/shop/itbug/salvorstool/action/GenerateRouterAction.kt index f6a86ab..b11e636 100644 --- a/src/main/kotlin/shop/itbug/salvorstool/action/GenerateRouterAction.kt +++ b/src/main/kotlin/shop/itbug/salvorstool/action/GenerateRouterAction.kt @@ -3,20 +3,20 @@ package shop.itbug.salvorstool.action import com.intellij.openapi.actionSystem.ActionUpdateThread import com.intellij.openapi.actionSystem.AnAction import com.intellij.openapi.actionSystem.AnActionEvent -import com.intellij.openapi.actionSystem.CommonDataKeys -import org.rust.lang.core.psi.impl.RsStructItemImpl import shop.itbug.salvorstool.dialog.GenerateRouterDialog import shop.itbug.salvorstool.i18n.MyI18n -import shop.itbug.salvorstool.tool.myManager +import shop.itbug.salvorstool.tool.tryGetRsStructPsiElement class GenerateRouterAction : AnAction() { override fun actionPerformed(e: AnActionEvent) { - GenerateRouterDialog(e.project!!,e.getData(CommonDataKeys.PSI_ELEMENT) as RsStructItemImpl).show() + e.tryGetRsStructPsiElement()?.let { + GenerateRouterDialog(e.project!!,it).show() + } + } override fun update(e: AnActionEvent) { - val psiElement = e.getData(CommonDataKeys.PSI_ELEMENT) - e.presentation.isVisible = e.project != null && psiElement != null && psiElement.myManager.isStruct + e.presentation.isVisible = e.project != null && e.tryGetRsStructPsiElement() != null e.presentation.text = MyI18n.getMessage("g_router") super.update(e) } diff --git a/src/main/kotlin/shop/itbug/salvorstool/action/GenerateServiceAction.kt b/src/main/kotlin/shop/itbug/salvorstool/action/GenerateServiceAction.kt index 4ae3026..fcfe369 100644 --- a/src/main/kotlin/shop/itbug/salvorstool/action/GenerateServiceAction.kt +++ b/src/main/kotlin/shop/itbug/salvorstool/action/GenerateServiceAction.kt @@ -3,21 +3,19 @@ package shop.itbug.salvorstool.action import com.intellij.openapi.actionSystem.ActionUpdateThread import com.intellij.openapi.actionSystem.AnAction import com.intellij.openapi.actionSystem.AnActionEvent -import com.intellij.openapi.actionSystem.CommonDataKeys -import org.rust.lang.core.psi.impl.RsStructItemImpl import shop.itbug.salvorstool.dialog.GenerateServiceDialog import shop.itbug.salvorstool.i18n.MyI18n -import shop.itbug.salvorstool.tool.myManager +import shop.itbug.salvorstool.tool.tryGetRsStructPsiElement class GenerateServiceAction : AnAction() { override fun actionPerformed(e: AnActionEvent) { - GenerateServiceDialog(e.project!!,e.getData(CommonDataKeys.PSI_ELEMENT) as RsStructItemImpl).show() + e.tryGetRsStructPsiElement()?.let { + GenerateServiceDialog(e.project!!, it).show() + } } - override fun update(e: AnActionEvent) { - val psiElement = e.getData(CommonDataKeys.PSI_ELEMENT) - e.presentation.isVisible = e.project != null && psiElement != null && psiElement.myManager.isStruct + e.presentation.isVisible = e.project != null && e.tryGetRsStructPsiElement() != null e.presentation.text = MyI18n.getMessage("g_service") super.update(e) } diff --git a/src/main/kotlin/shop/itbug/salvorstool/dialog/GenerateAntdFormDialog.kt b/src/main/kotlin/shop/itbug/salvorstool/dialog/GenerateAntdFormDialog.kt new file mode 100644 index 0000000..9bdcae8 --- /dev/null +++ b/src/main/kotlin/shop/itbug/salvorstool/dialog/GenerateAntdFormDialog.kt @@ -0,0 +1,35 @@ +package shop.itbug.salvorstool.dialog + +import com.intellij.openapi.project.Project +import com.intellij.openapi.ui.DialogWrapper +import com.intellij.ui.components.JBTabbedPane +import com.intellij.ui.dsl.builder.panel +import org.rust.lang.core.psi.impl.RsStructItemImpl +import shop.itbug.salvorstool.tool.AntdFactory +import shop.itbug.salvorstool.tool.MyFieldPsiElementManager +import shop.itbug.salvorstool.tool.myManager +import shop.itbug.salvorstool.widget.TypeJavaScriptEditor +import java.awt.Dimension +import javax.swing.JComponent + +///生成antd表单弹窗 +class GenerateAntdFormDialog(project: Project, psiElement: RsStructItemImpl) : DialogWrapper(project, true) { + + + private val tabview = JBTabbedPane() + + init { + super.init() + title = "Generate Antd Form" + + tabview.add("预览", TypeJavaScriptEditor(project, AntdFactory.generateAntdForm(psiElement))) + } + + override fun createCenterPanel(): JComponent { + return tabview + } + + override fun getPreferredSize(): Dimension { + return Dimension(500, super.getPreferredSize().height) + } +} \ No newline at end of file diff --git a/src/main/kotlin/shop/itbug/salvorstool/dialog/GenerateDtoDialog.kt b/src/main/kotlin/shop/itbug/salvorstool/dialog/GenerateDtoDialog.kt index b71a0d9..30d8ff1 100644 --- a/src/main/kotlin/shop/itbug/salvorstool/dialog/GenerateDtoDialog.kt +++ b/src/main/kotlin/shop/itbug/salvorstool/dialog/GenerateDtoDialog.kt @@ -107,7 +107,7 @@ fun GenerateDtoDialogParam.save(project: Project,psiElement: RsStructItemImpl) { ///生成dto对象 -class GenerateDtoDialog(private val project: Project,val psiElement: RsStructItemImpl) : DialogWrapper(project) { +class GenerateDtoDialog(private val project: Project, private val psiElement: RsStructItemImpl) : DialogWrapper(project) { private val model = GenerateDtoDialogParam( addRequestText = MyRsPsiFactory.generateDto(GenerateDtoDialogResultEnum.AddRequest, psiElement), diff --git a/src/main/kotlin/shop/itbug/salvorstool/tool/AntdFactory.kt b/src/main/kotlin/shop/itbug/salvorstool/tool/AntdFactory.kt new file mode 100644 index 0000000..83a5742 --- /dev/null +++ b/src/main/kotlin/shop/itbug/salvorstool/tool/AntdFactory.kt @@ -0,0 +1,112 @@ +package shop.itbug.salvorstool.tool + +import org.rust.lang.core.psi.impl.RsStructItemImpl + + +sealed class Rule +data class AntdRequiredRule(val message: String, val required: Boolean) : Rule() + +private fun Rule.generateString(): String { + return when (this) { + is AntdRequiredRule -> "{ message: '$message', required: ${if (required) "true" else "false"}}" + } +} + + +object AntdFactory { + + + ///生成form + fun generateAntdForm(psiElement: RsStructItemImpl): String { + val sb = StringBuilder() + val jsModels = psiElement.myManager.jsModelList + + //1.添加参数 + sb.appendLine( + """ + type Prop = { + trigger?: JSX.Element | undefined, + initValues?: PropInitValue | undefined + } + """.trimIndent() + ) + + //2.添加模型 + sb.appendLine("interface PropInitValue {") + jsModels.forEach { + sb.appendLine("\t\t${it.propTextString},") + } + sb.appendLine("}") + + //3.添加field + val fieldSb = StringBuilder() + + jsModels.forEach { + fieldSb.appendLine("\t\t" + generateFormItem(it)) + } + + //4.添加最外层的包装 + sb.appendLine(getTemp(fieldSb.toString())) + + return sb.toString() + } + + ///生成form item + fun generateFormItem(model: MyFieldPsiElementManager.JsModel): String { + val type = when (model.type) { + JavascriptType.Number -> "ProFormDigit" + JavascriptType.String -> "ProFormText" + JavascriptType.Bool -> "ProFormSwitch" + JavascriptType.Unknown -> "" + } + if (type.isEmpty()) { + return "" + } + + val rules = mutableListOf() + //添加rule + if (!model.isOption) { + rules.add(AntdRequiredRule(message = "请输入${model.comment ?: "内容"}", required = true)) + } + + return "<$type name='${model.fieldName}' label='${model.comment ?: ""}' ${generateRulesText(rules)} \t\t/>" + } + + ///生成规则 + private fun generateRulesText(rules: List): String { + if (rules.isEmpty()) { + return "" + } + val sb = StringBuilder() + sb.appendLine("rules={[") + rules.forEach { + sb.appendLine("\t\t\t\t\t" + it.generateString()) + } + sb.appendLine("\t\t\t]}") + return sb.toString() + } + +} + + +///模板引擎 +private fun getTemp(field: String): String = """ +const AddOrUpdateForm: React.FC = (props) => { + let isUpdate = props.initValues !== undefined + //提交数据 + const onFinish = async (values: PropInitValue) => { + if(isUpdate) { + // Todo! 修改 + }else{ + // ToDo! 新增 + } + return true + } + return ( + trigger={props.trigger} initialValues={props.initValues} onFinish={onFinish}> + $field + + ); +}; +export {AddOrUpdateForm} +""".trimIndent() \ No newline at end of file diff --git a/src/main/kotlin/shop/itbug/salvorstool/tool/ExtendedFuntions.kt b/src/main/kotlin/shop/itbug/salvorstool/tool/ExtendedFuntions.kt index 67f09c5..8fd5e2e 100644 --- a/src/main/kotlin/shop/itbug/salvorstool/tool/ExtendedFuntions.kt +++ b/src/main/kotlin/shop/itbug/salvorstool/tool/ExtendedFuntions.kt @@ -1,6 +1,8 @@ package shop.itbug.salvorstool.tool import com.google.common.base.CaseFormat +import com.intellij.openapi.actionSystem.AnActionEvent +import com.intellij.openapi.actionSystem.CommonDataKeys import com.intellij.psi.PsiElement import org.rust.lang.core.psi.RsNamedFieldDecl import org.rust.lang.core.psi.RsOuterAttr @@ -22,4 +24,14 @@ val String.underlineToCamel: String get() = underlineToCamel(this) ///将驼峰变成下划线 fun underlineToCamel(underlineString: String): String { return CaseFormat.LOWER_UNDERSCORE.to(CaseFormat.LOWER_CAMEL, underlineString) +} + + + +fun AnActionEvent.tryGetRsStructPsiElement(): RsStructItemImpl? { + val psiElement = this.getData(CommonDataKeys.PSI_ELEMENT) + if ( psiElement != null && psiElement.myManager.isStruct) { + return psiElement as? RsStructItemImpl + } + return null } \ No newline at end of file diff --git a/src/main/kotlin/shop/itbug/salvorstool/tool/MyRsPsiElementManager.kt b/src/main/kotlin/shop/itbug/salvorstool/tool/MyRsPsiElementManager.kt index 279c932..b3dca84 100644 --- a/src/main/kotlin/shop/itbug/salvorstool/tool/MyRsPsiElementManager.kt +++ b/src/main/kotlin/shop/itbug/salvorstool/tool/MyRsPsiElementManager.kt @@ -1,13 +1,34 @@ package shop.itbug.salvorstool.tool +import com.intellij.psi.PsiComment import com.intellij.psi.PsiElement +import com.intellij.psi.impl.source.tree.PsiCommentImpl +import com.intellij.psi.util.PsiTreeUtil +import com.intellij.psi.util.firstLeaf +import com.intellij.psi.util.lastLeaf +import org.rust.lang.core.parser.RustDocTestInjectableParserDefinition import org.rust.lang.core.psi.RsMetaItem import org.rust.lang.core.psi.RsNamedFieldDecl import org.rust.lang.core.psi.RsOuterAttr +import org.rust.lang.core.psi.RsTypeArgumentList +import org.rust.lang.core.psi.ext.elementType import org.rust.lang.core.psi.ext.stringValue import org.rust.lang.core.psi.impl.RsNamedFieldDeclImpl +import org.rust.lang.core.psi.impl.RsPathTypeImpl import org.rust.lang.core.psi.impl.RsStructItemImpl +import org.rust.lang.doc.psi.RsDocTokenType +import org.rust.lang.doc.psi.impl.RsDocCommentImpl +val JavascriptType.typeScriptText get() = when (this) { + JavascriptType.Number -> "number" + JavascriptType.String -> "string" + JavascriptType.Bool -> "bool" + JavascriptType.Unknown -> "any" +} +//rs属性类型对应的js类型 +enum class JavascriptType { + Number, String, Bool, Unknown +} /// psi操作管理 class MyRsPsiElementManager(context: PsiElement) { @@ -27,33 +48,73 @@ class MyRsStructManager(private val psiElement: RsStructItemImpl) { val structName: String? = psiElement.name ///获取表明 - val getTableName : String? get() { - val outerAttr = psiElement.outerAttrList.find { it.myManager.getSeaOrmTabName != null } - ?: return null - val tabName = outerAttr.myManager.getSeaOrmTabName - return tabName - } + val getTableName: String? + get() { + val outerAttr = psiElement.outerAttrList.find { it.myManager.getSeaOrmTabName != null } + ?: return null + val tabName = outerAttr.myManager.getSeaOrmTabName + return tabName + } ///主键字段 val primaryField = fieldList.find { it.myManager.isPrimaryKey } -} + ///js 模型列表 + val jsModelList: List = + fieldList.mapNotNull { it.myManager.getJsModel } - -/// +} ///属性处理 class MyFieldPsiElementManager(private val psiElement: RsNamedFieldDecl) { - ///是否为主键的字段 val isPrimaryKey = hasMetaItem("sea_orm") { it.text == "primary_key" } ///参数字段 val name: String? = psiElement.name - val typeString: String? = psiElement.typeReference?.text + ///获取注释 + private val comment: String? + get() { + //判断// + val comm = PsiTreeUtil.getChildOfType(psiElement, PsiCommentImpl::class.java) + if (comm != null) { + return comm.text.replace("//","") + } + val docPsi = PsiTreeUtil.getChildOfType(psiElement, RsDocCommentImpl::class.java) + //判断/// + if (docPsi != null && docPsi.lastLeaf.elementType is RsDocTokenType) { + return docPsi.lastLeaf.text + } + return null + } + + ///参数类型文本 + val typeString: String? + get() { + if (isOption) { + val typeList = typeArgumentList?.typeReferenceList + if (!typeList.isNullOrEmpty()) { + return null + } else if (typeList != null && typeList.size == 1) { + return typeList.first().text + } + return null + } + return psiElement.typeReference?.text + } + + ///判断是否为可空的属性,比如Option return true + private val isOption: Boolean get() = typeArgumentList != null + + /// Option 获取 + private val typeArgumentList: RsTypeArgumentList? + get() = PsiTreeUtil.findChildOfType( + psiElement, + RsPathTypeImpl::class.java + )?.path?.typeArgumentList ///获取字段文本(除了宏以外) val getSimpleText: String @@ -66,6 +127,25 @@ class MyFieldPsiElementManager(private val psiElement: RsNamedFieldDecl) { return text } + //获取JavaScript类型 + private val javaScriptType: JavascriptType + get() { + if (typeString == null) { + return JavascriptType.Unknown + } + if (isIntegerType(typeString!!) == true) { + return JavascriptType.Number + } + if (isStringType(typeString!!) == true) { + return JavascriptType.String + } + if (typeString == "bool") { + return JavascriptType.Bool + } + return JavascriptType.Unknown + } + + ///查找meta fun hasMetaItem(filter: (item: RsMetaItem) -> Boolean): Boolean { val outerAttrList = psiElement.outerAttrList @@ -84,7 +164,7 @@ class MyFieldPsiElementManager(private val psiElement: RsNamedFieldDecl) { } ///查找meta,比较精确的查找 - fun hasMetaItem(name: String, filter: (item: RsMetaItem) -> Boolean): Boolean { + private fun hasMetaItem(name: String, filter: (item: RsMetaItem) -> Boolean): Boolean { val find = psiElement.outerAttrList.find { it.myManager.isMeta(name) } ?: return false val args = find.metaItem.metaItemArgs args?.metaItemList?.forEach { meta -> @@ -97,14 +177,54 @@ class MyFieldPsiElementManager(private val psiElement: RsNamedFieldDecl) { } return false } + + //判断是整形 + private fun isIntegerType(rustType: String): Boolean? { + val integerRegex = Regex("""^(i|u)\d+$""") + return if (rustType.matches(integerRegex)) { + true + } else { + null + } + } + + //判断是字符串 + private fun isStringType(rustType: String): Boolean? { + return if (rustType == "String" || rustType == "&str") { + true + } else { + null + } + } + + data class JsModel(val type: JavascriptType, val fieldName: String, val comment: String?,val isOption: Boolean) + + val getJsModel: JsModel? + get() { + if (javaScriptType == JavascriptType.Unknown) { + return null + } else if (name == null) { + return null + } + return JsModel(javaScriptType, name, comment = comment,isOption = isOption) + } } + +val MyFieldPsiElementManager.JsModel.propTextString : String get() { + if(this.isOption) { + return "${fieldName}: ${type.typeScriptText} | undefined" + } + return "${fieldName}: ${type.typeScriptText}" +} + + class MyRsOuterAttrPsiElementManager(private val psiElement: RsOuterAttr) { - val args = psiElement.metaItem.metaItemArgs - val argItems = args?.metaItemList ?: emptyList() - val getSeaOrmTabName = getArgString("sea_orm","table_name") + private val args = psiElement.metaItem.metaItemArgs + private val argItems = args?.metaItemList ?: emptyList() + val getSeaOrmTabName = getArgString("sea_orm", "table_name") ///判断是不是某个宏 fun isMeta(name: String): Boolean { @@ -113,7 +233,7 @@ class MyRsOuterAttrPsiElementManager(private val psiElement: RsOuterAttr) { ///查找meta,比较精确的查找 - fun hasMetaItem(name: String, filter: (item: RsMetaItem) -> Boolean): Boolean { + private fun hasMetaItem(name: String, filter: (item: RsMetaItem) -> Boolean): Boolean { if (!isMeta(name)) return false argItems.forEach { meta -> run { @@ -126,7 +246,7 @@ class MyRsOuterAttrPsiElementManager(private val psiElement: RsOuterAttr) { return false } - fun getArgPsiElement(name: String, attr: String): RsMetaItem? { + private fun getArgPsiElement(name: String, attr: String): RsMetaItem? { if (!hasMetaItem(name) { it.path?.text == attr }) return null argItems.forEach { if (it.path?.text == attr) { @@ -143,7 +263,7 @@ class MyRsOuterAttrPsiElementManager(private val psiElement: RsOuterAttr) { * 传参: "sea_orm","table_name" * 返回: "users" */ - fun getArgString(name: String, attr: String): String? { + private fun getArgString(name: String, attr: String): String? { val psi = getArgPsiElement(name, attr) if (psi != null) { return psi.litExpr?.stringValue diff --git a/src/main/kotlin/shop/itbug/salvorstool/widget/RsEditor.kt b/src/main/kotlin/shop/itbug/salvorstool/widget/RsEditor.kt index 387ed89..77fe09c 100644 --- a/src/main/kotlin/shop/itbug/salvorstool/widget/RsEditor.kt +++ b/src/main/kotlin/shop/itbug/salvorstool/widget/RsEditor.kt @@ -8,16 +8,13 @@ import org.rust.lang.RsLanguage import javax.swing.BorderFactory class RsEditor(project: Project, initText: String) : LanguageTextField(Language.findInstance(RsLanguage::class.java),project,initText,false) { - init { - border = BorderFactory.createEmptyBorder(0, 0, 0, 0) - } override fun createEditor(): EditorEx { return myCreateEditor(super.createEditor()) } } -private fun myCreateEditor(ex: EditorEx): EditorEx { + fun myCreateEditor(ex: EditorEx): EditorEx { ex.setVerticalScrollbarVisible(true) ex.setHorizontalScrollbarVisible(true) ex.setBorder(null) diff --git a/src/main/kotlin/shop/itbug/salvorstool/widget/TypeJavaScriptEditor.kt b/src/main/kotlin/shop/itbug/salvorstool/widget/TypeJavaScriptEditor.kt new file mode 100644 index 0000000..f88b79d --- /dev/null +++ b/src/main/kotlin/shop/itbug/salvorstool/widget/TypeJavaScriptEditor.kt @@ -0,0 +1,16 @@ +package shop.itbug.salvorstool.widget + +import com.intellij.lang.Language +import com.intellij.lang.javascript.dialects.TypeScriptJSXLanguageDialect +import com.intellij.openapi.editor.ex.EditorEx +import com.intellij.openapi.project.Project +import com.intellij.ui.LanguageTextField +import org.rust.lang.RsLanguage + +/// type script 编辑器 +class TypeJavaScriptEditor(project: Project,initText: String) : LanguageTextField(Language.findInstance( + TypeScriptJSXLanguageDialect::class.java),project,initText,false) { + override fun createEditor(): EditorEx { + return myCreateEditor(super.createEditor()) + } +} diff --git a/src/main/resources/META-INF/plugin.xml b/src/main/resources/META-INF/plugin.xml index 558d7ee..98da810 100644 --- a/src/main/resources/META-INF/plugin.xml +++ b/src/main/resources/META-INF/plugin.xml @@ -7,6 +7,7 @@ ]]> com.intellij.modules.platform com.jetbrains.rust + JavaScript messages.pluginBundle @@ -21,5 +22,9 @@ + + + \ No newline at end of file