Use correct FQ name for running inner classes (KT-14153)

This commit is contained in:
Dmitry Jemerov
2016-10-27 15:06:21 +02:00
parent f783ba7573
commit 395bdf47e6
3 changed files with 18 additions and 23 deletions
@@ -233,19 +233,19 @@ public class JetRunConfiguration extends ModuleBasedConfiguration<RunConfigurati
@Nullable @Nullable
@Override @Override
public RefactoringElementListener getRefactoringElementListener(PsiElement element) { public RefactoringElementListener getRefactoringElementListener(PsiElement element) {
FqName fqNameBeingRenamed; String fqNameBeingRenamed;
if (element instanceof KtDeclarationContainer) { if (element instanceof KtDeclarationContainer) {
fqNameBeingRenamed = KotlinRunConfigurationProducer.Companion.getStartClassFqName((KtDeclarationContainer) element); fqNameBeingRenamed = KotlinRunConfigurationProducer.Companion.getStartClassFqName((KtDeclarationContainer) element);
} }
else if (element instanceof PsiPackage) { else if (element instanceof PsiPackage) {
fqNameBeingRenamed = new FqName(((PsiPackage) element).getQualifiedName()); fqNameBeingRenamed = ((PsiPackage) element).getQualifiedName();
} }
else { else {
fqNameBeingRenamed = null; fqNameBeingRenamed = null;
} }
if (fqNameBeingRenamed == null || if (fqNameBeingRenamed == null ||
!MAIN_CLASS_NAME.equals(fqNameBeingRenamed.asString()) && !MAIN_CLASS_NAME.startsWith(fqNameBeingRenamed.asString() + ".")) { !MAIN_CLASS_NAME.equals(fqNameBeingRenamed) && !MAIN_CLASS_NAME.startsWith(fqNameBeingRenamed + ".")) {
return null; return null;
} }
@@ -279,9 +279,9 @@ public class JetRunConfiguration extends ModuleBasedConfiguration<RunConfigurati
private void updateMainClassName(PsiElement element) { private void updateMainClassName(PsiElement element) {
KtDeclarationContainer container = KotlinRunConfigurationProducer.Companion.getEntryPointContainer(element); KtDeclarationContainer container = KotlinRunConfigurationProducer.Companion.getEntryPointContainer(element);
FqName name = KotlinRunConfigurationProducer.Companion.getStartClassFqName(container); String name = KotlinRunConfigurationProducer.Companion.getStartClassFqName(container);
if (name != null) { if (name != null) {
MAIN_CLASS_NAME = name.asString(); MAIN_CLASS_NAME = name;
} }
} }
@@ -19,18 +19,18 @@ package org.jetbrains.kotlin.idea.run
import com.intellij.execution.Location import com.intellij.execution.Location
import com.intellij.execution.actions.ConfigurationContext import com.intellij.execution.actions.ConfigurationContext
import com.intellij.execution.actions.RunConfigurationProducer import com.intellij.execution.actions.RunConfigurationProducer
import com.intellij.openapi.module.Module
import com.intellij.openapi.project.DumbService import com.intellij.openapi.project.DumbService
import com.intellij.openapi.util.Ref import com.intellij.openapi.util.Ref
import com.intellij.psi.PsiElement import com.intellij.psi.PsiElement
import com.intellij.psi.util.ClassUtil
import com.intellij.psi.util.PsiTreeUtil import com.intellij.psi.util.PsiTreeUtil
import org.jetbrains.kotlin.asJava.toLightClass
import org.jetbrains.kotlin.descriptors.FunctionDescriptor import org.jetbrains.kotlin.descriptors.FunctionDescriptor
import org.jetbrains.kotlin.fileClasses.javaFileFacadeFqName import org.jetbrains.kotlin.fileClasses.javaFileFacadeFqName
import org.jetbrains.kotlin.idea.MainFunctionDetector import org.jetbrains.kotlin.idea.MainFunctionDetector
import org.jetbrains.kotlin.idea.caches.resolve.getResolutionFacade import org.jetbrains.kotlin.idea.caches.resolve.getResolutionFacade
import org.jetbrains.kotlin.idea.project.ProjectStructureUtil import org.jetbrains.kotlin.idea.project.ProjectStructureUtil
import org.jetbrains.kotlin.idea.util.ProjectRootsUtil import org.jetbrains.kotlin.idea.util.ProjectRootsUtil
import org.jetbrains.kotlin.name.FqName
import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.psi.*
import org.jetbrains.kotlin.psi.psiUtil.getParentOfType import org.jetbrains.kotlin.psi.psiUtil.getParentOfType
@@ -44,7 +44,10 @@ class KotlinRunConfigurationProducer : RunConfigurationProducer<JetRunConfigurat
val container = getEntryPointContainer(location) val container = getEntryPointContainer(location)
val startClassFQName = getStartClassFqName(container) ?: return false val startClassFQName = getStartClassFqName(container) ?: return false
setupConfigurationByQName(module, configuration, startClassFQName) configuration.setModule(module)
configuration.runClass = startClassFQName
configuration.setGeneratedName()
return true return true
} }
@@ -61,18 +64,10 @@ class KotlinRunConfigurationProducer : RunConfigurationProducer<JetRunConfigurat
return getEntryPointContainer(locationElement) return getEntryPointContainer(locationElement)
} }
private fun setupConfigurationByQName(module: Module,
configuration: JetRunConfiguration,
fqName: FqName) {
configuration.setModule(module)
configuration.runClass = fqName.asString()
configuration.setGeneratedName()
}
override fun isConfigurationFromContext(configuration: JetRunConfiguration, context: ConfigurationContext): Boolean { override fun isConfigurationFromContext(configuration: JetRunConfiguration, context: ConfigurationContext): Boolean {
val startClassFQName = getStartClassFqName(getEntryPointContainer(context.location)) ?: return false val startClassFQName = getStartClassFqName(getEntryPointContainer(context.location)) ?: return false
return configuration.runClass == startClassFQName.asString() && return configuration.runClass == startClassFQName &&
context.module == configuration.configurationModule.module context.module == configuration.configurationModule.module
} }
@@ -97,15 +92,15 @@ class KotlinRunConfigurationProducer : RunConfigurationProducer<JetRunConfigurat
return null return null
} }
fun getStartClassFqName(container: KtDeclarationContainer?): FqName? = when(container) { fun getStartClassFqName(container: KtDeclarationContainer?): String? = when(container) {
null -> null null -> null
is KtFile -> container.javaFileFacadeFqName is KtFile -> container.javaFileFacadeFqName.asString()
is KtClassOrObject -> { is KtClassOrObject -> {
if (container is KtObjectDeclaration && container.isCompanion()) { if (container is KtObjectDeclaration && container.isCompanion()) {
val containerClass = container.getParentOfType<KtClass>(true) val containerClass = container.getParentOfType<KtClass>(true)
containerClass?.fqName containerClass?.toLightClass()?.let { ClassUtil.getJVMClassName(it) }
} else { } else {
container.fqName container.toLightClass()?.let { ClassUtil.getJVMClassName(it) }
} }
} }
else -> throw IllegalArgumentException("Invalid entry-point container: " + (container as PsiElement).text) else -> throw IllegalArgumentException("Invalid entry-point container: " + (container as PsiElement).text)
+2 -2
View File
@@ -7,10 +7,10 @@ object Foo {
println("Foo") println("Foo")
} }
// RUN: q.Foo.InnerFoo // RUN: q.Foo$InnerFoo
class InnerFoo { class InnerFoo {
companion object { companion object {
// RUN: q.Foo.InnerFoo // RUN: q.Foo$InnerFoo
@JvmStatic fun main(s: Array<String>) { @JvmStatic fun main(s: Array<String>) {
println("InnerFoo") println("InnerFoo")
} }