diff --git a/idea/src/META-INF/plugin.xml b/idea/src/META-INF/plugin.xml index 4be55c90633..f8090e618c0 100644 --- a/idea/src/META-INF/plugin.xml +++ b/idea/src/META-INF/plugin.xml @@ -391,7 +391,7 @@ - + .clone() as KotlinRunConfigurationProducer } - @Nullable - @Override - public PsiElement getSourceElement() { - return mySourceElement; + private var mySourceElement: PsiElement? = null + + override fun getSourceElement(): PsiElement? { + return mySourceElement } - @Override - protected RunnerAndConfigurationSettings createConfigurationByElement(@NotNull Location location, ConfigurationContext configurationContext) { - JetDeclarationContainer container = getEntryPointContainer(location); - if (container == null) return null; + override fun createConfigurationByElement(location: Location<*>, configurationContext: ConfigurationContext): RunnerAndConfigurationSettings? { + val container = getEntryPointContainer(location) ?: return null - mySourceElement = (PsiElement) container; + mySourceElement = container as PsiElement? - FqName startClassFQName = getStartClassFqName(container); - if (startClassFQName == null) return null; + val startClassFQName = getStartClassFqName(container) + if (startClassFQName == null) return null - Module module = location.getModule(); - assert module != null; + val module = location.getModule() + assert(module != null) - return createConfigurationByQName(module, configurationContext, startClassFQName); + return createConfigurationByQName(module, configurationContext, startClassFQName) } - @Nullable - private static FqName getStartClassFqName(@Nullable JetDeclarationContainer container) { - if (container == null) return null; - if (container instanceof JetFile) return PackageClassUtils.getPackageClassFqName(((JetFile) container).getPackageFqName()); - if (container instanceof JetClassOrObject) { - JetClassOrObject classOrObject = (JetClassOrObject) container; - if (classOrObject instanceof JetObjectDeclaration && ((JetObjectDeclaration) classOrObject).isCompanion()) { - classOrObject = PsiTreeUtil.getParentOfType(classOrObject, JetClass.class); + private fun getStartClassFqName(container: JetDeclarationContainer?): FqName? { + if (container == null) return null + if (container is JetFile) return PackageClassUtils.getPackageClassFqName((container as JetFile?).getPackageFqName()) + if (container is JetClassOrObject) { + if (container is JetObjectDeclaration && container.isCompanion()) { + val containerClass = PsiTreeUtil.getParentOfType(container, javaClass()) + return containerClass?.getFqName() } - return classOrObject != null ? classOrObject.getFqName() : null; + return container?.getFqName() } - throw new IllegalArgumentException("Invalid entry-point container: " + ((PsiElement) container).getText()); + throw IllegalArgumentException("Invalid entry-point container: " + (container as PsiElement?).getText()) } - @Nullable - private static JetDeclarationContainer getEntryPointContainer(@NotNull Location location) { - if (DumbService.getInstance(location.getProject()).isDumb()) return null; + private fun getEntryPointContainer(location: Location<*>): JetDeclarationContainer? { + if (DumbService.getInstance(location.getProject()).isDumb()) return null - Module module = location.getModule(); - if (module == null) return null; + val module = location.getModule() ?: return null - if (ProjectStructureUtil.isJsKotlinModule(module)) return null; + if (ProjectStructureUtil.isJsKotlinModule(module)) return null - PsiElement locationElement = location.getPsiElement(); + val locationElement = location.getPsiElement() - PsiFile psiFile = locationElement.getContainingFile(); - if (!(psiFile instanceof JetFile && ProjectRootsUtil.isInProjectOrLibSource(psiFile))) return null; + val psiFile = locationElement.getContainingFile() + if (!(psiFile is JetFile && ProjectRootsUtil.isInProjectOrLibSource(psiFile))) return null - JetFile jetFile = (JetFile) psiFile; - final ResolutionFacade resolutionFacade = ResolvePackage.getResolutionFacade(jetFile); - MainFunctionDetector mainFunctionDetector = new MainFunctionDetector( - new NotNullFunction() { - @NotNull - @Override - public FunctionDescriptor fun(JetNamedFunction function) { - return (FunctionDescriptor) resolutionFacade.resolveToDescriptor(function); - } - }); - - for (JetDeclarationContainer currentElement = PsiTreeUtil.getNonStrictParentOfType(locationElement, JetClassOrObject.class, - JetFile.class); - currentElement != null; - currentElement = PsiTreeUtil.getParentOfType((PsiElement) currentElement, JetClassOrObject.class, JetFile.class)) { - JetDeclarationContainer entryPointContainer = currentElement; - if (entryPointContainer instanceof JetClass) { - entryPointContainer = singleOrNull(((JetClass) currentElement).getCompanionObjects()); + val resolutionFacade = psiFile.getResolutionFacade() + val mainFunctionDetector = MainFunctionDetector(object : NotNullFunction { + override fun `fun`(function: JetNamedFunction): FunctionDescriptor { + return resolutionFacade.resolveToDescriptor(function) as FunctionDescriptor } - if (entryPointContainer != null && mainFunctionDetector.hasMain(entryPointContainer.getDeclarations())) return entryPointContainer; + }) + + var currentElement = PsiTreeUtil.getNonStrictParentOfType(locationElement, javaClass(), javaClass()) as JetDeclarationContainer + while (currentElement != null) { + var entryPointContainer = currentElement + if (entryPointContainer is JetClass) { + entryPointContainer = entryPointContainer.getCompanionObjects().singleOrNull() as JetDeclarationContainer + } + if (entryPointContainer != null && mainFunctionDetector.hasMain(entryPointContainer.getDeclarations())) return entryPointContainer + currentElement = PsiTreeUtil.getParentOfType(currentElement as PsiElement?, javaClass(), javaClass()) as JetDeclarationContainer } - return null; + return null } - @NotNull - private RunnerAndConfigurationSettings createConfigurationByQName( - @NotNull Module module, - ConfigurationContext context, - @NotNull FqName fqName - ) { - RunnerAndConfigurationSettings settings = cloneTemplateConfiguration(module.getProject(), context); - JetRunConfiguration configuration = (JetRunConfiguration) settings.getConfiguration(); - configuration.setModule(module); - configuration.setName(StringUtil.trimEnd(fqName.asString(), "." + PackageClassUtils.getPackageClassName(fqName))); - configuration.setRunClass(fqName.asString()); - return settings; + private fun createConfigurationByQName(module: Module, context: ConfigurationContext, fqName: FqName): RunnerAndConfigurationSettings { + val settings = cloneTemplateConfiguration(module.getProject(), context) + val configuration = settings.getConfiguration() as JetRunConfiguration + configuration.setModule(module) + configuration.setName(StringUtil.trimEnd(fqName.asString(), "." + PackageClassUtils.getPackageClassName(fqName))) + configuration.setRunClass(fqName.asString()) + return settings } - @Override - protected RunnerAndConfigurationSettings findExistingByElement( - Location location, - @NotNull List existingConfigurations, - ConfigurationContext context - ) { - FqName startClassFQName = getStartClassFqName(getEntryPointContainer(location)); - if (startClassFQName == null) return null; + override fun findExistingByElement(location: Location<*>?, existingConfigurations: List, context: ConfigurationContext?): RunnerAndConfigurationSettings? { + val startClassFQName = getStartClassFqName(getEntryPointContainer(location)) ?: return null - for (RunnerAndConfigurationSettings existingConfiguration : existingConfigurations) { - if (existingConfiguration.getType() instanceof JetRunConfigurationType) { - JetRunConfiguration jetConfiguration = (JetRunConfiguration)existingConfiguration.getConfiguration(); + for (existingConfiguration in existingConfigurations) { + if (existingConfiguration.getType() is JetRunConfigurationType) { + val jetConfiguration = existingConfiguration.getConfiguration() as JetRunConfiguration if (Comparing.equal(jetConfiguration.getRunClass(), startClassFQName.asString())) { - if (Comparing.equal(location.getModule(), jetConfiguration.getConfigurationModule().getModule())) { - return existingConfiguration; + if (Comparing.equal(location!!.getModule(), jetConfiguration.getConfigurationModule().getModule())) { + return existingConfiguration } } } } - return null; + return null } - @Override - public int compareTo(Object o) { - return PREFERED; + override fun compareTo(o: Any?): Int { + return RuntimeConfigurationProducer.PREFERED } }