From 63e538d5bb015eaed0339cb0e6289405fb7e6dbf Mon Sep 17 00:00:00 2001 From: Bart van Helvert Date: Sat, 22 Apr 2023 12:03:34 +0200 Subject: [PATCH] [kotlin] Move `KtClass#getOrCreateCompanionObject` from core to PSI module ^KTIJ-23273 GitOrigin-RevId: 7de611e9759a62e6378036a22a1a4f74c9f506fb --- .../base/psi/KotlinPsiModificationUtils.kt | 22 ++++++++++++- .../kotlin/idea/core/psiModificationUtils.kt | 31 ++++++++----------- .../ConvertEnumToSealedClassIntention.kt | 2 +- .../MoveMemberToCompanionObjectIntention.kt | 2 +- .../idea/quickfix/MakeMemberStaticFix.kt | 2 +- .../callableBuilder/CallableBuilder.kt | 1 + .../CreateCallableFromUsageFix.kt | 2 +- .../move/moveDeclarations/KotlinMoveTarget.kt | 2 +- .../JavaToKotlinPreconversionPullUpHelper.kt | 2 +- .../refactoring/pullUp/KotlinPullUpHelper.kt | 2 +- .../pushDown/JavaToKotlinPushDownDelegate.kt | 2 +- 11 files changed, 43 insertions(+), 27 deletions(-) diff --git a/plugins/kotlin/base/psi/src/org/jetbrains/kotlin/idea/base/psi/KotlinPsiModificationUtils.kt b/plugins/kotlin/base/psi/src/org/jetbrains/kotlin/idea/base/psi/KotlinPsiModificationUtils.kt index 638c79e2e854..aac3a97b21d5 100644 --- a/plugins/kotlin/base/psi/src/org/jetbrains/kotlin/idea/base/psi/KotlinPsiModificationUtils.kt +++ b/plugins/kotlin/base/psi/src/org/jetbrains/kotlin/idea/base/psi/KotlinPsiModificationUtils.kt @@ -4,6 +4,9 @@ package org.jetbrains.kotlin.idea.base.psi import com.intellij.psi.PsiElement +import com.intellij.psi.PsiErrorElement +import com.intellij.psi.PsiWhiteSpace +import com.intellij.psi.util.PsiTreeUtil import org.jetbrains.annotations.ApiStatus import org.jetbrains.kotlin.lexer.KtTokens import org.jetbrains.kotlin.psi.* @@ -58,4 +61,21 @@ fun KtExpression.dropEnclosingParenthesesIfPossible(): KtExpression { return current.replaced(innermostExpression) } -fun String.unquoteKotlinIdentifier(): String = KtPsiUtil.unquoteIdentifier(this) \ No newline at end of file +fun String.unquoteKotlinIdentifier(): String = KtPsiUtil.unquoteIdentifier(this) + +fun KtClass.getOrCreateCompanionObject(): KtObjectDeclaration { + companionObjects.firstOrNull()?.let { return it } + return appendDeclaration(KtPsiFactory(project).createCompanionObject()) +} + +inline fun KtClass.appendDeclaration(declaration: T): T { + val body = getOrCreateBody() + val anchor = PsiTreeUtil.skipSiblingsBackward(body.rBrace ?: body.lastChild!!, PsiWhiteSpace::class.java) + val newDeclaration = + if (anchor?.nextSibling is PsiErrorElement) + body.addBefore(declaration, anchor) + else + body.addAfter(declaration, anchor) + + return newDeclaration as T +} \ No newline at end of file diff --git a/plugins/kotlin/core/src/org/jetbrains/kotlin/idea/core/psiModificationUtils.kt b/plugins/kotlin/core/src/org/jetbrains/kotlin/idea/core/psiModificationUtils.kt index e82ee809673f..03b8748093dc 100644 --- a/plugins/kotlin/core/src/org/jetbrains/kotlin/idea/core/psiModificationUtils.kt +++ b/plugins/kotlin/core/src/org/jetbrains/kotlin/idea/core/psiModificationUtils.kt @@ -4,7 +4,6 @@ package org.jetbrains.kotlin.idea.core import com.intellij.psi.PsiComment import com.intellij.psi.PsiElement -import com.intellij.psi.PsiErrorElement import com.intellij.psi.PsiWhiteSpace import com.intellij.psi.impl.source.codeStyle.CodeEditUtil import com.intellij.psi.tree.IElementType @@ -18,8 +17,9 @@ import org.jetbrains.kotlin.diagnostics.Severity import org.jetbrains.kotlin.extensions.DeclarationAttributeAltererExtension import org.jetbrains.kotlin.idea.FrontendInternals import org.jetbrains.kotlin.idea.base.projectStructure.languageVersionSettings +import org.jetbrains.kotlin.idea.base.psi.appendDeclaration +import org.jetbrains.kotlin.idea.base.psi.getOrCreateCompanionObject import org.jetbrains.kotlin.idea.base.psi.replaced -import org.jetbrains.kotlin.util.match import org.jetbrains.kotlin.idea.caches.resolve.getResolutionFacade import org.jetbrains.kotlin.idea.caches.resolve.resolveToDescriptorIfAny import org.jetbrains.kotlin.idea.caches.resolve.safeAnalyzeNonSourceRootCode @@ -52,10 +52,10 @@ import org.jetbrains.kotlin.resolve.sam.getFunctionTypeForPossibleSamType import org.jetbrains.kotlin.types.KotlinType import org.jetbrains.kotlin.types.isError import org.jetbrains.kotlin.types.typeUtil.isTypeParameter +import org.jetbrains.kotlin.util.match import org.jetbrains.kotlin.utils.KotlinExceptionWithAttachments import org.jetbrains.kotlin.utils.SmartList import org.jetbrains.kotlin.utils.addToStdlib.safeAs -import org.jetbrains.kotlin.psi.psiUtil.parents fun KtLambdaArgument.moveInsideParentheses(bindingContext: BindingContext): KtCallExpression { val ktExpression = this.getArgumentExpression() @@ -311,22 +311,17 @@ fun PsiElement.deleteSingle() { CodeEditUtil.removeChild(parent?.node ?: return, node ?: return) } -fun KtClass.getOrCreateCompanionObject(): KtObjectDeclaration { - companionObjects.firstOrNull()?.let { return it } - return appendDeclaration(KtPsiFactory(project).createCompanionObject()) -} +@Deprecated( + "Use 'org.jetbrains.kotlin.idea.base.psi.KotlinPsiModificationUtils' instead", + ReplaceWith("this.getOrCreateCompanionObject()", "org.jetbrains.kotlin.idea.base.psi.getOrCreateCompanionObject") +) +fun KtClass.getOrCreateCompanionObject(): KtObjectDeclaration = getOrCreateCompanionObject() -inline fun KtClass.appendDeclaration(declaration: T): T { - val body = getOrCreateBody() - val anchor = PsiTreeUtil.skipSiblingsBackward(body.rBrace ?: body.lastChild!!, PsiWhiteSpace::class.java) - val newDeclaration = - if (anchor?.nextSibling is PsiErrorElement) - body.addBefore(declaration, anchor) - else - body.addAfter(declaration, anchor) - - return newDeclaration as T -} +@Deprecated( + "Use 'org.jetbrains.kotlin.idea.base.psi.KotlinPsiModificationUtils' instead", + ReplaceWith("this.appendDeclaration(declaration)", "org.jetbrains.kotlin.idea.base.psi.appendDeclaration") +) +inline fun KtClass.appendDeclaration(declaration: T): T = appendDeclaration(declaration) fun KtDeclaration.toDescriptor(): DeclarationDescriptor? { if (this is KtScriptInitializer) { diff --git a/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/intentions/ConvertEnumToSealedClassIntention.kt b/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/intentions/ConvertEnumToSealedClassIntention.kt index 66f0c5540f17..27ecf89de495 100644 --- a/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/intentions/ConvertEnumToSealedClassIntention.kt +++ b/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/intentions/ConvertEnumToSealedClassIntention.kt @@ -12,10 +12,10 @@ import org.jetbrains.kotlin.config.LanguageFeature import org.jetbrains.kotlin.descriptors.ClassDescriptor import org.jetbrains.kotlin.idea.base.facet.platform.platform import org.jetbrains.kotlin.idea.base.projectStructure.languageVersionSettings +import org.jetbrains.kotlin.idea.base.psi.getOrCreateCompanionObject import org.jetbrains.kotlin.idea.base.resources.KotlinBundle import org.jetbrains.kotlin.idea.caches.resolve.resolveToDescriptorIfAny import org.jetbrains.kotlin.idea.codeinsight.api.classic.intentions.SelfTargetingRangeIntention -import org.jetbrains.kotlin.idea.core.getOrCreateCompanionObject import org.jetbrains.kotlin.idea.util.withExpectedActuals import org.jetbrains.kotlin.lexer.KtTokens import org.jetbrains.kotlin.platform.jvm.isJvm diff --git a/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/intentions/MoveMemberToCompanionObjectIntention.kt b/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/intentions/MoveMemberToCompanionObjectIntention.kt index 5d52db3da764..7123e57f5146 100644 --- a/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/intentions/MoveMemberToCompanionObjectIntention.kt +++ b/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/intentions/MoveMemberToCompanionObjectIntention.kt @@ -34,6 +34,7 @@ import org.jetbrains.kotlin.descriptors.ClassDescriptorWithResolutionScopes import org.jetbrains.kotlin.descriptors.TypeParameterDescriptor import org.jetbrains.kotlin.diagnostics.Diagnostic import org.jetbrains.kotlin.idea.base.fe10.codeInsight.newDeclaration.Fe10KotlinNameSuggester +import org.jetbrains.kotlin.idea.base.psi.getOrCreateCompanionObject import org.jetbrains.kotlin.idea.base.psi.replaced import org.jetbrains.kotlin.idea.base.resources.KotlinBundle import org.jetbrains.kotlin.idea.caches.resolve.analyze @@ -44,7 +45,6 @@ import org.jetbrains.kotlin.idea.codeinsight.api.classic.intentions.SelfTargetin import org.jetbrains.kotlin.idea.codeinsight.utils.ChooseStringExpression import org.jetbrains.kotlin.idea.core.CollectingNameValidator import org.jetbrains.kotlin.idea.core.ShortenReferences -import org.jetbrains.kotlin.idea.core.getOrCreateCompanionObject import org.jetbrains.kotlin.idea.core.util.runSynchronouslyWithProgress import org.jetbrains.kotlin.idea.quickfix.KotlinSingleIntentionActionFactory import org.jetbrains.kotlin.idea.refactoring.checkConflictsInteractively diff --git a/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/quickfix/MakeMemberStaticFix.kt b/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/quickfix/MakeMemberStaticFix.kt index 4799a26e1537..fa47ed0efe0a 100644 --- a/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/quickfix/MakeMemberStaticFix.kt +++ b/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/quickfix/MakeMemberStaticFix.kt @@ -9,9 +9,9 @@ import com.intellij.openapi.project.Project import com.intellij.psi.PsiFile import com.intellij.psi.codeStyle.CodeStyleManager import com.intellij.psi.util.PsiTreeUtil +import org.jetbrains.kotlin.idea.base.psi.getOrCreateCompanionObject import org.jetbrains.kotlin.idea.base.resources.KotlinBundle import org.jetbrains.kotlin.idea.codeinsight.api.classic.quickfixes.KotlinQuickFixAction -import org.jetbrains.kotlin.idea.core.getOrCreateCompanionObject import org.jetbrains.kotlin.idea.intentions.AddJvmStaticIntention import org.jetbrains.kotlin.idea.intentions.MoveMemberToCompanionObjectIntention import org.jetbrains.kotlin.idea.refactoring.checkConflictsInteractively diff --git a/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/quickfix/createFromUsage/callableBuilder/CallableBuilder.kt b/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/quickfix/createFromUsage/callableBuilder/CallableBuilder.kt index 587042c34d56..1409d5f5c87e 100644 --- a/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/quickfix/createFromUsage/callableBuilder/CallableBuilder.kt +++ b/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/quickfix/createFromUsage/callableBuilder/CallableBuilder.kt @@ -35,6 +35,7 @@ import org.jetbrains.kotlin.descriptors.impl.TypeParameterDescriptorImpl import org.jetbrains.kotlin.idea.FrontendInternals import org.jetbrains.kotlin.idea.base.fe10.codeInsight.newDeclaration.Fe10KotlinNameSuggester import org.jetbrains.kotlin.idea.base.psi.copied +import org.jetbrains.kotlin.idea.base.psi.getOrCreateCompanionObject import org.jetbrains.kotlin.idea.base.psi.isMultiLine import org.jetbrains.kotlin.idea.base.psi.replaced import org.jetbrains.kotlin.idea.base.resources.KotlinBundle diff --git a/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/quickfix/createFromUsage/createCallable/CreateCallableFromUsageFix.kt b/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/quickfix/createFromUsage/createCallable/CreateCallableFromUsageFix.kt index d00dd2de18e9..50ac6d460ff8 100644 --- a/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/quickfix/createFromUsage/createCallable/CreateCallableFromUsageFix.kt +++ b/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/quickfix/createFromUsage/createCallable/CreateCallableFromUsageFix.kt @@ -15,9 +15,9 @@ import org.jetbrains.annotations.Nls import org.jetbrains.kotlin.builtins.functions.FunctionClassDescriptor import org.jetbrains.kotlin.descriptors.ClassDescriptor import org.jetbrains.kotlin.descriptors.ClassifierDescriptor +import org.jetbrains.kotlin.idea.base.psi.getOrCreateCompanionObject import org.jetbrains.kotlin.idea.base.resources.KotlinBundle import org.jetbrains.kotlin.idea.codeInsight.DescriptorToSourceUtilsIde -import org.jetbrains.kotlin.idea.core.getOrCreateCompanionObject import org.jetbrains.kotlin.idea.quickfix.KotlinCrossLanguageQuickFixAction import org.jetbrains.kotlin.idea.quickfix.createFromUsage.callableBuilder.* import org.jetbrains.kotlin.idea.refactoring.canRefactor diff --git a/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/refactoring/move/moveDeclarations/KotlinMoveTarget.kt b/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/refactoring/move/moveDeclarations/KotlinMoveTarget.kt index 347c0bea0156..b32049ae64f4 100644 --- a/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/refactoring/move/moveDeclarations/KotlinMoveTarget.kt +++ b/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/refactoring/move/moveDeclarations/KotlinMoveTarget.kt @@ -7,7 +7,7 @@ import com.intellij.openapi.util.NlsContexts import com.intellij.openapi.vfs.VirtualFile import com.intellij.psi.PsiElement import com.intellij.psi.PsiFile -import org.jetbrains.kotlin.idea.core.getOrCreateCompanionObject +import org.jetbrains.kotlin.idea.base.psi.getOrCreateCompanionObject import org.jetbrains.kotlin.idea.util.projectStructure.getModule import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.SpecialNames diff --git a/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/refactoring/pullUp/JavaToKotlinPreconversionPullUpHelper.kt b/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/refactoring/pullUp/JavaToKotlinPreconversionPullUpHelper.kt index ce8a3309d7c4..18d8a508efdf 100644 --- a/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/refactoring/pullUp/JavaToKotlinPreconversionPullUpHelper.kt +++ b/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/refactoring/pullUp/JavaToKotlinPreconversionPullUpHelper.kt @@ -14,8 +14,8 @@ import com.intellij.refactoring.util.RefactoringUtil import com.intellij.refactoring.util.classMembers.MemberInfo import com.intellij.util.VisibilityUtil import org.jetbrains.kotlin.asJava.unwrapped +import org.jetbrains.kotlin.idea.base.psi.getOrCreateCompanionObject import org.jetbrains.kotlin.idea.codeInsight.shorten.addToShorteningWaitSet -import org.jetbrains.kotlin.idea.core.getOrCreateCompanionObject import org.jetbrains.kotlin.idea.core.setVisibility import org.jetbrains.kotlin.idea.j2k.j2k import org.jetbrains.kotlin.idea.j2k.j2kText diff --git a/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/refactoring/pullUp/KotlinPullUpHelper.kt b/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/refactoring/pullUp/KotlinPullUpHelper.kt index 8e4b5e44ea12..a90e8dcf1821 100644 --- a/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/refactoring/pullUp/KotlinPullUpHelper.kt +++ b/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/refactoring/pullUp/KotlinPullUpHelper.kt @@ -16,11 +16,11 @@ import org.jetbrains.kotlin.asJava.toLightClass import org.jetbrains.kotlin.asJava.unwrapped import org.jetbrains.kotlin.descriptors.* import org.jetbrains.kotlin.idea.KotlinLanguage +import org.jetbrains.kotlin.idea.base.psi.getOrCreateCompanionObject import org.jetbrains.kotlin.idea.base.psi.replaced import org.jetbrains.kotlin.idea.base.util.reformatted import org.jetbrains.kotlin.idea.codeInsight.shorten.addToShorteningWaitSet import org.jetbrains.kotlin.idea.core.dropDefaultValue -import org.jetbrains.kotlin.idea.core.getOrCreateCompanionObject import org.jetbrains.kotlin.idea.core.setType import org.jetbrains.kotlin.idea.inspections.CONSTRUCTOR_VAL_VAR_MODIFIERS import org.jetbrains.kotlin.idea.refactoring.createJavaField diff --git a/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/refactoring/pushDown/JavaToKotlinPushDownDelegate.kt b/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/refactoring/pushDown/JavaToKotlinPushDownDelegate.kt index be5591199835..62bd71ced54c 100644 --- a/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/refactoring/pushDown/JavaToKotlinPushDownDelegate.kt +++ b/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/refactoring/pushDown/JavaToKotlinPushDownDelegate.kt @@ -12,11 +12,11 @@ import com.intellij.util.containers.MultiMap import org.jetbrains.kotlin.asJava.unwrapped import org.jetbrains.kotlin.descriptors.CallableMemberDescriptor import org.jetbrains.kotlin.descriptors.ClassDescriptor +import org.jetbrains.kotlin.idea.base.psi.getOrCreateCompanionObject import org.jetbrains.kotlin.idea.caches.resolve.getResolutionFacade import org.jetbrains.kotlin.idea.caches.resolve.unsafeResolveToDescriptor import org.jetbrains.kotlin.idea.caches.resolve.util.getJavaClassDescriptor import org.jetbrains.kotlin.idea.caches.resolve.util.getJavaMemberDescriptor -import org.jetbrains.kotlin.idea.core.getOrCreateCompanionObject import org.jetbrains.kotlin.idea.j2k.j2k import org.jetbrains.kotlin.idea.j2k.j2kText import org.jetbrains.kotlin.idea.refactoring.isInterfaceClass