From bc6c56080d8664f4a34aad48247621fcbe45d494 Mon Sep 17 00:00:00 2001 From: "Pavel V. Talanov" Date: Fri, 6 Jun 2014 17:23:05 +0400 Subject: [PATCH] Rewrite VirtualFileKotlinClassFinder to Kotlin --- .../kotlin/VirtualFileKotlinClassFinder.java | 59 ------------------- .../kotlin/VirtualFileKotlinClassFinder.kt | 56 ++++++++++++++++++ 2 files changed, 56 insertions(+), 59 deletions(-) delete mode 100644 compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/kotlin/VirtualFileKotlinClassFinder.java create mode 100644 compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/kotlin/VirtualFileKotlinClassFinder.kt diff --git a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/kotlin/VirtualFileKotlinClassFinder.java b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/kotlin/VirtualFileKotlinClassFinder.java deleted file mode 100644 index f2d867aab3a..00000000000 --- a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/kotlin/VirtualFileKotlinClassFinder.java +++ /dev/null @@ -1,59 +0,0 @@ -/* - * Copyright 2010-2013 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.jet.lang.resolve.kotlin; - -import com.intellij.ide.highlighter.JavaClassFileType; -import com.intellij.openapi.vfs.VirtualFile; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; -import org.jetbrains.jet.lang.resolve.java.structure.JavaClass; -import org.jetbrains.jet.lang.resolve.java.structure.impl.JavaClassImpl; -import org.jetbrains.jet.lang.resolve.name.FqName; - -public abstract class VirtualFileKotlinClassFinder implements VirtualFileFinder { - @Nullable - @Override - public KotlinJvmBinaryClass findKotlinClass(@NotNull FqName fqName) { - VirtualFile file = findVirtualFileWithHeader(fqName); - return file == null ? null : KotlinBinaryClassCache.getKotlinBinaryClass(file); - } - - @Override - @Nullable - public KotlinJvmBinaryClass findKotlinClass(@NotNull JavaClass javaClass) { - VirtualFile file = ((JavaClassImpl) javaClass).getPsi().getContainingFile().getVirtualFile(); - if (file == null) return null; - - if (javaClass.getOuterClass() != 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.getParent().findChild(classFileName(javaClass) + ".class"); - assert file != null : "Virtual file not found for " + javaClass; - } - - if (file.getFileType() != JavaClassFileType.INSTANCE) return null; - - return KotlinBinaryClassCache.getKotlinBinaryClass(file); - } - - @NotNull - private static String classFileName(@NotNull JavaClass jClass) { - JavaClass outerClass = jClass.getOuterClass(); - if (outerClass == null) return jClass.getName().asString(); - return classFileName(outerClass) + "$" + jClass.getName().asString(); - } -} diff --git a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/kotlin/VirtualFileKotlinClassFinder.kt b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/kotlin/VirtualFileKotlinClassFinder.kt new file mode 100644 index 00000000000..391903dbbae --- /dev/null +++ b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/kotlin/VirtualFileKotlinClassFinder.kt @@ -0,0 +1,56 @@ +/* + * Copyright 2010-2014 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.jet.lang.resolve.kotlin + +import com.intellij.ide.highlighter.JavaClassFileType +import com.intellij.openapi.vfs.VirtualFile +import org.jetbrains.annotations.Nullable +import org.jetbrains.jet.lang.resolve.java.structure.JavaClass +import org.jetbrains.jet.lang.resolve.java.structure.impl.JavaClassImpl +import org.jetbrains.jet.lang.resolve.name.FqName +import org.jetbrains.kotlin.util.sure + +public abstract class VirtualFileKotlinClassFinder() : VirtualFileFinder { + override fun findKotlinClass(fqName: FqName): KotlinJvmBinaryClass? { + val file = findVirtualFileWithHeader(fqName) ?: return null + return KotlinBinaryClassCache.getKotlinBinaryClass(file) + } + + override fun findKotlinClass(javaClass: JavaClass): KotlinJvmBinaryClass? { + var file = (javaClass as JavaClassImpl).getPsi().getContainingFile()!!.getVirtualFile() ?: return null + if (javaClass.getOuterClass() != 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.getParent()!!.findChild(classFileName(javaClass) + ".class").sure("Virtual file not found for $javaClass") + } + + if (file.getFileType() != JavaClassFileType.INSTANCE) { + return null + } + + return KotlinBinaryClassCache.getKotlinBinaryClass(file) + } + + private fun classFileName(jClass: JavaClass): String { + val outerClass = jClass.getOuterClass() + if (outerClass == null) { + return jClass.getName().asString() + } + + return classFileName(outerClass) + "$" + jClass.getName().asString() + } +}