Move top-level declarations: Implement refactoring processor

This commit is contained in:
Alexey Sedunov
2014-03-17 15:45:17 +04:00
parent 5836bb41b6
commit abcba89ad3
269 changed files with 2302 additions and 5 deletions
@@ -1,4 +1,13 @@
<root>
<item
name='com.intellij.refactoring.BaseRefactoringProcessor boolean preprocessUsages(com.intellij.openapi.util.Ref&lt;com.intellij.usageView.UsageInfo[]&gt;)'>
<annotation name='kotlin.jvm.KotlinSignature'>
<val name="value" val="&quot;fun preprocessUsages(refUsages: Ref&lt;Array&lt;UsageInfo&gt;&gt;): Boolean&quot;"/>
</annotation>
</item>
<item name='com.intellij.refactoring.BaseRefactoringProcessor myProject'>
<annotation name='org.jetbrains.annotations.NotNull'/>
</item>
<item
name='com.intellij.refactoring.BaseRefactoringProcessor.ConflictsInTestsException java.util.Collection&lt;java.lang.String&gt; getMessages()'>
<annotation name='org.jetbrains.annotations.NotNull'/>
@@ -0,0 +1,6 @@
<root>
<item
name='com.intellij.refactoring.listeners.impl.RefactoringTransaction com.intellij.refactoring.listeners.RefactoringElementListener getElementListener(com.intellij.psi.PsiElement)'>
<annotation name='org.jetbrains.annotations.NotNull'/>
</item>
</root>
@@ -5,4 +5,8 @@
<item name='com.intellij.usageView.UsageInfo mySmartPointer'>
<annotation name='org.jetbrains.annotations.NotNull'/>
</item>
<item
name='com.intellij.usageView.UsageViewUtil com.intellij.usageView.UsageInfo[] removeDuplicatedUsages(com.intellij.usageView.UsageInfo[])'>
<annotation name='org.jetbrains.annotations.NotNull'/>
</item>
</root>
@@ -262,4 +262,8 @@ public fun JetSimpleNameExpression.getOutermostNonInterleavingQualifiedElement()
}
}
public fun PsiDirectory.getPackage(): PsiPackage? = JavaDirectoryService.getInstance()!!.getPackage(this)
public fun PsiDirectory.getPackage(): PsiPackage? = JavaDirectoryService.getInstance()!!.getPackage(this)
public fun JetModifierListOwner.isPrivate(): Boolean = hasModifier(JetTokens.PRIVATE_KEYWORD)
public fun PsiElement.isInsideOf(elements: Iterable<PsiElement>): Boolean = elements.any { it.isAncestor(this) }
@@ -41,15 +41,15 @@ import org.jetbrains.jet.lang.psi.JetCallableDeclaration
import org.jetbrains.jet.lang.psi.psiUtil.isExtensionDeclaration
import com.intellij.psi.PsiClass
fun JetClassOrObject.toLightClass(): PsiClass? = LightClassUtil.getPsiClass(this)
fun JetClassOrObject.toLightClass(): KotlinLightClass? = LightClassUtil.getPsiClass(this) as KotlinLightClass?
public fun JetDeclaration.toLightElements(): List<PsiElement> =
public fun JetDeclaration.toLightElements(): List<PsiNamedElement> =
when (this) {
is JetClassOrObject -> Collections.singletonList(LightClassUtil.getPsiClass(this))
is JetNamedFunction -> Collections.singletonList(LightClassUtil.getLightClassMethod(this))
is JetProperty -> LightClassUtil.getLightClassPropertyMethods(this).toList()
is JetPropertyAccessor -> Collections.singletonList(LightClassUtil.getLightClassAccessorMethod(this))
is JetParameter -> ArrayList<PsiElement>().let { elements ->
is JetParameter -> ArrayList<PsiNamedElement>().let { elements ->
toPsiParameter()?.let { psiParameter -> elements.add(psiParameter) }
LightClassUtil.getLightClassPropertyMethods(this).toCollection(elements)
@@ -28,8 +28,19 @@ import org.jetbrains.jet.lang.psi.JetDotQualifiedExpression
import org.jetbrains.jet.lang.psi.JetExpression
import org.jetbrains.jet.lang.psi.JetCallExpression
import org.jetbrains.jet.lang.psi.JetSimpleNameExpression
import java.util.Collections
object JetFileReferencesResolver {
fun resolve(
element: JetElement,
visitReceivers: Boolean = true,
visitShortNames: Boolean = true
): Map<JetReferenceExpression, BindingContext> {
return (element.getContainingFile() as? JetFile)?.let { file ->
resolve(file, listOf(element), visitReceivers, visitShortNames)
} ?: Collections.emptyMap()
}
fun resolve(
file: JetFile,
elements: Iterable<JetElement>? = null,
@@ -72,7 +72,6 @@ private fun Project.clearElementsToShorten() {
}
public fun JetElement.addToShorteningWaitSet() {
assert (this is JetQualifiedExpression || this is JetSimpleNameExpression || this is JetUserType, "Unexpected element type: ${getClass()}: ${getText()}")
assert (ApplicationManager.getApplication()!!.isWriteAccessAllowed(), "Write access needed")
val project = getProject()
project.getElementsToShorten(true)!!.add(SmartPointerManager.getInstance(project)!!.createSmartPsiElementPointer(this))
@@ -19,3 +19,5 @@ parameter.name.is.invalid=Parameter name ''{0}'' is invalid
parameter.type.is.invalid=Parameter type ''{0}'' is invalid
column.name.val.var=Val/Var
package.private.0.will.no.longer.be.accessible.from.1=Package-private {0} will no longer be accessible from {1}
0.uses.package.private.1={0} uses package-private {1}
@@ -95,4 +95,11 @@ public fun PsiElement.getKotlinFqName(): FqName? {
is JetNamedDeclaration -> JetPsiUtil.getFQName(element)
else -> null
}
}
public fun PsiElement.getUsageContext(): PsiElement {
return when (this) {
is JetElement -> PsiTreeUtil.getParentOfType(this, javaClass<JetNamedDeclaration>(), javaClass<JetFile>())!!
else -> ConflictsUtil.getContainer(this)
}
}
@@ -0,0 +1,285 @@
/*
* Copyright 2010-2014 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.jet.plugin.refactoring.move.moveTopLevelDeclarations
import com.intellij.refactoring.BaseRefactoringProcessor
import com.intellij.openapi.project.Project
import com.intellij.usageView.UsageInfo
import com.intellij.usageView.UsageViewDescriptor
import com.intellij.refactoring.MoveDestination
import com.intellij.refactoring.move.MoveCallback
import com.intellij.refactoring.move.MoveMultipleElementsViewDescriptor
import com.intellij.refactoring.move.moveClassesOrPackages.MoveClassesOrPackagesUtil
import com.intellij.usageView.UsageViewUtil
import com.intellij.openapi.diagnostic.Logger
import com.intellij.psi.PsiElement
import com.intellij.refactoring.util.NonCodeUsageInfo
import com.intellij.refactoring.move.moveClassesOrPackages.CommonMoveUtil
import com.intellij.util.IncorrectOperationException
import com.intellij.refactoring.util.RefactoringUIUtil
import org.jetbrains.jet.utils.keysToMap
import com.intellij.refactoring.rename.RenameUtil
import com.intellij.refactoring.move.MoveClassesOrPackagesCallback
import org.jetbrains.jet.plugin.refactoring.JetRefactoringBundle
import com.intellij.openapi.util.text.StringUtil
import com.intellij.psi.PsiDirectory
import org.jetbrains.jet.lang.psi.psiUtil.getPackage
import org.jetbrains.jet.lang.psi.JetFile
import org.jetbrains.jet.plugin.refactoring.move.PackageNameInfo
import org.jetbrains.jet.lang.psi.JetPsiUtil
import org.jetbrains.jet.lang.resolve.name.FqName
import org.jetbrains.jet.plugin.refactoring.createKotlinFile
import org.jetbrains.jet.plugin.refactoring.move.updateInternalReferencesOnPackageNameChange
import org.jetbrains.jet.plugin.codeInsight.addToShorteningWaitSet
import org.jetbrains.jet.plugin.refactoring.move.getFileNameAfterMove
import org.jetbrains.jet.lang.psi.JetNamedDeclaration
import org.jetbrains.jet.asJava.toLightElements
import java.util.HashMap
import org.jetbrains.jet.utils.flatten
import java.util.ArrayList
import java.util.HashSet
import com.intellij.psi.PsiReference
import com.intellij.psi.search.searches.ReferencesSearch
import com.intellij.psi.search.GlobalSearchScope
import com.intellij.refactoring.util.MoveRenameUsageInfo
import com.intellij.psi.PsiClass
import com.intellij.refactoring.util.TextOccurrencesUtil
import com.intellij.refactoring.move.moveClassesOrPackages.MoveClassHandler
import com.intellij.util.containers.MultiMap
import org.jetbrains.jet.asJava.namedUnwrappedElement
import org.jetbrains.jet.lang.psi.psiUtil.isPrivate
import org.jetbrains.jet.plugin.refactoring.getUsageContext
import com.intellij.refactoring.util.CommonRefactoringUtil
import org.jetbrains.jet.lang.psi.psiUtil.isInsideOf
import org.jetbrains.jet.plugin.codeInsight.JetFileReferencesResolver
import org.jetbrains.jet.lang.resolve.BindingContext
import org.jetbrains.jet.plugin.codeInsight.DescriptorToDeclarationUtil
import org.jetbrains.jet.lang.psi.JetModifierListOwner
import com.intellij.psi.PsiModifierListOwner
import com.intellij.psi.PsiModifier
import com.intellij.util.VisibilityUtil
import com.intellij.openapi.util.Ref
import org.jetbrains.jet.plugin.refactoring.getKotlinFqName
import org.jetbrains.jet.plugin.references.JetSimpleNameReference.ShorteningMode
public class MoveKotlinTopLevelDeclarationsOptions(
val elementsToMove: Collection<JetNamedDeclaration>,
val moveDestination: MoveDestination,
val searchInCommentsAndStrings: Boolean = true,
val searchInNonCode: Boolean = true,
val moveCallback: MoveCallback? = null
)
public class MoveKotlinTopLevelDeclarationsProcessor(project: Project, val options: MoveKotlinTopLevelDeclarationsOptions) : BaseRefactoringProcessor(project) {
class object {
private val LOG: Logger = Logger.getInstance(javaClass<MoveKotlinTopLevelDeclarationsProcessor>())
private val REFACTORING_NAME: String = JetRefactoringBundle.message("refactoring.move.top.level.declarations")!!
}
private var nonCodeUsages: Array<NonCodeUsageInfo>? = null
private val kotlinToLightElements = options.elementsToMove.keysToMap { it.toLightElements() }
private val conflicts = MultiMap<PsiElement, String>()
override fun createUsageViewDescriptor(usages: Array<out UsageInfo>?): UsageViewDescriptor {
return MoveMultipleElementsViewDescriptor(
options.elementsToMove.copyToArray(),
MoveClassesOrPackagesUtil.getPackageName(options.moveDestination.getTargetPackage())
)
}
override fun findUsages(): Array<UsageInfo> {
val newPackageName = options.moveDestination.getTargetPackage()?.getQualifiedName() ?: ""
fun collectUsages(): List<UsageInfo> {
return kotlinToLightElements.values().flatten().flatMap { lightElement ->
val newFqName = StringUtil.getQualifiedName(newPackageName, lightElement.getName())
val foundReferences = HashSet<PsiReference>()
val projectScope = GlobalSearchScope.projectScope(lightElement.getProject())
val results = ReferencesSearch
.search(lightElement, projectScope, false)
.mapTo(ArrayList<UsageInfo?>()) { ref ->
if (foundReferences.add(ref)) {
val range = ref.getRangeInElement()!!
MoveRenameUsageInfo(ref.getElement(), ref, range.getStartOffset(), range.getEndOffset(), lightElement, false)
}
else null
}
.filterNotNull()
val name = lightElement.getKotlinFqName()?.asString()
if (name != null) {
TextOccurrencesUtil.findNonCodeUsages(
lightElement,
name,
options.searchInCommentsAndStrings,
options.searchInNonCode,
newFqName,
results
)
}
MoveClassHandler.EP_NAME.getExtensions().forEach { handler -> handler.preprocessUsages(results) }
results
}
}
/*
There must be a conflict if all of the following conditions are satisfied:
declaration is package-private
usage does not belong to target package
usage is not being moved together with declaration
*/
fun collectConflictsInUsages(usages: List<UsageInfo>) {
val declarationToContainers = HashMap<JetNamedDeclaration, MutableSet<PsiElement>>()
for (usage in usages) {
val element = usage.getElement()
if (element == null || usage !is MoveRenameUsageInfo || usage is NonCodeUsageInfo) continue
val declaration = usage.getReferencedElement()?.namedUnwrappedElement as? JetNamedDeclaration
if (declaration == null || !declaration.isPrivate()) continue
if (element.isInsideOf(options.elementsToMove)) continue
val container = element.getUsageContext()
if (!declarationToContainers.getOrPut(declaration) { HashSet<PsiElement>() }.add(container)) continue
val currentPackage = element.getContainingFile()?.getContainingDirectory()?.getPackage()
if (currentPackage?.getQualifiedName() == newPackageName) continue
conflicts.putValue(
declaration,
JetRefactoringBundle.message(
"package.private.0.will.no.longer.be.accessible.from.1",
RefactoringUIUtil.getDescription(declaration, true),
RefactoringUIUtil.getDescription(container, true)
)
)
}
}
fun collectConflictsInDeclarations() {
val declarationToReferenceTargets = HashMap<JetNamedDeclaration, MutableSet<PsiElement>>()
for (declaration in options.elementsToMove) {
val referenceToContext = JetFileReferencesResolver.resolve(element = declaration, visitReceivers = false)
for ((refExpr, bindingContext) in referenceToContext) {
val refTarget = bindingContext[BindingContext.REFERENCE_TARGET, refExpr]?.let { descriptor ->
DescriptorToDeclarationUtil.getDeclaration(declaration.getProject(), descriptor, bindingContext)
}
if (refTarget == null || refTarget.isInsideOf(options.elementsToMove)) continue
val packagePrivate = when(refTarget) {
is JetModifierListOwner ->
refTarget.isPrivate()
is PsiModifierListOwner ->
VisibilityUtil.getVisibilityModifier(refTarget.getModifierList()) == PsiModifier.PACKAGE_LOCAL
else -> false
}
if (!packagePrivate) continue
if (!declarationToReferenceTargets.getOrPut(declaration) { HashSet<PsiElement>() }.add(refTarget)) continue
val currentPackage = declaration.getContainingFile()?.getContainingDirectory()?.getPackage()
if (currentPackage?.getQualifiedName() == newPackageName) continue
conflicts.putValue(
declaration,
JetRefactoringBundle.message(
"0.uses.package.private.1",
RefactoringUIUtil.getDescription(declaration, true),
RefactoringUIUtil.getDescription(refTarget, true)
)!!.capitalize()
)
}
}
}
val usages = collectUsages()
collectConflictsInUsages(usages)
collectConflictsInDeclarations()
return UsageViewUtil.removeDuplicatedUsages(usages.copyToArray())
}
override fun preprocessUsages(refUsages: Ref<Array<UsageInfo>>): Boolean {
return showConflicts(conflicts, refUsages.get())
}
override fun performRefactoring(usages: Array<out UsageInfo>?) {
fun moveDeclaration(declaration: JetNamedDeclaration, moveDestination: PsiDirectory): JetNamedDeclaration? {
val newPackage = moveDestination.getPackage()
if (newPackage == null) return null
val file = declaration.getContainingFile() as? JetFile
if (file == null) return null
val packageNameInfo = PackageNameInfo(JetPsiUtil.getFQName(file), FqName(newPackage.getQualifiedName()))
val existingFile = if (moveDestination != file.getContainingDirectory()) moveDestination.findFile(file.getName()) else null
val newFile = existingFile ?: declaration.getFileNameAfterMove()?.let {
fileName -> createKotlinFile(fileName, moveDestination)
}
assert(newFile != null, "Couldn't create Koltin file for: ${declaration.getClass()}: ${declaration.getText()}")
declaration.updateInternalReferencesOnPackageNameChange(packageNameInfo, ShorteningMode.NO_SHORTENING)
val newElement = newFile!!.add(declaration) as JetNamedDeclaration
declaration.delete()
newElement.addToShorteningWaitSet()
return newElement
}
try {
val oldToNewElementsMapping = HashMap<PsiElement, PsiElement>()
for ((oldDeclaration, oldLightElements) in kotlinToLightElements) {
val targetDirectory = options.moveDestination.getTargetDirectory(oldDeclaration.getContainingFile())
if (targetDirectory == null) continue
val newDeclaration = moveDeclaration(oldDeclaration, targetDirectory)
if (newDeclaration == null) continue
getTransaction()!!.getElementListener(oldDeclaration).elementMoved(newDeclaration)
for ((oldElement, newElement) in oldLightElements.iterator() zip newDeclaration.toLightElements().iterator()) {
oldToNewElementsMapping[oldElement] = newElement
}
}
nonCodeUsages = CommonMoveUtil.retargetUsages(usages, oldToNewElementsMapping)
}
catch (e: IncorrectOperationException) {
nonCodeUsages = null
RefactoringUIUtil.processIncorrectOperation(myProject, e)
}
}
override fun performPsiSpoilingRefactoring() {
nonCodeUsages?.let { nonCodeUsages -> RenameUtil.renameNonCodeUsages(myProject, nonCodeUsages) }
options.moveCallback?.let { moveCallback ->
if (moveCallback is MoveClassesOrPackagesCallback) {
moveCallback.classesOrPackagesMoved(options.moveDestination)
}
moveCallback.refactoringCompleted()
}
}
override fun getCommandName(): String = REFACTORING_NAME
}
@@ -27,6 +27,11 @@ import org.jetbrains.jet.lang.resolve.name.FqName
import org.jetbrains.jet.lang.psi.JetFile
import org.jetbrains.jet.lang.psi.JetElement
import org.jetbrains.jet.plugin.references.JetSimpleNameReference.ShorteningMode
import com.intellij.psi.PsiClass
import org.jetbrains.jet.asJava.KotlinLightClass
import org.jetbrains.jet.plugin.JetFileType
import org.jetbrains.jet.lang.psi.JetClassOrObject
import org.jetbrains.jet.lang.psi.JetNamedDeclaration
public class PackageNameInfo(val oldPackageName: FqName, val newPackageName: FqName)
@@ -59,4 +64,10 @@ public fun JetElement.updateInternalReferencesOnPackageNameChange(
}
}
}
}
public fun JetNamedDeclaration.getFileNameAfterMove(): String? {
return (getContainingFile() as? JetFile)?.let { file ->
if (file.getDeclarations().size > 1) "${getName()}.${JetFileType.INSTANCE.getDefaultExtension()}" else file.getName()
}
}
@@ -0,0 +1,7 @@
package a
import b.Test
fun bar() {
val t: Test = Test()
}
@@ -0,0 +1,7 @@
package a
import b.Test as _Test
fun bar() {
val t: _Test = _Test()
}
@@ -0,0 +1,7 @@
package a
open class Foo {
open class Bar {
}
}
@@ -0,0 +1,7 @@
package a
import b.Test
fun test(): Test {
return Test()
}
@@ -0,0 +1,9 @@
package a;
import b.Test;
class J {
void bar() {
Test t = new Test();
}
}
@@ -0,0 +1,7 @@
package a
import b.Test
fun bar() {
val t: Test = Test()
}
@@ -0,0 +1,7 @@
package a
import b.Test as _Test
fun bar() {
val t: _Test = _Test()
}
@@ -0,0 +1,10 @@
package b
class Test {
val aFoo: a.Foo = a.Foo()
val bFoo: Foo = Foo()
val cFoo: c.Foo = c.Foo()
val aBar: a.Foo.Bar = a.Foo.Bar()
val bBar: Foo.Bar = Foo.Bar()
val cBar: c.Foo.Bar = c.Foo.Bar()
}
@@ -0,0 +1,7 @@
package b
open class Foo {
open class Bar {
}
}
@@ -0,0 +1,7 @@
package b;
class J {
void bar() {
Test t = new Test();
}
}
@@ -0,0 +1,5 @@
package b
fun bar() {
val t: Test = Test()
}
@@ -0,0 +1,7 @@
package b;
class J {
void bar() {
Test t = new Test();
}
}
@@ -0,0 +1,7 @@
package b
import a.*
fun bar() {
val t: Test = Test()
}
@@ -0,0 +1,7 @@
package b;
class J {
void bar() {
Test t = new Test();
}
}
@@ -0,0 +1,7 @@
package b
import b.Test
fun bar() {
val t: Test = Test()
}
@@ -0,0 +1,7 @@
package b
import b.Test as _Test
fun bar() {
val t: _Test = _Test()
}
@@ -0,0 +1,7 @@
package c
open class Foo {
open class Bar {
}
}
@@ -0,0 +1,9 @@
package c;
import b.Test;
class J {
void bar() {
Test t = new Test();
}
}
@@ -0,0 +1,7 @@
package c
import b.Test
fun bar() {
val t: Test = Test()
}
@@ -0,0 +1,9 @@
package c;
import b.Test;
class J {
void bar() {
Test t = new Test();
}
}
@@ -0,0 +1,8 @@
package c
import a.*
import b.Test
fun bar() {
val t: Test = Test()
}
@@ -0,0 +1,9 @@
package c;
import b.Test;
class J {
void bar() {
Test t = new Test();
}
}
@@ -0,0 +1,7 @@
package c
import b.Test
fun bar() {
val t: Test = Test()
}
@@ -0,0 +1,7 @@
package c
import b.Test as _Test
fun bar() {
val t: _Test = _Test()
}
@@ -0,0 +1,5 @@
package a
fun bar() {
val t: Test = Test()
}
@@ -0,0 +1,7 @@
package a
import a.Test as _Test
fun bar() {
val t: _Test = _Test()
}
@@ -0,0 +1,7 @@
package a
open class Foo {
open class Bar {
}
}
@@ -0,0 +1,14 @@
package a
class <caret>Test {
val aFoo: Foo = Foo()
val bFoo: b.Foo = b.Foo()
val cFoo: c.Foo = c.Foo()
val aBar: Foo.Bar = Foo.Bar()
val bBar: b.Foo.Bar = b.Foo.Bar()
val cBar: c.Foo.Bar = c.Foo.Bar()
}
fun test(): Test {
return Test()
}
@@ -0,0 +1,7 @@
package a;
class J {
void bar() {
Test t = new Test();
}
}
@@ -0,0 +1,5 @@
package a
fun bar() {
val t: Test = Test()
}
@@ -0,0 +1,7 @@
package a
import a.Test as _Test
fun bar() {
val t: _Test = _Test()
}
@@ -0,0 +1,7 @@
package b
open class Foo {
open class Bar {
}
}
@@ -0,0 +1,7 @@
package b;
class J {
void bar() {
a.Test t = new a.Test();
}
}
@@ -0,0 +1,5 @@
package b
fun bar() {
val t: a.Test = a.Test()
}
@@ -0,0 +1,9 @@
package b;
import a.*;
class J {
void bar() {
Test t = new Test();
}
}
@@ -0,0 +1,7 @@
package b
import a.*
fun bar() {
val t: Test = Test()
}
@@ -0,0 +1,9 @@
package b;
import a.Test;
class J {
void bar() {
Test t = new Test();
}
}
@@ -0,0 +1,7 @@
package b
import a.Test
fun bar() {
val t: Test = Test()
}
@@ -0,0 +1,7 @@
package b
import a.Test as _Test
fun bar() {
val t: _Test = _Test()
}
@@ -0,0 +1,7 @@
package c
open class Foo {
open class Bar {
}
}
@@ -0,0 +1,7 @@
package c;
class J {
void bar() {
a.Test t = new a.Test();
}
}
@@ -0,0 +1,5 @@
package c
fun bar() {
val t: a.Test = a.Test()
}
@@ -0,0 +1,9 @@
package c;
import a.*;
class J {
void bar() {
Test t = new Test();
}
}
@@ -0,0 +1,7 @@
package c
import a.*
fun bar() {
val t: Test = Test()
}
@@ -0,0 +1,9 @@
package c;
import a.Test;
class J {
void bar() {
Test t = new Test();
}
}
@@ -0,0 +1,7 @@
package c
import a.Test
fun bar() {
val t: Test = Test()
}
@@ -0,0 +1,7 @@
package c
import a.Test as _Test
fun bar() {
val t: _Test = _Test()
}
@@ -0,0 +1,5 @@
{
"mainFile": "a/main.kt",
"type": "MOVE_KOTLIN_TOP_LEVEL_DECLARATIONS",
"targetPackage": "b"
}
@@ -0,0 +1,9 @@
package a
private class Foo {
}
private fun foo(value: Foo) {
}
@@ -0,0 +1,7 @@
package a
private class Test {
fun test {
foo(Foo())
}
}
@@ -0,0 +1,7 @@
package a;
class J {
void bar() {
Test t = new Test();
}
}
@@ -0,0 +1,5 @@
package a
fun bar() {
val t: Test = Test()
}
@@ -0,0 +1,9 @@
package a
private class Foo {
}
private fun foo(value: Foo) {
}
@@ -0,0 +1,7 @@
package a
private class <caret>Test {
fun test {
foo(Foo())
}
}
@@ -0,0 +1,7 @@
package a;
class J {
void bar() {
Test t = new Test();
}
}
@@ -0,0 +1,5 @@
package a
fun bar() {
val t: Test = Test()
}
@@ -0,0 +1,4 @@
Class a.Test uses package-private class a.Foo
Class a.Test uses package-private function a.foo
Package-private class a.Test will no longer be accessible from method J.bar()
Package-private class a.Test will no longer be accessible from property a.bar.t
@@ -0,0 +1,5 @@
{
"mainFile": "a/main.kt",
"type": "MOVE_KOTLIN_TOP_LEVEL_DECLARATIONS",
"targetPackage": "b"
}
@@ -0,0 +1,5 @@
package a
fun bar() {
b.test()
}
@@ -0,0 +1,7 @@
package a
import b.test as _test
fun bar() {
_test()
}
@@ -0,0 +1,7 @@
package a
open class Foo {
open class Bar {
}
}
@@ -0,0 +1,7 @@
package a
class Test {
fun foo() {
b.test()
}
}
@@ -0,0 +1,7 @@
package a;
class J {
void bar() {
b.BPackage.test();
}
}
@@ -0,0 +1,5 @@
package a
fun bar() {
b.test()
}
@@ -0,0 +1,7 @@
package a;
class J {
void bar() {
b.BPackage.test();
}
}
@@ -0,0 +1,7 @@
package a
import b.test as _test
fun bar() {
_test()
}
@@ -0,0 +1,9 @@
package a;
import static b.BPackage.test;
class J {
void bar() {
test();
}
}
@@ -0,0 +1,7 @@
package b
open class Foo {
open class Bar {
}
}
@@ -0,0 +1,7 @@
package b;
class J {
void bar() {
b.BPackage.test();
}
}
@@ -0,0 +1,5 @@
package b
fun bar() {
test()
}
@@ -0,0 +1,7 @@
package b;
class J {
void bar() {
b.BPackage.test();
}
}
@@ -0,0 +1,7 @@
package b
import a.*
fun bar() {
test()
}
@@ -0,0 +1,7 @@
package b;
class J {
void bar() {
b.BPackage.test();
}
}
@@ -0,0 +1,7 @@
package b;
class J {
void bar() {
b.BPackage.test();
}
}
@@ -0,0 +1,7 @@
package b
import b.test
fun bar() {
test()
}
@@ -0,0 +1,7 @@
package b
import b.test as _test
fun bar() {
_test()
}
@@ -0,0 +1,9 @@
package b;
import static b.BPackage.test;
class J {
void bar() {
test();
}
}
@@ -0,0 +1,10 @@
package b
fun test {
val aFoo: a.Foo = a.Foo()
val bFoo: Foo = Foo()
val cFoo: c.Foo = c.Foo()
val aBar: a.Foo.Bar = a.Foo.Bar()
val bBar: Foo.Bar = Foo.Bar()
val cBar: c.Foo.Bar = c.Foo.Bar()
}
@@ -0,0 +1,7 @@
package c
open class Foo {
open class Bar {
}
}
@@ -0,0 +1,7 @@
package c;
class J {
void bar() {
b.BPackage.test();
}
}
@@ -0,0 +1,5 @@
package c
fun bar() {
b.test()
}
@@ -0,0 +1,7 @@
package c;
class J {
void bar() {
b.BPackage.test();
}
}
@@ -0,0 +1,7 @@
package c
import a.*
fun bar() {
b.test()
}
@@ -0,0 +1,7 @@
package c;
class J {
void bar() {
b.BPackage.test();
}
}
@@ -0,0 +1,7 @@
package c;
class J {
void bar() {
b.BPackage.test();
}
}
@@ -0,0 +1,7 @@
package c
import b.test
fun bar() {
test()
}
@@ -0,0 +1,7 @@
package c
import b.test as _test
fun bar() {
_test()
}
@@ -0,0 +1,9 @@
package c;
import static b.BPackage.test;
class J {
void bar() {
test();
}
}
@@ -0,0 +1,5 @@
package a
fun bar() {
test()
}

Some files were not shown because too many files have changed in this diff Show More