diff --git a/build.gradle.kts b/build.gradle.kts index 8f15b3d..16e760b 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -9,10 +9,14 @@ version = "0.0.1-SNAPSHOT" repositories { jcenter() + maven("http://nexus.devsrsouza.com.br/repository/maven-public/") } dependencies { implementation(kotlin("stdlib-jdk8")) + + api("br.com.devsrsouza.bukkript:script-definition-embedded:0.1.0-SNAPSHOT") + testCompile("junit", "junit", "4.12") } diff --git a/src/main/kotlin/br/com/devsrsouza/kotlinbukkitapi/tooling/Assets.kt b/src/main/kotlin/br/com/devsrsouza/kotlinbukkitapi/tooling/Assets.kt new file mode 100644 index 0000000..97d452c --- /dev/null +++ b/src/main/kotlin/br/com/devsrsouza/kotlinbukkitapi/tooling/Assets.kt @@ -0,0 +1,15 @@ +package br.com.devsrsouza.kotlinbukkitapi.tooling + +import com.intellij.ui.IconManager +import javax.swing.Icon + +object Assets { + private fun load(path: String): Icon { + return IconManager.getInstance().getIcon(path, Assets::class.java) + } + + private const val assetFolder = "/assets" + + val KotlinBukkitAPIIcon = + load("$assetFolder/icons/kotlinbukkitapi-icon.svg") +} \ No newline at end of file diff --git a/src/main/kotlin/br/com/devsrsouza/kotlinbukkitapi/tooling/bukkript/BukkriptCreateNewFileAction.kt b/src/main/kotlin/br/com/devsrsouza/kotlinbukkitapi/tooling/bukkript/BukkriptCreateNewFileAction.kt new file mode 100644 index 0000000..9c2200d --- /dev/null +++ b/src/main/kotlin/br/com/devsrsouza/kotlinbukkitapi/tooling/bukkript/BukkriptCreateNewFileAction.kt @@ -0,0 +1,39 @@ +package br.com.devsrsouza.kotlinbukkitapi.tooling.bukkript + +import com.intellij.ide.actions.CreateFileFromTemplateAction +import com.intellij.ide.actions.CreateFileFromTemplateDialog +import com.intellij.openapi.project.Project +import com.intellij.psi.PsiDirectory +import com.intellij.psi.PsiFile + +class BukkriptCreateNewFileAction : CreateFileFromTemplateAction( + BUKKRIPT_SCRIPT, + BUKKRIPT_DESCRIPTION, + BukkriptFileType.INSTANCE.icon +) { + override fun getActionName( + directory: PsiDirectory?, + newName: String, + templateName: String? + ): String = BUKKRIPT_CREATE_SCRIPT_DESCRIPTION + + override fun createFile( + name: String, + templateName: String, + dir: PsiDirectory + ): PsiFile? = super.createFile("$name.bk", templateName, dir) + + override fun buildDialog( + project: Project, + directory: PsiDirectory, + builder: CreateFileFromTemplateDialog.Builder + ) { + builder.setTitle(BUKKRIPT_SCRIPT) + .addKind( + BUKKRIPT_FILE, + BukkriptFileType.INSTANCE.icon, + BUKKRIPT_SCRIPT + ) + + } +} \ No newline at end of file diff --git a/src/main/kotlin/br/com/devsrsouza/kotlinbukkitapi/tooling/bukkript/BukkriptFileType.kt b/src/main/kotlin/br/com/devsrsouza/kotlinbukkitapi/tooling/bukkript/BukkriptFileType.kt new file mode 100644 index 0000000..69ac58f --- /dev/null +++ b/src/main/kotlin/br/com/devsrsouza/kotlinbukkitapi/tooling/bukkript/BukkriptFileType.kt @@ -0,0 +1,26 @@ +package br.com.devsrsouza.kotlinbukkitapi.tooling.bukkript + +import br.com.devsrsouza.kotlinbukkitapi.tooling.Assets +import com.intellij.openapi.fileTypes.LanguageFileType +import com.intellij.openapi.fileTypes.ex.FileTypeIdentifiableByVirtualFile +import com.intellij.openapi.vfs.VirtualFile +import org.jetbrains.kotlin.idea.KotlinLanguage +import javax.swing.Icon + +class BukkriptFileType : LanguageFileType(KotlinLanguage.INSTANCE), FileTypeIdentifiableByVirtualFile { + + companion object { + @JvmField + val INSTANCE = BukkriptFileType() + } + + override fun getIcon(): Icon? = Assets.KotlinBukkitAPIIcon + + override fun getName(): String = BUKKRIPT_FILE + + override fun getDefaultExtension(): String = BUKKRIPT_EXTENSION + + override fun getDescription(): String = BUKKRIPT_DESCRIPTION + + override fun isMyFileType(file: VirtualFile): Boolean = file.name.isBukkriptScript() +} \ No newline at end of file diff --git a/src/main/kotlin/br/com/devsrsouza/kotlinbukkitapi/tooling/bukkript/BukkriptIconProvider.kt b/src/main/kotlin/br/com/devsrsouza/kotlinbukkitapi/tooling/bukkript/BukkriptIconProvider.kt new file mode 100644 index 0000000..8d23781 --- /dev/null +++ b/src/main/kotlin/br/com/devsrsouza/kotlinbukkitapi/tooling/bukkript/BukkriptIconProvider.kt @@ -0,0 +1,17 @@ +package br.com.devsrsouza.kotlinbukkitapi.tooling.bukkript + +import com.intellij.ide.IconProvider +import com.intellij.openapi.project.DumbAware +import com.intellij.psi.PsiElement +import com.intellij.psi.PsiFile +import javax.swing.Icon + +class BukkriptIconProvider : IconProvider(), DumbAware { + override fun getIcon(element: PsiElement, flags: Int): Icon? { + if(element is PsiFile && element.name.isBukkriptScript()) { + return BukkriptFileType.INSTANCE.icon + } else { + return null + } + } +} \ No newline at end of file diff --git a/src/main/kotlin/br/com/devsrsouza/kotlinbukkitapi/tooling/bukkript/BukkriptScriptDefinitionProvider.kt b/src/main/kotlin/br/com/devsrsouza/kotlinbukkitapi/tooling/bukkript/BukkriptScriptDefinitionProvider.kt new file mode 100644 index 0000000..8616d9f --- /dev/null +++ b/src/main/kotlin/br/com/devsrsouza/kotlinbukkitapi/tooling/bukkript/BukkriptScriptDefinitionProvider.kt @@ -0,0 +1,32 @@ +package br.com.devsrsouza.kotlinbukkitapi.tooling.bukkript + +import org.jetbrains.kotlin.utils.PathUtil +import java.io.File +import kotlin.script.experimental.intellij.ScriptDefinitionsProvider +import br.com.devsrsouza.bukkript.script.definition.BukkriptScript + +class BukkriptScriptDefinitionProvider : ScriptDefinitionsProvider { + + companion object { + const val ID = "BukkriptScriptDefinition" + } + + override val id: String + get() = ID + + override fun getDefinitionClasses(): Iterable { + return listOf("br.com.devsrsouza.bukkript.script.definition.BukkriptScript") + } + + override fun getDefinitionsClassPath(): Iterable { + val jarFile = PathUtil.getResourcePathForClass(BukkriptScript::class.java) + + return listOf(jarFile) + } + + override fun useDiscovery(): Boolean { + return false + } + + +} \ No newline at end of file diff --git a/src/main/kotlin/br/com/devsrsouza/kotlinbukkitapi/tooling/bukkript/Const.kt b/src/main/kotlin/br/com/devsrsouza/kotlinbukkitapi/tooling/bukkript/Const.kt new file mode 100644 index 0000000..2b290fc --- /dev/null +++ b/src/main/kotlin/br/com/devsrsouza/kotlinbukkitapi/tooling/bukkript/Const.kt @@ -0,0 +1,8 @@ +package br.com.devsrsouza.kotlinbukkitapi.tooling.bukkript + +const val BUKKRIPT_EXTENSION = "bk.kts" + +const val BUKKRIPT_SCRIPT = "Bukkript Script" +const val BUKKRIPT_FILE = "Bukkript File" +const val BUKKRIPT_DESCRIPTION = "Bukkript Script File for Bukkit" +const val BUKKRIPT_CREATE_SCRIPT_DESCRIPTION = "Create Bukkript Script" \ No newline at end of file diff --git a/src/main/kotlin/br/com/devsrsouza/kotlinbukkitapi/tooling/bukkript/Utils.kt b/src/main/kotlin/br/com/devsrsouza/kotlinbukkitapi/tooling/bukkript/Utils.kt new file mode 100644 index 0000000..ab79972 --- /dev/null +++ b/src/main/kotlin/br/com/devsrsouza/kotlinbukkitapi/tooling/bukkript/Utils.kt @@ -0,0 +1,3 @@ +package br.com.devsrsouza.kotlinbukkitapi.tooling.bukkript + +fun String.isBukkriptScript() = endsWith(".$BUKKRIPT_EXTENSION", true) \ No newline at end of file diff --git a/src/main/kotlin/br/com/devsrsouza/kotlinbukkitapi/tooling/Declaration.kt b/src/main/kotlin/br/com/devsrsouza/kotlinbukkitapi/tooling/menu/Declaration.kt similarity index 82% rename from src/main/kotlin/br/com/devsrsouza/kotlinbukkitapi/tooling/Declaration.kt rename to src/main/kotlin/br/com/devsrsouza/kotlinbukkitapi/tooling/menu/Declaration.kt index 5fd066b..487e279 100644 --- a/src/main/kotlin/br/com/devsrsouza/kotlinbukkitapi/tooling/Declaration.kt +++ b/src/main/kotlin/br/com/devsrsouza/kotlinbukkitapi/tooling/menu/Declaration.kt @@ -1,4 +1,4 @@ -package br.com.devsrsouza.kotlinbukkitapi.tooling +package br.com.devsrsouza.kotlinbukkitapi.tooling.menu data class MenuDeclaration( val displayname: String, diff --git a/src/main/kotlin/br/com/devsrsouza/kotlinbukkitapi/tooling/InventoryComponent.kt b/src/main/kotlin/br/com/devsrsouza/kotlinbukkitapi/tooling/menu/InventoryComponent.kt similarity index 98% rename from src/main/kotlin/br/com/devsrsouza/kotlinbukkitapi/tooling/InventoryComponent.kt rename to src/main/kotlin/br/com/devsrsouza/kotlinbukkitapi/tooling/menu/InventoryComponent.kt index 51dd668..9791b57 100644 --- a/src/main/kotlin/br/com/devsrsouza/kotlinbukkitapi/tooling/InventoryComponent.kt +++ b/src/main/kotlin/br/com/devsrsouza/kotlinbukkitapi/tooling/menu/InventoryComponent.kt @@ -1,11 +1,10 @@ -package br.com.devsrsouza.kotlinbukkitapi.tooling +package br.com.devsrsouza.kotlinbukkitapi.tooling.menu import com.intellij.util.ImageLoader import org.jetbrains.kotlin.utils.keysToMap import java.awt.* import javax.swing.JPanel - class InventoryComponent( val declaration: MenuDeclaration ) : JPanel() { diff --git a/src/main/kotlin/br/com/devsrsouza/kotlinbukkitapi/tooling/MenuPreviewFileEditor.kt b/src/main/kotlin/br/com/devsrsouza/kotlinbukkitapi/tooling/menu/MenuPreviewFileEditor.kt similarity index 92% rename from src/main/kotlin/br/com/devsrsouza/kotlinbukkitapi/tooling/MenuPreviewFileEditor.kt rename to src/main/kotlin/br/com/devsrsouza/kotlinbukkitapi/tooling/menu/MenuPreviewFileEditor.kt index ae4b806..3c75f4c 100644 --- a/src/main/kotlin/br/com/devsrsouza/kotlinbukkitapi/tooling/MenuPreviewFileEditor.kt +++ b/src/main/kotlin/br/com/devsrsouza/kotlinbukkitapi/tooling/menu/MenuPreviewFileEditor.kt @@ -1,4 +1,4 @@ -package br.com.devsrsouza.kotlinbukkitapi.tooling +package br.com.devsrsouza.kotlinbukkitapi.tooling.menu import com.intellij.openapi.editor.event.CaretEvent import com.intellij.openapi.editor.event.CaretListener @@ -73,16 +73,17 @@ class MenuPreviewFileEditor( currentScroll = JBScrollPane( panel { tree.forEachDescendantOfType { - val declaration = findMenuDeclaration( - it, - currentSelectedLine - ) + val declaration = + findMenuDeclaration( + it, + currentSelectedLine + ) if (declaration != null) { row { component( - InventoryComponent( - declaration - ) + InventoryComponent( + declaration + ) ) } menuCount++ diff --git a/src/main/kotlin/br/com/devsrsouza/kotlinbukkitapi/tooling/MenuPreviewFileEditorProvider.kt b/src/main/kotlin/br/com/devsrsouza/kotlinbukkitapi/tooling/menu/MenuPreviewFileEditorProvider.kt similarity index 78% rename from src/main/kotlin/br/com/devsrsouza/kotlinbukkitapi/tooling/MenuPreviewFileEditorProvider.kt rename to src/main/kotlin/br/com/devsrsouza/kotlinbukkitapi/tooling/menu/MenuPreviewFileEditorProvider.kt index 125f450..69fb374 100644 --- a/src/main/kotlin/br/com/devsrsouza/kotlinbukkitapi/tooling/MenuPreviewFileEditorProvider.kt +++ b/src/main/kotlin/br/com/devsrsouza/kotlinbukkitapi/tooling/menu/MenuPreviewFileEditorProvider.kt @@ -1,11 +1,12 @@ -package br.com.devsrsouza.kotlinbukkitapi.tooling - +package br.com.devsrsouza.kotlinbukkitapi.tooling.menu +import br.com.devsrsouza.kotlinbukkitapi.tooling.bukkript.BukkriptFileType import com.intellij.openapi.fileEditor.* import com.intellij.openapi.fileEditor.impl.text.TextEditorProvider import com.intellij.openapi.project.Project import com.intellij.openapi.vfs.VirtualFile import org.jetbrains.kotlin.idea.KotlinFileType + class MenuPreviewFileEditorProvider : WeighedFileEditorProvider() { companion object { @@ -13,13 +14,13 @@ class MenuPreviewFileEditorProvider : WeighedFileEditorProvider() { } override fun getEditorTypeId(): String = - ID + ID override fun accept(project: Project, file: VirtualFile): Boolean { val type = file.fileType - if(type != KotlinFileType.INSTANCE) return false + if(type != KotlinFileType.INSTANCE && type != BukkriptFileType.INSTANCE) return false return true // return PsiManager.getInstance(project).findFile(file)?.findDescendantOfType { @@ -28,9 +29,10 @@ class MenuPreviewFileEditorProvider : WeighedFileEditorProvider() { } override fun createEditor(project: Project, file: VirtualFile): FileEditor { + println(file.canonicalPath) val editor: TextEditor = TextEditorProvider.getInstance().createEditor(project, file) as TextEditor val preview = - MenuPreviewFileEditor(project, file, editor) + MenuPreviewFileEditor(project, file, editor) return TextEditorWithPreview(editor, preview, "KotlinBukkitAPI") } diff --git a/src/main/kotlin/br/com/devsrsouza/kotlinbukkitapi/tooling/MinecraftItem.kt b/src/main/kotlin/br/com/devsrsouza/kotlinbukkitapi/tooling/menu/MinecraftItem.kt similarity index 99% rename from src/main/kotlin/br/com/devsrsouza/kotlinbukkitapi/tooling/MinecraftItem.kt rename to src/main/kotlin/br/com/devsrsouza/kotlinbukkitapi/tooling/menu/MinecraftItem.kt index de3b436..9cc4e07 100644 --- a/src/main/kotlin/br/com/devsrsouza/kotlinbukkitapi/tooling/MinecraftItem.kt +++ b/src/main/kotlin/br/com/devsrsouza/kotlinbukkitapi/tooling/menu/MinecraftItem.kt @@ -1,4 +1,4 @@ -package br.com.devsrsouza.kotlinbukkitapi.tooling +package br.com.devsrsouza.kotlinbukkitapi.tooling.menu enum class MinecraftItem(val id: Int) { AIR(0), diff --git a/src/main/kotlin/br/com/devsrsouza/kotlinbukkitapi/tooling/PsiUtils.kt b/src/main/kotlin/br/com/devsrsouza/kotlinbukkitapi/tooling/menu/PsiUtils.kt similarity index 87% rename from src/main/kotlin/br/com/devsrsouza/kotlinbukkitapi/tooling/PsiUtils.kt rename to src/main/kotlin/br/com/devsrsouza/kotlinbukkitapi/tooling/menu/PsiUtils.kt index 24f7d7c..7f2b618 100644 --- a/src/main/kotlin/br/com/devsrsouza/kotlinbukkitapi/tooling/PsiUtils.kt +++ b/src/main/kotlin/br/com/devsrsouza/kotlinbukkitapi/tooling/menu/PsiUtils.kt @@ -1,4 +1,4 @@ -package br.com.devsrsouza.kotlinbukkitapi.tooling +package br.com.devsrsouza.kotlinbukkitapi.tooling.menu import com.intellij.psi.util.collectDescendantsOfType import com.intellij.psi.util.findDescendantOfType @@ -14,14 +14,18 @@ import org.jetbrains.kotlin.idea.references.mainReference import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.types.typeUtil.isUnit +private val menuFqSupportedNames = listOf( + "br.com.devsrsouza.kotlinbukkitapi.dsl.menu.menu", + "br.com.devsrsouza.bukkript.script.definition.api.menu" +) + fun findMenuDeclaration( element: KtCallExpression, currentSelectedLine: Int? = null ): MenuDeclaration? { - val menuFqName = "br.com.devsrsouza.kotlinbukkitapi.dsl.menu.menu" val simpleName = "menu" - if (!element.isCallFrom(simpleName, menuFqName)) return null + if (!element.isCallFrom(simpleName, menuFqSupportedNames)) return null val menuFunction = element.findDescendantOfType { isMenuCall(it) @@ -36,7 +40,7 @@ fun findMenuDeclaration( it.isBuilderBlockFor("br.com.devsrsouza.kotlinbukkitapi.dsl.menu.MenuDSL") } ?: return null - val slotFqName = "br.com.devsrsouza.kotlinbukkitapi.dsl.menu.slot" + val slotFqName = listOf("br.com.devsrsouza.kotlinbukkitapi.dsl.menu.slot") val slotSimpleName = "slot" val slotCalls = menuLambdaBlock.collectDescendantsOfType { @@ -82,7 +86,7 @@ fun findMenuDeclaration( } fun isMenuCall(it: KtCallExpression) = - it.isCallFrom("menu", "br.com.devsrsouza.kotlinbukkitapi.dsl.menu.menu") + it.isCallFrom("menu", menuFqSupportedNames) fun KtLambdaExpression.isBuilderBlockFor(fqName: String): Boolean { val type = resolveType() @@ -100,7 +104,7 @@ fun KtLambdaExpression.isBuilderBlockFor(fqName: String): Boolean { fun KtCallExpression.isCallFrom( simpleName: String, - fqName: String + fqNames: List ): Boolean { - return text.startsWith(simpleName) && isMethodCall(fqName) + return text.startsWith(simpleName) && fqNames.any { isMethodCall(it) } } \ No newline at end of file diff --git a/src/main/resources/META-INF/plugin.xml b/src/main/resources/META-INF/plugin.xml index d369525..7118b69 100644 --- a/src/main/resources/META-INF/plugin.xml +++ b/src/main/resources/META-INF/plugin.xml @@ -10,10 +10,22 @@ - + + + + + + + + + + + + \ No newline at end of file diff --git a/src/main/resources/assets/icons/kotlinbukkitapi-icon.svg b/src/main/resources/assets/icons/kotlinbukkitapi-icon.svg new file mode 100644 index 0000000..3afaacc --- /dev/null +++ b/src/main/resources/assets/icons/kotlinbukkitapi-icon.svg @@ -0,0 +1 @@ +kotlinbukkitapi-logo \ No newline at end of file