Get rid of wrong assumption that Java* classes are always PSI-based
See org.jetbrains.kotlin.load.java.structure.impl.classFiles.BinaryJavaClass as a counter-example, these classes may be used now in CLI too and they aren't built upon Java PSI
This commit is contained in:
+11
-2
@@ -20,6 +20,7 @@ import com.intellij.psi.impl.JavaConstantExpressionEvaluator
|
|||||||
import com.intellij.psi.util.PsiUtil
|
import com.intellij.psi.util.PsiUtil
|
||||||
import org.jetbrains.kotlin.descriptors.PropertyDescriptor
|
import org.jetbrains.kotlin.descriptors.PropertyDescriptor
|
||||||
import org.jetbrains.kotlin.load.java.structure.JavaField
|
import org.jetbrains.kotlin.load.java.structure.JavaField
|
||||||
|
import org.jetbrains.kotlin.load.java.structure.impl.classFiles.BinaryJavaField
|
||||||
import org.jetbrains.kotlin.load.java.structure.impl.JavaFieldImpl
|
import org.jetbrains.kotlin.load.java.structure.impl.JavaFieldImpl
|
||||||
import org.jetbrains.kotlin.resolve.constants.ConstantValue
|
import org.jetbrains.kotlin.resolve.constants.ConstantValue
|
||||||
import org.jetbrains.kotlin.resolve.constants.ConstantValueFactory
|
import org.jetbrains.kotlin.resolve.constants.ConstantValueFactory
|
||||||
@@ -27,8 +28,12 @@ import org.jetbrains.kotlin.resolve.descriptorUtil.builtIns
|
|||||||
|
|
||||||
class JavaPropertyInitializerEvaluatorImpl : JavaPropertyInitializerEvaluator {
|
class JavaPropertyInitializerEvaluatorImpl : JavaPropertyInitializerEvaluator {
|
||||||
override fun getInitializerConstant(field: JavaField, descriptor: PropertyDescriptor): ConstantValue<*>? {
|
override fun getInitializerConstant(field: JavaField, descriptor: PropertyDescriptor): ConstantValue<*>? {
|
||||||
val initializer = (field as JavaFieldImpl).initializer
|
val evaluated = when (field) {
|
||||||
val evaluated = JavaConstantExpressionEvaluator.computeConstantExpression(initializer, false) ?: return null
|
is JavaFieldImpl -> JavaConstantExpressionEvaluator.computeConstantExpression(field.initializer, false)
|
||||||
|
is BinaryJavaField -> field.compiledValue
|
||||||
|
else -> null
|
||||||
|
} ?: return null
|
||||||
|
|
||||||
val factory = ConstantValueFactory(descriptor.builtIns)
|
val factory = ConstantValueFactory(descriptor.builtIns)
|
||||||
when (evaluated) {
|
when (evaluated) {
|
||||||
//Note: evaluated expression may be of class that does not match field type in some cases
|
//Note: evaluated expression may be of class that does not match field type in some cases
|
||||||
@@ -43,6 +48,10 @@ class JavaPropertyInitializerEvaluatorImpl : JavaPropertyInitializerEvaluator {
|
|||||||
}
|
}
|
||||||
|
|
||||||
override fun isNotNullCompileTimeConstant(field: JavaField): Boolean {
|
override fun isNotNullCompileTimeConstant(field: JavaField): Boolean {
|
||||||
|
if (field is BinaryJavaField) {
|
||||||
|
return field.compiledValue != null
|
||||||
|
}
|
||||||
|
|
||||||
// PsiUtil.isCompileTimeConstant returns false for null-initialized fields,
|
// PsiUtil.isCompileTimeConstant returns false for null-initialized fields,
|
||||||
// see com.intellij.psi.util.IsConstantExpressionVisitor.visitLiteralExpression()
|
// see com.intellij.psi.util.IsConstantExpressionVisitor.visitLiteralExpression()
|
||||||
return PsiUtil.isCompileTimeConstant((field as JavaFieldImpl).psi)
|
return PsiUtil.isCompileTimeConstant((field as JavaFieldImpl).psi)
|
||||||
|
|||||||
+4
-4
@@ -16,16 +16,16 @@
|
|||||||
|
|
||||||
package org.jetbrains.kotlin.load.java.components
|
package org.jetbrains.kotlin.load.java.components
|
||||||
|
|
||||||
import org.jetbrains.kotlin.resolve.source.PsiSourceElement
|
|
||||||
import com.intellij.psi.PsiElement
|
import com.intellij.psi.PsiElement
|
||||||
|
import org.jetbrains.kotlin.load.java.sources.JavaSourceElement
|
||||||
|
import org.jetbrains.kotlin.load.java.sources.JavaSourceElementFactory
|
||||||
import org.jetbrains.kotlin.load.java.structure.JavaElement
|
import org.jetbrains.kotlin.load.java.structure.JavaElement
|
||||||
import org.jetbrains.kotlin.load.java.structure.impl.JavaElementImpl
|
import org.jetbrains.kotlin.load.java.structure.impl.JavaElementImpl
|
||||||
import org.jetbrains.kotlin.load.java.sources.JavaSourceElementFactory
|
import org.jetbrains.kotlin.resolve.source.PsiSourceElement
|
||||||
import org.jetbrains.kotlin.load.java.sources.JavaSourceElement
|
|
||||||
|
|
||||||
private class JavaSourceElementImpl(override val javaElement: JavaElement) : PsiSourceElement, JavaSourceElement {
|
private class JavaSourceElementImpl(override val javaElement: JavaElement) : PsiSourceElement, JavaSourceElement {
|
||||||
override val psi: PsiElement?
|
override val psi: PsiElement?
|
||||||
get() = (javaElement as JavaElementImpl<*>).psi
|
get() = (javaElement as? JavaElementImpl<*>)?.psi
|
||||||
}
|
}
|
||||||
|
|
||||||
class JavaSourceElementFactoryImpl : JavaSourceElementFactory {
|
class JavaSourceElementFactoryImpl : JavaSourceElementFactory {
|
||||||
|
|||||||
+4
-4
@@ -45,19 +45,19 @@ class LazyResolveBasedCache(private val resolveSession: ResolveSession) : JavaRe
|
|||||||
}
|
}
|
||||||
|
|
||||||
override fun recordMethod(method: JavaMethod, descriptor: SimpleFunctionDescriptor) {
|
override fun recordMethod(method: JavaMethod, descriptor: SimpleFunctionDescriptor) {
|
||||||
BindingContextUtils.recordFunctionDeclarationToDescriptor(trace, (method as JavaMethodImpl).psi, descriptor)
|
BindingContextUtils.recordFunctionDeclarationToDescriptor(trace, (method as? JavaMethodImpl)?.psi ?: return, descriptor)
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun recordConstructor(element: JavaElement, descriptor: ConstructorDescriptor) {
|
override fun recordConstructor(element: JavaElement, descriptor: ConstructorDescriptor) {
|
||||||
trace.record(CONSTRUCTOR, (element as JavaElementImpl<*>).psi, descriptor)
|
trace.record(CONSTRUCTOR, (element as? JavaElementImpl<*>)?.psi ?: return, descriptor)
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun recordField(field: JavaField, descriptor: PropertyDescriptor) {
|
override fun recordField(field: JavaField, descriptor: PropertyDescriptor) {
|
||||||
trace.record(VARIABLE, (field as JavaFieldImpl).psi, descriptor)
|
trace.record(VARIABLE, (field as? JavaFieldImpl)?.psi ?: return, descriptor)
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun recordClass(javaClass: JavaClass, descriptor: ClassDescriptor) {
|
override fun recordClass(javaClass: JavaClass, descriptor: ClassDescriptor) {
|
||||||
trace.record(CLASS, (javaClass as JavaClassImpl).psi, descriptor)
|
trace.record(CLASS, (javaClass as? JavaClassImpl)?.psi ?: return, descriptor)
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun findInPackageFragments(fullFqName: FqName): ClassDescriptor? {
|
private fun findInPackageFragments(fullFqName: FqName): ClassDescriptor? {
|
||||||
|
|||||||
@@ -21,6 +21,7 @@ import com.intellij.openapi.vfs.VirtualFile
|
|||||||
import com.intellij.psi.search.GlobalSearchScope
|
import com.intellij.psi.search.GlobalSearchScope
|
||||||
import org.jetbrains.kotlin.load.java.structure.JavaClass
|
import org.jetbrains.kotlin.load.java.structure.JavaClass
|
||||||
import org.jetbrains.kotlin.load.java.structure.impl.JavaClassImpl
|
import org.jetbrains.kotlin.load.java.structure.impl.JavaClassImpl
|
||||||
|
import org.jetbrains.kotlin.load.java.structure.impl.classFiles.BinaryJavaClass
|
||||||
import org.jetbrains.kotlin.name.ClassId
|
import org.jetbrains.kotlin.name.ClassId
|
||||||
import org.jetbrains.kotlin.utils.sure
|
import org.jetbrains.kotlin.utils.sure
|
||||||
|
|
||||||
@@ -33,7 +34,10 @@ abstract class VirtualFileFinder : KotlinClassFinder {
|
|||||||
}
|
}
|
||||||
|
|
||||||
override fun findKotlinClass(javaClass: JavaClass): KotlinJvmBinaryClass? {
|
override fun findKotlinClass(javaClass: JavaClass): KotlinJvmBinaryClass? {
|
||||||
var file = (javaClass as JavaClassImpl).psi.containingFile?.virtualFile ?: return null
|
var file =
|
||||||
|
(javaClass as? JavaClassImpl)?.psi?.containingFile?.virtualFile
|
||||||
|
?: (javaClass as? BinaryJavaClass)?.virtualFile
|
||||||
|
?: return null
|
||||||
if (javaClass.outerClass != null) {
|
if (javaClass.outerClass != null) {
|
||||||
// For nested classes we get a file of the containing class, to get the actual class file for A.B.C,
|
// For nested classes we get a file of the containing class, to get the actual class file for A.B.C,
|
||||||
// we take the file for A, take its parent directory, then in this directory we look for A$B$C.class
|
// we take the file for A, take its parent directory, then in this directory we look for A$B$C.class
|
||||||
|
|||||||
Reference in New Issue
Block a user