diff --git a/compiler/frontend.java/src/org/jetbrains/kotlin/load/java/structure/impl/JavaClassImpl.kt b/compiler/frontend.java/src/org/jetbrains/kotlin/load/java/structure/impl/JavaClassImpl.kt index 40d13fff624..a64a50716c8 100644 --- a/compiler/frontend.java/src/org/jetbrains/kotlin/load/java/structure/impl/JavaClassImpl.kt +++ b/compiler/frontend.java/src/org/jetbrains/kotlin/load/java/structure/impl/JavaClassImpl.kt @@ -17,6 +17,7 @@ package org.jetbrains.kotlin.load.java.structure.impl import com.intellij.openapi.diagnostic.Logger +import com.intellij.openapi.vfs.VirtualFile import com.intellij.psi.PsiClass import com.intellij.psi.PsiTypeParameter import org.jetbrains.kotlin.asJava.KtLightClassMarker @@ -26,7 +27,7 @@ import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.psi.KtPsiUtil -class JavaClassImpl(psiClass: PsiClass) : JavaClassifierImpl(psiClass), JavaClass, JavaAnnotationOwnerImpl, JavaModifierListOwnerImpl { +class JavaClassImpl(psiClass: PsiClass) : JavaClassifierImpl(psiClass), VirtualFileBoundJavaClass, JavaAnnotationOwnerImpl, JavaModifierListOwnerImpl { init { assert(psiClass !is PsiTypeParameter) { "PsiTypeParameter should be wrapped in JavaTypeParameter, not JavaClass: use JavaClassifier.create()" } } @@ -109,6 +110,9 @@ class JavaClassImpl(psiClass: PsiClass) : JavaClassifierImpl(psiClass) override val lightClassOriginKind: LightClassOriginKind? get() = (psi as? KtLightClassMarker)?.originKind + override val virtualFile: VirtualFile? + get() = psi.containingFile?.virtualFile + override fun getAnnotationOwnerPsi() = psi.modifierList private fun assertNotLightClass() { diff --git a/compiler/frontend.java/src/org/jetbrains/kotlin/load/java/structure/impl/VirtualFileBoundJavaClass.kt b/compiler/frontend.java/src/org/jetbrains/kotlin/load/java/structure/impl/VirtualFileBoundJavaClass.kt new file mode 100644 index 00000000000..3df909ac2e4 --- /dev/null +++ b/compiler/frontend.java/src/org/jetbrains/kotlin/load/java/structure/impl/VirtualFileBoundJavaClass.kt @@ -0,0 +1,24 @@ +/* + * Copyright 2010-2017 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.jetbrains.kotlin.load.java.structure.impl + +import com.intellij.openapi.vfs.VirtualFile +import org.jetbrains.kotlin.load.java.structure.JavaClass + +interface VirtualFileBoundJavaClass : JavaClass { + val virtualFile: VirtualFile? +} \ No newline at end of file diff --git a/compiler/frontend.java/src/org/jetbrains/kotlin/load/java/structure/impl/classFiles/BinaryJavaClass.kt b/compiler/frontend.java/src/org/jetbrains/kotlin/load/java/structure/impl/classFiles/BinaryJavaClass.kt index 8cbf999ec75..067f091d1cc 100644 --- a/compiler/frontend.java/src/org/jetbrains/kotlin/load/java/structure/impl/classFiles/BinaryJavaClass.kt +++ b/compiler/frontend.java/src/org/jetbrains/kotlin/load/java/structure/impl/classFiles/BinaryJavaClass.kt @@ -21,6 +21,7 @@ import com.intellij.util.containers.ContainerUtil import gnu.trove.THashMap import org.jetbrains.kotlin.builtins.PrimitiveType import org.jetbrains.kotlin.load.java.structure.* +import org.jetbrains.kotlin.load.java.structure.impl.VirtualFileBoundJavaClass import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.utils.addIfNotNull @@ -29,14 +30,14 @@ import java.text.CharacterIterator import java.text.StringCharacterIterator class BinaryJavaClass( - val virtualFile: VirtualFile, + override val virtualFile: VirtualFile, override val fqName: FqName, private val context: ClassifierResolutionContext, private val signatureParser: BinaryClassSignatureParser, override var access: Int = 0, override val outerClass: JavaClass?, classContent: ByteArray? = null -) : ClassVisitor(ASM_API_VERSION_FOR_CLASS_READING), JavaClass, BinaryJavaModifierListOwner, BinaryJavaAnnotationOwner { +) : ClassVisitor(ASM_API_VERSION_FOR_CLASS_READING), VirtualFileBoundJavaClass, BinaryJavaModifierListOwner, BinaryJavaAnnotationOwner { lateinit var myInternalName: String override val annotations: MutableCollection = mutableListOf() diff --git a/compiler/frontend.java/src/org/jetbrains/kotlin/load/kotlin/VirtualFileFinder.kt b/compiler/frontend.java/src/org/jetbrains/kotlin/load/kotlin/VirtualFileFinder.kt index 7651306cd9e..8b345e4e7b8 100644 --- a/compiler/frontend.java/src/org/jetbrains/kotlin/load/kotlin/VirtualFileFinder.kt +++ b/compiler/frontend.java/src/org/jetbrains/kotlin/load/kotlin/VirtualFileFinder.kt @@ -20,8 +20,7 @@ import com.intellij.openapi.project.Project import com.intellij.openapi.vfs.VirtualFile import com.intellij.psi.search.GlobalSearchScope 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.classFiles.BinaryJavaClass +import org.jetbrains.kotlin.load.java.structure.impl.VirtualFileBoundJavaClass import org.jetbrains.kotlin.name.ClassId import org.jetbrains.kotlin.utils.sure @@ -34,10 +33,8 @@ abstract class VirtualFileFinder : KotlinClassFinder { } override fun findKotlinClass(javaClass: JavaClass): KotlinJvmBinaryClass? { - var file = - (javaClass as? JavaClassImpl)?.psi?.containingFile?.virtualFile - ?: (javaClass as? BinaryJavaClass)?.virtualFile - ?: return null + var file = (javaClass as? VirtualFileBoundJavaClass)?.virtualFile ?: return 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, // we take the file for A, take its parent directory, then in this directory we look for A$B$C.class