File Move: Fix update of extension references. Reuse MoveKotlinTopLevelDeclarationsProcessor
This commit is contained in:
@@ -21,4 +21,8 @@
|
|||||||
<item name='com.intellij.refactoring.move.moveFilesOrDirectories.MoveFileHandler void updateMovedFile(com.intellij.psi.PsiFile) 0'>
|
<item name='com.intellij.refactoring.move.moveFilesOrDirectories.MoveFileHandler void updateMovedFile(com.intellij.psi.PsiFile) 0'>
|
||||||
<annotation name='org.jetbrains.annotations.NotNull'/>
|
<annotation name='org.jetbrains.annotations.NotNull'/>
|
||||||
</item>
|
</item>
|
||||||
|
<item
|
||||||
|
name='com.intellij.refactoring.move.moveFilesOrDirectories.MoveFileHandler$1 void retargetUsages(java.util.List<com.intellij.usageView.UsageInfo>, java.util.Map<com.intellij.psi.PsiElement,com.intellij.psi.PsiElement>) 0'>
|
||||||
|
<annotation name='org.jetbrains.annotations.NotNull'/>
|
||||||
|
</item>
|
||||||
</root>
|
</root>
|
||||||
+26
-19
@@ -29,6 +29,9 @@ import com.intellij.psi.SmartPointerManager
|
|||||||
import org.jetbrains.jet.lang.psi.JetElement
|
import org.jetbrains.jet.lang.psi.JetElement
|
||||||
import org.jetbrains.jet.lang.psi.JetQualifiedExpression
|
import org.jetbrains.jet.lang.psi.JetQualifiedExpression
|
||||||
import org.jetbrains.jet.lang.psi.JetUserType
|
import org.jetbrains.jet.lang.psi.JetUserType
|
||||||
|
import org.jetbrains.jet.lang.psi.JetFile
|
||||||
|
import org.jetbrains.jet.lang.psi.UserDataProperty
|
||||||
|
import org.jetbrains.jet.lang.psi.NotNullableUserDataProperty
|
||||||
|
|
||||||
public class KotlinShortenReferencesRefactoringHelper: RefactoringHelper<Any> {
|
public class KotlinShortenReferencesRefactoringHelper: RefactoringHelper<Any> {
|
||||||
private val LOG = Logger.getInstance(javaClass<KotlinShortenReferencesRefactoringHelper>().getCanonicalName())
|
private val LOG = Logger.getInstance(javaClass<KotlinShortenReferencesRefactoringHelper>().getCanonicalName())
|
||||||
@@ -36,10 +39,10 @@ public class KotlinShortenReferencesRefactoringHelper: RefactoringHelper<Any> {
|
|||||||
override fun prepareOperation(usages: Array<out UsageInfo>?): Any? {
|
override fun prepareOperation(usages: Array<out UsageInfo>?): Any? {
|
||||||
if (usages != null && usages.isNotEmpty()) {
|
if (usages != null && usages.isNotEmpty()) {
|
||||||
val project = usages[0].getProject()
|
val project = usages[0].getProject()
|
||||||
val elementsToShorten = project.getElementsToShorten(false)
|
val elementsToShorten = project.elementsToShorten
|
||||||
if (elementsToShorten != null && !elementsToShorten.isEmpty()) {
|
if (project.ensureElementsToShortenIsEmptyBeforeRefactoring && elementsToShorten != null && !elementsToShorten.isEmpty()) {
|
||||||
LOG.warn("Waiting set for reference shortening is not empty")
|
LOG.warn("Waiting set for reference shortening is not empty")
|
||||||
project.clearElementsToShorten()
|
project.elementsToShorten = null
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return null
|
return null
|
||||||
@@ -47,32 +50,36 @@ public class KotlinShortenReferencesRefactoringHelper: RefactoringHelper<Any> {
|
|||||||
|
|
||||||
override fun performOperation(project: Project, operationData: Any?) {
|
override fun performOperation(project: Project, operationData: Any?) {
|
||||||
ApplicationManager.getApplication()!!.runWriteAction {
|
ApplicationManager.getApplication()!!.runWriteAction {
|
||||||
project.getElementsToShorten(false)?.let { bindRequests ->
|
project.elementsToShorten?.let { bindRequests ->
|
||||||
project.clearElementsToShorten()
|
project.elementsToShorten = null
|
||||||
ShortenReferences.process(bindRequests.map() { it.getElement() }.filterNotNull())
|
ShortenReferences.process(bindRequests.map() { it.getElement() }.filterNotNull())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private val ELEMENTS_TO_SHORTEN_KEY = Key.create<MutableSet<SmartPsiElementPointer<JetElement>>>("ELEMENTS_TO_SHORTEN_KEY")
|
private var Project.elementsToShorten: MutableSet<SmartPsiElementPointer<JetElement>>?
|
||||||
|
by UserDataProperty(Key.create("ELEMENTS_TO_SHORTEN_KEY"))
|
||||||
|
|
||||||
private fun Project.getElementsToShorten(createIfNeeded: Boolean): MutableSet<SmartPsiElementPointer<JetElement>>? {
|
/*
|
||||||
var elementsToShorten = getUserData(ELEMENTS_TO_SHORTEN_KEY)
|
* When one refactoring invokes another this value must be set to false so that shortening wait-set is not cleared
|
||||||
if (createIfNeeded && elementsToShorten == null) {
|
* and previously collected references are processed correctly. Afterwards it must be reset to original value
|
||||||
elementsToShorten = HashSet()
|
*/
|
||||||
putUserData(ELEMENTS_TO_SHORTEN_KEY, elementsToShorten)
|
public var Project.ensureElementsToShortenIsEmptyBeforeRefactoring: Boolean
|
||||||
|
by NotNullableUserDataProperty(Key.create("ENSURE_ELEMENTS_TO_SHORTEN_IS_EMPTY"), true)
|
||||||
|
|
||||||
|
private fun Project.getOrCreateElementsToShorten(): MutableSet<SmartPsiElementPointer<JetElement>> {
|
||||||
|
var elements = elementsToShorten
|
||||||
|
if (elements == null) {
|
||||||
|
elements = HashSet()
|
||||||
|
elementsToShorten = elements
|
||||||
|
}
|
||||||
|
|
||||||
|
return elements!!
|
||||||
}
|
}
|
||||||
|
|
||||||
return elementsToShorten
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun Project.clearElementsToShorten() {
|
|
||||||
putUserData(ELEMENTS_TO_SHORTEN_KEY, null)
|
|
||||||
}
|
|
||||||
|
|
||||||
public fun JetElement.addToShorteningWaitSet() {
|
public fun JetElement.addToShorteningWaitSet() {
|
||||||
assert (ApplicationManager.getApplication()!!.isWriteAccessAllowed(), "Write access needed")
|
assert (ApplicationManager.getApplication()!!.isWriteAccessAllowed(), "Write access needed")
|
||||||
val project = getProject()
|
val project = getProject()
|
||||||
project.getElementsToShorten(true)!!.add(SmartPointerManager.getInstance(project).createSmartPsiElementPointer(this))
|
project.getOrCreateElementsToShorten().add(SmartPointerManager.getInstance(project).createSmartPsiElementPointer(this))
|
||||||
}
|
}
|
||||||
|
|||||||
+53
-113
@@ -24,59 +24,27 @@ import com.intellij.usageView.UsageInfo
|
|||||||
import com.intellij.openapi.roots.JavaProjectRootsUtil
|
import com.intellij.openapi.roots.JavaProjectRootsUtil
|
||||||
import com.intellij.psi.PsiCompiledElement
|
import com.intellij.psi.PsiCompiledElement
|
||||||
import org.jetbrains.jet.lang.psi.JetFile
|
import org.jetbrains.jet.lang.psi.JetFile
|
||||||
import java.util.ArrayList
|
|
||||||
import com.intellij.psi.search.searches.ReferencesSearch
|
|
||||||
import com.intellij.refactoring.util.MoveRenameUsageInfo
|
|
||||||
import org.jetbrains.jet.lang.psi.JetNamedDeclaration
|
import org.jetbrains.jet.lang.psi.JetNamedDeclaration
|
||||||
import com.intellij.openapi.util.text.StringUtil
|
|
||||||
import com.intellij.psi.PsiReference
|
|
||||||
import org.jetbrains.jet.lang.resolve.name.FqName
|
import org.jetbrains.jet.lang.resolve.name.FqName
|
||||||
import org.jetbrains.jet.plugin.references.JetSimpleNameReference
|
import org.jetbrains.jet.plugin.references.JetSimpleNameReference
|
||||||
import com.intellij.openapi.util.Key
|
|
||||||
import org.jetbrains.jet.plugin.refactoring.getAndRemoveCopyableUserData
|
|
||||||
import org.jetbrains.jet.lang.psi.psiUtil.getPackage
|
import org.jetbrains.jet.lang.psi.psiUtil.getPackage
|
||||||
import org.jetbrains.jet.plugin.references.JetReference
|
|
||||||
import org.jetbrains.jet.asJava.toLightElements
|
|
||||||
import org.jetbrains.jet.lang.psi.JetDeclaration
|
|
||||||
import com.intellij.openapi.util.TextRange
|
|
||||||
import com.intellij.openapi.diagnostic.Logger
|
|
||||||
import org.jetbrains.jet.lang.psi.JetClassOrObject
|
|
||||||
import org.jetbrains.jet.plugin.search.usagesSearch.descriptor
|
|
||||||
import org.jetbrains.jet.lang.resolve.DescriptorUtils
|
|
||||||
import com.intellij.refactoring.util.TextOccurrencesUtil
|
|
||||||
import java.util.Collections
|
|
||||||
import org.jetbrains.jet.plugin.refactoring.move.PackageNameInfo
|
import org.jetbrains.jet.plugin.refactoring.move.PackageNameInfo
|
||||||
import org.jetbrains.jet.plugin.search.projectScope
|
|
||||||
import org.jetbrains.jet.plugin.search.fileScope
|
|
||||||
import org.jetbrains.jet.plugin.search.minus
|
|
||||||
import org.jetbrains.jet.plugin.refactoring.move.getInternalReferencesToUpdateOnPackageNameChange
|
import org.jetbrains.jet.plugin.refactoring.move.getInternalReferencesToUpdateOnPackageNameChange
|
||||||
import org.jetbrains.jet.plugin.refactoring.move.postProcessMoveUsages
|
import org.jetbrains.jet.plugin.refactoring.move.postProcessMoveUsages
|
||||||
import org.jetbrains.jet.plugin.codeInsight.addToShorteningWaitSet
|
import org.jetbrains.jet.plugin.refactoring.move.moveTopLevelDeclarations.MoveKotlinTopLevelDeclarationsProcessor
|
||||||
|
import org.jetbrains.jet.plugin.refactoring.move.moveTopLevelDeclarations.MoveKotlinTopLevelDeclarationsOptions
|
||||||
|
import com.intellij.refactoring.move.moveFilesOrDirectories.MoveFilesOrDirectoriesUtil
|
||||||
|
import org.jetbrains.jet.plugin.refactoring.move.moveTopLevelDeclarations.DeferredJetFileKotlinMoveTarget
|
||||||
|
import org.jetbrains.jet.plugin.refactoring.move.moveTopLevelDeclarations.Mover
|
||||||
|
import org.jetbrains.jet.plugin.codeInsight.ensureElementsToShortenIsEmptyBeforeRefactoring
|
||||||
|
|
||||||
public class MoveKotlinFileHandler : MoveFileHandler() {
|
public class MoveKotlinFileHandler : MoveFileHandler() {
|
||||||
class object {
|
private var packageNameInfo: PackageNameInfo? = null
|
||||||
private val LOG = Logger.getInstance(javaClass<MoveKotlinFileHandler>())
|
private var declarationMoveProcessor: MoveKotlinTopLevelDeclarationsProcessor? = null
|
||||||
|
|
||||||
class MoveRenameKotlinUsageInfo(
|
private fun clearState() {
|
||||||
reference: JetSimpleNameReference,
|
packageNameInfo = null
|
||||||
range: TextRange,
|
declarationMoveProcessor = null
|
||||||
referencedElement: JetDeclaration,
|
|
||||||
val newFqName: FqName
|
|
||||||
) : MoveRenameUsageInfo(reference.getElement(), reference, range.getStartOffset(), range.getEndOffset(), referencedElement, false) {
|
|
||||||
val jetReference: JetSimpleNameReference get() = getReference() as JetSimpleNameReference
|
|
||||||
}
|
|
||||||
|
|
||||||
class MoveRenameJavaUsageInfo(
|
|
||||||
reference: PsiReference,
|
|
||||||
range: TextRange,
|
|
||||||
referencedElement: JetDeclaration,
|
|
||||||
val lightElementIndex: Int
|
|
||||||
) : MoveRenameUsageInfo(reference.getElement(), reference, range.getStartOffset(), range.getEndOffset(), referencedElement, false) {
|
|
||||||
val jetDeclaration: JetDeclaration get() = getReferencedElement() as JetDeclaration
|
|
||||||
}
|
|
||||||
|
|
||||||
private val PACKAGE_NAME_INFO_KEY =
|
|
||||||
Key.create<PackageNameInfo>("${javaClass<MoveKotlinFileHandler>().getCanonicalName()}.PACKAGE_NAME_INFO_KEY")
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun JetFile.packageMatchesDirectory(): Boolean {
|
private fun JetFile.packageMatchesDirectory(): Boolean {
|
||||||
@@ -88,95 +56,52 @@ public class MoveKotlinFileHandler : MoveFileHandler() {
|
|||||||
return !JavaProjectRootsUtil.isOutsideJavaSourceRoot(element)
|
return !JavaProjectRootsUtil.isOutsideJavaSourceRoot(element)
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun prepareMovedFile(file: PsiFile, moveDestination: PsiDirectory, oldToNewMap: Map<PsiElement, PsiElement>) {
|
|
||||||
if (file is JetFile && file.packageMatchesDirectory()) {
|
|
||||||
val newPackage = moveDestination.getPackage()
|
|
||||||
if (newPackage != null) {
|
|
||||||
file.putCopyableUserData(
|
|
||||||
PACKAGE_NAME_INFO_KEY,
|
|
||||||
PackageNameInfo(file.getPackageFqName(), FqName(newPackage.getQualifiedName()))
|
|
||||||
)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun findUsages(
|
override fun findUsages(
|
||||||
psiFile: PsiFile,
|
psiFile: PsiFile,
|
||||||
newParent: PsiDirectory,
|
newParent: PsiDirectory,
|
||||||
searchInComments: Boolean,
|
searchInComments: Boolean,
|
||||||
searchInNonJavaFiles: Boolean
|
searchInNonJavaFiles: Boolean
|
||||||
): List<UsageInfo>? {
|
): List<UsageInfo>? {
|
||||||
|
clearState()
|
||||||
|
|
||||||
if (psiFile !is JetFile || !psiFile.packageMatchesDirectory()) return null
|
if (psiFile !is JetFile || !psiFile.packageMatchesDirectory()) return null
|
||||||
|
|
||||||
|
val newPackage = newParent.getPackage()
|
||||||
|
if (newPackage == null) return null
|
||||||
|
|
||||||
|
val packageNameInfo = PackageNameInfo(psiFile.getPackageFqName(), FqName(newPackage.getQualifiedName()))
|
||||||
val project = psiFile.getProject()
|
val project = psiFile.getProject()
|
||||||
val newPackageName = newParent.getPackage()?.getQualifiedName() ?: ""
|
|
||||||
|
|
||||||
val searchScope = project.projectScope() - psiFile.fileScope()
|
val declarationMoveProcessor = MoveKotlinTopLevelDeclarationsProcessor(
|
||||||
return psiFile.getDeclarations().flatMap { declaration ->
|
project,
|
||||||
val name = (declaration as? JetNamedDeclaration)?.getName()
|
MoveKotlinTopLevelDeclarationsOptions(
|
||||||
if (name != null) {
|
elementsToMove = psiFile.getDeclarations().filterIsInstance(javaClass<JetNamedDeclaration>()),
|
||||||
val newFqName = StringUtil.getQualifiedName(newPackageName, name)!!
|
moveTarget = DeferredJetFileKotlinMoveTarget(project, packageNameInfo.newPackageName) {
|
||||||
|
MoveFilesOrDirectoriesUtil.doMoveFile(psiFile, newParent)
|
||||||
val results = ReferencesSearch.search(declaration, searchScope, false)
|
newParent.findFile(psiFile.getName()) as? JetFile
|
||||||
.toSet()
|
},
|
||||||
.mapTo(ArrayList<UsageInfo?>()) { ref ->
|
updateInternalReferences = false
|
||||||
val range = ref.getRangeInElement()!!
|
),
|
||||||
|
object: Mover {
|
||||||
when (ref) {
|
[suppress("PARAMETER_NAME_CHANGED_ON_OVERRIDE")]
|
||||||
is JetSimpleNameReference ->
|
override fun invoke(originalElement: JetNamedDeclaration, targetFile: JetFile): JetNamedDeclaration = originalElement
|
||||||
MoveRenameKotlinUsageInfo(ref, range, declaration, FqName(newFqName))
|
|
||||||
is JetReference ->
|
|
||||||
// Can't rebind other JetReferences
|
|
||||||
null
|
|
||||||
else -> {
|
|
||||||
val lightElementWithIndex =
|
|
||||||
declaration.toLightElements().withIndices().find { p -> ref.isReferenceTo(p.second) }
|
|
||||||
if (lightElementWithIndex != null && lightElementWithIndex.first >= 0) {
|
|
||||||
MoveRenameJavaUsageInfo(ref, range, declaration, lightElementWithIndex.first)
|
|
||||||
}
|
|
||||||
else null
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
.filterNotNull()
|
|
||||||
if (declaration is JetClassOrObject) {
|
|
||||||
declaration.descriptor?.let { DescriptorUtils.getFqName(it).asString() }?.let { stringToSearch ->
|
|
||||||
TextOccurrencesUtil.findNonCodeUsages(
|
|
||||||
declaration, stringToSearch, searchInComments, searchInNonJavaFiles, newFqName, results
|
|
||||||
)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
)
|
||||||
|
|
||||||
results
|
this.packageNameInfo = packageNameInfo
|
||||||
}
|
this.declarationMoveProcessor = declarationMoveProcessor
|
||||||
else Collections.emptyList<UsageInfo>()
|
|
||||||
}
|
return declarationMoveProcessor.findUsages().toList()
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun retargetUsages(usageInfos: List<UsageInfo>?, oldToNewMap: Map<PsiElement, PsiElement>?) {
|
override fun prepareMovedFile(file: PsiFile, moveDestination: PsiDirectory, oldToNewMap: Map<PsiElement, PsiElement>) {
|
||||||
usageInfos?.forEach { usage ->
|
|
||||||
when (usage) {
|
|
||||||
is MoveRenameKotlinUsageInfo -> {
|
|
||||||
usage.jetReference.bindToFqName(usage.newFqName)
|
|
||||||
}
|
|
||||||
is MoveRenameJavaUsageInfo -> {
|
|
||||||
val lightElements = usage.jetDeclaration.toLightElements()
|
|
||||||
val index = usage.lightElementIndex
|
|
||||||
if (index < lightElements.size) {
|
|
||||||
usage.getReference()!!.bindToElement(lightElements[index])
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
LOG.error("Can't find light element with index $index for ${usage.jetDeclaration.getText()} ")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun updateMovedFile(file: PsiFile) {
|
override fun updateMovedFile(file: PsiFile) {
|
||||||
if (file !is JetFile) return
|
if (file !is JetFile) return
|
||||||
|
|
||||||
val packageNameInfo = file.getAndRemoveCopyableUserData(PACKAGE_NAME_INFO_KEY)
|
val packageNameInfo = packageNameInfo
|
||||||
if (packageNameInfo == null) return
|
if (packageNameInfo == null) return
|
||||||
|
|
||||||
val usages = file.getInternalReferencesToUpdateOnPackageNameChange(packageNameInfo)
|
val usages = file.getInternalReferencesToUpdateOnPackageNameChange(packageNameInfo)
|
||||||
@@ -185,4 +110,19 @@ public class MoveKotlinFileHandler : MoveFileHandler() {
|
|||||||
val packageRef = file.getPackageDirective()?.getLastReferenceExpression()?.getReference() as? JetSimpleNameReference
|
val packageRef = file.getPackageDirective()?.getLastReferenceExpression()?.getReference() as? JetSimpleNameReference
|
||||||
packageRef?.bindToFqName(packageNameInfo.newPackageName)
|
packageRef?.bindToFqName(packageNameInfo.newPackageName)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
override fun retargetUsages(usageInfos: List<UsageInfo>?, oldToNewMap: Map<PsiElement, PsiElement>?) {
|
||||||
|
val processor = declarationMoveProcessor ?: return
|
||||||
|
|
||||||
|
val project = processor.project
|
||||||
|
val ensureElementsToShortenIsEmpty = project.ensureElementsToShortenIsEmptyBeforeRefactoring
|
||||||
|
|
||||||
|
try {
|
||||||
|
project.ensureElementsToShortenIsEmptyBeforeRefactoring = false
|
||||||
|
usageInfos?.let { processor.execute(it) }
|
||||||
|
} finally {
|
||||||
|
project.ensureElementsToShortenIsEmptyBeforeRefactoring = ensureElementsToShortenIsEmpty
|
||||||
|
clearState()
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
+20
-1
@@ -22,6 +22,9 @@ import org.jetbrains.jet.lang.psi.JetFile
|
|||||||
import com.intellij.psi.PsiElement
|
import com.intellij.psi.PsiElement
|
||||||
import com.intellij.psi.PsiFile
|
import com.intellij.psi.PsiFile
|
||||||
import com.intellij.psi.PsiManager
|
import com.intellij.psi.PsiManager
|
||||||
|
import org.jetbrains.jet.lang.resolve.name.FqName
|
||||||
|
import com.intellij.openapi.project.Project
|
||||||
|
import kotlin.properties.Delegates
|
||||||
|
|
||||||
public trait KotlinMoveTarget {
|
public trait KotlinMoveTarget {
|
||||||
val packageWrapper: PackageWrapper?
|
val packageWrapper: PackageWrapper?
|
||||||
@@ -45,7 +48,7 @@ public class MoveDestinationKotlinMoveTarget(val moveDestination: MoveDestinatio
|
|||||||
}
|
}
|
||||||
|
|
||||||
public class JetFileKotlinMoveTarget(val targetFile: JetFile): KotlinMoveTarget {
|
public class JetFileKotlinMoveTarget(val targetFile: JetFile): KotlinMoveTarget {
|
||||||
override val packageWrapper: PackageWrapper? = targetFile.getPackageName()?.let { packageName ->
|
override val packageWrapper: PackageWrapper? = targetFile.getPackageFqName().asString().let { packageName ->
|
||||||
PackageWrapper(PsiManager.getInstance(targetFile.getProject()), packageName)
|
PackageWrapper(PsiManager.getInstance(targetFile.getProject()), packageName)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -56,3 +59,19 @@ public class JetFileKotlinMoveTarget(val targetFile: JetFile): KotlinMoveTarget
|
|||||||
// No additional verification is needed
|
// No additional verification is needed
|
||||||
override fun verify(file: PsiFile): String? = null
|
override fun verify(file: PsiFile): String? = null
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public class DeferredJetFileKotlinMoveTarget(
|
||||||
|
project: Project,
|
||||||
|
val packageFqName: FqName,
|
||||||
|
createFile: () -> JetFile?): KotlinMoveTarget {
|
||||||
|
val createdFile: JetFile? by Delegates.lazy(createFile)
|
||||||
|
|
||||||
|
override val packageWrapper: PackageWrapper = PackageWrapper(PsiManager.getInstance(project), packageFqName.asString())
|
||||||
|
|
||||||
|
override fun getOrCreateTargetPsi(originalPsi: PsiElement): PsiElement? = createdFile
|
||||||
|
|
||||||
|
override fun getTargetPsiIfExists(originalPsi: PsiElement): PsiElement? = null
|
||||||
|
|
||||||
|
// No additional verification is needed
|
||||||
|
override fun verify(file: PsiFile): String? = null
|
||||||
|
}
|
||||||
+33
-16
@@ -72,16 +72,32 @@ import org.jetbrains.jet.plugin.refactoring.move.postProcessMoveUsages
|
|||||||
import org.jetbrains.jet.plugin.references.JetSimpleNameReference.ShorteningMode
|
import org.jetbrains.jet.plugin.references.JetSimpleNameReference.ShorteningMode
|
||||||
import org.jetbrains.jet.lang.psi.psiUtil.isAncestor
|
import org.jetbrains.jet.lang.psi.psiUtil.isAncestor
|
||||||
import org.jetbrains.jet.plugin.refactoring.move.MoveRenameUsageInfoForExtension
|
import org.jetbrains.jet.plugin.refactoring.move.MoveRenameUsageInfoForExtension
|
||||||
|
import org.jetbrains.jet.lang.psi.JetDeclaration
|
||||||
|
|
||||||
|
trait Mover: (originalElement: JetNamedDeclaration, targetFile: JetFile) -> JetNamedDeclaration {
|
||||||
|
object Default: Mover {
|
||||||
|
[suppress("PARAMETER_NAME_CHANGED_ON_OVERRIDE")]
|
||||||
|
override fun invoke(originalElement: JetNamedDeclaration, targetFile: JetFile): JetNamedDeclaration {
|
||||||
|
val newElement = targetFile.add(originalElement) as JetNamedDeclaration
|
||||||
|
originalElement.delete()
|
||||||
|
return newElement
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public class MoveKotlinTopLevelDeclarationsOptions(
|
public class MoveKotlinTopLevelDeclarationsOptions(
|
||||||
val elementsToMove: Collection<JetNamedDeclaration>,
|
val elementsToMove: Collection<JetNamedDeclaration>,
|
||||||
val moveTarget: KotlinMoveTarget,
|
val moveTarget: KotlinMoveTarget,
|
||||||
val searchInCommentsAndStrings: Boolean = true,
|
val searchInCommentsAndStrings: Boolean = true,
|
||||||
val searchInNonCode: Boolean = true,
|
val searchInNonCode: Boolean = true,
|
||||||
|
val updateInternalReferences: Boolean = true,
|
||||||
val moveCallback: MoveCallback? = null
|
val moveCallback: MoveCallback? = null
|
||||||
)
|
)
|
||||||
|
|
||||||
public class MoveKotlinTopLevelDeclarationsProcessor(project: Project, val options: MoveKotlinTopLevelDeclarationsOptions) : BaseRefactoringProcessor(project) {
|
public class MoveKotlinTopLevelDeclarationsProcessor(
|
||||||
|
val project: Project,
|
||||||
|
val options: MoveKotlinTopLevelDeclarationsOptions,
|
||||||
|
val mover: Mover = Mover.Default) : BaseRefactoringProcessor(project) {
|
||||||
class object {
|
class object {
|
||||||
private val LOG: Logger = Logger.getInstance(javaClass<MoveKotlinTopLevelDeclarationsProcessor>())
|
private val LOG: Logger = Logger.getInstance(javaClass<MoveKotlinTopLevelDeclarationsProcessor>())
|
||||||
|
|
||||||
@@ -100,7 +116,7 @@ public class MoveKotlinTopLevelDeclarationsProcessor(project: Project, val optio
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun findUsages(): Array<UsageInfo> {
|
public override fun findUsages(): Array<UsageInfo> {
|
||||||
val newPackageName = options.moveTarget.packageWrapper?.getQualifiedName() ?: ""
|
val newPackageName = options.moveTarget.packageWrapper?.getQualifiedName() ?: ""
|
||||||
|
|
||||||
fun collectUsages(): List<UsageInfo> {
|
fun collectUsages(): List<UsageInfo> {
|
||||||
@@ -232,26 +248,23 @@ public class MoveKotlinTopLevelDeclarationsProcessor(project: Project, val optio
|
|||||||
val targetFile =
|
val targetFile =
|
||||||
if (targetPsi is PsiDirectory) {
|
if (targetPsi is PsiDirectory) {
|
||||||
val existingFile = if (targetPsi != file!!.getContainingDirectory()) targetPsi.findFile(file.getName()) else null
|
val existingFile = if (targetPsi != file!!.getContainingDirectory()) targetPsi.findFile(file.getName()) else null
|
||||||
val newFile = existingFile ?: declaration.getFileNameAfterMove()?.let {
|
existingFile ?: declaration.getFileNameAfterMove()?.let {createKotlinFile(it, targetPsi)}
|
||||||
fileName ->
|
|
||||||
createKotlinFile(fileName, targetPsi)
|
|
||||||
}
|
|
||||||
|
|
||||||
newFile
|
|
||||||
}
|
}
|
||||||
else targetPsi
|
else targetPsi
|
||||||
|
|
||||||
assert(targetFile is JetFile, "Couldn't create Koltin file for: ${declaration.javaClass}: ${declaration.getText()}")
|
assert(targetFile is JetFile, "Couldn't create Koltin file for: ${declaration.javaClass}: ${declaration.getText()}")
|
||||||
|
targetFile as JetFile
|
||||||
|
|
||||||
val packageNameInfo = PackageNameInfo(file!!.getPackageFqName(), (targetFile as JetFile).getPackageFqName())
|
if (options.updateInternalReferences) {
|
||||||
val (usagesToProcessLater, usagesToProcessNow) = declaration
|
val packageNameInfo = PackageNameInfo(file!!.getPackageFqName(), targetFile.getPackageFqName())
|
||||||
.getInternalReferencesToUpdateOnPackageNameChange(packageNameInfo)
|
val (usagesToProcessLater, usagesToProcessNow) = declaration
|
||||||
.partition { it is MoveRenameUsageInfoForExtension }
|
.getInternalReferencesToUpdateOnPackageNameChange(packageNameInfo)
|
||||||
postProcessMoveUsages(usagesToProcessNow, shorteningMode = ShorteningMode.NO_SHORTENING)
|
.partition { it is MoveRenameUsageInfoForExtension }
|
||||||
usagesToProcessAfterMove.addAll(usagesToProcessLater)
|
postProcessMoveUsages(usagesToProcessNow, shorteningMode = ShorteningMode.NO_SHORTENING)
|
||||||
|
usagesToProcessAfterMove.addAll(usagesToProcessLater)
|
||||||
|
}
|
||||||
|
|
||||||
val newElement = targetFile.add(declaration) as JetNamedDeclaration
|
val newElement = mover(declaration, targetFile)
|
||||||
declaration.delete()
|
|
||||||
|
|
||||||
newElement.addToShorteningWaitSet()
|
newElement.addToShorteningWaitSet()
|
||||||
|
|
||||||
@@ -294,5 +307,9 @@ public class MoveKotlinTopLevelDeclarationsProcessor(project: Project, val optio
|
|||||||
options.moveCallback?.refactoringCompleted()
|
options.moveCallback?.refactoringCompleted()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fun execute(usages: List<UsageInfo>) {
|
||||||
|
execute(usages.copyToArray())
|
||||||
|
}
|
||||||
|
|
||||||
override fun getCommandName(): String = REFACTORING_NAME
|
override fun getCommandName(): String = REFACTORING_NAME
|
||||||
}
|
}
|
||||||
|
|||||||
+2
-2
@@ -365,9 +365,9 @@ public class MoveKotlinTopLevelDeclarationsDialog extends RefactoringDialog {
|
|||||||
|
|
||||||
try {
|
try {
|
||||||
MoveKotlinTopLevelDeclarationsOptions options = new MoveKotlinTopLevelDeclarationsOptions(
|
MoveKotlinTopLevelDeclarationsOptions options = new MoveKotlinTopLevelDeclarationsOptions(
|
||||||
elementsToMove, target, isSearchInComments(), isSearchInNonJavaFiles(), moveCallback
|
elementsToMove, target, isSearchInComments(), isSearchInNonJavaFiles(), true, moveCallback
|
||||||
);
|
);
|
||||||
invokeRefactoring(new MoveKotlinTopLevelDeclarationsProcessor(myProject, options));
|
invokeRefactoring(new MoveKotlinTopLevelDeclarationsProcessor(myProject, options, Mover.Default.INSTANCE$));
|
||||||
}
|
}
|
||||||
catch (IncorrectOperationException e) {
|
catch (IncorrectOperationException e) {
|
||||||
CommonRefactoringUtil.showErrorMessage(RefactoringBundle.message("error.title"), e.getMessage(), null, myProject);
|
CommonRefactoringUtil.showErrorMessage(RefactoringBundle.message("error.title"), e.getMessage(), null, myProject);
|
||||||
|
|||||||
+8
-3
@@ -1,10 +1,15 @@
|
|||||||
package a
|
package a
|
||||||
|
|
||||||
|
import b.test
|
||||||
|
import b.TEST
|
||||||
import b.Test
|
import b.Test
|
||||||
|
|
||||||
fun bar() {
|
fun bar() {
|
||||||
val t: Test = Test()
|
val t: Test = Test()
|
||||||
b.test()
|
test()
|
||||||
println(b.TEST)
|
t.test()
|
||||||
b.TEST = ""
|
println(TEST)
|
||||||
|
println(t.TEST)
|
||||||
|
TEST = ""
|
||||||
|
t.TEST = ""
|
||||||
}
|
}
|
||||||
|
|||||||
+3
@@ -7,6 +7,9 @@ import b.TEST as _TEST
|
|||||||
fun bar() {
|
fun bar() {
|
||||||
val t: _Test = _Test()
|
val t: _Test = _Test()
|
||||||
_test()
|
_test()
|
||||||
|
t._test()
|
||||||
println(_TEST)
|
println(_TEST)
|
||||||
|
println(t._TEST)
|
||||||
_TEST = ""
|
_TEST = ""
|
||||||
|
t._TEST = ""
|
||||||
}
|
}
|
||||||
|
|||||||
+3
@@ -6,7 +6,10 @@ class J {
|
|||||||
void bar() {
|
void bar() {
|
||||||
Test t = new Test();
|
Test t = new Test();
|
||||||
b.BPackage.test();
|
b.BPackage.test();
|
||||||
|
b.BPackage.test(t);
|
||||||
System.out.println(b.BPackage.getTEST());
|
System.out.println(b.BPackage.getTEST());
|
||||||
|
System.out.println(b.BPackage.getTEST(t));
|
||||||
b.BPackage.setTEST("");
|
b.BPackage.setTEST("");
|
||||||
|
b.BPackage.setTEST(t, "");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+8
-3
@@ -1,10 +1,15 @@
|
|||||||
package a
|
package a
|
||||||
|
|
||||||
|
import b.test
|
||||||
|
import b.TEST
|
||||||
import b.Test
|
import b.Test
|
||||||
|
|
||||||
fun bar() {
|
fun bar() {
|
||||||
val t: Test = Test()
|
val t: Test = Test()
|
||||||
b.test()
|
test()
|
||||||
println(b.TEST)
|
t.test()
|
||||||
b.TEST = ""
|
println(TEST)
|
||||||
|
println(t.TEST)
|
||||||
|
TEST = ""
|
||||||
|
t.TEST = ""
|
||||||
}
|
}
|
||||||
|
|||||||
+3
@@ -6,7 +6,10 @@ class J {
|
|||||||
void bar() {
|
void bar() {
|
||||||
Test t = new Test();
|
Test t = new Test();
|
||||||
b.BPackage.test();
|
b.BPackage.test();
|
||||||
|
b.BPackage.test(t);
|
||||||
System.out.println(b.BPackage.getTEST());
|
System.out.println(b.BPackage.getTEST());
|
||||||
|
System.out.println(b.BPackage.getTEST(t));
|
||||||
b.BPackage.setTEST("");
|
b.BPackage.setTEST("");
|
||||||
|
b.BPackage.setTEST(t, "");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+3
@@ -7,6 +7,9 @@ import b.TEST as _TEST
|
|||||||
fun bar() {
|
fun bar() {
|
||||||
val t: _Test = _Test()
|
val t: _Test = _Test()
|
||||||
_test()
|
_test()
|
||||||
|
t._test()
|
||||||
println(_TEST)
|
println(_TEST)
|
||||||
|
println(t._TEST)
|
||||||
_TEST = ""
|
_TEST = ""
|
||||||
|
t._TEST = ""
|
||||||
}
|
}
|
||||||
|
|||||||
+3
@@ -10,7 +10,10 @@ class J {
|
|||||||
void bar() {
|
void bar() {
|
||||||
Test t = new Test();
|
Test t = new Test();
|
||||||
test();
|
test();
|
||||||
|
test(t);
|
||||||
System.out.println(getTEST());
|
System.out.println(getTEST());
|
||||||
|
System.out.println(getTEST(t));
|
||||||
setTEST("");
|
setTEST("");
|
||||||
|
setTEST(t, "");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+14
@@ -15,6 +15,12 @@ fun test() {
|
|||||||
c.foo()
|
c.foo()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fun Test.test() {
|
||||||
|
a.foo()
|
||||||
|
foo()
|
||||||
|
c.foo()
|
||||||
|
}
|
||||||
|
|
||||||
var TEST: String
|
var TEST: String
|
||||||
get() = a.FOO + FOO + c.FOO
|
get() = a.FOO + FOO + c.FOO
|
||||||
set(value: String) {
|
set(value: String) {
|
||||||
@@ -22,3 +28,11 @@ var TEST: String
|
|||||||
FOO = value
|
FOO = value
|
||||||
c.FOO = value
|
c.FOO = value
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var Test.TEST: String
|
||||||
|
get() = a.FOO + FOO + c.FOO
|
||||||
|
set(value: String) {
|
||||||
|
a.FOO = value
|
||||||
|
FOO = value
|
||||||
|
c.FOO = value
|
||||||
|
}
|
||||||
+3
@@ -6,7 +6,10 @@ class J {
|
|||||||
void bar() {
|
void bar() {
|
||||||
Test t = new Test();
|
Test t = new Test();
|
||||||
b.BPackage.test();
|
b.BPackage.test();
|
||||||
|
b.BPackage.test(t);
|
||||||
System.out.println(b.BPackage.getTEST());
|
System.out.println(b.BPackage.getTEST());
|
||||||
|
System.out.println(b.BPackage.getTEST(t));
|
||||||
b.BPackage.setTEST("");
|
b.BPackage.setTEST("");
|
||||||
|
b.BPackage.setTEST(t, "");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+3
@@ -6,7 +6,10 @@ class J {
|
|||||||
void bar() {
|
void bar() {
|
||||||
Test t = new Test();
|
Test t = new Test();
|
||||||
b.BPackage.test();
|
b.BPackage.test();
|
||||||
|
b.BPackage.test(t);
|
||||||
System.out.println(b.BPackage.getTEST());
|
System.out.println(b.BPackage.getTEST());
|
||||||
|
System.out.println(b.BPackage.getTEST(t));
|
||||||
b.BPackage.setTEST("");
|
b.BPackage.setTEST("");
|
||||||
|
b.BPackage.setTEST(t, "");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+8
-3
@@ -1,11 +1,16 @@
|
|||||||
package c
|
package c
|
||||||
|
|
||||||
import a.*
|
import a.*
|
||||||
|
import b.test
|
||||||
|
import b.TEST
|
||||||
import b.Test
|
import b.Test
|
||||||
|
|
||||||
fun bar() {
|
fun bar() {
|
||||||
val t: Test = Test()
|
val t: Test = Test()
|
||||||
b.test()
|
test()
|
||||||
println(b.TEST)
|
t.test()
|
||||||
b.TEST = ""
|
println(TEST)
|
||||||
|
println(t.TEST)
|
||||||
|
TEST = ""
|
||||||
|
t.TEST = ""
|
||||||
}
|
}
|
||||||
|
|||||||
+3
@@ -6,7 +6,10 @@ class J {
|
|||||||
void bar() {
|
void bar() {
|
||||||
Test t = new Test();
|
Test t = new Test();
|
||||||
b.BPackage.test();
|
b.BPackage.test();
|
||||||
|
b.BPackage.test(t);
|
||||||
System.out.println(b.BPackage.getTEST());
|
System.out.println(b.BPackage.getTEST());
|
||||||
|
System.out.println(b.BPackage.getTEST(t));
|
||||||
b.BPackage.setTEST("");
|
b.BPackage.setTEST("");
|
||||||
|
b.BPackage.setTEST(t, "");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+3
@@ -6,7 +6,10 @@ class J {
|
|||||||
void bar() {
|
void bar() {
|
||||||
Test t = new Test();
|
Test t = new Test();
|
||||||
b.BPackage.test();
|
b.BPackage.test();
|
||||||
|
b.BPackage.test(t);
|
||||||
System.out.println(b.BPackage.getTEST());
|
System.out.println(b.BPackage.getTEST());
|
||||||
|
System.out.println(b.BPackage.getTEST(t));
|
||||||
b.BPackage.setTEST("");
|
b.BPackage.setTEST("");
|
||||||
|
b.BPackage.setTEST(t, "");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+3
@@ -7,6 +7,9 @@ import b.TEST
|
|||||||
fun bar() {
|
fun bar() {
|
||||||
val t: Test = Test()
|
val t: Test = Test()
|
||||||
test()
|
test()
|
||||||
|
t.test()
|
||||||
println(TEST)
|
println(TEST)
|
||||||
|
println(t.TEST)
|
||||||
TEST = ""
|
TEST = ""
|
||||||
|
t.TEST = ""
|
||||||
}
|
}
|
||||||
|
|||||||
+3
@@ -7,6 +7,9 @@ import b.TEST as _TEST
|
|||||||
fun bar() {
|
fun bar() {
|
||||||
val t: _Test = _Test()
|
val t: _Test = _Test()
|
||||||
_test()
|
_test()
|
||||||
|
t._test()
|
||||||
println(_TEST)
|
println(_TEST)
|
||||||
|
println(t._TEST)
|
||||||
_TEST = ""
|
_TEST = ""
|
||||||
|
t._TEST = ""
|
||||||
}
|
}
|
||||||
|
|||||||
+3
@@ -10,7 +10,10 @@ class J {
|
|||||||
void bar() {
|
void bar() {
|
||||||
Test t = new Test();
|
Test t = new Test();
|
||||||
test();
|
test();
|
||||||
|
test(t);
|
||||||
System.out.println(getTEST());
|
System.out.println(getTEST());
|
||||||
|
System.out.println(getTEST(t));
|
||||||
setTEST("");
|
setTEST("");
|
||||||
|
setTEST(t, "");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+3
@@ -3,6 +3,9 @@ package a
|
|||||||
fun bar() {
|
fun bar() {
|
||||||
val t: Test = Test()
|
val t: Test = Test()
|
||||||
test()
|
test()
|
||||||
|
t.test()
|
||||||
println(TEST)
|
println(TEST)
|
||||||
|
println(t.TEST)
|
||||||
TEST = ""
|
TEST = ""
|
||||||
|
t.TEST = ""
|
||||||
}
|
}
|
||||||
|
|||||||
+3
@@ -7,6 +7,9 @@ import a.TEST as _TEST
|
|||||||
fun bar() {
|
fun bar() {
|
||||||
val t: _Test = _Test()
|
val t: _Test = _Test()
|
||||||
_test()
|
_test()
|
||||||
|
t._test()
|
||||||
println(_TEST)
|
println(_TEST)
|
||||||
|
println(t._TEST)
|
||||||
_TEST = ""
|
_TEST = ""
|
||||||
|
t._TEST = ""
|
||||||
}
|
}
|
||||||
|
|||||||
+14
@@ -15,6 +15,12 @@ fun test() {
|
|||||||
c.foo()
|
c.foo()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fun Test.test() {
|
||||||
|
foo()
|
||||||
|
b.foo()
|
||||||
|
c.foo()
|
||||||
|
}
|
||||||
|
|
||||||
var TEST: String
|
var TEST: String
|
||||||
get() = FOO + b.FOO + c.FOO
|
get() = FOO + b.FOO + c.FOO
|
||||||
set(value: String) {
|
set(value: String) {
|
||||||
@@ -22,3 +28,11 @@ var TEST: String
|
|||||||
b.FOO = value
|
b.FOO = value
|
||||||
c.FOO = value
|
c.FOO = value
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var Test.TEST: String
|
||||||
|
get() = FOO + b.FOO + c.FOO
|
||||||
|
set(value: String) {
|
||||||
|
FOO = value
|
||||||
|
b.FOO = value
|
||||||
|
c.FOO = value
|
||||||
|
}
|
||||||
+3
@@ -4,7 +4,10 @@ class J {
|
|||||||
void bar() {
|
void bar() {
|
||||||
Test t = new Test();
|
Test t = new Test();
|
||||||
APackage.test();
|
APackage.test();
|
||||||
|
APackage.test(t);
|
||||||
System.out.println(APackage.getTEST());
|
System.out.println(APackage.getTEST());
|
||||||
|
System.out.println(APackage.getTEST(t));
|
||||||
APackage.setTEST("");
|
APackage.setTEST("");
|
||||||
|
APackage.setTEST(t, "");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+3
@@ -3,6 +3,9 @@ package a
|
|||||||
fun bar() {
|
fun bar() {
|
||||||
val t: Test = Test()
|
val t: Test = Test()
|
||||||
test()
|
test()
|
||||||
|
t.test()
|
||||||
println(TEST)
|
println(TEST)
|
||||||
|
println(t.TEST)
|
||||||
TEST = ""
|
TEST = ""
|
||||||
|
t.TEST = ""
|
||||||
}
|
}
|
||||||
|
|||||||
+3
@@ -6,7 +6,10 @@ class J {
|
|||||||
void bar() {
|
void bar() {
|
||||||
Test t = new Test();
|
Test t = new Test();
|
||||||
test();
|
test();
|
||||||
|
test(t);
|
||||||
System.out.println(getTEST());
|
System.out.println(getTEST());
|
||||||
|
System.out.println(getTEST(t));
|
||||||
setTEST("");
|
setTEST("");
|
||||||
|
setTEST(t, "");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+3
@@ -7,6 +7,9 @@ import a.TEST as _TEST
|
|||||||
fun bar() {
|
fun bar() {
|
||||||
val t: _Test = _Test()
|
val t: _Test = _Test()
|
||||||
_test()
|
_test()
|
||||||
|
t._test()
|
||||||
println(_TEST)
|
println(_TEST)
|
||||||
|
println(t._TEST)
|
||||||
_TEST = ""
|
_TEST = ""
|
||||||
|
t._TEST = ""
|
||||||
}
|
}
|
||||||
|
|||||||
+3
@@ -8,7 +8,10 @@ class J {
|
|||||||
void bar() {
|
void bar() {
|
||||||
Test t = new Test();
|
Test t = new Test();
|
||||||
test();
|
test();
|
||||||
|
test(t);
|
||||||
System.out.println(getTEST());
|
System.out.println(getTEST());
|
||||||
|
System.out.println(getTEST(t));
|
||||||
setTEST("");
|
setTEST("");
|
||||||
|
setTEST(t, "");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+3
@@ -4,7 +4,10 @@ class J {
|
|||||||
void bar() {
|
void bar() {
|
||||||
a.Test t = new a.Test();
|
a.Test t = new a.Test();
|
||||||
a.APackage.test();
|
a.APackage.test();
|
||||||
|
a.APackage.test(t);
|
||||||
System.out.println(a.APackage.getTEST());
|
System.out.println(a.APackage.getTEST());
|
||||||
|
System.out.println(a.APackage.getTEST(t));
|
||||||
a.APackage.setTEST("");
|
a.APackage.setTEST("");
|
||||||
|
a.APackage.setTEST(t, "");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+3
@@ -6,7 +6,10 @@ class J {
|
|||||||
void bar() {
|
void bar() {
|
||||||
Test t = new Test();
|
Test t = new Test();
|
||||||
APackage.test();
|
APackage.test();
|
||||||
|
APackage.test(t);
|
||||||
System.out.println(APackage.getTEST());
|
System.out.println(APackage.getTEST());
|
||||||
|
System.out.println(APackage.getTEST(t));
|
||||||
APackage.setTEST("");
|
APackage.setTEST("");
|
||||||
|
APackage.setTEST(t, "");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+3
@@ -5,6 +5,9 @@ import a.*
|
|||||||
fun bar() {
|
fun bar() {
|
||||||
val t: Test = Test()
|
val t: Test = Test()
|
||||||
test()
|
test()
|
||||||
|
t.test()
|
||||||
println(TEST)
|
println(TEST)
|
||||||
|
println(t.TEST)
|
||||||
TEST = ""
|
TEST = ""
|
||||||
|
t.TEST = ""
|
||||||
}
|
}
|
||||||
|
|||||||
+3
@@ -6,7 +6,10 @@ class J {
|
|||||||
void bar() {
|
void bar() {
|
||||||
a.Test t = new a.Test();
|
a.Test t = new a.Test();
|
||||||
test();
|
test();
|
||||||
|
test(t);
|
||||||
System.out.println(getTEST());
|
System.out.println(getTEST());
|
||||||
|
System.out.println(getTEST(t));
|
||||||
setTEST("");
|
setTEST("");
|
||||||
|
setTEST(t, "");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+3
@@ -7,7 +7,10 @@ class J {
|
|||||||
void bar() {
|
void bar() {
|
||||||
Test t = new Test();
|
Test t = new Test();
|
||||||
APackage.test();
|
APackage.test();
|
||||||
|
APackage.test(t);
|
||||||
System.out.println(APackage.getTEST());
|
System.out.println(APackage.getTEST());
|
||||||
|
System.out.println(APackage.getTEST(t));
|
||||||
APackage.setTEST("");
|
APackage.setTEST("");
|
||||||
|
APackage.setTEST(t, "");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+3
@@ -7,6 +7,9 @@ import a.TEST
|
|||||||
fun bar() {
|
fun bar() {
|
||||||
val t: Test = Test()
|
val t: Test = Test()
|
||||||
test()
|
test()
|
||||||
|
t.test()
|
||||||
println(TEST)
|
println(TEST)
|
||||||
|
println(t.TEST)
|
||||||
TEST = ""
|
TEST = ""
|
||||||
|
t.TEST = ""
|
||||||
}
|
}
|
||||||
|
|||||||
+3
@@ -7,6 +7,9 @@ import a.TEST as _TEST
|
|||||||
fun bar() {
|
fun bar() {
|
||||||
val t: _Test = _Test()
|
val t: _Test = _Test()
|
||||||
_test()
|
_test()
|
||||||
|
t._test()
|
||||||
println(_TEST)
|
println(_TEST)
|
||||||
|
println(t._TEST)
|
||||||
_TEST = ""
|
_TEST = ""
|
||||||
|
t._TEST = ""
|
||||||
}
|
}
|
||||||
|
|||||||
+3
@@ -8,7 +8,10 @@ class J {
|
|||||||
void bar() {
|
void bar() {
|
||||||
a.Test t = new a.Test();
|
a.Test t = new a.Test();
|
||||||
test();
|
test();
|
||||||
|
test(t);
|
||||||
System.out.println(getTEST());
|
System.out.println(getTEST());
|
||||||
|
System.out.println(getTEST(t));
|
||||||
setTEST("");
|
setTEST("");
|
||||||
|
setTEST(t, "");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user