From 2b1b1fb0d4e600363b54b97e17f1d66999149614 Mon Sep 17 00:00:00 2001 From: Alexander Udalov Date: Tue, 31 Jan 2017 15:50:54 +0300 Subject: [PATCH] Merge VirtualFileKotlinClassFinder into VirtualFileFinder VirtualFileKotlinClassFinder was the only direct subclass of VirtualFileFinder --- .../cli/jvm/compiler/CliVirtualFileFinder.kt | 4 +- .../kotlin/load/kotlin/VirtualFileFinder.kt | 29 +++++++++++- .../kotlin/VirtualFileKotlinClassFinder.kt | 46 ------------------- .../idea/vfilefinder/IDEVirtualFileFinder.kt | 4 +- 4 files changed, 31 insertions(+), 52 deletions(-) delete mode 100644 compiler/frontend.java/src/org/jetbrains/kotlin/load/kotlin/VirtualFileKotlinClassFinder.kt diff --git a/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/compiler/CliVirtualFileFinder.kt b/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/compiler/CliVirtualFileFinder.kt index c39e2d2c758..33b1af969fa 100644 --- a/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/compiler/CliVirtualFileFinder.kt +++ b/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/compiler/CliVirtualFileFinder.kt @@ -21,7 +21,7 @@ import com.intellij.psi.search.GlobalSearchScope import org.jetbrains.kotlin.builtins.BuiltInSerializerProtocol import org.jetbrains.kotlin.cli.jvm.index.JavaRoot import org.jetbrains.kotlin.cli.jvm.index.JvmDependenciesIndex -import org.jetbrains.kotlin.load.kotlin.VirtualFileKotlinClassFinder +import org.jetbrains.kotlin.load.kotlin.VirtualFileFinder import org.jetbrains.kotlin.name.ClassId import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.Name @@ -32,7 +32,7 @@ import java.io.InputStream class CliVirtualFileFinder( private val index: JvmDependenciesIndex, private val scope: GlobalSearchScope -) : VirtualFileKotlinClassFinder() { +) : VirtualFileFinder() { override fun findVirtualFileWithHeader(classId: ClassId): VirtualFile? = findBinaryClass(classId, classId.relativeClassName.asString().replace('.', '$') + ".class") 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 5bccecbe9ae..3d24b5feb21 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 @@ -19,10 +19,35 @@ package org.jetbrains.kotlin.load.kotlin 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.name.ClassId +import org.jetbrains.kotlin.utils.sure -interface VirtualFileFinder : KotlinClassFinder { - fun findVirtualFileWithHeader(classId: ClassId): VirtualFile? +abstract class VirtualFileFinder : KotlinClassFinder { + abstract fun findVirtualFileWithHeader(classId: ClassId): VirtualFile? + + override fun findKotlinClass(classId: ClassId): KotlinJvmBinaryClass? { + val file = findVirtualFileWithHeader(classId) ?: return null + return KotlinBinaryClassCache.getKotlinBinaryClass(file) + } + + override fun findKotlinClass(javaClass: JavaClass): KotlinJvmBinaryClass? { + var file = (javaClass as JavaClassImpl).psi.containingFile?.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 + file = file.parent!!.findChild(classFileName(javaClass) + ".class").sure { "Virtual file not found for $javaClass" } + } + + return KotlinBinaryClassCache.getKotlinBinaryClass(file) + } + + private fun classFileName(jClass: JavaClass): String { + val simpleName = jClass.name.asString() + val outerClass = jClass.outerClass ?: return simpleName + return classFileName(outerClass) + "$" + simpleName + } companion object SERVICE { fun getInstance(project: Project): VirtualFileFinder = diff --git a/compiler/frontend.java/src/org/jetbrains/kotlin/load/kotlin/VirtualFileKotlinClassFinder.kt b/compiler/frontend.java/src/org/jetbrains/kotlin/load/kotlin/VirtualFileKotlinClassFinder.kt deleted file mode 100644 index f8c08fdfcf9..00000000000 --- a/compiler/frontend.java/src/org/jetbrains/kotlin/load/kotlin/VirtualFileKotlinClassFinder.kt +++ /dev/null @@ -1,46 +0,0 @@ -/* - * Copyright 2010-2015 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.kotlin - -import org.jetbrains.kotlin.load.java.structure.JavaClass -import org.jetbrains.kotlin.load.java.structure.impl.JavaClassImpl -import org.jetbrains.kotlin.name.ClassId -import org.jetbrains.kotlin.utils.sure - -abstract class VirtualFileKotlinClassFinder : VirtualFileFinder { - override fun findKotlinClass(classId: ClassId): KotlinJvmBinaryClass? { - val file = findVirtualFileWithHeader(classId) ?: return null - return KotlinBinaryClassCache.getKotlinBinaryClass(file) - } - - override fun findKotlinClass(javaClass: JavaClass): KotlinJvmBinaryClass? { - var file = (javaClass as JavaClassImpl).psi.containingFile?.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 - file = file.parent!!.findChild(classFileName(javaClass) + ".class").sure { "Virtual file not found for $javaClass" } - } - - return KotlinBinaryClassCache.getKotlinBinaryClass(file) - } - - private fun classFileName(jClass: JavaClass): String { - val outerClass = jClass.outerClass ?: return jClass.name.asString() - - return classFileName(outerClass) + "$" + jClass.name.asString() - } -} diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/vfilefinder/IDEVirtualFileFinder.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/vfilefinder/IDEVirtualFileFinder.kt index 73a309bacc2..3104105dc1c 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/vfilefinder/IDEVirtualFileFinder.kt +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/vfilefinder/IDEVirtualFileFinder.kt @@ -21,12 +21,12 @@ import com.intellij.openapi.vfs.VirtualFile import com.intellij.psi.search.GlobalSearchScope import com.intellij.util.indexing.FileBasedIndex import com.intellij.util.indexing.ID -import org.jetbrains.kotlin.load.kotlin.VirtualFileKotlinClassFinder +import org.jetbrains.kotlin.load.kotlin.VirtualFileFinder import org.jetbrains.kotlin.name.ClassId import org.jetbrains.kotlin.name.FqName import java.io.InputStream -class IDEVirtualFileFinder(private val scope: GlobalSearchScope) : VirtualFileKotlinClassFinder() { +class IDEVirtualFileFinder(private val scope: GlobalSearchScope) : VirtualFileFinder() { override fun findMetadata(classId: ClassId): InputStream? { return findVirtualFileWithHeader(classId, KotlinMetadataFileIndex.KEY)?.inputStream }