Move/copy refactoring: add base support of implicit package prefix
#KT-29720 Fixed
This commit is contained in:
@@ -39,8 +39,8 @@ fun PsiFile.getFqNameByDirectory(): FqName {
|
|||||||
return qualifiedNameByDirectory?.let(::FqName) ?: FqName.ROOT
|
return qualifiedNameByDirectory?.let(::FqName) ?: FqName.ROOT
|
||||||
}
|
}
|
||||||
|
|
||||||
fun PsiDirectory.getFqNameWithImplicitPrefix(): FqName {
|
fun PsiDirectory.getFqNameWithImplicitPrefix(): FqName? {
|
||||||
val packageFqName = getPackage()?.qualifiedName?.let(::FqName) ?: FqName.ROOT
|
val packageFqName = getPackage()?.qualifiedName?.let(::FqName) ?: return null
|
||||||
sourceRoot?.takeIf { !it.hasExplicitPackagePrefix(project) }?.let { sourceRoot ->
|
sourceRoot?.takeIf { !it.hasExplicitPackagePrefix(project) }?.let { sourceRoot ->
|
||||||
val implicitPrefix = PerModulePackageCacheService.getInstance(project).getImplicitPackagePrefix(sourceRoot)
|
val implicitPrefix = PerModulePackageCacheService.getInstance(project).getImplicitPackagePrefix(sourceRoot)
|
||||||
return FqName.fromSegments((implicitPrefix.pathSegments() + packageFqName.pathSegments()).map { it.asString() })
|
return FqName.fromSegments((implicitPrefix.pathSegments() + packageFqName.pathSegments()).map { it.asString() })
|
||||||
@@ -48,6 +48,8 @@ fun PsiDirectory.getFqNameWithImplicitPrefix(): FqName {
|
|||||||
return packageFqName
|
return packageFqName
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fun PsiDirectory.getFqNameWithImplicitPrefixOrRoot(): FqName = getFqNameWithImplicitPrefix() ?: FqName.ROOT
|
||||||
|
|
||||||
private fun VirtualFile.hasExplicitPackagePrefix(project: Project): Boolean =
|
private fun VirtualFile.hasExplicitPackagePrefix(project: Project): Boolean =
|
||||||
toPsiDirectory(project)?.getPackage()?.qualifiedName?.isNotEmpty() == true
|
toPsiDirectory(project)?.getPackage()?.qualifiedName?.isNotEmpty() == true
|
||||||
|
|
||||||
|
|||||||
+2
-2
@@ -8,14 +8,14 @@ package org.jetbrains.kotlin.idea.actions
|
|||||||
import com.intellij.ide.fileTemplates.DefaultTemplatePropertiesProvider
|
import com.intellij.ide.fileTemplates.DefaultTemplatePropertiesProvider
|
||||||
import com.intellij.ide.fileTemplates.FileTemplate
|
import com.intellij.ide.fileTemplates.FileTemplate
|
||||||
import com.intellij.psi.PsiDirectory
|
import com.intellij.psi.PsiDirectory
|
||||||
import org.jetbrains.kotlin.idea.core.getFqNameWithImplicitPrefix
|
import org.jetbrains.kotlin.idea.core.getFqNameWithImplicitPrefixOrRoot
|
||||||
import java.util.*
|
import java.util.*
|
||||||
|
|
||||||
class KotlinDefaultTemplatePropertiesProvider : DefaultTemplatePropertiesProvider {
|
class KotlinDefaultTemplatePropertiesProvider : DefaultTemplatePropertiesProvider {
|
||||||
override fun fillProperties(directory: PsiDirectory, props: Properties) {
|
override fun fillProperties(directory: PsiDirectory, props: Properties) {
|
||||||
props.setProperty(
|
props.setProperty(
|
||||||
FileTemplate.ATTRIBUTE_PACKAGE_NAME,
|
FileTemplate.ATTRIBUTE_PACKAGE_NAME,
|
||||||
directory.getFqNameWithImplicitPrefix().asString()
|
directory.getFqNameWithImplicitPrefixOrRoot().asString()
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+2
-3
@@ -26,7 +26,7 @@ import com.intellij.openapi.project.Project
|
|||||||
import com.intellij.openapi.ui.DialogWrapper
|
import com.intellij.openapi.ui.DialogWrapper
|
||||||
import com.intellij.psi.*
|
import com.intellij.psi.*
|
||||||
import org.jetbrains.kotlin.idea.KotlinFileType
|
import org.jetbrains.kotlin.idea.KotlinFileType
|
||||||
import org.jetbrains.kotlin.idea.core.getPackage
|
import org.jetbrains.kotlin.idea.core.getFqNameWithImplicitPrefix
|
||||||
import org.jetbrains.kotlin.idea.core.quoteIfNeeded
|
import org.jetbrains.kotlin.idea.core.quoteIfNeeded
|
||||||
import org.jetbrains.kotlin.idea.core.util.CodeInsightUtils
|
import org.jetbrains.kotlin.idea.core.util.CodeInsightUtils
|
||||||
import org.jetbrains.kotlin.idea.quickfix.IntentionActionPriority
|
import org.jetbrains.kotlin.idea.quickfix.IntentionActionPriority
|
||||||
@@ -44,7 +44,6 @@ import org.jetbrains.kotlin.idea.util.application.executeCommand
|
|||||||
import org.jetbrains.kotlin.idea.util.application.executeWriteCommand
|
import org.jetbrains.kotlin.idea.util.application.executeWriteCommand
|
||||||
import org.jetbrains.kotlin.idea.util.application.runWriteAction
|
import org.jetbrains.kotlin.idea.util.application.runWriteAction
|
||||||
import org.jetbrains.kotlin.idea.util.projectStructure.module
|
import org.jetbrains.kotlin.idea.util.projectStructure.module
|
||||||
import org.jetbrains.kotlin.name.FqName
|
|
||||||
import org.jetbrains.kotlin.name.Name
|
import org.jetbrains.kotlin.name.Name
|
||||||
import org.jetbrains.kotlin.psi.*
|
import org.jetbrains.kotlin.psi.*
|
||||||
import org.jetbrains.kotlin.psi.psiUtil.allChildren
|
import org.jetbrains.kotlin.psi.psiUtil.allChildren
|
||||||
@@ -201,7 +200,7 @@ open class CreateClassFromUsageFix<E : KtElement> protected constructor(
|
|||||||
|
|
||||||
val targetDirectory = dialog.targetDirectory ?: return
|
val targetDirectory = dialog.targetDirectory ?: return
|
||||||
val fileName = "$className.${KotlinFileType.EXTENSION}"
|
val fileName = "$className.${KotlinFileType.EXTENSION}"
|
||||||
val packageFqName = targetDirectory.getPackage()?.qualifiedName?.let { FqName(it).quoteIfNeeded() }
|
val packageFqName = targetDirectory.getFqNameWithImplicitPrefix()?.quoteIfNeeded()
|
||||||
|
|
||||||
file.project.executeWriteCommand(text) {
|
file.project.executeWriteCommand(text) {
|
||||||
val targetFile = getOrCreateKotlinFile(fileName, targetDirectory, (packageFqName ?: defaultPackageFqName).asString())
|
val targetFile = getOrCreateKotlinFile(fileName, targetDirectory, (packageFqName ?: defaultPackageFqName).asString())
|
||||||
|
|||||||
@@ -13,7 +13,7 @@ import org.jetbrains.kotlin.idea.caches.project.implementedDescriptors
|
|||||||
import org.jetbrains.kotlin.idea.caches.resolve.analyzeWithContent
|
import org.jetbrains.kotlin.idea.caches.resolve.analyzeWithContent
|
||||||
import org.jetbrains.kotlin.idea.core.KotlinNameSuggester
|
import org.jetbrains.kotlin.idea.core.KotlinNameSuggester
|
||||||
import org.jetbrains.kotlin.idea.core.findOrCreateDirectoryForPackage
|
import org.jetbrains.kotlin.idea.core.findOrCreateDirectoryForPackage
|
||||||
import org.jetbrains.kotlin.idea.core.getPackage
|
import org.jetbrains.kotlin.idea.core.getFqNameWithImplicitPrefix
|
||||||
import org.jetbrains.kotlin.idea.core.overrideImplement.MemberGenerateMode
|
import org.jetbrains.kotlin.idea.core.overrideImplement.MemberGenerateMode
|
||||||
import org.jetbrains.kotlin.idea.core.overrideImplement.OverrideMemberChooserObject.BodyType.EMPTY_OR_TEMPLATE
|
import org.jetbrains.kotlin.idea.core.overrideImplement.OverrideMemberChooserObject.BodyType.EMPTY_OR_TEMPLATE
|
||||||
import org.jetbrains.kotlin.idea.core.overrideImplement.OverrideMemberChooserObject.BodyType.NO_BODY
|
import org.jetbrains.kotlin.idea.core.overrideImplement.OverrideMemberChooserObject.BodyType.NO_BODY
|
||||||
@@ -31,7 +31,7 @@ import org.jetbrains.kotlin.idea.util.module
|
|||||||
import org.jetbrains.kotlin.js.descriptorUtils.getJetTypeFqName
|
import org.jetbrains.kotlin.js.descriptorUtils.getJetTypeFqName
|
||||||
import org.jetbrains.kotlin.lexer.KtTokens
|
import org.jetbrains.kotlin.lexer.KtTokens
|
||||||
import org.jetbrains.kotlin.name.FqName
|
import org.jetbrains.kotlin.name.FqName
|
||||||
import org.jetbrains.kotlin.platform.impl.isCommon
|
import org.jetbrains.kotlin.platform.isCommon
|
||||||
import org.jetbrains.kotlin.psi.*
|
import org.jetbrains.kotlin.psi.*
|
||||||
import org.jetbrains.kotlin.psi.psiUtil.hasActualModifier
|
import org.jetbrains.kotlin.psi.psiUtil.hasActualModifier
|
||||||
import org.jetbrains.kotlin.resolve.BindingContext
|
import org.jetbrains.kotlin.resolve.BindingContext
|
||||||
@@ -40,7 +40,6 @@ import org.jetbrains.kotlin.resolve.checkers.ExpectedActualDeclarationChecker
|
|||||||
import org.jetbrains.kotlin.resolve.checkers.ExperimentalUsageChecker
|
import org.jetbrains.kotlin.resolve.checkers.ExperimentalUsageChecker
|
||||||
import org.jetbrains.kotlin.resolve.descriptorUtil.fqNameSafe
|
import org.jetbrains.kotlin.resolve.descriptorUtil.fqNameSafe
|
||||||
import org.jetbrains.kotlin.resolve.descriptorUtil.module
|
import org.jetbrains.kotlin.resolve.descriptorUtil.module
|
||||||
import org.jetbrains.kotlin.platform.isCommon
|
|
||||||
import org.jetbrains.kotlin.types.AbbreviatedType
|
import org.jetbrains.kotlin.types.AbbreviatedType
|
||||||
import org.jetbrains.kotlin.types.KotlinType
|
import org.jetbrains.kotlin.types.KotlinType
|
||||||
|
|
||||||
@@ -57,7 +56,7 @@ fun createFileForDeclaration(module: Module, declaration: KtNamedDeclaration): K
|
|||||||
val fileNameWithExtension = "$fileName.kt"
|
val fileNameWithExtension = "$fileName.kt"
|
||||||
val existingFile = directory.findFile(fileNameWithExtension)
|
val existingFile = directory.findFile(fileNameWithExtension)
|
||||||
val packageName =
|
val packageName =
|
||||||
if (packageDirective?.packageNameExpression == null) directory.getPackage()?.qualifiedName
|
if (packageDirective?.packageNameExpression == null) directory.getFqNameWithImplicitPrefix()?.asString()
|
||||||
else packageDirective.fqName.asString()
|
else packageDirective.fqName.asString()
|
||||||
if (existingFile is KtFile) {
|
if (existingFile is KtFile) {
|
||||||
val existingPackageDirective = existingFile.packageDirective
|
val existingPackageDirective = existingFile.packageDirective
|
||||||
|
|||||||
+6
-4
@@ -28,8 +28,8 @@ import com.intellij.util.IncorrectOperationException
|
|||||||
import com.intellij.util.containers.MultiMap
|
import com.intellij.util.containers.MultiMap
|
||||||
import org.jetbrains.annotations.TestOnly
|
import org.jetbrains.annotations.TestOnly
|
||||||
import org.jetbrains.kotlin.idea.codeInsight.shorten.performDelayedRefactoringRequests
|
import org.jetbrains.kotlin.idea.codeInsight.shorten.performDelayedRefactoringRequests
|
||||||
import org.jetbrains.kotlin.idea.core.getPackage
|
import org.jetbrains.kotlin.idea.core.getFqNameWithImplicitPrefix
|
||||||
import org.jetbrains.kotlin.idea.core.packageMatchesDirectory
|
import org.jetbrains.kotlin.idea.core.packageMatchesDirectoryOrImplicit
|
||||||
import org.jetbrains.kotlin.idea.core.util.toPsiDirectory
|
import org.jetbrains.kotlin.idea.core.util.toPsiDirectory
|
||||||
import org.jetbrains.kotlin.idea.refactoring.checkConflictsInteractively
|
import org.jetbrains.kotlin.idea.refactoring.checkConflictsInteractively
|
||||||
import org.jetbrains.kotlin.idea.refactoring.createKotlinFile
|
import org.jetbrains.kotlin.idea.refactoring.createKotlinFile
|
||||||
@@ -244,9 +244,11 @@ class CopyKotlinDeclarationsHandler : CopyHandlerDelegateBase() {
|
|||||||
val copiedDeclaration: KtNamedDeclaration?
|
val copiedDeclaration: KtNamedDeclaration?
|
||||||
if (fileToCopy != null) {
|
if (fileToCopy != null) {
|
||||||
targetFile = runWriteAction {
|
targetFile = runWriteAction {
|
||||||
|
// implicit package prefix may change after copy
|
||||||
|
val targetDirectoryFqName = targetDirectory.getFqNameWithImplicitPrefix()
|
||||||
val copiedFile = targetDirectory.copyFileFrom(targetFileName, fileToCopy)
|
val copiedFile = targetDirectory.copyFileFrom(targetFileName, fileToCopy)
|
||||||
if (copiedFile is KtFile && fileToCopy.packageMatchesDirectory()) {
|
if (copiedFile is KtFile && fileToCopy.packageMatchesDirectoryOrImplicit()) {
|
||||||
targetDirectory.getPackage()?.qualifiedName?.let { copiedFile.packageFqName = FqName(it) }
|
targetDirectoryFqName?.let { copiedFile.packageFqName = it }
|
||||||
}
|
}
|
||||||
performDelayedRefactoringRequests(project)
|
performDelayedRefactoringRequests(project)
|
||||||
copiedFile
|
copiedFile
|
||||||
|
|||||||
+2
-5
@@ -38,10 +38,7 @@ import org.jetbrains.kotlin.idea.caches.resolve.getResolutionFacade
|
|||||||
import org.jetbrains.kotlin.idea.caches.resolve.unsafeResolveToDescriptor
|
import org.jetbrains.kotlin.idea.caches.resolve.unsafeResolveToDescriptor
|
||||||
import org.jetbrains.kotlin.idea.codeInsight.DescriptorToSourceUtilsIde
|
import org.jetbrains.kotlin.idea.codeInsight.DescriptorToSourceUtilsIde
|
||||||
import org.jetbrains.kotlin.idea.codeInsight.shorten.performDelayedRefactoringRequests
|
import org.jetbrains.kotlin.idea.codeInsight.shorten.performDelayedRefactoringRequests
|
||||||
import org.jetbrains.kotlin.idea.core.ShortenReferences
|
import org.jetbrains.kotlin.idea.core.*
|
||||||
import org.jetbrains.kotlin.idea.core.copied
|
|
||||||
import org.jetbrains.kotlin.idea.core.getPackage
|
|
||||||
import org.jetbrains.kotlin.idea.core.replaced
|
|
||||||
import org.jetbrains.kotlin.idea.core.util.runSynchronouslyWithProgress
|
import org.jetbrains.kotlin.idea.core.util.runSynchronouslyWithProgress
|
||||||
import org.jetbrains.kotlin.idea.refactoring.introduce.insertDeclaration
|
import org.jetbrains.kotlin.idea.refactoring.introduce.insertDeclaration
|
||||||
import org.jetbrains.kotlin.idea.refactoring.memberInfo.KotlinMemberInfo
|
import org.jetbrains.kotlin.idea.refactoring.memberInfo.KotlinMemberInfo
|
||||||
@@ -242,7 +239,7 @@ class ExtractSuperRefactoring(
|
|||||||
newClass.addAfter(psiFactory.createTypeParameterList(typeParameterListText), newClass.nameIdentifier)
|
newClass.addAfter(psiFactory.createTypeParameterList(typeParameterListText), newClass.nameIdentifier)
|
||||||
}
|
}
|
||||||
|
|
||||||
val targetPackageFqName = (targetParent as? PsiDirectory)?.getPackage()?.qualifiedName
|
val targetPackageFqName = (targetParent as? PsiDirectory)?.getFqNameWithImplicitPrefix()?.asString()
|
||||||
|
|
||||||
val superTypeText = buildString {
|
val superTypeText = buildString {
|
||||||
if (!targetPackageFqName.isNullOrEmpty()) {
|
if (!targetPackageFqName.isNullOrEmpty()) {
|
||||||
|
|||||||
@@ -32,7 +32,6 @@ import com.intellij.openapi.ui.popup.*
|
|||||||
import com.intellij.openapi.util.Pass
|
import com.intellij.openapi.util.Pass
|
||||||
import com.intellij.openapi.util.TextRange
|
import com.intellij.openapi.util.TextRange
|
||||||
import com.intellij.openapi.util.text.StringUtil
|
import com.intellij.openapi.util.text.StringUtil
|
||||||
import com.intellij.openapi.vfs.LocalFileSystem
|
|
||||||
import com.intellij.openapi.vfs.VirtualFile
|
import com.intellij.openapi.vfs.VirtualFile
|
||||||
import com.intellij.psi.*
|
import com.intellij.psi.*
|
||||||
import com.intellij.psi.impl.file.PsiPackageBase
|
import com.intellij.psi.impl.file.PsiPackageBase
|
||||||
@@ -71,8 +70,6 @@ import org.jetbrains.kotlin.idea.caches.resolve.util.getJavaMemberDescriptor
|
|||||||
import org.jetbrains.kotlin.idea.codeInsight.DescriptorToSourceUtilsIde
|
import org.jetbrains.kotlin.idea.codeInsight.DescriptorToSourceUtilsIde
|
||||||
import org.jetbrains.kotlin.idea.core.*
|
import org.jetbrains.kotlin.idea.core.*
|
||||||
import org.jetbrains.kotlin.idea.core.util.showYesNoCancelDialog
|
import org.jetbrains.kotlin.idea.core.util.showYesNoCancelDialog
|
||||||
import org.jetbrains.kotlin.idea.j2k.IdeaJavaToKotlinServices
|
|
||||||
import org.jetbrains.kotlin.idea.j2k.JavaToKotlinConverterFactory
|
|
||||||
import org.jetbrains.kotlin.idea.project.languageVersionSettings
|
import org.jetbrains.kotlin.idea.project.languageVersionSettings
|
||||||
import org.jetbrains.kotlin.idea.refactoring.changeSignature.KotlinValVar
|
import org.jetbrains.kotlin.idea.refactoring.changeSignature.KotlinValVar
|
||||||
import org.jetbrains.kotlin.idea.refactoring.changeSignature.toValVar
|
import org.jetbrains.kotlin.idea.refactoring.changeSignature.toValVar
|
||||||
@@ -83,7 +80,6 @@ import org.jetbrains.kotlin.idea.util.ProjectRootsUtil
|
|||||||
import org.jetbrains.kotlin.idea.util.actualsForExpected
|
import org.jetbrains.kotlin.idea.util.actualsForExpected
|
||||||
import org.jetbrains.kotlin.idea.util.liftToExpected
|
import org.jetbrains.kotlin.idea.util.liftToExpected
|
||||||
import org.jetbrains.kotlin.idea.util.string.collapseSpaces
|
import org.jetbrains.kotlin.idea.util.string.collapseSpaces
|
||||||
import org.jetbrains.kotlin.j2k.ConverterSettings
|
|
||||||
import org.jetbrains.kotlin.lexer.KtTokens
|
import org.jetbrains.kotlin.lexer.KtTokens
|
||||||
import org.jetbrains.kotlin.name.FqName
|
import org.jetbrains.kotlin.name.FqName
|
||||||
import org.jetbrains.kotlin.name.FqNameUnsafe
|
import org.jetbrains.kotlin.name.FqNameUnsafe
|
||||||
@@ -95,7 +91,6 @@ import org.jetbrains.kotlin.resolve.calls.callUtil.getCallWithAssert
|
|||||||
import org.jetbrains.kotlin.resolve.lazy.BodyResolveMode
|
import org.jetbrains.kotlin.resolve.lazy.BodyResolveMode
|
||||||
import org.jetbrains.kotlin.resolve.scopes.receivers.ImplicitReceiver
|
import org.jetbrains.kotlin.resolve.scopes.receivers.ImplicitReceiver
|
||||||
import org.jetbrains.kotlin.resolve.source.getPsi
|
import org.jetbrains.kotlin.resolve.source.getPsi
|
||||||
import java.io.File
|
|
||||||
import java.lang.annotation.Retention
|
import java.lang.annotation.Retention
|
||||||
import java.util.*
|
import java.util.*
|
||||||
import javax.swing.Icon
|
import javax.swing.Icon
|
||||||
@@ -111,14 +106,14 @@ const val CHECK_SUPER_METHODS_YES_NO_DIALOG = "CHECK_SUPER_METHODS_YES_NO_DIALOG
|
|||||||
fun getOrCreateKotlinFile(
|
fun getOrCreateKotlinFile(
|
||||||
fileName: String,
|
fileName: String,
|
||||||
targetDir: PsiDirectory,
|
targetDir: PsiDirectory,
|
||||||
packageName: String? = targetDir.getPackage()?.qualifiedName
|
packageName: String? = targetDir.getFqNameWithImplicitPrefix()?.asString()
|
||||||
): KtFile? =
|
): KtFile? =
|
||||||
(targetDir.findFile(fileName) ?: createKotlinFile(fileName, targetDir, packageName)) as? KtFile
|
(targetDir.findFile(fileName) ?: createKotlinFile(fileName, targetDir, packageName)) as? KtFile
|
||||||
|
|
||||||
fun createKotlinFile(
|
fun createKotlinFile(
|
||||||
fileName: String,
|
fileName: String,
|
||||||
targetDir: PsiDirectory,
|
targetDir: PsiDirectory,
|
||||||
packageName: String? = targetDir.getPackage()?.qualifiedName
|
packageName: String? = targetDir.getFqNameWithImplicitPrefix()?.asString()
|
||||||
): KtFile {
|
): KtFile {
|
||||||
targetDir.checkCreateFile(fileName)
|
targetDir.checkCreateFile(fileName)
|
||||||
val packageFqName = packageName?.let(::FqName) ?: FqName.ROOT
|
val packageFqName = packageName?.let(::FqName) ?: FqName.ROOT
|
||||||
|
|||||||
+2
-2
@@ -31,7 +31,7 @@ import com.intellij.ui.components.JBLabelDecorator
|
|||||||
import com.intellij.util.IncorrectOperationException
|
import com.intellij.util.IncorrectOperationException
|
||||||
import com.intellij.util.ui.FormBuilder
|
import com.intellij.util.ui.FormBuilder
|
||||||
import com.intellij.util.ui.UIUtil
|
import com.intellij.util.ui.UIUtil
|
||||||
import org.jetbrains.kotlin.idea.core.packageMatchesDirectory
|
import org.jetbrains.kotlin.idea.core.packageMatchesDirectoryOrImplicit
|
||||||
import org.jetbrains.kotlin.idea.core.util.onTextChange
|
import org.jetbrains.kotlin.idea.core.util.onTextChange
|
||||||
import org.jetbrains.kotlin.idea.refactoring.isInJavaSourceRoot
|
import org.jetbrains.kotlin.idea.refactoring.isInJavaSourceRoot
|
||||||
import org.jetbrains.kotlin.idea.util.application.executeCommand
|
import org.jetbrains.kotlin.idea.util.application.executeCommand
|
||||||
@@ -138,7 +138,7 @@ class KotlinAwareMoveFilesOrDirectoriesDialog(
|
|||||||
}
|
}
|
||||||
|
|
||||||
val singleFile = jetFiles.singleOrNull()
|
val singleFile = jetFiles.singleOrNull()
|
||||||
isSelected = singleFile == null || singleFile.packageMatchesDirectory()
|
isSelected = singleFile == null || singleFile.packageMatchesDirectoryOrImplicit()
|
||||||
text = "Update package directive (Kotlin files)"
|
text = "Update package directive (Kotlin files)"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+1
-1
@@ -158,7 +158,7 @@ public class MoveKotlinTopLevelDeclarationsDialog extends RefactoringDialog {
|
|||||||
|
|
||||||
private static boolean arePackagesAndDirectoryMatched(List<KtFile> sourceFiles) {
|
private static boolean arePackagesAndDirectoryMatched(List<KtFile> sourceFiles) {
|
||||||
for (KtFile sourceFile : sourceFiles) {
|
for (KtFile sourceFile : sourceFiles) {
|
||||||
if (!PackageUtilsKt.packageMatchesDirectory(sourceFile)) return false;
|
if (!PackageUtilsKt.packageMatchesDirectoryOrImplicit(sourceFile)) return false;
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|||||||
+3
-2
@@ -16,6 +16,7 @@ import com.intellij.refactoring.move.moveFilesOrDirectories.MoveFilesOrDirectori
|
|||||||
import com.intellij.usageView.UsageInfo
|
import com.intellij.usageView.UsageInfo
|
||||||
import com.intellij.util.Function
|
import com.intellij.util.Function
|
||||||
import com.intellij.util.containers.MultiMap
|
import com.intellij.util.containers.MultiMap
|
||||||
|
import org.jetbrains.kotlin.idea.core.getFqNameWithImplicitPrefix
|
||||||
import org.jetbrains.kotlin.idea.core.getPackage
|
import org.jetbrains.kotlin.idea.core.getPackage
|
||||||
import org.jetbrains.kotlin.idea.core.quoteIfNeeded
|
import org.jetbrains.kotlin.idea.core.quoteIfNeeded
|
||||||
import org.jetbrains.kotlin.idea.refactoring.invokeOnceOnCommandFinish
|
import org.jetbrains.kotlin.idea.refactoring.invokeOnceOnCommandFinish
|
||||||
@@ -103,8 +104,8 @@ class KotlinMoveDirectoryWithClassesHelper : MoveDirectoryWithClassesHelper() {
|
|||||||
val moveContextMap = getOrCreateMoveContextMap()
|
val moveContextMap = getOrCreateMoveContextMap()
|
||||||
moveContextMap[file] = MoveContext(moveDestination, moveDeclarationsProcessor)
|
moveContextMap[file] = MoveContext(moveDestination, moveDeclarationsProcessor)
|
||||||
if (moveDeclarationsProcessor != null) {
|
if (moveDeclarationsProcessor != null) {
|
||||||
moveDestination.getPackage()?.let { newPackage ->
|
moveDestination.getFqNameWithImplicitPrefix()?.quoteIfNeeded()?.let {
|
||||||
file.packageDirective?.fqName = FqName(newPackage.qualifiedName).quoteIfNeeded()
|
file.packageDirective?.fqName = it
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return true
|
return true
|
||||||
|
|||||||
+5
-7
@@ -17,15 +17,14 @@ import com.intellij.refactoring.move.moveFilesOrDirectories.MoveFileHandler
|
|||||||
import com.intellij.refactoring.move.moveFilesOrDirectories.MoveFilesOrDirectoriesUtil
|
import com.intellij.refactoring.move.moveFilesOrDirectories.MoveFilesOrDirectoriesUtil
|
||||||
import com.intellij.usageView.UsageInfo
|
import com.intellij.usageView.UsageInfo
|
||||||
import org.jetbrains.kotlin.idea.KotlinLanguage
|
import org.jetbrains.kotlin.idea.KotlinLanguage
|
||||||
import org.jetbrains.kotlin.idea.core.getPackage
|
import org.jetbrains.kotlin.idea.core.getFqNameWithImplicitPrefix
|
||||||
import org.jetbrains.kotlin.idea.core.packageMatchesDirectory
|
import org.jetbrains.kotlin.idea.core.packageMatchesDirectoryOrImplicit
|
||||||
import org.jetbrains.kotlin.idea.core.quoteIfNeeded
|
import org.jetbrains.kotlin.idea.core.quoteIfNeeded
|
||||||
import org.jetbrains.kotlin.idea.refactoring.hasIdentifiersOnly
|
import org.jetbrains.kotlin.idea.refactoring.hasIdentifiersOnly
|
||||||
import org.jetbrains.kotlin.idea.refactoring.move.ContainerChangeInfo
|
import org.jetbrains.kotlin.idea.refactoring.move.ContainerChangeInfo
|
||||||
import org.jetbrains.kotlin.idea.refactoring.move.ContainerInfo
|
import org.jetbrains.kotlin.idea.refactoring.move.ContainerInfo
|
||||||
import org.jetbrains.kotlin.idea.refactoring.move.moveDeclarations.*
|
import org.jetbrains.kotlin.idea.refactoring.move.moveDeclarations.*
|
||||||
import org.jetbrains.kotlin.idea.refactoring.move.updatePackageDirective
|
import org.jetbrains.kotlin.idea.refactoring.move.updatePackageDirective
|
||||||
import org.jetbrains.kotlin.name.FqNameUnsafe
|
|
||||||
import org.jetbrains.kotlin.psi.KtFile
|
import org.jetbrains.kotlin.psi.KtFile
|
||||||
import org.jetbrains.kotlin.psi.UserDataProperty
|
import org.jetbrains.kotlin.psi.UserDataProperty
|
||||||
|
|
||||||
@@ -44,24 +43,23 @@ class MoveKotlinFileHandler : MoveFileHandler() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private fun KtFile.getPackageNameInfo(newParent: PsiDirectory?, clearUserData: Boolean): ContainerChangeInfo? {
|
private fun KtFile.getPackageNameInfo(newParent: PsiDirectory?, clearUserData: Boolean): ContainerChangeInfo? {
|
||||||
val shouldUpdatePackageDirective = updatePackageDirective ?: packageMatchesDirectory()
|
val shouldUpdatePackageDirective = updatePackageDirective ?: packageMatchesDirectoryOrImplicit()
|
||||||
updatePackageDirective = if (clearUserData) null else shouldUpdatePackageDirective
|
updatePackageDirective = if (clearUserData) null else shouldUpdatePackageDirective
|
||||||
|
|
||||||
if (!shouldUpdatePackageDirective) return null
|
if (!shouldUpdatePackageDirective) return null
|
||||||
|
|
||||||
val oldPackageName = packageFqName
|
val oldPackageName = packageFqName
|
||||||
val newPackage = newParent?.getPackage() ?: return ContainerChangeInfo(
|
val newPackageName = newParent?.getFqNameWithImplicitPrefix() ?: return ContainerChangeInfo(
|
||||||
ContainerInfo.Package(oldPackageName),
|
ContainerInfo.Package(oldPackageName),
|
||||||
ContainerInfo.UnknownPackage
|
ContainerInfo.UnknownPackage
|
||||||
)
|
)
|
||||||
|
|
||||||
val newPackageName = FqNameUnsafe(newPackage.qualifiedName)
|
|
||||||
if (oldPackageName.asString() == newPackageName.asString()
|
if (oldPackageName.asString() == newPackageName.asString()
|
||||||
&& ModuleUtilCore.findModuleForPsiElement(this) == ModuleUtilCore.findModuleForPsiElement(newParent)
|
&& ModuleUtilCore.findModuleForPsiElement(this) == ModuleUtilCore.findModuleForPsiElement(newParent)
|
||||||
) return null
|
) return null
|
||||||
if (!newPackageName.hasIdentifiersOnly()) return null
|
if (!newPackageName.hasIdentifiersOnly()) return null
|
||||||
|
|
||||||
return ContainerChangeInfo(ContainerInfo.Package(oldPackageName), ContainerInfo.Package(newPackageName.toSafe()))
|
return ContainerChangeInfo(ContainerInfo.Package(oldPackageName), ContainerInfo.Package(newPackageName))
|
||||||
}
|
}
|
||||||
|
|
||||||
fun initMoveProcessor(psiFile: PsiFile, newParent: PsiDirectory?, withConflicts: Boolean): MoveKotlinDeclarationsProcessor? {
|
fun initMoveProcessor(psiFile: PsiFile, newParent: PsiDirectory?, withConflicts: Boolean): MoveKotlinDeclarationsProcessor? {
|
||||||
|
|||||||
Vendored
+8
@@ -0,0 +1,8 @@
|
|||||||
|
package implicit.prefix.bar
|
||||||
|
|
||||||
|
val a = 42
|
||||||
|
|
||||||
|
// comment
|
||||||
|
|
||||||
|
// some other comment
|
||||||
|
val s = ""
|
||||||
+8
@@ -0,0 +1,8 @@
|
|||||||
|
package implicit.prefix
|
||||||
|
|
||||||
|
val a = 42
|
||||||
|
|
||||||
|
// comment
|
||||||
|
|
||||||
|
// some other comment
|
||||||
|
val s = ""
|
||||||
+8
@@ -0,0 +1,8 @@
|
|||||||
|
package implicit.prefix
|
||||||
|
|
||||||
|
val a = 42
|
||||||
|
|
||||||
|
// comment
|
||||||
|
|
||||||
|
// some other comment
|
||||||
|
val s = ""
|
||||||
+4
@@ -0,0 +1,4 @@
|
|||||||
|
{
|
||||||
|
"mainFile": "test.kt",
|
||||||
|
"targetPackage": "bar"
|
||||||
|
}
|
||||||
Vendored
+1
@@ -0,0 +1 @@
|
|||||||
|
package implicit.prefix
|
||||||
+5
@@ -0,0 +1,5 @@
|
|||||||
|
package implicit.prefix.target
|
||||||
|
|
||||||
|
interface NamedFaceO
|
||||||
|
|
||||||
|
class NamedClassO : NamedFaceO
|
||||||
+5
@@ -0,0 +1,5 @@
|
|||||||
|
package implicit.prefix.target
|
||||||
|
|
||||||
|
interface NamedFaceN
|
||||||
|
|
||||||
|
class NamedClassN : NamedFaceN
|
||||||
Vendored
+1
@@ -0,0 +1 @@
|
|||||||
|
package implicit.prefix
|
||||||
+5
@@ -0,0 +1,5 @@
|
|||||||
|
package implicit.prefix.source
|
||||||
|
|
||||||
|
interface NamedFaceO
|
||||||
|
|
||||||
|
class NamedClassO : NamedFaceO
|
||||||
+5
@@ -0,0 +1,5 @@
|
|||||||
|
package implicit.prefix.source
|
||||||
|
|
||||||
|
interface NamedFaceN
|
||||||
|
|
||||||
|
class NamedClassN : NamedFaceN
|
||||||
+5
@@ -0,0 +1,5 @@
|
|||||||
|
{
|
||||||
|
"filesToMove": ["source/foo.kt", "source/bar.kt"],
|
||||||
|
"type": "MOVE_FILES_WITH_DECLARATIONS",
|
||||||
|
"targetDirectory": "target"
|
||||||
|
}
|
||||||
+1
-1
@@ -1,3 +1,3 @@
|
|||||||
package code.`in`.comments2
|
package code.`in`.comments.code.`in`.comments2
|
||||||
|
|
||||||
class MyTest
|
class MyTest
|
||||||
@@ -69,6 +69,11 @@ public class CopyTestGenerated extends AbstractCopyTest {
|
|||||||
runTest("idea/testData/refactoring/copy/copyFileFromDefaultPackageToDefaultPackage/copyFIleToDefaultPackage.test");
|
runTest("idea/testData/refactoring/copy/copyFileFromDefaultPackageToDefaultPackage/copyFIleToDefaultPackage.test");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("copyFileFromDefaultPackageWithImpicitPrefix/copyFileFromDefaultPackageWithImplicitPrefix.test")
|
||||||
|
public void testCopyFileFromDefaultPackageWithImpicitPrefix_CopyFileFromDefaultPackageWithImplicitPrefix() throws Exception {
|
||||||
|
runTest("idea/testData/refactoring/copy/copyFileFromDefaultPackageWithImpicitPrefix/copyFileFromDefaultPackageWithImplicitPrefix.test");
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("copyFIleRetainContent/copyFIleRetainContent.test")
|
@TestMetadata("copyFIleRetainContent/copyFIleRetainContent.test")
|
||||||
public void testCopyFIleRetainContent_CopyFIleRetainContent() throws Exception {
|
public void testCopyFIleRetainContent_CopyFIleRetainContent() throws Exception {
|
||||||
runTest("idea/testData/refactoring/copy/copyFIleRetainContent/copyFIleRetainContent.test");
|
runTest("idea/testData/refactoring/copy/copyFIleRetainContent/copyFIleRetainContent.test");
|
||||||
|
|||||||
@@ -289,6 +289,11 @@ public class MoveTestGenerated extends AbstractMoveTest {
|
|||||||
runTest("idea/testData/refactoring/move/kotlin/moveFile/moveMultipleFIles/moveMultipleFiles.test");
|
runTest("idea/testData/refactoring/move/kotlin/moveFile/moveMultipleFIles/moveMultipleFiles.test");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("kotlin/moveFile/moveMultipleFIlesWithImplicitPrefix/moveMultipleFilesWithImplicitPrefix.test")
|
||||||
|
public void testKotlin_moveFile_moveMultipleFIlesWithImplicitPrefix_MoveMultipleFilesWithImplicitPrefix() throws Exception {
|
||||||
|
runTest("idea/testData/refactoring/move/kotlin/moveFile/moveMultipleFIlesWithImplicitPrefix/moveMultipleFilesWithImplicitPrefix.test");
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("kotlin/moveFile/packageWithQuotation/moveFileToPackageWithQuotation.test")
|
@TestMetadata("kotlin/moveFile/packageWithQuotation/moveFileToPackageWithQuotation.test")
|
||||||
public void testKotlin_moveFile_packageWithQuotation_MoveFileToPackageWithQuotation() throws Exception {
|
public void testKotlin_moveFile_packageWithQuotation_MoveFileToPackageWithQuotation() throws Exception {
|
||||||
runTest("idea/testData/refactoring/move/kotlin/moveFile/packageWithQuotation/moveFileToPackageWithQuotation.test");
|
runTest("idea/testData/refactoring/move/kotlin/moveFile/packageWithQuotation/moveFileToPackageWithQuotation.test");
|
||||||
|
|||||||
Reference in New Issue
Block a user