From 618a8622a170df009765c5601c4c97ac259decd1 Mon Sep 17 00:00:00 2001 From: Michael Nedzelsky Date: Wed, 20 May 2015 20:47:43 +0300 Subject: [PATCH] VirtualFileFinderFactory: introduce JvmVirtualFileFinderFactory, JsVirtualFileFinderFactory --- .../codegen/inline/InlineCodegenUtil.java | 6 +- ...leFinder.kt => JvmCliVirtualFileFinder.kt} | 3 +- ...y.kt => JvmCliVirtualFileFinderFactory.kt} | 10 ++- .../cli/jvm/compiler/KotlinCoreEnvironment.kt | 4 +- .../load/kotlin/JvmVirtualFileFinder.kt | 30 ++++++++ .../kotlin/JvmVirtualFileFinderFactory.kt | 32 +++++++++ .../kotlin/load/kotlin/VirtualFileFinder.java | 37 ---------- .../kotlin/VirtualFileKotlinClassFinder.kt | 2 +- .../kotlin/load/kotlin/VirtualFileFinder.kt | 17 ++--- .../load/kotlin/VirtualFileFinderFactory.kt} | 19 ++--- .../jvm/compiler/KotlinClassFinderTest.kt | 4 +- .../idea/vfilefinder/JsVirtualFileFinder.kt | 31 +++++++++ .../vfilefinder/JsVirtualFileFinderFactory.kt | 33 +++++++++ .../kotlin/idea/vfilefinder/factories.kt | 29 ++++++++ .../kotlin/idea/vfilefinder/fileFinders.kt | 69 +++++++++++++++++++ idea/src/META-INF/plugin.xml | 7 +- .../stubBuilder/ClsStubConsistencyTest.kt | 5 +- .../DecompiledTextConsistencyTest.kt | 5 +- 18 files changed, 255 insertions(+), 88 deletions(-) rename compiler/cli/src/org/jetbrains/kotlin/cli/jvm/compiler/{CliVirtualFileFinder.kt => JvmCliVirtualFileFinder.kt} (86%) rename compiler/cli/src/org/jetbrains/kotlin/cli/jvm/compiler/{CliVirtualFileFinderFactory.kt => JvmCliVirtualFileFinderFactory.kt} (66%) create mode 100644 compiler/frontend.java/src/org/jetbrains/kotlin/load/kotlin/JvmVirtualFileFinder.kt create mode 100644 compiler/frontend.java/src/org/jetbrains/kotlin/load/kotlin/JvmVirtualFileFinderFactory.kt delete mode 100644 compiler/frontend.java/src/org/jetbrains/kotlin/load/kotlin/VirtualFileFinder.java rename idea/idea-analysis/src/org/jetbrains/kotlin/idea/vfilefinder/IDEVirtualFileFinderFactory.java => compiler/frontend/src/org/jetbrains/kotlin/load/kotlin/VirtualFileFinder.kt (54%) rename compiler/{frontend.java/src/org/jetbrains/kotlin/load/kotlin/VirtualFileFinderFactory.java => frontend/src/org/jetbrains/kotlin/load/kotlin/VirtualFileFinderFactory.kt} (54%) create mode 100644 idea/idea-analysis/src/org/jetbrains/kotlin/idea/vfilefinder/JsVirtualFileFinder.kt create mode 100644 idea/idea-analysis/src/org/jetbrains/kotlin/idea/vfilefinder/JsVirtualFileFinderFactory.kt create mode 100644 idea/idea-analysis/src/org/jetbrains/kotlin/idea/vfilefinder/factories.kt create mode 100644 idea/idea-analysis/src/org/jetbrains/kotlin/idea/vfilefinder/fileFinders.kt diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/inline/InlineCodegenUtil.java b/compiler/backend/src/org/jetbrains/kotlin/codegen/inline/InlineCodegenUtil.java index a2aadac8497..28992048dcd 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/inline/InlineCodegenUtil.java +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/inline/InlineCodegenUtil.java @@ -35,7 +35,7 @@ import org.jetbrains.kotlin.descriptors.*; import org.jetbrains.kotlin.load.java.JvmAbi; import org.jetbrains.kotlin.load.kotlin.PackageClassUtils; import org.jetbrains.kotlin.load.kotlin.PackagePartClassUtils; -import org.jetbrains.kotlin.load.kotlin.VirtualFileFinder; +import org.jetbrains.kotlin.load.kotlin.JvmVirtualFileFinder; import org.jetbrains.kotlin.name.ClassId; import org.jetbrains.kotlin.name.FqName; import org.jetbrains.kotlin.name.Name; @@ -150,7 +150,7 @@ public class InlineCodegenUtil { @NotNull public static VirtualFile getVirtualFileForCallable(@NotNull ClassId containerClassId, @NotNull GenerationState state) { - VirtualFileFinder fileFinder = VirtualFileFinder.SERVICE.getInstance(state.getProject()); + JvmVirtualFileFinder fileFinder = JvmVirtualFileFinder.SERVICE.getInstance(state.getProject()); VirtualFile file = fileFinder.findVirtualFileWithHeader(containerClassId); if (file == null) { throw new IllegalStateException("Couldn't find declaration file for " + containerClassId); @@ -181,7 +181,7 @@ public class InlineCodegenUtil { public static VirtualFile findVirtualFile(@NotNull Project project, @NotNull String internalClassName) { FqName packageFqName = JvmClassName.byInternalName(internalClassName).getPackageFqName(); String classNameWithDollars = substringAfterLast(internalClassName, "/", internalClassName); - VirtualFileFinder fileFinder = VirtualFileFinder.SERVICE.getInstance(project); + JvmVirtualFileFinder fileFinder = JvmVirtualFileFinder.SERVICE.getInstance(project); //TODO: we cannot construct proper classId at this point, we need to read InnerClasses info from class file // we construct valid.package.name/RelativeClassNameAsSingleName that should work in compiler, but fails for inner classes in IDE return fileFinder.findVirtualFileWithHeader(new ClassId(packageFqName, Name.identifier(classNameWithDollars))); diff --git a/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/compiler/CliVirtualFileFinder.kt b/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/compiler/JvmCliVirtualFileFinder.kt similarity index 86% rename from compiler/cli/src/org/jetbrains/kotlin/cli/jvm/compiler/CliVirtualFileFinder.kt rename to compiler/cli/src/org/jetbrains/kotlin/cli/jvm/compiler/JvmCliVirtualFileFinder.kt index a1b89e1e560..57fcbfd8ebf 100644 --- a/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/compiler/CliVirtualFileFinder.kt +++ b/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/compiler/JvmCliVirtualFileFinder.kt @@ -17,11 +17,10 @@ package org.jetbrains.kotlin.cli.jvm.compiler import com.intellij.openapi.vfs.VirtualFile -import org.jetbrains.kotlin.load.kotlin.VirtualFileFinder import org.jetbrains.kotlin.load.kotlin.VirtualFileKotlinClassFinder import org.jetbrains.kotlin.name.ClassId -public class CliVirtualFileFinder(private val index: JvmDependenciesIndex) : VirtualFileKotlinClassFinder(), VirtualFileFinder { +public class JvmCliVirtualFileFinder(private val index: JvmDependenciesIndex) : VirtualFileKotlinClassFinder() { override fun findVirtualFileWithHeader(classId: ClassId): VirtualFile? { val classFileName = classId.getRelativeClassName().asString().replace('.', '$') diff --git a/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/compiler/CliVirtualFileFinderFactory.kt b/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/compiler/JvmCliVirtualFileFinderFactory.kt similarity index 66% rename from compiler/cli/src/org/jetbrains/kotlin/cli/jvm/compiler/CliVirtualFileFinderFactory.kt rename to compiler/cli/src/org/jetbrains/kotlin/cli/jvm/compiler/JvmCliVirtualFileFinderFactory.kt index 7f63250c0ea..dc7a11137c7 100644 --- a/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/compiler/CliVirtualFileFinderFactory.kt +++ b/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/compiler/JvmCliVirtualFileFinderFactory.kt @@ -17,11 +17,9 @@ package org.jetbrains.kotlin.cli.jvm.compiler import com.intellij.psi.search.GlobalSearchScope -import org.jetbrains.kotlin.load.kotlin.VirtualFileFinder -import org.jetbrains.kotlin.load.kotlin.VirtualFileFinderFactory +import org.jetbrains.kotlin.load.kotlin.JvmVirtualFileFinder +import org.jetbrains.kotlin.load.kotlin.JvmVirtualFileFinderFactory -public class CliVirtualFileFinderFactory(private val index: JvmDependenciesIndex) : VirtualFileFinderFactory { - override fun create(scope: GlobalSearchScope): VirtualFileFinder { - return CliVirtualFileFinder(index) - } +public class JvmCliVirtualFileFinderFactory(private val index: JvmDependenciesIndex) : JvmVirtualFileFinderFactory { + override fun create(scope: GlobalSearchScope): JvmVirtualFileFinder = JvmCliVirtualFileFinder(index) } diff --git a/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/compiler/KotlinCoreEnvironment.kt b/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/compiler/KotlinCoreEnvironment.kt index a51fecde864..cee4e2742f7 100644 --- a/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/compiler/KotlinCoreEnvironment.kt +++ b/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/compiler/KotlinCoreEnvironment.kt @@ -71,8 +71,8 @@ import org.jetbrains.kotlin.config.CompilerConfiguration import org.jetbrains.kotlin.config.KotlinSourceRoot import org.jetbrains.kotlin.extensions.ExternalDeclarationsProvider import org.jetbrains.kotlin.idea.JetFileType +import org.jetbrains.kotlin.load.kotlin.JvmVirtualFileFinderFactory import org.jetbrains.kotlin.load.kotlin.KotlinBinaryClassCache -import org.jetbrains.kotlin.load.kotlin.VirtualFileFinderFactory import org.jetbrains.kotlin.parsing.JetParserDefinition import org.jetbrains.kotlin.parsing.JetScriptDefinitionProvider import org.jetbrains.kotlin.psi.JetFile @@ -136,7 +136,7 @@ public class KotlinCoreEnvironment private( JetScriptDefinitionProvider.getInstance(project).addScriptDefinitions(configuration.getList(CommonConfigurationKeys.SCRIPT_DEFINITIONS_KEY)) - project.registerService(javaClass(), CliVirtualFileFinderFactory(index)) + project.registerService(javaClass(), JvmCliVirtualFileFinderFactory(index)) ExternalDeclarationsProvider.registerExtensionPoint(project) ExpressionCodegenExtension.registerExtensionPoint(project) diff --git a/compiler/frontend.java/src/org/jetbrains/kotlin/load/kotlin/JvmVirtualFileFinder.kt b/compiler/frontend.java/src/org/jetbrains/kotlin/load/kotlin/JvmVirtualFileFinder.kt new file mode 100644 index 00000000000..b895524a78b --- /dev/null +++ b/compiler/frontend.java/src/org/jetbrains/kotlin/load/kotlin/JvmVirtualFileFinder.kt @@ -0,0 +1,30 @@ +/* + * 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 com.intellij.openapi.components.ServiceManager +import com.intellij.openapi.project.Project +import com.intellij.psi.search.GlobalSearchScope +import kotlin.platform.platformStatic + +public interface JvmVirtualFileFinder : VirtualFileFinder, KotlinClassFinder { + public object SERVICE { + platformStatic + public fun getInstance(project: Project): JvmVirtualFileFinder = + ServiceManager.getService(project, javaClass()).create(GlobalSearchScope.allScope(project)) + } +} diff --git a/compiler/frontend.java/src/org/jetbrains/kotlin/load/kotlin/JvmVirtualFileFinderFactory.kt b/compiler/frontend.java/src/org/jetbrains/kotlin/load/kotlin/JvmVirtualFileFinderFactory.kt new file mode 100644 index 00000000000..1b496ad00e2 --- /dev/null +++ b/compiler/frontend.java/src/org/jetbrains/kotlin/load/kotlin/JvmVirtualFileFinderFactory.kt @@ -0,0 +1,32 @@ +/* + * 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 com.intellij.openapi.components.ServiceManager +import com.intellij.openapi.project.Project +import com.intellij.psi.search.GlobalSearchScope +import kotlin.platform.platformStatic + +public interface JvmVirtualFileFinderFactory : VirtualFileFinderFactory { + override fun create(scope: GlobalSearchScope): JvmVirtualFileFinder + + public object SERVICE { + platformStatic + public fun getInstance(project: Project): JvmVirtualFileFinderFactory = + ServiceManager.getService(project, javaClass()) + } +} diff --git a/compiler/frontend.java/src/org/jetbrains/kotlin/load/kotlin/VirtualFileFinder.java b/compiler/frontend.java/src/org/jetbrains/kotlin/load/kotlin/VirtualFileFinder.java deleted file mode 100644 index ad88ad1bc14..00000000000 --- a/compiler/frontend.java/src/org/jetbrains/kotlin/load/kotlin/VirtualFileFinder.java +++ /dev/null @@ -1,37 +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 com.intellij.openapi.components.ServiceManager; -import com.intellij.openapi.project.Project; -import com.intellij.openapi.vfs.VirtualFile; -import com.intellij.psi.search.GlobalSearchScope; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; -import org.jetbrains.kotlin.name.ClassId; - -public interface VirtualFileFinder extends KotlinClassFinder { - class SERVICE { - @NotNull - public static VirtualFileFinder getInstance(@NotNull Project project) { - return ServiceManager.getService(project, VirtualFileFinderFactory.class).create(GlobalSearchScope.allScope(project)); - } - } - - @Nullable - VirtualFile findVirtualFileWithHeader(@NotNull ClassId className); -} 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 index 0fdecc74d35..a989c5bf366 100644 --- a/compiler/frontend.java/src/org/jetbrains/kotlin/load/kotlin/VirtualFileKotlinClassFinder.kt +++ b/compiler/frontend.java/src/org/jetbrains/kotlin/load/kotlin/VirtualFileKotlinClassFinder.kt @@ -21,7 +21,7 @@ import org.jetbrains.kotlin.load.java.structure.impl.JavaClassImpl import org.jetbrains.kotlin.name.ClassId import org.jetbrains.kotlin.utils.sure -public abstract class VirtualFileKotlinClassFinder : VirtualFileFinder { +public abstract class VirtualFileKotlinClassFinder : JvmVirtualFileFinder { override fun findKotlinClass(classId: ClassId): KotlinJvmBinaryClass? { val file = findVirtualFileWithHeader(classId) ?: return null return KotlinBinaryClassCache.getKotlinBinaryClass(file) diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/vfilefinder/IDEVirtualFileFinderFactory.java b/compiler/frontend/src/org/jetbrains/kotlin/load/kotlin/VirtualFileFinder.kt similarity index 54% rename from idea/idea-analysis/src/org/jetbrains/kotlin/idea/vfilefinder/IDEVirtualFileFinderFactory.java rename to compiler/frontend/src/org/jetbrains/kotlin/load/kotlin/VirtualFileFinder.kt index abf71dbf561..6e5d2ba59dc 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/vfilefinder/IDEVirtualFileFinderFactory.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/load/kotlin/VirtualFileFinder.kt @@ -14,18 +14,11 @@ * limitations under the License. */ -package org.jetbrains.kotlin.idea.vfilefinder; +package org.jetbrains.kotlin.load.kotlin -import com.intellij.psi.search.GlobalSearchScope; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.kotlin.load.kotlin.VirtualFileFinder; -import org.jetbrains.kotlin.load.kotlin.VirtualFileFinderFactory; +import com.intellij.openapi.vfs.VirtualFile +import org.jetbrains.kotlin.name.ClassId -public class IDEVirtualFileFinderFactory implements VirtualFileFinderFactory { - - @NotNull - @Override - public VirtualFileFinder create(@NotNull GlobalSearchScope scope) { - return new IDEVirtualFileFinder(scope); - } +public interface VirtualFileFinder { + public fun findVirtualFileWithHeader(classId: ClassId): VirtualFile? } diff --git a/compiler/frontend.java/src/org/jetbrains/kotlin/load/kotlin/VirtualFileFinderFactory.java b/compiler/frontend/src/org/jetbrains/kotlin/load/kotlin/VirtualFileFinderFactory.kt similarity index 54% rename from compiler/frontend.java/src/org/jetbrains/kotlin/load/kotlin/VirtualFileFinderFactory.java rename to compiler/frontend/src/org/jetbrains/kotlin/load/kotlin/VirtualFileFinderFactory.kt index 93713a60a16..5c989d7cffe 100644 --- a/compiler/frontend.java/src/org/jetbrains/kotlin/load/kotlin/VirtualFileFinderFactory.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/load/kotlin/VirtualFileFinderFactory.kt @@ -14,21 +14,10 @@ * limitations under the License. */ -package org.jetbrains.kotlin.load.kotlin; +package org.jetbrains.kotlin.load.kotlin -import com.intellij.openapi.components.ServiceManager; -import com.intellij.openapi.project.Project; -import com.intellij.psi.search.GlobalSearchScope; -import org.jetbrains.annotations.NotNull; +import com.intellij.psi.search.GlobalSearchScope public interface VirtualFileFinderFactory { - @NotNull - VirtualFileFinder create(@NotNull GlobalSearchScope scope); - - class SERVICE { - @NotNull - public static VirtualFileFinderFactory getInstance(@NotNull Project project) { - return ServiceManager.getService(project, VirtualFileFinderFactory.class); - } - } -} + public fun create(scope: GlobalSearchScope): VirtualFileFinder +} \ No newline at end of file diff --git a/compiler/tests/org/jetbrains/kotlin/jvm/compiler/KotlinClassFinderTest.kt b/compiler/tests/org/jetbrains/kotlin/jvm/compiler/KotlinClassFinderTest.kt index 9807ed379fb..0b2606088b2 100644 --- a/compiler/tests/org/jetbrains/kotlin/jvm/compiler/KotlinClassFinderTest.kt +++ b/compiler/tests/org/jetbrains/kotlin/jvm/compiler/KotlinClassFinderTest.kt @@ -22,7 +22,7 @@ import org.jetbrains.kotlin.asJava.KotlinLightClass import org.jetbrains.kotlin.cli.jvm.compiler.EnvironmentConfigFiles import org.jetbrains.kotlin.cli.jvm.compiler.KotlinCoreEnvironment import org.jetbrains.kotlin.load.java.structure.impl.JavaClassImpl -import org.jetbrains.kotlin.load.kotlin.VirtualFileFinder +import org.jetbrains.kotlin.load.kotlin.JvmVirtualFileFinder import org.jetbrains.kotlin.resolve.lazy.LazyResolveTestUtil import org.jetbrains.kotlin.test.ConfigurationKind import org.jetbrains.kotlin.test.JetTestUtils @@ -60,7 +60,7 @@ public class KotlinClassFinderTest : KotlinTestWithEnvironmentManagement() { assertNotNull(psiClass, "Psi class not found for $className") assertTrue(psiClass !is KotlinLightClass, "Kotlin light classes are not not expected"); - val binaryClass = VirtualFileFinder.SERVICE.getInstance(project).findKotlinClass(JavaClassImpl(psiClass!!)) + val binaryClass = JvmVirtualFileFinder.SERVICE.getInstance(project).findKotlinClass(JavaClassImpl(psiClass!!)) assertNotNull(binaryClass, "No binary class for $className") assertEquals("test/A.B.C", binaryClass?.getClassId()?.toString()) diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/vfilefinder/JsVirtualFileFinder.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/vfilefinder/JsVirtualFileFinder.kt new file mode 100644 index 00000000000..f8d8f1574ea --- /dev/null +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/vfilefinder/JsVirtualFileFinder.kt @@ -0,0 +1,31 @@ +/* + * 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.idea.vfilefinder + +import com.intellij.openapi.components.ServiceManager +import com.intellij.openapi.project.Project +import com.intellij.psi.search.GlobalSearchScope +import org.jetbrains.kotlin.load.kotlin.VirtualFileFinder +import kotlin.platform.platformStatic + +public interface JsVirtualFileFinder : VirtualFileFinder { + public object SERVICE { + platformStatic + public fun getInstance(project: Project): JsVirtualFileFinder = + ServiceManager.getService(project, javaClass()).create(GlobalSearchScope.allScope(project)) + } +} diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/vfilefinder/JsVirtualFileFinderFactory.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/vfilefinder/JsVirtualFileFinderFactory.kt new file mode 100644 index 00000000000..d73875dd700 --- /dev/null +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/vfilefinder/JsVirtualFileFinderFactory.kt @@ -0,0 +1,33 @@ +/* + * 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.idea.vfilefinder + +import com.intellij.openapi.components.ServiceManager +import com.intellij.openapi.project.Project +import com.intellij.psi.search.GlobalSearchScope +import org.jetbrains.kotlin.load.kotlin.VirtualFileFinderFactory +import kotlin.platform.platformStatic + +public interface JsVirtualFileFinderFactory : VirtualFileFinderFactory { + override fun create(scope: GlobalSearchScope): JsVirtualFileFinder + + public object SERVICE { + platformStatic + public fun getInstance(project: Project): JsVirtualFileFinderFactory = + ServiceManager.getService(project, javaClass()) + } +} diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/vfilefinder/factories.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/vfilefinder/factories.kt new file mode 100644 index 00000000000..7f8fa8e61ae --- /dev/null +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/vfilefinder/factories.kt @@ -0,0 +1,29 @@ +/* + * 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.idea.vfilefinder + +import com.intellij.psi.search.GlobalSearchScope +import org.jetbrains.kotlin.load.kotlin.JvmVirtualFileFinder +import org.jetbrains.kotlin.load.kotlin.JvmVirtualFileFinderFactory + +public class JvmIDEVirtualFileFinderFactory : JvmVirtualFileFinderFactory { + override fun create(scope: GlobalSearchScope): JvmVirtualFileFinder = JvmIDEVirtualFileFinder(scope) +} + +public class JsIDEVirtualFileFinderFactory : JsVirtualFileFinderFactory { + override fun create(scope: GlobalSearchScope): JsVirtualFileFinder = JsIDEVirtualFileFinder(scope) +} diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/vfilefinder/fileFinders.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/vfilefinder/fileFinders.kt new file mode 100644 index 00000000000..d584d1a728d --- /dev/null +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/vfilefinder/fileFinders.kt @@ -0,0 +1,69 @@ +/* + * 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.idea.vfilefinder + +import com.intellij.openapi.diagnostic.Logger +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.JvmVirtualFileFinder +import org.jetbrains.kotlin.load.kotlin.VirtualFileKotlinClassFinder +import org.jetbrains.kotlin.name.ClassId +import org.jetbrains.kotlin.name.FqName + + +private fun checkScopeForFinder(scope: GlobalSearchScope, logger: Logger) { + if (scope != GlobalSearchScope.EMPTY_SCOPE && scope.getProject() == null) { + logger.warn("Scope with null project " + scope) + } +} + +private fun findVirtualFileWithHeader(classId: ClassId, key: ID, scope: GlobalSearchScope, logger: Logger): VirtualFile? { + val files = FileBasedIndex.getInstance().getContainingFiles(key, classId.asSingleFqName(), scope) + if (files.isEmpty()) return null + + if (files.size() > 1) { + logger.warn("There are " + files.size() + " classes with same fqName: " + classId + " found.") + } + return files.iterator().next() +} + +public class JsIDEVirtualFileFinder(private val scope: GlobalSearchScope) : JsVirtualFileFinder { + + init { checkScopeForFinder(scope, LOG) } + + override fun findVirtualFileWithHeader(classId: ClassId): VirtualFile? = + findVirtualFileWithHeader(classId, KotlinJavaScriptMetaFileIndex.KEY, scope, LOG) + + companion object { + private val LOG = Logger.getInstance(javaClass()) + } +} + +public class JvmIDEVirtualFileFinder(private val scope: GlobalSearchScope) : VirtualFileKotlinClassFinder(), JvmVirtualFileFinder { + + init { checkScopeForFinder(scope, LOG) } + + override fun findVirtualFileWithHeader(classId: ClassId): VirtualFile? = + findVirtualFileWithHeader(classId, KotlinClassFileIndex.KEY, scope, LOG) + + companion object { + private val LOG = Logger.getInstance(javaClass()) + } +} + diff --git a/idea/src/META-INF/plugin.xml b/idea/src/META-INF/plugin.xml index a29b2dcb1c1..ff07afc3626 100644 --- a/idea/src/META-INF/plugin.xml +++ b/idea/src/META-INF/plugin.xml @@ -172,8 +172,11 @@ - + + + diff --git a/idea/tests/org/jetbrains/kotlin/idea/decompiler/stubBuilder/ClsStubConsistencyTest.kt b/idea/tests/org/jetbrains/kotlin/idea/decompiler/stubBuilder/ClsStubConsistencyTest.kt index 85ce88941d1..f2f45070310 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/decompiler/stubBuilder/ClsStubConsistencyTest.kt +++ b/idea/tests/org/jetbrains/kotlin/idea/decompiler/stubBuilder/ClsStubConsistencyTest.kt @@ -16,13 +16,12 @@ package org.jetbrains.kotlin.idea.decompiler.stubBuilder -import com.intellij.psi.search.GlobalSearchScope import com.intellij.util.indexing.FileContentImpl import org.jetbrains.kotlin.idea.decompiler.textBuilder.buildDecompiledText import org.jetbrains.kotlin.idea.test.JetLightCodeInsightFixtureTestCase import org.jetbrains.kotlin.idea.test.JetWithJdkAndRuntimeLightProjectDescriptor +import org.jetbrains.kotlin.load.kotlin.JvmVirtualFileFinder import org.jetbrains.kotlin.load.kotlin.PackageClassUtils -import org.jetbrains.kotlin.load.kotlin.VirtualFileFinderFactory import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.psi.JetPsiFactory import org.jetbrains.kotlin.psi.stubs.elements.JetFileStubBuilder @@ -34,7 +33,7 @@ public class ClsStubConsistencyTest : JetLightCodeInsightFixtureTestCase() { public fun testConsistencyForKotlinPackage() { val project = getProject() - val virtualFileFinder = VirtualFileFinderFactory.SERVICE.getInstance(project).create(GlobalSearchScope.allScope(project)) + val virtualFileFinder = JvmVirtualFileFinder.SERVICE.getInstance(getProject()) val kotlinPackageFile = virtualFileFinder.findVirtualFileWithHeader(PackageClassUtils.getPackageClassId(STANDARD_LIBRARY_FQNAME))!! val decompiledText = buildDecompiledText(kotlinPackageFile).text diff --git a/idea/tests/org/jetbrains/kotlin/idea/decompiler/textBuilder/DecompiledTextConsistencyTest.kt b/idea/tests/org/jetbrains/kotlin/idea/decompiler/textBuilder/DecompiledTextConsistencyTest.kt index e0d63be589d..9b1dd593f83 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/decompiler/textBuilder/DecompiledTextConsistencyTest.kt +++ b/idea/tests/org/jetbrains/kotlin/idea/decompiler/textBuilder/DecompiledTextConsistencyTest.kt @@ -17,7 +17,6 @@ package org.jetbrains.kotlin.idea.decompiler.textBuilder import com.intellij.openapi.project.Project -import com.intellij.psi.search.GlobalSearchScope import org.jetbrains.kotlin.builtins.KotlinBuiltIns import org.jetbrains.kotlin.descriptors.CallableMemberDescriptor import org.jetbrains.kotlin.descriptors.ClassDescriptor @@ -26,8 +25,8 @@ import org.jetbrains.kotlin.descriptors.ModuleDescriptor import org.jetbrains.kotlin.idea.test.JetLightCodeInsightFixtureTestCase import org.jetbrains.kotlin.idea.test.JetWithJdkAndRuntimeLightProjectDescriptor import org.jetbrains.kotlin.idea.test.PluginTestCaseBase +import org.jetbrains.kotlin.load.kotlin.JvmVirtualFileFinder import org.jetbrains.kotlin.load.kotlin.PackageClassUtils -import org.jetbrains.kotlin.load.kotlin.VirtualFileFinderFactory import org.jetbrains.kotlin.name.ClassId import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.resolve.BindingTraceContext @@ -43,7 +42,7 @@ public class DecompiledTextConsistencyTest : JetLightCodeInsightFixtureTestCase( public fun testConsistencyWithJavaDescriptorResolver() { val project = getProject() - val virtualFileFinder = VirtualFileFinderFactory.SERVICE.getInstance(project).create(GlobalSearchScope.allScope(project)) + val virtualFileFinder = JvmVirtualFileFinder.SERVICE.getInstance(getProject()) val kotlinPackageFile = virtualFileFinder.findVirtualFileWithHeader(PackageClassUtils.getPackageClassId(STANDARD_LIBRARY_FQNAME))!! val projectBasedText = buildDecompiledText(kotlinPackageFile, ProjectBasedResolverForDecompiler(project)).text val deserializedText = buildDecompiledText(kotlinPackageFile).text