Skip to content

Commit c2b6dbb

Browse files
committed
Version 1.27.2.
Fix #44: ProhibitedAnalysisException: Analysis is not allowed: Called from a write action
1 parent 777dcfb commit c2b6dbb

File tree

10 files changed

+62
-22
lines changed

10 files changed

+62
-22
lines changed

CHANGES.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,6 @@
1+
### 1.27.2
2+
* Fix [#44](https://github.com/BlueBoxWare/LibGDXPlugin/issues/44): ProhibitedAnalysisException: Analysis is not allowed: Called from a write action
3+
14
### 1.27.1
25
* Fix [#45](https://github.com/BlueBoxWare/LibGDXPlugin/issues/45): Freeze when creating Enum
36

gradle.properties

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
pluginGroup = com.gmail.blueboxware
22
pluginName = LibGDX
3-
pluginVersion = 1.27.1
3+
pluginVersion = 1.27.2
44

55
pluginSinceBuild = 252.27397.103
66
#pluginSinceBuild = 253.29346.138

src/main/kotlin/com/gmail/blueboxware/libgdxplugin/references/ColorsReferenceContributor.kt

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package com.gmail.blueboxware.libgdxplugin.references
22

3+
import com.gmail.blueboxware.libgdxplugin.utils.LibGDXPsiReferenceProvider
34
import com.gmail.blueboxware.libgdxplugin.utils.getParentOfType
45
import com.gmail.blueboxware.libgdxplugin.utils.isColorsGetCall
56
import com.intellij.patterns.PlatformPatterns
@@ -33,7 +34,7 @@ internal class ColorsReferenceContributor : PsiReferenceContributor() {
3334

3435
registrar.registerReferenceProvider(
3536
PlatformPatterns.psiElement(PsiLiteralExpression::class.java),
36-
object : PsiReferenceProvider() {
37+
object : LibGDXPsiReferenceProvider() {
3738
override fun getReferencesByElement(
3839
element: PsiElement,
3940
context: ProcessingContext
@@ -54,7 +55,7 @@ internal class ColorsReferenceContributor : PsiReferenceContributor() {
5455
)
5556

5657
registrar.registerReferenceProvider(
57-
PlatformPatterns.psiElement(KtStringTemplateExpression::class.java), object : PsiReferenceProvider() {
58+
PlatformPatterns.psiElement(KtStringTemplateExpression::class.java), object : LibGDXPsiReferenceProvider() {
5859
override fun getReferencesByElement(
5960
element: PsiElement,
6061
context: ProcessingContext

src/main/kotlin/com/gmail/blueboxware/libgdxplugin/references/JavaReferenceContributor.kt

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,7 @@ import com.gmail.blueboxware.libgdxplugin.filetypes.atlas2.LibGDXAtlas2FileType
44
import com.gmail.blueboxware.libgdxplugin.filetypes.atlas2.LibGDXAtlas2Language
55
import com.gmail.blueboxware.libgdxplugin.filetypes.skin.LibGDXSkinFileType
66
import com.gmail.blueboxware.libgdxplugin.filetypes.skin.LibGDXSkinLanguage
7-
import com.gmail.blueboxware.libgdxplugin.utils.ASSET_ANNOTATION_ATLAS_PARAM_NAME
8-
import com.gmail.blueboxware.libgdxplugin.utils.ASSET_ANNOTATION_NAME
9-
import com.gmail.blueboxware.libgdxplugin.utils.ASSET_ANNOTATION_PROPERTIES_PARAM_NAME
10-
import com.gmail.blueboxware.libgdxplugin.utils.ASSET_ANNOTATION_SKIN_PARAM_NAME
7+
import com.gmail.blueboxware.libgdxplugin.utils.*
118
import com.intellij.json.JsonFileType
129
import com.intellij.lang.Language
1310
import com.intellij.lang.properties.PropertiesFileType
@@ -81,7 +78,7 @@ internal class JavaReferenceContributor : PsiReferenceContributor() {
8178
registrar.registerReferenceProvider(
8279
PsiJavaPatterns.literalExpression(StandardPatterns.string())
8380
.insideAnnotationParam(StandardPatterns.string().equalTo(ASSET_ANNOTATION_NAME), paramName),
84-
object : PsiReferenceProvider() {
81+
object : LibGDXPsiReferenceProvider() {
8582
override fun getReferencesByElement(
8683
element: PsiElement,
8784
context: ProcessingContext

src/main/kotlin/com/gmail/blueboxware/libgdxplugin/references/KotlinReferenceContributor.kt

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,10 @@ import com.intellij.lang.properties.PropertiesLanguage
1212
import com.intellij.openapi.fileTypes.FileType
1313
import com.intellij.openapi.fileTypes.PlainTextFileType
1414
import com.intellij.patterns.PlatformPatterns
15-
import com.intellij.psi.*
15+
import com.intellij.psi.PsiElement
16+
import com.intellij.psi.PsiReference
17+
import com.intellij.psi.PsiReferenceContributor
18+
import com.intellij.psi.PsiReferenceRegistrar
1619
import com.intellij.util.PathUtil
1720
import com.intellij.util.ProcessingContext
1821
import org.jetbrains.kotlin.analysis.api.permissions.KaAllowAnalysisOnEdt
@@ -82,7 +85,7 @@ internal class KotlinReferenceContributor : PsiReferenceContributor() {
8285

8386
registrar.registerReferenceProvider(
8487
PlatformPatterns.psiElement(KtStringTemplateExpression::class.java).inside(KtAnnotationEntry::class.java),
85-
object : PsiReferenceProvider() {
88+
object : LibGDXPsiReferenceProvider() {
8689

8790
@OptIn(KaAllowAnalysisOnEdt::class)
8891
override fun getReferencesByElement(
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
/*
2+
* Copyright 2025 Blue Box Ware
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
*
8+
* http://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*/
16+
17+
package com.gmail.blueboxware.libgdxplugin.utils
18+
19+
import com.intellij.psi.PsiElement
20+
import com.intellij.psi.PsiReferenceProvider
21+
22+
abstract class LibGDXPsiReferenceProvider : PsiReferenceProvider() {
23+
override fun acceptsTarget(target: PsiElement): Boolean = target.project.isLibGDXProject()
24+
}

src/main/kotlin/com/gmail/blueboxware/libgdxplugin/utils/MiscUtils.kt

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package com.gmail.blueboxware.libgdxplugin.utils
22

33
import com.intellij.java.library.getMavenCoordinates
4+
import com.intellij.openapi.application.ApplicationManager
45
import com.intellij.openapi.progress.EmptyProgressIndicator
56
import com.intellij.openapi.progress.ProgressManager
67
import com.intellij.openapi.project.Project
@@ -16,8 +17,11 @@ import com.intellij.psi.util.CachedValueProvider
1617
import com.intellij.psi.util.CachedValuesManager
1718
import com.intellij.psi.util.PsiModificationTracker
1819
import com.intellij.util.asSafely
20+
import org.jetbrains.kotlin.analysis.api.KaSession
21+
import org.jetbrains.kotlin.analysis.api.analyze
1922
import org.jetbrains.kotlin.config.MavenComparableVersion
2023
import org.jetbrains.kotlin.idea.base.util.allScope
24+
import org.jetbrains.kotlin.psi.KtElement
2125

2226
/*
2327
* Copyright 2017 Blue Box Ware
@@ -142,3 +146,11 @@ internal inline fun <R> Project.getCachedValue(
142146
}, false)
143147

144148
internal fun <E> List<E>.indexOfOrNull(element: E): Int? = indexOf(element).takeIf { it >= 0 }
149+
150+
internal fun <R> analyzeWriteSafe(
151+
useSiteElement: KtElement,
152+
action: KaSession.() -> R
153+
): R? =
154+
if (!ApplicationManager.getApplication().isWriteAccessAllowed)
155+
analyze(useSiteElement, action)
156+
else null

src/main/kotlin/com/gmail/blueboxware/libgdxplugin/utils/PsiUtils.kt

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@ import com.intellij.psi.util.InheritanceUtil
1515
import com.intellij.psi.util.PsiTreeUtil
1616
import com.intellij.psi.util.TypeConversionUtil
1717
import com.intellij.util.PathUtil
18-
import org.jetbrains.kotlin.analysis.api.analyze
1918
import org.jetbrains.kotlin.analysis.api.permissions.KaAllowAnalysisFromWriteAction
2019
import org.jetbrains.kotlin.analysis.api.permissions.KaAllowAnalysisOnEdt
2120
import org.jetbrains.kotlin.analysis.api.permissions.allowAnalysisOnEdt
@@ -237,14 +236,17 @@ internal fun KtQualifiedExpression.resolveCall(): Pair<ClassId, String>? {
237236
var receiverType: ClassId? =
238237
if (receiverExpression is KtNameReferenceExpression) (receiverExpression.references.firstOrNull { it is KtSimpleNameReference }
239238
?.resolve() as? PsiClass)?.classId
240-
else analyze(receiverExpression) {
239+
else analyzeWriteSafe(receiverExpression) {
241240
(receiverExpression.expressionType as? KaClassType)?.classId
242241
}
243242

244243
if (receiverType == null) {
245-
receiverType = analyze(receiverExpression) {
244+
receiverType = analyzeWriteSafe(receiverExpression) {
246245
(receiverExpression.expressionType?.lowerBoundIfFlexible() as? KaClassType)?.classId
247-
?: return@getCachedValue null
246+
?: return@analyzeWriteSafe null
247+
}
248+
if (receiverType == null) {
249+
return@getCachedValue null
248250
}
249251
}
250252

@@ -269,13 +271,13 @@ internal fun KtCallExpression.resolveCallToStrings(): Pair<String, String>? = re
269271
Pair(it.first.asFqNameString(), it.second.getReferencedName())
270272
}
271273

272-
internal fun KtExpression.classId(): ClassId? = analyze(this) {
274+
internal fun KtExpression.classId(): ClassId? = analyzeWriteSafe(this) {
273275
(expressionType?.lowerBoundIfFlexible() as? KaClassType)?.classId
274276
}
275277

276278
@OptIn(KaAllowAnalysisOnEdt::class)
277279
internal fun KtClassLiteralExpression.classId(): String? = allowAnalysisOnEdt {
278-
analyze(this) {
280+
analyzeWriteSafe(this) {
279281
(receiverType as? KaClassType)?.classId?.asFqNameString()
280282
}
281283
}
@@ -290,7 +292,7 @@ fun KtElement?.getCalleeExpressionIfAny(): KtExpression? =
290292
}
291293

292294
internal fun KtExpression.fqName(): String? =
293-
analyze(this) { (expressionType?.lowerBoundIfFlexible() as? KaClassType)?.classId?.asFqNameString() }
295+
analyzeWriteSafe(this) { (expressionType?.lowerBoundIfFlexible() as? KaClassType)?.classId?.asFqNameString() }
294296

295297
internal fun PsiElement.findLeaf(elementType: IElementType): LeafPsiElement? =
296298
allChildren.firstOrNull { it.isLeaf(elementType) } as? LeafPsiElement
@@ -316,8 +318,7 @@ internal fun PsiElement.findElement(condition: (PsiElement) -> Boolean): PsiElem
316318
internal inline fun <reified T : PsiElement> PsiElement.getParentOfType(strict: Boolean = true): T? =
317319
PsiTreeUtil.getParentOfType(this, T::class.java, strict)
318320

319-
internal fun KtAnnotationEntry.classId(): ClassId? = analyze(this) {
320-
// (calleeExpression?.expressionType as? KaClassType)?.classId
321+
internal fun KtAnnotationEntry.classId(): ClassId? = analyzeWriteSafe(this) {
321322
(calleeExpression?.typeReference?.type as? KaClassType)?.classId
322323
}
323324

src/main/kotlin/com/gmail/blueboxware/libgdxplugin/utils/TagUtils.kt

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@ import com.intellij.psi.search.searches.ClassInheritorsSearch
1212
import com.intellij.psi.search.searches.ReferencesSearch
1313
import com.intellij.psi.util.CachedValue
1414
import com.intellij.psi.util.PsiModificationTracker
15-
import org.jetbrains.kotlin.analysis.api.analyze
1615
import org.jetbrains.kotlin.analysis.api.types.KaClassType
1716
import org.jetbrains.kotlin.asJava.elements.KtLightElement
1817
import org.jetbrains.kotlin.idea.base.util.allScope
@@ -144,7 +143,7 @@ private fun Project.collectCustomTags(): TagMap {
144143
?.asPlainString()?.let { firstArgument ->
145144

146145
arguments.getOrNull(1)?.getArgumentExpression()?.let { secondArgument ->
147-
analyze(secondArgument) {
146+
analyzeWriteSafe(secondArgument) {
148147
(secondArgument.expressionType as? KaClassType)
149148
?.typeArguments
150149
?.firstOrNull()

src/main/resources/META-INF/plugin.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@
3030

3131
<change-notes><![CDATA[
3232
<ul>
33-
<li>Fix #45: Freeze when creating Enum</li>
33+
<li>Fix #44: ProhibitedAnalysisException: Analysis is not allowed: Called from a write action</li>
3434
</ul>
3535
]]>
3636
</change-notes>

0 commit comments

Comments
 (0)