Extract VirtualFileBoundJavaClass interface

This commit is contained in:
baratynskiy
2017-05-10 15:52:03 +03:00
committed by Mikhail Glukhikh
parent a815125281
commit c9a04fe1e2
4 changed files with 35 additions and 9 deletions
@@ -17,6 +17,7 @@
package org.jetbrains.kotlin.load.java.structure.impl package org.jetbrains.kotlin.load.java.structure.impl
import com.intellij.openapi.diagnostic.Logger import com.intellij.openapi.diagnostic.Logger
import com.intellij.openapi.vfs.VirtualFile
import com.intellij.psi.PsiClass import com.intellij.psi.PsiClass
import com.intellij.psi.PsiTypeParameter import com.intellij.psi.PsiTypeParameter
import org.jetbrains.kotlin.asJava.KtLightClassMarker 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.name.Name
import org.jetbrains.kotlin.psi.KtPsiUtil import org.jetbrains.kotlin.psi.KtPsiUtil
class JavaClassImpl(psiClass: PsiClass) : JavaClassifierImpl<PsiClass>(psiClass), JavaClass, JavaAnnotationOwnerImpl, JavaModifierListOwnerImpl { class JavaClassImpl(psiClass: PsiClass) : JavaClassifierImpl<PsiClass>(psiClass), VirtualFileBoundJavaClass, JavaAnnotationOwnerImpl, JavaModifierListOwnerImpl {
init { init {
assert(psiClass !is PsiTypeParameter) { "PsiTypeParameter should be wrapped in JavaTypeParameter, not JavaClass: use JavaClassifier.create()" } 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>(psiClass)
override val lightClassOriginKind: LightClassOriginKind? override val lightClassOriginKind: LightClassOriginKind?
get() = (psi as? KtLightClassMarker)?.originKind get() = (psi as? KtLightClassMarker)?.originKind
override val virtualFile: VirtualFile?
get() = psi.containingFile?.virtualFile
override fun getAnnotationOwnerPsi() = psi.modifierList override fun getAnnotationOwnerPsi() = psi.modifierList
private fun assertNotLightClass() { private fun assertNotLightClass() {
@@ -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?
}
@@ -21,6 +21,7 @@ import com.intellij.util.containers.ContainerUtil
import gnu.trove.THashMap import gnu.trove.THashMap
import org.jetbrains.kotlin.builtins.PrimitiveType import org.jetbrains.kotlin.builtins.PrimitiveType
import org.jetbrains.kotlin.load.java.structure.* 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.FqName
import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.utils.addIfNotNull import org.jetbrains.kotlin.utils.addIfNotNull
@@ -29,14 +30,14 @@ import java.text.CharacterIterator
import java.text.StringCharacterIterator import java.text.StringCharacterIterator
class BinaryJavaClass( class BinaryJavaClass(
val virtualFile: VirtualFile, override val virtualFile: VirtualFile,
override val fqName: FqName, override val fqName: FqName,
private val context: ClassifierResolutionContext, private val context: ClassifierResolutionContext,
private val signatureParser: BinaryClassSignatureParser, private val signatureParser: BinaryClassSignatureParser,
override var access: Int = 0, override var access: Int = 0,
override val outerClass: JavaClass?, override val outerClass: JavaClass?,
classContent: ByteArray? = null 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 lateinit var myInternalName: String
override val annotations: MutableCollection<JavaAnnotation> = mutableListOf() override val annotations: MutableCollection<JavaAnnotation> = mutableListOf()
@@ -20,8 +20,7 @@ import com.intellij.openapi.project.Project
import com.intellij.openapi.vfs.VirtualFile 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.VirtualFileBoundJavaClass
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
@@ -34,10 +33,8 @@ abstract class VirtualFileFinder : KotlinClassFinder {
} }
override fun findKotlinClass(javaClass: JavaClass): KotlinJvmBinaryClass? { override fun findKotlinClass(javaClass: JavaClass): KotlinJvmBinaryClass? {
var file = var file = (javaClass as? VirtualFileBoundJavaClass)?.virtualFile ?: return null
(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