diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 23514298..44e2cde0 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -25,16 +25,12 @@ jobs: - name: Fetch Sources uses: actions/checkout@v4 - # Validate wrapper - - name: Gradle Wrapper Validation - uses: gradle/actions/wrapper-validation@v3 - # Set up Java environment for the next steps - name: Setup Java uses: actions/setup-java@v4 with: distribution: zulu - java-version: 17 + java-version: 21 # Setup Gradle - name: Setup Gradle @@ -83,7 +79,7 @@ jobs: uses: actions/setup-java@v4 with: distribution: zulu - java-version: 17 + java-version: 21 # Setup Gradle - name: Setup Gradle @@ -98,7 +94,7 @@ jobs: if: ${{ failure() }} uses: actions/upload-artifact@v4 with: - name: tests-result + name: tests-result-${{ matrix.os }} path: ${{ github.workspace }}/build/reports/tests # Run plugin structure verification along with IntelliJ Plugin Verifier @@ -108,6 +104,13 @@ jobs: runs-on: ubuntu-latest steps: + # Free GitHub Actions Environment Disk Space + - name: Maximize Build Space + uses: jlumbroso/free-disk-space@v1.3.1 + with: + tool-cache: false + large-packages: false + # Check out the current repository - name: Fetch Sources uses: actions/checkout@v4 @@ -117,12 +120,19 @@ jobs: uses: actions/setup-java@v4 with: distribution: zulu - java-version: 17 + java-version: 21 # Setup Gradle - name: Setup Gradle uses: gradle/actions/setup-gradle@v4 + # Cache Plugin Verifier IDEs + - name: Setup Plugin Verifier IDEs Cache + uses: actions/cache@v4 + with: + path: ${{ needs.build.outputs.pluginVerifierHomeDir }}/ides + key: plugin-verifier-${{ hashFiles('build/listProductsReleases.txt') }} + # Run Verify Plugin task and IntelliJ Plugin Verifier tool - name: Run Plugin Verification tasks run: ./gradlew verifyPlugin -Dplugin.verifier.home.dir=${{ needs.build.outputs.pluginVerifierHomeDir }} @@ -133,4 +143,4 @@ jobs: uses: actions/upload-artifact@v4 with: name: pluginVerifier-result - path: ${{ github.workspace }}/build/reports/pluginVerifier + path: ${{ github.workspace }}/build/reports/pluginVerifier \ No newline at end of file diff --git a/.run/Run Plugin.run.xml b/.run/Run Plugin.run.xml index c4ec3d67..00a760e5 100644 --- a/.run/Run Plugin.run.xml +++ b/.run/Run Plugin.run.xml @@ -22,4 +22,4 @@ false - \ No newline at end of file + diff --git a/build.gradle.kts b/build.gradle.kts index 3e435eb3..874b7131 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -1,4 +1,5 @@ import org.jetbrains.changelog.Changelog +import org.jetbrains.changelog.markdownToHTML import org.jetbrains.intellij.platform.gradle.TestFrameworkType plugins { @@ -6,6 +7,7 @@ plugins { alias(libs.plugins.kotlin) // Kotlin support alias(libs.plugins.intelliJPlatform) // IntelliJ Platform Gradle Plugin alias(libs.plugins.changelog) // Gradle Changelog Plugin + alias(libs.plugins.kover) // Gradle Kover Plugin } group = providers.gradleProperty("pluginGroup").get() @@ -13,7 +15,7 @@ version = providers.gradleProperty("pluginVersion").get() // Set the JVM language level used to build the project. kotlin { - jvmToolchain(17) + jvmToolchain(21) } // Configure project's dependencies @@ -29,20 +31,21 @@ repositories { // Dependencies are managed with Gradle version catalog - read more: https://docs.gradle.org/current/userguide/platforms.html#sub:version-catalog dependencies { testImplementation(libs.junit) + testImplementation(libs.opentest4j) // IntelliJ Platform Gradle Plugin Dependencies Extension - read more: https://plugins.jetbrains.com/docs/intellij/tools-intellij-platform-gradle-plugin-dependencies-extension.html intellijPlatform { - create(providers.gradleProperty("platformType"), providers.gradleProperty("platformVersion")) - + create( + providers.gradleProperty("platformType"), providers.gradleProperty("platformVersion") + ) // Plugin Dependencies. Uses `platformBundledPlugins` property from the gradle.properties file for bundled IntelliJ Platform plugins. bundledPlugins(providers.gradleProperty("platformBundledPlugins").map { it.split(',') }) // Plugin Dependencies. Uses `platformPlugins` property from the gradle.properties file for plugin from JetBrains Marketplace. plugins(providers.gradleProperty("platformPlugins").map { it.split(',') }) - instrumentationTools() - pluginVerifier() - zipSigner() + phpstorm("2025.1") + testFramework(TestFrameworkType.Platform) } } @@ -50,6 +53,7 @@ dependencies { // Configure IntelliJ Platform Gradle Plugin - read more: https://plugins.jetbrains.com/docs/intellij/tools-intellij-platform-gradle-plugin-extension.html intellijPlatform { pluginConfiguration { + name = providers.gradleProperty("pluginName") version = providers.gradleProperty("pluginVersion") val changelog = project.changelog // local variable for configuration cache compatibility @@ -57,9 +61,7 @@ intellijPlatform { changeNotes = providers.gradleProperty("pluginVersion").map { pluginVersion -> with(changelog) { renderItem( - (getOrNull(pluginVersion) ?: getUnreleased()) - .withHeader(false) - .withEmptySections(false), + (getOrNull(pluginVersion) ?: getUnreleased()).withHeader(false).withEmptySections(false), Changelog.OutputType.HTML, ) } @@ -86,8 +88,25 @@ changelog { repositoryUrl = providers.gradleProperty("pluginRepositoryUrl") } +// Configure Gradle Kover Plugin - read more: https://github.com/Kotlin/kotlinx-kover#configuration +kover { + reports { + total { + xml { + onCheck = true + } + } + } +} + tasks { wrapper { gradleVersion = providers.gradleProperty("gradleVersion").get() } } + +sourceSets { + test { + resources.srcDir("src/test/") + } +} diff --git a/gradle.properties b/gradle.properties index 3600c442..97b27792 100644 --- a/gradle.properties +++ b/gradle.properties @@ -4,24 +4,24 @@ pluginGroup = com.vk pluginName = kphpstorm pluginRepositoryUrl = https://github.com/VKCOM/kphpstorm # SemVer format -> https://semver.org -pluginVersion = 1.2.14 +pluginVersion = 1.2.15 # Supported build number ranges and IntelliJ Platform versions -> https://plugins.jetbrains.com/docs/intellij/build-number-ranges.html -pluginSinceBuild = 243 -pluginUntilBuild = 243.* +pluginSinceBuild = 251 +pluginUntilBuild = 251.* # IntelliJ Platform Properties -> https://plugins.jetbrains.com/docs/intellij/tools-gradle-intellij-plugin.html#configuration-intellij-extension -platformType = IU -platformVersion = 2024.3 +platformType = PS +platformVersion = 2025.1 # Plugin Dependencies -> https://plugins.jetbrains.com/docs/intellij/plugin-dependencies.html # Example: platformPlugins = com.jetbrains.php:203.4449.22, org.intellij.scala:2023.3.27@EAP -platformPlugins = com.jetbrains.php:243.21565.211 +platformPlugins = # Example: platformBundledPlugins = com.intellij.java -platformBundledPlugins = com.intellij.java +platformBundledPlugins = com.jetbrains.php # Gradle Releases -> https://github.com/gradle/gradle/releases -gradleVersion = 8.10.2 +gradleVersion = 8.13 # Opt-out flag for bundling Kotlin standard library -> https://jb.gg/intellij-platform-kotlin-stdlib kotlin.stdlib.default.dependency = false diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 75b9f011..4b459526 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -1,16 +1,20 @@ [versions] # libraries junit = "4.13.2" +opentest4j = "1.3.0" # plugins changelog = "2.2.1" -intelliJPlatform = "2.0.1" # TODO: update this in next update: https://youtrack.jetbrains.com/issue/MP-7019 -kotlin = "1.9.25" +intelliJPlatform = "2.5.0" +kotlin = "2.1.20" +kover = "0.9.1" [libraries] junit = { group = "junit", name = "junit", version.ref = "junit" } +opentest4j = { group = "org.opentest4j", name = "opentest4j", version.ref = "opentest4j" } [plugins] changelog = { id = "org.jetbrains.changelog", version.ref = "changelog" } intelliJPlatform = { id = "org.jetbrains.intellij.platform", version.ref = "intelliJPlatform" } kotlin = { id = "org.jetbrains.kotlin.jvm", version.ref = "kotlin" } +kover = { id = "org.jetbrains.kotlinx.kover", version.ref = "kover" } diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index a4b76b95..9bbc975c 100644 Binary files a/gradle/wrapper/gradle-wrapper.jar and b/gradle/wrapper/gradle-wrapper.jar differ diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index df97d72b..37f853b1 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.10.2-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.13-bin.zip networkTimeout=10000 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME diff --git a/gradlew b/gradlew index f5feea6d..faf93008 100755 --- a/gradlew +++ b/gradlew @@ -86,8 +86,7 @@ done # shellcheck disable=SC2034 APP_BASE_NAME=${0##*/} # Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036) -APP_HOME=$( cd -P "${APP_HOME:-./}" > /dev/null && printf '%s -' "$PWD" ) || exit +APP_HOME=$( cd -P "${APP_HOME:-./}" > /dev/null && printf '%s\n' "$PWD" ) || exit # Use the maximum available, or set MAX_FD != -1 to use that value. MAX_FD=maximum @@ -206,7 +205,7 @@ fi DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' # Collect all arguments for the java command: -# * DEFAULT_JVM_OPTS, JAVA_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments, +# * DEFAULT_JVM_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments, # and any embedded shellness will be escaped. # * For example: A user cannot expect ${Hostname} to be expanded, as it is an environment variable and will be # treated as '${Hostname}' itself on the command line. diff --git a/src/main/kotlin/com/vk/kphpstorm/kphptags/KphpDocTag.kt b/src/main/kotlin/com/vk/kphpstorm/kphptags/KphpDocTag.kt index 85e9c282..3424afa7 100644 --- a/src/main/kotlin/com/vk/kphpstorm/kphptags/KphpDocTag.kt +++ b/src/main/kotlin/com/vk/kphpstorm/kphptags/KphpDocTag.kt @@ -3,6 +3,7 @@ package com.vk.kphpstorm.kphptags import com.intellij.lang.annotation.AnnotationHolder import com.intellij.lang.annotation.HighlightSeverity import com.intellij.psi.PsiElement +import com.intellij.psi.util.PsiTreeUtil import com.jetbrains.php.lang.documentation.phpdoc.PhpDocUtil import com.jetbrains.php.lang.documentation.phpdoc.psi.PhpDocComment import com.jetbrains.php.lang.documentation.phpdoc.psi.tags.PhpDocTag @@ -72,7 +73,8 @@ abstract class KphpDocTag( } fun findThisTagInDocComment(docCommentOwner: PhpNamedElement): PhpDocTag? { - return findThisTagInDocComment(docCommentOwner.docComment ?: return null) + return PsiTreeUtil.findChildrenOfType(docCommentOwner.docComment, PhpDocTag::class.java) + .firstOrNull { it.name == nameWithAt } } inline fun findThisTagsInDocComment(docComment: PhpDocComment): List { diff --git a/src/main/kotlin/com/vk/kphpstorm/kphptags/parser/KphpDocTagJsonParser.kt b/src/main/kotlin/com/vk/kphpstorm/kphptags/parser/KphpDocTagJsonParser.kt index 80d0d113..0d31c115 100644 --- a/src/main/kotlin/com/vk/kphpstorm/kphptags/parser/KphpDocTagJsonParser.kt +++ b/src/main/kotlin/com/vk/kphpstorm/kphptags/parser/KphpDocTagJsonParser.kt @@ -5,12 +5,12 @@ import com.jetbrains.php.lang.documentation.phpdoc.parser.tags.PhpDocTagParser import com.jetbrains.php.lang.parser.PhpParserErrors import com.jetbrains.php.lang.parser.PhpPsiBuilder import com.vk.kphpstorm.exphptype.psi.TokensToExPhpTypePsiParsing +import com.vk.kphpstorm.kphptags.psi.KphpDocElementTypes import com.vk.kphpstorm.kphptags.psi.KphpDocJsonAttributePsiImpl import com.vk.kphpstorm.kphptags.psi.KphpDocJsonForEncoderPsiImpl -import com.vk.kphpstorm.kphptags.psi.KphpDocTagJsonElementType class KphpDocTagJsonParser : PhpDocTagParser() { - override fun getElementType() = KphpDocTagJsonElementType + override fun getElementType() = KphpDocElementTypes.kphpDocTagJson override fun parseContents(builder: PhpPsiBuilder): Boolean { val paramsTagParser = PhpDocParamTagParser() diff --git a/src/main/kotlin/com/vk/kphpstorm/kphptags/parser/KphpDocTagSimpleParser.kt b/src/main/kotlin/com/vk/kphpstorm/kphptags/parser/KphpDocTagSimpleParser.kt index 7d79960c..32424e02 100644 --- a/src/main/kotlin/com/vk/kphpstorm/kphptags/parser/KphpDocTagSimpleParser.kt +++ b/src/main/kotlin/com/vk/kphpstorm/kphptags/parser/KphpDocTagSimpleParser.kt @@ -2,10 +2,10 @@ package com.vk.kphpstorm.kphptags.parser import com.jetbrains.php.lang.documentation.phpdoc.parser.tags.PhpDocTagParser import com.jetbrains.php.lang.parser.PhpPsiBuilder -import com.vk.kphpstorm.kphptags.psi.KphpDocTagSimpleElementType +import com.vk.kphpstorm.kphptags.psi.KphpDocElementTypes class KphpDocTagSimpleParser : PhpDocTagParser() { - override fun getElementType() = KphpDocTagSimpleElementType + override fun getElementType() = KphpDocElementTypes.kphpDocTagSimple override fun parseContents(builder: PhpPsiBuilder) = true } diff --git a/src/main/kotlin/com/vk/kphpstorm/kphptags/parser/KphpDocTagTemplateClassParser.kt b/src/main/kotlin/com/vk/kphpstorm/kphptags/parser/KphpDocTagTemplateClassParser.kt index aa65abce..cf1c0d55 100644 --- a/src/main/kotlin/com/vk/kphpstorm/kphptags/parser/KphpDocTagTemplateClassParser.kt +++ b/src/main/kotlin/com/vk/kphpstorm/kphptags/parser/KphpDocTagTemplateClassParser.kt @@ -4,11 +4,11 @@ import com.jetbrains.php.lang.documentation.phpdoc.lexer.PhpDocTokenTypes import com.jetbrains.php.lang.documentation.phpdoc.parser.tags.PhpDocTagParser import com.jetbrains.php.lang.parser.PhpParserErrors import com.jetbrains.php.lang.parser.PhpPsiBuilder -import com.vk.kphpstorm.kphptags.psi.KphpDocTagTemplateClassElementType +import com.vk.kphpstorm.kphptags.psi.KphpDocElementTypes import com.vk.kphpstorm.kphptags.psi.KphpDocTplParameterDeclPsiImpl class KphpDocTagTemplateClassParser : PhpDocTagParser() { - override fun getElementType() = KphpDocTagTemplateClassElementType + override fun getElementType() = KphpDocElementTypes.kphpDocTagTemplateClass override fun parseContents(builder: PhpPsiBuilder): Boolean { do { diff --git a/src/main/kotlin/com/vk/kphpstorm/kphptags/parser/KphpDocTagWarnPerformanceParser.kt b/src/main/kotlin/com/vk/kphpstorm/kphptags/parser/KphpDocTagWarnPerformanceParser.kt index 72c16414..8f088304 100644 --- a/src/main/kotlin/com/vk/kphpstorm/kphptags/parser/KphpDocTagWarnPerformanceParser.kt +++ b/src/main/kotlin/com/vk/kphpstorm/kphptags/parser/KphpDocTagWarnPerformanceParser.kt @@ -4,11 +4,11 @@ import com.jetbrains.php.lang.documentation.phpdoc.lexer.PhpDocTokenTypes import com.jetbrains.php.lang.documentation.phpdoc.parser.tags.PhpDocTagParser import com.jetbrains.php.lang.parser.PhpParserErrors import com.jetbrains.php.lang.parser.PhpPsiBuilder -import com.vk.kphpstorm.kphptags.psi.KphpDocTagWarnPerformanceElementType +import com.vk.kphpstorm.kphptags.psi.KphpDocElementTypes import com.vk.kphpstorm.kphptags.psi.KphpDocWarnPerformanceItemPsiImpl class KphpDocTagWarnPerformanceParser : PhpDocTagParser() { - override fun getElementType() = KphpDocTagWarnPerformanceElementType + override fun getElementType() = KphpDocElementTypes.kphpDocTagWarnPerformance override fun parseContents(builder: PhpPsiBuilder): Boolean { do { diff --git a/src/main/kotlin/com/vk/kphpstorm/kphptags/psi/KphpDocElementTypes.kt b/src/main/kotlin/com/vk/kphpstorm/kphptags/psi/KphpDocElementTypes.kt index 37ca0576..df2ee8ff 100644 --- a/src/main/kotlin/com/vk/kphpstorm/kphptags/psi/KphpDocElementTypes.kt +++ b/src/main/kotlin/com/vk/kphpstorm/kphptags/psi/KphpDocElementTypes.kt @@ -1,5 +1,6 @@ package com.vk.kphpstorm.kphptags.psi +import com.jetbrains.php.lang.psi.PhpElementType import com.vk.kphpstorm.KphpStormParserDefinition @@ -21,27 +22,26 @@ object KphpDocElementTypes { * * do not store anything in stubs, so their contents is unaccessible from other files * Such doc tags are 'simple' */ - val kphpDocTagSimple = KphpDocTagSimpleElementType + val kphpDocTagSimple = PhpElementType("@kphp-simple") /** * '@kphp-warn-performance ...' and '@kphp-analyze-performance ...' * They don't store stubs, but have a psi parser */ - val kphpDocTagWarnPerformance = KphpDocTagWarnPerformanceElementType + val kphpDocTagWarnPerformance = PhpElementType("@kphp-warn-performance") /** * '@kphp-json [for EncoderName] attribute[= optional value]' * They don't store stubs, but have a psi parser */ - val kphpDocTagJson = KphpDocTagJsonElementType + val kphpDocTagJson = PhpElementType("@kphp-json") /** * '@kphp-template-class T1, T2' * (NOTE! This is not working in KPHP for now, it is just a matter of IDE experiments for future) * This tag stores "T1,T2" in stubs and has custom psi for them, therefore is not simple */ - val kphpDocTagTemplateClass = KphpDocTagTemplateClassElementType - + val kphpDocTagTemplateClass = PhpElementType("@kphp-template-class") } diff --git a/src/main/kotlin/com/vk/kphpstorm/kphptags/psi/KphpDocTagSimpleElementType.kt b/src/main/kotlin/com/vk/kphpstorm/kphptags/psi/KphpDocTagSimpleElementType.kt deleted file mode 100644 index 1b195298..00000000 --- a/src/main/kotlin/com/vk/kphpstorm/kphptags/psi/KphpDocTagSimpleElementType.kt +++ /dev/null @@ -1,36 +0,0 @@ -package com.vk.kphpstorm.kphptags.psi - -import com.intellij.psi.stubs.StubElement -import com.intellij.psi.stubs.StubInputStream -import com.intellij.psi.stubs.StubOutputStream -import com.jetbrains.php.lang.documentation.phpdoc.psi.stubs.PhpDocTagStub -import com.jetbrains.php.lang.documentation.phpdoc.psi.tags.PhpDocTag -import com.jetbrains.php.lang.psi.stubs.PhpStubElementType - -/** - * '@kphp-...' tags that do not store anything to stubs and do not parse its argument as custom psi tree - * are called 'simple'. - * Storing nothing in stubs means that their contents/text MUST be accessed only within THE SAME FILE. - * This is ok for annotators etc, but not ok for something influencing declarations for example. - * @see KphpDocElementTypes.kphpDocTagSimple - */ -object KphpDocTagSimpleElementType : PhpStubElementType("@kphp-...") { - override fun createPsi(stub: PhpDocTagStub): PhpDocTag { - return KphpDocTagSimplePsiImpl(stub, stub.stubType) - } - - override fun createStub(psi: PhpDocTag, parentStub: StubElement<*>?): PhpDocTagStub { - return KphpDocTagStubImpl(parentStub, this, psi.name, null) - } - - override fun serialize(stub: PhpDocTagStub, dataStream: StubOutputStream) { - dataStream.writeName(stub.name) - dataStream.writeName(stub.value) - } - - override fun deserialize(dataStream: StubInputStream, parentStub: StubElement<*>?): PhpDocTagStub { - val name = dataStream.readName()?.toString() ?: throw NullPointerException() - val stubValue = dataStream.readName()?.toString() - return KphpDocTagStubImpl(parentStub, this, name, stubValue) - } -} diff --git a/src/main/kotlin/com/vk/kphpstorm/kphptags/psi/KphpDocTagSimplePsiImpl.kt b/src/main/kotlin/com/vk/kphpstorm/kphptags/psi/KphpDocTagSimplePsiImpl.kt index 3a14b801..9bc172ad 100644 --- a/src/main/kotlin/com/vk/kphpstorm/kphptags/psi/KphpDocTagSimplePsiImpl.kt +++ b/src/main/kotlin/com/vk/kphpstorm/kphptags/psi/KphpDocTagSimplePsiImpl.kt @@ -11,5 +11,5 @@ import com.jetbrains.php.lang.documentation.phpdoc.psi.stubs.PhpDocTagStub */ class KphpDocTagSimplePsiImpl : PhpDocTagImpl, KphpDocTagImpl { constructor(node: ASTNode) : super(node) - constructor(stub: PhpDocTagStub, nodeType: IStubElementType<*, *>) : super(stub, nodeType) + constructor(stub: PhpDocTagStub, nodeType: IStubElementType<*, *>) : super(stub, nodeType) // TODO: exp: change IStubElementType -> IElementType } diff --git a/src/main/kotlin/com/vk/kphpstorm/kphptags/psi/KphpDocTagStubImpl.kt b/src/main/kotlin/com/vk/kphpstorm/kphptags/psi/KphpDocTagStubImpl.kt index a47c0b0f..edef81ff 100644 --- a/src/main/kotlin/com/vk/kphpstorm/kphptags/psi/KphpDocTagStubImpl.kt +++ b/src/main/kotlin/com/vk/kphpstorm/kphptags/psi/KphpDocTagStubImpl.kt @@ -3,6 +3,7 @@ package com.vk.kphpstorm.kphptags.psi import com.intellij.psi.stubs.IStubElementType import com.intellij.psi.stubs.StubBase import com.intellij.psi.stubs.StubElement +import com.intellij.psi.tree.IElementType import com.jetbrains.php.lang.documentation.phpdoc.psi.stubs.PhpDocTagStub import com.jetbrains.php.lang.documentation.phpdoc.psi.tags.PhpDocTag import com.jetbrains.php.lang.psi.resolve.types.PhpType @@ -13,13 +14,13 @@ import com.jetbrains.php.lang.psi.resolve.types.PhpType * Similar to [com.jetbrains.php.lang.documentation.phpdoc.psi.stubs.PhpDocTagStubImpl] */ class KphpDocTagStubImpl( - parent: StubElement<*>?, - elementType: IStubElementType<*, *>, - private val name: String, - private val value: String? + parent: StubElement<*>?, + elementType: IElementType, + private val name: String, + private val value: String? ) : StubBase(parent, elementType), PhpDocTagStub { - override fun getType() = PhpType() + fun getType() = PhpType() override fun getName() = name override fun getValue() = value } diff --git a/src/main/kotlin/com/vk/kphpstorm/kphptags/psi/factory/KphpDocTagJsonElementTypeStubFactory.kt b/src/main/kotlin/com/vk/kphpstorm/kphptags/psi/factory/KphpDocTagJsonElementTypeStubFactory.kt new file mode 100644 index 00000000..4fec4f5d --- /dev/null +++ b/src/main/kotlin/com/vk/kphpstorm/kphptags/psi/factory/KphpDocTagJsonElementTypeStubFactory.kt @@ -0,0 +1,22 @@ +package com.vk.kphpstorm.kphptags.psi.factory + +import com.intellij.lang.ASTNode +import com.intellij.psi.stubs.StubElement +import com.intellij.psi.stubs.StubElementFactory +import com.jetbrains.php.lang.documentation.phpdoc.psi.stubs.PhpDocTagStub +import com.jetbrains.php.lang.documentation.phpdoc.psi.tags.PhpDocTag +import com.vk.kphpstorm.kphptags.psi.KphpDocElementTypes +import com.vk.kphpstorm.kphptags.psi.serializers.KphpDocTagJsonElementTypeStubFactorySerializer + +object KphpDocTagJsonElementTypeStubFactory : StubElementFactory { + override fun shouldCreateStub(node: ASTNode): Boolean = + node.elementType == KphpDocElementTypes.kphpDocTagJson + + override fun createPsi(stub: PhpDocTagStub): PhpDocTag { + return KphpDocTagJsonElementTypeStubFactorySerializer().createPsi(stub) + } + + override fun createStub(psi: PhpDocTag, parentStub: StubElement<*>?): PhpDocTagStub { + return KphpDocTagJsonElementTypeStubFactorySerializer().createStub(psi, parentStub) + } +} diff --git a/src/main/kotlin/com/vk/kphpstorm/kphptags/psi/factory/KphpDocTagSimpleElementTypeStubFactory.kt b/src/main/kotlin/com/vk/kphpstorm/kphptags/psi/factory/KphpDocTagSimpleElementTypeStubFactory.kt new file mode 100644 index 00000000..1eb26c6b --- /dev/null +++ b/src/main/kotlin/com/vk/kphpstorm/kphptags/psi/factory/KphpDocTagSimpleElementTypeStubFactory.kt @@ -0,0 +1,26 @@ +package com.vk.kphpstorm.kphptags.psi.factory + +import com.intellij.lang.ASTNode +import com.intellij.psi.PsiElement +import com.intellij.psi.stubs.StubElement +import com.intellij.psi.stubs.StubElementFactory +import com.jetbrains.php.lang.documentation.phpdoc.psi.stubs.PhpDocTagStub +import com.jetbrains.php.lang.documentation.phpdoc.psi.tags.PhpDocTag +import com.vk.kphpstorm.kphptags.psi.KphpDocElementTypes +import com.vk.kphpstorm.kphptags.psi.serializers.KphpDocTagSimpleElementTypeStubSerializer + +object KphpDocTagSimpleElementTypeStubFactory + : StubElementFactory { + + override fun shouldCreateStub(node: ASTNode): Boolean = + node.elementType == KphpDocElementTypes.kphpDocTagSimple + + override fun createStub( + psi: PhpDocTag, + parentStub: StubElement? + ): PhpDocTagStub = + KphpDocTagSimpleElementTypeStubSerializer().createStub(psi, parentStub) + + override fun createPsi(stub: PhpDocTagStub): PhpDocTag = + KphpDocTagSimpleElementTypeStubSerializer().createPsi(stub) +} diff --git a/src/main/kotlin/com/vk/kphpstorm/kphptags/psi/factory/KphpDocTagTemplateClassElementTypeFactory.kt b/src/main/kotlin/com/vk/kphpstorm/kphptags/psi/factory/KphpDocTagTemplateClassElementTypeFactory.kt new file mode 100644 index 00000000..6579f968 --- /dev/null +++ b/src/main/kotlin/com/vk/kphpstorm/kphptags/psi/factory/KphpDocTagTemplateClassElementTypeFactory.kt @@ -0,0 +1,23 @@ +package com.vk.kphpstorm.kphptags.psi.factory + +import com.intellij.lang.ASTNode +import com.intellij.psi.PsiElement +import com.intellij.psi.stubs.StubElement +import com.intellij.psi.stubs.StubElementFactory +import com.jetbrains.php.lang.documentation.phpdoc.psi.stubs.PhpDocTagStub +import com.jetbrains.php.lang.documentation.phpdoc.psi.tags.PhpDocTag +import com.vk.kphpstorm.kphptags.psi.KphpDocElementTypes +import com.vk.kphpstorm.kphptags.psi.serializers.KphpDocTagTemplateClassElementTypeSerializer + +object KphpDocTagTemplateClassElementTypeFactory : StubElementFactory { + override fun createPsi(stub: PhpDocTagStub): PhpDocTag { + return KphpDocTagTemplateClassElementTypeSerializer().createPsi(stub) + } + + override fun createStub(psi: PhpDocTag, parentStub: StubElement?): PhpDocTagStub { + return KphpDocTagTemplateClassElementTypeSerializer().createStub(psi, parentStub) + } + + override fun shouldCreateStub(node: ASTNode): Boolean = + node.elementType == KphpDocElementTypes.kphpDocTagTemplateClass +} diff --git a/src/main/kotlin/com/vk/kphpstorm/kphptags/psi/factory/KphpDocTagWarnPerformanceElementTypeFactory.kt b/src/main/kotlin/com/vk/kphpstorm/kphptags/psi/factory/KphpDocTagWarnPerformanceElementTypeFactory.kt new file mode 100644 index 00000000..aa3f9d28 --- /dev/null +++ b/src/main/kotlin/com/vk/kphpstorm/kphptags/psi/factory/KphpDocTagWarnPerformanceElementTypeFactory.kt @@ -0,0 +1,24 @@ +package com.vk.kphpstorm.kphptags.psi.factory + +import com.intellij.lang.ASTNode +import com.intellij.psi.PsiElement +import com.intellij.psi.stubs.StubElement +import com.intellij.psi.stubs.StubElementFactory +import com.jetbrains.php.lang.documentation.phpdoc.psi.stubs.PhpDocTagStub +import com.jetbrains.php.lang.documentation.phpdoc.psi.tags.PhpDocTag +import com.vk.kphpstorm.kphptags.psi.KphpDocElementTypes +import com.vk.kphpstorm.kphptags.psi.serializers.KphpDocTagWarnPerformanceElementTypeSerializer + +object KphpDocTagWarnPerformanceElementTypeFactory : StubElementFactory { + override fun shouldCreateStub(node: ASTNode): Boolean = + node.elementType == KphpDocElementTypes.kphpDocTagWarnPerformance + + + override fun createStub(psi: PhpDocTag, parentStub: StubElement?): PhpDocTagStub{ + return KphpDocTagWarnPerformanceElementTypeSerializer().createStub(psi, parentStub) + } + + override fun createPsi(stub: PhpDocTagStub): PhpDocTag? { + return KphpDocTagWarnPerformanceElementTypeSerializer().createPsi(stub) + } +} diff --git a/src/main/kotlin/com/vk/kphpstorm/kphptags/psi/KphpDocTagJsonElementType.kt b/src/main/kotlin/com/vk/kphpstorm/kphptags/psi/serializers/KphpDocTagJsonElementTypeStubFactorySerializer.kt similarity index 53% rename from src/main/kotlin/com/vk/kphpstorm/kphptags/psi/KphpDocTagJsonElementType.kt rename to src/main/kotlin/com/vk/kphpstorm/kphptags/psi/serializers/KphpDocTagJsonElementTypeStubFactorySerializer.kt index 038db635..4a4d9bd4 100644 --- a/src/main/kotlin/com/vk/kphpstorm/kphptags/psi/KphpDocTagJsonElementType.kt +++ b/src/main/kotlin/com/vk/kphpstorm/kphptags/psi/serializers/KphpDocTagJsonElementTypeStubFactorySerializer.kt @@ -1,21 +1,16 @@ -package com.vk.kphpstorm.kphptags.psi +package com.vk.kphpstorm.kphptags.psi.serializers import com.intellij.psi.stubs.StubElement import com.intellij.psi.stubs.StubInputStream import com.intellij.psi.stubs.StubOutputStream import com.jetbrains.php.lang.documentation.phpdoc.psi.stubs.PhpDocTagStub +import com.jetbrains.php.lang.documentation.phpdoc.psi.stubs.PhpDocTagStubSerializer import com.jetbrains.php.lang.documentation.phpdoc.psi.tags.PhpDocTag -import com.jetbrains.php.lang.psi.stubs.PhpStubElementType - -object KphpDocTagJsonElementType : PhpStubElementType("@kphp-json") { - override fun createPsi(stub: PhpDocTagStub): PhpDocTag { - return KphpDocTagJsonPsiImpl(stub, stub.stubType) - } - - override fun createStub(psi: PhpDocTag, parentStub: StubElement<*>?): PhpDocTagStub { - return KphpDocTagStubImpl(parentStub, this, psi.name, null) - } +import com.vk.kphpstorm.kphptags.psi.KphpDocElementTypes +import com.vk.kphpstorm.kphptags.psi.KphpDocTagJsonPsiImpl +import com.vk.kphpstorm.kphptags.psi.KphpDocTagStubImpl +class KphpDocTagJsonElementTypeStubFactorySerializer : PhpDocTagStubSerializer(KphpDocElementTypes.kphpDocTagJson) { override fun serialize(stub: PhpDocTagStub, dataStream: StubOutputStream) { dataStream.writeName(stub.name) dataStream.writeName(stub.value) @@ -24,6 +19,14 @@ object KphpDocTagJsonElementType : PhpStubElementType( override fun deserialize(dataStream: StubInputStream, parentStub: StubElement<*>?): PhpDocTagStub { val name = dataStream.readName()?.toString() ?: throw NullPointerException() val stubValue = dataStream.readName()?.toString() - return KphpDocTagStubImpl(parentStub, this, name, stubValue) + return KphpDocTagStubImpl(parentStub, type, name, stubValue) + } + + fun createPsi(stub: PhpDocTagStub): PhpDocTag { + return KphpDocTagJsonPsiImpl(stub, stub.stubType) + } + + fun createStub(psi: PhpDocTag, parentStub: StubElement<*>?): PhpDocTagStub { + return KphpDocTagStubImpl(parentStub, type, psi.name, null) } } diff --git a/src/main/kotlin/com/vk/kphpstorm/kphptags/psi/serializers/KphpDocTagSimpleElementTypeStubSerializer.kt b/src/main/kotlin/com/vk/kphpstorm/kphptags/psi/serializers/KphpDocTagSimpleElementTypeStubSerializer.kt new file mode 100644 index 00000000..a1e3f410 --- /dev/null +++ b/src/main/kotlin/com/vk/kphpstorm/kphptags/psi/serializers/KphpDocTagSimpleElementTypeStubSerializer.kt @@ -0,0 +1,32 @@ +package com.vk.kphpstorm.kphptags.psi.serializers + +import com.intellij.psi.stubs.StubElement +import com.intellij.psi.stubs.StubInputStream +import com.intellij.psi.stubs.StubOutputStream +import com.jetbrains.php.lang.documentation.phpdoc.psi.stubs.PhpDocTagStub +import com.jetbrains.php.lang.documentation.phpdoc.psi.stubs.PhpDocTagStubSerializer +import com.jetbrains.php.lang.documentation.phpdoc.psi.tags.PhpDocTag +import com.vk.kphpstorm.kphptags.psi.KphpDocElementTypes +import com.vk.kphpstorm.kphptags.psi.KphpDocTagSimplePsiImpl +import com.vk.kphpstorm.kphptags.psi.KphpDocTagStubImpl + +class KphpDocTagSimpleElementTypeStubSerializer : PhpDocTagStubSerializer(KphpDocElementTypes.kphpDocTagSimple){ + fun createPsi(stub: PhpDocTagStub): PhpDocTag { + return KphpDocTagSimplePsiImpl(stub, stub.stubType) + } + + fun createStub(psi: PhpDocTag, parentStub: StubElement<*>?): PhpDocTagStub { + return KphpDocTagStubImpl(parentStub, type, psi.name, null) + } + + override fun serialize(stub: PhpDocTagStub, dataStream: StubOutputStream) { + dataStream.writeName(stub.name) + dataStream.writeName(stub.value) + } + + override fun deserialize(dataStream: StubInputStream, parentStub: StubElement<*>?): PhpDocTagStub { + val name = dataStream.readName()?.toString() ?: throw NullPointerException() + val stubValue = dataStream.readName()?.toString() + return KphpDocTagStubImpl(parentStub, type, name, stubValue) + } +} diff --git a/src/main/kotlin/com/vk/kphpstorm/kphptags/psi/KphpDocTagTemplateClassElementType.kt b/src/main/kotlin/com/vk/kphpstorm/kphptags/psi/serializers/KphpDocTagTemplateClassElementTypeSerializer.kt similarity index 57% rename from src/main/kotlin/com/vk/kphpstorm/kphptags/psi/KphpDocTagTemplateClassElementType.kt rename to src/main/kotlin/com/vk/kphpstorm/kphptags/psi/serializers/KphpDocTagTemplateClassElementTypeSerializer.kt index b0e5f85a..33b97cef 100644 --- a/src/main/kotlin/com/vk/kphpstorm/kphptags/psi/KphpDocTagTemplateClassElementType.kt +++ b/src/main/kotlin/com/vk/kphpstorm/kphptags/psi/serializers/KphpDocTagTemplateClassElementTypeSerializer.kt @@ -1,25 +1,25 @@ -package com.vk.kphpstorm.kphptags.psi +package com.vk.kphpstorm.kphptags.psi.serializers import com.intellij.psi.stubs.StubElement import com.intellij.psi.stubs.StubInputStream import com.intellij.psi.stubs.StubOutputStream import com.jetbrains.php.lang.documentation.phpdoc.psi.stubs.PhpDocTagStub +import com.jetbrains.php.lang.documentation.phpdoc.psi.stubs.PhpDocTagStubSerializer import com.jetbrains.php.lang.documentation.phpdoc.psi.tags.PhpDocTag -import com.jetbrains.php.lang.psi.stubs.PhpStubElementType +import com.vk.kphpstorm.kphptags.psi.KphpDocElementTypes +import com.vk.kphpstorm.kphptags.psi.KphpDocTagStubImpl +import com.vk.kphpstorm.kphptags.psi.KphpDocTagTemplateClassPsiImpl -/** - * '@kphp-template-class T1, T2' has a separate elementType, psi for 'T1' and 'T2' and stub contents - * @see KphpDocElementTypes.kphpDocTagTemplateClass - */ -object KphpDocTagTemplateClassElementType : PhpStubElementType("@kphp-template-class") { - override fun createPsi(stub: PhpDocTagStub): PhpDocTag { +class KphpDocTagTemplateClassElementTypeSerializer : + PhpDocTagStubSerializer(KphpDocElementTypes.kphpDocTagTemplateClass) { + fun createPsi(stub: PhpDocTagStub): PhpDocTag { return KphpDocTagTemplateClassPsiImpl(stub, stub.stubType) } - override fun createStub(psi: PhpDocTag, parentStub: StubElement<*>?): PhpDocTagStub { + fun createStub(psi: PhpDocTag, parentStub: StubElement<*>?): PhpDocTagStub { // stub value is 'T1,T2' — without spaces val stubValue = (psi as KphpDocTagTemplateClassPsiImpl).getTemplateArguments().joinToString(",") - return KphpDocTagStubImpl(parentStub, this, psi.name, stubValue) + return KphpDocTagStubImpl(parentStub, type, psi.name, stubValue) } override fun serialize(stub: PhpDocTagStub, dataStream: StubOutputStream) { @@ -30,6 +30,6 @@ object KphpDocTagTemplateClassElementType : PhpStubElementType?): PhpDocTagStub { val name = dataStream.readName()?.toString() ?: throw NullPointerException() val stubValue = dataStream.readName()?.toString() - return KphpDocTagStubImpl(parentStub, this, name, stubValue) + return KphpDocTagStubImpl(parentStub, type, name, stubValue) } } diff --git a/src/main/kotlin/com/vk/kphpstorm/kphptags/psi/KphpDocTagWarnPerformanceElementType.kt b/src/main/kotlin/com/vk/kphpstorm/kphptags/psi/serializers/KphpDocTagWarnPerformanceElementTypeSerializer.kt similarity index 58% rename from src/main/kotlin/com/vk/kphpstorm/kphptags/psi/KphpDocTagWarnPerformanceElementType.kt rename to src/main/kotlin/com/vk/kphpstorm/kphptags/psi/serializers/KphpDocTagWarnPerformanceElementTypeSerializer.kt index 67a291f4..e18f7693 100644 --- a/src/main/kotlin/com/vk/kphpstorm/kphptags/psi/KphpDocTagWarnPerformanceElementType.kt +++ b/src/main/kotlin/com/vk/kphpstorm/kphptags/psi/serializers/KphpDocTagWarnPerformanceElementTypeSerializer.kt @@ -1,19 +1,20 @@ -package com.vk.kphpstorm.kphptags.psi +package com.vk.kphpstorm.kphptags.psi.serializers import com.intellij.psi.stubs.StubElement import com.intellij.psi.stubs.StubInputStream import com.intellij.psi.stubs.StubOutputStream import com.jetbrains.php.lang.documentation.phpdoc.psi.stubs.PhpDocTagStub +import com.jetbrains.php.lang.documentation.phpdoc.psi.stubs.PhpDocTagStubSerializer import com.jetbrains.php.lang.documentation.phpdoc.psi.tags.PhpDocTag -import com.jetbrains.php.lang.psi.stubs.PhpStubElementType +import com.vk.kphpstorm.kphptags.psi.* -object KphpDocTagWarnPerformanceElementType : PhpStubElementType("@kphp-warn-performance") { - override fun createPsi(stub: PhpDocTagStub): PhpDocTag { +class KphpDocTagWarnPerformanceElementTypeSerializer : PhpDocTagStubSerializer(KphpDocElementTypes.kphpDocTagWarnPerformance){ + fun createPsi(stub: PhpDocTagStub): PhpDocTag { return KphpDocTagWarnPerformancePsiImpl(stub, stub.stubType) } - override fun createStub(psi: PhpDocTag, parentStub: StubElement<*>?): PhpDocTagStub { - return KphpDocTagStubImpl(parentStub, this, psi.name, null) + fun createStub(psi: PhpDocTag, parentStub: StubElement<*>?): PhpDocTagStub { + return KphpDocTagStubImpl(parentStub, type, psi.name, null) } override fun serialize(stub: PhpDocTagStub, dataStream: StubOutputStream) { @@ -24,7 +25,6 @@ object KphpDocTagWarnPerformanceElementType : PhpStubElementType?): PhpDocTagStub { val name = dataStream.readName()?.toString() ?: throw NullPointerException() val stubValue = dataStream.readName()?.toString() - return KphpDocTagStubImpl(parentStub, this, name, stubValue) + return KphpDocTagStubImpl(parentStub, type, name, stubValue) } } - diff --git a/src/main/resources/META-INF/plugin.xml b/src/main/resources/META-INF/plugin.xml index 8aa17489..32487065 100644 --- a/src/main/resources/META-INF/plugin.xml +++ b/src/main/resources/META-INF/plugin.xml @@ -88,7 +88,18 @@ implementationClass="com.vk.kphpstorm.completion.KphpStormCompletionContributor"/> + + + + + + + + + + + + diff --git a/src/test/kotlin/com/vk/kphpstorm/testing/infrastructure/InspectionTestBase.kt b/src/test/kotlin/com/vk/kphpstorm/testing/infrastructure/InspectionTestBase.kt index f69e2223..9357649e 100644 --- a/src/test/kotlin/com/vk/kphpstorm/testing/infrastructure/InspectionTestBase.kt +++ b/src/test/kotlin/com/vk/kphpstorm/testing/infrastructure/InspectionTestBase.kt @@ -1,5 +1,6 @@ package com.vk.kphpstorm.testing.infrastructure +import com.intellij.openapi.vfs.newvfs.impl.VfsRootAccess import com.intellij.testFramework.fixtures.BasePlatformTestCase import com.jetbrains.php.config.PhpLanguageLevel import com.jetbrains.php.config.PhpProjectConfigurationFacade @@ -7,6 +8,7 @@ import com.jetbrains.php.lang.inspections.PhpInspection import com.vk.kphpstorm.configuration.KphpStormConfiguration import com.vk.kphpstorm.configuration.setupKphpStormPluginForProject import java.io.File +import java.nio.file.Paths abstract class InspectionTestBase( @@ -19,6 +21,7 @@ abstract class InspectionTestBase( override fun setUp() { super.setUp() + VfsRootAccess.allowRootAccess(testRootDisposable, Paths.get(testDataPath).toAbsolutePath().toString()) if (inspectionToEnable != null) { myFixture.enableInspections(inspectionToEnable) diff --git a/src/test/kotlin/com/vk/kphpstorm/testing/infrastructure/IntentionTestBase.kt b/src/test/kotlin/com/vk/kphpstorm/testing/infrastructure/IntentionTestBase.kt index 0a5ecc88..831957bb 100644 --- a/src/test/kotlin/com/vk/kphpstorm/testing/infrastructure/IntentionTestBase.kt +++ b/src/test/kotlin/com/vk/kphpstorm/testing/infrastructure/IntentionTestBase.kt @@ -1,10 +1,12 @@ package com.vk.kphpstorm.testing.infrastructure import com.intellij.codeInsight.intention.IntentionAction +import com.intellij.openapi.vfs.newvfs.impl.VfsRootAccess import com.intellij.testFramework.fixtures.BasePlatformTestCase import com.jetbrains.php.config.PhpLanguageLevel import com.jetbrains.php.config.PhpProjectConfigurationFacade import com.vk.kphpstorm.configuration.KphpStormConfiguration +import java.nio.file.Paths abstract class IntentionTestBase( @@ -15,6 +17,12 @@ abstract class IntentionTestBase( override fun getTestDataPath() = "src/test/fixtures" + + override fun setUp() { + super.setUp() + VfsRootAccess.allowRootAccess(testRootDisposable, Paths.get(testDataPath).toAbsolutePath().toString()) + } + private fun setupLanguageLevel() { val projectConfigurationFacade = PhpProjectConfigurationFacade.getInstance(project) projectConfigurationFacade.languageLevel = languageLevel