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