Light classes, minor: introduce cannotModify() utility

This commit is contained in:
Pavel V. Talanov
2017-05-09 20:34:36 +03:00
parent 51af18608f
commit 6701eb70fb
5 changed files with 22 additions and 20 deletions
@@ -16,5 +16,12 @@
package org.jetbrains.kotlin.asJava.classes package org.jetbrains.kotlin.asJava.classes
import com.intellij.psi.impl.light.LightElement
import com.intellij.util.IncorrectOperationException
// NOTE: avoid using blocking lazy in light classes, it leads to deadlocks // NOTE: avoid using blocking lazy in light classes, it leads to deadlocks
fun <T> lazyPub(initializer: () -> T) = lazy(LazyThreadSafetyMode.PUBLICATION, initializer) fun <T> lazyPub(initializer: () -> T) = lazy(LazyThreadSafetyMode.PUBLICATION, initializer)
fun LightElement.cannotModify(): Nothing {
throw IncorrectOperationException("Modification not implemented.")
}
@@ -18,13 +18,12 @@ package org.jetbrains.kotlin.asJava.elements
import com.intellij.psi.* import com.intellij.psi.*
import com.intellij.psi.impl.PsiVariableEx import com.intellij.psi.impl.PsiVariableEx
import com.intellij.util.IncorrectOperationException
import org.jetbrains.annotations.NonNls import org.jetbrains.annotations.NonNls
import org.jetbrains.kotlin.asJava.builder.ClsWrapperStubPsiFactory
import org.jetbrains.kotlin.asJava.builder.LightMemberOrigin import org.jetbrains.kotlin.asJava.builder.LightMemberOrigin
import org.jetbrains.kotlin.asJava.builder.LightMemberOriginForDeclaration import org.jetbrains.kotlin.asJava.builder.LightMemberOriginForDeclaration
import org.jetbrains.kotlin.asJava.classes.KtLightClass import org.jetbrains.kotlin.asJava.classes.KtLightClass
import org.jetbrains.kotlin.asJava.classes.KtLightClassForEnumEntry import org.jetbrains.kotlin.asJava.classes.KtLightClassForEnumEntry
import org.jetbrains.kotlin.asJava.classes.cannotModify
import org.jetbrains.kotlin.asJava.classes.lazyPub import org.jetbrains.kotlin.asJava.classes.lazyPub
import org.jetbrains.kotlin.psi.KtEnumEntry import org.jetbrains.kotlin.psi.KtEnumEntry
import org.jetbrains.kotlin.psi.KtNamedDeclaration import org.jetbrains.kotlin.psi.KtNamedDeclaration
@@ -41,8 +40,7 @@ sealed class KtLightFieldImpl<D : PsiField>(
@Suppress("UNCHECKED_CAST") @Suppress("UNCHECKED_CAST")
get() = super.clsDelegate as D get() = super.clsDelegate as D
@Throws(IncorrectOperationException::class) override fun setInitializer(initializer: PsiExpression?) = cannotModify()
override fun setInitializer(initializer: PsiExpression?) = throw IncorrectOperationException("Not supported")
override fun getType() = clsDelegate.type override fun getType() = clsDelegate.type
@@ -52,8 +50,7 @@ sealed class KtLightFieldImpl<D : PsiField>(
override fun hasInitializer() = clsDelegate.hasInitializer() override fun hasInitializer() = clsDelegate.hasInitializer()
@Throws(IncorrectOperationException::class) override fun normalizeDeclaration() = cannotModify()
override fun normalizeDeclaration() = throw IncorrectOperationException("Not supported")
override fun computeConstantValue() = clsDelegate.computeConstantValue() override fun computeConstantValue() = clsDelegate.computeConstantValue()
@@ -20,10 +20,13 @@ import com.intellij.psi.*
import com.intellij.psi.impl.compiled.ClsTypeElementImpl import com.intellij.psi.impl.compiled.ClsTypeElementImpl
import com.intellij.psi.scope.PsiScopeProcessor import com.intellij.psi.scope.PsiScopeProcessor
import com.intellij.psi.util.* import com.intellij.psi.util.*
import com.intellij.util.IncorrectOperationException
import org.jetbrains.kotlin.asJava.LightClassUtil import org.jetbrains.kotlin.asJava.LightClassUtil
import org.jetbrains.kotlin.asJava.builder.* import org.jetbrains.kotlin.asJava.builder.LightMemberOrigin
import org.jetbrains.kotlin.asJava.builder.LightMemberOriginForDeclaration
import org.jetbrains.kotlin.asJava.builder.MemberIndex
import org.jetbrains.kotlin.asJava.builder.memberIndex
import org.jetbrains.kotlin.asJava.classes.KtLightClass import org.jetbrains.kotlin.asJava.classes.KtLightClass
import org.jetbrains.kotlin.asJava.classes.cannotModify
import org.jetbrains.kotlin.asJava.classes.lazyPub import org.jetbrains.kotlin.asJava.classes.lazyPub
import org.jetbrains.kotlin.asJava.propertyNameByAccessor import org.jetbrains.kotlin.asJava.propertyNameByAccessor
import org.jetbrains.kotlin.asJava.unwrapped import org.jetbrains.kotlin.asJava.unwrapped
@@ -93,7 +96,7 @@ class KtLightMethodImpl private constructor(
nameExpression.replace(KtPsiFactory(this).createStringTemplate(name)) nameExpression.replace(KtPsiFactory(this).createStringTemplate(name))
} }
else { else {
val toRename = kotlinOrigin as? PsiNamedElement ?: throwCanNotModify() val toRename = kotlinOrigin as? PsiNamedElement ?: cannotModify()
toRename.setName(newNameForOrigin) toRename.setName(newNameForOrigin)
} }
return this return this
@@ -104,12 +107,9 @@ class KtLightMethodImpl private constructor(
if (it.isValid) { if (it.isValid) {
it.delete() it.delete()
} }
} ?: throwCanNotModify() } ?: cannotModify()
} }
// TODO: add message
private fun throwCanNotModify(): Nothing = throw IncorrectOperationException()
override fun getModifierList(): PsiModifierList { override fun getModifierList(): PsiModifierList {
if (calculatingReturnType.get() == true) { if (calculatingReturnType.get() == true) {
return KotlinJavaPsiFacade.getInstance(project).emptyModifierList return KotlinJavaPsiFacade.getInstance(project).emptyModifierList
@@ -22,6 +22,7 @@ import com.intellij.psi.*
import org.jetbrains.annotations.NotNull import org.jetbrains.annotations.NotNull
import org.jetbrains.annotations.Nullable import org.jetbrains.annotations.Nullable
import org.jetbrains.kotlin.asJava.LightClassGenerationSupport import org.jetbrains.kotlin.asJava.LightClassGenerationSupport
import org.jetbrains.kotlin.asJava.classes.cannotModify
import org.jetbrains.kotlin.asJava.classes.lazyPub import org.jetbrains.kotlin.asJava.classes.lazyPub
import org.jetbrains.kotlin.idea.KotlinLanguage import org.jetbrains.kotlin.idea.KotlinLanguage
import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.psi.*
@@ -187,8 +188,7 @@ class KtLightAnnotationForSourceEntry(
override fun hashCode() = kotlinOrigin.hashCode() override fun hashCode() = kotlinOrigin.hashCode()
override fun <T : PsiAnnotationMemberValue?> setDeclaredAttributeValue(attributeName: String?, value: T?): T override fun <T : PsiAnnotationMemberValue?> setDeclaredAttributeValue(attributeName: String?, value: T?) = cannotModify()
= clsDelegate.setDeclaredAttributeValue(attributeName, value)
} }
class KtLightNonSourceAnnotation( class KtLightNonSourceAnnotation(
@@ -196,8 +196,7 @@ class KtLightNonSourceAnnotation(
): KtLightAbstractAnnotation(parent, { clsDelegate }) { ): KtLightAbstractAnnotation(parent, { clsDelegate }) {
override val kotlinOrigin: KtAnnotationEntry? get() = null override val kotlinOrigin: KtAnnotationEntry? get() = null
override fun getQualifiedName() = clsDelegate.qualifiedName override fun getQualifiedName() = clsDelegate.qualifiedName
override fun <T : PsiAnnotationMemberValue?> setDeclaredAttributeValue(attributeName: String?, value: T?) override fun <T : PsiAnnotationMemberValue?> setDeclaredAttributeValue(attributeName: String?, value: T?) = cannotModify()
= clsDelegate.setDeclaredAttributeValue(attributeName, value)
override fun findAttributeValue(attributeName: String?) = clsDelegate.findAttributeValue(attributeName) override fun findAttributeValue(attributeName: String?) = clsDelegate.findAttributeValue(attributeName)
override fun findDeclaredAttributeValue(attributeName: String?) = clsDelegate.findDeclaredAttributeValue(attributeName) override fun findDeclaredAttributeValue(attributeName: String?) = clsDelegate.findDeclaredAttributeValue(attributeName)
} }
@@ -244,8 +243,6 @@ class KtLightNullabilityAnnotation(member: KtLightElement<*, PsiModifierListOwne
override fun findDeclaredAttributeValue(attributeName: String?) = null override fun findDeclaredAttributeValue(attributeName: String?) = null
} }
private fun cannotModify(): Nothing = error("Cannot modify") // TODO: meaningful message?
internal fun isNullabilityAnnotation(qualifiedName: String?) = qualifiedName in backendNullabilityAnnotations internal fun isNullabilityAnnotation(qualifiedName: String?) = qualifiedName in backendNullabilityAnnotations
private val backendNullabilityAnnotations = arrayOf(Nullable::class.java.name, NotNull::class.java.name) private val backendNullabilityAnnotations = arrayOf(Nullable::class.java.name, NotNull::class.java.name)
@@ -18,6 +18,7 @@ package org.jetbrains.kotlin.asJava
import com.intellij.psi.* import com.intellij.psi.*
import com.intellij.psi.search.GlobalSearchScope import com.intellij.psi.search.GlobalSearchScope
import com.intellij.util.IncorrectOperationException
import org.jetbrains.kotlin.asJava.classes.KtLightClass import org.jetbrains.kotlin.asJava.classes.KtLightClass
import org.jetbrains.kotlin.asJava.classes.KtLightClassForFacade import org.jetbrains.kotlin.asJava.classes.KtLightClassForFacade
import org.jetbrains.kotlin.asJava.elements.KtLightAnnotationForSourceEntry import org.jetbrains.kotlin.asJava.elements.KtLightAnnotationForSourceEntry