From d096e74c10584a4c2af98697d79bbb89e9b0d89f Mon Sep 17 00:00:00 2001 From: Alexey Sedunov Date: Wed, 29 Apr 2015 11:49:18 +0300 Subject: [PATCH] Move: Implement inspection which reports mismatch between package directive and containing directory --- .../kotlin/psi/psiUtil/jetPsiUtil.kt | 8 +++ .../inspections/IntentionBasedInspection.kt | 36 ++++++----- .../PackageDirectoryMismatch.html | 5 ++ .../after.kt.template | 8 +++ .../before.kt.template | 10 ++++ .../description.html | 6 ++ .../after.kt.template | 10 ++++ .../before.kt.template | 10 ++++ .../description.html | 5 ++ idea/src/META-INF/plugin.xml | 18 ++++++ .../ChangePackageToMatchDirectoryIntention.kt | 40 +++++++++++++ ...FileToPackageMatchingDirectoryIntention.kt | 60 +++++++++++++++++++ .../PackageDirectoryMismatchInspection.kt | 25 ++++++++ .../MoveKotlinFileHandler.kt | 5 +- .../before/foo/barPackageMismatched.kt | 5 ++ .../before/foo/fooPackageMatched.kt | 5 ++ .../expected.xml | 19 ++++++ .../mismatchedProjectAndDirectory.test | 3 + .../after/source/dummy.kt | 0 .../moveToDefaultDirectory/after/test.kt | 7 +++ .../before/source/dummy.kt | 0 .../before/source/test.kt | 7 +++ .../moveToDefaultDirectory.test | 5 ++ .../after/source/dummy.kt | 0 .../after/target/test.kt | 7 +++ .../before/source/dummy.kt | 0 .../before/source/test.kt | 7 +++ .../moveToNonDefaultDirectory.test | 5 ++ .../after/foo/bar/test.kt | 9 +++ .../before/foo/bar/test.kt | 9 +++ .../packageMatchesDirectory.test | 5 ++ .../changeToDefaultPackage/after/test.kt | 5 ++ .../after/usagesWithFqNames.java | 6 ++ .../after/usagesWithFqNames.kt | 4 ++ .../after/usagesWithImports.java | 8 +++ .../after/usagesWithImports.kt | 7 +++ .../changeToDefaultPackage/before/test.kt | 7 +++ .../before/usagesWithFqNames.java | 6 ++ .../before/usagesWithFqNames.kt | 4 ++ .../before/usagesWithImports.java | 9 +++ .../before/usagesWithImports.kt | 7 +++ .../changeToDefaultPackage.test | 5 ++ .../after/target/test.kt | 7 +++ .../after/target/usagesWithFqNames.java | 8 +++ .../after/target/usagesWithFqNames.kt | 6 ++ .../after/target/usagesWithImports.java | 10 ++++ .../after/target/usagesWithImports.kt | 9 +++ .../after/usages/usagesWithFqNames.java | 11 ++++ .../after/usages/usagesWithFqNames.kt | 9 +++ .../after/usages/usagesWithImports.java | 11 ++++ .../after/usages/usagesWithImports.kt | 9 +++ .../before/target/test.kt | 7 +++ .../before/target/usagesWithFqNames.java | 8 +++ .../before/target/usagesWithFqNames.kt | 6 ++ .../before/target/usagesWithImports.java | 11 ++++ .../before/target/usagesWithImports.kt | 9 +++ .../before/usages/usagesWithFqNames.java | 8 +++ .../before/usages/usagesWithFqNames.kt | 6 ++ .../before/usages/usagesWithImports.java | 11 ++++ .../before/usages/usagesWithImports.kt | 9 +++ .../changeToNonDefaultPackage.test | 5 ++ .../after/foo/bar/test.kt | 9 +++ .../before/foo/bar/test.kt | 9 +++ .../packageMatchesDirectory.test | 5 ++ .../JetMultiFileInspectionTestGenerated.java | 6 ++ .../MultiFileIntentionTestGenerated.java | 36 +++++++++++ 66 files changed, 612 insertions(+), 20 deletions(-) create mode 100644 idea/resources/inspectionDescriptions/PackageDirectoryMismatch.html create mode 100644 idea/resources/intentionDescriptions/ChangePackageToMatchDirectoryIntention/after.kt.template create mode 100644 idea/resources/intentionDescriptions/ChangePackageToMatchDirectoryIntention/before.kt.template create mode 100644 idea/resources/intentionDescriptions/ChangePackageToMatchDirectoryIntention/description.html create mode 100644 idea/resources/intentionDescriptions/MoveFileToPackageMatchingDirectoryIntention/after.kt.template create mode 100644 idea/resources/intentionDescriptions/MoveFileToPackageMatchingDirectoryIntention/before.kt.template create mode 100644 idea/resources/intentionDescriptions/MoveFileToPackageMatchingDirectoryIntention/description.html create mode 100644 idea/src/org/jetbrains/kotlin/idea/refactoring/move/changePackage/ChangePackageToMatchDirectoryIntention.kt create mode 100644 idea/src/org/jetbrains/kotlin/idea/refactoring/move/changePackage/MoveFileToPackageMatchingDirectoryIntention.kt create mode 100644 idea/src/org/jetbrains/kotlin/idea/refactoring/move/changePackage/PackageDirectoryMismatchInspection.kt create mode 100644 idea/testData/multiFileInspections/mismatchedProjectAndDirectory/before/foo/barPackageMismatched.kt create mode 100644 idea/testData/multiFileInspections/mismatchedProjectAndDirectory/before/foo/fooPackageMatched.kt create mode 100644 idea/testData/multiFileInspections/mismatchedProjectAndDirectory/expected.xml create mode 100644 idea/testData/multiFileInspections/mismatchedProjectAndDirectory/mismatchedProjectAndDirectory.test create mode 100644 idea/testData/multiFileIntentions/moveFileToPackageMatchingDirectory/moveToDefaultDirectory/after/source/dummy.kt create mode 100644 idea/testData/multiFileIntentions/moveFileToPackageMatchingDirectory/moveToDefaultDirectory/after/test.kt create mode 100644 idea/testData/multiFileIntentions/moveFileToPackageMatchingDirectory/moveToDefaultDirectory/before/source/dummy.kt create mode 100644 idea/testData/multiFileIntentions/moveFileToPackageMatchingDirectory/moveToDefaultDirectory/before/source/test.kt create mode 100644 idea/testData/multiFileIntentions/moveFileToPackageMatchingDirectory/moveToDefaultDirectory/moveToDefaultDirectory.test create mode 100644 idea/testData/multiFileIntentions/moveFileToPackageMatchingDirectory/moveToNonDefaultDirectory/after/source/dummy.kt create mode 100644 idea/testData/multiFileIntentions/moveFileToPackageMatchingDirectory/moveToNonDefaultDirectory/after/target/test.kt create mode 100644 idea/testData/multiFileIntentions/moveFileToPackageMatchingDirectory/moveToNonDefaultDirectory/before/source/dummy.kt create mode 100644 idea/testData/multiFileIntentions/moveFileToPackageMatchingDirectory/moveToNonDefaultDirectory/before/source/test.kt create mode 100644 idea/testData/multiFileIntentions/moveFileToPackageMatchingDirectory/moveToNonDefaultDirectory/moveToNonDefaultDirectory.test create mode 100644 idea/testData/multiFileIntentions/moveFileToPackageMatchingDirectory/packageMatchesDirectory/after/foo/bar/test.kt create mode 100644 idea/testData/multiFileIntentions/moveFileToPackageMatchingDirectory/packageMatchesDirectory/before/foo/bar/test.kt create mode 100644 idea/testData/multiFileIntentions/moveFileToPackageMatchingDirectory/packageMatchesDirectory/packageMatchesDirectory.test create mode 100644 idea/testData/multiFileIntentions/reconcilePackageWithDirectory/changeToDefaultPackage/after/test.kt create mode 100644 idea/testData/multiFileIntentions/reconcilePackageWithDirectory/changeToDefaultPackage/after/usagesWithFqNames.java create mode 100644 idea/testData/multiFileIntentions/reconcilePackageWithDirectory/changeToDefaultPackage/after/usagesWithFqNames.kt create mode 100644 idea/testData/multiFileIntentions/reconcilePackageWithDirectory/changeToDefaultPackage/after/usagesWithImports.java create mode 100644 idea/testData/multiFileIntentions/reconcilePackageWithDirectory/changeToDefaultPackage/after/usagesWithImports.kt create mode 100644 idea/testData/multiFileIntentions/reconcilePackageWithDirectory/changeToDefaultPackage/before/test.kt create mode 100644 idea/testData/multiFileIntentions/reconcilePackageWithDirectory/changeToDefaultPackage/before/usagesWithFqNames.java create mode 100644 idea/testData/multiFileIntentions/reconcilePackageWithDirectory/changeToDefaultPackage/before/usagesWithFqNames.kt create mode 100644 idea/testData/multiFileIntentions/reconcilePackageWithDirectory/changeToDefaultPackage/before/usagesWithImports.java create mode 100644 idea/testData/multiFileIntentions/reconcilePackageWithDirectory/changeToDefaultPackage/before/usagesWithImports.kt create mode 100644 idea/testData/multiFileIntentions/reconcilePackageWithDirectory/changeToDefaultPackage/changeToDefaultPackage.test create mode 100644 idea/testData/multiFileIntentions/reconcilePackageWithDirectory/changeToNonDefaultPackage/after/target/test.kt create mode 100644 idea/testData/multiFileIntentions/reconcilePackageWithDirectory/changeToNonDefaultPackage/after/target/usagesWithFqNames.java create mode 100644 idea/testData/multiFileIntentions/reconcilePackageWithDirectory/changeToNonDefaultPackage/after/target/usagesWithFqNames.kt create mode 100644 idea/testData/multiFileIntentions/reconcilePackageWithDirectory/changeToNonDefaultPackage/after/target/usagesWithImports.java create mode 100644 idea/testData/multiFileIntentions/reconcilePackageWithDirectory/changeToNonDefaultPackage/after/target/usagesWithImports.kt create mode 100644 idea/testData/multiFileIntentions/reconcilePackageWithDirectory/changeToNonDefaultPackage/after/usages/usagesWithFqNames.java create mode 100644 idea/testData/multiFileIntentions/reconcilePackageWithDirectory/changeToNonDefaultPackage/after/usages/usagesWithFqNames.kt create mode 100644 idea/testData/multiFileIntentions/reconcilePackageWithDirectory/changeToNonDefaultPackage/after/usages/usagesWithImports.java create mode 100644 idea/testData/multiFileIntentions/reconcilePackageWithDirectory/changeToNonDefaultPackage/after/usages/usagesWithImports.kt create mode 100644 idea/testData/multiFileIntentions/reconcilePackageWithDirectory/changeToNonDefaultPackage/before/target/test.kt create mode 100644 idea/testData/multiFileIntentions/reconcilePackageWithDirectory/changeToNonDefaultPackage/before/target/usagesWithFqNames.java create mode 100644 idea/testData/multiFileIntentions/reconcilePackageWithDirectory/changeToNonDefaultPackage/before/target/usagesWithFqNames.kt create mode 100644 idea/testData/multiFileIntentions/reconcilePackageWithDirectory/changeToNonDefaultPackage/before/target/usagesWithImports.java create mode 100644 idea/testData/multiFileIntentions/reconcilePackageWithDirectory/changeToNonDefaultPackage/before/target/usagesWithImports.kt create mode 100644 idea/testData/multiFileIntentions/reconcilePackageWithDirectory/changeToNonDefaultPackage/before/usages/usagesWithFqNames.java create mode 100644 idea/testData/multiFileIntentions/reconcilePackageWithDirectory/changeToNonDefaultPackage/before/usages/usagesWithFqNames.kt create mode 100644 idea/testData/multiFileIntentions/reconcilePackageWithDirectory/changeToNonDefaultPackage/before/usages/usagesWithImports.java create mode 100644 idea/testData/multiFileIntentions/reconcilePackageWithDirectory/changeToNonDefaultPackage/before/usages/usagesWithImports.kt create mode 100644 idea/testData/multiFileIntentions/reconcilePackageWithDirectory/changeToNonDefaultPackage/changeToNonDefaultPackage.test create mode 100644 idea/testData/multiFileIntentions/reconcilePackageWithDirectory/packageMatchesDirectory/after/foo/bar/test.kt create mode 100644 idea/testData/multiFileIntentions/reconcilePackageWithDirectory/packageMatchesDirectory/before/foo/bar/test.kt create mode 100644 idea/testData/multiFileIntentions/reconcilePackageWithDirectory/packageMatchesDirectory/packageMatchesDirectory.test diff --git a/compiler/frontend/src/org/jetbrains/kotlin/psi/psiUtil/jetPsiUtil.kt b/compiler/frontend/src/org/jetbrains/kotlin/psi/psiUtil/jetPsiUtil.kt index 212c4c150d1..dad9e820c65 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/psi/psiUtil/jetPsiUtil.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/psi/psiUtil/jetPsiUtil.kt @@ -41,6 +41,7 @@ import com.intellij.psi.PsiWhiteSpace import com.intellij.psi.PsiComment import org.jetbrains.kotlin.resolve.calls.CallTransformer.CallForImplicitInvoke import com.intellij.openapi.util.TextRange +import org.jetbrains.kotlin.name.FqName public fun JetCallElement.getCallNameExpression(): JetSimpleNameExpression? { val calleeExpression = getCalleeExpression() @@ -534,3 +535,10 @@ inline fun flatMapDescendantsOfTypeVisitor( inline fun PsiElement.forEachDescendantsOfType(noinline block: (T) -> Unit) = accept(forEachDescendantOfTypeVisitor(block)) + +public fun PsiFile.getFqNameByDirectory(): FqName { + val qualifiedNameByDirectory = getParent()?.getPackage()?.getQualifiedName() + return qualifiedNameByDirectory?.let { FqName(it) } ?: FqName.ROOT +} + +public fun JetFile.packageMatchesDirectory(): Boolean = getPackageFqName() == getFqNameByDirectory() \ No newline at end of file diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/inspections/IntentionBasedInspection.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/inspections/IntentionBasedInspection.kt index e74c68e606a..2aa8f95d83a 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/inspections/IntentionBasedInspection.kt +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/inspections/IntentionBasedInspection.kt @@ -25,38 +25,42 @@ import com.intellij.psi.PsiElement import com.intellij.psi.PsiElementVisitor import org.jetbrains.kotlin.idea.intentions.JetSelfTargetingOffsetIndependentIntention import org.jetbrains.kotlin.psi.JetElement +import java.util.* public abstract class IntentionBasedInspection( - protected val intention: JetSelfTargetingOffsetIndependentIntention + protected val intentions: List>, + protected val elementType: Class ) : AbstractKotlinInspection() { + constructor(intention: JetSelfTargetingOffsetIndependentIntention): this(listOf(intention), intention.elementType) + override fun buildVisitor(holder: ProblemsHolder, isOnTheFly: Boolean, session: LocalInspectionToolSession): PsiElementVisitor { return object: PsiElementVisitor() { override fun visitElement(element: PsiElement) { - if (!intention.elementType.isInstance(element)) return + if (!elementType.isInstance(element) || element.getTextLength() == 0) return [suppress("UNCHECKED_CAST")] val targetElement = element as T - if (!intention.isApplicableTo(targetElement)) return + for (intention in intentions) { + if (!intention.isApplicableTo(targetElement)) continue - val fix = object: LocalQuickFix { - override fun getFamilyName(): String { - return getName() - } + val fix = object: LocalQuickFix { + private val text = intention.getText() - override fun getName(): String { - return intention.getText() - } + override fun getFamilyName() = getName() - override fun applyFix(project: Project, descriptor: ProblemDescriptor) { - targetElement.getOrCreateEditor()?.let { editor -> - editor.getCaretModel().moveToOffset(targetElement.getTextOffset()) - intention.applyTo(targetElement, editor) + override fun getName() = text + + override fun applyFix(project: Project, descriptor: ProblemDescriptor) { + targetElement.getOrCreateEditor()?.let { editor -> + editor.getCaretModel().moveToOffset(targetElement.getTextOffset()) + intention.applyTo(targetElement, editor) + } } } - } - holder.registerProblem(targetElement, intention.getText(), problemHighlightType, fix) + holder.registerProblem(targetElement, intention.getText(), problemHighlightType, fix) + } } } } diff --git a/idea/resources/inspectionDescriptions/PackageDirectoryMismatch.html b/idea/resources/inspectionDescriptions/PackageDirectoryMismatch.html new file mode 100644 index 00000000000..1b7814e8236 --- /dev/null +++ b/idea/resources/inspectionDescriptions/PackageDirectoryMismatch.html @@ -0,0 +1,5 @@ + + +Reports file's package directive not matching location of the file + + diff --git a/idea/resources/intentionDescriptions/ChangePackageToMatchDirectoryIntention/after.kt.template b/idea/resources/intentionDescriptions/ChangePackageToMatchDirectoryIntention/after.kt.template new file mode 100644 index 00000000000..977183ecda7 --- /dev/null +++ b/idea/resources/intentionDescriptions/ChangePackageToMatchDirectoryIntention/after.kt.template @@ -0,0 +1,8 @@ +// File: bar/foo/test.kt +package bar.foo + +class MyClass: OtherClass { + fun myFun() { + + } +} \ No newline at end of file diff --git a/idea/resources/intentionDescriptions/ChangePackageToMatchDirectoryIntention/before.kt.template b/idea/resources/intentionDescriptions/ChangePackageToMatchDirectoryIntention/before.kt.template new file mode 100644 index 00000000000..90bb6b33e0c --- /dev/null +++ b/idea/resources/intentionDescriptions/ChangePackageToMatchDirectoryIntention/before.kt.template @@ -0,0 +1,10 @@ +// File: bar/foo/test.kt +package foo.bar + +import bar.foo.OtherClass + +class MyClass: OtherClass { + fun myFun() { + + } +} \ No newline at end of file diff --git a/idea/resources/intentionDescriptions/ChangePackageToMatchDirectoryIntention/description.html b/idea/resources/intentionDescriptions/ChangePackageToMatchDirectoryIntention/description.html new file mode 100644 index 00000000000..78d5e42bf56 --- /dev/null +++ b/idea/resources/intentionDescriptions/ChangePackageToMatchDirectoryIntention/description.html @@ -0,0 +1,6 @@ + + +This intention changes file's package directive so that it matches containing directory. +All import directives and usages are updated accordingly + + \ No newline at end of file diff --git a/idea/resources/intentionDescriptions/MoveFileToPackageMatchingDirectoryIntention/after.kt.template b/idea/resources/intentionDescriptions/MoveFileToPackageMatchingDirectoryIntention/after.kt.template new file mode 100644 index 00000000000..2124a2b6170 --- /dev/null +++ b/idea/resources/intentionDescriptions/MoveFileToPackageMatchingDirectoryIntention/after.kt.template @@ -0,0 +1,10 @@ +// File: foo/bar/test.kt +package foo.bar + +import bar.foo.OtherClass + +class MyClass: OtherClass { + fun myFun() { + + } +} \ No newline at end of file diff --git a/idea/resources/intentionDescriptions/MoveFileToPackageMatchingDirectoryIntention/before.kt.template b/idea/resources/intentionDescriptions/MoveFileToPackageMatchingDirectoryIntention/before.kt.template new file mode 100644 index 00000000000..90bb6b33e0c --- /dev/null +++ b/idea/resources/intentionDescriptions/MoveFileToPackageMatchingDirectoryIntention/before.kt.template @@ -0,0 +1,10 @@ +// File: bar/foo/test.kt +package foo.bar + +import bar.foo.OtherClass + +class MyClass: OtherClass { + fun myFun() { + + } +} \ No newline at end of file diff --git a/idea/resources/intentionDescriptions/MoveFileToPackageMatchingDirectoryIntention/description.html b/idea/resources/intentionDescriptions/MoveFileToPackageMatchingDirectoryIntention/description.html new file mode 100644 index 00000000000..afc744eb5df --- /dev/null +++ b/idea/resources/intentionDescriptions/MoveFileToPackageMatchingDirectoryIntention/description.html @@ -0,0 +1,5 @@ + + +This intention moves file to the directory matching its package directive. + + \ No newline at end of file diff --git a/idea/src/META-INF/plugin.xml b/idea/src/META-INF/plugin.xml index 24612b1996a..2814ef771b5 100644 --- a/idea/src/META-INF/plugin.xml +++ b/idea/src/META-INF/plugin.xml @@ -853,6 +853,16 @@ Kotlin + + org.jetbrains.kotlin.idea.refactoring.move.changePackage.MoveFileToPackageMatchingDirectoryIntention + Kotlin + + + + org.jetbrains.kotlin.idea.refactoring.move.changePackage.ChangePackageToMatchDirectoryIntention + Kotlin + + + + + diff --git a/idea/src/org/jetbrains/kotlin/idea/refactoring/move/changePackage/ChangePackageToMatchDirectoryIntention.kt b/idea/src/org/jetbrains/kotlin/idea/refactoring/move/changePackage/ChangePackageToMatchDirectoryIntention.kt new file mode 100644 index 00000000000..d9121411a55 --- /dev/null +++ b/idea/src/org/jetbrains/kotlin/idea/refactoring/move/changePackage/ChangePackageToMatchDirectoryIntention.kt @@ -0,0 +1,40 @@ +/* + * Copyright 2010-2015 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.jetbrains.kotlin.idea.refactoring.move.changePackage + +import com.intellij.openapi.editor.Editor +import org.jetbrains.kotlin.idea.core.refactoring.canRefactor +import org.jetbrains.kotlin.idea.intentions.JetSelfTargetingOffsetIndependentIntention +import org.jetbrains.kotlin.psi.JetPackageDirective +import org.jetbrains.kotlin.psi.psiUtil.getFqNameByDirectory +import org.jetbrains.kotlin.psi.psiUtil.packageMatchesDirectory + +public class ChangePackageToMatchDirectoryIntention : JetSelfTargetingOffsetIndependentIntention( + javaClass(), "", "Change file's package to match directory" +) { + override fun isApplicableTo(element: JetPackageDirective): Boolean { + val file = element.getContainingJetFile() + if (file.packageMatchesDirectory()) return false + + setText("Change file's package to '${file.getFqNameByDirectory().asString()}'") + return true + } + + override fun applyTo(element: JetPackageDirective, editor: Editor) { + KotlinChangePackageRefactoring(element.getContainingJetFile()).run(element.getContainingFile().getFqNameByDirectory()) + } +} \ No newline at end of file diff --git a/idea/src/org/jetbrains/kotlin/idea/refactoring/move/changePackage/MoveFileToPackageMatchingDirectoryIntention.kt b/idea/src/org/jetbrains/kotlin/idea/refactoring/move/changePackage/MoveFileToPackageMatchingDirectoryIntention.kt new file mode 100644 index 00000000000..e78da31e135 --- /dev/null +++ b/idea/src/org/jetbrains/kotlin/idea/refactoring/move/changePackage/MoveFileToPackageMatchingDirectoryIntention.kt @@ -0,0 +1,60 @@ +/* + * Copyright 2010-2015 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.jetbrains.kotlin.idea.refactoring.move.changePackage + +import com.intellij.CommonBundle +import com.intellij.openapi.editor.Editor +import com.intellij.openapi.ui.Messages +import com.intellij.psi.JavaPsiFacade +import com.intellij.refactoring.RefactoringBundle +import com.intellij.refactoring.move.moveClassesOrPackages.MoveClassesOrPackagesUtil +import com.intellij.refactoring.move.moveFilesOrDirectories.MoveFilesOrDirectoriesUtil +import com.intellij.refactoring.util.RefactoringMessageUtil +import org.jetbrains.kotlin.idea.core.refactoring.canRefactor +import org.jetbrains.kotlin.idea.intentions.JetSelfTargetingOffsetIndependentIntention +import org.jetbrains.kotlin.psi.JetPackageDirective +import org.jetbrains.kotlin.psi.psiUtil.packageMatchesDirectory + +public class MoveFileToPackageMatchingDirectoryIntention : JetSelfTargetingOffsetIndependentIntention( + javaClass(), "", "Move file to package-matching directory" +) { + override fun isApplicableTo(element: JetPackageDirective): Boolean { + if (element.getContainingJetFile().packageMatchesDirectory()) return false + + val qualifiedName = element.getQualifiedName() + val dirName = if (qualifiedName.isEmpty()) "source root" else "'${qualifiedName.replace('.', '/')}'" + setText("Move file to $dirName") + return true + } + + override fun applyTo(element: JetPackageDirective, editor: Editor) { + val file = element.getContainingJetFile() + val project = file.getProject() + val targetDirectory = MoveClassesOrPackagesUtil.chooseDestinationPackage( + project, + element.getQualifiedName(), + file.getContainingDirectory() + ) ?: return + + RefactoringMessageUtil.checkCanCreateFile(targetDirectory, file.getName())?.let { + Messages.showMessageDialog(project, it, CommonBundle.getErrorTitle(), Messages.getErrorIcon()) + return + } + + MoveFilesOrDirectoriesUtil.doMoveFile(file, targetDirectory) + } +} \ No newline at end of file diff --git a/idea/src/org/jetbrains/kotlin/idea/refactoring/move/changePackage/PackageDirectoryMismatchInspection.kt b/idea/src/org/jetbrains/kotlin/idea/refactoring/move/changePackage/PackageDirectoryMismatchInspection.kt new file mode 100644 index 00000000000..9567a8cd137 --- /dev/null +++ b/idea/src/org/jetbrains/kotlin/idea/refactoring/move/changePackage/PackageDirectoryMismatchInspection.kt @@ -0,0 +1,25 @@ +/* + * Copyright 2010-2015 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.jetbrains.kotlin.idea.refactoring.move.changePackage + +import org.jetbrains.kotlin.idea.inspections.IntentionBasedInspection +import org.jetbrains.kotlin.psi.JetPackageDirective + +public class PackageDirectoryMismatchInspection: IntentionBasedInspection( + listOf(MoveFileToPackageMatchingDirectoryIntention(), ChangePackageToMatchDirectoryIntention()), + javaClass() +) \ No newline at end of file diff --git a/idea/src/org/jetbrains/kotlin/idea/refactoring/move/moveFilesOrDirectories/MoveKotlinFileHandler.kt b/idea/src/org/jetbrains/kotlin/idea/refactoring/move/moveFilesOrDirectories/MoveKotlinFileHandler.kt index c658a644512..173f5bb0222 100644 --- a/idea/src/org/jetbrains/kotlin/idea/refactoring/move/moveFilesOrDirectories/MoveKotlinFileHandler.kt +++ b/idea/src/org/jetbrains/kotlin/idea/refactoring/move/moveFilesOrDirectories/MoveKotlinFileHandler.kt @@ -36,6 +36,7 @@ import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.psi.JetFile import org.jetbrains.kotlin.psi.JetNamedDeclaration import org.jetbrains.kotlin.psi.psiUtil.getPackage +import org.jetbrains.kotlin.psi.psiUtil.packageMatchesDirectory public class MoveKotlinFileHandler : MoveFileHandler() { private var packageNameInfo: PackageNameInfo? = null @@ -46,10 +47,6 @@ public class MoveKotlinFileHandler : MoveFileHandler() { declarationMoveProcessor = null } - private fun JetFile.packageMatchesDirectory(): Boolean { - return getPackageFqName().asString() == getParent()?.getPackage()?.getQualifiedName() - } - override fun canProcessElement(element: PsiFile?): Boolean { if (element is PsiCompiledElement || element !is JetFile) return false return !JavaProjectRootsUtil.isOutsideJavaSourceRoot(element) diff --git a/idea/testData/multiFileInspections/mismatchedProjectAndDirectory/before/foo/barPackageMismatched.kt b/idea/testData/multiFileInspections/mismatchedProjectAndDirectory/before/foo/barPackageMismatched.kt new file mode 100644 index 00000000000..a3e54018c09 --- /dev/null +++ b/idea/testData/multiFileInspections/mismatchedProjectAndDirectory/before/foo/barPackageMismatched.kt @@ -0,0 +1,5 @@ +package bar + +class Foo { + +} \ No newline at end of file diff --git a/idea/testData/multiFileInspections/mismatchedProjectAndDirectory/before/foo/fooPackageMatched.kt b/idea/testData/multiFileInspections/mismatchedProjectAndDirectory/before/foo/fooPackageMatched.kt new file mode 100644 index 00000000000..832f7954b74 --- /dev/null +++ b/idea/testData/multiFileInspections/mismatchedProjectAndDirectory/before/foo/fooPackageMatched.kt @@ -0,0 +1,5 @@ +package foo + +class Foo { + +} \ No newline at end of file diff --git a/idea/testData/multiFileInspections/mismatchedProjectAndDirectory/expected.xml b/idea/testData/multiFileInspections/mismatchedProjectAndDirectory/expected.xml new file mode 100644 index 00000000000..0d2e90f1bad --- /dev/null +++ b/idea/testData/multiFileInspections/mismatchedProjectAndDirectory/expected.xml @@ -0,0 +1,19 @@ + + + barPackageMismatched.kt + 1 + testPackageDirectoryMismatch_PackageDirectoryMismatch_0 + + Package name does not match containing directory + Move file to 'bar' + + + + barPackageMismatched.kt + 1 + testPackageDirectoryMismatch_PackageDirectoryMismatch_0 + + Package name does not match containing directory + Change file's package to 'foo' + + \ No newline at end of file diff --git a/idea/testData/multiFileInspections/mismatchedProjectAndDirectory/mismatchedProjectAndDirectory.test b/idea/testData/multiFileInspections/mismatchedProjectAndDirectory/mismatchedProjectAndDirectory.test new file mode 100644 index 00000000000..3ac2faa69dc --- /dev/null +++ b/idea/testData/multiFileInspections/mismatchedProjectAndDirectory/mismatchedProjectAndDirectory.test @@ -0,0 +1,3 @@ +{ + "inspectionClass": "org.jetbrains.kotlin.idea.refactoring.move.changePackage.PackageDirectoryMismatchInspection" +} \ No newline at end of file diff --git a/idea/testData/multiFileIntentions/moveFileToPackageMatchingDirectory/moveToDefaultDirectory/after/source/dummy.kt b/idea/testData/multiFileIntentions/moveFileToPackageMatchingDirectory/moveToDefaultDirectory/after/source/dummy.kt new file mode 100644 index 00000000000..e69de29bb2d diff --git a/idea/testData/multiFileIntentions/moveFileToPackageMatchingDirectory/moveToDefaultDirectory/after/test.kt b/idea/testData/multiFileIntentions/moveFileToPackageMatchingDirectory/moveToDefaultDirectory/after/test.kt new file mode 100644 index 00000000000..fc74dec1f81 --- /dev/null +++ b/idea/testData/multiFileIntentions/moveFileToPackageMatchingDirectory/moveToDefaultDirectory/after/test.kt @@ -0,0 +1,7 @@ +package + +class Foo + +fun foo() { + +} \ No newline at end of file diff --git a/idea/testData/multiFileIntentions/moveFileToPackageMatchingDirectory/moveToDefaultDirectory/before/source/dummy.kt b/idea/testData/multiFileIntentions/moveFileToPackageMatchingDirectory/moveToDefaultDirectory/before/source/dummy.kt new file mode 100644 index 00000000000..e69de29bb2d diff --git a/idea/testData/multiFileIntentions/moveFileToPackageMatchingDirectory/moveToDefaultDirectory/before/source/test.kt b/idea/testData/multiFileIntentions/moveFileToPackageMatchingDirectory/moveToDefaultDirectory/before/source/test.kt new file mode 100644 index 00000000000..061c23d4f1e --- /dev/null +++ b/idea/testData/multiFileIntentions/moveFileToPackageMatchingDirectory/moveToDefaultDirectory/before/source/test.kt @@ -0,0 +1,7 @@ +package + +class Foo + +fun foo() { + +} \ No newline at end of file diff --git a/idea/testData/multiFileIntentions/moveFileToPackageMatchingDirectory/moveToDefaultDirectory/moveToDefaultDirectory.test b/idea/testData/multiFileIntentions/moveFileToPackageMatchingDirectory/moveToDefaultDirectory/moveToDefaultDirectory.test new file mode 100644 index 00000000000..ded29b6f6b5 --- /dev/null +++ b/idea/testData/multiFileIntentions/moveFileToPackageMatchingDirectory/moveToDefaultDirectory/moveToDefaultDirectory.test @@ -0,0 +1,5 @@ +{ + "mainFile": "source/test.kt", + "intentionClass": "org.jetbrains.kotlin.idea.refactoring.move.changePackage.MoveFileToPackageMatchingDirectoryIntention", + "intentionText": "Move file to source root" +} \ No newline at end of file diff --git a/idea/testData/multiFileIntentions/moveFileToPackageMatchingDirectory/moveToNonDefaultDirectory/after/source/dummy.kt b/idea/testData/multiFileIntentions/moveFileToPackageMatchingDirectory/moveToNonDefaultDirectory/after/source/dummy.kt new file mode 100644 index 00000000000..e69de29bb2d diff --git a/idea/testData/multiFileIntentions/moveFileToPackageMatchingDirectory/moveToNonDefaultDirectory/after/target/test.kt b/idea/testData/multiFileIntentions/moveFileToPackageMatchingDirectory/moveToNonDefaultDirectory/after/target/test.kt new file mode 100644 index 00000000000..0c71841bbb9 --- /dev/null +++ b/idea/testData/multiFileIntentions/moveFileToPackageMatchingDirectory/moveToNonDefaultDirectory/after/target/test.kt @@ -0,0 +1,7 @@ +package target + +class Foo + +fun foo() { + +} \ No newline at end of file diff --git a/idea/testData/multiFileIntentions/moveFileToPackageMatchingDirectory/moveToNonDefaultDirectory/before/source/dummy.kt b/idea/testData/multiFileIntentions/moveFileToPackageMatchingDirectory/moveToNonDefaultDirectory/before/source/dummy.kt new file mode 100644 index 00000000000..e69de29bb2d diff --git a/idea/testData/multiFileIntentions/moveFileToPackageMatchingDirectory/moveToNonDefaultDirectory/before/source/test.kt b/idea/testData/multiFileIntentions/moveFileToPackageMatchingDirectory/moveToNonDefaultDirectory/before/source/test.kt new file mode 100644 index 00000000000..e1dd5d9fa4d --- /dev/null +++ b/idea/testData/multiFileIntentions/moveFileToPackageMatchingDirectory/moveToNonDefaultDirectory/before/source/test.kt @@ -0,0 +1,7 @@ +package target + +class Foo + +fun foo() { + +} \ No newline at end of file diff --git a/idea/testData/multiFileIntentions/moveFileToPackageMatchingDirectory/moveToNonDefaultDirectory/moveToNonDefaultDirectory.test b/idea/testData/multiFileIntentions/moveFileToPackageMatchingDirectory/moveToNonDefaultDirectory/moveToNonDefaultDirectory.test new file mode 100644 index 00000000000..0e3b7c49114 --- /dev/null +++ b/idea/testData/multiFileIntentions/moveFileToPackageMatchingDirectory/moveToNonDefaultDirectory/moveToNonDefaultDirectory.test @@ -0,0 +1,5 @@ +{ + "mainFile": "source/test.kt", + "intentionClass": "org.jetbrains.kotlin.idea.refactoring.move.changePackage.MoveFileToPackageMatchingDirectoryIntention", + "intentionText": "Move file to 'target'" +} \ No newline at end of file diff --git a/idea/testData/multiFileIntentions/moveFileToPackageMatchingDirectory/packageMatchesDirectory/after/foo/bar/test.kt b/idea/testData/multiFileIntentions/moveFileToPackageMatchingDirectory/packageMatchesDirectory/after/foo/bar/test.kt new file mode 100644 index 00000000000..7b2b7920dd6 --- /dev/null +++ b/idea/testData/multiFileIntentions/moveFileToPackageMatchingDirectory/packageMatchesDirectory/after/foo/bar/test.kt @@ -0,0 +1,9 @@ +package foo.bar + +class Foo { + +} + +fun foo() { + +} \ No newline at end of file diff --git a/idea/testData/multiFileIntentions/moveFileToPackageMatchingDirectory/packageMatchesDirectory/before/foo/bar/test.kt b/idea/testData/multiFileIntentions/moveFileToPackageMatchingDirectory/packageMatchesDirectory/before/foo/bar/test.kt new file mode 100644 index 00000000000..64c42f2cf3e --- /dev/null +++ b/idea/testData/multiFileIntentions/moveFileToPackageMatchingDirectory/packageMatchesDirectory/before/foo/bar/test.kt @@ -0,0 +1,9 @@ +package foo.bar + +class Foo { + +} + +fun foo() { + +} \ No newline at end of file diff --git a/idea/testData/multiFileIntentions/moveFileToPackageMatchingDirectory/packageMatchesDirectory/packageMatchesDirectory.test b/idea/testData/multiFileIntentions/moveFileToPackageMatchingDirectory/packageMatchesDirectory/packageMatchesDirectory.test new file mode 100644 index 00000000000..5723dfed032 --- /dev/null +++ b/idea/testData/multiFileIntentions/moveFileToPackageMatchingDirectory/packageMatchesDirectory/packageMatchesDirectory.test @@ -0,0 +1,5 @@ +{ + "intentionClass": "org.jetbrains.kotlin.idea.refactoring.move.changePackage.MoveFileToPackageMatchingDirectoryIntention", + "isApplicable": "false", + "mainFile": "foo/bar/test.kt" +} \ No newline at end of file diff --git a/idea/testData/multiFileIntentions/reconcilePackageWithDirectory/changeToDefaultPackage/after/test.kt b/idea/testData/multiFileIntentions/reconcilePackageWithDirectory/changeToDefaultPackage/after/test.kt new file mode 100644 index 00000000000..57850e7213b --- /dev/null +++ b/idea/testData/multiFileIntentions/reconcilePackageWithDirectory/changeToDefaultPackage/after/test.kt @@ -0,0 +1,5 @@ +class Foo + +fun foo() { + +} \ No newline at end of file diff --git a/idea/testData/multiFileIntentions/reconcilePackageWithDirectory/changeToDefaultPackage/after/usagesWithFqNames.java b/idea/testData/multiFileIntentions/reconcilePackageWithDirectory/changeToDefaultPackage/after/usagesWithFqNames.java new file mode 100644 index 00000000000..4eed85888e6 --- /dev/null +++ b/idea/testData/multiFileIntentions/reconcilePackageWithDirectory/changeToDefaultPackage/after/usagesWithFqNames.java @@ -0,0 +1,6 @@ +class Test { + static void test() { + new Foo(); + _DefaultPackage.foo(); + } +} \ No newline at end of file diff --git a/idea/testData/multiFileIntentions/reconcilePackageWithDirectory/changeToDefaultPackage/after/usagesWithFqNames.kt b/idea/testData/multiFileIntentions/reconcilePackageWithDirectory/changeToDefaultPackage/after/usagesWithFqNames.kt new file mode 100644 index 00000000000..bf2b7529d08 --- /dev/null +++ b/idea/testData/multiFileIntentions/reconcilePackageWithDirectory/changeToDefaultPackage/after/usagesWithFqNames.kt @@ -0,0 +1,4 @@ +fun test() { + Foo() + foo() +} \ No newline at end of file diff --git a/idea/testData/multiFileIntentions/reconcilePackageWithDirectory/changeToDefaultPackage/after/usagesWithImports.java b/idea/testData/multiFileIntentions/reconcilePackageWithDirectory/changeToDefaultPackage/after/usagesWithImports.java new file mode 100644 index 00000000000..852ffc06cc5 --- /dev/null +++ b/idea/testData/multiFileIntentions/reconcilePackageWithDirectory/changeToDefaultPackage/after/usagesWithImports.java @@ -0,0 +1,8 @@ +import static _DefaultPackage.foo; + +class Test { + static void test() { + new Foo(); + foo(); + } +} \ No newline at end of file diff --git a/idea/testData/multiFileIntentions/reconcilePackageWithDirectory/changeToDefaultPackage/after/usagesWithImports.kt b/idea/testData/multiFileIntentions/reconcilePackageWithDirectory/changeToDefaultPackage/after/usagesWithImports.kt new file mode 100644 index 00000000000..b79e12ef3cb --- /dev/null +++ b/idea/testData/multiFileIntentions/reconcilePackageWithDirectory/changeToDefaultPackage/after/usagesWithImports.kt @@ -0,0 +1,7 @@ +import Foo +import foo + +fun test() { + Foo() + foo() +} \ No newline at end of file diff --git a/idea/testData/multiFileIntentions/reconcilePackageWithDirectory/changeToDefaultPackage/before/test.kt b/idea/testData/multiFileIntentions/reconcilePackageWithDirectory/changeToDefaultPackage/before/test.kt new file mode 100644 index 00000000000..1f9b875232e --- /dev/null +++ b/idea/testData/multiFileIntentions/reconcilePackageWithDirectory/changeToDefaultPackage/before/test.kt @@ -0,0 +1,7 @@ +package source + +class Foo + +fun foo() { + +} \ No newline at end of file diff --git a/idea/testData/multiFileIntentions/reconcilePackageWithDirectory/changeToDefaultPackage/before/usagesWithFqNames.java b/idea/testData/multiFileIntentions/reconcilePackageWithDirectory/changeToDefaultPackage/before/usagesWithFqNames.java new file mode 100644 index 00000000000..3e30c6c2267 --- /dev/null +++ b/idea/testData/multiFileIntentions/reconcilePackageWithDirectory/changeToDefaultPackage/before/usagesWithFqNames.java @@ -0,0 +1,6 @@ +class Test { + static void test() { + new source.Foo(); + source.SourcePackage.foo(); + } +} \ No newline at end of file diff --git a/idea/testData/multiFileIntentions/reconcilePackageWithDirectory/changeToDefaultPackage/before/usagesWithFqNames.kt b/idea/testData/multiFileIntentions/reconcilePackageWithDirectory/changeToDefaultPackage/before/usagesWithFqNames.kt new file mode 100644 index 00000000000..245db339714 --- /dev/null +++ b/idea/testData/multiFileIntentions/reconcilePackageWithDirectory/changeToDefaultPackage/before/usagesWithFqNames.kt @@ -0,0 +1,4 @@ +fun test() { + source.Foo() + source.foo() +} \ No newline at end of file diff --git a/idea/testData/multiFileIntentions/reconcilePackageWithDirectory/changeToDefaultPackage/before/usagesWithImports.java b/idea/testData/multiFileIntentions/reconcilePackageWithDirectory/changeToDefaultPackage/before/usagesWithImports.java new file mode 100644 index 00000000000..e1ff38b1908 --- /dev/null +++ b/idea/testData/multiFileIntentions/reconcilePackageWithDirectory/changeToDefaultPackage/before/usagesWithImports.java @@ -0,0 +1,9 @@ +import source.Foo; +import static source.SourcePackage.foo; + +class Test { + static void test() { + new Foo(); + foo(); + } +} \ No newline at end of file diff --git a/idea/testData/multiFileIntentions/reconcilePackageWithDirectory/changeToDefaultPackage/before/usagesWithImports.kt b/idea/testData/multiFileIntentions/reconcilePackageWithDirectory/changeToDefaultPackage/before/usagesWithImports.kt new file mode 100644 index 00000000000..f1d046d8c9c --- /dev/null +++ b/idea/testData/multiFileIntentions/reconcilePackageWithDirectory/changeToDefaultPackage/before/usagesWithImports.kt @@ -0,0 +1,7 @@ +import source.Foo +import source.foo + +fun test() { + Foo() + foo() +} \ No newline at end of file diff --git a/idea/testData/multiFileIntentions/reconcilePackageWithDirectory/changeToDefaultPackage/changeToDefaultPackage.test b/idea/testData/multiFileIntentions/reconcilePackageWithDirectory/changeToDefaultPackage/changeToDefaultPackage.test new file mode 100644 index 00000000000..3f56d977d64 --- /dev/null +++ b/idea/testData/multiFileIntentions/reconcilePackageWithDirectory/changeToDefaultPackage/changeToDefaultPackage.test @@ -0,0 +1,5 @@ +{ + "mainFile": "test.kt", + "intentionClass": "org.jetbrains.kotlin.idea.refactoring.move.changePackage.ChangePackageToMatchDirectoryIntention", + "intentionText": "Change file's package to ''" +} \ No newline at end of file diff --git a/idea/testData/multiFileIntentions/reconcilePackageWithDirectory/changeToNonDefaultPackage/after/target/test.kt b/idea/testData/multiFileIntentions/reconcilePackageWithDirectory/changeToNonDefaultPackage/after/target/test.kt new file mode 100644 index 00000000000..0c71841bbb9 --- /dev/null +++ b/idea/testData/multiFileIntentions/reconcilePackageWithDirectory/changeToNonDefaultPackage/after/target/test.kt @@ -0,0 +1,7 @@ +package target + +class Foo + +fun foo() { + +} \ No newline at end of file diff --git a/idea/testData/multiFileIntentions/reconcilePackageWithDirectory/changeToNonDefaultPackage/after/target/usagesWithFqNames.java b/idea/testData/multiFileIntentions/reconcilePackageWithDirectory/changeToNonDefaultPackage/after/target/usagesWithFqNames.java new file mode 100644 index 00000000000..42a5fe007f3 --- /dev/null +++ b/idea/testData/multiFileIntentions/reconcilePackageWithDirectory/changeToNonDefaultPackage/after/target/usagesWithFqNames.java @@ -0,0 +1,8 @@ +package target; + +class Test { + static void test() { + new Foo(); + TargetPackage.foo(); + } +} \ No newline at end of file diff --git a/idea/testData/multiFileIntentions/reconcilePackageWithDirectory/changeToNonDefaultPackage/after/target/usagesWithFqNames.kt b/idea/testData/multiFileIntentions/reconcilePackageWithDirectory/changeToNonDefaultPackage/after/target/usagesWithFqNames.kt new file mode 100644 index 00000000000..a14e5ef3203 --- /dev/null +++ b/idea/testData/multiFileIntentions/reconcilePackageWithDirectory/changeToNonDefaultPackage/after/target/usagesWithFqNames.kt @@ -0,0 +1,6 @@ +package target + +fun test() { + Foo() + foo() +} \ No newline at end of file diff --git a/idea/testData/multiFileIntentions/reconcilePackageWithDirectory/changeToNonDefaultPackage/after/target/usagesWithImports.java b/idea/testData/multiFileIntentions/reconcilePackageWithDirectory/changeToNonDefaultPackage/after/target/usagesWithImports.java new file mode 100644 index 00000000000..0e07fe87e3a --- /dev/null +++ b/idea/testData/multiFileIntentions/reconcilePackageWithDirectory/changeToNonDefaultPackage/after/target/usagesWithImports.java @@ -0,0 +1,10 @@ +package target; + +import static target.TargetPackage.foo; + +class Test { + static void test() { + new Foo(); + foo(); + } +} \ No newline at end of file diff --git a/idea/testData/multiFileIntentions/reconcilePackageWithDirectory/changeToNonDefaultPackage/after/target/usagesWithImports.kt b/idea/testData/multiFileIntentions/reconcilePackageWithDirectory/changeToNonDefaultPackage/after/target/usagesWithImports.kt new file mode 100644 index 00000000000..147a343d79d --- /dev/null +++ b/idea/testData/multiFileIntentions/reconcilePackageWithDirectory/changeToNonDefaultPackage/after/target/usagesWithImports.kt @@ -0,0 +1,9 @@ +package target + +import target.Foo +import target.foo + +fun test() { + Foo() + foo() +} \ No newline at end of file diff --git a/idea/testData/multiFileIntentions/reconcilePackageWithDirectory/changeToNonDefaultPackage/after/usages/usagesWithFqNames.java b/idea/testData/multiFileIntentions/reconcilePackageWithDirectory/changeToNonDefaultPackage/after/usages/usagesWithFqNames.java new file mode 100644 index 00000000000..201ecd0a871 --- /dev/null +++ b/idea/testData/multiFileIntentions/reconcilePackageWithDirectory/changeToNonDefaultPackage/after/usages/usagesWithFqNames.java @@ -0,0 +1,11 @@ +package usages; + +import target.Foo; +import target.TargetPackage; + +class Test { + static void test() { + new Foo(); + TargetPackage.foo(); + } +} \ No newline at end of file diff --git a/idea/testData/multiFileIntentions/reconcilePackageWithDirectory/changeToNonDefaultPackage/after/usages/usagesWithFqNames.kt b/idea/testData/multiFileIntentions/reconcilePackageWithDirectory/changeToNonDefaultPackage/after/usages/usagesWithFqNames.kt new file mode 100644 index 00000000000..fa179846ece --- /dev/null +++ b/idea/testData/multiFileIntentions/reconcilePackageWithDirectory/changeToNonDefaultPackage/after/usages/usagesWithFqNames.kt @@ -0,0 +1,9 @@ +package usages + +import target.Foo +import target.foo + +fun test() { + Foo() + foo() +} \ No newline at end of file diff --git a/idea/testData/multiFileIntentions/reconcilePackageWithDirectory/changeToNonDefaultPackage/after/usages/usagesWithImports.java b/idea/testData/multiFileIntentions/reconcilePackageWithDirectory/changeToNonDefaultPackage/after/usages/usagesWithImports.java new file mode 100644 index 00000000000..4301144239c --- /dev/null +++ b/idea/testData/multiFileIntentions/reconcilePackageWithDirectory/changeToNonDefaultPackage/after/usages/usagesWithImports.java @@ -0,0 +1,11 @@ +package usages; + +import target.Foo; +import static target.TargetPackage.foo; + +class Test { + static void test() { + new Foo(); + foo(); + } +} \ No newline at end of file diff --git a/idea/testData/multiFileIntentions/reconcilePackageWithDirectory/changeToNonDefaultPackage/after/usages/usagesWithImports.kt b/idea/testData/multiFileIntentions/reconcilePackageWithDirectory/changeToNonDefaultPackage/after/usages/usagesWithImports.kt new file mode 100644 index 00000000000..fa179846ece --- /dev/null +++ b/idea/testData/multiFileIntentions/reconcilePackageWithDirectory/changeToNonDefaultPackage/after/usages/usagesWithImports.kt @@ -0,0 +1,9 @@ +package usages + +import target.Foo +import target.foo + +fun test() { + Foo() + foo() +} \ No newline at end of file diff --git a/idea/testData/multiFileIntentions/reconcilePackageWithDirectory/changeToNonDefaultPackage/before/target/test.kt b/idea/testData/multiFileIntentions/reconcilePackageWithDirectory/changeToNonDefaultPackage/before/target/test.kt new file mode 100644 index 00000000000..1f9b875232e --- /dev/null +++ b/idea/testData/multiFileIntentions/reconcilePackageWithDirectory/changeToNonDefaultPackage/before/target/test.kt @@ -0,0 +1,7 @@ +package source + +class Foo + +fun foo() { + +} \ No newline at end of file diff --git a/idea/testData/multiFileIntentions/reconcilePackageWithDirectory/changeToNonDefaultPackage/before/target/usagesWithFqNames.java b/idea/testData/multiFileIntentions/reconcilePackageWithDirectory/changeToNonDefaultPackage/before/target/usagesWithFqNames.java new file mode 100644 index 00000000000..52c2498143c --- /dev/null +++ b/idea/testData/multiFileIntentions/reconcilePackageWithDirectory/changeToNonDefaultPackage/before/target/usagesWithFqNames.java @@ -0,0 +1,8 @@ +package target; + +class Test { + static void test() { + new source.Foo(); + source.SourcePackage.foo(); + } +} \ No newline at end of file diff --git a/idea/testData/multiFileIntentions/reconcilePackageWithDirectory/changeToNonDefaultPackage/before/target/usagesWithFqNames.kt b/idea/testData/multiFileIntentions/reconcilePackageWithDirectory/changeToNonDefaultPackage/before/target/usagesWithFqNames.kt new file mode 100644 index 00000000000..2724bbff099 --- /dev/null +++ b/idea/testData/multiFileIntentions/reconcilePackageWithDirectory/changeToNonDefaultPackage/before/target/usagesWithFqNames.kt @@ -0,0 +1,6 @@ +package target + +fun test() { + source.Foo() + source.foo() +} \ No newline at end of file diff --git a/idea/testData/multiFileIntentions/reconcilePackageWithDirectory/changeToNonDefaultPackage/before/target/usagesWithImports.java b/idea/testData/multiFileIntentions/reconcilePackageWithDirectory/changeToNonDefaultPackage/before/target/usagesWithImports.java new file mode 100644 index 00000000000..f83a0941af6 --- /dev/null +++ b/idea/testData/multiFileIntentions/reconcilePackageWithDirectory/changeToNonDefaultPackage/before/target/usagesWithImports.java @@ -0,0 +1,11 @@ +package target; + +import source.Foo; +import static source.SourcePackage.foo; + +class Test { + static void test() { + new Foo(); + foo(); + } +} \ No newline at end of file diff --git a/idea/testData/multiFileIntentions/reconcilePackageWithDirectory/changeToNonDefaultPackage/before/target/usagesWithImports.kt b/idea/testData/multiFileIntentions/reconcilePackageWithDirectory/changeToNonDefaultPackage/before/target/usagesWithImports.kt new file mode 100644 index 00000000000..55d3cd2f88e --- /dev/null +++ b/idea/testData/multiFileIntentions/reconcilePackageWithDirectory/changeToNonDefaultPackage/before/target/usagesWithImports.kt @@ -0,0 +1,9 @@ +package target + +import source.Foo +import source.foo + +fun test() { + Foo() + foo() +} \ No newline at end of file diff --git a/idea/testData/multiFileIntentions/reconcilePackageWithDirectory/changeToNonDefaultPackage/before/usages/usagesWithFqNames.java b/idea/testData/multiFileIntentions/reconcilePackageWithDirectory/changeToNonDefaultPackage/before/usages/usagesWithFqNames.java new file mode 100644 index 00000000000..41b1a04ff7d --- /dev/null +++ b/idea/testData/multiFileIntentions/reconcilePackageWithDirectory/changeToNonDefaultPackage/before/usages/usagesWithFqNames.java @@ -0,0 +1,8 @@ +package usages; + +class Test { + static void test() { + new source.Foo(); + source.SourcePackage.foo(); + } +} \ No newline at end of file diff --git a/idea/testData/multiFileIntentions/reconcilePackageWithDirectory/changeToNonDefaultPackage/before/usages/usagesWithFqNames.kt b/idea/testData/multiFileIntentions/reconcilePackageWithDirectory/changeToNonDefaultPackage/before/usages/usagesWithFqNames.kt new file mode 100644 index 00000000000..035fec4a1ae --- /dev/null +++ b/idea/testData/multiFileIntentions/reconcilePackageWithDirectory/changeToNonDefaultPackage/before/usages/usagesWithFqNames.kt @@ -0,0 +1,6 @@ +package usages + +fun test() { + source.Foo() + source.foo() +} \ No newline at end of file diff --git a/idea/testData/multiFileIntentions/reconcilePackageWithDirectory/changeToNonDefaultPackage/before/usages/usagesWithImports.java b/idea/testData/multiFileIntentions/reconcilePackageWithDirectory/changeToNonDefaultPackage/before/usages/usagesWithImports.java new file mode 100644 index 00000000000..59cb604e2c3 --- /dev/null +++ b/idea/testData/multiFileIntentions/reconcilePackageWithDirectory/changeToNonDefaultPackage/before/usages/usagesWithImports.java @@ -0,0 +1,11 @@ +package usages; + +import source.Foo; +import static source.SourcePackage.foo; + +class Test { + static void test() { + new Foo(); + foo(); + } +} \ No newline at end of file diff --git a/idea/testData/multiFileIntentions/reconcilePackageWithDirectory/changeToNonDefaultPackage/before/usages/usagesWithImports.kt b/idea/testData/multiFileIntentions/reconcilePackageWithDirectory/changeToNonDefaultPackage/before/usages/usagesWithImports.kt new file mode 100644 index 00000000000..e8c4f95a9ac --- /dev/null +++ b/idea/testData/multiFileIntentions/reconcilePackageWithDirectory/changeToNonDefaultPackage/before/usages/usagesWithImports.kt @@ -0,0 +1,9 @@ +package usages + +import source.Foo +import source.foo + +fun test() { + Foo() + foo() +} \ No newline at end of file diff --git a/idea/testData/multiFileIntentions/reconcilePackageWithDirectory/changeToNonDefaultPackage/changeToNonDefaultPackage.test b/idea/testData/multiFileIntentions/reconcilePackageWithDirectory/changeToNonDefaultPackage/changeToNonDefaultPackage.test new file mode 100644 index 00000000000..dcb861716c8 --- /dev/null +++ b/idea/testData/multiFileIntentions/reconcilePackageWithDirectory/changeToNonDefaultPackage/changeToNonDefaultPackage.test @@ -0,0 +1,5 @@ +{ + "mainFile": "target/test.kt", + "intentionClass": "org.jetbrains.kotlin.idea.refactoring.move.changePackage.ChangePackageToMatchDirectoryIntention", + "intentionText": "Change file's package to 'target'" +} \ No newline at end of file diff --git a/idea/testData/multiFileIntentions/reconcilePackageWithDirectory/packageMatchesDirectory/after/foo/bar/test.kt b/idea/testData/multiFileIntentions/reconcilePackageWithDirectory/packageMatchesDirectory/after/foo/bar/test.kt new file mode 100644 index 00000000000..7b2b7920dd6 --- /dev/null +++ b/idea/testData/multiFileIntentions/reconcilePackageWithDirectory/packageMatchesDirectory/after/foo/bar/test.kt @@ -0,0 +1,9 @@ +package foo.bar + +class Foo { + +} + +fun foo() { + +} \ No newline at end of file diff --git a/idea/testData/multiFileIntentions/reconcilePackageWithDirectory/packageMatchesDirectory/before/foo/bar/test.kt b/idea/testData/multiFileIntentions/reconcilePackageWithDirectory/packageMatchesDirectory/before/foo/bar/test.kt new file mode 100644 index 00000000000..64c42f2cf3e --- /dev/null +++ b/idea/testData/multiFileIntentions/reconcilePackageWithDirectory/packageMatchesDirectory/before/foo/bar/test.kt @@ -0,0 +1,9 @@ +package foo.bar + +class Foo { + +} + +fun foo() { + +} \ No newline at end of file diff --git a/idea/testData/multiFileIntentions/reconcilePackageWithDirectory/packageMatchesDirectory/packageMatchesDirectory.test b/idea/testData/multiFileIntentions/reconcilePackageWithDirectory/packageMatchesDirectory/packageMatchesDirectory.test new file mode 100644 index 00000000000..97b253542d4 --- /dev/null +++ b/idea/testData/multiFileIntentions/reconcilePackageWithDirectory/packageMatchesDirectory/packageMatchesDirectory.test @@ -0,0 +1,5 @@ +{ + "intentionClass": "org.jetbrains.kotlin.idea.refactoring.move.changePackage.ChangePackageToMatchDirectoryIntention", + "isApplicable": "false", + "mainFile": "foo/bar/test.kt" +} \ No newline at end of file diff --git a/idea/tests/org/jetbrains/kotlin/idea/codeInsight/JetMultiFileInspectionTestGenerated.java b/idea/tests/org/jetbrains/kotlin/idea/codeInsight/JetMultiFileInspectionTestGenerated.java index f16797426f8..134f8f52141 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/codeInsight/JetMultiFileInspectionTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/codeInsight/JetMultiFileInspectionTestGenerated.java @@ -34,4 +34,10 @@ public class JetMultiFileInspectionTestGenerated extends AbstractJetMultiFileIns public void testAllFilesPresentInMultiFileInspections() throws Exception { JetTestUtils.assertAllTestsPresentInSingleGeneratedClass(this.getClass(), new File("idea/testData/multiFileInspections"), Pattern.compile("^(.+)\\.test$")); } + + @TestMetadata("mismatchedProjectAndDirectory/mismatchedProjectAndDirectory.test") + public void testMismatchedProjectAndDirectory_MismatchedProjectAndDirectory() throws Exception { + String fileName = JetTestUtils.navigationMetadata("idea/testData/multiFileInspections/mismatchedProjectAndDirectory/mismatchedProjectAndDirectory.test"); + doTest(fileName); + } } diff --git a/idea/tests/org/jetbrains/kotlin/idea/intentions/MultiFileIntentionTestGenerated.java b/idea/tests/org/jetbrains/kotlin/idea/intentions/MultiFileIntentionTestGenerated.java index 5f1983bce36..8b27750abb7 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/intentions/MultiFileIntentionTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/intentions/MultiFileIntentionTestGenerated.java @@ -34,4 +34,40 @@ public class MultiFileIntentionTestGenerated extends AbstractMultiFileIntentionT public void testAllFilesPresentInMultiFileIntentions() throws Exception { JetTestUtils.assertAllTestsPresentInSingleGeneratedClass(this.getClass(), new File("idea/testData/multiFileIntentions"), Pattern.compile("^(.+)\\.test$")); } + + @TestMetadata("moveFileToPackageMatchingDirectory/moveToDefaultDirectory/moveToDefaultDirectory.test") + public void testMoveFileToPackageMatchingDirectory_moveToDefaultDirectory_MoveToDefaultDirectory() throws Exception { + String fileName = JetTestUtils.navigationMetadata("idea/testData/multiFileIntentions/moveFileToPackageMatchingDirectory/moveToDefaultDirectory/moveToDefaultDirectory.test"); + doTest(fileName); + } + + @TestMetadata("moveFileToPackageMatchingDirectory/moveToNonDefaultDirectory/moveToNonDefaultDirectory.test") + public void testMoveFileToPackageMatchingDirectory_moveToNonDefaultDirectory_MoveToNonDefaultDirectory() throws Exception { + String fileName = JetTestUtils.navigationMetadata("idea/testData/multiFileIntentions/moveFileToPackageMatchingDirectory/moveToNonDefaultDirectory/moveToNonDefaultDirectory.test"); + doTest(fileName); + } + + @TestMetadata("moveFileToPackageMatchingDirectory/packageMatchesDirectory/packageMatchesDirectory.test") + public void testMoveFileToPackageMatchingDirectory_packageMatchesDirectory_PackageMatchesDirectory() throws Exception { + String fileName = JetTestUtils.navigationMetadata("idea/testData/multiFileIntentions/moveFileToPackageMatchingDirectory/packageMatchesDirectory/packageMatchesDirectory.test"); + doTest(fileName); + } + + @TestMetadata("reconcilePackageWithDirectory/changeToDefaultPackage/changeToDefaultPackage.test") + public void testReconcilePackageWithDirectory_changeToDefaultPackage_ChangeToDefaultPackage() throws Exception { + String fileName = JetTestUtils.navigationMetadata("idea/testData/multiFileIntentions/reconcilePackageWithDirectory/changeToDefaultPackage/changeToDefaultPackage.test"); + doTest(fileName); + } + + @TestMetadata("reconcilePackageWithDirectory/changeToNonDefaultPackage/changeToNonDefaultPackage.test") + public void testReconcilePackageWithDirectory_changeToNonDefaultPackage_ChangeToNonDefaultPackage() throws Exception { + String fileName = JetTestUtils.navigationMetadata("idea/testData/multiFileIntentions/reconcilePackageWithDirectory/changeToNonDefaultPackage/changeToNonDefaultPackage.test"); + doTest(fileName); + } + + @TestMetadata("reconcilePackageWithDirectory/packageMatchesDirectory/packageMatchesDirectory.test") + public void testReconcilePackageWithDirectory_packageMatchesDirectory_PackageMatchesDirectory() throws Exception { + String fileName = JetTestUtils.navigationMetadata("idea/testData/multiFileIntentions/reconcilePackageWithDirectory/packageMatchesDirectory/packageMatchesDirectory.test"); + doTest(fileName); + } }