Use correct FQ name for running inner classes (KT-14153)
This commit is contained in:
@@ -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
@@ -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")
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user