File Move: Fix update of extension references. Reuse MoveKotlinTopLevelDeclarationsProcessor

This commit is contained in:
Alexey Sedunov
2014-10-09 15:21:50 +04:00
parent dc62d167ad
commit ff082be524
38 changed files with 271 additions and 160 deletions
@@ -21,4 +21,8 @@
<item name='com.intellij.refactoring.move.moveFilesOrDirectories.MoveFileHandler void updateMovedFile(com.intellij.psi.PsiFile) 0'>
<annotation name='org.jetbrains.annotations.NotNull'/>
</item>
<item
name='com.intellij.refactoring.move.moveFilesOrDirectories.MoveFileHandler$1 void retargetUsages(java.util.List&lt;com.intellij.usageView.UsageInfo&gt;, java.util.Map&lt;com.intellij.psi.PsiElement,com.intellij.psi.PsiElement&gt;) 0'>
<annotation name='org.jetbrains.annotations.NotNull'/>
</item>
</root>
@@ -29,6 +29,9 @@ import com.intellij.psi.SmartPointerManager
import org.jetbrains.jet.lang.psi.JetElement
import org.jetbrains.jet.lang.psi.JetQualifiedExpression
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> {
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? {
if (usages != null && usages.isNotEmpty()) {
val project = usages[0].getProject()
val elementsToShorten = project.getElementsToShorten(false)
if (elementsToShorten != null && !elementsToShorten.isEmpty()) {
val elementsToShorten = project.elementsToShorten
if (project.ensureElementsToShortenIsEmptyBeforeRefactoring && elementsToShorten != null && !elementsToShorten.isEmpty()) {
LOG.warn("Waiting set for reference shortening is not empty")
project.clearElementsToShorten()
project.elementsToShorten = null
}
}
return null
@@ -47,32 +50,36 @@ public class KotlinShortenReferencesRefactoringHelper: RefactoringHelper<Any> {
override fun performOperation(project: Project, operationData: Any?) {
ApplicationManager.getApplication()!!.runWriteAction {
project.getElementsToShorten(false)?.let { bindRequests ->
project.clearElementsToShorten()
project.elementsToShorten?.let { bindRequests ->
project.elementsToShorten = null
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)
if (createIfNeeded && elementsToShorten == null) {
elementsToShorten = HashSet()
putUserData(ELEMENTS_TO_SHORTEN_KEY, elementsToShorten)
/*
* When one refactoring invokes another this value must be set to false so that shortening wait-set is not cleared
* and previously collected references are processed correctly. Afterwards it must be reset to original value
*/
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 elementsToShorten
}
private fun Project.clearElementsToShorten() {
putUserData(ELEMENTS_TO_SHORTEN_KEY, null)
}
return elements!!
}
public fun JetElement.addToShorteningWaitSet() {
assert (ApplicationManager.getApplication()!!.isWriteAccessAllowed(), "Write access needed")
val project = getProject()
project.getElementsToShorten(true)!!.add(SmartPointerManager.getInstance(project).createSmartPsiElementPointer(this))
project.getOrCreateElementsToShorten().add(SmartPointerManager.getInstance(project).createSmartPsiElementPointer(this))
}
@@ -24,59 +24,27 @@ import com.intellij.usageView.UsageInfo
import com.intellij.openapi.roots.JavaProjectRootsUtil
import com.intellij.psi.PsiCompiledElement
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 com.intellij.openapi.util.text.StringUtil
import com.intellij.psi.PsiReference
import org.jetbrains.jet.lang.resolve.name.FqName
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.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.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.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() {
class object {
private val LOG = Logger.getInstance(javaClass<MoveKotlinFileHandler>())
private var packageNameInfo: PackageNameInfo? = null
private var declarationMoveProcessor: MoveKotlinTopLevelDeclarationsProcessor? = null
class MoveRenameKotlinUsageInfo(
reference: JetSimpleNameReference,
range: TextRange,
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 clearState() {
packageNameInfo = null
declarationMoveProcessor = null
}
private fun JetFile.packageMatchesDirectory(): Boolean {
@@ -88,95 +56,52 @@ public class MoveKotlinFileHandler : MoveFileHandler() {
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(
psiFile: PsiFile,
newParent: PsiDirectory,
searchInComments: Boolean,
searchInNonJavaFiles: Boolean
): List<UsageInfo>? {
clearState()
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 newPackageName = newParent.getPackage()?.getQualifiedName() ?: ""
val searchScope = project.projectScope() - psiFile.fileScope()
return psiFile.getDeclarations().flatMap { declaration ->
val name = (declaration as? JetNamedDeclaration)?.getName()
if (name != null) {
val newFqName = StringUtil.getQualifiedName(newPackageName, name)!!
val results = ReferencesSearch.search(declaration, searchScope, false)
.toSet()
.mapTo(ArrayList<UsageInfo?>()) { ref ->
val range = ref.getRangeInElement()!!
when (ref) {
is JetSimpleNameReference ->
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)
val declarationMoveProcessor = MoveKotlinTopLevelDeclarationsProcessor(
project,
MoveKotlinTopLevelDeclarationsOptions(
elementsToMove = psiFile.getDeclarations().filterIsInstance(javaClass<JetNamedDeclaration>()),
moveTarget = DeferredJetFileKotlinMoveTarget(project, packageNameInfo.newPackageName) {
MoveFilesOrDirectoriesUtil.doMoveFile(psiFile, newParent)
newParent.findFile(psiFile.getName()) as? JetFile
},
updateInternalReferences = false
),
object: Mover {
[suppress("PARAMETER_NAME_CHANGED_ON_OVERRIDE")]
override fun invoke(originalElement: JetNamedDeclaration, targetFile: JetFile): JetNamedDeclaration = originalElement
}
else null
}
}
}
.filterNotNull()
if (declaration is JetClassOrObject) {
declaration.descriptor?.let { DescriptorUtils.getFqName(it).asString() }?.let { stringToSearch ->
TextOccurrencesUtil.findNonCodeUsages(
declaration, stringToSearch, searchInComments, searchInNonJavaFiles, newFqName, results
)
}
this.packageNameInfo = packageNameInfo
this.declarationMoveProcessor = declarationMoveProcessor
return declarationMoveProcessor.findUsages().toList()
}
results
}
else Collections.emptyList<UsageInfo>()
}
}
override fun prepareMovedFile(file: PsiFile, moveDestination: PsiDirectory, oldToNewMap: Map<PsiElement, PsiElement>) {
override fun retargetUsages(usageInfos: List<UsageInfo>?, 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) {
if (file !is JetFile) return
val packageNameInfo = file.getAndRemoveCopyableUserData(PACKAGE_NAME_INFO_KEY)
val packageNameInfo = packageNameInfo
if (packageNameInfo == null) return
val usages = file.getInternalReferencesToUpdateOnPackageNameChange(packageNameInfo)
@@ -185,4 +110,19 @@ public class MoveKotlinFileHandler : MoveFileHandler() {
val packageRef = file.getPackageDirective()?.getLastReferenceExpression()?.getReference() as? JetSimpleNameReference
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()
}
}
}
@@ -22,6 +22,9 @@ import org.jetbrains.jet.lang.psi.JetFile
import com.intellij.psi.PsiElement
import com.intellij.psi.PsiFile
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 {
val packageWrapper: PackageWrapper?
@@ -45,7 +48,7 @@ public class MoveDestinationKotlinMoveTarget(val moveDestination: MoveDestinatio
}
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)
}
@@ -56,3 +59,19 @@ public class JetFileKotlinMoveTarget(val targetFile: JetFile): KotlinMoveTarget
// No additional verification is needed
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
}
@@ -72,16 +72,32 @@ import org.jetbrains.jet.plugin.refactoring.move.postProcessMoveUsages
import org.jetbrains.jet.plugin.references.JetSimpleNameReference.ShorteningMode
import org.jetbrains.jet.lang.psi.psiUtil.isAncestor
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(
val elementsToMove: Collection<JetNamedDeclaration>,
val moveTarget: KotlinMoveTarget,
val searchInCommentsAndStrings: Boolean = true,
val searchInNonCode: Boolean = true,
val updateInternalReferences: Boolean = true,
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 {
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() ?: ""
fun collectUsages(): List<UsageInfo> {
@@ -232,26 +248,23 @@ public class MoveKotlinTopLevelDeclarationsProcessor(project: Project, val optio
val targetFile =
if (targetPsi is PsiDirectory) {
val existingFile = if (targetPsi != file!!.getContainingDirectory()) targetPsi.findFile(file.getName()) else null
val newFile = existingFile ?: declaration.getFileNameAfterMove()?.let {
fileName ->
createKotlinFile(fileName, targetPsi)
}
newFile
existingFile ?: declaration.getFileNameAfterMove()?.let {createKotlinFile(it, targetPsi)}
}
else targetPsi
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 packageNameInfo = PackageNameInfo(file!!.getPackageFqName(), targetFile.getPackageFqName())
val (usagesToProcessLater, usagesToProcessNow) = declaration
.getInternalReferencesToUpdateOnPackageNameChange(packageNameInfo)
.partition { it is MoveRenameUsageInfoForExtension }
postProcessMoveUsages(usagesToProcessNow, shorteningMode = ShorteningMode.NO_SHORTENING)
usagesToProcessAfterMove.addAll(usagesToProcessLater)
}
val newElement = targetFile.add(declaration) as JetNamedDeclaration
declaration.delete()
val newElement = mover(declaration, targetFile)
newElement.addToShorteningWaitSet()
@@ -294,5 +307,9 @@ public class MoveKotlinTopLevelDeclarationsProcessor(project: Project, val optio
options.moveCallback?.refactoringCompleted()
}
fun execute(usages: List<UsageInfo>) {
execute(usages.copyToArray())
}
override fun getCommandName(): String = REFACTORING_NAME
}
@@ -365,9 +365,9 @@ public class MoveKotlinTopLevelDeclarationsDialog extends RefactoringDialog {
try {
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) {
CommonRefactoringUtil.showErrorMessage(RefactoringBundle.message("error.title"), e.getMessage(), null, myProject);
@@ -1,10 +1,15 @@
package a
import b.test
import b.TEST
import b.Test
fun bar() {
val t: Test = Test()
b.test()
println(b.TEST)
b.TEST = ""
test()
t.test()
println(TEST)
println(t.TEST)
TEST = ""
t.TEST = ""
}
@@ -7,6 +7,9 @@ import b.TEST as _TEST
fun bar() {
val t: _Test = _Test()
_test()
t._test()
println(_TEST)
println(t._TEST)
_TEST = ""
t._TEST = ""
}
@@ -6,7 +6,10 @@ class J {
void bar() {
Test t = new Test();
b.BPackage.test();
b.BPackage.test(t);
System.out.println(b.BPackage.getTEST());
System.out.println(b.BPackage.getTEST(t));
b.BPackage.setTEST("");
b.BPackage.setTEST(t, "");
}
}
@@ -1,10 +1,15 @@
package a
import b.test
import b.TEST
import b.Test
fun bar() {
val t: Test = Test()
b.test()
println(b.TEST)
b.TEST = ""
test()
t.test()
println(TEST)
println(t.TEST)
TEST = ""
t.TEST = ""
}
@@ -6,7 +6,10 @@ class J {
void bar() {
Test t = new Test();
b.BPackage.test();
b.BPackage.test(t);
System.out.println(b.BPackage.getTEST());
System.out.println(b.BPackage.getTEST(t));
b.BPackage.setTEST("");
b.BPackage.setTEST(t, "");
}
}
@@ -7,6 +7,9 @@ import b.TEST as _TEST
fun bar() {
val t: _Test = _Test()
_test()
t._test()
println(_TEST)
println(t._TEST)
_TEST = ""
t._TEST = ""
}
@@ -10,7 +10,10 @@ class J {
void bar() {
Test t = new Test();
test();
test(t);
System.out.println(getTEST());
System.out.println(getTEST(t));
setTEST("");
setTEST(t, "");
}
}
@@ -15,6 +15,12 @@ fun test() {
c.foo()
}
fun Test.test() {
a.foo()
foo()
c.foo()
}
var TEST: String
get() = a.FOO + FOO + c.FOO
set(value: String) {
@@ -22,3 +28,11 @@ var TEST: String
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
}
@@ -6,7 +6,10 @@ class J {
void bar() {
Test t = new Test();
b.BPackage.test();
b.BPackage.test(t);
System.out.println(b.BPackage.getTEST());
System.out.println(b.BPackage.getTEST(t));
b.BPackage.setTEST("");
b.BPackage.setTEST(t, "");
}
}
@@ -6,7 +6,10 @@ class J {
void bar() {
Test t = new Test();
b.BPackage.test();
b.BPackage.test(t);
System.out.println(b.BPackage.getTEST());
System.out.println(b.BPackage.getTEST(t));
b.BPackage.setTEST("");
b.BPackage.setTEST(t, "");
}
}
@@ -1,11 +1,16 @@
package c
import a.*
import b.test
import b.TEST
import b.Test
fun bar() {
val t: Test = Test()
b.test()
println(b.TEST)
b.TEST = ""
test()
t.test()
println(TEST)
println(t.TEST)
TEST = ""
t.TEST = ""
}
@@ -6,7 +6,10 @@ class J {
void bar() {
Test t = new Test();
b.BPackage.test();
b.BPackage.test(t);
System.out.println(b.BPackage.getTEST());
System.out.println(b.BPackage.getTEST(t));
b.BPackage.setTEST("");
b.BPackage.setTEST(t, "");
}
}
@@ -6,7 +6,10 @@ class J {
void bar() {
Test t = new Test();
b.BPackage.test();
b.BPackage.test(t);
System.out.println(b.BPackage.getTEST());
System.out.println(b.BPackage.getTEST(t));
b.BPackage.setTEST("");
b.BPackage.setTEST(t, "");
}
}
@@ -7,6 +7,9 @@ import b.TEST
fun bar() {
val t: Test = Test()
test()
t.test()
println(TEST)
println(t.TEST)
TEST = ""
t.TEST = ""
}
@@ -7,6 +7,9 @@ import b.TEST as _TEST
fun bar() {
val t: _Test = _Test()
_test()
t._test()
println(_TEST)
println(t._TEST)
_TEST = ""
t._TEST = ""
}
@@ -10,7 +10,10 @@ class J {
void bar() {
Test t = new Test();
test();
test(t);
System.out.println(getTEST());
System.out.println(getTEST(t));
setTEST("");
setTEST(t, "");
}
}
@@ -3,6 +3,9 @@ package a
fun bar() {
val t: Test = Test()
test()
t.test()
println(TEST)
println(t.TEST)
TEST = ""
t.TEST = ""
}
@@ -7,6 +7,9 @@ import a.TEST as _TEST
fun bar() {
val t: _Test = _Test()
_test()
t._test()
println(_TEST)
println(t._TEST)
_TEST = ""
t._TEST = ""
}
@@ -15,6 +15,12 @@ fun test() {
c.foo()
}
fun Test.test() {
foo()
b.foo()
c.foo()
}
var TEST: String
get() = FOO + b.FOO + c.FOO
set(value: String) {
@@ -22,3 +28,11 @@ var TEST: String
b.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
}
@@ -4,7 +4,10 @@ class J {
void bar() {
Test t = new Test();
APackage.test();
APackage.test(t);
System.out.println(APackage.getTEST());
System.out.println(APackage.getTEST(t));
APackage.setTEST("");
APackage.setTEST(t, "");
}
}
@@ -3,6 +3,9 @@ package a
fun bar() {
val t: Test = Test()
test()
t.test()
println(TEST)
println(t.TEST)
TEST = ""
t.TEST = ""
}
@@ -6,7 +6,10 @@ class J {
void bar() {
Test t = new Test();
test();
test(t);
System.out.println(getTEST());
System.out.println(getTEST(t));
setTEST("");
setTEST(t, "");
}
}
@@ -7,6 +7,9 @@ import a.TEST as _TEST
fun bar() {
val t: _Test = _Test()
_test()
t._test()
println(_TEST)
println(t._TEST)
_TEST = ""
t._TEST = ""
}
@@ -8,7 +8,10 @@ class J {
void bar() {
Test t = new Test();
test();
test(t);
System.out.println(getTEST());
System.out.println(getTEST(t));
setTEST("");
setTEST(t, "");
}
}
@@ -4,7 +4,10 @@ class J {
void bar() {
a.Test t = new a.Test();
a.APackage.test();
a.APackage.test(t);
System.out.println(a.APackage.getTEST());
System.out.println(a.APackage.getTEST(t));
a.APackage.setTEST("");
a.APackage.setTEST(t, "");
}
}
@@ -6,7 +6,10 @@ class J {
void bar() {
Test t = new Test();
APackage.test();
APackage.test(t);
System.out.println(APackage.getTEST());
System.out.println(APackage.getTEST(t));
APackage.setTEST("");
APackage.setTEST(t, "");
}
}
@@ -5,6 +5,9 @@ import a.*
fun bar() {
val t: Test = Test()
test()
t.test()
println(TEST)
println(t.TEST)
TEST = ""
t.TEST = ""
}
@@ -6,7 +6,10 @@ class J {
void bar() {
a.Test t = new a.Test();
test();
test(t);
System.out.println(getTEST());
System.out.println(getTEST(t));
setTEST("");
setTEST(t, "");
}
}
@@ -7,7 +7,10 @@ class J {
void bar() {
Test t = new Test();
APackage.test();
APackage.test(t);
System.out.println(APackage.getTEST());
System.out.println(APackage.getTEST(t));
APackage.setTEST("");
APackage.setTEST(t, "");
}
}
@@ -7,6 +7,9 @@ import a.TEST
fun bar() {
val t: Test = Test()
test()
t.test()
println(TEST)
println(t.TEST)
TEST = ""
t.TEST = ""
}
@@ -7,6 +7,9 @@ import a.TEST as _TEST
fun bar() {
val t: _Test = _Test()
_test()
t._test()
println(_TEST)
println(t._TEST)
_TEST = ""
t._TEST = ""
}
@@ -8,7 +8,10 @@ class J {
void bar() {
a.Test t = new a.Test();
test();
test(t);
System.out.println(getTEST());
System.out.println(getTEST(t));
setTEST("");
setTEST(t, "");
}
}