From 70dc5a5c4c7c2626ac4fdd47264d7309b17f6280 Mon Sep 17 00:00:00 2001 From: "Pavel V. Talanov" Date: Fri, 18 Dec 2015 16:43:37 +0300 Subject: [PATCH] IDELightClassGenerationSupport: fix a problem when marking source root as both source and library source led to SO # KT-10413 Fixed --- .../resolve/IDELightClassGenerationSupport.kt | 19 +++++++++++++------ .../changeSignature/KotlinChangeSignature.kt | 1 + 2 files changed, 14 insertions(+), 6 deletions(-) diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/resolve/IDELightClassGenerationSupport.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/resolve/IDELightClassGenerationSupport.kt index 19176a70ba5..3c5760cef10 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/resolve/IDELightClassGenerationSupport.kt +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/resolve/IDELightClassGenerationSupport.kt @@ -18,7 +18,6 @@ package org.jetbrains.kotlin.idea.caches.resolve import com.intellij.openapi.diagnostic.Logger import com.intellij.openapi.project.Project -import com.intellij.openapi.roots.libraries.LibraryUtil import com.intellij.openapi.vfs.VirtualFile import com.intellij.psi.ClassFileViewProvider import com.intellij.psi.PsiClass @@ -140,13 +139,21 @@ public class IDELightClassGenerationSupport(private val project: Project) : Ligh override fun getPsiClass(classOrObject: KtClassOrObject): PsiClass? { val virtualFile = classOrObject.containingFile.virtualFile - if (virtualFile != null && LibraryUtil.findLibraryEntry(virtualFile, classOrObject.project) != null) { - if (ProjectRootsUtil.isLibraryClassFile(project, virtualFile)) { - return getLightClassForDecompiledClassOrObject(classOrObject) + if (virtualFile != null) { + when { + ProjectRootsUtil.isProjectSourceFile(project, virtualFile) -> + return KtLightClassForExplicitDeclaration.create(classOrObject) + ProjectRootsUtil.isLibraryClassFile(project, virtualFile) -> + return getLightClassForDecompiledClassOrObject(classOrObject) + ProjectRootsUtil.isLibrarySourceFile(project, virtualFile) -> + return SourceNavigationHelper.getOriginalClass(classOrObject) } - return SourceNavigationHelper.getOriginalClass(classOrObject) } - return KtLightClassForExplicitDeclaration.create(classOrObject) + if (classOrObject.getContainingKtFile().analysisContext != null) { + // explicit request to create light class from dummy.kt + return KtLightClassForExplicitDeclaration.create(classOrObject) + } + return null } private fun withFakeLightClasses( diff --git a/idea/src/org/jetbrains/kotlin/idea/refactoring/changeSignature/KotlinChangeSignature.kt b/idea/src/org/jetbrains/kotlin/idea/refactoring/changeSignature/KotlinChangeSignature.kt index 3fc319b2958..f22fd862cdb 100644 --- a/idea/src/org/jetbrains/kotlin/idea/refactoring/changeSignature/KotlinChangeSignature.kt +++ b/idea/src/org/jetbrains/kotlin/idea/refactoring/changeSignature/KotlinChangeSignature.kt @@ -148,6 +148,7 @@ public class KotlinChangeSignature(project: Project, toString() } val dummyFile = LightVirtualFile("dummy.kt", KotlinFileType.INSTANCE, dummyFileText).toPsiFile(project) as KtFile + dummyFile.analysisContext = originalMethod val dummyDeclaration = (dummyFile.declarations.first() as KtClass).getBody()!!.declarations.first() // Convert to PsiMethod which can be used in Change Signature dialog