diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 23514298..02394e04 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -1,8 +1,9 @@ name: Build - on: + # Trigger the workflow on pushes to only the 'master' branch (this avoids duplicate checks being run e.g., for dependabot pull requests) push: branches: [ master ] + # Trigger the workflow on any pull request pull_request: concurrency: @@ -11,30 +12,32 @@ concurrency: jobs: - # Prepare environment and build the plugin + # Prepare the environment and build the plugin build: name: Build runs-on: ubuntu-latest outputs: version: ${{ steps.properties.outputs.version }} changelog: ${{ steps.properties.outputs.changelog }} - pluginVerifierHomeDir: ${{ steps.properties.outputs.pluginVerifierHomeDir }} 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 - # Validate wrapper - - name: Gradle Wrapper Validation - uses: gradle/actions/wrapper-validation@v3 - - # Set up Java environment for the next steps + # Set up the 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 @@ -50,8 +53,6 @@ jobs: CHANGELOG="$(./gradlew getChangelog --unreleased --no-header --console=plain -q)" echo "version=$VERSION" >> $GITHUB_OUTPUT - echo "pluginVerifierHomeDir=~/.pluginVerifier" >> $GITHUB_OUTPUT - echo "changelog<> $GITHUB_OUTPUT echo "$CHANGELOG" >> $GITHUB_OUTPUT echo "EOF" >> $GITHUB_OUTPUT @@ -60,7 +61,7 @@ jobs: - name: Build plugin run: ./gradlew buildPlugin - # Run tests + # Run tests and upload a code coverage report test: name: Test (${{ matrix.os }}) needs: [ build ] @@ -74,20 +75,30 @@ jobs: - macos-latest steps: + # Free GitHub Actions Environment Disk Space + - name: Maximize Build Space + uses: jlumbroso/free-disk-space@v1.3.1 + if: runner.os == 'Linux' + with: + tool-cache: false + large-packages: false + # Check out the current repository - name: Fetch Sources uses: actions/checkout@v4 - # Set up Java environment for the next steps + # Set up the 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 uses: gradle/actions/setup-gradle@v4 + with: + cache-read-only: true # Run tests - name: Run Tests @@ -98,7 +109,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,24 +119,33 @@ 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 - # Set up Java environment for the next steps + # Set up the 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 uses: gradle/actions/setup-gradle@v4 + with: + cache-read-only: true # 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 }} + run: ./gradlew verifyPlugin # Collect Plugin Verifier Result - name: Collect Plugin Verifier Result diff --git a/.gitignore b/.gitignore index 873c3220..4e28c97d 100644 --- a/.gitignore +++ b/.gitignore @@ -4,3 +4,4 @@ build .DS_Store out +.kotlin 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/CHANGELOG.md b/CHANGELOG.md index 381098a5..d0859eea 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,10 @@ ## [Unreleased] +## [1.2.16] - 04.08.2025 + +- Adapt code for PhpStorm 2025.1 + ## [1.2.15] - 31.07.2025 - introduce an intention to add `@kphp-immutable-class` annotation diff --git a/build.gradle.kts b/build.gradle.kts index 3e435eb3..60ebae11 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -6,6 +6,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 +14,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,6 +30,7 @@ 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 { @@ -40,9 +42,6 @@ dependencies { // 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() testFramework(TestFrameworkType.Platform) } } @@ -50,6 +49,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 @@ -86,6 +86,17 @@ 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() diff --git a/gradle.properties b/gradle.properties index 7c0e96ac..d9532a61 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.15 +pluginVersion = 1.2.16 # 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.14.3 # 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..4e1ffdcf 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" +changelog = "2.3.0" +intelliJPlatform = "2.7.0" +kotlin = "2.2.0" +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..1b33c55b 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..d4081da4 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.14.3-bin.zip networkTimeout=10000 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME diff --git a/gradlew b/gradlew index f5feea6d..23d15a93 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 @@ -115,7 +114,7 @@ case "$( uname )" in #( NONSTOP* ) nonstop=true ;; esac -CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar +CLASSPATH="\\\"\\\"" # Determine the Java command to use to start the JVM. @@ -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. @@ -214,7 +213,7 @@ DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' set -- \ "-Dorg.gradle.appname=$APP_BASE_NAME" \ -classpath "$CLASSPATH" \ - org.gradle.wrapper.GradleWrapperMain \ + -jar "$APP_HOME/gradle/wrapper/gradle-wrapper.jar" \ "$@" # Stop when "xargs" is not available. diff --git a/gradlew.bat b/gradlew.bat index 9d21a218..db3a6ac2 100644 --- a/gradlew.bat +++ b/gradlew.bat @@ -70,11 +70,11 @@ goto fail :execute @rem Setup the command line -set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar +set CLASSPATH= @rem Execute Gradle -"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" -jar "%APP_HOME%\gradle\wrapper\gradle-wrapper.jar" %* :end @rem End local scope for the variables with windows NT shell diff --git a/settings.gradle.kts b/settings.gradle.kts index e6d0fb0f..36794d4b 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -1,5 +1,5 @@ plugins { - id("org.gradle.toolchains.foojay-resolver-convention") version "0.8.0" + id("org.gradle.toolchains.foojay-resolver-convention") version "1.0.0" } rootProject.name = "kphpstorm" 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..b141e457 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,24 @@ 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-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/KphpDocTagJsonElementType.kt b/src/main/kotlin/com/vk/kphpstorm/kphptags/psi/KphpDocTagJsonElementType.kt deleted file mode 100644 index 038db635..00000000 --- a/src/main/kotlin/com/vk/kphpstorm/kphptags/psi/KphpDocTagJsonElementType.kt +++ /dev/null @@ -1,29 +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 - -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) - } - - 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/KphpDocTagJsonPsiImpl.kt b/src/main/kotlin/com/vk/kphpstorm/kphptags/psi/KphpDocTagJsonPsiImpl.kt index 054ede74..d6bd24ed 100644 --- a/src/main/kotlin/com/vk/kphpstorm/kphptags/psi/KphpDocTagJsonPsiImpl.kt +++ b/src/main/kotlin/com/vk/kphpstorm/kphptags/psi/KphpDocTagJsonPsiImpl.kt @@ -1,14 +1,11 @@ package com.vk.kphpstorm.kphptags.psi import com.intellij.lang.ASTNode -import com.intellij.psi.stubs.IStubElementType import com.intellij.psi.util.PsiTreeUtil import com.jetbrains.php.lang.documentation.phpdoc.psi.impl.tags.PhpDocTagImpl -import com.jetbrains.php.lang.documentation.phpdoc.psi.stubs.PhpDocTagStub class KphpDocTagJsonPsiImpl : PhpDocTagImpl, KphpDocTagImpl { constructor(node: ASTNode) : super(node) - constructor(stub: PhpDocTagStub, nodeType: IStubElementType<*, *>) : super(stub, nodeType) fun item(): KphpDocJsonAttributePsiImpl? { val item = PsiTreeUtil.skipWhitespacesForward(firstChild) 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..635383cc 100644 --- a/src/main/kotlin/com/vk/kphpstorm/kphptags/psi/KphpDocTagSimplePsiImpl.kt +++ b/src/main/kotlin/com/vk/kphpstorm/kphptags/psi/KphpDocTagSimplePsiImpl.kt @@ -1,9 +1,7 @@ package com.vk.kphpstorm.kphptags.psi import com.intellij.lang.ASTNode -import com.intellij.psi.stubs.IStubElementType import com.jetbrains.php.lang.documentation.phpdoc.psi.impl.tags.PhpDocTagImpl -import com.jetbrains.php.lang.documentation.phpdoc.psi.stubs.PhpDocTagStub /** * Implemetation of 'simple' @kphp-... tag — created either from stub or from ast @@ -11,5 +9,4 @@ 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) } diff --git a/src/main/kotlin/com/vk/kphpstorm/kphptags/psi/KphpDocTagStubImpl.kt b/src/main/kotlin/com/vk/kphpstorm/kphptags/psi/KphpDocTagStubImpl.kt deleted file mode 100644 index 16d3b093..00000000 --- a/src/main/kotlin/com/vk/kphpstorm/kphptags/psi/KphpDocTagStubImpl.kt +++ /dev/null @@ -1,29 +0,0 @@ -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.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 - -/** - * When @kphp-... tags (regardless of elementType) are stored as stubs, - * they hold only name and optional arbitrary string value. - * Similar to [com.jetbrains.php.lang.documentation.phpdoc.psi.stubs.PhpDocTagStubImpl] - * - * TODO: make a research to check are we really need stubs? - */ -class KphpDocTagStubImpl( - parent: StubElement<*>?, - elementType: IStubElementType<*, *>, - private val name: String, - private val value: String? -) : StubBase(parent, elementType), PhpDocTagStub { - - override fun getType() = PhpType() - override fun getName() = name - override fun getValue() = value - - override fun toString(): String = "$name${if (value != null) ": $value" else ""}" -} diff --git a/src/main/kotlin/com/vk/kphpstorm/kphptags/psi/KphpDocTagTemplateClassElementType.kt b/src/main/kotlin/com/vk/kphpstorm/kphptags/psi/KphpDocTagTemplateClassElementType.kt deleted file mode 100644 index b0e5f85a..00000000 --- a/src/main/kotlin/com/vk/kphpstorm/kphptags/psi/KphpDocTagTemplateClassElementType.kt +++ /dev/null @@ -1,35 +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-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 { - return KphpDocTagTemplateClassPsiImpl(stub, stub.stubType) - } - - override 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) - } - - 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/KphpDocTagTemplateClassPsiImpl.kt b/src/main/kotlin/com/vk/kphpstorm/kphptags/psi/KphpDocTagTemplateClassPsiImpl.kt index 15c02fe2..73a3dfe3 100644 --- a/src/main/kotlin/com/vk/kphpstorm/kphptags/psi/KphpDocTagTemplateClassPsiImpl.kt +++ b/src/main/kotlin/com/vk/kphpstorm/kphptags/psi/KphpDocTagTemplateClassPsiImpl.kt @@ -1,7 +1,7 @@ package com.vk.kphpstorm.kphptags.psi import com.intellij.lang.ASTNode -import com.intellij.psi.stubs.IStubElementType +import com.intellij.psi.tree.IElementType import com.jetbrains.php.lang.documentation.phpdoc.psi.impl.tags.PhpDocTagImpl import com.jetbrains.php.lang.documentation.phpdoc.psi.stubs.PhpDocTagStub @@ -11,7 +11,7 @@ import com.jetbrains.php.lang.documentation.phpdoc.psi.stubs.PhpDocTagStub */ class KphpDocTagTemplateClassPsiImpl : PhpDocTagImpl, KphpDocTagImpl { constructor(node: ASTNode) : super(node) - constructor(stub: PhpDocTagStub, nodeType: IStubElementType<*, *>) : super(stub, nodeType) + constructor(stub: PhpDocTagStub, nodeType: IElementType) : super(stub, nodeType) // important! this function can be called when current file is not loaded, // but we store all necessary information in stub diff --git a/src/main/kotlin/com/vk/kphpstorm/kphptags/psi/KphpDocTagWarnPerformanceElementType.kt b/src/main/kotlin/com/vk/kphpstorm/kphptags/psi/KphpDocTagWarnPerformanceElementType.kt deleted file mode 100644 index 67a291f4..00000000 --- a/src/main/kotlin/com/vk/kphpstorm/kphptags/psi/KphpDocTagWarnPerformanceElementType.kt +++ /dev/null @@ -1,30 +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 - -object KphpDocTagWarnPerformanceElementType : PhpStubElementType("@kphp-warn-performance") { - override 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) - } - - 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/KphpDocTagWarnPerformancePsiImpl.kt b/src/main/kotlin/com/vk/kphpstorm/kphptags/psi/KphpDocTagWarnPerformancePsiImpl.kt index a9d46c73..66332d08 100644 --- a/src/main/kotlin/com/vk/kphpstorm/kphptags/psi/KphpDocTagWarnPerformancePsiImpl.kt +++ b/src/main/kotlin/com/vk/kphpstorm/kphptags/psi/KphpDocTagWarnPerformancePsiImpl.kt @@ -1,9 +1,7 @@ package com.vk.kphpstorm.kphptags.psi import com.intellij.lang.ASTNode -import com.intellij.psi.stubs.IStubElementType import com.jetbrains.php.lang.documentation.phpdoc.psi.impl.tags.PhpDocTagImpl -import com.jetbrains.php.lang.documentation.phpdoc.psi.stubs.PhpDocTagStub /** * Implemetation of '@kphp-analyze-performance' and '@kphp-warn-performance' tags @@ -11,5 +9,4 @@ import com.jetbrains.php.lang.documentation.phpdoc.psi.stubs.PhpDocTagStub */ class KphpDocTagWarnPerformancePsiImpl : PhpDocTagImpl, KphpDocTagImpl { constructor(node: ASTNode) : super(node) - constructor(stub: PhpDocTagStub, nodeType: IStubElementType<*, *>) : super(stub, nodeType) } diff --git a/src/main/kotlin/com/vk/kphpstorm/kphptags/psi/stubs/KphpDocTagTemplateClassElementTypeFactory.kt b/src/main/kotlin/com/vk/kphpstorm/kphptags/psi/stubs/KphpDocTagTemplateClassElementTypeFactory.kt new file mode 100644 index 00000000..ae593611 --- /dev/null +++ b/src/main/kotlin/com/vk/kphpstorm/kphptags/psi/stubs/KphpDocTagTemplateClassElementTypeFactory.kt @@ -0,0 +1,33 @@ +package com.vk.kphpstorm.kphptags.psi.stubs + +import com.intellij.lang.ASTNode +import com.intellij.psi.PsiElement +import com.intellij.psi.stubs.StubElement +import com.intellij.psi.stubs.StubElementFactory +import com.intellij.util.io.StringRef +import com.jetbrains.php.lang.documentation.phpdoc.psi.stubs.PhpDocTagStub +import com.jetbrains.php.lang.documentation.phpdoc.psi.stubs.PhpDocTagStubImpl +import com.vk.kphpstorm.kphptags.psi.KphpDocElementTypes +import com.vk.kphpstorm.kphptags.psi.KphpDocTagTemplateClassPsiImpl + +@Suppress("UnstableApiUsage") +object KphpDocTagTemplateClassElementTypeFactory : StubElementFactory { + override fun createPsi(stub: PhpDocTagStub): KphpDocTagTemplateClassPsiImpl { + return KphpDocTagTemplateClassPsiImpl(stub, KphpDocElementTypes.kphpDocTagTemplateClass) + } + + override fun createStub(psi: KphpDocTagTemplateClassPsiImpl, parentStub: StubElement?): PhpDocTagStub { + // stub value is 'T1,T2' — without spaces + val stubValue = psi.getTemplateArguments().joinToString(",") + + return PhpDocTagStubImpl( + parentStub, + KphpDocElementTypes.kphpDocTagTemplateClass, + StringRef.fromString(psi.name), + StringRef.fromString(stubValue) + ) + } + + override fun shouldCreateStub(node: ASTNode): Boolean = + node.elementType == KphpDocElementTypes.kphpDocTagTemplateClass +} diff --git a/src/main/kotlin/com/vk/kphpstorm/kphptags/psi/stubs/KphpStubRegistryExtension.kt b/src/main/kotlin/com/vk/kphpstorm/kphptags/psi/stubs/KphpStubRegistryExtension.kt new file mode 100644 index 00000000..45f52300 --- /dev/null +++ b/src/main/kotlin/com/vk/kphpstorm/kphptags/psi/stubs/KphpStubRegistryExtension.kt @@ -0,0 +1,59 @@ +package com.vk.kphpstorm.kphptags.psi.stubs + +import com.intellij.psi.stubs.StubRegistry +import com.intellij.psi.stubs.StubRegistryExtension +import com.jetbrains.php.lang.documentation.phpdoc.psi.stubs.PhpDocTagStubSerializer +import com.jetbrains.php.lang.psi.stubs.stub_factories.PhpDocTagStubFactory +import com.vk.kphpstorm.kphptags.psi.KphpDocElementTypes + +@Suppress("UnstableApiUsage") +class KphpStubRegistryExtension : StubRegistryExtension { + override fun register(registry: StubRegistry) { + registerSerializers(registry) + registerFactories(registry) + } + + private fun registerSerializers(registry: StubRegistry) { + registry.registerStubSerializer( + KphpDocElementTypes.kphpDocTagSimple, + PhpDocTagStubSerializer(KphpDocElementTypes.kphpDocTagSimple) + ) + + registry.registerStubSerializer( + KphpDocElementTypes.kphpDocTagTemplateClass, + PhpDocTagStubSerializer(KphpDocElementTypes.kphpDocTagTemplateClass) + ) + + registry.registerStubSerializer( + KphpDocElementTypes.kphpDocTagWarnPerformance, + PhpDocTagStubSerializer(KphpDocElementTypes.kphpDocTagWarnPerformance) + ) + + registry.registerStubSerializer( + KphpDocElementTypes.kphpDocTagJson, + PhpDocTagStubSerializer(KphpDocElementTypes.kphpDocTagJson) + ) + } + + private fun registerFactories(registry: StubRegistry) { + registry.registerStubFactory( + KphpDocElementTypes.kphpDocTagSimple, + PhpDocTagStubFactory(KphpDocElementTypes.kphpDocTagSimple) + ) + + registry.registerStubFactory( + KphpDocElementTypes.kphpDocTagTemplateClass, + KphpDocTagTemplateClassElementTypeFactory + ) + + registry.registerStubFactory( + KphpDocElementTypes.kphpDocTagWarnPerformance, + PhpDocTagStubFactory(KphpDocElementTypes.kphpDocTagWarnPerformance) + ) + + registry.registerStubFactory( + KphpDocElementTypes.kphpDocTagJson, + PhpDocTagStubFactory(KphpDocElementTypes.kphpDocTagJson) + ) + } +} diff --git a/src/main/resources/META-INF/plugin.xml b/src/main/resources/META-INF/plugin.xml index a8184dca..6668480b 100644 --- a/src/main/resources/META-INF/plugin.xml +++ b/src/main/resources/META-INF/plugin.xml @@ -94,6 +94,7 @@ + {name: @kphp-serializable}:PhpDocTagStubImpl + {name: @kphp-reserved-fields}:PhpDocTagStubImpl CLASS:PhpClassStubImpl{C} DOC_COMMENT:PhpDocCommentStubImpl - @kphp-... {name: @kphp-serialized-float32}:@kphp-serialized-float32 + {name: @kphp-serialized-float32}:PhpDocTagStubImpl CLASS_FIELDS:PhpClassFieldListStubImpl CLASS_FIELD:PhpFieldStubImpl DOC_COMMENT:PhpDocCommentStubImpl - @kphp-... {name: @kphp-serialized-field}:@kphp-serialized-field + {name: @kphp-serialized-field}:PhpDocTagStubImpl CLASS_FIELDS:PhpClassFieldListStubImpl CLASS_FIELD:PhpFieldStubImpl DOC_COMMENT:PhpDocCommentStubImpl - @kphp-... {name: @kphp-serialized-field}:@kphp-serialized-field + {name: @kphp-serialized-field}:PhpDocTagStubImpl CLASS_FIELDS:PhpClassFieldListStubImpl CLASS_FIELD:PhpFieldStubImpl diff --git a/src/test/fixtures/kphp_stub/kphp-simple-tags.stub.php b/src/test/fixtures/kphp_stub/kphp-simple-tags.stub.php index 13affd06..f9c56c7c 100644 --- a/src/test/fixtures/kphp_stub/kphp-simple-tags.stub.php +++ b/src/test/fixtures/kphp_stub/kphp-simple-tags.stub.php @@ -1,10 +1,10 @@ PhpFileStubImpl DOC_COMMENT:PhpDocCommentStubImpl - @kphp-... {name: @kphp-throws}:@kphp-throws - @kphp-... {name: @kphp-color}:@kphp-color - @kphp-... {name: @kphp-required}:@kphp-required - @kphp-... {name: @kphp-inline}:@kphp-inline - @kphp-... {name: @kphp-profile}:@kphp-profile + {name: @kphp-throws}:PhpDocTagStubImpl + {name: @kphp-color}:PhpDocTagStubImpl + {name: @kphp-required}:PhpDocTagStubImpl + {name: @kphp-inline}:PhpDocTagStubImpl + {name: @kphp-profile}:PhpDocTagStubImpl FUNCTION:PhpFunctionStubImpl NOT_PROMOTED_PARAMETER:PhpParameterStubImpl NOT_PROMOTED_PARAMETER:PhpParameterStubImpl diff --git a/src/test/fixtures/kphp_stub/kphp-template.stub.php b/src/test/fixtures/kphp_stub/kphp-template.stub.php index afd06096..0d65eb0e 100644 --- a/src/test/fixtures/kphp_stub/kphp-template.stub.php +++ b/src/test/fixtures/kphp_stub/kphp-template.stub.php @@ -1,4 +1,4 @@ PhpFileStubImpl DOC_COMMENT:PhpDocCommentStubImpl - @kphp-template-class {name: @kphp-template-class, value: int,string}:@kphp-template-class: int,string + @kphp-template-class {name: @kphp-template-class, value: int,string}:PhpDocTagStubImpl CLASS:PhpClassStubImpl{C} diff --git a/src/test/fixtures/kphp_stub/kphp-warn-performance.stub.php b/src/test/fixtures/kphp_stub/kphp-warn-performance.stub.php index 24b3092f..55e26590 100644 --- a/src/test/fixtures/kphp_stub/kphp-warn-performance.stub.php +++ b/src/test/fixtures/kphp_stub/kphp-warn-performance.stub.php @@ -1,4 +1,4 @@ PhpFileStubImpl DOC_COMMENT:PhpDocCommentStubImpl - @kphp-warn-performance {name: @kphp-warn-performance}:@kphp-warn-performance + @kphp-warn-performance {name: @kphp-warn-performance}:PhpDocTagStubImpl FUNCTION:PhpFunctionStubImpl diff --git a/src/test/kotlin/com/vk/kphpstorm/testing/infrastructure/KphpStormTestBase.kt b/src/test/kotlin/com/vk/kphpstorm/testing/infrastructure/KphpStormTestBase.kt index 07b3c434..746c7f20 100644 --- a/src/test/kotlin/com/vk/kphpstorm/testing/infrastructure/KphpStormTestBase.kt +++ b/src/test/kotlin/com/vk/kphpstorm/testing/infrastructure/KphpStormTestBase.kt @@ -1,8 +1,10 @@ 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 +import java.nio.file.Paths abstract class KphpStormTestBase() : BasePlatformTestCase() { @@ -13,6 +15,8 @@ abstract class KphpStormTestBase() : BasePlatformTestCase() { override fun setUp() { super.setUp() setupLanguageLevel() + val testDataAbsPath = Paths.get(testDataPath).toAbsolutePath().toString() + VfsRootAccess.allowRootAccess(testRootDisposable, testDataAbsPath) } private fun setupLanguageLevel() { diff --git a/src/test/kotlin/com/vk/kphpstorm/testing/infrastructure/StubTestBase.kt b/src/test/kotlin/com/vk/kphpstorm/testing/infrastructure/StubTestBase.kt index 31c01789..c4de74b1 100644 --- a/src/test/kotlin/com/vk/kphpstorm/testing/infrastructure/StubTestBase.kt +++ b/src/test/kotlin/com/vk/kphpstorm/testing/infrastructure/StubTestBase.kt @@ -40,7 +40,6 @@ abstract class StubTestBase : KphpStormTestBase() { assertSameLinesWithFile(expectedFile.absolutePath, stubTreeString) } - private fun dumpToString(node: StubElement<*>): String { val buffer = StringBuilder() dumpToString(node, buffer, 0) @@ -72,10 +71,12 @@ abstract class StubTestBase : KphpStormTestBase() { } is PhpDocTagStub -> { - "${node.stubType} {name: ${node.name}${if (node.value != null) ", value: " + node.value else ""}}" + "${node.elementType} {name: ${node.name}${if (node.value != null) ", value: " + node.value else ""}}" } - else -> node.stubType + else -> { + if (node is StubElement<*>) node.elementType else node.stubSerializer + } } } }