From 539aed32d2381bc75b44c7bae1c014ef60be9ab6 Mon Sep 17 00:00:00 2001 From: Jonathan Leitschuh Date: Thu, 21 Sep 2017 05:20:49 -0400 Subject: [PATCH 001/212] Improve information regarding running tests that load resources (#1298) * Improve information regarding running tests that load resources Figuring out how to run isolated generated tests is not imidiately straightforward. This clears up confusion by throwing a more helpful error in the tests and adding a section to the ReadMe. * Cleanup ReadMe and comments after review feedback --- ReadMe.md | 5 +++++ .../jetbrains/kotlin/test/KotlinTestUtils.java | 17 ++++++++++++++++- 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/ReadMe.md b/ReadMe.md index 08d1c6d58a0..6bc7e7d5305 100644 --- a/ReadMe.md +++ b/ReadMe.md @@ -127,6 +127,11 @@ Also the [JavaScript translation](https://github.com/JetBrains/kotlin/blob/maste Some of the code in the standard library is created by generating code from templates. See the [README](libraries/stdlib/ReadMe.md) in the stdlib section for how run the code generator. The existing templates can be used as examples for creating new ones. +### Running specific generated tests + +If you need to debug a specific generated test, ensure that you have the `Working directory` in your IntelliJ run configuration set +to the root directory of this project. If you don't, every test you try to run will fail with a `No such file or directory` exception. + ## Submitting patches The best way to submit a patch is to [fork the project on github](https://help.github.com/articles/fork-a-repo/) then send us a diff --git a/compiler/tests-common/org/jetbrains/kotlin/test/KotlinTestUtils.java b/compiler/tests-common/org/jetbrains/kotlin/test/KotlinTestUtils.java index 00164f1d785..324f4a42ad5 100644 --- a/compiler/tests-common/org/jetbrains/kotlin/test/KotlinTestUtils.java +++ b/compiler/tests-common/org/jetbrains/kotlin/test/KotlinTestUtils.java @@ -90,6 +90,7 @@ import org.junit.Assert; import javax.tools.*; import java.io.File; +import java.io.FileNotFoundException; import java.io.IOException; import java.io.StringWriter; import java.lang.reflect.Method; @@ -438,7 +439,21 @@ public class KotlinTestUtils { } public static String doLoadFile(@NotNull File file) throws IOException { - return FileUtil.loadFile(file, CharsetToolkit.UTF8, true); + try { + return FileUtil.loadFile(file, CharsetToolkit.UTF8, true); + } + catch (FileNotFoundException fileNotFoundException) { + /* + * Unfortunately, the FileNotFoundException will only show the relative path in it's exception message. + * This clarifies the exception by showing the full path. + */ + String messageWithFullPath = file.getAbsolutePath() + " (No such file or directory)"; + throw new IOException( + "Ensure you have your 'Working Directory' configured correctly as the root " + + "Kotlin project directory in your test configuration\n\t" + + messageWithFullPath, + fileNotFoundException); + } } public static String getFilePath(File file) { From 658ffa6c49591a8e8151f9de8d2964514b59b5df Mon Sep 17 00:00:00 2001 From: Mikhail Glukhikh Date: Thu, 21 Sep 2017 16:09:57 +0300 Subject: [PATCH 002/212] Add deprecated modifier to cleanup diagnostic list --- .../kotlin/idea/inspections/KotlinCleanupInspection.kt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/idea/src/org/jetbrains/kotlin/idea/inspections/KotlinCleanupInspection.kt b/idea/src/org/jetbrains/kotlin/idea/inspections/KotlinCleanupInspection.kt index 93bb5f02bca..7b869617b0d 100644 --- a/idea/src/org/jetbrains/kotlin/idea/inspections/KotlinCleanupInspection.kt +++ b/idea/src/org/jetbrains/kotlin/idea/inspections/KotlinCleanupInspection.kt @@ -99,7 +99,8 @@ class KotlinCleanupInspection : LocalInspectionTool(), CleanupLocalInspectionToo Errors.COMMA_IN_WHEN_CONDITION_WITHOUT_ARGUMENT, ErrorsJs.WRONG_EXTERNAL_DECLARATION, Errors.YIELD_IS_RESERVED, - Errors.DEPRECATED_MODIFIER_FOR_TARGET + Errors.DEPRECATED_MODIFIER_FOR_TARGET, + Errors.DEPRECATED_MODIFIER ) private fun Diagnostic.isObsoleteLabel(): Boolean { From ab25beeb370563f0eb87527d47be24d3be7e043e Mon Sep 17 00:00:00 2001 From: Dmitry Jemerov Date: Thu, 21 Sep 2017 15:16:45 +0200 Subject: [PATCH 003/212] Fix exception in KotlinExpandNodeProjectViewProvider.modify --- .../jetbrains/kotlin/idea/projectView/projectViewProviders.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/idea/src/org/jetbrains/kotlin/idea/projectView/projectViewProviders.kt b/idea/src/org/jetbrains/kotlin/idea/projectView/projectViewProviders.kt index 0f1eb97abdc..3dae6753b99 100644 --- a/idea/src/org/jetbrains/kotlin/idea/projectView/projectViewProviders.kt +++ b/idea/src/org/jetbrains/kotlin/idea/projectView/projectViewProviders.kt @@ -46,7 +46,7 @@ class KotlinExpandNodeProjectViewProvider : TreeStructureProvider, DumbAware { val result = ArrayList>() for (child in children) { - val childValue = child.value.asKtFile() + val childValue = child.value?.asKtFile() if (childValue != null) { val declarations = childValue.declarations From 0b7055f7c0590fe94eea76b5de9b5c387da1f9b8 Mon Sep 17 00:00:00 2001 From: Toshiaki Kameyama Date: Thu, 21 Sep 2017 23:15:44 +0900 Subject: [PATCH 004/212] Join lines could "convert to expression body" #KT-15769 Fixed (#1304) --- .../JoinBlockIntoSingleStatementHandler.kt | 18 +++++++++++++++--- .../removeBraces/FunctionWithOneLineReturn.kt | 3 +++ .../FunctionWithOneLineReturn.kt.after | 1 + .../declarations/JoinLinesTestGenerated.java | 6 ++++++ 4 files changed, 25 insertions(+), 3 deletions(-) create mode 100644 idea/testData/joinLines/removeBraces/FunctionWithOneLineReturn.kt create mode 100644 idea/testData/joinLines/removeBraces/FunctionWithOneLineReturn.kt.after diff --git a/idea/src/org/jetbrains/kotlin/idea/joinLines/JoinBlockIntoSingleStatementHandler.kt b/idea/src/org/jetbrains/kotlin/idea/joinLines/JoinBlockIntoSingleStatementHandler.kt index e8028632a6d..7ac894cf4ee 100644 --- a/idea/src/org/jetbrains/kotlin/idea/joinLines/JoinBlockIntoSingleStatementHandler.kt +++ b/idea/src/org/jetbrains/kotlin/idea/joinLines/JoinBlockIntoSingleStatementHandler.kt @@ -19,9 +19,11 @@ package org.jetbrains.kotlin.idea.joinLines import com.intellij.codeInsight.editorActions.JoinRawLinesHandlerDelegate import com.intellij.openapi.editor.Document import com.intellij.psi.PsiFile +import org.jetbrains.kotlin.idea.inspections.UseExpressionBodyInspection import org.jetbrains.kotlin.idea.intentions.MergeIfsIntention import org.jetbrains.kotlin.lexer.KtTokens import org.jetbrains.kotlin.psi.* +import org.jetbrains.kotlin.psi.psiUtil.startOffset class JoinBlockIntoSingleStatementHandler : JoinRawLinesHandlerDelegate { override fun tryJoinRawLines(document: Document, file: PsiFile, start: Int, end: Int): Int { @@ -36,8 +38,12 @@ class JoinBlockIntoSingleStatementHandler : JoinRawLinesHandlerDelegate { val block = brace.parent as? KtBlockExpression ?: return -1 val statement = block.statements.singleOrNull() ?: return -1 + val parent = block.parent - if (parent !is KtContainerNode && parent !is KtWhenEntry) return -1 + val useExpressionBodyInspection = UseExpressionBodyInspection(convertEmptyToUnit = false) + val oneLineReturnFunction = (parent as? KtDeclarationWithBody)?.takeIf { useExpressionBodyInspection.isActiveFor(it) } + if (parent !is KtContainerNode && parent !is KtWhenEntry && oneLineReturnFunction == null) return -1 + if (block.node.getChildren(KtTokens.COMMENTS).isNotEmpty()) return -1 // otherwise we will loose comments // handle nested if's @@ -61,8 +67,14 @@ class JoinBlockIntoSingleStatementHandler : JoinRawLinesHandlerDelegate { } } - val newStatement = block.replace(statement) - return newStatement.textRange!!.startOffset + return if (oneLineReturnFunction != null) { + useExpressionBodyInspection.simplify(oneLineReturnFunction, false) + oneLineReturnFunction.bodyExpression!!.startOffset + } + else { + val newStatement = block.replace(statement) + newStatement.textRange!!.startOffset + } } override fun tryJoinLines(document: Document, file: PsiFile, start: Int, end: Int) = -1 diff --git a/idea/testData/joinLines/removeBraces/FunctionWithOneLineReturn.kt b/idea/testData/joinLines/removeBraces/FunctionWithOneLineReturn.kt new file mode 100644 index 00000000000..b2c88f61b4e --- /dev/null +++ b/idea/testData/joinLines/removeBraces/FunctionWithOneLineReturn.kt @@ -0,0 +1,3 @@ +fun foo(): Int { + return 1 +} diff --git a/idea/testData/joinLines/removeBraces/FunctionWithOneLineReturn.kt.after b/idea/testData/joinLines/removeBraces/FunctionWithOneLineReturn.kt.after new file mode 100644 index 00000000000..a4647ee6f2d --- /dev/null +++ b/idea/testData/joinLines/removeBraces/FunctionWithOneLineReturn.kt.after @@ -0,0 +1 @@ +fun foo(): Int = 1 \ No newline at end of file diff --git a/idea/tests/org/jetbrains/kotlin/idea/intentions/declarations/JoinLinesTestGenerated.java b/idea/tests/org/jetbrains/kotlin/idea/intentions/declarations/JoinLinesTestGenerated.java index d6cb192178d..d17ebbc20a1 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/intentions/declarations/JoinLinesTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/intentions/declarations/JoinLinesTestGenerated.java @@ -359,6 +359,12 @@ public class JoinLinesTestGenerated extends AbstractJoinLinesTest { doTest(fileName); } + @TestMetadata("FunctionWithOneLineReturn.kt") + public void testFunctionWithOneLineReturn() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/joinLines/removeBraces/FunctionWithOneLineReturn.kt"); + doTest(fileName); + } + @TestMetadata("If.kt") public void testIf() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("idea/testData/joinLines/removeBraces/If.kt"); From 459d4f3ee97f9534518913a56180b5a2da2001a4 Mon Sep 17 00:00:00 2001 From: Dmitry Jemerov Date: Wed, 20 Sep 2017 14:28:40 +0200 Subject: [PATCH 005/212] Fix EAP detection regexp for double-digit patch releases #KT-20331 Fixed --- .../kotlin/idea/configuration/ConfigureKotlinInProjectUtils.kt | 2 +- .../kotlin/idea/configuration/ConfigureKotlinUtilTest.kt | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/idea/src/org/jetbrains/kotlin/idea/configuration/ConfigureKotlinInProjectUtils.kt b/idea/src/org/jetbrains/kotlin/idea/configuration/ConfigureKotlinInProjectUtils.kt index 6050707fbec..55499786449 100644 --- a/idea/src/org/jetbrains/kotlin/idea/configuration/ConfigureKotlinInProjectUtils.kt +++ b/idea/src/org/jetbrains/kotlin/idea/configuration/ConfigureKotlinInProjectUtils.kt @@ -253,7 +253,7 @@ fun isEap(version: String): Boolean { } fun useEapRepository(minorKotlinVersion: Int, version: String): Boolean { - return Regex("1\\.$minorKotlinVersion(\\.\\d)?-[A-Za-z][A-Za-z0-9-]*").matches(version) && + return Regex("1\\.$minorKotlinVersion(\\.\\d\\d?)?-[A-Za-z][A-Za-z0-9-]*").matches(version) && !version.startsWith("1.$minorKotlinVersion.0-dev") } diff --git a/idea/tests/org/jetbrains/kotlin/idea/configuration/ConfigureKotlinUtilTest.kt b/idea/tests/org/jetbrains/kotlin/idea/configuration/ConfigureKotlinUtilTest.kt index 4b8af0399e4..fd31b9fa9d8 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/configuration/ConfigureKotlinUtilTest.kt +++ b/idea/tests/org/jetbrains/kotlin/idea/configuration/ConfigureKotlinUtilTest.kt @@ -32,6 +32,8 @@ class ConfigureKotlinUtilTest : UsefulTestCase() { Assert.assertFalse(useEapRepository(1, "1.1.2")) Assert.assertFalse(useEapRepository(1, "1.1.2-3")) Assert.assertFalse(useEapRepository(1, "1.1.0-dev-1234")) + Assert.assertTrue(useEapRepository(1, "1.1.50-eap-28")) + Assert.assertFalse(useEapRepository(1, "1.1.50")) Assert.assertTrue(useEapRepository(2, "1.2-M01")) Assert.assertTrue(useEapRepository(2, "1.2-M1")) Assert.assertFalse(useEapRepository(2, "1.2")) From 7821366f6a34a8f5870cbc3fde76cbe5e479551e Mon Sep 17 00:00:00 2001 From: Dmitry Jemerov Date: Thu, 21 Sep 2017 16:53:52 +0200 Subject: [PATCH 006/212] Add missing runtime dependency on TestNG and coverage plugins --- idea/build.gradle.kts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/idea/build.gradle.kts b/idea/build.gradle.kts index 687ee201c71..fbe7bc55fa4 100644 --- a/idea/build.gradle.kts +++ b/idea/build.gradle.kts @@ -57,13 +57,13 @@ dependencies { testRuntime(ideaSdkDeps("*.jar")) testRuntime(ideaPluginDeps("*.jar", plugin = "junit")) - testRuntime(ideaPluginDeps("jcommander", "resources_en", plugin = "testng")) testRuntime(ideaPluginDeps("resources_en", plugin = "properties")) testRuntime(ideaPluginDeps("*.jar", plugin = "gradle")) testRuntime(ideaPluginDeps("*.jar", plugin = "Groovy")) - testRuntime(ideaPluginDeps("jacocoant", plugin = "coverage")) + testRuntime(ideaPluginDeps("*.jar", plugin = "coverage")) testRuntime(ideaPluginDeps("*.jar", plugin = "maven")) testRuntime(ideaPluginDeps("*.jar", plugin = "android")) + testRuntime(ideaPluginDeps("*.jar", plugin = "testng")) // deps below are test runtime deps, but made test compile to split compilation and running to reduce mem req testCompile(project(":plugins:android-extensions-compiler")) From 4c04eaa29a9e585da69281fdc9e1a47de12533d0 Mon Sep 17 00:00:00 2001 From: Dmitry Jemerov Date: Thu, 21 Sep 2017 17:17:44 +0200 Subject: [PATCH 007/212] Don't hard-code dependency versions in Maven import test --- .../idea/maven/KotlinMavenImporterTest.kt | 32 +++++++++---------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/idea/idea-maven/test/org/jetbrains/kotlin/idea/maven/KotlinMavenImporterTest.kt b/idea/idea-maven/test/org/jetbrains/kotlin/idea/maven/KotlinMavenImporterTest.kt index 48d89f6458a..438f2d3ce15 100644 --- a/idea/idea-maven/test/org/jetbrains/kotlin/idea/maven/KotlinMavenImporterTest.kt +++ b/idea/idea-maven/test/org/jetbrains/kotlin/idea/maven/KotlinMavenImporterTest.kt @@ -735,7 +735,7 @@ class KotlinMavenImporterTest : MavenImportingTestCase() { org.jetbrains.kotlin kotlin-stdlib - 1.1.0 + $kotlinVersion @@ -783,7 +783,7 @@ class KotlinMavenImporterTest : MavenImportingTestCase() { org.jetbrains.kotlin kotlin-stdlib-js - 1.1.0 + $kotlinVersion @@ -831,7 +831,7 @@ class KotlinMavenImporterTest : MavenImportingTestCase() { org.jetbrains.kotlin kotlin-stdlib-common - 1.1.0 + $kotlinVersion @@ -879,7 +879,7 @@ class KotlinMavenImporterTest : MavenImportingTestCase() { org.jetbrains.kotlin kotlin-stdlib - 1.1.0 + $kotlinVersion @@ -927,7 +927,7 @@ class KotlinMavenImporterTest : MavenImportingTestCase() { org.jetbrains.kotlin kotlin-stdlib-js - 1.1.0 + $kotlinVersion @@ -975,7 +975,7 @@ class KotlinMavenImporterTest : MavenImportingTestCase() { org.jetbrains.kotlin kotlin-stdlib-common - 1.1.0 + $kotlinVersion @@ -1023,12 +1023,12 @@ class KotlinMavenImporterTest : MavenImportingTestCase() { org.jetbrains.kotlin kotlin-stdlib-common - 1.1.0 + $kotlinVersion org.jetbrains.kotlin kotlin-stdlib-js - 1.1.0 + $kotlinVersion @@ -1081,7 +1081,7 @@ class KotlinMavenImporterTest : MavenImportingTestCase() { org.jetbrains.kotlin kotlin-stdlib - 1.1.0 + $kotlinVersion @@ -1123,7 +1123,7 @@ class KotlinMavenImporterTest : MavenImportingTestCase() { org.jetbrains.kotlin kotlin-stdlib-js - 1.1.0 + $kotlinVersion @@ -1165,7 +1165,7 @@ class KotlinMavenImporterTest : MavenImportingTestCase() { org.jetbrains.kotlin kotlin-stdlib-common - 1.1.0 + $kotlinVersion @@ -1211,7 +1211,7 @@ class KotlinMavenImporterTest : MavenImportingTestCase() { org.jetbrains.kotlin kotlin-stdlib - 1.1.0 + $kotlinVersion @@ -1259,7 +1259,7 @@ class KotlinMavenImporterTest : MavenImportingTestCase() { org.jetbrains.kotlin kotlin-stdlib-js - 1.1.0 + $kotlinVersion @@ -1307,7 +1307,7 @@ class KotlinMavenImporterTest : MavenImportingTestCase() { org.jetbrains.kotlin kotlin-stdlib-common - 1.1.0 + $kotlinVersion @@ -1355,7 +1355,7 @@ class KotlinMavenImporterTest : MavenImportingTestCase() { org.jetbrains.kotlin kotlin-stdlib - 1.1.0 + $kotlinVersion @@ -1379,7 +1379,7 @@ class KotlinMavenImporterTest : MavenImportingTestCase() { org.jetbrains.kotlin kotlin-maven-allopen - 1.1.0 + $kotlinVersion From 690eaa95bd76e8031b9933d16c221b4df696f418 Mon Sep 17 00:00:00 2001 From: Dmitry Jemerov Date: Thu, 21 Sep 2017 17:33:55 +0200 Subject: [PATCH 008/212] Update expected testdata of live templates test --- idea/idea-live-templates/testData/anonymous_1.exp.kt | 2 +- idea/idea-live-templates/testData/serr.exp.kt | 2 +- .../jetbrains/kotlin/idea/liveTemplates/LiveTemplatesTest.kt | 5 ++--- 3 files changed, 4 insertions(+), 5 deletions(-) diff --git a/idea/idea-live-templates/testData/anonymous_1.exp.kt b/idea/idea-live-templates/testData/anonymous_1.exp.kt index 4a7c30f5d47..292e4969fc8 100644 --- a/idea/idea-live-templates/testData/anonymous_1.exp.kt +++ b/idea/idea-live-templates/testData/anonymous_1.exp.kt @@ -3,7 +3,7 @@ import javax.swing.SwingUtilities fun main(args : Array) { SwingUtilities.invokeLater(object : Runnable { override fun run() { - throw UnsupportedOperationException() + TODO("not implemented") //To change body of created functions use File | Settings | File Templates. } }) } diff --git a/idea/idea-live-templates/testData/serr.exp.kt b/idea/idea-live-templates/testData/serr.exp.kt index 94baca416ae..19101ee4a36 100644 --- a/idea/idea-live-templates/testData/serr.exp.kt +++ b/idea/idea-live-templates/testData/serr.exp.kt @@ -1,3 +1,3 @@ fun main(args : Array) { - System.err?.println() + System.err.println() } diff --git a/idea/idea-live-templates/tests/org/jetbrains/kotlin/idea/liveTemplates/LiveTemplatesTest.kt b/idea/idea-live-templates/tests/org/jetbrains/kotlin/idea/liveTemplates/LiveTemplatesTest.kt index ac9e7c5cf78..df802db22e0 100644 --- a/idea/idea-live-templates/tests/org/jetbrains/kotlin/idea/liveTemplates/LiveTemplatesTest.kt +++ b/idea/idea-live-templates/tests/org/jetbrains/kotlin/idea/liveTemplates/LiveTemplatesTest.kt @@ -21,7 +21,6 @@ import com.intellij.codeInsight.template.TemplateManager import com.intellij.codeInsight.template.impl.TemplateManagerImpl import com.intellij.codeInsight.template.impl.TemplateState import com.intellij.ide.DataManager -import com.intellij.openapi.application.ApplicationManager import com.intellij.openapi.command.CommandProcessor import com.intellij.openapi.editor.actionSystem.EditorActionManager import com.intellij.testFramework.LightProjectDescriptor @@ -85,7 +84,7 @@ class LiveTemplatesTest : KotlinLightCodeInsightFixtureTestCase() { fun testSoutv() { start() - assertStringItems("ASSERTIONS_ENABLED", "args", "defaultBlockSize", "defaultBufferSize", "minimumBlockSize", "x", "y") + assertStringItems("DEFAULT_BUFFER_SIZE", "args", "x", "y") typeAndNextTab("y") checkAfter() @@ -190,7 +189,7 @@ class LiveTemplatesTest : KotlinLightCodeInsightFixtureTestCase() { fun testIter() { start() - assertStringItems("args", "myList", "o", "str", "stream") + assertStringItems("args", "myList", "o", "str") type("args") nextTab(2) From 65c0e445fd7e014b2b764abd0ffab09333a73be9 Mon Sep 17 00:00:00 2001 From: Dmitry Jemerov Date: Thu, 21 Sep 2017 14:36:45 +0200 Subject: [PATCH 009/212] Don't crash when trying to build stubs for files that have been deleted Fixes EA-97751 --- .../idea/decompiler/classFile/ClassFileDecompilerUtil.kt | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/decompiler/classFile/ClassFileDecompilerUtil.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/decompiler/classFile/ClassFileDecompilerUtil.kt index aa8038287da..7b4f87d0cd1 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/decompiler/classFile/ClassFileDecompilerUtil.kt +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/decompiler/classFile/ClassFileDecompilerUtil.kt @@ -50,6 +50,11 @@ fun isKotlinWithCompatibleAbiVersion(file: VirtualFile): Boolean { * which should NOT be decompiled (and, as a result, shown under the library in the Project view, be searchable via Find class, etc.) */ fun isKotlinInternalCompiledFile(file: VirtualFile, fileContent: ByteArray? = null): Boolean { + // Don't crash on invalid files (EA-97751) + if (!file.isValid || fileContent?.size == 0) { + return false + } + if (!IDEKotlinBinaryClassCache.isKotlinJvmCompiledFile(file, fileContent)) { return false } From 4549cc7289c208cd36beaa06da7a714a6c6090d6 Mon Sep 17 00:00:00 2001 From: Dmitry Jemerov Date: Thu, 21 Sep 2017 18:09:25 +0200 Subject: [PATCH 010/212] Fix CodeConformanceTest for new gradle build --- .../org/jetbrains/kotlin/code/CodeConformanceTest.kt | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/compiler/tests/org/jetbrains/kotlin/code/CodeConformanceTest.kt b/compiler/tests/org/jetbrains/kotlin/code/CodeConformanceTest.kt index 16018d5145c..1a1a46a7eeb 100644 --- a/compiler/tests/org/jetbrains/kotlin/code/CodeConformanceTest.kt +++ b/compiler/tests/org/jetbrains/kotlin/code/CodeConformanceTest.kt @@ -29,6 +29,9 @@ class CodeConformanceTest : TestCase() { private val EXCLUDED_FILES_AND_DIRS = listOf( "android.tests.dependencies", "core/reflection.jvm/src/kotlin/reflect/jvm/internal/pcollections", + "libraries/kotlin.test/js/it/.gradle", + "libraries/kotlin.test/js/it/node_modules", + "libraries/stdlib/js/node_modules", "libraries/tools/kotlin-reflect/build", "libraries/tools/kotlin-reflect/target/copied-sources", "libraries/tools/binary-compatibility-validator/src/main/kotlin/org.jetbrains.kotlin.tools", @@ -56,7 +59,10 @@ class CodeConformanceTest : TestCase() { "idea/src/org/jetbrains/kotlin/idea/copyright", "libraries/stdlib/common/build", "libraries/stdlib/common/target", - "libraries/stdlib/js/build" + "libraries/stdlib/js/build", + "libraries/kotlin.test/js/it/.gradle", + "libraries/kotlin.test/js/it/node_modules", + "libraries/stdlib/js/node_modules" ) } From b5d68515e8fc32f676858c2340a8e1c9d36a5162 Mon Sep 17 00:00:00 2001 From: Ilya Chernikov Date: Wed, 20 Sep 2017 18:24:15 +0200 Subject: [PATCH 011/212] Fix path to android-extensions-runtime in ParcelBoxTest --- plugins/plugins-tests/build.gradle.kts | 3 +++ .../kotlin/android/parcel/AbstractParcelBoxTest.kt | 7 +++++-- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/plugins/plugins-tests/build.gradle.kts b/plugins/plugins-tests/build.gradle.kts index c25f38d5bb0..b62938c7aa1 100644 --- a/plugins/plugins-tests/build.gradle.kts +++ b/plugins/plugins-tests/build.gradle.kts @@ -38,7 +38,10 @@ sourceSets { testsJar {} +evaluationDependsOn(":kotlin-android-extensions-runtime") + projectTest { + environment("ANDROID_EXTENSIONS_RUNTIME_CLASSES", getSourceSetsFrom(":kotlin-android-extensions-runtime")["main"].output.classesDirs.asPath) dependsOnTaskIfExistsRec("dist", project = rootProject) workingDir = rootDir } diff --git a/plugins/plugins-tests/tests/org/jetbrains/kotlin/android/parcel/AbstractParcelBoxTest.kt b/plugins/plugins-tests/tests/org/jetbrains/kotlin/android/parcel/AbstractParcelBoxTest.kt index 50b754fee4b..0b5b15e3cc3 100644 --- a/plugins/plugins-tests/tests/org/jetbrains/kotlin/android/parcel/AbstractParcelBoxTest.kt +++ b/plugins/plugins-tests/tests/org/jetbrains/kotlin/android/parcel/AbstractParcelBoxTest.kt @@ -117,9 +117,12 @@ abstract class AbstractParcelBoxTest : CodegenTestCase() { val junitCoreResourceName = JUnitCore::class.java.name.replace('.', '/') + ".class" val junitJar = File(JUnitCore::class.java.classLoader.getResource(junitCoreResourceName).file.substringBeforeLast('!')) - val androidExtensionsRuntime = File("out/production/android-extensions-runtime") + val androidExtensionsRuntimeCP = + (System.getenv("ANDROID_EXTENSIONS_RUNTIME_CLASSES")?.split(File.pathSeparator) + ?: listOf("out/production/android-extensions-runtime") + ).map { File(it) } - return listOf(kotlinRuntimeJar) + layoutLibJars + robolectricJars + junitJar + androidExtensionsRuntime + return listOf(kotlinRuntimeJar) + layoutLibJars + robolectricJars + junitJar + androidExtensionsRuntimeCP } override fun doMultiFileTest(wholeFile: File, files: List, javaFilesDir: File?) { From 0b34dde905eab2b95758b31a0c14c7ae9165913f Mon Sep 17 00:00:00 2001 From: Ilya Chernikov Date: Wed, 20 Sep 2017 18:37:50 +0200 Subject: [PATCH 012/212] Add android-extensions-runtime to the dist --- .../android-extensions/android-extensions-idea/build.gradle.kts | 1 + .../android-extensions-runtime/build.gradle.kts | 2 ++ 2 files changed, 3 insertions(+) diff --git a/plugins/android-extensions/android-extensions-idea/build.gradle.kts b/plugins/android-extensions/android-extensions-idea/build.gradle.kts index 11e7316c18c..6fe3c03f88a 100644 --- a/plugins/android-extensions/android-extensions-idea/build.gradle.kts +++ b/plugins/android-extensions/android-extensions-idea/build.gradle.kts @@ -50,6 +50,7 @@ sourceSets { testsJar {} projectTest { + dependsOn(":kotlin-android-extensions-runtime:dist") workingDir = rootDir } diff --git a/plugins/android-extensions/android-extensions-runtime/build.gradle.kts b/plugins/android-extensions/android-extensions-runtime/build.gradle.kts index 3748e356835..dec72c91f65 100644 --- a/plugins/android-extensions/android-extensions-runtime/build.gradle.kts +++ b/plugins/android-extensions/android-extensions-runtime/build.gradle.kts @@ -18,4 +18,6 @@ runtimeJar() sourcesJar() javadocJar() +dist(targetName = "android-extensions-runtime.jar") + publish() From 1953f8e94580274a1a383d1d6ea3bc1d72a62840 Mon Sep 17 00:00:00 2001 From: Ilya Chernikov Date: Wed, 20 Sep 2017 18:38:43 +0200 Subject: [PATCH 013/212] Fix build-common publishing --- build-common/build.gradle.kts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/build-common/build.gradle.kts b/build-common/build.gradle.kts index 44cf00a7674..43ccbff7f5e 100644 --- a/build-common/build.gradle.kts +++ b/build-common/build.gradle.kts @@ -24,6 +24,8 @@ sourceSets { } runtimeJar() +sourcesJar() +javadocJar() testsJar() From c7812beea4df439b989ce2ae2cda91d72c1112a4 Mon Sep 17 00:00:00 2001 From: Denis Zharkov Date: Thu, 21 Sep 2017 17:31:26 +0300 Subject: [PATCH 014/212] Fix SOE in SignatureEnhancement::extractNullability The problem was that `resolveTypeQualifierAnnotation` actually doesn't guarantee that `typeQualifierAnnotation` is javax.annotation.NonNull with argument It could be just any type qualifier (see the test) --- .../tests/irrelevantQualifierNicknames.kt | 85 +++++++++++++++++++ .../tests/irrelevantQualifierNicknames.txt | 48 +++++++++++ ...sNoAnnotationInClasspathTestGenerated.java | 6 ++ ...pathWithFastClassReadingTestGenerated.java | 6 ++ .../ForeignAnnotationsTestGenerated.java | 6 ++ .../JavacForeignAnnotationsTestGenerated.java | 6 ++ .../typeEnhancement/signatureEnhancement.kt | 27 +++--- 7 files changed, 172 insertions(+), 12 deletions(-) create mode 100644 compiler/testData/foreignAnnotations/tests/irrelevantQualifierNicknames.kt create mode 100644 compiler/testData/foreignAnnotations/tests/irrelevantQualifierNicknames.txt diff --git a/compiler/testData/foreignAnnotations/tests/irrelevantQualifierNicknames.kt b/compiler/testData/foreignAnnotations/tests/irrelevantQualifierNicknames.kt new file mode 100644 index 00000000000..dd7406c28c8 --- /dev/null +++ b/compiler/testData/foreignAnnotations/tests/irrelevantQualifierNicknames.kt @@ -0,0 +1,85 @@ +// !DIAGNOSTICS: -UNUSED_VARIABLE -UNUSED_PARAMETER + +// FILE: UnknownQualifier.java +import javax.annotation.*; +import java.lang.annotation.Documented; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; + +import javax.annotation.meta.TypeQualifier; +import javax.annotation.meta.When; + +@Documented +@TypeQualifier +@Retention(RetentionPolicy.RUNTIME) +public @interface UnknownQualifier { +} + +// FILE: UnknownQualifierNickname.java +import javax.annotation.*; +import java.lang.annotation.Documented; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; + +import javax.annotation.meta.TypeQualifierNickname; +import javax.annotation.meta.When; + +@Documented +@TypeQualifierNickname +@UnknownQualifier +@Retention(RetentionPolicy.RUNTIME) +public @interface UnknownQualifierNickname { +} + +// FILE: UnknownQualifierDefault.java +import javax.annotation.*; +import java.lang.annotation.Documented; +import java.lang.annotation.Retention; +import java.lang.annotation.ElementType; +import java.lang.annotation.RetentionPolicy; + +import javax.annotation.meta.TypeQualifierDefault; +import javax.annotation.meta.When; + +@Documented +@TypeQualifierDefault({ElementType.METHOD, ElementType.PARAMETER}) +@UnknownQualifier +@Retention(RetentionPolicy.RUNTIME) +public @interface UnknownQualifierDefault { +} + +// FILE: UnknownQualifierNicknameDefault.java +import javax.annotation.*; +import java.lang.annotation.Documented; +import java.lang.annotation.Retention; +import java.lang.annotation.ElementType; +import java.lang.annotation.RetentionPolicy; + +import javax.annotation.meta.TypeQualifierDefault; +import javax.annotation.meta.When; + +@Documented +@TypeQualifierDefault({ElementType.METHOD, ElementType.PARAMETER}) +@UnknownQualifierNickname +@Retention(RetentionPolicy.RUNTIME) +public @interface UnknownQualifierNicknameDefault { +} + +// FILE: A.java + +import javax.annotation.*; + +@UnknownQualifierDefault +public class A { + @UnknownQualifierNicknameDefault + public static class B { + @UnknownQualifier + public static String foo(@UnknownQualifierNickname String x) { return null; } + } +} + +// FILE: main.kt + +fun main() { + A.B.foo(null).hashCode() +} diff --git a/compiler/testData/foreignAnnotations/tests/irrelevantQualifierNicknames.txt b/compiler/testData/foreignAnnotations/tests/irrelevantQualifierNicknames.txt new file mode 100644 index 00000000000..586eefba1c4 --- /dev/null +++ b/compiler/testData/foreignAnnotations/tests/irrelevantQualifierNicknames.txt @@ -0,0 +1,48 @@ +package + +public fun main(): kotlin.Unit + +@UnknownQualifierDefault public open class A { + public constructor A() + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String + + @UnknownQualifierNicknameDefault public open class B { + public constructor B() + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String + + // Static members + @UnknownQualifier public open fun foo(/*0*/ @UnknownQualifierNickname x: kotlin.String!): kotlin.String! + } +} + +@kotlin.annotation.MustBeDocumented @javax.annotation.meta.TypeQualifier @kotlin.annotation.Retention(value = AnnotationRetention.RUNTIME) public final annotation class UnknownQualifier : kotlin.Annotation { + public constructor UnknownQualifier() + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String +} + +@kotlin.annotation.MustBeDocumented @javax.annotation.meta.TypeQualifierDefault(value = {ElementType.METHOD, ElementType.PARAMETER}) @UnknownQualifier @kotlin.annotation.Retention(value = AnnotationRetention.RUNTIME) public final annotation class UnknownQualifierDefault : kotlin.Annotation { + public constructor UnknownQualifierDefault() + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String +} + +@kotlin.annotation.MustBeDocumented @javax.annotation.meta.TypeQualifierNickname @UnknownQualifier @kotlin.annotation.Retention(value = AnnotationRetention.RUNTIME) public final annotation class UnknownQualifierNickname : kotlin.Annotation { + public constructor UnknownQualifierNickname() + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String +} + +@kotlin.annotation.MustBeDocumented @javax.annotation.meta.TypeQualifierDefault(value = {ElementType.METHOD, ElementType.PARAMETER}) @UnknownQualifierNickname @kotlin.annotation.Retention(value = AnnotationRetention.RUNTIME) public final annotation class UnknownQualifierNicknameDefault : kotlin.Annotation { + public constructor UnknownQualifierNicknameDefault() + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String +} diff --git a/compiler/tests/org/jetbrains/kotlin/checkers/ForeignAnnotationsNoAnnotationInClasspathTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/checkers/ForeignAnnotationsNoAnnotationInClasspathTestGenerated.java index 3c305f8be1e..d746497c794 100644 --- a/compiler/tests/org/jetbrains/kotlin/checkers/ForeignAnnotationsNoAnnotationInClasspathTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/checkers/ForeignAnnotationsNoAnnotationInClasspathTestGenerated.java @@ -60,6 +60,12 @@ public class ForeignAnnotationsNoAnnotationInClasspathTestGenerated extends Abst doTest(fileName); } + @TestMetadata("irrelevantQualifierNicknames.kt") + public void testIrrelevantQualifierNicknames() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/irrelevantQualifierNicknames.kt"); + doTest(fileName); + } + @TestMetadata("jsr305NullabilityNicknames.kt") public void testJsr305NullabilityNicknames() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305NullabilityNicknames.kt"); diff --git a/compiler/tests/org/jetbrains/kotlin/checkers/ForeignAnnotationsNoAnnotationInClasspathWithFastClassReadingTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/checkers/ForeignAnnotationsNoAnnotationInClasspathWithFastClassReadingTestGenerated.java index 7d431287543..56776cfb8f1 100644 --- a/compiler/tests/org/jetbrains/kotlin/checkers/ForeignAnnotationsNoAnnotationInClasspathWithFastClassReadingTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/checkers/ForeignAnnotationsNoAnnotationInClasspathWithFastClassReadingTestGenerated.java @@ -60,6 +60,12 @@ public class ForeignAnnotationsNoAnnotationInClasspathWithFastClassReadingTestGe doTest(fileName); } + @TestMetadata("irrelevantQualifierNicknames.kt") + public void testIrrelevantQualifierNicknames() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/irrelevantQualifierNicknames.kt"); + doTest(fileName); + } + @TestMetadata("jsr305NullabilityNicknames.kt") public void testJsr305NullabilityNicknames() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305NullabilityNicknames.kt"); diff --git a/compiler/tests/org/jetbrains/kotlin/checkers/ForeignAnnotationsTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/checkers/ForeignAnnotationsTestGenerated.java index 3314f7217a4..d49b548359c 100644 --- a/compiler/tests/org/jetbrains/kotlin/checkers/ForeignAnnotationsTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/checkers/ForeignAnnotationsTestGenerated.java @@ -60,6 +60,12 @@ public class ForeignAnnotationsTestGenerated extends AbstractForeignAnnotationsT doTest(fileName); } + @TestMetadata("irrelevantQualifierNicknames.kt") + public void testIrrelevantQualifierNicknames() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/irrelevantQualifierNicknames.kt"); + doTest(fileName); + } + @TestMetadata("jsr305NullabilityNicknames.kt") public void testJsr305NullabilityNicknames() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305NullabilityNicknames.kt"); diff --git a/compiler/tests/org/jetbrains/kotlin/checkers/javac/JavacForeignAnnotationsTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/checkers/javac/JavacForeignAnnotationsTestGenerated.java index 286b208e856..07e739c1e56 100644 --- a/compiler/tests/org/jetbrains/kotlin/checkers/javac/JavacForeignAnnotationsTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/checkers/javac/JavacForeignAnnotationsTestGenerated.java @@ -60,6 +60,12 @@ public class JavacForeignAnnotationsTestGenerated extends AbstractJavacForeignAn doTest(fileName); } + @TestMetadata("irrelevantQualifierNicknames.kt") + public void testIrrelevantQualifierNicknames() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/irrelevantQualifierNicknames.kt"); + doTest(fileName); + } + @TestMetadata("jsr305NullabilityNicknames.kt") public void testJsr305NullabilityNicknames() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305NullabilityNicknames.kt"); diff --git a/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/typeEnhancement/signatureEnhancement.kt b/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/typeEnhancement/signatureEnhancement.kt index ca0f5328cc0..4a56af91530 100644 --- a/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/typeEnhancement/signatureEnhancement.kt +++ b/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/typeEnhancement/signatureEnhancement.kt @@ -68,27 +68,30 @@ class SignatureEnhancement(private val annotationTypeQualifierResolver: Annotati } fun extractNullability(annotationDescriptor: AnnotationDescriptor): NullabilityQualifierWithMigrationStatus? { + extractNullabilityFromKnownAnnotations(annotationDescriptor)?.let { return it } + + val typeQualifierAnnotation = + annotationTypeQualifierResolver.resolveTypeQualifierAnnotation(annotationDescriptor) + ?: return null + + val forWarning = annotationTypeQualifierResolver.jsr305State.isWarning() + + return extractNullabilityFromKnownAnnotations(typeQualifierAnnotation)?.copy(isForWarningOnly = forWarning) + } + + private fun extractNullabilityFromKnownAnnotations( + annotationDescriptor: AnnotationDescriptor + ): NullabilityQualifierWithMigrationStatus? { val annotationFqName = annotationDescriptor.fqName ?: return null return when (annotationFqName) { in NULLABLE_ANNOTATIONS -> NullabilityQualifierWithMigrationStatus(NullabilityQualifier.NULLABLE) in NOT_NULL_ANNOTATIONS -> NullabilityQualifierWithMigrationStatus(NullabilityQualifier.NOT_NULL) JAVAX_NONNULL_ANNOTATION -> annotationDescriptor.extractNullabilityTypeFromArgument() - else -> { - val forWarning = annotationTypeQualifierResolver.jsr305State.isWarning() - - val typeQualifierAnnotation = - annotationTypeQualifierResolver.resolveTypeQualifierAnnotation(annotationDescriptor) - ?: return null - - // resolveTypeQualifierAnnotation guarantees that `typeQualifierAnnotation` is javax.annotation.NonNull with argument - // or javax.annotation.CheckForNull without arguments - extractNullability(typeQualifierAnnotation)?.copy(isForWarningOnly = forWarning) - } + else -> null } } - fun enhanceSignatures(c: LazyJavaResolverContext, platformSignatures: Collection): Collection { return platformSignatures.map { it.enhanceSignature(c) From 0682f74560e54afd3a2a6f26c578c377c65ea6a1 Mon Sep 17 00:00:00 2001 From: Dmitry Jemerov Date: Thu, 21 Sep 2017 15:48:57 +0200 Subject: [PATCH 015/212] Avoid duplicate file type calculation --- .../jetbrains/kotlin/idea/caches/resolve/getModuleInfo.kt | 2 +- .../org/jetbrains/kotlin/idea/util/ProjectRootsUtil.kt | 8 +++++--- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/resolve/getModuleInfo.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/resolve/getModuleInfo.kt index 11dea1b30bb..d5f6df5ef1b 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/resolve/getModuleInfo.kt +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/resolve/getModuleInfo.kt @@ -181,7 +181,7 @@ private inline fun collectInfosByVirtualFile( onOccurrence(ScriptModuleInfo(project, virtualFile, scriptDefinition)) } - val isBinary = virtualFile.isKotlinBinary() + val isBinary = virtualFile.fileType.isKotlinBinary() val scriptConfigurationManager = ScriptDependenciesManager.getInstance(project) if (isBinary && virtualFile in scriptConfigurationManager.getAllScriptsClasspathScope()) { if (treatAsLibrarySource) { diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/util/ProjectRootsUtil.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/util/ProjectRootsUtil.kt index d2cde1c1e7e..bd1ac41a70f 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/util/ProjectRootsUtil.kt +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/util/ProjectRootsUtil.kt @@ -19,6 +19,7 @@ package org.jetbrains.kotlin.idea.util import com.intellij.ide.highlighter.ArchiveFileType import com.intellij.ide.highlighter.JavaClassFileType import com.intellij.injected.editor.VirtualFileWindow +import com.intellij.openapi.fileTypes.FileType import com.intellij.openapi.module.Module import com.intellij.openapi.module.ModuleUtilCore import com.intellij.openapi.project.Project @@ -39,7 +40,7 @@ import org.jetbrains.kotlin.idea.util.application.runReadAction private val kotlinBinaries = listOf(JavaClassFileType.INSTANCE, KotlinBuiltInFileType, KotlinModuleFileType.INSTANCE) -fun VirtualFile.isKotlinBinary(): Boolean = fileType in kotlinBinaries +fun FileType.isKotlinBinary(): Boolean = this in kotlinBinaries fun FileIndex.isInSourceContentWithoutInjected(file: VirtualFile): Boolean { return file !is VirtualFileWindow && isInSourceContent(file) @@ -62,8 +63,9 @@ object ProjectRootsUtil { if (!includeLibraryClasses && !includeLibrarySource) return false // NOTE: the following is a workaround for cases when class files are under library source roots and source files are under class roots - val canContainClassFiles = file.fileType == ArchiveFileType.INSTANCE || file.isDirectory - val isBinary = file.isKotlinBinary() + val fileType = file.fileType + val canContainClassFiles = fileType == ArchiveFileType.INSTANCE || file.isDirectory + val isBinary = fileType.isKotlinBinary() val scriptConfigurationManager = if (includeScriptDependencies) ScriptDependenciesManager.getInstance(project) else null From 43e2be26f844eee8f8fea187eff1733fcb31b447 Mon Sep 17 00:00:00 2001 From: Ilya Gorbunov Date: Wed, 20 Sep 2017 20:24:38 +0300 Subject: [PATCH 016/212] Advance stdlib version to 1.1.60 --- libraries/stdlib/src/kotlin/util/KotlinVersion.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/stdlib/src/kotlin/util/KotlinVersion.kt b/libraries/stdlib/src/kotlin/util/KotlinVersion.kt index 2c22882f7bc..a056e1f0a31 100644 --- a/libraries/stdlib/src/kotlin/util/KotlinVersion.kt +++ b/libraries/stdlib/src/kotlin/util/KotlinVersion.kt @@ -70,6 +70,6 @@ public class KotlinVersion(val major: Int, val minor: Int, val patch: Int) : Com */ // TODO: get from metadata or hardcode automatically during build @kotlin.jvm.JvmField - public val CURRENT: KotlinVersion = KotlinVersion(1, 1, 50) + public val CURRENT: KotlinVersion = KotlinVersion(1, 1, 60) } } From 00fa8ee464fecc5637ef767a4190eabb6e88eaa6 Mon Sep 17 00:00:00 2001 From: Ilya Gorbunov Date: Thu, 21 Sep 2017 07:23:59 +0300 Subject: [PATCH 017/212] Setup JRE version for codegen tests Add camelCase task name aliases for codegen tests --- compiler/build.gradle.kts | 29 ++++++++++++++++++++--------- 1 file changed, 20 insertions(+), 9 deletions(-) diff --git a/compiler/build.gradle.kts b/compiler/build.gradle.kts index 590f0f65671..1f523529483 100644 --- a/compiler/build.gradle.kts +++ b/compiler/build.gradle.kts @@ -82,36 +82,47 @@ projectTest { evaluationDependsOn(":compiler:tests-common-jvm6") -fun Project.codegenTest(taskName: String, body: Test.() -> Unit): Test = projectTest(taskName) { +fun Project.codegenTest(taskName: String, jdk: String, body: Test.() -> Unit): Test = projectTest(taskName) { dependsOn(*testDistProjects.map { "$it:dist" }.toTypedArray()) workingDir = rootDir environment("TEST_SERVER_CLASSES_DIRS", project(":compiler:tests-common-jvm6").the().sourceSets.getByName("main").output.classesDirs.asPath) filter.includeTestsMatching("org.jetbrains.kotlin.codegen.CodegenJdkCommonTestSuite*") + + if (jdk == "JDK_9") { + jvmArgs = listOf("--add-opens", "java.desktop/javax.swing=ALL-UNNAMED", "--add-opens", "java.base/java.io=ALL-UNNAMED") + } body() + doFirst { + val jdkPath = project.property(jdk) ?: error("$jdk is not optional to run this test") + executable = "$jdkPath/bin/java" + println("Running test with $executable") + } +}.also { + task(taskName.replace(Regex("-[a-z]"), { it.value.takeLast(1).toUpperCase() })) { + dependsOn(it) + group = "verification" + } } -codegenTest("codegen-target6-jvm6-test") { +codegenTest("codegen-target6-jvm6-test", "JDK_18") { systemProperty("kotlin.test.default.jvm.target", "1.6") systemProperty("kotlin.test.java.compilation.target", "1.6") systemProperty("kotlin.test.box.in.separate.process.port", "5100") } -codegenTest("codegen-target6-jvm9-test") { +codegenTest("codegen-target6-jvm9-test", "JDK_9") { systemProperty("kotlin.test.default.jvm.target", "1.6") - jvmArgs = listOf("--add-opens", "java.desktop/javax.swing=ALL-UNNAMED", "--add-opens", "java.base/java.io=ALL-UNNAMED") } -codegenTest("codegen-target8-jvm8-test") { +codegenTest("codegen-target8-jvm8-test", "JDK_18") { systemProperty("kotlin.test.default.jvm.target", "1.8") } -codegenTest("codegen-target8-jvm9-test") { +codegenTest("codegen-target8-jvm9-test", "JDK_9") { systemProperty("kotlin.test.default.jvm.target", "1.8") - jvmArgs = listOf("--add-opens", "java.desktop/javax.swing=ALL-UNNAMED", "--add-opens", "java.base/java.io=ALL-UNNAMED") } -codegenTest("codegen-target9-jvm9-test") { +codegenTest("codegen-target9-jvm9-test", "JDK_9") { systemProperty("kotlin.test.default.jvm.target", "1.8") systemProperty("kotlin.test.substitute.bytecode.1.8.to.1.9", "true") - jvmArgs = listOf("--add-opens", "java.desktop/javax.swing=ALL-UNNAMED", "--add-opens", "java.base/java.io=ALL-UNNAMED") } From a51a9795aefecd2bbc459bad77796d3c7f5bd320 Mon Sep 17 00:00:00 2001 From: Nikolay Krasko Date: Thu, 21 Sep 2017 14:39:30 +0300 Subject: [PATCH 018/212] Fix null-pointer because of nullable elementAt (EA-101762) #EA-101762 Fixed --- .../kotlin/idea/debugger/DebuggerClassNameProvider.kt | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/idea/src/org/jetbrains/kotlin/idea/debugger/DebuggerClassNameProvider.kt b/idea/src/org/jetbrains/kotlin/idea/debugger/DebuggerClassNameProvider.kt index 76599e0ee94..32b3c64ac4b 100644 --- a/idea/src/org/jetbrains/kotlin/idea/debugger/DebuggerClassNameProvider.kt +++ b/idea/src/org/jetbrains/kotlin/idea/debugger/DebuggerClassNameProvider.kt @@ -92,7 +92,9 @@ class DebuggerClassNameProvider( } private fun doGetClassesForPosition(position: SourcePosition): Set { - val relevantElement = runReadAction { getRelevantElement(position.elementAt) } + val relevantElement = runReadAction { + position.elementAt?.let { getRelevantElement(it) } + } val result = getOrComputeClassNames(relevantElement) { element -> getOuterClassNamesForElement(element) From a8211a77d440eb9ba51397df193f416f7843b599 Mon Sep 17 00:00:00 2001 From: Nikolay Krasko Date: Thu, 21 Sep 2017 15:10:42 +0300 Subject: [PATCH 019/212] Fix null-pointer because of nullable elementAt (EA-99963) #EA-99963 Fixed --- .../idea/debugger/stepping/KotlinSteppingCommandProvider.kt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/idea/src/org/jetbrains/kotlin/idea/debugger/stepping/KotlinSteppingCommandProvider.kt b/idea/src/org/jetbrains/kotlin/idea/debugger/stepping/KotlinSteppingCommandProvider.kt index 18bad29ada3..038100fcc8c 100644 --- a/idea/src/org/jetbrains/kotlin/idea/debugger/stepping/KotlinSteppingCommandProvider.kt +++ b/idea/src/org/jetbrains/kotlin/idea/debugger/stepping/KotlinSteppingCommandProvider.kt @@ -108,7 +108,8 @@ class KotlinSteppingCommandProvider : JvmSteppingCommandProvider() { val file = sourcePosition.file as? KtFile ?: return null if (sourcePosition.line < 0) return null - val containingFunction = sourcePosition.elementAt.parents + val elementAt = sourcePosition.elementAt ?: return null + val containingFunction = elementAt.parents .filterIsInstance() .firstOrNull { !it.isLocal } ?: return null From 5a8c957edc6978b3e2b3f6eb74c3250e9451f3c4 Mon Sep 17 00:00:00 2001 From: Nikolay Krasko Date: Thu, 21 Sep 2017 14:29:40 +0300 Subject: [PATCH 020/212] Fix null-pointer template apply (EA-102391) --- .../liveTemplates/macro/AnonymousTemplateEditingListener.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/idea/idea-live-templates/src/org/jetbrains/kotlin/idea/liveTemplates/macro/AnonymousTemplateEditingListener.kt b/idea/idea-live-templates/src/org/jetbrains/kotlin/idea/liveTemplates/macro/AnonymousTemplateEditingListener.kt index cf82dc21af1..f971d8c4243 100644 --- a/idea/idea-live-templates/src/org/jetbrains/kotlin/idea/liveTemplates/macro/AnonymousTemplateEditingListener.kt +++ b/idea/idea-live-templates/src/org/jetbrains/kotlin/idea/liveTemplates/macro/AnonymousTemplateEditingListener.kt @@ -38,8 +38,8 @@ internal class AnonymousTemplateEditingListener(private val psiFile: PsiFile, pr private var classRef: KtReferenceExpression? = null private var classDescriptor: ClassDescriptor? = null - override fun currentVariableChanged(templateState: TemplateState?, template: Template?, oldIndex: Int, newIndex: Int) { - assert(templateState!!.template != null) + override fun currentVariableChanged(templateState: TemplateState, template: Template?, oldIndex: Int, newIndex: Int) { + if (templateState.template == null) return val variableRange = templateState.getVariableRange("SUPERTYPE") ?: return val name = psiFile.findElementAt(variableRange.startOffset) if (name != null && name.parent is KtReferenceExpression) { From 1d51e5b59b57d76811956a5cbab58b91d4f58c27 Mon Sep 17 00:00:00 2001 From: Nikolay Krasko Date: Tue, 19 Sep 2017 11:43:23 +0300 Subject: [PATCH 021/212] Refactoring: reuse implementation --- .../org/jetbrains/kotlin/idea/ProgressUtil.kt | 34 +++++-------------- 1 file changed, 9 insertions(+), 25 deletions(-) diff --git a/idea/src/org/jetbrains/kotlin/idea/ProgressUtil.kt b/idea/src/org/jetbrains/kotlin/idea/ProgressUtil.kt index e3d51869b52..4450c3ea973 100644 --- a/idea/src/org/jetbrains/kotlin/idea/ProgressUtil.kt +++ b/idea/src/org/jetbrains/kotlin/idea/ProgressUtil.kt @@ -22,37 +22,21 @@ import com.intellij.openapi.progress.ProgressManager import com.intellij.openapi.progress.util.ProgressIndicatorUtils import com.intellij.openapi.project.Project -fun runInReadActionWithWriteActionPriorityWithPCE(f: () -> T): T { - var r: T? = null - if (!with(ApplicationManager.getApplication()) { isDispatchThread && isUnitTestMode }) { - val complete = ProgressIndicatorUtils.runInReadActionWithWriteActionPriority { - r = f() - } - - // There is a write action in progress or pending, so no point in counting the result - if (!complete) throw ProcessCanceledException() - } - else { - r = f() - } - - return r!! -} +fun runInReadActionWithWriteActionPriorityWithPCE(f: () -> T): T = + runInReadActionWithWriteActionPriority(f) ?: throw ProcessCanceledException() fun runInReadActionWithWriteActionPriority(f: () -> T): T? { - var r: T? = null - if (!with(ApplicationManager.getApplication()) { isDispatchThread && isUnitTestMode }) { - val complete = ProgressIndicatorUtils.runInReadActionWithWriteActionPriority { - r = f() - } - - if (!complete) return null + if (with(ApplicationManager.getApplication()) { isDispatchThread && isUnitTestMode }) { + return f() } - else { + + var r: T? = null + val complete = ProgressIndicatorUtils.runInReadActionWithWriteActionPriority { r = f() } - return r + if (!complete) return null + return r!! } fun Project.runSynchronouslyWithProgress(progressTitle: String, canBeCanceled: Boolean, action: () -> T): T? { From 25ca079fc52867a77679752349ef3e43b3529707 Mon Sep 17 00:00:00 2001 From: Sergey Igushkin Date: Fri, 22 Sep 2017 17:30:01 +0300 Subject: [PATCH 022/212] Fix agp25 source set Kotlin classes not included in kotlin-gradle-plugin --- libraries/tools/kotlin-gradle-plugin/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/tools/kotlin-gradle-plugin/build.gradle b/libraries/tools/kotlin-gradle-plugin/build.gradle index 3837a8f08be..72bf195c6fd 100644 --- a/libraries/tools/kotlin-gradle-plugin/build.gradle +++ b/libraries/tools/kotlin-gradle-plugin/build.gradle @@ -80,7 +80,7 @@ jar.dependsOn agp25Classes jar { from compileGroovy.destinationDir - from sourceSets.agp25.output.classesDir + from sourceSets.agp25.output.classesDirs manifestAttributes(manifest, project) } From 80ac8897ff6d921ed65a639648ed33e509fb54a2 Mon Sep 17 00:00:00 2001 From: Ilya Chernikov Date: Fri, 22 Sep 2017 17:41:52 +0200 Subject: [PATCH 023/212] Fix idea plugin jar name and ultimate build --- prepare/idea-plugin/build.gradle.kts | 1 + ultimate/build.gradle.kts | 19 +++++++------------ 2 files changed, 8 insertions(+), 12 deletions(-) diff --git a/prepare/idea-plugin/build.gradle.kts b/prepare/idea-plugin/build.gradle.kts index f5353ba9adb..ccd3fb63bdf 100644 --- a/prepare/idea-plugin/build.gradle.kts +++ b/prepare/idea-plugin/build.gradle.kts @@ -95,6 +95,7 @@ val jar = runtimeJar(task("shadowJar")) { dependsOn("$p:classes") from(getSourceSetsFrom(p)["main"].output) } + archiveName = "kotlin-plugin.jar" } ideaPlugin { diff --git a/ultimate/build.gradle.kts b/ultimate/build.gradle.kts index e3f9e5fa4a3..bcb5fc03e8c 100644 --- a/ultimate/build.gradle.kts +++ b/ultimate/build.gradle.kts @@ -16,8 +16,6 @@ buildscript { apply { plugin("kotlin") } -val ideaCommunityPlugin by configurations.creating - val ideaProjectResources = project(":idea").the().sourceSets["main"].output.resourcesDir evaluationDependsOn(":prepare:idea-plugin") @@ -40,7 +38,6 @@ dependencies { compile(ideaUltimatePreloadedDeps("*.jar", subdir = "nodejs_plugin/NodeJS/lib")) compile(ideaUltimateSdkCoreDeps("annotations", "trove4j", "intellij-core")) compile(ideaUltimateSdkDeps("openapi", "idea", "util")) -// compile(ideaUltimatePluginDeps("gradle-tooling-api", plugin = "gradle")) compile(ideaUltimatePluginDeps("*.jar", plugin = "CSS")) compile(ideaUltimatePluginDeps("*.jar", plugin = "DatabaseTools")) compile(ideaUltimatePluginDeps("*.jar", plugin = "JavaEE")) @@ -63,7 +60,6 @@ dependencies { testCompile(project(":idea:idea-jvm")) { isTransitive = false } testCompile(project(":generators")) { isTransitive = false } testCompile(projectTests(":idea")) -// testCompileOnly(projectTests(":idea:idea-gradle")) testCompile(commonDep("junit:junit")) testCompile(ideaUltimateSdkDeps("gson")) testCompile(preloadedDeps("kotlinx-coroutines-core")) @@ -94,8 +90,6 @@ dependencies { testRuntime(ideaUltimatePluginDeps("*.jar", plugin = "copyright")) testRuntime(ideaUltimatePluginDeps("*.jar", plugin = "java-decompiler")) testRuntime(files("${System.getProperty("java.home")}/../lib/tools.jar")) - - ideaCommunityPlugin(projectRuntimeJar(":prepare:idea-plugin")) } val preparedResources = File(buildDir, "prepResources") @@ -133,14 +127,14 @@ val preparePluginXml by task { } } +val communityPluginProject = ":prepare:idea-plugin" + val jar = runtimeJar(task("shadowJar")) { duplicatesStrategy = DuplicatesStrategy.EXCLUDE dependsOn(preparePluginXml) - project(":prepare:idea-plugin").afterEvaluate { - ideaCommunityPlugin.files.forEach { - from(zipTree(it), { exclude("META-INF/plugin.xml") }) - } - } + dependsOn("$communityPluginProject:shadowJar") + val communityPluginJar = project(communityPluginProject).configurations["runtimeJar"].artifacts.files.singleFile + from(zipTree(communityPluginJar), { exclude("META-INF/plugin.xml") }) from(preparedResources, { include("META-INF/plugin.xml") }) from(the().sourceSets.getByName("main").output) archiveName = "kotlin-plugin.jar" @@ -150,7 +144,8 @@ val ideaPluginDir: File by rootProject.extra val ideaUltimatePluginDir: File by rootProject.extra task("ideaUltimatePlugin") { - dependsOnTaskIfExistsRec("idea-plugin", rootProject) + dependsOn("$communityPluginProject:ideaPlugin") + dependsOnTaskIfExistsRec("ideaPlugin", rootProject) into(ideaUltimatePluginDir) from(ideaPluginDir) { exclude("lib/kotlin-plugin.jar") } from(jar, { into("lib") }) From e6ab3dc9365804e8bd98307bef90d031f37f0562 Mon Sep 17 00:00:00 2001 From: Alexey Andreev Date: Fri, 15 Sep 2017 17:15:15 +0300 Subject: [PATCH 024/212] JS: generate aliases for intrinsics. This makes generated code more friendly to UglifyJS. For example, uglified circlet loses 15 kb. --- .../kotlin/js/translate/context/Namer.java | 36 ++--------- .../js/translate/context/StaticContext.java | 63 ++++--------------- .../translate/context/TranslationContext.java | 22 +++++++ .../translate/declaration/ClassTranslator.kt | 13 ++-- .../translate/declaration/EnumTranslator.kt | 3 +- .../declaration/PropertyTranslator.kt | 6 +- .../expression/ExpressionVisitor.java | 2 +- .../expression/PatternTranslator.java | 2 +- .../js/translate/intrinsic/Intrinsics.java | 5 +- .../KotlinAliasedFunctionIntrinsic.kt | 50 +++++++++++++++ .../functions/factories/TopLevelFIF.java | 8 +-- .../intrinsic/objects/objectsIntrinsics.kt | 18 ++---- .../reference/CallableReferenceTranslator.kt | 13 ++-- .../reference/VariableAccessTranslator.java | 4 +- .../js/translate/utils/TranslationUtils.java | 23 ++++--- .../secondaryConstructorTemporaryVars.kt | 2 +- .../testData/lineNumbers/inlineReturn.kt | 2 +- 17 files changed, 135 insertions(+), 137 deletions(-) create mode 100644 js/js.translator/src/org/jetbrains/kotlin/js/translate/intrinsic/functions/factories/KotlinAliasedFunctionIntrinsic.kt diff --git a/js/js.translator/src/org/jetbrains/kotlin/js/translate/context/Namer.java b/js/js.translator/src/org/jetbrains/kotlin/js/translate/context/Namer.java index 1e5ae3c551b..b932ba79101 100644 --- a/js/js.translator/src/org/jetbrains/kotlin/js/translate/context/Namer.java +++ b/js/js.translator/src/org/jetbrains/kotlin/js/translate/context/Namer.java @@ -38,7 +38,6 @@ import org.jetbrains.kotlin.js.resolve.JsPlatform; import org.jetbrains.kotlin.js.translate.intrinsic.functions.factories.ArrayFIF; import org.jetbrains.kotlin.js.translate.utils.JsAstUtils; import org.jetbrains.kotlin.js.translate.utils.JsDescriptorUtils; -import org.jetbrains.kotlin.name.FqName; import org.jetbrains.kotlin.name.FqNameUnsafe; import org.jetbrains.kotlin.name.Name; import org.jetbrains.kotlin.resolve.DescriptorUtils; @@ -87,16 +86,16 @@ public final class Namer { private static final String RECEIVER_PARAMETER_NAME = "$receiver"; public static final String ANOTHER_THIS_PARAMETER_NAME = "$this"; - private static final String THROW_NPE_FUN_NAME = "throwNPE"; - private static final String THROW_CLASS_CAST_EXCEPTION_FUN_NAME = "throwCCE"; - private static final String THROW_ILLEGAL_STATE_EXCEPTION_FUN_NAME = "throwISE"; - private static final String THROW_UNINITIALIZED_PROPERTY_ACCESS_EXCEPTION = "throwUPAE"; + public static final String THROW_NPE_FUN_NAME = "throwNPE"; + public static final String THROW_CLASS_CAST_EXCEPTION_FUN_NAME = "throwCCE"; + public static final String THROW_ILLEGAL_STATE_EXCEPTION_FUN_NAME = "throwISE"; + public static final String THROW_UNINITIALIZED_PROPERTY_ACCESS_EXCEPTION = "throwUPAE"; private static final String PROTOTYPE_NAME = "prototype"; private static final String CAPTURED_VAR_FIELD = "v"; public static final JsNameRef IS_ARRAY_FUN_REF = new JsNameRef("isArray", "Array"); public static final String DEFINE_INLINE_FUNCTION = "defineInlineFunction"; - public static final String WRAP_FUNCTION = "wrapFunction"; + private static final String WRAP_FUNCTION = "wrapFunction"; public static final String DEFAULT_PARAMETER_IMPLEMENTOR_SUFFIX = "$default"; private static final JsNameRef JS_OBJECT = new JsNameRef("Object"); @@ -221,26 +220,6 @@ public final class Namer { return suggested.getNames().get(0); } - @NotNull - public static JsExpression throwNPEFunctionRef() { - return new JsNameRef(THROW_NPE_FUN_NAME, kotlinObject()); - } - - @NotNull - public static JsExpression throwClassCastExceptionFunRef() { - return new JsNameRef(THROW_CLASS_CAST_EXCEPTION_FUN_NAME, kotlinObject()); - } - - @NotNull - public static JsExpression throwIllegalStateExceptionFunRef() { - return new JsNameRef(THROW_ILLEGAL_STATE_EXCEPTION_FUN_NAME, kotlinObject()); - } - - @NotNull - public static JsExpression throwUninitializedPropertyAccessExceptionFunRef() { - return new JsNameRef(THROW_UNINITIALIZED_PROPERTY_ACCESS_EXCEPTION, kotlinObject()); - } - @NotNull public static JsNameRef kotlin(@NotNull JsName name) { return pureFqn(name, kotlinObject()); @@ -326,11 +305,6 @@ public final class Namer { return result; } - @NotNull - static String generatePackageName(@NotNull FqName packageFqName) { - return packageFqName.isRoot() ? getRootPackageName() : packageFqName.shortName().asString(); - } - @NotNull public static JsExpression getUndefinedExpression() { return new JsPrefixOperation(JsUnaryOperator.VOID, new JsIntLiteral(0)); diff --git a/js/js.translator/src/org/jetbrains/kotlin/js/translate/context/StaticContext.java b/js/js.translator/src/org/jetbrains/kotlin/js/translate/context/StaticContext.java index a1f7b629ae1..570e89791cc 100644 --- a/js/js.translator/src/org/jetbrains/kotlin/js/translate/context/StaticContext.java +++ b/js/js.translator/src/org/jetbrains/kotlin/js/translate/context/StaticContext.java @@ -18,9 +18,7 @@ package org.jetbrains.kotlin.js.translate.context; import com.google.common.collect.Lists; import com.google.common.collect.Maps; -import com.intellij.openapi.util.Factory; import com.intellij.openapi.util.text.StringUtil; -import com.intellij.util.containers.ContainerUtil; import com.intellij.util.containers.hash.LinkedHashMap; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -85,8 +83,6 @@ public final class StaticContext { @NotNull private final Generator innerNames = new InnerNameGenerator(); @NotNull - private final Map packageNames = Maps.newHashMap(); - @NotNull private final Generator scopes = new ScopeGenerator(); @NotNull private final Generator objectInstanceNames = new ObjectInstanceNameGenerator(); @@ -123,9 +119,6 @@ public final class StaticContext { @NotNull private final Map importedModules = new LinkedHashMap<>(); - @NotNull - private final JsScope rootPackageScope; - @NotNull private final DeclarationExporter exporter = new DeclarationExporter(this); @@ -142,6 +135,8 @@ public final class StaticContext { private final Map specialFunctions = new EnumMap<>(SpecialFunction.class); + private final Map intrinsicNames = new HashMap<>(); + public StaticContext( @NotNull BindingTrace bindingTrace, @NotNull JsConfig config, @@ -153,11 +148,10 @@ public final class StaticContext { this.bindingTrace = bindingTrace; this.namer = Namer.newInstance(program.getRootScope()); - this.intrinsics = new Intrinsics(this); + this.intrinsics = new Intrinsics(); this.rootScope = fragment.getScope(); this.config = config; this.currentModule = moduleDescriptor; - rootPackageScope = new JsObjectScope(rootScope, ""); JsName kotlinName = rootScope.declareName(Namer.KOTLIN_NAME); createImportedModule(new JsImportedModuleKey(Namer.KOTLIN_LOWER_NAME, null), Namer.KOTLIN_LOWER_NAME, kotlinName, null); @@ -329,12 +323,6 @@ public final class StaticContext { return expression; } - @NotNull - public JsNameRef getQualifiedReference(@NotNull FqName packageFqName) { - JsName packageName = getNameForPackage(packageFqName); - return pureFqn(packageName, packageFqName.isRoot() ? null : getQualifierForParentPackage(packageFqName.parent())); - } - @NotNull public JsName getNameForDescriptor(@NotNull DeclarationDescriptor descriptor) { if (descriptor instanceof ClassDescriptor && KotlinBuiltIns.isAny((ClassDescriptor) descriptor)) { @@ -438,47 +426,13 @@ public final class StaticContext { return names; } - @NotNull - private JsName getNameForPackage(@NotNull FqName packageFqName) { - return ContainerUtil.getOrCreate(packageNames, packageFqName, (Factory) () -> { - String name = Namer.generatePackageName(packageFqName); - return rootPackageScope.declareName(name); - }); - } - - @NotNull - private JsNameRef getQualifierForParentPackage(@NotNull FqName packageFqName) { - JsNameRef result = null; - JsNameRef qualifier = null; - - FqName fqName = packageFqName; - - while (true) { - JsNameRef ref = pureFqn(getNameForPackage(fqName), null); - - if (qualifier == null) { - result = ref; - } - else { - qualifier.setQualifier(ref); - } - - qualifier = ref; - - if (fqName.isRoot()) break; - fqName = fqName.parent(); - } - - return result; - } - @NotNull public JsConfig getConfig() { return config; } @NotNull - public JsName importDeclaration(@NotNull String suggestedName, @NotNull String tag, @NotNull JsExpression declaration) { + private JsName importDeclaration(@NotNull String suggestedName, @NotNull String tag, @NotNull JsExpression declaration) { JsName result = importDeclarationImpl(suggestedName, tag, declaration); fragment.getNameBindings().add(new JsNameBinding(tag, result)); return result; @@ -871,4 +825,13 @@ public final class StaticContext { return name; }); } + + + @NotNull + public JsExpression getReferenceToIntrinsic(@NotNull String name) { + JsName resultName = intrinsicNames.computeIfAbsent(name, k -> + importDeclaration(NameSuggestion.sanitizeName(name), "intrinsic:" + name, TranslationUtils.getIntrinsicFqn(name))); + + return pureFqn(resultName, null); + } } diff --git a/js/js.translator/src/org/jetbrains/kotlin/js/translate/context/TranslationContext.java b/js/js.translator/src/org/jetbrains/kotlin/js/translate/context/TranslationContext.java index e3e1a583fbf..7e79141058c 100644 --- a/js/js.translator/src/org/jetbrains/kotlin/js/translate/context/TranslationContext.java +++ b/js/js.translator/src/org/jetbrains/kotlin/js/translate/context/TranslationContext.java @@ -28,6 +28,7 @@ import org.jetbrains.kotlin.js.backend.ast.*; import org.jetbrains.kotlin.js.backend.ast.metadata.MetadataProperties; import org.jetbrains.kotlin.js.backend.ast.metadata.SpecialFunction; import org.jetbrains.kotlin.js.config.JsConfig; +import org.jetbrains.kotlin.js.naming.NameSuggestion; import org.jetbrains.kotlin.js.naming.SuggestedName; import org.jetbrains.kotlin.js.translate.declaration.ClassModelGenerator; import org.jetbrains.kotlin.js.translate.intrinsic.Intrinsics; @@ -317,6 +318,27 @@ public class TranslationContext { return name; } + @NotNull + public JsExpression getReferenceToIntrinsic(@NotNull String intrinsicName) { + JsExpression result; + if (inlineFunctionContext == null || !isPublicInlineFunction()) { + result = staticContext.getReferenceToIntrinsic(intrinsicName); + } + else { + String tag = "intrinsic:" + intrinsicName; + result = pureFqn(inlineFunctionContext.getImports().computeIfAbsent(tag, t -> { + JsExpression imported = TranslationUtils.getIntrinsicFqn(intrinsicName); + + JsName name = JsScope.declareTemporaryName(NameSuggestion.sanitizeName(intrinsicName)); + MetadataProperties.setImported(name, true); + inlineFunctionContext.getImportBlock().getStatements().add(JsAstUtils.newVar(name, imported)); + return name; + }), null); + } + + return result; + } + @NotNull public JsName getNameForObjectInstance(@NotNull ClassDescriptor descriptor) { return staticContext.getNameForObjectInstance(descriptor); diff --git a/js/js.translator/src/org/jetbrains/kotlin/js/translate/declaration/ClassTranslator.kt b/js/js.translator/src/org/jetbrains/kotlin/js/translate/declaration/ClassTranslator.kt index 458f664f813..45d06d93a54 100644 --- a/js/js.translator/src/org/jetbrains/kotlin/js/translate/declaration/ClassTranslator.kt +++ b/js/js.translator/src/org/jetbrains/kotlin/js/translate/declaration/ClassTranslator.kt @@ -208,13 +208,14 @@ class ClassTranslator private constructor( private fun createMetadataRef() = JsNameRef(Namer.METADATA, context().getInnerReference(descriptor)) private fun addMetadataType() { - val kotlinType = JsNameRef(Namer.CLASS_KIND_ENUM, Namer.KOTLIN_NAME) - val typeRef = when { - DescriptorUtils.isInterface(descriptor) -> JsNameRef(Namer.CLASS_KIND_INTERFACE, kotlinType) - DescriptorUtils.isObject(descriptor) -> JsNameRef(Namer.CLASS_KIND_OBJECT, kotlinType) - else -> JsNameRef(Namer.CLASS_KIND_CLASS, kotlinType) - } + val kindBuilder = StringBuilder(Namer.CLASS_KIND_ENUM + ".") + kindBuilder.append(when { + DescriptorUtils.isInterface(descriptor) -> Namer.CLASS_KIND_INTERFACE + DescriptorUtils.isObject(descriptor) -> Namer.CLASS_KIND_OBJECT + else -> Namer.CLASS_KIND_CLASS + }) + val typeRef = context().getReferenceToIntrinsic(kindBuilder.toString()) metadataLiteral.propertyInitializers += JsPropertyInitializer(JsNameRef(Namer.METADATA_CLASS_KIND), typeRef) val simpleName = descriptor.name diff --git a/js/js.translator/src/org/jetbrains/kotlin/js/translate/declaration/EnumTranslator.kt b/js/js.translator/src/org/jetbrains/kotlin/js/translate/declaration/EnumTranslator.kt index 43784f00225..c547f9bb68b 100644 --- a/js/js.translator/src/org/jetbrains/kotlin/js/translate/declaration/EnumTranslator.kt +++ b/js/js.translator/src/org/jetbrains/kotlin/js/translate/declaration/EnumTranslator.kt @@ -65,7 +65,8 @@ class EnumTranslator( val message = JsBinaryOperation(JsBinaryOperator.ADD, JsStringLiteral("No enum constant ${descriptor.fqNameSafe}."), nameParam.makeRef()) - val throwStatement = JsExpressionStatement(JsInvocation(Namer.throwIllegalStateExceptionFunRef(), message).source(psi)) + val throwFunction = context().getReferenceToIntrinsic(Namer.THROW_ILLEGAL_STATE_EXCEPTION_FUN_NAME) + val throwStatement = JsExpressionStatement(JsInvocation(throwFunction, message).source(psi)) if (clauses.isNotEmpty()) { val defaultCase = JsDefault().apply { diff --git a/js/js.translator/src/org/jetbrains/kotlin/js/translate/declaration/PropertyTranslator.kt b/js/js.translator/src/org/jetbrains/kotlin/js/translate/declaration/PropertyTranslator.kt index 2ffe76ee9c7..b2cfb84a5c9 100644 --- a/js/js.translator/src/org/jetbrains/kotlin/js/translate/declaration/PropertyTranslator.kt +++ b/js/js.translator/src/org/jetbrains/kotlin/js/translate/declaration/PropertyTranslator.kt @@ -29,7 +29,6 @@ import org.jetbrains.kotlin.js.translate.expression.translateFunction import org.jetbrains.kotlin.js.translate.general.AbstractTranslator import org.jetbrains.kotlin.js.translate.general.Translation import org.jetbrains.kotlin.js.translate.utils.BindingUtils -import org.jetbrains.kotlin.js.translate.utils.JsAstUtils.pureFqn import org.jetbrains.kotlin.js.translate.utils.JsDescriptorUtils import org.jetbrains.kotlin.js.translate.utils.TranslationUtils import org.jetbrains.kotlin.js.translate.utils.TranslationUtils.* @@ -95,8 +94,9 @@ class DefaultPropertyTranslator( assert(descriptor is PropertyDescriptor) { "Property descriptor expected: $descriptor" } val result = backingFieldReference(context(), descriptor as PropertyDescriptor) if (getterDescriptor is PropertyAccessorDescriptor && getterDescriptor.correspondingProperty.isLateInit) { + val throwFunction = context().getReferenceToIntrinsic(Namer.THROW_UNINITIALIZED_PROPERTY_ACCESS_EXCEPTION) function.body.statements += JsIf(JsBinaryOperation(JsBinaryOperator.EQ, result, JsNullLiteral()), - JsReturn(JsInvocation(Namer.throwUninitializedPropertyAccessExceptionFunRef(), + JsReturn(JsInvocation(throwFunction, JsStringLiteral(getterDescriptor.correspondingProperty.name.asString())))) } function.body.statements += JsReturn(result).apply { source = descriptor.source.getPsi() } @@ -195,7 +195,7 @@ fun TranslationContext.contextWithPropertyMetadataCreationIntrinsified( (delegatedCall.valueArgumentsByIndex!![1] as ExpressionValueArgument).valueArgument!!.getArgumentExpression() return innerContextWithAliasesForExpressions(mapOf( hostExpression to host, - fakeArgumentExpression to JsNew(pureFqn("PropertyMetadata", Namer.kotlinObject()), listOf(propertyNameLiteral)) + fakeArgumentExpression to JsNew(getReferenceToIntrinsic("PropertyMetadata"), listOf(propertyNameLiteral)) )) } diff --git a/js/js.translator/src/org/jetbrains/kotlin/js/translate/expression/ExpressionVisitor.java b/js/js.translator/src/org/jetbrains/kotlin/js/translate/expression/ExpressionVisitor.java index 6b2f6fd7da5..9cc0169bad2 100644 --- a/js/js.translator/src/org/jetbrains/kotlin/js/translate/expression/ExpressionVisitor.java +++ b/js/js.translator/src/org/jetbrains/kotlin/js/translate/expression/ExpressionVisitor.java @@ -263,7 +263,7 @@ public final class ExpressionVisitor extends TranslatorVisitor { return new JsInvocation(context.namer().kotlin(GET_KCLASS_FROM_EXPRESSION), receiver); } - return new JsInvocation(context.namer().kotlin(GET_KCLASS), UtilsKt.getReferenceToJsClass(lhs.getType(), context)); + return new JsInvocation(context.getReferenceToIntrinsic(GET_KCLASS), UtilsKt.getReferenceToJsClass(lhs.getType(), context)); } diff --git a/js/js.translator/src/org/jetbrains/kotlin/js/translate/expression/PatternTranslator.java b/js/js.translator/src/org/jetbrains/kotlin/js/translate/expression/PatternTranslator.java index 30c29147da2..08926c5b3c1 100644 --- a/js/js.translator/src/org/jetbrains/kotlin/js/translate/expression/PatternTranslator.java +++ b/js/js.translator/src/org/jetbrains/kotlin/js/translate/expression/PatternTranslator.java @@ -94,7 +94,7 @@ public final class PatternTranslator extends AbstractTranslator { onFail = new JsNullLiteral(); } else { - JsExpression throwCCEFunRef = Namer.throwClassCastExceptionFunRef(); + JsExpression throwCCEFunRef = context().getReferenceToIntrinsic(Namer.THROW_CLASS_CAST_EXCEPTION_FUN_NAME); onFail = new JsInvocation(throwCCEFunRef); } diff --git a/js/js.translator/src/org/jetbrains/kotlin/js/translate/intrinsic/Intrinsics.java b/js/js.translator/src/org/jetbrains/kotlin/js/translate/intrinsic/Intrinsics.java index a010936b3d2..6528ab3bf79 100644 --- a/js/js.translator/src/org/jetbrains/kotlin/js/translate/intrinsic/Intrinsics.java +++ b/js/js.translator/src/org/jetbrains/kotlin/js/translate/intrinsic/Intrinsics.java @@ -19,7 +19,6 @@ package org.jetbrains.kotlin.js.translate.intrinsic; import org.jetbrains.annotations.NotNull; import org.jetbrains.kotlin.descriptors.ClassDescriptor; import org.jetbrains.kotlin.descriptors.FunctionDescriptor; -import org.jetbrains.kotlin.js.translate.context.StaticContext; import org.jetbrains.kotlin.js.translate.context.TranslationContext; import org.jetbrains.kotlin.js.translate.intrinsic.functions.FunctionIntrinsics; import org.jetbrains.kotlin.js.translate.intrinsic.functions.basic.FunctionIntrinsic; @@ -37,8 +36,8 @@ public final class Intrinsics { private final BinaryOperationIntrinsics binaryOperationIntrinsics = new BinaryOperationIntrinsics(); private final ObjectIntrinsics objectIntrinsics; - public Intrinsics(@NotNull StaticContext staticContext) { - objectIntrinsics = new ObjectIntrinsics(staticContext); + public Intrinsics() { + objectIntrinsics = new ObjectIntrinsics(); } @NotNull diff --git a/js/js.translator/src/org/jetbrains/kotlin/js/translate/intrinsic/functions/factories/KotlinAliasedFunctionIntrinsic.kt b/js/js.translator/src/org/jetbrains/kotlin/js/translate/intrinsic/functions/factories/KotlinAliasedFunctionIntrinsic.kt new file mode 100644 index 00000000000..eef982c3522 --- /dev/null +++ b/js/js.translator/src/org/jetbrains/kotlin/js/translate/intrinsic/functions/factories/KotlinAliasedFunctionIntrinsic.kt @@ -0,0 +1,50 @@ +/* + * Copyright 2010-2017 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. + */ + +/* + * Copyright 2010-2017 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.js.translate.intrinsic.functions.factories + +import org.jetbrains.kotlin.js.backend.ast.JsExpression +import org.jetbrains.kotlin.js.backend.ast.JsInvocation +import org.jetbrains.kotlin.js.translate.context.TranslationContext +import org.jetbrains.kotlin.js.translate.intrinsic.functions.basic.FunctionIntrinsicWithReceiverComputed +import org.jetbrains.kotlin.js.translate.utils.TranslationUtils + +open class KotlinAliasedFunctionIntrinsic(private val functionName: String) : FunctionIntrinsicWithReceiverComputed() { + override fun apply( + receiver: JsExpression?, + arguments: List, + context: TranslationContext + ): JsExpression { + val function = context.getReferenceToIntrinsic(functionName) + return JsInvocation(function, if (receiver == null) arguments else TranslationUtils.generateInvocationArguments(receiver, arguments)) + } +} \ No newline at end of file diff --git a/js/js.translator/src/org/jetbrains/kotlin/js/translate/intrinsic/functions/factories/TopLevelFIF.java b/js/js.translator/src/org/jetbrains/kotlin/js/translate/intrinsic/functions/factories/TopLevelFIF.java index af13c6949ff..487763c4dd8 100644 --- a/js/js.translator/src/org/jetbrains/kotlin/js/translate/intrinsic/functions/factories/TopLevelFIF.java +++ b/js/js.translator/src/org/jetbrains/kotlin/js/translate/intrinsic/functions/factories/TopLevelFIF.java @@ -47,7 +47,7 @@ import static org.jetbrains.kotlin.js.patterns.PatternBuilder.pattern; public final class TopLevelFIF extends CompositeFIF { public static final DescriptorPredicate EQUALS_IN_ANY = pattern("kotlin", "Any", "equals"); @NotNull - private static final KotlinFunctionIntrinsic KOTLIN_ANY_EQUALS = new KotlinFunctionIntrinsic("equals") { + private static final KotlinAliasedFunctionIntrinsic KOTLIN_ANY_EQUALS = new KotlinAliasedFunctionIntrinsic("equals") { @NotNull @Override public JsExpression apply( @@ -65,7 +65,7 @@ public final class TopLevelFIF extends CompositeFIF { }; @NotNull - public static final KotlinFunctionIntrinsic KOTLIN_EQUALS = new KotlinFunctionIntrinsic("equals"); + public static final KotlinAliasedFunctionIntrinsic KOTLIN_EQUALS = new KotlinAliasedFunctionIntrinsic("equals"); @NotNull private static final KotlinFunctionIntrinsic KOTLIN_SUBSEQUENCE = new KotlinFunctionIntrinsic("subSequence"); @@ -73,7 +73,7 @@ public final class TopLevelFIF extends CompositeFIF { @NotNull private static final DescriptorPredicate HASH_CODE_IN_ANY = pattern("kotlin", "Any", "hashCode"); @NotNull - private static final KotlinFunctionIntrinsic KOTLIN_HASH_CODE = new KotlinFunctionIntrinsic("hashCode"); + private static final KotlinAliasedFunctionIntrinsic KOTLIN_HASH_CODE = new KotlinAliasedFunctionIntrinsic("hashCode"); @NotNull private static final FunctionIntrinsic RETURN_RECEIVER_INTRINSIC = new FunctionIntrinsicWithReceiverComputed() { @@ -164,7 +164,7 @@ public final class TopLevelFIF extends CompositeFIF { @NotNull - public static final KotlinFunctionIntrinsic TO_STRING = new KotlinFunctionIntrinsic("toString"); + public static final KotlinAliasedFunctionIntrinsic TO_STRING = new KotlinAliasedFunctionIntrinsic("toString"); @NotNull private static final FunctionIntrinsic CHAR_TO_STRING = new FunctionIntrinsicWithReceiverComputed() { diff --git a/js/js.translator/src/org/jetbrains/kotlin/js/translate/intrinsic/objects/objectsIntrinsics.kt b/js/js.translator/src/org/jetbrains/kotlin/js/translate/intrinsic/objects/objectsIntrinsics.kt index 41910d9149c..877ccd61147 100644 --- a/js/js.translator/src/org/jetbrains/kotlin/js/translate/intrinsic/objects/objectsIntrinsics.kt +++ b/js/js.translator/src/org/jetbrains/kotlin/js/translate/intrinsic/objects/objectsIntrinsics.kt @@ -20,25 +20,16 @@ import org.jetbrains.kotlin.builtins.CompanionObjectMapping import org.jetbrains.kotlin.builtins.KotlinBuiltIns import org.jetbrains.kotlin.descriptors.ClassDescriptor import org.jetbrains.kotlin.js.backend.ast.JsExpression -import org.jetbrains.kotlin.js.backend.ast.JsName -import org.jetbrains.kotlin.js.translate.context.Namer -import org.jetbrains.kotlin.js.translate.context.StaticContext import org.jetbrains.kotlin.js.translate.context.TranslationContext -import org.jetbrains.kotlin.js.translate.utils.JsAstUtils import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.resolve.descriptorUtil.fqNameUnsafe -class DefaultClassObjectIntrinsic(val staticContext: StaticContext, val tag: String, val fqName: FqName): ObjectIntrinsic { - private val innerName: JsName by lazy { - val declaration = JsAstUtils.replaceRootReference(staticContext.getQualifiedReference(fqName), Namer.kotlinObject()) - staticContext.importDeclaration(fqName.shortName().asString(), tag, declaration) - } - - override fun apply(context: TranslationContext) = JsAstUtils.pureFqn(innerName, null) +class DefaultClassObjectIntrinsic( val fqName: FqName): ObjectIntrinsic { + override fun apply(context: TranslationContext) = context.getReferenceToIntrinsic(fqName.asString()) } -class ObjectIntrinsics(private val staticContext: StaticContext) { +class ObjectIntrinsics { private val cache = mutableMapOf() fun getIntrinsic(classDescriptor: ClassDescriptor) = cache.getOrPut(classDescriptor) { createIntrinsic(classDescriptor) } @@ -53,8 +44,7 @@ class ObjectIntrinsics(private val staticContext: StaticContext) { val containingDeclaration = classDescriptor.containingDeclaration val name = Name.identifier(containingDeclaration.name.asString() + "CompanionObject") - return DefaultClassObjectIntrinsic( - staticContext, "intrinsic:kotlin.js.internal.${name.asString()}", FqName("kotlin.js.internal").child(name)) + return DefaultClassObjectIntrinsic(FqName("kotlin.js.internal").child(name)) } } diff --git a/js/js.translator/src/org/jetbrains/kotlin/js/translate/reference/CallableReferenceTranslator.kt b/js/js.translator/src/org/jetbrains/kotlin/js/translate/reference/CallableReferenceTranslator.kt index 82d2e1fd4d3..33477cdd581 100644 --- a/js/js.translator/src/org/jetbrains/kotlin/js/translate/reference/CallableReferenceTranslator.kt +++ b/js/js.translator/src/org/jetbrains/kotlin/js/translate/reference/CallableReferenceTranslator.kt @@ -135,7 +135,7 @@ object CallableReferenceTranslator { function.body.statements += JsReturn(TranslationUtils.coerce(context, invocation, context.currentModule.builtIns.anyType)) val rawCallableRef = bindIfNecessary(function, receiver) - return wrapFunctionCallableRef(expression.callableReference.getReferencedName(), rawCallableRef) + return context.wrapFunctionCallableRef(expression.callableReference.getReferencedName(), rawCallableRef) } private fun translateForProperty( @@ -168,7 +168,7 @@ object CallableReferenceTranslator { null } - return wrapPropertyCallableRef(receiver, descriptor, expression.callableReference.getReferencedName(), getter, setter) + return context.wrapPropertyCallableRef(receiver, descriptor, expression.callableReference.getReferencedName(), getter, setter) } private fun isSetterVisible(descriptor: PropertyDescriptor, context: TranslationContext): Boolean { @@ -225,7 +225,7 @@ object CallableReferenceTranslator { } } - private fun wrapPropertyCallableRef( + private fun TranslationContext.wrapPropertyCallableRef( receiver: JsExpression?, descriptor: PropertyDescriptor, name: String, @@ -238,7 +238,7 @@ object CallableReferenceTranslator { } val nameLiteral = JsStringLiteral(name) val argCountLiteral = JsIntLiteral(argCount) - val invokeFun = JsNameRef(Namer.PROPERTY_CALLABLE_REF, Namer.kotlinObject()) + val invokeFun = getReferenceToIntrinsic(Namer.PROPERTY_CALLABLE_REF) val invocation = JsInvocation(invokeFun, nameLiteral, argCountLiteral, getter) if (setter != null) { invocation.arguments += setter @@ -246,13 +246,12 @@ object CallableReferenceTranslator { return invocation } - private fun wrapFunctionCallableRef( + private fun TranslationContext.wrapFunctionCallableRef( name: String, function: JsExpression ): JsExpression { val nameLiteral = JsStringLiteral(name) - val invokeName = Namer.FUNCTION_CALLABLE_REF - val invokeFun = JsNameRef(invokeName, Namer.kotlinObject()) + val invokeFun = getReferenceToIntrinsic(Namer.FUNCTION_CALLABLE_REF) invokeFun.sideEffects = SideEffectKind.PURE val invocation = JsInvocation(invokeFun, nameLiteral, function) invocation.isCallableReference = true diff --git a/js/js.translator/src/org/jetbrains/kotlin/js/translate/reference/VariableAccessTranslator.java b/js/js.translator/src/org/jetbrains/kotlin/js/translate/reference/VariableAccessTranslator.java index eaba7744093..1511324bad2 100644 --- a/js/js.translator/src/org/jetbrains/kotlin/js/translate/reference/VariableAccessTranslator.java +++ b/js/js.translator/src/org/jetbrains/kotlin/js/translate/reference/VariableAccessTranslator.java @@ -83,8 +83,8 @@ public class VariableAccessTranslator extends AbstractTranslator implements Acce else if (original instanceof LocalVariableDescriptor) { LocalVariableDescriptor originalLocal = (LocalVariableDescriptor) original; if (originalLocal.isLateInit()) { - JsInvocation throwInvocation = new JsInvocation(Namer.throwUninitializedPropertyAccessExceptionFunRef(), - new JsStringLiteral(originalLocal.getName().asString())); + JsExpression throwFunction = context().getReferenceToIntrinsic(Namer.THROW_UNINITIALIZED_PROPERTY_ACCESS_EXCEPTION); + JsInvocation throwInvocation = new JsInvocation(throwFunction, new JsStringLiteral(originalLocal.getName().asString())); return new JsConditional(new JsBinaryOperation(JsBinaryOperator.EQ, e, new JsNullLiteral()), throwInvocation, e); } } diff --git a/js/js.translator/src/org/jetbrains/kotlin/js/translate/utils/TranslationUtils.java b/js/js.translator/src/org/jetbrains/kotlin/js/translate/utils/TranslationUtils.java index 9aec9041bab..35d98c35268 100644 --- a/js/js.translator/src/org/jetbrains/kotlin/js/translate/utils/TranslationUtils.java +++ b/js/js.translator/src/org/jetbrains/kotlin/js/translate/utils/TranslationUtils.java @@ -16,6 +16,7 @@ package org.jetbrains.kotlin.js.translate.utils; +import com.intellij.openapi.util.text.StringUtil; import com.intellij.psi.PsiElement; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -226,17 +227,6 @@ public final class TranslationUtils { return Translation.translateAsExpression(baseExpression, context); } - @NotNull - public static JsExpression translateLeftExpression( - @NotNull TranslationContext context, - @NotNull KtBinaryExpression expression, - @NotNull JsBlock block - ) { - KtExpression left = expression.getLeft(); - assert left != null : "Binary expression should have a left expression: " + expression.getText(); - return Translation.translateAsExpression(left, context, block); - } - @NotNull public static JsExpression translateRightExpression( @NotNull TranslationContext context, @@ -305,7 +295,7 @@ public final class TranslationUtils { @NotNull public static JsConditional sure(@NotNull JsExpression expression, @NotNull TranslationContext context) { - JsInvocation throwNPE = new JsInvocation(Namer.throwNPEFunctionRef()); + JsInvocation throwNPE = new JsInvocation(context.getReferenceToIntrinsic(Namer.THROW_NPE_FUN_NAME)); JsConditional ensureNotNull = notNullConditional(expression, throwNPE, context); JsExpression thenExpression = ensureNotNull.getThenExpression(); @@ -548,4 +538,13 @@ public final class TranslationUtils { public static String getTagForSpecialFunction(@NotNull SpecialFunction specialFunction) { return "special:" + specialFunction.name(); } + + @NotNull + public static JsExpression getIntrinsicFqn(@NotNull String name) { + JsExpression fqn = pureFqn(Namer.KOTLIN_NAME, null); + for (String part : StringUtil.split(name, ".")) { + fqn = pureFqn(part, fqn); + } + return fqn; + } } diff --git a/js/js.translator/testData/box/expression/evaluationOrder/secondaryConstructorTemporaryVars.kt b/js/js.translator/testData/box/expression/evaluationOrder/secondaryConstructorTemporaryVars.kt index ab19a3ea3bb..c532bd5e70b 100644 --- a/js/js.translator/testData/box/expression/evaluationOrder/secondaryConstructorTemporaryVars.kt +++ b/js/js.translator/testData/box/expression/evaluationOrder/secondaryConstructorTemporaryVars.kt @@ -1,5 +1,5 @@ // EXPECTED_REACHABLE_NODES: 995 -// HAS_NO_CAPTURED_VARS: function=A_init except=Kotlin;A +// HAS_NO_CAPTURED_VARS: function=A_init except=Kotlin;A;equals class A() { var y: String? = null diff --git a/js/js.translator/testData/lineNumbers/inlineReturn.kt b/js/js.translator/testData/lineNumbers/inlineReturn.kt index 46c862ad3b3..89b2acc48d4 100644 --- a/js/js.translator/testData/lineNumbers/inlineReturn.kt +++ b/js/js.translator/testData/lineNumbers/inlineReturn.kt @@ -21,4 +21,4 @@ fun bar(x: Int) { println("%") } -// LINES: 1 1 1 1 1 1 1 17 2 2 3 3 4 7 7 9 9 10 10 11 14 14 16 16 1 1 22 20 20 20 20 2 2 3 3 4 3 7 7 9 9 10 10 11 10 14 14 16 16 * 20 21 21 \ No newline at end of file +// LINES: 1 1 1 1 1 1 1 1 1 17 2 2 3 3 4 7 7 9 9 10 10 11 14 14 16 16 1 1 1 1 22 20 20 20 20 2 2 3 3 4 3 7 7 9 9 10 10 11 10 14 14 16 16 * 20 21 21 \ No newline at end of file From ee4d790f43a5317fe7749692b88a2e9bb4d4d3c2 Mon Sep 17 00:00:00 2001 From: Alexey Andreev Date: Wed, 13 Sep 2017 16:47:46 +0300 Subject: [PATCH 025/212] JS: optimize default arguments in cross-module inliner This reduces size of circlet UI (of approx 2.5 mb) by about 90 kb --- .../kotlin/js/inline/FunctionReader.kt | 22 +++++++++++++++++++ .../kotlin/js/inline/util/namingUtils.kt | 8 ++++++- .../js/test/semantics/BoxJsTestGenerated.java | 6 +++++ .../multiModuleDefaultArgsCleanup.kt | 17 ++++++++++++++ 4 files changed, 52 insertions(+), 1 deletion(-) create mode 100644 js/js.translator/testData/box/inlineSizeReduction/multiModuleDefaultArgsCleanup.kt diff --git a/js/js.inliner/src/org/jetbrains/kotlin/js/inline/FunctionReader.kt b/js/js.inliner/src/org/jetbrains/kotlin/js/inline/FunctionReader.kt index 8603df06d2e..c01ad90a15d 100644 --- a/js/js.inliner/src/org/jetbrains/kotlin/js/inline/FunctionReader.kt +++ b/js/js.inliner/src/org/jetbrains/kotlin/js/inline/FunctionReader.kt @@ -30,6 +30,7 @@ import org.jetbrains.kotlin.js.parser.parseFunction import org.jetbrains.kotlin.js.parser.sourcemaps.* import org.jetbrains.kotlin.js.translate.context.Namer import org.jetbrains.kotlin.js.translate.expression.InlineMetadata +import org.jetbrains.kotlin.js.translate.utils.JsAstUtils import org.jetbrains.kotlin.js.translate.utils.JsDescriptorUtils.getModuleName import org.jetbrains.kotlin.resolve.descriptorUtil.isExtension import org.jetbrains.kotlin.resolve.inline.InlineStrategy @@ -243,6 +244,7 @@ class FunctionReader( replaceExternalNames(function, replacements, allDefinedNames) wrapperStatements?.forEach { replaceExternalNames(it, replacements, allDefinedNames) } function.markInlineArguments(descriptor) + markDefaultParams(function) info.wrapFunctionVariable.let { wrapFunction -> for (externalName in (collectReferencedNames(function) - allDefinedNames).filter { it.ident == wrapFunction }) { @@ -270,6 +272,26 @@ class FunctionReader( return FunctionWithWrapper(function, wrapper) } + + private fun markDefaultParams(function: JsFunction) { + val paramsByNames = function.parameters.associate { it.name to it } + for (ifStatement in function.body.statements) { + if (ifStatement !is JsIf || ifStatement.elseStatement != null) break + val thenStatement = ifStatement.thenStatement as? JsExpressionStatement ?: break + val testExpression = ifStatement.ifExpression as? JsBinaryOperation ?: break + + if (testExpression.operator != JsBinaryOperator.REF_EQ) break + val testLhs = testExpression.arg1 as? JsNameRef ?: break + val param = paramsByNames[testLhs.name] ?: break + if (testLhs.qualifier != null) break + if ((testExpression.arg2 as? JsPrefixOperation)?.operator != JsUnaryOperator.VOID) break + + val (assignLhs) = JsAstUtils.decomposeAssignmentToVariable(thenStatement.expression) ?: break + if (assignLhs != testLhs.name) break + + param.hasDefaultValue = true + } + } } private val Char.isWhitespaceOrComma: Boolean diff --git a/js/js.inliner/src/org/jetbrains/kotlin/js/inline/util/namingUtils.kt b/js/js.inliner/src/org/jetbrains/kotlin/js/inline/util/namingUtils.kt index 96b8060ced2..0e13ec1293c 100644 --- a/js/js.inliner/src/org/jetbrains/kotlin/js/inline/util/namingUtils.kt +++ b/js/js.inliner/src/org/jetbrains/kotlin/js/inline/util/namingUtils.kt @@ -21,6 +21,7 @@ import org.jetbrains.kotlin.js.backend.ast.metadata.staticRef import org.jetbrains.kotlin.js.inline.context.NamingContext import org.jetbrains.kotlin.js.inline.util.rewriters.LabelNameRefreshingVisitor +import org.jetbrains.kotlin.js.translate.utils.JsAstUtils fun aliasArgumentsIfNeeded( context: NamingContext, @@ -30,7 +31,12 @@ fun aliasArgumentsIfNeeded( ) { require(arguments.size <= parameters.size) { "arguments.size (${arguments.size}) should be less or equal to parameters.size (${parameters.size})" } + val defaultParams = mutableListOf() for ((arg, param) in arguments.zip(parameters)) { + if (JsAstUtils.isUndefinedExpression(arg)) { + defaultParams += param + continue + } val paramName = param.name val replacement = JsScope.declareTemporaryName(paramName.ident).apply { @@ -42,7 +48,7 @@ fun aliasArgumentsIfNeeded( context.replaceName(paramName, replacement) } - val defaultParams = parameters.subList(arguments.size, parameters.size) + defaultParams += parameters.subList(arguments.size, parameters.size) for (defaultParam in defaultParams) { val paramName = defaultParam.name val freshName = JsScope.declareTemporaryName(paramName.ident) diff --git a/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/BoxJsTestGenerated.java b/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/BoxJsTestGenerated.java index 49ad27ab878..e5fb9d3cb6a 100644 --- a/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/BoxJsTestGenerated.java +++ b/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/BoxJsTestGenerated.java @@ -5096,6 +5096,12 @@ public class BoxJsTestGenerated extends AbstractBoxJsTest { doTest(fileName); } + @TestMetadata("multiModuleDefaultArgsCleanup.kt") + public void testMultiModuleDefaultArgsCleanup() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("js/js.translator/testData/box/inlineSizeReduction/multiModuleDefaultArgsCleanup.kt"); + doTest(fileName); + } + @TestMetadata("noDuplicateVariableDeclaration.kt") public void testNoDuplicateVariableDeclaration() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("js/js.translator/testData/box/inlineSizeReduction/noDuplicateVariableDeclaration.kt"); diff --git a/js/js.translator/testData/box/inlineSizeReduction/multiModuleDefaultArgsCleanup.kt b/js/js.translator/testData/box/inlineSizeReduction/multiModuleDefaultArgsCleanup.kt new file mode 100644 index 00000000000..303d60680b7 --- /dev/null +++ b/js/js.translator/testData/box/inlineSizeReduction/multiModuleDefaultArgsCleanup.kt @@ -0,0 +1,17 @@ +// EXPECTED_REACHABLE_NODES: 1018 +// MODULE: lib +// FILE: lib.kt +inline fun foo(x: String = "x", y: String = "y") = x + y + +// MODULE: main(lib) +// FILE: main.kt +// CHECK_VARS_COUNT: function=test count=0 + +fun test() = foo() + ";" + foo(x = "X") + ";" + foo(y = "Y") + ";" + foo(x = "X", y = "Y") + +fun box(): String { + val r = test() + if (test() != "xy;Xy;xY;XY") return "fail: $r" + + return "OK" +} \ No newline at end of file From f348ee9381132ce47f7bf70c145a013bff772b26 Mon Sep 17 00:00:00 2001 From: Mikhail Glukhikh Date: Tue, 19 Sep 2017 17:52:19 +0300 Subject: [PATCH 026/212] Fix a pair of multi-platform messages #KT-20327 Fixed --- .../kotlin/diagnostics/rendering/DefaultErrorMessages.java | 2 +- .../rendering/PlatformIncompatibilityDiagnosticRenderer.kt | 2 +- compiler/testData/multiplatform/missingOverload/output.txt | 2 +- .../org/jetbrains/kotlin/idea/highlighter/IdeErrorMessages.java | 2 +- idea/testData/quickfix/implement/doNotAddHeader.kt | 2 +- idea/testData/quickfix/implement/doNotAddHeader.kt.after | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/rendering/DefaultErrorMessages.java b/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/rendering/DefaultErrorMessages.java index 8895bd3b90b..03f022b932d 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/rendering/DefaultErrorMessages.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/rendering/DefaultErrorMessages.java @@ -276,7 +276,7 @@ public class DefaultErrorMessages { MAP.put(ACTUAL_TYPE_ALIAS_WITH_USE_SITE_VARIANCE, "Right-hand side of actual type alias cannot contain use-site variance or star projections"); MAP.put(ACTUAL_TYPE_ALIAS_WITH_COMPLEX_SUBSTITUTION, "Type arguments in the right-hand side of actual type alias should be its type parameters in the same order, e.g. 'actual typealias Foo = Bar'"); - MAP.put(NO_ACTUAL_FOR_EXPECT, "Expected {0} has no actual in module{1}{2}", DECLARATION_NAME_WITH_KIND, + MAP.put(NO_ACTUAL_FOR_EXPECT, "Expected {0} has no actual declaration in module{1}{2}", DECLARATION_NAME_WITH_KIND, PLATFORM, PlatformIncompatibilityDiagnosticRenderer.TEXT); MAP.put(ACTUAL_WITHOUT_EXPECT, "Actual {0} has no corresponding expected declaration{1}", DECLARATION_NAME_WITH_KIND, PlatformIncompatibilityDiagnosticRenderer.TEXT); diff --git a/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/rendering/PlatformIncompatibilityDiagnosticRenderer.kt b/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/rendering/PlatformIncompatibilityDiagnosticRenderer.kt index 3cf85f8c352..76f4f9fa43a 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/rendering/PlatformIncompatibilityDiagnosticRenderer.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/rendering/PlatformIncompatibilityDiagnosticRenderer.kt @@ -101,7 +101,7 @@ private fun StringBuilder.renderIncompatibilityInformation( if (incompatibility is Incompatible.ClassScopes) { append(indent) - append("No actuals are found for expected members listed below:") + append("No actual members are found for expected members listed below:") mode.newLine(this) renderIncompatibleClassScopes(incompatibility.unfulfilled, indent, context, mode) } diff --git a/compiler/testData/multiplatform/missingOverload/output.txt b/compiler/testData/multiplatform/missingOverload/output.txt index ce4a8d9d137..748fa5fda2e 100644 --- a/compiler/testData/multiplatform/missingOverload/output.txt +++ b/compiler/testData/multiplatform/missingOverload/output.txt @@ -5,7 +5,7 @@ Output: -- JVM -- Exit code: COMPILATION_ERROR Output: -compiler/testData/multiplatform/missingOverload/common.kt:7:1: error: expected function 'g' has no actual in module +compiler/testData/multiplatform/missingOverload/common.kt:7:1: error: expected function 'g' has no actual declaration in module The following declaration is incompatible because parameter types are different: public actual fun g(a: Any): Unit diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/highlighter/IdeErrorMessages.java b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/highlighter/IdeErrorMessages.java index 17c6e928009..ff0e49c9e70 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/highlighter/IdeErrorMessages.java +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/highlighter/IdeErrorMessages.java @@ -175,7 +175,7 @@ public class IdeErrorMessages { MAP.put(EXPERIMENTAL_FEATURE_WARNING, "{0}", new LanguageFeatureMessageRenderer(LanguageFeatureMessageRenderer.Type.WARNING, true)); MAP.put(EXPERIMENTAL_FEATURE_ERROR, "{0}", new LanguageFeatureMessageRenderer(LanguageFeatureMessageRenderer.Type.ERROR, true)); - MAP.put(NO_ACTUAL_FOR_EXPECT, "Expected {0} has no actual in module{1}{2}", DECLARATION_NAME_WITH_KIND, + MAP.put(NO_ACTUAL_FOR_EXPECT, "Expected {0} has no actual declaration in module{1}{2}", DECLARATION_NAME_WITH_KIND, PLATFORM, new PlatformIncompatibilityDiagnosticRenderer(IdeMultiplatformDiagnosticRenderingMode.INSTANCE)); MAP.put(ACTUAL_WITHOUT_EXPECT, "Actual {0} has no corresponding expected declaration{1}", DECLARATION_NAME_WITH_KIND, new PlatformIncompatibilityDiagnosticRenderer(IdeMultiplatformDiagnosticRenderingMode.INSTANCE)); diff --git a/idea/testData/quickfix/implement/doNotAddHeader.kt b/idea/testData/quickfix/implement/doNotAddHeader.kt index 76753f89b4f..46d35f003cf 100644 --- a/idea/testData/quickfix/implement/doNotAddHeader.kt +++ b/idea/testData/quickfix/implement/doNotAddHeader.kt @@ -1,6 +1,6 @@ // "Implement members" "true" // ENABLE_MULTIPLATFORM -// ERROR: Expected interface 'InterfaceWithFuns' has no actual in module light_idea_test_case for JVM +// ERROR: Expected interface 'InterfaceWithFuns' has no actual declaration in module light_idea_test_case for JVM fun TODO(s: String): Nothing = null!! diff --git a/idea/testData/quickfix/implement/doNotAddHeader.kt.after b/idea/testData/quickfix/implement/doNotAddHeader.kt.after index ca0abbf627a..6877b34b893 100644 --- a/idea/testData/quickfix/implement/doNotAddHeader.kt.after +++ b/idea/testData/quickfix/implement/doNotAddHeader.kt.after @@ -1,6 +1,6 @@ // "Implement members" "true" // ENABLE_MULTIPLATFORM -// ERROR: Expected interface 'InterfaceWithFuns' has no actual in module light_idea_test_case for JVM +// ERROR: Expected interface 'InterfaceWithFuns' has no actual declaration in module light_idea_test_case for JVM fun TODO(s: String): Nothing = null!! From d6028877e1ce6dae9ff14f6bb8ece92486019582 Mon Sep 17 00:00:00 2001 From: Mikhail Glukhikh Date: Fri, 22 Sep 2017 18:00:45 +0300 Subject: [PATCH 027/212] Add kapt3-idea dependency to gradle script --- idea/build.gradle.kts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/idea/build.gradle.kts b/idea/build.gradle.kts index fbe7bc55fa4..e3de3a7c424 100644 --- a/idea/build.gradle.kts +++ b/idea/build.gradle.kts @@ -65,6 +65,8 @@ dependencies { testRuntime(ideaPluginDeps("*.jar", plugin = "android")) testRuntime(ideaPluginDeps("*.jar", plugin = "testng")) + testRuntime(project(":plugins:kapt3-idea")) { isTransitive = false } + // deps below are test runtime deps, but made test compile to split compilation and running to reduce mem req testCompile(project(":plugins:android-extensions-compiler")) testCompile(project(":plugins:android-extensions-ide")) { isTransitive = false } From 0bce06dc0fb6b5707faf7d5bcf8ff4a68f23baf3 Mon Sep 17 00:00:00 2001 From: Mikhail Glukhikh Date: Fri, 22 Sep 2017 18:21:37 +0300 Subject: [PATCH 028/212] Synchronize cleanupTool = true with CleanupLocalInspectionTool So #KT-20366 Fixed --- idea/src/META-INF/plugin.xml | 8 ++++++++ .../inspections/ConflictingExtensionPropertyInspection.kt | 2 +- .../idea/inspections/NullChecksToSafeCallInspection.kt | 2 +- .../kotlin/idea/inspections/RedundantGetterInspection.kt | 2 +- .../kotlin/idea/inspections/RedundantSetterInspection.kt | 2 +- .../idea/inspections/RedundantUnitReturnTypeInspection.kt | 3 ++- .../idea/inspections/SuspiciousEqualsCombination.kt | 3 +-- 7 files changed, 15 insertions(+), 7 deletions(-) diff --git a/idea/src/META-INF/plugin.xml b/idea/src/META-INF/plugin.xml index e1e06bfed0a..1d1d11b8309 100644 --- a/idea/src/META-INF/plugin.xml +++ b/idea/src/META-INF/plugin.xml @@ -1740,6 +1740,7 @@ groupPath="Kotlin" groupName="Redundant constructs" enabledByDefault="true" + cleanupTool="true" level="WEAK WARNING" language="kotlin" /> @@ -2120,6 +2121,7 @@ groupPath="Kotlin" groupName="Redundant constructs" enabledByDefault="true" + cleanupTool="true" level="WEAK WARNING" language="kotlin" /> @@ -2129,6 +2131,7 @@ groupPath="Kotlin" groupName="Redundant constructs" enabledByDefault="true" + cleanupTool="true" level="INFO" language="kotlin" /> @@ -2202,6 +2205,7 @@ groupPath="Kotlin" groupName="Redundant constructs" enabledByDefault="true" + cleanupTool="true" level="WEAK WARNING" language="kotlin" /> @@ -2211,6 +2215,7 @@ groupPath="Kotlin" groupName="Redundant constructs" enabledByDefault="true" + cleanupTool="true" level="WEAK WARNING" language="kotlin" /> @@ -2346,6 +2351,7 @@ groupPath="Kotlin" groupName="Style issues" enabledByDefault="true" + cleanupTool="true" level="INFO" language="kotlin" /> @@ -2472,6 +2478,7 @@ groupPath="Kotlin" groupName="Redundant constructs" enabledByDefault="true" + cleanupTool="true" level="WEAK WARNING" language="kotlin" /> @@ -2571,6 +2578,7 @@ groupPath="Kotlin" groupName="Redundant constructs" enabledByDefault="true" + cleanupTool="true" level="WEAK WARNING" language="kotlin" /> diff --git a/idea/src/org/jetbrains/kotlin/idea/inspections/ConflictingExtensionPropertyInspection.kt b/idea/src/org/jetbrains/kotlin/idea/inspections/ConflictingExtensionPropertyInspection.kt index c98dcb7fa04..8dbe2357433 100644 --- a/idea/src/org/jetbrains/kotlin/idea/inspections/ConflictingExtensionPropertyInspection.kt +++ b/idea/src/org/jetbrains/kotlin/idea/inspections/ConflictingExtensionPropertyInspection.kt @@ -58,7 +58,7 @@ import org.jetbrains.kotlin.resolve.scopes.collectSyntheticExtensionProperties import org.jetbrains.kotlin.synthetic.SyntheticJavaPropertyDescriptor import org.jetbrains.kotlin.utils.addToStdlib.firstIsInstanceOrNull -class ConflictingExtensionPropertyInspection : AbstractKotlinInspection(), CleanupLocalInspectionTool { +class ConflictingExtensionPropertyInspection : AbstractKotlinInspection() { override fun buildVisitor(holder: ProblemsHolder, isOnTheFly: Boolean, session: LocalInspectionToolSession): PsiElementVisitor { val file = session.file as? KtFile ?: return PsiElementVisitor.EMPTY_VISITOR val resolutionFacade = file.getResolutionFacade() diff --git a/idea/src/org/jetbrains/kotlin/idea/inspections/NullChecksToSafeCallInspection.kt b/idea/src/org/jetbrains/kotlin/idea/inspections/NullChecksToSafeCallInspection.kt index 5aa894e519b..bcac51efc65 100644 --- a/idea/src/org/jetbrains/kotlin/idea/inspections/NullChecksToSafeCallInspection.kt +++ b/idea/src/org/jetbrains/kotlin/idea/inspections/NullChecksToSafeCallInspection.kt @@ -29,7 +29,7 @@ import org.jetbrains.kotlin.resolve.BindingContext import org.jetbrains.kotlin.resolve.calls.callUtil.getResolvedCall import org.jetbrains.kotlin.types.TypeUtils -class NullChecksToSafeCallInspection : AbstractKotlinInspection(), CleanupLocalInspectionTool { +class NullChecksToSafeCallInspection : AbstractKotlinInspection() { override fun buildVisitor(holder: ProblemsHolder, isOnTheFly: Boolean, session: LocalInspectionToolSession) = object : KtVisitorVoid() { override fun visitBinaryExpression(expression: KtBinaryExpression) { diff --git a/idea/src/org/jetbrains/kotlin/idea/inspections/RedundantGetterInspection.kt b/idea/src/org/jetbrains/kotlin/idea/inspections/RedundantGetterInspection.kt index 7c0aa2eab9e..43766544da4 100644 --- a/idea/src/org/jetbrains/kotlin/idea/inspections/RedundantGetterInspection.kt +++ b/idea/src/org/jetbrains/kotlin/idea/inspections/RedundantGetterInspection.kt @@ -21,7 +21,7 @@ import com.intellij.openapi.project.Project import com.intellij.psi.PsiElementVisitor import org.jetbrains.kotlin.psi.* -class RedundantGetterInspection : AbstractKotlinInspection() { +class RedundantGetterInspection : AbstractKotlinInspection(), CleanupLocalInspectionTool { override fun buildVisitor(holder: ProblemsHolder, isOnTheFly: Boolean, session: LocalInspectionToolSession): PsiElementVisitor { return object : KtVisitorVoid() { override fun visitPropertyAccessor(accessor: KtPropertyAccessor) { diff --git a/idea/src/org/jetbrains/kotlin/idea/inspections/RedundantSetterInspection.kt b/idea/src/org/jetbrains/kotlin/idea/inspections/RedundantSetterInspection.kt index 567154cabdd..9a69b87bcba 100644 --- a/idea/src/org/jetbrains/kotlin/idea/inspections/RedundantSetterInspection.kt +++ b/idea/src/org/jetbrains/kotlin/idea/inspections/RedundantSetterInspection.kt @@ -23,7 +23,7 @@ import org.jetbrains.kotlin.idea.references.mainReference import org.jetbrains.kotlin.lexer.KtTokens import org.jetbrains.kotlin.psi.* -class RedundantSetterInspection : AbstractKotlinInspection() { +class RedundantSetterInspection : AbstractKotlinInspection(), CleanupLocalInspectionTool { override fun buildVisitor(holder: ProblemsHolder, isOnTheFly: Boolean, session: LocalInspectionToolSession): PsiElementVisitor { return object : KtVisitorVoid() { override fun visitPropertyAccessor(accessor: KtPropertyAccessor) { diff --git a/idea/src/org/jetbrains/kotlin/idea/inspections/RedundantUnitReturnTypeInspection.kt b/idea/src/org/jetbrains/kotlin/idea/inspections/RedundantUnitReturnTypeInspection.kt index 88c3ebedaea..b69a475ecd5 100644 --- a/idea/src/org/jetbrains/kotlin/idea/inspections/RedundantUnitReturnTypeInspection.kt +++ b/idea/src/org/jetbrains/kotlin/idea/inspections/RedundantUnitReturnTypeInspection.kt @@ -16,6 +16,7 @@ package org.jetbrains.kotlin.idea.inspections +import com.intellij.codeInspection.CleanupLocalInspectionTool import com.intellij.codeInspection.IntentionWrapper import com.intellij.codeInspection.ProblemHighlightType import com.intellij.codeInspection.ProblemsHolder @@ -31,7 +32,7 @@ import org.jetbrains.kotlin.resolve.lazy.BodyResolveMode import org.jetbrains.kotlin.types.typeUtil.isNothing import org.jetbrains.kotlin.types.typeUtil.isUnit -class RedundantUnitReturnTypeInspection : AbstractKotlinInspection() { +class RedundantUnitReturnTypeInspection : AbstractKotlinInspection(), CleanupLocalInspectionTool { override fun buildVisitor(holder: ProblemsHolder, isOnTheFly: Boolean): PsiElementVisitor { return object : KtVisitorVoid() { override fun visitNamedFunction(function: KtNamedFunction) { diff --git a/idea/src/org/jetbrains/kotlin/idea/inspections/SuspiciousEqualsCombination.kt b/idea/src/org/jetbrains/kotlin/idea/inspections/SuspiciousEqualsCombination.kt index af38c0a9b3b..8abedda09ac 100644 --- a/idea/src/org/jetbrains/kotlin/idea/inspections/SuspiciousEqualsCombination.kt +++ b/idea/src/org/jetbrains/kotlin/idea/inspections/SuspiciousEqualsCombination.kt @@ -16,14 +16,13 @@ package org.jetbrains.kotlin.idea.inspections -import com.intellij.codeInspection.CleanupLocalInspectionTool import com.intellij.codeInspection.LocalInspectionToolSession import com.intellij.codeInspection.ProblemHighlightType import com.intellij.codeInspection.ProblemsHolder import org.jetbrains.kotlin.lexer.KtTokens import org.jetbrains.kotlin.psi.* -class SuspiciousEqualsCombination : AbstractKotlinInspection(), CleanupLocalInspectionTool { +class SuspiciousEqualsCombination : AbstractKotlinInspection() { override fun buildVisitor(holder: ProblemsHolder, isOnTheFly: Boolean, session: LocalInspectionToolSession) = object : KtVisitorVoid() { override fun visitBinaryExpression(expression: KtBinaryExpression) { From 258e8f73b67de139e361c3a8d7a0ce3efb2cbc7d Mon Sep 17 00:00:00 2001 From: Mikhail Glukhikh Date: Fri, 22 Sep 2017 17:51:02 +0300 Subject: [PATCH 029/212] Expect/actual: add inspection for Suppress("DIAGNOSTIC") migration So #KT-20328 Fixed --- .../MigrateDiagnosticSuppression.html | 8 ++ idea/src/META-INF/plugin.xml | 10 ++ .../MigrateDiagnosticSuppressionInspection.kt | 99 +++++++++++++++++++ .../migrateDiagnosticSuppression/.inspection | 1 + .../migrateDiagnosticSuppression/base.kt | 2 + .../base.kt.after | 2 + .../migrateDiagnosticSuppression/multiple.kt | 6 ++ .../multiple.kt.after | 6 ++ .../migrateDiagnosticSuppression/new.kt | 4 + .../LocalInspectionTestGenerated.java | 27 +++++ 10 files changed, 165 insertions(+) create mode 100644 idea/resources/inspectionDescriptions/MigrateDiagnosticSuppression.html create mode 100644 idea/src/org/jetbrains/kotlin/idea/inspections/MigrateDiagnosticSuppressionInspection.kt create mode 100644 idea/testData/inspectionsLocal/migrateDiagnosticSuppression/.inspection create mode 100644 idea/testData/inspectionsLocal/migrateDiagnosticSuppression/base.kt create mode 100644 idea/testData/inspectionsLocal/migrateDiagnosticSuppression/base.kt.after create mode 100644 idea/testData/inspectionsLocal/migrateDiagnosticSuppression/multiple.kt create mode 100644 idea/testData/inspectionsLocal/migrateDiagnosticSuppression/multiple.kt.after create mode 100644 idea/testData/inspectionsLocal/migrateDiagnosticSuppression/new.kt diff --git a/idea/resources/inspectionDescriptions/MigrateDiagnosticSuppression.html b/idea/resources/inspectionDescriptions/MigrateDiagnosticSuppression.html new file mode 100644 index 00000000000..d10e30878da --- /dev/null +++ b/idea/resources/inspectionDescriptions/MigrateDiagnosticSuppression.html @@ -0,0 +1,8 @@ + + +This inspection reports suppression with old diagnostic names, for example: +
+  @Suppress("HEADER_WITHOUT_IMPLEMENTATION")
+
+ + \ No newline at end of file diff --git a/idea/src/META-INF/plugin.xml b/idea/src/META-INF/plugin.xml index 1d1d11b8309..3271db4703f 100644 --- a/idea/src/META-INF/plugin.xml +++ b/idea/src/META-INF/plugin.xml @@ -2612,6 +2612,16 @@ language="kotlin" /> + + diff --git a/idea/src/org/jetbrains/kotlin/idea/inspections/MigrateDiagnosticSuppressionInspection.kt b/idea/src/org/jetbrains/kotlin/idea/inspections/MigrateDiagnosticSuppressionInspection.kt new file mode 100644 index 00000000000..7827e61a324 --- /dev/null +++ b/idea/src/org/jetbrains/kotlin/idea/inspections/MigrateDiagnosticSuppressionInspection.kt @@ -0,0 +1,99 @@ +/* + * Copyright 2010-2017 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.inspections + +import com.intellij.codeInsight.FileModificationService +import com.intellij.codeInspection.* +import com.intellij.openapi.project.Project +import com.intellij.openapi.util.text.StringUtil +import com.intellij.psi.PsiElementVisitor +import org.jetbrains.kotlin.builtins.KotlinBuiltIns +import org.jetbrains.kotlin.diagnostics.DiagnosticFactory +import org.jetbrains.kotlin.diagnostics.Errors.* +import org.jetbrains.kotlin.idea.caches.resolve.analyze +import org.jetbrains.kotlin.psi.* +import org.jetbrains.kotlin.resolve.BindingContext +import org.jetbrains.kotlin.resolve.lazy.BodyResolveMode + +class MigrateDiagnosticSuppressionInspection : AbstractKotlinInspection(), CleanupLocalInspectionTool { + override fun buildVisitor(holder: ProblemsHolder, isOnTheFly: Boolean): PsiElementVisitor { + return object : KtVisitorVoid() { + + override fun visitAnnotationEntry(annotationEntry: KtAnnotationEntry) { + super.visitAnnotationEntry(annotationEntry) + + if (annotationEntry.calleeExpression?.text != "Suppress") return + val context = annotationEntry.analyze(BodyResolveMode.PARTIAL) + val descriptor = context[BindingContext.ANNOTATION, annotationEntry] ?: return + if (descriptor.fqName != KotlinBuiltIns.FQ_NAMES.suppress) return + + for (argument in annotationEntry.valueArguments) { + val expression = argument.getArgumentExpression() as? KtStringTemplateExpression ?: continue + val text = expression.text + if (text.firstOrNull() != '\"' || text.lastOrNull() != '\"') continue + val newDiagnosticFactory = MIGRATION_MAP[StringUtil.unquoteString(text)] ?: continue + + holder.registerProblem( + expression, + "Diagnostic name should be replaced by the new one", + ProblemHighlightType.GENERIC_ERROR_OR_WARNING, + ReplaceDiagnosticNameFix(newDiagnosticFactory) + ) + } + } + } + } + + class ReplaceDiagnosticNameFix(private val diagnosticFactory: DiagnosticFactory<*>) : LocalQuickFix { + override fun getName() = "$familyName with ${diagnosticFactory.name}" + + override fun getFamilyName() = "Replace diagnostic name" + + override fun applyFix(project: Project, descriptor: ProblemDescriptor) { + val expression = descriptor.psiElement as? KtStringTemplateExpression ?: return + if (!FileModificationService.getInstance().preparePsiElementForWrite(expression)) return + + val psiFactory = KtPsiFactory(expression) + expression.replace(psiFactory.createExpression("\"${diagnosticFactory.name}\"")) + } + + } + + companion object { + + private val MIGRATION_MAP = mapOf( + "HEADER_DECLARATION_WITH_BODY" to EXPECTED_DECLARATION_WITH_BODY, + "HEADER_DECLARATION_WITH_DEFAULT_PARAMETER" to EXPECTED_DECLARATION_WITH_DEFAULT_PARAMETER, + "HEADER_CLASS_CONSTRUCTOR_DELEGATION_CALL" to EXPECTED_CLASS_CONSTRUCTOR_DELEGATION_CALL, + "HEADER_CLASS_CONSTRUCTOR_PROPERTY_PARAMETER" to EXPECTED_CLASS_CONSTRUCTOR_PROPERTY_PARAMETER, + "HEADER_ENUM_CONSTRUCTOR" to EXPECTED_ENUM_CONSTRUCTOR, + "HEADER_ENUM_ENTRY_WITH_BODY" to EXPECTED_ENUM_ENTRY_WITH_BODY, + "HEADER_PROPERTY_INITIALIZER" to EXPECTED_PROPERTY_INITIALIZER, + + "IMPL_TYPE_ALIAS_NOT_TO_CLASS" to ACTUAL_TYPE_ALIAS_NOT_TO_CLASS, + "IMPL_TYPE_ALIAS_TO_CLASS_WITH_DECLARATION_SITE_VARIANCE" to ACTUAL_TYPE_ALIAS_TO_CLASS_WITH_DECLARATION_SITE_VARIANCE, + "IMPL_TYPE_ALIAS_WITH_USE_SITE_VARIANCE" to ACTUAL_TYPE_ALIAS_WITH_USE_SITE_VARIANCE, + "IMPL_TYPE_ALIAS_WITH_COMPLEX_SUBSTITUTION" to ACTUAL_TYPE_ALIAS_WITH_COMPLEX_SUBSTITUTION, + + "HEADER_WITHOUT_IMPLEMENTATION" to NO_ACTUAL_FOR_EXPECT, + "IMPLEMENTATION_WITHOUT_HEADER" to ACTUAL_WITHOUT_EXPECT, + + "HEADER_CLASS_MEMBERS_ARE_NOT_IMPLEMENTED" to NO_ACTUAL_CLASS_MEMBER_FOR_EXPECTED_CLASS, + "IMPL_MISSING" to ACTUAL_MISSING + ) + } +} diff --git a/idea/testData/inspectionsLocal/migrateDiagnosticSuppression/.inspection b/idea/testData/inspectionsLocal/migrateDiagnosticSuppression/.inspection new file mode 100644 index 00000000000..126a7575ae8 --- /dev/null +++ b/idea/testData/inspectionsLocal/migrateDiagnosticSuppression/.inspection @@ -0,0 +1 @@ +org.jetbrains.kotlin.idea.inspections.MigrateDiagnosticSuppressionInspection diff --git a/idea/testData/inspectionsLocal/migrateDiagnosticSuppression/base.kt b/idea/testData/inspectionsLocal/migrateDiagnosticSuppression/base.kt new file mode 100644 index 00000000000..133ebf98310 --- /dev/null +++ b/idea/testData/inspectionsLocal/migrateDiagnosticSuppression/base.kt @@ -0,0 +1,2 @@ +@Suppress("HEADER_WITHOUT_IMPLEMENTATION") +class Dummy \ No newline at end of file diff --git a/idea/testData/inspectionsLocal/migrateDiagnosticSuppression/base.kt.after b/idea/testData/inspectionsLocal/migrateDiagnosticSuppression/base.kt.after new file mode 100644 index 00000000000..65c720f79b2 --- /dev/null +++ b/idea/testData/inspectionsLocal/migrateDiagnosticSuppression/base.kt.after @@ -0,0 +1,2 @@ +@Suppress("NO_ACTUAL_FOR_EXPECT") +class Dummy \ No newline at end of file diff --git a/idea/testData/inspectionsLocal/migrateDiagnosticSuppression/multiple.kt b/idea/testData/inspectionsLocal/migrateDiagnosticSuppression/multiple.kt new file mode 100644 index 00000000000..04783a4535e --- /dev/null +++ b/idea/testData/inspectionsLocal/migrateDiagnosticSuppression/multiple.kt @@ -0,0 +1,6 @@ +@Suppress( + "HEADER_CLASS_CONSTRUCTOR_DELEGATION_CALL", + "HEADER_CLASS_CONSTRUCTOR_PROPERTY_PARAMETER", + "HEADER_ENUM_CONSTRUCTOR" +) +class Dummy \ No newline at end of file diff --git a/idea/testData/inspectionsLocal/migrateDiagnosticSuppression/multiple.kt.after b/idea/testData/inspectionsLocal/migrateDiagnosticSuppression/multiple.kt.after new file mode 100644 index 00000000000..03acd40338f --- /dev/null +++ b/idea/testData/inspectionsLocal/migrateDiagnosticSuppression/multiple.kt.after @@ -0,0 +1,6 @@ +@Suppress( + "HEADER_CLASS_CONSTRUCTOR_DELEGATION_CALL", + "EXPECTED_CLASS_CONSTRUCTOR_PROPERTY_PARAMETER", + "HEADER_ENUM_CONSTRUCTOR" +) +class Dummy \ No newline at end of file diff --git a/idea/testData/inspectionsLocal/migrateDiagnosticSuppression/new.kt b/idea/testData/inspectionsLocal/migrateDiagnosticSuppression/new.kt new file mode 100644 index 00000000000..25d477acbe3 --- /dev/null +++ b/idea/testData/inspectionsLocal/migrateDiagnosticSuppression/new.kt @@ -0,0 +1,4 @@ +// PROBLEM: none + +@Suppress("NO_ACTUAL_FOR_EXPECT") +class Dummy \ No newline at end of file diff --git a/idea/tests/org/jetbrains/kotlin/idea/inspections/LocalInspectionTestGenerated.java b/idea/tests/org/jetbrains/kotlin/idea/inspections/LocalInspectionTestGenerated.java index 3d3562ed4cb..f78b909e7b3 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/inspections/LocalInspectionTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/inspections/LocalInspectionTestGenerated.java @@ -1071,6 +1071,33 @@ public class LocalInspectionTestGenerated extends AbstractLocalInspectionTest { } } + @TestMetadata("idea/testData/inspectionsLocal/migrateDiagnosticSuppression") + @TestDataPath("$PROJECT_ROOT") + @RunWith(JUnit3RunnerWithInners.class) + public static class MigrateDiagnosticSuppression extends AbstractLocalInspectionTest { + public void testAllFilesPresentInMigrateDiagnosticSuppression() throws Exception { + KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("idea/testData/inspectionsLocal/migrateDiagnosticSuppression"), Pattern.compile("^([\\w\\-_]+)\\.kt$"), TargetBackend.ANY, true); + } + + @TestMetadata("base.kt") + public void testBase() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/inspectionsLocal/migrateDiagnosticSuppression/base.kt"); + doTest(fileName); + } + + @TestMetadata("multiple.kt") + public void testMultiple() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/inspectionsLocal/migrateDiagnosticSuppression/multiple.kt"); + doTest(fileName); + } + + @TestMetadata("new.kt") + public void testNew() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/inspectionsLocal/migrateDiagnosticSuppression/new.kt"); + doTest(fileName); + } + } + @TestMetadata("idea/testData/inspectionsLocal/moveSuspiciousCallableReferenceIntoParentheses") @TestDataPath("$PROJECT_ROOT") @RunWith(JUnit3RunnerWithInners.class) From 1f992ed84580ae7f69ace237076e3296cce67a6a Mon Sep 17 00:00:00 2001 From: Alexander Udalov Date: Mon, 18 Sep 2017 20:20:12 +0300 Subject: [PATCH 030/212] Improve error on 'expect' delegated property #KT-15054 Fixed #KT-15055 Fixed --- .../jetbrains/kotlin/diagnostics/Errors.java | 1 + .../rendering/DefaultErrorMessages.java | 1 + .../kotlin/resolve/DeclarationsChecker.kt | 3 ++ .../kotlin/resolve/ModifiersChecker.kt | 4 +-- .../headerClass/memberPropertyKinds.kt | 29 +++++++++++++++++++ .../headerClass/memberPropertyKinds.txt | 27 +++++++++++++++++ .../differentKindsOfProperties.kt | 2 +- .../checkers/DiagnosticsTestGenerated.java | 6 ++++ .../DiagnosticsUsingJavacTestGenerated.java | 6 ++++ 9 files changed, 76 insertions(+), 3 deletions(-) create mode 100644 compiler/testData/diagnostics/tests/multiplatform/headerClass/memberPropertyKinds.kt create mode 100644 compiler/testData/diagnostics/tests/multiplatform/headerClass/memberPropertyKinds.txt diff --git a/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/Errors.java b/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/Errors.java index a00a3080871..67361207b18 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/Errors.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/Errors.java @@ -562,6 +562,7 @@ public interface Errors { DiagnosticFactory0> EXPECTED_ENUM_CONSTRUCTOR = DiagnosticFactory0.create(ERROR); DiagnosticFactory0 EXPECTED_ENUM_ENTRY_WITH_BODY = DiagnosticFactory0.create(ERROR); DiagnosticFactory0 EXPECTED_PROPERTY_INITIALIZER = DiagnosticFactory0.create(ERROR); + DiagnosticFactory0 EXPECTED_DELEGATED_PROPERTY = DiagnosticFactory0.create(ERROR); DiagnosticFactory0 ACTUAL_TYPE_ALIAS_NOT_TO_CLASS = DiagnosticFactory0.create(ERROR, DECLARATION_SIGNATURE); DiagnosticFactory0 diff --git a/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/rendering/DefaultErrorMessages.java b/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/rendering/DefaultErrorMessages.java index 03f022b932d..4afd0ab6bf6 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/rendering/DefaultErrorMessages.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/rendering/DefaultErrorMessages.java @@ -270,6 +270,7 @@ public class DefaultErrorMessages { MAP.put(EXPECTED_ENUM_CONSTRUCTOR, "Expected enum class cannot have a constructor"); MAP.put(EXPECTED_ENUM_ENTRY_WITH_BODY, "Expected enum entry cannot have a body"); MAP.put(EXPECTED_PROPERTY_INITIALIZER, "Expected property cannot have an initializer"); + MAP.put(EXPECTED_DELEGATED_PROPERTY, "Expected property cannot be delegated"); MAP.put(ACTUAL_TYPE_ALIAS_NOT_TO_CLASS, "Right-hand side of actual type alias should be a class, not another type alias"); MAP.put(ACTUAL_TYPE_ALIAS_TO_CLASS_WITH_DECLARATION_SITE_VARIANCE, "Aliased class should not have type parameters with declaration-site variance"); diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/DeclarationsChecker.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/DeclarationsChecker.kt index afd2ee357c1..5161b8d0eb9 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/DeclarationsChecker.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/DeclarationsChecker.kt @@ -646,6 +646,9 @@ class DeclarationsChecker( if (inInterface) { trace.report(DELEGATED_PROPERTY_IN_INTERFACE.on(delegate)) } + else if (isExpect) { + trace.report(EXPECTED_DELEGATED_PROPERTY.on(delegate)) + } } else { val isUninitialized = trace.bindingContext.get(BindingContext.IS_UNINITIALIZED, propertyDescriptor) ?: false diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/ModifiersChecker.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/ModifiersChecker.kt index 639d0f03018..f5c0e0e1d90 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/ModifiersChecker.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/ModifiersChecker.kt @@ -86,9 +86,9 @@ object ModifierCheckerCore { CONST_KEYWORD to EnumSet.of(MEMBER_PROPERTY, TOP_LEVEL_PROPERTY), OPERATOR_KEYWORD to EnumSet.of(FUNCTION), INFIX_KEYWORD to EnumSet.of(FUNCTION), - HEADER_KEYWORD to EnumSet.of(TOP_LEVEL_FUNCTION, TOP_LEVEL_PROPERTY_WITHOUT_FIELD_OR_DELEGATE, CLASS_ONLY, OBJECT, INTERFACE, ENUM_CLASS, ANNOTATION_CLASS), + HEADER_KEYWORD to EnumSet.of(TOP_LEVEL_FUNCTION, TOP_LEVEL_PROPERTY, CLASS_ONLY, OBJECT, INTERFACE, ENUM_CLASS, ANNOTATION_CLASS), IMPL_KEYWORD to EnumSet.of(TOP_LEVEL_FUNCTION, MEMBER_FUNCTION, TOP_LEVEL_PROPERTY, MEMBER_PROPERTY, CONSTRUCTOR, CLASS_ONLY, OBJECT, INTERFACE, ENUM_CLASS, ANNOTATION_CLASS, TYPEALIAS), - EXPECT_KEYWORD to EnumSet.of(TOP_LEVEL_FUNCTION, TOP_LEVEL_PROPERTY_WITHOUT_FIELD_OR_DELEGATE, CLASS_ONLY, OBJECT, INTERFACE, ENUM_CLASS, ANNOTATION_CLASS), + EXPECT_KEYWORD to EnumSet.of(TOP_LEVEL_FUNCTION, TOP_LEVEL_PROPERTY, CLASS_ONLY, OBJECT, INTERFACE, ENUM_CLASS, ANNOTATION_CLASS), ACTUAL_KEYWORD to EnumSet.of(TOP_LEVEL_FUNCTION, MEMBER_FUNCTION, TOP_LEVEL_PROPERTY, MEMBER_PROPERTY, CONSTRUCTOR, CLASS_ONLY, OBJECT, INTERFACE, ENUM_CLASS, ANNOTATION_CLASS, TYPEALIAS) ) diff --git a/compiler/testData/diagnostics/tests/multiplatform/headerClass/memberPropertyKinds.kt b/compiler/testData/diagnostics/tests/multiplatform/headerClass/memberPropertyKinds.kt new file mode 100644 index 00000000000..9bfba462621 --- /dev/null +++ b/compiler/testData/diagnostics/tests/multiplatform/headerClass/memberPropertyKinds.kt @@ -0,0 +1,29 @@ +// !LANGUAGE: +MultiPlatformProjects +// MODULE: m1-common +// FILE: common.kt + +expect class Foo { + val justVal: String + var justVar: String + + val String.extensionVal: Unit + var T.genericExtensionVar: T + + val valWithGet: String + get + var varWithGetSet: String + get set + + val backingFieldVal: String = "no" + var backingFieldVar: String = "no" + + val customAccessorVal: String + get() = "no" + var customAccessorVar: String + get() = "no" + set(value) {} + + val delegated: String by Delegate +} + +object Delegate { operator fun getValue(x: Any?, y: Any?): String = "" } diff --git a/compiler/testData/diagnostics/tests/multiplatform/headerClass/memberPropertyKinds.txt b/compiler/testData/diagnostics/tests/multiplatform/headerClass/memberPropertyKinds.txt new file mode 100644 index 00000000000..2f8b94e29a1 --- /dev/null +++ b/compiler/testData/diagnostics/tests/multiplatform/headerClass/memberPropertyKinds.txt @@ -0,0 +1,27 @@ +package + +public object Delegate { + private constructor Delegate() + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public final operator fun getValue(/*0*/ x: kotlin.Any?, /*1*/ y: kotlin.Any?): kotlin.String + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String +} + +public final expect class Foo { + public constructor Foo() + public expect final val backingFieldVal: kotlin.String = "no" + public expect final var backingFieldVar: kotlin.String + public expect final val customAccessorVal: kotlin.String + public expect final var customAccessorVar: kotlin.String + public expect final val delegated: kotlin.String + public expect final val justVal: kotlin.String + public expect final var justVar: kotlin.String + public expect final val valWithGet: kotlin.String + public expect final var varWithGetSet: kotlin.String + public expect final val kotlin.String.extensionVal: kotlin.Unit + public expect final var T.genericExtensionVar: T + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String +} diff --git a/compiler/testData/diagnostics/tests/multiplatform/topLevelProperty/differentKindsOfProperties.kt b/compiler/testData/diagnostics/tests/multiplatform/topLevelProperty/differentKindsOfProperties.kt index 2183b91383f..cf201cc8da5 100644 --- a/compiler/testData/diagnostics/tests/multiplatform/topLevelProperty/differentKindsOfProperties.kt +++ b/compiler/testData/diagnostics/tests/multiplatform/topLevelProperty/differentKindsOfProperties.kt @@ -30,7 +30,7 @@ expect const val constVal: Int expect lateinit var lateinitVar: String -expect val delegated: String by Delegate +expect val delegated: String by Delegate object Delegate { operator fun getValue(x: Any?, y: Any?): String = "" } fun test(): String { diff --git a/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestGenerated.java index 283319ea36e..ec416188110 100644 --- a/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestGenerated.java @@ -13986,6 +13986,12 @@ public class DiagnosticsTestGenerated extends AbstractDiagnosticsTest { doTest(fileName); } + @TestMetadata("memberPropertyKinds.kt") + public void testMemberPropertyKinds() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/multiplatform/headerClass/memberPropertyKinds.kt"); + doTest(fileName); + } + @TestMetadata("nestedClasses.kt") public void testNestedClasses() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/multiplatform/headerClass/nestedClasses.kt"); diff --git a/compiler/tests/org/jetbrains/kotlin/checkers/javac/DiagnosticsUsingJavacTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/checkers/javac/DiagnosticsUsingJavacTestGenerated.java index 5897434f96a..fac137c8608 100644 --- a/compiler/tests/org/jetbrains/kotlin/checkers/javac/DiagnosticsUsingJavacTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/checkers/javac/DiagnosticsUsingJavacTestGenerated.java @@ -13986,6 +13986,12 @@ public class DiagnosticsUsingJavacTestGenerated extends AbstractDiagnosticsUsing doTest(fileName); } + @TestMetadata("memberPropertyKinds.kt") + public void testMemberPropertyKinds() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/multiplatform/headerClass/memberPropertyKinds.kt"); + doTest(fileName); + } + @TestMetadata("nestedClasses.kt") public void testNestedClasses() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/multiplatform/headerClass/nestedClasses.kt"); From 8ae7343557954f035cd1c8c176350b839fc8fd7d Mon Sep 17 00:00:00 2001 From: Alexander Udalov Date: Tue, 19 Sep 2017 11:23:23 +0300 Subject: [PATCH 031/212] Prohibit 'expect' lateinit member properties #KT-20319 Fixed --- .../src/org/jetbrains/kotlin/diagnostics/Errors.java | 1 + .../diagnostics/rendering/DefaultErrorMessages.java | 1 + .../jetbrains/kotlin/resolve/DeclarationsChecker.kt | 11 ++++++++--- .../org/jetbrains/kotlin/resolve/ModifiersChecker.kt | 3 --- .../multiplatform/headerClass/memberPropertyKinds.kt | 2 ++ .../multiplatform/headerClass/memberPropertyKinds.txt | 1 + .../topLevelProperty/differentKindsOfProperties.kt | 4 ++-- 7 files changed, 15 insertions(+), 8 deletions(-) diff --git a/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/Errors.java b/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/Errors.java index 67361207b18..3f89d7d7b1b 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/Errors.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/Errors.java @@ -563,6 +563,7 @@ public interface Errors { DiagnosticFactory0 EXPECTED_ENUM_ENTRY_WITH_BODY = DiagnosticFactory0.create(ERROR); DiagnosticFactory0 EXPECTED_PROPERTY_INITIALIZER = DiagnosticFactory0.create(ERROR); DiagnosticFactory0 EXPECTED_DELEGATED_PROPERTY = DiagnosticFactory0.create(ERROR); + DiagnosticFactory0 EXPECTED_LATEINIT_PROPERTY = DiagnosticFactory0.create(ERROR); DiagnosticFactory0 ACTUAL_TYPE_ALIAS_NOT_TO_CLASS = DiagnosticFactory0.create(ERROR, DECLARATION_SIGNATURE); DiagnosticFactory0 diff --git a/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/rendering/DefaultErrorMessages.java b/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/rendering/DefaultErrorMessages.java index 4afd0ab6bf6..4f84410e90c 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/rendering/DefaultErrorMessages.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/rendering/DefaultErrorMessages.java @@ -271,6 +271,7 @@ public class DefaultErrorMessages { MAP.put(EXPECTED_ENUM_ENTRY_WITH_BODY, "Expected enum entry cannot have a body"); MAP.put(EXPECTED_PROPERTY_INITIALIZER, "Expected property cannot have an initializer"); MAP.put(EXPECTED_DELEGATED_PROPERTY, "Expected property cannot be delegated"); + MAP.put(EXPECTED_LATEINIT_PROPERTY, "Expected property cannot be lateinit"); MAP.put(ACTUAL_TYPE_ALIAS_NOT_TO_CLASS, "Right-hand side of actual type alias should be a class, not another type alias"); MAP.put(ACTUAL_TYPE_ALIAS_TO_CLASS_WITH_DECLARATION_SITE_VARIANCE, "Aliased class should not have type parameters with declaration-site variance"); diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/DeclarationsChecker.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/DeclarationsChecker.kt index 5161b8d0eb9..a4319ae886b 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/DeclarationsChecker.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/DeclarationsChecker.kt @@ -670,9 +670,14 @@ class DeclarationsChecker( else if (noExplicitTypeOrGetterType(property)) { trace.report(PROPERTY_WITH_NO_TYPE_NO_INITIALIZER.on(property)) } - if (backingFieldRequired && !inInterface && propertyDescriptor.isLateInit && !isUninitialized && - trace[MUST_BE_LATEINIT, propertyDescriptor] != true) { - trace.report(UNNECESSARY_LATEINIT.on(property)) + + if (propertyDescriptor.isLateInit) { + if (propertyDescriptor.isExpect) { + trace.report(EXPECTED_LATEINIT_PROPERTY.on(property.modifierList?.getModifier(KtTokens.LATEINIT_KEYWORD) ?: property)) + } + if (backingFieldRequired && !inInterface && !isUninitialized && trace[MUST_BE_LATEINIT, propertyDescriptor] != true) { + trace.report(UNNECESSARY_LATEINIT.on(property)) + } } } } diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/ModifiersChecker.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/ModifiersChecker.kt index f5c0e0e1d90..da56c794b89 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/ModifiersChecker.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/ModifiersChecker.kt @@ -191,9 +191,6 @@ object ModifierCheckerCore { // (see the KEEP https://github.com/Kotlin/KEEP/blob/master/proposals/sealed-class-inheritance.md) result += incompatibilityRegister(SEALED_KEYWORD, INNER_KEYWORD) - // lateinit is incompatible with header / expect - result += incompatibilityRegister(LATEINIT_KEYWORD, HEADER_KEYWORD, EXPECT_KEYWORD) - // header / expect / impl / actual are all incompatible result += incompatibilityRegister(HEADER_KEYWORD, EXPECT_KEYWORD, IMPL_KEYWORD, ACTUAL_KEYWORD) diff --git a/compiler/testData/diagnostics/tests/multiplatform/headerClass/memberPropertyKinds.kt b/compiler/testData/diagnostics/tests/multiplatform/headerClass/memberPropertyKinds.kt index 9bfba462621..74f469447a6 100644 --- a/compiler/testData/diagnostics/tests/multiplatform/headerClass/memberPropertyKinds.kt +++ b/compiler/testData/diagnostics/tests/multiplatform/headerClass/memberPropertyKinds.kt @@ -23,6 +23,8 @@ expect class Foo { get() = "no" set(value) {} + lateinit var lateinitVar: String + val delegated: String by Delegate } diff --git a/compiler/testData/diagnostics/tests/multiplatform/headerClass/memberPropertyKinds.txt b/compiler/testData/diagnostics/tests/multiplatform/headerClass/memberPropertyKinds.txt index 2f8b94e29a1..e0c37021e86 100644 --- a/compiler/testData/diagnostics/tests/multiplatform/headerClass/memberPropertyKinds.txt +++ b/compiler/testData/diagnostics/tests/multiplatform/headerClass/memberPropertyKinds.txt @@ -17,6 +17,7 @@ public final expect class Foo { public expect final val delegated: kotlin.String public expect final val justVal: kotlin.String public expect final var justVar: kotlin.String + public expect final lateinit var lateinitVar: kotlin.String public expect final val valWithGet: kotlin.String public expect final var varWithGetSet: kotlin.String public expect final val kotlin.String.extensionVal: kotlin.Unit diff --git a/compiler/testData/diagnostics/tests/multiplatform/topLevelProperty/differentKindsOfProperties.kt b/compiler/testData/diagnostics/tests/multiplatform/topLevelProperty/differentKindsOfProperties.kt index cf201cc8da5..e73e201c4b4 100644 --- a/compiler/testData/diagnostics/tests/multiplatform/topLevelProperty/differentKindsOfProperties.kt +++ b/compiler/testData/diagnostics/tests/multiplatform/topLevelProperty/differentKindsOfProperties.kt @@ -1,4 +1,4 @@ -// !LANGUAGE: +MultiPlatformProjects +// !LANGUAGE: +MultiPlatformProjects +LateinitTopLevelProperties // MODULE: m1-common // FILE: common.kt @@ -28,7 +28,7 @@ expect var customAccessorVar: String expect const val constVal: Int -expect lateinit var lateinitVar: String +expect lateinit var lateinitVar: String expect val delegated: String by Delegate object Delegate { operator fun getValue(x: Any?, y: Any?): String = "" } From 2281ac842ac27213187f97a49140bd36fdf28b94 Mon Sep 17 00:00:00 2001 From: Alexander Udalov Date: Tue, 19 Sep 2017 15:05:28 +0300 Subject: [PATCH 032/212] Prohibit super constructor call for 'expect' class #KT-15490 Fixed --- .../jetbrains/kotlin/diagnostics/Errors.java | 1 + .../rendering/DefaultErrorMessages.java | 3 ++- .../kotlin/resolve/BodyResolver.java | 3 +++ .../enum/constructorInHeaderEnum.kt | 4 ++-- .../multiplatform/headerClass/superClass.kt | 6 ++++++ .../multiplatform/headerClass/superClass.txt | 21 +++++++++++++++++++ 6 files changed, 35 insertions(+), 3 deletions(-) diff --git a/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/Errors.java b/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/Errors.java index 3f89d7d7b1b..19efb1684ec 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/Errors.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/Errors.java @@ -564,6 +564,7 @@ public interface Errors { DiagnosticFactory0 EXPECTED_PROPERTY_INITIALIZER = DiagnosticFactory0.create(ERROR); DiagnosticFactory0 EXPECTED_DELEGATED_PROPERTY = DiagnosticFactory0.create(ERROR); DiagnosticFactory0 EXPECTED_LATEINIT_PROPERTY = DiagnosticFactory0.create(ERROR); + DiagnosticFactory0 SUPERTYPE_INITIALIZED_IN_EXPECTED_CLASS = DiagnosticFactory0.create(ERROR); DiagnosticFactory0 ACTUAL_TYPE_ALIAS_NOT_TO_CLASS = DiagnosticFactory0.create(ERROR, DECLARATION_SIGNATURE); DiagnosticFactory0 diff --git a/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/rendering/DefaultErrorMessages.java b/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/rendering/DefaultErrorMessages.java index 4f84410e90c..76a6d946ab5 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/rendering/DefaultErrorMessages.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/rendering/DefaultErrorMessages.java @@ -272,6 +272,7 @@ public class DefaultErrorMessages { MAP.put(EXPECTED_PROPERTY_INITIALIZER, "Expected property cannot have an initializer"); MAP.put(EXPECTED_DELEGATED_PROPERTY, "Expected property cannot be delegated"); MAP.put(EXPECTED_LATEINIT_PROPERTY, "Expected property cannot be lateinit"); + MAP.put(SUPERTYPE_INITIALIZED_IN_EXPECTED_CLASS, "Expected classes cannot initialize supertypes"); MAP.put(ACTUAL_TYPE_ALIAS_NOT_TO_CLASS, "Right-hand side of actual type alias should be a class, not another type alias"); MAP.put(ACTUAL_TYPE_ALIAS_TO_CLASS_WITH_DECLARATION_SITE_VARIANCE, "Aliased class should not have type parameters with declaration-site variance"); @@ -555,8 +556,8 @@ public class DefaultErrorMessages { MAP.put(MANY_CLASSES_IN_SUPERTYPE_LIST, "Only one class may appear in a supertype list"); MAP.put(SUPERTYPE_NOT_A_CLASS_OR_INTERFACE, "Only classes and interfaces may serve as supertypes"); MAP.put(SUPERTYPE_IS_EXTENSION_FUNCTION_TYPE, "Extension function type is not allowed as supertypes"); - MAP.put(SUPERTYPE_IS_SUSPEND_FUNCTION_TYPE, "Suspend function type is not allowed as supertypes"); MAP.put(SUPERTYPE_INITIALIZED_IN_INTERFACE, "Interfaces cannot initialize supertypes"); + MAP.put(SUPERTYPE_IS_SUSPEND_FUNCTION_TYPE, "Suspend function type is not allowed as supertypes"); MAP.put(CLASS_IN_SUPERTYPE_FOR_ENUM, "Enum class cannot inherit from classes"); MAP.put(CONSTRUCTOR_IN_INTERFACE, "An interface may not have a constructor"); MAP.put(METHOD_OF_ANY_IMPLEMENTED_IN_INTERFACE, "An interface may not implement a method of 'Any'"); diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/BodyResolver.java b/compiler/frontend/src/org/jetbrains/kotlin/resolve/BodyResolver.java index 302c2e8c239..93696ab7927 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/BodyResolver.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/BodyResolver.java @@ -316,6 +316,9 @@ public class BodyResolver { if (descriptor.getKind() == ClassKind.INTERFACE) { trace.report(SUPERTYPE_INITIALIZED_IN_INTERFACE.on(elementToMark)); } + if (descriptor.isExpect()) { + trace.report(SUPERTYPE_INITIALIZED_IN_EXPECTED_CLASS.on(elementToMark)); + } KtTypeReference typeReference = call.getTypeReference(); if (typeReference == null) return; if (primaryConstructor == null) { diff --git a/compiler/testData/diagnostics/tests/multiplatform/enum/constructorInHeaderEnum.kt b/compiler/testData/diagnostics/tests/multiplatform/enum/constructorInHeaderEnum.kt index 174d3d7af62..c45a1bbf519 100644 --- a/compiler/testData/diagnostics/tests/multiplatform/enum/constructorInHeaderEnum.kt +++ b/compiler/testData/diagnostics/tests/multiplatform/enum/constructorInHeaderEnum.kt @@ -4,12 +4,12 @@ expect enum class En(x: Int) { E1, - E2(42), + E2(42), ; constructor(s: String) } expect enum class En2 { - E1() + E1() } diff --git a/compiler/testData/diagnostics/tests/multiplatform/headerClass/superClass.kt b/compiler/testData/diagnostics/tests/multiplatform/headerClass/superClass.kt index 53929912f48..a43351ba9b3 100644 --- a/compiler/testData/diagnostics/tests/multiplatform/headerClass/superClass.kt +++ b/compiler/testData/diagnostics/tests/multiplatform/headerClass/superClass.kt @@ -8,10 +8,16 @@ interface J expect class Foo : I, C, J +expect class Bar : C() + // MODULE: m2-jvm(m1-common) // FILE: jvm.kt actual class Foo : I, C(), J +actual class Bar + // MODULE: m3-js(m1-common) // FILE: js.kt actual class Foo : I, J, C() + +actual class Bar : C() diff --git a/compiler/testData/diagnostics/tests/multiplatform/headerClass/superClass.txt b/compiler/testData/diagnostics/tests/multiplatform/headerClass/superClass.txt index 266507319ac..dabb0b756ca 100644 --- a/compiler/testData/diagnostics/tests/multiplatform/headerClass/superClass.txt +++ b/compiler/testData/diagnostics/tests/multiplatform/headerClass/superClass.txt @@ -1,6 +1,13 @@ // -- Module: -- package +public final expect class Bar : C { + public constructor Bar() + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String +} + public open class C { public constructor C() public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean @@ -31,6 +38,13 @@ public interface J { // -- Module: -- package +public final actual class Bar { + public constructor Bar() + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String +} + public open class C { public constructor C() public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean @@ -61,6 +75,13 @@ public interface J { // -- Module: -- package +public final actual class Bar : C { + public constructor Bar() + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String +} + public open class C { public constructor C() public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean From 2d9f07deec3a19b0641cd874fbf3c210e7e8030e Mon Sep 17 00:00:00 2001 From: Alexander Udalov Date: Tue, 19 Sep 2017 15:21:50 +0300 Subject: [PATCH 033/212] Minor, add test for obsolete issue on "actual missing" error #KT-20142 --- .../headerClass/actualMissing.kt | 14 ++++++++++++ .../headerClass/actualMissing.txt | 22 +++++++++++++++++++ .../checkers/DiagnosticsTestGenerated.java | 6 +++++ .../DiagnosticsUsingJavacTestGenerated.java | 6 +++++ 4 files changed, 48 insertions(+) create mode 100644 compiler/testData/diagnostics/tests/multiplatform/headerClass/actualMissing.kt create mode 100644 compiler/testData/diagnostics/tests/multiplatform/headerClass/actualMissing.txt diff --git a/compiler/testData/diagnostics/tests/multiplatform/headerClass/actualMissing.kt b/compiler/testData/diagnostics/tests/multiplatform/headerClass/actualMissing.kt new file mode 100644 index 00000000000..22c9574d25d --- /dev/null +++ b/compiler/testData/diagnostics/tests/multiplatform/headerClass/actualMissing.kt @@ -0,0 +1,14 @@ +// !LANGUAGE: +MultiPlatformProjects +// MODULE: m1-common +// FILE: common.kt + +expect class A { + fun foo() +} + +// MODULE: m1-jvm(m1-common) +// FILE: jvm.kt + +class A { + actual fun foo() {} +} diff --git a/compiler/testData/diagnostics/tests/multiplatform/headerClass/actualMissing.txt b/compiler/testData/diagnostics/tests/multiplatform/headerClass/actualMissing.txt new file mode 100644 index 00000000000..8325a9782fb --- /dev/null +++ b/compiler/testData/diagnostics/tests/multiplatform/headerClass/actualMissing.txt @@ -0,0 +1,22 @@ +// -- Module: -- +package + +public final expect class A { + public constructor A() + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public final expect fun foo(): kotlin.Unit + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String +} + + +// -- Module: -- +package + +public final class A { + public constructor A() + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public final actual fun foo(): kotlin.Unit + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String +} diff --git a/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestGenerated.java index ec416188110..1608d4ac503 100644 --- a/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestGenerated.java @@ -13934,6 +13934,12 @@ public class DiagnosticsTestGenerated extends AbstractDiagnosticsTest { @TestDataPath("$PROJECT_ROOT") @RunWith(JUnit3RunnerWithInners.class) public static class HeaderClass extends AbstractDiagnosticsTest { + @TestMetadata("actualMissing.kt") + public void testActualMissing() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/multiplatform/headerClass/actualMissing.kt"); + doTest(fileName); + } + public void testAllFilesPresentInHeaderClass() throws Exception { KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("compiler/testData/diagnostics/tests/multiplatform/headerClass"), Pattern.compile("^(.+)\\.kt$"), TargetBackend.ANY, true); } diff --git a/compiler/tests/org/jetbrains/kotlin/checkers/javac/DiagnosticsUsingJavacTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/checkers/javac/DiagnosticsUsingJavacTestGenerated.java index fac137c8608..3c8ca920e7a 100644 --- a/compiler/tests/org/jetbrains/kotlin/checkers/javac/DiagnosticsUsingJavacTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/checkers/javac/DiagnosticsUsingJavacTestGenerated.java @@ -13934,6 +13934,12 @@ public class DiagnosticsUsingJavacTestGenerated extends AbstractDiagnosticsUsing @TestDataPath("$PROJECT_ROOT") @RunWith(JUnit3RunnerWithInners.class) public static class HeaderClass extends AbstractDiagnosticsUsingJavacTest { + @TestMetadata("actualMissing.kt") + public void testActualMissing() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/multiplatform/headerClass/actualMissing.kt"); + doTest(fileName); + } + public void testAllFilesPresentInHeaderClass() throws Exception { KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("compiler/testData/diagnostics/tests/multiplatform/headerClass"), Pattern.compile("^(.+)\\.kt$"), TargetBackend.ANY, true); } From 3f1ee74475dac91fbc48a3eebb6b2861a52f8a39 Mon Sep 17 00:00:00 2001 From: Alexander Udalov Date: Tue, 19 Sep 2017 17:26:21 +0300 Subject: [PATCH 034/212] Minor, refactor compiler-running code in multiplatform integration test The compiler is run twice and outputs are compared for equality. Thus, if both runs ended with exceptions, the outputs were never equal because the compiler was run from different places (stack traces were different in only one line), which was a bit weird. Now outputs are equal and in case of an exception, a standard "actual data differs from file content" message is displayed --- .../AbstractMultiPlatformIntegrationTest.kt | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/compiler/tests/org/jetbrains/kotlin/multiplatform/AbstractMultiPlatformIntegrationTest.kt b/compiler/tests/org/jetbrains/kotlin/multiplatform/AbstractMultiPlatformIntegrationTest.kt index 8094f858cfd..1d28d758442 100644 --- a/compiler/tests/org/jetbrains/kotlin/multiplatform/AbstractMultiPlatformIntegrationTest.kt +++ b/compiler/tests/org/jetbrains/kotlin/multiplatform/AbstractMultiPlatformIntegrationTest.kt @@ -70,8 +70,13 @@ abstract class AbstractMultiPlatformIntegrationTest : KtUsefulTestCase() { } private fun CLICompiler<*>.compileBothWays(commonSource: File, platformSource: File, vararg mainArguments: String): String { - val platformFirst = compile(listOf(platformSource, commonSource), *mainArguments) - val commonFirst = compile(listOf(commonSource, platformSource), *mainArguments) + val configurations = listOf( + listOf(platformSource, commonSource), + listOf(commonSource, platformSource) + ) + + val (platformFirst, commonFirst) = configurations.map { compile(it, *mainArguments) } + if (platformFirst != commonFirst) { assertEquals( "Compilation results are different when compiling [platform-specific, common] compared to when compiling [common, platform-specific]", From 09f36927a5c66e8a64fc6e2a456ba8c60fcacbdc Mon Sep 17 00:00:00 2001 From: Alexander Udalov Date: Tue, 19 Sep 2017 17:24:47 +0300 Subject: [PATCH 035/212] Do not try to generate 'expect' declarations in multifile classes Similarly to PackageCodegenImpl#generateFile #KT-15754 Fixed #KT-17478 Fixed --- .../kotlin/backend/common/CodegenUtil.kt | 5 +++++ .../kotlin/codegen/ExpressionCodegen.java | 10 ++++------ .../codegen/FunctionGenerationStrategy.java | 6 +++++- .../kotlin/codegen/MultifileClassCodegen.kt | 5 +++-- .../codegen/MultifileClassPartCodegen.kt | 5 +++-- .../kotlin/codegen/PackageCodegenImpl.java | 6 ++---- .../kotlin/codegen/PackagePartCodegen.java | 8 +++----- .../SuspendFunctionGenerationStrategy.kt | 3 ++- .../multiplatform/jvmMultifileClass/common.kt | 6 ++++++ .../multiplatform/jvmMultifileClass/jvm.kt | 5 +++++ .../jvmMultifileClass/output.txt | 7 +++++++ .../AbstractMultiPlatformIntegrationTest.kt | 20 ++++++++++++++++++- ...MultiPlatformIntegrationTestGenerated.java | 6 ++++++ 13 files changed, 70 insertions(+), 22 deletions(-) create mode 100644 compiler/testData/multiplatform/jvmMultifileClass/common.kt create mode 100644 compiler/testData/multiplatform/jvmMultifileClass/jvm.kt create mode 100644 compiler/testData/multiplatform/jvmMultifileClass/output.txt diff --git a/compiler/backend-common/src/org/jetbrains/kotlin/backend/common/CodegenUtil.kt b/compiler/backend-common/src/org/jetbrains/kotlin/backend/common/CodegenUtil.kt index 576c587717f..f2a99c572b7 100644 --- a/compiler/backend-common/src/org/jetbrains/kotlin/backend/common/CodegenUtil.kt +++ b/compiler/backend-common/src/org/jetbrains/kotlin/backend/common/CodegenUtil.kt @@ -23,6 +23,7 @@ import org.jetbrains.kotlin.descriptors.* import org.jetbrains.kotlin.incremental.components.NoLookupLocation import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.psi.* +import org.jetbrains.kotlin.psi.psiUtil.hasExpectModifier import org.jetbrains.kotlin.resolve.BindingContext import org.jetbrains.kotlin.resolve.DescriptorUtils import org.jetbrains.kotlin.resolve.bindingContextUtil.isUsedAsExpression @@ -161,4 +162,8 @@ object CodegenUtil { (1..arity).joinToString(prefix = "callableReferenceFakeCall(", separator = ", ", postfix = ")") { "p$it" } return KtPsiFactory(project, markGenerated = false).createExpression(fakeFunctionCall) as KtCallExpression } + + @JvmStatic + fun getActualDeclarations(file: KtFile): List = + file.declarations.filterNot(KtDeclaration::hasExpectModifier) } diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/ExpressionCodegen.java b/compiler/backend/src/org/jetbrains/kotlin/codegen/ExpressionCodegen.java index 840793fe7cb..17ba8ed6cf0 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/ExpressionCodegen.java +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/ExpressionCodegen.java @@ -103,9 +103,7 @@ import java.util.*; import static org.jetbrains.kotlin.builtins.KotlinBuiltIns.isInt; import static org.jetbrains.kotlin.codegen.AsmUtil.*; -import static org.jetbrains.kotlin.codegen.CodegenUtilKt.extractReificationArgument; -import static org.jetbrains.kotlin.codegen.CodegenUtilKt.isPossiblyUninitializedSingleton; -import static org.jetbrains.kotlin.codegen.CodegenUtilKt.unwrapInitialSignatureDescriptor; +import static org.jetbrains.kotlin.codegen.CodegenUtilKt.*; import static org.jetbrains.kotlin.codegen.JvmCodegenUtil.*; import static org.jetbrains.kotlin.codegen.binding.CodegenBinding.*; import static org.jetbrains.kotlin.codegen.inline.InlineCodegenUtilsKt.*; @@ -1611,7 +1609,7 @@ public class ExpressionCodegen extends KtVisitor impleme return null; } - public void returnExpression(KtExpression expr) { + public void returnExpression(@NotNull KtExpression expr) { boolean isBlockedNamedFunction = expr instanceof KtBlockExpression && expr.getParent() instanceof KtNamedFunction; FunctionDescriptor originalSuspendLambdaDescriptor = getOriginalSuspendLambdaDescriptorFromContext(context); @@ -1644,7 +1642,7 @@ public class ExpressionCodegen extends KtVisitor impleme } } - private static boolean endsWithReturn(KtElement bodyExpression) { + private static boolean endsWithReturn(@NotNull KtElement bodyExpression) { if (bodyExpression instanceof KtBlockExpression) { List statements = ((KtBlockExpression) bodyExpression).getStatements(); return statements.size() > 0 && statements.get(statements.size() - 1) instanceof KtReturnExpression; @@ -1653,7 +1651,7 @@ public class ExpressionCodegen extends KtVisitor impleme return bodyExpression instanceof KtReturnExpression; } - private static boolean isLambdaVoidBody(KtElement bodyExpression, Type returnType) { + private static boolean isLambdaVoidBody(@NotNull KtElement bodyExpression, @NotNull Type returnType) { if (bodyExpression instanceof KtBlockExpression) { PsiElement parent = bodyExpression.getParent(); if (parent instanceof KtFunctionLiteral) { diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/FunctionGenerationStrategy.java b/compiler/backend/src/org/jetbrains/kotlin/codegen/FunctionGenerationStrategy.java index 70e647d1220..d11e209f615 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/FunctionGenerationStrategy.java +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/FunctionGenerationStrategy.java @@ -20,6 +20,8 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.kotlin.codegen.context.MethodContext; import org.jetbrains.kotlin.codegen.state.GenerationState; import org.jetbrains.kotlin.psi.KtDeclarationWithBody; +import org.jetbrains.kotlin.psi.KtExpression; +import org.jetbrains.kotlin.psi.psiUtil.PsiUtilsKt; import org.jetbrains.kotlin.resolve.jvm.jvmSignature.JvmMethodSignature; import org.jetbrains.org.objectweb.asm.MethodVisitor; @@ -49,7 +51,9 @@ public abstract class FunctionGenerationStrategy { @Override public void doGenerateBody(@NotNull ExpressionCodegen codegen, @NotNull JvmMethodSignature signature) { - codegen.returnExpression(declaration.getBodyExpression()); + KtExpression bodyExpression = declaration.getBodyExpression(); + assert bodyExpression != null : "Function has no body: " + PsiUtilsKt.getElementTextWithContext(declaration); + codegen.returnExpression(bodyExpression); } } diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/MultifileClassCodegen.kt b/compiler/backend/src/org/jetbrains/kotlin/codegen/MultifileClassCodegen.kt index 3b0474ebd89..0b3c6a0b45b 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/MultifileClassCodegen.kt +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/MultifileClassCodegen.kt @@ -20,6 +20,7 @@ import com.intellij.openapi.application.ApplicationManager import com.intellij.openapi.progress.ProcessCanceledException import com.intellij.util.ArrayUtil import com.intellij.util.SmartList +import org.jetbrains.kotlin.backend.common.CodegenUtil import org.jetbrains.kotlin.codegen.context.FieldOwnerContext import org.jetbrains.kotlin.codegen.context.MethodContext import org.jetbrains.kotlin.codegen.state.GenerationState @@ -241,7 +242,7 @@ class MultifileClassCodegenImpl( private fun addDelegateGenerationTasksForDeclarationsInFile(file: KtFile, packageFragment: PackageFragmentDescriptor, partType: Type) { val facadeContext = state.rootContext.intoMultifileClass(packageFragment, facadeClassType, partType) val memberCodegen = createCodegenForDelegatesInMultifileFacade(facadeContext) - for (declaration in file.declarations) { + for (declaration in CodegenUtil.getActualDeclarations(file)) { if (declaration is KtNamedFunction || declaration is KtProperty || declaration is KtTypeAlias) { val descriptor = state.bindingContext.get(BindingContext.DECLARATION_TO_DESCRIPTOR, declaration) if (descriptor !is MemberDescriptor) { @@ -367,7 +368,7 @@ class MultifileClassCodegenImpl( } private fun KtFile.hasDeclarationsForPartClass() = - declarations.any { it is KtProperty || it is KtFunction } + CodegenUtil.getActualDeclarations(this).any { it is KtProperty || it is KtFunction } private fun getCompiledPackageFragment( facadeFqName: FqName, state: GenerationState diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/MultifileClassPartCodegen.kt b/compiler/backend/src/org/jetbrains/kotlin/codegen/MultifileClassPartCodegen.kt index 17ced65e860..bad8b7e4975 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/MultifileClassPartCodegen.kt +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/MultifileClassPartCodegen.kt @@ -17,6 +17,7 @@ package org.jetbrains.kotlin.codegen import com.intellij.util.ArrayUtil +import org.jetbrains.kotlin.backend.common.CodegenUtil import org.jetbrains.kotlin.codegen.context.MultifileClassPartContext import org.jetbrains.kotlin.codegen.serialization.JvmSerializerExtension import org.jetbrains.kotlin.codegen.state.GenerationState @@ -135,7 +136,7 @@ class MultifileClassPartCodegen( } override fun generateBody() { - for (declaration in element.declarations) { + for (declaration in CodegenUtil.getActualDeclarations(element)) { if (declaration is KtNamedFunction || declaration is KtProperty || declaration is KtTypeAlias) { genSimpleMember(declaration) } @@ -162,7 +163,7 @@ class MultifileClassPartCodegen( override fun generateKotlinMetadataAnnotation() { val members = ArrayList() - for (declaration in element.declarations) { + for (declaration in CodegenUtil.getActualDeclarations(element)) { when (declaration) { is KtNamedFunction -> { val functionDescriptor = bindingContext.get(BindingContext.FUNCTION, declaration) diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/PackageCodegenImpl.java b/compiler/backend/src/org/jetbrains/kotlin/codegen/PackageCodegenImpl.java index 7a635d9a4ec..4245c86fa24 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/PackageCodegenImpl.java +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/PackageCodegenImpl.java @@ -22,6 +22,7 @@ import com.intellij.openapi.vfs.VirtualFile; import com.intellij.util.SmartList; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import org.jetbrains.kotlin.backend.common.CodegenUtil; import org.jetbrains.kotlin.codegen.context.PackageContext; import org.jetbrains.kotlin.codegen.state.GenerationState; import org.jetbrains.kotlin.descriptors.PackageFragmentDescriptor; @@ -31,7 +32,6 @@ import org.jetbrains.kotlin.fileClasses.JvmFileClassUtil; import org.jetbrains.kotlin.name.FqName; import org.jetbrains.kotlin.progress.ProgressIndicatorAndCompilationCanceledStatus; import org.jetbrains.kotlin.psi.*; -import org.jetbrains.kotlin.psi.psiUtil.PsiUtilsKt; import org.jetbrains.kotlin.resolve.BindingContext; import org.jetbrains.kotlin.resolve.jvm.diagnostics.JvmDeclarationOriginKt; import org.jetbrains.org.objectweb.asm.Type; @@ -98,9 +98,7 @@ public class PackageCodegenImpl implements PackageCodegen { List classOrObjects = new ArrayList<>(); - for (KtDeclaration declaration : file.getDeclarations()) { - if (PsiUtilsKt.hasExpectModifier(declaration)) continue; - + for (KtDeclaration declaration : CodegenUtil.getActualDeclarations(file)) { if (declaration instanceof KtProperty || declaration instanceof KtNamedFunction || declaration instanceof KtTypeAlias) { generatePackagePart = true; } diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/PackagePartCodegen.java b/compiler/backend/src/org/jetbrains/kotlin/codegen/PackagePartCodegen.java index 67057075f71..c9d8fd6ea34 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/PackagePartCodegen.java +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/PackagePartCodegen.java @@ -19,6 +19,7 @@ package org.jetbrains.kotlin.codegen; import com.intellij.util.ArrayUtil; import kotlin.Unit; import org.jetbrains.annotations.NotNull; +import org.jetbrains.kotlin.backend.common.CodegenUtil; import org.jetbrains.kotlin.codegen.annotation.AnnotatedSimple; import org.jetbrains.kotlin.codegen.context.FieldOwnerContext; import org.jetbrains.kotlin.codegen.serialization.JvmSerializerExtension; @@ -32,7 +33,6 @@ import org.jetbrains.kotlin.descriptors.annotations.AnnotationDescriptor; import org.jetbrains.kotlin.descriptors.annotations.AnnotationsImpl; import org.jetbrains.kotlin.load.kotlin.header.KotlinClassHeader; import org.jetbrains.kotlin.psi.*; -import org.jetbrains.kotlin.psi.psiUtil.PsiUtilsKt; import org.jetbrains.kotlin.resolve.BindingContext; import org.jetbrains.kotlin.serialization.DescriptorSerializer; import org.jetbrains.kotlin.serialization.ProtoBuf; @@ -88,9 +88,7 @@ public class PackagePartCodegen extends MemberCodegen { @Override protected void generateBody() { - for (KtDeclaration declaration : element.getDeclarations()) { - if (PsiUtilsKt.hasExpectModifier(declaration)) continue; - + for (KtDeclaration declaration : CodegenUtil.getActualDeclarations(element)) { if (declaration instanceof KtNamedFunction || declaration instanceof KtProperty || declaration instanceof KtTypeAlias) { genSimpleMember(declaration); } @@ -104,7 +102,7 @@ public class PackagePartCodegen extends MemberCodegen { @Override protected void generateKotlinMetadataAnnotation() { List members = new ArrayList<>(); - for (KtDeclaration declaration : element.getDeclarations()) { + for (KtDeclaration declaration : CodegenUtil.getActualDeclarations(element)) { if (declaration instanceof KtNamedFunction) { SimpleFunctionDescriptor functionDescriptor = bindingContext.get(BindingContext.FUNCTION, declaration); members.add(functionDescriptor); diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/coroutines/SuspendFunctionGenerationStrategy.kt b/compiler/backend/src/org/jetbrains/kotlin/codegen/coroutines/SuspendFunctionGenerationStrategy.kt index 83c5786ac46..6cad1404b95 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/coroutines/SuspendFunctionGenerationStrategy.kt +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/coroutines/SuspendFunctionGenerationStrategy.kt @@ -23,6 +23,7 @@ import org.jetbrains.kotlin.codegen.state.GenerationState import org.jetbrains.kotlin.descriptors.ClassDescriptor import org.jetbrains.kotlin.descriptors.FunctionDescriptor import org.jetbrains.kotlin.psi.KtFunction +import org.jetbrains.kotlin.psi.psiUtil.getElementTextWithContext import org.jetbrains.kotlin.resolve.jvm.diagnostics.OtherOrigin import org.jetbrains.kotlin.resolve.jvm.jvmSignature.JvmMethodSignature import org.jetbrains.kotlin.utils.addToStdlib.safeAs @@ -70,6 +71,6 @@ class SuspendFunctionGenerationStrategy( override fun doGenerateBody(codegen: ExpressionCodegen, signature: JvmMethodSignature) { this.codegen = codegen - codegen.returnExpression(declaration.bodyExpression) + codegen.returnExpression(declaration.bodyExpression ?: error("Function has no body: " + declaration.getElementTextWithContext())) } } diff --git a/compiler/testData/multiplatform/jvmMultifileClass/common.kt b/compiler/testData/multiplatform/jvmMultifileClass/common.kt new file mode 100644 index 00000000000..b3fd69adec3 --- /dev/null +++ b/compiler/testData/multiplatform/jvmMultifileClass/common.kt @@ -0,0 +1,6 @@ +// WITH_RUNTIME + +@file:kotlin.jvm.JvmMultifileClass +@file:kotlin.jvm.JvmName("CommonKt") + +expect fun foo() diff --git a/compiler/testData/multiplatform/jvmMultifileClass/jvm.kt b/compiler/testData/multiplatform/jvmMultifileClass/jvm.kt new file mode 100644 index 00000000000..05007b3dc69 --- /dev/null +++ b/compiler/testData/multiplatform/jvmMultifileClass/jvm.kt @@ -0,0 +1,5 @@ +actual fun foo() {} + +fun test() { + foo() +} diff --git a/compiler/testData/multiplatform/jvmMultifileClass/output.txt b/compiler/testData/multiplatform/jvmMultifileClass/output.txt new file mode 100644 index 00000000000..b08950d503d --- /dev/null +++ b/compiler/testData/multiplatform/jvmMultifileClass/output.txt @@ -0,0 +1,7 @@ +-- Common -- +Exit code: OK +Output: + +-- JVM -- +Exit code: OK +Output: diff --git a/compiler/tests/org/jetbrains/kotlin/multiplatform/AbstractMultiPlatformIntegrationTest.kt b/compiler/tests/org/jetbrains/kotlin/multiplatform/AbstractMultiPlatformIntegrationTest.kt index 1d28d758442..14e3123c51a 100644 --- a/compiler/tests/org/jetbrains/kotlin/multiplatform/AbstractMultiPlatformIntegrationTest.kt +++ b/compiler/tests/org/jetbrains/kotlin/multiplatform/AbstractMultiPlatformIntegrationTest.kt @@ -26,6 +26,9 @@ import org.jetbrains.kotlin.test.KotlinTestUtils import org.jetbrains.kotlin.test.testFramework.KtUsefulTestCase import org.jetbrains.kotlin.test.util.trimTrailingWhitespacesAndAddNewlineAtEOF import java.io.File +import java.nio.file.Files +import java.nio.file.Path +import java.nio.file.Paths abstract class AbstractMultiPlatformIntegrationTest : KtUsefulTestCase() { fun doTest(directoryPath: String) { @@ -38,6 +41,11 @@ abstract class AbstractMultiPlatformIntegrationTest : KtUsefulTestCase() { val tmpdir = KotlinTestUtils.tmpDir(getTestName(true)) + val optionalStdlibCommon = + if (InTextDirectivesUtils.isDirectiveDefined(commonSrc.readText(), "WITH_RUNTIME")) + arrayOf("-cp", findStdlibCommon().absolutePath) + else emptyArray() + val commonDest = File(tmpdir, "common").absolutePath val jvmDest = File(tmpdir, "jvm").absolutePath val jsDest = File(File(tmpdir, "js"), "output.js").absolutePath @@ -45,7 +53,7 @@ abstract class AbstractMultiPlatformIntegrationTest : KtUsefulTestCase() { val result = buildString { appendln("-- Common --") - appendln(K2MetadataCompiler().compile(listOf(commonSrc), "-d", commonDest)) + appendln(K2MetadataCompiler().compile(listOf(commonSrc), "-d", commonDest, *optionalStdlibCommon)) if (jvmSrc.exists()) { appendln() @@ -69,6 +77,16 @@ abstract class AbstractMultiPlatformIntegrationTest : KtUsefulTestCase() { KotlinTestUtils.assertEqualsToFile(File(root, "output.txt"), result.replace('\\', '/')) } + private fun findStdlibCommon(): File { + // Take kotlin-stdlib-common.jar from dist/ when it's there + val stdlibCommonLibsDir = "libraries/stdlib/common/build/libs" + val commonLibs = Files.newDirectoryStream(Paths.get(stdlibCommonLibsDir)).use(Iterable::toList) + return commonLibs.sorted().findLast { + val name = it.toFile().name + !name.endsWith("-javadoc.jar") && !name.endsWith("-sources.jar") + }?.toFile() ?: error("kotlin-stdlib-common is not found in $stdlibCommonLibsDir") + } + private fun CLICompiler<*>.compileBothWays(commonSource: File, platformSource: File, vararg mainArguments: String): String { val configurations = listOf( listOf(platformSource, commonSource), diff --git a/compiler/tests/org/jetbrains/kotlin/multiplatform/MultiPlatformIntegrationTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/multiplatform/MultiPlatformIntegrationTestGenerated.java index a7d2f06b80f..25207b58b49 100644 --- a/compiler/tests/org/jetbrains/kotlin/multiplatform/MultiPlatformIntegrationTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/multiplatform/MultiPlatformIntegrationTestGenerated.java @@ -102,6 +102,12 @@ public class MultiPlatformIntegrationTestGenerated extends AbstractMultiPlatform doTest(fileName); } + @TestMetadata("jvmMultifileClass") + public void testJvmMultifileClass() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/multiplatform/jvmMultifileClass/"); + doTest(fileName); + } + @TestMetadata("missingOverload") public void testMissingOverload() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/multiplatform/missingOverload/"); From 23d6690581d4aae0c87f5669560b9c1950f33264 Mon Sep 17 00:00:00 2001 From: Alexander Udalov Date: Tue, 19 Sep 2017 19:09:17 +0300 Subject: [PATCH 036/212] Fix codegen for multifile class parts with type aliases only #KT-20337 Fixed --- .../kotlin/codegen/MultifileClassCodegen.kt | 2 +- .../codegen/MultifileClassPartCodegen.kt | 24 +------- .../kotlin/codegen/PackagePartCodegen.java | 57 +++++++++++-------- .../multifileClassWithTypealias.kt | 16 ++++++ ...mpileKotlinAgainstKotlinTestGenerated.java | 6 ++ 5 files changed, 56 insertions(+), 49 deletions(-) create mode 100644 compiler/testData/compileKotlinAgainstKotlin/multifileClassWithTypealias.kt diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/MultifileClassCodegen.kt b/compiler/backend/src/org/jetbrains/kotlin/codegen/MultifileClassCodegen.kt index 0b3c6a0b45b..bd17339567c 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/MultifileClassCodegen.kt +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/MultifileClassCodegen.kt @@ -368,7 +368,7 @@ class MultifileClassCodegenImpl( } private fun KtFile.hasDeclarationsForPartClass() = - CodegenUtil.getActualDeclarations(this).any { it is KtProperty || it is KtFunction } + CodegenUtil.getActualDeclarations(this).any { it is KtProperty || it is KtFunction || it is KtTypeAlias } private fun getCompiledPackageFragment( facadeFqName: FqName, state: GenerationState diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/MultifileClassPartCodegen.kt b/compiler/backend/src/org/jetbrains/kotlin/codegen/MultifileClassPartCodegen.kt index bad8b7e4975..f782c31de52 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/MultifileClassPartCodegen.kt +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/MultifileClassPartCodegen.kt @@ -19,7 +19,6 @@ package org.jetbrains.kotlin.codegen import com.intellij.util.ArrayUtil import org.jetbrains.kotlin.backend.common.CodegenUtil import org.jetbrains.kotlin.codegen.context.MultifileClassPartContext -import org.jetbrains.kotlin.codegen.serialization.JvmSerializerExtension import org.jetbrains.kotlin.codegen.state.GenerationState import org.jetbrains.kotlin.descriptors.DeclarationDescriptor import org.jetbrains.kotlin.descriptors.PackageFragmentDescriptor @@ -29,16 +28,13 @@ import org.jetbrains.kotlin.psi.KtFile import org.jetbrains.kotlin.psi.KtNamedFunction import org.jetbrains.kotlin.psi.KtProperty import org.jetbrains.kotlin.psi.KtTypeAlias -import org.jetbrains.kotlin.resolve.BindingContext import org.jetbrains.kotlin.resolve.jvm.diagnostics.MultifileClass import org.jetbrains.kotlin.resolve.jvm.diagnostics.OtherOrigin -import org.jetbrains.kotlin.serialization.DescriptorSerializer import org.jetbrains.org.objectweb.asm.MethodVisitor import org.jetbrains.org.objectweb.asm.Opcodes import org.jetbrains.org.objectweb.asm.Type import org.jetbrains.org.objectweb.asm.tree.AbstractInsnNode import org.jetbrains.org.objectweb.asm.tree.MethodInsnNode -import java.util.* class MultifileClassPartCodegen( v: ClassBuilder, @@ -162,25 +158,7 @@ class MultifileClassPartCodegen( } override fun generateKotlinMetadataAnnotation() { - val members = ArrayList() - for (declaration in CodegenUtil.getActualDeclarations(element)) { - when (declaration) { - is KtNamedFunction -> { - val functionDescriptor = bindingContext.get(BindingContext.FUNCTION, declaration) - members.add(functionDescriptor ?: throw AssertionError("Function ${declaration.name} is not bound in ${element.name}")) - } - is KtProperty -> { - val property = bindingContext.get(BindingContext.VARIABLE, declaration) - members.add(property ?: throw AssertionError("Property ${declaration.name} is not bound in ${element.name}")) - } - } - } - - val extension = JvmSerializerExtension(v.serializationBindings, state) - val serializer = DescriptorSerializer.createTopLevel(extension) - val builder = serializer.packagePartProto(packageFragment.fqName, members) - extension.serializeJvmPackage(builder, partType) - val packageProto = builder.build() + val (serializer, packageProto) = PackagePartCodegen.serializePackagePartMembers(this, partType) val extraFlags = if (shouldGeneratePartHierarchy) JvmAnnotationNames.METADATA_MULTIFILE_PARTS_INHERIT_FLAG else 0 diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/PackagePartCodegen.java b/compiler/backend/src/org/jetbrains/kotlin/codegen/PackagePartCodegen.java index c9d8fd6ea34..7df705e0c07 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/PackagePartCodegen.java +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/PackagePartCodegen.java @@ -17,7 +17,9 @@ package org.jetbrains.kotlin.codegen; import com.intellij.util.ArrayUtil; +import kotlin.Pair; import kotlin.Unit; +import kotlin.collections.CollectionsKt; import org.jetbrains.annotations.NotNull; import org.jetbrains.kotlin.backend.common.CodegenUtil; import org.jetbrains.kotlin.codegen.annotation.AnnotatedSimple; @@ -25,9 +27,6 @@ import org.jetbrains.kotlin.codegen.context.FieldOwnerContext; import org.jetbrains.kotlin.codegen.serialization.JvmSerializerExtension; import org.jetbrains.kotlin.codegen.state.GenerationState; import org.jetbrains.kotlin.descriptors.DeclarationDescriptor; -import org.jetbrains.kotlin.descriptors.SimpleFunctionDescriptor; -import org.jetbrains.kotlin.descriptors.TypeAliasDescriptor; -import org.jetbrains.kotlin.descriptors.VariableDescriptor; import org.jetbrains.kotlin.descriptors.annotations.Annotated; import org.jetbrains.kotlin.descriptors.annotations.AnnotationDescriptor; import org.jetbrains.kotlin.descriptors.annotations.AnnotationsImpl; @@ -101,34 +100,42 @@ public class PackagePartCodegen extends MemberCodegen { @Override protected void generateKotlinMetadataAnnotation() { - List members = new ArrayList<>(); - for (KtDeclaration declaration : CodegenUtil.getActualDeclarations(element)) { - if (declaration instanceof KtNamedFunction) { - SimpleFunctionDescriptor functionDescriptor = bindingContext.get(BindingContext.FUNCTION, declaration); - members.add(functionDescriptor); - } - else if (declaration instanceof KtProperty) { - VariableDescriptor property = bindingContext.get(BindingContext.VARIABLE, declaration); - members.add(property); - } - else if (declaration instanceof KtTypeAlias) { - TypeAliasDescriptor typeAlias = bindingContext.get(BindingContext.TYPE_ALIAS, declaration); - members.add(typeAlias); - } - } - - JvmSerializerExtension extension = new JvmSerializerExtension(v.getSerializationBindings(), state); - DescriptorSerializer serializer = DescriptorSerializer.createTopLevel(extension); - ProtoBuf.Package.Builder builder = serializer.packagePartProto(element.getPackageFqName(), members); - extension.serializeJvmPackage(builder, packagePartType); - ProtoBuf.Package packageProto = builder.build(); + Pair serializedPart = serializePackagePartMembers(this, packagePartType); WriteAnnotationUtilKt.writeKotlinMetadata(v, state, KotlinClassHeader.Kind.FILE_FACADE, 0, av -> { - writeAnnotationData(av, serializer, packageProto); + writeAnnotationData(av, serializedPart.getFirst(), serializedPart.getSecond()); return Unit.INSTANCE; }); } + @NotNull + protected static Pair serializePackagePartMembers( + @NotNull MemberCodegen codegen, + @NotNull Type packagePartType + ) { + BindingContext bindingContext = codegen.bindingContext; + List members = CollectionsKt.mapNotNull(CodegenUtil.getActualDeclarations(codegen.element), declaration -> { + if (declaration instanceof KtNamedFunction) { + return bindingContext.get(BindingContext.FUNCTION, declaration); + } + else if (declaration instanceof KtProperty) { + return bindingContext.get(BindingContext.VARIABLE, declaration); + } + else if (declaration instanceof KtTypeAlias) { + return bindingContext.get(BindingContext.TYPE_ALIAS, declaration); + } + + return null; + }); + + JvmSerializerExtension extension = new JvmSerializerExtension(codegen.v.getSerializationBindings(), codegen.state); + DescriptorSerializer serializer = DescriptorSerializer.createTopLevel(extension); + ProtoBuf.Package.Builder builder = serializer.packagePartProto(codegen.element.getPackageFqName(), members); + extension.serializeJvmPackage(builder, packagePartType); + + return new Pair<>(serializer, builder.build()); + } + @Override protected void generateSyntheticPartsAfterBody() { generateSyntheticAccessors(); diff --git a/compiler/testData/compileKotlinAgainstKotlin/multifileClassWithTypealias.kt b/compiler/testData/compileKotlinAgainstKotlin/multifileClassWithTypealias.kt new file mode 100644 index 00000000000..f7ed63a5c3f --- /dev/null +++ b/compiler/testData/compileKotlinAgainstKotlin/multifileClassWithTypealias.kt @@ -0,0 +1,16 @@ +// IGNORE_BACKEND: NATIVE +// FILE: A.kt + +@file:[JvmName("Test") JvmMultifileClass] + +typealias S = String +typealias LS = List + +// FILE: B.kt + +import java.util.Arrays + +fun box(): S { + val l: LS = Arrays.asList("OK") + return l[0] +} diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/CompileKotlinAgainstKotlinTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/CompileKotlinAgainstKotlinTestGenerated.java index 73cf7c74e51..6ce011f1092 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/CompileKotlinAgainstKotlinTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/CompileKotlinAgainstKotlinTestGenerated.java @@ -168,6 +168,12 @@ public class CompileKotlinAgainstKotlinTestGenerated extends AbstractCompileKotl doTest(fileName); } + @TestMetadata("multifileClassWithTypealias.kt") + public void testMultifileClassWithTypealias() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/compileKotlinAgainstKotlin/multifileClassWithTypealias.kt"); + doTest(fileName); + } + @TestMetadata("nestedClass.kt") public void testNestedClass() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/compileKotlinAgainstKotlin/nestedClass.kt"); From 113c83b47a29c9103cc5acdd24045816c772f1fe Mon Sep 17 00:00:00 2001 From: Alexander Udalov Date: Tue, 19 Sep 2017 14:17:34 +0300 Subject: [PATCH 037/212] Minor, cleanup AbstractQuickFixMultiFileTest --- .../AbstractAndroidQuickFixMultiFileTest.java | 4 +- .../quickfix/AbstractQuickFixMultiFileTest.kt | 44 ++++++------------- 2 files changed, 15 insertions(+), 33 deletions(-) diff --git a/idea/idea-android/tests/org/jetbrains/kotlin/android/quickfix/AbstractAndroidQuickFixMultiFileTest.java b/idea/idea-android/tests/org/jetbrains/kotlin/android/quickfix/AbstractAndroidQuickFixMultiFileTest.java index 41704163d37..77b5944c2be 100644 --- a/idea/idea-android/tests/org/jetbrains/kotlin/android/quickfix/AbstractAndroidQuickFixMultiFileTest.java +++ b/idea/idea-android/tests/org/jetbrains/kotlin/android/quickfix/AbstractAndroidQuickFixMultiFileTest.java @@ -45,7 +45,7 @@ public abstract class AbstractAndroidQuickFixMultiFileTest extends AbstractQuick } @Override - protected void doTestWithExtraFile(@NotNull String beforeFileName) throws Exception { + protected void doTestWithExtraFile(@NotNull String beforeFileName) { addManifest(); super.doTestWithExtraFile(beforeFileName); } @@ -59,7 +59,7 @@ public abstract class AbstractAndroidQuickFixMultiFileTest extends AbstractQuick ApplicationManager.getApplication().runWriteAction(facetModel::commit); } - private void addManifest() throws Exception { + private void addManifest() { myFixture.configureByFile("idea/testData/android/AndroidManifest.xml"); } } diff --git a/idea/tests/org/jetbrains/kotlin/idea/quickfix/AbstractQuickFixMultiFileTest.kt b/idea/tests/org/jetbrains/kotlin/idea/quickfix/AbstractQuickFixMultiFileTest.kt index 7c6e8b70acf..0b94878c081 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/quickfix/AbstractQuickFixMultiFileTest.kt +++ b/idea/tests/org/jetbrains/kotlin/idea/quickfix/AbstractQuickFixMultiFileTest.kt @@ -20,7 +20,6 @@ import com.intellij.codeInsight.CodeInsightSettings import com.intellij.codeInsight.daemon.quickFix.ActionHint import com.intellij.codeInsight.intention.IntentionAction import com.intellij.codeInspection.InspectionEP -import com.intellij.codeInspection.InspectionProfileEntry import com.intellij.codeInspection.LocalInspectionEP import com.intellij.ide.highlighter.JavaFileType import com.intellij.openapi.command.CommandProcessor @@ -47,12 +46,10 @@ import org.jetbrains.kotlin.psi.KtFile import org.jetbrains.kotlin.test.KotlinTestUtils import org.jetbrains.kotlin.test.testFramework.runWriteAction import java.io.File -import java.io.IOException import java.util.* import java.util.regex.Pattern abstract class AbstractQuickFixMultiFileTest : KotlinLightCodeInsightFixtureTestCase() { - @Throws(Exception::class) protected open fun doTestWithExtraFile(beforeFileName: String) { enableInspections(beforeFileName) @@ -64,7 +61,6 @@ abstract class AbstractQuickFixMultiFileTest : KotlinLightCodeInsightFixtureTest } } - @Throws(IOException::class, ClassNotFoundException::class) private fun enableInspections(beforeFileName: String) { val inspectionFile = findInspectionFile(File(beforeFileName).parentFile) if (inspectionFile != null) { @@ -79,15 +75,10 @@ abstract class AbstractQuickFixMultiFileTest : KotlinLightCodeInsightFixtureTest ContainerUtil.addAll>(eps, *Extensions.getExtensions(LocalInspectionEP.LOCAL_INSPECTION)) ContainerUtil.addAll>(eps, *Extensions.getExtensions(InspectionEP.GLOBAL_INSPECTION)) - var tool: InspectionProfileEntry? = null - for (ep in eps) { - if (klass.name == ep.implementationClass) { - tool = ep.instantiateTool() - } - } - assert(tool != null) { "Could not find inspection tool for class: " + klass } + val tool = eps.firstOrNull { it.implementationClass == klass.name }?.instantiateTool() + ?: error("Could not find inspection tool for class: $klass") - myFixture.enableInspections(tool!!) + myFixture.enableInspections(tool) } override fun setUp() { @@ -105,11 +96,8 @@ abstract class AbstractQuickFixMultiFileTest : KotlinLightCodeInsightFixtureTest * * * @param beforeFile will be added last, as subFiles are dependencies of it */ - protected fun configureMultiFileTest(subFiles: List, beforeFile: TestFile): List { - val vFiles = mutableListOf() - for (subFile in subFiles) { - vFiles.add(createTestFile(subFile)) - } + private fun configureMultiFileTest(subFiles: List, beforeFile: TestFile): List { + val vFiles = subFiles.map(this::createTestFile).toMutableList() val beforeVFile = createTestFile(beforeFile) vFiles.add(beforeVFile) myFixture.configureFromExistingVirtualFile(beforeVFile) @@ -122,14 +110,13 @@ abstract class AbstractQuickFixMultiFileTest : KotlinLightCodeInsightFixtureTest private fun createTestFile(testFile: TestFile): VirtualFile { return runWriteAction { val vFile = myFixture.tempDirFixture.createFile(testFile.path) - vFile.setCharset(CharsetToolkit.UTF8_CHARSET) + vFile.charset = CharsetToolkit.UTF8_CHARSET VfsUtil.saveText(vFile, testFile.content) vFile } } - @Throws(Exception::class) - protected fun doMultiFileTest(beforeFileName: String) { + private fun doMultiFileTest(beforeFileName: String) { val multifileText = FileUtil.loadFile(File(beforeFileName), true) val subFiles = KotlinTestUtils.createTestFiles( @@ -137,11 +124,9 @@ abstract class AbstractQuickFixMultiFileTest : KotlinLightCodeInsightFixtureTest multifileText, object : KotlinTestUtils.TestFileFactoryNoModules() { override fun create(fileName: String, text: String, directives: Map): TestFile { - var text = text if (text.startsWith("// FILE")) { - val firstLineDropped = StringUtil.substringAfter(text, "\n")!! - - text = firstLineDropped + // Drop the first line + return TestFile(fileName, StringUtil.substringAfter(text, "\n")!!) } return TestFile(fileName, text) } @@ -205,7 +190,6 @@ abstract class AbstractQuickFixMultiFileTest : KotlinLightCodeInsightFixtureTest }, "", "") } - @Throws(Exception::class) private fun doTest(beforeFileName: String) { val mainFile = File(beforeFileName) val originalFileText = FileUtil.loadFile(mainFile, true) @@ -213,7 +197,7 @@ abstract class AbstractQuickFixMultiFileTest : KotlinLightCodeInsightFixtureTest val mainFileDir = mainFile.parentFile!! val mainFileName = mainFile.name - val extraFiles = mainFileDir.listFiles { dir, name -> name.startsWith(extraFileNamePrefix(mainFileName)) && name != mainFileName }!! + val extraFiles = mainFileDir.listFiles { _, name -> name.startsWith(extraFileNamePrefix(mainFileName)) && name != mainFileName }!! val testFiles = ArrayList() testFiles.add(mainFile.name) @@ -245,13 +229,11 @@ abstract class AbstractQuickFixMultiFileTest : KotlinLightCodeInsightFixtureTest KotlinTestUtils.assertEqualsToFile(File(afterFilePath), editor) } - val mainFile = myFixture.file - val mainFileName = mainFile.name - for (file in mainFile.containingDirectory.files) { + for (file in myFixture.file.containingDirectory.files) { val fileName = file.name - if (fileName == mainFileName || !fileName.startsWith(extraFileNamePrefix(myFixture.file.name))) continue + if (fileName == myFixture.file.name || !fileName.startsWith(extraFileNamePrefix(myFixture.file.name))) continue - val extraFileFullPath = beforeFileName.replace(mainFileName, fileName) + val extraFileFullPath = beforeFileName.replace(myFixture.file.name, fileName) val afterFile = File(extraFileFullPath.replace(".before.", ".after.")) if (afterFile.exists()) { KotlinTestUtils.assertEqualsToFile(afterFile, file.text) From 60430828cf47752d9b8b3dd49ed571e757bd3baf Mon Sep 17 00:00:00 2001 From: Alexander Udalov Date: Tue, 19 Sep 2017 14:18:05 +0300 Subject: [PATCH 038/212] Deduplicate code in AbstractQuickFixMulti{File,Module}Test --- .../quickfix/AbstractQuickFixMultiFileTest.kt | 137 ++++++++---------- .../AbstractQuickFixMultiModuleTest.kt | 85 ++--------- 2 files changed, 72 insertions(+), 150 deletions(-) diff --git a/idea/tests/org/jetbrains/kotlin/idea/quickfix/AbstractQuickFixMultiFileTest.kt b/idea/tests/org/jetbrains/kotlin/idea/quickfix/AbstractQuickFixMultiFileTest.kt index 0b94878c081..01491b5e9fc 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/quickfix/AbstractQuickFixMultiFileTest.kt +++ b/idea/tests/org/jetbrains/kotlin/idea/quickfix/AbstractQuickFixMultiFileTest.kt @@ -17,22 +17,23 @@ package org.jetbrains.kotlin.idea.quickfix import com.intellij.codeInsight.CodeInsightSettings +import com.intellij.codeInsight.daemon.impl.HighlightInfo import com.intellij.codeInsight.daemon.quickFix.ActionHint import com.intellij.codeInsight.intention.IntentionAction import com.intellij.codeInspection.InspectionEP import com.intellij.codeInspection.LocalInspectionEP import com.intellij.ide.highlighter.JavaFileType import com.intellij.openapi.command.CommandProcessor +import com.intellij.openapi.editor.Editor import com.intellij.openapi.extensions.Extensions import com.intellij.openapi.fileTypes.FileType import com.intellij.openapi.fileTypes.PlainTextFileType import com.intellij.openapi.util.io.FileUtil import com.intellij.openapi.util.text.StringUtil import com.intellij.openapi.vfs.CharsetToolkit -import com.intellij.openapi.vfs.LocalFileSystem import com.intellij.openapi.vfs.VfsUtil import com.intellij.openapi.vfs.VirtualFile -import com.intellij.testFramework.VfsTestUtil +import com.intellij.psi.PsiFile import com.intellij.testFramework.fixtures.impl.CodeInsightTestFixtureImpl import com.intellij.util.ArrayUtil import com.intellij.util.containers.ContainerUtil @@ -155,7 +156,7 @@ abstract class AbstractQuickFixMultiFileTest : KotlinLightCodeInsightFixtureTest DirectiveBasedActionUtils.checkForUnexpectedErrors(psiFile) } - doAction(text, actionShouldBeAvailable, getTestName(false)) + doAction(text, file, editor, actionShouldBeAvailable, getTestName(false), this::availableActions, myFixture::doHighlighting) val actualText = file.text val afterText = StringBuilder(actualText).insert(editor.caretModel.offset, "").toString() @@ -218,7 +219,7 @@ abstract class AbstractQuickFixMultiFileTest : KotlinLightCodeInsightFixtureTest DirectiveBasedActionUtils.checkForUnexpectedErrors(psiFile) } - doAction(text, actionShouldBeAvailable, beforeFileName) + doAction(text, file, editor, actionShouldBeAvailable, beforeFileName, this::availableActions, myFixture::doHighlighting) if (actionShouldBeAvailable) { val afterFilePath = beforeFileName.replace(".before.Main.", ".after.") @@ -257,50 +258,6 @@ abstract class AbstractQuickFixMultiFileTest : KotlinLightCodeInsightFixtureTest }, "", "") } - @Throws(Exception::class) - fun doAction(text: String, actionShouldBeAvailable: Boolean, testFilePath: String) { - val pattern = if (text.startsWith("/")) - Pattern.compile(text.substring(1, text.length - 1)) - else - Pattern.compile(StringUtil.escapeToRegexp(text)) - - val availableActions = availableActions - val action = findActionByPattern(pattern, availableActions) - - if (action == null) { - if (actionShouldBeAvailable) { - val texts = getActionsTexts(availableActions) - val infos = myFixture.doHighlighting() - TestCase.fail("Action with text '" + text + "' is not available in test " + testFilePath + "\n" + - "Available actions (" + texts.size + "): \n" + - StringUtil.join(texts, "\n") + - "\nActions:\n" + - StringUtil.join(availableActions, "\n") + - "\nInfos:\n" + - StringUtil.join(infos, "\n")) - } - else { - DirectiveBasedActionUtils.checkAvailableActionsAreExpected(file, availableActions) - } - } - else { - if (!actionShouldBeAvailable) { - TestCase.fail("Action '$text' is available (but must not) in test $testFilePath") - } - - CodeInsightTestFixtureImpl.invokeIntention(action, file, editor, action.text) - - if (!shouldBeAvailableAfterExecution()) { - val afterAction = findActionByPattern(pattern, this.availableActions) - - if (afterAction != null) { - TestCase.fail("Action '$text' is still available after its invocation in test $testFilePath") - } - } - } - } - - private val availableActions: List get() { myFixture.doHighlighting() @@ -310,42 +267,70 @@ abstract class AbstractQuickFixMultiFileTest : KotlinLightCodeInsightFixtureTest class TestFile internal constructor(val path: String, val content: String) companion object { + private fun getActionsTexts(availableActions: List): List = + availableActions.map(IntentionAction::getText) - protected fun shouldBeAvailableAfterExecution(): Boolean { - return false + private fun extraFileNamePrefix(mainFileName: String): String = + mainFileName.replace(".Main.kt", ".").replace(".Main.java", ".") + + protected fun guessFileType(file: TestFile): FileType = when { + file.path.contains("." + KotlinFileType.EXTENSION) -> KotlinFileType.INSTANCE + file.path.contains("." + JavaFileType.DEFAULT_EXTENSION) -> JavaFileType.INSTANCE + else -> PlainTextFileType.INSTANCE } - private fun getActionsTexts(availableActions: List): List { - val texts = ArrayList() - for (intentionAction in availableActions) { - texts.add(intentionAction.text) - } - return texts - } + private fun findActionByPattern(pattern: Pattern, availableActions: List): IntentionAction? = + availableActions.firstOrNull { pattern.matcher(it.text).matches() } - private fun extraFileNamePrefix(mainFileName: String): String { - return mainFileName.replace(".Main.kt", ".").replace(".Main.java", ".") - } + fun doAction( + text: String, + file: PsiFile, + editor: Editor, + actionShouldBeAvailable: Boolean, + testFilePath: String, + getAvailableActions: () -> List, + doHighlighting: () -> List, + shouldBeAvailableAfterExecution: Boolean = false + ) { + val pattern = if (text.startsWith("/")) + Pattern.compile(text.substring(1, text.length - 1)) + else + Pattern.compile(StringUtil.escapeToRegexp(text)) - protected fun guessFileType(file: TestFile): FileType { - if (file.path.contains("." + KotlinFileType.EXTENSION)) { - return KotlinFileType.INSTANCE - } - else if (file.path.contains("." + JavaFileType.DEFAULT_EXTENSION)) { - return JavaFileType.INSTANCE - } - else { - return PlainTextFileType.INSTANCE - } - } + val availableActions = getAvailableActions() + val action = findActionByPattern(pattern, availableActions) - private fun findActionByPattern(pattern: Pattern, availableActions: List): IntentionAction? { - for (availableAction in availableActions) { - if (pattern.matcher(availableAction.text).matches()) { - return availableAction + if (action == null) { + if (actionShouldBeAvailable) { + val texts = getActionsTexts(availableActions) + val infos = doHighlighting() + TestCase.fail("Action with text '" + text + "' is not available in test " + testFilePath + "\n" + + "Available actions (" + texts.size + "): \n" + + StringUtil.join(texts, "\n") + + "\nActions:\n" + + StringUtil.join(availableActions, "\n") + + "\nInfos:\n" + + StringUtil.join(infos, "\n")) + } + else { + DirectiveBasedActionUtils.checkAvailableActionsAreExpected(file, availableActions) + } + } + else { + if (!actionShouldBeAvailable) { + TestCase.fail("Action '$text' is available (but must not) in test $testFilePath") + } + + CodeInsightTestFixtureImpl.invokeIntention(action, file, editor, action.text) + + if (!shouldBeAvailableAfterExecution) { + val afterAction = findActionByPattern(pattern, getAvailableActions()) + + if (afterAction != null) { + TestCase.fail("Action '$text' is still available after its invocation in test $testFilePath") + } } } - return null } } } diff --git a/idea/tests/org/jetbrains/kotlin/idea/quickfix/AbstractQuickFixMultiModuleTest.kt b/idea/tests/org/jetbrains/kotlin/idea/quickfix/AbstractQuickFixMultiModuleTest.kt index af5b95a1831..e3591c12713 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/quickfix/AbstractQuickFixMultiModuleTest.kt +++ b/idea/tests/org/jetbrains/kotlin/idea/quickfix/AbstractQuickFixMultiModuleTest.kt @@ -19,10 +19,7 @@ package org.jetbrains.kotlin.idea.quickfix import com.intellij.codeInsight.daemon.quickFix.ActionHint import com.intellij.codeInsight.daemon.quickFix.LightQuickFixTestCase import com.intellij.codeInsight.intention.IntentionAction -import com.intellij.codeInsight.intention.impl.ShowIntentionActionsHandler import com.intellij.openapi.command.CommandProcessor -import com.intellij.openapi.util.text.StringUtil -import com.intellij.util.ui.UIUtil import junit.framework.ComparisonFailure import junit.framework.TestCase import org.jetbrains.kotlin.idea.inspections.findExistingEditor @@ -34,17 +31,11 @@ import org.jetbrains.kotlin.psi.KtFile import org.jetbrains.kotlin.test.InTextDirectivesUtils import org.jetbrains.kotlin.test.KotlinTestUtils import java.io.File -import java.util.regex.Pattern abstract class AbstractQuickFixMultiModuleTest : AbstractMultiModuleTest() { override fun getTestDataPath() = PluginTestCaseBase.getTestDataPathBase() + "/multiModuleQuickFix/" - protected fun shouldBeAvailableAfterExecution(file: KtFile) = - InTextDirectivesUtils.isDirectiveDefined(file.text, "// SHOULD_BE_AVAILABLE_AFTER_EXECUTION") - - private fun getActionsTexts(availableActions: List) = availableActions.map { it.text } - protected fun doQuickFixTest() { val allFilesInProject = PluginJetFilesProvider.allFilesInProject(myProject!!) val actionFile = allFilesInProject.single { file -> @@ -58,18 +49,19 @@ abstract class AbstractQuickFixMultiModuleTest : AbstractMultiModuleTest() { CommandProcessor.getInstance().executeCommand(project, { try { - val psiFile = actionFile - - val actionHint = ActionHint.parse(psiFile, actionFileText) + val actionHint = ActionHint.parse(actionFile, actionFileText) val text = actionHint.expectedText val actionShouldBeAvailable = actionHint.shouldPresent() - if (psiFile is KtFile) { - DirectiveBasedActionUtils.checkForUnexpectedErrors(psiFile) + if (actionFile is KtFile) { + DirectiveBasedActionUtils.checkForUnexpectedErrors(actionFile) } - doAction(text, actionShouldBeAvailable, actionFileName, actionFile) + AbstractQuickFixMultiFileTest.doAction( + text, file, editor, actionShouldBeAvailable, actionFileName, this::availableActions, this::doHighlighting, + InTextDirectivesUtils.isDirectiveDefined(actionFile.text, "// SHOULD_BE_AVAILABLE_AFTER_EXECUTION") + ) if (actionShouldBeAvailable) { val testDirectory = File(testDataPath) @@ -106,66 +98,11 @@ abstract class AbstractQuickFixMultiModuleTest : AbstractMultiModuleTest() { }, "", "") } - // TODO: merge with AbstractQuickFixMultiFileTest - - fun doAction(text: String, actionShouldBeAvailable: Boolean, testFilePath: String, actionFile: KtFile) { - val pattern = if (text.startsWith("/")) - Pattern.compile(text.substring(1, text.length - 1)) - else - Pattern.compile(StringUtil.escapeToRegexp(text)) - - val availableActions = getAvailableActions() - val action = findActionByPattern(pattern, availableActions) - - if (action == null) { - if (actionShouldBeAvailable) { - val texts = getActionsTexts(availableActions) - val infos = doHighlighting() - TestCase.fail("Action with text '" + text + "' is not available in test " + testFilePath + "\n" + - "Available actions (" + texts.size + "): \n" + - StringUtil.join(texts, "\n") + - "\nActions:\n" + - StringUtil.join(availableActions, "\n") + - "\nInfos:\n" + - StringUtil.join(infos, "\n")) - } - else { - DirectiveBasedActionUtils.checkAvailableActionsAreExpected(file, availableActions) - } + private val availableActions: List + get() { + doHighlighting() + return LightQuickFixTestCase.getAvailableActions(editor, file) } - else { - if (!actionShouldBeAvailable) { - TestCase.fail("Action '$text' is available (but must not) in test $testFilePath") - } - - ShowIntentionActionsHandler.chooseActionAndInvoke(file, editor, action, action.text) - - UIUtil.dispatchAllInvocationEvents() - - - if (!shouldBeAvailableAfterExecution(actionFile)) { - val afterAction = findActionByPattern(pattern, getAvailableActions()) - - if (afterAction != null) { - TestCase.fail("Action '$text' is still available after its invocation in test $testFilePath") - } - } - } - } - - private fun findActionByPattern(pattern: Pattern, availableActions: List): IntentionAction? { - for (availableAction in availableActions) { - if (pattern.matcher(availableAction.text).matches()) { - return availableAction - } - } - return null - } - - private fun getAvailableActions(): List { - doHighlighting() - return LightQuickFixTestCase.getAvailableActions(editor, file) - } override fun getTestProjectJdk() = PluginTestCaseBase.mockJdk() } From 7f5b9b1760e4507cb89fda0d219bd7cd1fd92abd Mon Sep 17 00:00:00 2001 From: Alexander Udalov Date: Tue, 19 Sep 2017 14:27:36 +0300 Subject: [PATCH 039/212] Add tests on quick fix that adds 'actual' to platform declaration #KT-18454 --- .../addActualToClass/header/header.kt | 1 + .../addActualToClass/header/header.kt.after | 1 + .../multiModuleQuickFix/addActualToClass/jvm/jvm.kt | 4 ++++ .../addActualToClass/jvm/jvm.kt.after | 4 ++++ .../addActualToClassMember/header/header.kt | 3 +++ .../addActualToClassMember/header/header.kt.after | 3 +++ .../addActualToClassMember/jvm/jvm.kt | 6 ++++++ .../addActualToClassMember/jvm/jvm.kt.after | 6 ++++++ .../addActualToTopLevelMember/header/header.kt | 1 + .../addActualToTopLevelMember/header/header.kt.after | 1 + .../addActualToTopLevelMember/jvm/jvm.kt | 4 ++++ .../addActualToTopLevelMember/jvm/jvm.kt.after | 4 ++++ .../kotlin/idea/quickfix/QuickFixMultiModuleTest.kt | 11 ++++++++++- 13 files changed, 48 insertions(+), 1 deletion(-) create mode 100644 idea/testData/multiModuleQuickFix/addActualToClass/header/header.kt create mode 100644 idea/testData/multiModuleQuickFix/addActualToClass/header/header.kt.after create mode 100644 idea/testData/multiModuleQuickFix/addActualToClass/jvm/jvm.kt create mode 100644 idea/testData/multiModuleQuickFix/addActualToClass/jvm/jvm.kt.after create mode 100644 idea/testData/multiModuleQuickFix/addActualToClassMember/header/header.kt create mode 100644 idea/testData/multiModuleQuickFix/addActualToClassMember/header/header.kt.after create mode 100644 idea/testData/multiModuleQuickFix/addActualToClassMember/jvm/jvm.kt create mode 100644 idea/testData/multiModuleQuickFix/addActualToClassMember/jvm/jvm.kt.after create mode 100644 idea/testData/multiModuleQuickFix/addActualToTopLevelMember/header/header.kt create mode 100644 idea/testData/multiModuleQuickFix/addActualToTopLevelMember/header/header.kt.after create mode 100644 idea/testData/multiModuleQuickFix/addActualToTopLevelMember/jvm/jvm.kt create mode 100644 idea/testData/multiModuleQuickFix/addActualToTopLevelMember/jvm/jvm.kt.after diff --git a/idea/testData/multiModuleQuickFix/addActualToClass/header/header.kt b/idea/testData/multiModuleQuickFix/addActualToClass/header/header.kt new file mode 100644 index 00000000000..2a3a31a2dec --- /dev/null +++ b/idea/testData/multiModuleQuickFix/addActualToClass/header/header.kt @@ -0,0 +1 @@ +expect class Foo diff --git a/idea/testData/multiModuleQuickFix/addActualToClass/header/header.kt.after b/idea/testData/multiModuleQuickFix/addActualToClass/header/header.kt.after new file mode 100644 index 00000000000..2a3a31a2dec --- /dev/null +++ b/idea/testData/multiModuleQuickFix/addActualToClass/header/header.kt.after @@ -0,0 +1 @@ +expect class Foo diff --git a/idea/testData/multiModuleQuickFix/addActualToClass/jvm/jvm.kt b/idea/testData/multiModuleQuickFix/addActualToClass/jvm/jvm.kt new file mode 100644 index 00000000000..9b309e97108 --- /dev/null +++ b/idea/testData/multiModuleQuickFix/addActualToClass/jvm/jvm.kt @@ -0,0 +1,4 @@ +// "Add 'actual' modifier" "true" +// ERROR: Declaration should be marked with 'actual' (suppress with -Xno-check-actual) + +class Foo diff --git a/idea/testData/multiModuleQuickFix/addActualToClass/jvm/jvm.kt.after b/idea/testData/multiModuleQuickFix/addActualToClass/jvm/jvm.kt.after new file mode 100644 index 00000000000..35ba8a5b671 --- /dev/null +++ b/idea/testData/multiModuleQuickFix/addActualToClass/jvm/jvm.kt.after @@ -0,0 +1,4 @@ +// "Add 'actual' modifier" "true" +// ERROR: Declaration should be marked with 'actual' (suppress with -Xno-check-actual) + +actual class Foo diff --git a/idea/testData/multiModuleQuickFix/addActualToClassMember/header/header.kt b/idea/testData/multiModuleQuickFix/addActualToClassMember/header/header.kt new file mode 100644 index 00000000000..35615e686a1 --- /dev/null +++ b/idea/testData/multiModuleQuickFix/addActualToClassMember/header/header.kt @@ -0,0 +1,3 @@ +expect class Foo { + fun foo() +} diff --git a/idea/testData/multiModuleQuickFix/addActualToClassMember/header/header.kt.after b/idea/testData/multiModuleQuickFix/addActualToClassMember/header/header.kt.after new file mode 100644 index 00000000000..35615e686a1 --- /dev/null +++ b/idea/testData/multiModuleQuickFix/addActualToClassMember/header/header.kt.after @@ -0,0 +1,3 @@ +expect class Foo { + fun foo() +} diff --git a/idea/testData/multiModuleQuickFix/addActualToClassMember/jvm/jvm.kt b/idea/testData/multiModuleQuickFix/addActualToClassMember/jvm/jvm.kt new file mode 100644 index 00000000000..77c8881cde4 --- /dev/null +++ b/idea/testData/multiModuleQuickFix/addActualToClassMember/jvm/jvm.kt @@ -0,0 +1,6 @@ +// "Add 'actual' modifier" "true" +// ERROR: Declaration should be marked with 'actual' (suppress with -Xno-check-actual) + +actual class Foo { + fun foo() {} +} diff --git a/idea/testData/multiModuleQuickFix/addActualToClassMember/jvm/jvm.kt.after b/idea/testData/multiModuleQuickFix/addActualToClassMember/jvm/jvm.kt.after new file mode 100644 index 00000000000..fc95413ae61 --- /dev/null +++ b/idea/testData/multiModuleQuickFix/addActualToClassMember/jvm/jvm.kt.after @@ -0,0 +1,6 @@ +// "Add 'actual' modifier" "true" +// ERROR: Declaration should be marked with 'actual' (suppress with -Xno-check-actual) + +actual class Foo { + actual fun foo() {} +} diff --git a/idea/testData/multiModuleQuickFix/addActualToTopLevelMember/header/header.kt b/idea/testData/multiModuleQuickFix/addActualToTopLevelMember/header/header.kt new file mode 100644 index 00000000000..892bde13e9c --- /dev/null +++ b/idea/testData/multiModuleQuickFix/addActualToTopLevelMember/header/header.kt @@ -0,0 +1 @@ +expect fun foo() diff --git a/idea/testData/multiModuleQuickFix/addActualToTopLevelMember/header/header.kt.after b/idea/testData/multiModuleQuickFix/addActualToTopLevelMember/header/header.kt.after new file mode 100644 index 00000000000..892bde13e9c --- /dev/null +++ b/idea/testData/multiModuleQuickFix/addActualToTopLevelMember/header/header.kt.after @@ -0,0 +1 @@ +expect fun foo() diff --git a/idea/testData/multiModuleQuickFix/addActualToTopLevelMember/jvm/jvm.kt b/idea/testData/multiModuleQuickFix/addActualToTopLevelMember/jvm/jvm.kt new file mode 100644 index 00000000000..5e347ce8e07 --- /dev/null +++ b/idea/testData/multiModuleQuickFix/addActualToTopLevelMember/jvm/jvm.kt @@ -0,0 +1,4 @@ +// "Add 'actual' modifier" "true" +// ERROR: Declaration should be marked with 'actual' (suppress with -Xno-check-actual) + +fun foo() {} diff --git a/idea/testData/multiModuleQuickFix/addActualToTopLevelMember/jvm/jvm.kt.after b/idea/testData/multiModuleQuickFix/addActualToTopLevelMember/jvm/jvm.kt.after new file mode 100644 index 00000000000..6aefcbd3230 --- /dev/null +++ b/idea/testData/multiModuleQuickFix/addActualToTopLevelMember/jvm/jvm.kt.after @@ -0,0 +1,4 @@ +// "Add 'actual' modifier" "true" +// ERROR: Declaration should be marked with 'actual' (suppress with -Xno-check-actual) + +actual fun foo() {} diff --git a/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixMultiModuleTest.kt b/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixMultiModuleTest.kt index ef5cdce7a5d..7a393f9c782 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixMultiModuleTest.kt +++ b/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixMultiModuleTest.kt @@ -189,4 +189,13 @@ class QuickFixMultiModuleTest : AbstractQuickFixMultiModuleTest() { @Test fun testImplementMembersInImplClassNonImplInheritor() = doMultiPlatformTest() -} \ No newline at end of file + + @Test + fun testAddActualToClass() = doMultiPlatformTest() + + @Test + fun testAddActualToClassMember() = doMultiPlatformTest() + + @Test + fun testAddActualToTopLevelMember() = doMultiPlatformTest() +} From 93252926ba348c77f6550f701f6622e82c7bf78b Mon Sep 17 00:00:00 2001 From: Kirill Rakhman Date: Fri, 8 Sep 2017 14:51:08 +0300 Subject: [PATCH 040/212] Introduce additional quick-fix for (collection) type mismatch This fixed inserts conversion .toSequence/Array/Iterable/Collection/List So #KT-19735 Fixed --- .../idea/quickfix/ConvertCollectionFix.kt | 88 +++++++++++++++++++ .../QuickFixFactoryForTypeMismatchError.kt | 7 +- .../convertCollection/arrayToCollection.kt | 8 ++ .../arrayToCollection.kt.after | 8 ++ .../convertCollection/arrayToIterable.kt | 8 ++ .../arrayToIterable.kt.after | 8 ++ .../convertCollection/arrayToList.kt | 8 ++ .../convertCollection/arrayToList.kt.after | 8 ++ .../convertCollection/arrayToSequence.kt | 8 ++ .../arrayToSequence.kt.after | 8 ++ .../convertCollection/iterableToArray.kt | 8 ++ .../iterableToArray.kt.after | 8 ++ .../convertCollection/listToArray.kt | 8 ++ .../convertCollection/listToArray.kt.after | 8 ++ .../convertCollection/listToArrayBinary.kt | 8 ++ .../listToArrayBinary.kt.after | 8 ++ .../convertCollection/listToMutableList.kt | 8 ++ .../listToMutableList.kt.after | 8 ++ .../convertCollection/listToSequence.kt | 8 ++ .../convertCollection/listToSequence.kt.after | 8 ++ .../convertCollection/sequenceToArray.kt | 8 ++ .../sequenceToArray.kt.after | 8 ++ .../convertCollection/sequenceToList.kt | 8 ++ .../convertCollection/sequenceToList.kt.after | 8 ++ .../idea/quickfix/QuickFixTestGenerated.java | 75 ++++++++++++++++ 25 files changed, 345 insertions(+), 1 deletion(-) create mode 100644 idea/src/org/jetbrains/kotlin/idea/quickfix/ConvertCollectionFix.kt create mode 100644 idea/testData/quickfix/typeMismatch/convertCollection/arrayToCollection.kt create mode 100644 idea/testData/quickfix/typeMismatch/convertCollection/arrayToCollection.kt.after create mode 100644 idea/testData/quickfix/typeMismatch/convertCollection/arrayToIterable.kt create mode 100644 idea/testData/quickfix/typeMismatch/convertCollection/arrayToIterable.kt.after create mode 100644 idea/testData/quickfix/typeMismatch/convertCollection/arrayToList.kt create mode 100644 idea/testData/quickfix/typeMismatch/convertCollection/arrayToList.kt.after create mode 100644 idea/testData/quickfix/typeMismatch/convertCollection/arrayToSequence.kt create mode 100644 idea/testData/quickfix/typeMismatch/convertCollection/arrayToSequence.kt.after create mode 100644 idea/testData/quickfix/typeMismatch/convertCollection/iterableToArray.kt create mode 100644 idea/testData/quickfix/typeMismatch/convertCollection/iterableToArray.kt.after create mode 100644 idea/testData/quickfix/typeMismatch/convertCollection/listToArray.kt create mode 100644 idea/testData/quickfix/typeMismatch/convertCollection/listToArray.kt.after create mode 100644 idea/testData/quickfix/typeMismatch/convertCollection/listToArrayBinary.kt create mode 100644 idea/testData/quickfix/typeMismatch/convertCollection/listToArrayBinary.kt.after create mode 100644 idea/testData/quickfix/typeMismatch/convertCollection/listToMutableList.kt create mode 100644 idea/testData/quickfix/typeMismatch/convertCollection/listToMutableList.kt.after create mode 100644 idea/testData/quickfix/typeMismatch/convertCollection/listToSequence.kt create mode 100644 idea/testData/quickfix/typeMismatch/convertCollection/listToSequence.kt.after create mode 100644 idea/testData/quickfix/typeMismatch/convertCollection/sequenceToArray.kt create mode 100644 idea/testData/quickfix/typeMismatch/convertCollection/sequenceToArray.kt.after create mode 100644 idea/testData/quickfix/typeMismatch/convertCollection/sequenceToList.kt create mode 100644 idea/testData/quickfix/typeMismatch/convertCollection/sequenceToList.kt.after diff --git a/idea/src/org/jetbrains/kotlin/idea/quickfix/ConvertCollectionFix.kt b/idea/src/org/jetbrains/kotlin/idea/quickfix/ConvertCollectionFix.kt new file mode 100644 index 00000000000..cfc8ab5f64b --- /dev/null +++ b/idea/src/org/jetbrains/kotlin/idea/quickfix/ConvertCollectionFix.kt @@ -0,0 +1,88 @@ +/* + * Copyright 2010-2017 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.quickfix + +import com.intellij.openapi.editor.Editor +import com.intellij.openapi.project.Project +import org.jetbrains.kotlin.builtins.KotlinBuiltIns +import org.jetbrains.kotlin.idea.core.replaced +import org.jetbrains.kotlin.name.FqName +import org.jetbrains.kotlin.psi.KtExpression +import org.jetbrains.kotlin.psi.KtFile +import org.jetbrains.kotlin.psi.KtPsiFactory +import org.jetbrains.kotlin.psi.createExpressionByPattern +import org.jetbrains.kotlin.psi.psiUtil.endOffset +import org.jetbrains.kotlin.types.KotlinType +import org.jetbrains.kotlin.types.typeUtil.isSubtypeOf + +class ConvertCollectionFix(element: KtExpression, val type: CollectionType) : KotlinQuickFixAction(element) { + override fun getFamilyName(): String = "Convert to ${type.displayName}" + override fun getText() = "Convert expression to '${type.displayName}' by inserting '.${type.functionCall}'" + + override fun invoke(project: Project, editor: Editor?, file: KtFile) { + val expression = element ?: return + val factory = KtPsiFactory(expression) + + val replaced = expression.replaced(factory.createExpressionByPattern("$0.$1", expression, type.functionCall)) + editor?.caretModel?.moveToOffset(replaced.endOffset) + } + + enum class CollectionType( + val functionCall: String, + val fqName: FqName, + private val nameOverride: String? = null + ) { + List("toList()", FqName("kotlin.collections.List")), + Collection("toList()", FqName("kotlin.collections.Collection")), + Iterable("toList()", FqName("kotlin.collections.Iterable")), + MutableList("toMutableList()", FqName("kotlin.collections.MutableList")), + Array("toTypedArray()", FqName("kotlin.Array")), + Sequence("asSequence()", FqName("kotlin.sequences.Sequence")), + + //specialized types must be last because iteration order is relevant for getCollectionType + ArrayViaList("toList().toTypedArray()", FqName("kotlin.Array"), "Array"), + ; + + val displayName get() = nameOverride ?: name + + fun specializeFor(sourceType: CollectionType) = when { + this == Array && sourceType == Sequence -> ArrayViaList + this == Array && sourceType == Iterable -> ArrayViaList + else -> this + } + } + + companion object { + private val TYPES = CollectionType.values() + + fun getConversionTypeOrNull(expressionType: KotlinType, expectedType: KotlinType): CollectionType? { + val expressionCollectionType = expressionType.getCollectionType() ?: return null + val expectedCollectionType = expectedType.getCollectionType() ?: return null + + val expressionTypeArg = expressionType.arguments.singleOrNull()?.type ?: return null + val expectedTypeArg = expectedType.arguments.singleOrNull()?.type ?: return null + if (!expressionTypeArg.isSubtypeOf(expectedTypeArg)) return null + + return expectedCollectionType.specializeFor(expressionCollectionType) + } + + private fun KotlinType.getCollectionType(): CollectionType? { + if (isMarkedNullable) return null + return TYPES.firstOrNull { KotlinBuiltIns.isConstructedFromGivenClass(this, it.fqName) } + } + } +} \ No newline at end of file diff --git a/idea/src/org/jetbrains/kotlin/idea/quickfix/QuickFixFactoryForTypeMismatchError.kt b/idea/src/org/jetbrains/kotlin/idea/quickfix/QuickFixFactoryForTypeMismatchError.kt index d82049a6892..bd31eeeba42 100644 --- a/idea/src/org/jetbrains/kotlin/idea/quickfix/QuickFixFactoryForTypeMismatchError.kt +++ b/idea/src/org/jetbrains/kotlin/idea/quickfix/QuickFixFactoryForTypeMismatchError.kt @@ -1,5 +1,5 @@ /* - * Copyright 2010-2015 JetBrains s.r.o. + * Copyright 2010-2017 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. @@ -116,6 +116,10 @@ class QuickFixFactoryForTypeMismatchError : KotlinIntentionActionsFactory() { expressionTypeDeclaration?.let { actions.add(LetImplementInterfaceFix(it, expectedType, expressionType)) } } + ConvertCollectionFix.getConversionTypeOrNull(expressionType, expectedType)?.let { + actions.add(ConvertCollectionFix(diagnosticElement, it)) + } + fun KtExpression.getTopMostQualifiedForSelectorIfAny(): KtExpression { var qualifiedOrThis = this do { @@ -245,3 +249,4 @@ class QuickFixFactoryForTypeMismatchError : KotlinIntentionActionsFactory() { } } } + diff --git a/idea/testData/quickfix/typeMismatch/convertCollection/arrayToCollection.kt b/idea/testData/quickfix/typeMismatch/convertCollection/arrayToCollection.kt new file mode 100644 index 00000000000..d0e8923f091 --- /dev/null +++ b/idea/testData/quickfix/typeMismatch/convertCollection/arrayToCollection.kt @@ -0,0 +1,8 @@ +// "Convert expression to 'Collection' by inserting '.toList()'" "true" +// WITH_RUNTIME + +fun foo(a: Array) { + bar(a) +} + +fun bar(a: Collection) {} \ No newline at end of file diff --git a/idea/testData/quickfix/typeMismatch/convertCollection/arrayToCollection.kt.after b/idea/testData/quickfix/typeMismatch/convertCollection/arrayToCollection.kt.after new file mode 100644 index 00000000000..4a86d1d875b --- /dev/null +++ b/idea/testData/quickfix/typeMismatch/convertCollection/arrayToCollection.kt.after @@ -0,0 +1,8 @@ +// "Convert expression to 'Collection' by inserting '.toList()'" "true" +// WITH_RUNTIME + +fun foo(a: Array) { + bar(a.toList()) +} + +fun bar(a: Collection) {} \ No newline at end of file diff --git a/idea/testData/quickfix/typeMismatch/convertCollection/arrayToIterable.kt b/idea/testData/quickfix/typeMismatch/convertCollection/arrayToIterable.kt new file mode 100644 index 00000000000..1f67967c9c0 --- /dev/null +++ b/idea/testData/quickfix/typeMismatch/convertCollection/arrayToIterable.kt @@ -0,0 +1,8 @@ +// "Convert expression to 'Iterable' by inserting '.toList()'" "true" +// WITH_RUNTIME + +fun foo(a: Array) { + bar(a) +} + +fun bar(a: Iterable) {} \ No newline at end of file diff --git a/idea/testData/quickfix/typeMismatch/convertCollection/arrayToIterable.kt.after b/idea/testData/quickfix/typeMismatch/convertCollection/arrayToIterable.kt.after new file mode 100644 index 00000000000..61ed32f3f17 --- /dev/null +++ b/idea/testData/quickfix/typeMismatch/convertCollection/arrayToIterable.kt.after @@ -0,0 +1,8 @@ +// "Convert expression to 'Iterable' by inserting '.toList()'" "true" +// WITH_RUNTIME + +fun foo(a: Array) { + bar(a.toList()) +} + +fun bar(a: Iterable) {} \ No newline at end of file diff --git a/idea/testData/quickfix/typeMismatch/convertCollection/arrayToList.kt b/idea/testData/quickfix/typeMismatch/convertCollection/arrayToList.kt new file mode 100644 index 00000000000..72b65192953 --- /dev/null +++ b/idea/testData/quickfix/typeMismatch/convertCollection/arrayToList.kt @@ -0,0 +1,8 @@ +// "Convert expression to 'List' by inserting '.toList()'" "true" +// WITH_RUNTIME + +fun foo(a: Array) { + bar(a) +} + +fun bar(a: List) {} \ No newline at end of file diff --git a/idea/testData/quickfix/typeMismatch/convertCollection/arrayToList.kt.after b/idea/testData/quickfix/typeMismatch/convertCollection/arrayToList.kt.after new file mode 100644 index 00000000000..4d8c86a20a8 --- /dev/null +++ b/idea/testData/quickfix/typeMismatch/convertCollection/arrayToList.kt.after @@ -0,0 +1,8 @@ +// "Convert expression to 'List' by inserting '.toList()'" "true" +// WITH_RUNTIME + +fun foo(a: Array) { + bar(a.toList()) +} + +fun bar(a: List) {} \ No newline at end of file diff --git a/idea/testData/quickfix/typeMismatch/convertCollection/arrayToSequence.kt b/idea/testData/quickfix/typeMismatch/convertCollection/arrayToSequence.kt new file mode 100644 index 00000000000..67edc122ede --- /dev/null +++ b/idea/testData/quickfix/typeMismatch/convertCollection/arrayToSequence.kt @@ -0,0 +1,8 @@ +// "Convert expression to 'Sequence' by inserting '.asSequence()'" "true" +// WITH_RUNTIME + +fun foo(a: Array) { + bar(a) +} + +fun bar(a: Sequence) {} \ No newline at end of file diff --git a/idea/testData/quickfix/typeMismatch/convertCollection/arrayToSequence.kt.after b/idea/testData/quickfix/typeMismatch/convertCollection/arrayToSequence.kt.after new file mode 100644 index 00000000000..9b68e153cc2 --- /dev/null +++ b/idea/testData/quickfix/typeMismatch/convertCollection/arrayToSequence.kt.after @@ -0,0 +1,8 @@ +// "Convert expression to 'Sequence' by inserting '.asSequence()'" "true" +// WITH_RUNTIME + +fun foo(a: Array) { + bar(a.asSequence()) +} + +fun bar(a: Sequence) {} \ No newline at end of file diff --git a/idea/testData/quickfix/typeMismatch/convertCollection/iterableToArray.kt b/idea/testData/quickfix/typeMismatch/convertCollection/iterableToArray.kt new file mode 100644 index 00000000000..15dfaa5be3e --- /dev/null +++ b/idea/testData/quickfix/typeMismatch/convertCollection/iterableToArray.kt @@ -0,0 +1,8 @@ +// "Convert expression to 'Array' by inserting '.toList().toTypedArray()'" "true" +// WITH_RUNTIME + +fun foo(a: Iterable) { + bar(a) +} + +fun bar(a: Array) {} \ No newline at end of file diff --git a/idea/testData/quickfix/typeMismatch/convertCollection/iterableToArray.kt.after b/idea/testData/quickfix/typeMismatch/convertCollection/iterableToArray.kt.after new file mode 100644 index 00000000000..008d19e3ef4 --- /dev/null +++ b/idea/testData/quickfix/typeMismatch/convertCollection/iterableToArray.kt.after @@ -0,0 +1,8 @@ +// "Convert expression to 'Array' by inserting '.toList().toTypedArray()'" "true" +// WITH_RUNTIME + +fun foo(a: Iterable) { + bar(a.toList().toTypedArray()) +} + +fun bar(a: Array) {} \ No newline at end of file diff --git a/idea/testData/quickfix/typeMismatch/convertCollection/listToArray.kt b/idea/testData/quickfix/typeMismatch/convertCollection/listToArray.kt new file mode 100644 index 00000000000..bb8385993aa --- /dev/null +++ b/idea/testData/quickfix/typeMismatch/convertCollection/listToArray.kt @@ -0,0 +1,8 @@ +// "Convert expression to 'Array' by inserting '.toTypedArray()'" "true" +// WITH_RUNTIME + +fun foo(a: List) { + bar(a) +} + +fun bar(a: Array) {} \ No newline at end of file diff --git a/idea/testData/quickfix/typeMismatch/convertCollection/listToArray.kt.after b/idea/testData/quickfix/typeMismatch/convertCollection/listToArray.kt.after new file mode 100644 index 00000000000..8c8e4ff851b --- /dev/null +++ b/idea/testData/quickfix/typeMismatch/convertCollection/listToArray.kt.after @@ -0,0 +1,8 @@ +// "Convert expression to 'Array' by inserting '.toTypedArray()'" "true" +// WITH_RUNTIME + +fun foo(a: List) { + bar(a.toTypedArray()) +} + +fun bar(a: Array) {} \ No newline at end of file diff --git a/idea/testData/quickfix/typeMismatch/convertCollection/listToArrayBinary.kt b/idea/testData/quickfix/typeMismatch/convertCollection/listToArrayBinary.kt new file mode 100644 index 00000000000..c1062860cee --- /dev/null +++ b/idea/testData/quickfix/typeMismatch/convertCollection/listToArrayBinary.kt @@ -0,0 +1,8 @@ +// "Convert expression to 'Array' by inserting '.toTypedArray()'" "true" +// WITH_RUNTIME + +fun foo(a: List, b: List) { + bar(a + b) +} + +fun bar(a: Array) {} \ No newline at end of file diff --git a/idea/testData/quickfix/typeMismatch/convertCollection/listToArrayBinary.kt.after b/idea/testData/quickfix/typeMismatch/convertCollection/listToArrayBinary.kt.after new file mode 100644 index 00000000000..fa8c5b2cde3 --- /dev/null +++ b/idea/testData/quickfix/typeMismatch/convertCollection/listToArrayBinary.kt.after @@ -0,0 +1,8 @@ +// "Convert expression to 'Array' by inserting '.toTypedArray()'" "true" +// WITH_RUNTIME + +fun foo(a: List, b: List) { + bar((a + b).toTypedArray()) +} + +fun bar(a: Array) {} \ No newline at end of file diff --git a/idea/testData/quickfix/typeMismatch/convertCollection/listToMutableList.kt b/idea/testData/quickfix/typeMismatch/convertCollection/listToMutableList.kt new file mode 100644 index 00000000000..ddf2bde056e --- /dev/null +++ b/idea/testData/quickfix/typeMismatch/convertCollection/listToMutableList.kt @@ -0,0 +1,8 @@ +// "Convert expression to 'MutableList' by inserting '.toMutableList()'" "true" +// WITH_RUNTIME + +fun foo(a: List) { + bar(a) +} + +fun bar(a: MutableList) {} \ No newline at end of file diff --git a/idea/testData/quickfix/typeMismatch/convertCollection/listToMutableList.kt.after b/idea/testData/quickfix/typeMismatch/convertCollection/listToMutableList.kt.after new file mode 100644 index 00000000000..4ac5aa13914 --- /dev/null +++ b/idea/testData/quickfix/typeMismatch/convertCollection/listToMutableList.kt.after @@ -0,0 +1,8 @@ +// "Convert expression to 'MutableList' by inserting '.toMutableList()'" "true" +// WITH_RUNTIME + +fun foo(a: List) { + bar(a.toMutableList()) +} + +fun bar(a: MutableList) {} \ No newline at end of file diff --git a/idea/testData/quickfix/typeMismatch/convertCollection/listToSequence.kt b/idea/testData/quickfix/typeMismatch/convertCollection/listToSequence.kt new file mode 100644 index 00000000000..339b6b8da7b --- /dev/null +++ b/idea/testData/quickfix/typeMismatch/convertCollection/listToSequence.kt @@ -0,0 +1,8 @@ +// "Convert expression to 'Sequence' by inserting '.asSequence()'" "true" +// WITH_RUNTIME + +fun foo(a: List) { + bar(a) +} + +fun bar(a: Sequence) {} \ No newline at end of file diff --git a/idea/testData/quickfix/typeMismatch/convertCollection/listToSequence.kt.after b/idea/testData/quickfix/typeMismatch/convertCollection/listToSequence.kt.after new file mode 100644 index 00000000000..0afe8d82740 --- /dev/null +++ b/idea/testData/quickfix/typeMismatch/convertCollection/listToSequence.kt.after @@ -0,0 +1,8 @@ +// "Convert expression to 'Sequence' by inserting '.asSequence()'" "true" +// WITH_RUNTIME + +fun foo(a: List) { + bar(a.asSequence()) +} + +fun bar(a: Sequence) {} \ No newline at end of file diff --git a/idea/testData/quickfix/typeMismatch/convertCollection/sequenceToArray.kt b/idea/testData/quickfix/typeMismatch/convertCollection/sequenceToArray.kt new file mode 100644 index 00000000000..036d0eec5de --- /dev/null +++ b/idea/testData/quickfix/typeMismatch/convertCollection/sequenceToArray.kt @@ -0,0 +1,8 @@ +// "Convert expression to 'Array' by inserting '.toList().toTypedArray()'" "true" +// WITH_RUNTIME + +fun foo(a: Sequence) { + bar(a) +} + +fun bar(a: Array) {} \ No newline at end of file diff --git a/idea/testData/quickfix/typeMismatch/convertCollection/sequenceToArray.kt.after b/idea/testData/quickfix/typeMismatch/convertCollection/sequenceToArray.kt.after new file mode 100644 index 00000000000..3101a221165 --- /dev/null +++ b/idea/testData/quickfix/typeMismatch/convertCollection/sequenceToArray.kt.after @@ -0,0 +1,8 @@ +// "Convert expression to 'Array' by inserting '.toList().toTypedArray()'" "true" +// WITH_RUNTIME + +fun foo(a: Sequence) { + bar(a.toList().toTypedArray()) +} + +fun bar(a: Array) {} \ No newline at end of file diff --git a/idea/testData/quickfix/typeMismatch/convertCollection/sequenceToList.kt b/idea/testData/quickfix/typeMismatch/convertCollection/sequenceToList.kt new file mode 100644 index 00000000000..9b12abf535c --- /dev/null +++ b/idea/testData/quickfix/typeMismatch/convertCollection/sequenceToList.kt @@ -0,0 +1,8 @@ +// "Convert expression to 'List' by inserting '.toList()'" "true" +// WITH_RUNTIME + +fun foo(a: Sequence) { + bar(a) +} + +fun bar(a: List) {} \ No newline at end of file diff --git a/idea/testData/quickfix/typeMismatch/convertCollection/sequenceToList.kt.after b/idea/testData/quickfix/typeMismatch/convertCollection/sequenceToList.kt.after new file mode 100644 index 00000000000..344bce3d798 --- /dev/null +++ b/idea/testData/quickfix/typeMismatch/convertCollection/sequenceToList.kt.after @@ -0,0 +1,8 @@ +// "Convert expression to 'List' by inserting '.toList()'" "true" +// WITH_RUNTIME + +fun foo(a: Sequence) { + bar(a.toList()) +} + +fun bar(a: List) {} \ No newline at end of file diff --git a/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java b/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java index 0562bbf9445..15c62e41ba2 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java @@ -11138,6 +11138,81 @@ public class QuickFixTestGenerated extends AbstractQuickFixTest { } } + @TestMetadata("idea/testData/quickfix/typeMismatch/convertCollection") + @TestDataPath("$PROJECT_ROOT") + @RunWith(JUnit3RunnerWithInners.class) + public static class ConvertCollection extends AbstractQuickFixTest { + public void testAllFilesPresentInConvertCollection() throws Exception { + KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("idea/testData/quickfix/typeMismatch/convertCollection"), Pattern.compile("^([\\w\\-_]+)\\.kt$"), TargetBackend.ANY, true); + } + + @TestMetadata("arrayToCollection.kt") + public void testArrayToCollection() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/quickfix/typeMismatch/convertCollection/arrayToCollection.kt"); + doTest(fileName); + } + + @TestMetadata("arrayToIterable.kt") + public void testArrayToIterable() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/quickfix/typeMismatch/convertCollection/arrayToIterable.kt"); + doTest(fileName); + } + + @TestMetadata("arrayToList.kt") + public void testArrayToList() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/quickfix/typeMismatch/convertCollection/arrayToList.kt"); + doTest(fileName); + } + + @TestMetadata("arrayToSequence.kt") + public void testArrayToSequence() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/quickfix/typeMismatch/convertCollection/arrayToSequence.kt"); + doTest(fileName); + } + + @TestMetadata("iterableToArray.kt") + public void testIterableToArray() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/quickfix/typeMismatch/convertCollection/iterableToArray.kt"); + doTest(fileName); + } + + @TestMetadata("listToArray.kt") + public void testListToArray() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/quickfix/typeMismatch/convertCollection/listToArray.kt"); + doTest(fileName); + } + + @TestMetadata("listToArrayBinary.kt") + public void testListToArrayBinary() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/quickfix/typeMismatch/convertCollection/listToArrayBinary.kt"); + doTest(fileName); + } + + @TestMetadata("listToMutableList.kt") + public void testListToMutableList() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/quickfix/typeMismatch/convertCollection/listToMutableList.kt"); + doTest(fileName); + } + + @TestMetadata("listToSequence.kt") + public void testListToSequence() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/quickfix/typeMismatch/convertCollection/listToSequence.kt"); + doTest(fileName); + } + + @TestMetadata("sequenceToArray.kt") + public void testSequenceToArray() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/quickfix/typeMismatch/convertCollection/sequenceToArray.kt"); + doTest(fileName); + } + + @TestMetadata("sequenceToList.kt") + public void testSequenceToList() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/quickfix/typeMismatch/convertCollection/sequenceToList.kt"); + doTest(fileName); + } + } + @TestMetadata("idea/testData/quickfix/typeMismatch/fixOverloadedOperator") @TestDataPath("$PROJECT_ROOT") @RunWith(JUnit3RunnerWithInners.class) From f08e9832a66f47cae92330af6c1c71b64441b38c Mon Sep 17 00:00:00 2001 From: Toshiaki Kameyama Date: Sun, 17 Sep 2017 17:44:51 +0300 Subject: [PATCH 041/212] Show warning also if arrays are compared by '!=' #KT-20259 Fixed --- .../ReplaceArrayEqualityOpWithArraysEquals.html | 2 +- .../description.html | 2 +- ...ReplaceArrayEqualityOpWithArraysEqualsIntention.kt | 11 +++++++++-- .../inspectionData/expected.xml | 8 ++++++++ .../replaceArrayEqualityOpWithArraysEquals/test.kt | 1 + .../arrayEXCLEQ.kt | 8 ++++++++ .../arrayEXCLEQ.kt.after | 10 ++++++++++ .../idea/intentions/IntentionTestGenerated.java | 6 ++++++ 8 files changed, 44 insertions(+), 4 deletions(-) create mode 100644 idea/testData/intentions/replaceArrayEqualityOpWithArraysEquals/arrayEXCLEQ.kt create mode 100644 idea/testData/intentions/replaceArrayEqualityOpWithArraysEquals/arrayEXCLEQ.kt.after diff --git a/idea/resources/inspectionDescriptions/ReplaceArrayEqualityOpWithArraysEquals.html b/idea/resources/inspectionDescriptions/ReplaceArrayEqualityOpWithArraysEquals.html index 74bf53dda29..f7d5dce04b7 100644 --- a/idea/resources/inspectionDescriptions/ReplaceArrayEqualityOpWithArraysEquals.html +++ b/idea/resources/inspectionDescriptions/ReplaceArrayEqualityOpWithArraysEquals.html @@ -1,5 +1,5 @@ -This inspection detects '==' operator for arrays that should be replaced with 'Arrays.equals' +This inspection detects '==' or '!=' operator for arrays that should be replaced with 'Arrays.equals' \ No newline at end of file diff --git a/idea/resources/intentionDescriptions/ReplaceArrayEqualityOpWithArraysEqualsIntention/description.html b/idea/resources/intentionDescriptions/ReplaceArrayEqualityOpWithArraysEqualsIntention/description.html index 4d248a19655..ae679a64594 100644 --- a/idea/resources/intentionDescriptions/ReplaceArrayEqualityOpWithArraysEqualsIntention/description.html +++ b/idea/resources/intentionDescriptions/ReplaceArrayEqualityOpWithArraysEqualsIntention/description.html @@ -1,5 +1,5 @@ -This intention replace '==' operator for arrays with 'Arrays.equals' +This intention replace '==' or '!=' operator for arrays with 'Arrays.equals' \ No newline at end of file diff --git a/idea/src/org/jetbrains/kotlin/idea/intentions/ReplaceArrayEqualityOpWithArraysEqualsIntention.kt b/idea/src/org/jetbrains/kotlin/idea/intentions/ReplaceArrayEqualityOpWithArraysEqualsIntention.kt index 38c95ff7a42..92ee272b2d0 100644 --- a/idea/src/org/jetbrains/kotlin/idea/intentions/ReplaceArrayEqualityOpWithArraysEqualsIntention.kt +++ b/idea/src/org/jetbrains/kotlin/idea/intentions/ReplaceArrayEqualityOpWithArraysEqualsIntention.kt @@ -25,6 +25,7 @@ import org.jetbrains.kotlin.lexer.KtTokens import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.psi.KtBinaryExpression import org.jetbrains.kotlin.psi.KtPsiFactory +import org.jetbrains.kotlin.psi.createExpressionByPattern import org.jetbrains.kotlin.resolve.calls.callUtil.getResolvedCall class ReplaceArrayEqualityOpWithArraysEqualsInspection : @@ -44,12 +45,18 @@ class ReplaceArrayEqualityOpWithArraysEqualsIntention : SelfTargetingOffsetIndep ktFile.resolveImportReference(FqName("java.util.Arrays")).firstOrNull()?.let { ImportInsertHelper.getInstance(project).importDescriptor(ktFile, it) } - val expression = factory.createExpression("Arrays.equals(${left.text}, ${right.text})") + val template = buildString { + if (element.operationToken == KtTokens.EXCLEQ) append("!") + append("Arrays.equals($0, $1)") + } + val expression = factory.createExpressionByPattern(template, left, right) element.replace(expression) } override fun isApplicableTo(element: KtBinaryExpression): Boolean { - if (element.operationToken != KtTokens.EQEQ) return false + val operationToken = element.operationToken + if (operationToken != KtTokens.EQEQ && operationToken != KtTokens.EXCLEQ) return false + if (operationToken == KtTokens.EXCLEQ) text = "Replace '!=' with 'Arrays.equals'" val right = element.right ?: return false val left = element.left ?: return false val rightResolvedCall = right.getResolvedCall(right.analyze()) ?: return false diff --git a/idea/testData/inspections/replaceArrayEqualityOpWithArraysEquals/inspectionData/expected.xml b/idea/testData/inspections/replaceArrayEqualityOpWithArraysEquals/inspectionData/expected.xml index 0bf7675fc66..8a280eed640 100644 --- a/idea/testData/inspections/replaceArrayEqualityOpWithArraysEquals/inspectionData/expected.xml +++ b/idea/testData/inspections/replaceArrayEqualityOpWithArraysEquals/inspectionData/expected.xml @@ -7,4 +7,12 @@ Replace '==' with 'Arrays.equals' Replace '==' with 'Arrays.equals' + + test.kt + 7 + light_idea_test_case + + Replace '!=' with 'Arrays.equals' + Replace '!=' with 'Arrays.equals' + \ No newline at end of file diff --git a/idea/testData/inspections/replaceArrayEqualityOpWithArraysEquals/test.kt b/idea/testData/inspections/replaceArrayEqualityOpWithArraysEquals/test.kt index b0a0896a5da..c95b971be8e 100644 --- a/idea/testData/inspections/replaceArrayEqualityOpWithArraysEquals/test.kt +++ b/idea/testData/inspections/replaceArrayEqualityOpWithArraysEquals/test.kt @@ -4,4 +4,5 @@ fun foo() { val c: Any? = null a == b // YES a == c // NO + a != b } \ No newline at end of file diff --git a/idea/testData/intentions/replaceArrayEqualityOpWithArraysEquals/arrayEXCLEQ.kt b/idea/testData/intentions/replaceArrayEqualityOpWithArraysEquals/arrayEXCLEQ.kt new file mode 100644 index 00000000000..945cee99ba2 --- /dev/null +++ b/idea/testData/intentions/replaceArrayEqualityOpWithArraysEquals/arrayEXCLEQ.kt @@ -0,0 +1,8 @@ +// WITH_RUNTIME +// INTENTION_TEXT: Replace '!=' with 'Arrays.equals' +fun foo() { + val a = arrayOf("a", "b", "c") + val b = arrayOf("a", "b", "c") + if (a != b) { + } +} diff --git a/idea/testData/intentions/replaceArrayEqualityOpWithArraysEquals/arrayEXCLEQ.kt.after b/idea/testData/intentions/replaceArrayEqualityOpWithArraysEquals/arrayEXCLEQ.kt.after new file mode 100644 index 00000000000..3436155d9d3 --- /dev/null +++ b/idea/testData/intentions/replaceArrayEqualityOpWithArraysEquals/arrayEXCLEQ.kt.after @@ -0,0 +1,10 @@ +import java.util.Arrays + +// WITH_RUNTIME +// INTENTION_TEXT: Replace '!=' with 'Arrays.equals' +fun foo() { + val a = arrayOf("a", "b", "c") + val b = arrayOf("a", "b", "c") + if (!Arrays.equals(a, b)) { + } +} diff --git a/idea/tests/org/jetbrains/kotlin/idea/intentions/IntentionTestGenerated.java b/idea/tests/org/jetbrains/kotlin/idea/intentions/IntentionTestGenerated.java index e2f8d7298b8..904ea194c6a 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/intentions/IntentionTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/intentions/IntentionTestGenerated.java @@ -13562,6 +13562,12 @@ public class IntentionTestGenerated extends AbstractIntentionTest { doTest(fileName); } + @TestMetadata("arrayEXCLEQ.kt") + public void testArrayEXCLEQ() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/intentions/replaceArrayEqualityOpWithArraysEquals/arrayEXCLEQ.kt"); + doTest(fileName); + } + @TestMetadata("primitiveArrayEQEQ.kt") public void testPrimitiveArrayEQEQ() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("idea/testData/intentions/replaceArrayEqualityOpWithArraysEquals/primitiveArrayEQEQ.kt"); From 1043284afeae1140cdbc5e8e89e6eba45e00f2dc Mon Sep 17 00:00:00 2001 From: Toshiaki Kameyama Date: Tue, 19 Sep 2017 03:19:05 +0300 Subject: [PATCH 042/212] Add data modifier to a class quickfix #KT-18220 Fixed --- .../idea/quickfix/AddDataModifierFix.kt | 80 +++++++++++++ .../kotlin/idea/quickfix/QuickFixRegistrar.kt | 2 +- .../quickfix/addDataModifier/abstract.kt | 14 +++ .../quickfix/addDataModifier/inner.kt | 14 +++ .../addDataModifier/invisibleParameter.kt | 13 +++ .../addDataModifier/invisibleParameter2.kt | 13 +++ .../quickfix/addDataModifier/noParameter.kt | 12 ++ .../quickfix/addDataModifier/notVarVal.kt | 13 +++ .../testData/quickfix/addDataModifier/open.kt | 13 +++ .../quickfix/addDataModifier/sealed.kt | 15 +++ .../quickfix/addDataModifier/test1.kt | 6 + .../quickfix/addDataModifier/test1.kt.after | 6 + .../quickfix/addDataModifier/test2.kt | 7 ++ .../quickfix/addDataModifier/test2.kt.after | 7 ++ .../quickfix/addDataModifier/test3.kt | 9 ++ .../quickfix/addDataModifier/test3.kt.after | 9 ++ .../quickfix/addDataModifier/test4.kt | 9 ++ .../quickfix/addDataModifier/test4.kt.after | 9 ++ .../quickfix/addDataModifier/test5.kt | 6 + .../quickfix/addDataModifier/test5.kt.after | 6 + .../quickfix/addDataModifier/test6.kt | 8 ++ .../quickfix/addDataModifier/test6.kt.after | 8 ++ .../quickfix/addDataModifier/test7.kt | 6 + .../quickfix/addDataModifier/test7.kt.after | 6 + .../quickfix/addDataModifier/vararg.kt | 13 +++ ...rtyByDestructuringEntryWithSkippedIndex.kt | 1 + .../idea/quickfix/QuickFixTestGenerated.java | 105 ++++++++++++++++++ 27 files changed, 409 insertions(+), 1 deletion(-) create mode 100644 idea/src/org/jetbrains/kotlin/idea/quickfix/AddDataModifierFix.kt create mode 100644 idea/testData/quickfix/addDataModifier/abstract.kt create mode 100644 idea/testData/quickfix/addDataModifier/inner.kt create mode 100644 idea/testData/quickfix/addDataModifier/invisibleParameter.kt create mode 100644 idea/testData/quickfix/addDataModifier/invisibleParameter2.kt create mode 100644 idea/testData/quickfix/addDataModifier/noParameter.kt create mode 100644 idea/testData/quickfix/addDataModifier/notVarVal.kt create mode 100644 idea/testData/quickfix/addDataModifier/open.kt create mode 100644 idea/testData/quickfix/addDataModifier/sealed.kt create mode 100644 idea/testData/quickfix/addDataModifier/test1.kt create mode 100644 idea/testData/quickfix/addDataModifier/test1.kt.after create mode 100644 idea/testData/quickfix/addDataModifier/test2.kt create mode 100644 idea/testData/quickfix/addDataModifier/test2.kt.after create mode 100644 idea/testData/quickfix/addDataModifier/test3.kt create mode 100644 idea/testData/quickfix/addDataModifier/test3.kt.after create mode 100644 idea/testData/quickfix/addDataModifier/test4.kt create mode 100644 idea/testData/quickfix/addDataModifier/test4.kt.after create mode 100644 idea/testData/quickfix/addDataModifier/test5.kt create mode 100644 idea/testData/quickfix/addDataModifier/test5.kt.after create mode 100644 idea/testData/quickfix/addDataModifier/test6.kt create mode 100644 idea/testData/quickfix/addDataModifier/test6.kt.after create mode 100644 idea/testData/quickfix/addDataModifier/test7.kt create mode 100644 idea/testData/quickfix/addDataModifier/test7.kt.after create mode 100644 idea/testData/quickfix/addDataModifier/vararg.kt diff --git a/idea/src/org/jetbrains/kotlin/idea/quickfix/AddDataModifierFix.kt b/idea/src/org/jetbrains/kotlin/idea/quickfix/AddDataModifierFix.kt new file mode 100644 index 00000000000..8c7c0df6244 --- /dev/null +++ b/idea/src/org/jetbrains/kotlin/idea/quickfix/AddDataModifierFix.kt @@ -0,0 +1,80 @@ +/* + * Copyright 2010-2017 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.quickfix + +import org.jetbrains.kotlin.descriptors.CallableDescriptor +import org.jetbrains.kotlin.descriptors.ClassDescriptor +import org.jetbrains.kotlin.descriptors.Modality +import org.jetbrains.kotlin.diagnostics.Diagnostic +import org.jetbrains.kotlin.idea.caches.resolve.analyze +import org.jetbrains.kotlin.idea.caches.resolve.getResolutionFacade +import org.jetbrains.kotlin.idea.core.isVisible +import org.jetbrains.kotlin.lexer.KtTokens +import org.jetbrains.kotlin.psi.KtClass +import org.jetbrains.kotlin.psi.KtDestructuringDeclarationEntry +import org.jetbrains.kotlin.psi.KtExpression +import org.jetbrains.kotlin.psi.KtModifierListOwner +import org.jetbrains.kotlin.resolve.BindingContext +import org.jetbrains.kotlin.resolve.DescriptorToSourceUtils +import org.jetbrains.kotlin.resolve.DescriptorUtils +import org.jetbrains.kotlin.resolve.calls.callUtil.getResolvedCall + +class AddDataModifierFix(element: KtClass, private val fqName: String) : AddModifierFix(element, KtTokens.DATA_KEYWORD) { + + override fun getText() = "Make '$fqName' data class" + + override fun getFamilyName() = text + + companion object : KotlinSingleIntentionActionFactory() { + + override fun createAction(diagnostic: Diagnostic): KotlinQuickFixAction? { + val element = diagnostic.psiElement as? KtExpression ?: return null + val context = element.analyze() + + val callableDescriptor = if (element is KtDestructuringDeclarationEntry) { + context[BindingContext.DECLARATION_TO_DESCRIPTOR, element.parent.parent] as? CallableDescriptor + } + else { + element.getResolvedCall(context)?.resultingDescriptor + } + + val constructor = callableDescriptor?.returnType?.arguments?.firstOrNull()?.type?.constructor + ?: callableDescriptor?.returnType?.constructor + + val classDescriptor = constructor?.declarationDescriptor as? ClassDescriptor ?: return null + + val modality = classDescriptor.modality + if (modality != Modality.FINAL || classDescriptor.isInner) return null + val ctorParams = classDescriptor.constructors.firstOrNull { it.isPrimary }?.valueParameters ?: return null + if (ctorParams.isEmpty()) return null + + if (!ctorParams.all { + if (it.varargElementType != null) return@all false + val property = context[BindingContext.VALUE_PARAMETER_AS_PROPERTY, it] ?: return@all false + // NB: we use element as receiver because element is a constructor call + // which is effectively used as receiver by destructuring declaration + property.isVisible(element, element, context, element.getResolutionFacade()) + }) return null + + val klass = DescriptorToSourceUtils.descriptorToDeclaration(classDescriptor) as? KtClass ?: return null + val fqName = DescriptorUtils.getFqName(classDescriptor).asString() + return AddDataModifierFix(klass, fqName) + } + + } + +} diff --git a/idea/src/org/jetbrains/kotlin/idea/quickfix/QuickFixRegistrar.kt b/idea/src/org/jetbrains/kotlin/idea/quickfix/QuickFixRegistrar.kt index 37e50c29920..e26c27d8aa5 100644 --- a/idea/src/org/jetbrains/kotlin/idea/quickfix/QuickFixRegistrar.kt +++ b/idea/src/org/jetbrains/kotlin/idea/quickfix/QuickFixRegistrar.kt @@ -158,7 +158,7 @@ class QuickFixRegistrar : QuickFixContributor { FUNCTION_EXPECTED.registerFactory(InvokeImportFix) DELEGATE_SPECIAL_FUNCTION_MISSING.registerFactory(DelegateAccessorsImportFix) - COMPONENT_FUNCTION_MISSING.registerFactory(ComponentsImportFix) + COMPONENT_FUNCTION_MISSING.registerFactory(ComponentsImportFix, AddDataModifierFix) NO_GET_METHOD.registerFactory(ArrayAccessorImportFix) NO_SET_METHOD.registerFactory(ArrayAccessorImportFix) diff --git a/idea/testData/quickfix/addDataModifier/abstract.kt b/idea/testData/quickfix/addDataModifier/abstract.kt new file mode 100644 index 00000000000..5c795d6a1be --- /dev/null +++ b/idea/testData/quickfix/addDataModifier/abstract.kt @@ -0,0 +1,14 @@ +// "Make 'Foo' data class" "false" +// ACTION: Create extension function 'Foo.component1' +// ACTION: Create extension function 'Foo.component2' +// ACTION: Create member function 'Foo.component1' +// ACTION: Create member function 'Foo.component2' +// ACTION: Put arguments on separate lines +// ERROR: Cannot create an instance of an abstract class +// ERROR: Destructuring declaration initializer of type Foo must have a 'component1()' function +// ERROR: Destructuring declaration initializer of type Foo must have a 'component2()' function +abstract class Foo(val bar: String, val baz: Int) + +fun test() { + var (bar, baz) = Foo("A", 1) +} \ No newline at end of file diff --git a/idea/testData/quickfix/addDataModifier/inner.kt b/idea/testData/quickfix/addDataModifier/inner.kt new file mode 100644 index 00000000000..f7bac564dc3 --- /dev/null +++ b/idea/testData/quickfix/addDataModifier/inner.kt @@ -0,0 +1,14 @@ +// "Make 'Foo' data class" "false" +// ACTION: Create extension function 'Test.Foo.component1' +// ACTION: Create extension function 'Test.Foo.component2' +// ACTION: Create member function 'Test.Foo.component1' +// ACTION: Create member function 'Test.Foo.component2' +// ACTION: Put arguments on separate lines +// ERROR: Destructuring declaration initializer of type Test.Foo must have a 'component1()' function +// ERROR: Destructuring declaration initializer of type Test.Foo must have a 'component2()' function +class Test { + inner class Foo(val bar: String, val baz: Int) + fun test() { + var (bar, baz) = Foo("A", 1) + } +} \ No newline at end of file diff --git a/idea/testData/quickfix/addDataModifier/invisibleParameter.kt b/idea/testData/quickfix/addDataModifier/invisibleParameter.kt new file mode 100644 index 00000000000..02f99688ce9 --- /dev/null +++ b/idea/testData/quickfix/addDataModifier/invisibleParameter.kt @@ -0,0 +1,13 @@ +// "Make 'Foo' data class" "false" +// ACTION: Create extension function 'Foo.component1' +// ACTION: Create extension function 'Foo.component2' +// ACTION: Create member function 'Foo.component1' +// ACTION: Create member function 'Foo.component2' +// ACTION: Put arguments on separate lines +// ERROR: Destructuring declaration initializer of type Foo must have a 'component1()' function +// ERROR: Destructuring declaration initializer of type Foo must have a 'component2()' function +class Foo(private val bar: String, var baz: Int) + +fun test() { + var (bar, baz) = Foo("A", 1) +} \ No newline at end of file diff --git a/idea/testData/quickfix/addDataModifier/invisibleParameter2.kt b/idea/testData/quickfix/addDataModifier/invisibleParameter2.kt new file mode 100644 index 00000000000..de64d29e965 --- /dev/null +++ b/idea/testData/quickfix/addDataModifier/invisibleParameter2.kt @@ -0,0 +1,13 @@ +// "Make 'Foo' data class" "false" +// ACTION: Create extension function 'Foo.component1' +// ACTION: Create extension function 'Foo.component2' +// ACTION: Create member function 'Foo.component1' +// ACTION: Create member function 'Foo.component2' +// ACTION: Put arguments on separate lines +// ERROR: Destructuring declaration initializer of type Foo must have a 'component1()' function +// ERROR: Destructuring declaration initializer of type Foo must have a 'component2()' function +class Foo(protected val bar: String, var baz: Int) + +fun test() { + var (bar, baz) = Foo("A", 1) +} \ No newline at end of file diff --git a/idea/testData/quickfix/addDataModifier/noParameter.kt b/idea/testData/quickfix/addDataModifier/noParameter.kt new file mode 100644 index 00000000000..0dea8fafcef --- /dev/null +++ b/idea/testData/quickfix/addDataModifier/noParameter.kt @@ -0,0 +1,12 @@ +// "Make 'Foo' data class" "false" +// ACTION: Create extension function 'Foo.component1' +// ACTION: Create extension function 'Foo.component2' +// ACTION: Create member function 'Foo.component1' +// ACTION: Create member function 'Foo.component2' +// ERROR: Destructuring declaration initializer of type Foo must have a 'component1()' function +// ERROR: Destructuring declaration initializer of type Foo must have a 'component2()' function +class Foo() + +fun test() { + var (bar, baz) = Foo() +} \ No newline at end of file diff --git a/idea/testData/quickfix/addDataModifier/notVarVal.kt b/idea/testData/quickfix/addDataModifier/notVarVal.kt new file mode 100644 index 00000000000..f456180ae3c --- /dev/null +++ b/idea/testData/quickfix/addDataModifier/notVarVal.kt @@ -0,0 +1,13 @@ +// "Make 'Foo' data class" "false" +// ACTION: Create extension function 'Foo.component1' +// ACTION: Create extension function 'Foo.component2' +// ACTION: Create member function 'Foo.component1' +// ACTION: Create member function 'Foo.component2' +// ACTION: Put arguments on separate lines +// ERROR: Destructuring declaration initializer of type Foo must have a 'component1()' function +// ERROR: Destructuring declaration initializer of type Foo must have a 'component2()' function +class Foo(val bar: String, baz: Int) + +fun test() { + var (bar, baz) = Foo("A", 1) +} \ No newline at end of file diff --git a/idea/testData/quickfix/addDataModifier/open.kt b/idea/testData/quickfix/addDataModifier/open.kt new file mode 100644 index 00000000000..e14740afc03 --- /dev/null +++ b/idea/testData/quickfix/addDataModifier/open.kt @@ -0,0 +1,13 @@ +// "Make 'Foo' data class" "false" +// ACTION: Create extension function 'Foo.component1' +// ACTION: Create extension function 'Foo.component2' +// ACTION: Create member function 'Foo.component1' +// ACTION: Create member function 'Foo.component2' +// ACTION: Put arguments on separate lines +// ERROR: Destructuring declaration initializer of type Foo must have a 'component1()' function +// ERROR: Destructuring declaration initializer of type Foo must have a 'component2()' function +open class Foo(val bar: String, val baz: Int) + +fun test() { + var (bar, baz) = Foo("A", 1) +} \ No newline at end of file diff --git a/idea/testData/quickfix/addDataModifier/sealed.kt b/idea/testData/quickfix/addDataModifier/sealed.kt new file mode 100644 index 00000000000..8724e134c39 --- /dev/null +++ b/idea/testData/quickfix/addDataModifier/sealed.kt @@ -0,0 +1,15 @@ +// "Make 'Foo' data class" "false" +// ACTION: Create extension function 'Foo.component1' +// ACTION: Create extension function 'Foo.component2' +// ACTION: Create member function 'Foo.component1' +// ACTION: Create member function 'Foo.component2' +// ACTION: Put arguments on separate lines +// ERROR: Cannot access '': it is private in 'Foo' +// ERROR: Destructuring declaration initializer of type Foo must have a 'component1()' function +// ERROR: Destructuring declaration initializer of type Foo must have a 'component2()' function +// ERROR: Sealed types cannot be instantiated +sealed class Foo(val bar: String, val baz: Int) + +fun test() { + var (bar, baz) = Foo("A", 1) +} \ No newline at end of file diff --git a/idea/testData/quickfix/addDataModifier/test1.kt b/idea/testData/quickfix/addDataModifier/test1.kt new file mode 100644 index 00000000000..c42253debfb --- /dev/null +++ b/idea/testData/quickfix/addDataModifier/test1.kt @@ -0,0 +1,6 @@ +// "Make 'Foo' data class" "true" +class Foo(val bar: String, var baz: Int) + +fun test() { + var (bar, baz) = Foo("A", 1) +} \ No newline at end of file diff --git a/idea/testData/quickfix/addDataModifier/test1.kt.after b/idea/testData/quickfix/addDataModifier/test1.kt.after new file mode 100644 index 00000000000..e0cf499da01 --- /dev/null +++ b/idea/testData/quickfix/addDataModifier/test1.kt.after @@ -0,0 +1,6 @@ +// "Make 'Foo' data class" "true" +data class Foo(val bar: String, var baz: Int) + +fun test() { + var (bar, baz) = Foo("A", 1) +} \ No newline at end of file diff --git a/idea/testData/quickfix/addDataModifier/test2.kt b/idea/testData/quickfix/addDataModifier/test2.kt new file mode 100644 index 00000000000..e208ba575ba --- /dev/null +++ b/idea/testData/quickfix/addDataModifier/test2.kt @@ -0,0 +1,7 @@ +// "Make 'Foo' data class" "true" +class Foo(val bar: String, var baz: Int) + +fun test() { + val foo = Foo("A", 1) + var (bar, baz) = foo +} \ No newline at end of file diff --git a/idea/testData/quickfix/addDataModifier/test2.kt.after b/idea/testData/quickfix/addDataModifier/test2.kt.after new file mode 100644 index 00000000000..1cef42725b8 --- /dev/null +++ b/idea/testData/quickfix/addDataModifier/test2.kt.after @@ -0,0 +1,7 @@ +// "Make 'Foo' data class" "true" +data class Foo(val bar: String, var baz: Int) + +fun test() { + val foo = Foo("A", 1) + var (bar, baz) = foo +} \ No newline at end of file diff --git a/idea/testData/quickfix/addDataModifier/test3.kt b/idea/testData/quickfix/addDataModifier/test3.kt new file mode 100644 index 00000000000..14c14fecc37 --- /dev/null +++ b/idea/testData/quickfix/addDataModifier/test3.kt @@ -0,0 +1,9 @@ +// "Make 'Foo' data class" "true" +// WITH_RUNTIME +class Foo(val bar: String, var baz: Int) + +fun test() { + val list = listOf(Foo("A", 1)) + list.forEach { (foo, bar) -> + } +} \ No newline at end of file diff --git a/idea/testData/quickfix/addDataModifier/test3.kt.after b/idea/testData/quickfix/addDataModifier/test3.kt.after new file mode 100644 index 00000000000..2fec927848f --- /dev/null +++ b/idea/testData/quickfix/addDataModifier/test3.kt.after @@ -0,0 +1,9 @@ +// "Make 'Foo' data class" "true" +// WITH_RUNTIME +data class Foo(val bar: String, var baz: Int) + +fun test() { + val list = listOf(Foo("A", 1)) + list.forEach { (foo, bar) -> + } +} \ No newline at end of file diff --git a/idea/testData/quickfix/addDataModifier/test4.kt b/idea/testData/quickfix/addDataModifier/test4.kt new file mode 100644 index 00000000000..9c631d5167f --- /dev/null +++ b/idea/testData/quickfix/addDataModifier/test4.kt @@ -0,0 +1,9 @@ +// "Make 'Foo' data class" "true" +// WITH_RUNTIME +class Foo(val bar: String, var baz: Int) + +fun test() { + val list = listOf(Foo("A", 1)) + for ((foo, bar) in list) { + } +} \ No newline at end of file diff --git a/idea/testData/quickfix/addDataModifier/test4.kt.after b/idea/testData/quickfix/addDataModifier/test4.kt.after new file mode 100644 index 00000000000..1ad3a63978e --- /dev/null +++ b/idea/testData/quickfix/addDataModifier/test4.kt.after @@ -0,0 +1,9 @@ +// "Make 'Foo' data class" "true" +// WITH_RUNTIME +data class Foo(val bar: String, var baz: Int) + +fun test() { + val list = listOf(Foo("A", 1)) + for ((foo, bar) in list) { + } +} \ No newline at end of file diff --git a/idea/testData/quickfix/addDataModifier/test5.kt b/idea/testData/quickfix/addDataModifier/test5.kt new file mode 100644 index 00000000000..2e02b43cd7a --- /dev/null +++ b/idea/testData/quickfix/addDataModifier/test5.kt @@ -0,0 +1,6 @@ +// "Make 'Foo' data class" "true" +class Foo(private val bar: String, protected var baz: Int) { + fun test() { + var (bar, baz) = Foo("A", 1) + } +} \ No newline at end of file diff --git a/idea/testData/quickfix/addDataModifier/test5.kt.after b/idea/testData/quickfix/addDataModifier/test5.kt.after new file mode 100644 index 00000000000..b3761069e0a --- /dev/null +++ b/idea/testData/quickfix/addDataModifier/test5.kt.after @@ -0,0 +1,6 @@ +// "Make 'Foo' data class" "true" +data class Foo(private val bar: String, protected var baz: Int) { + fun test() { + var (bar, baz) = Foo("A", 1) + } +} \ No newline at end of file diff --git a/idea/testData/quickfix/addDataModifier/test6.kt b/idea/testData/quickfix/addDataModifier/test6.kt new file mode 100644 index 00000000000..21f8ce91d78 --- /dev/null +++ b/idea/testData/quickfix/addDataModifier/test6.kt @@ -0,0 +1,8 @@ +// "Make 'Foo' data class" "true" +class Foo(private val bar: String, protected var baz: Int) { + class A { + fun test() { + var (bar, baz) = Foo("A", 1) + } + } +} \ No newline at end of file diff --git a/idea/testData/quickfix/addDataModifier/test6.kt.after b/idea/testData/quickfix/addDataModifier/test6.kt.after new file mode 100644 index 00000000000..e55eb2fbe4e --- /dev/null +++ b/idea/testData/quickfix/addDataModifier/test6.kt.after @@ -0,0 +1,8 @@ +// "Make 'Foo' data class" "true" +data class Foo(private val bar: String, protected var baz: Int) { + class A { + fun test() { + var (bar, baz) = Foo("A", 1) + } + } +} \ No newline at end of file diff --git a/idea/testData/quickfix/addDataModifier/test7.kt b/idea/testData/quickfix/addDataModifier/test7.kt new file mode 100644 index 00000000000..e6954b4dca6 --- /dev/null +++ b/idea/testData/quickfix/addDataModifier/test7.kt @@ -0,0 +1,6 @@ +// "Make 'Foo' data class" "true" +class Foo(internal val bar: String, var baz: Int) + +fun test() { + var (bar, baz) = Foo("A", 1) +} \ No newline at end of file diff --git a/idea/testData/quickfix/addDataModifier/test7.kt.after b/idea/testData/quickfix/addDataModifier/test7.kt.after new file mode 100644 index 00000000000..fac74f191bd --- /dev/null +++ b/idea/testData/quickfix/addDataModifier/test7.kt.after @@ -0,0 +1,6 @@ +// "Make 'Foo' data class" "true" +data class Foo(internal val bar: String, var baz: Int) + +fun test() { + var (bar, baz) = Foo("A", 1) +} \ No newline at end of file diff --git a/idea/testData/quickfix/addDataModifier/vararg.kt b/idea/testData/quickfix/addDataModifier/vararg.kt new file mode 100644 index 00000000000..ddcc7f25a73 --- /dev/null +++ b/idea/testData/quickfix/addDataModifier/vararg.kt @@ -0,0 +1,13 @@ +// "Make 'Foo' data class" "false" +// ACTION: Create extension function 'Foo.component1' +// ACTION: Create extension function 'Foo.component2' +// ACTION: Create member function 'Foo.component1' +// ACTION: Create member function 'Foo.component2' +// ACTION: Put arguments on separate lines +// ERROR: Destructuring declaration initializer of type Foo must have a 'component1()' function +// ERROR: Destructuring declaration initializer of type Foo must have a 'component2()' function +class Foo(val bar: String, vararg var baz: Int) + +fun test() { + var (bar, baz) = Foo("A", 1) +} \ No newline at end of file diff --git a/idea/testData/quickfix/createFromUsage/createVariable/parameter/dataClassPropertyByDestructuringEntryWithSkippedIndex.kt b/idea/testData/quickfix/createFromUsage/createVariable/parameter/dataClassPropertyByDestructuringEntryWithSkippedIndex.kt index b4af5a79a02..1b357ee00bb 100644 --- a/idea/testData/quickfix/createFromUsage/createVariable/parameter/dataClassPropertyByDestructuringEntryWithSkippedIndex.kt +++ b/idea/testData/quickfix/createFromUsage/createVariable/parameter/dataClassPropertyByDestructuringEntryWithSkippedIndex.kt @@ -1,5 +1,6 @@ // "Create property 'address2' as constructor parameter" "false" // ACTION: Create property 'address' as constructor parameter +// ACTION: Make 'Person' data class // ERROR: Destructuring declaration initializer of type Person must have a 'component3()' function // ERROR: Destructuring declaration initializer of type Person must have a 'component4()' function data class Person(val name: String, val age: Int) diff --git a/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java b/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java index 15c62e41ba2..2af928600ae 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java @@ -252,6 +252,111 @@ public class QuickFixTestGenerated extends AbstractQuickFixTest { } } + @TestMetadata("idea/testData/quickfix/addDataModifier") + @TestDataPath("$PROJECT_ROOT") + @RunWith(JUnit3RunnerWithInners.class) + public static class AddDataModifier extends AbstractQuickFixTest { + @TestMetadata("abstract.kt") + public void testAbstract() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/quickfix/addDataModifier/abstract.kt"); + doTest(fileName); + } + + public void testAllFilesPresentInAddDataModifier() throws Exception { + KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("idea/testData/quickfix/addDataModifier"), Pattern.compile("^([\\w\\-_]+)\\.kt$"), TargetBackend.ANY, true); + } + + @TestMetadata("inner.kt") + public void testInner() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/quickfix/addDataModifier/inner.kt"); + doTest(fileName); + } + + @TestMetadata("invisibleParameter.kt") + public void testInvisibleParameter() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/quickfix/addDataModifier/invisibleParameter.kt"); + doTest(fileName); + } + + @TestMetadata("invisibleParameter2.kt") + public void testInvisibleParameter2() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/quickfix/addDataModifier/invisibleParameter2.kt"); + doTest(fileName); + } + + @TestMetadata("noParameter.kt") + public void testNoParameter() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/quickfix/addDataModifier/noParameter.kt"); + doTest(fileName); + } + + @TestMetadata("notVarVal.kt") + public void testNotVarVal() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/quickfix/addDataModifier/notVarVal.kt"); + doTest(fileName); + } + + @TestMetadata("open.kt") + public void testOpen() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/quickfix/addDataModifier/open.kt"); + doTest(fileName); + } + + @TestMetadata("sealed.kt") + public void testSealed() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/quickfix/addDataModifier/sealed.kt"); + doTest(fileName); + } + + @TestMetadata("test1.kt") + public void testTest1() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/quickfix/addDataModifier/test1.kt"); + doTest(fileName); + } + + @TestMetadata("test2.kt") + public void testTest2() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/quickfix/addDataModifier/test2.kt"); + doTest(fileName); + } + + @TestMetadata("test3.kt") + public void testTest3() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/quickfix/addDataModifier/test3.kt"); + doTest(fileName); + } + + @TestMetadata("test4.kt") + public void testTest4() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/quickfix/addDataModifier/test4.kt"); + doTest(fileName); + } + + @TestMetadata("test5.kt") + public void testTest5() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/quickfix/addDataModifier/test5.kt"); + doTest(fileName); + } + + @TestMetadata("test6.kt") + public void testTest6() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/quickfix/addDataModifier/test6.kt"); + doTest(fileName); + } + + @TestMetadata("test7.kt") + public void testTest7() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/quickfix/addDataModifier/test7.kt"); + doTest(fileName); + } + + @TestMetadata("vararg.kt") + public void testVararg() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/quickfix/addDataModifier/vararg.kt"); + doTest(fileName); + } + } + @TestMetadata("idea/testData/quickfix/addExclExclCall") @TestDataPath("$PROJECT_ROOT") @RunWith(JUnit3RunnerWithInners.class) From 1e82b23321e763b5c3e99f3824af73358f978e35 Mon Sep 17 00:00:00 2001 From: Alexey Sedunov Date: Thu, 14 Sep 2017 16:46:02 +0300 Subject: [PATCH 043/212] Minor: Drop unnecessary non-null assertion #EA-107378 Fixed --- idea/src/org/jetbrains/kotlin/idea/facet/facetUtils.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/idea/src/org/jetbrains/kotlin/idea/facet/facetUtils.kt b/idea/src/org/jetbrains/kotlin/idea/facet/facetUtils.kt index a0c67031c0d..faa41192840 100644 --- a/idea/src/org/jetbrains/kotlin/idea/facet/facetUtils.kt +++ b/idea/src/org/jetbrains/kotlin/idea/facet/facetUtils.kt @@ -84,7 +84,7 @@ fun KotlinFacetSettings.initializeIfNeeded( LanguageVersion.fromVersionString(commonArguments.apiVersion) ?: languageLevel } else { - languageLevel!!.coerceAtMost(getLibraryLanguageLevel(module, rootModel, targetPlatformKind!!)) + languageLevel!!.coerceAtMost(getLibraryLanguageLevel(module, rootModel, targetPlatformKind)) } } } From c37489ab8b780d0c90714f33f16989812e554d62 Mon Sep 17 00:00:00 2001 From: Alexey Sedunov Date: Fri, 1 Sep 2017 20:22:16 +0300 Subject: [PATCH 044/212] Kotlin Facet: Do not restrict API version list by stdlib version #KT-19955 Fixed --- .../kotlin/idea/facet/KotlinFacetEditorGeneralTab.kt | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/idea/src/org/jetbrains/kotlin/idea/facet/KotlinFacetEditorGeneralTab.kt b/idea/src/org/jetbrains/kotlin/idea/facet/KotlinFacetEditorGeneralTab.kt index e5794f3c677..fc2205555fe 100644 --- a/idea/src/org/jetbrains/kotlin/idea/facet/KotlinFacetEditorGeneralTab.kt +++ b/idea/src/org/jetbrains/kotlin/idea/facet/KotlinFacetEditorGeneralTab.kt @@ -243,10 +243,7 @@ class KotlinFacetEditorGeneralTab( private fun restrictAPIVersions() { with(editor.compilerConfigurable) { - val targetPlatform = editor.targetPlatformComboBox.selectedItem as TargetPlatformKind<*>? - val libraryLevel = getLibraryLanguageLevel(editorContext.module, editorContext.rootModel, targetPlatform) - val versionUpperBound = minOf(selectedLanguageVersion, libraryLevel) - restrictAPIVersions(versionUpperBound) + restrictAPIVersions(selectedLanguageVersion) } } From 0a0457298be74d89f0f75e5c95b57dceb23027e3 Mon Sep 17 00:00:00 2001 From: Alexey Sedunov Date: Wed, 13 Sep 2017 12:42:40 +0300 Subject: [PATCH 045/212] Misc: Run MoveKotlinDeclarationsProcessor.findUsages() under progress #KT-20205 Fixed --- .../cutPaste/MoveDeclarationsProcessor.kt | 9 ++++++++- .../KotlinChangePackageRefactoring.kt | 15 +++++++++------ 2 files changed, 17 insertions(+), 7 deletions(-) diff --git a/idea/src/org/jetbrains/kotlin/idea/refactoring/cutPaste/MoveDeclarationsProcessor.kt b/idea/src/org/jetbrains/kotlin/idea/refactoring/cutPaste/MoveDeclarationsProcessor.kt index 75a8da6e3d0..19119827944 100644 --- a/idea/src/org/jetbrains/kotlin/idea/refactoring/cutPaste/MoveDeclarationsProcessor.kt +++ b/idea/src/org/jetbrains/kotlin/idea/refactoring/cutPaste/MoveDeclarationsProcessor.kt @@ -23,11 +23,14 @@ import com.intellij.openapi.util.TextRange import com.intellij.openapi.vfs.VirtualFileManager import com.intellij.psi.PsiDocumentManager import com.intellij.psi.PsiManager +import com.intellij.refactoring.RefactoringBundle import org.jetbrains.kotlin.idea.caches.resolve.unsafeResolveToDescriptor import org.jetbrains.kotlin.idea.codeInsight.shorten.runRefactoringAndKeepDelayedRequests import org.jetbrains.kotlin.idea.conversion.copy.range import org.jetbrains.kotlin.idea.refactoring.move.moveDeclarations.* +import org.jetbrains.kotlin.idea.runSynchronouslyWithProgress import org.jetbrains.kotlin.idea.util.application.executeWriteCommand +import org.jetbrains.kotlin.idea.util.application.runReadAction import org.jetbrains.kotlin.idea.util.getSourceRoot import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.psi.psiUtil.endOffset @@ -117,7 +120,11 @@ class MoveDeclarationsProcessor( mover ) - val declarationUsages = declarationProcessor.findUsages().toList() + val declarationUsages = project.runSynchronouslyWithProgress(RefactoringBundle.message("progress.text"), true) { + runReadAction { + declarationProcessor.findUsages().toList() + } + } ?: return project.executeWriteCommand(commandName, commandGroupId) { project.runRefactoringAndKeepDelayedRequests { declarationProcessor.execute(declarationUsages) } diff --git a/idea/src/org/jetbrains/kotlin/idea/refactoring/move/changePackage/KotlinChangePackageRefactoring.kt b/idea/src/org/jetbrains/kotlin/idea/refactoring/move/changePackage/KotlinChangePackageRefactoring.kt index c3bbad637ae..b94f779c66c 100644 --- a/idea/src/org/jetbrains/kotlin/idea/refactoring/move/changePackage/KotlinChangePackageRefactoring.kt +++ b/idea/src/org/jetbrains/kotlin/idea/refactoring/move/changePackage/KotlinChangePackageRefactoring.kt @@ -16,18 +16,17 @@ package org.jetbrains.kotlin.idea.refactoring.move.changePackage -import com.intellij.openapi.vfs.VirtualFile -import com.intellij.psi.PsiDirectory -import com.intellij.psi.PsiElement -import com.intellij.psi.PsiFile +import com.intellij.refactoring.RefactoringBundle import org.jetbrains.kotlin.idea.codeInsight.shorten.runRefactoringAndKeepDelayedRequests +import org.jetbrains.kotlin.idea.core.quoteIfNeeded import org.jetbrains.kotlin.idea.refactoring.move.ContainerChangeInfo import org.jetbrains.kotlin.idea.refactoring.move.ContainerInfo import org.jetbrains.kotlin.idea.refactoring.move.getInternalReferencesToUpdateOnPackageNameChange import org.jetbrains.kotlin.idea.refactoring.move.moveDeclarations.* import org.jetbrains.kotlin.idea.refactoring.move.postProcessMoveUsages -import org.jetbrains.kotlin.idea.core.quoteIfNeeded +import org.jetbrains.kotlin.idea.runSynchronouslyWithProgress import org.jetbrains.kotlin.idea.util.application.executeWriteCommand +import org.jetbrains.kotlin.idea.util.application.runReadAction import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.psi.KtFile import org.jetbrains.kotlin.psi.KtNamedDeclaration @@ -50,7 +49,11 @@ class KotlinChangePackageRefactoring(val file: KtFile) { Mover.Idle // we don't need to move any declarations physically ) - val declarationUsages = declarationProcessor.findUsages().toList() + val declarationUsages = project.runSynchronouslyWithProgress(RefactoringBundle.message("progress.text"), true) { + runReadAction { + declarationProcessor.findUsages().toList() + } + } ?: return val changeInfo = ContainerChangeInfo(ContainerInfo.Package(currentFqName), ContainerInfo.Package(newFqName)) val internalUsages = file.getInternalReferencesToUpdateOnPackageNameChange(changeInfo) From fefa2304a0613fa350c1f2d41e7346c5a9c41398 Mon Sep 17 00:00:00 2001 From: Alexey Sedunov Date: Fri, 15 Sep 2017 19:20:40 +0300 Subject: [PATCH 046/212] Move to Separate File: Optimize usage search/processing - Import optimization is already performed by refactoring helper, so running optimizer explicitly is unnecessary - Do not search external usages for declarations with unchaged package and module #KT-18823 Fixed --- .../MoveDeclarationToSeparateFileIntention.kt | 7 +------ .../MoveKotlinDeclarationsProcessor.kt | 14 ++++++++++++++ .../kotlin/idea/refactoring/move/moveUtils.kt | 8 ++++++++ .../kotlin/idea/util/projectStructureUtil.kt | 8 ++++++-- 4 files changed, 29 insertions(+), 8 deletions(-) diff --git a/idea/src/org/jetbrains/kotlin/idea/refactoring/move/moveDeclarations/MoveDeclarationToSeparateFileIntention.kt b/idea/src/org/jetbrains/kotlin/idea/refactoring/move/moveDeclarations/MoveDeclarationToSeparateFileIntention.kt index aa9cce1020f..55fe22d1eb1 100644 --- a/idea/src/org/jetbrains/kotlin/idea/refactoring/move/moveDeclarations/MoveDeclarationToSeparateFileIntention.kt +++ b/idea/src/org/jetbrains/kotlin/idea/refactoring/move/moveDeclarations/MoveDeclarationToSeparateFileIntention.kt @@ -16,7 +16,6 @@ package org.jetbrains.kotlin.idea.refactoring.move.moveDeclarations -import com.intellij.codeInsight.actions.OptimizeImportsProcessor import com.intellij.codeInsight.intention.LowPriorityAction import com.intellij.codeInsight.navigation.NavigationUtil import com.intellij.openapi.application.ApplicationManager @@ -29,7 +28,6 @@ import org.jetbrains.kotlin.idea.intentions.SelfTargetingRangeIntention import org.jetbrains.kotlin.idea.core.moveCaret import org.jetbrains.kotlin.idea.refactoring.createKotlinFile import org.jetbrains.kotlin.idea.refactoring.move.moveDeclarations.ui.MoveKotlinTopLevelDeclarationsDialog -import org.jetbrains.kotlin.idea.refactoring.runRefactoringWithPostprocessing import org.jetbrains.kotlin.lexer.KtTokens import org.jetbrains.kotlin.psi.KtClass import org.jetbrains.kotlin.psi.KtClassOrObject @@ -108,9 +106,6 @@ class MoveDeclarationToSeparateFileIntention : } ) - val move = { MoveKotlinDeclarationsProcessor(descriptor).run() } - val optimizeImports = { OptimizeImportsProcessor(project, file).run() } - - move.runRefactoringWithPostprocessing(project, MoveKotlinDeclarationsProcessor.REFACTORING_ID, optimizeImports) + MoveKotlinDeclarationsProcessor(descriptor).run() } } \ No newline at end of file diff --git a/idea/src/org/jetbrains/kotlin/idea/refactoring/move/moveDeclarations/MoveKotlinDeclarationsProcessor.kt b/idea/src/org/jetbrains/kotlin/idea/refactoring/move/moveDeclarations/MoveKotlinDeclarationsProcessor.kt index bdd3d56eeae..d2505ad7946 100644 --- a/idea/src/org/jetbrains/kotlin/idea/refactoring/move/moveDeclarations/MoveKotlinDeclarationsProcessor.kt +++ b/idea/src/org/jetbrains/kotlin/idea/refactoring/move/moveDeclarations/MoveKotlinDeclarationsProcessor.kt @@ -41,6 +41,7 @@ import com.intellij.util.containers.MultiMap import gnu.trove.THashMap import gnu.trove.TObjectHashingStrategy import org.jetbrains.kotlin.asJava.elements.KtLightDeclaration +import org.jetbrains.kotlin.asJava.namedUnwrappedElement import org.jetbrains.kotlin.asJava.toLightElements import org.jetbrains.kotlin.idea.codeInsight.shorten.addToBeShortenedDescendantsToWaitingSet import org.jetbrains.kotlin.idea.core.deleteSingle @@ -48,6 +49,9 @@ import org.jetbrains.kotlin.idea.refactoring.fqName.getKotlinFqName import org.jetbrains.kotlin.idea.refactoring.move.* import org.jetbrains.kotlin.idea.refactoring.move.moveFilesOrDirectories.MoveKotlinClassHandler import org.jetbrains.kotlin.idea.search.projectScope +import org.jetbrains.kotlin.idea.util.projectStructure.getModule +import org.jetbrains.kotlin.idea.util.projectStructure.module +import org.jetbrains.kotlin.lexer.KtTokens import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.psi.psiUtil.containingClassOrObject import org.jetbrains.kotlin.psi.psiUtil.getElementTextWithContext @@ -149,8 +153,18 @@ class MoveKotlinDeclarationsProcessor( val newContainerName = descriptor.moveTarget.targetContainerFqName?.asString() ?: "" + fun canSkipUsages(element: PsiElement): Boolean { + val ktDeclaration = element.namedUnwrappedElement as? KtNamedDeclaration ?: return false + if (ktDeclaration.hasModifier(KtTokens.PRIVATE_KEYWORD)) return false + val (oldContainer, newContainer) = descriptor.delegate.getContainerChangeInfo(ktDeclaration, descriptor.moveTarget) + val targetModule = descriptor.moveTarget.targetFile?.getModule(project) ?: return false + return oldContainer == newContainer && ktDeclaration.module == targetModule + } + fun collectUsages(kotlinToLightElements: Map>, result: MutableCollection) { kotlinToLightElements.values.flatten().flatMapTo(result) { lightElement -> + if (canSkipUsages(lightElement)) return@flatMapTo emptyList() + val newFqName = StringUtil.getQualifiedName(newContainerName, lightElement.name) val foundReferences = HashSet() diff --git a/idea/src/org/jetbrains/kotlin/idea/refactoring/move/moveUtils.kt b/idea/src/org/jetbrains/kotlin/idea/refactoring/move/moveUtils.kt index 494e6e15152..c7e1671c5da 100644 --- a/idea/src/org/jetbrains/kotlin/idea/refactoring/move/moveUtils.kt +++ b/idea/src/org/jetbrains/kotlin/idea/refactoring/move/moveUtils.kt @@ -70,12 +70,20 @@ sealed class ContainerInfo { override fun matches(descriptor: DeclarationDescriptor): Boolean { return descriptor is PackageFragmentDescriptor && descriptor.fqName == fqName } + + override fun equals(other: Any?) = other is Package && other.fqName == fqName + + override fun hashCode() = fqName.hashCode() } class Class(override val fqName: FqName) : ContainerInfo() { override fun matches(descriptor: DeclarationDescriptor): Boolean { return descriptor is ClassDescriptor && descriptor.importableFqName == fqName } + + override fun equals(other: Any?) = other is Class && other.fqName == fqName + + override fun hashCode() = fqName.hashCode() } } diff --git a/idea/src/org/jetbrains/kotlin/idea/util/projectStructureUtil.kt b/idea/src/org/jetbrains/kotlin/idea/util/projectStructureUtil.kt index e2f012cb7c5..56d1aca64ac 100644 --- a/idea/src/org/jetbrains/kotlin/idea/util/projectStructureUtil.kt +++ b/idea/src/org/jetbrains/kotlin/idea/util/projectStructureUtil.kt @@ -18,6 +18,7 @@ package org.jetbrains.kotlin.idea.util.projectStructure import com.intellij.openapi.module.Module import com.intellij.openapi.module.ModuleManager +import com.intellij.openapi.module.ModuleUtilCore import com.intellij.openapi.project.Project import com.intellij.openapi.projectRoots.Sdk import com.intellij.openapi.roots.ModuleRootManager @@ -25,6 +26,8 @@ import com.intellij.openapi.roots.OrderEnumerator import com.intellij.openapi.roots.OrderRootType import com.intellij.openapi.roots.libraries.Library import com.intellij.openapi.vfs.VfsUtil +import com.intellij.openapi.vfs.VirtualFile +import com.intellij.psi.PsiElement import java.io.File fun Project.allModules() = ModuleManager.getInstance(this).modules.toList() @@ -67,6 +70,7 @@ fun Library.ModifiableModel.replaceFileRoot(oldFile: File, newFile: File) { replaceInRootType(OrderRootType.SOURCES) } +fun VirtualFile.getModule(project: Project) = ModuleUtilCore.findModuleForFile(this, project) - - +val PsiElement.module + get() = ModuleUtilCore.findModuleForPsiElement(this) \ No newline at end of file From 963747ce047c69736f44bc94dd9db3fb7505096d Mon Sep 17 00:00:00 2001 From: Alexey Sedunov Date: Thu, 14 Sep 2017 18:26:41 +0300 Subject: [PATCH 047/212] Move: Optimize conflict analysis - Do not process conflicts twice wgen moving a directory - Check move target before resolving usage context declaration - Skip visibility check for usages referring to public declarations - Skip module conflict check for declarations with unchanged module - Do not report lambdas as usage container (use enclosing declaration) --- .../idea/refactoring/kotlinRefactoringUtil.kt | 3 +- .../MoveKotlinDeclarationsProcessor.kt | 9 ++++-- .../moveDeclarations/moveConflictUtils.kt | 30 +++++++++++-------- .../KotlinMoveDirectoryWithClassesHelper.kt | 14 ++++++--- .../MoveKotlinFileHandler.kt | 17 ++++++++--- .../moveFunctionWithExternalRefs.kt | 2 +- .../movePropertyWithExternalRefs.kt | 2 +- 7 files changed, 51 insertions(+), 26 deletions(-) diff --git a/idea/src/org/jetbrains/kotlin/idea/refactoring/kotlinRefactoringUtil.kt b/idea/src/org/jetbrains/kotlin/idea/refactoring/kotlinRefactoringUtil.kt index daf216ec918..6cfa6460e88 100644 --- a/idea/src/org/jetbrains/kotlin/idea/refactoring/kotlinRefactoringUtil.kt +++ b/idea/src/org/jetbrains/kotlin/idea/refactoring/kotlinRefactoringUtil.kt @@ -149,7 +149,8 @@ fun PsiElement.getUsageContext(): PsiElement { this, KtPropertyAccessor::class.java, KtProperty::class.java, - KtFunction::class.java, + KtNamedFunction::class.java, + KtConstructor::class.java, KtClassOrObject::class.java ) ?: containingFile else -> ConflictsUtil.getContainer(this) diff --git a/idea/src/org/jetbrains/kotlin/idea/refactoring/move/moveDeclarations/MoveKotlinDeclarationsProcessor.kt b/idea/src/org/jetbrains/kotlin/idea/refactoring/move/moveDeclarations/MoveKotlinDeclarationsProcessor.kt index d2505ad7946..c10a38dd99c 100644 --- a/idea/src/org/jetbrains/kotlin/idea/refactoring/move/moveDeclarations/MoveKotlinDeclarationsProcessor.kt +++ b/idea/src/org/jetbrains/kotlin/idea/refactoring/move/moveDeclarations/MoveKotlinDeclarationsProcessor.kt @@ -96,7 +96,8 @@ class MoveDeclarationsDescriptor @JvmOverloads constructor( val deleteSourceFiles: Boolean = false, val moveCallback: MoveCallback? = null, val openInEditor: Boolean = false, - val allElementsToMove: List? = null + val allElementsToMove: List? = null, + val analyzeConflicts: Boolean = true ) class ConflictUsageInfo(element: PsiElement, val messages: Collection) : UsageInfo(element) @@ -226,8 +227,10 @@ class MoveKotlinDeclarationsProcessor( internalUsages += descriptor.delegate.findInternalUsages(descriptor) collectUsages(kotlinToLightElements, externalUsages) - conflictChecker.checkAllConflicts(externalUsages, internalUsages, conflicts) - descriptor.delegate.collectConflicts(descriptor, internalUsages, conflicts) + if (descriptor.analyzeConflicts) { + conflictChecker.checkAllConflicts(externalUsages, internalUsages, conflicts) + descriptor.delegate.collectConflicts(descriptor, internalUsages, conflicts) + } usages += internalUsages usages += externalUsages diff --git a/idea/src/org/jetbrains/kotlin/idea/refactoring/move/moveDeclarations/moveConflictUtils.kt b/idea/src/org/jetbrains/kotlin/idea/refactoring/move/moveDeclarations/moveConflictUtils.kt index f5ce7703948..5239506bf37 100644 --- a/idea/src/org/jetbrains/kotlin/idea/refactoring/move/moveDeclarations/moveConflictUtils.kt +++ b/idea/src/org/jetbrains/kotlin/idea/refactoring/move/moveDeclarations/moveConflictUtils.kt @@ -48,6 +48,8 @@ import org.jetbrains.kotlin.idea.refactoring.getUsageContext import org.jetbrains.kotlin.idea.refactoring.move.KotlinMoveUsage import org.jetbrains.kotlin.idea.search.and import org.jetbrains.kotlin.idea.search.not +import org.jetbrains.kotlin.idea.util.projectStructure.getModule +import org.jetbrains.kotlin.idea.util.projectStructure.module import org.jetbrains.kotlin.lexer.KtTokens import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.psi.psiUtil.contains @@ -164,11 +166,11 @@ class MoveConflictChecker( // Based on RefactoringConflictsUtil.analyzeModuleConflicts fun analyzeModuleConflictsInUsages(project: Project, usages: Collection, - sourceRoot: VirtualFile, + targetFile: VirtualFile, conflicts: MultiMap) { - val targetModule = ModuleUtilCore.findModuleForFile(sourceRoot, project) ?: return + val targetModule = targetFile.getModule(project) ?: return - val isInTestSources = ModuleRootManager.getInstance(targetModule).fileIndex.isInTestSourceContent(sourceRoot) + val isInTestSources = ModuleRootManager.getInstance(targetModule).fileIndex.isInTestSourceContent(targetFile) NextUsage@ for (usage in usages) { val element = usage.element ?: continue if (PsiTreeUtil.getParentOfType(element, PsiImportStatement::class.java, false) != null) continue @@ -177,9 +179,7 @@ class MoveConflictChecker( val resolveScope = element.resolveScope if (resolveScope.isSearchInModuleContent(targetModule, isInTestSources)) continue - val usageFile = element.containingFile - val usageVFile = usageFile.virtualFile ?: continue - val usageModule = ModuleUtilCore.findModuleForFile(usageVFile, project) ?: continue + val usageModule = element.module ?: continue val scopeDescription = RefactoringUIUtil.getDescription(element.getUsageContext(), true) val referencedElement = (if (usage is MoveRenameUsageInfo) usage.referencedElement else usage.element) ?: error(usage) val message = if (usageModule == targetModule && isInTestSources) { @@ -200,9 +200,9 @@ class MoveConflictChecker( fun checkModuleConflictsInUsages(externalUsages: MutableSet, conflicts: MultiMap) { val newConflicts = MultiMap() - val sourceRoot = moveTarget.targetFile ?: return + val targetFile = moveTarget.targetFile ?: return - analyzeModuleConflictsInUsages(project, externalUsages, sourceRoot, newConflicts) + analyzeModuleConflictsInUsages(project, externalUsages, targetFile, newConflicts) if (!newConflicts.isEmpty) { val referencedElementsToSkip = newConflicts.keySet().mapNotNullTo(HashSet()) { it.namedUnwrappedElement } externalUsages.removeIf { @@ -242,8 +242,8 @@ class MoveConflictChecker( internalUsages: MutableSet, conflicts: MultiMap ) { - val sourceRoot = moveTarget.targetFile ?: return - val targetModule = ModuleUtilCore.findModuleForFile(sourceRoot, project) ?: return + val targetFile = moveTarget.targetFile ?: return + val targetModule = targetFile.getModule(project) ?: return val resolveScope = targetModule.getScopeWithPlatformAwareDependencies() fun isInScope(targetElement: PsiElement, targetDescriptor: DeclarationDescriptor): Boolean { @@ -255,7 +255,7 @@ class MoveConflictChecker( val renderedImportableTarget = DESCRIPTOR_RENDERER_FOR_COMPARISON.render(importableDescriptor) val renderedTarget by lazy { DESCRIPTOR_RENDERER_FOR_COMPARISON.render(targetDescriptor) } - val targetModuleInfo = getModuleInfoByVirtualFile(project, sourceRoot) + val targetModuleInfo = getModuleInfoByVirtualFile(project, targetFile) val dummyFile = KtPsiFactory(targetElement.project).createFile("dummy.kt", "").apply { moduleInfo = targetModuleInfo targetPlatform = TargetPlatformDetector.getPlatform(targetModule) @@ -288,6 +288,8 @@ class MoveConflictChecker( val referencesToSkip = HashSet() for (declaration in elementsToMove - doNotGoIn) { + if (declaration.module == targetModule) continue + declaration.forEachDescendantOfType { refExpr -> val targetDescriptor = refExpr.analyze(BodyResolveMode.PARTIAL)[BindingContext.REFERENCE_TARGET, refExpr] ?: return@forEachDescendantOfType @@ -328,15 +330,19 @@ class MoveConflictChecker( val referencedElement = usage.referencedElement?.namedUnwrappedElement as? KtNamedDeclaration ?: continue val referencedDescriptor = resolutionFacade.resolveToDescriptor(referencedElement) + if (referencedDescriptor is DeclarationDescriptorWithVisibility + && referencedDescriptor.visibility == Visibilities.PUBLIC) continue + val container = element.getUsageContext() if (!declarationToContainers.getOrPut(referencedElement) { HashSet() }.add(container)) continue + val targetContainer = moveTarget.getContainerDescriptor() ?: continue + val referencingDescriptor = when (container) { is KtDeclaration -> container.unsafeResolveToDescriptor() is PsiMember -> container.getJavaMemberDescriptor() else -> null } ?: continue - val targetContainer = moveTarget.getContainerDescriptor() ?: continue val descriptorToCheck = referencedDescriptor.asPredicted(targetContainer) ?: continue if (referencedDescriptor.isVisibleIn(referencingDescriptor) && !descriptorToCheck.isVisibleIn(referencingDescriptor)) { diff --git a/idea/src/org/jetbrains/kotlin/idea/refactoring/move/moveFilesOrDirectories/KotlinMoveDirectoryWithClassesHelper.kt b/idea/src/org/jetbrains/kotlin/idea/refactoring/move/moveFilesOrDirectories/KotlinMoveDirectoryWithClassesHelper.kt index b3c6b3896f6..de3600c69ae 100644 --- a/idea/src/org/jetbrains/kotlin/idea/refactoring/move/moveFilesOrDirectories/KotlinMoveDirectoryWithClassesHelper.kt +++ b/idea/src/org/jetbrains/kotlin/idea/refactoring/move/moveFilesOrDirectories/KotlinMoveDirectoryWithClassesHelper.kt @@ -32,6 +32,8 @@ import org.jetbrains.kotlin.idea.refactoring.invokeOnceOnCommandFinish import org.jetbrains.kotlin.idea.refactoring.move.moveDeclarations.KotlinDirectoryMoveTarget import org.jetbrains.kotlin.idea.refactoring.move.moveDeclarations.MoveKotlinDeclarationsProcessor import org.jetbrains.kotlin.idea.refactoring.move.moveDeclarations.analyzeConflictsInFile +import org.jetbrains.kotlin.idea.runSynchronouslyWithProgress +import org.jetbrains.kotlin.idea.util.application.runReadAction import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.psi.KtFile import java.util.* @@ -68,7 +70,7 @@ class KotlinMoveDirectoryWithClassesHelper : MoveDirectoryWithClassesHelper() { project: Project) { filesToMove .filterIsInstance() - .mapTo(result) { FileUsagesWrapper(it, fileHandler.findUsages(it, null, searchInComments, searchInNonJavaFiles), null) } + .mapTo(result) { FileUsagesWrapper(it, fileHandler.findUsages(it, null, false), null) } } override fun preprocessUsages( @@ -83,8 +85,12 @@ class KotlinMoveDirectoryWithClassesHelper : MoveDirectoryWithClassesHelper() { for ((index, usageInfo) in infos.withIndex()) { if (usageInfo !is FileUsagesWrapper) continue - analyzeConflictsInFile(usageInfo.psiFile, usageInfo.usages, moveTarget, files, conflicts) { - infos[index] = usageInfo.copy(usages = it) + project.runSynchronouslyWithProgress("Analyzing conflicts in ${usageInfo.psiFile.name}", false) { + runReadAction { + analyzeConflictsInFile(usageInfo.psiFile, usageInfo.usages, moveTarget, files, conflicts) { + infos[index] = usageInfo.copy(usages = it) + } + } } } } @@ -103,7 +109,7 @@ class KotlinMoveDirectoryWithClassesHelper : MoveDirectoryWithClassesHelper() { ): Boolean { if (file !is KtFile) return false - val moveDeclarationsProcessor = fileHandler.initMoveProcessor(file, moveDestination) + val moveDeclarationsProcessor = fileHandler.initMoveProcessor(file, moveDestination, false) val moveContextMap = getOrCreateMoveContextMap() moveContextMap[file] = MoveContext(moveDestination, moveDeclarationsProcessor) if (moveDeclarationsProcessor != null) { 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 cbc13a9c125..9dd34706fa2 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 @@ -73,7 +73,7 @@ class MoveKotlinFileHandler : MoveFileHandler() { return ContainerChangeInfo(ContainerInfo.Package(oldPackageName), ContainerInfo.Package(newPackageName.toSafe())) } - fun initMoveProcessor(psiFile: PsiFile, newParent: PsiDirectory?): MoveKotlinDeclarationsProcessor? { + fun initMoveProcessor(psiFile: PsiFile, newParent: PsiDirectory?, withConflicts: Boolean): MoveKotlinDeclarationsProcessor? { if (psiFile !is KtFile) return null val packageNameInfo = psiFile.getPackageNameInfo(newParent, false) ?: return null @@ -98,7 +98,8 @@ class MoveKotlinFileHandler : MoveFileHandler() { moveTarget = moveTarget, delegate = MoveDeclarationsDelegate.TopLevel, scanEntireFile = true, - allElementsToMove = psiFile.allElementsToMove + allElementsToMove = psiFile.allElementsToMove, + analyzeConflicts = withConflicts ), Mover.Idle ) @@ -114,11 +115,19 @@ class MoveKotlinFileHandler : MoveFileHandler() { newParent: PsiDirectory?, searchInComments: Boolean, searchInNonJavaFiles: Boolean + ): List { + return findUsages(psiFile, newParent, true) + } + + fun findUsages( + psiFile: PsiFile, + newParent: PsiDirectory?, + withConflicts: Boolean ): List { if (psiFile !is KtFile) return emptyList() val usages = arrayListOf(FileInfo(psiFile)) - initMoveProcessor(psiFile, newParent)?.let { + initMoveProcessor(psiFile, newParent, withConflicts)?.let { usages += it.findUsages() usages += it.getConflictsAsUsages() } @@ -127,7 +136,7 @@ class MoveKotlinFileHandler : MoveFileHandler() { override fun prepareMovedFile(file: PsiFile, moveDestination: PsiDirectory, oldToNewMap: MutableMap) { if (file !is KtFile) return - val moveProcessor = initMoveProcessor(file, moveDestination) ?: return + val moveProcessor = initMoveProcessor(file, moveDestination, false) ?: return val moveContext = MoveContext(file, moveProcessor) oldToNewMap[moveContext] = moveContext val packageNameInfo = file.getPackageNameInfo(moveDestination, true) ?: return diff --git a/idea/testData/intentions/moveOutOfCompanion/moveFunctionWithExternalRefs.kt b/idea/testData/intentions/moveOutOfCompanion/moveFunctionWithExternalRefs.kt index 050c44335cd..1f289152f1f 100644 --- a/idea/testData/intentions/moveOutOfCompanion/moveFunctionWithExternalRefs.kt +++ b/idea/testData/intentions/moveOutOfCompanion/moveFunctionWithExternalRefs.kt @@ -1,5 +1,5 @@ // WITH_RUNTIME -// SHOULD_FAIL_WITH: 'foo' in class B will require class instance, 'foo' in function test() will require class instance, 'foo' in function test() will require class instance, 'foo' in lambda <anonymous>() will require class instance +// SHOULD_FAIL_WITH: 'foo' in class B will require class instance, 'foo' in function test() will require class instance, 'foo' in function test() will require class instance, 'foo' in function test() will require class instance class A { companion object { class B { diff --git a/idea/testData/intentions/moveOutOfCompanion/movePropertyWithExternalRefs.kt b/idea/testData/intentions/moveOutOfCompanion/movePropertyWithExternalRefs.kt index e583ca5ffe8..6b57efdd7b5 100644 --- a/idea/testData/intentions/moveOutOfCompanion/movePropertyWithExternalRefs.kt +++ b/idea/testData/intentions/moveOutOfCompanion/movePropertyWithExternalRefs.kt @@ -1,5 +1,5 @@ // WITH_RUNTIME -// SHOULD_FAIL_WITH: 'foo' in class B will require class instance, 'foo' in function test() will require class instance, 'foo' in function test() will require class instance, 'foo' in lambda <anonymous>() will require class instance +// SHOULD_FAIL_WITH: 'foo' in class B will require class instance, 'foo' in function test() will require class instance, 'foo' in function test() will require class instance, 'foo' in function test() will require class instance class A { companion object { class B { From fbf6bd534cb99d3d4bc3b8c0c15975128d4abba4 Mon Sep 17 00:00:00 2001 From: Alexey Sedunov Date: Wed, 20 Sep 2017 13:08:34 +0300 Subject: [PATCH 048/212] Move: Disable MoveDeclarationsCopyPasteProcessor in dumb mode #KT-20199 Fixed --- .../refactoring/cutPaste/MoveDeclarationsCopyPasteProcessor.kt | 3 +++ 1 file changed, 3 insertions(+) diff --git a/idea/src/org/jetbrains/kotlin/idea/refactoring/cutPaste/MoveDeclarationsCopyPasteProcessor.kt b/idea/src/org/jetbrains/kotlin/idea/refactoring/cutPaste/MoveDeclarationsCopyPasteProcessor.kt index b1d63670ee2..0b3a2599afd 100644 --- a/idea/src/org/jetbrains/kotlin/idea/refactoring/cutPaste/MoveDeclarationsCopyPasteProcessor.kt +++ b/idea/src/org/jetbrains/kotlin/idea/refactoring/cutPaste/MoveDeclarationsCopyPasteProcessor.kt @@ -21,6 +21,7 @@ import com.intellij.openapi.application.ApplicationManager import com.intellij.openapi.diagnostic.Logger import com.intellij.openapi.editor.Editor import com.intellij.openapi.editor.RangeMarker +import com.intellij.openapi.project.DumbService import com.intellij.openapi.project.Project import com.intellij.openapi.util.Ref import com.intellij.openapi.util.TextRange @@ -56,6 +57,8 @@ class MoveDeclarationsCopyPasteProcessor : CopyPastePostProcessor { + if (DumbService.isDumb(file.project)) return emptyList() + if (file !is KtFile) return emptyList() if (startOffsets.size != 1) return emptyList() From 0beadddb7f21c9748c0b0c0d28e462fbcd0c27ec Mon Sep 17 00:00:00 2001 From: Alexey Sedunov Date: Tue, 19 Sep 2017 15:21:31 +0300 Subject: [PATCH 049/212] Copy: Improve file copying - Do not copy individual declarations if entire file is selected (keeping original content with comments, formatting, etc.) - Update package directive when original file packages matches its directory #KT-20092 Fixed #KT-18196 Fixed --- .../src/org/jetbrains/kotlin/psi/KtFile.kt | 12 +++++++++- .../copy/CopyKotlinDeclarationsHandler.kt | 16 +++++++++---- .../after/bar/test.kt | 8 +++++++ .../copyFIleFromDefaultPackage/after/test.kt | 6 +++++ .../copyFIleFromDefaultPackage/before/test.kt | 6 +++++ .../copyFIleFromDefaultPackage.test | 4 ++++ .../copyFIleRetainContent/after/bar/test.kt | 8 +++++++ .../copyFIleRetainContent/after/foo/test.kt | 8 +++++++ .../copyFIleRetainContent/before/foo/test.kt | 8 +++++++ .../copyFIleRetainContent.test | 4 ++++ .../after/foo/test.kt | 8 +++++++ .../copyFIleToDefaultPackage/after/test.kt | 6 +++++ .../before/foo/test.kt | 8 +++++++ .../copyFIleToDefaultPackage.test | 4 ++++ .../after/bar/test.kt | 8 +++++++ .../after/foo/test.kt | 8 +++++++ .../before/foo/test.kt | 8 +++++++ .../copyFIleWithPackageAndDirUnmatched.test | 4 ++++ .../copy/copyMultiClassFile/after/bar/test.kt | 2 +- .../after/bar/{A.kt => test.kt} | 0 .../copy/kt18149/after/refactor/copy2/test.kt | 12 ++++------ .../refactoring/copy/CopyTestGenerated.java | 24 +++++++++++++++++++ 22 files changed, 159 insertions(+), 13 deletions(-) create mode 100644 idea/testData/refactoring/copy/copyFIleFromDefaultPackage/after/bar/test.kt create mode 100644 idea/testData/refactoring/copy/copyFIleFromDefaultPackage/after/test.kt create mode 100644 idea/testData/refactoring/copy/copyFIleFromDefaultPackage/before/test.kt create mode 100644 idea/testData/refactoring/copy/copyFIleFromDefaultPackage/copyFIleFromDefaultPackage.test create mode 100644 idea/testData/refactoring/copy/copyFIleRetainContent/after/bar/test.kt create mode 100644 idea/testData/refactoring/copy/copyFIleRetainContent/after/foo/test.kt create mode 100644 idea/testData/refactoring/copy/copyFIleRetainContent/before/foo/test.kt create mode 100644 idea/testData/refactoring/copy/copyFIleRetainContent/copyFIleRetainContent.test create mode 100644 idea/testData/refactoring/copy/copyFIleToDefaultPackage/after/foo/test.kt create mode 100644 idea/testData/refactoring/copy/copyFIleToDefaultPackage/after/test.kt create mode 100644 idea/testData/refactoring/copy/copyFIleToDefaultPackage/before/foo/test.kt create mode 100644 idea/testData/refactoring/copy/copyFIleToDefaultPackage/copyFIleToDefaultPackage.test create mode 100644 idea/testData/refactoring/copy/copyFIleWithPackageAndDirUnmatched/after/bar/test.kt create mode 100644 idea/testData/refactoring/copy/copyFIleWithPackageAndDirUnmatched/after/foo/test.kt create mode 100644 idea/testData/refactoring/copy/copyFIleWithPackageAndDirUnmatched/before/foo/test.kt create mode 100644 idea/testData/refactoring/copy/copyFIleWithPackageAndDirUnmatched/copyFIleWithPackageAndDirUnmatched.test rename idea/testData/refactoring/copy/copySingleClassFile/after/bar/{A.kt => test.kt} (100%) diff --git a/compiler/frontend/src/org/jetbrains/kotlin/psi/KtFile.kt b/compiler/frontend/src/org/jetbrains/kotlin/psi/KtFile.kt index bada78df856..d8c6271c43d 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/psi/KtFile.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/psi/KtFile.kt @@ -76,8 +76,18 @@ open class KtFile(viewProvider: FileViewProvider, val isCompiled: Boolean) : return if (ast != null) ast.psi as KtPackageDirective else null } - val packageFqName: FqName + var packageFqName: FqName get() = stub?.getPackageFqName() ?: packageFqNameByTree + set(value) { + val packageDirective = packageDirective + if (packageDirective != null) { + packageDirective.fqName = value + } + else { + val newPackageDirective = KtPsiFactory(this).createPackageDirectiveIfNeeded(value) ?: return + addAfter(newPackageDirective, null) + } + } val packageFqNameByTree: FqName get() = packageDirectiveByTree?.fqName ?: FqName.ROOT diff --git a/idea/src/org/jetbrains/kotlin/idea/refactoring/copy/CopyKotlinDeclarationsHandler.kt b/idea/src/org/jetbrains/kotlin/idea/refactoring/copy/CopyKotlinDeclarationsHandler.kt index 683cf6101e9..1fe0ac262bc 100644 --- a/idea/src/org/jetbrains/kotlin/idea/refactoring/copy/CopyKotlinDeclarationsHandler.kt +++ b/idea/src/org/jetbrains/kotlin/idea/refactoring/copy/CopyKotlinDeclarationsHandler.kt @@ -39,6 +39,8 @@ import com.intellij.util.IncorrectOperationException import com.intellij.util.containers.MultiMap import org.jetbrains.annotations.TestOnly import org.jetbrains.kotlin.idea.codeInsight.shorten.performDelayedRefactoringRequests +import org.jetbrains.kotlin.idea.core.getPackage +import org.jetbrains.kotlin.idea.core.packageMatchesDirectory import org.jetbrains.kotlin.idea.refactoring.checkConflictsInteractively import org.jetbrains.kotlin.idea.refactoring.createKotlinFile import org.jetbrains.kotlin.idea.refactoring.move.* @@ -63,8 +65,11 @@ class CopyKotlinDeclarationsHandler : CopyHandlerDelegateBase() { @set:TestOnly var Project.newName: String? by UserDataProperty(Key.create("NEW_NAME")) - private fun PsiElement.getElementsToCopy(): List { - val declarationOrFile = parentsWithSelf.firstOrNull { it is KtFile || (it is KtNamedDeclaration && it.parent is KtFile) } + private fun PsiElement.getCopyableElement() = + parentsWithSelf.firstOrNull { it is KtFile || (it is KtNamedDeclaration && it.parent is KtFile) } as? KtElement + + private fun PsiElement.getDeclarationsToCopy(): List { + val declarationOrFile = getCopyableElement() return when (declarationOrFile) { is KtFile -> declarationOrFile.declarations.filterIsInstance().ifEmpty { listOf(declarationOrFile) } is KtNamedDeclaration -> listOf(declarationOrFile) @@ -90,7 +95,7 @@ class CopyKotlinDeclarationsHandler : CopyHandlerDelegateBase() { private fun canCopyDeclarations(elements: Array): Boolean { val containingFile = elements - .flatMap { it.getElementsToCopy().ifEmpty { return false } } + .flatMap { it.getDeclarationsToCopy().ifEmpty { return false } } .distinctBy { it.containingFile } .singleOrNull() ?.containingFile ?: return false @@ -174,7 +179,7 @@ class CopyKotlinDeclarationsHandler : CopyHandlerDelegateBase() { return copyFilesHandler.doCopy(sourceFiles, defaultTargetDirectory) } - val elementsToCopy = elements.flatMap { it.getElementsToCopy() } + val elementsToCopy = elements.mapNotNull { it.getCopyableElement() } if (elementsToCopy.isEmpty()) return val singleElementToCopy = elementsToCopy.singleOrNull() @@ -248,6 +253,9 @@ class CopyKotlinDeclarationsHandler : CopyHandlerDelegateBase() { if (singleElementToCopy is KtFile) { targetFile = runWriteAction { val copiedFile = targetDirectory.copyFileFrom(targetFileName, singleElementToCopy) as KtFile + if (singleElementToCopy.packageMatchesDirectory()) { + targetDirectory.getPackage()?.qualifiedName?.let { copiedFile.packageFqName = FqName(it) } + } performDelayedRefactoringRequests(project) copiedFile } diff --git a/idea/testData/refactoring/copy/copyFIleFromDefaultPackage/after/bar/test.kt b/idea/testData/refactoring/copy/copyFIleFromDefaultPackage/after/bar/test.kt new file mode 100644 index 00000000000..c299dd73002 --- /dev/null +++ b/idea/testData/refactoring/copy/copyFIleFromDefaultPackage/after/bar/test.kt @@ -0,0 +1,8 @@ +package bar + +val a = 42 + +// comment + +// some other comment +val s = "" \ No newline at end of file diff --git a/idea/testData/refactoring/copy/copyFIleFromDefaultPackage/after/test.kt b/idea/testData/refactoring/copy/copyFIleFromDefaultPackage/after/test.kt new file mode 100644 index 00000000000..71d1b354d30 --- /dev/null +++ b/idea/testData/refactoring/copy/copyFIleFromDefaultPackage/after/test.kt @@ -0,0 +1,6 @@ +val a = 42 + +// comment + +// some other comment +val s = "" \ No newline at end of file diff --git a/idea/testData/refactoring/copy/copyFIleFromDefaultPackage/before/test.kt b/idea/testData/refactoring/copy/copyFIleFromDefaultPackage/before/test.kt new file mode 100644 index 00000000000..71d1b354d30 --- /dev/null +++ b/idea/testData/refactoring/copy/copyFIleFromDefaultPackage/before/test.kt @@ -0,0 +1,6 @@ +val a = 42 + +// comment + +// some other comment +val s = "" \ No newline at end of file diff --git a/idea/testData/refactoring/copy/copyFIleFromDefaultPackage/copyFIleFromDefaultPackage.test b/idea/testData/refactoring/copy/copyFIleFromDefaultPackage/copyFIleFromDefaultPackage.test new file mode 100644 index 00000000000..a72ed185f0b --- /dev/null +++ b/idea/testData/refactoring/copy/copyFIleFromDefaultPackage/copyFIleFromDefaultPackage.test @@ -0,0 +1,4 @@ +{ + "mainFile": "test.kt", + "targetPackage": "bar" +} diff --git a/idea/testData/refactoring/copy/copyFIleRetainContent/after/bar/test.kt b/idea/testData/refactoring/copy/copyFIleRetainContent/after/bar/test.kt new file mode 100644 index 00000000000..c299dd73002 --- /dev/null +++ b/idea/testData/refactoring/copy/copyFIleRetainContent/after/bar/test.kt @@ -0,0 +1,8 @@ +package bar + +val a = 42 + +// comment + +// some other comment +val s = "" \ No newline at end of file diff --git a/idea/testData/refactoring/copy/copyFIleRetainContent/after/foo/test.kt b/idea/testData/refactoring/copy/copyFIleRetainContent/after/foo/test.kt new file mode 100644 index 00000000000..6cd7df7764e --- /dev/null +++ b/idea/testData/refactoring/copy/copyFIleRetainContent/after/foo/test.kt @@ -0,0 +1,8 @@ +package foo + +val a = 42 + +// comment + +// some other comment +val s = "" \ No newline at end of file diff --git a/idea/testData/refactoring/copy/copyFIleRetainContent/before/foo/test.kt b/idea/testData/refactoring/copy/copyFIleRetainContent/before/foo/test.kt new file mode 100644 index 00000000000..6cd7df7764e --- /dev/null +++ b/idea/testData/refactoring/copy/copyFIleRetainContent/before/foo/test.kt @@ -0,0 +1,8 @@ +package foo + +val a = 42 + +// comment + +// some other comment +val s = "" \ No newline at end of file diff --git a/idea/testData/refactoring/copy/copyFIleRetainContent/copyFIleRetainContent.test b/idea/testData/refactoring/copy/copyFIleRetainContent/copyFIleRetainContent.test new file mode 100644 index 00000000000..f169eabdfa3 --- /dev/null +++ b/idea/testData/refactoring/copy/copyFIleRetainContent/copyFIleRetainContent.test @@ -0,0 +1,4 @@ +{ + "mainFile": "foo/test.kt", + "targetPackage": "bar" +} diff --git a/idea/testData/refactoring/copy/copyFIleToDefaultPackage/after/foo/test.kt b/idea/testData/refactoring/copy/copyFIleToDefaultPackage/after/foo/test.kt new file mode 100644 index 00000000000..6cd7df7764e --- /dev/null +++ b/idea/testData/refactoring/copy/copyFIleToDefaultPackage/after/foo/test.kt @@ -0,0 +1,8 @@ +package foo + +val a = 42 + +// comment + +// some other comment +val s = "" \ No newline at end of file diff --git a/idea/testData/refactoring/copy/copyFIleToDefaultPackage/after/test.kt b/idea/testData/refactoring/copy/copyFIleToDefaultPackage/after/test.kt new file mode 100644 index 00000000000..71d1b354d30 --- /dev/null +++ b/idea/testData/refactoring/copy/copyFIleToDefaultPackage/after/test.kt @@ -0,0 +1,6 @@ +val a = 42 + +// comment + +// some other comment +val s = "" \ No newline at end of file diff --git a/idea/testData/refactoring/copy/copyFIleToDefaultPackage/before/foo/test.kt b/idea/testData/refactoring/copy/copyFIleToDefaultPackage/before/foo/test.kt new file mode 100644 index 00000000000..6cd7df7764e --- /dev/null +++ b/idea/testData/refactoring/copy/copyFIleToDefaultPackage/before/foo/test.kt @@ -0,0 +1,8 @@ +package foo + +val a = 42 + +// comment + +// some other comment +val s = "" \ No newline at end of file diff --git a/idea/testData/refactoring/copy/copyFIleToDefaultPackage/copyFIleToDefaultPackage.test b/idea/testData/refactoring/copy/copyFIleToDefaultPackage/copyFIleToDefaultPackage.test new file mode 100644 index 00000000000..49d37a24bfd --- /dev/null +++ b/idea/testData/refactoring/copy/copyFIleToDefaultPackage/copyFIleToDefaultPackage.test @@ -0,0 +1,4 @@ +{ + "mainFile": "foo/test.kt", + "targetPackage": "" +} diff --git a/idea/testData/refactoring/copy/copyFIleWithPackageAndDirUnmatched/after/bar/test.kt b/idea/testData/refactoring/copy/copyFIleWithPackageAndDirUnmatched/after/bar/test.kt new file mode 100644 index 00000000000..496b0552e62 --- /dev/null +++ b/idea/testData/refactoring/copy/copyFIleWithPackageAndDirUnmatched/after/bar/test.kt @@ -0,0 +1,8 @@ +package baz + +val a = 42 + +// comment + +// some other comment +val s = "" \ No newline at end of file diff --git a/idea/testData/refactoring/copy/copyFIleWithPackageAndDirUnmatched/after/foo/test.kt b/idea/testData/refactoring/copy/copyFIleWithPackageAndDirUnmatched/after/foo/test.kt new file mode 100644 index 00000000000..496b0552e62 --- /dev/null +++ b/idea/testData/refactoring/copy/copyFIleWithPackageAndDirUnmatched/after/foo/test.kt @@ -0,0 +1,8 @@ +package baz + +val a = 42 + +// comment + +// some other comment +val s = "" \ No newline at end of file diff --git a/idea/testData/refactoring/copy/copyFIleWithPackageAndDirUnmatched/before/foo/test.kt b/idea/testData/refactoring/copy/copyFIleWithPackageAndDirUnmatched/before/foo/test.kt new file mode 100644 index 00000000000..496b0552e62 --- /dev/null +++ b/idea/testData/refactoring/copy/copyFIleWithPackageAndDirUnmatched/before/foo/test.kt @@ -0,0 +1,8 @@ +package baz + +val a = 42 + +// comment + +// some other comment +val s = "" \ No newline at end of file diff --git a/idea/testData/refactoring/copy/copyFIleWithPackageAndDirUnmatched/copyFIleWithPackageAndDirUnmatched.test b/idea/testData/refactoring/copy/copyFIleWithPackageAndDirUnmatched/copyFIleWithPackageAndDirUnmatched.test new file mode 100644 index 00000000000..f169eabdfa3 --- /dev/null +++ b/idea/testData/refactoring/copy/copyFIleWithPackageAndDirUnmatched/copyFIleWithPackageAndDirUnmatched.test @@ -0,0 +1,4 @@ +{ + "mainFile": "foo/test.kt", + "targetPackage": "bar" +} diff --git a/idea/testData/refactoring/copy/copyMultiClassFile/after/bar/test.kt b/idea/testData/refactoring/copy/copyMultiClassFile/after/bar/test.kt index c52f950b8cf..958cf968c3d 100644 --- a/idea/testData/refactoring/copy/copyMultiClassFile/after/bar/test.kt +++ b/idea/testData/refactoring/copy/copyMultiClassFile/after/bar/test.kt @@ -8,4 +8,4 @@ class A { class B { val a: A = A() val b: B = B() -} \ No newline at end of file +} diff --git a/idea/testData/refactoring/copy/copySingleClassFile/after/bar/A.kt b/idea/testData/refactoring/copy/copySingleClassFile/after/bar/test.kt similarity index 100% rename from idea/testData/refactoring/copy/copySingleClassFile/after/bar/A.kt rename to idea/testData/refactoring/copy/copySingleClassFile/after/bar/test.kt diff --git a/idea/testData/refactoring/copy/kt18149/after/refactor/copy2/test.kt b/idea/testData/refactoring/copy/kt18149/after/refactor/copy2/test.kt index 1d1b84c733c..b2b214584a3 100644 --- a/idea/testData/refactoring/copy/kt18149/after/refactor/copy2/test.kt +++ b/idea/testData/refactoring/copy/kt18149/after/refactor/copy2/test.kt @@ -1,15 +1,14 @@ package refactor.copy2 import refactor.ParentJava -import refactor.copy.Company import kotlin.properties.Delegates enum class Possible { NO, YES } - data class Potable(val p1: String) class Insider(val peace: String) + class Init { fun referred() = 0 fun moved() = referred() @@ -28,6 +27,7 @@ class Simple { } annotation class MemAnn + class Variety { // object object ExtractedObject {} @@ -42,8 +42,7 @@ class Variety { private fun privateFun() = 0 fun genFunB(p: T): T = p fun genFunC(p: T): C where T : C = p - @MemAnn - fun annotatedFun() = 0 + @MemAnn fun annotatedFun() = 0 final fun finalFun() = 0 // property var publicProp = 0 @@ -56,8 +55,7 @@ class Variety { var List.genVarL: T where T : C get() = last() set(p) {} - @MemAnn - val annotatedVal = 0 + @MemAnn val annotatedVal = 0 var byVar by Delegates.notNull() lateinit var lateVal: String final val finalVal = 0 @@ -146,9 +144,9 @@ class CtorParameterChild(val pvc: String, var prc: String) : CtorParameter(pvc, class CtorParameterChild2: CtorParameter { constructor() : super("", "", "") } - class CtorParameterChild3(override val pv: String, override var pr: String) : CtorParameter(pv, pv, pr) data class CtorData(val pv: String, var pr: String) {} + class Company { companion object { val companyVal = 0 diff --git a/idea/tests/org/jetbrains/kotlin/idea/refactoring/copy/CopyTestGenerated.java b/idea/tests/org/jetbrains/kotlin/idea/refactoring/copy/CopyTestGenerated.java index f4cb8bba240..2c18659e721 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/refactoring/copy/CopyTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/refactoring/copy/CopyTestGenerated.java @@ -72,6 +72,30 @@ public class CopyTestGenerated extends AbstractCopyTest { doTest(fileName); } + @TestMetadata("copyFIleFromDefaultPackage/copyFIleFromDefaultPackage.test") + public void testCopyFIleFromDefaultPackage_CopyFIleFromDefaultPackage() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/refactoring/copy/copyFIleFromDefaultPackage/copyFIleFromDefaultPackage.test"); + doTest(fileName); + } + + @TestMetadata("copyFIleRetainContent/copyFIleRetainContent.test") + public void testCopyFIleRetainContent_CopyFIleRetainContent() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/refactoring/copy/copyFIleRetainContent/copyFIleRetainContent.test"); + doTest(fileName); + } + + @TestMetadata("copyFIleToDefaultPackage/copyFIleToDefaultPackage.test") + public void testCopyFIleToDefaultPackage_CopyFIleToDefaultPackage() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/refactoring/copy/copyFIleToDefaultPackage/copyFIleToDefaultPackage.test"); + doTest(fileName); + } + + @TestMetadata("copyFIleWithPackageAndDirUnmatched/copyFIleWithPackageAndDirUnmatched.test") + public void testCopyFIleWithPackageAndDirUnmatched_CopyFIleWithPackageAndDirUnmatched() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/refactoring/copy/copyFIleWithPackageAndDirUnmatched/copyFIleWithPackageAndDirUnmatched.test"); + doTest(fileName); + } + @TestMetadata("copyFunCallQualificationWithParentheses/copyFunCallQualificationWithParentheses.test") public void testCopyFunCallQualificationWithParentheses_CopyFunCallQualificationWithParentheses() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("idea/testData/refactoring/copy/copyFunCallQualificationWithParentheses/copyFunCallQualificationWithParentheses.test"); From c8c0ab16473e898b5d69cb7abfe4ccc3309b1337 Mon Sep 17 00:00:00 2001 From: Alexey Sedunov Date: Tue, 19 Sep 2017 16:37:09 +0300 Subject: [PATCH 050/212] Copy: Fix import insertion on declaration copying #KT-19909 Fixed --- .../copy/CopyKotlinDeclarationsHandler.kt | 3 ++- .../copy/copyWithImportInsertion/after/bar/Bar.kt | 3 +++ .../copy/copyWithImportInsertion/after/foo/Foo.kt | 12 ++++++++++++ .../copy/copyWithImportInsertion/after/foo/Foo2.kt | 9 +++++++++ .../copy/copyWithImportInsertion/before/bar/Bar.kt | 3 +++ .../copy/copyWithImportInsertion/before/foo/Foo.kt | 12 ++++++++++++ .../copyWithImportInsertion.test | 5 +++++ .../idea/refactoring/copy/CopyTestGenerated.java | 6 ++++++ 8 files changed, 52 insertions(+), 1 deletion(-) create mode 100644 idea/testData/refactoring/copy/copyWithImportInsertion/after/bar/Bar.kt create mode 100644 idea/testData/refactoring/copy/copyWithImportInsertion/after/foo/Foo.kt create mode 100644 idea/testData/refactoring/copy/copyWithImportInsertion/after/foo/Foo2.kt create mode 100644 idea/testData/refactoring/copy/copyWithImportInsertion/before/bar/Bar.kt create mode 100644 idea/testData/refactoring/copy/copyWithImportInsertion/before/foo/Foo.kt create mode 100644 idea/testData/refactoring/copy/copyWithImportInsertion/copyWithImportInsertion.test diff --git a/idea/src/org/jetbrains/kotlin/idea/refactoring/copy/CopyKotlinDeclarationsHandler.kt b/idea/src/org/jetbrains/kotlin/idea/refactoring/copy/CopyKotlinDeclarationsHandler.kt index 1fe0ac262bc..c249282514f 100644 --- a/idea/src/org/jetbrains/kotlin/idea/refactoring/copy/CopyKotlinDeclarationsHandler.kt +++ b/idea/src/org/jetbrains/kotlin/idea/refactoring/copy/CopyKotlinDeclarationsHandler.kt @@ -265,6 +265,7 @@ class CopyKotlinDeclarationsHandler : CopyHandlerDelegateBase() { runWriteAction { val newElements = elementsToCopy.map { targetFile.add(it.copy()) as KtNamedDeclaration } elementsToCopy.zip(newElements).toMap(oldToNewElementsMapping) + oldToNewElementsMapping[originalFile] = targetFile for (newElement in oldToNewElementsMapping.values) { restoredInternalUsages += restoreInternalUsages(newElement as KtElement, oldToNewElementsMapping, true) @@ -275,7 +276,7 @@ class CopyKotlinDeclarationsHandler : CopyHandlerDelegateBase() { } } - (oldToNewElementsMapping.values.singleOrNull() as? KtNamedDeclaration)?.let { newDeclaration -> + (oldToNewElementsMapping.values.filterIsInstance().singleOrNull())?.let { newDeclaration -> if (newName == newDeclaration.name) return@let val selfReferences = ReferencesSearch.search(newDeclaration, LocalSearchScope(newDeclaration)).findAll() runWriteAction { diff --git a/idea/testData/refactoring/copy/copyWithImportInsertion/after/bar/Bar.kt b/idea/testData/refactoring/copy/copyWithImportInsertion/after/bar/Bar.kt new file mode 100644 index 00000000000..213ed0b96c7 --- /dev/null +++ b/idea/testData/refactoring/copy/copyWithImportInsertion/after/bar/Bar.kt @@ -0,0 +1,3 @@ +package bar + +fun Any.bar() {} \ No newline at end of file diff --git a/idea/testData/refactoring/copy/copyWithImportInsertion/after/foo/Foo.kt b/idea/testData/refactoring/copy/copyWithImportInsertion/after/foo/Foo.kt new file mode 100644 index 00000000000..bcd2249246a --- /dev/null +++ b/idea/testData/refactoring/copy/copyWithImportInsertion/after/foo/Foo.kt @@ -0,0 +1,12 @@ +package foo + +import bar.bar + +class Foo { + init { + 42.bar() + } +} + +class Baz { +} diff --git a/idea/testData/refactoring/copy/copyWithImportInsertion/after/foo/Foo2.kt b/idea/testData/refactoring/copy/copyWithImportInsertion/after/foo/Foo2.kt new file mode 100644 index 00000000000..ec7061f4031 --- /dev/null +++ b/idea/testData/refactoring/copy/copyWithImportInsertion/after/foo/Foo2.kt @@ -0,0 +1,9 @@ +package foo + +import bar.bar + +class Foo2 { + init { + 42.bar() + } +} \ No newline at end of file diff --git a/idea/testData/refactoring/copy/copyWithImportInsertion/before/bar/Bar.kt b/idea/testData/refactoring/copy/copyWithImportInsertion/before/bar/Bar.kt new file mode 100644 index 00000000000..213ed0b96c7 --- /dev/null +++ b/idea/testData/refactoring/copy/copyWithImportInsertion/before/bar/Bar.kt @@ -0,0 +1,3 @@ +package bar + +fun Any.bar() {} \ No newline at end of file diff --git a/idea/testData/refactoring/copy/copyWithImportInsertion/before/foo/Foo.kt b/idea/testData/refactoring/copy/copyWithImportInsertion/before/foo/Foo.kt new file mode 100644 index 00000000000..dc9dac17444 --- /dev/null +++ b/idea/testData/refactoring/copy/copyWithImportInsertion/before/foo/Foo.kt @@ -0,0 +1,12 @@ +package foo + +import bar.bar + +class Foo { + init { + 42.bar() + } +} + +class Baz { +} diff --git a/idea/testData/refactoring/copy/copyWithImportInsertion/copyWithImportInsertion.test b/idea/testData/refactoring/copy/copyWithImportInsertion/copyWithImportInsertion.test new file mode 100644 index 00000000000..f1eb9731791 --- /dev/null +++ b/idea/testData/refactoring/copy/copyWithImportInsertion/copyWithImportInsertion.test @@ -0,0 +1,5 @@ +{ + "mainFile": "foo/Foo.kt", + "targetPackage": "foo", + "newName": "Foo2" +} diff --git a/idea/tests/org/jetbrains/kotlin/idea/refactoring/copy/CopyTestGenerated.java b/idea/tests/org/jetbrains/kotlin/idea/refactoring/copy/CopyTestGenerated.java index 2c18659e721..778095c8a00 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/refactoring/copy/CopyTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/refactoring/copy/CopyTestGenerated.java @@ -198,6 +198,12 @@ public class CopyTestGenerated extends AbstractCopyTest { doTest(fileName); } + @TestMetadata("copyWithImportInsertion/copyWithImportInsertion.test") + public void testCopyWithImportInsertion_CopyWithImportInsertion() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/refactoring/copy/copyWithImportInsertion/copyWithImportInsertion.test"); + doTest(fileName); + } + @TestMetadata("kt18149/kt18149.test") public void testKt18149_Kt18149() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("idea/testData/refactoring/copy/kt18149/kt18149.test"); From 6e59cc2140f26e52d755067b30b33ced24214514 Mon Sep 17 00:00:00 2001 From: Alexey Sedunov Date: Tue, 19 Sep 2017 19:18:24 +0300 Subject: [PATCH 051/212] Copy: Copy entire file if it contains just a selected declaration --- .../copy/CopyKotlinDeclarationsHandler.kt | 19 +++++++++++++++---- .../copy/copySingleClass/after/bar/A.kt | 7 +++++++ .../copy/copySingleClass/after/foo/A.kt | 7 +++++++ .../copy/copySingleClass/before/foo/A.kt | 7 +++++++ .../copy/copySingleClass/copySingleClass.test | 4 ++++ .../copySingleClassWithRename/after/bar/B.kt | 7 +++++++ .../copySingleClassWithRename/after/foo/A.kt | 7 +++++++ .../copySingleClassWithRename/before/foo/A.kt | 7 +++++++ .../copySingleClassWithRename.test | 5 +++++ .../after/foo/test.kt | 4 ++++ .../before/foo/test.kt | 4 ++++ .../after/foo/test.kt | 4 ++++ .../before/foo/test.kt | 4 ++++ .../refactoring/copy/CopyTestGenerated.java | 12 ++++++++++++ 14 files changed, 94 insertions(+), 4 deletions(-) create mode 100644 idea/testData/refactoring/copy/copySingleClass/after/bar/A.kt create mode 100644 idea/testData/refactoring/copy/copySingleClass/after/foo/A.kt create mode 100644 idea/testData/refactoring/copy/copySingleClass/before/foo/A.kt create mode 100644 idea/testData/refactoring/copy/copySingleClass/copySingleClass.test create mode 100644 idea/testData/refactoring/copy/copySingleClassWithRename/after/bar/B.kt create mode 100644 idea/testData/refactoring/copy/copySingleClassWithRename/after/foo/A.kt create mode 100644 idea/testData/refactoring/copy/copySingleClassWithRename/before/foo/A.kt create mode 100644 idea/testData/refactoring/copy/copySingleClassWithRename/copySingleClassWithRename.test diff --git a/idea/src/org/jetbrains/kotlin/idea/refactoring/copy/CopyKotlinDeclarationsHandler.kt b/idea/src/org/jetbrains/kotlin/idea/refactoring/copy/CopyKotlinDeclarationsHandler.kt index c249282514f..40905768eef 100644 --- a/idea/src/org/jetbrains/kotlin/idea/refactoring/copy/CopyKotlinDeclarationsHandler.kt +++ b/idea/src/org/jetbrains/kotlin/idea/refactoring/copy/CopyKotlinDeclarationsHandler.kt @@ -187,6 +187,8 @@ class CopyKotlinDeclarationsHandler : CopyHandlerDelegateBase() { val originalFile = elementsToCopy.first().containingFile as KtFile val initialTargetDirectory = defaultTargetDirectory ?: originalFile.containingDirectory ?: return + val isSingleDeclarationInFile = singleElementToCopy is KtNamedDeclaration && originalFile.declarations.singleOrNull() == singleElementToCopy + val project = initialTargetDirectory.project val commandName = "Copy Declarations" @@ -249,16 +251,24 @@ class CopyKotlinDeclarationsHandler : CopyHandlerDelegateBase() { val oldToNewElementsMapping = HashMap() + val fileToCopy = when { + singleElementToCopy is KtFile -> singleElementToCopy + isSingleDeclarationInFile -> originalFile + else -> null + } + val targetFile: KtFile - if (singleElementToCopy is KtFile) { + val copiedDeclaration: KtNamedDeclaration? + if (fileToCopy != null) { targetFile = runWriteAction { - val copiedFile = targetDirectory.copyFileFrom(targetFileName, singleElementToCopy) as KtFile - if (singleElementToCopy.packageMatchesDirectory()) { + val copiedFile = targetDirectory.copyFileFrom(targetFileName, fileToCopy) as KtFile + if (fileToCopy.packageMatchesDirectory()) { targetDirectory.getPackage()?.qualifiedName?.let { copiedFile.packageFqName = FqName(it) } } performDelayedRefactoringRequests(project) copiedFile } + copiedDeclaration = if (isSingleDeclarationInFile) targetFile.declarations.singleOrNull() as? KtNamedDeclaration else null } else { targetFile = getOrCreateTargetFile(originalFile, targetDirectory, targetFileName, commandName) ?: return@executeCommand @@ -274,9 +284,10 @@ class CopyKotlinDeclarationsHandler : CopyHandlerDelegateBase() { performDelayedRefactoringRequests(project) } + copiedDeclaration = oldToNewElementsMapping.values.filterIsInstance().singleOrNull() } - (oldToNewElementsMapping.values.filterIsInstance().singleOrNull())?.let { newDeclaration -> + copiedDeclaration?.let { newDeclaration -> if (newName == newDeclaration.name) return@let val selfReferences = ReferencesSearch.search(newDeclaration, LocalSearchScope(newDeclaration)).findAll() runWriteAction { diff --git a/idea/testData/refactoring/copy/copySingleClass/after/bar/A.kt b/idea/testData/refactoring/copy/copySingleClass/after/bar/A.kt new file mode 100644 index 00000000000..39048f89611 --- /dev/null +++ b/idea/testData/refactoring/copy/copySingleClass/after/bar/A.kt @@ -0,0 +1,7 @@ +package bar + +// test + +class A + +// test2 \ No newline at end of file diff --git a/idea/testData/refactoring/copy/copySingleClass/after/foo/A.kt b/idea/testData/refactoring/copy/copySingleClass/after/foo/A.kt new file mode 100644 index 00000000000..94311a5557d --- /dev/null +++ b/idea/testData/refactoring/copy/copySingleClass/after/foo/A.kt @@ -0,0 +1,7 @@ +package foo + +// test + +class A + +// test2 \ No newline at end of file diff --git a/idea/testData/refactoring/copy/copySingleClass/before/foo/A.kt b/idea/testData/refactoring/copy/copySingleClass/before/foo/A.kt new file mode 100644 index 00000000000..c7a0543a544 --- /dev/null +++ b/idea/testData/refactoring/copy/copySingleClass/before/foo/A.kt @@ -0,0 +1,7 @@ +package foo + +// test + +class A + +// test2 \ No newline at end of file diff --git a/idea/testData/refactoring/copy/copySingleClass/copySingleClass.test b/idea/testData/refactoring/copy/copySingleClass/copySingleClass.test new file mode 100644 index 00000000000..7b0c3015980 --- /dev/null +++ b/idea/testData/refactoring/copy/copySingleClass/copySingleClass.test @@ -0,0 +1,4 @@ +{ + "mainFile": "foo/A.kt", + "targetPackage": "bar" +} diff --git a/idea/testData/refactoring/copy/copySingleClassWithRename/after/bar/B.kt b/idea/testData/refactoring/copy/copySingleClassWithRename/after/bar/B.kt new file mode 100644 index 00000000000..ad03099f823 --- /dev/null +++ b/idea/testData/refactoring/copy/copySingleClassWithRename/after/bar/B.kt @@ -0,0 +1,7 @@ +package bar + +// test + +class B + +// test2 \ No newline at end of file diff --git a/idea/testData/refactoring/copy/copySingleClassWithRename/after/foo/A.kt b/idea/testData/refactoring/copy/copySingleClassWithRename/after/foo/A.kt new file mode 100644 index 00000000000..94311a5557d --- /dev/null +++ b/idea/testData/refactoring/copy/copySingleClassWithRename/after/foo/A.kt @@ -0,0 +1,7 @@ +package foo + +// test + +class A + +// test2 \ No newline at end of file diff --git a/idea/testData/refactoring/copy/copySingleClassWithRename/before/foo/A.kt b/idea/testData/refactoring/copy/copySingleClassWithRename/before/foo/A.kt new file mode 100644 index 00000000000..c7a0543a544 --- /dev/null +++ b/idea/testData/refactoring/copy/copySingleClassWithRename/before/foo/A.kt @@ -0,0 +1,7 @@ +package foo + +// test + +class A + +// test2 \ No newline at end of file diff --git a/idea/testData/refactoring/copy/copySingleClassWithRename/copySingleClassWithRename.test b/idea/testData/refactoring/copy/copySingleClassWithRename/copySingleClassWithRename.test new file mode 100644 index 00000000000..2c400988286 --- /dev/null +++ b/idea/testData/refactoring/copy/copySingleClassWithRename/copySingleClassWithRename.test @@ -0,0 +1,5 @@ +{ + "mainFile": "foo/A.kt", + "targetPackage": "bar", + "newName": "B" +} diff --git a/idea/testData/refactoring/copy/refToImportJavaStaticField/after/foo/test.kt b/idea/testData/refactoring/copy/refToImportJavaStaticField/after/foo/test.kt index 4e4fb32b49d..3b791a97bfa 100644 --- a/idea/testData/refactoring/copy/refToImportJavaStaticField/after/foo/test.kt +++ b/idea/testData/refactoring/copy/refToImportJavaStaticField/after/foo/test.kt @@ -5,3 +5,7 @@ import foo.J.JJJ fun test() { val x = JJJ } + +fun dummy() { + +} \ No newline at end of file diff --git a/idea/testData/refactoring/copy/refToImportJavaStaticField/before/foo/test.kt b/idea/testData/refactoring/copy/refToImportJavaStaticField/before/foo/test.kt index cbff5af4098..0759147e69e 100644 --- a/idea/testData/refactoring/copy/refToImportJavaStaticField/before/foo/test.kt +++ b/idea/testData/refactoring/copy/refToImportJavaStaticField/before/foo/test.kt @@ -5,3 +5,7 @@ import foo.J.JJJ fun test() { val x = JJJ } + +fun dummy() { + +} \ No newline at end of file diff --git a/idea/testData/refactoring/copy/refToImportJavaStaticMethod/after/foo/test.kt b/idea/testData/refactoring/copy/refToImportJavaStaticMethod/after/foo/test.kt index 708e4f52db0..8b92b427f04 100644 --- a/idea/testData/refactoring/copy/refToImportJavaStaticMethod/after/foo/test.kt +++ b/idea/testData/refactoring/copy/refToImportJavaStaticMethod/after/foo/test.kt @@ -5,3 +5,7 @@ import foo.J.jjj fun test() { jjj() } + +fun dummy() { + +} \ No newline at end of file diff --git a/idea/testData/refactoring/copy/refToImportJavaStaticMethod/before/foo/test.kt b/idea/testData/refactoring/copy/refToImportJavaStaticMethod/before/foo/test.kt index 5f4bcff8b61..d4562db4a78 100644 --- a/idea/testData/refactoring/copy/refToImportJavaStaticMethod/before/foo/test.kt +++ b/idea/testData/refactoring/copy/refToImportJavaStaticMethod/before/foo/test.kt @@ -5,3 +5,7 @@ import foo.J.jjj fun test() { jjj() } + +fun dummy() { + +} \ No newline at end of file diff --git a/idea/tests/org/jetbrains/kotlin/idea/refactoring/copy/CopyTestGenerated.java b/idea/tests/org/jetbrains/kotlin/idea/refactoring/copy/CopyTestGenerated.java index 778095c8a00..dd94179ebe9 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/refactoring/copy/CopyTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/refactoring/copy/CopyTestGenerated.java @@ -168,12 +168,24 @@ public class CopyTestGenerated extends AbstractCopyTest { doTest(fileName); } + @TestMetadata("copySingleClass/copySingleClass.test") + public void testCopySingleClass_CopySingleClass() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/refactoring/copy/copySingleClass/copySingleClass.test"); + doTest(fileName); + } + @TestMetadata("copySingleClassFile/copySingleClassFile.test") public void testCopySingleClassFile_CopySingleClassFile() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("idea/testData/refactoring/copy/copySingleClassFile/copySingleClassFile.test"); doTest(fileName); } + @TestMetadata("copySingleClassWithRename/copySingleClassWithRename.test") + public void testCopySingleClassWithRename_CopySingleClassWithRename() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/refactoring/copy/copySingleClassWithRename/copySingleClassWithRename.test"); + doTest(fileName); + } + @TestMetadata("copyTopLevelFunction/copyTopLevelFunction.test") public void testCopyTopLevelFunction_CopyTopLevelFunction() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("idea/testData/refactoring/copy/copyTopLevelFunction/copyTopLevelFunction.test"); From e87f9633be2219ba0cb9aec07fb2b437b3089728 Mon Sep 17 00:00:00 2001 From: Alexey Sedunov Date: Tue, 19 Sep 2017 20:22:29 +0300 Subject: [PATCH 052/212] Copy: Do not check conflicts for cross-project copying #KT-19949 Fixed #KT-19972 Fixed #EA-105637 Fixed --- .../idea/refactoring/copy/CopyKotlinDeclarationsHandler.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/idea/src/org/jetbrains/kotlin/idea/refactoring/copy/CopyKotlinDeclarationsHandler.kt b/idea/src/org/jetbrains/kotlin/idea/refactoring/copy/CopyKotlinDeclarationsHandler.kt index 40905768eef..720bf2c3d2c 100644 --- a/idea/src/org/jetbrains/kotlin/idea/refactoring/copy/CopyKotlinDeclarationsHandler.kt +++ b/idea/src/org/jetbrains/kotlin/idea/refactoring/copy/CopyKotlinDeclarationsHandler.kt @@ -313,7 +313,7 @@ class CopyKotlinDeclarationsHandler : CopyHandlerDelegateBase() { if (!(isUnitTestMode && BaseRefactoringProcessor.ConflictsInTestsException.isTestIgnore())) { val targetSourceRootPsi = targetSourceRoot?.toPsiDirectory(project) - if (targetSourceRootPsi != null) { + if (targetSourceRootPsi != null && project == originalFile.project) { val conflictChecker = MoveConflictChecker( project, elementsToCopy, From 8b135c12e7465fe7316fc885020bb14dfec91a37 Mon Sep 17 00:00:00 2001 From: Toshiaki Kameyama Date: Wed, 13 Sep 2017 09:55:39 +0300 Subject: [PATCH 053/212] Delete useless assert() after simplify comparison #KT-14695 Fixed --- .../SimplifyBooleanWithConstantsIntention.kt | 15 ++++++++++++++- .../idea/quickfix/SimplifyComparisonFix.kt | 11 +++++++---- .../simplifyBooleanWithConstants/assert.kt | 5 +++++ .../assert.kt.after | 4 ++++ .../simplifyComparison/withAssertion.kt | 6 ++++++ .../simplifyComparison/withAssertion.kt.after | 5 +++++ .../simplifyComparison/withAssertion2.kt | 6 ++++++ .../simplifyComparison/withAssertion2.kt.after | 5 +++++ .../simplifyComparison/withAssertion3.kt | 6 ++++++ .../simplifyComparison/withAssertion3.kt.after | 6 ++++++ .../intentions/IntentionTestGenerated.java | 6 ++++++ .../idea/quickfix/QuickFixTestGenerated.java | 18 ++++++++++++++++++ 12 files changed, 88 insertions(+), 5 deletions(-) create mode 100644 idea/testData/intentions/simplifyBooleanWithConstants/assert.kt create mode 100644 idea/testData/intentions/simplifyBooleanWithConstants/assert.kt.after create mode 100644 idea/testData/quickfix/simplifyComparison/withAssertion.kt create mode 100644 idea/testData/quickfix/simplifyComparison/withAssertion.kt.after create mode 100644 idea/testData/quickfix/simplifyComparison/withAssertion2.kt create mode 100644 idea/testData/quickfix/simplifyComparison/withAssertion2.kt.after create mode 100644 idea/testData/quickfix/simplifyComparison/withAssertion3.kt create mode 100644 idea/testData/quickfix/simplifyComparison/withAssertion3.kt.after diff --git a/idea/src/org/jetbrains/kotlin/idea/intentions/SimplifyBooleanWithConstantsIntention.kt b/idea/src/org/jetbrains/kotlin/idea/intentions/SimplifyBooleanWithConstantsIntention.kt index d6094aff21f..27c020d4cc2 100644 --- a/idea/src/org/jetbrains/kotlin/idea/intentions/SimplifyBooleanWithConstantsIntention.kt +++ b/idea/src/org/jetbrains/kotlin/idea/intentions/SimplifyBooleanWithConstantsIntention.kt @@ -24,10 +24,13 @@ import org.jetbrains.kotlin.idea.caches.resolve.analyze import org.jetbrains.kotlin.idea.core.copied import org.jetbrains.kotlin.idea.core.replaced import org.jetbrains.kotlin.idea.inspections.IntentionBasedInspection +import org.jetbrains.kotlin.idea.intentions.loopToCallChain.isTrueConstant import org.jetbrains.kotlin.lexer.KtTokens.* import org.jetbrains.kotlin.psi.* +import org.jetbrains.kotlin.psi.psiUtil.getNonStrictParentOfType import org.jetbrains.kotlin.resolve.CompileTimeConstantUtils import org.jetbrains.kotlin.resolve.calls.callUtil.getType +import org.jetbrains.kotlin.resolve.descriptorUtil.fqNameOrNull import org.jetbrains.kotlin.types.isFlexible class SimplifyBooleanWithConstantsInspection : IntentionBasedInspection(SimplifyBooleanWithConstantsIntention::class) @@ -58,7 +61,17 @@ class SimplifyBooleanWithConstantsIntention : SelfTargetingOffsetIndependentInte override fun applyTo(element: KtBinaryExpression, editor: Editor?) { val topBinary = PsiTreeUtil.getTopmostParentOfType(element, KtBinaryExpression::class.java) ?: element val simplified = toSimplifiedExpression(topBinary) - topBinary.replace(KtPsiUtil.safeDeparenthesize(simplified, true)) + val result = topBinary.replaced(KtPsiUtil.safeDeparenthesize(simplified, true)) + removeRedundantAssertion(result) + } + + internal fun removeRedundantAssertion(expression: KtExpression) { + val callExpression = expression.getNonStrictParentOfType() ?: return + val fqName = callExpression.getCallableDescriptor()?.fqNameOrNull() + val valueArguments = callExpression.valueArguments + val isRedundant = fqName?.asString() == "kotlin.assert" && + valueArguments.singleOrNull()?.getArgumentExpression().isTrueConstant() + if (isRedundant) callExpression.delete() } private fun toSimplifiedExpression(expression: KtExpression): KtExpression { diff --git a/idea/src/org/jetbrains/kotlin/idea/quickfix/SimplifyComparisonFix.kt b/idea/src/org/jetbrains/kotlin/idea/quickfix/SimplifyComparisonFix.kt index 84de5c4e90c..48d715e5b19 100644 --- a/idea/src/org/jetbrains/kotlin/idea/quickfix/SimplifyComparisonFix.kt +++ b/idea/src/org/jetbrains/kotlin/idea/quickfix/SimplifyComparisonFix.kt @@ -21,6 +21,7 @@ import com.intellij.openapi.editor.Editor import com.intellij.openapi.project.Project import org.jetbrains.kotlin.diagnostics.Diagnostic import org.jetbrains.kotlin.diagnostics.DiagnosticWithParameters2 +import org.jetbrains.kotlin.idea.core.replaced import org.jetbrains.kotlin.idea.intentions.SimplifyBooleanWithConstantsIntention import org.jetbrains.kotlin.psi.KtBinaryExpression import org.jetbrains.kotlin.psi.KtExpression @@ -35,15 +36,17 @@ class SimplifyComparisonFix(element: KtExpression, val value: Boolean) : KotlinQ override fun invoke(project: Project, editor: Editor?, file: KtFile) { val element = element ?: return - val parent = element.parent val replacement = KtPsiFactory(element).createExpression("$value") - element.replace(replacement) + val result = element.replaced(replacement) - val booleanExpression = parent.getNonStrictParentOfType() ?: return + val booleanExpression = result.getNonStrictParentOfType() val simplifyIntention = SimplifyBooleanWithConstantsIntention() - if (simplifyIntention.isApplicableTo(booleanExpression)) { + if (booleanExpression != null && simplifyIntention.isApplicableTo(booleanExpression)) { simplifyIntention.applyTo(booleanExpression, editor) } + else { + simplifyIntention.removeRedundantAssertion(result) + } } companion object : KotlinSingleIntentionActionFactory() { diff --git a/idea/testData/intentions/simplifyBooleanWithConstants/assert.kt b/idea/testData/intentions/simplifyBooleanWithConstants/assert.kt new file mode 100644 index 00000000000..6d484a39085 --- /dev/null +++ b/idea/testData/intentions/simplifyBooleanWithConstants/assert.kt @@ -0,0 +1,5 @@ +// WITH_RUNTIME + +fun foo() { + assert(true || false) +} \ No newline at end of file diff --git a/idea/testData/intentions/simplifyBooleanWithConstants/assert.kt.after b/idea/testData/intentions/simplifyBooleanWithConstants/assert.kt.after new file mode 100644 index 00000000000..f6a597af433 --- /dev/null +++ b/idea/testData/intentions/simplifyBooleanWithConstants/assert.kt.after @@ -0,0 +1,4 @@ +// WITH_RUNTIME + +fun foo() { +} \ No newline at end of file diff --git a/idea/testData/quickfix/simplifyComparison/withAssertion.kt b/idea/testData/quickfix/simplifyComparison/withAssertion.kt new file mode 100644 index 00000000000..6ec41956ba2 --- /dev/null +++ b/idea/testData/quickfix/simplifyComparison/withAssertion.kt @@ -0,0 +1,6 @@ +// "Simplify comparison" "true" +// WITH_RUNTIME +fun test() { + val s = "" + assert(s != null) +} \ No newline at end of file diff --git a/idea/testData/quickfix/simplifyComparison/withAssertion.kt.after b/idea/testData/quickfix/simplifyComparison/withAssertion.kt.after new file mode 100644 index 00000000000..0e80094993f --- /dev/null +++ b/idea/testData/quickfix/simplifyComparison/withAssertion.kt.after @@ -0,0 +1,5 @@ +// "Simplify comparison" "true" +// WITH_RUNTIME +fun test() { + val s = "" +} \ No newline at end of file diff --git a/idea/testData/quickfix/simplifyComparison/withAssertion2.kt b/idea/testData/quickfix/simplifyComparison/withAssertion2.kt new file mode 100644 index 00000000000..223bba2b635 --- /dev/null +++ b/idea/testData/quickfix/simplifyComparison/withAssertion2.kt @@ -0,0 +1,6 @@ +// "Simplify comparison" "true" +// WITH_RUNTIME +fun test() { + val s = "" + assert(s != null && true) +} \ No newline at end of file diff --git a/idea/testData/quickfix/simplifyComparison/withAssertion2.kt.after b/idea/testData/quickfix/simplifyComparison/withAssertion2.kt.after new file mode 100644 index 00000000000..0e80094993f --- /dev/null +++ b/idea/testData/quickfix/simplifyComparison/withAssertion2.kt.after @@ -0,0 +1,5 @@ +// "Simplify comparison" "true" +// WITH_RUNTIME +fun test() { + val s = "" +} \ No newline at end of file diff --git a/idea/testData/quickfix/simplifyComparison/withAssertion3.kt b/idea/testData/quickfix/simplifyComparison/withAssertion3.kt new file mode 100644 index 00000000000..ac670bad4ab --- /dev/null +++ b/idea/testData/quickfix/simplifyComparison/withAssertion3.kt @@ -0,0 +1,6 @@ +// "Simplify comparison" "true" +// WITH_RUNTIME +fun test() { + val s = "" + assert(s != null && false) +} \ No newline at end of file diff --git a/idea/testData/quickfix/simplifyComparison/withAssertion3.kt.after b/idea/testData/quickfix/simplifyComparison/withAssertion3.kt.after new file mode 100644 index 00000000000..56a488d9a11 --- /dev/null +++ b/idea/testData/quickfix/simplifyComparison/withAssertion3.kt.after @@ -0,0 +1,6 @@ +// "Simplify comparison" "true" +// WITH_RUNTIME +fun test() { + val s = "" + assert(false) +} \ No newline at end of file diff --git a/idea/tests/org/jetbrains/kotlin/idea/intentions/IntentionTestGenerated.java b/idea/tests/org/jetbrains/kotlin/idea/intentions/IntentionTestGenerated.java index 904ea194c6a..f004cf2f427 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/intentions/IntentionTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/intentions/IntentionTestGenerated.java @@ -14681,6 +14681,12 @@ public class IntentionTestGenerated extends AbstractIntentionTest { KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("idea/testData/intentions/simplifyBooleanWithConstants"), Pattern.compile("^([\\w\\-_]+)\\.kt$"), TargetBackend.ANY, true); } + @TestMetadata("assert.kt") + public void testAssert() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/intentions/simplifyBooleanWithConstants/assert.kt"); + doTest(fileName); + } + @TestMetadata("deeplyParenthesized.kt") public void testDeeplyParenthesized() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("idea/testData/intentions/simplifyBooleanWithConstants/deeplyParenthesized.kt"); diff --git a/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java b/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java index 2af928600ae..af726b8a80b 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java @@ -9529,6 +9529,24 @@ public class QuickFixTestGenerated extends AbstractQuickFixTest { String fileName = KotlinTestUtils.navigationMetadata("idea/testData/quickfix/simplifyComparison/somethingAndNotNull.kt"); doTest(fileName); } + + @TestMetadata("withAssertion.kt") + public void testWithAssertion() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/quickfix/simplifyComparison/withAssertion.kt"); + doTest(fileName); + } + + @TestMetadata("withAssertion2.kt") + public void testWithAssertion2() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/quickfix/simplifyComparison/withAssertion2.kt"); + doTest(fileName); + } + + @TestMetadata("withAssertion3.kt") + public void testWithAssertion3() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/quickfix/simplifyComparison/withAssertion3.kt"); + doTest(fileName); + } } @TestMetadata("idea/testData/quickfix/specifyOverrideExplicitly") From 32531b3afc6b5116572f9dc2407fd513ef70343f Mon Sep 17 00:00:00 2001 From: Mikhail Zarechenskiy Date: Fri, 15 Sep 2017 10:49:33 +0300 Subject: [PATCH 054/212] Allow to have all parameters with default values in `actual` annotation #KT-19656 In Progress --- .../ExpectedActualDeclarationChecker.kt | 27 ++++++- ...thDefaultValuesInAnnotationViaTypealias.kt | 33 +++++++++ ...hDefaultValuesInAnnotationViaTypealias.txt | 70 +++++++++++++++++++ .../checkers/DiagnosticsTestGenerated.java | 6 ++ .../DiagnosticsUsingJavacTestGenerated.java | 6 ++ 5 files changed, 139 insertions(+), 3 deletions(-) create mode 100644 compiler/testData/diagnostics/tests/multiplatform/headerClass/actualClassWithDefaultValuesInAnnotationViaTypealias.kt create mode 100644 compiler/testData/diagnostics/tests/multiplatform/headerClass/actualClassWithDefaultValuesInAnnotationViaTypealias.txt diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/checkers/ExpectedActualDeclarationChecker.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/checkers/ExpectedActualDeclarationChecker.kt index 94c7c958e2e..35d78e8147a 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/checkers/ExpectedActualDeclarationChecker.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/checkers/ExpectedActualDeclarationChecker.kt @@ -1,5 +1,5 @@ /* - * Copyright 2010-2016 JetBrains s.r.o. + * Copyright 2010-2017 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. @@ -131,7 +131,9 @@ object ExpectedActualDeclarationChecker : DeclarationChecker { if (!hasExpectedModifier) { if (Compatible !in compatibility) return - if (checkExpected) { + // we suppress error, because annotation classes can only have one constructor and it's a 100% boilerplate + // to require every annotation constructor with additional parameters with default values be marked with the `actual` modifier + if (checkExpected && !descriptor.isAnnotationConstructor()) { diagnosticHolder.report(Errors.ACTUAL_MISSING.on(reportOn)) } } @@ -362,7 +364,9 @@ object ExpectedActualDeclarationChecker : DeclarationChecker { val aParams = a.valueParameters val bParams = b.valueParameters - if (aParams.size != bParams.size) return Incompatible.ParameterCount + if (!valueParametersCountCompatible(a, b, aParams, bParams)) { + return Incompatible.ParameterCount + } val aTypeParams = a.typeParameters val bTypeParams = b.typeParameters @@ -401,6 +405,23 @@ object ExpectedActualDeclarationChecker : DeclarationChecker { return Compatible } + private fun valueParametersCountCompatible( + a: CallableMemberDescriptor, + b: CallableMemberDescriptor, + aParams: List, + bParams: List + ): Boolean { + if (aParams.size == bParams.size) return true + + return if (a.isAnnotationConstructor() && b.isAnnotationConstructor()) + aParams.isEmpty() && bParams.all { it.declaresDefaultValue() } + else + false + } + + private fun MemberDescriptor.isAnnotationConstructor(): Boolean = + this is ConstructorDescriptor && DescriptorUtils.isAnnotationClass(this.constructedClass) + private fun areCompatibleTypes(a: KotlinType?, b: KotlinType?, platformModule: ModuleDescriptor): Boolean { if (a == null) return b == null if (b == null) return false diff --git a/compiler/testData/diagnostics/tests/multiplatform/headerClass/actualClassWithDefaultValuesInAnnotationViaTypealias.kt b/compiler/testData/diagnostics/tests/multiplatform/headerClass/actualClassWithDefaultValuesInAnnotationViaTypealias.kt new file mode 100644 index 00000000000..5d861a8e0fa --- /dev/null +++ b/compiler/testData/diagnostics/tests/multiplatform/headerClass/actualClassWithDefaultValuesInAnnotationViaTypealias.kt @@ -0,0 +1,33 @@ +// !LANGUAGE: +MultiPlatformProjects +// MODULE: m1-common +// FILE: common.kt + +expect annotation class Foo1 +expect annotation class Foo2 +expect annotation class Foo3 +expect annotation class Foo4 + +// MODULE: m2-jvm(m1-common) + +// FILE: Bar1.java + +public @interface Bar1 { + String value() default ""; +} + +// FILE: Bar2.java + +public @interface Bar2 { + String value() default ""; + String path(); +} + +// FILE: jvm.kt + +actual typealias Foo1 = Bar1 + +actual typealias Foo4 = Bar2 + +actual annotation class Foo2(val p: String = "default") + +actual annotation class Foo3(val a: String = "a", val b: String = "b") \ No newline at end of file diff --git a/compiler/testData/diagnostics/tests/multiplatform/headerClass/actualClassWithDefaultValuesInAnnotationViaTypealias.txt b/compiler/testData/diagnostics/tests/multiplatform/headerClass/actualClassWithDefaultValuesInAnnotationViaTypealias.txt new file mode 100644 index 00000000000..048ecc935f6 --- /dev/null +++ b/compiler/testData/diagnostics/tests/multiplatform/headerClass/actualClassWithDefaultValuesInAnnotationViaTypealias.txt @@ -0,0 +1,70 @@ +// -- Module: -- +package + +public final expect annotation class Foo1 : kotlin.Annotation { + public constructor Foo1() + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String +} + +public final expect annotation class Foo2 : kotlin.Annotation { + public constructor Foo2() + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String +} + +public final expect annotation class Foo3 : kotlin.Annotation { + public constructor Foo3() + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String +} + +public final expect annotation class Foo4 : kotlin.Annotation { + public constructor Foo4() + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String +} + + +// -- Module: -- +package + +public final annotation class Bar1 : kotlin.Annotation { + public constructor Bar1(/*0*/ value: kotlin.String = ...) + public final val value: kotlin.String + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String +} + +public final annotation class Bar2 : kotlin.Annotation { + public constructor Bar2(/*0*/ value: kotlin.String = ..., /*1*/ path: kotlin.String) + public final val path: kotlin.String + public final val value: kotlin.String + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String +} + +public final actual annotation class Foo2 : kotlin.Annotation { + public constructor Foo2(/*0*/ p: kotlin.String = ...) + public final val p: kotlin.String + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String +} + +public final actual annotation class Foo3 : kotlin.Annotation { + public constructor Foo3(/*0*/ a: kotlin.String = ..., /*1*/ b: kotlin.String = ...) + public final val a: kotlin.String + public final val b: kotlin.String + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String +} +public typealias Foo1 = Bar1 +public typealias Foo4 = Bar2 diff --git a/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestGenerated.java index 1608d4ac503..c85c0289ea4 100644 --- a/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestGenerated.java @@ -13934,6 +13934,12 @@ public class DiagnosticsTestGenerated extends AbstractDiagnosticsTest { @TestDataPath("$PROJECT_ROOT") @RunWith(JUnit3RunnerWithInners.class) public static class HeaderClass extends AbstractDiagnosticsTest { + @TestMetadata("actualClassWithDefaultValuesInAnnotationViaTypealias.kt") + public void testActualClassWithDefaultValuesInAnnotationViaTypealias() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/multiplatform/headerClass/actualClassWithDefaultValuesInAnnotationViaTypealias.kt"); + doTest(fileName); + } + @TestMetadata("actualMissing.kt") public void testActualMissing() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/multiplatform/headerClass/actualMissing.kt"); diff --git a/compiler/tests/org/jetbrains/kotlin/checkers/javac/DiagnosticsUsingJavacTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/checkers/javac/DiagnosticsUsingJavacTestGenerated.java index 3c8ca920e7a..77099caf3b9 100644 --- a/compiler/tests/org/jetbrains/kotlin/checkers/javac/DiagnosticsUsingJavacTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/checkers/javac/DiagnosticsUsingJavacTestGenerated.java @@ -13934,6 +13934,12 @@ public class DiagnosticsUsingJavacTestGenerated extends AbstractDiagnosticsUsing @TestDataPath("$PROJECT_ROOT") @RunWith(JUnit3RunnerWithInners.class) public static class HeaderClass extends AbstractDiagnosticsUsingJavacTest { + @TestMetadata("actualClassWithDefaultValuesInAnnotationViaTypealias.kt") + public void testActualClassWithDefaultValuesInAnnotationViaTypealias() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/multiplatform/headerClass/actualClassWithDefaultValuesInAnnotationViaTypealias.kt"); + doTest(fileName); + } + @TestMetadata("actualMissing.kt") public void testActualMissing() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/multiplatform/headerClass/actualMissing.kt"); From 253ae10e5fda11a34f8bdf3a70237a7ae67d1ec1 Mon Sep 17 00:00:00 2001 From: Mikhail Glukhikh Date: Mon, 25 Sep 2017 16:27:51 +0300 Subject: [PATCH 055/212] Array equality: replace Arrays.equals with contentEquals in intention --- ...placeArrayEqualityOpWithArraysEqualsIntention.kt | 13 +++---------- .../arrayEQEQ.kt | 2 +- .../arrayEQEQ.kt.after | 6 ++---- .../arrayEXCLEQ.kt | 2 +- .../arrayEXCLEQ.kt.after | 6 ++---- .../primitiveArrayEQEQ.kt | 2 +- .../primitiveArrayEQEQ.kt.after | 6 ++---- 7 files changed, 12 insertions(+), 25 deletions(-) diff --git a/idea/src/org/jetbrains/kotlin/idea/intentions/ReplaceArrayEqualityOpWithArraysEqualsIntention.kt b/idea/src/org/jetbrains/kotlin/idea/intentions/ReplaceArrayEqualityOpWithArraysEqualsIntention.kt index 92ee272b2d0..bb2c68f46c7 100644 --- a/idea/src/org/jetbrains/kotlin/idea/intentions/ReplaceArrayEqualityOpWithArraysEqualsIntention.kt +++ b/idea/src/org/jetbrains/kotlin/idea/intentions/ReplaceArrayEqualityOpWithArraysEqualsIntention.kt @@ -18,11 +18,8 @@ package org.jetbrains.kotlin.idea.intentions import com.intellij.openapi.editor.Editor import org.jetbrains.kotlin.idea.caches.resolve.analyze -import org.jetbrains.kotlin.idea.caches.resolve.resolveImportReference import org.jetbrains.kotlin.idea.inspections.IntentionBasedInspection -import org.jetbrains.kotlin.idea.util.ImportInsertHelper import org.jetbrains.kotlin.lexer.KtTokens -import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.psi.KtBinaryExpression import org.jetbrains.kotlin.psi.KtPsiFactory import org.jetbrains.kotlin.psi.createExpressionByPattern @@ -33,7 +30,7 @@ class ReplaceArrayEqualityOpWithArraysEqualsInspection : class ReplaceArrayEqualityOpWithArraysEqualsIntention : SelfTargetingOffsetIndependentIntention( KtBinaryExpression::class.java, - "Replace '==' with 'Arrays.equals'" + "Replace '==' with 'contentEquals'" ) { override fun applyTo(element: KtBinaryExpression, editor: Editor?) { @@ -41,13 +38,9 @@ class ReplaceArrayEqualityOpWithArraysEqualsIntention : SelfTargetingOffsetIndep val right = element.right ?: return val left = element.left ?: return val factory = KtPsiFactory(project) - val ktFile = element.containingKtFile - ktFile.resolveImportReference(FqName("java.util.Arrays")).firstOrNull()?.let { - ImportInsertHelper.getInstance(project).importDescriptor(ktFile, it) - } val template = buildString { if (element.operationToken == KtTokens.EXCLEQ) append("!") - append("Arrays.equals($0, $1)") + append("$0.contentEquals($1)") } val expression = factory.createExpressionByPattern(template, left, right) element.replace(expression) @@ -56,7 +49,7 @@ class ReplaceArrayEqualityOpWithArraysEqualsIntention : SelfTargetingOffsetIndep override fun isApplicableTo(element: KtBinaryExpression): Boolean { val operationToken = element.operationToken if (operationToken != KtTokens.EQEQ && operationToken != KtTokens.EXCLEQ) return false - if (operationToken == KtTokens.EXCLEQ) text = "Replace '!=' with 'Arrays.equals'" + if (operationToken == KtTokens.EXCLEQ) text = "Replace '!=' with 'contentEquals'" val right = element.right ?: return false val left = element.left ?: return false val rightResolvedCall = right.getResolvedCall(right.analyze()) ?: return false diff --git a/idea/testData/intentions/replaceArrayEqualityOpWithArraysEquals/arrayEQEQ.kt b/idea/testData/intentions/replaceArrayEqualityOpWithArraysEquals/arrayEQEQ.kt index 8bec0b11c05..62ad7d293b1 100644 --- a/idea/testData/intentions/replaceArrayEqualityOpWithArraysEquals/arrayEQEQ.kt +++ b/idea/testData/intentions/replaceArrayEqualityOpWithArraysEquals/arrayEQEQ.kt @@ -1,5 +1,5 @@ // WITH_RUNTIME -// INTENTION_TEXT: Replace '==' with 'Arrays.equals' +// INTENTION_TEXT: Replace '==' with 'contentEquals' fun foo() { val a = arrayOf("a", "b", "c") val b = arrayOf("a", "b", "c") diff --git a/idea/testData/intentions/replaceArrayEqualityOpWithArraysEquals/arrayEQEQ.kt.after b/idea/testData/intentions/replaceArrayEqualityOpWithArraysEquals/arrayEQEQ.kt.after index 106dec0a540..336db699b6c 100644 --- a/idea/testData/intentions/replaceArrayEqualityOpWithArraysEquals/arrayEQEQ.kt.after +++ b/idea/testData/intentions/replaceArrayEqualityOpWithArraysEquals/arrayEQEQ.kt.after @@ -1,10 +1,8 @@ -import java.util.Arrays - // WITH_RUNTIME -// INTENTION_TEXT: Replace '==' with 'Arrays.equals' +// INTENTION_TEXT: Replace '==' with 'contentEquals' fun foo() { val a = arrayOf("a", "b", "c") val b = arrayOf("a", "b", "c") - if (Arrays.equals(a, b)) { + if (a.contentEquals(b)) { } } diff --git a/idea/testData/intentions/replaceArrayEqualityOpWithArraysEquals/arrayEXCLEQ.kt b/idea/testData/intentions/replaceArrayEqualityOpWithArraysEquals/arrayEXCLEQ.kt index 945cee99ba2..3f58434033d 100644 --- a/idea/testData/intentions/replaceArrayEqualityOpWithArraysEquals/arrayEXCLEQ.kt +++ b/idea/testData/intentions/replaceArrayEqualityOpWithArraysEquals/arrayEXCLEQ.kt @@ -1,5 +1,5 @@ // WITH_RUNTIME -// INTENTION_TEXT: Replace '!=' with 'Arrays.equals' +// INTENTION_TEXT: Replace '!=' with 'contentEquals' fun foo() { val a = arrayOf("a", "b", "c") val b = arrayOf("a", "b", "c") diff --git a/idea/testData/intentions/replaceArrayEqualityOpWithArraysEquals/arrayEXCLEQ.kt.after b/idea/testData/intentions/replaceArrayEqualityOpWithArraysEquals/arrayEXCLEQ.kt.after index 3436155d9d3..0b53d65dbec 100644 --- a/idea/testData/intentions/replaceArrayEqualityOpWithArraysEquals/arrayEXCLEQ.kt.after +++ b/idea/testData/intentions/replaceArrayEqualityOpWithArraysEquals/arrayEXCLEQ.kt.after @@ -1,10 +1,8 @@ -import java.util.Arrays - // WITH_RUNTIME -// INTENTION_TEXT: Replace '!=' with 'Arrays.equals' +// INTENTION_TEXT: Replace '!=' with 'contentEquals' fun foo() { val a = arrayOf("a", "b", "c") val b = arrayOf("a", "b", "c") - if (!Arrays.equals(a, b)) { + if (!a.contentEquals(b)) { } } diff --git a/idea/testData/intentions/replaceArrayEqualityOpWithArraysEquals/primitiveArrayEQEQ.kt b/idea/testData/intentions/replaceArrayEqualityOpWithArraysEquals/primitiveArrayEQEQ.kt index ca7b072ad07..6556b587a6a 100644 --- a/idea/testData/intentions/replaceArrayEqualityOpWithArraysEquals/primitiveArrayEQEQ.kt +++ b/idea/testData/intentions/replaceArrayEqualityOpWithArraysEquals/primitiveArrayEQEQ.kt @@ -1,5 +1,5 @@ // WITH_RUNTIME -// INTENTION_TEXT: Replace '==' with 'Arrays.equals' +// INTENTION_TEXT: Replace '==' with 'contentEquals' fun foo() { val a = charArrayOf('a', 'b', 'c') val b = charArrayOf('a', 'b', 'c') diff --git a/idea/testData/intentions/replaceArrayEqualityOpWithArraysEquals/primitiveArrayEQEQ.kt.after b/idea/testData/intentions/replaceArrayEqualityOpWithArraysEquals/primitiveArrayEQEQ.kt.after index 920bfb782a9..8471bf494e8 100644 --- a/idea/testData/intentions/replaceArrayEqualityOpWithArraysEquals/primitiveArrayEQEQ.kt.after +++ b/idea/testData/intentions/replaceArrayEqualityOpWithArraysEquals/primitiveArrayEQEQ.kt.after @@ -1,10 +1,8 @@ -import java.util.Arrays - // WITH_RUNTIME -// INTENTION_TEXT: Replace '==' with 'Arrays.equals' +// INTENTION_TEXT: Replace '==' with 'contentEquals' fun foo() { val a = charArrayOf('a', 'b', 'c') val b = charArrayOf('a', 'b', 'c') - if (Arrays.equals(a, b)) { + if (a.contentEquals(b)) { } } From e82544ffb0d4df2a20b0f716b36ddb72b0f1a337 Mon Sep 17 00:00:00 2001 From: Kirill Rakhman Date: Sun, 24 Sep 2017 02:21:26 +0300 Subject: [PATCH 056/212] build.gradle.kts: replace listOf().filterNotNull() with listOfNotNull() --- build.gradle.kts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/build.gradle.kts b/build.gradle.kts index 920d9dd71df..3186aed8c65 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -6,11 +6,11 @@ import org.jetbrains.kotlin.gradle.tasks.KotlinCompile import org.jetbrains.kotlin.gradle.tasks.Kotlin2JsCompile buildscript { - val repos = listOf( + val repos = listOfNotNull( System.getProperty("bootstrap.kotlin.repo"), "https://repo.gradle.org/gradle/repo", "https://plugins.gradle.org/m2", - "http://repository.jetbrains.com/utils/").filterNotNull() + "http://repository.jetbrains.com/utils/") extra["bootstrapKotlinVersion"] = bootstrapKotlinVersion From 8f9ea3e08bbdf894fb1c52508910a4fd427b9d28 Mon Sep 17 00:00:00 2001 From: Dmitry Petrov Date: Mon, 25 Sep 2017 11:51:47 +0300 Subject: [PATCH 057/212] Fix const range bounds generation --- .../jetbrains/kotlin/codegen/StackValue.java | 13 +++++++ .../ForInUntilConstantRangeLoopGenerator.kt | 4 +- .../forInRangeLiteralWithMixedTypeBounds.kt | 39 +++++++++++++++++++ .../ir/IrBlackBoxCodegenTestGenerated.java | 6 +++ .../codegen/BlackBoxCodegenTestGenerated.java | 6 +++ .../LightAnalysisModeTestGenerated.java | 6 +++ .../semantics/JsCodegenBoxTestGenerated.java | 6 +++ 7 files changed, 77 insertions(+), 3 deletions(-) create mode 100644 compiler/testData/codegen/box/ranges/forInRangeLiteralWithMixedTypeBounds.kt diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/StackValue.java b/compiler/backend/src/org/jetbrains/kotlin/codegen/StackValue.java index cf8f4a5a6da..7fbb9ed385c 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/StackValue.java +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/StackValue.java @@ -179,6 +179,19 @@ public abstract class StackValue { return type == Type.VOID_TYPE ? none() : new OnStack(type); } + @NotNull + public static StackValue integerConstant(int value, @NotNull Type type) { + if (type == Type.LONG_TYPE) { + return constant(Long.valueOf(value), type); + } + else if (type == Type.BYTE_TYPE || type == Type.SHORT_TYPE || type == Type.INT_TYPE) { + return constant(Integer.valueOf(value), type); + } + else { + throw new AssertionError("Unexpected integer type: " + type); + } + } + @NotNull public static StackValue constant(@Nullable Object value, @NotNull Type type) { if (type == Type.BOOLEAN_TYPE) { diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/range/forLoop/ForInUntilConstantRangeLoopGenerator.kt b/compiler/backend/src/org/jetbrains/kotlin/codegen/range/forLoop/ForInUntilConstantRangeLoopGenerator.kt index 37d870157bb..23872324fee 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/range/forLoop/ForInUntilConstantRangeLoopGenerator.kt +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/range/forLoop/ForInUntilConstantRangeLoopGenerator.kt @@ -18,10 +18,8 @@ package org.jetbrains.kotlin.codegen.range.forLoop import org.jetbrains.kotlin.codegen.ExpressionCodegen import org.jetbrains.kotlin.codegen.StackValue -import org.jetbrains.kotlin.psi.KtExpression import org.jetbrains.kotlin.psi.KtForExpression import org.jetbrains.kotlin.resolve.calls.model.ResolvedCall -import org.jetbrains.kotlin.resolve.constants.* import org.jetbrains.kotlin.resolve.scopes.receivers.ReceiverValue class ForInUntilConstantRangeLoopGenerator( @@ -36,5 +34,5 @@ class ForInUntilConstantRangeLoopGenerator( codegen.generateReceiverValue(from, false) override fun generateTo(): StackValue = - StackValue.constant(untilValue, asmElementType) + StackValue.integerConstant(untilValue, asmElementType) } \ No newline at end of file diff --git a/compiler/testData/codegen/box/ranges/forInRangeLiteralWithMixedTypeBounds.kt b/compiler/testData/codegen/box/ranges/forInRangeLiteralWithMixedTypeBounds.kt new file mode 100644 index 00000000000..0fdbe711937 --- /dev/null +++ b/compiler/testData/codegen/box/ranges/forInRangeLiteralWithMixedTypeBounds.kt @@ -0,0 +1,39 @@ +fun test1(): Long { + var s = 0L + for (i in 1L..4) { + s = s * 10 + i + } + return s +} + +fun test2(): Long { + var s = 0L + for (i in 1L..4.toShort()) { + s = s * 10 + i + } + return s +} + +fun testLI(a: Long, b: Int): Long { + var s = 0L + for (i in a..b) { + s = s * 10 + i + } + return s +} + +fun testLS(a: Long, b: Short): Long { + var s = 0L + for (i in a..b) { + s = s * 10 + i + } + return s +} + +fun box(): String { + if (test1() != 1234L) return "Fail 1" + if (test2() != 1234L) return "Fail 1" + if (testLI(1L, 4) != 1234L) return "Fail 2" + if (testLS(1L, 4.toShort()) != 1234L) return "Fail 2" + return "OK" +} \ No newline at end of file diff --git a/compiler/tests-ir-jvm/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java b/compiler/tests-ir-jvm/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java index 0607d17ad88..91a730010b4 100644 --- a/compiler/tests-ir-jvm/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java +++ b/compiler/tests-ir-jvm/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java @@ -13739,6 +13739,12 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes doTest(fileName); } + @TestMetadata("forInRangeLiteralWithMixedTypeBounds.kt") + public void testForInRangeLiteralWithMixedTypeBounds() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/ranges/forInRangeLiteralWithMixedTypeBounds.kt"); + doTest(fileName); + } + @TestMetadata("forInRangeToConstWithOverflow.kt") public void testForInRangeToConstWithOverflow() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/ranges/forInRangeToConstWithOverflow.kt"); diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java index 70dbdb452b6..d893bfb2768 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java @@ -13739,6 +13739,12 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest { doTest(fileName); } + @TestMetadata("forInRangeLiteralWithMixedTypeBounds.kt") + public void testForInRangeLiteralWithMixedTypeBounds() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/ranges/forInRangeLiteralWithMixedTypeBounds.kt"); + doTest(fileName); + } + @TestMetadata("forInRangeToConstWithOverflow.kt") public void testForInRangeToConstWithOverflow() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/ranges/forInRangeToConstWithOverflow.kt"); diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java index fdbc08cca65..5fff2fbb6f4 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java @@ -13739,6 +13739,12 @@ public class LightAnalysisModeTestGenerated extends AbstractLightAnalysisModeTes doTest(fileName); } + @TestMetadata("forInRangeLiteralWithMixedTypeBounds.kt") + public void testForInRangeLiteralWithMixedTypeBounds() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/ranges/forInRangeLiteralWithMixedTypeBounds.kt"); + doTest(fileName); + } + @TestMetadata("forInRangeToConstWithOverflow.kt") public void testForInRangeToConstWithOverflow() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/ranges/forInRangeToConstWithOverflow.kt"); diff --git a/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/JsCodegenBoxTestGenerated.java b/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/JsCodegenBoxTestGenerated.java index a71dd67d870..ec688353b26 100644 --- a/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/JsCodegenBoxTestGenerated.java +++ b/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/JsCodegenBoxTestGenerated.java @@ -15203,6 +15203,12 @@ public class JsCodegenBoxTestGenerated extends AbstractJsCodegenBoxTest { doTest(fileName); } + @TestMetadata("forInRangeLiteralWithMixedTypeBounds.kt") + public void testForInRangeLiteralWithMixedTypeBounds() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/ranges/forInRangeLiteralWithMixedTypeBounds.kt"); + doTest(fileName); + } + @TestMetadata("forInRangeToConstWithOverflow.kt") public void testForInRangeToConstWithOverflow() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/ranges/forInRangeToConstWithOverflow.kt"); From 426a54c3ab6ddb776b13498316a2e6097b2a1145 Mon Sep 17 00:00:00 2001 From: Mikhail Glukhikh Date: Mon, 18 Sep 2017 16:02:06 +0300 Subject: [PATCH 058/212] Do not count callable reference as recursive property access So #KT-20104 Fixed --- .../inspections/RecursivePropertyAccessorInspection.kt | 2 ++ .../inspections/recursivePropertyAccessor/logger.kt | 7 +++++++ 2 files changed, 9 insertions(+) create mode 100644 idea/testData/inspections/recursivePropertyAccessor/logger.kt diff --git a/idea/src/org/jetbrains/kotlin/idea/inspections/RecursivePropertyAccessorInspection.kt b/idea/src/org/jetbrains/kotlin/idea/inspections/RecursivePropertyAccessorInspection.kt index 34eb740972d..1515f089c20 100644 --- a/idea/src/org/jetbrains/kotlin/idea/inspections/RecursivePropertyAccessorInspection.kt +++ b/idea/src/org/jetbrains/kotlin/idea/inspections/RecursivePropertyAccessorInspection.kt @@ -95,6 +95,7 @@ class RecursivePropertyAccessorInspection : AbstractKotlinInspection() { if (element !is KtSimpleNameExpression) return false val propertyAccessor = element.getParentOfType(true) as? KtPropertyAccessor ?: return false if (element.text != propertyAccessor.property.name) return false + if (element.parent is KtCallableReferenceExpression) return false val bindingContext = element.analyze() val target = bindingContext[REFERENCE_TARGET, element] if (target != bindingContext[BindingContext.DECLARATION_TO_DESCRIPTOR, propertyAccessor.property]) return false @@ -112,6 +113,7 @@ class RecursivePropertyAccessorInspection : AbstractKotlinInspection() { val isGetter = name == "get$referencedName" val isSetter = name == "set$referencedName" if (!isGetter && !isSetter) return false + if (element.parent is KtCallableReferenceExpression) return false val bindingContext = element.analyze() val syntheticDescriptor = bindingContext[REFERENCE_TARGET, element] as? SyntheticJavaPropertyDescriptor ?: return false val namedFunctionDescriptor = bindingContext[DECLARATION_TO_DESCRIPTOR, namedFunction] diff --git a/idea/testData/inspections/recursivePropertyAccessor/logger.kt b/idea/testData/inspections/recursivePropertyAccessor/logger.kt new file mode 100644 index 00000000000..b96b745ffa9 --- /dev/null +++ b/idea/testData/inspections/recursivePropertyAccessor/logger.kt @@ -0,0 +1,7 @@ +// See KT-20104 + +interface Logger + +fun logger(f: () -> Logger): Logger = object : Logger {} + +val logger: Logger get() = logger(::logger) \ No newline at end of file From e8b95b971d75bbda8f8a67b79f9125fe124ac57b Mon Sep 17 00:00:00 2001 From: Mikhail Glukhikh Date: Mon, 18 Sep 2017 16:43:36 +0300 Subject: [PATCH 059/212] Make parentheses necessary for '(x op return y) op z' #KT-16808 Fixed --- .../org/jetbrains/kotlin/psi/KtPsiUtil.java | 18 +++++++++++++----- .../removeUnnecessaryParentheses/elvisRhs.kt | 5 +++++ .../elvisRhsEmptyReturn.kt | 7 +++++++ .../intentions/IntentionTestGenerated.java | 12 ++++++++++++ 4 files changed, 37 insertions(+), 5 deletions(-) create mode 100644 idea/testData/intentions/removeUnnecessaryParentheses/elvisRhs.kt create mode 100644 idea/testData/intentions/removeUnnecessaryParentheses/elvisRhsEmptyReturn.kt diff --git a/compiler/frontend/src/org/jetbrains/kotlin/psi/KtPsiUtil.java b/compiler/frontend/src/org/jetbrains/kotlin/psi/KtPsiUtil.java index 3409f30fc41..f39657bde07 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/psi/KtPsiUtil.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/psi/KtPsiUtil.java @@ -530,11 +530,19 @@ public class KtPsiUtil { return false; } - // '(x operator y)' case - if (innerExpression instanceof KtBinaryExpression && - innerOperation != KtTokens.ELVIS && - isKeepBinaryExpressionParenthesized((KtBinaryExpression) innerExpression)) { - return true; + if (innerExpression instanceof KtBinaryExpression) { + // '(x operator return [...]) operator ...' case + if (parentElement instanceof KtBinaryExpression) { + KtBinaryExpression innerBinary = (KtBinaryExpression) innerExpression; + if (innerBinary.getRight() instanceof KtReturnExpression) { + return true; + } + } + // '(x operator y)' case + if (innerOperation != KtTokens.ELVIS && + isKeepBinaryExpressionParenthesized((KtBinaryExpression) innerExpression)) { + return true; + } } int innerPriority = getPriority(innerExpression); diff --git a/idea/testData/intentions/removeUnnecessaryParentheses/elvisRhs.kt b/idea/testData/intentions/removeUnnecessaryParentheses/elvisRhs.kt new file mode 100644 index 00000000000..de82156154f --- /dev/null +++ b/idea/testData/intentions/removeUnnecessaryParentheses/elvisRhs.kt @@ -0,0 +1,5 @@ +// IS_APPLICABLE: false +// WITH_RUNTIME +fun foo(): Boolean { + return ("" ?: return false) in listOf("") +} \ No newline at end of file diff --git a/idea/testData/intentions/removeUnnecessaryParentheses/elvisRhsEmptyReturn.kt b/idea/testData/intentions/removeUnnecessaryParentheses/elvisRhsEmptyReturn.kt new file mode 100644 index 00000000000..0968e2bc96e --- /dev/null +++ b/idea/testData/intentions/removeUnnecessaryParentheses/elvisRhsEmptyReturn.kt @@ -0,0 +1,7 @@ +// IS_APPLICABLE: false +// WITH_RUNTIME +fun foo() { + bar(("" ?: return) in listOf("")) +} + +fun bar(arg: Boolean) {} \ No newline at end of file diff --git a/idea/tests/org/jetbrains/kotlin/idea/intentions/IntentionTestGenerated.java b/idea/tests/org/jetbrains/kotlin/idea/intentions/IntentionTestGenerated.java index f004cf2f427..ffbee40d147 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/intentions/IntentionTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/intentions/IntentionTestGenerated.java @@ -13412,6 +13412,18 @@ public class IntentionTestGenerated extends AbstractIntentionTest { doTest(fileName); } + @TestMetadata("elvisRhs.kt") + public void testElvisRhs() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/intentions/removeUnnecessaryParentheses/elvisRhs.kt"); + doTest(fileName); + } + + @TestMetadata("elvisRhsEmptyReturn.kt") + public void testElvisRhsEmptyReturn() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/intentions/removeUnnecessaryParentheses/elvisRhsEmptyReturn.kt"); + doTest(fileName); + } + @TestMetadata("necessaryParentheses1.kt") public void testNecessaryParentheses1() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("idea/testData/intentions/removeUnnecessaryParentheses/necessaryParentheses1.kt"); From a23532d1ee804cfa587c07df88abf5f4496abfbd Mon Sep 17 00:00:00 2001 From: Sergey Igushkin Date: Mon, 25 Sep 2017 18:35:59 +0300 Subject: [PATCH 060/212] Replace the `compile` dependency on the Gradle API with a `compileOnly` one --- .../tools/kotlin-annotation-processing/build.gradle.kts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/libraries/tools/kotlin-annotation-processing/build.gradle.kts b/libraries/tools/kotlin-annotation-processing/build.gradle.kts index e4dfe9d8b49..8bf1a40a85a 100644 --- a/libraries/tools/kotlin-annotation-processing/build.gradle.kts +++ b/libraries/tools/kotlin-annotation-processing/build.gradle.kts @@ -17,10 +17,10 @@ apply { plugin("kotlin") } val packedJars by configurations.creating dependencies { - compileOnly(project(":kotlin-annotation-processing")) - compile("org.jetbrains.kotlin:gradle-api:1.6") - compile("com.android.tools.build:gradle:1.1.0") compile(projectDist(":kotlin-stdlib")) + compileOnly(project(":kotlin-annotation-processing")) + compileOnly("org.jetbrains.kotlin:gradle-api:1.6") + compileOnly("com.android.tools.build:gradle:1.1.0") testCompile(commonDep("junit:junit")) packedJars(project(":kotlin-annotation-processing")) { isTransitive = false } } From ed2c7d3a9fd11374ae6b8ce22d4289fae29e3d35 Mon Sep 17 00:00:00 2001 From: Nikolay Krasko Date: Fri, 22 Sep 2017 13:28:40 +0300 Subject: [PATCH 061/212] Minor: fix warnings in increment-version.kts --- generators/infrastructure/increment-version.kts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/generators/infrastructure/increment-version.kts b/generators/infrastructure/increment-version.kts index 5635d81f9e9..fec8a1abaf2 100644 --- a/generators/infrastructure/increment-version.kts +++ b/generators/infrastructure/increment-version.kts @@ -28,13 +28,13 @@ fun main(args: Array) { "") } - var versionStr = args[0] + val versionStr = args[0] val incrementPartStr = versionStr.takeLastWhile(Char::isDigit) - val versionPrefix = versionStr.take(versionStr.length - incrementPartStr.length) val incrementPart = incrementPartStr.toInt() + val versionPrefix = versionStr.take(versionStr.length - incrementPartStr.length) - var filePath = args.getOrNull(1) ?: filePathDefault + val filePath = args.getOrNull(1) ?: filePathDefault val result = "${versionPrefix}${incrementPart + 1}" From 2e7be02d51b190aa2f4c38d5cfdb973e108e39ed Mon Sep 17 00:00:00 2001 From: Nikolay Krasko Date: Fri, 22 Sep 2017 20:51:31 +0300 Subject: [PATCH 062/212] Add settings for protobuf plugin --- .idea/tools.protobuf.xml | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 .idea/tools.protobuf.xml diff --git a/.idea/tools.protobuf.xml b/.idea/tools.protobuf.xml new file mode 100644 index 00000000000..c42da106537 --- /dev/null +++ b/.idea/tools.protobuf.xml @@ -0,0 +1,10 @@ + + + + + + \ No newline at end of file From d51f54693fa19bc67ed94b9719da1e32c5d92535 Mon Sep 17 00:00:00 2001 From: Nikolay Krasko Date: Mon, 25 Sep 2017 14:39:56 +0300 Subject: [PATCH 063/212] Exist if no identifier found (EA-91332) --- .../jetbrains/kotlin/psi/KtNamedDeclarationNotStubbed.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/compiler/frontend/src/org/jetbrains/kotlin/psi/KtNamedDeclarationNotStubbed.java b/compiler/frontend/src/org/jetbrains/kotlin/psi/KtNamedDeclarationNotStubbed.java index eeec6006d0e..78653833884 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/psi/KtNamedDeclarationNotStubbed.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/psi/KtNamedDeclarationNotStubbed.java @@ -64,7 +64,10 @@ abstract class KtNamedDeclarationNotStubbed extends KtDeclarationImpl implements @Override public PsiElement setName(@NonNls @NotNull String name) throws IncorrectOperationException { - return getNameIdentifier().replace(KtPsiFactory(this).createNameIdentifier(name)); + PsiElement identifier = getNameIdentifier(); + if (identifier == null) throw new IncorrectOperationException(); + + return identifier.replace(KtPsiFactory(this).createNameIdentifier(name)); } @Override From fc5401831370e65d896f926017d95805d46fa2cc Mon Sep 17 00:00:00 2001 From: Nikolay Krasko Date: Mon, 25 Sep 2017 15:19:38 +0300 Subject: [PATCH 064/212] Don't convert to PropertyDescriptor without check (EA-92870) --- .../kotlin/idea/debugger/breakpoints/KotlinFieldBreakpoint.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/idea/src/org/jetbrains/kotlin/idea/debugger/breakpoints/KotlinFieldBreakpoint.kt b/idea/src/org/jetbrains/kotlin/idea/debugger/breakpoints/KotlinFieldBreakpoint.kt index 0133ac39090..e845f2bfda0 100644 --- a/idea/src/org/jetbrains/kotlin/idea/debugger/breakpoints/KotlinFieldBreakpoint.kt +++ b/idea/src/org/jetbrains/kotlin/idea/debugger/breakpoints/KotlinFieldBreakpoint.kt @@ -195,8 +195,8 @@ class KotlinFieldBreakpoint( descriptor = bindingContext.get(BindingContext.VALUE_PARAMETER_AS_PROPERTY, descriptor) } - if (descriptor != null) { - if (bindingContext.get(BindingContext.BACKING_FIELD_REQUIRED, descriptor as PropertyDescriptor)!!) { + if (descriptor is PropertyDescriptor) { + if (bindingContext.get(BindingContext.BACKING_FIELD_REQUIRED, descriptor)!!) { BreakpointType.FIELD } else { From 8b1fbc98289edaa744a108215cd203a1d76d726c Mon Sep 17 00:00:00 2001 From: Nikolay Krasko Date: Mon, 25 Sep 2017 15:43:14 +0300 Subject: [PATCH 065/212] fixHost might be null (EA-107022) --- .../kotlin/idea/injection/KotlinLanguageInjectionSupport.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/idea/src/org/jetbrains/kotlin/idea/injection/KotlinLanguageInjectionSupport.kt b/idea/src/org/jetbrains/kotlin/idea/injection/KotlinLanguageInjectionSupport.kt index af3aba95603..ba0b82bcb40 100644 --- a/idea/src/org/jetbrains/kotlin/idea/injection/KotlinLanguageInjectionSupport.kt +++ b/idea/src/org/jetbrains/kotlin/idea/injection/KotlinLanguageInjectionSupport.kt @@ -57,8 +57,8 @@ class KotlinLanguageInjectionSupport : AbstractLanguageInjectionSupport() { val configuration = Configuration.getProjectInstance(host.project).advancedConfiguration if (!configuration.isSourceModificationAllowed) { // It's not allowed to modify code without explicit permission. Postpone adding @Inject or comment till it granted. - host.putUserData(InjectLanguageAction.FIX_KEY, Processor { fixHost -> - addInjectionInstructionInCode(language, fixHost) + host.putUserData(InjectLanguageAction.FIX_KEY, Processor { fixHost: PsiLanguageInjectionHost? -> + fixHost != null && addInjectionInstructionInCode(language, fixHost) }) return false } From 98c50d3bfb7cc4db3b55e46a6604950e404d169b Mon Sep 17 00:00:00 2001 From: Nikolay Krasko Date: Mon, 25 Sep 2017 15:53:47 +0300 Subject: [PATCH 066/212] Do not try to create ExactJavaBreakpointVariant with null position (EA-107577) --- .../debugger/breakpoints/KotlinLineBreakpointType.java | 2 +- .../idea/debugger/breakpoints/breakpointTypeUtils.kt | 7 +++++-- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/idea/src/org/jetbrains/kotlin/idea/debugger/breakpoints/KotlinLineBreakpointType.java b/idea/src/org/jetbrains/kotlin/idea/debugger/breakpoints/KotlinLineBreakpointType.java index 5d47ec5788b..15ef3ca559a 100644 --- a/idea/src/org/jetbrains/kotlin/idea/debugger/breakpoints/KotlinLineBreakpointType.java +++ b/idea/src/org/jetbrains/kotlin/idea/debugger/breakpoints/KotlinLineBreakpointType.java @@ -141,7 +141,7 @@ public class KotlinLineBreakpointType extends JavaLineBreakpointType { } public class KotlinLambdaBreakpointVariant extends ExactJavaBreakpointVariant { - public KotlinLambdaBreakpointVariant(XSourcePosition position, KtFunction function, Integer lambdaOrdinal) { + public KotlinLambdaBreakpointVariant(@NotNull XSourcePosition position, @Nullable KtFunction function, Integer lambdaOrdinal) { super(position, function, lambdaOrdinal); } diff --git a/idea/src/org/jetbrains/kotlin/idea/debugger/breakpoints/breakpointTypeUtils.kt b/idea/src/org/jetbrains/kotlin/idea/debugger/breakpoints/breakpointTypeUtils.kt index a8f9db23f6a..f122d177079 100644 --- a/idea/src/org/jetbrains/kotlin/idea/debugger/breakpoints/breakpointTypeUtils.kt +++ b/idea/src/org/jetbrains/kotlin/idea/debugger/breakpoints/breakpointTypeUtils.kt @@ -106,8 +106,11 @@ fun computeVariants( } lambdas.forEachIndexed { ordinal, lambda -> - result.add(kotlinBreakpointType.KotlinLambdaBreakpointVariant( - XSourcePositionImpl.createByElement(lambda.bodyExpression), lambda, ordinal)) + val positionImpl = XSourcePositionImpl.createByElement(lambda.bodyExpression) + + if (positionImpl != null) { + result.add(kotlinBreakpointType.KotlinLambdaBreakpointVariant(positionImpl, lambda, ordinal)) + } } val allBreakpoint = (kotlinBreakpointType as JavaLineBreakpointType).JavaBreakpointVariant(position) From 500d192063f8bacb0e0189bab3daed6ebf84de71 Mon Sep 17 00:00:00 2001 From: Nikolay Krasko Date: Mon, 25 Sep 2017 16:37:25 +0300 Subject: [PATCH 067/212] Remove null assert (EA-107777) --- .../kotlin/idea/debugger/KotlinFrameExtraVariablesProvider.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/idea/src/org/jetbrains/kotlin/idea/debugger/KotlinFrameExtraVariablesProvider.kt b/idea/src/org/jetbrains/kotlin/idea/debugger/KotlinFrameExtraVariablesProvider.kt index 51381286e07..3f54101b467 100644 --- a/idea/src/org/jetbrains/kotlin/idea/debugger/KotlinFrameExtraVariablesProvider.kt +++ b/idea/src/org/jetbrains/kotlin/idea/debugger/KotlinFrameExtraVariablesProvider.kt @@ -65,8 +65,8 @@ private fun findAdditionalExpressions(position: SourcePosition): Set 0 } ?: return emptySet() - val elem = file.findElementAt(offset) - val containingElement = getContainingElement(elem!!) ?: elem ?: return emptySet() + val elem = file.findElementAt(offset) ?: return emptySet() + val containingElement = getContainingElement(elem) ?: elem val limit = getLineRangeForElement(containingElement, doc) From 412fb62bbb5e7e36c6971bdc53b40ae25150c675 Mon Sep 17 00:00:00 2001 From: Nikolay Krasko Date: Mon, 25 Sep 2017 16:39:47 +0300 Subject: [PATCH 068/212] Fix de-reference nullable virtual file (EA-107980) --- .../kotlin/idea/debugger/breakpoints/breakpointTypeUtils.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/idea/src/org/jetbrains/kotlin/idea/debugger/breakpoints/breakpointTypeUtils.kt b/idea/src/org/jetbrains/kotlin/idea/debugger/breakpoints/breakpointTypeUtils.kt index f122d177079..84c5e73da2c 100644 --- a/idea/src/org/jetbrains/kotlin/idea/debugger/breakpoints/breakpointTypeUtils.kt +++ b/idea/src/org/jetbrains/kotlin/idea/debugger/breakpoints/breakpointTypeUtils.kt @@ -43,7 +43,7 @@ import java.util.* fun canPutAt(file: VirtualFile, line: Int, project: Project, breakpointTypeClass: Class<*>): Boolean { val psiFile = PsiManager.getInstance(project).findFile(file) - if (psiFile == null || psiFile.virtualFile.fileType != KotlinFileType.INSTANCE) { + if (psiFile == null || psiFile.virtualFile?.fileType != KotlinFileType.INSTANCE) { return false } From 31f5c105f35326b2ba0660cf137835d3639f3167 Mon Sep 17 00:00:00 2001 From: Nikolay Krasko Date: Mon, 25 Sep 2017 20:37:45 +0300 Subject: [PATCH 069/212] Remove "javax.annotation.Nullable" usage and clean up file --- .../folding/AbstractKotlinFoldingTest.java | 22 ++++++------------- 1 file changed, 7 insertions(+), 15 deletions(-) diff --git a/idea/tests/org/jetbrains/kotlin/idea/folding/AbstractKotlinFoldingTest.java b/idea/tests/org/jetbrains/kotlin/idea/folding/AbstractKotlinFoldingTest.java index 3234d8277ae..e2006ff13d3 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/folding/AbstractKotlinFoldingTest.java +++ b/idea/tests/org/jetbrains/kotlin/idea/folding/AbstractKotlinFoldingTest.java @@ -16,7 +16,6 @@ package org.jetbrains.kotlin.idea.folding; -import com.google.common.base.Function; import com.intellij.codeInsight.folding.JavaCodeFoldingSettings; import com.intellij.codeInsight.folding.impl.JavaCodeFoldingSettingsImpl; import com.intellij.openapi.util.io.FileUtil; @@ -31,10 +30,10 @@ import org.jetbrains.kotlin.idea.test.KotlinLightProjectDescriptor; import org.jetbrains.kotlin.test.SettingsConfigurator; import org.junit.Assert; -import javax.annotation.Nullable; import java.io.File; import java.io.IOException; import java.nio.charset.Charset; +import java.util.function.Consumer; public abstract class AbstractKotlinFoldingTest extends KotlinLightCodeInsightFixtureTestCaseBase { protected void doTest(@NotNull String path) { @@ -47,14 +46,7 @@ public abstract class AbstractKotlinFoldingTest extends KotlinLightCodeInsightFi String directText = fileText.replaceAll("~true~", "true").replaceAll("~false~", "false"); directText += "\n\n// Generated from: " + path; - Function doExpandSettingsTestFunction = new Function() { - @Nullable - @Override - public Void apply(@Nullable String fileText) { - doExpandSettingsTest(fileText); - return null; - } - }; + Consumer doExpandSettingsTestFunction = this::doExpandSettingsTest; doTestWithSettings(directText, doExpandSettingsTestFunction); @@ -68,7 +60,7 @@ public abstract class AbstractKotlinFoldingTest extends KotlinLightCodeInsightFi doTestWithSettings(invertedText, doExpandSettingsTestFunction); } - protected static void doTestWithSettings(@NotNull String fileText, @NotNull Function runnable) { + protected static void doTestWithSettings(@NotNull String fileText, @NotNull Consumer runnable) { JavaCodeFoldingSettings settings = JavaCodeFoldingSettings.getInstance(); JavaCodeFoldingSettingsImpl restoreSettings = new JavaCodeFoldingSettingsImpl(); restoreSettings.loadState((JavaCodeFoldingSettingsImpl) settings); @@ -77,7 +69,7 @@ public abstract class AbstractKotlinFoldingTest extends KotlinLightCodeInsightFi SettingsConfigurator configurator = new SettingsConfigurator(fileText, settings); configurator.configureSettings(); - runnable.apply(fileText); + runnable.accept(fileText); } finally { ((JavaCodeFoldingSettingsImpl) JavaCodeFoldingSettings.getInstance()).loadState(restoreSettings); @@ -87,7 +79,7 @@ public abstract class AbstractKotlinFoldingTest extends KotlinLightCodeInsightFi private void doExpandSettingsTest(String fileText) { try { VirtualFile tempFile = PlatformTestCase.createTempFile("kt", null, fileText, Charset.defaultCharset()); - assertFoldingRegionsForFile(tempFile.getPath(), true); + assertFoldingRegionsForFile(tempFile.getPath()); } catch (IOException e) { throw new IllegalStateException(e); @@ -96,7 +88,7 @@ public abstract class AbstractKotlinFoldingTest extends KotlinLightCodeInsightFi // Rewritten version of CodeInsightTestFixtureImpl.testFoldingRegions(verificationFileName, true). // Configure test with custom file name to force creating different editors for normal and inverted tests. - private void assertFoldingRegionsForFile(String verificationFileName, boolean doCheckCollapseStatus) { + private void assertFoldingRegionsForFile(String verificationFileName) { String START_FOLD = ""; String END_FOLD = ""; @@ -115,7 +107,7 @@ public abstract class AbstractKotlinFoldingTest extends KotlinLightCodeInsightFi String cleanContent = expectedContent.replaceAll(START_FOLD, "").replaceAll(END_FOLD, ""); myFixture.configureByText(file.getName(), cleanContent); - String actual = ((CodeInsightTestFixtureImpl)myFixture).getFoldingDescription(doCheckCollapseStatus); + String actual = ((CodeInsightTestFixtureImpl)myFixture).getFoldingDescription(true); Assert.assertEquals(expectedContent, actual); } From 1db365bb5979b3eac71c61b5570b2f06f24291b2 Mon Sep 17 00:00:00 2001 From: Kirill Rakhman Date: Mon, 25 Sep 2017 22:11:34 +0300 Subject: [PATCH 070/212] Insert explicit property type while converting accessor to block body So #KT-20417 Fixed --- .../idea/intentions/ConvertToBlockBodyIntention.kt | 12 +++++++++++- .../convertToBlockBody/getterTypeInferred.kt | 1 + .../convertToBlockBody/getterTypeInferred.kt.after | 4 ++++ .../idea/intentions/IntentionTestGenerated.java | 6 ++++++ 4 files changed, 22 insertions(+), 1 deletion(-) create mode 100644 idea/testData/intentions/convertToBlockBody/getterTypeInferred.kt create mode 100644 idea/testData/intentions/convertToBlockBody/getterTypeInferred.kt.after diff --git a/idea/src/org/jetbrains/kotlin/idea/intentions/ConvertToBlockBodyIntention.kt b/idea/src/org/jetbrains/kotlin/idea/intentions/ConvertToBlockBodyIntention.kt index 8ff388f2ca7..d78401f8b84 100644 --- a/idea/src/org/jetbrains/kotlin/idea/intentions/ConvertToBlockBodyIntention.kt +++ b/idea/src/org/jetbrains/kotlin/idea/intentions/ConvertToBlockBodyIntention.kt @@ -19,8 +19,10 @@ package org.jetbrains.kotlin.idea.intentions import com.intellij.codeInsight.intention.LowPriorityAction import com.intellij.openapi.editor.Editor import com.intellij.psi.PsiElement +import org.jetbrains.kotlin.descriptors.CallableDescriptor import org.jetbrains.kotlin.descriptors.FunctionDescriptor import org.jetbrains.kotlin.idea.caches.resolve.analyze +import org.jetbrains.kotlin.idea.caches.resolve.resolveToDescriptorIfAny import org.jetbrains.kotlin.idea.core.setType import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.resolve.BindingContext @@ -81,7 +83,15 @@ class ConvertToBlockBodyIntention : SelfTargetingIntention generateBody(declaration.isGetter) + is KtPropertyAccessor -> { + val parent = declaration.parent + if (parent is KtProperty && parent.typeReference == null) { + val descriptor = parent.resolveToDescriptorIfAny() + (descriptor as? CallableDescriptor)?.returnType?.let { parent.setType(it) } + } + + generateBody(declaration.isGetter) + } else -> throw RuntimeException("Unknown declaration type: $declaration") } diff --git a/idea/testData/intentions/convertToBlockBody/getterTypeInferred.kt b/idea/testData/intentions/convertToBlockBody/getterTypeInferred.kt new file mode 100644 index 00000000000..328941e0811 --- /dev/null +++ b/idea/testData/intentions/convertToBlockBody/getterTypeInferred.kt @@ -0,0 +1 @@ +val foo get() = "abc" diff --git a/idea/testData/intentions/convertToBlockBody/getterTypeInferred.kt.after b/idea/testData/intentions/convertToBlockBody/getterTypeInferred.kt.after new file mode 100644 index 00000000000..7249e365513 --- /dev/null +++ b/idea/testData/intentions/convertToBlockBody/getterTypeInferred.kt.after @@ -0,0 +1,4 @@ +val foo: String + get() { + return "abc" + } diff --git a/idea/tests/org/jetbrains/kotlin/idea/intentions/IntentionTestGenerated.java b/idea/tests/org/jetbrains/kotlin/idea/intentions/IntentionTestGenerated.java index ffbee40d147..5ae9c43d843 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/intentions/IntentionTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/intentions/IntentionTestGenerated.java @@ -6479,6 +6479,12 @@ public class IntentionTestGenerated extends AbstractIntentionTest { doTest(fileName); } + @TestMetadata("getterTypeInferred.kt") + public void testGetterTypeInferred() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/intentions/convertToBlockBody/getterTypeInferred.kt"); + doTest(fileName); + } + @TestMetadata("getterWithThrow.kt") public void testGetterWithThrow() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("idea/testData/intentions/convertToBlockBody/getterWithThrow.kt"); From 40ec513c68827880a0504d5e5f4e89d0608eec73 Mon Sep 17 00:00:00 2001 From: Sergey Igushkin Date: Tue, 26 Sep 2017 13:09:57 +0300 Subject: [PATCH 071/212] Fix tests compilation: cuplicate compileOnly dependencies to testCompile --- libraries/tools/kotlin-annotation-processing/build.gradle.kts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/libraries/tools/kotlin-annotation-processing/build.gradle.kts b/libraries/tools/kotlin-annotation-processing/build.gradle.kts index 8bf1a40a85a..121ac9025c9 100644 --- a/libraries/tools/kotlin-annotation-processing/build.gradle.kts +++ b/libraries/tools/kotlin-annotation-processing/build.gradle.kts @@ -20,7 +20,9 @@ dependencies { compile(projectDist(":kotlin-stdlib")) compileOnly(project(":kotlin-annotation-processing")) compileOnly("org.jetbrains.kotlin:gradle-api:1.6") + testCompile("org.jetbrains.kotlin:gradle-api:1.6") compileOnly("com.android.tools.build:gradle:1.1.0") + testCompile("com.android.tools.build:gradle:1.1.0") testCompile(commonDep("junit:junit")) packedJars(project(":kotlin-annotation-processing")) { isTransitive = false } } From 3bbf054f0a2760702d392e9916a0d38b20b1b14e Mon Sep 17 00:00:00 2001 From: Nikolay Krasko Date: Tue, 26 Sep 2017 13:32:51 +0300 Subject: [PATCH 072/212] Fix memory leak from SpecifyTypeExplicitlyIntention --- .../kotlin/idea/intentions/ChooseValueExpression.kt | 12 +++++++----- .../intentions/SpecifyTypeExplicitlyIntention.kt | 12 ++++++++---- 2 files changed, 15 insertions(+), 9 deletions(-) diff --git a/idea/src/org/jetbrains/kotlin/idea/intentions/ChooseValueExpression.kt b/idea/src/org/jetbrains/kotlin/idea/intentions/ChooseValueExpression.kt index dfe3b405f48..8c2c416d7d9 100644 --- a/idea/src/org/jetbrains/kotlin/idea/intentions/ChooseValueExpression.kt +++ b/idea/src/org/jetbrains/kotlin/idea/intentions/ChooseValueExpression.kt @@ -25,16 +25,18 @@ import com.intellij.codeInsight.template.impl.TemplateManagerImpl import com.intellij.psi.impl.source.tree.injected.InjectedLanguageUtil //TODO: move it somewhere else and reuse -abstract class ChooseValueExpression( +abstract class ChooseValueExpression( lookupItems: Collection, - protected val defaultItem: T, + defaultItem: T, private val advertisementText: String? = null ) : Expression() { - protected abstract fun getLookupString(element: T): String protected abstract fun getResult(element: T): String - protected val lookupItems: Array = lookupItems.map { suggestion -> + @Suppress("LeakingThis") + private val defaultItemString = getLookupString(defaultItem) + + private val lookupItems: Array = lookupItems.map { suggestion -> LookupElementBuilder.create(suggestion, getLookupString(suggestion)).withInsertHandler { context, item -> val topLevelEditor = InjectedLanguageUtil.getTopLevelEditor(context.editor) val templateState = TemplateManagerImpl.getTemplateState(topLevelEditor) @@ -52,7 +54,7 @@ abstract class ChooseValueExpression( override fun calculateQuickResult(context: ExpressionContext) = calculateResult(context) - override fun calculateResult(context: ExpressionContext) = TextResult(getLookupString(defaultItem)) + override fun calculateResult(context: ExpressionContext) = TextResult(defaultItemString) override fun getAdvertisingText() = advertisementText } diff --git a/idea/src/org/jetbrains/kotlin/idea/intentions/SpecifyTypeExplicitlyIntention.kt b/idea/src/org/jetbrains/kotlin/idea/intentions/SpecifyTypeExplicitlyIntention.kt index f4cbcb99d15..92b3f413a0f 100644 --- a/idea/src/org/jetbrains/kotlin/idea/intentions/SpecifyTypeExplicitlyIntention.kt +++ b/idea/src/org/jetbrains/kotlin/idea/intentions/SpecifyTypeExplicitlyIntention.kt @@ -132,10 +132,14 @@ class SpecifyTypeExplicitlyIntention : } }.ifEmpty { return null } - return object : ChooseValueExpression(types, types.first()) { - override fun getLookupString(element: KotlinType) = IdeDescriptorRenderers.SOURCE_CODE_SHORT_NAMES_IN_TYPES.renderType(element) - override fun getResult(element: KotlinType) = IdeDescriptorRenderers.SOURCE_CODE.renderType(element) - } + return TypeChooseValueExpression(types, types.first()) + } + + // Explicit class is used because of KT-20460 + private class TypeChooseValueExpression(items: List, defaultItem: KotlinType) : + ChooseValueExpression(items, defaultItem) { + override fun getLookupString(element: KotlinType) = IdeDescriptorRenderers.SOURCE_CODE_SHORT_NAMES_IN_TYPES.renderType(element) + override fun getResult(element: KotlinType) = IdeDescriptorRenderers.SOURCE_CODE.renderType(element) } fun addTypeAnnotation(editor: Editor?, declaration: KtCallableDeclaration, exprType: KotlinType) { From 95566b13747958acd34a010e5f30466248489557 Mon Sep 17 00:00:00 2001 From: Alexey Andreev Date: Tue, 12 Sep 2017 17:00:17 +0300 Subject: [PATCH 073/212] JS: fix serialization of fileId in case of incremental compilation --- .../serialization/js/KotlinFileMetadata.kt | 28 ++++++++++++++++ .../serialization/js/KotlinFileRegistry.kt | 8 ++--- .../js/KotlinJavascriptPackageFragment.kt | 14 ++------ .../js/KotlinJavascriptSerializationUtil.kt | 23 ++++++++++--- .../js/KotlinJavascriptSerializerExtension.kt | 12 +++++-- .../jetbrains/kotlin/js/test/BasicBoxTest.kt | 15 +++++++-- .../js/test/semantics/BoxJsTestGenerated.java | 6 ++++ .../testData/box/incremental/jsModule.js | 14 ++++++++ .../testData/box/incremental/jsModule.kt | 32 +++++++++++++++++++ 9 files changed, 126 insertions(+), 26 deletions(-) create mode 100644 js/js.serializer/src/org/jetbrains/kotlin/serialization/js/KotlinFileMetadata.kt create mode 100644 js/js.translator/testData/box/incremental/jsModule.js create mode 100644 js/js.translator/testData/box/incremental/jsModule.kt diff --git a/js/js.serializer/src/org/jetbrains/kotlin/serialization/js/KotlinFileMetadata.kt b/js/js.serializer/src/org/jetbrains/kotlin/serialization/js/KotlinFileMetadata.kt new file mode 100644 index 00000000000..160860048b0 --- /dev/null +++ b/js/js.serializer/src/org/jetbrains/kotlin/serialization/js/KotlinFileMetadata.kt @@ -0,0 +1,28 @@ +/* + * Copyright 2010-2017 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.serialization.js + +import org.jetbrains.kotlin.psi.KtFile + +sealed class KotlinFileMetadata + +data class KotlinPsiFileMetadata(val ktFile: KtFile) : KotlinFileMetadata() + +data class KotlinDeserializedFileMetadata( + val packageFragment: KotlinJavascriptPackageFragment, + val fileId: Int +) : KotlinFileMetadata() \ No newline at end of file diff --git a/js/js.serializer/src/org/jetbrains/kotlin/serialization/js/KotlinFileRegistry.kt b/js/js.serializer/src/org/jetbrains/kotlin/serialization/js/KotlinFileRegistry.kt index d80cc8a4994..48a5a7ba4c5 100644 --- a/js/js.serializer/src/org/jetbrains/kotlin/serialization/js/KotlinFileRegistry.kt +++ b/js/js.serializer/src/org/jetbrains/kotlin/serialization/js/KotlinFileRegistry.kt @@ -16,13 +16,11 @@ package org.jetbrains.kotlin.serialization.js -import org.jetbrains.kotlin.psi.KtFile - class KotlinFileRegistry { - private val fileIdsImpl = mutableMapOf() + private val fileIdsImpl = mutableMapOf() - fun lookup(file: KtFile) = fileIdsImpl.getOrPut(file) { fileIdsImpl.size } + fun lookup(file: KotlinFileMetadata) = fileIdsImpl.getOrPut(file) { fileIdsImpl.size } - val fileIds: Map + val fileIds: Map get() = fileIdsImpl } diff --git a/js/js.serializer/src/org/jetbrains/kotlin/serialization/js/KotlinJavascriptPackageFragment.kt b/js/js.serializer/src/org/jetbrains/kotlin/serialization/js/KotlinJavascriptPackageFragment.kt index 3257b25b2b7..e61e07c3deb 100644 --- a/js/js.serializer/src/org/jetbrains/kotlin/serialization/js/KotlinJavascriptPackageFragment.kt +++ b/js/js.serializer/src/org/jetbrains/kotlin/serialization/js/KotlinJavascriptPackageFragment.kt @@ -29,10 +29,7 @@ import org.jetbrains.kotlin.serialization.deserialization.AnnotationDeserializer import org.jetbrains.kotlin.serialization.deserialization.DeserializationConfiguration import org.jetbrains.kotlin.serialization.deserialization.DeserializedPackageFragmentImpl import org.jetbrains.kotlin.serialization.deserialization.IncompatibleVersionErrorData -import org.jetbrains.kotlin.serialization.deserialization.descriptors.DeserializedClassDescriptor import org.jetbrains.kotlin.serialization.deserialization.descriptors.DeserializedContainerSource -import org.jetbrains.kotlin.serialization.deserialization.descriptors.DeserializedPropertyDescriptor -import org.jetbrains.kotlin.serialization.deserialization.descriptors.DeserializedSimpleFunctionDescriptor import org.jetbrains.kotlin.storage.StorageManager import org.jetbrains.kotlin.storage.getValue @@ -44,7 +41,7 @@ class KotlinJavascriptPackageFragment( header: JsProtoBuf.Header, configuration: DeserializationConfiguration ) : DeserializedPackageFragmentImpl(fqName, storageManager, module, proto, JsContainerSource(fqName, header, configuration)) { - private val fileMap: Map by storageManager.createLazyValue { + val fileMap: Map by storageManager.createLazyValue { this.proto.getExtension(JsProtoBuf.packageFragmentFiles).fileList.withIndex().associate { (index, file) -> (if (file.hasId()) file.id else index) to FileHolder(file.annotationList) } @@ -58,17 +55,12 @@ class KotlinJavascriptPackageFragment( if (DescriptorUtils.getParentOfType(descriptor, PackageFragmentDescriptor::class.java) != this) { throw IllegalArgumentException("Provided descriptor $descriptor does not belong to this package $this") } - val fileId = when (descriptor) { - is DeserializedClassDescriptor -> descriptor.classProto.getExtension(JsProtoBuf.classContainingFileId) - is DeserializedSimpleFunctionDescriptor -> descriptor.proto.getExtension(JsProtoBuf.functionContainingFileId) - is DeserializedPropertyDescriptor -> descriptor.proto.getExtension(JsProtoBuf.propertyContainingFileId) - else -> null - } + val fileId = descriptor.extractFileId() return fileId?.let { fileMap[it] }?.annotations.orEmpty() } - private inner class FileHolder(val annotationsProto: List) { + inner class FileHolder(private val annotationsProto: List) { val annotations: List by storageManager.createLazyValue { annotationsProto.map { annotationDeserializer.deserializeAnnotation(it, nameResolver) } } diff --git a/js/js.serializer/src/org/jetbrains/kotlin/serialization/js/KotlinJavascriptSerializationUtil.kt b/js/js.serializer/src/org/jetbrains/kotlin/serialization/js/KotlinJavascriptSerializationUtil.kt index 8fa0d7013f2..18fc957c476 100644 --- a/js/js.serializer/src/org/jetbrains/kotlin/serialization/js/KotlinJavascriptSerializationUtil.kt +++ b/js/js.serializer/src/org/jetbrains/kotlin/serialization/js/KotlinJavascriptSerializationUtil.kt @@ -29,6 +29,9 @@ import org.jetbrains.kotlin.serialization.AnnotationSerializer import org.jetbrains.kotlin.serialization.DescriptorSerializer import org.jetbrains.kotlin.serialization.ProtoBuf import org.jetbrains.kotlin.serialization.deserialization.DeserializationConfiguration +import org.jetbrains.kotlin.serialization.deserialization.descriptors.DeserializedClassDescriptor +import org.jetbrains.kotlin.serialization.deserialization.descriptors.DeserializedPropertyDescriptor +import org.jetbrains.kotlin.serialization.deserialization.descriptors.DeserializedSimpleFunctionDescriptor import org.jetbrains.kotlin.storage.StorageManager import org.jetbrains.kotlin.utils.JsMetadataVersion import org.jetbrains.kotlin.utils.KotlinJavascriptMetadataUtils @@ -130,7 +133,9 @@ object KotlinJavascriptSerializationUtil { val builder = ProtoBuf.PackageFragment.newBuilder() // TODO: ModuleDescriptor should be able to return the package only with the contents of that module, without dependencies - val skip: (DeclarationDescriptor) -> Boolean = { DescriptorUtils.getContainingModule(it) != module || (it is MemberDescriptor && it.isExpect) } + val skip: (DeclarationDescriptor) -> Boolean = { + DescriptorUtils.getContainingModule(it) != module || (it is MemberDescriptor && it.isExpect) + } val fileRegistry = KotlinFileRegistry() val serializerExtension = KotlinJavascriptSerializerExtension(fileRegistry) @@ -183,8 +188,11 @@ object KotlinJavascriptSerializationUtil { if (id != filesProto.fileCount) { fileProto.id = id } - for (annotationPsi in file.annotationEntries) { - val annotation = bindingContext[BindingContext.ANNOTATION, annotationPsi]!! + val annotations = when (file) { + is KotlinPsiFileMetadata -> file.ktFile.annotationEntries.map { bindingContext[BindingContext.ANNOTATION, it]!! } + is KotlinDeserializedFileMetadata -> file.packageFragment.fileMap[file.fileId]!!.annotations + } + for (annotation in annotations) { fileProto.addAnnotation(serializer.serializeAnnotation(annotation)) } filesProto.addFile(fileProto) @@ -282,4 +290,11 @@ object KotlinJavascriptSerializationUtil { } } -data class KotlinJavaScriptLibraryParts(val header: JsProtoBuf.Header, val body: List) \ No newline at end of file +data class KotlinJavaScriptLibraryParts(val header: JsProtoBuf.Header, val body: List) + +internal fun DeclarationDescriptor.extractFileId(): Int? = when (this) { + is DeserializedClassDescriptor -> classProto.getExtension(JsProtoBuf.classContainingFileId) + is DeserializedSimpleFunctionDescriptor -> proto.getExtension(JsProtoBuf.functionContainingFileId) + is DeserializedPropertyDescriptor -> proto.getExtension(JsProtoBuf.propertyContainingFileId) + else -> null +} \ No newline at end of file diff --git a/js/js.serializer/src/org/jetbrains/kotlin/serialization/js/KotlinJavascriptSerializerExtension.kt b/js/js.serializer/src/org/jetbrains/kotlin/serialization/js/KotlinJavascriptSerializerExtension.kt index 24aef0aa4b8..452282931d9 100644 --- a/js/js.serializer/src/org/jetbrains/kotlin/serialization/js/KotlinJavascriptSerializerExtension.kt +++ b/js/js.serializer/src/org/jetbrains/kotlin/serialization/js/KotlinJavascriptSerializerExtension.kt @@ -64,11 +64,17 @@ class KotlinJavascriptSerializerExtension( private fun getFileId(descriptor: DeclarationDescriptor): Int? { if (!DescriptorUtils.isTopLevelDeclaration(descriptor) || descriptor !is DeclarationDescriptorWithSource) return null - val file = descriptor.source.containingFile - if (file !is PsiSourceFile) return null + val fileId = descriptor.extractFileId() + if (fileId != null) { + (descriptor.containingDeclaration as? KotlinJavascriptPackageFragment)?.let { packageFragment -> + return fileRegistry.lookup(KotlinDeserializedFileMetadata(packageFragment, fileId)) + } + } + + val file = descriptor.source.containingFile as? PsiSourceFile ?: return null val psiFile = file.psiFile - return (psiFile as? KtFile)?.let { fileRegistry.lookup(it) } + return (psiFile as? KtFile)?.let { fileRegistry.lookup(KotlinPsiFileMetadata(it)) } } } diff --git a/js/js.tests/test/org/jetbrains/kotlin/js/test/BasicBoxTest.kt b/js/js.tests/test/org/jetbrains/kotlin/js/test/BasicBoxTest.kt index 6417f6da46d..7e626bcb86e 100644 --- a/js/js.tests/test/org/jetbrains/kotlin/js/test/BasicBoxTest.kt +++ b/js/js.tests/test/org/jetbrains/kotlin/js/test/BasicBoxTest.kt @@ -298,7 +298,8 @@ abstract class BasicBoxTest( val outputFile = File(outputFileName) val incrementalData = IncrementalData() - translateFiles(psiFiles.map(TranslationUnit::SourceFile), outputFile, config, outputPrefixFile, outputPostfixFile, mainCallParameters, incrementalData) + translateFiles(psiFiles.map(TranslationUnit::SourceFile), outputFile, config, outputPrefixFile, outputPostfixFile, + mainCallParameters, incrementalData) if (module.hasFilesToRecompile) { checkIncrementalCompilation(sourceDirs, module, kotlinFiles, dependencies, friends, multiModule, outputFile, @@ -334,7 +335,7 @@ abstract class BasicBoxTest( .sortedBy { it.canonicalPath } .map { sourceToTranslationUnit[it]!! } - val recompiledConfig = createConfig(sourceDirs,module, dependencies, friends, multiModule, incrementalData) + val recompiledConfig = createConfig(sourceDirs, module, dependencies, friends, multiModule, incrementalData) val recompiledOutputFile = File(outputFile.parentFile, outputFile.nameWithoutExtension + "-recompiled.js") translateFiles(translationUnits, recompiledOutputFile, recompiledConfig, outputPrefixFile, outputPostfixFile, @@ -348,6 +349,13 @@ abstract class BasicBoxTest( val recompiledSourceMap = removeRecompiledSuffix( FileUtil.loadFile(File(recompiledOutputFile.parentFile, recompiledOutputFile.name + ".map"))) TestCase.assertEquals("Source map file changed after recompilation", originalSourceMap, recompiledSourceMap) + + if (multiModule) { + val originalMetadata = FileUtil.loadFile(File(outputFile.parentFile, outputFile.nameWithoutExtension + ".meta.js")) + val recompiledMetadata = removeRecompiledSuffix( + FileUtil.loadFile(File(recompiledOutputFile.parentFile, recompiledOutputFile.nameWithoutExtension + ".meta.js"))) + TestCase.assertEquals("Metadata file changed after recompilation", originalMetadata, recompiledMetadata) + } } private fun removeRecompiledSuffix(text: String): String = text.replace("-recompiled.js", ".js") @@ -475,7 +483,8 @@ abstract class BasicBoxTest( private fun createPsiFiles(fileNames: List): List = fileNames.map(this::createPsiFile) private fun createConfig( - sourceDirs: List,module: TestModule, dependencies: List, friends: List, multiModule: Boolean, incrementalData: IncrementalData? + sourceDirs: List,module: TestModule, dependencies: List, friends: List, + multiModule: Boolean, incrementalData: IncrementalData? ): JsConfig { val configuration = environment.configuration.copy() diff --git a/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/BoxJsTestGenerated.java b/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/BoxJsTestGenerated.java index e5fb9d3cb6a..0c7b103cf0d 100644 --- a/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/BoxJsTestGenerated.java +++ b/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/BoxJsTestGenerated.java @@ -3686,6 +3686,12 @@ public class BoxJsTestGenerated extends AbstractBoxJsTest { doTest(fileName); } + @TestMetadata("jsModule.kt") + public void testJsModule() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("js/js.translator/testData/box/incremental/jsModule.kt"); + doTest(fileName); + } + @TestMetadata("multipleExport.kt") public void testMultipleExport() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("js/js.translator/testData/box/incremental/multipleExport.kt"); diff --git a/js/js.translator/testData/box/incremental/jsModule.js b/js/js.translator/testData/box/incremental/jsModule.js new file mode 100644 index 00000000000..e23b8236e20 --- /dev/null +++ b/js/js.translator/testData/box/incremental/jsModule.js @@ -0,0 +1,14 @@ +define("foo", [], function() { + return { + "fooF": function() { + return "foo"; + } + }; +}); +define("bar", [], function() { + return { + "barF": function() { + return "bar"; + } + }; +}); \ No newline at end of file diff --git a/js/js.translator/testData/box/incremental/jsModule.kt b/js/js.translator/testData/box/incremental/jsModule.kt new file mode 100644 index 00000000000..7904eb29357 --- /dev/null +++ b/js/js.translator/testData/box/incremental/jsModule.kt @@ -0,0 +1,32 @@ +// EXPECTED_REACHABLE_NODES: 1018 + +// MODULE: lib +// FILE: a.kt +// MODULE_KIND: AMD +@file:JsModule("foo") + +external fun fooF(): String + +// FILE: b.kt +@file:JsModule("bar") + +external fun barF(): String + +// FILE: c.kt +// RECOMPILE +fun dummyF() = "dummy" + +// MODULE: main(lib) +// FILE: main.kt +// MODULE_KIND: AMD + +fun box(): String { + val foo = fooF() + if (foo != "foo") return "fail1: $foo" + + val bar = barF() + if (bar != "bar") return "fail2: $bar" + + return "OK" +} + From ca014468ee20babc043822c0963d5016d98f3722 Mon Sep 17 00:00:00 2001 From: Alexey Andreev Date: Tue, 19 Sep 2017 12:53:35 +0300 Subject: [PATCH 074/212] JS: improve name clash checker to handle complicated cases See KT-18010 --- .../testsWithJsStdLib/name/bridgeClash.kt | 18 +++++ .../testsWithJsStdLib/name/bridgeClash.txt | 30 ++++++++ .../name/nameSwapInOverride.kt | 21 ++++++ .../name/nameSwapInOverride.txt | 26 +++++++ .../DiagnosticsTestWithJsStdLibGenerated.java | 12 ++++ .../resolve/diagnostics/JsNameClashChecker.kt | 68 ++++++++++++------- 6 files changed, 152 insertions(+), 23 deletions(-) create mode 100644 compiler/testData/diagnostics/testsWithJsStdLib/name/bridgeClash.kt create mode 100644 compiler/testData/diagnostics/testsWithJsStdLib/name/bridgeClash.txt create mode 100644 compiler/testData/diagnostics/testsWithJsStdLib/name/nameSwapInOverride.kt create mode 100644 compiler/testData/diagnostics/testsWithJsStdLib/name/nameSwapInOverride.txt diff --git a/compiler/testData/diagnostics/testsWithJsStdLib/name/bridgeClash.kt b/compiler/testData/diagnostics/testsWithJsStdLib/name/bridgeClash.kt new file mode 100644 index 00000000000..6a9fb53452e --- /dev/null +++ b/compiler/testData/diagnostics/testsWithJsStdLib/name/bridgeClash.kt @@ -0,0 +1,18 @@ +interface I { + fun foo() +} + +interface J { + @JsName("bar") + fun foo() +} + +interface K : I, J { + override fun foo() +} + +interface L : K { + override fun foo() + + fun bar() +} \ No newline at end of file diff --git a/compiler/testData/diagnostics/testsWithJsStdLib/name/bridgeClash.txt b/compiler/testData/diagnostics/testsWithJsStdLib/name/bridgeClash.txt new file mode 100644 index 00000000000..4d495cbd2d1 --- /dev/null +++ b/compiler/testData/diagnostics/testsWithJsStdLib/name/bridgeClash.txt @@ -0,0 +1,30 @@ +package + +public interface I { + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public abstract fun foo(): kotlin.Unit + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String +} + +public interface J { + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + @kotlin.js.JsName(name = "bar") public abstract fun foo(): kotlin.Unit + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String +} + +public interface K : I, J { + public open override /*2*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public abstract override /*2*/ fun foo(): kotlin.Unit + public open override /*2*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*2*/ /*fake_override*/ fun toString(): kotlin.String +} + +public interface L : K { + public abstract fun bar(): kotlin.Unit + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public abstract override /*1*/ fun foo(): kotlin.Unit + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String +} diff --git a/compiler/testData/diagnostics/testsWithJsStdLib/name/nameSwapInOverride.kt b/compiler/testData/diagnostics/testsWithJsStdLib/name/nameSwapInOverride.kt new file mode 100644 index 00000000000..6de82abc7aa --- /dev/null +++ b/compiler/testData/diagnostics/testsWithJsStdLib/name/nameSwapInOverride.kt @@ -0,0 +1,21 @@ +interface I { + @JsName("bar") + fun foo() + + @JsName("foo") + fun bar() +} + +interface J { + fun foo() + + fun bar() +} + +class A : I, J { + // Duplicate diagnostics are expected here, since `bar()` function gets both `foo` and `bar` names and clashes with both + // names of `foo()` function. + override fun bar() {} + + override fun foo() {} +} diff --git a/compiler/testData/diagnostics/testsWithJsStdLib/name/nameSwapInOverride.txt b/compiler/testData/diagnostics/testsWithJsStdLib/name/nameSwapInOverride.txt new file mode 100644 index 00000000000..d5ac7be2757 --- /dev/null +++ b/compiler/testData/diagnostics/testsWithJsStdLib/name/nameSwapInOverride.txt @@ -0,0 +1,26 @@ +package + +public final class A : I, J { + public constructor A() + public open override /*2*/ fun bar(): kotlin.Unit + public open override /*2*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*2*/ fun foo(): kotlin.Unit + public open override /*2*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*2*/ /*fake_override*/ fun toString(): kotlin.String +} + +public interface I { + @kotlin.js.JsName(name = "foo") public abstract fun bar(): kotlin.Unit + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + @kotlin.js.JsName(name = "bar") public abstract fun foo(): kotlin.Unit + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String +} + +public interface J { + public abstract fun bar(): kotlin.Unit + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public abstract fun foo(): kotlin.Unit + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String +} diff --git a/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestWithJsStdLibGenerated.java b/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestWithJsStdLibGenerated.java index 8a92d12fac9..0e62b5bdb38 100644 --- a/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestWithJsStdLibGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestWithJsStdLibGenerated.java @@ -467,6 +467,12 @@ public class DiagnosticsTestWithJsStdLibGenerated extends AbstractDiagnosticsTes KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("compiler/testData/diagnostics/testsWithJsStdLib/name"), Pattern.compile("^(.+)\\.kt$"), TargetBackend.ANY, true); } + @TestMetadata("bridgeClash.kt") + public void testBridgeClash() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/diagnostics/testsWithJsStdLib/name/bridgeClash.kt"); + doTest(fileName); + } + @TestMetadata("classAndFunction.kt") public void testClassAndFunction() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/diagnostics/testsWithJsStdLib/name/classAndFunction.kt"); @@ -587,6 +593,12 @@ public class DiagnosticsTestWithJsStdLibGenerated extends AbstractDiagnosticsTes doTest(fileName); } + @TestMetadata("nameSwapInOverride.kt") + public void testNameSwapInOverride() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/diagnostics/testsWithJsStdLib/name/nameSwapInOverride.kt"); + doTest(fileName); + } + @TestMetadata("overrideOverloadedNativeFunction.kt") public void testOverrideOverloadedNativeFunction() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/diagnostics/testsWithJsStdLib/name/overrideOverloadedNativeFunction.kt"); diff --git a/js/js.frontend/src/org/jetbrains/kotlin/js/resolve/diagnostics/JsNameClashChecker.kt b/js/js.frontend/src/org/jetbrains/kotlin/js/resolve/diagnostics/JsNameClashChecker.kt index da62c9b60f8..71c48a391d8 100644 --- a/js/js.frontend/src/org/jetbrains/kotlin/js/resolve/diagnostics/JsNameClashChecker.kt +++ b/js/js.frontend/src/org/jetbrains/kotlin/js/resolve/diagnostics/JsNameClashChecker.kt @@ -20,6 +20,7 @@ import org.jetbrains.kotlin.descriptors.* import org.jetbrains.kotlin.diagnostics.DiagnosticSink import org.jetbrains.kotlin.diagnostics.Errors import org.jetbrains.kotlin.js.naming.NameSuggestion +import org.jetbrains.kotlin.js.naming.SuggestedName import org.jetbrains.kotlin.js.translate.utils.AnnotationsUtils import org.jetbrains.kotlin.psi.KtDeclaration import org.jetbrains.kotlin.resolve.BindingContext @@ -40,7 +41,7 @@ class JsNameClashChecker : SimpleDeclarationChecker { private val nameSuggestion = NameSuggestion() private val scopes = mutableMapOf>() private val clashedFakeOverrides = mutableMapOf>() - private val clashedDescriptors = mutableSetOf() + private val clashedDescriptors = mutableSetOf>() override fun check( declaration: KtDeclaration, @@ -61,28 +62,29 @@ class JsNameClashChecker : SimpleDeclarationChecker { ) { if (descriptor is ConstructorDescriptor && descriptor.isPrimary) return - val suggested = nameSuggestion.suggest(descriptor)!! - if (suggested.stable && suggested.scope is ClassOrPackageFragmentDescriptor && presentsInGeneratedCode(suggested.descriptor)) { - val scope = getScope(suggested.scope) - val name = suggested.names.last() - val existing = scope[name] - if (existing != null && - existing != descriptor && - existing.isActual == descriptor.isActual && - existing.isExpect == descriptor.isExpect && - !bindingContext.isCommonDiagnosticReported(declaration) - ) { - diagnosticHolder.report(ErrorsJs.JS_NAME_CLASH.on(declaration, name, existing)) - val existingDeclaration = existing.findPsi() - if (clashedDescriptors.add(existing) && existingDeclaration is KtDeclaration && existingDeclaration != declaration) { - diagnosticHolder.report(ErrorsJs.JS_NAME_CLASH.on(existingDeclaration, name, descriptor)) + for (suggested in nameSuggestion.suggestAllPossibleNames(descriptor)) { + if (suggested.stable && suggested.scope is ClassOrPackageFragmentDescriptor && presentsInGeneratedCode(suggested.descriptor)) { + val scope = getScope(suggested.scope) + val name = suggested.names.last() + val existing = scope[name] + if (existing != null && + existing != descriptor && + existing.isActual == descriptor.isActual && + existing.isExpect == descriptor.isExpect && + !bindingContext.isCommonDiagnosticReported(declaration) + ) { + diagnosticHolder.report(ErrorsJs.JS_NAME_CLASH.on(declaration, name, existing)) + val existingDeclaration = existing.findPsi() + if (clashedDescriptors.add(existing to name) && existingDeclaration is KtDeclaration && + existingDeclaration != declaration) { + diagnosticHolder.report(ErrorsJs.JS_NAME_CLASH.on(existingDeclaration, name, descriptor)) + } } } } - val fqnDescriptor = suggested.descriptor - if (fqnDescriptor is ClassDescriptor) { - val fakeOverrides = fqnDescriptor.defaultType.memberScope.getContributedDescriptors().asSequence() + if (descriptor is ClassDescriptor) { + val fakeOverrides = descriptor.unsubstitutedMemberScope.getContributedDescriptors().asSequence() .mapNotNull { it as? CallableMemberDescriptor } .filter { it.kind == CallableMemberDescriptor.Kind.FAKE_OVERRIDE } for (override in fakeOverrides) { @@ -105,6 +107,25 @@ class JsNameClashChecker : SimpleDeclarationChecker { } } + private fun NameSuggestion.suggestAllPossibleNames(descriptor: DeclarationDescriptor): Collection = + if (descriptor is CallableMemberDescriptor) { + val primary = suggest(descriptor) + if (primary != null) { + val overriddenNames = descriptor.overriddenDescriptors.flatMap { + suggestAllPossibleNames(it).map { overridden -> + SuggestedName(overridden.names, overridden.stable, primary.descriptor, primary.scope) + } + } + (overriddenNames + primary).distinctBy { it.names } + } + else { + emptyList() + } + } + else { + listOfNotNull(suggest(descriptor)) + } + private fun BindingContext.isCommonDiagnosticReported(declaration: KtDeclaration): Boolean { return diagnostics.forElement(declaration).any { it.factory in COMMON_DIAGNOSTICS } } @@ -149,10 +170,11 @@ class JsNameClashChecker : SimpleDeclarationChecker { } } - val fqn = nameSuggestion.suggest(descriptor) ?: return - if (fqn.stable && presentsInGeneratedCode(fqn.descriptor)) { - target[fqn.names.last()] = fqn.descriptor - (fqn.descriptor as? CallableMemberDescriptor)?.let { checkOverrideClashes(it, target) } + for (fqn in nameSuggestion.suggestAllPossibleNames(descriptor)) { + if (fqn.stable && presentsInGeneratedCode(fqn.descriptor)) { + target[fqn.names.last()] = fqn.descriptor + (fqn.descriptor as? CallableMemberDescriptor)?.let { checkOverrideClashes(it, target) } + } } } From b852f73dd281d8a588b1a34f3c3a0bf3fe1d32ab Mon Sep 17 00:00:00 2001 From: Alexey Andreev Date: Tue, 19 Sep 2017 16:42:10 +0300 Subject: [PATCH 075/212] JS: make string template optimization more conservative See KT-18548 --- .../js/test/semantics/BoxJsTestGenerated.java | 6 +++++ .../expression/StringTemplateTranslator.java | 13 ++++------- .../expression/stringTemplates/nonStrings.kt | 23 +++++++++++++++++++ 3 files changed, 33 insertions(+), 9 deletions(-) create mode 100644 js/js.translator/testData/box/expression/stringTemplates/nonStrings.kt diff --git a/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/BoxJsTestGenerated.java b/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/BoxJsTestGenerated.java index 0c7b103cf0d..81cb2d84753 100644 --- a/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/BoxJsTestGenerated.java +++ b/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/BoxJsTestGenerated.java @@ -3175,6 +3175,12 @@ public class BoxJsTestGenerated extends AbstractBoxJsTest { KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("js/js.translator/testData/box/expression/stringTemplates"), Pattern.compile("^([^_](.+))\\.kt$"), TargetBackend.JS, true); } + @TestMetadata("nonStrings.kt") + public void testNonStrings() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("js/js.translator/testData/box/expression/stringTemplates/nonStrings.kt"); + doTest(fileName); + } + @TestMetadata("objectWithToString.kt") public void testObjectWithToString() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("js/js.translator/testData/box/expression/stringTemplates/objectWithToString.kt"); diff --git a/js/js.translator/src/org/jetbrains/kotlin/js/translate/expression/StringTemplateTranslator.java b/js/js.translator/src/org/jetbrains/kotlin/js/translate/expression/StringTemplateTranslator.java index b1666823145..91952d66708 100644 --- a/js/js.translator/src/org/jetbrains/kotlin/js/translate/expression/StringTemplateTranslator.java +++ b/js/js.translator/src/org/jetbrains/kotlin/js/translate/expression/StringTemplateTranslator.java @@ -112,16 +112,11 @@ public final class StringTemplateTranslator extends AbstractTranslator { private boolean mustCallToString(@NotNull KotlinType type) { Name typeName = DescriptorUtilsKt.getNameIfStandardType(type); - if (typeName != null) { - //TODO: this is a hacky optimization, should use some generic approach - if (NamePredicate.STRING.test(typeName)) { - return false; - } - else if (NamePredicate.PRIMITIVE_NUMBERS.test(typeName)) { - return resultingExpression == null; - } + //TODO: this is a hacky optimization, should use some generic approach + if (typeName != null && NamePredicate.STRING.test(typeName)) { + return false; } - return expressionEntries.length == 1; + return resultingExpression == null; } @Override diff --git a/js/js.translator/testData/box/expression/stringTemplates/nonStrings.kt b/js/js.translator/testData/box/expression/stringTemplates/nonStrings.kt new file mode 100644 index 00000000000..f697630a933 --- /dev/null +++ b/js/js.translator/testData/box/expression/stringTemplates/nonStrings.kt @@ -0,0 +1,23 @@ +// EXPECTED_REACHABLE_NODES: 1024 +fun box(): String { + val x = foo() + val y = bar() + + var r = "$x$y" + if (r != "2342") return "fail: $r" + + r = "$y$x" + if (r != "4223") return "fail: $r" + + r = "$x$x" + if (r != "2323") return "fail: $r" + + r = "$y$y" + if (r != "4242") return "fail: $r" + + return "OK" +} + +fun foo(): Any = 23 + +fun bar() = 42 \ No newline at end of file From 3b2d634cea46ecd629dba84b75de590ecb3e7985 Mon Sep 17 00:00:00 2001 From: Alexey Andreev Date: Fri, 15 Sep 2017 13:20:35 +0300 Subject: [PATCH 076/212] JS: optimize variable representation in coroutines Don't convert local variables to fields of coroutine object when variable is both used and defined in a single block. --- .../coroutine/CoroutineFunctionTransformer.kt | 12 +- .../kotlin/js/coroutine/CoroutinePasses.kt | 104 ++++++++++++++++-- .../js/test/semantics/BoxJsTestGenerated.java | 15 +++ .../js/test/utils/DirectiveTestUtils.java | 24 +++- .../box/coroutines/localVarOptimization.kt | 49 +++++++++ .../testData/lineNumbers/coroutine.kt | 2 +- 6 files changed, 192 insertions(+), 14 deletions(-) create mode 100644 js/js.translator/testData/box/coroutines/localVarOptimization.kt diff --git a/js/js.inliner/src/org/jetbrains/kotlin/js/coroutine/CoroutineFunctionTransformer.kt b/js/js.inliner/src/org/jetbrains/kotlin/js/coroutine/CoroutineFunctionTransformer.kt index 0ce69007a02..6ece38d8da0 100644 --- a/js/js.inliner/src/org/jetbrains/kotlin/js/coroutine/CoroutineFunctionTransformer.kt +++ b/js/js.inliner/src/org/jetbrains/kotlin/js/coroutine/CoroutineFunctionTransformer.kt @@ -43,11 +43,14 @@ class CoroutineFunctionTransformer(private val function: JsFunction, name: Strin val globalCatchBlockIndex = coroutineBlocks.indexOf(context.globalCatchBlock) coroutineBlocks.forEach { it.jsBlock.collectAdditionalLocalVariables() } - coroutineBlocks.forEach { it.jsBlock.replaceLocalVariables(context, localVariables) } + + val survivingLocalVars = coroutineBlocks.collectVariablesSurvivingBetweenBlocks( + localVariables, function.parameters.map { it.name }.toSet()) + coroutineBlocks.forEach { it.jsBlock.replaceLocalVariables(context, survivingLocalVars) } val additionalStatements = mutableListOf() generateDoResume(coroutineBlocks, context, additionalStatements) - generateContinuationConstructor(context, additionalStatements, globalCatchBlockIndex) + generateContinuationConstructor(context, additionalStatements, globalCatchBlockIndex, survivingLocalVars) generateCoroutineInstantiation(context) @@ -57,7 +60,8 @@ class CoroutineFunctionTransformer(private val function: JsFunction, name: Strin private fun generateContinuationConstructor( context: CoroutineTransformationContext, statements: MutableList, - globalCatchBlockIndex: Int + globalCatchBlockIndex: Int, + survivingLocalVars: Set ) { val psiElement = context.metadata.psiElement @@ -93,7 +97,7 @@ class CoroutineFunctionTransformer(private val function: JsFunction, name: Strin if (context.metadata.hasReceiver) { assignToField(context.receiverFieldName, context.receiverFieldName.makeRef(), psiElement) } - for (localVariable in localVariables) { + for (localVariable in survivingLocalVars) { val value = if (localVariable !in parameterNames) Namer.getUndefinedExpression() else localVariable.makeRef() assignToField(context.getFieldName(localVariable), value, psiElement) } diff --git a/js/js.inliner/src/org/jetbrains/kotlin/js/coroutine/CoroutinePasses.kt b/js/js.inliner/src/org/jetbrains/kotlin/js/coroutine/CoroutinePasses.kt index 3b309b9396a..8fbba77946e 100644 --- a/js/js.inliner/src/org/jetbrains/kotlin/js/coroutine/CoroutinePasses.kt +++ b/js/js.inliner/src/org/jetbrains/kotlin/js/coroutine/CoroutinePasses.kt @@ -21,6 +21,7 @@ import org.jetbrains.kotlin.js.backend.ast.metadata.* import org.jetbrains.kotlin.js.inline.util.collectFreeVariables import org.jetbrains.kotlin.js.inline.util.replaceNames import org.jetbrains.kotlin.js.translate.utils.JsAstUtils +import org.jetbrains.kotlin.js.translate.utils.splitToRanges fun JsNode.collectNodesToSplit(breakContinueTargets: Map): Set { val root = this @@ -239,6 +240,79 @@ fun JsBlock.replaceSpecialReferences(context: CoroutineTransformationContext) { visitor.accept(this) } +fun List.collectVariablesSurvivingBetweenBlocks(localVariables: Set, parameters: Set): Set { + val varDefinedIn = localVariables.associate { it to mutableSetOf() } + val varDeclaredIn = localVariables.associate { it to mutableSetOf() } + val varUsedIn = localVariables.associate { it to mutableSetOf() } + + for ((blockIndex, block) in withIndex()) { + for (statement in block.statements) { + statement.accept(object : RecursiveJsVisitor() { + override fun visitNameRef(nameRef: JsNameRef) { + super.visitNameRef(nameRef) + varUsedIn[nameRef.name]?.add(blockIndex) + } + + override fun visit(x: JsVars.JsVar) { + varDeclaredIn[x.name]?.add(blockIndex) + if (x.initExpression != null) { + varDefinedIn[x.name]?.add(blockIndex) + } + super.visit(x) + + } + + override fun visitBinaryExpression(x: JsBinaryOperation) { + val lhs = x.arg1 + if (x.operator.isAssignment && lhs is JsNameRef) { + varDefinedIn[lhs.name]?.add(blockIndex)?.let { + accept(x.arg2) + return + } + } + super.visitBinaryExpression(x) + } + + override fun visitFunction(x: JsFunction) { + x.name?.let { + varDefinedIn[it]?.add(blockIndex) + } + } + + override fun visitLabel(x: JsLabel) { + accept(x.statement) + } + + override fun visitBreak(x: JsBreak) {} + + override fun visitContinue(x: JsContinue) {} + }) + } + } + + fun JsName.isLocalInBlock(): Boolean { + val def = varDefinedIn[this]!! + val use = varUsedIn[this]!! + val decl = varDeclaredIn[this]!! + if (def.size == 1 && use.size == 1) { + val singleDef = def.single() + val singleUse = use.single() + return singleDef == singleUse && decl.isNotEmpty() + } + return use.isEmpty() + } + + return localVariables.filterNot { localVar -> + if (localVar in parameters) { + varUsedIn[localVar]!!.isEmpty() && varDefinedIn[localVar]!!.isEmpty() && varDeclaredIn[localVar]!!.isEmpty() + } + else { + localVar.isLocalInBlock() + } + }.toSet() + +} + fun JsBlock.replaceLocalVariables(context: CoroutineTransformationContext, localVariables: Set) { replaceSpecialReferences(context) @@ -269,22 +343,36 @@ fun JsBlock.replaceLocalVariables(context: CoroutineTransformationContext, local } override fun endVisit(x: JsVars, ctx: JsContext) { - val assignments = x.vars.mapNotNull { - val fieldName = context.getFieldName(it.name) - val initExpression = it.initExpression - if (initExpression != null) { - JsAstUtils.assignment(JsNameRef(fieldName, JsThisRef()), it.initExpression) + if (x.vars.none { it.name in localVariables }) return + + val statements = mutableListOf() + for ((range, shouldReplace) in x.vars.splitToRanges { it.name in localVariables }) { + if (shouldReplace) { + val assignments = x.vars.mapNotNull { + val fieldName = context.getFieldName(it.name) + val initExpression = it.initExpression + if (initExpression != null) { + JsAstUtils.assignment(JsNameRef(fieldName, JsThisRef()), it.initExpression) + } + else { + null + } + } + if (assignments.isNotEmpty()) { + statements += JsExpressionStatement(JsAstUtils.newSequence(assignments)) + } } else { - null + statements += JsVars(*range.toTypedArray()) } } - if (assignments.isNotEmpty()) { - ctx.replaceMe(JsExpressionStatement(JsAstUtils.newSequence(assignments))) + if (statements.size == 1) { + ctx.replaceMe(statements[0]) } else { ctx.removeMe() + ctx.addPrevious(statements) } } } diff --git a/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/BoxJsTestGenerated.java b/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/BoxJsTestGenerated.java index 81cb2d84753..707fac75316 100644 --- a/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/BoxJsTestGenerated.java +++ b/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/BoxJsTestGenerated.java @@ -912,6 +912,21 @@ public class BoxJsTestGenerated extends AbstractBoxJsTest { } } + @TestMetadata("js/js.translator/testData/box/coroutines") + @TestDataPath("$PROJECT_ROOT") + @RunWith(JUnit3RunnerWithInners.class) + public static class Coroutines extends AbstractBoxJsTest { + public void testAllFilesPresentInCoroutines() throws Exception { + KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("js/js.translator/testData/box/coroutines"), Pattern.compile("^([^_](.+))\\.kt$"), TargetBackend.JS, true); + } + + @TestMetadata("localVarOptimization.kt") + public void testLocalVarOptimization() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("js/js.translator/testData/box/coroutines/localVarOptimization.kt"); + doTest(fileName); + } + } + @TestMetadata("js/js.translator/testData/box/crossModuleRef") @TestDataPath("$PROJECT_ROOT") @RunWith(JUnit3RunnerWithInners.class) diff --git a/js/js.tests/test/org/jetbrains/kotlin/js/test/utils/DirectiveTestUtils.java b/js/js.tests/test/org/jetbrains/kotlin/js/test/utils/DirectiveTestUtils.java index 8213e8a0c7d..7adc4c22a16 100644 --- a/js/js.tests/test/org/jetbrains/kotlin/js/test/utils/DirectiveTestUtils.java +++ b/js/js.tests/test/org/jetbrains/kotlin/js/test/utils/DirectiveTestUtils.java @@ -299,6 +299,27 @@ public class DirectiveTestUtils { } }; + private static final DirectiveHandler DECLARES_VARIABLE = new DirectiveHandler("DECLARES_VARIABLE") { + @Override + void processEntry(@NotNull JsNode ast, @NotNull ArgumentsHelper arguments) throws Exception { + String functionName = arguments.getNamedArgument("function"); + String varName = arguments.getNamedArgument("name"); + JsFunction function = AstSearchUtil.getFunction(ast, functionName); + boolean[] varDeclared = new boolean[1]; + function.accept(new RecursiveJsVisitor() { + @Override + public void visit(@NotNull JsVars.JsVar x) { + super.visit(x); + if (x.getName().getIdent().equals(varName)) { + varDeclared[0] = true; + } + } + }); + + assertTrue("Function " + functionName + " does not declare variable " + varName, varDeclared[0]); + } + }; + private static final List DIRECTIVE_HANDLERS = Arrays.asList( FUNCTION_CONTAINS_NO_CALLS, FUNCTION_NOT_CALLED, @@ -319,7 +340,8 @@ public class DirectiveTestUtils { NOT_REFERENCED, HAS_INLINE_METADATA, HAS_NO_INLINE_METADATA, - HAS_NO_CAPTURED_VARS + HAS_NO_CAPTURED_VARS, + DECLARES_VARIABLE ); public static void processDirectives(@NotNull JsNode ast, @NotNull String sourceCode) throws Exception { diff --git a/js/js.translator/testData/box/coroutines/localVarOptimization.kt b/js/js.translator/testData/box/coroutines/localVarOptimization.kt new file mode 100644 index 00000000000..431365d4f21 --- /dev/null +++ b/js/js.translator/testData/box/coroutines/localVarOptimization.kt @@ -0,0 +1,49 @@ +// EXPECTED_REACHABLE_NODES: 1124 +// DECLARES_VARIABLE: function=doResume name=k +// PROPERTY_READ_COUNT: name=local$o count=1 +// PROPERTY_WRITE_COUNT: name=local$o count=2 +import kotlin.coroutines.experimental.* + +var next: () -> Unit = {} +var complete = false +var log = "" + +suspend fun foo(x: String): String = suspendCoroutine { continuation -> + log += "[$x]" + next = { continuation.resume(x) } +} + +fun build(x: suspend () -> Unit) { + next = { + x.startCoroutine(object : Continuation { + override val context = EmptyCoroutineContext + + override fun resume(x: Unit) { + complete = true + } + + override fun resumeWithException(x: Throwable) { + complete = true + } + }) + } +} + +fun box(): String { + build { + val o = foo("O") + log += "-" + val k = foo("K") + log += ":" + log += "{$o$k}" + } + + while (!complete) { + next() + log += "#" + } + + if (log != "[O]#-[K]#:{OK}#") return "fail: $log" + + return "OK" +} \ No newline at end of file diff --git a/js/js.translator/testData/lineNumbers/coroutine.kt b/js/js.translator/testData/lineNumbers/coroutine.kt index 9055877c714..92ece9624ea 100644 --- a/js/js.translator/testData/lineNumbers/coroutine.kt +++ b/js/js.translator/testData/lineNumbers/coroutine.kt @@ -14,4 +14,4 @@ suspend fun bar(): Unit { println(a + b) } -// LINES: 4 4 4 5 5 5 5 6 4 4 4 15 9 9 9 9 15 9 9 9 9 * 15 10 10 11 11 11 11 11 * 11 12 12 13 13 13 13 13 13 14 14 \ No newline at end of file +// LINES: 4 4 4 5 5 5 5 6 4 4 4 15 9 9 9 9 15 9 9 9 * 15 10 10 11 11 11 11 11 * 11 12 12 13 13 13 13 13 13 13 14 14 \ No newline at end of file From 69e3dd89f6a1610a9f991f2e9bf975176008305e Mon Sep 17 00:00:00 2001 From: Mikhail Zarechenskiy Date: Fri, 15 Sep 2017 12:52:52 +0300 Subject: [PATCH 077/212] Split diagnostic factory for the ease of code evolution and tooling --- .../jetbrains/kotlin/diagnostics/Errors.java | 3 +- .../rendering/DefaultErrorMessages.java | 3 +- .../AssigningNamedArgumentToVarargChecker.kt | 6 +-- ...SingleElementsInNamedFormAnnDeprecation.kt | 8 ++-- ...SingleElementsInNamedFormFunDeprecation.kt | 40 +++++++++---------- 5 files changed, 31 insertions(+), 29 deletions(-) diff --git a/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/Errors.java b/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/Errors.java index 19efb1684ec..6ba01356aea 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/Errors.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/Errors.java @@ -625,7 +625,8 @@ public interface Errors { DiagnosticFactory1 MISSING_RECEIVER = DiagnosticFactory1.create(ERROR); DiagnosticFactory0 NO_RECEIVER_ALLOWED = DiagnosticFactory0.create(ERROR); - DiagnosticFactory0 ASSIGNING_SINGLE_ELEMENT_TO_VARARG_IN_NAMED_FORM = DiagnosticFactory0.create(WARNING); + DiagnosticFactory0 ASSIGNING_SINGLE_ELEMENT_TO_VARARG_IN_NAMED_FORM_FUNCTION = DiagnosticFactory0.create(WARNING); + DiagnosticFactory0 ASSIGNING_SINGLE_ELEMENT_TO_VARARG_IN_NAMED_FORM_ANNOTATION = DiagnosticFactory0.create(WARNING); // Call resolution diff --git a/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/rendering/DefaultErrorMessages.java b/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/rendering/DefaultErrorMessages.java index 76a6d946ab5..41c8bf29b30 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/rendering/DefaultErrorMessages.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/rendering/DefaultErrorMessages.java @@ -760,7 +760,8 @@ public class DefaultErrorMessages { MAP.put(NO_VALUE_FOR_PARAMETER, "No value passed for parameter ''{0}''", NAME); MAP.put(MISSING_RECEIVER, "A receiver of type {0} is required", RENDER_TYPE); MAP.put(NO_RECEIVER_ALLOWED, "No receiver can be passed to this function or property"); - MAP.put(ASSIGNING_SINGLE_ELEMENT_TO_VARARG_IN_NAMED_FORM, "Assigning single elements to varargs in named form is deprecated"); + MAP.put(ASSIGNING_SINGLE_ELEMENT_TO_VARARG_IN_NAMED_FORM_FUNCTION, "Assigning single elements to varargs in named form is deprecated"); + MAP.put(ASSIGNING_SINGLE_ELEMENT_TO_VARARG_IN_NAMED_FORM_ANNOTATION, "Assigning single elements to varargs in named form is deprecated"); MAP.put(CREATING_AN_INSTANCE_OF_ABSTRACT_CLASS, "Cannot create an instance of an abstract class"); diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/checkers/AssigningNamedArgumentToVarargChecker.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/checkers/AssigningNamedArgumentToVarargChecker.kt index a42dfdcd479..285a6e79526 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/checkers/AssigningNamedArgumentToVarargChecker.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/checkers/AssigningNamedArgumentToVarargChecker.kt @@ -64,11 +64,11 @@ class AssigningNamedArgumentToVarargChecker : CallChecker { ) { if (isArrayOrArrayLiteral(argument, context)) { if (argument.hasSpread()) { - context.trace.report(Errors.ASSIGNING_SINGLE_ELEMENT_TO_VARARG_IN_NAMED_FORM.on(argumentExpression)) + context.trace.report(Errors.ASSIGNING_SINGLE_ELEMENT_TO_VARARG_IN_NAMED_FORM_ANNOTATION.on(argumentExpression)) } } else { - context.trace.report(Errors.ASSIGNING_SINGLE_ELEMENT_TO_VARARG_IN_NAMED_FORM.on(argumentExpression)) + context.trace.report(Errors.ASSIGNING_SINGLE_ELEMENT_TO_VARARG_IN_NAMED_FORM_ANNOTATION.on(argumentExpression)) } } @@ -78,7 +78,7 @@ class AssigningNamedArgumentToVarargChecker : CallChecker { context: ResolutionContext<*> ) { if (!argument.hasSpread()) { - context.trace.report(Errors.ASSIGNING_SINGLE_ELEMENT_TO_VARARG_IN_NAMED_FORM.on(argumentExpression)) + context.trace.report(Errors.ASSIGNING_SINGLE_ELEMENT_TO_VARARG_IN_NAMED_FORM_FUNCTION.on(argumentExpression)) } } diff --git a/compiler/testData/diagnostics/tests/varargs/assigningSingleElementsInNamedFormAnnDeprecation.kt b/compiler/testData/diagnostics/tests/varargs/assigningSingleElementsInNamedFormAnnDeprecation.kt index eabb5fc4add..ed5bb6d1dd7 100644 --- a/compiler/testData/diagnostics/tests/varargs/assigningSingleElementsInNamedFormAnnDeprecation.kt +++ b/compiler/testData/diagnostics/tests/varargs/assigningSingleElementsInNamedFormAnnDeprecation.kt @@ -11,16 +11,16 @@ annotation class Ann(vararg val s: String) -@Ann(s = "value") +@Ann(s = "value") fun test1() {} -@Ann(s = *arrayOf("value")) +@Ann(s = *arrayOf("value")) fun test2() {} -@Ann(s = *["value"]) +@Ann(s = *["value"]) fun test3() {} -@JavaAnn(value = "value") +@JavaAnn(value = "value") fun test4() {} @JavaAnn("value", path = arrayOf("path")) diff --git a/compiler/testData/diagnostics/tests/varargs/assigningSingleElementsInNamedFormFunDeprecation.kt b/compiler/testData/diagnostics/tests/varargs/assigningSingleElementsInNamedFormFunDeprecation.kt index 1c3fca774c4..08784b1b5ef 100644 --- a/compiler/testData/diagnostics/tests/varargs/assigningSingleElementsInNamedFormFunDeprecation.kt +++ b/compiler/testData/diagnostics/tests/varargs/assigningSingleElementsInNamedFormFunDeprecation.kt @@ -6,41 +6,41 @@ fun foo(vararg s: Int) {} open class Cls(vararg p: Long) fun test(i: IntArray) { - foo(s = 1) - foo(s = i) + foo(s = 1) + foo(s = i) foo(s = *i) - foo(s = intArrayOf(1)) + foo(s = intArrayOf(1)) foo(s = *intArrayOf(1)) foo(1) - Cls(p = 1) + Cls(p = 1) - class Sub : Cls(p = 1) + class Sub : Cls(p = 1) - val c = object : Cls(p = 1) {} + val c = object : Cls(p = 1) {} - foo(s = *intArrayOf(elements = 1)) + foo(s = *intArrayOf(elements = 1)) } fun anyFoo(vararg a: Any) {} fun testAny() { - anyFoo(a = "") - anyFoo(a = arrayOf("")) + anyFoo(a = "") + anyFoo(a = arrayOf("")) anyFoo(a = *arrayOf("")) } fun genFoo(vararg t: T) {} fun testGen() { - genFoo(t = 1) - genFoo(t = null) - genFoo>(t = arrayOf()) + genFoo(t = 1) + genFoo(t = null) + genFoo>(t = arrayOf()) genFoo>(t = *arrayOf(arrayOf())) - genFoo(t = "") - genFoo(t = arrayOf("")) + genFoo(t = "") + genFoo(t = arrayOf("")) genFoo(t = *arrayOf("")) } @@ -48,12 +48,12 @@ fun manyFoo(vararg v: Int) {} fun manyFoo(vararg s: String) {} fun testMany(a: Any) { - manyFoo(v = 1) - manyFoo(s = "") + manyFoo(v = 1) + manyFoo(s = "") manyFoo(a) - manyFoo(v = a) - manyFoo(s = a) - manyFoo(v = a as Int) - manyFoo(s = a as String) + manyFoo(v = a) + manyFoo(s = a) + manyFoo(v = a as Int) + manyFoo(s = a as String) } \ No newline at end of file From 66cb8db12ab9614f31f4a275022d30fb1d829ac6 Mon Sep 17 00:00:00 2001 From: Mikhail Zarechenskiy Date: Mon, 25 Sep 2017 18:11:52 +0300 Subject: [PATCH 078/212] Support `LANGUAGE_VERSION` directive in quick fix tests --- .../KotlinLightCodeInsightFixtureTestCase.kt | 24 ++++++++++++++++++- .../AbstractLocalInspectionTest.kt | 20 ++-------------- .../idea/quickfix/AbstractQuickFixTest.kt | 10 ++++---- 3 files changed, 31 insertions(+), 23 deletions(-) diff --git a/idea/idea-test-framework/src/org/jetbrains/kotlin/idea/test/KotlinLightCodeInsightFixtureTestCase.kt b/idea/idea-test-framework/src/org/jetbrains/kotlin/idea/test/KotlinLightCodeInsightFixtureTestCase.kt index b5938618e1f..d5aec1156d8 100644 --- a/idea/idea-test-framework/src/org/jetbrains/kotlin/idea/test/KotlinLightCodeInsightFixtureTestCase.kt +++ b/idea/idea-test-framework/src/org/jetbrains/kotlin/idea/test/KotlinLightCodeInsightFixtureTestCase.kt @@ -1,5 +1,5 @@ /* - * Copyright 2010-2015 JetBrains s.r.o. + * Copyright 2010-2017 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. @@ -23,8 +23,11 @@ import com.intellij.openapi.actionSystem.ActionPlaces import com.intellij.openapi.actionSystem.AnActionEvent import com.intellij.openapi.actionSystem.Presentation import com.intellij.openapi.actionSystem.ex.ActionManagerEx +import com.intellij.openapi.application.WriteAction import com.intellij.openapi.editor.ex.EditorEx +import com.intellij.openapi.externalSystem.service.project.IdeModifiableModelsProviderImpl import com.intellij.openapi.module.Module +import com.intellij.openapi.project.Project import com.intellij.openapi.startup.StartupManager import com.intellij.openapi.util.io.FileUtil import com.intellij.openapi.util.text.StringUtil @@ -32,7 +35,10 @@ import com.intellij.openapi.vfs.newvfs.impl.VfsRootAccess import com.intellij.testFramework.LightProjectDescriptor import com.intellij.testFramework.LoggedErrorProcessor import org.apache.log4j.Logger +import org.jetbrains.kotlin.config.LanguageFeature import org.jetbrains.kotlin.idea.actions.internal.KotlinInternalMode +import org.jetbrains.kotlin.idea.facet.configureFacet +import org.jetbrains.kotlin.idea.facet.getOrCreateFacet import org.jetbrains.kotlin.test.InTextDirectivesUtils import org.jetbrains.kotlin.test.KotlinTestUtils import org.jetbrains.kotlin.test.TestMetadata @@ -171,3 +177,19 @@ abstract class KotlinLightCodeInsightFixtureTestCase : KotlinLightCodeInsightFix return this::class.findAnnotation()?.value ?: super.getTestDataPath() } } + +fun configureLanguageVersion(fileText: String, project: Project, module: Module) { + val version = InTextDirectivesUtils.findStringWithPrefixes(fileText, "// LANGUAGE_VERSION: ") + if (version != null) { + val accessToken = WriteAction.start() + try { + val modelsProvider = IdeModifiableModelsProviderImpl(project) + val facet = module.getOrCreateFacet(modelsProvider, useProjectSettings = false) + facet.configureFacet(version, LanguageFeature.State.DISABLED, null, modelsProvider) + modelsProvider.commit() + } + finally { + accessToken.finish() + } + } +} diff --git a/idea/tests/org/jetbrains/kotlin/idea/inspections/AbstractLocalInspectionTest.kt b/idea/tests/org/jetbrains/kotlin/idea/inspections/AbstractLocalInspectionTest.kt index 6f3e9b2775d..eb4d8753dbf 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/inspections/AbstractLocalInspectionTest.kt +++ b/idea/tests/org/jetbrains/kotlin/idea/inspections/AbstractLocalInspectionTest.kt @@ -18,18 +18,14 @@ package org.jetbrains.kotlin.idea.inspections import com.google.common.collect.Lists import com.intellij.codeInspection.ProblemDescriptor -import com.intellij.openapi.application.WriteAction -import com.intellij.openapi.externalSystem.service.project.IdeModifiableModelsProviderImpl import com.intellij.openapi.util.SystemInfo import com.intellij.openapi.util.io.FileUtil import com.intellij.openapi.vfs.VirtualFile import junit.framework.ComparisonFailure import junit.framework.TestCase -import org.jetbrains.kotlin.config.LanguageFeature -import org.jetbrains.kotlin.idea.facet.configureFacet -import org.jetbrains.kotlin.idea.facet.getOrCreateFacet import org.jetbrains.kotlin.idea.test.DirectiveBasedActionUtils import org.jetbrains.kotlin.idea.test.KotlinLightCodeInsightFixtureTestCase +import org.jetbrains.kotlin.idea.test.configureLanguageVersion import org.jetbrains.kotlin.idea.util.application.executeWriteCommand import org.jetbrains.kotlin.psi.KtFile import org.jetbrains.kotlin.psi.psiUtil.startOffset @@ -86,19 +82,7 @@ abstract class AbstractLocalInspectionTest : KotlinLightCodeInsightFixtureTestCa val fileText = FileUtil.loadFile(mainFile, true) TestCase.assertTrue("\"\" is missing in file \"$mainFile\"", fileText.contains("")) - val version = InTextDirectivesUtils.findStringWithPrefixes(fileText, "// LANGUAGE_VERSION: ") - if (version != null) { - val accessToken = WriteAction.start() - try { - val modelsProvider = IdeModifiableModelsProviderImpl(project) - val facet = module.getOrCreateFacet(modelsProvider, useProjectSettings = false) - facet.configureFacet(version, LanguageFeature.State.DISABLED, null, modelsProvider) - modelsProvider.commit() - } - finally { - accessToken.finish() - } - } + configureLanguageVersion(fileText, project, module) val minJavaVersion = InTextDirectivesUtils.findStringWithPrefixes(fileText, "// MIN_JAVA_VERSION: ") if (minJavaVersion != null && !SystemInfo.isJavaVersionAtLeast(minJavaVersion)) return diff --git a/idea/tests/org/jetbrains/kotlin/idea/quickfix/AbstractQuickFixTest.kt b/idea/tests/org/jetbrains/kotlin/idea/quickfix/AbstractQuickFixTest.kt index f62155200a5..323ca7e6276 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/quickfix/AbstractQuickFixTest.kt +++ b/idea/tests/org/jetbrains/kotlin/idea/quickfix/AbstractQuickFixTest.kt @@ -1,5 +1,5 @@ /* - * Copyright 2010-2015 JetBrains s.r.o. + * Copyright 2010-2017 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. @@ -43,7 +43,10 @@ import java.io.IOException abstract class AbstractQuickFixTest : KotlinLightCodeInsightFixtureTestCase() { @Throws(Exception::class) protected fun doTest(beforeFileName: String) { - enableInspections(beforeFileName) + val beforeFileText = FileUtil.loadFile(File(beforeFileName)) + configureLanguageVersion(beforeFileText, project, module) + + enableInspections(beforeFileName, beforeFileText) doKotlinQuickFixTest(beforeFileName) checkForUnexpectedErrors() @@ -140,8 +143,7 @@ abstract class AbstractQuickFixTest : KotlinLightCodeInsightFixtureTestCase() { } } - private fun enableInspections(beforeFileName: String) { - val beforeFileText = FileUtil.loadFile(File(beforeFileName)) + private fun enableInspections(beforeFileName: String, beforeFileText: String) { val toolsStrings = InTextDirectivesUtils.findListWithPrefixes(beforeFileText, "TOOL:") if (toolsStrings.isNotEmpty()) { val inspections = toolsStrings.map { toolFqName -> From 8ab7c26cae9615db775367030a261986049113c1 Mon Sep 17 00:00:00 2001 From: Mikhail Zarechenskiy Date: Fri, 15 Sep 2017 14:53:45 +0300 Subject: [PATCH 079/212] Provide quick fix for named arguments to varargs in annotations See more in KT-20171 --- .../ReplaceArrayOfWithLiteralInspection.kt | 6 +++ .../kotlin/idea/quickfix/QuickFixRegistrar.kt | 2 + .../ReplaceWithArrayCallInAnnotationFix.kt | 54 +++++++++++++++++++ .../replaceArrayOfWithLiteral/vararg.kt.after | 2 +- .../emptyLiteral.kt | 7 +++ .../emptyLiteral.kt.after | 7 +++ .../literalWithValues.kt | 7 +++ .../literalWithValues.kt.after | 7 +++ .../replaceSingleElementInNamedForm.kt | 7 +++ .../replaceSingleElementInNamedForm.kt.after | 7 +++ .../idea/quickfix/QuickFixTestGenerated.java | 27 ++++++++++ 11 files changed, 132 insertions(+), 1 deletion(-) create mode 100644 idea/src/org/jetbrains/kotlin/idea/quickfix/ReplaceWithArrayCallInAnnotationFix.kt create mode 100644 idea/testData/quickfix/replaceWithArrayCallInAnnotation/emptyLiteral.kt create mode 100644 idea/testData/quickfix/replaceWithArrayCallInAnnotation/emptyLiteral.kt.after create mode 100644 idea/testData/quickfix/replaceWithArrayCallInAnnotation/literalWithValues.kt create mode 100644 idea/testData/quickfix/replaceWithArrayCallInAnnotation/literalWithValues.kt.after create mode 100644 idea/testData/quickfix/replaceWithArrayCallInAnnotation/replaceSingleElementInNamedForm.kt create mode 100644 idea/testData/quickfix/replaceWithArrayCallInAnnotation/replaceSingleElementInNamedForm.kt.after diff --git a/idea/src/org/jetbrains/kotlin/idea/inspections/ReplaceArrayOfWithLiteralInspection.kt b/idea/src/org/jetbrains/kotlin/idea/inspections/ReplaceArrayOfWithLiteralInspection.kt index 36701c19182..cdc801cb7d5 100644 --- a/idea/src/org/jetbrains/kotlin/idea/inspections/ReplaceArrayOfWithLiteralInspection.kt +++ b/idea/src/org/jetbrains/kotlin/idea/inspections/ReplaceArrayOfWithLiteralInspection.kt @@ -27,6 +27,7 @@ import org.jetbrains.kotlin.config.LanguageFeature.ArrayLiteralsInAnnotations import org.jetbrains.kotlin.idea.intentions.isArrayOfMethod import org.jetbrains.kotlin.idea.project.languageVersionSettings import org.jetbrains.kotlin.psi.* +import org.jetbrains.kotlin.psi.psiUtil.getParentOfType class ReplaceArrayOfWithLiteralInspection : AbstractKotlinInspection() { @@ -69,6 +70,10 @@ class ReplaceArrayOfWithLiteralInspection : AbstractKotlinInspection() { override fun applyFix(project: Project, descriptor: ProblemDescriptor) { val calleeExpression = descriptor.psiElement as KtExpression val callExpression = calleeExpression.parent as KtCallExpression + + val valueArgument = callExpression.getParentOfType(false) + valueArgument?.getSpreadElement()?.delete() + val arguments = callExpression.valueArguments val arrayLiteral = KtPsiFactory(callExpression).buildExpression { appendFixedText("[") @@ -80,6 +85,7 @@ class ReplaceArrayOfWithLiteralInspection : AbstractKotlinInspection() { } appendFixedText("]") } as KtCollectionLiteralExpression + callExpression.replace(arrayLiteral) } } diff --git a/idea/src/org/jetbrains/kotlin/idea/quickfix/QuickFixRegistrar.kt b/idea/src/org/jetbrains/kotlin/idea/quickfix/QuickFixRegistrar.kt index e26c27d8aa5..3bf32a3ba8b 100644 --- a/idea/src/org/jetbrains/kotlin/idea/quickfix/QuickFixRegistrar.kt +++ b/idea/src/org/jetbrains/kotlin/idea/quickfix/QuickFixRegistrar.kt @@ -516,5 +516,7 @@ class QuickFixRegistrar : QuickFixContributor { NO_CONSTRUCTOR.registerFactory(RemoveNoConstructorFix) ANNOTATION_USED_AS_ANNOTATION_ARGUMENT.registerFactory(RemoveAtFromAnnotationArgument) + + ASSIGNING_SINGLE_ELEMENT_TO_VARARG_IN_NAMED_FORM_ANNOTATION.registerFactory(ReplaceWithArrayCallInAnnotationFix) } } diff --git a/idea/src/org/jetbrains/kotlin/idea/quickfix/ReplaceWithArrayCallInAnnotationFix.kt b/idea/src/org/jetbrains/kotlin/idea/quickfix/ReplaceWithArrayCallInAnnotationFix.kt new file mode 100644 index 00000000000..8d29c2583fe --- /dev/null +++ b/idea/src/org/jetbrains/kotlin/idea/quickfix/ReplaceWithArrayCallInAnnotationFix.kt @@ -0,0 +1,54 @@ +/* + * Copyright 2010-2017 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.quickfix + +import com.intellij.openapi.editor.Editor +import com.intellij.openapi.project.Project +import org.jetbrains.kotlin.diagnostics.Diagnostic +import org.jetbrains.kotlin.psi.* +import org.jetbrains.kotlin.psi.psiUtil.getParentOfType +import org.jetbrains.kotlin.utils.addToStdlib.safeAs + +class ReplaceWithArrayCallInAnnotationFix(argument: KtExpression) : KotlinQuickFixAction(argument) { + override fun getText() = "Replace with array call" + + override fun getFamilyName() = text + + override fun invoke(project: Project, editor: Editor?, file: KtFile) { + val argument = element?.getParentOfType(false) ?: return + val spreadElement = argument.getSpreadElement() + if (spreadElement != null) + spreadElement.delete() + else + surroundWithArrayLiteral(argument) + } + + private fun surroundWithArrayLiteral(argument: KtValueArgument) { + val argumentExpression = argument.getArgumentExpression() ?: return + val factory = KtPsiFactory(argumentExpression) + val surrounded = factory.createExpressionByPattern("[$0]", argumentExpression) + + argumentExpression.replace(surrounded) + } + + companion object : KotlinSingleIntentionActionFactory() { + override fun createAction(diagnostic: Diagnostic): KotlinQuickFixAction? { + val element = diagnostic.psiElement.safeAs() ?: return null + return ReplaceWithArrayCallInAnnotationFix(element) + } + } +} diff --git a/idea/testData/inspectionsLocal/replaceArrayOfWithLiteral/vararg.kt.after b/idea/testData/inspectionsLocal/replaceArrayOfWithLiteral/vararg.kt.after index 6b1e9b59e1b..294d3e0f3c9 100644 --- a/idea/testData/inspectionsLocal/replaceArrayOfWithLiteral/vararg.kt.after +++ b/idea/testData/inspectionsLocal/replaceArrayOfWithLiteral/vararg.kt.after @@ -2,5 +2,5 @@ annotation class Some(vararg val strings: String) -@Some(strings = *["alpha", "beta", "omega"]) +@Some(strings = ["alpha", "beta", "omega"]) class My diff --git a/idea/testData/quickfix/replaceWithArrayCallInAnnotation/emptyLiteral.kt b/idea/testData/quickfix/replaceWithArrayCallInAnnotation/emptyLiteral.kt new file mode 100644 index 00000000000..728b5a3b81e --- /dev/null +++ b/idea/testData/quickfix/replaceWithArrayCallInAnnotation/emptyLiteral.kt @@ -0,0 +1,7 @@ +// "Replace with array call" "true" +// LANGUAGE_VERSION: 1.2 + +annotation class Some(vararg val strings: String) + +@Some(strings = *[]) +class My diff --git a/idea/testData/quickfix/replaceWithArrayCallInAnnotation/emptyLiteral.kt.after b/idea/testData/quickfix/replaceWithArrayCallInAnnotation/emptyLiteral.kt.after new file mode 100644 index 00000000000..93273c46e9c --- /dev/null +++ b/idea/testData/quickfix/replaceWithArrayCallInAnnotation/emptyLiteral.kt.after @@ -0,0 +1,7 @@ +// "Replace with array call" "true" +// LANGUAGE_VERSION: 1.2 + +annotation class Some(vararg val strings: String) + +@Some(strings = []) +class My diff --git a/idea/testData/quickfix/replaceWithArrayCallInAnnotation/literalWithValues.kt b/idea/testData/quickfix/replaceWithArrayCallInAnnotation/literalWithValues.kt new file mode 100644 index 00000000000..bcebbb9b558 --- /dev/null +++ b/idea/testData/quickfix/replaceWithArrayCallInAnnotation/literalWithValues.kt @@ -0,0 +1,7 @@ +// "Replace with array call" "true" +// LANGUAGE_VERSION: 1.2 + +annotation class Some(vararg val ints: Int) + +@Some(ints = *[1, 2, 3]) +class My diff --git a/idea/testData/quickfix/replaceWithArrayCallInAnnotation/literalWithValues.kt.after b/idea/testData/quickfix/replaceWithArrayCallInAnnotation/literalWithValues.kt.after new file mode 100644 index 00000000000..b440a6ab667 --- /dev/null +++ b/idea/testData/quickfix/replaceWithArrayCallInAnnotation/literalWithValues.kt.after @@ -0,0 +1,7 @@ +// "Replace with array call" "true" +// LANGUAGE_VERSION: 1.2 + +annotation class Some(vararg val ints: Int) + +@Some(ints = [1, 2, 3]) +class My diff --git a/idea/testData/quickfix/replaceWithArrayCallInAnnotation/replaceSingleElementInNamedForm.kt b/idea/testData/quickfix/replaceWithArrayCallInAnnotation/replaceSingleElementInNamedForm.kt new file mode 100644 index 00000000000..05b4db95035 --- /dev/null +++ b/idea/testData/quickfix/replaceWithArrayCallInAnnotation/replaceSingleElementInNamedForm.kt @@ -0,0 +1,7 @@ +// "Replace with array call" "true" +// LANGUAGE_VERSION: 1.2 + +annotation class Some(vararg val strings: String) + +@Some(strings = "value") +class My diff --git a/idea/testData/quickfix/replaceWithArrayCallInAnnotation/replaceSingleElementInNamedForm.kt.after b/idea/testData/quickfix/replaceWithArrayCallInAnnotation/replaceSingleElementInNamedForm.kt.after new file mode 100644 index 00000000000..afc80464996 --- /dev/null +++ b/idea/testData/quickfix/replaceWithArrayCallInAnnotation/replaceSingleElementInNamedForm.kt.after @@ -0,0 +1,7 @@ +// "Replace with array call" "true" +// LANGUAGE_VERSION: 1.2 + +annotation class Some(vararg val strings: String) + +@Some(strings = ["value"]) +class My diff --git a/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java b/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java index af726b8a80b..7215eb40544 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java @@ -9279,6 +9279,33 @@ public class QuickFixTestGenerated extends AbstractQuickFixTest { } } + @TestMetadata("idea/testData/quickfix/replaceWithArrayCallInAnnotation") + @TestDataPath("$PROJECT_ROOT") + @RunWith(JUnit3RunnerWithInners.class) + public static class ReplaceWithArrayCallInAnnotation extends AbstractQuickFixTest { + public void testAllFilesPresentInReplaceWithArrayCallInAnnotation() throws Exception { + KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("idea/testData/quickfix/replaceWithArrayCallInAnnotation"), Pattern.compile("^([\\w\\-_]+)\\.kt$"), TargetBackend.ANY, true); + } + + @TestMetadata("emptyLiteral.kt") + public void testEmptyLiteral() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/quickfix/replaceWithArrayCallInAnnotation/emptyLiteral.kt"); + doTest(fileName); + } + + @TestMetadata("literalWithValues.kt") + public void testLiteralWithValues() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/quickfix/replaceWithArrayCallInAnnotation/literalWithValues.kt"); + doTest(fileName); + } + + @TestMetadata("replaceSingleElementInNamedForm.kt") + public void testReplaceSingleElementInNamedForm() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/quickfix/replaceWithArrayCallInAnnotation/replaceSingleElementInNamedForm.kt"); + doTest(fileName); + } + } + @TestMetadata("idea/testData/quickfix/replaceWithDotCall") @TestDataPath("$PROJECT_ROOT") @RunWith(JUnit3RunnerWithInners.class) From 8a545f05de3f105fb305ea566002d2957f0bc219 Mon Sep 17 00:00:00 2001 From: Mikhail Zarechenskiy Date: Tue, 26 Sep 2017 12:03:22 +0300 Subject: [PATCH 080/212] Provide quick fix for migration of single elements in named arguments See more in KT-20171 --- .../jetbrains/kotlin/diagnostics/Errors.java | 2 +- .../rendering/DefaultErrorMessages.java | 2 +- .../AssigningNamedArgumentToVarargChecker.kt | 7 ++- .../kotlin/idea/quickfix/QuickFixRegistrar.kt | 1 + ...hArrayOfWithSpreadOperatorInFunctionFix.kt | 60 +++++++++++++++++++ .../replaceForVarargOfAny.kt | 8 +++ .../replaceForVarargOfAny.kt.after | 8 +++ .../replaceToArrayOfPrimitiveTypes.kt | 8 +++ .../replaceToArrayOfPrimitiveTypes.kt.after | 8 +++ .../simpleNamedArgumentToVararg.kt | 8 +++ .../simpleNamedArgumentToVararg.kt.after | 8 +++ .../surroundWithSpreadForConstructorCall.kt | 8 +++ ...roundWithSpreadForConstructorCall.kt.after | 8 +++ .../idea/quickfix/QuickFixTestGenerated.java | 33 ++++++++++ 14 files changed, 164 insertions(+), 5 deletions(-) create mode 100644 idea/src/org/jetbrains/kotlin/idea/quickfix/SurroundWithArrayOfWithSpreadOperatorInFunctionFix.kt create mode 100644 idea/testData/quickfix/surroundWithArrayOfForNamedArgumentsToVarargs/replaceForVarargOfAny.kt create mode 100644 idea/testData/quickfix/surroundWithArrayOfForNamedArgumentsToVarargs/replaceForVarargOfAny.kt.after create mode 100644 idea/testData/quickfix/surroundWithArrayOfForNamedArgumentsToVarargs/replaceToArrayOfPrimitiveTypes.kt create mode 100644 idea/testData/quickfix/surroundWithArrayOfForNamedArgumentsToVarargs/replaceToArrayOfPrimitiveTypes.kt.after create mode 100644 idea/testData/quickfix/surroundWithArrayOfForNamedArgumentsToVarargs/simpleNamedArgumentToVararg.kt create mode 100644 idea/testData/quickfix/surroundWithArrayOfForNamedArgumentsToVarargs/simpleNamedArgumentToVararg.kt.after create mode 100644 idea/testData/quickfix/surroundWithArrayOfForNamedArgumentsToVarargs/surroundWithSpreadForConstructorCall.kt create mode 100644 idea/testData/quickfix/surroundWithArrayOfForNamedArgumentsToVarargs/surroundWithSpreadForConstructorCall.kt.after diff --git a/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/Errors.java b/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/Errors.java index 6ba01356aea..93fdebaa290 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/Errors.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/Errors.java @@ -625,7 +625,7 @@ public interface Errors { DiagnosticFactory1 MISSING_RECEIVER = DiagnosticFactory1.create(ERROR); DiagnosticFactory0 NO_RECEIVER_ALLOWED = DiagnosticFactory0.create(ERROR); - DiagnosticFactory0 ASSIGNING_SINGLE_ELEMENT_TO_VARARG_IN_NAMED_FORM_FUNCTION = DiagnosticFactory0.create(WARNING); + DiagnosticFactory1 ASSIGNING_SINGLE_ELEMENT_TO_VARARG_IN_NAMED_FORM_FUNCTION = DiagnosticFactory1.create(WARNING); DiagnosticFactory0 ASSIGNING_SINGLE_ELEMENT_TO_VARARG_IN_NAMED_FORM_ANNOTATION = DiagnosticFactory0.create(WARNING); // Call resolution diff --git a/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/rendering/DefaultErrorMessages.java b/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/rendering/DefaultErrorMessages.java index 41c8bf29b30..3b82f8970ca 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/rendering/DefaultErrorMessages.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/rendering/DefaultErrorMessages.java @@ -760,7 +760,7 @@ public class DefaultErrorMessages { MAP.put(NO_VALUE_FOR_PARAMETER, "No value passed for parameter ''{0}''", NAME); MAP.put(MISSING_RECEIVER, "A receiver of type {0} is required", RENDER_TYPE); MAP.put(NO_RECEIVER_ALLOWED, "No receiver can be passed to this function or property"); - MAP.put(ASSIGNING_SINGLE_ELEMENT_TO_VARARG_IN_NAMED_FORM_FUNCTION, "Assigning single elements to varargs in named form is deprecated"); + MAP.put(ASSIGNING_SINGLE_ELEMENT_TO_VARARG_IN_NAMED_FORM_FUNCTION, "Assigning single elements to varargs in named form is deprecated", TO_STRING); MAP.put(ASSIGNING_SINGLE_ELEMENT_TO_VARARG_IN_NAMED_FORM_ANNOTATION, "Assigning single elements to varargs in named form is deprecated"); MAP.put(CREATING_AN_INSTANCE_OF_ABSTRACT_CLASS, "Cannot create an instance of an abstract class"); diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/checkers/AssigningNamedArgumentToVarargChecker.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/checkers/AssigningNamedArgumentToVarargChecker.kt index 285a6e79526..5c71ff19f1f 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/checkers/AssigningNamedArgumentToVarargChecker.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/checkers/AssigningNamedArgumentToVarargChecker.kt @@ -53,7 +53,7 @@ class AssigningNamedArgumentToVarargChecker : CallChecker { checkAssignmentOfSingleElementInAnnotation(argument, argumentExpression, context) } else { - checkAssignmentOfSingleElementInFunction(argument, argumentExpression, context) + checkAssignmentOfSingleElementInFunction(argument, argumentExpression, context, parameterDescriptor) } } @@ -75,10 +75,11 @@ class AssigningNamedArgumentToVarargChecker : CallChecker { private fun checkAssignmentOfSingleElementInFunction( argument: ValueArgument, argumentExpression: KtExpression, - context: ResolutionContext<*> + context: ResolutionContext<*>, + parameterDescriptor: ValueParameterDescriptor ) { if (!argument.hasSpread()) { - context.trace.report(Errors.ASSIGNING_SINGLE_ELEMENT_TO_VARARG_IN_NAMED_FORM_FUNCTION.on(argumentExpression)) + context.trace.report(Errors.ASSIGNING_SINGLE_ELEMENT_TO_VARARG_IN_NAMED_FORM_FUNCTION.on(argumentExpression, parameterDescriptor.type)) } } diff --git a/idea/src/org/jetbrains/kotlin/idea/quickfix/QuickFixRegistrar.kt b/idea/src/org/jetbrains/kotlin/idea/quickfix/QuickFixRegistrar.kt index 3bf32a3ba8b..9a939866246 100644 --- a/idea/src/org/jetbrains/kotlin/idea/quickfix/QuickFixRegistrar.kt +++ b/idea/src/org/jetbrains/kotlin/idea/quickfix/QuickFixRegistrar.kt @@ -518,5 +518,6 @@ class QuickFixRegistrar : QuickFixContributor { ANNOTATION_USED_AS_ANNOTATION_ARGUMENT.registerFactory(RemoveAtFromAnnotationArgument) ASSIGNING_SINGLE_ELEMENT_TO_VARARG_IN_NAMED_FORM_ANNOTATION.registerFactory(ReplaceWithArrayCallInAnnotationFix) + ASSIGNING_SINGLE_ELEMENT_TO_VARARG_IN_NAMED_FORM_FUNCTION.registerFactory(SurroundWithArrayOfWithSpreadOperatorInFunctionFix) } } diff --git a/idea/src/org/jetbrains/kotlin/idea/quickfix/SurroundWithArrayOfWithSpreadOperatorInFunctionFix.kt b/idea/src/org/jetbrains/kotlin/idea/quickfix/SurroundWithArrayOfWithSpreadOperatorInFunctionFix.kt new file mode 100644 index 00000000000..5ab4096d6b0 --- /dev/null +++ b/idea/src/org/jetbrains/kotlin/idea/quickfix/SurroundWithArrayOfWithSpreadOperatorInFunctionFix.kt @@ -0,0 +1,60 @@ +/* + * Copyright 2010-2017 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.quickfix + +import com.intellij.openapi.editor.Editor +import com.intellij.openapi.project.Project +import org.jetbrains.kotlin.builtins.KotlinBuiltIns +import org.jetbrains.kotlin.diagnostics.Diagnostic +import org.jetbrains.kotlin.diagnostics.Errors +import org.jetbrains.kotlin.name.Name +import org.jetbrains.kotlin.psi.* +import org.jetbrains.kotlin.psi.psiUtil.getParentOfType +import org.jetbrains.kotlin.resolve.CollectionLiteralResolver.Companion.ARRAY_OF_FUNCTION +import org.jetbrains.kotlin.resolve.CollectionLiteralResolver.Companion.PRIMITIVE_TYPE_TO_ARRAY + +class SurroundWithArrayOfWithSpreadOperatorInFunctionFix( + val wrapper: Name, + argument: KtExpression +) : KotlinQuickFixAction(argument) { + override fun getText() = "Surround with *$wrapper(...)" + + override fun getFamilyName() = text + + override fun invoke(project: Project, editor: Editor?, file: KtFile) { + val argument = element?.getParentOfType(false) ?: return + val argumentName = argument.getArgumentName()?.asName ?: return + val argumentExpression = argument.getArgumentExpression() ?: return + + val factory = KtPsiFactory(argumentExpression) + + val surroundedWithArrayOf = factory.createExpressionByPattern("$wrapper($0)", argumentExpression) + val newArgument = factory.createArgument(surroundedWithArrayOf, argumentName, isSpread = true) + + argument.replace(newArgument) + } + + companion object : KotlinSingleIntentionActionFactory() { + override fun createAction(diagnostic: Diagnostic): KotlinQuickFixAction? { + val actualDiagnostic = Errors.ASSIGNING_SINGLE_ELEMENT_TO_VARARG_IN_NAMED_FORM_FUNCTION.cast(diagnostic) + val parameterType = actualDiagnostic.a + + val wrapper = PRIMITIVE_TYPE_TO_ARRAY[KotlinBuiltIns.getPrimitiveArrayElementType(parameterType)] ?: ARRAY_OF_FUNCTION + return SurroundWithArrayOfWithSpreadOperatorInFunctionFix(wrapper, actualDiagnostic.psiElement) + } + } +} \ No newline at end of file diff --git a/idea/testData/quickfix/surroundWithArrayOfForNamedArgumentsToVarargs/replaceForVarargOfAny.kt b/idea/testData/quickfix/surroundWithArrayOfForNamedArgumentsToVarargs/replaceForVarargOfAny.kt new file mode 100644 index 00000000000..002a7e9c10f --- /dev/null +++ b/idea/testData/quickfix/surroundWithArrayOfForNamedArgumentsToVarargs/replaceForVarargOfAny.kt @@ -0,0 +1,8 @@ +// "Surround with *arrayOf(...)" "true" +// LANGUAGE_VERSION: 1.2 + +fun anyFoo(vararg a: Any) {} + +fun test() { + anyFoo(a = intArrayOf(1)) +} \ No newline at end of file diff --git a/idea/testData/quickfix/surroundWithArrayOfForNamedArgumentsToVarargs/replaceForVarargOfAny.kt.after b/idea/testData/quickfix/surroundWithArrayOfForNamedArgumentsToVarargs/replaceForVarargOfAny.kt.after new file mode 100644 index 00000000000..1742d81541d --- /dev/null +++ b/idea/testData/quickfix/surroundWithArrayOfForNamedArgumentsToVarargs/replaceForVarargOfAny.kt.after @@ -0,0 +1,8 @@ +// "Surround with *arrayOf(...)" "true" +// LANGUAGE_VERSION: 1.2 + +fun anyFoo(vararg a: Any) {} + +fun test() { + anyFoo(a = *arrayOf(intArrayOf(1))) +} \ No newline at end of file diff --git a/idea/testData/quickfix/surroundWithArrayOfForNamedArgumentsToVarargs/replaceToArrayOfPrimitiveTypes.kt b/idea/testData/quickfix/surroundWithArrayOfForNamedArgumentsToVarargs/replaceToArrayOfPrimitiveTypes.kt new file mode 100644 index 00000000000..fd41853c89e --- /dev/null +++ b/idea/testData/quickfix/surroundWithArrayOfForNamedArgumentsToVarargs/replaceToArrayOfPrimitiveTypes.kt @@ -0,0 +1,8 @@ +// "Surround with *intArrayOf(...)" "true" +// LANGUAGE_VERSION: 1.2 + +fun foo(vararg s: Int) {} + +fun test() { + foo(s = 1) +} \ No newline at end of file diff --git a/idea/testData/quickfix/surroundWithArrayOfForNamedArgumentsToVarargs/replaceToArrayOfPrimitiveTypes.kt.after b/idea/testData/quickfix/surroundWithArrayOfForNamedArgumentsToVarargs/replaceToArrayOfPrimitiveTypes.kt.after new file mode 100644 index 00000000000..e1baabbdd86 --- /dev/null +++ b/idea/testData/quickfix/surroundWithArrayOfForNamedArgumentsToVarargs/replaceToArrayOfPrimitiveTypes.kt.after @@ -0,0 +1,8 @@ +// "Surround with *intArrayOf(...)" "true" +// LANGUAGE_VERSION: 1.2 + +fun foo(vararg s: Int) {} + +fun test() { + foo(s = *intArrayOf(1)) +} \ No newline at end of file diff --git a/idea/testData/quickfix/surroundWithArrayOfForNamedArgumentsToVarargs/simpleNamedArgumentToVararg.kt b/idea/testData/quickfix/surroundWithArrayOfForNamedArgumentsToVarargs/simpleNamedArgumentToVararg.kt new file mode 100644 index 00000000000..566dcba3857 --- /dev/null +++ b/idea/testData/quickfix/surroundWithArrayOfForNamedArgumentsToVarargs/simpleNamedArgumentToVararg.kt @@ -0,0 +1,8 @@ +// "Surround with *arrayOf(...)" "true" +// LANGUAGE_VERSION: 1.2 + +fun foo(vararg s: String) {} + +fun test() { + foo(s = "value") +} \ No newline at end of file diff --git a/idea/testData/quickfix/surroundWithArrayOfForNamedArgumentsToVarargs/simpleNamedArgumentToVararg.kt.after b/idea/testData/quickfix/surroundWithArrayOfForNamedArgumentsToVarargs/simpleNamedArgumentToVararg.kt.after new file mode 100644 index 00000000000..a6f4e7c2e10 --- /dev/null +++ b/idea/testData/quickfix/surroundWithArrayOfForNamedArgumentsToVarargs/simpleNamedArgumentToVararg.kt.after @@ -0,0 +1,8 @@ +// "Surround with *arrayOf(...)" "true" +// LANGUAGE_VERSION: 1.2 + +fun foo(vararg s: String) {} + +fun test() { + foo(s = *arrayOf("value")) +} \ No newline at end of file diff --git a/idea/testData/quickfix/surroundWithArrayOfForNamedArgumentsToVarargs/surroundWithSpreadForConstructorCall.kt b/idea/testData/quickfix/surroundWithArrayOfForNamedArgumentsToVarargs/surroundWithSpreadForConstructorCall.kt new file mode 100644 index 00000000000..a48ebe7f75c --- /dev/null +++ b/idea/testData/quickfix/surroundWithArrayOfForNamedArgumentsToVarargs/surroundWithSpreadForConstructorCall.kt @@ -0,0 +1,8 @@ +// "Surround with *arrayOf(...)" "true" +// LANGUAGE_VERSION: 1.2 + +class Foo(vararg val p: T) + +fun test() { + Foo(p = 123) +} \ No newline at end of file diff --git a/idea/testData/quickfix/surroundWithArrayOfForNamedArgumentsToVarargs/surroundWithSpreadForConstructorCall.kt.after b/idea/testData/quickfix/surroundWithArrayOfForNamedArgumentsToVarargs/surroundWithSpreadForConstructorCall.kt.after new file mode 100644 index 00000000000..d0dbf24d87f --- /dev/null +++ b/idea/testData/quickfix/surroundWithArrayOfForNamedArgumentsToVarargs/surroundWithSpreadForConstructorCall.kt.after @@ -0,0 +1,8 @@ +// "Surround with *arrayOf(...)" "true" +// LANGUAGE_VERSION: 1.2 + +class Foo(vararg val p: T) + +fun test() { + Foo(p = *arrayOf(123)) +} \ No newline at end of file diff --git a/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java b/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java index 7215eb40544..5c0631ba9f7 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java @@ -10428,6 +10428,39 @@ public class QuickFixTestGenerated extends AbstractQuickFixTest { } } + @TestMetadata("idea/testData/quickfix/surroundWithArrayOfForNamedArgumentsToVarargs") + @TestDataPath("$PROJECT_ROOT") + @RunWith(JUnit3RunnerWithInners.class) + public static class SurroundWithArrayOfForNamedArgumentsToVarargs extends AbstractQuickFixTest { + public void testAllFilesPresentInSurroundWithArrayOfForNamedArgumentsToVarargs() throws Exception { + KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("idea/testData/quickfix/surroundWithArrayOfForNamedArgumentsToVarargs"), Pattern.compile("^([\\w\\-_]+)\\.kt$"), TargetBackend.ANY, true); + } + + @TestMetadata("replaceForVarargOfAny.kt") + public void testReplaceForVarargOfAny() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/quickfix/surroundWithArrayOfForNamedArgumentsToVarargs/replaceForVarargOfAny.kt"); + doTest(fileName); + } + + @TestMetadata("replaceToArrayOfPrimitiveTypes.kt") + public void testReplaceToArrayOfPrimitiveTypes() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/quickfix/surroundWithArrayOfForNamedArgumentsToVarargs/replaceToArrayOfPrimitiveTypes.kt"); + doTest(fileName); + } + + @TestMetadata("simpleNamedArgumentToVararg.kt") + public void testSimpleNamedArgumentToVararg() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/quickfix/surroundWithArrayOfForNamedArgumentsToVarargs/simpleNamedArgumentToVararg.kt"); + doTest(fileName); + } + + @TestMetadata("surroundWithSpreadForConstructorCall.kt") + public void testSurroundWithSpreadForConstructorCall() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/quickfix/surroundWithArrayOfForNamedArgumentsToVarargs/surroundWithSpreadForConstructorCall.kt"); + doTest(fileName); + } + } + @TestMetadata("idea/testData/quickfix/surroundWithNullCheck") @TestDataPath("$PROJECT_ROOT") @RunWith(JUnit3RunnerWithInners.class) From 09f826b68dd2c51a0a75eba982444dee261f5954 Mon Sep 17 00:00:00 2001 From: Dmitry Jemerov Date: Mon, 25 Sep 2017 15:06:25 +0200 Subject: [PATCH 081/212] Enable UI Designer instrumentation in Gradle build --- buildSrc/src/main/kotlin/instrument.kt | 170 +++++++++++++++++++++++++ idea/build.gradle.kts | 1 + idea/idea-gradle/build.gradle.kts | 6 +- 3 files changed, 175 insertions(+), 2 deletions(-) create mode 100644 buildSrc/src/main/kotlin/instrument.kt diff --git a/buildSrc/src/main/kotlin/instrument.kt b/buildSrc/src/main/kotlin/instrument.kt new file mode 100644 index 00000000000..31a5408f5c5 --- /dev/null +++ b/buildSrc/src/main/kotlin/instrument.kt @@ -0,0 +1,170 @@ +@file:Suppress("unused") // usages in build scripts are not tracked properly + +/* + * Copyright 2010-2017 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. + */ + +import org.gradle.api.Project +import org.gradle.api.artifacts.ProjectDependency +import org.gradle.api.file.ConfigurableFileCollection +import org.gradle.api.file.FileCollection +import org.gradle.api.internal.ConventionTask +import org.gradle.api.plugins.ExtensionAware +import org.gradle.api.plugins.JavaPluginConvention +import org.gradle.api.tasks.* +import org.gradle.api.tasks.compile.AbstractCompile +import org.gradle.kotlin.dsl.* +import java.io.File + +fun Project.configureInstrumentation() { + plugins.matching { it::class.java.canonicalName.startsWith("org.jetbrains.kotlin.gradle.plugin") }.all { + // When we change the output classes directory, Gradle will automatically configure + // the test compile tasks to use the instrumented classes. Normally this is fine, + // however, it causes problems for Kotlin projects: + + // The "internal" modifier can be used to restrict access to the same module. + // To make it possible to use internal methods from the main source set in test classes, + // the Kotlin Gradle plugin adds the original output directory of the Java task + // as "friendly directory" which makes it possible to access internal members + // of the main module. Also this directory should be available on classpath during compilation + + // This fails when we change the classes dir. The easiest fix is to prepend the + // classes from the "friendly directory" to the compile classpath. + val testCompile = tasks.findByName("compileTestKotlin") as AbstractCompile? + testCompile?.doFirst { + val mainSourceSet = the().sourceSets.getByName("main") + testCompile.classpath = (testCompile.classpath + - mainSourceSet.output.classesDirs + + files((mainSourceSet as ExtensionAware).extra.get("classesDirsCopy"))) + } + } + + afterEvaluate { + the().sourceSets.all { sourceSetParam -> + // This copy will ignore filters, but they are unlikely to be used. + val classesDirs = (sourceSetParam.output.classesDirs as ConfigurableFileCollection).from as Collection + + val classesDirsCopy = project.files(classesDirs.toTypedArray()).filter { it.exists() } + (sourceSetParam as ExtensionAware).extra.set("classesDirsCopy", classesDirsCopy) + + logger.info("Saving old sources dir for project ${project.name}") + val instrumentedClassesDir = File(project.buildDir, "classes/${sourceSetParam.name}-instrumented") + (sourceSetParam.output.classesDirs as ConfigurableFileCollection).setFrom(instrumentedClassesDir) + val instrumentTask = project.tasks.create(sourceSetParam.getTaskName("instrument", "classes"), IntelliJInstrumentCodeTask::class.java) + instrumentTask.apply { + dependsOn(sourceSetParam.classesTaskName).onlyIf { !classesDirsCopy.isEmpty } + sourceSet = sourceSetParam + originalClassesDirs = classesDirsCopy + output = instrumentedClassesDir + } + + instrumentTask.outputs.dir(instrumentedClassesDir) + // Ensure that our task is invoked when the source set is built + sourceSetParam.compiledBy(instrumentTask) + @Suppress("UNUSED_EXPRESSION") + true + } + } +} + +@CacheableTask +open class IntelliJInstrumentCodeTask : ConventionTask() { + companion object { + private const val FILTER_ANNOTATION_REGEXP_CLASS = "com.intellij.ant.ClassFilterAnnotationRegexp" + private const val LOADER_REF = "java2.loader" + } + + var sourceSet: SourceSet? = null + + @Input + var originalClassesDirs: FileCollection? = null + + @get:InputFiles + val sourceDirs: FileCollection + get() = project.files(sourceSet!!.allSource.srcDirs.filter { !sourceSet!!.resources.contains(it) && it.exists() }) + + @get:OutputDirectory + var output: File? = null + + @TaskAction + fun instrumentClasses() { + logger.info("input files are: ${originalClassesDirs?.joinToString("; ", transform = { "'${it.name}'${if (it.exists()) "" else " (does not exists)" }"})}") + copyOriginalClasses() + + val classpath = project.ideaSdkDeps("javac2.jar", "jdom.jar", "asm-all.jar", "jgoodies-forms.jar") + + ant.withGroovyBuilder { + "taskdef"("name" to "instrumentIdeaExtensions", + "classpath" to classpath.asPath, + "loaderref" to LOADER_REF, + "classname" to "com.intellij.ant.InstrumentIdeaExtensions") + } + + logger.info("Compiling forms and instrumenting code with nullability preconditions") + val instrumentNotNull = prepareNotNullInstrumenting(classpath) + instrumentCode(sourceDirs, instrumentNotNull) + } + + private fun copyOriginalClasses() { + project.copy { + from(originalClassesDirs) + into(output) + } + } + + private fun prepareNotNullInstrumenting(classpath: ConfigurableFileCollection): Boolean { + ant.withGroovyBuilder { + "typedef"("name" to "skip", + "classpath" to classpath.asPath, + "loaderref" to LOADER_REF, + "classname" to FILTER_ANNOTATION_REGEXP_CLASS) + } + return true + } + + private fun instrumentCode(srcDirs: FileCollection, instrumentNotNull: Boolean) { + val headlessOldValue = System.setProperty("java.awt.headless", "true") + + // Instrumentation needs to have access to sources of forms for inclusion + val depSourceDirectorySets = project.configurations["compile"].dependencies.withType(ProjectDependency::class.java) + .map { p -> p.dependencyProject.the().sourceSets.getByName("main").allSource.sourceDirectories } + val instrumentationClasspath = + depSourceDirectorySets.fold(sourceSet!!.compileClasspath) { acc, v -> acc + v }.asPath.also { + logger.info("Using following dependency source dirs: $it") + } + + logger.info("Running instrumentIdeaExtensions with srcdir=${srcDirs.asPath}}, destdir=$output and classpath=$instrumentationClasspath") + + ant.withGroovyBuilder { + "instrumentIdeaExtensions"("srcdir" to srcDirs.asPath, + "destdir" to output, + "classpath" to instrumentationClasspath, + "includeantruntime" to false, + "instrumentNotNull" to instrumentNotNull) { + if (instrumentNotNull) { + ant.withGroovyBuilder { + "skip"("pattern" to "kotlin/Metadata") + } + } + } + } + + if (headlessOldValue != null) { + System.setProperty("java.awt.headless", headlessOldValue) + } else { + System.clearProperty("java.awt.headless") + } + } +} \ No newline at end of file diff --git a/idea/build.gradle.kts b/idea/build.gradle.kts index e3de3a7c424..8a015254af2 100644 --- a/idea/build.gradle.kts +++ b/idea/build.gradle.kts @@ -109,4 +109,5 @@ projectTest { testsJar {} classesDirsArtifact() +configureInstrumentation() diff --git a/idea/idea-gradle/build.gradle.kts b/idea/idea-gradle/build.gradle.kts index 1fac863ce44..f0c4f5d6fc4 100644 --- a/idea/idea-gradle/build.gradle.kts +++ b/idea/idea-gradle/build.gradle.kts @@ -2,7 +2,7 @@ apply { plugin("kotlin") } dependencies { - compileOnly(ideaSdkDeps("openapi", "idea", "external-system-rt")) + compileOnly(ideaSdkDeps("openapi", "idea", "external-system-rt", "forms_rt")) compileOnly(ideaPluginDeps("gradle-tooling-api", "gradle", "gradle-base-services", plugin = "gradle")) compileOnly(ideaPluginDeps("Groovy", plugin = "Groovy")) @@ -55,4 +55,6 @@ testsJar() projectTest { workingDir = rootDir -} \ No newline at end of file +} + +configureInstrumentation() From e02d1214380a03816fbc670e4b8209c00409f59b Mon Sep 17 00:00:00 2001 From: Dmitry Jemerov Date: Fri, 22 Sep 2017 16:14:16 +0200 Subject: [PATCH 082/212] SuppressNotificationState: rename to .kt --- ...uppressNotificationState.java => SuppressNotificationState.kt} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename idea/src/org/jetbrains/kotlin/idea/versions/{SuppressNotificationState.java => SuppressNotificationState.kt} (100%) diff --git a/idea/src/org/jetbrains/kotlin/idea/versions/SuppressNotificationState.java b/idea/src/org/jetbrains/kotlin/idea/versions/SuppressNotificationState.kt similarity index 100% rename from idea/src/org/jetbrains/kotlin/idea/versions/SuppressNotificationState.java rename to idea/src/org/jetbrains/kotlin/idea/versions/SuppressNotificationState.kt From 572ec19c55864c8099106ab7bd12235069af4032 Mon Sep 17 00:00:00 2001 From: Dmitry Jemerov Date: Fri, 22 Sep 2017 16:28:12 +0200 Subject: [PATCH 083/212] SuppressNotificationState: J2K --- .../versions/SuppressNotificationState.kt | 28 ++++++++----------- ...rtedAbiVersionNotificationPanelProvider.kt | 2 +- 2 files changed, 13 insertions(+), 17 deletions(-) diff --git a/idea/src/org/jetbrains/kotlin/idea/versions/SuppressNotificationState.kt b/idea/src/org/jetbrains/kotlin/idea/versions/SuppressNotificationState.kt index 0fabbbfe030..1fa44c5b1d1 100644 --- a/idea/src/org/jetbrains/kotlin/idea/versions/SuppressNotificationState.kt +++ b/idea/src/org/jetbrains/kotlin/idea/versions/SuppressNotificationState.kt @@ -14,25 +14,21 @@ * limitations under the License. */ -package org.jetbrains.kotlin.idea.versions; +package org.jetbrains.kotlin.idea.versions -import com.intellij.openapi.components.PersistentStateComponent; -import com.intellij.openapi.components.State; -import com.intellij.openapi.components.Storage; -import com.intellij.openapi.components.StoragePathMacros; -import com.intellij.util.xmlb.XmlSerializerUtil; +import com.intellij.openapi.components.PersistentStateComponent +import com.intellij.openapi.components.State +import com.intellij.openapi.components.Storage +import com.intellij.openapi.components.StoragePathMacros +import com.intellij.util.xmlb.XmlSerializerUtil -@State(name = "SuppressABINotification", storages = {@Storage(file = StoragePathMacros.PROJECT_FILE)}) -public class SuppressNotificationState implements PersistentStateComponent { - public boolean isSuppressed; +@State(name = "SuppressABINotification", storages = arrayOf(Storage(file = StoragePathMacros.PROJECT_FILE))) +class SuppressNotificationState : PersistentStateComponent { + var isSuppressed: Boolean = false - @Override - public SuppressNotificationState getState() { - return this; - } + override fun getState(): SuppressNotificationState = this - @Override - public void loadState(SuppressNotificationState state) { - XmlSerializerUtil.copyBean(state, this); + override fun loadState(state: SuppressNotificationState) { + XmlSerializerUtil.copyBean(state, this) } } diff --git a/idea/src/org/jetbrains/kotlin/idea/versions/UnsupportedAbiVersionNotificationPanelProvider.kt b/idea/src/org/jetbrains/kotlin/idea/versions/UnsupportedAbiVersionNotificationPanelProvider.kt index 4cd62634f77..7bf214d0e93 100644 --- a/idea/src/org/jetbrains/kotlin/idea/versions/UnsupportedAbiVersionNotificationPanelProvider.kt +++ b/idea/src/org/jetbrains/kotlin/idea/versions/UnsupportedAbiVersionNotificationPanelProvider.kt @@ -231,7 +231,7 @@ class UnsupportedAbiVersionNotificationPanelProvider(private val project: Projec fun checkAndCreate(module: Module): EditorNotificationPanel? { val state = ServiceManager.getService(project, SuppressNotificationState::class.java).state - if (state != null && state.isSuppressed) { + if (state.isSuppressed) { return null } From c290212901ec12512e45b785b3bdea2ef201cd01 Mon Sep 17 00:00:00 2001 From: Dmitry Jemerov Date: Fri, 22 Sep 2017 17:08:27 +0200 Subject: [PATCH 084/212] Allow to suppress "Kotlin not configured" notification per-module --- .idea/misc.xml | 8 ++++++- .../ConfigureKotlinInProjectUtils.kt | 9 ++++++-- .../ConfigureKotlinNotificationManager.kt | 2 +- ...linSetupEnvironmentNotificationProvider.kt | 10 +++++++- .../versions/SuppressNotificationState.kt | 23 +++++++++++++++---- 5 files changed, 43 insertions(+), 9 deletions(-) diff --git a/.idea/misc.xml b/.idea/misc.xml index 8f4e3ebc3de..b6513e71f2e 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -52,7 +52,13 @@ - diff --git a/idea/src/org/jetbrains/kotlin/idea/configuration/ConfigureKotlinInProjectUtils.kt b/idea/src/org/jetbrains/kotlin/idea/configuration/ConfigureKotlinInProjectUtils.kt index 55499786449..a97fc0f3991 100644 --- a/idea/src/org/jetbrains/kotlin/idea/configuration/ConfigureKotlinInProjectUtils.kt +++ b/idea/src/org/jetbrains/kotlin/idea/configuration/ConfigureKotlinInProjectUtils.kt @@ -37,6 +37,7 @@ import org.jetbrains.kotlin.idea.configuration.ui.notifications.ConfigureKotlinN import org.jetbrains.kotlin.idea.framework.JSLibraryKind import org.jetbrains.kotlin.idea.util.application.runReadAction import org.jetbrains.kotlin.idea.util.projectStructure.allModules +import org.jetbrains.kotlin.idea.versions.SuppressNotificationState import org.jetbrains.kotlin.idea.versions.getKotlinJvmRuntimeMarkerClass import org.jetbrains.kotlin.idea.versions.hasKotlinJsKjsmFile import org.jetbrains.kotlin.idea.vfilefinder.IDEVirtualFileFinder @@ -132,7 +133,7 @@ fun getConfigurableModulesWithKotlinFiles(project: Project): List = emptyList()) { val notificationString = DumbService.getInstance(project).runReadActionInSmartMode(Computable { val modules = getConfigurableModulesWithKotlinFiles(project).exclude(excludeModules) - if (modules.all(::isModuleConfigured)) + if (modules.all(::isNotConfiguredNotificationRequired)) null else ConfigureKotlinNotification.getNotificationString(project, excludeModules) @@ -153,6 +154,10 @@ fun showConfigureKotlinNotificationIfNeeded(project: Project, excludeModules: Li } } +fun isNotConfiguredNotificationRequired(moduleGroup: ModuleSourceRootGroup): Boolean { + return !SuppressNotificationState.isKotlinNotConfiguredSuppressed(moduleGroup) && isModuleConfigured(moduleGroup) +} + fun getAbleToRunConfigurators(project: Project): Collection { val modules = getConfigurableModules(project) diff --git a/idea/src/org/jetbrains/kotlin/idea/configuration/ConfigureKotlinNotificationManager.kt b/idea/src/org/jetbrains/kotlin/idea/configuration/ConfigureKotlinNotificationManager.kt index e0ad5899781..8dbc8488851 100644 --- a/idea/src/org/jetbrains/kotlin/idea/configuration/ConfigureKotlinNotificationManager.kt +++ b/idea/src/org/jetbrains/kotlin/idea/configuration/ConfigureKotlinNotificationManager.kt @@ -76,7 +76,7 @@ fun checkHideNonConfiguredNotifications(project: Project) { if (!checkInProgress.compareAndSet(false, true)) return@executeOnPooledThread DumbService.getInstance(project).waitForSmartMode() - if (getConfigurableModulesWithKotlinFiles(project).all(::isModuleConfigured)) { + if (getConfigurableModulesWithKotlinFiles(project).all(::isNotConfiguredNotificationRequired)) { ApplicationManager.getApplication().invokeLater { ConfigureKotlinNotificationManager.expireOldNotifications(project) checkInProgress.set(false) diff --git a/idea/src/org/jetbrains/kotlin/idea/configuration/KotlinSetupEnvironmentNotificationProvider.kt b/idea/src/org/jetbrains/kotlin/idea/configuration/KotlinSetupEnvironmentNotificationProvider.kt index 339707a0bca..e4d5b85f001 100644 --- a/idea/src/org/jetbrains/kotlin/idea/configuration/KotlinSetupEnvironmentNotificationProvider.kt +++ b/idea/src/org/jetbrains/kotlin/idea/configuration/KotlinSetupEnvironmentNotificationProvider.kt @@ -41,6 +41,7 @@ import org.jetbrains.kotlin.idea.KotlinFileType import org.jetbrains.kotlin.idea.KotlinLanguage import org.jetbrains.kotlin.idea.configuration.ui.KotlinConfigurationCheckerComponent import org.jetbrains.kotlin.idea.util.application.runWriteAction +import org.jetbrains.kotlin.idea.versions.SuppressNotificationState import org.jetbrains.kotlin.idea.versions.UnsupportedAbiVersionNotificationPanelProvider import org.jetbrains.kotlin.idea.versions.createComponentActionLabel @@ -79,8 +80,10 @@ class KotlinSetupEnvironmentNotificationProvider( } if (!KotlinConfigurationCheckerComponent.getInstance(module.project).isSyncing && + !SuppressNotificationState.isKotlinNotConfiguredSuppressed(module.toModuleGroup()) && !hasAnyKotlinRuntimeInScope(module) && - UnsupportedAbiVersionNotificationPanelProvider.collectBadRoots(module).isEmpty()) { + UnsupportedAbiVersionNotificationPanelProvider.collectBadRoots(module).isEmpty() + ) { return createKotlinNotConfiguredPanel(module) } @@ -121,6 +124,11 @@ class KotlinSetupEnvironmentNotificationProvider( configuratorsPopup.showUnderneathOf(label) } } + + createComponentActionLabel("Ignore") { + SuppressNotificationState.suppressKotlinNotConfigured(module) + EditorNotifications.getInstance(module.project).updateAllNotifications() + } } } } diff --git a/idea/src/org/jetbrains/kotlin/idea/versions/SuppressNotificationState.kt b/idea/src/org/jetbrains/kotlin/idea/versions/SuppressNotificationState.kt index 1fa44c5b1d1..890c1595daf 100644 --- a/idea/src/org/jetbrains/kotlin/idea/versions/SuppressNotificationState.kt +++ b/idea/src/org/jetbrains/kotlin/idea/versions/SuppressNotificationState.kt @@ -16,19 +16,34 @@ package org.jetbrains.kotlin.idea.versions -import com.intellij.openapi.components.PersistentStateComponent -import com.intellij.openapi.components.State -import com.intellij.openapi.components.Storage -import com.intellij.openapi.components.StoragePathMacros +import com.intellij.openapi.components.* +import com.intellij.openapi.module.Module +import com.intellij.openapi.project.Project import com.intellij.util.xmlb.XmlSerializerUtil +import org.jetbrains.kotlin.idea.configuration.ModuleSourceRootGroup +import org.jetbrains.kotlin.idea.configuration.toModuleGroup @State(name = "SuppressABINotification", storages = arrayOf(Storage(file = StoragePathMacros.PROJECT_FILE))) class SuppressNotificationState : PersistentStateComponent { var isSuppressed: Boolean = false + var modulesWithSuppressedNotConfigured = sortedSetOf() override fun getState(): SuppressNotificationState = this override fun loadState(state: SuppressNotificationState) { XmlSerializerUtil.copyBean(state, this) } + + companion object { + fun getInstance(project: Project) = ServiceManager.getService(project, SuppressNotificationState::class.java) + + fun isKotlinNotConfiguredSuppressed(moduleGroup: ModuleSourceRootGroup): Boolean { + val baseModule = moduleGroup.baseModule + return baseModule.name in getInstance(baseModule.project).modulesWithSuppressedNotConfigured + } + + fun suppressKotlinNotConfigured(module: Module) { + getInstance(module.project).modulesWithSuppressedNotConfigured.add(module.toModuleGroup().baseModule.name) + } + } } From 7a5e0e110758ef1f973b65e2bed2cc8a6a2a7c9f Mon Sep 17 00:00:00 2001 From: Alexey Tsvetkov Date: Tue, 19 Sep 2017 06:30:00 +0300 Subject: [PATCH 085/212] Request CHUNK_REBUILD when IC is off and there are dirty Kotlin files Otherwise unexpected compile error might happen, when there are Groovy files, but they are not dirty, so Groovy builder does not generate source stubs, and Kotlin builder is filtering out output directory from classpath (because it may contain outdated Java classes). Previously the issue was not detected, because it was not possible to turn off the IC completely (in JPS), only switch to the legacy IC. #KT-20138 --- .../kotlin/jps/build/KotlinJpsBuildTest.kt | 106 +++++++++++++++--- .../kotlin/jps/build/KotlinBuilder.kt | 8 +- .../incrementalOff/build.log | 12 ++ .../incrementalOffOn/build.log | 6 + 4 files changed, 117 insertions(+), 15 deletions(-) diff --git a/jps-plugin/jps-tests/test/org/jetbrains/kotlin/jps/build/KotlinJpsBuildTest.kt b/jps-plugin/jps-tests/test/org/jetbrains/kotlin/jps/build/KotlinJpsBuildTest.kt index cd7b295f01e..cce47a59f34 100644 --- a/jps-plugin/jps-tests/test/org/jetbrains/kotlin/jps/build/KotlinJpsBuildTest.kt +++ b/jps-plugin/jps-tests/test/org/jetbrains/kotlin/jps/build/KotlinJpsBuildTest.kt @@ -24,7 +24,6 @@ import com.intellij.openapi.util.text.StringUtil import com.intellij.openapi.vfs.StandardFileSystems import com.intellij.testFramework.LightVirtualFile import com.intellij.testFramework.UsefulTestCase -import com.intellij.util.ArrayUtil import com.intellij.util.io.URLUtil import com.intellij.util.io.ZipUtil import org.jetbrains.jps.ModuleChunk @@ -43,6 +42,7 @@ import org.jetbrains.jps.incremental.ModuleLevelBuilder import org.jetbrains.jps.incremental.messages.BuildMessage import org.jetbrains.jps.incremental.messages.CompilerMessage import org.jetbrains.jps.model.JpsModuleRootModificationUtil +import org.jetbrains.jps.model.JpsProject import org.jetbrains.jps.model.java.JavaSourceRootType import org.jetbrains.jps.model.java.JpsJavaDependencyScope import org.jetbrains.jps.model.java.JpsJavaExtensionService @@ -510,7 +510,14 @@ open class KotlinJpsBuildTest : AbstractKotlinJpsBuildTestCase() { assertFilesExistInOutput(module, "Foo.class", "Bar.class") assertFilesNotExistInOutput(module, *EXCLUDE_FILES) - checkWhen(touch("src/foo.kt"), null, arrayOf(klass("kotlinProject", "Foo"))) + if (IncrementalCompilation.isEnabled()) { + checkWhen(touch("src/foo.kt"), null, arrayOf(klass("kotlinProject", "Foo"))) + } + else { + val allClasses = myProject.outputPaths() + checkWhen(touch("src/foo.kt"), null, allClasses) + } + checkWhen(touch("src/Excluded.kt"), null, NOTHING) checkWhen(touch("src/dir/YetAnotherExcluded.kt"), null, NOTHING) } @@ -522,8 +529,15 @@ open class KotlinJpsBuildTest : AbstractKotlinJpsBuildTestCase() { assertFilesExistInOutput(module, "Foo.class", "Bar.class") assertFilesNotExistInOutput(module, *EXCLUDE_FILES) - checkWhen(touch("src/foo.kt"), null, arrayOf(klass("kotlinProject", "Foo"))) - checkWhen(touch("src/dir/subdir/bar.kt"), null, arrayOf(klass("kotlinProject", "Bar"))) + if (IncrementalCompilation.isEnabled()) { + checkWhen(touch("src/foo.kt"), null, arrayOf(klass("kotlinProject", "Foo"))) + checkWhen(touch("src/dir/subdir/bar.kt"), null, arrayOf(klass("kotlinProject", "Bar"))) + } + else { + val allClasses = myProject.outputPaths() + checkWhen(touch("src/foo.kt"), null, allClasses) + checkWhen(touch("src/dir/subdir/bar.kt"), null, allClasses) + } checkWhen(touch("src/dir/Excluded.kt"), null, NOTHING) checkWhen(touch("src/dir/subdir/YetAnotherExcluded.kt"), null, NOTHING) @@ -536,7 +550,13 @@ open class KotlinJpsBuildTest : AbstractKotlinJpsBuildTestCase() { assertFilesExistInOutput(module, "Foo.class", "Bar.class") assertFilesNotExistInOutput(module, *EXCLUDE_FILES) - checkWhen(touch("src/foo.kt"), null, arrayOf(klass("kotlinProject", "Foo"))) + if (IncrementalCompilation.isEnabled()) { + checkWhen(touch("src/foo.kt"), null, arrayOf(klass("kotlinProject", "Foo"))) + } + else { + val allClasses = myProject.outputPaths() + checkWhen(touch("src/foo.kt"), null, allClasses) + } checkWhen(touch("src/exclude/Excluded.kt"), null, NOTHING) checkWhen(touch("src/exclude/YetAnotherExcluded.kt"), null, NOTHING) @@ -547,8 +567,15 @@ open class KotlinJpsBuildTest : AbstractKotlinJpsBuildTestCase() { fun testKotlinProjectTwoFilesInOnePackage() { doTest() - checkWhen(touch("src/test1.kt"), null, packageClasses("kotlinProject", "src/test1.kt", "_DefaultPackage")) - checkWhen(touch("src/test2.kt"), null, packageClasses("kotlinProject", "src/test2.kt", "_DefaultPackage")) + if (IncrementalCompilation.isEnabled()) { + checkWhen(touch("src/test1.kt"), null, packageClasses("kotlinProject", "src/test1.kt", "_DefaultPackage")) + checkWhen(touch("src/test2.kt"), null, packageClasses("kotlinProject", "src/test2.kt", "_DefaultPackage")) + } + else { + val allClasses = myProject.outputPaths() + checkWhen(touch("src/test1.kt"), null, allClasses) + checkWhen(touch("src/test2.kt"), null, allClasses) + } checkWhen(arrayOf(del("src/test1.kt"), del("src/test2.kt")), NOTHING, arrayOf(packagePartClass("kotlinProject", "src/test1.kt", "_DefaultPackage"), @@ -596,8 +623,15 @@ open class KotlinJpsBuildTest : AbstractKotlinJpsBuildTestCase() { result.assertSuccessful() - checkWhen(touch("src/kt2.kt"), null, packageClasses("kotlinProject", "src/kt2.kt", "kt2.Kt2Kt")) - checkWhen(touch("module2/src/kt1.kt"), null, packageClasses("module2", "module2/src/kt1.kt", "kt1.Kt1Kt")) + if (IncrementalCompilation.isEnabled()) { + checkWhen(touch("src/kt2.kt"), null, packageClasses("kotlinProject", "src/kt2.kt", "kt2.Kt2Kt")) + checkWhen(touch("module2/src/kt1.kt"), null, packageClasses("module2", "module2/src/kt1.kt", "kt1.Kt1Kt")) + } + else { + val allClasses = myProject.outputPaths() + checkWhen(touch("src/kt2.kt"), null, allClasses) + checkWhen(touch("module2/src/kt1.kt"), null, allClasses) + } } fun testCircularDependenciesSamePackage() { @@ -611,8 +645,16 @@ open class KotlinJpsBuildTest : AbstractKotlinJpsBuildTestCase() { UsefulTestCase.assertSameElements(getMethodsOfClass(facadeWithA), "", "a", "getA") UsefulTestCase.assertSameElements(getMethodsOfClass(facadeWithB), "", "b", "getB", "setB") - checkWhen(touch("module1/src/a.kt"), null, packageClasses("module1", "module1/src/a.kt", "test.TestPackage")) - checkWhen(touch("module2/src/b.kt"), null, packageClasses("module2", "module2/src/b.kt", "test.TestPackage")) + + if (IncrementalCompilation.isEnabled()) { + checkWhen(touch("module1/src/a.kt"), null, packageClasses("module1", "module1/src/a.kt", "test.TestPackage")) + checkWhen(touch("module2/src/b.kt"), null, packageClasses("module2", "module2/src/b.kt", "test.TestPackage")) + } + else { + val allClasses = myProject.outputPaths() + checkWhen(touch("module1/src/a.kt"), null, allClasses) + checkWhen(touch("module2/src/b.kt"), null, allClasses) + } } fun testCircularDependenciesSamePackageWithTests() { @@ -626,8 +668,15 @@ open class KotlinJpsBuildTest : AbstractKotlinJpsBuildTestCase() { UsefulTestCase.assertSameElements(getMethodsOfClass(facadeWithA), "", "a", "funA", "getA") UsefulTestCase.assertSameElements(getMethodsOfClass(facadeWithB), "", "b", "funB", "getB", "setB") - checkWhen(touch("module1/src/a.kt"), null, packageClasses("module1", "module1/src/a.kt", "test.TestPackage")) - checkWhen(touch("module2/src/b.kt"), null, packageClasses("module2", "module2/src/b.kt", "test.TestPackage")) + if (IncrementalCompilation.isEnabled()) { + checkWhen(touch("module1/src/a.kt"), null, packageClasses("module1", "module1/src/a.kt", "test.TestPackage")) + checkWhen(touch("module2/src/b.kt"), null, packageClasses("module2", "module2/src/b.kt", "test.TestPackage")) + } + else { + val allProductionClasses = myProject.outputPaths(tests = false) + checkWhen(touch("module1/src/a.kt"), null, allProductionClasses) + checkWhen(touch("module2/src/b.kt"), null, allProductionClasses) + } } fun testInternalFromAnotherModule() { @@ -849,7 +898,13 @@ open class KotlinJpsBuildTest : AbstractKotlinJpsBuildTestCase() { initProject(JVM_MOCK_RUNTIME) buildAllModules().assertSuccessful() - checkWhen(touch("src/utils.kt"), null, packageClasses("kotlinProject", "src/utils.kt", "_DefaultPackage")) + if (IncrementalCompilation.isEnabled()) { + checkWhen(touch("src/utils.kt"), null, packageClasses("kotlinProject", "src/utils.kt", "_DefaultPackage")) + } + else { + val allClasses = findModule("kotlinProject").outputFilesPaths() + checkWhen(touch("src/utils.kt"), null, allClasses.toTypedArray()) + } val storageRoot = BuildDataPathsImpl(myDataStorageRoot).dataStorageRoot assertTrue(File(storageRoot, "targets/java-production/kotlinProject/kotlin").exists()) @@ -1074,6 +1129,29 @@ open class KotlinJpsBuildTest : AbstractKotlinJpsBuildTestCase() { return klass(moduleName, AsmUtil.internalNameByFqNameWithoutInnerClasses(packagePartFqName)) } + private fun JpsProject.outputPaths(production: Boolean = true, tests: Boolean = true) = + modules.flatMap { it.outputFilesPaths(production = production, tests = tests) }.toTypedArray() + + private fun JpsModule.outputFilesPaths(production: Boolean = true, tests: Boolean = true): List { + val outputFiles = arrayListOf() + if (production) { + prodOut.walk().filterTo(outputFiles) { it.isFile } + } + if (tests) { + testsOut.walk().filterTo(outputFiles) { it.isFile } + } + return outputFiles.map { it.relativeTo(workDir).path } + } + + private val JpsModule.prodOut: File + get() = outDir(forTests = false) + + private val JpsModule.testsOut: File + get() = outDir(forTests = true) + + private fun JpsModule.outDir(forTests: Boolean) = + JpsJavaExtensionService.getInstance().getOutputDirectory(this, forTests)!! + protected enum class Operation { CHANGE, DELETE diff --git a/jps-plugin/src/org/jetbrains/kotlin/jps/build/KotlinBuilder.kt b/jps-plugin/src/org/jetbrains/kotlin/jps/build/KotlinBuilder.kt index 3c1c5e223df..73780a77220 100644 --- a/jps-plugin/src/org/jetbrains/kotlin/jps/build/KotlinBuilder.kt +++ b/jps-plugin/src/org/jetbrains/kotlin/jps/build/KotlinBuilder.kt @@ -238,7 +238,13 @@ class KotlinBuilder : ModuleLevelBuilder(BuilderCategory.SOURCE_PROCESSOR) { val isChunkRebuilding = JavaBuilderUtil.isForcedRecompilationAllJavaModules(context) || targets.any { rebuildAfterCacheVersionChanged[it] == true } - if (!hasKotlinDirtyOrRemovedFiles(dirtyFilesHolder, chunk)) { + if (hasKotlinDirtyOrRemovedFiles(dirtyFilesHolder, chunk)) { + if (!isChunkRebuilding && !IncrementalCompilation.isEnabled()) { + targets.forEach { rebuildAfterCacheVersionChanged[it] = true } + return CHUNK_REBUILD_REQUIRED + } + } + else { if (isChunkRebuilding) { targets.forEach { hasKotlin[it] = false } } diff --git a/jps-plugin/testData/incremental/changeIncrementalOption/incrementalOff/build.log b/jps-plugin/testData/incremental/changeIncrementalOption/incrementalOff/build.log index 141a6fc4b0e..337c3ad1c41 100644 --- a/jps-plugin/testData/incremental/changeIncrementalOption/incrementalOff/build.log +++ b/jps-plugin/testData/incremental/changeIncrementalOption/incrementalOff/build.log @@ -9,6 +9,12 @@ Cleaning output files: out/production/module2/META-INF/module2.kotlin_module out/production/module2/foo/AKt.class End of files +Exit code: CHUNK_REBUILD_REQUIRED +------------------------------------------ +Cleaning output files: + out/production/module2/foo/BKt.class + out/production/module2/foo/CKt.class +End of files Compiling files: module2/src/a.kt module2/src/b.kt @@ -33,6 +39,12 @@ Cleaning output files: out/production/module2/META-INF/module2.kotlin_module out/production/module2/foo/AKt.class End of files +Exit code: CHUNK_REBUILD_REQUIRED +------------------------------------------ +Cleaning output files: + out/production/module2/foo/BKt.class + out/production/module2/foo/CKt.class +End of files Compiling files: module2/src/a.kt module2/src/b.kt diff --git a/jps-plugin/testData/incremental/changeIncrementalOption/incrementalOffOn/build.log b/jps-plugin/testData/incremental/changeIncrementalOption/incrementalOffOn/build.log index fb1064db698..8a34d6e3f46 100644 --- a/jps-plugin/testData/incremental/changeIncrementalOption/incrementalOffOn/build.log +++ b/jps-plugin/testData/incremental/changeIncrementalOption/incrementalOffOn/build.log @@ -9,6 +9,12 @@ Cleaning output files: out/production/module2/META-INF/module2.kotlin_module out/production/module2/foo/AKt.class End of files +Exit code: CHUNK_REBUILD_REQUIRED +------------------------------------------ +Cleaning output files: + out/production/module2/foo/BKt.class + out/production/module2/foo/CKt.class +End of files Compiling files: module2/src/a.kt module2/src/b.kt From 1c7b8ec938bdbf9bb3d76987c481076d61f563fe Mon Sep 17 00:00:00 2001 From: Alexey Tsvetkov Date: Tue, 19 Sep 2017 08:14:16 +0300 Subject: [PATCH 086/212] Change test data so IC and non IC warnings count match When IC is on and new Kotlin class is referencing new Java class, new Kotlin file is compiled twice, because JPS thinks new Kotlin class is affected by new Java class (see https://youtrack.jetbrains.com/issue/KT-20318). This does not happen when IC is off, and KotlinBuilder requests chunk rebuild (see previous commit). I decided to remove the reference, because the issue is now known, and the reference is non critical for the test. --- .../test/org/jetbrains/kotlin/jps/build/KotlinJpsBuildTest.kt | 2 +- .../general/SourcePackageLongPrefix/module2/src/module2.kt | 2 -- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/jps-plugin/jps-tests/test/org/jetbrains/kotlin/jps/build/KotlinJpsBuildTest.kt b/jps-plugin/jps-tests/test/org/jetbrains/kotlin/jps/build/KotlinJpsBuildTest.kt index cce47a59f34..77c3968c5d7 100644 --- a/jps-plugin/jps-tests/test/org/jetbrains/kotlin/jps/build/KotlinJpsBuildTest.kt +++ b/jps-plugin/jps-tests/test/org/jetbrains/kotlin/jps/build/KotlinJpsBuildTest.kt @@ -337,7 +337,7 @@ open class KotlinJpsBuildTest : AbstractKotlinJpsBuildTestCase() { val buildResult = buildAllModules() buildResult.assertSuccessful() val warnings = buildResult.getMessages(BuildMessage.Kind.WARNING) - assertEquals("Warning about invalid package prefix in module 2 is expected: $warnings", 2, warnings.size) + assertEquals("Warning about invalid package prefix in module 2 is expected: $warnings", 1, warnings.size) assertEquals("Invalid package prefix name is ignored: invalid-prefix.test", warnings.first().messageText) } diff --git a/jps-plugin/testData/general/SourcePackageLongPrefix/module2/src/module2.kt b/jps-plugin/testData/general/SourcePackageLongPrefix/module2/src/module2.kt index 9204cc97b43..54cd6bd4c70 100644 --- a/jps-plugin/testData/general/SourcePackageLongPrefix/module2/src/module2.kt +++ b/jps-plugin/testData/general/SourcePackageLongPrefix/module2/src/module2.kt @@ -3,11 +3,9 @@ package some import bad.prefix.KotlinTestInBadPrefix import good.prefix.KotlinTestInGoodPrefix import good.prefix.JavaTest; -import test.JavaRef val goodTest = KotlinTestInGoodPrefix() val badTest = KotlinTestInBadPrefix() val javaTest = JavaTest().bar() -val javaRef = JavaRef().foo(null) From 8a66919a5c058c7ea54351db3aeefce6604e81b0 Mon Sep 17 00:00:00 2001 From: Denis Zharkov Date: Wed, 6 Sep 2017 13:57:05 +0300 Subject: [PATCH 087/212] Support @NonNull(when = NEVER) nullability annotation #KT-20131 Fixed --- .../tests/jsr305NonNullNever.kt | 41 +++++++++++++++++++ .../tests/jsr305NonNullNever.txt | 19 +++++++++ .../jsr305Strange.txt | 2 +- .../tests/jsr305Strange.txt | 2 +- ...sNoAnnotationInClasspathTestGenerated.java | 6 +++ ...pathWithFastClassReadingTestGenerated.java | 6 +++ .../ForeignAnnotationsTestGenerated.java | 6 +++ .../JavacForeignAnnotationsTestGenerated.java | 6 +++ .../typeEnhancement/signatureEnhancement.kt | 2 +- 9 files changed, 87 insertions(+), 3 deletions(-) create mode 100644 compiler/testData/foreignAnnotations/tests/jsr305NonNullNever.kt create mode 100644 compiler/testData/foreignAnnotations/tests/jsr305NonNullNever.txt diff --git a/compiler/testData/foreignAnnotations/tests/jsr305NonNullNever.kt b/compiler/testData/foreignAnnotations/tests/jsr305NonNullNever.kt new file mode 100644 index 00000000000..a9b585a3f0e --- /dev/null +++ b/compiler/testData/foreignAnnotations/tests/jsr305NonNullNever.kt @@ -0,0 +1,41 @@ +// !DIAGNOSTICS: -UNUSED_VARIABLE -UNUSED_PARAMETER +// FILE: MyNullable.java +import javax.annotation.*; +import java.lang.annotation.Documented; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; + +import javax.annotation.meta.TypeQualifierNickname; +import javax.annotation.meta.When; + +@Documented +@TypeQualifierNickname +@Nonnull(when = When.NEVER) +@Retention(RetentionPolicy.RUNTIME) +public @interface MyNullable { + +} + +// FILE: A.java + +import javax.annotation.*; +import javax.annotation.meta.When; + +public class A { + @Nonnull(when = When.NEVER) public String field = null; + + @MyNullable + public String foo(@Nonnull(when = When.NEVER) String x, @MyNullable CharSequence y) { + return ""; + } +} +// FILE: main.kt + +fun main(a: A) { + a.foo("", null)?.length + a.foo("", null).length + a.foo(null, "").length + + a.field?.length + a.field.length +} diff --git a/compiler/testData/foreignAnnotations/tests/jsr305NonNullNever.txt b/compiler/testData/foreignAnnotations/tests/jsr305NonNullNever.txt new file mode 100644 index 00000000000..6b5bc77a4ea --- /dev/null +++ b/compiler/testData/foreignAnnotations/tests/jsr305NonNullNever.txt @@ -0,0 +1,19 @@ +package + +public fun main(/*0*/ a: A): kotlin.Unit + +public open class A { + public constructor A() + @javax.annotation.Nonnull(when = When.NEVER) public final var field: kotlin.String? + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + @MyNullable public open fun foo(/*0*/ @javax.annotation.Nonnull(when = When.NEVER) x: kotlin.String?, /*1*/ @MyNullable y: kotlin.CharSequence?): kotlin.String? + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String +} + +@kotlin.annotation.MustBeDocumented @javax.annotation.meta.TypeQualifierNickname @javax.annotation.Nonnull(when = When.NEVER) @kotlin.annotation.Retention(value = AnnotationRetention.RUNTIME) public final annotation class MyNullable : kotlin.Annotation { + public constructor MyNullable() + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String +} diff --git a/compiler/testData/foreignAnnotations/tests/jsr305NullabilityWarnings/jsr305Strange.txt b/compiler/testData/foreignAnnotations/tests/jsr305NullabilityWarnings/jsr305Strange.txt index 25bdaa38663..988a1586884 100644 --- a/compiler/testData/foreignAnnotations/tests/jsr305NullabilityWarnings/jsr305Strange.txt +++ b/compiler/testData/foreignAnnotations/tests/jsr305NullabilityWarnings/jsr305Strange.txt @@ -7,7 +7,7 @@ public open class A { @javax.annotation.Nonnull(when = When.UNKNOWN) public final var field: kotlin.String! @javax.annotation.Nonnull public open fun bar(): kotlin.String public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean - @javax.annotation.Nonnull(when = When.MAYBE) public open fun foo(/*0*/ @javax.annotation.Nonnull(when = When.ALWAYS) x: kotlin.String, /*1*/ @javax.annotation.Nonnull(when = When.NEVER) y: kotlin.CharSequence!): kotlin.String? + @javax.annotation.Nonnull(when = When.MAYBE) public open fun foo(/*0*/ @javax.annotation.Nonnull(when = When.ALWAYS) x: kotlin.String, /*1*/ @javax.annotation.Nonnull(when = When.NEVER) y: kotlin.CharSequence?): kotlin.String? public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String } diff --git a/compiler/testData/foreignAnnotations/tests/jsr305Strange.txt b/compiler/testData/foreignAnnotations/tests/jsr305Strange.txt index 25bdaa38663..988a1586884 100644 --- a/compiler/testData/foreignAnnotations/tests/jsr305Strange.txt +++ b/compiler/testData/foreignAnnotations/tests/jsr305Strange.txt @@ -7,7 +7,7 @@ public open class A { @javax.annotation.Nonnull(when = When.UNKNOWN) public final var field: kotlin.String! @javax.annotation.Nonnull public open fun bar(): kotlin.String public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean - @javax.annotation.Nonnull(when = When.MAYBE) public open fun foo(/*0*/ @javax.annotation.Nonnull(when = When.ALWAYS) x: kotlin.String, /*1*/ @javax.annotation.Nonnull(when = When.NEVER) y: kotlin.CharSequence!): kotlin.String? + @javax.annotation.Nonnull(when = When.MAYBE) public open fun foo(/*0*/ @javax.annotation.Nonnull(when = When.ALWAYS) x: kotlin.String, /*1*/ @javax.annotation.Nonnull(when = When.NEVER) y: kotlin.CharSequence?): kotlin.String? public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String } diff --git a/compiler/tests/org/jetbrains/kotlin/checkers/ForeignAnnotationsNoAnnotationInClasspathTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/checkers/ForeignAnnotationsNoAnnotationInClasspathTestGenerated.java index d746497c794..0a45f16e696 100644 --- a/compiler/tests/org/jetbrains/kotlin/checkers/ForeignAnnotationsNoAnnotationInClasspathTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/checkers/ForeignAnnotationsNoAnnotationInClasspathTestGenerated.java @@ -66,6 +66,12 @@ public class ForeignAnnotationsNoAnnotationInClasspathTestGenerated extends Abst doTest(fileName); } + @TestMetadata("jsr305NonNullNever.kt") + public void testJsr305NonNullNever() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305NonNullNever.kt"); + doTest(fileName); + } + @TestMetadata("jsr305NullabilityNicknames.kt") public void testJsr305NullabilityNicknames() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305NullabilityNicknames.kt"); diff --git a/compiler/tests/org/jetbrains/kotlin/checkers/ForeignAnnotationsNoAnnotationInClasspathWithFastClassReadingTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/checkers/ForeignAnnotationsNoAnnotationInClasspathWithFastClassReadingTestGenerated.java index 56776cfb8f1..a90e14cec0b 100644 --- a/compiler/tests/org/jetbrains/kotlin/checkers/ForeignAnnotationsNoAnnotationInClasspathWithFastClassReadingTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/checkers/ForeignAnnotationsNoAnnotationInClasspathWithFastClassReadingTestGenerated.java @@ -66,6 +66,12 @@ public class ForeignAnnotationsNoAnnotationInClasspathWithFastClassReadingTestGe doTest(fileName); } + @TestMetadata("jsr305NonNullNever.kt") + public void testJsr305NonNullNever() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305NonNullNever.kt"); + doTest(fileName); + } + @TestMetadata("jsr305NullabilityNicknames.kt") public void testJsr305NullabilityNicknames() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305NullabilityNicknames.kt"); diff --git a/compiler/tests/org/jetbrains/kotlin/checkers/ForeignAnnotationsTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/checkers/ForeignAnnotationsTestGenerated.java index d49b548359c..a2f1d3aebc2 100644 --- a/compiler/tests/org/jetbrains/kotlin/checkers/ForeignAnnotationsTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/checkers/ForeignAnnotationsTestGenerated.java @@ -66,6 +66,12 @@ public class ForeignAnnotationsTestGenerated extends AbstractForeignAnnotationsT doTest(fileName); } + @TestMetadata("jsr305NonNullNever.kt") + public void testJsr305NonNullNever() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305NonNullNever.kt"); + doTest(fileName); + } + @TestMetadata("jsr305NullabilityNicknames.kt") public void testJsr305NullabilityNicknames() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305NullabilityNicknames.kt"); diff --git a/compiler/tests/org/jetbrains/kotlin/checkers/javac/JavacForeignAnnotationsTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/checkers/javac/JavacForeignAnnotationsTestGenerated.java index 07e739c1e56..9d0dce4a19f 100644 --- a/compiler/tests/org/jetbrains/kotlin/checkers/javac/JavacForeignAnnotationsTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/checkers/javac/JavacForeignAnnotationsTestGenerated.java @@ -66,6 +66,12 @@ public class JavacForeignAnnotationsTestGenerated extends AbstractJavacForeignAn doTest(fileName); } + @TestMetadata("jsr305NonNullNever.kt") + public void testJsr305NonNullNever() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305NonNullNever.kt"); + doTest(fileName); + } + @TestMetadata("jsr305NullabilityNicknames.kt") public void testJsr305NullabilityNicknames() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305NullabilityNicknames.kt"); diff --git a/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/typeEnhancement/signatureEnhancement.kt b/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/typeEnhancement/signatureEnhancement.kt index 4a56af91530..0775ba5e1b0 100644 --- a/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/typeEnhancement/signatureEnhancement.kt +++ b/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/typeEnhancement/signatureEnhancement.kt @@ -62,7 +62,7 @@ class SignatureEnhancement(private val annotationTypeQualifierResolver: Annotati return when (enumEntryDescriptor.name.asString()) { "ALWAYS" -> NullabilityQualifierWithMigrationStatus(NullabilityQualifier.NOT_NULL) - "MAYBE" -> NullabilityQualifierWithMigrationStatus(NullabilityQualifier.NULLABLE) + "MAYBE", "NEVER" -> NullabilityQualifierWithMigrationStatus(NullabilityQualifier.NULLABLE) else -> null } } From 02d3d9785cc444df8be0984a03a343ecb8c1c024 Mon Sep 17 00:00:00 2001 From: Denis Zharkov Date: Wed, 6 Sep 2017 15:07:39 +0300 Subject: [PATCH 088/212] Move JSR-305 tests to one directory and strip common name prefix --- .../ignore}/parametersAreNonnullByDefault.kt | 0 .../ignore}/parametersAreNonnullByDefault.txt | 0 .../nonNullNever.kt} | 0 .../nonNullNever.txt} | 0 .../nullabilityNicknames.kt} | 0 .../nullabilityNicknames.txt} | 0 .../fromPlatformTypes/arithmetic.kt | 0 .../fromPlatformTypes/arithmetic.txt | 0 .../fromPlatformTypes/array.kt | 0 .../fromPlatformTypes/array.txt | 0 .../fromPlatformTypes/assignToVar.kt | 0 .../fromPlatformTypes/assignToVar.txt | 0 .../fromPlatformTypes/conditions.kt | 0 .../fromPlatformTypes/conditions.txt | 0 .../fromPlatformTypes/dataFlowInfo.kt | 0 .../fromPlatformTypes/dataFlowInfo.txt | 0 .../fromPlatformTypes/defaultParameters.kt | 0 .../fromPlatformTypes/defaultParameters.txt | 0 .../fromPlatformTypes/delegatedProperties.kt | 0 .../fromPlatformTypes/delegatedProperties.txt | 0 .../fromPlatformTypes/delegation.kt | 0 .../fromPlatformTypes/delegation.txt | 0 .../fromPlatformTypes/derefenceExtension.kt | 0 .../fromPlatformTypes/derefenceExtension.txt | 0 .../fromPlatformTypes/derefenceMember.kt | 0 .../fromPlatformTypes/derefenceMember.txt | 0 .../fromPlatformTypes/expectedType.kt | 0 .../fromPlatformTypes/expectedType.txt | 0 .../fromPlatformTypes/for.kt | 0 .../fromPlatformTypes/for.txt | 0 .../fromPlatformTypes/functionArguments.kt | 0 .../fromPlatformTypes/functionArguments.txt | 0 .../fromPlatformTypes/invoke.kt | 0 .../fromPlatformTypes/invoke.txt | 0 .../fromPlatformTypes/kt6829.kt | 0 .../fromPlatformTypes/kt6829.txt | 0 .../fromPlatformTypes/multiDeclaration.kt | 0 .../fromPlatformTypes/multiDeclaration.txt | 0 .../fromPlatformTypes/passToJava.kt | 0 .../fromPlatformTypes/passToJava.txt | 0 .../fromPlatformTypes/primitiveArray.kt | 0 .../fromPlatformTypes/primitiveArray.txt | 0 .../fromPlatformTypes/throw.kt | 0 .../fromPlatformTypes/throw.txt | 0 .../uselessElvisRightIsNull.kt | 0 .../uselessElvisRightIsNull.txt | 0 .../nullabilityGenerics.kt} | 0 .../nullabilityGenerics.txt} | 0 .../nullabilityNicknames.kt} | 0 .../nullabilityNicknames.txt} | 0 .../nullabilityWarnings/simple.kt} | 0 .../nullabilityWarnings/simple.txt} | 0 .../nullabilityWarnings/strange.kt} | 0 .../nullabilityWarnings/strange.txt} | 0 .../typeQualifierDefault/fieldsAreNullable.kt | 0 .../fieldsAreNullable.txt | 0 .../nullabilityFromOverridden.kt | 0 .../nullabilityFromOverridden.txt | 0 .../overridingDefaultQualifier.kt | 0 .../overridingDefaultQualifier.txt | 0 .../parametersAreNonnullByDefault.kt | 0 .../parametersAreNonnullByDefault.txt | 0 .../parametersAreNonnullByDefaultPackage.kt | 0 .../parametersAreNonnullByDefaultPackage.txt | 0 .../typeQualifierDefault/springNullable.kt | 0 .../typeQualifierDefault/springNullable.txt | 0 .../springNullablePackage.kt | 0 .../springNullablePackage.txt | 0 .../{jsr305Simple.kt => jsr305/simple.kt} | 0 .../{jsr305Simple.txt => jsr305/simple.txt} | 0 .../{jsr305Strange.kt => jsr305/strange.kt} | 0 .../{jsr305Strange.txt => jsr305/strange.txt} | 0 .../typeQualifierDefault/fieldsAreNullable.kt | 0 .../fieldsAreNullable.txt | 0 .../nullabilityFromOverridden.kt | 0 .../nullabilityFromOverridden.txt | 0 .../overridingDefaultQualifier.kt | 0 .../overridingDefaultQualifier.txt | 0 .../parametersAreNonnullByDefault.kt | 0 .../parametersAreNonnullByDefault.txt | 0 .../parametersAreNonnullByDefaultPackage.kt | 0 .../parametersAreNonnullByDefaultPackage.txt | 0 .../typeQualifierDefault/springNullable.kt | 0 .../typeQualifierDefault/springNullable.txt | 0 .../springNullablePackage.kt | 0 .../springNullablePackage.txt | 0 .../{ => jsr305}/springNullableWithTypeUse.kt | 0 .../springNullableWithTypeUse.txt | 0 .../ForeignJava8AnnotationsTestGenerated.java | 17 +- ...cForeignJava8AnnotationsTestGenerated.java | 17 +- ...sNoAnnotationInClasspathTestGenerated.java | 481 +++++++++--------- ...pathWithFastClassReadingTestGenerated.java | 481 +++++++++--------- .../ForeignAnnotationsTestGenerated.java | 481 +++++++++--------- .../JavacForeignAnnotationsTestGenerated.java | 481 +++++++++--------- 94 files changed, 1006 insertions(+), 952 deletions(-) rename compiler/testData/foreignAnnotations/tests/{jsr305Ignore => jsr305/ignore}/parametersAreNonnullByDefault.kt (100%) rename compiler/testData/foreignAnnotations/tests/{jsr305Ignore => jsr305/ignore}/parametersAreNonnullByDefault.txt (100%) rename compiler/testData/foreignAnnotations/tests/{jsr305NonNullNever.kt => jsr305/nonNullNever.kt} (100%) rename compiler/testData/foreignAnnotations/tests/{jsr305NonNullNever.txt => jsr305/nonNullNever.txt} (100%) rename compiler/testData/foreignAnnotations/tests/{jsr305NullabilityNicknames.kt => jsr305/nullabilityNicknames.kt} (100%) rename compiler/testData/foreignAnnotations/tests/{jsr305NullabilityNicknames.txt => jsr305/nullabilityNicknames.txt} (100%) rename compiler/testData/foreignAnnotations/tests/{jsr305NullabilityWarnings => jsr305/nullabilityWarnings}/fromPlatformTypes/arithmetic.kt (100%) rename compiler/testData/foreignAnnotations/tests/{jsr305NullabilityWarnings => jsr305/nullabilityWarnings}/fromPlatformTypes/arithmetic.txt (100%) rename compiler/testData/foreignAnnotations/tests/{jsr305NullabilityWarnings => jsr305/nullabilityWarnings}/fromPlatformTypes/array.kt (100%) rename compiler/testData/foreignAnnotations/tests/{jsr305NullabilityWarnings => jsr305/nullabilityWarnings}/fromPlatformTypes/array.txt (100%) rename compiler/testData/foreignAnnotations/tests/{jsr305NullabilityWarnings => jsr305/nullabilityWarnings}/fromPlatformTypes/assignToVar.kt (100%) rename compiler/testData/foreignAnnotations/tests/{jsr305NullabilityWarnings => jsr305/nullabilityWarnings}/fromPlatformTypes/assignToVar.txt (100%) rename compiler/testData/foreignAnnotations/tests/{jsr305NullabilityWarnings => jsr305/nullabilityWarnings}/fromPlatformTypes/conditions.kt (100%) rename compiler/testData/foreignAnnotations/tests/{jsr305NullabilityWarnings => jsr305/nullabilityWarnings}/fromPlatformTypes/conditions.txt (100%) rename compiler/testData/foreignAnnotations/tests/{jsr305NullabilityWarnings => jsr305/nullabilityWarnings}/fromPlatformTypes/dataFlowInfo.kt (100%) rename compiler/testData/foreignAnnotations/tests/{jsr305NullabilityWarnings => jsr305/nullabilityWarnings}/fromPlatformTypes/dataFlowInfo.txt (100%) rename compiler/testData/foreignAnnotations/tests/{jsr305NullabilityWarnings => jsr305/nullabilityWarnings}/fromPlatformTypes/defaultParameters.kt (100%) rename compiler/testData/foreignAnnotations/tests/{jsr305NullabilityWarnings => jsr305/nullabilityWarnings}/fromPlatformTypes/defaultParameters.txt (100%) rename compiler/testData/foreignAnnotations/tests/{jsr305NullabilityWarnings => jsr305/nullabilityWarnings}/fromPlatformTypes/delegatedProperties.kt (100%) rename compiler/testData/foreignAnnotations/tests/{jsr305NullabilityWarnings => jsr305/nullabilityWarnings}/fromPlatformTypes/delegatedProperties.txt (100%) rename compiler/testData/foreignAnnotations/tests/{jsr305NullabilityWarnings => jsr305/nullabilityWarnings}/fromPlatformTypes/delegation.kt (100%) rename compiler/testData/foreignAnnotations/tests/{jsr305NullabilityWarnings => jsr305/nullabilityWarnings}/fromPlatformTypes/delegation.txt (100%) rename compiler/testData/foreignAnnotations/tests/{jsr305NullabilityWarnings => jsr305/nullabilityWarnings}/fromPlatformTypes/derefenceExtension.kt (100%) rename compiler/testData/foreignAnnotations/tests/{jsr305NullabilityWarnings => jsr305/nullabilityWarnings}/fromPlatformTypes/derefenceExtension.txt (100%) rename compiler/testData/foreignAnnotations/tests/{jsr305NullabilityWarnings => jsr305/nullabilityWarnings}/fromPlatformTypes/derefenceMember.kt (100%) rename compiler/testData/foreignAnnotations/tests/{jsr305NullabilityWarnings => jsr305/nullabilityWarnings}/fromPlatformTypes/derefenceMember.txt (100%) rename compiler/testData/foreignAnnotations/tests/{jsr305NullabilityWarnings => jsr305/nullabilityWarnings}/fromPlatformTypes/expectedType.kt (100%) rename compiler/testData/foreignAnnotations/tests/{jsr305NullabilityWarnings => jsr305/nullabilityWarnings}/fromPlatformTypes/expectedType.txt (100%) rename compiler/testData/foreignAnnotations/tests/{jsr305NullabilityWarnings => jsr305/nullabilityWarnings}/fromPlatformTypes/for.kt (100%) rename compiler/testData/foreignAnnotations/tests/{jsr305NullabilityWarnings => jsr305/nullabilityWarnings}/fromPlatformTypes/for.txt (100%) rename compiler/testData/foreignAnnotations/tests/{jsr305NullabilityWarnings => jsr305/nullabilityWarnings}/fromPlatformTypes/functionArguments.kt (100%) rename compiler/testData/foreignAnnotations/tests/{jsr305NullabilityWarnings => jsr305/nullabilityWarnings}/fromPlatformTypes/functionArguments.txt (100%) rename compiler/testData/foreignAnnotations/tests/{jsr305NullabilityWarnings => jsr305/nullabilityWarnings}/fromPlatformTypes/invoke.kt (100%) rename compiler/testData/foreignAnnotations/tests/{jsr305NullabilityWarnings => jsr305/nullabilityWarnings}/fromPlatformTypes/invoke.txt (100%) rename compiler/testData/foreignAnnotations/tests/{jsr305NullabilityWarnings => jsr305/nullabilityWarnings}/fromPlatformTypes/kt6829.kt (100%) rename compiler/testData/foreignAnnotations/tests/{jsr305NullabilityWarnings => jsr305/nullabilityWarnings}/fromPlatformTypes/kt6829.txt (100%) rename compiler/testData/foreignAnnotations/tests/{jsr305NullabilityWarnings => jsr305/nullabilityWarnings}/fromPlatformTypes/multiDeclaration.kt (100%) rename compiler/testData/foreignAnnotations/tests/{jsr305NullabilityWarnings => jsr305/nullabilityWarnings}/fromPlatformTypes/multiDeclaration.txt (100%) rename compiler/testData/foreignAnnotations/tests/{jsr305NullabilityWarnings => jsr305/nullabilityWarnings}/fromPlatformTypes/passToJava.kt (100%) rename compiler/testData/foreignAnnotations/tests/{jsr305NullabilityWarnings => jsr305/nullabilityWarnings}/fromPlatformTypes/passToJava.txt (100%) rename compiler/testData/foreignAnnotations/tests/{jsr305NullabilityWarnings => jsr305/nullabilityWarnings}/fromPlatformTypes/primitiveArray.kt (100%) rename compiler/testData/foreignAnnotations/tests/{jsr305NullabilityWarnings => jsr305/nullabilityWarnings}/fromPlatformTypes/primitiveArray.txt (100%) rename compiler/testData/foreignAnnotations/tests/{jsr305NullabilityWarnings => jsr305/nullabilityWarnings}/fromPlatformTypes/throw.kt (100%) rename compiler/testData/foreignAnnotations/tests/{jsr305NullabilityWarnings => jsr305/nullabilityWarnings}/fromPlatformTypes/throw.txt (100%) rename compiler/testData/foreignAnnotations/tests/{jsr305NullabilityWarnings => jsr305/nullabilityWarnings}/fromPlatformTypes/uselessElvisRightIsNull.kt (100%) rename compiler/testData/foreignAnnotations/tests/{jsr305NullabilityWarnings => jsr305/nullabilityWarnings}/fromPlatformTypes/uselessElvisRightIsNull.txt (100%) rename compiler/testData/foreignAnnotations/tests/{jsr305NullabilityWarnings/jsr305NullabilityGenerics.kt => jsr305/nullabilityWarnings/nullabilityGenerics.kt} (100%) rename compiler/testData/foreignAnnotations/tests/{jsr305NullabilityWarnings/jsr305NullabilityGenerics.txt => jsr305/nullabilityWarnings/nullabilityGenerics.txt} (100%) rename compiler/testData/foreignAnnotations/tests/{jsr305NullabilityWarnings/jsr305NullabilityNicknames.kt => jsr305/nullabilityWarnings/nullabilityNicknames.kt} (100%) rename compiler/testData/foreignAnnotations/tests/{jsr305NullabilityWarnings/jsr305NullabilityNicknames.txt => jsr305/nullabilityWarnings/nullabilityNicknames.txt} (100%) rename compiler/testData/foreignAnnotations/tests/{jsr305NullabilityWarnings/jsr305Simple.kt => jsr305/nullabilityWarnings/simple.kt} (100%) rename compiler/testData/foreignAnnotations/tests/{jsr305NullabilityWarnings/jsr305Simple.txt => jsr305/nullabilityWarnings/simple.txt} (100%) rename compiler/testData/foreignAnnotations/tests/{jsr305NullabilityWarnings/jsr305Strange.kt => jsr305/nullabilityWarnings/strange.kt} (100%) rename compiler/testData/foreignAnnotations/tests/{jsr305NullabilityWarnings/jsr305Strange.txt => jsr305/nullabilityWarnings/strange.txt} (100%) rename compiler/testData/foreignAnnotations/tests/{jsr305NullabilityWarnings => jsr305/nullabilityWarnings}/typeQualifierDefault/fieldsAreNullable.kt (100%) rename compiler/testData/foreignAnnotations/tests/{jsr305NullabilityWarnings => jsr305/nullabilityWarnings}/typeQualifierDefault/fieldsAreNullable.txt (100%) rename compiler/testData/foreignAnnotations/tests/{jsr305NullabilityWarnings => jsr305/nullabilityWarnings}/typeQualifierDefault/nullabilityFromOverridden.kt (100%) rename compiler/testData/foreignAnnotations/tests/{jsr305NullabilityWarnings => jsr305/nullabilityWarnings}/typeQualifierDefault/nullabilityFromOverridden.txt (100%) rename compiler/testData/foreignAnnotations/tests/{jsr305NullabilityWarnings => jsr305/nullabilityWarnings}/typeQualifierDefault/overridingDefaultQualifier.kt (100%) rename compiler/testData/foreignAnnotations/tests/{jsr305NullabilityWarnings => jsr305/nullabilityWarnings}/typeQualifierDefault/overridingDefaultQualifier.txt (100%) rename compiler/testData/foreignAnnotations/tests/{jsr305NullabilityWarnings => jsr305/nullabilityWarnings}/typeQualifierDefault/parametersAreNonnullByDefault.kt (100%) rename compiler/testData/foreignAnnotations/tests/{jsr305NullabilityWarnings => jsr305/nullabilityWarnings}/typeQualifierDefault/parametersAreNonnullByDefault.txt (100%) rename compiler/testData/foreignAnnotations/tests/{jsr305NullabilityWarnings => jsr305/nullabilityWarnings}/typeQualifierDefault/parametersAreNonnullByDefaultPackage.kt (100%) rename compiler/testData/foreignAnnotations/tests/{jsr305NullabilityWarnings => jsr305/nullabilityWarnings}/typeQualifierDefault/parametersAreNonnullByDefaultPackage.txt (100%) rename compiler/testData/foreignAnnotations/tests/{jsr305NullabilityWarnings => jsr305/nullabilityWarnings}/typeQualifierDefault/springNullable.kt (100%) rename compiler/testData/foreignAnnotations/tests/{jsr305NullabilityWarnings => jsr305/nullabilityWarnings}/typeQualifierDefault/springNullable.txt (100%) rename compiler/testData/foreignAnnotations/tests/{jsr305NullabilityWarnings => jsr305/nullabilityWarnings}/typeQualifierDefault/springNullablePackage.kt (100%) rename compiler/testData/foreignAnnotations/tests/{jsr305NullabilityWarnings => jsr305/nullabilityWarnings}/typeQualifierDefault/springNullablePackage.txt (100%) rename compiler/testData/foreignAnnotations/tests/{jsr305Simple.kt => jsr305/simple.kt} (100%) rename compiler/testData/foreignAnnotations/tests/{jsr305Simple.txt => jsr305/simple.txt} (100%) rename compiler/testData/foreignAnnotations/tests/{jsr305Strange.kt => jsr305/strange.kt} (100%) rename compiler/testData/foreignAnnotations/tests/{jsr305Strange.txt => jsr305/strange.txt} (100%) rename compiler/testData/foreignAnnotations/tests/{ => jsr305}/typeQualifierDefault/fieldsAreNullable.kt (100%) rename compiler/testData/foreignAnnotations/tests/{ => jsr305}/typeQualifierDefault/fieldsAreNullable.txt (100%) rename compiler/testData/foreignAnnotations/tests/{ => jsr305}/typeQualifierDefault/nullabilityFromOverridden.kt (100%) rename compiler/testData/foreignAnnotations/tests/{ => jsr305}/typeQualifierDefault/nullabilityFromOverridden.txt (100%) rename compiler/testData/foreignAnnotations/tests/{ => jsr305}/typeQualifierDefault/overridingDefaultQualifier.kt (100%) rename compiler/testData/foreignAnnotations/tests/{ => jsr305}/typeQualifierDefault/overridingDefaultQualifier.txt (100%) rename compiler/testData/foreignAnnotations/tests/{ => jsr305}/typeQualifierDefault/parametersAreNonnullByDefault.kt (100%) rename compiler/testData/foreignAnnotations/tests/{ => jsr305}/typeQualifierDefault/parametersAreNonnullByDefault.txt (100%) rename compiler/testData/foreignAnnotations/tests/{ => jsr305}/typeQualifierDefault/parametersAreNonnullByDefaultPackage.kt (100%) rename compiler/testData/foreignAnnotations/tests/{ => jsr305}/typeQualifierDefault/parametersAreNonnullByDefaultPackage.txt (100%) rename compiler/testData/foreignAnnotations/tests/{ => jsr305}/typeQualifierDefault/springNullable.kt (100%) rename compiler/testData/foreignAnnotations/tests/{ => jsr305}/typeQualifierDefault/springNullable.txt (100%) rename compiler/testData/foreignAnnotations/tests/{ => jsr305}/typeQualifierDefault/springNullablePackage.kt (100%) rename compiler/testData/foreignAnnotations/tests/{ => jsr305}/typeQualifierDefault/springNullablePackage.txt (100%) rename compiler/testData/foreignAnnotationsJava8/tests/{ => jsr305}/springNullableWithTypeUse.kt (100%) rename compiler/testData/foreignAnnotationsJava8/tests/{ => jsr305}/springNullableWithTypeUse.txt (100%) diff --git a/compiler/testData/foreignAnnotations/tests/jsr305Ignore/parametersAreNonnullByDefault.kt b/compiler/testData/foreignAnnotations/tests/jsr305/ignore/parametersAreNonnullByDefault.kt similarity index 100% rename from compiler/testData/foreignAnnotations/tests/jsr305Ignore/parametersAreNonnullByDefault.kt rename to compiler/testData/foreignAnnotations/tests/jsr305/ignore/parametersAreNonnullByDefault.kt diff --git a/compiler/testData/foreignAnnotations/tests/jsr305Ignore/parametersAreNonnullByDefault.txt b/compiler/testData/foreignAnnotations/tests/jsr305/ignore/parametersAreNonnullByDefault.txt similarity index 100% rename from compiler/testData/foreignAnnotations/tests/jsr305Ignore/parametersAreNonnullByDefault.txt rename to compiler/testData/foreignAnnotations/tests/jsr305/ignore/parametersAreNonnullByDefault.txt diff --git a/compiler/testData/foreignAnnotations/tests/jsr305NonNullNever.kt b/compiler/testData/foreignAnnotations/tests/jsr305/nonNullNever.kt similarity index 100% rename from compiler/testData/foreignAnnotations/tests/jsr305NonNullNever.kt rename to compiler/testData/foreignAnnotations/tests/jsr305/nonNullNever.kt diff --git a/compiler/testData/foreignAnnotations/tests/jsr305NonNullNever.txt b/compiler/testData/foreignAnnotations/tests/jsr305/nonNullNever.txt similarity index 100% rename from compiler/testData/foreignAnnotations/tests/jsr305NonNullNever.txt rename to compiler/testData/foreignAnnotations/tests/jsr305/nonNullNever.txt diff --git a/compiler/testData/foreignAnnotations/tests/jsr305NullabilityNicknames.kt b/compiler/testData/foreignAnnotations/tests/jsr305/nullabilityNicknames.kt similarity index 100% rename from compiler/testData/foreignAnnotations/tests/jsr305NullabilityNicknames.kt rename to compiler/testData/foreignAnnotations/tests/jsr305/nullabilityNicknames.kt diff --git a/compiler/testData/foreignAnnotations/tests/jsr305NullabilityNicknames.txt b/compiler/testData/foreignAnnotations/tests/jsr305/nullabilityNicknames.txt similarity index 100% rename from compiler/testData/foreignAnnotations/tests/jsr305NullabilityNicknames.txt rename to compiler/testData/foreignAnnotations/tests/jsr305/nullabilityNicknames.txt diff --git a/compiler/testData/foreignAnnotations/tests/jsr305NullabilityWarnings/fromPlatformTypes/arithmetic.kt b/compiler/testData/foreignAnnotations/tests/jsr305/nullabilityWarnings/fromPlatformTypes/arithmetic.kt similarity index 100% rename from compiler/testData/foreignAnnotations/tests/jsr305NullabilityWarnings/fromPlatformTypes/arithmetic.kt rename to compiler/testData/foreignAnnotations/tests/jsr305/nullabilityWarnings/fromPlatformTypes/arithmetic.kt diff --git a/compiler/testData/foreignAnnotations/tests/jsr305NullabilityWarnings/fromPlatformTypes/arithmetic.txt b/compiler/testData/foreignAnnotations/tests/jsr305/nullabilityWarnings/fromPlatformTypes/arithmetic.txt similarity index 100% rename from compiler/testData/foreignAnnotations/tests/jsr305NullabilityWarnings/fromPlatformTypes/arithmetic.txt rename to compiler/testData/foreignAnnotations/tests/jsr305/nullabilityWarnings/fromPlatformTypes/arithmetic.txt diff --git a/compiler/testData/foreignAnnotations/tests/jsr305NullabilityWarnings/fromPlatformTypes/array.kt b/compiler/testData/foreignAnnotations/tests/jsr305/nullabilityWarnings/fromPlatformTypes/array.kt similarity index 100% rename from compiler/testData/foreignAnnotations/tests/jsr305NullabilityWarnings/fromPlatformTypes/array.kt rename to compiler/testData/foreignAnnotations/tests/jsr305/nullabilityWarnings/fromPlatformTypes/array.kt diff --git a/compiler/testData/foreignAnnotations/tests/jsr305NullabilityWarnings/fromPlatformTypes/array.txt b/compiler/testData/foreignAnnotations/tests/jsr305/nullabilityWarnings/fromPlatformTypes/array.txt similarity index 100% rename from compiler/testData/foreignAnnotations/tests/jsr305NullabilityWarnings/fromPlatformTypes/array.txt rename to compiler/testData/foreignAnnotations/tests/jsr305/nullabilityWarnings/fromPlatformTypes/array.txt diff --git a/compiler/testData/foreignAnnotations/tests/jsr305NullabilityWarnings/fromPlatformTypes/assignToVar.kt b/compiler/testData/foreignAnnotations/tests/jsr305/nullabilityWarnings/fromPlatformTypes/assignToVar.kt similarity index 100% rename from compiler/testData/foreignAnnotations/tests/jsr305NullabilityWarnings/fromPlatformTypes/assignToVar.kt rename to compiler/testData/foreignAnnotations/tests/jsr305/nullabilityWarnings/fromPlatformTypes/assignToVar.kt diff --git a/compiler/testData/foreignAnnotations/tests/jsr305NullabilityWarnings/fromPlatformTypes/assignToVar.txt b/compiler/testData/foreignAnnotations/tests/jsr305/nullabilityWarnings/fromPlatformTypes/assignToVar.txt similarity index 100% rename from compiler/testData/foreignAnnotations/tests/jsr305NullabilityWarnings/fromPlatformTypes/assignToVar.txt rename to compiler/testData/foreignAnnotations/tests/jsr305/nullabilityWarnings/fromPlatformTypes/assignToVar.txt diff --git a/compiler/testData/foreignAnnotations/tests/jsr305NullabilityWarnings/fromPlatformTypes/conditions.kt b/compiler/testData/foreignAnnotations/tests/jsr305/nullabilityWarnings/fromPlatformTypes/conditions.kt similarity index 100% rename from compiler/testData/foreignAnnotations/tests/jsr305NullabilityWarnings/fromPlatformTypes/conditions.kt rename to compiler/testData/foreignAnnotations/tests/jsr305/nullabilityWarnings/fromPlatformTypes/conditions.kt diff --git a/compiler/testData/foreignAnnotations/tests/jsr305NullabilityWarnings/fromPlatformTypes/conditions.txt b/compiler/testData/foreignAnnotations/tests/jsr305/nullabilityWarnings/fromPlatformTypes/conditions.txt similarity index 100% rename from compiler/testData/foreignAnnotations/tests/jsr305NullabilityWarnings/fromPlatformTypes/conditions.txt rename to compiler/testData/foreignAnnotations/tests/jsr305/nullabilityWarnings/fromPlatformTypes/conditions.txt diff --git a/compiler/testData/foreignAnnotations/tests/jsr305NullabilityWarnings/fromPlatformTypes/dataFlowInfo.kt b/compiler/testData/foreignAnnotations/tests/jsr305/nullabilityWarnings/fromPlatformTypes/dataFlowInfo.kt similarity index 100% rename from compiler/testData/foreignAnnotations/tests/jsr305NullabilityWarnings/fromPlatformTypes/dataFlowInfo.kt rename to compiler/testData/foreignAnnotations/tests/jsr305/nullabilityWarnings/fromPlatformTypes/dataFlowInfo.kt diff --git a/compiler/testData/foreignAnnotations/tests/jsr305NullabilityWarnings/fromPlatformTypes/dataFlowInfo.txt b/compiler/testData/foreignAnnotations/tests/jsr305/nullabilityWarnings/fromPlatformTypes/dataFlowInfo.txt similarity index 100% rename from compiler/testData/foreignAnnotations/tests/jsr305NullabilityWarnings/fromPlatformTypes/dataFlowInfo.txt rename to compiler/testData/foreignAnnotations/tests/jsr305/nullabilityWarnings/fromPlatformTypes/dataFlowInfo.txt diff --git a/compiler/testData/foreignAnnotations/tests/jsr305NullabilityWarnings/fromPlatformTypes/defaultParameters.kt b/compiler/testData/foreignAnnotations/tests/jsr305/nullabilityWarnings/fromPlatformTypes/defaultParameters.kt similarity index 100% rename from compiler/testData/foreignAnnotations/tests/jsr305NullabilityWarnings/fromPlatformTypes/defaultParameters.kt rename to compiler/testData/foreignAnnotations/tests/jsr305/nullabilityWarnings/fromPlatformTypes/defaultParameters.kt diff --git a/compiler/testData/foreignAnnotations/tests/jsr305NullabilityWarnings/fromPlatformTypes/defaultParameters.txt b/compiler/testData/foreignAnnotations/tests/jsr305/nullabilityWarnings/fromPlatformTypes/defaultParameters.txt similarity index 100% rename from compiler/testData/foreignAnnotations/tests/jsr305NullabilityWarnings/fromPlatformTypes/defaultParameters.txt rename to compiler/testData/foreignAnnotations/tests/jsr305/nullabilityWarnings/fromPlatformTypes/defaultParameters.txt diff --git a/compiler/testData/foreignAnnotations/tests/jsr305NullabilityWarnings/fromPlatformTypes/delegatedProperties.kt b/compiler/testData/foreignAnnotations/tests/jsr305/nullabilityWarnings/fromPlatformTypes/delegatedProperties.kt similarity index 100% rename from compiler/testData/foreignAnnotations/tests/jsr305NullabilityWarnings/fromPlatformTypes/delegatedProperties.kt rename to compiler/testData/foreignAnnotations/tests/jsr305/nullabilityWarnings/fromPlatformTypes/delegatedProperties.kt diff --git a/compiler/testData/foreignAnnotations/tests/jsr305NullabilityWarnings/fromPlatformTypes/delegatedProperties.txt b/compiler/testData/foreignAnnotations/tests/jsr305/nullabilityWarnings/fromPlatformTypes/delegatedProperties.txt similarity index 100% rename from compiler/testData/foreignAnnotations/tests/jsr305NullabilityWarnings/fromPlatformTypes/delegatedProperties.txt rename to compiler/testData/foreignAnnotations/tests/jsr305/nullabilityWarnings/fromPlatformTypes/delegatedProperties.txt diff --git a/compiler/testData/foreignAnnotations/tests/jsr305NullabilityWarnings/fromPlatformTypes/delegation.kt b/compiler/testData/foreignAnnotations/tests/jsr305/nullabilityWarnings/fromPlatformTypes/delegation.kt similarity index 100% rename from compiler/testData/foreignAnnotations/tests/jsr305NullabilityWarnings/fromPlatformTypes/delegation.kt rename to compiler/testData/foreignAnnotations/tests/jsr305/nullabilityWarnings/fromPlatformTypes/delegation.kt diff --git a/compiler/testData/foreignAnnotations/tests/jsr305NullabilityWarnings/fromPlatformTypes/delegation.txt b/compiler/testData/foreignAnnotations/tests/jsr305/nullabilityWarnings/fromPlatformTypes/delegation.txt similarity index 100% rename from compiler/testData/foreignAnnotations/tests/jsr305NullabilityWarnings/fromPlatformTypes/delegation.txt rename to compiler/testData/foreignAnnotations/tests/jsr305/nullabilityWarnings/fromPlatformTypes/delegation.txt diff --git a/compiler/testData/foreignAnnotations/tests/jsr305NullabilityWarnings/fromPlatformTypes/derefenceExtension.kt b/compiler/testData/foreignAnnotations/tests/jsr305/nullabilityWarnings/fromPlatformTypes/derefenceExtension.kt similarity index 100% rename from compiler/testData/foreignAnnotations/tests/jsr305NullabilityWarnings/fromPlatformTypes/derefenceExtension.kt rename to compiler/testData/foreignAnnotations/tests/jsr305/nullabilityWarnings/fromPlatformTypes/derefenceExtension.kt diff --git a/compiler/testData/foreignAnnotations/tests/jsr305NullabilityWarnings/fromPlatformTypes/derefenceExtension.txt b/compiler/testData/foreignAnnotations/tests/jsr305/nullabilityWarnings/fromPlatformTypes/derefenceExtension.txt similarity index 100% rename from compiler/testData/foreignAnnotations/tests/jsr305NullabilityWarnings/fromPlatformTypes/derefenceExtension.txt rename to compiler/testData/foreignAnnotations/tests/jsr305/nullabilityWarnings/fromPlatformTypes/derefenceExtension.txt diff --git a/compiler/testData/foreignAnnotations/tests/jsr305NullabilityWarnings/fromPlatformTypes/derefenceMember.kt b/compiler/testData/foreignAnnotations/tests/jsr305/nullabilityWarnings/fromPlatformTypes/derefenceMember.kt similarity index 100% rename from compiler/testData/foreignAnnotations/tests/jsr305NullabilityWarnings/fromPlatformTypes/derefenceMember.kt rename to compiler/testData/foreignAnnotations/tests/jsr305/nullabilityWarnings/fromPlatformTypes/derefenceMember.kt diff --git a/compiler/testData/foreignAnnotations/tests/jsr305NullabilityWarnings/fromPlatformTypes/derefenceMember.txt b/compiler/testData/foreignAnnotations/tests/jsr305/nullabilityWarnings/fromPlatformTypes/derefenceMember.txt similarity index 100% rename from compiler/testData/foreignAnnotations/tests/jsr305NullabilityWarnings/fromPlatformTypes/derefenceMember.txt rename to compiler/testData/foreignAnnotations/tests/jsr305/nullabilityWarnings/fromPlatformTypes/derefenceMember.txt diff --git a/compiler/testData/foreignAnnotations/tests/jsr305NullabilityWarnings/fromPlatformTypes/expectedType.kt b/compiler/testData/foreignAnnotations/tests/jsr305/nullabilityWarnings/fromPlatformTypes/expectedType.kt similarity index 100% rename from compiler/testData/foreignAnnotations/tests/jsr305NullabilityWarnings/fromPlatformTypes/expectedType.kt rename to compiler/testData/foreignAnnotations/tests/jsr305/nullabilityWarnings/fromPlatformTypes/expectedType.kt diff --git a/compiler/testData/foreignAnnotations/tests/jsr305NullabilityWarnings/fromPlatformTypes/expectedType.txt b/compiler/testData/foreignAnnotations/tests/jsr305/nullabilityWarnings/fromPlatformTypes/expectedType.txt similarity index 100% rename from compiler/testData/foreignAnnotations/tests/jsr305NullabilityWarnings/fromPlatformTypes/expectedType.txt rename to compiler/testData/foreignAnnotations/tests/jsr305/nullabilityWarnings/fromPlatformTypes/expectedType.txt diff --git a/compiler/testData/foreignAnnotations/tests/jsr305NullabilityWarnings/fromPlatformTypes/for.kt b/compiler/testData/foreignAnnotations/tests/jsr305/nullabilityWarnings/fromPlatformTypes/for.kt similarity index 100% rename from compiler/testData/foreignAnnotations/tests/jsr305NullabilityWarnings/fromPlatformTypes/for.kt rename to compiler/testData/foreignAnnotations/tests/jsr305/nullabilityWarnings/fromPlatformTypes/for.kt diff --git a/compiler/testData/foreignAnnotations/tests/jsr305NullabilityWarnings/fromPlatformTypes/for.txt b/compiler/testData/foreignAnnotations/tests/jsr305/nullabilityWarnings/fromPlatformTypes/for.txt similarity index 100% rename from compiler/testData/foreignAnnotations/tests/jsr305NullabilityWarnings/fromPlatformTypes/for.txt rename to compiler/testData/foreignAnnotations/tests/jsr305/nullabilityWarnings/fromPlatformTypes/for.txt diff --git a/compiler/testData/foreignAnnotations/tests/jsr305NullabilityWarnings/fromPlatformTypes/functionArguments.kt b/compiler/testData/foreignAnnotations/tests/jsr305/nullabilityWarnings/fromPlatformTypes/functionArguments.kt similarity index 100% rename from compiler/testData/foreignAnnotations/tests/jsr305NullabilityWarnings/fromPlatformTypes/functionArguments.kt rename to compiler/testData/foreignAnnotations/tests/jsr305/nullabilityWarnings/fromPlatformTypes/functionArguments.kt diff --git a/compiler/testData/foreignAnnotations/tests/jsr305NullabilityWarnings/fromPlatformTypes/functionArguments.txt b/compiler/testData/foreignAnnotations/tests/jsr305/nullabilityWarnings/fromPlatformTypes/functionArguments.txt similarity index 100% rename from compiler/testData/foreignAnnotations/tests/jsr305NullabilityWarnings/fromPlatformTypes/functionArguments.txt rename to compiler/testData/foreignAnnotations/tests/jsr305/nullabilityWarnings/fromPlatformTypes/functionArguments.txt diff --git a/compiler/testData/foreignAnnotations/tests/jsr305NullabilityWarnings/fromPlatformTypes/invoke.kt b/compiler/testData/foreignAnnotations/tests/jsr305/nullabilityWarnings/fromPlatformTypes/invoke.kt similarity index 100% rename from compiler/testData/foreignAnnotations/tests/jsr305NullabilityWarnings/fromPlatformTypes/invoke.kt rename to compiler/testData/foreignAnnotations/tests/jsr305/nullabilityWarnings/fromPlatformTypes/invoke.kt diff --git a/compiler/testData/foreignAnnotations/tests/jsr305NullabilityWarnings/fromPlatformTypes/invoke.txt b/compiler/testData/foreignAnnotations/tests/jsr305/nullabilityWarnings/fromPlatformTypes/invoke.txt similarity index 100% rename from compiler/testData/foreignAnnotations/tests/jsr305NullabilityWarnings/fromPlatformTypes/invoke.txt rename to compiler/testData/foreignAnnotations/tests/jsr305/nullabilityWarnings/fromPlatformTypes/invoke.txt diff --git a/compiler/testData/foreignAnnotations/tests/jsr305NullabilityWarnings/fromPlatformTypes/kt6829.kt b/compiler/testData/foreignAnnotations/tests/jsr305/nullabilityWarnings/fromPlatformTypes/kt6829.kt similarity index 100% rename from compiler/testData/foreignAnnotations/tests/jsr305NullabilityWarnings/fromPlatformTypes/kt6829.kt rename to compiler/testData/foreignAnnotations/tests/jsr305/nullabilityWarnings/fromPlatformTypes/kt6829.kt diff --git a/compiler/testData/foreignAnnotations/tests/jsr305NullabilityWarnings/fromPlatformTypes/kt6829.txt b/compiler/testData/foreignAnnotations/tests/jsr305/nullabilityWarnings/fromPlatformTypes/kt6829.txt similarity index 100% rename from compiler/testData/foreignAnnotations/tests/jsr305NullabilityWarnings/fromPlatformTypes/kt6829.txt rename to compiler/testData/foreignAnnotations/tests/jsr305/nullabilityWarnings/fromPlatformTypes/kt6829.txt diff --git a/compiler/testData/foreignAnnotations/tests/jsr305NullabilityWarnings/fromPlatformTypes/multiDeclaration.kt b/compiler/testData/foreignAnnotations/tests/jsr305/nullabilityWarnings/fromPlatformTypes/multiDeclaration.kt similarity index 100% rename from compiler/testData/foreignAnnotations/tests/jsr305NullabilityWarnings/fromPlatformTypes/multiDeclaration.kt rename to compiler/testData/foreignAnnotations/tests/jsr305/nullabilityWarnings/fromPlatformTypes/multiDeclaration.kt diff --git a/compiler/testData/foreignAnnotations/tests/jsr305NullabilityWarnings/fromPlatformTypes/multiDeclaration.txt b/compiler/testData/foreignAnnotations/tests/jsr305/nullabilityWarnings/fromPlatformTypes/multiDeclaration.txt similarity index 100% rename from compiler/testData/foreignAnnotations/tests/jsr305NullabilityWarnings/fromPlatformTypes/multiDeclaration.txt rename to compiler/testData/foreignAnnotations/tests/jsr305/nullabilityWarnings/fromPlatformTypes/multiDeclaration.txt diff --git a/compiler/testData/foreignAnnotations/tests/jsr305NullabilityWarnings/fromPlatformTypes/passToJava.kt b/compiler/testData/foreignAnnotations/tests/jsr305/nullabilityWarnings/fromPlatformTypes/passToJava.kt similarity index 100% rename from compiler/testData/foreignAnnotations/tests/jsr305NullabilityWarnings/fromPlatformTypes/passToJava.kt rename to compiler/testData/foreignAnnotations/tests/jsr305/nullabilityWarnings/fromPlatformTypes/passToJava.kt diff --git a/compiler/testData/foreignAnnotations/tests/jsr305NullabilityWarnings/fromPlatformTypes/passToJava.txt b/compiler/testData/foreignAnnotations/tests/jsr305/nullabilityWarnings/fromPlatformTypes/passToJava.txt similarity index 100% rename from compiler/testData/foreignAnnotations/tests/jsr305NullabilityWarnings/fromPlatformTypes/passToJava.txt rename to compiler/testData/foreignAnnotations/tests/jsr305/nullabilityWarnings/fromPlatformTypes/passToJava.txt diff --git a/compiler/testData/foreignAnnotations/tests/jsr305NullabilityWarnings/fromPlatformTypes/primitiveArray.kt b/compiler/testData/foreignAnnotations/tests/jsr305/nullabilityWarnings/fromPlatformTypes/primitiveArray.kt similarity index 100% rename from compiler/testData/foreignAnnotations/tests/jsr305NullabilityWarnings/fromPlatformTypes/primitiveArray.kt rename to compiler/testData/foreignAnnotations/tests/jsr305/nullabilityWarnings/fromPlatformTypes/primitiveArray.kt diff --git a/compiler/testData/foreignAnnotations/tests/jsr305NullabilityWarnings/fromPlatformTypes/primitiveArray.txt b/compiler/testData/foreignAnnotations/tests/jsr305/nullabilityWarnings/fromPlatformTypes/primitiveArray.txt similarity index 100% rename from compiler/testData/foreignAnnotations/tests/jsr305NullabilityWarnings/fromPlatformTypes/primitiveArray.txt rename to compiler/testData/foreignAnnotations/tests/jsr305/nullabilityWarnings/fromPlatformTypes/primitiveArray.txt diff --git a/compiler/testData/foreignAnnotations/tests/jsr305NullabilityWarnings/fromPlatformTypes/throw.kt b/compiler/testData/foreignAnnotations/tests/jsr305/nullabilityWarnings/fromPlatformTypes/throw.kt similarity index 100% rename from compiler/testData/foreignAnnotations/tests/jsr305NullabilityWarnings/fromPlatformTypes/throw.kt rename to compiler/testData/foreignAnnotations/tests/jsr305/nullabilityWarnings/fromPlatformTypes/throw.kt diff --git a/compiler/testData/foreignAnnotations/tests/jsr305NullabilityWarnings/fromPlatformTypes/throw.txt b/compiler/testData/foreignAnnotations/tests/jsr305/nullabilityWarnings/fromPlatformTypes/throw.txt similarity index 100% rename from compiler/testData/foreignAnnotations/tests/jsr305NullabilityWarnings/fromPlatformTypes/throw.txt rename to compiler/testData/foreignAnnotations/tests/jsr305/nullabilityWarnings/fromPlatformTypes/throw.txt diff --git a/compiler/testData/foreignAnnotations/tests/jsr305NullabilityWarnings/fromPlatformTypes/uselessElvisRightIsNull.kt b/compiler/testData/foreignAnnotations/tests/jsr305/nullabilityWarnings/fromPlatformTypes/uselessElvisRightIsNull.kt similarity index 100% rename from compiler/testData/foreignAnnotations/tests/jsr305NullabilityWarnings/fromPlatformTypes/uselessElvisRightIsNull.kt rename to compiler/testData/foreignAnnotations/tests/jsr305/nullabilityWarnings/fromPlatformTypes/uselessElvisRightIsNull.kt diff --git a/compiler/testData/foreignAnnotations/tests/jsr305NullabilityWarnings/fromPlatformTypes/uselessElvisRightIsNull.txt b/compiler/testData/foreignAnnotations/tests/jsr305/nullabilityWarnings/fromPlatformTypes/uselessElvisRightIsNull.txt similarity index 100% rename from compiler/testData/foreignAnnotations/tests/jsr305NullabilityWarnings/fromPlatformTypes/uselessElvisRightIsNull.txt rename to compiler/testData/foreignAnnotations/tests/jsr305/nullabilityWarnings/fromPlatformTypes/uselessElvisRightIsNull.txt diff --git a/compiler/testData/foreignAnnotations/tests/jsr305NullabilityWarnings/jsr305NullabilityGenerics.kt b/compiler/testData/foreignAnnotations/tests/jsr305/nullabilityWarnings/nullabilityGenerics.kt similarity index 100% rename from compiler/testData/foreignAnnotations/tests/jsr305NullabilityWarnings/jsr305NullabilityGenerics.kt rename to compiler/testData/foreignAnnotations/tests/jsr305/nullabilityWarnings/nullabilityGenerics.kt diff --git a/compiler/testData/foreignAnnotations/tests/jsr305NullabilityWarnings/jsr305NullabilityGenerics.txt b/compiler/testData/foreignAnnotations/tests/jsr305/nullabilityWarnings/nullabilityGenerics.txt similarity index 100% rename from compiler/testData/foreignAnnotations/tests/jsr305NullabilityWarnings/jsr305NullabilityGenerics.txt rename to compiler/testData/foreignAnnotations/tests/jsr305/nullabilityWarnings/nullabilityGenerics.txt diff --git a/compiler/testData/foreignAnnotations/tests/jsr305NullabilityWarnings/jsr305NullabilityNicknames.kt b/compiler/testData/foreignAnnotations/tests/jsr305/nullabilityWarnings/nullabilityNicknames.kt similarity index 100% rename from compiler/testData/foreignAnnotations/tests/jsr305NullabilityWarnings/jsr305NullabilityNicknames.kt rename to compiler/testData/foreignAnnotations/tests/jsr305/nullabilityWarnings/nullabilityNicknames.kt diff --git a/compiler/testData/foreignAnnotations/tests/jsr305NullabilityWarnings/jsr305NullabilityNicknames.txt b/compiler/testData/foreignAnnotations/tests/jsr305/nullabilityWarnings/nullabilityNicknames.txt similarity index 100% rename from compiler/testData/foreignAnnotations/tests/jsr305NullabilityWarnings/jsr305NullabilityNicknames.txt rename to compiler/testData/foreignAnnotations/tests/jsr305/nullabilityWarnings/nullabilityNicknames.txt diff --git a/compiler/testData/foreignAnnotations/tests/jsr305NullabilityWarnings/jsr305Simple.kt b/compiler/testData/foreignAnnotations/tests/jsr305/nullabilityWarnings/simple.kt similarity index 100% rename from compiler/testData/foreignAnnotations/tests/jsr305NullabilityWarnings/jsr305Simple.kt rename to compiler/testData/foreignAnnotations/tests/jsr305/nullabilityWarnings/simple.kt diff --git a/compiler/testData/foreignAnnotations/tests/jsr305NullabilityWarnings/jsr305Simple.txt b/compiler/testData/foreignAnnotations/tests/jsr305/nullabilityWarnings/simple.txt similarity index 100% rename from compiler/testData/foreignAnnotations/tests/jsr305NullabilityWarnings/jsr305Simple.txt rename to compiler/testData/foreignAnnotations/tests/jsr305/nullabilityWarnings/simple.txt diff --git a/compiler/testData/foreignAnnotations/tests/jsr305NullabilityWarnings/jsr305Strange.kt b/compiler/testData/foreignAnnotations/tests/jsr305/nullabilityWarnings/strange.kt similarity index 100% rename from compiler/testData/foreignAnnotations/tests/jsr305NullabilityWarnings/jsr305Strange.kt rename to compiler/testData/foreignAnnotations/tests/jsr305/nullabilityWarnings/strange.kt diff --git a/compiler/testData/foreignAnnotations/tests/jsr305NullabilityWarnings/jsr305Strange.txt b/compiler/testData/foreignAnnotations/tests/jsr305/nullabilityWarnings/strange.txt similarity index 100% rename from compiler/testData/foreignAnnotations/tests/jsr305NullabilityWarnings/jsr305Strange.txt rename to compiler/testData/foreignAnnotations/tests/jsr305/nullabilityWarnings/strange.txt diff --git a/compiler/testData/foreignAnnotations/tests/jsr305NullabilityWarnings/typeQualifierDefault/fieldsAreNullable.kt b/compiler/testData/foreignAnnotations/tests/jsr305/nullabilityWarnings/typeQualifierDefault/fieldsAreNullable.kt similarity index 100% rename from compiler/testData/foreignAnnotations/tests/jsr305NullabilityWarnings/typeQualifierDefault/fieldsAreNullable.kt rename to compiler/testData/foreignAnnotations/tests/jsr305/nullabilityWarnings/typeQualifierDefault/fieldsAreNullable.kt diff --git a/compiler/testData/foreignAnnotations/tests/jsr305NullabilityWarnings/typeQualifierDefault/fieldsAreNullable.txt b/compiler/testData/foreignAnnotations/tests/jsr305/nullabilityWarnings/typeQualifierDefault/fieldsAreNullable.txt similarity index 100% rename from compiler/testData/foreignAnnotations/tests/jsr305NullabilityWarnings/typeQualifierDefault/fieldsAreNullable.txt rename to compiler/testData/foreignAnnotations/tests/jsr305/nullabilityWarnings/typeQualifierDefault/fieldsAreNullable.txt diff --git a/compiler/testData/foreignAnnotations/tests/jsr305NullabilityWarnings/typeQualifierDefault/nullabilityFromOverridden.kt b/compiler/testData/foreignAnnotations/tests/jsr305/nullabilityWarnings/typeQualifierDefault/nullabilityFromOverridden.kt similarity index 100% rename from compiler/testData/foreignAnnotations/tests/jsr305NullabilityWarnings/typeQualifierDefault/nullabilityFromOverridden.kt rename to compiler/testData/foreignAnnotations/tests/jsr305/nullabilityWarnings/typeQualifierDefault/nullabilityFromOverridden.kt diff --git a/compiler/testData/foreignAnnotations/tests/jsr305NullabilityWarnings/typeQualifierDefault/nullabilityFromOverridden.txt b/compiler/testData/foreignAnnotations/tests/jsr305/nullabilityWarnings/typeQualifierDefault/nullabilityFromOverridden.txt similarity index 100% rename from compiler/testData/foreignAnnotations/tests/jsr305NullabilityWarnings/typeQualifierDefault/nullabilityFromOverridden.txt rename to compiler/testData/foreignAnnotations/tests/jsr305/nullabilityWarnings/typeQualifierDefault/nullabilityFromOverridden.txt diff --git a/compiler/testData/foreignAnnotations/tests/jsr305NullabilityWarnings/typeQualifierDefault/overridingDefaultQualifier.kt b/compiler/testData/foreignAnnotations/tests/jsr305/nullabilityWarnings/typeQualifierDefault/overridingDefaultQualifier.kt similarity index 100% rename from compiler/testData/foreignAnnotations/tests/jsr305NullabilityWarnings/typeQualifierDefault/overridingDefaultQualifier.kt rename to compiler/testData/foreignAnnotations/tests/jsr305/nullabilityWarnings/typeQualifierDefault/overridingDefaultQualifier.kt diff --git a/compiler/testData/foreignAnnotations/tests/jsr305NullabilityWarnings/typeQualifierDefault/overridingDefaultQualifier.txt b/compiler/testData/foreignAnnotations/tests/jsr305/nullabilityWarnings/typeQualifierDefault/overridingDefaultQualifier.txt similarity index 100% rename from compiler/testData/foreignAnnotations/tests/jsr305NullabilityWarnings/typeQualifierDefault/overridingDefaultQualifier.txt rename to compiler/testData/foreignAnnotations/tests/jsr305/nullabilityWarnings/typeQualifierDefault/overridingDefaultQualifier.txt diff --git a/compiler/testData/foreignAnnotations/tests/jsr305NullabilityWarnings/typeQualifierDefault/parametersAreNonnullByDefault.kt b/compiler/testData/foreignAnnotations/tests/jsr305/nullabilityWarnings/typeQualifierDefault/parametersAreNonnullByDefault.kt similarity index 100% rename from compiler/testData/foreignAnnotations/tests/jsr305NullabilityWarnings/typeQualifierDefault/parametersAreNonnullByDefault.kt rename to compiler/testData/foreignAnnotations/tests/jsr305/nullabilityWarnings/typeQualifierDefault/parametersAreNonnullByDefault.kt diff --git a/compiler/testData/foreignAnnotations/tests/jsr305NullabilityWarnings/typeQualifierDefault/parametersAreNonnullByDefault.txt b/compiler/testData/foreignAnnotations/tests/jsr305/nullabilityWarnings/typeQualifierDefault/parametersAreNonnullByDefault.txt similarity index 100% rename from compiler/testData/foreignAnnotations/tests/jsr305NullabilityWarnings/typeQualifierDefault/parametersAreNonnullByDefault.txt rename to compiler/testData/foreignAnnotations/tests/jsr305/nullabilityWarnings/typeQualifierDefault/parametersAreNonnullByDefault.txt diff --git a/compiler/testData/foreignAnnotations/tests/jsr305NullabilityWarnings/typeQualifierDefault/parametersAreNonnullByDefaultPackage.kt b/compiler/testData/foreignAnnotations/tests/jsr305/nullabilityWarnings/typeQualifierDefault/parametersAreNonnullByDefaultPackage.kt similarity index 100% rename from compiler/testData/foreignAnnotations/tests/jsr305NullabilityWarnings/typeQualifierDefault/parametersAreNonnullByDefaultPackage.kt rename to compiler/testData/foreignAnnotations/tests/jsr305/nullabilityWarnings/typeQualifierDefault/parametersAreNonnullByDefaultPackage.kt diff --git a/compiler/testData/foreignAnnotations/tests/jsr305NullabilityWarnings/typeQualifierDefault/parametersAreNonnullByDefaultPackage.txt b/compiler/testData/foreignAnnotations/tests/jsr305/nullabilityWarnings/typeQualifierDefault/parametersAreNonnullByDefaultPackage.txt similarity index 100% rename from compiler/testData/foreignAnnotations/tests/jsr305NullabilityWarnings/typeQualifierDefault/parametersAreNonnullByDefaultPackage.txt rename to compiler/testData/foreignAnnotations/tests/jsr305/nullabilityWarnings/typeQualifierDefault/parametersAreNonnullByDefaultPackage.txt diff --git a/compiler/testData/foreignAnnotations/tests/jsr305NullabilityWarnings/typeQualifierDefault/springNullable.kt b/compiler/testData/foreignAnnotations/tests/jsr305/nullabilityWarnings/typeQualifierDefault/springNullable.kt similarity index 100% rename from compiler/testData/foreignAnnotations/tests/jsr305NullabilityWarnings/typeQualifierDefault/springNullable.kt rename to compiler/testData/foreignAnnotations/tests/jsr305/nullabilityWarnings/typeQualifierDefault/springNullable.kt diff --git a/compiler/testData/foreignAnnotations/tests/jsr305NullabilityWarnings/typeQualifierDefault/springNullable.txt b/compiler/testData/foreignAnnotations/tests/jsr305/nullabilityWarnings/typeQualifierDefault/springNullable.txt similarity index 100% rename from compiler/testData/foreignAnnotations/tests/jsr305NullabilityWarnings/typeQualifierDefault/springNullable.txt rename to compiler/testData/foreignAnnotations/tests/jsr305/nullabilityWarnings/typeQualifierDefault/springNullable.txt diff --git a/compiler/testData/foreignAnnotations/tests/jsr305NullabilityWarnings/typeQualifierDefault/springNullablePackage.kt b/compiler/testData/foreignAnnotations/tests/jsr305/nullabilityWarnings/typeQualifierDefault/springNullablePackage.kt similarity index 100% rename from compiler/testData/foreignAnnotations/tests/jsr305NullabilityWarnings/typeQualifierDefault/springNullablePackage.kt rename to compiler/testData/foreignAnnotations/tests/jsr305/nullabilityWarnings/typeQualifierDefault/springNullablePackage.kt diff --git a/compiler/testData/foreignAnnotations/tests/jsr305NullabilityWarnings/typeQualifierDefault/springNullablePackage.txt b/compiler/testData/foreignAnnotations/tests/jsr305/nullabilityWarnings/typeQualifierDefault/springNullablePackage.txt similarity index 100% rename from compiler/testData/foreignAnnotations/tests/jsr305NullabilityWarnings/typeQualifierDefault/springNullablePackage.txt rename to compiler/testData/foreignAnnotations/tests/jsr305/nullabilityWarnings/typeQualifierDefault/springNullablePackage.txt diff --git a/compiler/testData/foreignAnnotations/tests/jsr305Simple.kt b/compiler/testData/foreignAnnotations/tests/jsr305/simple.kt similarity index 100% rename from compiler/testData/foreignAnnotations/tests/jsr305Simple.kt rename to compiler/testData/foreignAnnotations/tests/jsr305/simple.kt diff --git a/compiler/testData/foreignAnnotations/tests/jsr305Simple.txt b/compiler/testData/foreignAnnotations/tests/jsr305/simple.txt similarity index 100% rename from compiler/testData/foreignAnnotations/tests/jsr305Simple.txt rename to compiler/testData/foreignAnnotations/tests/jsr305/simple.txt diff --git a/compiler/testData/foreignAnnotations/tests/jsr305Strange.kt b/compiler/testData/foreignAnnotations/tests/jsr305/strange.kt similarity index 100% rename from compiler/testData/foreignAnnotations/tests/jsr305Strange.kt rename to compiler/testData/foreignAnnotations/tests/jsr305/strange.kt diff --git a/compiler/testData/foreignAnnotations/tests/jsr305Strange.txt b/compiler/testData/foreignAnnotations/tests/jsr305/strange.txt similarity index 100% rename from compiler/testData/foreignAnnotations/tests/jsr305Strange.txt rename to compiler/testData/foreignAnnotations/tests/jsr305/strange.txt diff --git a/compiler/testData/foreignAnnotations/tests/typeQualifierDefault/fieldsAreNullable.kt b/compiler/testData/foreignAnnotations/tests/jsr305/typeQualifierDefault/fieldsAreNullable.kt similarity index 100% rename from compiler/testData/foreignAnnotations/tests/typeQualifierDefault/fieldsAreNullable.kt rename to compiler/testData/foreignAnnotations/tests/jsr305/typeQualifierDefault/fieldsAreNullable.kt diff --git a/compiler/testData/foreignAnnotations/tests/typeQualifierDefault/fieldsAreNullable.txt b/compiler/testData/foreignAnnotations/tests/jsr305/typeQualifierDefault/fieldsAreNullable.txt similarity index 100% rename from compiler/testData/foreignAnnotations/tests/typeQualifierDefault/fieldsAreNullable.txt rename to compiler/testData/foreignAnnotations/tests/jsr305/typeQualifierDefault/fieldsAreNullable.txt diff --git a/compiler/testData/foreignAnnotations/tests/typeQualifierDefault/nullabilityFromOverridden.kt b/compiler/testData/foreignAnnotations/tests/jsr305/typeQualifierDefault/nullabilityFromOverridden.kt similarity index 100% rename from compiler/testData/foreignAnnotations/tests/typeQualifierDefault/nullabilityFromOverridden.kt rename to compiler/testData/foreignAnnotations/tests/jsr305/typeQualifierDefault/nullabilityFromOverridden.kt diff --git a/compiler/testData/foreignAnnotations/tests/typeQualifierDefault/nullabilityFromOverridden.txt b/compiler/testData/foreignAnnotations/tests/jsr305/typeQualifierDefault/nullabilityFromOverridden.txt similarity index 100% rename from compiler/testData/foreignAnnotations/tests/typeQualifierDefault/nullabilityFromOverridden.txt rename to compiler/testData/foreignAnnotations/tests/jsr305/typeQualifierDefault/nullabilityFromOverridden.txt diff --git a/compiler/testData/foreignAnnotations/tests/typeQualifierDefault/overridingDefaultQualifier.kt b/compiler/testData/foreignAnnotations/tests/jsr305/typeQualifierDefault/overridingDefaultQualifier.kt similarity index 100% rename from compiler/testData/foreignAnnotations/tests/typeQualifierDefault/overridingDefaultQualifier.kt rename to compiler/testData/foreignAnnotations/tests/jsr305/typeQualifierDefault/overridingDefaultQualifier.kt diff --git a/compiler/testData/foreignAnnotations/tests/typeQualifierDefault/overridingDefaultQualifier.txt b/compiler/testData/foreignAnnotations/tests/jsr305/typeQualifierDefault/overridingDefaultQualifier.txt similarity index 100% rename from compiler/testData/foreignAnnotations/tests/typeQualifierDefault/overridingDefaultQualifier.txt rename to compiler/testData/foreignAnnotations/tests/jsr305/typeQualifierDefault/overridingDefaultQualifier.txt diff --git a/compiler/testData/foreignAnnotations/tests/typeQualifierDefault/parametersAreNonnullByDefault.kt b/compiler/testData/foreignAnnotations/tests/jsr305/typeQualifierDefault/parametersAreNonnullByDefault.kt similarity index 100% rename from compiler/testData/foreignAnnotations/tests/typeQualifierDefault/parametersAreNonnullByDefault.kt rename to compiler/testData/foreignAnnotations/tests/jsr305/typeQualifierDefault/parametersAreNonnullByDefault.kt diff --git a/compiler/testData/foreignAnnotations/tests/typeQualifierDefault/parametersAreNonnullByDefault.txt b/compiler/testData/foreignAnnotations/tests/jsr305/typeQualifierDefault/parametersAreNonnullByDefault.txt similarity index 100% rename from compiler/testData/foreignAnnotations/tests/typeQualifierDefault/parametersAreNonnullByDefault.txt rename to compiler/testData/foreignAnnotations/tests/jsr305/typeQualifierDefault/parametersAreNonnullByDefault.txt diff --git a/compiler/testData/foreignAnnotations/tests/typeQualifierDefault/parametersAreNonnullByDefaultPackage.kt b/compiler/testData/foreignAnnotations/tests/jsr305/typeQualifierDefault/parametersAreNonnullByDefaultPackage.kt similarity index 100% rename from compiler/testData/foreignAnnotations/tests/typeQualifierDefault/parametersAreNonnullByDefaultPackage.kt rename to compiler/testData/foreignAnnotations/tests/jsr305/typeQualifierDefault/parametersAreNonnullByDefaultPackage.kt diff --git a/compiler/testData/foreignAnnotations/tests/typeQualifierDefault/parametersAreNonnullByDefaultPackage.txt b/compiler/testData/foreignAnnotations/tests/jsr305/typeQualifierDefault/parametersAreNonnullByDefaultPackage.txt similarity index 100% rename from compiler/testData/foreignAnnotations/tests/typeQualifierDefault/parametersAreNonnullByDefaultPackage.txt rename to compiler/testData/foreignAnnotations/tests/jsr305/typeQualifierDefault/parametersAreNonnullByDefaultPackage.txt diff --git a/compiler/testData/foreignAnnotations/tests/typeQualifierDefault/springNullable.kt b/compiler/testData/foreignAnnotations/tests/jsr305/typeQualifierDefault/springNullable.kt similarity index 100% rename from compiler/testData/foreignAnnotations/tests/typeQualifierDefault/springNullable.kt rename to compiler/testData/foreignAnnotations/tests/jsr305/typeQualifierDefault/springNullable.kt diff --git a/compiler/testData/foreignAnnotations/tests/typeQualifierDefault/springNullable.txt b/compiler/testData/foreignAnnotations/tests/jsr305/typeQualifierDefault/springNullable.txt similarity index 100% rename from compiler/testData/foreignAnnotations/tests/typeQualifierDefault/springNullable.txt rename to compiler/testData/foreignAnnotations/tests/jsr305/typeQualifierDefault/springNullable.txt diff --git a/compiler/testData/foreignAnnotations/tests/typeQualifierDefault/springNullablePackage.kt b/compiler/testData/foreignAnnotations/tests/jsr305/typeQualifierDefault/springNullablePackage.kt similarity index 100% rename from compiler/testData/foreignAnnotations/tests/typeQualifierDefault/springNullablePackage.kt rename to compiler/testData/foreignAnnotations/tests/jsr305/typeQualifierDefault/springNullablePackage.kt diff --git a/compiler/testData/foreignAnnotations/tests/typeQualifierDefault/springNullablePackage.txt b/compiler/testData/foreignAnnotations/tests/jsr305/typeQualifierDefault/springNullablePackage.txt similarity index 100% rename from compiler/testData/foreignAnnotations/tests/typeQualifierDefault/springNullablePackage.txt rename to compiler/testData/foreignAnnotations/tests/jsr305/typeQualifierDefault/springNullablePackage.txt diff --git a/compiler/testData/foreignAnnotationsJava8/tests/springNullableWithTypeUse.kt b/compiler/testData/foreignAnnotationsJava8/tests/jsr305/springNullableWithTypeUse.kt similarity index 100% rename from compiler/testData/foreignAnnotationsJava8/tests/springNullableWithTypeUse.kt rename to compiler/testData/foreignAnnotationsJava8/tests/jsr305/springNullableWithTypeUse.kt diff --git a/compiler/testData/foreignAnnotationsJava8/tests/springNullableWithTypeUse.txt b/compiler/testData/foreignAnnotationsJava8/tests/jsr305/springNullableWithTypeUse.txt similarity index 100% rename from compiler/testData/foreignAnnotationsJava8/tests/springNullableWithTypeUse.txt rename to compiler/testData/foreignAnnotationsJava8/tests/jsr305/springNullableWithTypeUse.txt diff --git a/compiler/tests-java8/tests/org/jetbrains/kotlin/checkers/ForeignJava8AnnotationsTestGenerated.java b/compiler/tests-java8/tests/org/jetbrains/kotlin/checkers/ForeignJava8AnnotationsTestGenerated.java index a4ec796498a..6743e74c660 100644 --- a/compiler/tests-java8/tests/org/jetbrains/kotlin/checkers/ForeignJava8AnnotationsTestGenerated.java +++ b/compiler/tests-java8/tests/org/jetbrains/kotlin/checkers/ForeignJava8AnnotationsTestGenerated.java @@ -48,10 +48,19 @@ public class ForeignJava8AnnotationsTestGenerated extends AbstractForeignJava8An doTest(fileName); } - @TestMetadata("springNullableWithTypeUse.kt") - public void testSpringNullableWithTypeUse() throws Exception { - String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotationsJava8/tests/springNullableWithTypeUse.kt"); - doTest(fileName); + @TestMetadata("compiler/testData/foreignAnnotationsJava8/tests/jsr305") + @TestDataPath("$PROJECT_ROOT") + @RunWith(JUnit3RunnerWithInners.class) + public static class Jsr305 extends AbstractForeignJava8AnnotationsTest { + public void testAllFilesPresentInJsr305() throws Exception { + KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("compiler/testData/foreignAnnotationsJava8/tests/jsr305"), Pattern.compile("^(.+)\\.kt$"), TargetBackend.ANY, true); + } + + @TestMetadata("springNullableWithTypeUse.kt") + public void testSpringNullableWithTypeUse() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotationsJava8/tests/jsr305/springNullableWithTypeUse.kt"); + doTest(fileName); + } } @TestMetadata("compiler/testData/foreignAnnotationsJava8/tests/typeEnhancement") diff --git a/compiler/tests-java8/tests/org/jetbrains/kotlin/checkers/javac/JavacForeignJava8AnnotationsTestGenerated.java b/compiler/tests-java8/tests/org/jetbrains/kotlin/checkers/javac/JavacForeignJava8AnnotationsTestGenerated.java index 20436052572..0d30ab36bcb 100644 --- a/compiler/tests-java8/tests/org/jetbrains/kotlin/checkers/javac/JavacForeignJava8AnnotationsTestGenerated.java +++ b/compiler/tests-java8/tests/org/jetbrains/kotlin/checkers/javac/JavacForeignJava8AnnotationsTestGenerated.java @@ -48,10 +48,19 @@ public class JavacForeignJava8AnnotationsTestGenerated extends AbstractJavacFore doTest(fileName); } - @TestMetadata("springNullableWithTypeUse.kt") - public void testSpringNullableWithTypeUse() throws Exception { - String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotationsJava8/tests/springNullableWithTypeUse.kt"); - doTest(fileName); + @TestMetadata("compiler/testData/foreignAnnotationsJava8/tests/jsr305") + @TestDataPath("$PROJECT_ROOT") + @RunWith(JUnit3RunnerWithInners.class) + public static class Jsr305 extends AbstractJavacForeignJava8AnnotationsTest { + public void testAllFilesPresentInJsr305() throws Exception { + KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("compiler/testData/foreignAnnotationsJava8/tests/jsr305"), Pattern.compile("^(.+)\\.kt$"), TargetBackend.ANY, true); + } + + @TestMetadata("springNullableWithTypeUse.kt") + public void testSpringNullableWithTypeUse() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotationsJava8/tests/jsr305/springNullableWithTypeUse.kt"); + doTest(fileName); + } } @TestMetadata("compiler/testData/foreignAnnotationsJava8/tests/typeEnhancement") diff --git a/compiler/tests/org/jetbrains/kotlin/checkers/ForeignAnnotationsNoAnnotationInClasspathTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/checkers/ForeignAnnotationsNoAnnotationInClasspathTestGenerated.java index 0a45f16e696..e6110611027 100644 --- a/compiler/tests/org/jetbrains/kotlin/checkers/ForeignAnnotationsNoAnnotationInClasspathTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/checkers/ForeignAnnotationsNoAnnotationInClasspathTestGenerated.java @@ -66,30 +66,6 @@ public class ForeignAnnotationsNoAnnotationInClasspathTestGenerated extends Abst doTest(fileName); } - @TestMetadata("jsr305NonNullNever.kt") - public void testJsr305NonNullNever() throws Exception { - String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305NonNullNever.kt"); - doTest(fileName); - } - - @TestMetadata("jsr305NullabilityNicknames.kt") - public void testJsr305NullabilityNicknames() throws Exception { - String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305NullabilityNicknames.kt"); - doTest(fileName); - } - - @TestMetadata("jsr305Simple.kt") - public void testJsr305Simple() throws Exception { - String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305Simple.kt"); - doTest(fileName); - } - - @TestMetadata("jsr305Strange.kt") - public void testJsr305Strange() throws Exception { - String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305Strange.kt"); - doTest(fileName); - } - @TestMetadata("lombokSimple.kt") public void testLombokSimple() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/lombokSimple.kt"); @@ -102,282 +78,315 @@ public class ForeignAnnotationsNoAnnotationInClasspathTestGenerated extends Abst doTest(fileName); } - @TestMetadata("compiler/testData/foreignAnnotations/tests/jsr305Ignore") + @TestMetadata("compiler/testData/foreignAnnotations/tests/jsr305") @TestDataPath("$PROJECT_ROOT") @RunWith(JUnit3RunnerWithInners.class) - public static class Jsr305Ignore extends AbstractForeignAnnotationsNoAnnotationInClasspathTest { - public void testAllFilesPresentInJsr305Ignore() throws Exception { - KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("compiler/testData/foreignAnnotations/tests/jsr305Ignore"), Pattern.compile("^(.+)\\.kt$"), TargetBackend.ANY, true); + public static class Jsr305 extends AbstractForeignAnnotationsNoAnnotationInClasspathTest { + public void testAllFilesPresentInJsr305() throws Exception { + KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("compiler/testData/foreignAnnotations/tests/jsr305"), Pattern.compile("^(.+)\\.kt$"), TargetBackend.ANY, true); } - @TestMetadata("parametersAreNonnullByDefault.kt") - public void testParametersAreNonnullByDefault() throws Exception { - String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305Ignore/parametersAreNonnullByDefault.kt"); - doTest(fileName); - } - } - - @TestMetadata("compiler/testData/foreignAnnotations/tests/jsr305NullabilityWarnings") - @TestDataPath("$PROJECT_ROOT") - @RunWith(JUnit3RunnerWithInners.class) - public static class Jsr305NullabilityWarnings extends AbstractForeignAnnotationsNoAnnotationInClasspathTest { - public void testAllFilesPresentInJsr305NullabilityWarnings() throws Exception { - KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("compiler/testData/foreignAnnotations/tests/jsr305NullabilityWarnings"), Pattern.compile("^(.+)\\.kt$"), TargetBackend.ANY, true); - } - - @TestMetadata("jsr305NullabilityGenerics.kt") - public void testJsr305NullabilityGenerics() throws Exception { - String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305NullabilityWarnings/jsr305NullabilityGenerics.kt"); + @TestMetadata("nonNullNever.kt") + public void testNonNullNever() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305/nonNullNever.kt"); doTest(fileName); } - @TestMetadata("jsr305NullabilityNicknames.kt") - public void testJsr305NullabilityNicknames() throws Exception { - String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305NullabilityWarnings/jsr305NullabilityNicknames.kt"); + @TestMetadata("nullabilityNicknames.kt") + public void testNullabilityNicknames() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305/nullabilityNicknames.kt"); doTest(fileName); } - @TestMetadata("jsr305Simple.kt") - public void testJsr305Simple() throws Exception { - String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305NullabilityWarnings/jsr305Simple.kt"); + @TestMetadata("simple.kt") + public void testSimple() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305/simple.kt"); doTest(fileName); } - @TestMetadata("jsr305Strange.kt") - public void testJsr305Strange() throws Exception { - String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305NullabilityWarnings/jsr305Strange.kt"); + @TestMetadata("strange.kt") + public void testStrange() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305/strange.kt"); doTest(fileName); } - @TestMetadata("compiler/testData/foreignAnnotations/tests/jsr305NullabilityWarnings/fromPlatformTypes") + @TestMetadata("compiler/testData/foreignAnnotations/tests/jsr305/ignore") @TestDataPath("$PROJECT_ROOT") @RunWith(JUnit3RunnerWithInners.class) - public static class FromPlatformTypes extends AbstractForeignAnnotationsNoAnnotationInClasspathTest { - public void testAllFilesPresentInFromPlatformTypes() throws Exception { - KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("compiler/testData/foreignAnnotations/tests/jsr305NullabilityWarnings/fromPlatformTypes"), Pattern.compile("^(.+)\\.kt$"), TargetBackend.ANY, true); + public static class Ignore extends AbstractForeignAnnotationsNoAnnotationInClasspathTest { + public void testAllFilesPresentInIgnore() throws Exception { + KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("compiler/testData/foreignAnnotations/tests/jsr305/ignore"), Pattern.compile("^(.+)\\.kt$"), TargetBackend.ANY, true); } - @TestMetadata("arithmetic.kt") - public void testArithmetic() throws Exception { - String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305NullabilityWarnings/fromPlatformTypes/arithmetic.kt"); - doTest(fileName); - } - - @TestMetadata("array.kt") - public void testArray() throws Exception { - String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305NullabilityWarnings/fromPlatformTypes/array.kt"); - doTest(fileName); - } - - @TestMetadata("assignToVar.kt") - public void testAssignToVar() throws Exception { - String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305NullabilityWarnings/fromPlatformTypes/assignToVar.kt"); - doTest(fileName); - } - - @TestMetadata("conditions.kt") - public void testConditions() throws Exception { - String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305NullabilityWarnings/fromPlatformTypes/conditions.kt"); - doTest(fileName); - } - - @TestMetadata("dataFlowInfo.kt") - public void testDataFlowInfo() throws Exception { - String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305NullabilityWarnings/fromPlatformTypes/dataFlowInfo.kt"); - doTest(fileName); - } - - @TestMetadata("defaultParameters.kt") - public void testDefaultParameters() throws Exception { - String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305NullabilityWarnings/fromPlatformTypes/defaultParameters.kt"); - doTest(fileName); - } - - @TestMetadata("delegatedProperties.kt") - public void testDelegatedProperties() throws Exception { - String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305NullabilityWarnings/fromPlatformTypes/delegatedProperties.kt"); - doTest(fileName); - } - - @TestMetadata("delegation.kt") - public void testDelegation() throws Exception { - String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305NullabilityWarnings/fromPlatformTypes/delegation.kt"); - doTest(fileName); - } - - @TestMetadata("derefenceExtension.kt") - public void testDerefenceExtension() throws Exception { - String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305NullabilityWarnings/fromPlatformTypes/derefenceExtension.kt"); - doTest(fileName); - } - - @TestMetadata("derefenceMember.kt") - public void testDerefenceMember() throws Exception { - String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305NullabilityWarnings/fromPlatformTypes/derefenceMember.kt"); - doTest(fileName); - } - - @TestMetadata("expectedType.kt") - public void testExpectedType() throws Exception { - String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305NullabilityWarnings/fromPlatformTypes/expectedType.kt"); - doTest(fileName); - } - - @TestMetadata("for.kt") - public void testFor() throws Exception { - String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305NullabilityWarnings/fromPlatformTypes/for.kt"); - doTest(fileName); - } - - @TestMetadata("functionArguments.kt") - public void testFunctionArguments() throws Exception { - String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305NullabilityWarnings/fromPlatformTypes/functionArguments.kt"); - doTest(fileName); - } - - @TestMetadata("invoke.kt") - public void testInvoke() throws Exception { - String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305NullabilityWarnings/fromPlatformTypes/invoke.kt"); - doTest(fileName); - } - - @TestMetadata("kt6829.kt") - public void testKt6829() throws Exception { - String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305NullabilityWarnings/fromPlatformTypes/kt6829.kt"); - doTest(fileName); - } - - @TestMetadata("multiDeclaration.kt") - public void testMultiDeclaration() throws Exception { - String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305NullabilityWarnings/fromPlatformTypes/multiDeclaration.kt"); - doTest(fileName); - } - - @TestMetadata("passToJava.kt") - public void testPassToJava() throws Exception { - String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305NullabilityWarnings/fromPlatformTypes/passToJava.kt"); - doTest(fileName); - } - - @TestMetadata("primitiveArray.kt") - public void testPrimitiveArray() throws Exception { - String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305NullabilityWarnings/fromPlatformTypes/primitiveArray.kt"); - doTest(fileName); - } - - @TestMetadata("throw.kt") - public void testThrow() throws Exception { - String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305NullabilityWarnings/fromPlatformTypes/throw.kt"); - doTest(fileName); - } - - @TestMetadata("uselessElvisRightIsNull.kt") - public void testUselessElvisRightIsNull() throws Exception { - String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305NullabilityWarnings/fromPlatformTypes/uselessElvisRightIsNull.kt"); + @TestMetadata("parametersAreNonnullByDefault.kt") + public void testParametersAreNonnullByDefault() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305/ignore/parametersAreNonnullByDefault.kt"); doTest(fileName); } } - @TestMetadata("compiler/testData/foreignAnnotations/tests/jsr305NullabilityWarnings/typeQualifierDefault") + @TestMetadata("compiler/testData/foreignAnnotations/tests/jsr305/nullabilityWarnings") + @TestDataPath("$PROJECT_ROOT") + @RunWith(JUnit3RunnerWithInners.class) + public static class NullabilityWarnings extends AbstractForeignAnnotationsNoAnnotationInClasspathTest { + public void testAllFilesPresentInNullabilityWarnings() throws Exception { + KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("compiler/testData/foreignAnnotations/tests/jsr305/nullabilityWarnings"), Pattern.compile("^(.+)\\.kt$"), TargetBackend.ANY, true); + } + + @TestMetadata("nullabilityGenerics.kt") + public void testNullabilityGenerics() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305/nullabilityWarnings/nullabilityGenerics.kt"); + doTest(fileName); + } + + @TestMetadata("nullabilityNicknames.kt") + public void testNullabilityNicknames() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305/nullabilityWarnings/nullabilityNicknames.kt"); + doTest(fileName); + } + + @TestMetadata("simple.kt") + public void testSimple() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305/nullabilityWarnings/simple.kt"); + doTest(fileName); + } + + @TestMetadata("strange.kt") + public void testStrange() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305/nullabilityWarnings/strange.kt"); + doTest(fileName); + } + + @TestMetadata("compiler/testData/foreignAnnotations/tests/jsr305/nullabilityWarnings/fromPlatformTypes") + @TestDataPath("$PROJECT_ROOT") + @RunWith(JUnit3RunnerWithInners.class) + public static class FromPlatformTypes extends AbstractForeignAnnotationsNoAnnotationInClasspathTest { + public void testAllFilesPresentInFromPlatformTypes() throws Exception { + KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("compiler/testData/foreignAnnotations/tests/jsr305/nullabilityWarnings/fromPlatformTypes"), Pattern.compile("^(.+)\\.kt$"), TargetBackend.ANY, true); + } + + @TestMetadata("arithmetic.kt") + public void testArithmetic() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305/nullabilityWarnings/fromPlatformTypes/arithmetic.kt"); + doTest(fileName); + } + + @TestMetadata("array.kt") + public void testArray() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305/nullabilityWarnings/fromPlatformTypes/array.kt"); + doTest(fileName); + } + + @TestMetadata("assignToVar.kt") + public void testAssignToVar() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305/nullabilityWarnings/fromPlatformTypes/assignToVar.kt"); + doTest(fileName); + } + + @TestMetadata("conditions.kt") + public void testConditions() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305/nullabilityWarnings/fromPlatformTypes/conditions.kt"); + doTest(fileName); + } + + @TestMetadata("dataFlowInfo.kt") + public void testDataFlowInfo() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305/nullabilityWarnings/fromPlatformTypes/dataFlowInfo.kt"); + doTest(fileName); + } + + @TestMetadata("defaultParameters.kt") + public void testDefaultParameters() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305/nullabilityWarnings/fromPlatformTypes/defaultParameters.kt"); + doTest(fileName); + } + + @TestMetadata("delegatedProperties.kt") + public void testDelegatedProperties() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305/nullabilityWarnings/fromPlatformTypes/delegatedProperties.kt"); + doTest(fileName); + } + + @TestMetadata("delegation.kt") + public void testDelegation() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305/nullabilityWarnings/fromPlatformTypes/delegation.kt"); + doTest(fileName); + } + + @TestMetadata("derefenceExtension.kt") + public void testDerefenceExtension() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305/nullabilityWarnings/fromPlatformTypes/derefenceExtension.kt"); + doTest(fileName); + } + + @TestMetadata("derefenceMember.kt") + public void testDerefenceMember() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305/nullabilityWarnings/fromPlatformTypes/derefenceMember.kt"); + doTest(fileName); + } + + @TestMetadata("expectedType.kt") + public void testExpectedType() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305/nullabilityWarnings/fromPlatformTypes/expectedType.kt"); + doTest(fileName); + } + + @TestMetadata("for.kt") + public void testFor() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305/nullabilityWarnings/fromPlatformTypes/for.kt"); + doTest(fileName); + } + + @TestMetadata("functionArguments.kt") + public void testFunctionArguments() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305/nullabilityWarnings/fromPlatformTypes/functionArguments.kt"); + doTest(fileName); + } + + @TestMetadata("invoke.kt") + public void testInvoke() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305/nullabilityWarnings/fromPlatformTypes/invoke.kt"); + doTest(fileName); + } + + @TestMetadata("kt6829.kt") + public void testKt6829() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305/nullabilityWarnings/fromPlatformTypes/kt6829.kt"); + doTest(fileName); + } + + @TestMetadata("multiDeclaration.kt") + public void testMultiDeclaration() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305/nullabilityWarnings/fromPlatformTypes/multiDeclaration.kt"); + doTest(fileName); + } + + @TestMetadata("passToJava.kt") + public void testPassToJava() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305/nullabilityWarnings/fromPlatformTypes/passToJava.kt"); + doTest(fileName); + } + + @TestMetadata("primitiveArray.kt") + public void testPrimitiveArray() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305/nullabilityWarnings/fromPlatformTypes/primitiveArray.kt"); + doTest(fileName); + } + + @TestMetadata("throw.kt") + public void testThrow() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305/nullabilityWarnings/fromPlatformTypes/throw.kt"); + doTest(fileName); + } + + @TestMetadata("uselessElvisRightIsNull.kt") + public void testUselessElvisRightIsNull() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305/nullabilityWarnings/fromPlatformTypes/uselessElvisRightIsNull.kt"); + doTest(fileName); + } + } + + @TestMetadata("compiler/testData/foreignAnnotations/tests/jsr305/nullabilityWarnings/typeQualifierDefault") + @TestDataPath("$PROJECT_ROOT") + @RunWith(JUnit3RunnerWithInners.class) + public static class TypeQualifierDefault extends AbstractForeignAnnotationsNoAnnotationInClasspathTest { + public void testAllFilesPresentInTypeQualifierDefault() throws Exception { + KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("compiler/testData/foreignAnnotations/tests/jsr305/nullabilityWarnings/typeQualifierDefault"), Pattern.compile("^(.+)\\.kt$"), TargetBackend.ANY, true); + } + + @TestMetadata("fieldsAreNullable.kt") + public void testFieldsAreNullable() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305/nullabilityWarnings/typeQualifierDefault/fieldsAreNullable.kt"); + doTest(fileName); + } + + @TestMetadata("nullabilityFromOverridden.kt") + public void testNullabilityFromOverridden() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305/nullabilityWarnings/typeQualifierDefault/nullabilityFromOverridden.kt"); + doTest(fileName); + } + + @TestMetadata("overridingDefaultQualifier.kt") + public void testOverridingDefaultQualifier() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305/nullabilityWarnings/typeQualifierDefault/overridingDefaultQualifier.kt"); + doTest(fileName); + } + + @TestMetadata("parametersAreNonnullByDefault.kt") + public void testParametersAreNonnullByDefault() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305/nullabilityWarnings/typeQualifierDefault/parametersAreNonnullByDefault.kt"); + doTest(fileName); + } + + @TestMetadata("parametersAreNonnullByDefaultPackage.kt") + public void testParametersAreNonnullByDefaultPackage() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305/nullabilityWarnings/typeQualifierDefault/parametersAreNonnullByDefaultPackage.kt"); + doTest(fileName); + } + + @TestMetadata("springNullable.kt") + public void testSpringNullable() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305/nullabilityWarnings/typeQualifierDefault/springNullable.kt"); + doTest(fileName); + } + + @TestMetadata("springNullablePackage.kt") + public void testSpringNullablePackage() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305/nullabilityWarnings/typeQualifierDefault/springNullablePackage.kt"); + doTest(fileName); + } + } + } + + @TestMetadata("compiler/testData/foreignAnnotations/tests/jsr305/typeQualifierDefault") @TestDataPath("$PROJECT_ROOT") @RunWith(JUnit3RunnerWithInners.class) public static class TypeQualifierDefault extends AbstractForeignAnnotationsNoAnnotationInClasspathTest { public void testAllFilesPresentInTypeQualifierDefault() throws Exception { - KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("compiler/testData/foreignAnnotations/tests/jsr305NullabilityWarnings/typeQualifierDefault"), Pattern.compile("^(.+)\\.kt$"), TargetBackend.ANY, true); + KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("compiler/testData/foreignAnnotations/tests/jsr305/typeQualifierDefault"), Pattern.compile("^(.+)\\.kt$"), TargetBackend.ANY, true); } @TestMetadata("fieldsAreNullable.kt") public void testFieldsAreNullable() throws Exception { - String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305NullabilityWarnings/typeQualifierDefault/fieldsAreNullable.kt"); + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305/typeQualifierDefault/fieldsAreNullable.kt"); doTest(fileName); } @TestMetadata("nullabilityFromOverridden.kt") public void testNullabilityFromOverridden() throws Exception { - String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305NullabilityWarnings/typeQualifierDefault/nullabilityFromOverridden.kt"); + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305/typeQualifierDefault/nullabilityFromOverridden.kt"); doTest(fileName); } @TestMetadata("overridingDefaultQualifier.kt") public void testOverridingDefaultQualifier() throws Exception { - String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305NullabilityWarnings/typeQualifierDefault/overridingDefaultQualifier.kt"); + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305/typeQualifierDefault/overridingDefaultQualifier.kt"); doTest(fileName); } @TestMetadata("parametersAreNonnullByDefault.kt") public void testParametersAreNonnullByDefault() throws Exception { - String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305NullabilityWarnings/typeQualifierDefault/parametersAreNonnullByDefault.kt"); + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305/typeQualifierDefault/parametersAreNonnullByDefault.kt"); doTest(fileName); } @TestMetadata("parametersAreNonnullByDefaultPackage.kt") public void testParametersAreNonnullByDefaultPackage() throws Exception { - String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305NullabilityWarnings/typeQualifierDefault/parametersAreNonnullByDefaultPackage.kt"); + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305/typeQualifierDefault/parametersAreNonnullByDefaultPackage.kt"); doTest(fileName); } @TestMetadata("springNullable.kt") public void testSpringNullable() throws Exception { - String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305NullabilityWarnings/typeQualifierDefault/springNullable.kt"); + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305/typeQualifierDefault/springNullable.kt"); doTest(fileName); } @TestMetadata("springNullablePackage.kt") public void testSpringNullablePackage() throws Exception { - String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305NullabilityWarnings/typeQualifierDefault/springNullablePackage.kt"); + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305/typeQualifierDefault/springNullablePackage.kt"); doTest(fileName); } } } - - @TestMetadata("compiler/testData/foreignAnnotations/tests/typeQualifierDefault") - @TestDataPath("$PROJECT_ROOT") - @RunWith(JUnit3RunnerWithInners.class) - public static class TypeQualifierDefault extends AbstractForeignAnnotationsNoAnnotationInClasspathTest { - public void testAllFilesPresentInTypeQualifierDefault() throws Exception { - KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("compiler/testData/foreignAnnotations/tests/typeQualifierDefault"), Pattern.compile("^(.+)\\.kt$"), TargetBackend.ANY, true); - } - - @TestMetadata("fieldsAreNullable.kt") - public void testFieldsAreNullable() throws Exception { - String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/typeQualifierDefault/fieldsAreNullable.kt"); - doTest(fileName); - } - - @TestMetadata("nullabilityFromOverridden.kt") - public void testNullabilityFromOverridden() throws Exception { - String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/typeQualifierDefault/nullabilityFromOverridden.kt"); - doTest(fileName); - } - - @TestMetadata("overridingDefaultQualifier.kt") - public void testOverridingDefaultQualifier() throws Exception { - String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/typeQualifierDefault/overridingDefaultQualifier.kt"); - doTest(fileName); - } - - @TestMetadata("parametersAreNonnullByDefault.kt") - public void testParametersAreNonnullByDefault() throws Exception { - String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/typeQualifierDefault/parametersAreNonnullByDefault.kt"); - doTest(fileName); - } - - @TestMetadata("parametersAreNonnullByDefaultPackage.kt") - public void testParametersAreNonnullByDefaultPackage() throws Exception { - String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/typeQualifierDefault/parametersAreNonnullByDefaultPackage.kt"); - doTest(fileName); - } - - @TestMetadata("springNullable.kt") - public void testSpringNullable() throws Exception { - String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/typeQualifierDefault/springNullable.kt"); - doTest(fileName); - } - - @TestMetadata("springNullablePackage.kt") - public void testSpringNullablePackage() throws Exception { - String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/typeQualifierDefault/springNullablePackage.kt"); - doTest(fileName); - } - } } diff --git a/compiler/tests/org/jetbrains/kotlin/checkers/ForeignAnnotationsNoAnnotationInClasspathWithFastClassReadingTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/checkers/ForeignAnnotationsNoAnnotationInClasspathWithFastClassReadingTestGenerated.java index a90e14cec0b..fd46ae49408 100644 --- a/compiler/tests/org/jetbrains/kotlin/checkers/ForeignAnnotationsNoAnnotationInClasspathWithFastClassReadingTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/checkers/ForeignAnnotationsNoAnnotationInClasspathWithFastClassReadingTestGenerated.java @@ -66,30 +66,6 @@ public class ForeignAnnotationsNoAnnotationInClasspathWithFastClassReadingTestGe doTest(fileName); } - @TestMetadata("jsr305NonNullNever.kt") - public void testJsr305NonNullNever() throws Exception { - String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305NonNullNever.kt"); - doTest(fileName); - } - - @TestMetadata("jsr305NullabilityNicknames.kt") - public void testJsr305NullabilityNicknames() throws Exception { - String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305NullabilityNicknames.kt"); - doTest(fileName); - } - - @TestMetadata("jsr305Simple.kt") - public void testJsr305Simple() throws Exception { - String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305Simple.kt"); - doTest(fileName); - } - - @TestMetadata("jsr305Strange.kt") - public void testJsr305Strange() throws Exception { - String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305Strange.kt"); - doTest(fileName); - } - @TestMetadata("lombokSimple.kt") public void testLombokSimple() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/lombokSimple.kt"); @@ -102,282 +78,315 @@ public class ForeignAnnotationsNoAnnotationInClasspathWithFastClassReadingTestGe doTest(fileName); } - @TestMetadata("compiler/testData/foreignAnnotations/tests/jsr305Ignore") + @TestMetadata("compiler/testData/foreignAnnotations/tests/jsr305") @TestDataPath("$PROJECT_ROOT") @RunWith(JUnit3RunnerWithInners.class) - public static class Jsr305Ignore extends AbstractForeignAnnotationsNoAnnotationInClasspathWithFastClassReadingTest { - public void testAllFilesPresentInJsr305Ignore() throws Exception { - KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("compiler/testData/foreignAnnotations/tests/jsr305Ignore"), Pattern.compile("^(.+)\\.kt$"), TargetBackend.ANY, true); + public static class Jsr305 extends AbstractForeignAnnotationsNoAnnotationInClasspathWithFastClassReadingTest { + public void testAllFilesPresentInJsr305() throws Exception { + KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("compiler/testData/foreignAnnotations/tests/jsr305"), Pattern.compile("^(.+)\\.kt$"), TargetBackend.ANY, true); } - @TestMetadata("parametersAreNonnullByDefault.kt") - public void testParametersAreNonnullByDefault() throws Exception { - String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305Ignore/parametersAreNonnullByDefault.kt"); - doTest(fileName); - } - } - - @TestMetadata("compiler/testData/foreignAnnotations/tests/jsr305NullabilityWarnings") - @TestDataPath("$PROJECT_ROOT") - @RunWith(JUnit3RunnerWithInners.class) - public static class Jsr305NullabilityWarnings extends AbstractForeignAnnotationsNoAnnotationInClasspathWithFastClassReadingTest { - public void testAllFilesPresentInJsr305NullabilityWarnings() throws Exception { - KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("compiler/testData/foreignAnnotations/tests/jsr305NullabilityWarnings"), Pattern.compile("^(.+)\\.kt$"), TargetBackend.ANY, true); - } - - @TestMetadata("jsr305NullabilityGenerics.kt") - public void testJsr305NullabilityGenerics() throws Exception { - String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305NullabilityWarnings/jsr305NullabilityGenerics.kt"); + @TestMetadata("nonNullNever.kt") + public void testNonNullNever() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305/nonNullNever.kt"); doTest(fileName); } - @TestMetadata("jsr305NullabilityNicknames.kt") - public void testJsr305NullabilityNicknames() throws Exception { - String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305NullabilityWarnings/jsr305NullabilityNicknames.kt"); + @TestMetadata("nullabilityNicknames.kt") + public void testNullabilityNicknames() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305/nullabilityNicknames.kt"); doTest(fileName); } - @TestMetadata("jsr305Simple.kt") - public void testJsr305Simple() throws Exception { - String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305NullabilityWarnings/jsr305Simple.kt"); + @TestMetadata("simple.kt") + public void testSimple() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305/simple.kt"); doTest(fileName); } - @TestMetadata("jsr305Strange.kt") - public void testJsr305Strange() throws Exception { - String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305NullabilityWarnings/jsr305Strange.kt"); + @TestMetadata("strange.kt") + public void testStrange() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305/strange.kt"); doTest(fileName); } - @TestMetadata("compiler/testData/foreignAnnotations/tests/jsr305NullabilityWarnings/fromPlatformTypes") + @TestMetadata("compiler/testData/foreignAnnotations/tests/jsr305/ignore") @TestDataPath("$PROJECT_ROOT") @RunWith(JUnit3RunnerWithInners.class) - public static class FromPlatformTypes extends AbstractForeignAnnotationsNoAnnotationInClasspathWithFastClassReadingTest { - public void testAllFilesPresentInFromPlatformTypes() throws Exception { - KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("compiler/testData/foreignAnnotations/tests/jsr305NullabilityWarnings/fromPlatformTypes"), Pattern.compile("^(.+)\\.kt$"), TargetBackend.ANY, true); + public static class Ignore extends AbstractForeignAnnotationsNoAnnotationInClasspathWithFastClassReadingTest { + public void testAllFilesPresentInIgnore() throws Exception { + KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("compiler/testData/foreignAnnotations/tests/jsr305/ignore"), Pattern.compile("^(.+)\\.kt$"), TargetBackend.ANY, true); } - @TestMetadata("arithmetic.kt") - public void testArithmetic() throws Exception { - String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305NullabilityWarnings/fromPlatformTypes/arithmetic.kt"); - doTest(fileName); - } - - @TestMetadata("array.kt") - public void testArray() throws Exception { - String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305NullabilityWarnings/fromPlatformTypes/array.kt"); - doTest(fileName); - } - - @TestMetadata("assignToVar.kt") - public void testAssignToVar() throws Exception { - String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305NullabilityWarnings/fromPlatformTypes/assignToVar.kt"); - doTest(fileName); - } - - @TestMetadata("conditions.kt") - public void testConditions() throws Exception { - String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305NullabilityWarnings/fromPlatformTypes/conditions.kt"); - doTest(fileName); - } - - @TestMetadata("dataFlowInfo.kt") - public void testDataFlowInfo() throws Exception { - String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305NullabilityWarnings/fromPlatformTypes/dataFlowInfo.kt"); - doTest(fileName); - } - - @TestMetadata("defaultParameters.kt") - public void testDefaultParameters() throws Exception { - String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305NullabilityWarnings/fromPlatformTypes/defaultParameters.kt"); - doTest(fileName); - } - - @TestMetadata("delegatedProperties.kt") - public void testDelegatedProperties() throws Exception { - String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305NullabilityWarnings/fromPlatformTypes/delegatedProperties.kt"); - doTest(fileName); - } - - @TestMetadata("delegation.kt") - public void testDelegation() throws Exception { - String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305NullabilityWarnings/fromPlatformTypes/delegation.kt"); - doTest(fileName); - } - - @TestMetadata("derefenceExtension.kt") - public void testDerefenceExtension() throws Exception { - String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305NullabilityWarnings/fromPlatformTypes/derefenceExtension.kt"); - doTest(fileName); - } - - @TestMetadata("derefenceMember.kt") - public void testDerefenceMember() throws Exception { - String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305NullabilityWarnings/fromPlatformTypes/derefenceMember.kt"); - doTest(fileName); - } - - @TestMetadata("expectedType.kt") - public void testExpectedType() throws Exception { - String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305NullabilityWarnings/fromPlatformTypes/expectedType.kt"); - doTest(fileName); - } - - @TestMetadata("for.kt") - public void testFor() throws Exception { - String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305NullabilityWarnings/fromPlatformTypes/for.kt"); - doTest(fileName); - } - - @TestMetadata("functionArguments.kt") - public void testFunctionArguments() throws Exception { - String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305NullabilityWarnings/fromPlatformTypes/functionArguments.kt"); - doTest(fileName); - } - - @TestMetadata("invoke.kt") - public void testInvoke() throws Exception { - String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305NullabilityWarnings/fromPlatformTypes/invoke.kt"); - doTest(fileName); - } - - @TestMetadata("kt6829.kt") - public void testKt6829() throws Exception { - String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305NullabilityWarnings/fromPlatformTypes/kt6829.kt"); - doTest(fileName); - } - - @TestMetadata("multiDeclaration.kt") - public void testMultiDeclaration() throws Exception { - String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305NullabilityWarnings/fromPlatformTypes/multiDeclaration.kt"); - doTest(fileName); - } - - @TestMetadata("passToJava.kt") - public void testPassToJava() throws Exception { - String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305NullabilityWarnings/fromPlatformTypes/passToJava.kt"); - doTest(fileName); - } - - @TestMetadata("primitiveArray.kt") - public void testPrimitiveArray() throws Exception { - String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305NullabilityWarnings/fromPlatformTypes/primitiveArray.kt"); - doTest(fileName); - } - - @TestMetadata("throw.kt") - public void testThrow() throws Exception { - String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305NullabilityWarnings/fromPlatformTypes/throw.kt"); - doTest(fileName); - } - - @TestMetadata("uselessElvisRightIsNull.kt") - public void testUselessElvisRightIsNull() throws Exception { - String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305NullabilityWarnings/fromPlatformTypes/uselessElvisRightIsNull.kt"); + @TestMetadata("parametersAreNonnullByDefault.kt") + public void testParametersAreNonnullByDefault() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305/ignore/parametersAreNonnullByDefault.kt"); doTest(fileName); } } - @TestMetadata("compiler/testData/foreignAnnotations/tests/jsr305NullabilityWarnings/typeQualifierDefault") + @TestMetadata("compiler/testData/foreignAnnotations/tests/jsr305/nullabilityWarnings") + @TestDataPath("$PROJECT_ROOT") + @RunWith(JUnit3RunnerWithInners.class) + public static class NullabilityWarnings extends AbstractForeignAnnotationsNoAnnotationInClasspathWithFastClassReadingTest { + public void testAllFilesPresentInNullabilityWarnings() throws Exception { + KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("compiler/testData/foreignAnnotations/tests/jsr305/nullabilityWarnings"), Pattern.compile("^(.+)\\.kt$"), TargetBackend.ANY, true); + } + + @TestMetadata("nullabilityGenerics.kt") + public void testNullabilityGenerics() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305/nullabilityWarnings/nullabilityGenerics.kt"); + doTest(fileName); + } + + @TestMetadata("nullabilityNicknames.kt") + public void testNullabilityNicknames() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305/nullabilityWarnings/nullabilityNicknames.kt"); + doTest(fileName); + } + + @TestMetadata("simple.kt") + public void testSimple() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305/nullabilityWarnings/simple.kt"); + doTest(fileName); + } + + @TestMetadata("strange.kt") + public void testStrange() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305/nullabilityWarnings/strange.kt"); + doTest(fileName); + } + + @TestMetadata("compiler/testData/foreignAnnotations/tests/jsr305/nullabilityWarnings/fromPlatformTypes") + @TestDataPath("$PROJECT_ROOT") + @RunWith(JUnit3RunnerWithInners.class) + public static class FromPlatformTypes extends AbstractForeignAnnotationsNoAnnotationInClasspathWithFastClassReadingTest { + public void testAllFilesPresentInFromPlatformTypes() throws Exception { + KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("compiler/testData/foreignAnnotations/tests/jsr305/nullabilityWarnings/fromPlatformTypes"), Pattern.compile("^(.+)\\.kt$"), TargetBackend.ANY, true); + } + + @TestMetadata("arithmetic.kt") + public void testArithmetic() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305/nullabilityWarnings/fromPlatformTypes/arithmetic.kt"); + doTest(fileName); + } + + @TestMetadata("array.kt") + public void testArray() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305/nullabilityWarnings/fromPlatformTypes/array.kt"); + doTest(fileName); + } + + @TestMetadata("assignToVar.kt") + public void testAssignToVar() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305/nullabilityWarnings/fromPlatformTypes/assignToVar.kt"); + doTest(fileName); + } + + @TestMetadata("conditions.kt") + public void testConditions() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305/nullabilityWarnings/fromPlatformTypes/conditions.kt"); + doTest(fileName); + } + + @TestMetadata("dataFlowInfo.kt") + public void testDataFlowInfo() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305/nullabilityWarnings/fromPlatformTypes/dataFlowInfo.kt"); + doTest(fileName); + } + + @TestMetadata("defaultParameters.kt") + public void testDefaultParameters() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305/nullabilityWarnings/fromPlatformTypes/defaultParameters.kt"); + doTest(fileName); + } + + @TestMetadata("delegatedProperties.kt") + public void testDelegatedProperties() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305/nullabilityWarnings/fromPlatformTypes/delegatedProperties.kt"); + doTest(fileName); + } + + @TestMetadata("delegation.kt") + public void testDelegation() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305/nullabilityWarnings/fromPlatformTypes/delegation.kt"); + doTest(fileName); + } + + @TestMetadata("derefenceExtension.kt") + public void testDerefenceExtension() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305/nullabilityWarnings/fromPlatformTypes/derefenceExtension.kt"); + doTest(fileName); + } + + @TestMetadata("derefenceMember.kt") + public void testDerefenceMember() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305/nullabilityWarnings/fromPlatformTypes/derefenceMember.kt"); + doTest(fileName); + } + + @TestMetadata("expectedType.kt") + public void testExpectedType() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305/nullabilityWarnings/fromPlatformTypes/expectedType.kt"); + doTest(fileName); + } + + @TestMetadata("for.kt") + public void testFor() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305/nullabilityWarnings/fromPlatformTypes/for.kt"); + doTest(fileName); + } + + @TestMetadata("functionArguments.kt") + public void testFunctionArguments() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305/nullabilityWarnings/fromPlatformTypes/functionArguments.kt"); + doTest(fileName); + } + + @TestMetadata("invoke.kt") + public void testInvoke() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305/nullabilityWarnings/fromPlatformTypes/invoke.kt"); + doTest(fileName); + } + + @TestMetadata("kt6829.kt") + public void testKt6829() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305/nullabilityWarnings/fromPlatformTypes/kt6829.kt"); + doTest(fileName); + } + + @TestMetadata("multiDeclaration.kt") + public void testMultiDeclaration() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305/nullabilityWarnings/fromPlatformTypes/multiDeclaration.kt"); + doTest(fileName); + } + + @TestMetadata("passToJava.kt") + public void testPassToJava() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305/nullabilityWarnings/fromPlatformTypes/passToJava.kt"); + doTest(fileName); + } + + @TestMetadata("primitiveArray.kt") + public void testPrimitiveArray() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305/nullabilityWarnings/fromPlatformTypes/primitiveArray.kt"); + doTest(fileName); + } + + @TestMetadata("throw.kt") + public void testThrow() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305/nullabilityWarnings/fromPlatformTypes/throw.kt"); + doTest(fileName); + } + + @TestMetadata("uselessElvisRightIsNull.kt") + public void testUselessElvisRightIsNull() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305/nullabilityWarnings/fromPlatformTypes/uselessElvisRightIsNull.kt"); + doTest(fileName); + } + } + + @TestMetadata("compiler/testData/foreignAnnotations/tests/jsr305/nullabilityWarnings/typeQualifierDefault") + @TestDataPath("$PROJECT_ROOT") + @RunWith(JUnit3RunnerWithInners.class) + public static class TypeQualifierDefault extends AbstractForeignAnnotationsNoAnnotationInClasspathWithFastClassReadingTest { + public void testAllFilesPresentInTypeQualifierDefault() throws Exception { + KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("compiler/testData/foreignAnnotations/tests/jsr305/nullabilityWarnings/typeQualifierDefault"), Pattern.compile("^(.+)\\.kt$"), TargetBackend.ANY, true); + } + + @TestMetadata("fieldsAreNullable.kt") + public void testFieldsAreNullable() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305/nullabilityWarnings/typeQualifierDefault/fieldsAreNullable.kt"); + doTest(fileName); + } + + @TestMetadata("nullabilityFromOverridden.kt") + public void testNullabilityFromOverridden() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305/nullabilityWarnings/typeQualifierDefault/nullabilityFromOverridden.kt"); + doTest(fileName); + } + + @TestMetadata("overridingDefaultQualifier.kt") + public void testOverridingDefaultQualifier() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305/nullabilityWarnings/typeQualifierDefault/overridingDefaultQualifier.kt"); + doTest(fileName); + } + + @TestMetadata("parametersAreNonnullByDefault.kt") + public void testParametersAreNonnullByDefault() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305/nullabilityWarnings/typeQualifierDefault/parametersAreNonnullByDefault.kt"); + doTest(fileName); + } + + @TestMetadata("parametersAreNonnullByDefaultPackage.kt") + public void testParametersAreNonnullByDefaultPackage() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305/nullabilityWarnings/typeQualifierDefault/parametersAreNonnullByDefaultPackage.kt"); + doTest(fileName); + } + + @TestMetadata("springNullable.kt") + public void testSpringNullable() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305/nullabilityWarnings/typeQualifierDefault/springNullable.kt"); + doTest(fileName); + } + + @TestMetadata("springNullablePackage.kt") + public void testSpringNullablePackage() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305/nullabilityWarnings/typeQualifierDefault/springNullablePackage.kt"); + doTest(fileName); + } + } + } + + @TestMetadata("compiler/testData/foreignAnnotations/tests/jsr305/typeQualifierDefault") @TestDataPath("$PROJECT_ROOT") @RunWith(JUnit3RunnerWithInners.class) public static class TypeQualifierDefault extends AbstractForeignAnnotationsNoAnnotationInClasspathWithFastClassReadingTest { public void testAllFilesPresentInTypeQualifierDefault() throws Exception { - KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("compiler/testData/foreignAnnotations/tests/jsr305NullabilityWarnings/typeQualifierDefault"), Pattern.compile("^(.+)\\.kt$"), TargetBackend.ANY, true); + KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("compiler/testData/foreignAnnotations/tests/jsr305/typeQualifierDefault"), Pattern.compile("^(.+)\\.kt$"), TargetBackend.ANY, true); } @TestMetadata("fieldsAreNullable.kt") public void testFieldsAreNullable() throws Exception { - String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305NullabilityWarnings/typeQualifierDefault/fieldsAreNullable.kt"); + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305/typeQualifierDefault/fieldsAreNullable.kt"); doTest(fileName); } @TestMetadata("nullabilityFromOverridden.kt") public void testNullabilityFromOverridden() throws Exception { - String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305NullabilityWarnings/typeQualifierDefault/nullabilityFromOverridden.kt"); + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305/typeQualifierDefault/nullabilityFromOverridden.kt"); doTest(fileName); } @TestMetadata("overridingDefaultQualifier.kt") public void testOverridingDefaultQualifier() throws Exception { - String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305NullabilityWarnings/typeQualifierDefault/overridingDefaultQualifier.kt"); + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305/typeQualifierDefault/overridingDefaultQualifier.kt"); doTest(fileName); } @TestMetadata("parametersAreNonnullByDefault.kt") public void testParametersAreNonnullByDefault() throws Exception { - String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305NullabilityWarnings/typeQualifierDefault/parametersAreNonnullByDefault.kt"); + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305/typeQualifierDefault/parametersAreNonnullByDefault.kt"); doTest(fileName); } @TestMetadata("parametersAreNonnullByDefaultPackage.kt") public void testParametersAreNonnullByDefaultPackage() throws Exception { - String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305NullabilityWarnings/typeQualifierDefault/parametersAreNonnullByDefaultPackage.kt"); + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305/typeQualifierDefault/parametersAreNonnullByDefaultPackage.kt"); doTest(fileName); } @TestMetadata("springNullable.kt") public void testSpringNullable() throws Exception { - String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305NullabilityWarnings/typeQualifierDefault/springNullable.kt"); + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305/typeQualifierDefault/springNullable.kt"); doTest(fileName); } @TestMetadata("springNullablePackage.kt") public void testSpringNullablePackage() throws Exception { - String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305NullabilityWarnings/typeQualifierDefault/springNullablePackage.kt"); + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305/typeQualifierDefault/springNullablePackage.kt"); doTest(fileName); } } } - - @TestMetadata("compiler/testData/foreignAnnotations/tests/typeQualifierDefault") - @TestDataPath("$PROJECT_ROOT") - @RunWith(JUnit3RunnerWithInners.class) - public static class TypeQualifierDefault extends AbstractForeignAnnotationsNoAnnotationInClasspathWithFastClassReadingTest { - public void testAllFilesPresentInTypeQualifierDefault() throws Exception { - KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("compiler/testData/foreignAnnotations/tests/typeQualifierDefault"), Pattern.compile("^(.+)\\.kt$"), TargetBackend.ANY, true); - } - - @TestMetadata("fieldsAreNullable.kt") - public void testFieldsAreNullable() throws Exception { - String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/typeQualifierDefault/fieldsAreNullable.kt"); - doTest(fileName); - } - - @TestMetadata("nullabilityFromOverridden.kt") - public void testNullabilityFromOverridden() throws Exception { - String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/typeQualifierDefault/nullabilityFromOverridden.kt"); - doTest(fileName); - } - - @TestMetadata("overridingDefaultQualifier.kt") - public void testOverridingDefaultQualifier() throws Exception { - String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/typeQualifierDefault/overridingDefaultQualifier.kt"); - doTest(fileName); - } - - @TestMetadata("parametersAreNonnullByDefault.kt") - public void testParametersAreNonnullByDefault() throws Exception { - String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/typeQualifierDefault/parametersAreNonnullByDefault.kt"); - doTest(fileName); - } - - @TestMetadata("parametersAreNonnullByDefaultPackage.kt") - public void testParametersAreNonnullByDefaultPackage() throws Exception { - String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/typeQualifierDefault/parametersAreNonnullByDefaultPackage.kt"); - doTest(fileName); - } - - @TestMetadata("springNullable.kt") - public void testSpringNullable() throws Exception { - String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/typeQualifierDefault/springNullable.kt"); - doTest(fileName); - } - - @TestMetadata("springNullablePackage.kt") - public void testSpringNullablePackage() throws Exception { - String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/typeQualifierDefault/springNullablePackage.kt"); - doTest(fileName); - } - } } diff --git a/compiler/tests/org/jetbrains/kotlin/checkers/ForeignAnnotationsTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/checkers/ForeignAnnotationsTestGenerated.java index a2f1d3aebc2..4633ebcc127 100644 --- a/compiler/tests/org/jetbrains/kotlin/checkers/ForeignAnnotationsTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/checkers/ForeignAnnotationsTestGenerated.java @@ -66,30 +66,6 @@ public class ForeignAnnotationsTestGenerated extends AbstractForeignAnnotationsT doTest(fileName); } - @TestMetadata("jsr305NonNullNever.kt") - public void testJsr305NonNullNever() throws Exception { - String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305NonNullNever.kt"); - doTest(fileName); - } - - @TestMetadata("jsr305NullabilityNicknames.kt") - public void testJsr305NullabilityNicknames() throws Exception { - String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305NullabilityNicknames.kt"); - doTest(fileName); - } - - @TestMetadata("jsr305Simple.kt") - public void testJsr305Simple() throws Exception { - String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305Simple.kt"); - doTest(fileName); - } - - @TestMetadata("jsr305Strange.kt") - public void testJsr305Strange() throws Exception { - String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305Strange.kt"); - doTest(fileName); - } - @TestMetadata("lombokSimple.kt") public void testLombokSimple() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/lombokSimple.kt"); @@ -102,282 +78,315 @@ public class ForeignAnnotationsTestGenerated extends AbstractForeignAnnotationsT doTest(fileName); } - @TestMetadata("compiler/testData/foreignAnnotations/tests/jsr305Ignore") + @TestMetadata("compiler/testData/foreignAnnotations/tests/jsr305") @TestDataPath("$PROJECT_ROOT") @RunWith(JUnit3RunnerWithInners.class) - public static class Jsr305Ignore extends AbstractForeignAnnotationsTest { - public void testAllFilesPresentInJsr305Ignore() throws Exception { - KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("compiler/testData/foreignAnnotations/tests/jsr305Ignore"), Pattern.compile("^(.+)\\.kt$"), TargetBackend.ANY, true); + public static class Jsr305 extends AbstractForeignAnnotationsTest { + public void testAllFilesPresentInJsr305() throws Exception { + KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("compiler/testData/foreignAnnotations/tests/jsr305"), Pattern.compile("^(.+)\\.kt$"), TargetBackend.ANY, true); } - @TestMetadata("parametersAreNonnullByDefault.kt") - public void testParametersAreNonnullByDefault() throws Exception { - String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305Ignore/parametersAreNonnullByDefault.kt"); - doTest(fileName); - } - } - - @TestMetadata("compiler/testData/foreignAnnotations/tests/jsr305NullabilityWarnings") - @TestDataPath("$PROJECT_ROOT") - @RunWith(JUnit3RunnerWithInners.class) - public static class Jsr305NullabilityWarnings extends AbstractForeignAnnotationsTest { - public void testAllFilesPresentInJsr305NullabilityWarnings() throws Exception { - KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("compiler/testData/foreignAnnotations/tests/jsr305NullabilityWarnings"), Pattern.compile("^(.+)\\.kt$"), TargetBackend.ANY, true); - } - - @TestMetadata("jsr305NullabilityGenerics.kt") - public void testJsr305NullabilityGenerics() throws Exception { - String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305NullabilityWarnings/jsr305NullabilityGenerics.kt"); + @TestMetadata("nonNullNever.kt") + public void testNonNullNever() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305/nonNullNever.kt"); doTest(fileName); } - @TestMetadata("jsr305NullabilityNicknames.kt") - public void testJsr305NullabilityNicknames() throws Exception { - String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305NullabilityWarnings/jsr305NullabilityNicknames.kt"); + @TestMetadata("nullabilityNicknames.kt") + public void testNullabilityNicknames() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305/nullabilityNicknames.kt"); doTest(fileName); } - @TestMetadata("jsr305Simple.kt") - public void testJsr305Simple() throws Exception { - String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305NullabilityWarnings/jsr305Simple.kt"); + @TestMetadata("simple.kt") + public void testSimple() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305/simple.kt"); doTest(fileName); } - @TestMetadata("jsr305Strange.kt") - public void testJsr305Strange() throws Exception { - String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305NullabilityWarnings/jsr305Strange.kt"); + @TestMetadata("strange.kt") + public void testStrange() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305/strange.kt"); doTest(fileName); } - @TestMetadata("compiler/testData/foreignAnnotations/tests/jsr305NullabilityWarnings/fromPlatformTypes") + @TestMetadata("compiler/testData/foreignAnnotations/tests/jsr305/ignore") @TestDataPath("$PROJECT_ROOT") @RunWith(JUnit3RunnerWithInners.class) - public static class FromPlatformTypes extends AbstractForeignAnnotationsTest { - public void testAllFilesPresentInFromPlatformTypes() throws Exception { - KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("compiler/testData/foreignAnnotations/tests/jsr305NullabilityWarnings/fromPlatformTypes"), Pattern.compile("^(.+)\\.kt$"), TargetBackend.ANY, true); + public static class Ignore extends AbstractForeignAnnotationsTest { + public void testAllFilesPresentInIgnore() throws Exception { + KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("compiler/testData/foreignAnnotations/tests/jsr305/ignore"), Pattern.compile("^(.+)\\.kt$"), TargetBackend.ANY, true); } - @TestMetadata("arithmetic.kt") - public void testArithmetic() throws Exception { - String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305NullabilityWarnings/fromPlatformTypes/arithmetic.kt"); - doTest(fileName); - } - - @TestMetadata("array.kt") - public void testArray() throws Exception { - String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305NullabilityWarnings/fromPlatformTypes/array.kt"); - doTest(fileName); - } - - @TestMetadata("assignToVar.kt") - public void testAssignToVar() throws Exception { - String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305NullabilityWarnings/fromPlatformTypes/assignToVar.kt"); - doTest(fileName); - } - - @TestMetadata("conditions.kt") - public void testConditions() throws Exception { - String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305NullabilityWarnings/fromPlatformTypes/conditions.kt"); - doTest(fileName); - } - - @TestMetadata("dataFlowInfo.kt") - public void testDataFlowInfo() throws Exception { - String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305NullabilityWarnings/fromPlatformTypes/dataFlowInfo.kt"); - doTest(fileName); - } - - @TestMetadata("defaultParameters.kt") - public void testDefaultParameters() throws Exception { - String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305NullabilityWarnings/fromPlatformTypes/defaultParameters.kt"); - doTest(fileName); - } - - @TestMetadata("delegatedProperties.kt") - public void testDelegatedProperties() throws Exception { - String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305NullabilityWarnings/fromPlatformTypes/delegatedProperties.kt"); - doTest(fileName); - } - - @TestMetadata("delegation.kt") - public void testDelegation() throws Exception { - String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305NullabilityWarnings/fromPlatformTypes/delegation.kt"); - doTest(fileName); - } - - @TestMetadata("derefenceExtension.kt") - public void testDerefenceExtension() throws Exception { - String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305NullabilityWarnings/fromPlatformTypes/derefenceExtension.kt"); - doTest(fileName); - } - - @TestMetadata("derefenceMember.kt") - public void testDerefenceMember() throws Exception { - String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305NullabilityWarnings/fromPlatformTypes/derefenceMember.kt"); - doTest(fileName); - } - - @TestMetadata("expectedType.kt") - public void testExpectedType() throws Exception { - String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305NullabilityWarnings/fromPlatformTypes/expectedType.kt"); - doTest(fileName); - } - - @TestMetadata("for.kt") - public void testFor() throws Exception { - String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305NullabilityWarnings/fromPlatformTypes/for.kt"); - doTest(fileName); - } - - @TestMetadata("functionArguments.kt") - public void testFunctionArguments() throws Exception { - String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305NullabilityWarnings/fromPlatformTypes/functionArguments.kt"); - doTest(fileName); - } - - @TestMetadata("invoke.kt") - public void testInvoke() throws Exception { - String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305NullabilityWarnings/fromPlatformTypes/invoke.kt"); - doTest(fileName); - } - - @TestMetadata("kt6829.kt") - public void testKt6829() throws Exception { - String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305NullabilityWarnings/fromPlatformTypes/kt6829.kt"); - doTest(fileName); - } - - @TestMetadata("multiDeclaration.kt") - public void testMultiDeclaration() throws Exception { - String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305NullabilityWarnings/fromPlatformTypes/multiDeclaration.kt"); - doTest(fileName); - } - - @TestMetadata("passToJava.kt") - public void testPassToJava() throws Exception { - String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305NullabilityWarnings/fromPlatformTypes/passToJava.kt"); - doTest(fileName); - } - - @TestMetadata("primitiveArray.kt") - public void testPrimitiveArray() throws Exception { - String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305NullabilityWarnings/fromPlatformTypes/primitiveArray.kt"); - doTest(fileName); - } - - @TestMetadata("throw.kt") - public void testThrow() throws Exception { - String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305NullabilityWarnings/fromPlatformTypes/throw.kt"); - doTest(fileName); - } - - @TestMetadata("uselessElvisRightIsNull.kt") - public void testUselessElvisRightIsNull() throws Exception { - String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305NullabilityWarnings/fromPlatformTypes/uselessElvisRightIsNull.kt"); + @TestMetadata("parametersAreNonnullByDefault.kt") + public void testParametersAreNonnullByDefault() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305/ignore/parametersAreNonnullByDefault.kt"); doTest(fileName); } } - @TestMetadata("compiler/testData/foreignAnnotations/tests/jsr305NullabilityWarnings/typeQualifierDefault") + @TestMetadata("compiler/testData/foreignAnnotations/tests/jsr305/nullabilityWarnings") + @TestDataPath("$PROJECT_ROOT") + @RunWith(JUnit3RunnerWithInners.class) + public static class NullabilityWarnings extends AbstractForeignAnnotationsTest { + public void testAllFilesPresentInNullabilityWarnings() throws Exception { + KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("compiler/testData/foreignAnnotations/tests/jsr305/nullabilityWarnings"), Pattern.compile("^(.+)\\.kt$"), TargetBackend.ANY, true); + } + + @TestMetadata("nullabilityGenerics.kt") + public void testNullabilityGenerics() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305/nullabilityWarnings/nullabilityGenerics.kt"); + doTest(fileName); + } + + @TestMetadata("nullabilityNicknames.kt") + public void testNullabilityNicknames() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305/nullabilityWarnings/nullabilityNicknames.kt"); + doTest(fileName); + } + + @TestMetadata("simple.kt") + public void testSimple() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305/nullabilityWarnings/simple.kt"); + doTest(fileName); + } + + @TestMetadata("strange.kt") + public void testStrange() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305/nullabilityWarnings/strange.kt"); + doTest(fileName); + } + + @TestMetadata("compiler/testData/foreignAnnotations/tests/jsr305/nullabilityWarnings/fromPlatformTypes") + @TestDataPath("$PROJECT_ROOT") + @RunWith(JUnit3RunnerWithInners.class) + public static class FromPlatformTypes extends AbstractForeignAnnotationsTest { + public void testAllFilesPresentInFromPlatformTypes() throws Exception { + KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("compiler/testData/foreignAnnotations/tests/jsr305/nullabilityWarnings/fromPlatformTypes"), Pattern.compile("^(.+)\\.kt$"), TargetBackend.ANY, true); + } + + @TestMetadata("arithmetic.kt") + public void testArithmetic() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305/nullabilityWarnings/fromPlatformTypes/arithmetic.kt"); + doTest(fileName); + } + + @TestMetadata("array.kt") + public void testArray() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305/nullabilityWarnings/fromPlatformTypes/array.kt"); + doTest(fileName); + } + + @TestMetadata("assignToVar.kt") + public void testAssignToVar() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305/nullabilityWarnings/fromPlatformTypes/assignToVar.kt"); + doTest(fileName); + } + + @TestMetadata("conditions.kt") + public void testConditions() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305/nullabilityWarnings/fromPlatformTypes/conditions.kt"); + doTest(fileName); + } + + @TestMetadata("dataFlowInfo.kt") + public void testDataFlowInfo() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305/nullabilityWarnings/fromPlatformTypes/dataFlowInfo.kt"); + doTest(fileName); + } + + @TestMetadata("defaultParameters.kt") + public void testDefaultParameters() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305/nullabilityWarnings/fromPlatformTypes/defaultParameters.kt"); + doTest(fileName); + } + + @TestMetadata("delegatedProperties.kt") + public void testDelegatedProperties() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305/nullabilityWarnings/fromPlatformTypes/delegatedProperties.kt"); + doTest(fileName); + } + + @TestMetadata("delegation.kt") + public void testDelegation() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305/nullabilityWarnings/fromPlatformTypes/delegation.kt"); + doTest(fileName); + } + + @TestMetadata("derefenceExtension.kt") + public void testDerefenceExtension() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305/nullabilityWarnings/fromPlatformTypes/derefenceExtension.kt"); + doTest(fileName); + } + + @TestMetadata("derefenceMember.kt") + public void testDerefenceMember() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305/nullabilityWarnings/fromPlatformTypes/derefenceMember.kt"); + doTest(fileName); + } + + @TestMetadata("expectedType.kt") + public void testExpectedType() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305/nullabilityWarnings/fromPlatformTypes/expectedType.kt"); + doTest(fileName); + } + + @TestMetadata("for.kt") + public void testFor() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305/nullabilityWarnings/fromPlatformTypes/for.kt"); + doTest(fileName); + } + + @TestMetadata("functionArguments.kt") + public void testFunctionArguments() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305/nullabilityWarnings/fromPlatformTypes/functionArguments.kt"); + doTest(fileName); + } + + @TestMetadata("invoke.kt") + public void testInvoke() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305/nullabilityWarnings/fromPlatformTypes/invoke.kt"); + doTest(fileName); + } + + @TestMetadata("kt6829.kt") + public void testKt6829() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305/nullabilityWarnings/fromPlatformTypes/kt6829.kt"); + doTest(fileName); + } + + @TestMetadata("multiDeclaration.kt") + public void testMultiDeclaration() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305/nullabilityWarnings/fromPlatformTypes/multiDeclaration.kt"); + doTest(fileName); + } + + @TestMetadata("passToJava.kt") + public void testPassToJava() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305/nullabilityWarnings/fromPlatformTypes/passToJava.kt"); + doTest(fileName); + } + + @TestMetadata("primitiveArray.kt") + public void testPrimitiveArray() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305/nullabilityWarnings/fromPlatformTypes/primitiveArray.kt"); + doTest(fileName); + } + + @TestMetadata("throw.kt") + public void testThrow() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305/nullabilityWarnings/fromPlatformTypes/throw.kt"); + doTest(fileName); + } + + @TestMetadata("uselessElvisRightIsNull.kt") + public void testUselessElvisRightIsNull() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305/nullabilityWarnings/fromPlatformTypes/uselessElvisRightIsNull.kt"); + doTest(fileName); + } + } + + @TestMetadata("compiler/testData/foreignAnnotations/tests/jsr305/nullabilityWarnings/typeQualifierDefault") + @TestDataPath("$PROJECT_ROOT") + @RunWith(JUnit3RunnerWithInners.class) + public static class TypeQualifierDefault extends AbstractForeignAnnotationsTest { + public void testAllFilesPresentInTypeQualifierDefault() throws Exception { + KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("compiler/testData/foreignAnnotations/tests/jsr305/nullabilityWarnings/typeQualifierDefault"), Pattern.compile("^(.+)\\.kt$"), TargetBackend.ANY, true); + } + + @TestMetadata("fieldsAreNullable.kt") + public void testFieldsAreNullable() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305/nullabilityWarnings/typeQualifierDefault/fieldsAreNullable.kt"); + doTest(fileName); + } + + @TestMetadata("nullabilityFromOverridden.kt") + public void testNullabilityFromOverridden() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305/nullabilityWarnings/typeQualifierDefault/nullabilityFromOverridden.kt"); + doTest(fileName); + } + + @TestMetadata("overridingDefaultQualifier.kt") + public void testOverridingDefaultQualifier() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305/nullabilityWarnings/typeQualifierDefault/overridingDefaultQualifier.kt"); + doTest(fileName); + } + + @TestMetadata("parametersAreNonnullByDefault.kt") + public void testParametersAreNonnullByDefault() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305/nullabilityWarnings/typeQualifierDefault/parametersAreNonnullByDefault.kt"); + doTest(fileName); + } + + @TestMetadata("parametersAreNonnullByDefaultPackage.kt") + public void testParametersAreNonnullByDefaultPackage() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305/nullabilityWarnings/typeQualifierDefault/parametersAreNonnullByDefaultPackage.kt"); + doTest(fileName); + } + + @TestMetadata("springNullable.kt") + public void testSpringNullable() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305/nullabilityWarnings/typeQualifierDefault/springNullable.kt"); + doTest(fileName); + } + + @TestMetadata("springNullablePackage.kt") + public void testSpringNullablePackage() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305/nullabilityWarnings/typeQualifierDefault/springNullablePackage.kt"); + doTest(fileName); + } + } + } + + @TestMetadata("compiler/testData/foreignAnnotations/tests/jsr305/typeQualifierDefault") @TestDataPath("$PROJECT_ROOT") @RunWith(JUnit3RunnerWithInners.class) public static class TypeQualifierDefault extends AbstractForeignAnnotationsTest { public void testAllFilesPresentInTypeQualifierDefault() throws Exception { - KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("compiler/testData/foreignAnnotations/tests/jsr305NullabilityWarnings/typeQualifierDefault"), Pattern.compile("^(.+)\\.kt$"), TargetBackend.ANY, true); + KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("compiler/testData/foreignAnnotations/tests/jsr305/typeQualifierDefault"), Pattern.compile("^(.+)\\.kt$"), TargetBackend.ANY, true); } @TestMetadata("fieldsAreNullable.kt") public void testFieldsAreNullable() throws Exception { - String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305NullabilityWarnings/typeQualifierDefault/fieldsAreNullable.kt"); + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305/typeQualifierDefault/fieldsAreNullable.kt"); doTest(fileName); } @TestMetadata("nullabilityFromOverridden.kt") public void testNullabilityFromOverridden() throws Exception { - String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305NullabilityWarnings/typeQualifierDefault/nullabilityFromOverridden.kt"); + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305/typeQualifierDefault/nullabilityFromOverridden.kt"); doTest(fileName); } @TestMetadata("overridingDefaultQualifier.kt") public void testOverridingDefaultQualifier() throws Exception { - String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305NullabilityWarnings/typeQualifierDefault/overridingDefaultQualifier.kt"); + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305/typeQualifierDefault/overridingDefaultQualifier.kt"); doTest(fileName); } @TestMetadata("parametersAreNonnullByDefault.kt") public void testParametersAreNonnullByDefault() throws Exception { - String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305NullabilityWarnings/typeQualifierDefault/parametersAreNonnullByDefault.kt"); + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305/typeQualifierDefault/parametersAreNonnullByDefault.kt"); doTest(fileName); } @TestMetadata("parametersAreNonnullByDefaultPackage.kt") public void testParametersAreNonnullByDefaultPackage() throws Exception { - String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305NullabilityWarnings/typeQualifierDefault/parametersAreNonnullByDefaultPackage.kt"); + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305/typeQualifierDefault/parametersAreNonnullByDefaultPackage.kt"); doTest(fileName); } @TestMetadata("springNullable.kt") public void testSpringNullable() throws Exception { - String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305NullabilityWarnings/typeQualifierDefault/springNullable.kt"); + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305/typeQualifierDefault/springNullable.kt"); doTest(fileName); } @TestMetadata("springNullablePackage.kt") public void testSpringNullablePackage() throws Exception { - String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305NullabilityWarnings/typeQualifierDefault/springNullablePackage.kt"); + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305/typeQualifierDefault/springNullablePackage.kt"); doTest(fileName); } } } - - @TestMetadata("compiler/testData/foreignAnnotations/tests/typeQualifierDefault") - @TestDataPath("$PROJECT_ROOT") - @RunWith(JUnit3RunnerWithInners.class) - public static class TypeQualifierDefault extends AbstractForeignAnnotationsTest { - public void testAllFilesPresentInTypeQualifierDefault() throws Exception { - KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("compiler/testData/foreignAnnotations/tests/typeQualifierDefault"), Pattern.compile("^(.+)\\.kt$"), TargetBackend.ANY, true); - } - - @TestMetadata("fieldsAreNullable.kt") - public void testFieldsAreNullable() throws Exception { - String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/typeQualifierDefault/fieldsAreNullable.kt"); - doTest(fileName); - } - - @TestMetadata("nullabilityFromOverridden.kt") - public void testNullabilityFromOverridden() throws Exception { - String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/typeQualifierDefault/nullabilityFromOverridden.kt"); - doTest(fileName); - } - - @TestMetadata("overridingDefaultQualifier.kt") - public void testOverridingDefaultQualifier() throws Exception { - String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/typeQualifierDefault/overridingDefaultQualifier.kt"); - doTest(fileName); - } - - @TestMetadata("parametersAreNonnullByDefault.kt") - public void testParametersAreNonnullByDefault() throws Exception { - String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/typeQualifierDefault/parametersAreNonnullByDefault.kt"); - doTest(fileName); - } - - @TestMetadata("parametersAreNonnullByDefaultPackage.kt") - public void testParametersAreNonnullByDefaultPackage() throws Exception { - String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/typeQualifierDefault/parametersAreNonnullByDefaultPackage.kt"); - doTest(fileName); - } - - @TestMetadata("springNullable.kt") - public void testSpringNullable() throws Exception { - String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/typeQualifierDefault/springNullable.kt"); - doTest(fileName); - } - - @TestMetadata("springNullablePackage.kt") - public void testSpringNullablePackage() throws Exception { - String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/typeQualifierDefault/springNullablePackage.kt"); - doTest(fileName); - } - } } diff --git a/compiler/tests/org/jetbrains/kotlin/checkers/javac/JavacForeignAnnotationsTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/checkers/javac/JavacForeignAnnotationsTestGenerated.java index 9d0dce4a19f..b5d412f581e 100644 --- a/compiler/tests/org/jetbrains/kotlin/checkers/javac/JavacForeignAnnotationsTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/checkers/javac/JavacForeignAnnotationsTestGenerated.java @@ -66,30 +66,6 @@ public class JavacForeignAnnotationsTestGenerated extends AbstractJavacForeignAn doTest(fileName); } - @TestMetadata("jsr305NonNullNever.kt") - public void testJsr305NonNullNever() throws Exception { - String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305NonNullNever.kt"); - doTest(fileName); - } - - @TestMetadata("jsr305NullabilityNicknames.kt") - public void testJsr305NullabilityNicknames() throws Exception { - String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305NullabilityNicknames.kt"); - doTest(fileName); - } - - @TestMetadata("jsr305Simple.kt") - public void testJsr305Simple() throws Exception { - String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305Simple.kt"); - doTest(fileName); - } - - @TestMetadata("jsr305Strange.kt") - public void testJsr305Strange() throws Exception { - String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305Strange.kt"); - doTest(fileName); - } - @TestMetadata("lombokSimple.kt") public void testLombokSimple() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/lombokSimple.kt"); @@ -102,282 +78,315 @@ public class JavacForeignAnnotationsTestGenerated extends AbstractJavacForeignAn doTest(fileName); } - @TestMetadata("compiler/testData/foreignAnnotations/tests/jsr305Ignore") + @TestMetadata("compiler/testData/foreignAnnotations/tests/jsr305") @TestDataPath("$PROJECT_ROOT") @RunWith(JUnit3RunnerWithInners.class) - public static class Jsr305Ignore extends AbstractJavacForeignAnnotationsTest { - public void testAllFilesPresentInJsr305Ignore() throws Exception { - KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("compiler/testData/foreignAnnotations/tests/jsr305Ignore"), Pattern.compile("^(.+)\\.kt$"), TargetBackend.ANY, true); + public static class Jsr305 extends AbstractJavacForeignAnnotationsTest { + public void testAllFilesPresentInJsr305() throws Exception { + KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("compiler/testData/foreignAnnotations/tests/jsr305"), Pattern.compile("^(.+)\\.kt$"), TargetBackend.ANY, true); } - @TestMetadata("parametersAreNonnullByDefault.kt") - public void testParametersAreNonnullByDefault() throws Exception { - String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305Ignore/parametersAreNonnullByDefault.kt"); - doTest(fileName); - } - } - - @TestMetadata("compiler/testData/foreignAnnotations/tests/jsr305NullabilityWarnings") - @TestDataPath("$PROJECT_ROOT") - @RunWith(JUnit3RunnerWithInners.class) - public static class Jsr305NullabilityWarnings extends AbstractJavacForeignAnnotationsTest { - public void testAllFilesPresentInJsr305NullabilityWarnings() throws Exception { - KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("compiler/testData/foreignAnnotations/tests/jsr305NullabilityWarnings"), Pattern.compile("^(.+)\\.kt$"), TargetBackend.ANY, true); - } - - @TestMetadata("jsr305NullabilityGenerics.kt") - public void testJsr305NullabilityGenerics() throws Exception { - String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305NullabilityWarnings/jsr305NullabilityGenerics.kt"); + @TestMetadata("nonNullNever.kt") + public void testNonNullNever() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305/nonNullNever.kt"); doTest(fileName); } - @TestMetadata("jsr305NullabilityNicknames.kt") - public void testJsr305NullabilityNicknames() throws Exception { - String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305NullabilityWarnings/jsr305NullabilityNicknames.kt"); + @TestMetadata("nullabilityNicknames.kt") + public void testNullabilityNicknames() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305/nullabilityNicknames.kt"); doTest(fileName); } - @TestMetadata("jsr305Simple.kt") - public void testJsr305Simple() throws Exception { - String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305NullabilityWarnings/jsr305Simple.kt"); + @TestMetadata("simple.kt") + public void testSimple() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305/simple.kt"); doTest(fileName); } - @TestMetadata("jsr305Strange.kt") - public void testJsr305Strange() throws Exception { - String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305NullabilityWarnings/jsr305Strange.kt"); + @TestMetadata("strange.kt") + public void testStrange() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305/strange.kt"); doTest(fileName); } - @TestMetadata("compiler/testData/foreignAnnotations/tests/jsr305NullabilityWarnings/fromPlatformTypes") + @TestMetadata("compiler/testData/foreignAnnotations/tests/jsr305/ignore") @TestDataPath("$PROJECT_ROOT") @RunWith(JUnit3RunnerWithInners.class) - public static class FromPlatformTypes extends AbstractJavacForeignAnnotationsTest { - public void testAllFilesPresentInFromPlatformTypes() throws Exception { - KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("compiler/testData/foreignAnnotations/tests/jsr305NullabilityWarnings/fromPlatformTypes"), Pattern.compile("^(.+)\\.kt$"), TargetBackend.ANY, true); + public static class Ignore extends AbstractJavacForeignAnnotationsTest { + public void testAllFilesPresentInIgnore() throws Exception { + KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("compiler/testData/foreignAnnotations/tests/jsr305/ignore"), Pattern.compile("^(.+)\\.kt$"), TargetBackend.ANY, true); } - @TestMetadata("arithmetic.kt") - public void testArithmetic() throws Exception { - String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305NullabilityWarnings/fromPlatformTypes/arithmetic.kt"); - doTest(fileName); - } - - @TestMetadata("array.kt") - public void testArray() throws Exception { - String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305NullabilityWarnings/fromPlatformTypes/array.kt"); - doTest(fileName); - } - - @TestMetadata("assignToVar.kt") - public void testAssignToVar() throws Exception { - String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305NullabilityWarnings/fromPlatformTypes/assignToVar.kt"); - doTest(fileName); - } - - @TestMetadata("conditions.kt") - public void testConditions() throws Exception { - String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305NullabilityWarnings/fromPlatformTypes/conditions.kt"); - doTest(fileName); - } - - @TestMetadata("dataFlowInfo.kt") - public void testDataFlowInfo() throws Exception { - String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305NullabilityWarnings/fromPlatformTypes/dataFlowInfo.kt"); - doTest(fileName); - } - - @TestMetadata("defaultParameters.kt") - public void testDefaultParameters() throws Exception { - String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305NullabilityWarnings/fromPlatformTypes/defaultParameters.kt"); - doTest(fileName); - } - - @TestMetadata("delegatedProperties.kt") - public void testDelegatedProperties() throws Exception { - String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305NullabilityWarnings/fromPlatformTypes/delegatedProperties.kt"); - doTest(fileName); - } - - @TestMetadata("delegation.kt") - public void testDelegation() throws Exception { - String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305NullabilityWarnings/fromPlatformTypes/delegation.kt"); - doTest(fileName); - } - - @TestMetadata("derefenceExtension.kt") - public void testDerefenceExtension() throws Exception { - String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305NullabilityWarnings/fromPlatformTypes/derefenceExtension.kt"); - doTest(fileName); - } - - @TestMetadata("derefenceMember.kt") - public void testDerefenceMember() throws Exception { - String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305NullabilityWarnings/fromPlatformTypes/derefenceMember.kt"); - doTest(fileName); - } - - @TestMetadata("expectedType.kt") - public void testExpectedType() throws Exception { - String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305NullabilityWarnings/fromPlatformTypes/expectedType.kt"); - doTest(fileName); - } - - @TestMetadata("for.kt") - public void testFor() throws Exception { - String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305NullabilityWarnings/fromPlatformTypes/for.kt"); - doTest(fileName); - } - - @TestMetadata("functionArguments.kt") - public void testFunctionArguments() throws Exception { - String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305NullabilityWarnings/fromPlatformTypes/functionArguments.kt"); - doTest(fileName); - } - - @TestMetadata("invoke.kt") - public void testInvoke() throws Exception { - String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305NullabilityWarnings/fromPlatformTypes/invoke.kt"); - doTest(fileName); - } - - @TestMetadata("kt6829.kt") - public void testKt6829() throws Exception { - String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305NullabilityWarnings/fromPlatformTypes/kt6829.kt"); - doTest(fileName); - } - - @TestMetadata("multiDeclaration.kt") - public void testMultiDeclaration() throws Exception { - String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305NullabilityWarnings/fromPlatformTypes/multiDeclaration.kt"); - doTest(fileName); - } - - @TestMetadata("passToJava.kt") - public void testPassToJava() throws Exception { - String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305NullabilityWarnings/fromPlatformTypes/passToJava.kt"); - doTest(fileName); - } - - @TestMetadata("primitiveArray.kt") - public void testPrimitiveArray() throws Exception { - String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305NullabilityWarnings/fromPlatformTypes/primitiveArray.kt"); - doTest(fileName); - } - - @TestMetadata("throw.kt") - public void testThrow() throws Exception { - String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305NullabilityWarnings/fromPlatformTypes/throw.kt"); - doTest(fileName); - } - - @TestMetadata("uselessElvisRightIsNull.kt") - public void testUselessElvisRightIsNull() throws Exception { - String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305NullabilityWarnings/fromPlatformTypes/uselessElvisRightIsNull.kt"); + @TestMetadata("parametersAreNonnullByDefault.kt") + public void testParametersAreNonnullByDefault() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305/ignore/parametersAreNonnullByDefault.kt"); doTest(fileName); } } - @TestMetadata("compiler/testData/foreignAnnotations/tests/jsr305NullabilityWarnings/typeQualifierDefault") + @TestMetadata("compiler/testData/foreignAnnotations/tests/jsr305/nullabilityWarnings") + @TestDataPath("$PROJECT_ROOT") + @RunWith(JUnit3RunnerWithInners.class) + public static class NullabilityWarnings extends AbstractJavacForeignAnnotationsTest { + public void testAllFilesPresentInNullabilityWarnings() throws Exception { + KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("compiler/testData/foreignAnnotations/tests/jsr305/nullabilityWarnings"), Pattern.compile("^(.+)\\.kt$"), TargetBackend.ANY, true); + } + + @TestMetadata("nullabilityGenerics.kt") + public void testNullabilityGenerics() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305/nullabilityWarnings/nullabilityGenerics.kt"); + doTest(fileName); + } + + @TestMetadata("nullabilityNicknames.kt") + public void testNullabilityNicknames() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305/nullabilityWarnings/nullabilityNicknames.kt"); + doTest(fileName); + } + + @TestMetadata("simple.kt") + public void testSimple() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305/nullabilityWarnings/simple.kt"); + doTest(fileName); + } + + @TestMetadata("strange.kt") + public void testStrange() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305/nullabilityWarnings/strange.kt"); + doTest(fileName); + } + + @TestMetadata("compiler/testData/foreignAnnotations/tests/jsr305/nullabilityWarnings/fromPlatformTypes") + @TestDataPath("$PROJECT_ROOT") + @RunWith(JUnit3RunnerWithInners.class) + public static class FromPlatformTypes extends AbstractJavacForeignAnnotationsTest { + public void testAllFilesPresentInFromPlatformTypes() throws Exception { + KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("compiler/testData/foreignAnnotations/tests/jsr305/nullabilityWarnings/fromPlatformTypes"), Pattern.compile("^(.+)\\.kt$"), TargetBackend.ANY, true); + } + + @TestMetadata("arithmetic.kt") + public void testArithmetic() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305/nullabilityWarnings/fromPlatformTypes/arithmetic.kt"); + doTest(fileName); + } + + @TestMetadata("array.kt") + public void testArray() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305/nullabilityWarnings/fromPlatformTypes/array.kt"); + doTest(fileName); + } + + @TestMetadata("assignToVar.kt") + public void testAssignToVar() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305/nullabilityWarnings/fromPlatformTypes/assignToVar.kt"); + doTest(fileName); + } + + @TestMetadata("conditions.kt") + public void testConditions() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305/nullabilityWarnings/fromPlatformTypes/conditions.kt"); + doTest(fileName); + } + + @TestMetadata("dataFlowInfo.kt") + public void testDataFlowInfo() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305/nullabilityWarnings/fromPlatformTypes/dataFlowInfo.kt"); + doTest(fileName); + } + + @TestMetadata("defaultParameters.kt") + public void testDefaultParameters() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305/nullabilityWarnings/fromPlatformTypes/defaultParameters.kt"); + doTest(fileName); + } + + @TestMetadata("delegatedProperties.kt") + public void testDelegatedProperties() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305/nullabilityWarnings/fromPlatformTypes/delegatedProperties.kt"); + doTest(fileName); + } + + @TestMetadata("delegation.kt") + public void testDelegation() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305/nullabilityWarnings/fromPlatformTypes/delegation.kt"); + doTest(fileName); + } + + @TestMetadata("derefenceExtension.kt") + public void testDerefenceExtension() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305/nullabilityWarnings/fromPlatformTypes/derefenceExtension.kt"); + doTest(fileName); + } + + @TestMetadata("derefenceMember.kt") + public void testDerefenceMember() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305/nullabilityWarnings/fromPlatformTypes/derefenceMember.kt"); + doTest(fileName); + } + + @TestMetadata("expectedType.kt") + public void testExpectedType() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305/nullabilityWarnings/fromPlatformTypes/expectedType.kt"); + doTest(fileName); + } + + @TestMetadata("for.kt") + public void testFor() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305/nullabilityWarnings/fromPlatformTypes/for.kt"); + doTest(fileName); + } + + @TestMetadata("functionArguments.kt") + public void testFunctionArguments() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305/nullabilityWarnings/fromPlatformTypes/functionArguments.kt"); + doTest(fileName); + } + + @TestMetadata("invoke.kt") + public void testInvoke() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305/nullabilityWarnings/fromPlatformTypes/invoke.kt"); + doTest(fileName); + } + + @TestMetadata("kt6829.kt") + public void testKt6829() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305/nullabilityWarnings/fromPlatformTypes/kt6829.kt"); + doTest(fileName); + } + + @TestMetadata("multiDeclaration.kt") + public void testMultiDeclaration() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305/nullabilityWarnings/fromPlatformTypes/multiDeclaration.kt"); + doTest(fileName); + } + + @TestMetadata("passToJava.kt") + public void testPassToJava() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305/nullabilityWarnings/fromPlatformTypes/passToJava.kt"); + doTest(fileName); + } + + @TestMetadata("primitiveArray.kt") + public void testPrimitiveArray() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305/nullabilityWarnings/fromPlatformTypes/primitiveArray.kt"); + doTest(fileName); + } + + @TestMetadata("throw.kt") + public void testThrow() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305/nullabilityWarnings/fromPlatformTypes/throw.kt"); + doTest(fileName); + } + + @TestMetadata("uselessElvisRightIsNull.kt") + public void testUselessElvisRightIsNull() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305/nullabilityWarnings/fromPlatformTypes/uselessElvisRightIsNull.kt"); + doTest(fileName); + } + } + + @TestMetadata("compiler/testData/foreignAnnotations/tests/jsr305/nullabilityWarnings/typeQualifierDefault") + @TestDataPath("$PROJECT_ROOT") + @RunWith(JUnit3RunnerWithInners.class) + public static class TypeQualifierDefault extends AbstractJavacForeignAnnotationsTest { + public void testAllFilesPresentInTypeQualifierDefault() throws Exception { + KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("compiler/testData/foreignAnnotations/tests/jsr305/nullabilityWarnings/typeQualifierDefault"), Pattern.compile("^(.+)\\.kt$"), TargetBackend.ANY, true); + } + + @TestMetadata("fieldsAreNullable.kt") + public void testFieldsAreNullable() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305/nullabilityWarnings/typeQualifierDefault/fieldsAreNullable.kt"); + doTest(fileName); + } + + @TestMetadata("nullabilityFromOverridden.kt") + public void testNullabilityFromOverridden() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305/nullabilityWarnings/typeQualifierDefault/nullabilityFromOverridden.kt"); + doTest(fileName); + } + + @TestMetadata("overridingDefaultQualifier.kt") + public void testOverridingDefaultQualifier() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305/nullabilityWarnings/typeQualifierDefault/overridingDefaultQualifier.kt"); + doTest(fileName); + } + + @TestMetadata("parametersAreNonnullByDefault.kt") + public void testParametersAreNonnullByDefault() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305/nullabilityWarnings/typeQualifierDefault/parametersAreNonnullByDefault.kt"); + doTest(fileName); + } + + @TestMetadata("parametersAreNonnullByDefaultPackage.kt") + public void testParametersAreNonnullByDefaultPackage() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305/nullabilityWarnings/typeQualifierDefault/parametersAreNonnullByDefaultPackage.kt"); + doTest(fileName); + } + + @TestMetadata("springNullable.kt") + public void testSpringNullable() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305/nullabilityWarnings/typeQualifierDefault/springNullable.kt"); + doTest(fileName); + } + + @TestMetadata("springNullablePackage.kt") + public void testSpringNullablePackage() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305/nullabilityWarnings/typeQualifierDefault/springNullablePackage.kt"); + doTest(fileName); + } + } + } + + @TestMetadata("compiler/testData/foreignAnnotations/tests/jsr305/typeQualifierDefault") @TestDataPath("$PROJECT_ROOT") @RunWith(JUnit3RunnerWithInners.class) public static class TypeQualifierDefault extends AbstractJavacForeignAnnotationsTest { public void testAllFilesPresentInTypeQualifierDefault() throws Exception { - KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("compiler/testData/foreignAnnotations/tests/jsr305NullabilityWarnings/typeQualifierDefault"), Pattern.compile("^(.+)\\.kt$"), TargetBackend.ANY, true); + KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("compiler/testData/foreignAnnotations/tests/jsr305/typeQualifierDefault"), Pattern.compile("^(.+)\\.kt$"), TargetBackend.ANY, true); } @TestMetadata("fieldsAreNullable.kt") public void testFieldsAreNullable() throws Exception { - String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305NullabilityWarnings/typeQualifierDefault/fieldsAreNullable.kt"); + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305/typeQualifierDefault/fieldsAreNullable.kt"); doTest(fileName); } @TestMetadata("nullabilityFromOverridden.kt") public void testNullabilityFromOverridden() throws Exception { - String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305NullabilityWarnings/typeQualifierDefault/nullabilityFromOverridden.kt"); + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305/typeQualifierDefault/nullabilityFromOverridden.kt"); doTest(fileName); } @TestMetadata("overridingDefaultQualifier.kt") public void testOverridingDefaultQualifier() throws Exception { - String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305NullabilityWarnings/typeQualifierDefault/overridingDefaultQualifier.kt"); + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305/typeQualifierDefault/overridingDefaultQualifier.kt"); doTest(fileName); } @TestMetadata("parametersAreNonnullByDefault.kt") public void testParametersAreNonnullByDefault() throws Exception { - String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305NullabilityWarnings/typeQualifierDefault/parametersAreNonnullByDefault.kt"); + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305/typeQualifierDefault/parametersAreNonnullByDefault.kt"); doTest(fileName); } @TestMetadata("parametersAreNonnullByDefaultPackage.kt") public void testParametersAreNonnullByDefaultPackage() throws Exception { - String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305NullabilityWarnings/typeQualifierDefault/parametersAreNonnullByDefaultPackage.kt"); + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305/typeQualifierDefault/parametersAreNonnullByDefaultPackage.kt"); doTest(fileName); } @TestMetadata("springNullable.kt") public void testSpringNullable() throws Exception { - String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305NullabilityWarnings/typeQualifierDefault/springNullable.kt"); + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305/typeQualifierDefault/springNullable.kt"); doTest(fileName); } @TestMetadata("springNullablePackage.kt") public void testSpringNullablePackage() throws Exception { - String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305NullabilityWarnings/typeQualifierDefault/springNullablePackage.kt"); + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305/typeQualifierDefault/springNullablePackage.kt"); doTest(fileName); } } } - - @TestMetadata("compiler/testData/foreignAnnotations/tests/typeQualifierDefault") - @TestDataPath("$PROJECT_ROOT") - @RunWith(JUnit3RunnerWithInners.class) - public static class TypeQualifierDefault extends AbstractJavacForeignAnnotationsTest { - public void testAllFilesPresentInTypeQualifierDefault() throws Exception { - KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("compiler/testData/foreignAnnotations/tests/typeQualifierDefault"), Pattern.compile("^(.+)\\.kt$"), TargetBackend.ANY, true); - } - - @TestMetadata("fieldsAreNullable.kt") - public void testFieldsAreNullable() throws Exception { - String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/typeQualifierDefault/fieldsAreNullable.kt"); - doTest(fileName); - } - - @TestMetadata("nullabilityFromOverridden.kt") - public void testNullabilityFromOverridden() throws Exception { - String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/typeQualifierDefault/nullabilityFromOverridden.kt"); - doTest(fileName); - } - - @TestMetadata("overridingDefaultQualifier.kt") - public void testOverridingDefaultQualifier() throws Exception { - String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/typeQualifierDefault/overridingDefaultQualifier.kt"); - doTest(fileName); - } - - @TestMetadata("parametersAreNonnullByDefault.kt") - public void testParametersAreNonnullByDefault() throws Exception { - String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/typeQualifierDefault/parametersAreNonnullByDefault.kt"); - doTest(fileName); - } - - @TestMetadata("parametersAreNonnullByDefaultPackage.kt") - public void testParametersAreNonnullByDefaultPackage() throws Exception { - String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/typeQualifierDefault/parametersAreNonnullByDefaultPackage.kt"); - doTest(fileName); - } - - @TestMetadata("springNullable.kt") - public void testSpringNullable() throws Exception { - String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/typeQualifierDefault/springNullable.kt"); - doTest(fileName); - } - - @TestMetadata("springNullablePackage.kt") - public void testSpringNullablePackage() throws Exception { - String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/typeQualifierDefault/springNullablePackage.kt"); - doTest(fileName); - } - } } From d0e912167ebf576631710a6015d58c754267bfc8 Mon Sep 17 00:00:00 2001 From: Denis Zharkov Date: Thu, 7 Sep 2017 14:04:47 +0300 Subject: [PATCH 089/212] Minor. Simplify handling nullablility for warning --- .../load/java/typeEnhancement/signatureEnhancement.kt | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/typeEnhancement/signatureEnhancement.kt b/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/typeEnhancement/signatureEnhancement.kt index 0775ba5e1b0..d57ca6473f0 100644 --- a/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/typeEnhancement/signatureEnhancement.kt +++ b/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/typeEnhancement/signatureEnhancement.kt @@ -317,7 +317,6 @@ class SignatureEnhancement(private val annotationTypeQualifierResolver: Annotati val nullabilityFromSupertypesWithWarning = fromSupertypes .mapNotNull { it.unwrapEnhancement().extractQualifiers().nullability } .toSet() - .takeIf { it != nullabilityFromSupertypes } val own = extractQualifiersFromAnnotations(isHeadTypeConstructor) val isAnyNonNullTypeParameter = own.isNotNullTypeParameter || superQualifiers.any { it.isNotNullTypeParameter } @@ -353,10 +352,10 @@ class SignatureEnhancement(private val annotationTypeQualifierResolver: Annotati val nullability = nullabilityFromSupertypes.select(NullabilityQualifier.NOT_NULL, NullabilityQualifier.NULLABLE, ownNullability) val mutability = mutabilityFromSupertypes.select(MutabilityQualifier.MUTABLE, MutabilityQualifier.READ_ONLY, own.mutability) - val canChange = ownNullabilityForWarning != ownNullability || nullabilityFromSupertypesWithWarning != null + val canChange = ownNullabilityForWarning != ownNullability || nullabilityFromSupertypesWithWarning != nullabilityFromSupertypes if (nullability == null && canChange) { - val nullabilityWithWarning = (nullabilityFromSupertypesWithWarning ?: nullabilityFromSupertypes) - .select(NullabilityQualifier.NOT_NULL, NullabilityQualifier.NULLABLE, ownNullabilityForWarning) + val nullabilityWithWarning = + nullabilityFromSupertypesWithWarning.select(NullabilityQualifier.NOT_NULL, NullabilityQualifier.NULLABLE, ownNullabilityForWarning) return createJavaTypeQualifiers(nullabilityWithWarning, mutability, true) } From 775d6988e80c64e5512e8a95344412f7fc839f9c Mon Sep 17 00:00:00 2001 From: Denis Zharkov Date: Thu, 7 Sep 2017 14:10:39 +0300 Subject: [PATCH 090/212] Preserve flexibility for Java types annotated with @NonNull(UNKNOWN) Before this chanhe, these annotations are simply ignored, but they should preserve flexibility in case of enhanced nullability obtained from enclosing default qualifier #KT-20158 Fixed --- .../typeQualifierDefault/forceFlexibility.kt | 110 ++++++++++++++++++ .../typeQualifierDefault/forceFlexibility.txt | 43 +++++++ .../forceFlexibleOverOverrides.kt | 96 +++++++++++++++ .../forceFlexibleOverOverrides.txt | 48 ++++++++ ...sNoAnnotationInClasspathTestGenerated.java | 12 ++ ...pathWithFastClassReadingTestGenerated.java | 12 ++ .../ForeignAnnotationsTestGenerated.java | 12 ++ .../JavacForeignAnnotationsTestGenerated.java | 12 ++ .../typeEnhancement/signatureEnhancement.kt | 11 +- .../java/typeEnhancement/typeQualifiers.kt | 3 +- 10 files changed, 356 insertions(+), 3 deletions(-) create mode 100644 compiler/testData/foreignAnnotations/tests/jsr305/typeQualifierDefault/forceFlexibility.kt create mode 100644 compiler/testData/foreignAnnotations/tests/jsr305/typeQualifierDefault/forceFlexibility.txt create mode 100644 compiler/testData/foreignAnnotations/tests/jsr305/typeQualifierDefault/forceFlexibleOverOverrides.kt create mode 100644 compiler/testData/foreignAnnotations/tests/jsr305/typeQualifierDefault/forceFlexibleOverOverrides.txt diff --git a/compiler/testData/foreignAnnotations/tests/jsr305/typeQualifierDefault/forceFlexibility.kt b/compiler/testData/foreignAnnotations/tests/jsr305/typeQualifierDefault/forceFlexibility.kt new file mode 100644 index 00000000000..cc35f977206 --- /dev/null +++ b/compiler/testData/foreignAnnotations/tests/jsr305/typeQualifierDefault/forceFlexibility.kt @@ -0,0 +1,110 @@ +// !DIAGNOSTICS: -UNUSED_VARIABLE -UNUSED_PARAMETER + +// FILE: spr/Nullable.java + +package spr; + +import java.lang.annotation.Documented; +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; +import javax.annotation.Nonnull; +import javax.annotation.meta.TypeQualifierNickname; +import javax.annotation.meta.When; + +@Target({ElementType.METHOD, ElementType.PARAMETER}) +@Retention(RetentionPolicy.RUNTIME) +@Documented +@Nonnull(when = When.MAYBE) +@TypeQualifierNickname +public @interface Nullable { +} + +// FILE: spr/NonNullApi.java + +package spr; + +import java.lang.annotation.Documented; +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; +import javax.annotation.Nonnull; +import javax.annotation.meta.TypeQualifierDefault; + +@Target(ElementType.TYPE) +@Retention(RetentionPolicy.RUNTIME) +@Documented +@Nonnull +@TypeQualifierDefault({ElementType.METHOD, ElementType.PARAMETER}) +public @interface NonNullApi { +} + +// FILE: spr/UnknownNullability.java +package spr; + +import javax.annotation.*; +import java.lang.annotation.Documented; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; + +import javax.annotation.meta.TypeQualifierNickname; +import javax.annotation.meta.When; + +@Documented +@TypeQualifierNickname +@Nonnull(when = When.UNKNOWN) +@Retention(RetentionPolicy.RUNTIME) +public @interface UnknownNullability { + +} + +// FILE: spr/ForceFlexibility.java + +package spr; + +import java.lang.annotation.Documented; +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; +import javax.annotation.Nonnull; +import javax.annotation.meta.TypeQualifierDefault; +import javax.annotation.meta.When; + +@Retention(RetentionPolicy.RUNTIME) +@Documented +@UnknownNullability +@TypeQualifierDefault({ElementType.METHOD, ElementType.PARAMETER}) +public @interface ForceFlexibility { +} + +// FILE: A.java + +import spr.*; + +@NonNullApi +public class A { + public String foo(String x, @Nullable CharSequence y) { + return ""; + } + + + @ForceFlexibility + public String bar(String x, @javax.annotation.Nonnull CharSequence y) { + return ""; + } +} + +// FILE: main.kt + +fun main(a: A) { + a.foo("", null)?.length + a.foo("", null).length + a.foo(null, "").length + + a.bar("", "")?.length + a.bar("", "").length + a.bar(null, null).length +} diff --git a/compiler/testData/foreignAnnotations/tests/jsr305/typeQualifierDefault/forceFlexibility.txt b/compiler/testData/foreignAnnotations/tests/jsr305/typeQualifierDefault/forceFlexibility.txt new file mode 100644 index 00000000000..7fc761c52bd --- /dev/null +++ b/compiler/testData/foreignAnnotations/tests/jsr305/typeQualifierDefault/forceFlexibility.txt @@ -0,0 +1,43 @@ +package + +public fun main(/*0*/ a: A): kotlin.Unit + +@spr.NonNullApi public open class A { + public constructor A() + @spr.ForceFlexibility public open fun bar(/*0*/ x: kotlin.String!, /*1*/ @javax.annotation.Nonnull y: kotlin.CharSequence): kotlin.String! + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open fun foo(/*0*/ x: kotlin.String, /*1*/ @spr.Nullable y: kotlin.CharSequence?): kotlin.String + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String +} + +package spr { + + @kotlin.annotation.Retention(value = AnnotationRetention.RUNTIME) @kotlin.annotation.MustBeDocumented @spr.UnknownNullability @javax.annotation.meta.TypeQualifierDefault(value = {ElementType.METHOD, ElementType.PARAMETER}) public final annotation class ForceFlexibility : kotlin.Annotation { + public constructor ForceFlexibility() + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String + } + + @kotlin.annotation.Target(allowedTargets = {AnnotationTarget.CLASS, AnnotationTarget.FILE}) @kotlin.annotation.Retention(value = AnnotationRetention.RUNTIME) @kotlin.annotation.MustBeDocumented @javax.annotation.Nonnull @javax.annotation.meta.TypeQualifierDefault(value = {ElementType.METHOD, ElementType.PARAMETER}) public final annotation class NonNullApi : kotlin.Annotation { + public constructor NonNullApi() + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String + } + + @kotlin.annotation.Target(allowedTargets = {AnnotationTarget.FUNCTION, AnnotationTarget.PROPERTY_GETTER, AnnotationTarget.PROPERTY_SETTER, AnnotationTarget.VALUE_PARAMETER}) @kotlin.annotation.Retention(value = AnnotationRetention.RUNTIME) @kotlin.annotation.MustBeDocumented @javax.annotation.Nonnull(when = When.MAYBE) @javax.annotation.meta.TypeQualifierNickname public final annotation class Nullable : kotlin.Annotation { + public constructor Nullable() + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String + } + + @kotlin.annotation.MustBeDocumented @javax.annotation.meta.TypeQualifierNickname @javax.annotation.Nonnull(when = When.UNKNOWN) @kotlin.annotation.Retention(value = AnnotationRetention.RUNTIME) public final annotation class UnknownNullability : kotlin.Annotation { + public constructor UnknownNullability() + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String + } +} diff --git a/compiler/testData/foreignAnnotations/tests/jsr305/typeQualifierDefault/forceFlexibleOverOverrides.kt b/compiler/testData/foreignAnnotations/tests/jsr305/typeQualifierDefault/forceFlexibleOverOverrides.kt new file mode 100644 index 00000000000..53f13f0eb6d --- /dev/null +++ b/compiler/testData/foreignAnnotations/tests/jsr305/typeQualifierDefault/forceFlexibleOverOverrides.kt @@ -0,0 +1,96 @@ +// !DIAGNOSTICS: -UNUSED_VARIABLE -UNUSED_PARAMETER + +// FILE: spr/NonNullApi.java + +package spr; + +import java.lang.annotation.Documented; +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; +import javax.annotation.Nonnull; +import javax.annotation.meta.TypeQualifierDefault; + +@Target(ElementType.TYPE) +@Retention(RetentionPolicy.RUNTIME) +@Documented +@Nonnull +@TypeQualifierDefault({ElementType.METHOD, ElementType.PARAMETER}) +public @interface NonNullApi { +} + +// FILE: spr/UnknownNullability.java +package spr; + +import javax.annotation.*; +import java.lang.annotation.Documented; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; + +import javax.annotation.meta.TypeQualifierNickname; +import javax.annotation.meta.When; + +@Documented +@TypeQualifierNickname +@Nonnull(when = When.UNKNOWN) +@Retention(RetentionPolicy.RUNTIME) +public @interface UnknownNullability { + +} + +// FILE: spr/ForceFlexibility.java + +package spr; + +import java.lang.annotation.Documented; +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; +import javax.annotation.Nonnull; +import javax.annotation.meta.TypeQualifierDefault; +import javax.annotation.meta.When; + +@Retention(RetentionPolicy.RUNTIME) +@Documented +@UnknownNullability +@TypeQualifierDefault({ElementType.METHOD, ElementType.PARAMETER}) +public @interface ForceFlexibility { +} + +// FILE: B.java +public interface B { + public void foo(@javax.annotation.Nonnull String x); + public void bar(@javax.annotation.Nonnull String x); + public void baz(@javax.annotation.Nonnull String x); + public void foobar(@javax.annotation.Nonnull String x); +} + +// FILE: A.java + +import spr.*; + +@NonNullApi +public class A implements B { + @ForceFlexibility + public void foo(String x) {} + public void bar(@ForceFlexibility String x) {} + public void baz(@UnknownNullability String x) {} + public void foobar(@javax.annotation.Nonnull(when = javax.annotation.meta.When.UNKNOWN) String x) {} +} + +// FILE: main.kt + +fun main(a: A, b: B) { + b.foo(null) + b.bar(null) + b.baz(null) + b.foobar(null) + + a.foo(null) + // TODO: defaults on parameters do not work properly + a.bar(null) + a.baz(null) + a.foobar(null) +} diff --git a/compiler/testData/foreignAnnotations/tests/jsr305/typeQualifierDefault/forceFlexibleOverOverrides.txt b/compiler/testData/foreignAnnotations/tests/jsr305/typeQualifierDefault/forceFlexibleOverOverrides.txt new file mode 100644 index 00000000000..5cc22b1c072 --- /dev/null +++ b/compiler/testData/foreignAnnotations/tests/jsr305/typeQualifierDefault/forceFlexibleOverOverrides.txt @@ -0,0 +1,48 @@ +package + +public fun main(/*0*/ a: A, /*1*/ b: B): kotlin.Unit + +@spr.NonNullApi public open class A : B { + public constructor A() + public open override /*1*/ fun bar(/*0*/ @spr.ForceFlexibility x: kotlin.String): kotlin.Unit + public open override /*1*/ fun baz(/*0*/ @spr.UnknownNullability x: kotlin.String!): kotlin.Unit + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + @spr.ForceFlexibility public open override /*1*/ fun foo(/*0*/ x: kotlin.String!): kotlin.Unit + public open override /*1*/ fun foobar(/*0*/ @javax.annotation.Nonnull(when = When.UNKNOWN) x: kotlin.String!): kotlin.Unit + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String +} + +public interface B { + public abstract fun bar(/*0*/ @javax.annotation.Nonnull x: kotlin.String): kotlin.Unit + public abstract fun baz(/*0*/ @javax.annotation.Nonnull x: kotlin.String): kotlin.Unit + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public abstract fun foo(/*0*/ @javax.annotation.Nonnull x: kotlin.String): kotlin.Unit + public abstract fun foobar(/*0*/ @javax.annotation.Nonnull x: kotlin.String): kotlin.Unit + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String +} + +package spr { + + @kotlin.annotation.Retention(value = AnnotationRetention.RUNTIME) @kotlin.annotation.MustBeDocumented @spr.UnknownNullability @javax.annotation.meta.TypeQualifierDefault(value = {ElementType.METHOD, ElementType.PARAMETER}) public final annotation class ForceFlexibility : kotlin.Annotation { + public constructor ForceFlexibility() + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String + } + + @kotlin.annotation.Target(allowedTargets = {AnnotationTarget.CLASS, AnnotationTarget.FILE}) @kotlin.annotation.Retention(value = AnnotationRetention.RUNTIME) @kotlin.annotation.MustBeDocumented @javax.annotation.Nonnull @javax.annotation.meta.TypeQualifierDefault(value = {ElementType.METHOD, ElementType.PARAMETER}) public final annotation class NonNullApi : kotlin.Annotation { + public constructor NonNullApi() + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String + } + + @kotlin.annotation.MustBeDocumented @javax.annotation.meta.TypeQualifierNickname @javax.annotation.Nonnull(when = When.UNKNOWN) @kotlin.annotation.Retention(value = AnnotationRetention.RUNTIME) public final annotation class UnknownNullability : kotlin.Annotation { + public constructor UnknownNullability() + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String + } +} diff --git a/compiler/tests/org/jetbrains/kotlin/checkers/ForeignAnnotationsNoAnnotationInClasspathTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/checkers/ForeignAnnotationsNoAnnotationInClasspathTestGenerated.java index e6110611027..cdbf5328d5b 100644 --- a/compiler/tests/org/jetbrains/kotlin/checkers/ForeignAnnotationsNoAnnotationInClasspathTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/checkers/ForeignAnnotationsNoAnnotationInClasspathTestGenerated.java @@ -352,6 +352,18 @@ public class ForeignAnnotationsNoAnnotationInClasspathTestGenerated extends Abst doTest(fileName); } + @TestMetadata("forceFlexibility.kt") + public void testForceFlexibility() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305/typeQualifierDefault/forceFlexibility.kt"); + doTest(fileName); + } + + @TestMetadata("forceFlexibleOverOverrides.kt") + public void testForceFlexibleOverOverrides() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305/typeQualifierDefault/forceFlexibleOverOverrides.kt"); + doTest(fileName); + } + @TestMetadata("nullabilityFromOverridden.kt") public void testNullabilityFromOverridden() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305/typeQualifierDefault/nullabilityFromOverridden.kt"); diff --git a/compiler/tests/org/jetbrains/kotlin/checkers/ForeignAnnotationsNoAnnotationInClasspathWithFastClassReadingTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/checkers/ForeignAnnotationsNoAnnotationInClasspathWithFastClassReadingTestGenerated.java index fd46ae49408..a89ea48a7ac 100644 --- a/compiler/tests/org/jetbrains/kotlin/checkers/ForeignAnnotationsNoAnnotationInClasspathWithFastClassReadingTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/checkers/ForeignAnnotationsNoAnnotationInClasspathWithFastClassReadingTestGenerated.java @@ -352,6 +352,18 @@ public class ForeignAnnotationsNoAnnotationInClasspathWithFastClassReadingTestGe doTest(fileName); } + @TestMetadata("forceFlexibility.kt") + public void testForceFlexibility() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305/typeQualifierDefault/forceFlexibility.kt"); + doTest(fileName); + } + + @TestMetadata("forceFlexibleOverOverrides.kt") + public void testForceFlexibleOverOverrides() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305/typeQualifierDefault/forceFlexibleOverOverrides.kt"); + doTest(fileName); + } + @TestMetadata("nullabilityFromOverridden.kt") public void testNullabilityFromOverridden() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305/typeQualifierDefault/nullabilityFromOverridden.kt"); diff --git a/compiler/tests/org/jetbrains/kotlin/checkers/ForeignAnnotationsTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/checkers/ForeignAnnotationsTestGenerated.java index 4633ebcc127..18b2d0630b5 100644 --- a/compiler/tests/org/jetbrains/kotlin/checkers/ForeignAnnotationsTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/checkers/ForeignAnnotationsTestGenerated.java @@ -352,6 +352,18 @@ public class ForeignAnnotationsTestGenerated extends AbstractForeignAnnotationsT doTest(fileName); } + @TestMetadata("forceFlexibility.kt") + public void testForceFlexibility() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305/typeQualifierDefault/forceFlexibility.kt"); + doTest(fileName); + } + + @TestMetadata("forceFlexibleOverOverrides.kt") + public void testForceFlexibleOverOverrides() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305/typeQualifierDefault/forceFlexibleOverOverrides.kt"); + doTest(fileName); + } + @TestMetadata("nullabilityFromOverridden.kt") public void testNullabilityFromOverridden() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305/typeQualifierDefault/nullabilityFromOverridden.kt"); diff --git a/compiler/tests/org/jetbrains/kotlin/checkers/javac/JavacForeignAnnotationsTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/checkers/javac/JavacForeignAnnotationsTestGenerated.java index b5d412f581e..ad4d2e87926 100644 --- a/compiler/tests/org/jetbrains/kotlin/checkers/javac/JavacForeignAnnotationsTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/checkers/javac/JavacForeignAnnotationsTestGenerated.java @@ -352,6 +352,18 @@ public class JavacForeignAnnotationsTestGenerated extends AbstractJavacForeignAn doTest(fileName); } + @TestMetadata("forceFlexibility.kt") + public void testForceFlexibility() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305/typeQualifierDefault/forceFlexibility.kt"); + doTest(fileName); + } + + @TestMetadata("forceFlexibleOverOverrides.kt") + public void testForceFlexibleOverOverrides() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305/typeQualifierDefault/forceFlexibleOverOverrides.kt"); + doTest(fileName); + } + @TestMetadata("nullabilityFromOverridden.kt") public void testNullabilityFromOverridden() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305/typeQualifierDefault/nullabilityFromOverridden.kt"); diff --git a/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/typeEnhancement/signatureEnhancement.kt b/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/typeEnhancement/signatureEnhancement.kt index d57ca6473f0..789ccb08e57 100644 --- a/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/typeEnhancement/signatureEnhancement.kt +++ b/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/typeEnhancement/signatureEnhancement.kt @@ -63,6 +63,7 @@ class SignatureEnhancement(private val annotationTypeQualifierResolver: Annotati return when (enumEntryDescriptor.name.asString()) { "ALWAYS" -> NullabilityQualifierWithMigrationStatus(NullabilityQualifier.NOT_NULL) "MAYBE", "NEVER" -> NullabilityQualifierWithMigrationStatus(NullabilityQualifier.NULLABLE) + "UNKNOWN" -> NullabilityQualifierWithMigrationStatus(NullabilityQualifier.FORCE_FLEXIBILITY) else -> null } } @@ -346,16 +347,22 @@ class SignatureEnhancement(private val annotationTypeQualifierResolver: Annotati return effectiveSet.singleOrNull() } + fun Set.select(own: NullabilityQualifier?) = + if (own == NullabilityQualifier.FORCE_FLEXIBILITY) + NullabilityQualifier.FORCE_FLEXIBILITY + else + select(NullabilityQualifier.NOT_NULL, NullabilityQualifier.NULLABLE, own) + val ownNullability = own.takeIf { !it.isNullabilityQualifierForWarning }?.nullability val ownNullabilityForWarning = own.nullability - val nullability = nullabilityFromSupertypes.select(NullabilityQualifier.NOT_NULL, NullabilityQualifier.NULLABLE, ownNullability) + val nullability = nullabilityFromSupertypes.select(ownNullability) val mutability = mutabilityFromSupertypes.select(MutabilityQualifier.MUTABLE, MutabilityQualifier.READ_ONLY, own.mutability) val canChange = ownNullabilityForWarning != ownNullability || nullabilityFromSupertypesWithWarning != nullabilityFromSupertypes if (nullability == null && canChange) { val nullabilityWithWarning = - nullabilityFromSupertypesWithWarning.select(NullabilityQualifier.NOT_NULL, NullabilityQualifier.NULLABLE, ownNullabilityForWarning) + nullabilityFromSupertypesWithWarning.select(ownNullabilityForWarning) return createJavaTypeQualifiers(nullabilityWithWarning, mutability, true) } diff --git a/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/typeEnhancement/typeQualifiers.kt b/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/typeEnhancement/typeQualifiers.kt index f7bc60bddc1..f4cd64abff0 100644 --- a/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/typeEnhancement/typeQualifiers.kt +++ b/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/typeEnhancement/typeQualifiers.kt @@ -18,7 +18,8 @@ package org.jetbrains.kotlin.load.java.typeEnhancement enum class NullabilityQualifier { NULLABLE, - NOT_NULL + NOT_NULL, + FORCE_FLEXIBILITY } enum class MutabilityQualifier { From bd809c872a94b38967f5e0e05283076d17edef9c Mon Sep 17 00:00:00 2001 From: Denis Zharkov Date: Thu, 7 Sep 2017 15:32:41 +0300 Subject: [PATCH 091/212] Minor. Move local functions to file and inline parameter --- .../typeEnhancement/signatureEnhancement.kt | 91 +++++++++++-------- 1 file changed, 51 insertions(+), 40 deletions(-) diff --git a/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/typeEnhancement/signatureEnhancement.kt b/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/typeEnhancement/signatureEnhancement.kt index 789ccb08e57..331cbb709f9 100644 --- a/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/typeEnhancement/signatureEnhancement.kt +++ b/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/typeEnhancement/signatureEnhancement.kt @@ -302,14 +302,14 @@ class SignatureEnhancement(private val annotationTypeQualifierResolver: Annotati val verticalSlice = indexedFromSupertypes.mapNotNull { it.getOrNull(index) } // Only the head type constructor is safely co-variant - qualifiers.computeQualifiersForOverride(verticalSlice, isCovariant && isHeadTypeConstructor, isHeadTypeConstructor) + qualifiers.computeQualifiersForOverride(verticalSlice, isHeadTypeConstructor) } return { index -> computedResult.getOrElse(index) { JavaTypeQualifiers.NONE } } } private fun KotlinType.computeQualifiersForOverride( - fromSupertypes: Collection, isCovariant: Boolean, + fromSupertypes: Collection, isHeadTypeConstructor: Boolean ): JavaTypeQualifiers { val superQualifiers = fromSupertypes.map { it.extractQualifiers() } @@ -320,55 +320,34 @@ class SignatureEnhancement(private val annotationTypeQualifierResolver: Annotati .toSet() val own = extractQualifiersFromAnnotations(isHeadTypeConstructor) - val isAnyNonNullTypeParameter = own.isNotNullTypeParameter || superQualifiers.any { it.isNotNullTypeParameter } - - fun createJavaTypeQualifiers( - nullability: NullabilityQualifier?, - mutability: MutabilityQualifier?, - forWarning: Boolean - ): JavaTypeQualifiers { - if (!isAnyNonNullTypeParameter || nullability != NullabilityQualifier.NOT_NULL) { - return JavaTypeQualifiers(nullability, mutability, false, forWarning) - } - return JavaTypeQualifiers(nullability, mutability, true, forWarning) - } - - fun Set.select(low: T, high: T, own: T?): T? { - if (isCovariant) { - val supertypeQualifier = if (low in this) low else if (high in this) high else null - return if (supertypeQualifier == low && own == high) null else own ?: supertypeQualifier - } - - // isInvariant - val effectiveSet = own?.let { (this + own).toSet() } ?: this - // if this set contains exactly one element, it is the qualifier everybody agrees upon, - // otherwise (no qualifiers, or multiple qualifiers), there's no single such qualifier - // and all qualifiers are discarded - return effectiveSet.singleOrNull() - } - - fun Set.select(own: NullabilityQualifier?) = - if (own == NullabilityQualifier.FORCE_FLEXIBILITY) - NullabilityQualifier.FORCE_FLEXIBILITY - else - select(NullabilityQualifier.NOT_NULL, NullabilityQualifier.NULLABLE, own) - val ownNullability = own.takeIf { !it.isNullabilityQualifierForWarning }?.nullability val ownNullabilityForWarning = own.nullability - val nullability = nullabilityFromSupertypes.select(ownNullability) - val mutability = mutabilityFromSupertypes.select(MutabilityQualifier.MUTABLE, MutabilityQualifier.READ_ONLY, own.mutability) + val isCovariantPosition = isCovariant && isHeadTypeConstructor + val nullability = nullabilityFromSupertypes.select(ownNullability, isCovariantPosition) + val mutability = + mutabilityFromSupertypes + .select(MutabilityQualifier.MUTABLE, MutabilityQualifier.READ_ONLY, own.mutability, isCovariantPosition) val canChange = ownNullabilityForWarning != ownNullability || nullabilityFromSupertypesWithWarning != nullabilityFromSupertypes + val isAnyNonNullTypeParameter = own.isNotNullTypeParameter || superQualifiers.any { it.isNotNullTypeParameter } if (nullability == null && canChange) { val nullabilityWithWarning = - nullabilityFromSupertypesWithWarning.select(ownNullabilityForWarning) + nullabilityFromSupertypesWithWarning.select(ownNullabilityForWarning, isCovariantPosition) - return createJavaTypeQualifiers(nullabilityWithWarning, mutability, true) + return createJavaTypeQualifiers( + nullabilityWithWarning, mutability, + forWarning = true, isAnyNonNullTypeParameter = isAnyNonNullTypeParameter + ) } - return createJavaTypeQualifiers(nullability, mutability,nullability == null) + return createJavaTypeQualifiers( + nullability, mutability, + forWarning = nullability == null, + isAnyNonNullTypeParameter = isAnyNonNullTypeParameter + ) } + } private data class PartEnhancementResult(val type: KotlinType, val wereChanges: Boolean) @@ -391,3 +370,35 @@ class SignatureEnhancement(private val annotationTypeQualifierResolver: Annotati } } + +private fun createJavaTypeQualifiers( + nullability: NullabilityQualifier?, + mutability: MutabilityQualifier?, + forWarning: Boolean, + isAnyNonNullTypeParameter: Boolean +): JavaTypeQualifiers { + if (!isAnyNonNullTypeParameter || nullability != NullabilityQualifier.NOT_NULL) { + return JavaTypeQualifiers(nullability, mutability, false, forWarning) + } + return JavaTypeQualifiers(nullability, mutability, true, forWarning) +} + +private fun Set.select(low: T, high: T, own: T?, isCovariant: Boolean): T? { + if (isCovariant) { + val supertypeQualifier = if (low in this) low else if (high in this) high else null + return if (supertypeQualifier == low && own == high) null else own ?: supertypeQualifier + } + + // isInvariant + val effectiveSet = own?.let { (this + own).toSet() } ?: this + // if this set contains exactly one element, it is the qualifier everybody agrees upon, + // otherwise (no qualifiers, or multiple qualifiers), there's no single such qualifier + // and all qualifiers are discarded + return effectiveSet.singleOrNull() +} + +private fun Set.select(own: NullabilityQualifier?, isCovariant: Boolean) = + if (own == NullabilityQualifier.FORCE_FLEXIBILITY) + NullabilityQualifier.FORCE_FLEXIBILITY + else + select(NullabilityQualifier.NOT_NULL, NullabilityQualifier.NULLABLE, own, isCovariant) From 69665e756062a149184f7bf3c2baf42def639d0f Mon Sep 17 00:00:00 2001 From: Denis Zharkov Date: Thu, 7 Sep 2017 16:02:45 +0300 Subject: [PATCH 092/212] Minor. Convert function to block body, extract val --- .../org/jetbrains/kotlin/load/java/lazy/context.kt | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/lazy/context.kt b/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/lazy/context.kt index abd15ad56ee..85f78dc7081 100644 --- a/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/lazy/context.kt +++ b/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/lazy/context.kt @@ -77,11 +77,18 @@ class JavaTypeQualifiersByElementType( ) { operator fun get( applicabilityType: AnnotationTypeQualifierResolver.QualifierApplicabilityType - ): JavaTypeQualifiers? = - ( + ): JavaTypeQualifiers? { + val nullabilityQualifierWithMigrationStatus = nullabilityQualifiers[applicabilityType] ?: nullabilityQualifiers[AnnotationTypeQualifierResolver.QualifierApplicabilityType.TYPE_USE] - )?.let { JavaTypeQualifiers(it.qualifier, null, isNotNullTypeParameter = false, isNullabilityQualifierForWarning = it.isForWarningOnly) } + ?: return null + + return JavaTypeQualifiers( + nullabilityQualifierWithMigrationStatus.qualifier, null, + isNotNullTypeParameter = false, + isNullabilityQualifierForWarning = nullabilityQualifierWithMigrationStatus.isForWarningOnly + ) + } } class LazyJavaResolverContext internal constructor( From 71f85812d64c5ea53ab889ab165718743e310dfb Mon Sep 17 00:00:00 2001 From: Denis Zharkov Date: Fri, 8 Sep 2017 15:15:55 +0300 Subject: [PATCH 093/212] Improve support for TYPE_USE default qualifiers - Apply default qualifiers to type arguments if they contain TYPE_USE in applicability list - Read TYPE_USE placed default qualifier annotations #KT-19592 Fixed #KT-20016 In Progress --- .../jsr305/defaultAnnotationAppliedToType.kt | 79 ++++++++++++ .../jsr305/defaultAnnotationAppliedToType.txt | 32 +++++ .../tests/jsr305/springNullableWithTypeUse.kt | 2 +- .../jsr305/springNullableWithTypeUse.txt | 2 +- .../tests/jsr305/typeArguments.kt | 110 +++++++++++++++++ .../tests/jsr305/typeArguments.txt | 71 +++++++++++ .../ForeignJava8AnnotationsTestGenerated.java | 12 ++ ...cForeignJava8AnnotationsTestGenerated.java | 12 ++ ...bstractJavacForeignJava8AnnotationsTest.kt | 5 +- .../kotlin/load/java/lazy/context.kt | 12 +- .../typeEnhancement/signatureEnhancement.kt | 113 +++++++++++------- 11 files changed, 402 insertions(+), 48 deletions(-) create mode 100644 compiler/testData/foreignAnnotationsJava8/tests/jsr305/defaultAnnotationAppliedToType.kt create mode 100644 compiler/testData/foreignAnnotationsJava8/tests/jsr305/defaultAnnotationAppliedToType.txt create mode 100644 compiler/testData/foreignAnnotationsJava8/tests/jsr305/typeArguments.kt create mode 100644 compiler/testData/foreignAnnotationsJava8/tests/jsr305/typeArguments.txt diff --git a/compiler/testData/foreignAnnotationsJava8/tests/jsr305/defaultAnnotationAppliedToType.kt b/compiler/testData/foreignAnnotationsJava8/tests/jsr305/defaultAnnotationAppliedToType.kt new file mode 100644 index 00000000000..c893b630359 --- /dev/null +++ b/compiler/testData/foreignAnnotationsJava8/tests/jsr305/defaultAnnotationAppliedToType.kt @@ -0,0 +1,79 @@ +// !DIAGNOSTICS: -UNUSED_VARIABLE -UNUSED_PARAMETER +// SKIP_JAVAC + +// FILE: spr/NonNullApi.java + +package spr; + +import java.lang.annotation.Documented; +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; +import javax.annotation.Nonnull; +import javax.annotation.meta.TypeQualifierDefault; + +@Target({ElementType.TYPE, ElementType.TYPE_USE}) +@Retention(RetentionPolicy.RUNTIME) +@Documented +@Nonnull +@TypeQualifierDefault({ElementType.TYPE_USE}) +public @interface NonNullApi { +} + +// FILE: spr/NullableApi.java + +package spr; + +import java.lang.annotation.Documented; +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; +import javax.annotation.Nonnull; +import javax.annotation.meta.TypeQualifierDefault; +import javax.annotation.meta.When; + +@Target({ElementType.TYPE_USE}) +@Retention(RetentionPolicy.RUNTIME) +@Documented +@Nonnull(when = When.MAYBE) +@TypeQualifierDefault({ElementType.TYPE_USE}) +public @interface NullableApi { +} + +// FILE: A.java + +import spr.*; +import java.util.*; + +@NonNullApi +public class A { + public String foo(String x) { return ""; } + public @NullableApi String bar(@NullableApi String y) { return ""; } + public @NullableApi List baz1() { return null; } + public List<@NullableApi String> baz2() { return null; } + public @NullableApi List<@NonNullApi String> baz3() { return null; } +} + +// FILE: main.kt + +fun main(a: A) { + a.foo("").length + a.foo(null)?.length + + a.bar("").length + a.bar(null)?.length + + a.baz1().get(0).length + a.baz1()!!.get(0).length + a.baz1()!!.get(0)?.length + + a.baz2().get(0).length + a.baz2()!!.get(0).length + a.baz2()!!.get(0)?.length + + a.baz3().get(0).length + a.baz3()!!.get(0).length + a.baz3()!!.get(0)?.length +} diff --git a/compiler/testData/foreignAnnotationsJava8/tests/jsr305/defaultAnnotationAppliedToType.txt b/compiler/testData/foreignAnnotationsJava8/tests/jsr305/defaultAnnotationAppliedToType.txt new file mode 100644 index 00000000000..26732bde6fe --- /dev/null +++ b/compiler/testData/foreignAnnotationsJava8/tests/jsr305/defaultAnnotationAppliedToType.txt @@ -0,0 +1,32 @@ +package + +public fun main(/*0*/ a: A): kotlin.Unit + +@spr.NonNullApi public open class A { + public constructor A() + @spr.NullableApi public open fun bar(/*0*/ @spr.NullableApi y: @spr.NullableApi kotlin.String?): @spr.NullableApi kotlin.String? + @spr.NullableApi public open fun baz1(): (@spr.NullableApi kotlin.collections.MutableList?..@spr.NullableApi kotlin.collections.List?) + public open fun baz2(): kotlin.collections.(Mutable)List<@spr.NullableApi kotlin.String?> + @spr.NullableApi public open fun baz3(): (@spr.NullableApi kotlin.collections.MutableList<@spr.NonNullApi kotlin.String>?..@spr.NullableApi kotlin.collections.List<@spr.NonNullApi kotlin.String>?) + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open fun foo(/*0*/ x: kotlin.String): kotlin.String + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String +} + +package spr { + + @kotlin.annotation.Target(allowedTargets = {AnnotationTarget.CLASS, AnnotationTarget.FILE, AnnotationTarget.TYPE}) @kotlin.annotation.Retention(value = AnnotationRetention.RUNTIME) @kotlin.annotation.MustBeDocumented @javax.annotation.Nonnull @javax.annotation.meta.TypeQualifierDefault(value = {ElementType.TYPE_USE}) public final annotation class NonNullApi : kotlin.Annotation { + public constructor NonNullApi() + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String + } + + @kotlin.annotation.Target(allowedTargets = {AnnotationTarget.TYPE}) @kotlin.annotation.Retention(value = AnnotationRetention.RUNTIME) @kotlin.annotation.MustBeDocumented @javax.annotation.Nonnull(when = When.MAYBE) @javax.annotation.meta.TypeQualifierDefault(value = {ElementType.TYPE_USE}) public final annotation class NullableApi : kotlin.Annotation { + public constructor NullableApi() + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String + } +} diff --git a/compiler/testData/foreignAnnotationsJava8/tests/jsr305/springNullableWithTypeUse.kt b/compiler/testData/foreignAnnotationsJava8/tests/jsr305/springNullableWithTypeUse.kt index c400c6ed766..152dd1d2189 100644 --- a/compiler/testData/foreignAnnotationsJava8/tests/jsr305/springNullableWithTypeUse.kt +++ b/compiler/testData/foreignAnnotationsJava8/tests/jsr305/springNullableWithTypeUse.kt @@ -78,5 +78,5 @@ fun main(a: A) { a.baz().get(0) a.baz()!!.get(0).get(0) - a.baz()!!.get(0)?.get(0) + a.baz()!!.get(0)?.get(0) } diff --git a/compiler/testData/foreignAnnotationsJava8/tests/jsr305/springNullableWithTypeUse.txt b/compiler/testData/foreignAnnotationsJava8/tests/jsr305/springNullableWithTypeUse.txt index 5dae5b01230..e81d4f28c39 100644 --- a/compiler/testData/foreignAnnotationsJava8/tests/jsr305/springNullableWithTypeUse.txt +++ b/compiler/testData/foreignAnnotationsJava8/tests/jsr305/springNullableWithTypeUse.txt @@ -6,7 +6,7 @@ public fun main(/*0*/ a: A): kotlin.Unit public constructor A() public final var field: kotlin.String public open fun bar(): kotlin.String - @spr.Nullable public open fun baz(): kotlin.collections.(Mutable)List? + @spr.Nullable public open fun baz(): kotlin.collections.(Mutable)List? public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean public open fun foo(/*0*/ x: kotlin.String, /*1*/ @spr.Nullable y: kotlin.CharSequence?): kotlin.String public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int diff --git a/compiler/testData/foreignAnnotationsJava8/tests/jsr305/typeArguments.kt b/compiler/testData/foreignAnnotationsJava8/tests/jsr305/typeArguments.kt new file mode 100644 index 00000000000..e908cf5b099 --- /dev/null +++ b/compiler/testData/foreignAnnotationsJava8/tests/jsr305/typeArguments.kt @@ -0,0 +1,110 @@ +// !DIAGNOSTICS: -UNUSED_VARIABLE -UNUSED_PARAMETER +// RENDER_PACKAGE: test + +// FILE: spr/Nullable.java + +package spr; + +import java.lang.annotation.Documented; +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; +import javax.annotation.Nonnull; +import javax.annotation.meta.TypeQualifierNickname; +import javax.annotation.meta.When; + +@Target({ElementType.TYPE_USE}) +@Retention(RetentionPolicy.RUNTIME) +@Documented +@Nonnull(when = When.MAYBE) +@TypeQualifierNickname +public @interface Nullable { +} + +// FILE: spr/NonNullApi.java + +package spr; + +import java.lang.annotation.Documented; +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; +import javax.annotation.Nonnull; +import javax.annotation.meta.TypeQualifierDefault; + +@Target(ElementType.PACKAGE) +@Retention(RetentionPolicy.RUNTIME) +@Documented +@Nonnull +@TypeQualifierDefault({ElementType.TYPE_USE}) +public @interface NonNullApi { +} + +// FILE: test/package-info.java + +@spr.NonNullApi() +package test; + +// FILE: test/L.java + +package test; + +public class L, S> { + public T t() { return null; } + public S s() { return null; } + + public void setT(@spr.Nullable T t) {} + public void setS(S s) {} +} + +// FILE: test/A.java + +package test; + +import spr.*; +import java.util.*; + +public class A { + public void foo(L, @Nullable Integer> l) {} + public void bar(L l) {} + public L, @Nullable Integer> baz1() { return null; } + public L baz2() { return null; } + public L, Integer> baz3() { return null; } +} + +// FILE: main.kt + +import test.L + +fun main(a: test.A, l: L, Int?>, l1: L, Int>) { + a.foo(l) + a.foo(l as L, Int>) + a.foo(l as L, Int?>) + + a.bar(l1) + a.bar(l1 as L, Int?>) + + a.baz1().t().containsKey("") + a.baz1().t().containsKey(null) + a.baz1().t().containsValue(1) + a.baz1().t().containsValue(null) + a.baz1().s().hashCode() + + a.baz1().setT(l.t()) + a.baz1().setT(l.t() as L, Int>) + a.baz1().setT(null) + + a.baz2().t().containsKey("") + a.baz2().t().containsKey(null) + a.baz2().t().containsValue(1) + a.baz2().t().containsValue(null) + a.baz2().s().hashCode() + + a.baz3().t().containsKey("") + a.baz3().t().containsKey(null) + a.baz3().t().containsValue(1) + a.baz3().t().containsValue(null) + a.baz3().s().hashCode() +} diff --git a/compiler/testData/foreignAnnotationsJava8/tests/jsr305/typeArguments.txt b/compiler/testData/foreignAnnotationsJava8/tests/jsr305/typeArguments.txt new file mode 100644 index 00000000000..57825cbb44e --- /dev/null +++ b/compiler/testData/foreignAnnotationsJava8/tests/jsr305/typeArguments.txt @@ -0,0 +1,71 @@ +package test + +public open class A { + public constructor A() + public open fun bar(/*0*/ l: test.L<*, kotlin.Int>): kotlin.Unit + public open fun baz1(): test.L, @spr.Nullable kotlin.Int?> + public open fun baz2(): test.L<*, kotlin.Int> + public open fun baz3(): test.L, kotlin.Int> + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open fun foo(/*0*/ l: test.L, @spr.Nullable kotlin.Int?>): kotlin.Unit + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String +} + +public open class L!, /*1*/ S : kotlin.Any!> { + public constructor L!, /*1*/ S : kotlin.Any!>() + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open fun s(): S + public open fun setS(/*0*/ s: S): kotlin.Unit + public open fun setT(/*0*/ @spr.Nullable t: @spr.Nullable T?): kotlin.Unit + public open fun t(): T + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String +} + +package + +public fun main(/*0*/ a: test.A, /*1*/ l: test.L, kotlin.Int?>, /*2*/ l1: test.L, kotlin.Int>): kotlin.Unit + +package spr { + + @kotlin.annotation.Target(allowedTargets = {}) @kotlin.annotation.Retention(value = AnnotationRetention.RUNTIME) @kotlin.annotation.MustBeDocumented @javax.annotation.Nonnull @javax.annotation.meta.TypeQualifierDefault(value = {ElementType.TYPE_USE}) public final annotation class NonNullApi : kotlin.Annotation { + public constructor NonNullApi() + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String + } + + @kotlin.annotation.Target(allowedTargets = {AnnotationTarget.TYPE}) @kotlin.annotation.Retention(value = AnnotationRetention.RUNTIME) @kotlin.annotation.MustBeDocumented @javax.annotation.Nonnull(when = When.MAYBE) @javax.annotation.meta.TypeQualifierNickname public final annotation class Nullable : kotlin.Annotation { + public constructor Nullable() + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String + } +} + +package test { + + public open class A { + public constructor A() + public open fun bar(/*0*/ l: test.L<*, kotlin.Int>): kotlin.Unit + public open fun baz1(): test.L, @spr.Nullable kotlin.Int?> + public open fun baz2(): test.L<*, kotlin.Int> + public open fun baz3(): test.L, kotlin.Int> + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open fun foo(/*0*/ l: test.L, @spr.Nullable kotlin.Int?>): kotlin.Unit + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String + } + + public open class L!, /*1*/ S : kotlin.Any!> { + public constructor L!, /*1*/ S : kotlin.Any!>() + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open fun s(): S + public open fun setS(/*0*/ s: S): kotlin.Unit + public open fun setT(/*0*/ @spr.Nullable t: @spr.Nullable T?): kotlin.Unit + public open fun t(): T + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String + } +} diff --git a/compiler/tests-java8/tests/org/jetbrains/kotlin/checkers/ForeignJava8AnnotationsTestGenerated.java b/compiler/tests-java8/tests/org/jetbrains/kotlin/checkers/ForeignJava8AnnotationsTestGenerated.java index 6743e74c660..44628460eec 100644 --- a/compiler/tests-java8/tests/org/jetbrains/kotlin/checkers/ForeignJava8AnnotationsTestGenerated.java +++ b/compiler/tests-java8/tests/org/jetbrains/kotlin/checkers/ForeignJava8AnnotationsTestGenerated.java @@ -56,11 +56,23 @@ public class ForeignJava8AnnotationsTestGenerated extends AbstractForeignJava8An KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("compiler/testData/foreignAnnotationsJava8/tests/jsr305"), Pattern.compile("^(.+)\\.kt$"), TargetBackend.ANY, true); } + @TestMetadata("defaultAnnotationAppliedToType.kt") + public void testDefaultAnnotationAppliedToType() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotationsJava8/tests/jsr305/defaultAnnotationAppliedToType.kt"); + doTest(fileName); + } + @TestMetadata("springNullableWithTypeUse.kt") public void testSpringNullableWithTypeUse() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotationsJava8/tests/jsr305/springNullableWithTypeUse.kt"); doTest(fileName); } + + @TestMetadata("typeArguments.kt") + public void testTypeArguments() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotationsJava8/tests/jsr305/typeArguments.kt"); + doTest(fileName); + } } @TestMetadata("compiler/testData/foreignAnnotationsJava8/tests/typeEnhancement") diff --git a/compiler/tests-java8/tests/org/jetbrains/kotlin/checkers/javac/JavacForeignJava8AnnotationsTestGenerated.java b/compiler/tests-java8/tests/org/jetbrains/kotlin/checkers/javac/JavacForeignJava8AnnotationsTestGenerated.java index 0d30ab36bcb..00046c3dacf 100644 --- a/compiler/tests-java8/tests/org/jetbrains/kotlin/checkers/javac/JavacForeignJava8AnnotationsTestGenerated.java +++ b/compiler/tests-java8/tests/org/jetbrains/kotlin/checkers/javac/JavacForeignJava8AnnotationsTestGenerated.java @@ -56,11 +56,23 @@ public class JavacForeignJava8AnnotationsTestGenerated extends AbstractJavacFore KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("compiler/testData/foreignAnnotationsJava8/tests/jsr305"), Pattern.compile("^(.+)\\.kt$"), TargetBackend.ANY, true); } + @TestMetadata("defaultAnnotationAppliedToType.kt") + public void testDefaultAnnotationAppliedToType() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotationsJava8/tests/jsr305/defaultAnnotationAppliedToType.kt"); + doTest(fileName); + } + @TestMetadata("springNullableWithTypeUse.kt") public void testSpringNullableWithTypeUse() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotationsJava8/tests/jsr305/springNullableWithTypeUse.kt"); doTest(fileName); } + + @TestMetadata("typeArguments.kt") + public void testTypeArguments() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotationsJava8/tests/jsr305/typeArguments.kt"); + doTest(fileName); + } } @TestMetadata("compiler/testData/foreignAnnotationsJava8/tests/typeEnhancement") diff --git a/compiler/tests/org/jetbrains/kotlin/checkers/javac/AbstractJavacForeignJava8AnnotationsTest.kt b/compiler/tests/org/jetbrains/kotlin/checkers/javac/AbstractJavacForeignJava8AnnotationsTest.kt index a4ec046a3b4..7a2180f4b48 100644 --- a/compiler/tests/org/jetbrains/kotlin/checkers/javac/AbstractJavacForeignJava8AnnotationsTest.kt +++ b/compiler/tests/org/jetbrains/kotlin/checkers/javac/AbstractJavacForeignJava8AnnotationsTest.kt @@ -18,11 +18,14 @@ package org.jetbrains.kotlin.checkers.javac import org.jetbrains.kotlin.checkers.AbstractForeignJava8AnnotationsTest import org.jetbrains.kotlin.config.JVMConfigurationKeys +import org.jetbrains.kotlin.test.InTextDirectivesUtils import java.io.File abstract class AbstractJavacForeignJava8AnnotationsTest : AbstractForeignJava8AnnotationsTest() { override fun analyzeAndCheck(testDataFile: File, files: List) { + if (files.any { file -> InTextDirectivesUtils.isDirectiveDefined(file.expectedText, "// SKIP_JAVAC") }) return + val groupedByModule = files.groupBy(TestFile::module) val allKtFiles = groupedByModule.values.flatMap { getKtFiles(it, true) } environment.registerJavac(kotlinFiles = allKtFiles) @@ -31,4 +34,4 @@ abstract class AbstractJavacForeignJava8AnnotationsTest : AbstractForeignJava8An super.analyzeAndCheck(testDataFile, files) } -} \ No newline at end of file +} diff --git a/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/lazy/context.kt b/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/lazy/context.kt index 85f78dc7081..6ee1f4778b5 100644 --- a/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/lazy/context.kt +++ b/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/lazy/context.kt @@ -76,7 +76,7 @@ class JavaTypeQualifiersByElementType( internal val nullabilityQualifiers: QualifierByApplicabilityType ) { operator fun get( - applicabilityType: AnnotationTypeQualifierResolver.QualifierApplicabilityType + applicabilityType: AnnotationTypeQualifierResolver.QualifierApplicabilityType? ): JavaTypeQualifiers? { val nullabilityQualifierWithMigrationStatus = nullabilityQualifiers[applicabilityType] @@ -204,3 +204,13 @@ fun LazyJavaResolverContext.childForClassOrPackage( containingDeclaration, typeParameterOwner, typeParametersIndexOffset, lazy(LazyThreadSafetyMode.NONE) { computeNewDefaultTypeQualifiers(containingDeclaration.annotations) } ) + +fun LazyJavaResolverContext.copyWithNewDefaultTypeQualifiers( + additionalAnnotations: Annotations +) = if (additionalAnnotations.isEmpty()) + this + else + LazyJavaResolverContext( + components, typeParameterResolver, + lazy(LazyThreadSafetyMode.NONE) { computeNewDefaultTypeQualifiers(additionalAnnotations) } + ) diff --git a/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/typeEnhancement/signatureEnhancement.kt b/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/typeEnhancement/signatureEnhancement.kt index 331cbb709f9..d7a99849b56 100644 --- a/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/typeEnhancement/signatureEnhancement.kt +++ b/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/typeEnhancement/signatureEnhancement.kt @@ -29,7 +29,7 @@ import org.jetbrains.kotlin.load.java.descriptors.JavaCallableMemberDescriptor import org.jetbrains.kotlin.load.java.descriptors.JavaMethodDescriptor import org.jetbrains.kotlin.load.java.descriptors.JavaPropertyDescriptor import org.jetbrains.kotlin.load.java.lazy.LazyJavaResolverContext -import org.jetbrains.kotlin.load.java.lazy.computeNewDefaultTypeQualifiers +import org.jetbrains.kotlin.load.java.lazy.copyWithNewDefaultTypeQualifiers import org.jetbrains.kotlin.load.java.lazy.descriptors.isJavaField import org.jetbrains.kotlin.load.kotlin.SignatureBuildingComponents import org.jetbrains.kotlin.load.kotlin.computeJvmDescriptor @@ -109,7 +109,7 @@ class SignatureEnhancement(private val annotationTypeQualifierResolver: Annotati // Fake overrides with one overridden has been enhanced before if (kind == CallableMemberDescriptor.Kind.FAKE_OVERRIDE && original.overriddenDescriptors.size == 1) return this - val outerScopeQualifiers = c.computeNewDefaultTypeQualifiers(annotations) + val memberContext = c.copyWithNewDefaultTypeQualifiers(annotations) // When loading method as an override for a property, all annotations are stick to its getter val annotationOwnerForMember = @@ -125,9 +125,8 @@ class SignatureEnhancement(private val annotationTypeQualifierResolver: Annotati annotationOwnerForMember.safeAs() ?.getUserData(JavaMethodDescriptor.ORIGINAL_VALUE_PARAMETER_FOR_EXTENSION_RECEIVER), isCovariant = false, - defaultTopLevelQualifiers = - outerScopeQualifiers - ?.get(AnnotationTypeQualifierResolver.QualifierApplicabilityType.VALUE_PARAMETER) + containerContext = memberContext, + containerApplicabilityType = AnnotationTypeQualifierResolver.QualifierApplicabilityType.VALUE_PARAMETER ) { it.extensionReceiverParameter!!.type }.enhance() else null @@ -148,9 +147,8 @@ class SignatureEnhancement(private val annotationTypeQualifierResolver: Annotati p -> parts( typeContainer = p, isCovariant = false, - defaultTopLevelQualifiers = - outerScopeQualifiers - ?.get(AnnotationTypeQualifierResolver.QualifierApplicabilityType.VALUE_PARAMETER) + containerContext = memberContext, + containerApplicabilityType = AnnotationTypeQualifierResolver.QualifierApplicabilityType.VALUE_PARAMETER ) { it.valueParameters[p.index].type } .enhance(predefinedEnhancementInfo?.parametersInfo?.getOrNull(p.index)) } @@ -158,15 +156,12 @@ class SignatureEnhancement(private val annotationTypeQualifierResolver: Annotati val returnTypeEnhancement = parts( typeContainer = annotationOwnerForMember, isCovariant = true, - defaultTopLevelQualifiers = - outerScopeQualifiers?.get( - if (this.safeAs()?.isJavaField == true) - AnnotationTypeQualifierResolver.QualifierApplicabilityType.FIELD - else - AnnotationTypeQualifierResolver.QualifierApplicabilityType.METHOD_RETURN_TYPE - ) - - + containerContext = memberContext, + containerApplicabilityType = + if (this.safeAs()?.isJavaField == true) + AnnotationTypeQualifierResolver.QualifierApplicabilityType.FIELD + else + AnnotationTypeQualifierResolver.QualifierApplicabilityType.METHOD_RETURN_TYPE ) { it.returnType!! }.enhance(predefinedEnhancementInfo?.returnTypeInfo) if ((receiverTypeEnhancement?.wereChanges ?: false) @@ -183,7 +178,8 @@ class SignatureEnhancement(private val annotationTypeQualifierResolver: Annotati private val fromOverride: KotlinType, private val fromOverridden: Collection, private val isCovariant: Boolean, - private val defaultTopLevelQualifiers: JavaTypeQualifiers? + private val containerContext: LazyJavaResolverContext, + private val containerApplicabilityType: AnnotationTypeQualifierResolver.QualifierApplicabilityType ) { fun enhance(predefined: TypeEnhancementInfo? = null): PartEnhancementResult { val qualifiers = computeIndexedQualifiersForOverride() @@ -222,7 +218,10 @@ class SignatureEnhancement(private val annotationTypeQualifierResolver: Annotati isNotNullTypeParameter = unwrap() is NotNullTypeParameter) } - private fun KotlinType.extractQualifiersFromAnnotations(isHeadTypeConstructor: Boolean): JavaTypeQualifiers { + private fun KotlinType.extractQualifiersFromAnnotations( + isHeadTypeConstructor: Boolean, + defaultQualifiersForType: JavaTypeQualifiers? + ): JavaTypeQualifiers { val composedAnnotation = if (isHeadTypeConstructor && typeContainer != null) composeAnnotations(typeContainer.annotations, annotations) @@ -234,7 +233,12 @@ class SignatureEnhancement(private val annotationTypeQualifierResolver: Annotati fun uniqueNotNull(x: T?, y: T?) = if (x == null || y == null || x == y) x ?: y else null - val defaultTypeQualifier = defaultTopLevelQualifiers?.takeIf { isHeadTypeConstructor } + val defaultTypeQualifier = + if (isHeadTypeConstructor) + containerContext.defaultTypeQualifiers?.get(containerApplicabilityType) + else + defaultQualifiersForType + val nullabilityInfo = composedAnnotation.extractNullability() ?: defaultTypeQualifier?.nullability?.let { @@ -263,24 +267,6 @@ class SignatureEnhancement(private val annotationTypeQualifierResolver: Annotati this.firstNotNullResult(this@SignatureEnhancement::extractNullability) private fun computeIndexedQualifiersForOverride(): (Int) -> JavaTypeQualifiers { - fun KotlinType.toIndexed(): List { - val list = ArrayList(1) - - fun add(type: KotlinType) { - list.add(type) - for (arg in type.arguments) { - if (arg.isStarProjection) { - list.add(arg.type) - } - else { - add(arg.type) - } - } - } - - add(this) - return list - } val indexedFromSupertypes = fromOverridden.map { it.toIndexed() } val indexedThisType = fromOverride.toIndexed() @@ -298,18 +284,49 @@ class SignatureEnhancement(private val annotationTypeQualifierResolver: Annotati val isHeadTypeConstructor = index == 0 assert(isHeadTypeConstructor || !onlyHeadTypeConstructor) { "Only head type constructors should be computed" } - val qualifiers = indexedThisType[index] - val verticalSlice = indexedFromSupertypes.mapNotNull { it.getOrNull(index) } + val (qualifiers, defaultQualifiers) = indexedThisType[index] + val verticalSlice = indexedFromSupertypes.mapNotNull { it.getOrNull(index)?.type } // Only the head type constructor is safely co-variant - qualifiers.computeQualifiersForOverride(verticalSlice, isHeadTypeConstructor) + qualifiers.computeQualifiersForOverride(verticalSlice, defaultQualifiers, isHeadTypeConstructor) } return { index -> computedResult.getOrElse(index) { JavaTypeQualifiers.NONE } } } + + private fun KotlinType.toIndexed(): List { + val list = ArrayList(1) + + fun add(type: KotlinType, ownerContext: LazyJavaResolverContext) { + val c = ownerContext.copyWithNewDefaultTypeQualifiers(type.annotations) + + list.add( + TypeAndDefaultQualifiers( + type, + c.defaultTypeQualifiers + ?.get(AnnotationTypeQualifierResolver.QualifierApplicabilityType.TYPE_USE) + ) + ) + + for (arg in type.arguments) { + if (arg.isStarProjection) { + // TODO: sort out how to handle wildcards + list.add(TypeAndDefaultQualifiers(arg.type, null)) + } + else { + add(arg.type, c) + } + } + } + + add(this, containerContext) + return list + } + private fun KotlinType.computeQualifiersForOverride( fromSupertypes: Collection, + defaultQualifiersForType: JavaTypeQualifiers?, isHeadTypeConstructor: Boolean ): JavaTypeQualifiers { val superQualifiers = fromSupertypes.map { it.extractQualifiers() } @@ -319,7 +336,7 @@ class SignatureEnhancement(private val annotationTypeQualifierResolver: Annotati .mapNotNull { it.unwrapEnhancement().extractQualifiers().nullability } .toSet() - val own = extractQualifiersFromAnnotations(isHeadTypeConstructor) + val own = extractQualifiersFromAnnotations(isHeadTypeConstructor, defaultQualifiersForType) val ownNullability = own.takeIf { !it.isNullabilityQualifierForWarning }?.nullability val ownNullabilityForWarning = own.nullability @@ -355,7 +372,8 @@ class SignatureEnhancement(private val annotationTypeQualifierResolver: Annotati private fun D.parts( typeContainer: Annotated?, isCovariant: Boolean, - defaultTopLevelQualifiers: JavaTypeQualifiers?, + containerContext: LazyJavaResolverContext, + containerApplicabilityType: AnnotationTypeQualifierResolver.QualifierApplicabilityType, collector: (CallableMemberDescriptor) -> KotlinType ): SignatureParts { return SignatureParts( @@ -365,7 +383,9 @@ class SignatureEnhancement(private val annotationTypeQualifierResolver: Annotati collector(it) }, isCovariant, - defaultTopLevelQualifiers + // recompute default type qualifiers using type annotations + containerContext.copyWithNewDefaultTypeQualifiers(collector(this).annotations), + containerApplicabilityType ) } @@ -402,3 +422,8 @@ private fun Set.select(own: NullabilityQualifier?, isCovar NullabilityQualifier.FORCE_FLEXIBILITY else select(NullabilityQualifier.NOT_NULL, NullabilityQualifier.NULLABLE, own, isCovariant) + +private data class TypeAndDefaultQualifiers( + val type: KotlinType, + val defaultQualifiers: JavaTypeQualifiers? +) From fdc6b37264d13d739241291b09ae21ef86c17e9f Mon Sep 17 00:00:00 2001 From: Denis Zharkov Date: Fri, 8 Sep 2017 15:48:07 +0300 Subject: [PATCH 094/212] Obtain default type qualifiers from value parameters too #KT-20016 In Progress --- .../forceFlexibleOverOverrides.kt | 3 +- .../forceFlexibleOverOverrides.txt | 2 +- .../overridingDefaultQualifier.kt | 4 +-- .../overridingDefaultQualifier.txt | 4 +-- .../typeEnhancement/signatureEnhancement.kt | 35 ++++++++++--------- 5 files changed, 25 insertions(+), 23 deletions(-) diff --git a/compiler/testData/foreignAnnotations/tests/jsr305/typeQualifierDefault/forceFlexibleOverOverrides.kt b/compiler/testData/foreignAnnotations/tests/jsr305/typeQualifierDefault/forceFlexibleOverOverrides.kt index 53f13f0eb6d..903343ae2b0 100644 --- a/compiler/testData/foreignAnnotations/tests/jsr305/typeQualifierDefault/forceFlexibleOverOverrides.kt +++ b/compiler/testData/foreignAnnotations/tests/jsr305/typeQualifierDefault/forceFlexibleOverOverrides.kt @@ -89,8 +89,7 @@ fun main(a: A, b: B) { b.foobar(null) a.foo(null) - // TODO: defaults on parameters do not work properly - a.bar(null) + a.bar(null) a.baz(null) a.foobar(null) } diff --git a/compiler/testData/foreignAnnotations/tests/jsr305/typeQualifierDefault/forceFlexibleOverOverrides.txt b/compiler/testData/foreignAnnotations/tests/jsr305/typeQualifierDefault/forceFlexibleOverOverrides.txt index 5cc22b1c072..063ab835574 100644 --- a/compiler/testData/foreignAnnotations/tests/jsr305/typeQualifierDefault/forceFlexibleOverOverrides.txt +++ b/compiler/testData/foreignAnnotations/tests/jsr305/typeQualifierDefault/forceFlexibleOverOverrides.txt @@ -4,7 +4,7 @@ public fun main(/*0*/ a: A, /*1*/ b: B): kotlin.Unit @spr.NonNullApi public open class A : B { public constructor A() - public open override /*1*/ fun bar(/*0*/ @spr.ForceFlexibility x: kotlin.String): kotlin.Unit + public open override /*1*/ fun bar(/*0*/ @spr.ForceFlexibility x: kotlin.String!): kotlin.Unit public open override /*1*/ fun baz(/*0*/ @spr.UnknownNullability x: kotlin.String!): kotlin.Unit public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean @spr.ForceFlexibility public open override /*1*/ fun foo(/*0*/ x: kotlin.String!): kotlin.Unit diff --git a/compiler/testData/foreignAnnotations/tests/jsr305/typeQualifierDefault/overridingDefaultQualifier.kt b/compiler/testData/foreignAnnotations/tests/jsr305/typeQualifierDefault/overridingDefaultQualifier.kt index bc428b45795..b5d805b0721 100644 --- a/compiler/testData/foreignAnnotations/tests/jsr305/typeQualifierDefault/overridingDefaultQualifier.kt +++ b/compiler/testData/foreignAnnotations/tests/jsr305/typeQualifierDefault/overridingDefaultQualifier.kt @@ -66,7 +66,7 @@ public class A { } @NullableApi - public String foobar(String x, @Nonnull CharSequence y) { + public String foobar(String x, @NonNullApi CharSequence y) { return ""; } @@ -88,7 +88,7 @@ public class A { } @NonNullApi - public String foobar(String x, @Nullable CharSequence y) { + public String foobar(String x, @NullableApi CharSequence y) { return ""; } diff --git a/compiler/testData/foreignAnnotations/tests/jsr305/typeQualifierDefault/overridingDefaultQualifier.txt b/compiler/testData/foreignAnnotations/tests/jsr305/typeQualifierDefault/overridingDefaultQualifier.txt index e6626057009..ec030f0c25f 100644 --- a/compiler/testData/foreignAnnotations/tests/jsr305/typeQualifierDefault/overridingDefaultQualifier.txt +++ b/compiler/testData/foreignAnnotations/tests/jsr305/typeQualifierDefault/overridingDefaultQualifier.txt @@ -9,7 +9,7 @@ public fun main(/*0*/ a: A, /*1*/ b: A.B, /*2*/ c: A.C): kotlin.Unit @javax.annotation.Nullable public open fun baz(): kotlin.collections.(Mutable)List? public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean public open fun foo(/*0*/ x: kotlin.String, /*1*/ @javax.annotation.CheckForNull y: kotlin.CharSequence?): kotlin.String - @NullableApi public open fun foobar(/*0*/ x: kotlin.String?, /*1*/ @javax.annotation.Nonnull y: kotlin.CharSequence): kotlin.String? + @NullableApi public open fun foobar(/*0*/ x: kotlin.String?, /*1*/ @NonNullApi y: kotlin.CharSequence): kotlin.String? public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String @@ -20,7 +20,7 @@ public fun main(/*0*/ a: A, /*1*/ b: A.B, /*2*/ c: A.C): kotlin.Unit @javax.annotation.Nullable public open fun baz(): kotlin.collections.(Mutable)List? public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean public open fun foo(/*0*/ x: kotlin.String?, /*1*/ @javax.annotation.Nonnull y: kotlin.CharSequence): kotlin.String? - @NonNullApi public open fun foobar(/*0*/ x: kotlin.String, /*1*/ @javax.annotation.Nullable y: kotlin.CharSequence?): kotlin.String + @NonNullApi public open fun foobar(/*0*/ x: kotlin.String, /*1*/ @NullableApi y: kotlin.CharSequence?): kotlin.String public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String } diff --git a/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/typeEnhancement/signatureEnhancement.kt b/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/typeEnhancement/signatureEnhancement.kt index d7a99849b56..84c15b7b4fd 100644 --- a/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/typeEnhancement/signatureEnhancement.kt +++ b/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/typeEnhancement/signatureEnhancement.kt @@ -16,10 +16,7 @@ package org.jetbrains.kotlin.load.java.typeEnhancement -import org.jetbrains.kotlin.descriptors.CallableMemberDescriptor -import org.jetbrains.kotlin.descriptors.ClassDescriptor -import org.jetbrains.kotlin.descriptors.FunctionDescriptor -import org.jetbrains.kotlin.descriptors.PropertyDescriptor +import org.jetbrains.kotlin.descriptors.* import org.jetbrains.kotlin.descriptors.annotations.Annotated import org.jetbrains.kotlin.descriptors.annotations.AnnotationDescriptor import org.jetbrains.kotlin.descriptors.annotations.Annotations @@ -120,13 +117,11 @@ class SignatureEnhancement(private val annotationTypeQualifierResolver: Annotati val receiverTypeEnhancement = if (extensionReceiverParameter != null) - parts( - typeContainer = + partsForValueParameter( + parameterDescriptor = annotationOwnerForMember.safeAs() ?.getUserData(JavaMethodDescriptor.ORIGINAL_VALUE_PARAMETER_FOR_EXTENSION_RECEIVER), - isCovariant = false, - containerContext = memberContext, - containerApplicabilityType = AnnotationTypeQualifierResolver.QualifierApplicabilityType.VALUE_PARAMETER + methodContext = memberContext ) { it.extensionReceiverParameter!!.type }.enhance() else null @@ -145,12 +140,8 @@ class SignatureEnhancement(private val annotationTypeQualifierResolver: Annotati val valueParameterEnhancements = annotationOwnerForMember.valueParameters.map { p -> - parts( - typeContainer = p, isCovariant = false, - containerContext = memberContext, - containerApplicabilityType = AnnotationTypeQualifierResolver.QualifierApplicabilityType.VALUE_PARAMETER - ) { it.valueParameters[p.index].type } - .enhance(predefinedEnhancementInfo?.parametersInfo?.getOrNull(p.index)) + partsForValueParameter(p, memberContext) { it.valueParameters[p.index].type } + .enhance(predefinedEnhancementInfo?.parametersInfo?.getOrNull(p.index)) } val returnTypeEnhancement = @@ -369,7 +360,19 @@ class SignatureEnhancement(private val annotationTypeQualifierResolver: Annotati private data class PartEnhancementResult(val type: KotlinType, val wereChanges: Boolean) - private fun D.parts( + private fun CallableMemberDescriptor.partsForValueParameter( + // TODO: investigate if it's really can be a null (check properties' with extension overrides in Java) + parameterDescriptor: ValueParameterDescriptor?, + methodContext: LazyJavaResolverContext, + collector: (CallableMemberDescriptor) -> KotlinType + ) = parts( + parameterDescriptor, false, + parameterDescriptor?.let { methodContext.copyWithNewDefaultTypeQualifiers(it.annotations) } ?: methodContext, + AnnotationTypeQualifierResolver.QualifierApplicabilityType.VALUE_PARAMETER, + collector + ) + + private fun CallableMemberDescriptor.parts( typeContainer: Annotated?, isCovariant: Boolean, containerContext: LazyJavaResolverContext, From 58a0ca61a96d18d5f63dc68e2c018a2413e5a5fd Mon Sep 17 00:00:00 2001 From: Denis Zharkov Date: Mon, 11 Sep 2017 13:10:09 +0300 Subject: [PATCH 095/212] Minor. Fix java test data to make it actually compilable --- .../tests/jsr305/springNullableWithTypeUse.kt | 2 +- .../tests/jsr305/springNullableWithTypeUse.txt | 2 +- .../typeEnhancement/returnTypeDifferentConstructor.kt | 10 +++++----- .../typeEnhancement/returnTypeOverrideInKotlin.kt | 3 ++- .../typeEnhancement/returnTypeOverrideInKotlin.txt | 2 +- .../tests/typeEnhancement/simple.kt | 2 +- 6 files changed, 11 insertions(+), 10 deletions(-) diff --git a/compiler/testData/foreignAnnotationsJava8/tests/jsr305/springNullableWithTypeUse.kt b/compiler/testData/foreignAnnotationsJava8/tests/jsr305/springNullableWithTypeUse.kt index 152dd1d2189..b6053f12fd8 100644 --- a/compiler/testData/foreignAnnotationsJava8/tests/jsr305/springNullableWithTypeUse.kt +++ b/compiler/testData/foreignAnnotationsJava8/tests/jsr305/springNullableWithTypeUse.kt @@ -33,7 +33,7 @@ import java.lang.annotation.Target; import javax.annotation.Nonnull; import javax.annotation.meta.TypeQualifierDefault; -@Target(ElementType.CLASS) +@Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) @Documented @Nonnull diff --git a/compiler/testData/foreignAnnotationsJava8/tests/jsr305/springNullableWithTypeUse.txt b/compiler/testData/foreignAnnotationsJava8/tests/jsr305/springNullableWithTypeUse.txt index e81d4f28c39..3721c8d8cdc 100644 --- a/compiler/testData/foreignAnnotationsJava8/tests/jsr305/springNullableWithTypeUse.txt +++ b/compiler/testData/foreignAnnotationsJava8/tests/jsr305/springNullableWithTypeUse.txt @@ -15,7 +15,7 @@ public fun main(/*0*/ a: A): kotlin.Unit package spr { - @kotlin.annotation.Target(allowedTargets = {}) @kotlin.annotation.Retention(value = AnnotationRetention.RUNTIME) @kotlin.annotation.MustBeDocumented @javax.annotation.Nonnull @javax.annotation.meta.TypeQualifierDefault(value = {ElementType.TYPE_USE}) public final annotation class NonNullApi : kotlin.Annotation { + @kotlin.annotation.Target(allowedTargets = {AnnotationTarget.CLASS, AnnotationTarget.FILE}) @kotlin.annotation.Retention(value = AnnotationRetention.RUNTIME) @kotlin.annotation.MustBeDocumented @javax.annotation.Nonnull @javax.annotation.meta.TypeQualifierDefault(value = {ElementType.TYPE_USE}) public final annotation class NonNullApi : kotlin.Annotation { public constructor NonNullApi() public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int diff --git a/compiler/testData/foreignAnnotationsJava8/tests/typeEnhancement/returnTypeDifferentConstructor.kt b/compiler/testData/foreignAnnotationsJava8/tests/typeEnhancement/returnTypeDifferentConstructor.kt index a590777d855..0ba8da1dd1e 100644 --- a/compiler/testData/foreignAnnotationsJava8/tests/typeEnhancement/returnTypeDifferentConstructor.kt +++ b/compiler/testData/foreignAnnotationsJava8/tests/typeEnhancement/returnTypeDifferentConstructor.kt @@ -13,26 +13,26 @@ class Outer { class B extends A { @Override - Base foo() {} + Base foo() { return null; } } class C extends A { @Override - @NonNull Base foo() {} + @NonNull Base foo() { return null; } } class D extends A { @Override - Derived foo() {} + Derived foo() { return null; } } class E extends A { @Override - @NonNull Derived foo() {} + @NonNull Derived foo() { return null; } } class F extends A { @Override - @NonNull Derived<@NonNull String> foo() {} + @NonNull Derived<@NonNull String> foo() { return null; } } } diff --git a/compiler/testData/foreignAnnotationsJava8/tests/typeEnhancement/returnTypeOverrideInKotlin.kt b/compiler/testData/foreignAnnotationsJava8/tests/typeEnhancement/returnTypeOverrideInKotlin.kt index ae567c9733d..adb2de504d5 100644 --- a/compiler/testData/foreignAnnotationsJava8/tests/typeEnhancement/returnTypeOverrideInKotlin.kt +++ b/compiler/testData/foreignAnnotationsJava8/tests/typeEnhancement/returnTypeOverrideInKotlin.kt @@ -1,3 +1,5 @@ +// FILE: Base.java +public interface Base {} // FILE: A.java import org.checkerframework.checker.nullness.qual.*; @@ -8,7 +10,6 @@ public class A { // FILE: a.kt -interface Base {} interface Derived : Base {} fun bar1(): Derived = null!! diff --git a/compiler/testData/foreignAnnotationsJava8/tests/typeEnhancement/returnTypeOverrideInKotlin.txt b/compiler/testData/foreignAnnotationsJava8/tests/typeEnhancement/returnTypeOverrideInKotlin.txt index eb9e30f2cc0..bedd264fb31 100644 --- a/compiler/testData/foreignAnnotationsJava8/tests/typeEnhancement/returnTypeOverrideInKotlin.txt +++ b/compiler/testData/foreignAnnotationsJava8/tests/typeEnhancement/returnTypeOverrideInKotlin.txt @@ -19,7 +19,7 @@ public final class B : A { public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String } -public interface Base { +public interface Base { public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String diff --git a/compiler/testData/foreignAnnotationsJava8/tests/typeEnhancement/simple.kt b/compiler/testData/foreignAnnotationsJava8/tests/typeEnhancement/simple.kt index 46bded8f1d4..4b52e7f51b2 100644 --- a/compiler/testData/foreignAnnotationsJava8/tests/typeEnhancement/simple.kt +++ b/compiler/testData/foreignAnnotationsJava8/tests/typeEnhancement/simple.kt @@ -4,5 +4,5 @@ import org.checkerframework.checker.nullness.qual.*; import java.util.*; class A { - List<@NonNull String> foo() {} + List<@NonNull String> foo() { return null; } } From fd9025a4fb4991f25ec7297ca1091b69c7543529 Mon Sep 17 00:00:00 2001 From: Denis Zharkov Date: Mon, 11 Sep 2017 13:13:18 +0300 Subject: [PATCH 096/212] Add Java8 foreign-annotations tests without jsr305.jar in the classpath Some of them are expected to fail since neither IntelliJ class reading nor our fast class reading can read annotations on type arguments --- .../tests/checkerFramework.kt | 1 + .../foreignAnnotationsJava8/tests/eclipse.kt | 1 + .../jsr305/defaultAnnotationAppliedToType.kt | 1 + ...tAnnotationAppliedToTypeForCompiledJava.kt | 70 ++++++++++ ...AnnotationAppliedToTypeForCompiledJava.txt | 30 +++++ .../tests/jsr305/typeArguments.kt | 1 + .../returnTypeOverrideInKotlin.kt | 1 + ...sNoAnnotationInClasspathTestGenerated.java | 122 ++++++++++++++++++ ...pathWithFastClassReadingTestGenerated.java | 122 ++++++++++++++++++ .../ForeignJava8AnnotationsTestGenerated.java | 6 + ...cForeignJava8AnnotationsTestGenerated.java | 6 + .../AbstractForeignJava8AnnotationsTest.kt | 31 ++++- .../kotlin/generators/tests/GenerateTests.kt | 8 ++ 13 files changed, 399 insertions(+), 1 deletion(-) create mode 100644 compiler/testData/foreignAnnotationsJava8/tests/jsr305/defaultAnnotationAppliedToTypeForCompiledJava.kt create mode 100644 compiler/testData/foreignAnnotationsJava8/tests/jsr305/defaultAnnotationAppliedToTypeForCompiledJava.txt create mode 100644 compiler/tests-java8/tests/org/jetbrains/kotlin/checkers/ForeignJava8AnnotationsNoAnnotationInClasspathTestGenerated.java create mode 100644 compiler/tests-java8/tests/org/jetbrains/kotlin/checkers/ForeignJava8AnnotationsNoAnnotationInClasspathWithFastClassReadingTestGenerated.java diff --git a/compiler/testData/foreignAnnotationsJava8/tests/checkerFramework.kt b/compiler/testData/foreignAnnotationsJava8/tests/checkerFramework.kt index c4d52161313..7c3d2276550 100644 --- a/compiler/testData/foreignAnnotationsJava8/tests/checkerFramework.kt +++ b/compiler/testData/foreignAnnotationsJava8/tests/checkerFramework.kt @@ -1,4 +1,5 @@ // !DIAGNOSTICS: -UNUSED_VARIABLE -UNUSED_PARAMETER +// SKIP_COMPILED_JAVA // FILE: A.java import org.checkerframework.checker.nullness.qual.*; diff --git a/compiler/testData/foreignAnnotationsJava8/tests/eclipse.kt b/compiler/testData/foreignAnnotationsJava8/tests/eclipse.kt index 86c6c7bae33..400ea2b2db7 100644 --- a/compiler/testData/foreignAnnotationsJava8/tests/eclipse.kt +++ b/compiler/testData/foreignAnnotationsJava8/tests/eclipse.kt @@ -1,4 +1,5 @@ // !DIAGNOSTICS: -UNUSED_VARIABLE -UNUSED_PARAMETER +// SKIP_COMPILED_JAVA // FILE: A.java import org.eclipse.jdt.annotation.*; diff --git a/compiler/testData/foreignAnnotationsJava8/tests/jsr305/defaultAnnotationAppliedToType.kt b/compiler/testData/foreignAnnotationsJava8/tests/jsr305/defaultAnnotationAppliedToType.kt index c893b630359..6dab460b47e 100644 --- a/compiler/testData/foreignAnnotationsJava8/tests/jsr305/defaultAnnotationAppliedToType.kt +++ b/compiler/testData/foreignAnnotationsJava8/tests/jsr305/defaultAnnotationAppliedToType.kt @@ -1,5 +1,6 @@ // !DIAGNOSTICS: -UNUSED_VARIABLE -UNUSED_PARAMETER // SKIP_JAVAC +// SKIP_COMPILED_JAVA // FILE: spr/NonNullApi.java diff --git a/compiler/testData/foreignAnnotationsJava8/tests/jsr305/defaultAnnotationAppliedToTypeForCompiledJava.kt b/compiler/testData/foreignAnnotationsJava8/tests/jsr305/defaultAnnotationAppliedToTypeForCompiledJava.kt new file mode 100644 index 00000000000..f42f4703406 --- /dev/null +++ b/compiler/testData/foreignAnnotationsJava8/tests/jsr305/defaultAnnotationAppliedToTypeForCompiledJava.kt @@ -0,0 +1,70 @@ +// !DIAGNOSTICS: -UNUSED_VARIABLE -UNUSED_PARAMETER +// SKIP_JAVAC +// SKIP_COMPILED_JAVA + +// FILE: spr/NonNullApi.java + +package spr; + +import java.lang.annotation.Documented; +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; +import javax.annotation.Nonnull; +import javax.annotation.meta.TypeQualifierDefault; + +@Target({ElementType.TYPE_USE}) +@Retention(RetentionPolicy.RUNTIME) +@Documented +@Nonnull +@TypeQualifierDefault({ElementType.TYPE_USE}) +public @interface NonNullApi { +} + +// FILE: spr/NullableApi.java + +package spr; + +import java.lang.annotation.Documented; +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; +import javax.annotation.Nonnull; +import javax.annotation.meta.TypeQualifierDefault; +import javax.annotation.meta.When; + +@Target({ElementType.TYPE, ElementType.TYPE_USE}) +@Retention(RetentionPolicy.RUNTIME) +@Documented +@Nonnull(when = When.MAYBE) +@TypeQualifierDefault({ElementType.TYPE_USE}) +public @interface NullableApi { +} + +// FILE: A.java + +import spr.*; +import java.util.*; + +@NonNullApi +public class A { + public String foo(String x) { return ""; } + public @NullableApi String bar(@NullableApi String y) { return ""; } + public @NullableApi List baz1() { return null; } +} + +// FILE: main.kt + +fun main(a: A) { + a.foo("").length + a.foo(null)?.length + + a.bar("").length + a.bar(null)?.length + + a.baz1().get(0).length + a.baz1()!!.get(0).length + a.baz1()!!.get(0)?.length +} diff --git a/compiler/testData/foreignAnnotationsJava8/tests/jsr305/defaultAnnotationAppliedToTypeForCompiledJava.txt b/compiler/testData/foreignAnnotationsJava8/tests/jsr305/defaultAnnotationAppliedToTypeForCompiledJava.txt new file mode 100644 index 00000000000..464ab11573e --- /dev/null +++ b/compiler/testData/foreignAnnotationsJava8/tests/jsr305/defaultAnnotationAppliedToTypeForCompiledJava.txt @@ -0,0 +1,30 @@ +package + +public fun main(/*0*/ a: A): kotlin.Unit + +@spr.NonNullApi public open class A { + public constructor A() + @spr.NullableApi public open fun bar(/*0*/ @spr.NullableApi y: @spr.NullableApi kotlin.String?): @spr.NullableApi kotlin.String? + @spr.NullableApi public open fun baz1(): (@spr.NullableApi kotlin.collections.MutableList?..@spr.NullableApi kotlin.collections.List?) + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open fun foo(/*0*/ x: kotlin.String): kotlin.String + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String +} + +package spr { + + @kotlin.annotation.Target(allowedTargets = {AnnotationTarget.TYPE}) @kotlin.annotation.Retention(value = AnnotationRetention.RUNTIME) @kotlin.annotation.MustBeDocumented @javax.annotation.Nonnull @javax.annotation.meta.TypeQualifierDefault(value = {ElementType.TYPE_USE}) public final annotation class NonNullApi : kotlin.Annotation { + public constructor NonNullApi() + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String + } + + @kotlin.annotation.Target(allowedTargets = {AnnotationTarget.CLASS, AnnotationTarget.FILE, AnnotationTarget.TYPE}) @kotlin.annotation.Retention(value = AnnotationRetention.RUNTIME) @kotlin.annotation.MustBeDocumented @javax.annotation.Nonnull(when = When.MAYBE) @javax.annotation.meta.TypeQualifierDefault(value = {ElementType.TYPE_USE}) public final annotation class NullableApi : kotlin.Annotation { + public constructor NullableApi() + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String + } +} diff --git a/compiler/testData/foreignAnnotationsJava8/tests/jsr305/typeArguments.kt b/compiler/testData/foreignAnnotationsJava8/tests/jsr305/typeArguments.kt index e908cf5b099..16c24caa4fb 100644 --- a/compiler/testData/foreignAnnotationsJava8/tests/jsr305/typeArguments.kt +++ b/compiler/testData/foreignAnnotationsJava8/tests/jsr305/typeArguments.kt @@ -1,5 +1,6 @@ // !DIAGNOSTICS: -UNUSED_VARIABLE -UNUSED_PARAMETER // RENDER_PACKAGE: test +// SKIP_COMPILED_JAVA // FILE: spr/Nullable.java diff --git a/compiler/testData/foreignAnnotationsJava8/tests/typeEnhancement/returnTypeOverrideInKotlin.kt b/compiler/testData/foreignAnnotationsJava8/tests/typeEnhancement/returnTypeOverrideInKotlin.kt index adb2de504d5..f9b0196f55b 100644 --- a/compiler/testData/foreignAnnotationsJava8/tests/typeEnhancement/returnTypeOverrideInKotlin.kt +++ b/compiler/testData/foreignAnnotationsJava8/tests/typeEnhancement/returnTypeOverrideInKotlin.kt @@ -1,3 +1,4 @@ +// SKIP_COMPILED_JAVA // FILE: Base.java public interface Base {} // FILE: A.java diff --git a/compiler/tests-java8/tests/org/jetbrains/kotlin/checkers/ForeignJava8AnnotationsNoAnnotationInClasspathTestGenerated.java b/compiler/tests-java8/tests/org/jetbrains/kotlin/checkers/ForeignJava8AnnotationsNoAnnotationInClasspathTestGenerated.java new file mode 100644 index 00000000000..9e2d1b7cc9e --- /dev/null +++ b/compiler/tests-java8/tests/org/jetbrains/kotlin/checkers/ForeignJava8AnnotationsNoAnnotationInClasspathTestGenerated.java @@ -0,0 +1,122 @@ +/* + * Copyright 2010-2017 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.checkers; + +import com.intellij.testFramework.TestDataPath; +import org.jetbrains.kotlin.test.JUnit3RunnerWithInners; +import org.jetbrains.kotlin.test.KotlinTestUtils; +import org.jetbrains.kotlin.test.TargetBackend; +import org.jetbrains.kotlin.test.TestMetadata; +import org.junit.runner.RunWith; + +import java.io.File; +import java.util.regex.Pattern; + +/** This class is generated by {@link org.jetbrains.kotlin.generators.tests.TestsPackage}. DO NOT MODIFY MANUALLY */ +@SuppressWarnings("all") +@TestMetadata("compiler/testData/foreignAnnotationsJava8/tests") +@TestDataPath("$PROJECT_ROOT") +@RunWith(JUnit3RunnerWithInners.class) +public class ForeignJava8AnnotationsNoAnnotationInClasspathTestGenerated extends AbstractForeignJava8AnnotationsNoAnnotationInClasspathTest { + public void testAllFilesPresentInTests() throws Exception { + KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("compiler/testData/foreignAnnotationsJava8/tests"), Pattern.compile("^(.+)\\.kt$"), TargetBackend.ANY, true); + } + + @TestMetadata("checkerFramework.kt") + public void testCheckerFramework() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotationsJava8/tests/checkerFramework.kt"); + doTest(fileName); + } + + @TestMetadata("eclipse.kt") + public void testEclipse() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotationsJava8/tests/eclipse.kt"); + doTest(fileName); + } + + @TestMetadata("compiler/testData/foreignAnnotationsJava8/tests/jsr305") + @TestDataPath("$PROJECT_ROOT") + @RunWith(JUnit3RunnerWithInners.class) + public static class Jsr305 extends AbstractForeignJava8AnnotationsNoAnnotationInClasspathTest { + public void testAllFilesPresentInJsr305() throws Exception { + KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("compiler/testData/foreignAnnotationsJava8/tests/jsr305"), Pattern.compile("^(.+)\\.kt$"), TargetBackend.ANY, true); + } + + @TestMetadata("defaultAnnotationAppliedToType.kt") + public void testDefaultAnnotationAppliedToType() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotationsJava8/tests/jsr305/defaultAnnotationAppliedToType.kt"); + doTest(fileName); + } + + @TestMetadata("defaultAnnotationAppliedToTypeForCompiledJava.kt") + public void testDefaultAnnotationAppliedToTypeForCompiledJava() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotationsJava8/tests/jsr305/defaultAnnotationAppliedToTypeForCompiledJava.kt"); + doTest(fileName); + } + + @TestMetadata("springNullableWithTypeUse.kt") + public void testSpringNullableWithTypeUse() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotationsJava8/tests/jsr305/springNullableWithTypeUse.kt"); + doTest(fileName); + } + + @TestMetadata("typeArguments.kt") + public void testTypeArguments() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotationsJava8/tests/jsr305/typeArguments.kt"); + doTest(fileName); + } + } + + @TestMetadata("compiler/testData/foreignAnnotationsJava8/tests/typeEnhancement") + @TestDataPath("$PROJECT_ROOT") + @RunWith(JUnit3RunnerWithInners.class) + public static class TypeEnhancement extends AbstractForeignJava8AnnotationsNoAnnotationInClasspathTest { + public void testAllFilesPresentInTypeEnhancement() throws Exception { + KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("compiler/testData/foreignAnnotationsJava8/tests/typeEnhancement"), Pattern.compile("^(.+)\\.kt$"), TargetBackend.ANY, true); + } + + @TestMetadata("annotatedTypeArguments.kt") + public void testAnnotatedTypeArguments() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotationsJava8/tests/typeEnhancement/annotatedTypeArguments.kt"); + doTest(fileName); + } + + @TestMetadata("methodWithTypeParameter.kt") + public void testMethodWithTypeParameter() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotationsJava8/tests/typeEnhancement/methodWithTypeParameter.kt"); + doTest(fileName); + } + + @TestMetadata("returnTypeDifferentConstructor.kt") + public void testReturnTypeDifferentConstructor() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotationsJava8/tests/typeEnhancement/returnTypeDifferentConstructor.kt"); + doTest(fileName); + } + + @TestMetadata("returnTypeOverrideInKotlin.kt") + public void testReturnTypeOverrideInKotlin() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotationsJava8/tests/typeEnhancement/returnTypeOverrideInKotlin.kt"); + doTest(fileName); + } + + @TestMetadata("simple.kt") + public void testSimple() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotationsJava8/tests/typeEnhancement/simple.kt"); + doTest(fileName); + } + } +} diff --git a/compiler/tests-java8/tests/org/jetbrains/kotlin/checkers/ForeignJava8AnnotationsNoAnnotationInClasspathWithFastClassReadingTestGenerated.java b/compiler/tests-java8/tests/org/jetbrains/kotlin/checkers/ForeignJava8AnnotationsNoAnnotationInClasspathWithFastClassReadingTestGenerated.java new file mode 100644 index 00000000000..55cfc358e17 --- /dev/null +++ b/compiler/tests-java8/tests/org/jetbrains/kotlin/checkers/ForeignJava8AnnotationsNoAnnotationInClasspathWithFastClassReadingTestGenerated.java @@ -0,0 +1,122 @@ +/* + * Copyright 2010-2017 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.checkers; + +import com.intellij.testFramework.TestDataPath; +import org.jetbrains.kotlin.test.JUnit3RunnerWithInners; +import org.jetbrains.kotlin.test.KotlinTestUtils; +import org.jetbrains.kotlin.test.TargetBackend; +import org.jetbrains.kotlin.test.TestMetadata; +import org.junit.runner.RunWith; + +import java.io.File; +import java.util.regex.Pattern; + +/** This class is generated by {@link org.jetbrains.kotlin.generators.tests.TestsPackage}. DO NOT MODIFY MANUALLY */ +@SuppressWarnings("all") +@TestMetadata("compiler/testData/foreignAnnotationsJava8/tests") +@TestDataPath("$PROJECT_ROOT") +@RunWith(JUnit3RunnerWithInners.class) +public class ForeignJava8AnnotationsNoAnnotationInClasspathWithFastClassReadingTestGenerated extends AbstractForeignJava8AnnotationsNoAnnotationInClasspathWithFastClassReadingTest { + public void testAllFilesPresentInTests() throws Exception { + KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("compiler/testData/foreignAnnotationsJava8/tests"), Pattern.compile("^(.+)\\.kt$"), TargetBackend.ANY, true); + } + + @TestMetadata("checkerFramework.kt") + public void testCheckerFramework() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotationsJava8/tests/checkerFramework.kt"); + doTest(fileName); + } + + @TestMetadata("eclipse.kt") + public void testEclipse() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotationsJava8/tests/eclipse.kt"); + doTest(fileName); + } + + @TestMetadata("compiler/testData/foreignAnnotationsJava8/tests/jsr305") + @TestDataPath("$PROJECT_ROOT") + @RunWith(JUnit3RunnerWithInners.class) + public static class Jsr305 extends AbstractForeignJava8AnnotationsNoAnnotationInClasspathWithFastClassReadingTest { + public void testAllFilesPresentInJsr305() throws Exception { + KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("compiler/testData/foreignAnnotationsJava8/tests/jsr305"), Pattern.compile("^(.+)\\.kt$"), TargetBackend.ANY, true); + } + + @TestMetadata("defaultAnnotationAppliedToType.kt") + public void testDefaultAnnotationAppliedToType() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotationsJava8/tests/jsr305/defaultAnnotationAppliedToType.kt"); + doTest(fileName); + } + + @TestMetadata("defaultAnnotationAppliedToTypeForCompiledJava.kt") + public void testDefaultAnnotationAppliedToTypeForCompiledJava() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotationsJava8/tests/jsr305/defaultAnnotationAppliedToTypeForCompiledJava.kt"); + doTest(fileName); + } + + @TestMetadata("springNullableWithTypeUse.kt") + public void testSpringNullableWithTypeUse() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotationsJava8/tests/jsr305/springNullableWithTypeUse.kt"); + doTest(fileName); + } + + @TestMetadata("typeArguments.kt") + public void testTypeArguments() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotationsJava8/tests/jsr305/typeArguments.kt"); + doTest(fileName); + } + } + + @TestMetadata("compiler/testData/foreignAnnotationsJava8/tests/typeEnhancement") + @TestDataPath("$PROJECT_ROOT") + @RunWith(JUnit3RunnerWithInners.class) + public static class TypeEnhancement extends AbstractForeignJava8AnnotationsNoAnnotationInClasspathWithFastClassReadingTest { + public void testAllFilesPresentInTypeEnhancement() throws Exception { + KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("compiler/testData/foreignAnnotationsJava8/tests/typeEnhancement"), Pattern.compile("^(.+)\\.kt$"), TargetBackend.ANY, true); + } + + @TestMetadata("annotatedTypeArguments.kt") + public void testAnnotatedTypeArguments() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotationsJava8/tests/typeEnhancement/annotatedTypeArguments.kt"); + doTest(fileName); + } + + @TestMetadata("methodWithTypeParameter.kt") + public void testMethodWithTypeParameter() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotationsJava8/tests/typeEnhancement/methodWithTypeParameter.kt"); + doTest(fileName); + } + + @TestMetadata("returnTypeDifferentConstructor.kt") + public void testReturnTypeDifferentConstructor() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotationsJava8/tests/typeEnhancement/returnTypeDifferentConstructor.kt"); + doTest(fileName); + } + + @TestMetadata("returnTypeOverrideInKotlin.kt") + public void testReturnTypeOverrideInKotlin() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotationsJava8/tests/typeEnhancement/returnTypeOverrideInKotlin.kt"); + doTest(fileName); + } + + @TestMetadata("simple.kt") + public void testSimple() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotationsJava8/tests/typeEnhancement/simple.kt"); + doTest(fileName); + } + } +} diff --git a/compiler/tests-java8/tests/org/jetbrains/kotlin/checkers/ForeignJava8AnnotationsTestGenerated.java b/compiler/tests-java8/tests/org/jetbrains/kotlin/checkers/ForeignJava8AnnotationsTestGenerated.java index 44628460eec..be60ddb5e36 100644 --- a/compiler/tests-java8/tests/org/jetbrains/kotlin/checkers/ForeignJava8AnnotationsTestGenerated.java +++ b/compiler/tests-java8/tests/org/jetbrains/kotlin/checkers/ForeignJava8AnnotationsTestGenerated.java @@ -62,6 +62,12 @@ public class ForeignJava8AnnotationsTestGenerated extends AbstractForeignJava8An doTest(fileName); } + @TestMetadata("defaultAnnotationAppliedToTypeForCompiledJava.kt") + public void testDefaultAnnotationAppliedToTypeForCompiledJava() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotationsJava8/tests/jsr305/defaultAnnotationAppliedToTypeForCompiledJava.kt"); + doTest(fileName); + } + @TestMetadata("springNullableWithTypeUse.kt") public void testSpringNullableWithTypeUse() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotationsJava8/tests/jsr305/springNullableWithTypeUse.kt"); diff --git a/compiler/tests-java8/tests/org/jetbrains/kotlin/checkers/javac/JavacForeignJava8AnnotationsTestGenerated.java b/compiler/tests-java8/tests/org/jetbrains/kotlin/checkers/javac/JavacForeignJava8AnnotationsTestGenerated.java index 00046c3dacf..b54e4241237 100644 --- a/compiler/tests-java8/tests/org/jetbrains/kotlin/checkers/javac/JavacForeignJava8AnnotationsTestGenerated.java +++ b/compiler/tests-java8/tests/org/jetbrains/kotlin/checkers/javac/JavacForeignJava8AnnotationsTestGenerated.java @@ -62,6 +62,12 @@ public class JavacForeignJava8AnnotationsTestGenerated extends AbstractJavacFore doTest(fileName); } + @TestMetadata("defaultAnnotationAppliedToTypeForCompiledJava.kt") + public void testDefaultAnnotationAppliedToTypeForCompiledJava() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotationsJava8/tests/jsr305/defaultAnnotationAppliedToTypeForCompiledJava.kt"); + doTest(fileName); + } + @TestMetadata("springNullableWithTypeUse.kt") public void testSpringNullableWithTypeUse() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotationsJava8/tests/jsr305/springNullableWithTypeUse.kt"); diff --git a/compiler/tests/org/jetbrains/kotlin/checkers/AbstractForeignJava8AnnotationsTest.kt b/compiler/tests/org/jetbrains/kotlin/checkers/AbstractForeignJava8AnnotationsTest.kt index 8556fbc5059..edc620bf577 100644 --- a/compiler/tests/org/jetbrains/kotlin/checkers/AbstractForeignJava8AnnotationsTest.kt +++ b/compiler/tests/org/jetbrains/kotlin/checkers/AbstractForeignJava8AnnotationsTest.kt @@ -16,7 +16,36 @@ package org.jetbrains.kotlin.checkers +import org.jetbrains.kotlin.test.InTextDirectivesUtils +import java.io.File + abstract class AbstractForeignJava8AnnotationsTest : AbstractForeignAnnotationsTest() { override val annotationsPath: String - get() = "third-party/jdk8-annotations" + get() = JAVA8_ANNOTATION_SOURCES_PATH } + +abstract class AbstractForeignJava8AnnotationsNoAnnotationInClasspathTest : AbstractForeignAnnotationsNoAnnotationInClasspathTest() { + override val annotationsPath: String + get() = JAVA8_ANNOTATION_SOURCES_PATH + + override fun analyzeAndCheck(testDataFile: File, files: List) { + if (skipForCompiledVersion(files)) return + super.analyzeAndCheck(testDataFile, files) + } +} + +abstract class AbstractForeignJava8AnnotationsNoAnnotationInClasspathWithFastClassReadingTest : AbstractForeignAnnotationsNoAnnotationInClasspathWithFastClassReadingTest() { + override val annotationsPath: String + get() = JAVA8_ANNOTATION_SOURCES_PATH + + override fun analyzeAndCheck(testDataFile: File, files: List) { + if (skipForCompiledVersion(files)) return + super.analyzeAndCheck(testDataFile, files) + } +} + +private fun skipForCompiledVersion(files: List) = + files.any { file -> InTextDirectivesUtils.isDirectiveDefined(file.expectedText, "// SKIP_COMPILED_JAVA") } + + +private const val JAVA8_ANNOTATION_SOURCES_PATH = "third-party/jdk8-annotations" diff --git a/generators/src/org/jetbrains/kotlin/generators/tests/GenerateTests.kt b/generators/src/org/jetbrains/kotlin/generators/tests/GenerateTests.kt index 1790e86d898..c8ddc452674 100755 --- a/generators/src/org/jetbrains/kotlin/generators/tests/GenerateTests.kt +++ b/generators/src/org/jetbrains/kotlin/generators/tests/GenerateTests.kt @@ -517,6 +517,14 @@ fun main(args: Array) { model("foreignAnnotationsJava8/tests") } + testClass { + model("foreignAnnotationsJava8/tests") + } + + testClass { + model("foreignAnnotationsJava8/tests") + } + testClass { model("loadJava8/compiledJava", extension = "java", testMethod = "doTestCompiledJava") model("loadJava8/sourceJava", extension = "java", testMethod = "doTestSourceJava") From 08f3dbce67a95e408cdfaa42fc9ec7e70029a2fc Mon Sep 17 00:00:00 2001 From: Denis Zharkov Date: Mon, 11 Sep 2017 10:51:31 +0300 Subject: [PATCH 097/212] Fix configuration for FastClassReading foreign-annotations tests Prior to this change USE_FAST_CLASS_FILES_READING actually has not worked because the flag is being read in the KotlinCoreEnvironment constructor :man_facepalming: --- .../kotlin/checkers/KotlinMultiFileTestWithJava.java | 11 +++-------- ...NoAnnotationInClasspathWithFastClassReadingTest.kt | 8 ++++---- 2 files changed, 7 insertions(+), 12 deletions(-) diff --git a/compiler/tests-common/org/jetbrains/kotlin/checkers/KotlinMultiFileTestWithJava.java b/compiler/tests-common/org/jetbrains/kotlin/checkers/KotlinMultiFileTestWithJava.java index 895270b059d..c6836bb44af 100644 --- a/compiler/tests-common/org/jetbrains/kotlin/checkers/KotlinMultiFileTestWithJava.java +++ b/compiler/tests-common/org/jetbrains/kotlin/checkers/KotlinMultiFileTestWithJava.java @@ -86,20 +86,15 @@ public abstract class KotlinMultiFileTestWithJava extends KtUsefulTestCase ContentRootsKt.addKotlinSourceRoot(configuration, kotlinSourceRoot.getPath()); } - KotlinCoreEnvironment environment = - KotlinCoreEnvironment.createForTests(getTestRootDisposable(), configuration, getEnvironmentConfigFiles()); - performCustomConfiguration( - environment - ); - - return environment; + performCustomConfiguration(configuration); + return KotlinCoreEnvironment.createForTests(getTestRootDisposable(), configuration, getEnvironmentConfigFiles()); } protected boolean isJavaSourceRootNeeded() { return true; } - protected void performCustomConfiguration(@NotNull KotlinCoreEnvironment environment) { + protected void performCustomConfiguration(@NotNull CompilerConfiguration configuration) { } diff --git a/compiler/tests/org/jetbrains/kotlin/checkers/AbstractForeignAnnotationsNoAnnotationInClasspathWithFastClassReadingTest.kt b/compiler/tests/org/jetbrains/kotlin/checkers/AbstractForeignAnnotationsNoAnnotationInClasspathWithFastClassReadingTest.kt index 8a5bef70263..475529e2a9b 100644 --- a/compiler/tests/org/jetbrains/kotlin/checkers/AbstractForeignAnnotationsNoAnnotationInClasspathWithFastClassReadingTest.kt +++ b/compiler/tests/org/jetbrains/kotlin/checkers/AbstractForeignAnnotationsNoAnnotationInClasspathWithFastClassReadingTest.kt @@ -16,12 +16,12 @@ package org.jetbrains.kotlin.checkers -import org.jetbrains.kotlin.cli.jvm.compiler.KotlinCoreEnvironment +import org.jetbrains.kotlin.config.CompilerConfiguration import org.jetbrains.kotlin.config.JVMConfigurationKeys abstract class AbstractForeignAnnotationsNoAnnotationInClasspathWithFastClassReadingTest : AbstractForeignAnnotationsNoAnnotationInClasspathTest() { - override fun performCustomConfiguration(environment: KotlinCoreEnvironment) { - super.performCustomConfiguration(environment) - environment.configuration.put(JVMConfigurationKeys.USE_FAST_CLASS_FILES_READING, true) + override fun performCustomConfiguration(configuration: CompilerConfiguration) { + super.performCustomConfiguration(configuration) + configuration.put(JVMConfigurationKeys.USE_FAST_CLASS_FILES_READING, true) } } From d6ee77424345cb1da4c9e9b02343d016600c04bc Mon Sep 17 00:00:00 2001 From: Denis Zharkov Date: Mon, 11 Sep 2017 13:15:24 +0300 Subject: [PATCH 098/212] Load some of the TYPE_USE annotations in fast class reading mode Only top-level types on fields, methods' return types and value parameters are supported to catch-up how class-files are loaded in IntelliJ (see IDEA-153093) NB: this commit also affects ForeignJava8AnnotationsNoAnnotationInClasspathWithFastClassReadingTestGenerated that were failing before #KT-20016 Fixed --- .../structure/impl/classFiles/Annotations.kt | 39 +++++++++++- .../impl/classFiles/BinaryJavaClass.kt | 6 ++ .../java/structure/impl/classFiles/Types.kt | 16 ++++- .../InnerClassTypeAnnotation.fast.txt | 14 +++++ .../InnerClassTypeAnnotation.java | 2 + .../InnerClassTypeAnnotation.javac.txt | 1 + .../compiledJava/InnerClassTypeAnnotation.txt | 1 + ...stractLoadJava8WithFastClassReadingTest.kt | 23 +++++++ ...ava8WithFastClassReadingTestGenerated.java | 62 +++++++++++++++++++ .../kotlin/generators/tests/GenerateTests.kt | 4 ++ 10 files changed, 162 insertions(+), 6 deletions(-) create mode 100644 compiler/testData/loadJava8/compiledJava/InnerClassTypeAnnotation.fast.txt create mode 100644 compiler/tests-java8/tests/org/jetbrains/kotlin/jvm/compiler/AbstractLoadJava8WithFastClassReadingTest.kt create mode 100644 compiler/tests-java8/tests/org/jetbrains/kotlin/jvm/compiler/LoadJava8WithFastClassReadingTestGenerated.java diff --git a/compiler/frontend.java/src/org/jetbrains/kotlin/load/java/structure/impl/classFiles/Annotations.kt b/compiler/frontend.java/src/org/jetbrains/kotlin/load/java/structure/impl/classFiles/Annotations.kt index 10e21f38a3f..e35f34d070c 100644 --- a/compiler/frontend.java/src/org/jetbrains/kotlin/load/java/structure/impl/classFiles/Annotations.kt +++ b/compiler/frontend.java/src/org/jetbrains/kotlin/load/java/structure/impl/classFiles/Annotations.kt @@ -22,9 +22,7 @@ import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.utils.addIfNotNull import org.jetbrains.kotlin.utils.addToStdlib.safeAs -import org.jetbrains.org.objectweb.asm.AnnotationVisitor -import org.jetbrains.org.objectweb.asm.MethodVisitor -import org.jetbrains.org.objectweb.asm.Type +import org.jetbrains.org.objectweb.asm.* import java.lang.reflect.Array internal class AnnotationsCollectorMethodVisitor( @@ -55,6 +53,27 @@ internal class AnnotationsCollectorMethodVisitor( return BinaryJavaAnnotation.addAnnotation(annotations, desc, context, signatureParser) } + + override fun visitTypeAnnotation(typeRef: Int, typePath: TypePath?, desc: String, visible: Boolean): AnnotationVisitor? { + // TODO: support annotations on type arguments + if (typePath != null) return null + + val typeReference = TypeReference(typeRef) + + return when (typeReference.sort) { + TypeReference.METHOD_RETURN -> member.safeAs()?.returnType?.let { + BinaryJavaAnnotation.addTypeAnnotation(it, desc, context, signatureParser) + } + + TypeReference.METHOD_FORMAL_PARAMETER -> + BinaryJavaAnnotation.addTypeAnnotation( + member.valueParameters[typeReference.formalParameterIndex].type, + desc, context, signatureParser + ) + + else -> null + } + } } class BinaryJavaAnnotation private constructor( @@ -87,6 +106,20 @@ class BinaryJavaAnnotation private constructor( return annotationVisitor } + + fun addTypeAnnotation( + type: JavaType, + desc: String, + context: ClassifierResolutionContext, + signatureParser: BinaryClassSignatureParser + ): AnnotationVisitor? { + type as? PlainJavaClassifierType ?: return null + + val (javaAnnotation, annotationVisitor) = createAnnotationAndVisitor(desc, context, signatureParser) + type.addAnnotation(javaAnnotation) + + return annotationVisitor + } } private val classifierResolutionResult by lazy(LazyThreadSafetyMode.NONE) { diff --git a/compiler/frontend.java/src/org/jetbrains/kotlin/load/java/structure/impl/classFiles/BinaryJavaClass.kt b/compiler/frontend.java/src/org/jetbrains/kotlin/load/java/structure/impl/classFiles/BinaryJavaClass.kt index e5335c657f9..2dbcc1bb1bd 100644 --- a/compiler/frontend.java/src/org/jetbrains/kotlin/load/java/structure/impl/classFiles/BinaryJavaClass.kt +++ b/compiler/frontend.java/src/org/jetbrains/kotlin/load/java/structure/impl/classFiles/BinaryJavaClass.kt @@ -162,6 +162,12 @@ class BinaryJavaClass( object : FieldVisitor(ASM_API_VERSION_FOR_CLASS_READING) { override fun visitAnnotation(desc: String, visible: Boolean) = BinaryJavaAnnotation.addAnnotation(this@run.annotations, desc, context, signatureParser) + + override fun visitTypeAnnotation(typeRef: Int, typePath: TypePath?, desc: String, visible: Boolean) = + if (typePath == null) + BinaryJavaAnnotation.addTypeAnnotation(type, desc, context, signatureParser) + else + null } } } diff --git a/compiler/frontend.java/src/org/jetbrains/kotlin/load/java/structure/impl/classFiles/Types.kt b/compiler/frontend.java/src/org/jetbrains/kotlin/load/java/structure/impl/classFiles/Types.kt index 609011c2b17..47542d57c07 100644 --- a/compiler/frontend.java/src/org/jetbrains/kotlin/load/java/structure/impl/classFiles/Types.kt +++ b/compiler/frontend.java/src/org/jetbrains/kotlin/load/java/structure/impl/classFiles/Types.kt @@ -16,6 +16,7 @@ package org.jetbrains.kotlin.load.java.structure.impl.classFiles +import com.intellij.util.containers.ContainerUtil import org.jetbrains.kotlin.builtins.PrimitiveType import org.jetbrains.kotlin.load.java.structure.* import org.jetbrains.kotlin.name.FqName @@ -39,9 +40,18 @@ internal class PlainJavaClassifierType( get() = typeArguments.isEmpty() && classifierResolverResult.classifier?.safeAs()?.typeParameters?.isNotEmpty() == true - // TODO: support type annotations - override val annotations get() = emptyList() - override fun findAnnotation(fqName: FqName) = null + private var _annotations = emptyList() + override val annotations get() = _annotations + + override fun findAnnotation(fqName: FqName) = annotations.find { it.classId?.asSingleFqName() == fqName } + + internal fun addAnnotation(annotation: JavaAnnotation) { + if (_annotations.isEmpty()) { + _annotations = ContainerUtil.newSmartList() + } + + (_annotations as MutableList).add(annotation) + } override val isDeprecatedInJavaDoc get() = false diff --git a/compiler/testData/loadJava8/compiledJava/InnerClassTypeAnnotation.fast.txt b/compiler/testData/loadJava8/compiledJava/InnerClassTypeAnnotation.fast.txt new file mode 100644 index 00000000000..5e4ceb48ec3 --- /dev/null +++ b/compiler/testData/loadJava8/compiledJava/InnerClassTypeAnnotation.fast.txt @@ -0,0 +1,14 @@ +package test + +public open class InnerClassTypeAnnotation { + public constructor InnerClassTypeAnnotation() + + @kotlin.annotation.Retention(value = AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets = {AnnotationTarget.TYPE}) public final annotation class Foo : kotlin.Annotation { + public constructor Foo() + } + + public open inner class Inner { + public constructor Inner(/*0*/ p0: @test.InnerClassTypeAnnotation.Foo kotlin.String!) + public open fun bar(/*0*/ p0: kotlin.String!, /*1*/ p1: @test.InnerClassTypeAnnotation.Foo kotlin.String!): @test.InnerClassTypeAnnotation.Foo kotlin.String! + } +} diff --git a/compiler/testData/loadJava8/compiledJava/InnerClassTypeAnnotation.java b/compiler/testData/loadJava8/compiledJava/InnerClassTypeAnnotation.java index 0b9078dcbf8..c507c591e03 100644 --- a/compiler/testData/loadJava8/compiledJava/InnerClassTypeAnnotation.java +++ b/compiler/testData/loadJava8/compiledJava/InnerClassTypeAnnotation.java @@ -13,6 +13,8 @@ public class InnerClassTypeAnnotation { public class Inner { public Inner(@Foo String foo) { } + + public @Foo String bar(String x, @Foo String y) { return null; } } @Retention(RetentionPolicy.CLASS) diff --git a/compiler/testData/loadJava8/compiledJava/InnerClassTypeAnnotation.javac.txt b/compiler/testData/loadJava8/compiledJava/InnerClassTypeAnnotation.javac.txt index 88a9361ce8d..d4e98cddc31 100644 --- a/compiler/testData/loadJava8/compiledJava/InnerClassTypeAnnotation.javac.txt +++ b/compiler/testData/loadJava8/compiledJava/InnerClassTypeAnnotation.javac.txt @@ -9,5 +9,6 @@ public open class InnerClassTypeAnnotation { public open inner class Inner { public constructor Inner(/*0*/ p0: kotlin.String!) + public open fun bar(/*0*/ p0: kotlin.String!, /*1*/ p1: kotlin.String!): kotlin.String! } } diff --git a/compiler/testData/loadJava8/compiledJava/InnerClassTypeAnnotation.txt b/compiler/testData/loadJava8/compiledJava/InnerClassTypeAnnotation.txt index 0a331d40030..a0cb256777a 100644 --- a/compiler/testData/loadJava8/compiledJava/InnerClassTypeAnnotation.txt +++ b/compiler/testData/loadJava8/compiledJava/InnerClassTypeAnnotation.txt @@ -9,5 +9,6 @@ public open class InnerClassTypeAnnotation { public open inner class Inner { public constructor Inner(/*0*/ @test.InnerClassTypeAnnotation.Foo p0: @test.InnerClassTypeAnnotation.Foo kotlin.String!) + @test.InnerClassTypeAnnotation.Foo public open fun bar(/*0*/ p0: kotlin.String!, /*1*/ @test.InnerClassTypeAnnotation.Foo p1: @test.InnerClassTypeAnnotation.Foo kotlin.String!): @test.InnerClassTypeAnnotation.Foo kotlin.String! } } diff --git a/compiler/tests-java8/tests/org/jetbrains/kotlin/jvm/compiler/AbstractLoadJava8WithFastClassReadingTest.kt b/compiler/tests-java8/tests/org/jetbrains/kotlin/jvm/compiler/AbstractLoadJava8WithFastClassReadingTest.kt new file mode 100644 index 00000000000..5d46c979330 --- /dev/null +++ b/compiler/tests-java8/tests/org/jetbrains/kotlin/jvm/compiler/AbstractLoadJava8WithFastClassReadingTest.kt @@ -0,0 +1,23 @@ +/* + * Copyright 2010-2017 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.jvm.compiler + +import org.jetbrains.kotlin.test.TestJdkKind + +abstract class AbstractLoadJava8WithFastClassReadingTest : AbstractLoadJavaWithFastClassReadingTest() { + override fun getJdkKind() = TestJdkKind.FULL_JDK +} diff --git a/compiler/tests-java8/tests/org/jetbrains/kotlin/jvm/compiler/LoadJava8WithFastClassReadingTestGenerated.java b/compiler/tests-java8/tests/org/jetbrains/kotlin/jvm/compiler/LoadJava8WithFastClassReadingTestGenerated.java new file mode 100644 index 00000000000..fb492074da9 --- /dev/null +++ b/compiler/tests-java8/tests/org/jetbrains/kotlin/jvm/compiler/LoadJava8WithFastClassReadingTestGenerated.java @@ -0,0 +1,62 @@ +/* + * Copyright 2010-2017 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.jvm.compiler; + +import com.intellij.testFramework.TestDataPath; +import org.jetbrains.kotlin.test.JUnit3RunnerWithInners; +import org.jetbrains.kotlin.test.KotlinTestUtils; +import org.jetbrains.kotlin.test.TargetBackend; +import org.jetbrains.kotlin.test.TestMetadata; +import org.junit.runner.RunWith; + +import java.io.File; +import java.util.regex.Pattern; + +/** This class is generated by {@link org.jetbrains.kotlin.generators.tests.TestsPackage}. DO NOT MODIFY MANUALLY */ +@SuppressWarnings("all") +@TestMetadata("compiler/testData/loadJava8/compiledJava") +@TestDataPath("$PROJECT_ROOT") +@RunWith(JUnit3RunnerWithInners.class) +public class LoadJava8WithFastClassReadingTestGenerated extends AbstractLoadJava8WithFastClassReadingTest { + public void testAllFilesPresentInCompiledJava() throws Exception { + KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("compiler/testData/loadJava8/compiledJava"), Pattern.compile("^(.+)\\.java$"), TargetBackend.ANY, true); + } + + @TestMetadata("InnerClassTypeAnnotation.java") + public void testInnerClassTypeAnnotation() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/loadJava8/compiledJava/InnerClassTypeAnnotation.java"); + doTestCompiledJava(fileName); + } + + @TestMetadata("MapRemove.java") + public void testMapRemove() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/loadJava8/compiledJava/MapRemove.java"); + doTestCompiledJava(fileName); + } + + @TestMetadata("TypeAnnotations.java") + public void testTypeAnnotations() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/loadJava8/compiledJava/TypeAnnotations.java"); + doTestCompiledJava(fileName); + } + + @TestMetadata("TypeParameterAnnotations.java") + public void testTypeParameterAnnotations() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/loadJava8/compiledJava/TypeParameterAnnotations.java"); + doTestCompiledJava(fileName); + } +} diff --git a/generators/src/org/jetbrains/kotlin/generators/tests/GenerateTests.kt b/generators/src/org/jetbrains/kotlin/generators/tests/GenerateTests.kt index c8ddc452674..1f8621fa212 100755 --- a/generators/src/org/jetbrains/kotlin/generators/tests/GenerateTests.kt +++ b/generators/src/org/jetbrains/kotlin/generators/tests/GenerateTests.kt @@ -535,6 +535,10 @@ fun main(args: Array) { model("loadJava8/sourceJava", extension = "java", testMethod = "doTestSourceJava") } + testClass { + model("loadJava8/compiledJava", extension = "java", testMethod = "doTestCompiledJava") + } + testClass { model("resolvedCalls/enhancedSignatures") } From 4428ba0bb70494179830d776189bbcb3e17337b6 Mon Sep 17 00:00:00 2001 From: Yoshinori Isogai Date: Wed, 27 Sep 2017 01:02:03 +0900 Subject: [PATCH 099/212] Add "Generate Tests" run configuration (#1318) --- .idea/runConfigurations/Generate_Tests.xml | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100644 .idea/runConfigurations/Generate_Tests.xml diff --git a/.idea/runConfigurations/Generate_Tests.xml b/.idea/runConfigurations/Generate_Tests.xml new file mode 100644 index 00000000000..2e6cf6fc804 --- /dev/null +++ b/.idea/runConfigurations/Generate_Tests.xml @@ -0,0 +1,20 @@ + + + + + + + + + \ No newline at end of file From 3d8486e8a6a5b828acf42e1fe588dfa3b08e454a Mon Sep 17 00:00:00 2001 From: Andrey Mischenko Date: Thu, 21 Sep 2017 05:50:50 +0200 Subject: [PATCH 100/212] Allow to use Gradle property to configure JDK path --- ReadMe.md | 2 ++ buildSrc/src/main/kotlin/jdksFinder.kt | 3 ++- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/ReadMe.md b/ReadMe.md index 6bc7e7d5305..1e2cec4c29f 100644 --- a/ReadMe.md +++ b/ReadMe.md @@ -40,6 +40,8 @@ In order to build Kotlin distribution you need to have: For local development, if you're not working on bytecode generation or the standard library, it's OK to have only JDK 8 installed, and to point all of the environment variables mentioned above to your JDK 8 installation. +You also can use [Gradle properties](https://docs.gradle.org/current/userguide/build_environment.html#sec:gradle_properties_and_system_properties) to setup JDK_* variables. + > Note: The JDK 6 for MacOS is not available on Oracle's site. You can [download it here](https://support.apple.com/kb/DL1572). ## Building diff --git a/buildSrc/src/main/kotlin/jdksFinder.kt b/buildSrc/src/main/kotlin/jdksFinder.kt index d8677660167..ae4607a1a2d 100644 --- a/buildSrc/src/main/kotlin/jdksFinder.kt +++ b/buildSrc/src/main/kotlin/jdksFinder.kt @@ -19,7 +19,8 @@ data class JdkId(val explicit: Boolean, val majorVersion: JdkMajorVersion, var v fun Project.getConfiguredJdks(): List { val res = arrayListOf() for (jdkMajorVersion in JdkMajorVersion.values()) { - val explicitJdkEnvVal = System.getenv(jdkMajorVersion.name) + val explicitJdkEnvVal = findProperty(jdkMajorVersion.name)?.toString() + ?: System.getenv(jdkMajorVersion.name) ?: jdkAlternativeVarNames[jdkMajorVersion]?.mapNotNull { System.getenv(it) }?.firstOrNull() ?: continue val explicitJdk = File(explicitJdkEnvVal) From c0a83c3c8a15ee0e10eff5bc5750f44459ac2d59 Mon Sep 17 00:00:00 2001 From: Dmitry Petrov Date: Fri, 28 Jul 2017 16:20:10 +0300 Subject: [PATCH 101/212] KT-19251 Process uninitialized stores in mandatory bytecode pass See https://youtrack.jetbrains.com/issue/KT-19251 https://github.com/puniverse/quasar/issues/280 https://bugs.openjdk.java.net/browse/JDK-8046233 Inline function calls (as well as try/catch expressions) in constructor arguments produce bytecode that spills stack, and stores uninitialized objects (created by 'NEW C', but not initialized by 'C.') to local variables. Such bytecode is valid according to the JVM spec, but confuses Quasar (and other bytecode postprocessing tools), and fails to verify under some (buggy) versions of JDK 8. In order to avoid that, we apply 'processUnitializedStores' already implemented for coroutines. It moves 'NEW' instructions after the constructor arguments evaluation, producing code like NEW C DUP INVOKESPECIAL C.(...) NB some other expressions, such as break/continue in the constructor arguments, also can produce "weird" bytecode: object is created by a 'NEW C' instruction, but later (conditionally) POPped from stack and left uninitialized. This, as we know, also can screw bytecode postprocessing. However, it looks like we can get away with it ATM. Otherwise it looks like we'd have to analyze constructor arguments, see if the evaluation can "jump out", and perform argument linearization in codegen. --- .../coroutines/processUninitializedStores.kt | 229 ++++++++++-------- ...ithLabelNormalizationMethodTransformer.kt} | 0 .../OptimizationClassBuilderFactory.java | 2 - .../optimization/OptimizationMethodVisitor.kt | 14 +- .../UninitializedStoresMethodTransformer.kt | 27 +++ .../codegen/optimization/common/Util.kt | 3 + .../transformer/CompositeMethodTransformer.kt | 9 +- .../kotlin/codegen/state/GenerationState.kt | 1 - ...lineFunInConstructorCallEvaluationOrder.kt | 40 +++ .../inlineFunInInnerClassConstructorCall.kt | 43 ++++ .../inlineFunInLocalClassConstructorCall.kt | 41 ++++ .../regularConstructorCallEvaluationOrder.kt | 32 +++ ...ryCatchInConstructorCallEvaluationOrder.kt | 35 +++ .../ir/IrBlackBoxCodegenTestGenerated.java | 39 +++ .../codegen/BlackBoxCodegenTestGenerated.java | 39 +++ .../LightAnalysisModeTestGenerated.java | 39 +++ .../semantics/JsCodegenBoxTestGenerated.java | 9 + 17 files changed, 494 insertions(+), 108 deletions(-) rename compiler/backend/src/org/jetbrains/kotlin/codegen/optimization/{MandatoryMethodTransforker.kt => FixStackWithLabelNormalizationMethodTransformer.kt} (100%) create mode 100644 compiler/backend/src/org/jetbrains/kotlin/codegen/optimization/UninitializedStoresMethodTransformer.kt create mode 100644 compiler/testData/codegen/box/constructorCall/inlineFunInConstructorCallEvaluationOrder.kt create mode 100644 compiler/testData/codegen/box/constructorCall/inlineFunInInnerClassConstructorCall.kt create mode 100644 compiler/testData/codegen/box/constructorCall/inlineFunInLocalClassConstructorCall.kt create mode 100644 compiler/testData/codegen/box/constructorCall/regularConstructorCallEvaluationOrder.kt create mode 100644 compiler/testData/codegen/box/constructorCall/tryCatchInConstructorCallEvaluationOrder.kt diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/coroutines/processUninitializedStores.kt b/compiler/backend/src/org/jetbrains/kotlin/codegen/coroutines/processUninitializedStores.kt index 5e5983dc629..5e3c9641ab7 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/coroutines/processUninitializedStores.kt +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/coroutines/processUninitializedStores.kt @@ -16,10 +16,8 @@ package org.jetbrains.kotlin.codegen.coroutines -import org.jetbrains.kotlin.codegen.optimization.common.CustomFramesMethodAnalyzer -import org.jetbrains.kotlin.codegen.optimization.common.OptimizationBasicInterpreter -import org.jetbrains.kotlin.codegen.optimization.common.StrictBasicValue -import org.jetbrains.kotlin.codegen.optimization.common.insnListOf +import org.jetbrains.kotlin.codegen.optimization.common.* +import org.jetbrains.kotlin.codegen.optimization.fixStack.peek import org.jetbrains.org.objectweb.asm.Opcodes import org.jetbrains.org.objectweb.asm.Type import org.jetbrains.org.objectweb.asm.tree.* @@ -71,124 +69,161 @@ import org.jetbrains.org.objectweb.asm.tree.analysis.Interpreter * - restore constructor arguments */ internal fun processUninitializedStores(methodNode: MethodNode) { - val interpreter = UninitializedNewValueMarkerInterpreter() - val frames = CustomFramesMethodAnalyzer("fake", methodNode, interpreter, ::UninitializedNewValueFrame).analyze() - - for ((index, insn) in methodNode.instructions.toArray().withIndex()) { - val frame = frames[index] ?: continue - val uninitializedValue = frame.getUninitializedValueForConstructorCall(insn) ?: continue - - val copyUsages: Set = interpreter.uninitializedValuesToCopyUsages[uninitializedValue.newInsn]!! - assert(copyUsages.size > 0) { "At least DUP copy operation expected" } - - // Value generated by NEW wasn't store to local/field (only DUPed) - if (copyUsages.size == 1) continue - - (copyUsages + uninitializedValue.newInsn).forEach { - methodNode.instructions.remove(it) - } - - val indexOfConstructorArgumentFromTopOfStack = Type.getArgumentTypes((insn as MethodInsnNode).desc).size - val storedTypes = arrayListOf() - var nextVarIndex = methodNode.maxLocals - - for (i in 0 until indexOfConstructorArgumentFromTopOfStack) { - val value = frame.getStack(frame.stackSize - 1 - i) - val type = value.type - methodNode.instructions.insertBefore(insn, VarInsnNode(type.getOpcode(Opcodes.ISTORE), nextVarIndex)) - nextVarIndex += type.size - storedTypes.add(type) - } - methodNode.maxLocals = Math.max(methodNode.maxLocals, nextVarIndex) - - methodNode.instructions.insertBefore(insn, insnListOf( - TypeInsnNode(Opcodes.NEW, uninitializedValue.newInsn.desc), - InsnNode(Opcodes.DUP) - )) - - for (type in storedTypes.reversed()) { - nextVarIndex -= type.size - methodNode.instructions.insertBefore(insn, VarInsnNode(type.getOpcode(Opcodes.ILOAD), nextVarIndex)) - } - } + UninitializedStoresProcessor(methodNode, forCoroutines = true).run() } -private class UninitializedNewValue( - val newInsn: TypeInsnNode, val internalName: String -) : StrictBasicValue(Type.getObjectType(internalName)) { - override fun toString() = "UninitializedNewValue(internalName='$internalName')" -} +class UninitializedStoresProcessor(private val methodNode: MethodNode, private val forCoroutines: Boolean) { + private val isInSpecialMethod = methodNode.name == "" || methodNode.name == "" -private class UninitializedNewValueFrame(nLocals: Int, nStack: Int) : Frame(nLocals, nStack) { - override fun execute(insn: AbstractInsnNode, interpreter: Interpreter?) { - val replaceTopValueWithInitialized = getUninitializedValueForConstructorCall(insn) != null + fun run() { + val interpreter = UninitializedNewValueMarkerInterpreter() - super.execute(insn, interpreter) + val frames = CustomFramesMethodAnalyzer( + "fake", methodNode, interpreter, + this::UninitializedNewValueFrame + ).analyze() - if (replaceTopValueWithInitialized) { - // Drop top value - val value = pop() as UninitializedNewValue + for ((index, insn) in methodNode.instructions.toArray().withIndex()) { + val frame = frames[index] ?: continue + val uninitializedValue = frame.getUninitializedValueForConstructorCall(insn) ?: continue - // uninitialized value become initialized after call - push(StrictBasicValue(value.type)) + val newInsn = uninitializedValue.newInsn + val copyUsages: Set = interpreter.uninitializedValuesToCopyUsages[newInsn]!! + assert(copyUsages.isNotEmpty()) { "At least DUP copy operation expected" } + + // Value generated by NEW wasn't store to local/field (only DUPed) + if (copyUsages.size == 1) continue + + methodNode.instructions.run { + removeAll(copyUsages) + if (forCoroutines) { + remove(newInsn) + } + else { + // Replace 'NEW C' instruction with "manual" initialization of class 'C': + // LDC [typeName for C] + // INVOKESTATIC java/lang/Class.forName (Ljava/lang/String;)Ljava/lang/Class; + // POP + val typeNameForClass = newInsn.desc.replace('/', '.') + insertBefore(newInsn, LdcInsnNode(typeNameForClass)) + insertBefore( + newInsn, + MethodInsnNode( + Opcodes.INVOKESTATIC, + "java/lang/Class", "forName", "(Ljava/lang/String;)Ljava/lang/Class;", + false + ) + ) + set(newInsn, InsnNode(Opcodes.POP)) + } + } + + val indexOfConstructorArgumentFromTopOfStack = Type.getArgumentTypes((insn as MethodInsnNode).desc).size + val storedTypes = arrayListOf() + var nextVarIndex = methodNode.maxLocals + + for (i in 0 until indexOfConstructorArgumentFromTopOfStack) { + val value = frame.getStack(frame.stackSize - 1 - i) + val type = value.type + methodNode.instructions.insertBefore(insn, VarInsnNode(type.getOpcode(Opcodes.ISTORE), nextVarIndex)) + nextVarIndex += type.size + storedTypes.add(type) + } + methodNode.maxLocals = Math.max(methodNode.maxLocals, nextVarIndex) + + methodNode.instructions.insertBefore(insn, insnListOf( + TypeInsnNode(Opcodes.NEW, newInsn.desc), + InsnNode(Opcodes.DUP) + )) + + for (type in storedTypes.reversed()) { + nextVarIndex -= type.size + methodNode.instructions.insertBefore(insn, VarInsnNode(type.getOpcode(Opcodes.ILOAD), nextVarIndex)) + } } } -} -/** - * @return value generated by NEW that used as 0-th argument of constructor call or null if current instruction is not constructor call - */ -private fun Frame.getUninitializedValueForConstructorCall( - insn: AbstractInsnNode -): UninitializedNewValue? { - if (!insn.isConstructorCall()) return null + private inner class UninitializedNewValueFrame(nLocals: Int, nStack: Int) : Frame(nLocals, nStack) { + override fun execute(insn: AbstractInsnNode, interpreter: Interpreter?) { + val replaceTopValueWithInitialized = getUninitializedValueForConstructorCall(insn) != null - assert(insn.opcode == Opcodes.INVOKESPECIAL) { "Expected opcode Opcodes.INVOKESPECIAL for , but ${insn.opcode} found" } - val paramsCountIncludingReceiver = Type.getArgumentTypes((insn as MethodInsnNode).desc).size + 1 - val newValue = getStack(stackSize - (paramsCountIncludingReceiver + 1)) as? UninitializedNewValue ?: error("Expected value generated with NEW") + super.execute(insn, interpreter) - assert(getStack(stackSize - paramsCountIncludingReceiver) is UninitializedNewValue) { - "Next value after NEW should be one generated by DUP" + if (replaceTopValueWithInitialized) { + // Drop top value + val value = pop() as UninitializedNewValue + + // uninitialized value become initialized after call + push(StrictBasicValue(value.type)) + } + } } - return newValue -} + /** + * @return value generated by NEW that used as 0-th argument of constructor call or null if current instruction is not constructor call + */ + private fun Frame.getUninitializedValueForConstructorCall(insn: AbstractInsnNode): UninitializedNewValue? { + if (!insn.isConstructorCall()) return null -private fun AbstractInsnNode.isConstructorCall() = this is MethodInsnNode && this.name == "" + assert(insn.opcode == Opcodes.INVOKESPECIAL) { "Expected opcode Opcodes.INVOKESPECIAL for , but ${insn.opcode} found" } + val paramsCountIncludingReceiver = Type.getArgumentTypes((insn as MethodInsnNode).desc).size + 1 + val newValue = peek(paramsCountIncludingReceiver) as? UninitializedNewValue ?: + if (isInSpecialMethod) + return null + else + error("Expected value generated with NEW") -private class UninitializedNewValueMarkerInterpreter : OptimizationBasicInterpreter() { - val uninitializedValuesToCopyUsages = hashMapOf>() - override fun newOperation(insn: AbstractInsnNode): BasicValue? { - if (insn.opcode == Opcodes.NEW) { - uninitializedValuesToCopyUsages.getOrPut(insn) { mutableSetOf() } - return UninitializedNewValue(insn as TypeInsnNode, insn.desc) + assert(peek(paramsCountIncludingReceiver - 1) is UninitializedNewValue) { + "Next value after NEW should be one generated by DUP" } - return super.newOperation(insn) + + return newValue } - override fun copyOperation(insn: AbstractInsnNode, value: BasicValue?): BasicValue? { - if (value is UninitializedNewValue) { - uninitializedValuesToCopyUsages[value.newInsn]!!.add(insn) - return value - } - return super.copyOperation(insn, value) + private class UninitializedNewValue( + val newInsn: TypeInsnNode, + val internalName: String + ) : StrictBasicValue(Type.getObjectType(internalName)) { + override fun toString() = "UninitializedNewValue(internalName='$internalName')" } - override fun merge(v: BasicValue, w: BasicValue): BasicValue { - if (v === w) return v - if (v === StrictBasicValue.UNINITIALIZED_VALUE || w === StrictBasicValue.UNINITIALIZED_VALUE) { - return StrictBasicValue.UNINITIALIZED_VALUE + + private fun AbstractInsnNode.isConstructorCall() = this is MethodInsnNode && this.name == "" + + private class UninitializedNewValueMarkerInterpreter : OptimizationBasicInterpreter() { + val uninitializedValuesToCopyUsages = hashMapOf>() + override fun newOperation(insn: AbstractInsnNode): BasicValue? { + if (insn.opcode == Opcodes.NEW) { + uninitializedValuesToCopyUsages.getOrPut(insn) { mutableSetOf() } + return UninitializedNewValue(insn as TypeInsnNode, insn.desc) + } + return super.newOperation(insn) } - if (v is UninitializedNewValue || w is UninitializedNewValue) { - if ((v as? UninitializedNewValue)?.newInsn !== (w as? UninitializedNewValue)?.newInsn) { - // Merge of two different ANEW result is possible, but such values should not be used further + override fun copyOperation(insn: AbstractInsnNode, value: BasicValue?): BasicValue? { + if (value is UninitializedNewValue) { + uninitializedValuesToCopyUsages[value.newInsn]!!.add(insn) + return value + } + return super.copyOperation(insn, value) + } + + override fun merge(v: BasicValue, w: BasicValue): BasicValue { + if (v === w) return v + if (v === StrictBasicValue.UNINITIALIZED_VALUE || w === StrictBasicValue.UNINITIALIZED_VALUE) { return StrictBasicValue.UNINITIALIZED_VALUE } - return v - } + if (v is UninitializedNewValue || w is UninitializedNewValue) { + if ((v as? UninitializedNewValue)?.newInsn !== (w as? UninitializedNewValue)?.newInsn) { + // Merge of two different ANEW result is possible, but such values should not be used further + return StrictBasicValue.UNINITIALIZED_VALUE + } - return super.merge(v, w) + return v + } + + return super.merge(v, w) + } } } diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/optimization/MandatoryMethodTransforker.kt b/compiler/backend/src/org/jetbrains/kotlin/codegen/optimization/FixStackWithLabelNormalizationMethodTransformer.kt similarity index 100% rename from compiler/backend/src/org/jetbrains/kotlin/codegen/optimization/MandatoryMethodTransforker.kt rename to compiler/backend/src/org/jetbrains/kotlin/codegen/optimization/FixStackWithLabelNormalizationMethodTransformer.kt diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/optimization/OptimizationClassBuilderFactory.java b/compiler/backend/src/org/jetbrains/kotlin/codegen/optimization/OptimizationClassBuilderFactory.java index 3a8223e869e..812944c12a7 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/optimization/OptimizationClassBuilderFactory.java +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/optimization/OptimizationClassBuilderFactory.java @@ -17,9 +17,7 @@ package org.jetbrains.kotlin.codegen.optimization; import org.jetbrains.annotations.NotNull; -import org.jetbrains.kotlin.codegen.ClassBuilder; import org.jetbrains.kotlin.codegen.ClassBuilderFactory; -import org.jetbrains.kotlin.codegen.ClassBuilderMode; import org.jetbrains.kotlin.codegen.DelegatingClassBuilderFactory; import org.jetbrains.kotlin.resolve.jvm.diagnostics.JvmDeclarationOrigin; diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/optimization/OptimizationMethodVisitor.kt b/compiler/backend/src/org/jetbrains/kotlin/codegen/optimization/OptimizationMethodVisitor.kt index 33c62a48c77..04663015d31 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/optimization/OptimizationMethodVisitor.kt +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/optimization/OptimizationMethodVisitor.kt @@ -17,9 +17,9 @@ package org.jetbrains.kotlin.codegen.optimization import org.jetbrains.kotlin.codegen.TransformationMethodVisitor -import org.jetbrains.kotlin.codegen.optimization.boxing.StackPeepholeOptimizationsTransformer -import org.jetbrains.kotlin.codegen.optimization.boxing.RedundantBoxingMethodTransformer import org.jetbrains.kotlin.codegen.optimization.boxing.PopBackwardPropagationTransformer +import org.jetbrains.kotlin.codegen.optimization.boxing.RedundantBoxingMethodTransformer +import org.jetbrains.kotlin.codegen.optimization.boxing.StackPeepholeOptimizationsTransformer import org.jetbrains.kotlin.codegen.optimization.common.prepareForEmitting import org.jetbrains.kotlin.codegen.optimization.nullCheck.RedundantNullCheckMethodTransformer import org.jetbrains.kotlin.codegen.optimization.transformer.CompositeMethodTransformer @@ -35,11 +35,10 @@ class OptimizationMethodVisitor( signature: String?, exceptions: Array? ) : TransformationMethodVisitor(delegate, access, name, desc, signature, exceptions) { - override fun performTransformations(methodNode: MethodNode) { - MANDATORY_METHOD_TRANSFORMER.transform("fake", methodNode) + normalizationMethodTransformer.transform("fake", methodNode) if (canBeOptimized(methodNode) && !disableOptimization) { - OPTIMIZATION_TRANSFORMER.transform("fake", methodNode) + optimizationTransformer.transform("fake", methodNode) } methodNode.prepareForEmitting() } @@ -47,12 +46,13 @@ class OptimizationMethodVisitor( companion object { private val MEMORY_LIMIT_BY_METHOD_MB = 50 - private val MANDATORY_METHOD_TRANSFORMER = CompositeMethodTransformer( + val normalizationMethodTransformer = CompositeMethodTransformer( FixStackWithLabelNormalizationMethodTransformer(), + UninitializedStoresMethodTransformer(), MethodVerifier("AFTER mandatory stack transformations") ) - private val OPTIMIZATION_TRANSFORMER = CompositeMethodTransformer( + val optimizationTransformer = CompositeMethodTransformer( CapturedVarsOptimizationMethodTransformer(), RedundantNullCheckMethodTransformer(), RedundantCheckCastEliminationMethodTransformer(), diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/optimization/UninitializedStoresMethodTransformer.kt b/compiler/backend/src/org/jetbrains/kotlin/codegen/optimization/UninitializedStoresMethodTransformer.kt new file mode 100644 index 00000000000..aab689820fa --- /dev/null +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/optimization/UninitializedStoresMethodTransformer.kt @@ -0,0 +1,27 @@ +/* + * Copyright 2010-2017 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.codegen.optimization + +import org.jetbrains.kotlin.codegen.coroutines.UninitializedStoresProcessor +import org.jetbrains.kotlin.codegen.optimization.transformer.MethodTransformer +import org.jetbrains.org.objectweb.asm.tree.MethodNode + +class UninitializedStoresMethodTransformer : MethodTransformer() { + override fun transform(internalClassName: String, methodNode: MethodNode) { + UninitializedStoresProcessor(methodNode, forCoroutines = false).run() + } +} \ No newline at end of file diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/optimization/common/Util.kt b/compiler/backend/src/org/jetbrains/kotlin/codegen/optimization/common/Util.kt index 77fb229f4d8..adb8fe84bcb 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/optimization/common/Util.kt +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/optimization/common/Util.kt @@ -214,3 +214,6 @@ internal inline fun AbstractInsnNode.isInsn(opcod internal inline fun AbstractInsnNode.takeInsnIf(opcode: Int, condition: T.() -> Boolean): T? = takeIf { it.opcode == opcode }?.safeAs()?.takeIf { it.condition() } +fun InsnList.removeAll(nodes: Collection) { + for (node in nodes) remove(node) +} \ No newline at end of file diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/optimization/transformer/CompositeMethodTransformer.kt b/compiler/backend/src/org/jetbrains/kotlin/codegen/optimization/transformer/CompositeMethodTransformer.kt index 5726321e506..e2e40b47b59 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/optimization/transformer/CompositeMethodTransformer.kt +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/optimization/transformer/CompositeMethodTransformer.kt @@ -18,8 +18,15 @@ package org.jetbrains.kotlin.codegen.optimization.transformer import org.jetbrains.org.objectweb.asm.tree.MethodNode -open class CompositeMethodTransformer(private vararg val transformers: MethodTransformer) : MethodTransformer() { +open class CompositeMethodTransformer(private val transformers: List) : MethodTransformer() { + constructor(vararg transformers: MethodTransformer?) : this(transformers.filterNotNull()) + override fun transform(internalClassName: String, methodNode: MethodNode) { transformers.forEach { it.transform(internalClassName, methodNode) } } + + companion object { + inline fun build(builder: MutableList.() -> Unit) = + CompositeMethodTransformer(ArrayList().apply { builder() }) + } } \ No newline at end of file diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/state/GenerationState.kt b/compiler/backend/src/org/jetbrains/kotlin/codegen/state/GenerationState.kt index 6a9269e3275..9da8888b465 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/state/GenerationState.kt +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/state/GenerationState.kt @@ -179,7 +179,6 @@ class GenerationState @JvmOverloads constructor( val generateParametersMetadata: Boolean = configuration.getBoolean(JVMConfigurationKeys.PARAMETERS_METADATA) - val shouldInlineConstVals = languageVersionSettings.supportsFeature(LanguageFeature.InlineConstVals) init { diff --git a/compiler/testData/codegen/box/constructorCall/inlineFunInConstructorCallEvaluationOrder.kt b/compiler/testData/codegen/box/constructorCall/inlineFunInConstructorCallEvaluationOrder.kt new file mode 100644 index 00000000000..6a07675236f --- /dev/null +++ b/compiler/testData/codegen/box/constructorCall/inlineFunInConstructorCallEvaluationOrder.kt @@ -0,0 +1,40 @@ +// TARGET_BACKEND: JVM +// WITH_RUNTIME +// FILE: test.kt +fun box(): String { + Foo( + logged("i", 1.let { it }), + logged("j", + Foo( + logged("k", 2.let { it }), + null + ) + ) + ) + + val result = log.toString() + if (result != "ikj") return "Fail: '$result'" + + return "OK" +} + +// FILE: util.kt +val log = StringBuilder() + +fun logged(msg: String, value: T): T { + log.append(msg) + return value +} + +// FILE: Foo.kt +class Foo(i: Int, j: Foo?) { + init { + log.append("") + } + + companion object { + init { + log.append("") + } + } +} diff --git a/compiler/testData/codegen/box/constructorCall/inlineFunInInnerClassConstructorCall.kt b/compiler/testData/codegen/box/constructorCall/inlineFunInInnerClassConstructorCall.kt new file mode 100644 index 00000000000..9292242e2b6 --- /dev/null +++ b/compiler/testData/codegen/box/constructorCall/inlineFunInInnerClassConstructorCall.kt @@ -0,0 +1,43 @@ +// TARGET_BACKEND: JVM +// WITH_RUNTIME +// FILE: test.kt +fun box(): String { + Outer().Inner( + logged("i;", 1.let { it }), + logged("j;", 2.let { it }) + ) + + val result = log.toString() + if (result != "Foo.;i;j;Foo.;Inner.;") return "Fail: '$result'" + + return "OK" +} + +// FILE: util.kt +val log = StringBuilder() + +fun logged(msg: String, value: T): T { + log.append(msg) + return value +} + +// FILE: Foo.kt +open class Foo { + init { + log.append("Foo.;") + } + + companion object { + init { + log.append("Foo.;") + } + } +} + +class Outer { + inner class Inner(val x: Int, val y: Int) : Foo() { + init { + log.append("Inner.;") + } + } +} \ No newline at end of file diff --git a/compiler/testData/codegen/box/constructorCall/inlineFunInLocalClassConstructorCall.kt b/compiler/testData/codegen/box/constructorCall/inlineFunInLocalClassConstructorCall.kt new file mode 100644 index 00000000000..7061885f7aa --- /dev/null +++ b/compiler/testData/codegen/box/constructorCall/inlineFunInLocalClassConstructorCall.kt @@ -0,0 +1,41 @@ +// TARGET_BACKEND: JVM +// WITH_RUNTIME +// FILE: test.kt +fun box(): String { + class Local(val i: Int, val j: Int) : Foo() { + init { + log.append("Local.;") + } + } + + Local( + logged("i;", 1.let { it }), + logged("j;", 2.let { it }) + ) + + val result = log.toString() + if (result != "Foo.;i;j;Foo.;Local.;") return "Fail: '$result'" + + return "OK" +} + +// FILE: util.kt +val log = StringBuilder() + +fun logged(msg: String, value: T): T { + log.append(msg) + return value +} + +// FILE: Foo.kt +open class Foo { + init { + log.append("Foo.;") + } + + companion object { + init { + log.append("Foo.;") + } + } +} diff --git a/compiler/testData/codegen/box/constructorCall/regularConstructorCallEvaluationOrder.kt b/compiler/testData/codegen/box/constructorCall/regularConstructorCallEvaluationOrder.kt new file mode 100644 index 00000000000..dcba51be98f --- /dev/null +++ b/compiler/testData/codegen/box/constructorCall/regularConstructorCallEvaluationOrder.kt @@ -0,0 +1,32 @@ +// TARGET_BACKEND: JVM +// WITH_RUNTIME +// FILE: test.kt +fun box(): String { + Foo(logged("i", 1), logged("j", 2)) + + val result = log.toString() + if (result != "ij") return "Fail: '$result'" + + return "OK" +} + +// FILE: util.kt +val log = StringBuilder() + +fun logged(msg: String, value: T): T { + log.append(msg) + return value +} + +// FILE: Foo.kt +class Foo(i: Int, j: Int) { + init { + log.append("") + } + + companion object { + init { + log.append("") + } + } +} diff --git a/compiler/testData/codegen/box/constructorCall/tryCatchInConstructorCallEvaluationOrder.kt b/compiler/testData/codegen/box/constructorCall/tryCatchInConstructorCallEvaluationOrder.kt new file mode 100644 index 00000000000..4e3e586d5c4 --- /dev/null +++ b/compiler/testData/codegen/box/constructorCall/tryCatchInConstructorCallEvaluationOrder.kt @@ -0,0 +1,35 @@ +// TARGET_BACKEND: JVM +// WITH_RUNTIME +// FILE: test.kt +fun box(): String { + Foo( + logged("i", try { 1 } catch (e: Exception) { 42 }), + logged("j", 2) + ) + + val result = log.toString() + if (result != "ij") return "Fail: '$result'" + + return "OK" +} + +// FILE: util.kt +val log = StringBuilder() + +fun logged(msg: String, value: T): T { + log.append(msg) + return value +} + +// FILE: Foo.kt +class Foo(i: Int, j: Int) { + init { + log.append("") + } + + companion object { + init { + log.append("") + } + } +} diff --git a/compiler/tests-ir-jvm/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java b/compiler/tests-ir-jvm/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java index 91a730010b4..da495a1c126 100644 --- a/compiler/tests-ir-jvm/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java +++ b/compiler/tests-ir-jvm/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java @@ -4275,6 +4275,45 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes } } + @TestMetadata("compiler/testData/codegen/box/constructorCall") + @TestDataPath("$PROJECT_ROOT") + @RunWith(JUnit3RunnerWithInners.class) + public static class ConstructorCall extends AbstractIrBlackBoxCodegenTest { + public void testAllFilesPresentInConstructorCall() throws Exception { + KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("compiler/testData/codegen/box/constructorCall"), Pattern.compile("^(.+)\\.kt$"), TargetBackend.JVM, true); + } + + @TestMetadata("inlineFunInConstructorCallEvaluationOrder.kt") + public void testInlineFunInConstructorCallEvaluationOrder() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/constructorCall/inlineFunInConstructorCallEvaluationOrder.kt"); + doTest(fileName); + } + + @TestMetadata("inlineFunInInnerClassConstructorCall.kt") + public void testInlineFunInInnerClassConstructorCall() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/constructorCall/inlineFunInInnerClassConstructorCall.kt"); + doTest(fileName); + } + + @TestMetadata("inlineFunInLocalClassConstructorCall.kt") + public void testInlineFunInLocalClassConstructorCall() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/constructorCall/inlineFunInLocalClassConstructorCall.kt"); + doTest(fileName); + } + + @TestMetadata("regularConstructorCallEvaluationOrder.kt") + public void testRegularConstructorCallEvaluationOrder() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/constructorCall/regularConstructorCallEvaluationOrder.kt"); + doTest(fileName); + } + + @TestMetadata("tryCatchInConstructorCallEvaluationOrder.kt") + public void testTryCatchInConstructorCallEvaluationOrder() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/constructorCall/tryCatchInConstructorCallEvaluationOrder.kt"); + doTest(fileName); + } + } + @TestMetadata("compiler/testData/codegen/box/controlStructures") @TestDataPath("$PROJECT_ROOT") @RunWith(JUnit3RunnerWithInners.class) diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java index d893bfb2768..315fdb42ca4 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java @@ -4275,6 +4275,45 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest { } } + @TestMetadata("compiler/testData/codegen/box/constructorCall") + @TestDataPath("$PROJECT_ROOT") + @RunWith(JUnit3RunnerWithInners.class) + public static class ConstructorCall extends AbstractBlackBoxCodegenTest { + public void testAllFilesPresentInConstructorCall() throws Exception { + KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("compiler/testData/codegen/box/constructorCall"), Pattern.compile("^(.+)\\.kt$"), TargetBackend.JVM, true); + } + + @TestMetadata("inlineFunInConstructorCallEvaluationOrder.kt") + public void testInlineFunInConstructorCallEvaluationOrder() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/constructorCall/inlineFunInConstructorCallEvaluationOrder.kt"); + doTest(fileName); + } + + @TestMetadata("inlineFunInInnerClassConstructorCall.kt") + public void testInlineFunInInnerClassConstructorCall() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/constructorCall/inlineFunInInnerClassConstructorCall.kt"); + doTest(fileName); + } + + @TestMetadata("inlineFunInLocalClassConstructorCall.kt") + public void testInlineFunInLocalClassConstructorCall() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/constructorCall/inlineFunInLocalClassConstructorCall.kt"); + doTest(fileName); + } + + @TestMetadata("regularConstructorCallEvaluationOrder.kt") + public void testRegularConstructorCallEvaluationOrder() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/constructorCall/regularConstructorCallEvaluationOrder.kt"); + doTest(fileName); + } + + @TestMetadata("tryCatchInConstructorCallEvaluationOrder.kt") + public void testTryCatchInConstructorCallEvaluationOrder() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/constructorCall/tryCatchInConstructorCallEvaluationOrder.kt"); + doTest(fileName); + } + } + @TestMetadata("compiler/testData/codegen/box/controlStructures") @TestDataPath("$PROJECT_ROOT") @RunWith(JUnit3RunnerWithInners.class) diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java index 5fff2fbb6f4..f4f8af9a1e3 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java @@ -4275,6 +4275,45 @@ public class LightAnalysisModeTestGenerated extends AbstractLightAnalysisModeTes } } + @TestMetadata("compiler/testData/codegen/box/constructorCall") + @TestDataPath("$PROJECT_ROOT") + @RunWith(JUnit3RunnerWithInners.class) + public static class ConstructorCall extends AbstractLightAnalysisModeTest { + public void testAllFilesPresentInConstructorCall() throws Exception { + KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("compiler/testData/codegen/box/constructorCall"), Pattern.compile("^(.+)\\.kt$"), TargetBackend.JVM, true); + } + + @TestMetadata("inlineFunInConstructorCallEvaluationOrder.kt") + public void testInlineFunInConstructorCallEvaluationOrder() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/constructorCall/inlineFunInConstructorCallEvaluationOrder.kt"); + doTest(fileName); + } + + @TestMetadata("inlineFunInInnerClassConstructorCall.kt") + public void testInlineFunInInnerClassConstructorCall() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/constructorCall/inlineFunInInnerClassConstructorCall.kt"); + doTest(fileName); + } + + @TestMetadata("inlineFunInLocalClassConstructorCall.kt") + public void testInlineFunInLocalClassConstructorCall() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/constructorCall/inlineFunInLocalClassConstructorCall.kt"); + doTest(fileName); + } + + @TestMetadata("regularConstructorCallEvaluationOrder.kt") + public void testRegularConstructorCallEvaluationOrder() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/constructorCall/regularConstructorCallEvaluationOrder.kt"); + doTest(fileName); + } + + @TestMetadata("tryCatchInConstructorCallEvaluationOrder.kt") + public void testTryCatchInConstructorCallEvaluationOrder() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/constructorCall/tryCatchInConstructorCallEvaluationOrder.kt"); + doTest(fileName); + } + } + @TestMetadata("compiler/testData/codegen/box/controlStructures") @TestDataPath("$PROJECT_ROOT") @RunWith(JUnit3RunnerWithInners.class) diff --git a/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/JsCodegenBoxTestGenerated.java b/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/JsCodegenBoxTestGenerated.java index ec688353b26..bd63ea2bcd9 100644 --- a/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/JsCodegenBoxTestGenerated.java +++ b/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/JsCodegenBoxTestGenerated.java @@ -4905,6 +4905,15 @@ public class JsCodegenBoxTestGenerated extends AbstractJsCodegenBoxTest { } } + @TestMetadata("compiler/testData/codegen/box/constructorCall") + @TestDataPath("$PROJECT_ROOT") + @RunWith(JUnit3RunnerWithInners.class) + public static class ConstructorCall extends AbstractJsCodegenBoxTest { + public void testAllFilesPresentInConstructorCall() throws Exception { + KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("compiler/testData/codegen/box/constructorCall"), Pattern.compile("^(.+)\\.kt$"), TargetBackend.JS, true); + } + } + @TestMetadata("compiler/testData/codegen/box/controlStructures") @TestDataPath("$PROJECT_ROOT") @RunWith(JUnit3RunnerWithInners.class) From 3b5c2bbcaa9b3ef925039b7f2f4875e9796e040b Mon Sep 17 00:00:00 2001 From: Alexey Andreev Date: Tue, 26 Sep 2017 17:22:51 +0300 Subject: [PATCH 102/212] Add Gradle task to run JS tests without DCE This should be helpful when frequently testing changes in JS BE. --- js/js.tests/build.gradle.kts | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/js/js.tests/build.gradle.kts b/js/js.tests/build.gradle.kts index 161b003359b..41d511ac476 100644 --- a/js/js.tests/build.gradle.kts +++ b/js/js.tests/build.gradle.kts @@ -44,3 +44,8 @@ projectTest { testsJar {} +projectTest("quickTest") { + dependsOn(*testDistProjects.map { "$it:dist" }.toTypedArray()) + workingDir = rootDir + systemProperty("kotlin.js.skipMinificationTest", "true") +} From 24b0b75d8e85a0b04d8ff287b8c7428fbf9ad697 Mon Sep 17 00:00:00 2001 From: Alexander Udalov Date: Tue, 26 Sep 2017 17:15:31 +0300 Subject: [PATCH 103/212] Do not output compiler jar path during configuration of libraries --- libraries/commonConfiguration.gradle | 1 - 1 file changed, 1 deletion(-) diff --git a/libraries/commonConfiguration.gradle b/libraries/commonConfiguration.gradle index b4d53fd51e2..1d0291e35a1 100644 --- a/libraries/commonConfiguration.gradle +++ b/libraries/commonConfiguration.gradle @@ -216,7 +216,6 @@ ext.createScriptTask = { Project project, def name, Closure configureC return project.configure(task) { // dependsOn(rootProject.prepareBootstrap) classpath = rootProject.configurations.scriptCompile - println(rootProject.configurations.scriptCompile.files) main = "org.jetbrains.kotlin.cli.jvm.K2JVMCompiler" args = [ "-script", From a7443adb653931d8c651e70ea10366448f0cccb9 Mon Sep 17 00:00:00 2001 From: Alexander Udalov Date: Tue, 26 Sep 2017 17:21:12 +0300 Subject: [PATCH 104/212] Remove obsolete dependency on cli-parser --- build.gradle.kts | 1 - prepare/compiler/build.gradle.kts | 1 - prepare/idea-plugin/build.gradle.kts | 1 - 3 files changed, 3 deletions(-) diff --git a/build.gradle.kts b/build.gradle.kts index 3186aed8c65..592dc6498cd 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -105,7 +105,6 @@ extra["JDK_9"] = jdkPathIfFound("9") extra["versions.protobuf-java"] = "2.6.1" extra["versions.javax.inject"] = "1" extra["versions.jsr305"] = "1.3.9" -extra["versions.cli-parser"] = "1.1.2" extra["versions.jansi"] = "1.16" extra["versions.jline"] = "3.3.1" extra["versions.junit"] = "4.12" diff --git a/prepare/compiler/build.gradle.kts b/prepare/compiler/build.gradle.kts index edc9081039a..730c0c5a181 100644 --- a/prepare/compiler/build.gradle.kts +++ b/prepare/compiler/build.gradle.kts @@ -64,7 +64,6 @@ dependencies { fatJarContents(commonDep("org.jline", "jline")) fatJarContents(commonDep("org.fusesource.jansi", "jansi")) fatJarContents(protobufFull()) - fatJarContents(commonDep("com.github.spullara.cli-parser", "cli-parser")) fatJarContents(commonDep("com.google.code.findbugs", "jsr305")) fatJarContents(commonDep("io.javaslang", "javaslang")) fatJarContents(preloadedDeps("json-org")) diff --git a/prepare/idea-plugin/build.gradle.kts b/prepare/idea-plugin/build.gradle.kts index ccd3fb63bdf..60c924fa85d 100644 --- a/prepare/idea-plugin/build.gradle.kts +++ b/prepare/idea-plugin/build.gradle.kts @@ -77,7 +77,6 @@ val packedJars by configurations.creating val sideJars by configurations.creating dependencies { - packedJars(commonDep("com.github.spullara.cli-parser", "cli-parser")) packedJars(preloadedDeps("protobuf-${rootProject.extra["versions.protobuf-java"]}")) packedJars(project(":kotlin-stdlib", configuration = "builtins")) sideJars(projectDist(":kotlin-script-runtime")) From 16a97a89175588ad85402962041279b934e2ea2b Mon Sep 17 00:00:00 2001 From: Dmitry Jemerov Date: Wed, 27 Sep 2017 16:45:56 +0200 Subject: [PATCH 105/212] Mark multiplatform projects as experimental in the UI --- .../configuration/GradleKotlinFrameworkSupportProvider.kt | 6 +++--- .../configuration/KotlinGradleMultiplatformModuleBuilder.kt | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/idea/idea-gradle/src/org/jetbrains/kotlin/idea/configuration/GradleKotlinFrameworkSupportProvider.kt b/idea/idea-gradle/src/org/jetbrains/kotlin/idea/configuration/GradleKotlinFrameworkSupportProvider.kt index 4b13993f84d..5a7a2a6d0b1 100644 --- a/idea/idea-gradle/src/org/jetbrains/kotlin/idea/configuration/GradleKotlinFrameworkSupportProvider.kt +++ b/idea/idea-gradle/src/org/jetbrains/kotlin/idea/configuration/GradleKotlinFrameworkSupportProvider.kt @@ -138,7 +138,7 @@ open class GradleKotlinJSFrameworkSupportProvider(frameworkTypeId: String = "KOT } open class GradleKotlinMPPCommonFrameworkSupportProvider : - GradleKotlinFrameworkSupportProvider("KOTLIN_MPP_COMMON", "Kotlin (Multiplatform - Common)", KotlinIcons.SMALL_LOGO) { + GradleKotlinFrameworkSupportProvider("KOTLIN_MPP_COMMON", "Kotlin (Multiplatform Common - Experimental)", KotlinIcons.SMALL_LOGO) { override fun getPluginId() = "kotlin-platform-common" override fun getDependencies(sdk: Sdk?) = listOf(MAVEN_COMMON_STDLIB_ID) @@ -148,7 +148,7 @@ open class GradleKotlinMPPCommonFrameworkSupportProvider : } class GradleKotlinMPPJavaFrameworkSupportProvider - : GradleKotlinJavaFrameworkSupportProvider("KOTLIN_MPP_JVM", "Kotlin (Multiplatform - JVM)") { + : GradleKotlinJavaFrameworkSupportProvider("KOTLIN_MPP_JVM", "Kotlin (Multiplatform JVM - Experimental)") { override fun getPluginId() = "kotlin-platform-jvm" override fun getDescription() = "JVM-specific code for a Kotlin multiplatform project" @@ -156,7 +156,7 @@ class GradleKotlinMPPJavaFrameworkSupportProvider } class GradleKotlinMPPJSFrameworkSupportProvider - : GradleKotlinJSFrameworkSupportProvider("KOTLIN_MPP_JS", "Kotlin (Multiplatform - JS)") { + : GradleKotlinJSFrameworkSupportProvider("KOTLIN_MPP_JS", "Kotlin (Multiplatform JS - Experimental)") { override fun getPluginId() = "kotlin-platform-js" override fun getDescription() = "JavaScript-specific code for a Kotlin multiplatform project" diff --git a/idea/idea-gradle/src/org/jetbrains/kotlin/idea/configuration/KotlinGradleMultiplatformModuleBuilder.kt b/idea/idea-gradle/src/org/jetbrains/kotlin/idea/configuration/KotlinGradleMultiplatformModuleBuilder.kt index 3d44012c2ed..8ef5c51d8aa 100644 --- a/idea/idea-gradle/src/org/jetbrains/kotlin/idea/configuration/KotlinGradleMultiplatformModuleBuilder.kt +++ b/idea/idea-gradle/src/org/jetbrains/kotlin/idea/configuration/KotlinGradleMultiplatformModuleBuilder.kt @@ -40,7 +40,7 @@ class KotlinGradleMultiplatformModuleBuilder : GradleModuleBuilder() { override fun getNodeIcon() = KotlinIcons.SMALL_LOGO - override fun getPresentableName() = "Kotlin (Multiplatform)" + override fun getPresentableName() = "Kotlin (Multiplatform - Experimental)" override fun getDescription() = "Multiplatform projects allow reusing the same code between multiple platforms supported by Kotlin. Such projects are built with Gradle." From 77765a80640094de31db96778dbd0a65bbc5f661 Mon Sep 17 00:00:00 2001 From: Alexander Udalov Date: Tue, 26 Sep 2017 17:17:01 +0300 Subject: [PATCH 106/212] Do not run proguard by default, unless "kotlin.build.proguard" is "true" --- prepare/compiler/build.gradle.kts | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/prepare/compiler/build.gradle.kts b/prepare/compiler/build.gradle.kts index 730c0c5a181..0c2df80e723 100644 --- a/prepare/compiler/build.gradle.kts +++ b/prepare/compiler/build.gradle.kts @@ -21,8 +21,11 @@ plugins { `java` } -// Set to false to disable proguard run on kotlin-compiler.jar. Speeds up the build -val shrink = true +// You can run Gradle with "-Pkotlin.build.proguard=true" to enable ProGuard run on kotlin-compiler.jar (on TeamCity, ProGuard always runs) +val shrink = + findProperty("kotlin.build.proguard")?.toString()?.toBoolean() + ?: hasProperty("teamcity") + val compilerManifestClassPath = "kotlin-stdlib.jar kotlin-reflect.jar kotlin-script-runtime.jar" @@ -120,11 +123,12 @@ noDefaultJar() cleanArtifacts() -dist(targetName = compilerBaseName + ".jar", - fromTask = if (shrink) proguard - else packCompiler) +val pack = if (shrink) proguard else packCompiler -runtimeJarArtifactBy(proguard, proguard.outputs.files.singleFile) { +dist(targetName = compilerBaseName + ".jar", + fromTask = pack) + +runtimeJarArtifactBy(pack, pack.outputs.files.singleFile) { name = compilerBaseName classifier = "" } From 4a0ad54829aa7b2e4c22eca08dbd42131b732c9c Mon Sep 17 00:00:00 2001 From: Stanislav Erokhin Date: Wed, 27 Sep 2017 21:23:00 +0300 Subject: [PATCH 107/212] Fix Working with the project in IntelliJ IDEA instruction --- ReadMe.md | 2 -- 1 file changed, 2 deletions(-) diff --git a/ReadMe.md b/ReadMe.md index 1e2cec4c29f..2a898773630 100644 --- a/ReadMe.md +++ b/ReadMe.md @@ -87,8 +87,6 @@ Refer to [libraries/ReadMe.md](libraries/ReadMe.md) for details. Working with the Kotlin project requires IntelliJ IDEA 2017.3. You can download an Early Access Preview version of IntelliJ IDEA 2017.3 [here](https://www.jetbrains.com/idea/nextversion/). -The [root Kotlin project](https://github.com/JetBrains/kotlin) should be imported into IDEA as gradle project. - To import the project in Intellij choose project directory in Open project dialog. Then, after project opened, Select `File` -> `New...` -> `Module from Existing Sources` in the menu, and select `build.gradle.kts` file in the project's root folder. From e7e28419e4b1fd58159ed5b440c2c5995cc7cb34 Mon Sep 17 00:00:00 2001 From: Mikhael Bogdanov Date: Wed, 27 Sep 2017 09:46:39 +0200 Subject: [PATCH 108/212] Migrate CodegenJdkCommonTestSuite.kt to gradle --- compiler/build.gradle.kts | 44 ++++++++++- .../test/clientserver/TestProcessServer.kt | 33 +++++++- .../codegen/CodegenJdkCommonTestSuite.kt | 77 ------------------- 3 files changed, 73 insertions(+), 81 deletions(-) delete mode 100644 compiler/tests/org/jetbrains/kotlin/codegen/CodegenJdkCommonTestSuite.kt diff --git a/compiler/build.gradle.kts b/compiler/build.gradle.kts index 1f523529483..5b5b6b94aae 100644 --- a/compiler/build.gradle.kts +++ b/compiler/build.gradle.kts @@ -85,8 +85,12 @@ evaluationDependsOn(":compiler:tests-common-jvm6") fun Project.codegenTest(taskName: String, jdk: String, body: Test.() -> Unit): Test = projectTest(taskName) { dependsOn(*testDistProjects.map { "$it:dist" }.toTypedArray()) workingDir = rootDir - environment("TEST_SERVER_CLASSES_DIRS", project(":compiler:tests-common-jvm6").the().sourceSets.getByName("main").output.classesDirs.asPath) - filter.includeTestsMatching("org.jetbrains.kotlin.codegen.CodegenJdkCommonTestSuite*") + + filter.includeTestsMatching("org.jetbrains.kotlin.codegen.BlackBoxCodegenTestGenerated*") + filter.includeTestsMatching("org.jetbrains.kotlin.codegen.BlackBoxInlineCodegenTestGenerated*") + filter.includeTestsMatching("org.jetbrains.kotlin.codegen.CompileKotlinAgainstInlineKotlinTestGenerated*") + filter.includeTestsMatching("org.jetbrains.kotlin.codegen.CompileKotlinAgainstKotlinTestGenerated*") + filter.includeTestsMatching("org.jetbrains.kotlin.codegen.BlackBoxAgainstJavaCodegenTestGenerated*") if (jdk == "JDK_9") { jvmArgs = listOf("--add-opens", "java.desktop/javax.swing=ALL-UNNAMED", "--add-opens", "java.base/java.io=ALL-UNNAMED") @@ -105,9 +109,43 @@ fun Project.codegenTest(taskName: String, jdk: String, body: Test.() -> Unit): T } codegenTest("codegen-target6-jvm6-test", "JDK_18") { + dependsOn(":compiler:tests-common-jvm6:build") + + //TODO make port flexible + val port = "5100" + var jdkProcess: Process? = null + + doFirst { + logger.info("Configuring JDK 6 server...") + val jdkPath = project.property("JDK_16") ?: error("JDK_16 is not optional to run this test") + val executable = "$jdkPath/bin/java" + val main = "org.jetbrains.kotlin.test.clientserver.TestProcessServer" + + val classpath = getSourceSetsFrom(":compiler:tests-common-jvm6")["main"].output.asPath + ":" + + getSourceSetsFrom(":kotlin-stdlib")["main"].output.asPath + ":" + + getSourceSetsFrom(":kotlin-stdlib")["builtins"].output.asPath + ":" + + getSourceSetsFrom(":kotlin-test:kotlin-test-jvm")["main"].output.asPath + + logger.debug("Server classpath: $classpath") + + val builder = ProcessBuilder(executable, "-cp", classpath, main, port) + builder.directory(rootDir) + + builder.inheritIO() + builder.redirectErrorStream(true) + + logger.info("Starting JDK 6 server $executable") + jdkProcess = builder.start() + + } systemProperty("kotlin.test.default.jvm.target", "1.6") systemProperty("kotlin.test.java.compilation.target", "1.6") - systemProperty("kotlin.test.box.in.separate.process.port", "5100") + systemProperty("kotlin.test.box.in.separate.process.port", port) + + doLast { + logger.info("Stopping JDK 6 server...") + jdkProcess?.destroy() + } } codegenTest("codegen-target6-jvm9-test", "JDK_9") { diff --git a/compiler/tests-common-jvm6/src/org/jetbrains/kotlin/test/clientserver/TestProcessServer.kt b/compiler/tests-common-jvm6/src/org/jetbrains/kotlin/test/clientserver/TestProcessServer.kt index 86aa3c50a40..5033a1cf23e 100644 --- a/compiler/tests-common-jvm6/src/org/jetbrains/kotlin/test/clientserver/TestProcessServer.kt +++ b/compiler/tests-common-jvm6/src/org/jetbrains/kotlin/test/clientserver/TestProcessServer.kt @@ -25,6 +25,8 @@ import java.net.Socket import java.net.URL import java.net.URLClassLoader import java.util.concurrent.Executors +import java.util.concurrent.ScheduledFuture +import java.util.concurrent.TimeUnit fun getGeneratedClass(classLoader: ClassLoader, className: String): Class<*> { try { @@ -47,7 +49,19 @@ fun getBoxMethodOrNull(aClass: Class<*>): Method? { //Use only JDK 1.6 compatible api object TestProcessServer { - val executor = Executors.newFixedThreadPool(1)!! + private val executor = Executors.newFixedThreadPool(1)!! + + @Volatile + private var isProcessingTask = true + + @Volatile + private var lastTime = System.currentTimeMillis() + + private val scheduler = Executors.newScheduledThreadPool(1) + + private lateinit var handler: ScheduledFuture<*> + + private lateinit var serverSocket: ServerSocket @JvmStatic fun main(args: Array) { @@ -55,17 +69,34 @@ object TestProcessServer { println("Starting server on port $portNumber...") val serverSocket = ServerSocket(portNumber) + sheduleShutdownProcess() + try { while (true) { + lastTime = System.currentTimeMillis() + isProcessingTask = false val clientSocket = serverSocket.accept() + isProcessingTask = true println("Socket established...") executor.execute(ServerTest(clientSocket)) } } finally { + handler.cancel(false) + scheduler.shutdown() serverSocket.close() + println("Server stopped!") } } + + private fun sheduleShutdownProcess() { + handler = scheduler.scheduleAtFixedRate({ + if (!isProcessingTask && (System.currentTimeMillis() - lastTime) >= 60 * 1000 /*60 sec*/) { + println("Stopping server...") + serverSocket.close() + } + }, 60, 60, TimeUnit.SECONDS) + } } private class ServerTest(val clientSocket: Socket) : Runnable { diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/CodegenJdkCommonTestSuite.kt b/compiler/tests/org/jetbrains/kotlin/codegen/CodegenJdkCommonTestSuite.kt deleted file mode 100644 index 4ac90f87d9d..00000000000 --- a/compiler/tests/org/jetbrains/kotlin/codegen/CodegenJdkCommonTestSuite.kt +++ /dev/null @@ -1,77 +0,0 @@ -/* - * Copyright 2010-2017 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.codegen - -import org.jetbrains.kotlin.test.clientserver.TestProcessServer -import org.jetbrains.kotlin.codegen.forTestCompile.ForTestCompileRuntime -import org.junit.AfterClass -import org.junit.Assert.assertNotNull -import org.junit.BeforeClass -import org.junit.runner.RunWith -import org.junit.runners.Suite -import java.io.File - -/** - * This suite is used to run java codegen tests under jdk 1.6, 1.8 and 9 - * with different default targets - 1.6, 1.8, 1.9. - */ -@RunWith(Suite::class) -@Suite.SuiteClasses( - BlackBoxCodegenTestGenerated::class, - BlackBoxInlineCodegenTestGenerated::class, - CompileKotlinAgainstInlineKotlinTestGenerated::class, - CompileKotlinAgainstKotlinTestGenerated::class, - BlackBoxAgainstJavaCodegenTestGenerated::class -) -object CodegenJdkCommonTestSuite { - - private var jdkProcess: Process? = null - - @BeforeClass - @JvmStatic - fun setUp() { - val boxInSeparateProcessPort = System.getProperty(CodegenTestCase.RUN_BOX_TEST_IN_SEPARATE_PROCESS_PORT) - if (boxInSeparateProcessPort != null) { - val classpath = (System.getenv("TEST_SERVER_CLASSES_DIRS") ?: "out/test/tests-common") + - File.pathSeparatorChar + - ForTestCompileRuntime.runtimeJarForTests() + - File.pathSeparatorChar + - ForTestCompileRuntime.kotlinTestJarForTests() - - val jdk16 = System.getenv("JDK_16") - assertNotNull(jdk16, "Please specify JDK_16 system property to run codegen test in separate process") - - val builder = ProcessBuilder( - jdk16 + "/bin/java", "-cp", classpath, - TestProcessServer::class.java.name, boxInSeparateProcessPort - ) - println("Starting separate process to run test: " + builder.command().joinToString()) - builder.inheritIO() - builder.redirectErrorStream(true) - jdkProcess = builder.start() - } - } - - @AfterClass - @JvmStatic - fun tearDown() { - if (jdkProcess != null) { - println("Stop separate test process") - jdkProcess!!.destroy() - } - } -} From 7b5842a088bd9c995ffc497e50db0af55366babf Mon Sep 17 00:00:00 2001 From: Mikhail Glukhikh Date: Thu, 28 Sep 2017 13:54:30 +0300 Subject: [PATCH 109/212] Fix inspection test --- .../inspectionData/expected.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/idea/testData/inspections/replaceArrayEqualityOpWithArraysEquals/inspectionData/expected.xml b/idea/testData/inspections/replaceArrayEqualityOpWithArraysEquals/inspectionData/expected.xml index 8a280eed640..5a16ebbe2d2 100644 --- a/idea/testData/inspections/replaceArrayEqualityOpWithArraysEquals/inspectionData/expected.xml +++ b/idea/testData/inspections/replaceArrayEqualityOpWithArraysEquals/inspectionData/expected.xml @@ -5,7 +5,7 @@ light_idea_test_case Replace '==' with 'Arrays.equals' - Replace '==' with 'Arrays.equals' + Replace '==' with 'contentEquals' test.kt @@ -13,6 +13,6 @@ light_idea_test_case Replace '!=' with 'Arrays.equals' - Replace '!=' with 'Arrays.equals' + Replace '!=' with 'contentEquals' \ No newline at end of file From 94356e891b957dd46da3aa8ff5c6461e9b513a2d Mon Sep 17 00:00:00 2001 From: Denis Zharkov Date: Tue, 15 Aug 2017 12:27:21 +0700 Subject: [PATCH 110/212] Introduce ResolutionScope::definitelyDoesNotContainName Also add some obvious implementations This method might be used in resolution to filter out inapplicable scopes --- .../kotlin/resolve/scopes/LexicalScopeStorage.kt | 3 +++ .../src/org/jetbrains/kotlin/resolve/scopes/Scopes.kt | 4 ++++ .../kotlin/resolve/scopes/InnerClassesScopeWrapper.kt | 2 ++ .../jetbrains/kotlin/resolve/scopes/ResolutionScope.kt | 7 ++++++- .../kotlin/resolve/scopes/SubstitutingScope.kt | 2 ++ .../src/org/jetbrains/kotlin/types/ErrorUtils.java | 10 ++++++++++ .../deserialization/MetadataPackageFragmentProvider.kt | 1 + 7 files changed, 28 insertions(+), 1 deletion(-) diff --git a/compiler/resolution/src/org/jetbrains/kotlin/resolve/scopes/LexicalScopeStorage.kt b/compiler/resolution/src/org/jetbrains/kotlin/resolve/scopes/LexicalScopeStorage.kt index c4102719b4c..f2e67b63155 100644 --- a/compiler/resolution/src/org/jetbrains/kotlin/resolve/scopes/LexicalScopeStorage.kt +++ b/compiler/resolution/src/org/jetbrains/kotlin/resolve/scopes/LexicalScopeStorage.kt @@ -124,4 +124,7 @@ abstract class LexicalScopeStorage( } while (rest != null) return result } + + override fun definitelyDoesNotContainName(name: Name) = + functionsByName?.get(name) == null && variablesAndClassifiersByName?.get(name) == null } diff --git a/compiler/resolution/src/org/jetbrains/kotlin/resolve/scopes/Scopes.kt b/compiler/resolution/src/org/jetbrains/kotlin/resolve/scopes/Scopes.kt index 2c4ed9ece15..dbeae8096ee 100644 --- a/compiler/resolution/src/org/jetbrains/kotlin/resolve/scopes/Scopes.kt +++ b/compiler/resolution/src/org/jetbrains/kotlin/resolve/scopes/Scopes.kt @@ -55,6 +55,8 @@ interface LexicalScope : HierarchicalScope { override val kind: LexicalScopeKind get() = LexicalScopeKind.EMPTY + override fun definitelyDoesNotContainName(name: Name) = true + override fun printStructure(p: Printer) { p.println("Base lexical scope with owner = $ownerDescriptor and parent = $parent") } @@ -123,6 +125,8 @@ interface ImportingScope : HierarchicalScope { override fun printStructure(p: Printer) { p.println("ImportingScope.Empty") } + + override fun definitelyDoesNotContainName(name: Name) = true } } diff --git a/core/descriptors/src/org/jetbrains/kotlin/resolve/scopes/InnerClassesScopeWrapper.kt b/core/descriptors/src/org/jetbrains/kotlin/resolve/scopes/InnerClassesScopeWrapper.kt index 23f5fcc7c6a..c0add4fc0dc 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/resolve/scopes/InnerClassesScopeWrapper.kt +++ b/core/descriptors/src/org/jetbrains/kotlin/resolve/scopes/InnerClassesScopeWrapper.kt @@ -40,5 +40,7 @@ class InnerClassesScopeWrapper(val workerScope: MemberScope) : MemberScopeImpl() workerScope.printScopeStructure(p) } + override fun definitelyDoesNotContainName(name: Name) = workerScope.definitelyDoesNotContainName(name) + override fun toString() = "Classes from $workerScope" } diff --git a/core/descriptors/src/org/jetbrains/kotlin/resolve/scopes/ResolutionScope.kt b/core/descriptors/src/org/jetbrains/kotlin/resolve/scopes/ResolutionScope.kt index 8c7fcf3f24d..c5e993f1532 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/resolve/scopes/ResolutionScope.kt +++ b/core/descriptors/src/org/jetbrains/kotlin/resolve/scopes/ResolutionScope.kt @@ -16,7 +16,10 @@ package org.jetbrains.kotlin.resolve.scopes -import org.jetbrains.kotlin.descriptors.* +import org.jetbrains.kotlin.descriptors.ClassifierDescriptor +import org.jetbrains.kotlin.descriptors.DeclarationDescriptor +import org.jetbrains.kotlin.descriptors.FunctionDescriptor +import org.jetbrains.kotlin.descriptors.VariableDescriptor import org.jetbrains.kotlin.incremental.components.LookupLocation import org.jetbrains.kotlin.name.Name @@ -36,4 +39,6 @@ interface ResolutionScope { kindFilter: DescriptorKindFilter = DescriptorKindFilter.ALL, nameFilter: (Name) -> Boolean = MemberScope.ALL_NAME_FILTER ): Collection + + fun definitelyDoesNotContainName(name: Name): Boolean = false } diff --git a/core/descriptors/src/org/jetbrains/kotlin/resolve/scopes/SubstitutingScope.kt b/core/descriptors/src/org/jetbrains/kotlin/resolve/scopes/SubstitutingScope.kt index 83de7362900..28ede538058 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/resolve/scopes/SubstitutingScope.kt +++ b/core/descriptors/src/org/jetbrains/kotlin/resolve/scopes/SubstitutingScope.kt @@ -82,6 +82,8 @@ class SubstitutingScope(private val workerScope: MemberScope, givenSubstitutor: override fun getFunctionNames() = workerScope.getFunctionNames() override fun getVariableNames() = workerScope.getVariableNames() + override fun definitelyDoesNotContainName(name: Name) = workerScope.definitelyDoesNotContainName(name) + override fun printScopeStructure(p: Printer) { p.println(this::class.java.simpleName, " {") p.pushIndent() diff --git a/core/descriptors/src/org/jetbrains/kotlin/types/ErrorUtils.java b/core/descriptors/src/org/jetbrains/kotlin/types/ErrorUtils.java index a6d3856fae6..a80682a6186 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/types/ErrorUtils.java +++ b/core/descriptors/src/org/jetbrains/kotlin/types/ErrorUtils.java @@ -219,6 +219,11 @@ public class ErrorUtils { return Collections.emptyList(); } + @Override + public boolean definitelyDoesNotContainName(@NotNull Name name) { + return false; + } + @Override public String toString() { return "ErrorScope{" + debugMessage + '}'; @@ -279,6 +284,11 @@ public class ErrorUtils { throw new IllegalStateException(); } + @Override + public boolean definitelyDoesNotContainName(@NotNull Name name) { + return false; + } + @Override public String toString() { return "ThrowingScope{" + debugMessage + '}'; diff --git a/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/MetadataPackageFragmentProvider.kt b/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/MetadataPackageFragmentProvider.kt index 71ee450c4e8..e0aff441439 100644 --- a/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/MetadataPackageFragmentProvider.kt +++ b/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/MetadataPackageFragmentProvider.kt @@ -106,6 +106,7 @@ class MetadataPackageFragment( containerSource = null, components = components, classNames = { emptyList() } ) { override fun hasClass(name: Name): Boolean = hasTopLevelClass(name) + override fun definitelyDoesNotContainName(name: Name) = false }) return ChainedMemberScope.create("Metadata scope", scopes) From fb80e19b8824780ac7468bae28e8223e3ce3e1c0 Mon Sep 17 00:00:00 2001 From: Denis Zharkov Date: Tue, 15 Aug 2017 13:20:30 +0700 Subject: [PATCH 111/212] Filter out inapplicable local scopes in call resolution The idea is that resolution has an approximate complexity close to (n + n*m) * 3 Where n is a number of scopes, m is a number of receivers and 3-constant is used because each of these combinations runs through 3 processors for functions. And while call resolver seems to be a hot spot, it should be useful to decreate the value of n --- .../calls/tower/NewResolutionOldInference.kt | 6 ++-- .../resolve/calls/KotlinCallResolver.kt | 4 +-- .../components/CallableReferenceResolver.kt | 2 +- .../resolve/calls/tower/TowerResolver.kt | 36 ++++++++++++------- 4 files changed, 29 insertions(+), 19 deletions(-) diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/tower/NewResolutionOldInference.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/tower/NewResolutionOldInference.kt index 70e096bcf32..7a5f1174eba 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/tower/NewResolutionOldInference.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/tower/NewResolutionOldInference.kt @@ -168,10 +168,10 @@ class NewResolutionOldInference( val processor = kind.createTowerProcessor(this, nameToResolve, tracing, scopeTower, detailedReceiver, context) if (context.collectAllCandidates) { - return allCandidatesResult(towerResolver.collectAllCandidates(scopeTower, processor)) + return allCandidatesResult(towerResolver.collectAllCandidates(scopeTower, processor, nameToResolve)) } - var candidates = towerResolver.runResolve(scopeTower, processor, useOrder = kind != ResolutionKind.CallableReference) + var candidates = towerResolver.runResolve(scopeTower, processor, useOrder = kind != ResolutionKind.CallableReference, name = nameToResolve) // Temporary hack to resolve 'rem' as 'mod' if the first is do not present val emptyOrInapplicableCandidates = candidates.isEmpty() || @@ -179,7 +179,7 @@ class NewResolutionOldInference( if (isBinaryRemOperator && shouldUseOperatorRem && emptyOrInapplicableCandidates) { val deprecatedName = OperatorConventions.REM_TO_MOD_OPERATION_NAMES[name] val processorForDeprecatedName = kind.createTowerProcessor(this, deprecatedName!!, tracing, scopeTower, detailedReceiver, context) - candidates = towerResolver.runResolve(scopeTower, processorForDeprecatedName, useOrder = kind != ResolutionKind.CallableReference) + candidates = towerResolver.runResolve(scopeTower, processorForDeprecatedName, useOrder = kind != ResolutionKind.CallableReference, name = deprecatedName) } if (candidates.isEmpty()) { diff --git a/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/KotlinCallResolver.kt b/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/KotlinCallResolver.kt index 12d4457ddc9..3326fc6d30e 100644 --- a/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/KotlinCallResolver.kt +++ b/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/KotlinCallResolver.kt @@ -55,11 +55,11 @@ class KotlinCallResolver( } if (collectAllCandidates) { - val allCandidates = towerResolver.collectAllCandidates(scopeTower, processor) + val allCandidates = towerResolver.collectAllCandidates(scopeTower, processor, kotlinCall.name) return kotlinCallCompleter.createAllCandidatesResult(allCandidates, expectedType, resolutionCallbacks) } - val candidates = towerResolver.runResolve(scopeTower, processor, useOrder = kotlinCall.callKind != KotlinCallKind.UNSUPPORTED) + val candidates = towerResolver.runResolve(scopeTower, processor, useOrder = kotlinCall.callKind != KotlinCallKind.UNSUPPORTED, name = kotlinCall.name) return choseMostSpecific(candidateFactory, resolutionCallbacks, expectedType, candidates) } diff --git a/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/components/CallableReferenceResolver.kt b/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/components/CallableReferenceResolver.kt index c53ca974002..35e5496f9d3 100644 --- a/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/components/CallableReferenceResolver.kt +++ b/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/components/CallableReferenceResolver.kt @@ -115,7 +115,7 @@ class CallableReferenceResolver( ): Set { val factory = CallableReferencesCandidateFactory(callableReference, callComponents, scopeTower, compatibilityChecker, expectedType) val processor = createCallableReferenceProcessor(factory) - val candidates = towerResolver.runResolve(scopeTower, processor, useOrder = true) + val candidates = towerResolver.runResolve(scopeTower, processor, useOrder = true, name = callableReference.rhsName) return callableReferenceOverloadConflictResolver.chooseMaximallySpecificCandidates( candidates, CheckArgumentTypesMode.CHECK_VALUE_ARGUMENTS, diff --git a/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/tower/TowerResolver.kt b/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/tower/TowerResolver.kt index b97fac2e46b..d1051e918a4 100644 --- a/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/tower/TowerResolver.kt +++ b/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/tower/TowerResolver.kt @@ -16,12 +16,15 @@ package org.jetbrains.kotlin.resolve.calls.tower +import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.progress.ProgressIndicatorAndCompilationCanceledStatus import org.jetbrains.kotlin.resolve.calls.tasks.ExplicitReceiverKind import org.jetbrains.kotlin.resolve.scopes.ImportingScope import org.jetbrains.kotlin.resolve.scopes.LexicalScope +import org.jetbrains.kotlin.resolve.scopes.ResolutionScope import org.jetbrains.kotlin.resolve.scopes.receivers.ReceiverValueWithSmartCastInfo import org.jetbrains.kotlin.resolve.scopes.utils.parentsWithSelf +import org.jetbrains.kotlin.util.OperatorNameConventions import java.util.* interface Candidate { @@ -74,14 +77,16 @@ class TowerResolver { fun runResolve( scopeTower: ImplicitScopeTower, processor: ScopeTowerProcessor, - useOrder: Boolean - ): Collection = scopeTower.run(processor, SuccessfulResultCollector(), useOrder) + useOrder: Boolean, + name: Name + ): Collection = scopeTower.run(processor, SuccessfulResultCollector(), useOrder, name) fun collectAllCandidates( scopeTower: ImplicitScopeTower, - processor: ScopeTowerProcessor + processor: ScopeTowerProcessor, + name: Name ): Collection - = scopeTower.run(processor, AllCandidatesCollector(), false) + = scopeTower.run(processor, AllCandidatesCollector(), false, name) private fun ImplicitScopeTower.createNonLocalLevels(): List { val result = ArrayList() @@ -103,14 +108,11 @@ class TowerResolver { private fun ImplicitScopeTower.run( processor: ScopeTowerProcessor, resultCollector: ResultCollector, - useOrder: Boolean + useOrder: Boolean, + name: Name ): Collection { fun TowerData.process() = processTowerData(processor, resultCollector, useOrder, this) - val localLevels = lexicalScope.parentsWithSelf. - filterIsInstance().filter { it.kind.withLocalDescriptors }. - map { ScopeBasedTowerLevel(this@run, it) } - // Lazy calculation var nonLocalLevels: Collection? = null val hidesMembersLevel = HidesMembersTowerLevel(this) @@ -123,6 +125,11 @@ class TowerResolver { // synthetic property for explicit receiver TowerData.TowerLevel(syntheticLevel).process()?.let { return it } + val localLevels = + lexicalScope.parentsWithSelf. + filterIsInstance().filter { it.kind.withLocalDescriptors && it.mayFitForName(name) }. + map { ScopeBasedTowerLevel(this@run, it) }.toList() + // local non-extensions or extension for explicit receiver for (localLevel in localLevels) { TowerData.TowerLevel(localLevel).process()?.let { return it } @@ -173,6 +180,9 @@ class TowerResolver { return resultCollector.getFinalCandidates() } + private fun ResolutionScope.mayFitForName(name: Name) = + !definitelyDoesNotContainName(name) || !definitelyDoesNotContainName(OperatorNameConventions.INVOKE) + fun runWithEmptyTowerData( processor: ScopeTowerProcessor, resultCollector: ResultCollector, @@ -234,7 +244,7 @@ class TowerResolver { val firstGroupWithResolved = candidateGroups.firstOrNull { it.any { it.resultingApplicability == ResolutionCandidateApplicability.RESOLVED } } ?: return null - + return firstGroupWithResolved.filter { it.resultingApplicability == ResolutionCandidateApplicability.RESOLVED } } @@ -261,8 +271,8 @@ class TowerResolver { return moreSuitableGroup.filter { it.resultingApplicability == groupApplicability } } - - private val Collection.groupApplicability get() = - minBy { it.resultingApplicability }?.resultingApplicability ?: ResolutionCandidateApplicability.HIDDEN + + private val Collection.groupApplicability get() = + minBy { it.resultingApplicability }?.resultingApplicability ?: ResolutionCandidateApplicability.HIDDEN } } From 688a35998590277e68b434adbb7933da89f58a32 Mon Sep 17 00:00:00 2001 From: Denis Zharkov Date: Tue, 15 Aug 2017 13:45:31 +0700 Subject: [PATCH 112/212] Avoid running scope processors on hides-member for not-forEach names --- .../kotlin/resolve/calls/tower/TowerResolver.kt | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/tower/TowerResolver.kt b/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/tower/TowerResolver.kt index d1051e918a4..83c9f7ab97c 100644 --- a/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/tower/TowerResolver.kt +++ b/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/tower/TowerResolver.kt @@ -19,6 +19,7 @@ package org.jetbrains.kotlin.resolve.calls.tower import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.progress.ProgressIndicatorAndCompilationCanceledStatus import org.jetbrains.kotlin.resolve.calls.tasks.ExplicitReceiverKind +import org.jetbrains.kotlin.resolve.descriptorUtil.HIDES_MEMBERS_NAME_LIST import org.jetbrains.kotlin.resolve.scopes.ImportingScope import org.jetbrains.kotlin.resolve.scopes.LexicalScope import org.jetbrains.kotlin.resolve.scopes.ResolutionScope @@ -118,8 +119,11 @@ class TowerResolver { val hidesMembersLevel = HidesMembersTowerLevel(this) val syntheticLevel = SyntheticScopeBasedTowerLevel(this, syntheticScopes) - // hides members extensions for explicit receiver - TowerData.TowerLevel(hidesMembersLevel).process()?.let { return it } + if (name in HIDES_MEMBERS_NAME_LIST) { + // hides members extensions for explicit receiver + TowerData.TowerLevel(hidesMembersLevel).process()?.let { return it } + } + // possibly there is explicit member TowerData.Empty.process()?.let { return it } // synthetic property for explicit receiver @@ -144,8 +148,10 @@ class TowerResolver { val implicitReceiver = getImplicitReceiver(scope) if (implicitReceiver != null) { - // hides members extensions - TowerData.BothTowerLevelAndImplicitReceiver(hidesMembersLevel, implicitReceiver).process()?.let { return it } + if (name in HIDES_MEMBERS_NAME_LIST) { + // hides members extensions + TowerData.BothTowerLevelAndImplicitReceiver(hidesMembersLevel, implicitReceiver).process()?.let { return it } + } // members of implicit receiver or member extension for explicit receiver TowerData.TowerLevel(MemberScopeTowerLevel(this, implicitReceiver)).process()?.let { return it } From 1b255b4ed045d3dce5fcea8962987f4ff363f80f Mon Sep 17 00:00:00 2001 From: Denis Zharkov Date: Tue, 15 Aug 2017 17:31:32 +0700 Subject: [PATCH 113/212] Implement LazyPackageMemberScope::getFunctions/VariableNames It's necessary for future optimizations Although current implementation is rather conservative, it should be enough for current needs --- .../repl/DelegatePackageMemberDeclarationProvider.kt | 2 ++ .../synthetics/SyntheticClassOrObjectDescriptor.kt | 1 + .../AbstractPsiBasedDeclarationProvider.kt | 12 +++++++++++- .../CombinedPackageMemberDeclarationProvider.kt | 2 ++ .../resolve/lazy/declarations/DeclarationProvider.kt | 2 ++ .../lazy/descriptors/LazyPackageMemberScope.kt | 3 +++ .../StubBasedPackageMemberDeclarationProvider.kt | 4 ++++ 7 files changed, 25 insertions(+), 1 deletion(-) diff --git a/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/repl/DelegatePackageMemberDeclarationProvider.kt b/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/repl/DelegatePackageMemberDeclarationProvider.kt index a32b50bb5e6..623a52937a3 100644 --- a/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/repl/DelegatePackageMemberDeclarationProvider.kt +++ b/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/repl/DelegatePackageMemberDeclarationProvider.kt @@ -41,4 +41,6 @@ open class DelegatePackageMemberDeclarationProvider(var delegate: PackageMemberD override fun getClassOrObjectDeclarations(name: Name) = delegate.getClassOrObjectDeclarations(name) override fun getTypeAliasDeclarations(name: Name) = delegate.getTypeAliasDeclarations(name) + + override fun getDeclarationNames() = delegate.getDeclarationNames() } diff --git a/compiler/frontend/src/org/jetbrains/kotlin/psi/synthetics/SyntheticClassOrObjectDescriptor.kt b/compiler/frontend/src/org/jetbrains/kotlin/psi/synthetics/SyntheticClassOrObjectDescriptor.kt index a567600436d..b1383c458dd 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/psi/synthetics/SyntheticClassOrObjectDescriptor.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/psi/synthetics/SyntheticClassOrObjectDescriptor.kt @@ -131,6 +131,7 @@ class SyntheticClassOrObjectDescriptor( override fun getDestructuringDeclarationsEntries(name: Name): Collection = emptyList() override fun getClassOrObjectDeclarations(name: Name): Collection = emptyList() override fun getTypeAliasDeclarations(name: Name): Collection = emptyList() + override fun getDeclarationNames() = emptySet() } internal inner class SyntheticDeclaration( diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/declarations/AbstractPsiBasedDeclarationProvider.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/declarations/AbstractPsiBasedDeclarationProvider.kt index e68a698bd30..4d0e1c5c7c0 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/declarations/AbstractPsiBasedDeclarationProvider.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/declarations/AbstractPsiBasedDeclarationProvider.kt @@ -17,6 +17,7 @@ package org.jetbrains.kotlin.resolve.lazy.declarations import com.google.common.collect.ArrayListMultimap +import com.google.common.collect.Sets import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.resolve.lazy.ResolveSessionUtils.safeNameForLazyResolve @@ -37,6 +38,7 @@ abstract class AbstractPsiBasedDeclarationProvider(storageManager: StorageManage val classesAndObjects = ArrayListMultimap.create() // order matters here val typeAliases = ArrayListMultimap.create() val destructuringDeclarationsEntries = ArrayListMultimap.create() + val names = Sets.newHashSet() fun putToIndex(declaration: KtDeclaration) { if (declaration is KtAnonymousInitializer || declaration is KtSecondaryConstructor) return @@ -57,7 +59,9 @@ abstract class AbstractPsiBasedDeclarationProvider(storageManager: StorageManage } is KtDestructuringDeclaration -> { for (entry in declaration.entries) { - destructuringDeclarationsEntries.put(safeNameForLazyResolve(entry.nameAsName), entry) + val name = safeNameForLazyResolve(entry.nameAsName) + destructuringDeclarationsEntries.put(name, entry) + names.add(name) } } is KtParameter -> { @@ -65,11 +69,17 @@ abstract class AbstractPsiBasedDeclarationProvider(storageManager: StorageManage } else -> throw IllegalArgumentException("Unknown declaration: " + declaration) } + + when (declaration) { + is KtNamedDeclaration -> names.add(safeNameForLazyResolve(declaration)) + } } override fun toString() = "allDeclarations: " + allDeclarations.mapNotNull { it.name } } + override fun getDeclarationNames() = index().names + private val index = storageManager.createLazyValue { val index = Index() doCreateIndex(index) diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/declarations/CombinedPackageMemberDeclarationProvider.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/declarations/CombinedPackageMemberDeclarationProvider.kt index c457578d570..f3851057a73 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/declarations/CombinedPackageMemberDeclarationProvider.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/declarations/CombinedPackageMemberDeclarationProvider.kt @@ -41,4 +41,6 @@ class CombinedPackageMemberDeclarationProvider( override fun getClassOrObjectDeclarations(name: Name) = providers.flatMap { it.getClassOrObjectDeclarations(name) } override fun getTypeAliasDeclarations(name: Name) = providers.flatMap { it.getTypeAliasDeclarations(name) } + + override fun getDeclarationNames(): Set = providers.flatMapTo(HashSet()) { it.getDeclarationNames() } } diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/declarations/DeclarationProvider.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/declarations/DeclarationProvider.kt index 4957527f3ed..cf484b2588e 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/declarations/DeclarationProvider.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/declarations/DeclarationProvider.kt @@ -33,4 +33,6 @@ interface DeclarationProvider { fun getClassOrObjectDeclarations(name: Name): Collection fun getTypeAliasDeclarations(name: Name): Collection + + fun getDeclarationNames(): Set } diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/descriptors/LazyPackageMemberScope.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/descriptors/LazyPackageMemberScope.kt index 98932bdde9c..3b86bcc1d2e 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/descriptors/LazyPackageMemberScope.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/descriptors/LazyPackageMemberScope.kt @@ -58,6 +58,9 @@ class LazyPackageMemberScope( c.lookupTracker.record(from, thisDescriptor, name) } + override fun getFunctionNames() = declarationProvider.getDeclarationNames() + override fun getVariableNames() = declarationProvider.getDeclarationNames() + // Do not add details here, they may compromise the laziness during debugging override fun toString() = "lazy scope for package " + thisDescriptor.name } diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/stubindex/resolve/StubBasedPackageMemberDeclarationProvider.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/stubindex/resolve/StubBasedPackageMemberDeclarationProvider.kt index f2e8ecfc168..e4eef941c4d 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/stubindex/resolve/StubBasedPackageMemberDeclarationProvider.kt +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/stubindex/resolve/StubBasedPackageMemberDeclarationProvider.kt @@ -61,6 +61,10 @@ class StubBasedPackageMemberDeclarationProvider( return result } + override fun getDeclarationNames() = + getDeclarations(DescriptorKindFilter.ALL, { true }) + .mapTo(mutableSetOf()) { ResolveSessionUtils.safeNameForLazyResolve(it as KtNamedDeclaration) } + override fun getClassOrObjectDeclarations(name: Name): Collection { val result = ArrayList() runReadAction { From cd3edfc5b2326628663aae64a07ec073dde89554 Mon Sep 17 00:00:00 2001 From: Denis Zharkov Date: Tue, 15 Aug 2017 17:50:37 +0700 Subject: [PATCH 114/212] Introduce MemberScope::classifierNames and some implementations It aims to help with further optimizations --- .../lazy/descriptors/LazyPackageMemberScope.kt | 1 + .../load/java/lazy/descriptors/JvmPackageScope.kt | 5 +++++ .../load/java/lazy/descriptors/LazyJavaScope.kt | 2 ++ .../impl/EnumEntrySyntheticClassDescriptor.java | 6 ++++++ .../kotlin/descriptors/impl/SubpackagesScope.kt | 2 ++ .../kotlin/resolve/scopes/AbstractScopeAdapter.kt | 2 ++ .../kotlin/resolve/scopes/ChainedMemberScope.kt | 1 + .../kotlin/resolve/scopes/InnerClassesScopeWrapper.kt | 4 ++++ .../jetbrains/kotlin/resolve/scopes/MemberScope.kt | 8 ++++++++ .../kotlin/resolve/scopes/MemberScopeImpl.kt | 2 ++ .../kotlin/resolve/scopes/SubstitutingScope.kt | 1 + .../src/org/jetbrains/kotlin/types/ErrorUtils.java | 11 +++++++++++ .../MetadataPackageFragmentProvider.kt | 1 + .../descriptors/DeserializedMemberScope.kt | 1 + .../src/org/jetbrains/kotlin/utils/addToStdlib.kt | 8 ++++++++ .../org/jetbrains/kotlin/idea/kdoc/resolveKDocLink.kt | 2 ++ .../kotlin/idea/kdoc/IdeSampleResolutionService.kt | 4 ++-- 17 files changed, 59 insertions(+), 2 deletions(-) diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/descriptors/LazyPackageMemberScope.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/descriptors/LazyPackageMemberScope.kt index 3b86bcc1d2e..5ecd085013f 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/descriptors/LazyPackageMemberScope.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/descriptors/LazyPackageMemberScope.kt @@ -58,6 +58,7 @@ class LazyPackageMemberScope( c.lookupTracker.record(from, thisDescriptor, name) } + override fun getClassifierNames(): Set? = declarationProvider.getDeclarationNames() override fun getFunctionNames() = declarationProvider.getDeclarationNames() override fun getVariableNames() = declarationProvider.getDeclarationNames() diff --git a/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/lazy/descriptors/JvmPackageScope.kt b/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/lazy/descriptors/JvmPackageScope.kt index 957ccb8a000..9e33002bbb0 100644 --- a/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/lazy/descriptors/JvmPackageScope.kt +++ b/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/lazy/descriptors/JvmPackageScope.kt @@ -27,6 +27,7 @@ import org.jetbrains.kotlin.load.java.structure.JavaPackage import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.resolve.scopes.DescriptorKindFilter import org.jetbrains.kotlin.resolve.scopes.MemberScope +import org.jetbrains.kotlin.resolve.scopes.flatMapClassifierNamesOrNull import org.jetbrains.kotlin.storage.getValue import org.jetbrains.kotlin.util.collectionUtils.getFirstClassifierDiscriminateHeaders import org.jetbrains.kotlin.util.collectionUtils.getFromAllScopes @@ -76,6 +77,10 @@ class JvmPackageScope( addAll(javaScope.getVariableNames()) } + override fun getClassifierNames(): Set? = kotlinScopes.flatMapClassifierNamesOrNull()?.apply { + addAll(javaScope.getClassifierNames()) + } + override fun printScopeStructure(p: Printer) { p.println(this::class.java.simpleName, " {") p.pushIndent() diff --git a/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/lazy/descriptors/LazyJavaScope.kt b/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/lazy/descriptors/LazyJavaScope.kt index 23a40fca777..434f28ad9ed 100644 --- a/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/lazy/descriptors/LazyJavaScope.kt +++ b/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/lazy/descriptors/LazyJavaScope.kt @@ -212,9 +212,11 @@ abstract class LazyJavaScope(protected val c: LazyJavaResolverContext) : MemberS private val functionNamesLazy by c.storageManager.createLazyValue { computeFunctionNames(DescriptorKindFilter.FUNCTIONS, null) } private val propertyNamesLazy by c.storageManager.createLazyValue { computePropertyNames(DescriptorKindFilter.VARIABLES, null) } + private val classNamesLazy by c.storageManager.createLazyValue { computeClassNames(DescriptorKindFilter.CLASSIFIERS, null) } override fun getFunctionNames() = functionNamesLazy override fun getVariableNames() = propertyNamesLazy + override fun getClassifierNames() = classNamesLazy override fun getContributedFunctions(name: Name, location: LookupLocation): Collection { if (name !in getFunctionNames()) return emptyList() diff --git a/core/descriptors/src/org/jetbrains/kotlin/descriptors/impl/EnumEntrySyntheticClassDescriptor.java b/core/descriptors/src/org/jetbrains/kotlin/descriptors/impl/EnumEntrySyntheticClassDescriptor.java index 0e86a80fc8d..d44088542c7 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/descriptors/impl/EnumEntrySyntheticClassDescriptor.java +++ b/core/descriptors/src/org/jetbrains/kotlin/descriptors/impl/EnumEntrySyntheticClassDescriptor.java @@ -310,6 +310,12 @@ public class EnumEntrySyntheticClassDescriptor extends ClassDescriptorBase { return enumMemberNames.invoke(); } + @NotNull + @Override + public Set getClassifierNames() { + return Collections.emptySet(); + } + @NotNull @Override public Set getVariableNames() { diff --git a/core/descriptors/src/org/jetbrains/kotlin/descriptors/impl/SubpackagesScope.kt b/core/descriptors/src/org/jetbrains/kotlin/descriptors/impl/SubpackagesScope.kt index 643254d7d70..fbf0944f99f 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/descriptors/impl/SubpackagesScope.kt +++ b/core/descriptors/src/org/jetbrains/kotlin/descriptors/impl/SubpackagesScope.kt @@ -57,6 +57,8 @@ open class SubpackagesScope(private val moduleDescriptor: ModuleDescriptor, priv return result } + override fun getClassifierNames(): Set = emptySet() + override fun printScopeStructure(p: Printer) { p.println(this::class.java.simpleName, " {") p.pushIndent() diff --git a/core/descriptors/src/org/jetbrains/kotlin/resolve/scopes/AbstractScopeAdapter.kt b/core/descriptors/src/org/jetbrains/kotlin/resolve/scopes/AbstractScopeAdapter.kt index a23eed6efdd..b98f5f06998 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/resolve/scopes/AbstractScopeAdapter.kt +++ b/core/descriptors/src/org/jetbrains/kotlin/resolve/scopes/AbstractScopeAdapter.kt @@ -55,6 +55,8 @@ abstract class AbstractScopeAdapter : MemberScope { override fun getFunctionNames() = workerScope.getFunctionNames() override fun getVariableNames() = workerScope.getVariableNames() + override fun getClassifierNames() = workerScope.getClassifierNames() + override fun printScopeStructure(p: Printer) { p.println(this::class.java.simpleName, " {") diff --git a/core/descriptors/src/org/jetbrains/kotlin/resolve/scopes/ChainedMemberScope.kt b/core/descriptors/src/org/jetbrains/kotlin/resolve/scopes/ChainedMemberScope.kt index 8357efafd05..fd521dd5436 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/resolve/scopes/ChainedMemberScope.kt +++ b/core/descriptors/src/org/jetbrains/kotlin/resolve/scopes/ChainedMemberScope.kt @@ -43,6 +43,7 @@ class ChainedMemberScope( override fun getFunctionNames() = scopes.flatMapTo(mutableSetOf()) { it.getFunctionNames() } override fun getVariableNames() = scopes.flatMapTo(mutableSetOf()) { it.getVariableNames() } + override fun getClassifierNames(): Set? = scopes.flatMapClassifierNamesOrNull() override fun toString() = debugName diff --git a/core/descriptors/src/org/jetbrains/kotlin/resolve/scopes/InnerClassesScopeWrapper.kt b/core/descriptors/src/org/jetbrains/kotlin/resolve/scopes/InnerClassesScopeWrapper.kt index c0add4fc0dc..10f0011be3d 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/resolve/scopes/InnerClassesScopeWrapper.kt +++ b/core/descriptors/src/org/jetbrains/kotlin/resolve/scopes/InnerClassesScopeWrapper.kt @@ -40,6 +40,10 @@ class InnerClassesScopeWrapper(val workerScope: MemberScope) : MemberScopeImpl() workerScope.printScopeStructure(p) } + override fun getFunctionNames() = workerScope.getFunctionNames() + override fun getVariableNames() = workerScope.getVariableNames() + override fun getClassifierNames() = workerScope.getClassifierNames() + override fun definitelyDoesNotContainName(name: Name) = workerScope.definitelyDoesNotContainName(name) override fun toString() = "Classes from $workerScope" diff --git a/core/descriptors/src/org/jetbrains/kotlin/resolve/scopes/MemberScope.kt b/core/descriptors/src/org/jetbrains/kotlin/resolve/scopes/MemberScope.kt index 7666365671f..997a35a59e9 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/resolve/scopes/MemberScope.kt +++ b/core/descriptors/src/org/jetbrains/kotlin/resolve/scopes/MemberScope.kt @@ -20,6 +20,7 @@ import org.jetbrains.kotlin.descriptors.* import org.jetbrains.kotlin.incremental.components.LookupLocation import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.utils.Printer +import org.jetbrains.kotlin.utils.addToStdlib.flatMapToNullable import java.lang.reflect.Modifier interface MemberScope : ResolutionScope { @@ -32,6 +33,7 @@ interface MemberScope : ResolutionScope { */ fun getFunctionNames(): Set fun getVariableNames(): Set + fun getClassifierNames(): Set? /** * Is supposed to be used in tests and debug only @@ -45,6 +47,7 @@ interface MemberScope : ResolutionScope { override fun getFunctionNames() = emptySet() override fun getVariableNames() = emptySet() + override fun getClassifierNames() = emptySet() } companion object { @@ -52,6 +55,11 @@ interface MemberScope : ResolutionScope { } } +fun MemberScope.computeAllNames() = getClassifierNames()?.let { getFunctionNames() + getVariableNames() + it } + +fun Collection.flatMapClassifierNamesOrNull(): MutableSet? = + flatMapToNullable(hashSetOf(), MemberScope::getClassifierNames) + /** * The same as getDescriptors(kindFilter, nameFilter) but the result is guaranteed to be filtered by kind and name. */ diff --git a/core/descriptors/src/org/jetbrains/kotlin/resolve/scopes/MemberScopeImpl.kt b/core/descriptors/src/org/jetbrains/kotlin/resolve/scopes/MemberScopeImpl.kt index f54f05fea1b..773936d5a4d 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/resolve/scopes/MemberScopeImpl.kt +++ b/core/descriptors/src/org/jetbrains/kotlin/resolve/scopes/MemberScopeImpl.kt @@ -42,6 +42,8 @@ abstract class MemberScopeImpl : MemberScope { DescriptorKindFilter.VARIABLES, alwaysTrue() ).filterIsInstance().mapTo(mutableSetOf()) { it.name } + override fun getClassifierNames(): Set? = null + // This method should not be implemented here by default: every scope class has its unique structure pattern abstract override fun printScopeStructure(p: Printer) } diff --git a/core/descriptors/src/org/jetbrains/kotlin/resolve/scopes/SubstitutingScope.kt b/core/descriptors/src/org/jetbrains/kotlin/resolve/scopes/SubstitutingScope.kt index 28ede538058..d4cae2f38cb 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/resolve/scopes/SubstitutingScope.kt +++ b/core/descriptors/src/org/jetbrains/kotlin/resolve/scopes/SubstitutingScope.kt @@ -81,6 +81,7 @@ class SubstitutingScope(private val workerScope: MemberScope, givenSubstitutor: override fun getFunctionNames() = workerScope.getFunctionNames() override fun getVariableNames() = workerScope.getVariableNames() + override fun getClassifierNames() = workerScope.getClassifierNames() override fun definitelyDoesNotContainName(name: Name) = workerScope.definitelyDoesNotContainName(name) diff --git a/core/descriptors/src/org/jetbrains/kotlin/types/ErrorUtils.java b/core/descriptors/src/org/jetbrains/kotlin/types/ErrorUtils.java index a80682a6186..5edb0059cc1 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/types/ErrorUtils.java +++ b/core/descriptors/src/org/jetbrains/kotlin/types/ErrorUtils.java @@ -211,6 +211,12 @@ public class ErrorUtils { return emptySet(); } + @NotNull + @Override + public Set getClassifierNames() { + return emptySet(); + } + @NotNull @Override public Collection getContributedDescriptors( @@ -284,6 +290,11 @@ public class ErrorUtils { throw new IllegalStateException(); } + @Override + public Set getClassifierNames() { + throw new IllegalStateException(); + } + @Override public boolean definitelyDoesNotContainName(@NotNull Name name) { return false; diff --git a/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/MetadataPackageFragmentProvider.kt b/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/MetadataPackageFragmentProvider.kt index e0aff441439..f473c75eeaf 100644 --- a/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/MetadataPackageFragmentProvider.kt +++ b/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/MetadataPackageFragmentProvider.kt @@ -107,6 +107,7 @@ class MetadataPackageFragment( ) { override fun hasClass(name: Name): Boolean = hasTopLevelClass(name) override fun definitelyDoesNotContainName(name: Name) = false + override fun getClassifierNames(): Set? = null }) return ChainedMemberScope.create("Metadata scope", scopes) diff --git a/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/descriptors/DeserializedMemberScope.kt b/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/descriptors/DeserializedMemberScope.kt index ebba36a8561..83cb57b6a1a 100644 --- a/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/descriptors/DeserializedMemberScope.kt +++ b/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/descriptors/DeserializedMemberScope.kt @@ -76,6 +76,7 @@ abstract class DeserializedMemberScope protected constructor( override fun getFunctionNames() = functionNamesLazy override fun getVariableNames() = variableNamesLazy + override fun getClassifierNames(): Set? = classNames + typeAliasNames private inline fun Collection.groupByName( getNameIndex: (M) -> Int diff --git a/core/util.runtime/src/org/jetbrains/kotlin/utils/addToStdlib.kt b/core/util.runtime/src/org/jetbrains/kotlin/utils/addToStdlib.kt index be639c80350..c364f463a81 100644 --- a/core/util.runtime/src/org/jetbrains/kotlin/utils/addToStdlib.kt +++ b/core/util.runtime/src/org/jetbrains/kotlin/utils/addToStdlib.kt @@ -138,3 +138,11 @@ fun > Iterable>.flattenTo(c: C): C { } return c } + +inline fun > Iterable.flatMapToNullable(destination: C, transform: (T) -> Iterable?): C? { + for (element in this) { + val list = transform(element) ?: return null + destination.addAll(list) + } + return destination +} diff --git a/idea/ide-common/src/org/jetbrains/kotlin/idea/kdoc/resolveKDocLink.kt b/idea/ide-common/src/org/jetbrains/kotlin/idea/kdoc/resolveKDocLink.kt index 67912426e92..b66aedbaffa 100644 --- a/idea/ide-common/src/org/jetbrains/kotlin/idea/kdoc/resolveKDocLink.kt +++ b/idea/ide-common/src/org/jetbrains/kotlin/idea/kdoc/resolveKDocLink.kt @@ -253,6 +253,8 @@ private class ExtensionsScope( .toSet() } + override fun getClassifierNames() = null + override fun printScopeStructure(p: Printer) { p.println("Extensions for ${receiverClass.name} in:") contextScope.printStructure(p) diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/kdoc/IdeSampleResolutionService.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/kdoc/IdeSampleResolutionService.kt index 0cc7a37c59d..f0da18e9181 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/kdoc/IdeSampleResolutionService.kt +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/kdoc/IdeSampleResolutionService.kt @@ -75,8 +75,8 @@ private class GlobalSyntheticPackageViewDescriptor(override val fqName: FqName, override fun getContributedFunctions(name: Name, location: LookupLocation): Collection = shouldNotBeCalled() override fun getFunctionNames(): Set = shouldNotBeCalled() - override fun getVariableNames(): Set = shouldNotBeCalled() + override fun getClassifierNames(): Set = shouldNotBeCalled() override fun getContributedClassifier(name: Name, location: LookupLocation): ClassifierDescriptor? = shouldNotBeCalled() @@ -130,4 +130,4 @@ private class GlobalSyntheticPackageViewDescriptor(override val fqName: FqName, override fun acceptVoid(visitor: DeclarationDescriptorVisitor?) = shouldNotBeCalled() override val annotations = Annotations.EMPTY -} \ No newline at end of file +} From 69f3b01e985449f9008107a39d0caf0da618e1d9 Mon Sep 17 00:00:00 2001 From: Denis Zharkov Date: Tue, 15 Aug 2017 18:30:50 +0700 Subject: [PATCH 115/212] Introduce ImportingScope::computeImportedNames --- .../org/jetbrains/kotlin/resolve/AllUnderImportScope.kt | 8 ++++++-- .../jetbrains/kotlin/resolve/LazyExplicitImportScope.kt | 4 +++- .../org/jetbrains/kotlin/resolve/lazy/FileScopeFactory.kt | 7 +++---- .../src/org/jetbrains/kotlin/resolve/scopes/Scopes.kt | 3 +++ .../kotlin/resolve/scopes/SubpackagesImportingScope.kt | 1 + .../jetbrains/kotlin/resolve/scopes/utils/ScopeUtils.kt | 2 ++ .../kotlin/resolve/scopes/ExplicitImportsScope.kt | 2 ++ 7 files changed, 20 insertions(+), 7 deletions(-) diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/AllUnderImportScope.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/AllUnderImportScope.kt index 8caf263706a..4f4035bc069 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/AllUnderImportScope.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/AllUnderImportScope.kt @@ -22,15 +22,17 @@ import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.resolve.scopes.BaseImportingScope import org.jetbrains.kotlin.resolve.scopes.DescriptorKindFilter -import org.jetbrains.kotlin.resolve.scopes.ResolutionScope +import org.jetbrains.kotlin.resolve.scopes.MemberScope +import org.jetbrains.kotlin.resolve.scopes.computeAllNames import org.jetbrains.kotlin.utils.Printer +import org.jetbrains.kotlin.utils.addToStdlib.flatMapToNullable class AllUnderImportScope( descriptor: DeclarationDescriptor, excludedImportNames: Collection ) : BaseImportingScope(null) { - private val scopes: List = if (descriptor is ClassDescriptor) { + private val scopes: List = if (descriptor is ClassDescriptor) { listOf(descriptor.staticScope, descriptor.unsubstitutedInnerClassesScope) } else { @@ -49,6 +51,8 @@ class AllUnderImportScope( excludedImportNames.mapNotNull { if (it.parent() == fqName) it.shortName() else null }.toSet() } + override fun computeImportedNames(): Set? = scopes.flatMapToNullable(hashSetOf(), MemberScope::computeAllNames) + override fun getContributedDescriptors( kindFilter: DescriptorKindFilter, nameFilter: (Name) -> Boolean, diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/LazyExplicitImportScope.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/LazyExplicitImportScope.kt index 49cc59a5544..e2f62db0519 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/LazyExplicitImportScope.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/LazyExplicitImportScope.kt @@ -101,6 +101,8 @@ class LazyExplicitImportScope( return descriptors } + override fun computeImportedNames() = setOf(aliasName) + override fun printStructure(p: Printer) { p.println(this::class.java.simpleName, ": ", aliasName) } @@ -148,4 +150,4 @@ class LazyExplicitImportScope( private fun Collection.choseOnlyVisibleOrAll() = filter { isVisible(it, packageFragmentForVisibilityCheck, position = QualifierPosition.IMPORT) }. takeIf { it.isNotEmpty() } ?: this -} \ No newline at end of file +} diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/FileScopeFactory.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/FileScopeFactory.kt index 52ded343428..1f195710a4e 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/FileScopeFactory.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/FileScopeFactory.kt @@ -27,10 +27,7 @@ import org.jetbrains.kotlin.psi.KtFile import org.jetbrains.kotlin.psi.KtImportDirective import org.jetbrains.kotlin.psi.KtImportsFactory import org.jetbrains.kotlin.resolve.* -import org.jetbrains.kotlin.resolve.scopes.DescriptorKindFilter -import org.jetbrains.kotlin.resolve.scopes.ImportingScope -import org.jetbrains.kotlin.resolve.scopes.LexicalScope -import org.jetbrains.kotlin.resolve.scopes.SubpackagesImportingScope +import org.jetbrains.kotlin.resolve.scopes.* import org.jetbrains.kotlin.resolve.source.KotlinSourceElement import org.jetbrains.kotlin.script.getScriptExternalDependencies import org.jetbrains.kotlin.storage.StorageManager @@ -220,6 +217,8 @@ class FileScopeFactory( ).filter { it !is PackageViewDescriptor } // subpackages of the current package not accessible by the short name } + override fun computeImportedNames() = packageView.memberScope.computeAllNames() + override fun toString() = "Scope for current package (${filteringKind.name})" override fun printStructure(p: Printer) { diff --git a/compiler/resolution/src/org/jetbrains/kotlin/resolve/scopes/Scopes.kt b/compiler/resolution/src/org/jetbrains/kotlin/resolve/scopes/Scopes.kt index dbeae8096ee..a4f04b0e0b1 100644 --- a/compiler/resolution/src/org/jetbrains/kotlin/resolve/scopes/Scopes.kt +++ b/compiler/resolution/src/org/jetbrains/kotlin/resolve/scopes/Scopes.kt @@ -121,12 +121,15 @@ interface ImportingScope : HierarchicalScope { return getContributedDescriptors(kindFilter, nameFilter, changeNamesForAliased = false) } + fun computeImportedNames(): Set? + object Empty : BaseImportingScope(null) { override fun printStructure(p: Printer) { p.println("ImportingScope.Empty") } override fun definitelyDoesNotContainName(name: Name) = true + override fun computeImportedNames() = emptySet() } } diff --git a/compiler/resolution/src/org/jetbrains/kotlin/resolve/scopes/SubpackagesImportingScope.kt b/compiler/resolution/src/org/jetbrains/kotlin/resolve/scopes/SubpackagesImportingScope.kt index 6590af831e1..ac0db8a37df 100644 --- a/compiler/resolution/src/org/jetbrains/kotlin/resolve/scopes/SubpackagesImportingScope.kt +++ b/compiler/resolution/src/org/jetbrains/kotlin/resolve/scopes/SubpackagesImportingScope.kt @@ -48,4 +48,5 @@ class SubpackagesImportingScope( //TODO: kept old behavior, but it seems very strange (super call seems more applicable) override fun getContributedDescriptors(kindFilter: DescriptorKindFilter, nameFilter: (Name) -> Boolean, changeNamesForAliased: Boolean): Collection = emptyList() + override fun computeImportedNames() = emptySet() } diff --git a/compiler/resolution/src/org/jetbrains/kotlin/resolve/scopes/utils/ScopeUtils.kt b/compiler/resolution/src/org/jetbrains/kotlin/resolve/scopes/utils/ScopeUtils.kt index adf068a4785..7eb021a35ff 100644 --- a/compiler/resolution/src/org/jetbrains/kotlin/resolve/scopes/utils/ScopeUtils.kt +++ b/compiler/resolution/src/org/jetbrains/kotlin/resolve/scopes/utils/ScopeUtils.kt @@ -122,6 +122,8 @@ private class MemberScopeToImportingScopeAdapter(override val parent: ImportingS override fun toString() = "${this::class.java.simpleName} for $memberScope" + override fun computeImportedNames() = memberScope.computeAllNames() + override fun printStructure(p: Printer) { p.println(this::class.java.simpleName) p.pushIndent() diff --git a/idea/ide-common/src/org/jetbrains/kotlin/resolve/scopes/ExplicitImportsScope.kt b/idea/ide-common/src/org/jetbrains/kotlin/resolve/scopes/ExplicitImportsScope.kt index c24fb63d8bc..b9fb969d86d 100644 --- a/idea/ide-common/src/org/jetbrains/kotlin/resolve/scopes/ExplicitImportsScope.kt +++ b/idea/ide-common/src/org/jetbrains/kotlin/resolve/scopes/ExplicitImportsScope.kt @@ -38,6 +38,8 @@ class ExplicitImportsScope(private val descriptors: Collection Boolean, changeNamesForAliased: Boolean) = descriptors + override fun computeImportedNames() = descriptors.mapTo(hashSetOf()) { it.name } + override fun printStructure(p: Printer) { p.println(this::class.java.name) } From 6e766634c15ae98c3add8c7b752b1e324780da0a Mon Sep 17 00:00:00 2001 From: Denis Zharkov Date: Tue, 15 Aug 2017 18:48:22 +0700 Subject: [PATCH 116/212] Add location parameter to ResolutionScope::definitelyDoesNotContainName It should be used to record lookups in case of fast paths in resolution --- .../jetbrains/kotlin/resolve/calls/tower/TowerResolver.kt | 7 ++++--- .../jetbrains/kotlin/resolve/scopes/LexicalScopeStorage.kt | 2 +- .../src/org/jetbrains/kotlin/resolve/scopes/Scopes.kt | 5 +++-- .../kotlin/resolve/scopes/InnerClassesScopeWrapper.kt | 2 +- .../org/jetbrains/kotlin/resolve/scopes/ResolutionScope.kt | 2 +- .../jetbrains/kotlin/resolve/scopes/SubstitutingScope.kt | 2 +- .../src/org/jetbrains/kotlin/types/ErrorUtils.java | 4 ++-- .../deserialization/MetadataPackageFragmentProvider.kt | 3 ++- 8 files changed, 15 insertions(+), 12 deletions(-) diff --git a/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/tower/TowerResolver.kt b/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/tower/TowerResolver.kt index 83c9f7ab97c..9b135248bdd 100644 --- a/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/tower/TowerResolver.kt +++ b/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/tower/TowerResolver.kt @@ -16,6 +16,7 @@ package org.jetbrains.kotlin.resolve.calls.tower +import org.jetbrains.kotlin.incremental.components.LookupLocation import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.progress.ProgressIndicatorAndCompilationCanceledStatus import org.jetbrains.kotlin.resolve.calls.tasks.ExplicitReceiverKind @@ -131,7 +132,7 @@ class TowerResolver { val localLevels = lexicalScope.parentsWithSelf. - filterIsInstance().filter { it.kind.withLocalDescriptors && it.mayFitForName(name) }. + filterIsInstance().filter { it.kind.withLocalDescriptors && it.mayFitForName(name, location) }. map { ScopeBasedTowerLevel(this@run, it) }.toList() // local non-extensions or extension for explicit receiver @@ -186,8 +187,8 @@ class TowerResolver { return resultCollector.getFinalCandidates() } - private fun ResolutionScope.mayFitForName(name: Name) = - !definitelyDoesNotContainName(name) || !definitelyDoesNotContainName(OperatorNameConventions.INVOKE) + private fun ResolutionScope.mayFitForName(name: Name, location: LookupLocation) = + !definitelyDoesNotContainName(name, location) || !definitelyDoesNotContainName(OperatorNameConventions.INVOKE, location) fun runWithEmptyTowerData( processor: ScopeTowerProcessor, diff --git a/compiler/resolution/src/org/jetbrains/kotlin/resolve/scopes/LexicalScopeStorage.kt b/compiler/resolution/src/org/jetbrains/kotlin/resolve/scopes/LexicalScopeStorage.kt index f2e67b63155..d0955181caf 100644 --- a/compiler/resolution/src/org/jetbrains/kotlin/resolve/scopes/LexicalScopeStorage.kt +++ b/compiler/resolution/src/org/jetbrains/kotlin/resolve/scopes/LexicalScopeStorage.kt @@ -125,6 +125,6 @@ abstract class LexicalScopeStorage( return result } - override fun definitelyDoesNotContainName(name: Name) = + override fun definitelyDoesNotContainName(name: Name, location: LookupLocation) = functionsByName?.get(name) == null && variablesAndClassifiersByName?.get(name) == null } diff --git a/compiler/resolution/src/org/jetbrains/kotlin/resolve/scopes/Scopes.kt b/compiler/resolution/src/org/jetbrains/kotlin/resolve/scopes/Scopes.kt index a4f04b0e0b1..abe76348ff5 100644 --- a/compiler/resolution/src/org/jetbrains/kotlin/resolve/scopes/Scopes.kt +++ b/compiler/resolution/src/org/jetbrains/kotlin/resolve/scopes/Scopes.kt @@ -55,7 +55,7 @@ interface LexicalScope : HierarchicalScope { override val kind: LexicalScopeKind get() = LexicalScopeKind.EMPTY - override fun definitelyDoesNotContainName(name: Name) = true + override fun definitelyDoesNotContainName(name: Name, location: LookupLocation) = true override fun printStructure(p: Printer) { p.println("Base lexical scope with owner = $ownerDescriptor and parent = $parent") @@ -128,8 +128,9 @@ interface ImportingScope : HierarchicalScope { p.println("ImportingScope.Empty") } - override fun definitelyDoesNotContainName(name: Name) = true override fun computeImportedNames() = emptySet() + + override fun definitelyDoesNotContainName(name: Name, location: LookupLocation) = true } } diff --git a/core/descriptors/src/org/jetbrains/kotlin/resolve/scopes/InnerClassesScopeWrapper.kt b/core/descriptors/src/org/jetbrains/kotlin/resolve/scopes/InnerClassesScopeWrapper.kt index 10f0011be3d..e9bec2bbe08 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/resolve/scopes/InnerClassesScopeWrapper.kt +++ b/core/descriptors/src/org/jetbrains/kotlin/resolve/scopes/InnerClassesScopeWrapper.kt @@ -44,7 +44,7 @@ class InnerClassesScopeWrapper(val workerScope: MemberScope) : MemberScopeImpl() override fun getVariableNames() = workerScope.getVariableNames() override fun getClassifierNames() = workerScope.getClassifierNames() - override fun definitelyDoesNotContainName(name: Name) = workerScope.definitelyDoesNotContainName(name) + override fun definitelyDoesNotContainName(name: Name, location: LookupLocation) = workerScope.definitelyDoesNotContainName(name, location) override fun toString() = "Classes from $workerScope" } diff --git a/core/descriptors/src/org/jetbrains/kotlin/resolve/scopes/ResolutionScope.kt b/core/descriptors/src/org/jetbrains/kotlin/resolve/scopes/ResolutionScope.kt index c5e993f1532..8540d49894f 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/resolve/scopes/ResolutionScope.kt +++ b/core/descriptors/src/org/jetbrains/kotlin/resolve/scopes/ResolutionScope.kt @@ -40,5 +40,5 @@ interface ResolutionScope { nameFilter: (Name) -> Boolean = MemberScope.ALL_NAME_FILTER ): Collection - fun definitelyDoesNotContainName(name: Name): Boolean = false + fun definitelyDoesNotContainName(name: Name, location: LookupLocation): Boolean = false } diff --git a/core/descriptors/src/org/jetbrains/kotlin/resolve/scopes/SubstitutingScope.kt b/core/descriptors/src/org/jetbrains/kotlin/resolve/scopes/SubstitutingScope.kt index d4cae2f38cb..f4e94ab06d7 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/resolve/scopes/SubstitutingScope.kt +++ b/core/descriptors/src/org/jetbrains/kotlin/resolve/scopes/SubstitutingScope.kt @@ -83,7 +83,7 @@ class SubstitutingScope(private val workerScope: MemberScope, givenSubstitutor: override fun getVariableNames() = workerScope.getVariableNames() override fun getClassifierNames() = workerScope.getClassifierNames() - override fun definitelyDoesNotContainName(name: Name) = workerScope.definitelyDoesNotContainName(name) + override fun definitelyDoesNotContainName(name: Name, location: LookupLocation) = workerScope.definitelyDoesNotContainName(name, location) override fun printScopeStructure(p: Printer) { p.println(this::class.java.simpleName, " {") diff --git a/core/descriptors/src/org/jetbrains/kotlin/types/ErrorUtils.java b/core/descriptors/src/org/jetbrains/kotlin/types/ErrorUtils.java index 5edb0059cc1..6dc861785bd 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/types/ErrorUtils.java +++ b/core/descriptors/src/org/jetbrains/kotlin/types/ErrorUtils.java @@ -226,7 +226,7 @@ public class ErrorUtils { } @Override - public boolean definitelyDoesNotContainName(@NotNull Name name) { + public boolean definitelyDoesNotContainName(@NotNull Name name, @NotNull LookupLocation location) { return false; } @@ -296,7 +296,7 @@ public class ErrorUtils { } @Override - public boolean definitelyDoesNotContainName(@NotNull Name name) { + public boolean definitelyDoesNotContainName(@NotNull Name name, @NotNull LookupLocation location) { return false; } diff --git a/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/MetadataPackageFragmentProvider.kt b/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/MetadataPackageFragmentProvider.kt index f473c75eeaf..fbe1e3b3e71 100644 --- a/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/MetadataPackageFragmentProvider.kt +++ b/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/MetadataPackageFragmentProvider.kt @@ -24,6 +24,7 @@ import org.jetbrains.kotlin.descriptors.PackagePartProvider import org.jetbrains.kotlin.descriptors.SourceElement import org.jetbrains.kotlin.descriptors.deserialization.AdditionalClassPartsProvider import org.jetbrains.kotlin.descriptors.deserialization.PlatformDependentDeclarationFilter +import org.jetbrains.kotlin.incremental.components.LookupLocation import org.jetbrains.kotlin.incremental.components.LookupTracker import org.jetbrains.kotlin.name.ClassId import org.jetbrains.kotlin.name.FqName @@ -106,7 +107,7 @@ class MetadataPackageFragment( containerSource = null, components = components, classNames = { emptyList() } ) { override fun hasClass(name: Name): Boolean = hasTopLevelClass(name) - override fun definitelyDoesNotContainName(name: Name) = false + override fun definitelyDoesNotContainName(name: Name, location: LookupLocation) = false override fun getClassifierNames(): Set? = null }) From 3322ed6e04fad47d8a0f9ae21aad112edbc0b295 Mon Sep 17 00:00:00 2001 From: Denis Zharkov Date: Tue, 15 Aug 2017 19:07:45 +0700 Subject: [PATCH 117/212] Implement LazyImportResolver::definitelyDoesNotContainName --- .../kotlin/resolve/lazy/FileScopeFactory.kt | 7 +++++++ .../kotlin/resolve/lazy/LazyImportScope.kt | 18 +++++++++++++++++- .../descriptors/AbstractLazyMemberScope.kt | 2 -- .../resolve/calls/tower/TowerResolver.kt | 2 +- .../java/lazy/descriptors/JvmPackageScope.kt | 8 ++++---- .../descriptors/LazyJavaClassMemberScope.kt | 4 ++-- .../kotlin/resolve/scopes/ResolutionScope.kt | 4 ++++ .../org/jetbrains/kotlin/types/ErrorUtils.java | 10 ++++++++++ .../descriptors/DeserializedClassDescriptor.kt | 4 ++-- 9 files changed, 47 insertions(+), 12 deletions(-) diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/FileScopeFactory.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/FileScopeFactory.kt index 1f195710a4e..e829cec79dc 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/FileScopeFactory.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/FileScopeFactory.kt @@ -177,6 +177,7 @@ class FileScopeFactory( parentScope: ImportingScope ): ImportingScope { val scope = packageView.memberScope + val names by lazy(LazyThreadSafetyMode.PUBLICATION) { scope.computeAllNames () } val packageName = packageView.fqName val excludedNames = aliasImportNames.mapNotNull { if (it.parent() == packageName) it.shortName() else null } @@ -219,6 +220,12 @@ class FileScopeFactory( override fun computeImportedNames() = packageView.memberScope.computeAllNames() + override fun definitelyDoesNotContainName(name: Name, location: LookupLocation): Boolean { + if (names?.let { name in it } != false) return false + packageView.memberScope.recordLookup(name, location) + return true + } + override fun toString() = "Scope for current package (${filteringKind.name})" override fun printStructure(p: Printer) { diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/LazyImportScope.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/LazyImportScope.kt index 5ea473866b9..63aacd7b718 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/LazyImportScope.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/LazyImportScope.kt @@ -37,6 +37,7 @@ import org.jetbrains.kotlin.storage.StorageManager import org.jetbrains.kotlin.types.expressions.OperatorConventions import org.jetbrains.kotlin.util.collectionUtils.concat import org.jetbrains.kotlin.utils.Printer +import org.jetbrains.kotlin.utils.addToStdlib.flatMapToNullable import java.util.* interface IndexedImports { @@ -81,7 +82,7 @@ class LazyImportResolver( val indexedImports: IndexedImports, excludedImportNames: Collection, private val traceForImportResolve: BindingTrace, - private val packageFragment: PackageFragmentDescriptor, + private val packageFragment: PackageFragmentDescriptor?, val deprecationResolver: DeprecationResolver ) : ImportResolver { private val importedScopesProvider = storageManager.createMemoizedFunctionWithNullableValues { @@ -191,6 +192,18 @@ class LazyImportResolver( fun getImportScope(directive: KtImportDirective): ImportingScope { return importedScopesProvider(directive) ?: ImportingScope.Empty } + + val allNames: Set? by lazy(LazyThreadSafetyMode.PUBLICATION) { + indexedImports.imports.flatMapToNullable(hashSetOf()) { getImportScope(it).computeImportedNames() } + } + + fun definitelyDoesNotContainName(name: Name, location: LookupLocation): Boolean { + if (allNames?.let { name in it } != false) return false + indexedImports.importsForName(name).forEach { + getImportScope(it).recordLookup(name, location) + } + return true + } } class LazyImportScope( @@ -269,4 +282,7 @@ class LazyImportScope( p.popIndent() p.println("}") } + + override fun definitelyDoesNotContainName(name: Name, location: LookupLocation) = importResolver.definitelyDoesNotContainName(name, location) + override fun computeImportedNames() = importResolver.allNames } diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/descriptors/AbstractLazyMemberScope.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/descriptors/AbstractLazyMemberScope.kt index 9d1ac9d11fe..3951107526d 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/descriptors/AbstractLazyMemberScope.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/descriptors/AbstractLazyMemberScope.kt @@ -219,8 +219,6 @@ protected constructor( return result.toList() } - abstract fun recordLookup(name: Name, from: LookupLocation) - // Do not change this, override in concrete subclasses: // it is very easy to compromise laziness of this class, and fail all the debugging // a generic implementation can't do this properly diff --git a/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/tower/TowerResolver.kt b/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/tower/TowerResolver.kt index 9b135248bdd..21139f9557c 100644 --- a/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/tower/TowerResolver.kt +++ b/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/tower/TowerResolver.kt @@ -178,7 +178,7 @@ class TowerResolver { } } } - else { + else if (scope.mayFitForName(name, location)) { // functions with no receiver or extension for explicit receiver TowerData.TowerLevel(ImportingScopeBasedTowerLevel(this, scope as ImportingScope)).process()?.let { return it } } diff --git a/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/lazy/descriptors/JvmPackageScope.kt b/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/lazy/descriptors/JvmPackageScope.kt index 9e33002bbb0..2e852f7c490 100644 --- a/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/lazy/descriptors/JvmPackageScope.kt +++ b/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/lazy/descriptors/JvmPackageScope.kt @@ -47,7 +47,7 @@ class JvmPackageScope( } override fun getContributedClassifier(name: Name, location: LookupLocation): ClassifierDescriptor? { - recordLookup(location, name) + recordLookup(name, location) val javaClassifier = javaScope.getContributedClassifier(name, location) if (javaClassifier != null) return javaClassifier @@ -56,12 +56,12 @@ class JvmPackageScope( } override fun getContributedVariables(name: Name, location: LookupLocation): Collection { - recordLookup(location, name) + recordLookup(name, location) return getFromAllScopes(javaScope, kotlinScopes) { it.getContributedVariables(name, location) } } override fun getContributedFunctions(name: Name, location: LookupLocation): Collection { - recordLookup(location, name) + recordLookup(name, location) return getFromAllScopes(javaScope, kotlinScopes) { it.getContributedFunctions(name, location) } } @@ -96,7 +96,7 @@ class JvmPackageScope( p.println("}") } - private fun recordLookup(location: LookupLocation, name: Name) { + override fun recordLookup(name: Name, location: LookupLocation) { c.components.lookupTracker.record(location, packageFragment, name) } } diff --git a/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/lazy/descriptors/LazyJavaClassMemberScope.kt b/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/lazy/descriptors/LazyJavaClassMemberScope.kt index b5c8efd79b7..a6de88b03b4 100644 --- a/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/lazy/descriptors/LazyJavaClassMemberScope.kt +++ b/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/lazy/descriptors/LazyJavaClassMemberScope.kt @@ -672,8 +672,8 @@ class LazyJavaClassMemberScope( } } - private fun recordLookup(name: Name, from: LookupLocation) { - c.components.lookupTracker.record(from, ownerDescriptor, name) + override fun recordLookup(name: Name, location: LookupLocation) { + c.components.lookupTracker.record(location, ownerDescriptor, name) } override fun toString() = "Lazy Java member scope for " + jClass.fqName diff --git a/core/descriptors/src/org/jetbrains/kotlin/resolve/scopes/ResolutionScope.kt b/core/descriptors/src/org/jetbrains/kotlin/resolve/scopes/ResolutionScope.kt index 8540d49894f..09315421f7f 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/resolve/scopes/ResolutionScope.kt +++ b/core/descriptors/src/org/jetbrains/kotlin/resolve/scopes/ResolutionScope.kt @@ -41,4 +41,8 @@ interface ResolutionScope { ): Collection fun definitelyDoesNotContainName(name: Name, location: LookupLocation): Boolean = false + + fun recordLookup(name: Name, location: LookupLocation) { + getContributedFunctions(name, location) + } } diff --git a/core/descriptors/src/org/jetbrains/kotlin/types/ErrorUtils.java b/core/descriptors/src/org/jetbrains/kotlin/types/ErrorUtils.java index 6dc861785bd..0a412f71927 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/types/ErrorUtils.java +++ b/core/descriptors/src/org/jetbrains/kotlin/types/ErrorUtils.java @@ -217,6 +217,11 @@ public class ErrorUtils { return emptySet(); } + @Override + public void recordLookup(@NotNull Name name, @NotNull LookupLocation location) { + + } + @NotNull @Override public Collection getContributedDescriptors( @@ -295,6 +300,11 @@ public class ErrorUtils { throw new IllegalStateException(); } + @Override + public void recordLookup(@NotNull Name name, @NotNull LookupLocation location) { + throw new IllegalStateException(); + } + @Override public boolean definitelyDoesNotContainName(@NotNull Name name, @NotNull LookupLocation location) { return false; diff --git a/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/descriptors/DeserializedClassDescriptor.kt b/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/descriptors/DeserializedClassDescriptor.kt index ff802785fc7..0014c9e96ba 100644 --- a/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/descriptors/DeserializedClassDescriptor.kt +++ b/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/descriptors/DeserializedClassDescriptor.kt @@ -294,8 +294,8 @@ class DeserializedClassDescriptor( result.addAll(classDescriptor.enumEntries?.all().orEmpty()) } - private fun recordLookup(name: Name, from: LookupLocation) { - c.components.lookupTracker.record(from, classDescriptor, name) + override fun recordLookup(name: Name, location: LookupLocation) { + c.components.lookupTracker.record(location, classDescriptor, name) } } From c018a76aaa8e57af1083fa1074838b3021ef224c Mon Sep 17 00:00:00 2001 From: Denis Zharkov Date: Tue, 15 Aug 2017 19:22:06 +0700 Subject: [PATCH 118/212] Use the same default import scopes for all files in module --- .../kotlin/resolve/lazy/FileScopeFactory.kt | 74 ++++++++++++------- 1 file changed, 49 insertions(+), 25 deletions(-) diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/FileScopeFactory.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/FileScopeFactory.kt index e829cec79dc..3c712e1d0b6 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/FileScopeFactory.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/FileScopeFactory.kt @@ -65,6 +65,41 @@ class FileScopeFactory( return FilesScopesBuilder(file, existingImports, packageFragment, packageView).result } + private fun createDefaultImportResolvers(extraImports: Collection, aliasImportNames: Collection): Pair { + val tempTrace = TemporaryBindingTrace.create(bindingTrace, "Transient trace for default imports lazy resolve", false) + val allImplicitImports = defaultImports concat extraImports + + val defaultImportsFiltered = if (aliasImportNames.isEmpty()) { // optimization + allImplicitImports + } + else { + allImplicitImports.filter { it.isAllUnder || it.importedFqName !in aliasImportNames } + } + + val defaultExplicitImportResolver = createImportResolver(ExplicitImportsIndexed(defaultImportsFiltered), tempTrace, packageFragment = null, aliasImportNames = aliasImportNames) + val defaultAllUnderImportResolver = + createImportResolver(AllUnderImportsIndexed(defaultImportsFiltered), tempTrace, packageFragment = null, aliasImportNames = aliasImportNames, excludedImports = defaultImportProvider.excludedImports) + + return defaultExplicitImportResolver to defaultAllUnderImportResolver + } + + private val defaultImportResolvers by storageManager.createLazyValue { + createDefaultImportResolvers(emptyList(), emptyList()) + } + + private fun createImportResolver( + indexedImports: IndexedImports, + trace: BindingTrace, + aliasImportNames: Collection, + packageFragment: PackageFragmentDescriptor?, + excludedImports: List? = null + ) = LazyImportResolver( + storageManager, qualifiedExpressionResolver, moduleDescriptor, platformToKotlinClassMap, languageVersionSettings, + indexedImports, aliasImportNames concat excludedImports, trace, packageFragment, + deprecationResolver + ) + + private inner class FilesScopesBuilder( private val file: KtFile, private val existingImports: ImportingScope?, @@ -74,8 +109,8 @@ class FileScopeFactory( val imports = file.importDirectives val aliasImportNames = imports.mapNotNull { if (it.aliasName != null) it.importedFqName else null } - val explicitImportResolver = createImportResolver(ExplicitImportsIndexed(imports), bindingTrace) - val allUnderImportResolver = createImportResolver(AllUnderImportsIndexed(imports), bindingTrace) // TODO: should we count excludedImports here also? + val explicitImportResolver = createImportResolver(ExplicitImportsIndexed(imports), bindingTrace, aliasImportNames, packageFragment) + val allUnderImportResolver = createImportResolver(AllUnderImportsIndexed(imports), bindingTrace, aliasImportNames, packageFragment) // TODO: should we count excludedImports here also? val lazyImportingScope = object : ImportingScope by ImportingScope.Empty { // avoid constructing the scope before we query it @@ -104,33 +139,21 @@ class FileScopeFactory( val result = FileScopes(lexicalScope, lazyImportingScope, importResolver) - fun createImportResolver(indexedImports: IndexedImports, trace: BindingTrace, excludedImports: List? = null) = - LazyImportResolver( - storageManager, qualifiedExpressionResolver, moduleDescriptor, platformToKotlinClassMap, languageVersionSettings, - indexedImports, aliasImportNames concat excludedImports, trace, packageFragment, - deprecationResolver - ) - - - fun createImportingScope(): LazyImportScope { - val tempTrace = TemporaryBindingTrace.create(bindingTrace, "Transient trace for default imports lazy resolve", false) - + private fun createDefaultImportResolversForFile(): Pair { val extraImports = file.originalFile.virtualFile?.let { vFile -> val scriptExternalDependencies = getScriptExternalDependencies(vFile, file.project) ktImportsFactory.createImportDirectives(scriptExternalDependencies?.imports?.map { ImportPath.fromString(it) }.orEmpty()) + }.orEmpty() + + if (extraImports.isEmpty() && aliasImportNames.isEmpty()) { + return defaultImportResolvers } - val allImplicitImports = defaultImports concat extraImports + return createDefaultImportResolvers(extraImports, aliasImportNames) + } - val defaultImportsFiltered = if (aliasImportNames.isEmpty()) { // optimization - allImplicitImports - } - else { - allImplicitImports.filter { it.isAllUnder || it.importedFqName !in aliasImportNames } - } - - val defaultExplicitImportResolver = createImportResolver(ExplicitImportsIndexed(defaultImportsFiltered), tempTrace) - val defaultAllUnderImportResolver = createImportResolver(AllUnderImportsIndexed(defaultImportsFiltered), tempTrace, defaultImportProvider.excludedImports) + fun createImportingScope(): LazyImportScope { + val (defaultExplicitImportResolver, defaultAllUnderImportResolver) = createDefaultImportResolversForFile() val dummyContainerDescriptor = DummyContainerDescriptor(file, packageFragment) @@ -161,8 +184,6 @@ class FileScopeFactory( return LazyImportScope(scope, explicitImportResolver, LazyImportScope.FilteringKind.ALL, "Explicit imports in $debugName") } - private infix fun Collection.concat(other: Collection?) = - if (other == null || other.isEmpty()) this else this + other } private enum class FilteringKind { @@ -258,3 +279,6 @@ class FileScopeFactory( } } } + +private infix fun Collection.concat(other: Collection?) = + if (other == null || other.isEmpty()) this else this + other From 51d396982254c6fb5b27b45376ad49137d52c9b6 Mon Sep 17 00:00:00 2001 From: Denis Zharkov Date: Wed, 16 Aug 2017 12:26:01 +0700 Subject: [PATCH 119/212] Do not run resolution processors for inapplicable statics --- .../org/jetbrains/kotlin/resolve/calls/tower/TowerResolver.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/tower/TowerResolver.kt b/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/tower/TowerResolver.kt index 21139f9557c..49f74d3ac5d 100644 --- a/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/tower/TowerResolver.kt +++ b/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/tower/TowerResolver.kt @@ -143,7 +143,7 @@ class TowerResolver { for (scope in lexicalScope.parentsWithSelf) { if (scope is LexicalScope) { // statics - if (!scope.kind.withLocalDescriptors) { + if (!scope.kind.withLocalDescriptors && scope.mayFitForName(name, location)) { TowerData.TowerLevel(ScopeBasedTowerLevel(this, scope)).process()?.let { return it } } From d0bf0f5fb340cb5d441abcc5d27d33878455c20b Mon Sep 17 00:00:00 2001 From: Denis Zharkov Date: Wed, 16 Aug 2017 13:01:53 +0700 Subject: [PATCH 120/212] Filter out inapplicable non-local levels for implicit receivers --- .../resolve/calls/tower/TowerResolver.kt | 32 +++++++++++-------- 1 file changed, 19 insertions(+), 13 deletions(-) diff --git a/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/tower/TowerResolver.kt b/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/tower/TowerResolver.kt index 49f74d3ac5d..a9c24775fc4 100644 --- a/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/tower/TowerResolver.kt +++ b/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/tower/TowerResolver.kt @@ -28,6 +28,7 @@ import org.jetbrains.kotlin.resolve.scopes.receivers.ReceiverValueWithSmartCastI import org.jetbrains.kotlin.resolve.scopes.utils.parentsWithSelf import org.jetbrains.kotlin.util.OperatorNameConventions import java.util.* +import kotlin.coroutines.experimental.buildSequence interface Candidate { // this operation should be very fast @@ -90,21 +91,21 @@ class TowerResolver { ): Collection = scopeTower.run(processor, AllCandidatesCollector(), false, name) - private fun ImplicitScopeTower.createNonLocalLevels(): List { - val result = ArrayList() - + private fun ImplicitScopeTower.createNonLocalLevels(name: Name): Sequence = buildSequence { lexicalScope.parentsWithSelf.forEach { scope -> if (scope is LexicalScope) { - if (!scope.kind.withLocalDescriptors) result.add(ScopeBasedTowerLevel(this, scope)) + if (!scope.kind.withLocalDescriptors && scope.mayFitForName(name, location)) { + yield(ScopeBasedTowerLevel(this@createNonLocalLevels, scope)) + } - getImplicitReceiver(scope)?.let { result.add(MemberScopeTowerLevel(this, it)) } + getImplicitReceiver(scope)?.let { + yield(MemberScopeTowerLevel(this@createNonLocalLevels, it)) + } } - else { - result.add(ImportingScopeBasedTowerLevel(this, scope as ImportingScope)) + else if (scope.mayFitForName(name, location)) { + yield(ImportingScopeBasedTowerLevel(this@createNonLocalLevels, scope as ImportingScope)) } } - - return result } private fun ImplicitScopeTower.run( @@ -170,11 +171,16 @@ class TowerResolver { // extension for implicit receiver if (nonLocalLevels == null) { - nonLocalLevels = createNonLocalLevels() + nonLocalLevels = arrayListOf() + for (nonLocalLevel in createNonLocalLevels(name)) { + TowerData.BothTowerLevelAndImplicitReceiver(nonLocalLevel, implicitReceiver).process()?.let { return it } + nonLocalLevels.add(nonLocalLevel) + } } - - for (nonLocalLevel in nonLocalLevels) { - TowerData.BothTowerLevelAndImplicitReceiver(nonLocalLevel, implicitReceiver).process()?.let { return it } + else { + for (nonLocalLevel in nonLocalLevels) { + TowerData.BothTowerLevelAndImplicitReceiver(nonLocalLevel, implicitReceiver).process()?.let { return it } + } } } } From 860951748f1fa64ec111df6672d2073ba8f371cf Mon Sep 17 00:00:00 2001 From: Denis Zharkov Date: Wed, 16 Aug 2017 15:49:02 +0700 Subject: [PATCH 121/212] Filter out inapplicable member scopes in resolution --- .../kotlin/resolve/calls/tower/TowerLevels.kt | 4 ++++ .../kotlin/resolve/calls/tower/TowerResolver.kt | 10 ++++++++-- .../kotlin/load/java/lazy/descriptors/LazyJavaScope.kt | 5 +++++ .../descriptors/DeserializedMemberScope.kt | 5 +++++ 4 files changed, 22 insertions(+), 2 deletions(-) diff --git a/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/tower/TowerLevels.kt b/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/tower/TowerLevels.kt index cee2f639914..f3bab33812d 100644 --- a/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/tower/TowerLevels.kt +++ b/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/tower/TowerLevels.kt @@ -87,6 +87,10 @@ internal class MemberScopeTowerLevel( private val syntheticScopes = scopeTower.syntheticScopes + fun definitelyDoesNotContainName(name: Name) = + (dispatchReceiver.possibleTypes + dispatchReceiver.receiverValue.type) + .all { !it.isDynamic() && it.memberScope.definitelyDoesNotContainName(name, location) } + private fun collectMembers( getMembers: ResolutionScope.(KotlinType?) -> Collection ): Collection { diff --git a/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/tower/TowerResolver.kt b/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/tower/TowerResolver.kt index a9c24775fc4..043f7029f8e 100644 --- a/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/tower/TowerResolver.kt +++ b/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/tower/TowerResolver.kt @@ -27,6 +27,7 @@ import org.jetbrains.kotlin.resolve.scopes.ResolutionScope import org.jetbrains.kotlin.resolve.scopes.receivers.ReceiverValueWithSmartCastInfo import org.jetbrains.kotlin.resolve.scopes.utils.parentsWithSelf import org.jetbrains.kotlin.util.OperatorNameConventions +import org.jetbrains.kotlin.utils.yieldIfNotNull import java.util.* import kotlin.coroutines.experimental.buildSequence @@ -99,7 +100,7 @@ class TowerResolver { } getImplicitReceiver(scope)?.let { - yield(MemberScopeTowerLevel(this@createNonLocalLevels, it)) + yieldIfNotNull(MemberScopeTowerLevel(this@createNonLocalLevels, it).takeIf { it.mayFitForName(name) }) } } else if (scope.mayFitForName(name, location)) { @@ -156,7 +157,9 @@ class TowerResolver { } // members of implicit receiver or member extension for explicit receiver - TowerData.TowerLevel(MemberScopeTowerLevel(this, implicitReceiver)).process()?.let { return it } + MemberScopeTowerLevel(this, implicitReceiver).takeIf { it.mayFitForName(name) }?.let { + TowerData.TowerLevel(it).process()?.let { return it } + } // synthetic properties TowerData.BothTowerLevelAndImplicitReceiver(syntheticLevel, implicitReceiver).process()?.let { return it } @@ -193,6 +196,9 @@ class TowerResolver { return resultCollector.getFinalCandidates() } + private fun MemberScopeTowerLevel.mayFitForName(name: Name) = + !definitelyDoesNotContainName(name) || !definitelyDoesNotContainName(OperatorNameConventions.INVOKE) + private fun ResolutionScope.mayFitForName(name: Name, location: LookupLocation) = !definitelyDoesNotContainName(name, location) || !definitelyDoesNotContainName(OperatorNameConventions.INVOKE, location) diff --git a/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/lazy/descriptors/LazyJavaScope.kt b/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/lazy/descriptors/LazyJavaScope.kt index 434f28ad9ed..d7834eab324 100644 --- a/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/lazy/descriptors/LazyJavaScope.kt +++ b/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/lazy/descriptors/LazyJavaScope.kt @@ -218,6 +218,11 @@ abstract class LazyJavaScope(protected val c: LazyJavaResolverContext) : MemberS override fun getVariableNames() = propertyNamesLazy override fun getClassifierNames() = classNamesLazy + override fun definitelyDoesNotContainName(name: Name, location: LookupLocation): Boolean { + recordLookup(name, location) + return name !in functionNamesLazy && name !in propertyNamesLazy && name !in classNamesLazy + } + override fun getContributedFunctions(name: Name, location: LookupLocation): Collection { if (name !in getFunctionNames()) return emptyList() return functions(name) diff --git a/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/descriptors/DeserializedMemberScope.kt b/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/descriptors/DeserializedMemberScope.kt index 83cb57b6a1a..3145304b9a6 100644 --- a/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/descriptors/DeserializedMemberScope.kt +++ b/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/descriptors/DeserializedMemberScope.kt @@ -78,6 +78,11 @@ abstract class DeserializedMemberScope protected constructor( override fun getVariableNames() = variableNamesLazy override fun getClassifierNames(): Set? = classNames + typeAliasNames + override fun definitelyDoesNotContainName(name: Name, location: LookupLocation): Boolean { + recordLookup(name, location) + return name !in functionNamesLazy && name !in variableNamesLazy && name !in classNames && name !in typeAliasNames + } + private inline fun Collection.groupByName( getNameIndex: (M) -> Int ) = groupBy { c.nameResolver.getName(getNameIndex(it)) } From 37440c70e2f6709ed7435ab2b1811f47f15af0fb Mon Sep 17 00:00:00 2001 From: Denis Zharkov Date: Wed, 16 Aug 2017 17:11:55 +0700 Subject: [PATCH 122/212] Optimize invoke processors - Avoid creating of empty KnownResultProcessor for variables - Do not consider definetely inapplicable tower data --- .../resolve/calls/tower/InvokeProcessors.kt | 44 ++++++++++++------- 1 file changed, 28 insertions(+), 16 deletions(-) diff --git a/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/tower/InvokeProcessors.kt b/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/tower/InvokeProcessors.kt index ac68d186966..30cb6720378 100644 --- a/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/tower/InvokeProcessors.kt +++ b/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/tower/InvokeProcessors.kt @@ -33,8 +33,10 @@ abstract class AbstractInvokeTowerProcessor( private val previousData = ArrayList() private val invokeProcessors: MutableList> = ArrayList() - private inner class VariableInvokeProcessor(val variableCandidate: C): ScopeTowerProcessor { - val invokeProcessor: ScopeTowerProcessor = createInvokeProcessor(variableCandidate) + private inner class VariableInvokeProcessor( + var variableCandidate: C, + val invokeProcessor: ScopeTowerProcessor + ): ScopeTowerProcessor { override fun process(data: TowerData) = invokeProcessor.process(data).map { candidateGroup -> @@ -42,26 +44,31 @@ abstract class AbstractInvokeTowerProcessor( } } - protected abstract fun createInvokeProcessor(variableCandidate: C): ScopeTowerProcessor + private fun createVariableInvokeProcessor(variableCandidate: C): VariableInvokeProcessor? = + createInvokeProcessor(variableCandidate)?.let { VariableInvokeProcessor(variableCandidate, it) } + + protected abstract fun createInvokeProcessor(variableCandidate: C): ScopeTowerProcessor? + + protected abstract fun mayDataBeApplicable(data: TowerData): Boolean override fun process(data: TowerData): List> { - previousData.add(data) val candidateGroups = ArrayList>(0) - for (processorsGroup in invokeProcessors) { - candidateGroups.addAll(processorsGroup.processVariableGroup(data)) + if (mayDataBeApplicable(data)) { + previousData.add(data) + for (processorsGroup in invokeProcessors) { + candidateGroups.addAll(processorsGroup.processVariableGroup(data)) + } } for (variableCandidates in variableProcessor.process(data)) { - val successfulVariables = variableCandidates.filter { - it.isSuccessful + val variableProcessors = variableCandidates.mapNotNull { + if (it.isSuccessful) createVariableInvokeProcessor(it) else null } - if (successfulVariables.isNotEmpty()) { - val variableProcessors = successfulVariables.map { VariableInvokeProcessor(it) } + if (variableProcessors.isNotEmpty()) { invokeProcessors.add(variableProcessors) - for (oldData in previousData) { candidateGroups.addAll(variableProcessors.processVariableGroup(oldData)) } @@ -95,11 +102,14 @@ class InvokeTowerProcessor( ) { // todo filter by operator - override fun createInvokeProcessor(variableCandidate: C): ScopeTowerProcessor { + override fun createInvokeProcessor(variableCandidate: C): ScopeTowerProcessor? { val (variableReceiver, invokeContext) = factoryProviderForInvoke.factoryForInvoke(variableCandidate, useExplicitReceiver = false) - ?: return KnownResultProcessor(emptyList()) + ?: return null return ExplicitReceiverScopeTowerProcessor(scopeTower, invokeContext, variableReceiver) { getFunctions(OperatorNameConventions.INVOKE, it) } } + + override fun mayDataBeApplicable(data: TowerData) = + data == TowerData.Empty || data is TowerData.TowerLevel } class InvokeExtensionTowerProcessor( @@ -112,13 +122,15 @@ class InvokeExtensionTowerProcessor( createVariableAndObjectProcessor(scopeTower, name, factoryProviderForInvoke.factoryForVariable(stripExplicitReceiver = true), explicitReceiver = null) ) { - override fun createInvokeProcessor(variableCandidate: C): ScopeTowerProcessor { + override fun createInvokeProcessor(variableCandidate: C): ScopeTowerProcessor? { val (variableReceiver, invokeContext) = factoryProviderForInvoke.factoryForInvoke(variableCandidate, useExplicitReceiver = true) - ?: return KnownResultProcessor(emptyList()) + ?: return null val invokeDescriptor = scopeTower.getExtensionInvokeCandidateDescriptor(variableReceiver) - ?: return KnownResultProcessor(emptyList()) + ?: return null return InvokeExtensionScopeTowerProcessor(invokeContext, invokeDescriptor, explicitReceiver) } + + override fun mayDataBeApplicable(data: TowerData): Boolean = data == TowerData.Empty || data is TowerData.OnlyImplicitReceiver } private class InvokeExtensionScopeTowerProcessor( From 580a7e3e4d2347342c2b7c2c925ce68346d71298 Mon Sep 17 00:00:00 2001 From: Denis Zharkov Date: Thu, 24 Aug 2017 10:56:00 +0300 Subject: [PATCH 123/212] Drop location parameter from ResolutionScope::definitelyDoesNotContainName definitelyDoesNotContainName is called too eagerly sometimes and it leads to obviously redundant lookups The idea is to put responsibility for calling recordLookup to resolution itself --- .../jetbrains/kotlin/resolve/lazy/FileScopeFactory.kt | 6 +----- .../jetbrains/kotlin/resolve/lazy/LazyImportScope.kt | 10 ++-------- .../kotlin/resolve/calls/tower/TowerLevels.kt | 2 +- .../kotlin/resolve/calls/tower/TowerResolver.kt | 4 ++-- .../kotlin/resolve/scopes/LexicalScopeStorage.kt | 2 +- .../src/org/jetbrains/kotlin/resolve/scopes/Scopes.kt | 4 ++-- .../kotlin/load/java/lazy/descriptors/LazyJavaScope.kt | 3 +-- .../kotlin/resolve/scopes/InnerClassesScopeWrapper.kt | 2 +- .../jetbrains/kotlin/resolve/scopes/ResolutionScope.kt | 2 +- .../kotlin/resolve/scopes/SubstitutingScope.kt | 2 +- .../src/org/jetbrains/kotlin/types/ErrorUtils.java | 4 ++-- .../deserialization/MetadataPackageFragmentProvider.kt | 2 +- .../descriptors/DeserializedMemberScope.kt | 3 +-- 13 files changed, 17 insertions(+), 29 deletions(-) diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/FileScopeFactory.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/FileScopeFactory.kt index 3c712e1d0b6..8900f6c419e 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/FileScopeFactory.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/FileScopeFactory.kt @@ -241,11 +241,7 @@ class FileScopeFactory( override fun computeImportedNames() = packageView.memberScope.computeAllNames() - override fun definitelyDoesNotContainName(name: Name, location: LookupLocation): Boolean { - if (names?.let { name in it } != false) return false - packageView.memberScope.recordLookup(name, location) - return true - } + override fun definitelyDoesNotContainName(name: Name) = names?.let { name !in it } == true override fun toString() = "Scope for current package (${filteringKind.name})" diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/LazyImportScope.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/LazyImportScope.kt index 63aacd7b718..d62b6e05969 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/LazyImportScope.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/LazyImportScope.kt @@ -197,13 +197,7 @@ class LazyImportResolver( indexedImports.imports.flatMapToNullable(hashSetOf()) { getImportScope(it).computeImportedNames() } } - fun definitelyDoesNotContainName(name: Name, location: LookupLocation): Boolean { - if (allNames?.let { name in it } != false) return false - indexedImports.importsForName(name).forEach { - getImportScope(it).recordLookup(name, location) - } - return true - } + fun definitelyDoesNotContainName(name: Name) = allNames?.let { name !in it } == true } class LazyImportScope( @@ -283,6 +277,6 @@ class LazyImportScope( p.println("}") } - override fun definitelyDoesNotContainName(name: Name, location: LookupLocation) = importResolver.definitelyDoesNotContainName(name, location) + override fun definitelyDoesNotContainName(name: Name) = importResolver.definitelyDoesNotContainName(name) override fun computeImportedNames() = importResolver.allNames } diff --git a/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/tower/TowerLevels.kt b/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/tower/TowerLevels.kt index f3bab33812d..01961771ce0 100644 --- a/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/tower/TowerLevels.kt +++ b/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/tower/TowerLevels.kt @@ -89,7 +89,7 @@ internal class MemberScopeTowerLevel( fun definitelyDoesNotContainName(name: Name) = (dispatchReceiver.possibleTypes + dispatchReceiver.receiverValue.type) - .all { !it.isDynamic() && it.memberScope.definitelyDoesNotContainName(name, location) } + .all { !it.isDynamic() && it.memberScope.definitelyDoesNotContainName(name) } private fun collectMembers( getMembers: ResolutionScope.(KotlinType?) -> Collection diff --git a/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/tower/TowerResolver.kt b/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/tower/TowerResolver.kt index 043f7029f8e..c54e043e0bd 100644 --- a/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/tower/TowerResolver.kt +++ b/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/tower/TowerResolver.kt @@ -199,8 +199,8 @@ class TowerResolver { private fun MemberScopeTowerLevel.mayFitForName(name: Name) = !definitelyDoesNotContainName(name) || !definitelyDoesNotContainName(OperatorNameConventions.INVOKE) - private fun ResolutionScope.mayFitForName(name: Name, location: LookupLocation) = - !definitelyDoesNotContainName(name, location) || !definitelyDoesNotContainName(OperatorNameConventions.INVOKE, location) + private fun ResolutionScope.mayFitForName(name: Name) = + !definitelyDoesNotContainName(name) || !definitelyDoesNotContainName(OperatorNameConventions.INVOKE) fun runWithEmptyTowerData( processor: ScopeTowerProcessor, diff --git a/compiler/resolution/src/org/jetbrains/kotlin/resolve/scopes/LexicalScopeStorage.kt b/compiler/resolution/src/org/jetbrains/kotlin/resolve/scopes/LexicalScopeStorage.kt index d0955181caf..f2e67b63155 100644 --- a/compiler/resolution/src/org/jetbrains/kotlin/resolve/scopes/LexicalScopeStorage.kt +++ b/compiler/resolution/src/org/jetbrains/kotlin/resolve/scopes/LexicalScopeStorage.kt @@ -125,6 +125,6 @@ abstract class LexicalScopeStorage( return result } - override fun definitelyDoesNotContainName(name: Name, location: LookupLocation) = + override fun definitelyDoesNotContainName(name: Name) = functionsByName?.get(name) == null && variablesAndClassifiersByName?.get(name) == null } diff --git a/compiler/resolution/src/org/jetbrains/kotlin/resolve/scopes/Scopes.kt b/compiler/resolution/src/org/jetbrains/kotlin/resolve/scopes/Scopes.kt index abe76348ff5..8d84419555b 100644 --- a/compiler/resolution/src/org/jetbrains/kotlin/resolve/scopes/Scopes.kt +++ b/compiler/resolution/src/org/jetbrains/kotlin/resolve/scopes/Scopes.kt @@ -55,7 +55,7 @@ interface LexicalScope : HierarchicalScope { override val kind: LexicalScopeKind get() = LexicalScopeKind.EMPTY - override fun definitelyDoesNotContainName(name: Name, location: LookupLocation) = true + override fun definitelyDoesNotContainName(name: Name) = true override fun printStructure(p: Printer) { p.println("Base lexical scope with owner = $ownerDescriptor and parent = $parent") @@ -130,7 +130,7 @@ interface ImportingScope : HierarchicalScope { override fun computeImportedNames() = emptySet() - override fun definitelyDoesNotContainName(name: Name, location: LookupLocation) = true + override fun definitelyDoesNotContainName(name: Name) = true } } diff --git a/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/lazy/descriptors/LazyJavaScope.kt b/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/lazy/descriptors/LazyJavaScope.kt index d7834eab324..4b3633aa5d1 100644 --- a/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/lazy/descriptors/LazyJavaScope.kt +++ b/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/lazy/descriptors/LazyJavaScope.kt @@ -218,8 +218,7 @@ abstract class LazyJavaScope(protected val c: LazyJavaResolverContext) : MemberS override fun getVariableNames() = propertyNamesLazy override fun getClassifierNames() = classNamesLazy - override fun definitelyDoesNotContainName(name: Name, location: LookupLocation): Boolean { - recordLookup(name, location) + override fun definitelyDoesNotContainName(name: Name): Boolean { return name !in functionNamesLazy && name !in propertyNamesLazy && name !in classNamesLazy } diff --git a/core/descriptors/src/org/jetbrains/kotlin/resolve/scopes/InnerClassesScopeWrapper.kt b/core/descriptors/src/org/jetbrains/kotlin/resolve/scopes/InnerClassesScopeWrapper.kt index e9bec2bbe08..10f0011be3d 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/resolve/scopes/InnerClassesScopeWrapper.kt +++ b/core/descriptors/src/org/jetbrains/kotlin/resolve/scopes/InnerClassesScopeWrapper.kt @@ -44,7 +44,7 @@ class InnerClassesScopeWrapper(val workerScope: MemberScope) : MemberScopeImpl() override fun getVariableNames() = workerScope.getVariableNames() override fun getClassifierNames() = workerScope.getClassifierNames() - override fun definitelyDoesNotContainName(name: Name, location: LookupLocation) = workerScope.definitelyDoesNotContainName(name, location) + override fun definitelyDoesNotContainName(name: Name) = workerScope.definitelyDoesNotContainName(name) override fun toString() = "Classes from $workerScope" } diff --git a/core/descriptors/src/org/jetbrains/kotlin/resolve/scopes/ResolutionScope.kt b/core/descriptors/src/org/jetbrains/kotlin/resolve/scopes/ResolutionScope.kt index 09315421f7f..0a772b52259 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/resolve/scopes/ResolutionScope.kt +++ b/core/descriptors/src/org/jetbrains/kotlin/resolve/scopes/ResolutionScope.kt @@ -40,7 +40,7 @@ interface ResolutionScope { nameFilter: (Name) -> Boolean = MemberScope.ALL_NAME_FILTER ): Collection - fun definitelyDoesNotContainName(name: Name, location: LookupLocation): Boolean = false + fun definitelyDoesNotContainName(name: Name): Boolean = false fun recordLookup(name: Name, location: LookupLocation) { getContributedFunctions(name, location) diff --git a/core/descriptors/src/org/jetbrains/kotlin/resolve/scopes/SubstitutingScope.kt b/core/descriptors/src/org/jetbrains/kotlin/resolve/scopes/SubstitutingScope.kt index f4e94ab06d7..d4cae2f38cb 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/resolve/scopes/SubstitutingScope.kt +++ b/core/descriptors/src/org/jetbrains/kotlin/resolve/scopes/SubstitutingScope.kt @@ -83,7 +83,7 @@ class SubstitutingScope(private val workerScope: MemberScope, givenSubstitutor: override fun getVariableNames() = workerScope.getVariableNames() override fun getClassifierNames() = workerScope.getClassifierNames() - override fun definitelyDoesNotContainName(name: Name, location: LookupLocation) = workerScope.definitelyDoesNotContainName(name, location) + override fun definitelyDoesNotContainName(name: Name) = workerScope.definitelyDoesNotContainName(name) override fun printScopeStructure(p: Printer) { p.println(this::class.java.simpleName, " {") diff --git a/core/descriptors/src/org/jetbrains/kotlin/types/ErrorUtils.java b/core/descriptors/src/org/jetbrains/kotlin/types/ErrorUtils.java index 0a412f71927..cf21ac75fe3 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/types/ErrorUtils.java +++ b/core/descriptors/src/org/jetbrains/kotlin/types/ErrorUtils.java @@ -231,7 +231,7 @@ public class ErrorUtils { } @Override - public boolean definitelyDoesNotContainName(@NotNull Name name, @NotNull LookupLocation location) { + public boolean definitelyDoesNotContainName(@NotNull Name name) { return false; } @@ -306,7 +306,7 @@ public class ErrorUtils { } @Override - public boolean definitelyDoesNotContainName(@NotNull Name name, @NotNull LookupLocation location) { + public boolean definitelyDoesNotContainName(@NotNull Name name) { return false; } diff --git a/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/MetadataPackageFragmentProvider.kt b/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/MetadataPackageFragmentProvider.kt index fbe1e3b3e71..f3a6c79e598 100644 --- a/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/MetadataPackageFragmentProvider.kt +++ b/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/MetadataPackageFragmentProvider.kt @@ -107,7 +107,7 @@ class MetadataPackageFragment( containerSource = null, components = components, classNames = { emptyList() } ) { override fun hasClass(name: Name): Boolean = hasTopLevelClass(name) - override fun definitelyDoesNotContainName(name: Name, location: LookupLocation) = false + override fun definitelyDoesNotContainName(name: Name) = false override fun getClassifierNames(): Set? = null }) diff --git a/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/descriptors/DeserializedMemberScope.kt b/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/descriptors/DeserializedMemberScope.kt index 3145304b9a6..d46f1158a7e 100644 --- a/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/descriptors/DeserializedMemberScope.kt +++ b/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/descriptors/DeserializedMemberScope.kt @@ -78,8 +78,7 @@ abstract class DeserializedMemberScope protected constructor( override fun getVariableNames() = variableNamesLazy override fun getClassifierNames(): Set? = classNames + typeAliasNames - override fun definitelyDoesNotContainName(name: Name, location: LookupLocation): Boolean { - recordLookup(name, location) + override fun definitelyDoesNotContainName(name: Name): Boolean { return name !in functionNamesLazy && name !in variableNamesLazy && name !in classNames && name !in typeAliasNames } From 265794e712c8a78359f7a98c22bb00fd29b53cf7 Mon Sep 17 00:00:00 2001 From: Denis Zharkov Date: Thu, 24 Aug 2017 11:14:15 +0300 Subject: [PATCH 124/212] Add necessary ResolutionScope::recordLookup implementations --- .../jetbrains/kotlin/resolve/AllUnderImportScope.kt | 4 ++++ .../jetbrains/kotlin/resolve/lazy/LazyImportScope.kt | 12 ++++++++++++ .../kotlin/resolve/scopes/AbstractScopeAdapter.kt | 3 +++ .../kotlin/resolve/scopes/ChainedMemberScope.kt | 4 ++++ .../descriptors/DeserializedPackageMemberScope.kt | 6 +++++- 5 files changed, 28 insertions(+), 1 deletion(-) diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/AllUnderImportScope.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/AllUnderImportScope.kt index 4f4035bc069..35aa948ec9c 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/AllUnderImportScope.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/AllUnderImportScope.kt @@ -86,6 +86,10 @@ class AllUnderImportScope( return scopes.flatMap { it.getContributedFunctions(name, location) } } + override fun recordLookup(name: Name, location: LookupLocation) { + scopes.forEach { it.recordLookup(name, location) } + } + override fun printStructure(p: Printer) { p.println(this::class.java.simpleName) } diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/LazyImportScope.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/LazyImportScope.kt index d62b6e05969..fc6a4b3804b 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/LazyImportScope.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/LazyImportScope.kt @@ -198,6 +198,13 @@ class LazyImportResolver( } fun definitelyDoesNotContainName(name: Name) = allNames?.let { name !in it } == true + + fun recordLookup(name: Name, location: LookupLocation) { + if (allNames == null) return + indexedImports.importsForName(name).forEach { + getImportScope(it).recordLookup(name, location) + } + } } class LazyImportScope( @@ -278,5 +285,10 @@ class LazyImportScope( } override fun definitelyDoesNotContainName(name: Name) = importResolver.definitelyDoesNotContainName(name) + + override fun recordLookup(name: Name, location: LookupLocation) { + importResolver.recordLookup(name, location) + } + override fun computeImportedNames() = importResolver.allNames } diff --git a/core/descriptors/src/org/jetbrains/kotlin/resolve/scopes/AbstractScopeAdapter.kt b/core/descriptors/src/org/jetbrains/kotlin/resolve/scopes/AbstractScopeAdapter.kt index b98f5f06998..f6a889c55e9 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/resolve/scopes/AbstractScopeAdapter.kt +++ b/core/descriptors/src/org/jetbrains/kotlin/resolve/scopes/AbstractScopeAdapter.kt @@ -57,6 +57,9 @@ abstract class AbstractScopeAdapter : MemberScope { override fun getVariableNames() = workerScope.getVariableNames() override fun getClassifierNames() = workerScope.getClassifierNames() + override fun recordLookup(name: Name, location: LookupLocation) { + workerScope.recordLookup(name, location) + } override fun printScopeStructure(p: Printer) { p.println(this::class.java.simpleName, " {") diff --git a/core/descriptors/src/org/jetbrains/kotlin/resolve/scopes/ChainedMemberScope.kt b/core/descriptors/src/org/jetbrains/kotlin/resolve/scopes/ChainedMemberScope.kt index fd521dd5436..50cd3e5841e 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/resolve/scopes/ChainedMemberScope.kt +++ b/core/descriptors/src/org/jetbrains/kotlin/resolve/scopes/ChainedMemberScope.kt @@ -45,6 +45,10 @@ class ChainedMemberScope( override fun getVariableNames() = scopes.flatMapTo(mutableSetOf()) { it.getVariableNames() } override fun getClassifierNames(): Set? = scopes.flatMapClassifierNamesOrNull() + override fun recordLookup(name: Name, location: LookupLocation) { + scopes.forEach { it.recordLookup(name, location) } + } + override fun toString() = debugName override fun printScopeStructure(p: Printer) { diff --git a/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/descriptors/DeserializedPackageMemberScope.kt b/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/descriptors/DeserializedPackageMemberScope.kt index bc9b7bef674..7b585b775ab 100644 --- a/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/descriptors/DeserializedPackageMemberScope.kt +++ b/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/descriptors/DeserializedPackageMemberScope.kt @@ -55,10 +55,14 @@ open class DeserializedPackageMemberScope( override fun getContributedClassifier(name: Name, location: LookupLocation): ClassifierDescriptor? { - c.components.lookupTracker.record(location, packageDescriptor, name) + recordLookup(name, location) return super.getContributedClassifier(name, location) } + override fun recordLookup(name: Name, location: LookupLocation) { + c.components.lookupTracker.record(location, packageDescriptor, name) + } + override fun getNonDeclaredFunctionNames(): Set = emptySet() override fun getNonDeclaredVariableNames(): Set = emptySet() From b1387b2ae7b187b25541ecbde46096369e519054 Mon Sep 17 00:00:00 2001 From: Denis Zharkov Date: Thu, 24 Aug 2017 11:21:03 +0300 Subject: [PATCH 125/212] Make call resolution responsible for calling recordLookups The idea is that all tower levels are partitioned into two groups: - ones that may contain the target name or INVOKE; they're processed as usual - ones that can't contain the name; they're simply skipped until the end of resolution process when it's being passed to scope processors to allow them record necessary lookups --- .../resolve/calls/tower/ImplicitScopeTower.kt | 2 + .../resolve/calls/tower/InvokeProcessors.kt | 26 +++- .../calls/tower/ScopeTowerProcessors.kt | 30 +++++ .../kotlin/resolve/calls/tower/TowerLevels.kt | 23 +++- .../resolve/calls/tower/TowerResolver.kt | 116 +++++++++++++----- 5 files changed, 160 insertions(+), 37 deletions(-) diff --git a/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/tower/ImplicitScopeTower.kt b/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/tower/ImplicitScopeTower.kt index 7f0d0baa6c9..4838ce435ac 100644 --- a/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/tower/ImplicitScopeTower.kt +++ b/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/tower/ImplicitScopeTower.kt @@ -50,6 +50,8 @@ interface ScopeTowerLevel { fun getObjects(name: Name, extensionReceiver: ReceiverValueWithSmartCastInfo?): Collection fun getFunctions(name: Name, extensionReceiver: ReceiverValueWithSmartCastInfo?): Collection + + fun recordLookup(name: Name) } interface CandidateWithBoundDispatchReceiver { diff --git a/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/tower/InvokeProcessors.kt b/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/tower/InvokeProcessors.kt index 30cb6720378..15211751e74 100644 --- a/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/tower/InvokeProcessors.kt +++ b/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/tower/InvokeProcessors.kt @@ -27,12 +27,14 @@ import java.util.* abstract class AbstractInvokeTowerProcessor( protected val factoryProviderForInvoke: CandidateFactoryProviderForInvoke, - private val variableProcessor: ScopeTowerProcessor + protected val variableProcessor: ScopeTowerProcessor ) : ScopeTowerProcessor { // todo optimize it private val previousData = ArrayList() private val invokeProcessors: MutableList> = ArrayList() + protected fun hasInvokeProcessors() = invokeProcessors.isNotEmpty() + private inner class VariableInvokeProcessor( var variableCandidate: C, val invokeProcessor: ScopeTowerProcessor @@ -42,6 +44,10 @@ abstract class AbstractInvokeTowerProcessor( = invokeProcessor.process(data).map { candidateGroup -> candidateGroup.map { factoryProviderForInvoke.transformCandidate(variableCandidate, it) } } + + override fun recordLookups(skippedData: Collection, name: Name) { + invokeProcessor.recordLookups(skippedData, name) + } } private fun createVariableInvokeProcessor(variableCandidate: C): VariableInvokeProcessor? = @@ -110,6 +116,17 @@ class InvokeTowerProcessor( override fun mayDataBeApplicable(data: TowerData) = data == TowerData.Empty || data is TowerData.TowerLevel + + override fun recordLookups(skippedData: Collection, name: Name) { + variableProcessor.recordLookups(skippedData, name) + if (!hasInvokeProcessors()) return + + skippedData.forEach { + if (it is TowerData.TowerLevel) { + it.level.recordLookup(OperatorNameConventions.INVOKE) + } + } + } } class InvokeExtensionTowerProcessor( @@ -131,6 +148,10 @@ class InvokeExtensionTowerProcessor( } override fun mayDataBeApplicable(data: TowerData): Boolean = data == TowerData.Empty || data is TowerData.OnlyImplicitReceiver + + override fun recordLookups(skippedData: Collection, name: Name) { + variableProcessor.recordLookups(skippedData, name) + } } private class InvokeExtensionScopeTowerProcessor( @@ -150,6 +171,9 @@ private class InvokeExtensionScopeTowerProcessor( return emptyList() } + + // No lookups happen in `simpleProcess` + override fun recordLookups(skippedData: Collection, name: Name) {} } // todo debug info diff --git a/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/tower/ScopeTowerProcessors.kt b/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/tower/ScopeTowerProcessors.kt index 84320fc7506..5208d4440a5 100644 --- a/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/tower/ScopeTowerProcessors.kt +++ b/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/tower/ScopeTowerProcessors.kt @@ -28,6 +28,8 @@ class KnownResultProcessor( ): ScopeTowerProcessor { override fun process(data: TowerData) = if (data == TowerData.Empty) listOfNotNull(result.takeIf { it.isNotEmpty() }) else emptyList() + + override fun recordLookups(skippedData: Collection, name: Name) {} } // use this if processors priority is important @@ -35,6 +37,11 @@ class PrioritizedCompositeScopeTowerProcessor( vararg val processors: ScopeTowerProcessor ) : ScopeTowerProcessor { override fun process(data: TowerData): List> = processors.flatMap { it.process(data) } + + override fun recordLookups(skippedData: Collection, name: Name) { + processors.forEach { it.recordLookups(skippedData, name) } + } + } // use this if all processors has same priority @@ -42,6 +49,10 @@ class SamePriorityCompositeScopeTowerProcessor( private vararg val processors: SimpleScopeTowerProcessor ): SimpleScopeTowerProcessor { override fun simpleProcess(data: TowerData): Collection = processors.flatMap { it.simpleProcess(data) } + override fun recordLookups(skippedData: Collection, name: Name) { + processors.forEach { it.recordLookups(skippedData, name) } + } + } internal abstract class AbstractSimpleScopeTowerProcessor( @@ -84,6 +95,14 @@ internal class ExplicitReceiverScopeTowerProcessor( } return extensions } + + override fun recordLookups(skippedData: Collection, name: Name) { + for (data in skippedData) { + if (data is TowerData.TowerLevel) { + data.level.recordLookup(name) + } + } + } } private class QualifierScopeTowerProcessor( @@ -103,6 +122,9 @@ private class QualifierScopeTowerProcessor( } return staticMembers } + + // QualifierScopeTowerProcessor works only with TowerData.Empty that should not be ignored + override fun recordLookups(skippedData: Collection, name: Name) {} } private class NoExplicitReceiverScopeTowerProcessor( @@ -132,6 +154,14 @@ private class NoExplicitReceiverScopeTowerProcessor( else -> emptyList() } + override fun recordLookups(skippedData: Collection, name: Name) { + for (data in skippedData) { + when (data) { + is TowerData.TowerLevel -> data.level.recordLookup(name) + is TowerData.BothTowerLevelAndImplicitReceiver -> data.level.recordLookup(name) + } + } + } } private fun createSimpleProcessorWithoutClassValueReceiver( diff --git a/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/tower/TowerLevels.kt b/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/tower/TowerLevels.kt index 01961771ce0..a1bae96f1be 100644 --- a/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/tower/TowerLevels.kt +++ b/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/tower/TowerLevels.kt @@ -87,10 +87,6 @@ internal class MemberScopeTowerLevel( private val syntheticScopes = scopeTower.syntheticScopes - fun definitelyDoesNotContainName(name: Name) = - (dispatchReceiver.possibleTypes + dispatchReceiver.receiverValue.type) - .all { !it.isDynamic() && it.memberScope.definitelyDoesNotContainName(name) } - private fun collectMembers( getMembers: ResolutionScope.(KotlinType?) -> Collection ): Collection { @@ -173,6 +169,13 @@ internal class MemberScopeTowerLevel( syntheticScopes.collectSyntheticMemberFunctions(listOfNotNull(it), name, location) } } + + override fun recordLookup(name: Name) { + dispatchReceiver.receiverValue.type.memberScope.recordLookup(name, location) + dispatchReceiver.possibleTypes.forEach { + it.memberScope.recordLookup(name, location) + } + } } internal class QualifierScopeTowerLevel(scopeTower: ImplicitScopeTower, val qualifier: QualifierReceiver) : AbstractScopeTowerLevel(scopeTower) { @@ -193,6 +196,8 @@ internal class QualifierScopeTowerLevel(scopeTower: ImplicitScopeTower, val qual qualifier.staticScope).map { createCandidateDescriptor(it, dispatchReceiver = null) } + + override fun recordLookup(name: Name) {} } // KT-3335 Creating imported super class' inner class fails in codegen @@ -220,6 +225,10 @@ internal open class ScopeBasedTowerLevel protected constructor( resolutionScope).map { createCandidateDescriptor(it, dispatchReceiver = null) } + + override fun recordLookup(name: Name) { + resolutionScope.recordLookup(name, location) + } } internal class ImportingScopeBasedTowerLevel( scopeTower: ImplicitScopeTower, @@ -251,6 +260,10 @@ internal class SyntheticScopeBasedTowerLevel( extensionReceiver: ReceiverValueWithSmartCastInfo? ): Collection = emptyList() + + override fun recordLookup(name: Name) { + + } } internal class HidesMembersTowerLevel(scopeTower: ImplicitScopeTower): AbstractScopeTowerLevel(scopeTower) { @@ -276,6 +289,8 @@ internal class HidesMembersTowerLevel(scopeTower: ImplicitScopeTower): AbstractS createCandidateDescriptor(it, dispatchReceiver = null) } } + + override fun recordLookup(name: Name) {} } private fun KotlinType.getClassifierFromMeAndSuperclasses(name: Name, location: LookupLocation): ClassifierDescriptor? { diff --git a/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/tower/TowerResolver.kt b/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/tower/TowerResolver.kt index c54e043e0bd..4d25b29d7cd 100644 --- a/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/tower/TowerResolver.kt +++ b/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/tower/TowerResolver.kt @@ -16,7 +16,6 @@ package org.jetbrains.kotlin.resolve.calls.tower -import org.jetbrains.kotlin.incremental.components.LookupLocation import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.progress.ProgressIndicatorAndCompilationCanceledStatus import org.jetbrains.kotlin.resolve.calls.tasks.ExplicitReceiverKind @@ -26,10 +25,10 @@ import org.jetbrains.kotlin.resolve.scopes.LexicalScope import org.jetbrains.kotlin.resolve.scopes.ResolutionScope import org.jetbrains.kotlin.resolve.scopes.receivers.ReceiverValueWithSmartCastInfo import org.jetbrains.kotlin.resolve.scopes.utils.parentsWithSelf +import org.jetbrains.kotlin.types.KotlinType +import org.jetbrains.kotlin.types.isDynamic import org.jetbrains.kotlin.util.OperatorNameConventions -import org.jetbrains.kotlin.utils.yieldIfNotNull import java.util.* -import kotlin.coroutines.experimental.buildSequence interface Candidate { // this operation should be very fast @@ -69,6 +68,8 @@ interface ScopeTowerProcessor { // Candidates with matched receivers (dispatch receiver was already matched in ScopeTowerLevel) // Candidates in one groups have same priority, first group has highest priority. fun process(data: TowerData): List> + + fun recordLookups(skippedData: Collection, name: Name) } interface SimpleScopeTowerProcessor : ScopeTowerProcessor { @@ -92,21 +93,49 @@ class TowerResolver { ): Collection = scopeTower.run(processor, AllCandidatesCollector(), false, name) - private fun ImplicitScopeTower.createNonLocalLevels(name: Name): Sequence = buildSequence { + private data class ScopeLevelsAndSkippedForLookups( + val levelsToProcess: Collection, + val levelsToSkip: Collection + ) + + private fun ImplicitScopeTower.createNonLocalLevels(name: Name): ScopeLevelsAndSkippedForLookups { + val mainResult = mutableListOf() + val skippedLevels = mutableListOf() + + fun addLevel(scopeTowerLevel: ScopeTowerLevel, mayFitForName: Boolean) { + if (mayFitForName) { + mainResult.add(scopeTowerLevel) + } + else { + skippedLevels.add(scopeTowerLevel) + } + } + lexicalScope.parentsWithSelf.forEach { scope -> if (scope is LexicalScope) { - if (!scope.kind.withLocalDescriptors && scope.mayFitForName(name, location)) { - yield(ScopeBasedTowerLevel(this@createNonLocalLevels, scope)) + if (!scope.kind.withLocalDescriptors) { + addLevel( + ScopeBasedTowerLevel(this@createNonLocalLevels, scope), + scope.mayFitForName(name) + ) } getImplicitReceiver(scope)?.let { - yieldIfNotNull(MemberScopeTowerLevel(this@createNonLocalLevels, it).takeIf { it.mayFitForName(name) }) + addLevel( + MemberScopeTowerLevel(this@createNonLocalLevels, it), + it.mayFitForName(name) + ) } } - else if (scope.mayFitForName(name, location)) { - yield(ImportingScopeBasedTowerLevel(this@createNonLocalLevels, scope as ImportingScope)) + else { + addLevel( + ImportingScopeBasedTowerLevel(this@createNonLocalLevels, scope as ImportingScope), + scope.mayFitForName(name) + ) } } + + return ScopeLevelsAndSkippedForLookups(mainResult, skippedLevels) } private fun ImplicitScopeTower.run( @@ -115,7 +144,23 @@ class TowerResolver { useOrder: Boolean, name: Name ): Collection { - fun TowerData.process() = processTowerData(processor, resultCollector, useOrder, this) + val skippedDataForLookup = mutableListOf() + + fun recordLookups() { + processor.recordLookups(skippedDataForLookup, name) + } + + fun TowerData.process() = processTowerData(processor, resultCollector, useOrder, this)?.also { + recordLookups() + } + + fun TowerData.process(mayFitForName: Boolean): Collection? { + if (!mayFitForName) { + skippedDataForLookup.add(this) + return null + } + return process() + } // Lazy calculation var nonLocalLevels: Collection? = null @@ -134,7 +179,7 @@ class TowerResolver { val localLevels = lexicalScope.parentsWithSelf. - filterIsInstance().filter { it.kind.withLocalDescriptors && it.mayFitForName(name, location) }. + filterIsInstance().filter { it.kind.withLocalDescriptors && it.mayFitForName(name) }. map { ScopeBasedTowerLevel(this@run, it) }.toList() // local non-extensions or extension for explicit receiver @@ -145,8 +190,9 @@ class TowerResolver { for (scope in lexicalScope.parentsWithSelf) { if (scope is LexicalScope) { // statics - if (!scope.kind.withLocalDescriptors && scope.mayFitForName(name, location)) { - TowerData.TowerLevel(ScopeBasedTowerLevel(this, scope)).process()?.let { return it } + if (!scope.kind.withLocalDescriptors) { + TowerData.TowerLevel(ScopeBasedTowerLevel(this, scope)) + .process(scope.mayFitForName(name))?.let { return it } } val implicitReceiver = getImplicitReceiver(scope) @@ -157,9 +203,8 @@ class TowerResolver { } // members of implicit receiver or member extension for explicit receiver - MemberScopeTowerLevel(this, implicitReceiver).takeIf { it.mayFitForName(name) }?.let { - TowerData.TowerLevel(it).process()?.let { return it } - } + TowerData.TowerLevel(MemberScopeTowerLevel(this, implicitReceiver)) + .process(implicitReceiver.mayFitForName(name))?.let { return it } // synthetic properties TowerData.BothTowerLevelAndImplicitReceiver(syntheticLevel, implicitReceiver).process()?.let { return it } @@ -172,32 +217,39 @@ class TowerResolver { TowerData.BothTowerLevelAndImplicitReceiver(localLevel, implicitReceiver).process()?.let { return it } } - // extension for implicit receiver - if (nonLocalLevels == null) { - nonLocalLevels = arrayListOf() - for (nonLocalLevel in createNonLocalLevels(name)) { - TowerData.BothTowerLevelAndImplicitReceiver(nonLocalLevel, implicitReceiver).process()?.let { return it } - nonLocalLevels.add(nonLocalLevel) - } + if (nonLocalLevels == null) { + val (toProcess, toSkip) = createNonLocalLevels(name) + nonLocalLevels = toProcess + toSkip.mapTo(skippedDataForLookup) { TowerData.BothTowerLevelAndImplicitReceiver(it, implicitReceiver) } } - else { - for (nonLocalLevel in nonLocalLevels) { - TowerData.BothTowerLevelAndImplicitReceiver(nonLocalLevel, implicitReceiver).process()?.let { return it } - } + + // extension for implicit receiver + for (nonLocalLevel in nonLocalLevels) { + TowerData.BothTowerLevelAndImplicitReceiver(nonLocalLevel, implicitReceiver).process()?.let { return it } } } } - else if (scope.mayFitForName(name, location)) { - // functions with no receiver or extension for explicit receiver - TowerData.TowerLevel(ImportingScopeBasedTowerLevel(this, scope as ImportingScope)).process()?.let { return it } + else { + TowerData.TowerLevel(ImportingScopeBasedTowerLevel(this, scope as ImportingScope)) + .process(scope.mayFitForName(name))?.let { return it } } } + recordLookups() + return resultCollector.getFinalCandidates() } - private fun MemberScopeTowerLevel.mayFitForName(name: Name) = - !definitelyDoesNotContainName(name) || !definitelyDoesNotContainName(OperatorNameConventions.INVOKE) + private fun ReceiverValueWithSmartCastInfo.mayFitForName(name: Name): Boolean { + if (receiverValue.type.mayFitForName(name)) return true + if (possibleTypes.isEmpty()) return false + return possibleTypes.any { it.mayFitForName(name) } + } + + private fun KotlinType.mayFitForName(name: Name) = + isDynamic() || + !memberScope.definitelyDoesNotContainName(name) || + !memberScope.definitelyDoesNotContainName(OperatorNameConventions.INVOKE) private fun ResolutionScope.mayFitForName(name: Name) = !definitelyDoesNotContainName(name) || !definitelyDoesNotContainName(OperatorNameConventions.INVOKE) From b77cc541221b835b2617cccf83b5581a9d2dc926 Mon Sep 17 00:00:00 2001 From: Denis Zharkov Date: Thu, 24 Aug 2017 11:49:29 +0300 Subject: [PATCH 126/212] Update lookupTracker testData Just the order of lookups has been changed --- .../lookupTracker/js/packageDeclarations/foo1.kt | 4 ++-- .../lookupTracker/jvm/expressionType/inferredType.kt | 4 ++-- .../testData/incremental/lookupTracker/jvm/java/usages.kt | 6 +++--- .../lookupTracker/jvm/packageDeclarations/foo1.kt | 4 ++-- 4 files changed, 9 insertions(+), 9 deletions(-) diff --git a/jps-plugin/testData/incremental/lookupTracker/js/packageDeclarations/foo1.kt b/jps-plugin/testData/incremental/lookupTracker/js/packageDeclarations/foo1.kt index 3a3a5cf9edd..ff1447f6e8a 100644 --- a/jps-plugin/testData/incremental/lookupTracker/js/packageDeclarations/foo1.kt +++ b/jps-plugin/testData/incremental/lookupTracker/js/packageDeclarations/foo1.kt @@ -3,12 +3,12 @@ package foo import bar.* /*p:baz(C)*/import baz.C -/*p:foo*/val a = /*p:foo p:bar*/A() +/*p:foo*/val a = /*p:bar p:foo*/A() /*p:foo*/var b: /*p:foo p:bar*/baz./*p:baz*/B = /*p:foo p:bar p:baz(B)*/baz./*p:baz*/B() /*p:foo*/fun function(p: /*p:foo p:bar*/B): /*p:foo p:bar*/B /*p:kotlin(Nothing)*/{ /*p:foo p:bar(A)*/a - /*p:kotlin(Nothing)*/return /*p:foo p:bar*/B() + /*p:kotlin(Nothing)*/return /*p:bar p:foo*/B() } /*p:foo*/fun /*p:foo*/MyClass.extFunc(p: /**p:foo p:bar*//*p:foo p:bar*/Array, e: /*p:foo*/MyEnum, c: /**???*//*p:baz*/C): /*p:foo*/MyInterface /*p:kotlin(Nothing)*/{ diff --git a/jps-plugin/testData/incremental/lookupTracker/jvm/expressionType/inferredType.kt b/jps-plugin/testData/incremental/lookupTracker/jvm/expressionType/inferredType.kt index a64392dfd7a..2d908d375e0 100644 --- a/jps-plugin/testData/incremental/lookupTracker/jvm/expressionType/inferredType.kt +++ b/jps-plugin/testData/incremental/lookupTracker/jvm/expressionType/inferredType.kt @@ -6,8 +6,8 @@ package foo /*p:foo*/fun getA() = /*p:foo*/A() /*p:foo*/fun getB() = /*p:foo*/B() -/*p:foo*/fun getListOfA() = /*p:foo p:kotlin p:kotlin.annotation p:kotlin.collections p:kotlin.ranges p:kotlin.sequences p:kotlin.text p:kotlin.io p:kotlin.comparisons p:java.lang p:kotlin.jvm p:kotlin.collections(List) p:foo(A)*/listOf(/*p:foo*/A()) -/*p:foo*/fun getListOfB() = /*p:foo p:kotlin p:kotlin.annotation p:kotlin.collections p:kotlin.ranges p:kotlin.sequences p:kotlin.text p:kotlin.io p:kotlin.comparisons p:java.lang p:kotlin.jvm p:kotlin.collections(List) p:foo(B)*/listOf(/*p:foo*/B()) +/*p:foo*/fun getListOfA() = /*p:kotlin p:kotlin.annotation p:kotlin.collections p:kotlin.ranges p:kotlin.sequences p:kotlin.text p:kotlin.io p:kotlin.comparisons p:java.lang p:kotlin.jvm p:foo p:kotlin.collections(List) p:foo(A)*/listOf(/*p:foo*/A()) +/*p:foo*/fun getListOfB() = /*p:kotlin p:kotlin.annotation p:kotlin.collections p:kotlin.ranges p:kotlin.sequences p:kotlin.text p:kotlin.io p:kotlin.comparisons p:java.lang p:kotlin.jvm p:foo p:kotlin.collections(List) p:foo(B)*/listOf(/*p:foo*/B()) /*p:foo*/fun useListOfA(a: /*p:foo p:kotlin.collections*/List) {} /*p:foo*/fun useListOfB(b: /*p:foo p:kotlin.collections*/List) {} diff --git a/jps-plugin/testData/incremental/lookupTracker/jvm/java/usages.kt b/jps-plugin/testData/incremental/lookupTracker/jvm/java/usages.kt index fae7e925fd0..f147e9aec48 100644 --- a/jps-plugin/testData/incremental/lookupTracker/jvm/java/usages.kt +++ b/jps-plugin/testData/incremental/lookupTracker/jvm/java/usages.kt @@ -29,9 +29,9 @@ import baz.* /*p:foo p:baz p:kotlin p:kotlin.annotation p:kotlin.collections p:kotlin.ranges p:kotlin.sequences p:kotlin.text p:kotlin.io p:kotlin.comparisons p:java.lang p:kotlin.jvm p:kotlin(String)*/I./*c:foo.I*/isfield /*p:foo p:baz p:kotlin p:kotlin.annotation p:kotlin.collections p:kotlin.ranges p:kotlin.sequences p:kotlin.text p:kotlin.io p:kotlin.comparisons p:java.lang p:kotlin.jvm c:foo.I(IS)*/I./*c:foo.I*/IS() - /*p:foo p:baz p:kotlin p:kotlin.annotation p:kotlin.collections p:kotlin.ranges p:kotlin.sequences p:kotlin.text p:kotlin.io p:kotlin.comparisons p:java.lang p:kotlin.jvm*/E./*c:baz.E*/F - /*p:foo p:baz p:kotlin p:kotlin.annotation p:kotlin.collections p:kotlin.ranges p:kotlin.sequences p:kotlin.text p:kotlin.io p:kotlin.comparisons p:java.lang p:kotlin.jvm p:kotlin(Int)*/E./*c:baz.E*/F./*c:baz.E*/field - /*p:foo p:baz p:kotlin p:kotlin.annotation p:kotlin.collections p:kotlin.ranges p:kotlin.sequences p:kotlin.text p:kotlin.io p:kotlin.comparisons p:java.lang p:kotlin.jvm*/E./*c:baz.E*/S./*c:baz.E*/func() + /*p:baz p:foo p:kotlin p:kotlin.annotation p:kotlin.collections p:kotlin.ranges p:kotlin.sequences p:kotlin.text p:kotlin.io p:kotlin.comparisons p:java.lang p:kotlin.jvm*/E./*c:baz.E*/F + /*p:baz p:foo p:kotlin p:kotlin.annotation p:kotlin.collections p:kotlin.ranges p:kotlin.sequences p:kotlin.text p:kotlin.io p:kotlin.comparisons p:java.lang p:kotlin.jvm p:kotlin(Int)*/E./*c:baz.E*/F./*c:baz.E*/field + /*p:baz p:foo p:kotlin p:kotlin.annotation p:kotlin.collections p:kotlin.ranges p:kotlin.sequences p:kotlin.text p:kotlin.io p:kotlin.comparisons p:java.lang p:kotlin.jvm*/E./*c:baz.E*/S./*c:baz.E*/func() } /*p:foo*/fun classifiers( diff --git a/jps-plugin/testData/incremental/lookupTracker/jvm/packageDeclarations/foo1.kt b/jps-plugin/testData/incremental/lookupTracker/jvm/packageDeclarations/foo1.kt index 222fadbf956..1ade1504d79 100644 --- a/jps-plugin/testData/incremental/lookupTracker/jvm/packageDeclarations/foo1.kt +++ b/jps-plugin/testData/incremental/lookupTracker/jvm/packageDeclarations/foo1.kt @@ -3,12 +3,12 @@ package foo import bar.* /*p:baz(C)*/import baz.C -/*p:foo*/val a = /*p:foo p:bar*/A() +/*p:foo*/val a = /*p:bar p:foo*/A() /*p:foo*/var b: /*p:foo p:bar p:kotlin p:kotlin.annotation p:kotlin.collections p:kotlin.ranges p:kotlin.sequences p:kotlin.text p:kotlin.io p:kotlin.comparisons p:java.lang p:kotlin.jvm*/baz./*p:baz*/B = /*p:foo p:bar p:kotlin p:kotlin.annotation p:kotlin.collections p:kotlin.ranges p:kotlin.sequences p:kotlin.text p:kotlin.io p:kotlin.comparisons p:java.lang p:kotlin.jvm p:baz(B)*/baz./*p:baz*/B() /*p:foo*/fun function(p: /*p:foo p:bar*/B): /*p:foo p:bar*/B /*p:kotlin(Nothing)*/{ /*p:foo p:bar(A)*/a - /*p:kotlin(Nothing)*/return /*p:foo p:bar*/B() + /*p:kotlin(Nothing)*/return /*p:bar p:foo*/B() } /*p:foo*/fun /*p:foo*/MyClass.extFunc(p: /**p:foo p:bar*//*p:foo p:kotlin*/Array, e: /*p:foo*/MyEnum, c: /**???*//*p:baz*/C): /*p:foo*/MyInterface /*p:kotlin(Nothing)*/{ From c7fda42ccc30971275be037713ad4c8be30d808c Mon Sep 17 00:00:00 2001 From: Denis Zharkov Date: Thu, 24 Aug 2017 15:40:45 +0300 Subject: [PATCH 127/212] Introduce TowerResolver.Task class Its main purpose is code simplification: ImplicitScopeTower::run contains a lot of local functions that are needed because of lots of shared state So, we're moving the state to the Task class instead NB: This change doesn't change the code of `run`, it will be done in further commits --- .../resolve/calls/tower/TowerResolver.kt | 265 +++++++++--------- 1 file changed, 138 insertions(+), 127 deletions(-) diff --git a/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/tower/TowerResolver.kt b/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/tower/TowerResolver.kt index 4d25b29d7cd..d27baec8aac 100644 --- a/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/tower/TowerResolver.kt +++ b/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/tower/TowerResolver.kt @@ -93,167 +93,178 @@ class TowerResolver { ): Collection = scopeTower.run(processor, AllCandidatesCollector(), false, name) + fun ImplicitScopeTower.run( + processor: ScopeTowerProcessor, + resultCollector: ResultCollector, + useOrder: Boolean, + name: Name + ): Collection = with(Task()) { + this@run.run(processor, resultCollector, useOrder, name) + } + private data class ScopeLevelsAndSkippedForLookups( val levelsToProcess: Collection, val levelsToSkip: Collection ) - private fun ImplicitScopeTower.createNonLocalLevels(name: Name): ScopeLevelsAndSkippedForLookups { - val mainResult = mutableListOf() - val skippedLevels = mutableListOf() + private inner class Task { + private fun ImplicitScopeTower.createNonLocalLevels(name: Name): ScopeLevelsAndSkippedForLookups { + val mainResult = mutableListOf() + val skippedLevels = mutableListOf() - fun addLevel(scopeTowerLevel: ScopeTowerLevel, mayFitForName: Boolean) { - if (mayFitForName) { - mainResult.add(scopeTowerLevel) + fun addLevel(scopeTowerLevel: ScopeTowerLevel, mayFitForName: Boolean) { + if (mayFitForName) { + mainResult.add(scopeTowerLevel) + } + else { + skippedLevels.add(scopeTowerLevel) + } } - else { - skippedLevels.add(scopeTowerLevel) - } - } - lexicalScope.parentsWithSelf.forEach { scope -> - if (scope is LexicalScope) { - if (!scope.kind.withLocalDescriptors) { + lexicalScope.parentsWithSelf.forEach { scope -> + if (scope is LexicalScope) { + if (!scope.kind.withLocalDescriptors) { + addLevel( + ScopeBasedTowerLevel(this@createNonLocalLevels, scope), + scope.mayFitForName(name) + ) + } + + getImplicitReceiver(scope)?.let { + addLevel( + MemberScopeTowerLevel(this@createNonLocalLevels, it), + it.mayFitForName(name) + ) + } + } + else { addLevel( - ScopeBasedTowerLevel(this@createNonLocalLevels, scope), + ImportingScopeBasedTowerLevel(this@createNonLocalLevels, scope as ImportingScope), scope.mayFitForName(name) ) } + } - getImplicitReceiver(scope)?.let { - addLevel( - MemberScopeTowerLevel(this@createNonLocalLevels, it), - it.mayFitForName(name) - ) + return ScopeLevelsAndSkippedForLookups(mainResult, skippedLevels) + } + + fun ImplicitScopeTower.run( + processor: ScopeTowerProcessor, + resultCollector: ResultCollector, + useOrder: Boolean, + name: Name + ): Collection { + val skippedDataForLookup = mutableListOf() + + fun recordLookups() { + processor.recordLookups(skippedDataForLookup, name) + } + + fun TowerData.process() = processTowerData(processor, resultCollector, useOrder, this)?.also { + recordLookups() + } + + fun TowerData.process(mayFitForName: Boolean): Collection? { + if (!mayFitForName) { + skippedDataForLookup.add(this) + return null } + return process() } - else { - addLevel( - ImportingScopeBasedTowerLevel(this@createNonLocalLevels, scope as ImportingScope), - scope.mayFitForName(name) - ) + + // Lazy calculation + var nonLocalLevels: Collection? = null + val hidesMembersLevel = HidesMembersTowerLevel(this) + val syntheticLevel = SyntheticScopeBasedTowerLevel(this, syntheticScopes) + + if (name in HIDES_MEMBERS_NAME_LIST) { + // hides members extensions for explicit receiver + TowerData.TowerLevel(hidesMembersLevel).process()?.let { return it } } - } - return ScopeLevelsAndSkippedForLookups(mainResult, skippedLevels) - } + // possibly there is explicit member + TowerData.Empty.process()?.let { return it } + // synthetic property for explicit receiver + TowerData.TowerLevel(syntheticLevel).process()?.let { return it } - private fun ImplicitScopeTower.run( - processor: ScopeTowerProcessor, - resultCollector: ResultCollector, - useOrder: Boolean, - name: Name - ): Collection { - val skippedDataForLookup = mutableListOf() + val localLevels = + lexicalScope.parentsWithSelf. + filterIsInstance().filter { it.kind.withLocalDescriptors && it.mayFitForName(name) }. + map { ScopeBasedTowerLevel(this@run, it) }.toList() - fun recordLookups() { - processor.recordLookups(skippedDataForLookup, name) - } - - fun TowerData.process() = processTowerData(processor, resultCollector, useOrder, this)?.also { - recordLookups() - } - - fun TowerData.process(mayFitForName: Boolean): Collection? { - if (!mayFitForName) { - skippedDataForLookup.add(this) - return null + // local non-extensions or extension for explicit receiver + for (localLevel in localLevels) { + TowerData.TowerLevel(localLevel).process()?.let { return it } } - return process() - } - // Lazy calculation - var nonLocalLevels: Collection? = null - val hidesMembersLevel = HidesMembersTowerLevel(this) - val syntheticLevel = SyntheticScopeBasedTowerLevel(this, syntheticScopes) + for (scope in lexicalScope.parentsWithSelf) { + if (scope is LexicalScope) { + // statics + if (!scope.kind.withLocalDescriptors) { + TowerData.TowerLevel(ScopeBasedTowerLevel(this, scope)) + .process(scope.mayFitForName(name))?.let { return it } + } - if (name in HIDES_MEMBERS_NAME_LIST) { - // hides members extensions for explicit receiver - TowerData.TowerLevel(hidesMembersLevel).process()?.let { return it } - } + val implicitReceiver = getImplicitReceiver(scope) + if (implicitReceiver != null) { + if (name in HIDES_MEMBERS_NAME_LIST) { + // hides members extensions + TowerData.BothTowerLevelAndImplicitReceiver(hidesMembersLevel, implicitReceiver).process()?.let { return it } + } - // possibly there is explicit member - TowerData.Empty.process()?.let { return it } - // synthetic property for explicit receiver - TowerData.TowerLevel(syntheticLevel).process()?.let { return it } + // members of implicit receiver or member extension for explicit receiver + TowerData.TowerLevel(MemberScopeTowerLevel(this, implicitReceiver)) + .process(implicitReceiver.mayFitForName(name))?.let { return it } - val localLevels = - lexicalScope.parentsWithSelf. - filterIsInstance().filter { it.kind.withLocalDescriptors && it.mayFitForName(name) }. - map { ScopeBasedTowerLevel(this@run, it) }.toList() + // synthetic properties + TowerData.BothTowerLevelAndImplicitReceiver(syntheticLevel, implicitReceiver).process()?.let { return it } - // local non-extensions or extension for explicit receiver - for (localLevel in localLevels) { - TowerData.TowerLevel(localLevel).process()?.let { return it } - } + // invokeExtension on local variable + TowerData.OnlyImplicitReceiver(implicitReceiver).process()?.let { return it } - for (scope in lexicalScope.parentsWithSelf) { - if (scope is LexicalScope) { - // statics - if (!scope.kind.withLocalDescriptors) { - TowerData.TowerLevel(ScopeBasedTowerLevel(this, scope)) + // local extensions for implicit receiver + for (localLevel in localLevels) { + TowerData.BothTowerLevelAndImplicitReceiver(localLevel, implicitReceiver).process()?.let { return it } + } + + if (nonLocalLevels == null) { + val (toProcess, toSkip) = createNonLocalLevels(name) + nonLocalLevels = toProcess + toSkip.mapTo(skippedDataForLookup) { TowerData.BothTowerLevelAndImplicitReceiver(it, implicitReceiver) } + } + + // extension for implicit receiver + for (nonLocalLevel in nonLocalLevels) { + TowerData.BothTowerLevelAndImplicitReceiver(nonLocalLevel, implicitReceiver).process()?.let { return it } + } + } + } + else { + TowerData.TowerLevel(ImportingScopeBasedTowerLevel(this, scope as ImportingScope)) .process(scope.mayFitForName(name))?.let { return it } } - - val implicitReceiver = getImplicitReceiver(scope) - if (implicitReceiver != null) { - if (name in HIDES_MEMBERS_NAME_LIST) { - // hides members extensions - TowerData.BothTowerLevelAndImplicitReceiver(hidesMembersLevel, implicitReceiver).process()?.let { return it } - } - - // members of implicit receiver or member extension for explicit receiver - TowerData.TowerLevel(MemberScopeTowerLevel(this, implicitReceiver)) - .process(implicitReceiver.mayFitForName(name))?.let { return it } - - // synthetic properties - TowerData.BothTowerLevelAndImplicitReceiver(syntheticLevel, implicitReceiver).process()?.let { return it } - - // invokeExtension on local variable - TowerData.OnlyImplicitReceiver(implicitReceiver).process()?.let { return it } - - // local extensions for implicit receiver - for (localLevel in localLevels) { - TowerData.BothTowerLevelAndImplicitReceiver(localLevel, implicitReceiver).process()?.let { return it } - } - - if (nonLocalLevels == null) { - val (toProcess, toSkip) = createNonLocalLevels(name) - nonLocalLevels = toProcess - toSkip.mapTo(skippedDataForLookup) { TowerData.BothTowerLevelAndImplicitReceiver(it, implicitReceiver) } - } - - // extension for implicit receiver - for (nonLocalLevel in nonLocalLevels) { - TowerData.BothTowerLevelAndImplicitReceiver(nonLocalLevel, implicitReceiver).process()?.let { return it } - } - } - } - else { - TowerData.TowerLevel(ImportingScopeBasedTowerLevel(this, scope as ImportingScope)) - .process(scope.mayFitForName(name))?.let { return it } } + + recordLookups() + + return resultCollector.getFinalCandidates() } - recordLookups() + private fun ReceiverValueWithSmartCastInfo.mayFitForName(name: Name): Boolean { + if (receiverValue.type.mayFitForName(name)) return true + if (possibleTypes.isEmpty()) return false + return possibleTypes.any { it.mayFitForName(name) } + } - return resultCollector.getFinalCandidates() + private fun KotlinType.mayFitForName(name: Name) = + isDynamic() || + !memberScope.definitelyDoesNotContainName(name) || + !memberScope.definitelyDoesNotContainName(OperatorNameConventions.INVOKE) + + private fun ResolutionScope.mayFitForName(name: Name) = + !definitelyDoesNotContainName(name) || !definitelyDoesNotContainName(OperatorNameConventions.INVOKE) } - private fun ReceiverValueWithSmartCastInfo.mayFitForName(name: Name): Boolean { - if (receiverValue.type.mayFitForName(name)) return true - if (possibleTypes.isEmpty()) return false - return possibleTypes.any { it.mayFitForName(name) } - } - - private fun KotlinType.mayFitForName(name: Name) = - isDynamic() || - !memberScope.definitelyDoesNotContainName(name) || - !memberScope.definitelyDoesNotContainName(OperatorNameConventions.INVOKE) - - private fun ResolutionScope.mayFitForName(name: Name) = - !definitelyDoesNotContainName(name) || !definitelyDoesNotContainName(OperatorNameConventions.INVOKE) - fun runWithEmptyTowerData( processor: ScopeTowerProcessor, resultCollector: ResultCollector, From 6b972039799a4bb87cee20fa319f4bd288a3a537 Mon Sep 17 00:00:00 2001 From: Denis Zharkov Date: Thu, 24 Aug 2017 16:34:28 +0300 Subject: [PATCH 128/212] Move all state from TowerResolver.Task::run to Task class Also extract local functions from it and introduce TowerData.ForLookupForNoExplicitReceiver class --- .../calls/tower/ScopeTowerProcessors.kt | 1 + .../resolve/calls/tower/TowerResolver.kt | 97 +++++++++---------- 2 files changed, 48 insertions(+), 50 deletions(-) diff --git a/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/tower/ScopeTowerProcessors.kt b/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/tower/ScopeTowerProcessors.kt index 5208d4440a5..e20cc7c0c37 100644 --- a/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/tower/ScopeTowerProcessors.kt +++ b/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/tower/ScopeTowerProcessors.kt @@ -159,6 +159,7 @@ private class NoExplicitReceiverScopeTowerProcessor( when (data) { is TowerData.TowerLevel -> data.level.recordLookup(name) is TowerData.BothTowerLevelAndImplicitReceiver -> data.level.recordLookup(name) + is TowerData.ForLookupForNoExplicitReceiver -> data.level.recordLookup(name) } } } diff --git a/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/tower/TowerResolver.kt b/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/tower/TowerResolver.kt index d27baec8aac..351bea26c1a 100644 --- a/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/tower/TowerResolver.kt +++ b/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/tower/TowerResolver.kt @@ -62,6 +62,8 @@ sealed class TowerData { class OnlyImplicitReceiver(val implicitReceiver: ReceiverValueWithSmartCastInfo): TowerData() class TowerLevel(val level: ScopeTowerLevel) : TowerData() class BothTowerLevelAndImplicitReceiver(val level: ScopeTowerLevel, val implicitReceiver: ReceiverValueWithSmartCastInfo) : TowerData() + // Has the same meaning as BothTowerLevelAndImplicitReceiver, but it's only used for names lookup, so it doesn't need implicit receiver + class ForLookupForNoExplicitReceiver(val level: ScopeTowerLevel) : TowerData() } interface ScopeTowerProcessor { @@ -98,26 +100,44 @@ class TowerResolver { resultCollector: ResultCollector, useOrder: Boolean, name: Name - ): Collection = with(Task()) { - this@run.run(processor, resultCollector, useOrder, name) - } + ): Collection = Task(this, processor, resultCollector, useOrder, name).run() private data class ScopeLevelsAndSkippedForLookups( val levelsToProcess: Collection, val levelsToSkip: Collection ) - private inner class Task { - private fun ImplicitScopeTower.createNonLocalLevels(name: Name): ScopeLevelsAndSkippedForLookups { + private inner class Task( + private val implicitScopeTower: ImplicitScopeTower, + private val processor: ScopeTowerProcessor, + private val resultCollector: ResultCollector, + private val useOrder: Boolean, + private val name: Name + ) { + private val skippedDataForLookup = mutableListOf() + + private val localLevels: Collection by lazy(LazyThreadSafetyMode.NONE) { + implicitScopeTower.lexicalScope.parentsWithSelf. + filterIsInstance().filter { it.kind.withLocalDescriptors && it.mayFitForName(name) }. + map { ScopeBasedTowerLevel(implicitScopeTower, it) }.toList() + } + + private val nonLocalLevels: Collection by lazy(LazyThreadSafetyMode.NONE) { + implicitScopeTower.createNonLocalLevels() + } + + val hidesMembersLevel = HidesMembersTowerLevel(implicitScopeTower) + val syntheticLevel = SyntheticScopeBasedTowerLevel(implicitScopeTower, implicitScopeTower.syntheticScopes) + + private fun ImplicitScopeTower.createNonLocalLevels(): Collection { val mainResult = mutableListOf() - val skippedLevels = mutableListOf() fun addLevel(scopeTowerLevel: ScopeTowerLevel, mayFitForName: Boolean) { if (mayFitForName) { mainResult.add(scopeTowerLevel) } else { - skippedLevels.add(scopeTowerLevel) + skippedDataForLookup.add(TowerData.ForLookupForNoExplicitReceiver(scopeTowerLevel)) } } @@ -145,38 +165,22 @@ class TowerResolver { } } - return ScopeLevelsAndSkippedForLookups(mainResult, skippedLevels) + return mainResult } - fun ImplicitScopeTower.run( - processor: ScopeTowerProcessor, - resultCollector: ResultCollector, - useOrder: Boolean, - name: Name - ): Collection { - val skippedDataForLookup = mutableListOf() + private fun TowerData.process() = processTowerData(processor, resultCollector, useOrder, this)?.also { + recordLookups() + } - fun recordLookups() { - processor.recordLookups(skippedDataForLookup, name) + private fun TowerData.process(mayFitForName: Boolean): Collection? { + if (!mayFitForName) { + skippedDataForLookup.add(this) + return null } + return process() + } - fun TowerData.process() = processTowerData(processor, resultCollector, useOrder, this)?.also { - recordLookups() - } - - fun TowerData.process(mayFitForName: Boolean): Collection? { - if (!mayFitForName) { - skippedDataForLookup.add(this) - return null - } - return process() - } - - // Lazy calculation - var nonLocalLevels: Collection? = null - val hidesMembersLevel = HidesMembersTowerLevel(this) - val syntheticLevel = SyntheticScopeBasedTowerLevel(this, syntheticScopes) - + fun run(): Collection { if (name in HIDES_MEMBERS_NAME_LIST) { // hides members extensions for explicit receiver TowerData.TowerLevel(hidesMembersLevel).process()?.let { return it } @@ -187,25 +191,20 @@ class TowerResolver { // synthetic property for explicit receiver TowerData.TowerLevel(syntheticLevel).process()?.let { return it } - val localLevels = - lexicalScope.parentsWithSelf. - filterIsInstance().filter { it.kind.withLocalDescriptors && it.mayFitForName(name) }. - map { ScopeBasedTowerLevel(this@run, it) }.toList() - // local non-extensions or extension for explicit receiver for (localLevel in localLevels) { TowerData.TowerLevel(localLevel).process()?.let { return it } } - for (scope in lexicalScope.parentsWithSelf) { + for (scope in implicitScopeTower.lexicalScope.parentsWithSelf) { if (scope is LexicalScope) { // statics if (!scope.kind.withLocalDescriptors) { - TowerData.TowerLevel(ScopeBasedTowerLevel(this, scope)) + TowerData.TowerLevel(ScopeBasedTowerLevel(implicitScopeTower, scope)) .process(scope.mayFitForName(name))?.let { return it } } - val implicitReceiver = getImplicitReceiver(scope) + val implicitReceiver = implicitScopeTower.getImplicitReceiver(scope) if (implicitReceiver != null) { if (name in HIDES_MEMBERS_NAME_LIST) { // hides members extensions @@ -213,7 +212,7 @@ class TowerResolver { } // members of implicit receiver or member extension for explicit receiver - TowerData.TowerLevel(MemberScopeTowerLevel(this, implicitReceiver)) + TowerData.TowerLevel(MemberScopeTowerLevel(implicitScopeTower, implicitReceiver)) .process(implicitReceiver.mayFitForName(name))?.let { return it } // synthetic properties @@ -227,12 +226,6 @@ class TowerResolver { TowerData.BothTowerLevelAndImplicitReceiver(localLevel, implicitReceiver).process()?.let { return it } } - if (nonLocalLevels == null) { - val (toProcess, toSkip) = createNonLocalLevels(name) - nonLocalLevels = toProcess - toSkip.mapTo(skippedDataForLookup) { TowerData.BothTowerLevelAndImplicitReceiver(it, implicitReceiver) } - } - // extension for implicit receiver for (nonLocalLevel in nonLocalLevels) { TowerData.BothTowerLevelAndImplicitReceiver(nonLocalLevel, implicitReceiver).process()?.let { return it } @@ -240,7 +233,7 @@ class TowerResolver { } } else { - TowerData.TowerLevel(ImportingScopeBasedTowerLevel(this, scope as ImportingScope)) + TowerData.TowerLevel(ImportingScopeBasedTowerLevel(implicitScopeTower, scope as ImportingScope)) .process(scope.mayFitForName(name))?.let { return it } } } @@ -250,6 +243,10 @@ class TowerResolver { return resultCollector.getFinalCandidates() } + private fun recordLookups() { + processor.recordLookups(skippedDataForLookup, name) + } + private fun ReceiverValueWithSmartCastInfo.mayFitForName(name: Name): Boolean { if (receiverValue.type.mayFitForName(name)) return true if (possibleTypes.isEmpty()) return false From 1f23d610a681762ad50e66aa0ae3614e6d8e0688 Mon Sep 17 00:00:00 2001 From: Denis Zharkov Date: Thu, 24 Aug 2017 16:34:47 +0300 Subject: [PATCH 129/212] Extract TowerResolver.Task::processImplicitReceiver --- .../resolve/calls/tower/TowerResolver.kt | 59 ++++++++++--------- 1 file changed, 32 insertions(+), 27 deletions(-) diff --git a/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/tower/TowerResolver.kt b/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/tower/TowerResolver.kt index 351bea26c1a..d8a472491de 100644 --- a/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/tower/TowerResolver.kt +++ b/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/tower/TowerResolver.kt @@ -204,33 +204,9 @@ class TowerResolver { .process(scope.mayFitForName(name))?.let { return it } } - val implicitReceiver = implicitScopeTower.getImplicitReceiver(scope) - if (implicitReceiver != null) { - if (name in HIDES_MEMBERS_NAME_LIST) { - // hides members extensions - TowerData.BothTowerLevelAndImplicitReceiver(hidesMembersLevel, implicitReceiver).process()?.let { return it } - } - - // members of implicit receiver or member extension for explicit receiver - TowerData.TowerLevel(MemberScopeTowerLevel(implicitScopeTower, implicitReceiver)) - .process(implicitReceiver.mayFitForName(name))?.let { return it } - - // synthetic properties - TowerData.BothTowerLevelAndImplicitReceiver(syntheticLevel, implicitReceiver).process()?.let { return it } - - // invokeExtension on local variable - TowerData.OnlyImplicitReceiver(implicitReceiver).process()?.let { return it } - - // local extensions for implicit receiver - for (localLevel in localLevels) { - TowerData.BothTowerLevelAndImplicitReceiver(localLevel, implicitReceiver).process()?.let { return it } - } - - // extension for implicit receiver - for (nonLocalLevel in nonLocalLevels) { - TowerData.BothTowerLevelAndImplicitReceiver(nonLocalLevel, implicitReceiver).process()?.let { return it } - } - } + implicitScopeTower.getImplicitReceiver(scope) + ?.let(this::processImplicitReceiver) + ?.let { return it } } else { TowerData.TowerLevel(ImportingScopeBasedTowerLevel(implicitScopeTower, scope as ImportingScope)) @@ -243,6 +219,35 @@ class TowerResolver { return resultCollector.getFinalCandidates() } + private fun processImplicitReceiver(implicitReceiver: ReceiverValueWithSmartCastInfo): Collection? { + if (name in HIDES_MEMBERS_NAME_LIST) { + // hides members extensions + TowerData.BothTowerLevelAndImplicitReceiver(hidesMembersLevel, implicitReceiver).process()?.let { return it } + } + + // members of implicit receiver or member extension for explicit receiver + TowerData.TowerLevel(MemberScopeTowerLevel(implicitScopeTower, implicitReceiver)) + .process(implicitReceiver.mayFitForName(name))?.let { return it } + + // synthetic properties + TowerData.BothTowerLevelAndImplicitReceiver(syntheticLevel, implicitReceiver).process()?.let { return it } + + // invokeExtension on local variable + TowerData.OnlyImplicitReceiver(implicitReceiver).process()?.let { return it } + + // local extensions for implicit receiver + for (localLevel in localLevels) { + TowerData.BothTowerLevelAndImplicitReceiver(localLevel, implicitReceiver).process()?.let { return it } + } + + // extension for implicit receiver + for (nonLocalLevel in nonLocalLevels) { + TowerData.BothTowerLevelAndImplicitReceiver(nonLocalLevel, implicitReceiver).process()?.let { return it } + } + + return null + } + private fun recordLookups() { processor.recordLookups(skippedDataForLookup, name) } From 5b01a32bd398ac2f0918b11780a407616e775dcc Mon Sep 17 00:00:00 2001 From: Denis Zharkov Date: Thu, 24 Aug 2017 16:41:04 +0300 Subject: [PATCH 130/212] Extract val isNameForHidesMember --- .../jetbrains/kotlin/resolve/calls/tower/TowerResolver.kt | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/tower/TowerResolver.kt b/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/tower/TowerResolver.kt index d8a472491de..8b2700fcc5b 100644 --- a/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/tower/TowerResolver.kt +++ b/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/tower/TowerResolver.kt @@ -114,6 +114,7 @@ class TowerResolver { private val useOrder: Boolean, private val name: Name ) { + private val isNameForHidesMember = name in HIDES_MEMBERS_NAME_LIST private val skippedDataForLookup = mutableListOf() private val localLevels: Collection by lazy(LazyThreadSafetyMode.NONE) { @@ -181,7 +182,7 @@ class TowerResolver { } fun run(): Collection { - if (name in HIDES_MEMBERS_NAME_LIST) { + if (isNameForHidesMember) { // hides members extensions for explicit receiver TowerData.TowerLevel(hidesMembersLevel).process()?.let { return it } } @@ -220,7 +221,7 @@ class TowerResolver { } private fun processImplicitReceiver(implicitReceiver: ReceiverValueWithSmartCastInfo): Collection? { - if (name in HIDES_MEMBERS_NAME_LIST) { + if (isNameForHidesMember) { // hides members extensions TowerData.BothTowerLevelAndImplicitReceiver(hidesMembersLevel, implicitReceiver).process()?.let { return it } } From 12b348ae4819d50a28af2f2edbaaa75ce842ef53 Mon Sep 17 00:00:00 2001 From: Denis Zharkov Date: Tue, 29 Aug 2017 12:27:17 +0300 Subject: [PATCH 131/212] Fix incorrectly configured IDE tests The important changes are in ideaTestUtils.kt: `configureByFiles` must be called on the relative to testData dir path, otherwise java files in the project belong to src/idea/testData/.../A.java instead of src/A.java and can't be found in the root package New updates in resolution when resolving A() call is now asking whether .A exists in PsiPackage::getClasses instead of PsiPackage::findClassByShortName that can find a class even if it's located in the wrong directory --- .../handlers/AbstractCompletionHandlerTests.kt | 2 +- .../test/handlers/CompletionHandlerTestBase.kt | 3 --- .../kotlin/idea/completion/test/ideaTestUtils.kt | 16 ++++++---------- .../weighers/AbstractCompletionWeigherTest.kt | 8 ++------ ...linLightPlatformCodeInsightFixtureTestCase.kt | 6 +++++- .../quickDoc/AbstractQuickDocProviderTest.java | 4 +--- .../idea/resolve/AbstractReferenceResolveTest.kt | 2 -- 7 files changed, 15 insertions(+), 26 deletions(-) diff --git a/idea/idea-completion/tests/org/jetbrains/kotlin/idea/completion/test/handlers/AbstractCompletionHandlerTests.kt b/idea/idea-completion/tests/org/jetbrains/kotlin/idea/completion/test/handlers/AbstractCompletionHandlerTests.kt index be5d7fa6bde..65c99a6c155 100644 --- a/idea/idea-completion/tests/org/jetbrains/kotlin/idea/completion/test/handlers/AbstractCompletionHandlerTests.kt +++ b/idea/idea-completion/tests/org/jetbrains/kotlin/idea/completion/test/handlers/AbstractCompletionHandlerTests.kt @@ -78,7 +78,7 @@ abstract class AbstractCompletionHandlerTest(private val defaultCompletionType: } } - doTestWithTextLoaded(completionType, invocationCount, lookupString, itemText, tailText, completionChar, testPath + ".after") + doTestWithTextLoaded(completionType, invocationCount, lookupString, itemText, tailText, completionChar, File(testPath).name + ".after") } finally { settingManager.dropTemporarySettings() diff --git a/idea/idea-completion/tests/org/jetbrains/kotlin/idea/completion/test/handlers/CompletionHandlerTestBase.kt b/idea/idea-completion/tests/org/jetbrains/kotlin/idea/completion/test/handlers/CompletionHandlerTestBase.kt index 9dac4d6a713..776fbefc5da 100644 --- a/idea/idea-completion/tests/org/jetbrains/kotlin/idea/completion/test/handlers/CompletionHandlerTestBase.kt +++ b/idea/idea-completion/tests/org/jetbrains/kotlin/idea/completion/test/handlers/CompletionHandlerTestBase.kt @@ -25,7 +25,6 @@ import com.intellij.codeInsight.lookup.impl.LookupImpl import com.intellij.testFramework.fixtures.JavaCodeInsightTestFixture import org.jetbrains.kotlin.idea.completion.test.ExpectedCompletionUtils import org.jetbrains.kotlin.idea.test.KotlinLightCodeInsightFixtureTestCase -import org.jetbrains.kotlin.test.KotlinTestUtils abstract class CompletionHandlerTestBase() : KotlinLightCodeInsightFixtureTestCase() { protected val fixture: JavaCodeInsightTestFixture @@ -106,8 +105,6 @@ abstract class CompletionHandlerTestBase() : KotlinLightCodeInsightFixtureTestCa return foundElement } - override fun getTestDataPath() = KotlinTestUtils.getHomeDirectory() - protected fun selectItem(item: LookupElement?, completionChar: Char) { val lookup = (fixture.lookup as LookupImpl) if (lookup.currentItem != item) { // do not touch selection if not changed - important for char filter tests diff --git a/idea/idea-completion/tests/org/jetbrains/kotlin/idea/completion/test/ideaTestUtils.kt b/idea/idea-completion/tests/org/jetbrains/kotlin/idea/completion/test/ideaTestUtils.kt index 2f10667b367..06022ac896c 100644 --- a/idea/idea-completion/tests/org/jetbrains/kotlin/idea/completion/test/ideaTestUtils.kt +++ b/idea/idea-completion/tests/org/jetbrains/kotlin/idea/completion/test/ideaTestUtils.kt @@ -21,21 +21,17 @@ import com.intellij.testFramework.UsefulTestCase import com.intellij.testFramework.fixtures.CodeInsightTestFixture import java.io.File -fun CodeInsightTestFixture.configureWithExtraFileAbs(path: String, vararg extraNameParts: String) { - configureWithExtraFile(path, *extraNameParts, relativePaths = false) -} +fun CodeInsightTestFixture.configureWithExtraFile(path: String, vararg extraNameParts: String = arrayOf(".Data")) { + val fileName = File(path).name -fun CodeInsightTestFixture.configureWithExtraFile(path: String, vararg extraNameParts: String = arrayOf(".Data"), relativePaths: Boolean = false) { - fun String.toFile(): File = if (relativePaths) File(testDataPath, this) else File(this) - - val noExtensionPath = FileUtil.getNameWithoutExtension(path) + val noExtensionPath = FileUtil.getNameWithoutExtension(fileName) val extensions = arrayOf("kt", "java") val extraPaths: List = extraNameParts .flatMap { extensions.map { ext -> "$noExtensionPath$it.$ext" } } - .filter { it.toFile().exists() } + .mapNotNull { File(testDataPath, it).takeIf { it.exists() }?.name } - configureByFiles(*(listOf(path) + extraPaths).toTypedArray()) + configureByFiles(*(listOf(fileName) + extraPaths).toTypedArray()) } @Suppress("unused") // Used in kotlin-ultimate -inline fun Any?.assertInstanceOf() = UsefulTestCase.assertInstanceOf(this, T::class.java) \ No newline at end of file +inline fun Any?.assertInstanceOf() = UsefulTestCase.assertInstanceOf(this, T::class.java) diff --git a/idea/idea-completion/tests/org/jetbrains/kotlin/idea/completion/test/weighers/AbstractCompletionWeigherTest.kt b/idea/idea-completion/tests/org/jetbrains/kotlin/idea/completion/test/weighers/AbstractCompletionWeigherTest.kt index 199486c3686..8d7f5eaf003 100644 --- a/idea/idea-completion/tests/org/jetbrains/kotlin/idea/completion/test/weighers/AbstractCompletionWeigherTest.kt +++ b/idea/idea-completion/tests/org/jetbrains/kotlin/idea/completion/test/weighers/AbstractCompletionWeigherTest.kt @@ -17,15 +17,13 @@ package org.jetbrains.kotlin.idea.completion.test.weighers import com.intellij.codeInsight.completion.CompletionType -import org.jetbrains.kotlin.idea.completion.test.configureWithExtraFile -import org.jetbrains.kotlin.idea.completion.test.COMPLETION_TEST_DATA_BASE_PATH import org.jetbrains.kotlin.idea.completion.test.RELATIVE_COMPLETION_TEST_DATA_BASE_PATH +import org.jetbrains.kotlin.idea.completion.test.configureWithExtraFile import org.jetbrains.kotlin.idea.test.KotlinLightCodeInsightFixtureTestCase import org.jetbrains.kotlin.idea.test.KotlinLightProjectDescriptor import org.jetbrains.kotlin.idea.test.KotlinWithJdkAndRuntimeLightProjectDescriptor import org.jetbrains.kotlin.test.InTextDirectivesUtils import org.junit.Assert -import java.io.File abstract class AbstractCompletionWeigherTest(val completionType: CompletionType, val relativeTestDataPath: String) : KotlinLightCodeInsightFixtureTestCase() { fun doTest(path: String) { @@ -33,7 +31,7 @@ abstract class AbstractCompletionWeigherTest(val completionType: CompletionType, assert(path.startsWith(pathPrefix)) val relativePath = path.removePrefix(pathPrefix) - myFixture.configureWithExtraFile(relativePath, ".Data", ".Data1", ".Data2", ".Data3", ".Data4", ".Data5", ".Data6", relativePaths = true) + myFixture.configureWithExtraFile(relativePath, ".Data", ".Data1", ".Data2", ".Data3", ".Data4", ".Data5", ".Data6") val text = myFixture.editor.document.text @@ -43,8 +41,6 @@ abstract class AbstractCompletionWeigherTest(val completionType: CompletionType, myFixture.complete(completionType, InTextDirectivesUtils.getPrefixedInt(text, "// INVOCATION_COUNT:") ?: 1) myFixture.assertPreferredCompletionItems(InTextDirectivesUtils.getPrefixedInt(text, "// SELECTED:") ?: 0, *items) } - - override fun getTestDataPath() = File(COMPLETION_TEST_DATA_BASE_PATH, relativeTestDataPath).path + File.separator } abstract class AbstractBasicCompletionWeigherTest() : AbstractCompletionWeigherTest(CompletionType.BASIC, "weighers/basic") { diff --git a/idea/idea-test-framework/src/org/jetbrains/kotlin/idea/test/KotlinLightPlatformCodeInsightFixtureTestCase.kt b/idea/idea-test-framework/src/org/jetbrains/kotlin/idea/test/KotlinLightPlatformCodeInsightFixtureTestCase.kt index fc2ca98d60f..23819654002 100644 --- a/idea/idea-test-framework/src/org/jetbrains/kotlin/idea/test/KotlinLightPlatformCodeInsightFixtureTestCase.kt +++ b/idea/idea-test-framework/src/org/jetbrains/kotlin/idea/test/KotlinLightPlatformCodeInsightFixtureTestCase.kt @@ -22,6 +22,8 @@ import com.intellij.openapi.vfs.newvfs.impl.VfsRootAccess import com.intellij.testFramework.fixtures.LightPlatformCodeInsightFixtureTestCase import org.jetbrains.kotlin.idea.actions.internal.KotlinInternalMode import org.jetbrains.kotlin.test.KotlinTestUtils +import org.jetbrains.kotlin.test.TestMetadata +import kotlin.reflect.full.findAnnotation abstract class KotlinLightPlatformCodeInsightFixtureTestCase: LightPlatformCodeInsightFixtureTestCase() { private var kotlinInternalModeOriginalValue: Boolean = false @@ -44,4 +46,6 @@ abstract class KotlinLightPlatformCodeInsightFixtureTestCase: LightPlatformCodeI super.tearDown() } } -} \ No newline at end of file + + override fun getTestDataPath(): String = this::class.findAnnotation()?.value ?: super.getTestDataPath() +} diff --git a/idea/tests/org/jetbrains/kotlin/idea/editor/quickDoc/AbstractQuickDocProviderTest.java b/idea/tests/org/jetbrains/kotlin/idea/editor/quickDoc/AbstractQuickDocProviderTest.java index 68f09aefa32..fb39bf2319b 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/editor/quickDoc/AbstractQuickDocProviderTest.java +++ b/idea/tests/org/jetbrains/kotlin/idea/editor/quickDoc/AbstractQuickDocProviderTest.java @@ -16,9 +16,7 @@ package org.jetbrains.kotlin.idea.editor.quickDoc; -import com.intellij.codeInsight.documentation.DocumentationComponent; import com.intellij.codeInsight.documentation.DocumentationManager; -import com.intellij.codeInsight.navigation.CtrlMouseHandler; import com.intellij.openapi.util.io.FileUtil; import com.intellij.openapi.util.text.StringUtil; import com.intellij.psi.PsiElement; @@ -35,7 +33,7 @@ import java.util.List; public abstract class AbstractQuickDocProviderTest extends KotlinLightCodeInsightFixtureTestCase { public void doTest(@NotNull String path) throws Exception { - IdeaTestUtilsKt.configureWithExtraFileAbs(myFixture, path, "_Data"); + IdeaTestUtilsKt.configureWithExtraFile(myFixture, path, "_Data"); PsiElement element = myFixture.getFile().findElementAt(myFixture.getEditor().getCaretModel().getOffset()); assertNotNull("Can't find element at caret in file: " + path, element); diff --git a/idea/tests/org/jetbrains/kotlin/idea/resolve/AbstractReferenceResolveTest.kt b/idea/tests/org/jetbrains/kotlin/idea/resolve/AbstractReferenceResolveTest.kt index a295326d041..72a1bb4fbf1 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/resolve/AbstractReferenceResolveTest.kt +++ b/idea/tests/org/jetbrains/kotlin/idea/resolve/AbstractReferenceResolveTest.kt @@ -99,8 +99,6 @@ abstract class AbstractReferenceResolveTest : KotlinLightPlatformCodeInsightFixt override fun getProjectDescriptor(): LightProjectDescriptor? = KotlinWithJdkAndRuntimeLightProjectDescriptor.INSTANCE - override fun getTestDataPath() = "./" - open val refMarkerText: String = "REF" companion object { From 0d5a2a7e18fd4bbf5a978526e598271d7509e063 Mon Sep 17 00:00:00 2001 From: Denis Zharkov Date: Fri, 1 Sep 2017 10:35:56 +0300 Subject: [PATCH 132/212] Minor. Drop unused class ScopeLevelsAndSkippedForLookups --- .../jetbrains/kotlin/resolve/calls/tower/TowerResolver.kt | 5 ----- 1 file changed, 5 deletions(-) diff --git a/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/tower/TowerResolver.kt b/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/tower/TowerResolver.kt index 8b2700fcc5b..e7db86f3494 100644 --- a/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/tower/TowerResolver.kt +++ b/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/tower/TowerResolver.kt @@ -102,11 +102,6 @@ class TowerResolver { name: Name ): Collection = Task(this, processor, resultCollector, useOrder, name).run() - private data class ScopeLevelsAndSkippedForLookups( - val levelsToProcess: Collection, - val levelsToSkip: Collection - ) - private inner class Task( private val implicitScopeTower: ImplicitScopeTower, private val processor: ScopeTowerProcessor, From 73724bcdc71dac05355421292d7bea348adb3f1a Mon Sep 17 00:00:00 2001 From: Dmitry Petrov Date: Wed, 27 Sep 2017 16:14:09 +0300 Subject: [PATCH 133/212] Do not copy immediately created arrays in spread arguments E.g., 'foo(x = *intArrayOf(42))'. #KT-20462 Fixed --- .../kotlin/codegen/ExpressionCodegen.java | 20 +++- .../doNotCopyImmediatelyCreatedArrays.kt | 102 ++++++++++++++++++ .../doNotCopyImmediatelyCreatedArrays.kt | 77 +++++++++++++ .../ir/IrBlackBoxCodegenTestGenerated.java | 6 ++ .../codegen/BlackBoxCodegenTestGenerated.java | 6 ++ .../codegen/BytecodeTextTestGenerated.java | 15 +++ .../LightAnalysisModeTestGenerated.java | 6 ++ .../semantics/JsCodegenBoxTestGenerated.java | 6 ++ 8 files changed, 234 insertions(+), 4 deletions(-) create mode 100644 compiler/testData/codegen/box/vararg/doNotCopyImmediatelyCreatedArrays.kt create mode 100644 compiler/testData/codegen/bytecodeText/varargs/doNotCopyImmediatelyCreatedArrays.kt diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/ExpressionCodegen.java b/compiler/backend/src/org/jetbrains/kotlin/codegen/ExpressionCodegen.java index 17ba8ed6cf0..2bf0aec03df 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/ExpressionCodegen.java +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/ExpressionCodegen.java @@ -2656,6 +2656,15 @@ public class ExpressionCodegen extends KtVisitor impleme return cur; } + private boolean canSkipArrayCopyForSpreadArgument(KtExpression spreadArgument) { + ResolvedCall resolvedCall = CallUtilKt.getResolvedCall(spreadArgument, bindingContext); + if (resolvedCall == null) return false; + + CallableDescriptor calleeDescriptor = resolvedCall.getResultingDescriptor(); + return (calleeDescriptor instanceof ConstructorDescriptor) || + CompileTimeConstantUtils.isArrayFunctionCall(resolvedCall) || + (DescriptorUtils.getFqName(calleeDescriptor).asString().equals("kotlin.arrayOfNulls")); + } @NotNull public StackValue genVarargs(@NotNull VarargValueArgument valueArgument, @NotNull KotlinType outType) { @@ -2678,10 +2687,13 @@ public class ExpressionCodegen extends KtVisitor impleme if (size == 1) { Type arrayType = getArrayType(arrayOfReferences ? AsmTypes.OBJECT_TYPE : elementType); return StackValue.operation(type, adapter -> { - gen(arguments.get(0).getArgumentExpression(), type); - v.dup(); - v.arraylength(); - v.invokestatic("java/util/Arrays", "copyOf", Type.getMethodDescriptor(arrayType, arrayType, Type.INT_TYPE), false); + KtExpression spreadArgument = arguments.get(0).getArgumentExpression(); + gen(spreadArgument, type); + if (!canSkipArrayCopyForSpreadArgument(spreadArgument)) { + v.dup(); + v.arraylength(); + v.invokestatic("java/util/Arrays", "copyOf", Type.getMethodDescriptor(arrayType, arrayType, Type.INT_TYPE), false); + } if (arrayOfReferences) { v.checkcast(type); } diff --git a/compiler/testData/codegen/box/vararg/doNotCopyImmediatelyCreatedArrays.kt b/compiler/testData/codegen/box/vararg/doNotCopyImmediatelyCreatedArrays.kt new file mode 100644 index 00000000000..6cc4d47dc23 --- /dev/null +++ b/compiler/testData/codegen/box/vararg/doNotCopyImmediatelyCreatedArrays.kt @@ -0,0 +1,102 @@ +fun booleanVararg(vararg xs: Boolean) { + if (xs.size != 1 && xs[0] != true) throw AssertionError() +} + +fun byteVararg(vararg xs: Byte) { + if (xs.size != 1 && xs[0] != 1.toByte()) throw AssertionError() +} + +fun shortVararg(vararg xs: Short) { + if (xs.size != 1 && xs[0] != 1.toShort()) throw AssertionError() +} + +fun intVararg(vararg xs: Int) { + if (xs.size != 1 && xs[0] != 1) throw AssertionError() +} + +fun longVararg(vararg xs: Long) { + if (xs.size != 1 && xs[0] != 1L) throw AssertionError() +} + +fun floatVararg(vararg xs: Float) { + if (xs.size != 1 && xs[0] != 1.0f) throw AssertionError() +} + +fun doubleVararg(vararg xs: Double) { + if (xs.size != 1 && xs[0] != 1.0) throw AssertionError() +} + +fun anyVararg(vararg xs: Any?) { + if (xs.size != 1 && (xs[0] != 1 && xs[0] != null)) throw AssertionError() +} + +fun genericVararg(vararg xs: T) { + if (xs.size != 1 && (xs[0] != 1 && xs[0] != null)) throw AssertionError() +} + +fun box(): String { + booleanVararg(*booleanArrayOf(true)) + booleanVararg(*BooleanArray(1)) + booleanVararg(*BooleanArray(1) { true }) + booleanVararg(xs = *booleanArrayOf(true)) + booleanVararg(xs = *BooleanArray(1)) + booleanVararg(xs = *BooleanArray(1) { true }) + + byteVararg(*byteArrayOf(1)) + byteVararg(*ByteArray(1)) + byteVararg(*ByteArray(1) { 1 }) + byteVararg(xs = *byteArrayOf(1)) + byteVararg(xs = *ByteArray(1)) + byteVararg(xs = *ByteArray(1) { 1 }) + + shortVararg(*shortArrayOf(1)) + shortVararg(*ShortArray(1)) + shortVararg(*ShortArray(1) { 1 }) + shortVararg(xs = *shortArrayOf(1)) + shortVararg(xs = *ShortArray(1)) + shortVararg(xs = *ShortArray(1) { 1 }) + + intVararg(*intArrayOf(1)) + intVararg(*IntArray(1)) + intVararg(*IntArray(1) { 1 }) + intVararg(xs = *intArrayOf(1)) + intVararg(xs = *IntArray(1)) + intVararg(xs = *IntArray(1) { 1 }) + + longVararg(*longArrayOf(1L)) + longVararg(*LongArray(1)) + longVararg(*LongArray(1) { 1L }) + longVararg(xs = *longArrayOf(1L)) + longVararg(xs = *LongArray(1)) + longVararg(xs = *LongArray(1) { 1L }) + + floatVararg(*floatArrayOf(1.0f)) + floatVararg(*FloatArray(1)) + floatVararg(*FloatArray(1) { 1.0f }) + floatVararg(xs = *floatArrayOf(1.0f)) + floatVararg(xs = *FloatArray(1)) + floatVararg(xs = *FloatArray(1) { 1.0f }) + + doubleVararg(*doubleArrayOf(1.0)) + doubleVararg(*DoubleArray(1)) + doubleVararg(*DoubleArray(1) { 1.0 }) + doubleVararg(xs = *doubleArrayOf(1.0)) + doubleVararg(xs = *DoubleArray(1)) + doubleVararg(xs = *DoubleArray(1) { 1.0 }) + + anyVararg(*arrayOf(1)) + anyVararg(*Array(1) { 1 }) + anyVararg(*arrayOfNulls(1)) + anyVararg(xs = *arrayOf(1)) + anyVararg(xs = *Array(1) { 1 }) + anyVararg(xs = *arrayOfNulls(1)) + + genericVararg(*arrayOf(1)) + genericVararg(*Array(1) { 1 }) + genericVararg(*arrayOfNulls(1)) + genericVararg(xs = *arrayOf(1)) + genericVararg(xs = *Array(1) { 1 }) + genericVararg(xs = *arrayOfNulls(1)) + + return "OK" +} \ No newline at end of file diff --git a/compiler/testData/codegen/bytecodeText/varargs/doNotCopyImmediatelyCreatedArrays.kt b/compiler/testData/codegen/bytecodeText/varargs/doNotCopyImmediatelyCreatedArrays.kt new file mode 100644 index 00000000000..fece3a4b4b6 --- /dev/null +++ b/compiler/testData/codegen/bytecodeText/varargs/doNotCopyImmediatelyCreatedArrays.kt @@ -0,0 +1,77 @@ +fun booleanVararg(vararg xs: Boolean) {} +fun byteVararg(vararg xs: Byte) {} +fun shortVararg(vararg xs: Short) {} +fun intVararg(vararg xs: Int) {} +fun longVararg(vararg xs: Long) {} +fun floatVararg(vararg xs: Float) {} +fun doubleVararg(vararg xs: Double) {} +fun anyVararg(vararg xs: Any?) {} +fun genericVararg(vararg xs: T) {} + +fun test() { + booleanVararg(*booleanArrayOf(true)) + booleanVararg(*BooleanArray(1)) + booleanVararg(*BooleanArray(1) { true }) + booleanVararg(xs = *booleanArrayOf(true)) + booleanVararg(xs = *BooleanArray(1)) + booleanVararg(xs = *BooleanArray(1) { true }) + + byteVararg(*byteArrayOf(1)) + byteVararg(*ByteArray(1)) + byteVararg(*ByteArray(1) { 1 }) + byteVararg(xs = *byteArrayOf(1)) + byteVararg(xs = *ByteArray(1)) + byteVararg(xs = *ByteArray(1) { 1 }) + + shortVararg(*shortArrayOf(1)) + shortVararg(*ShortArray(1)) + shortVararg(*ShortArray(1) { 1 }) + shortVararg(xs = *shortArrayOf(1)) + shortVararg(xs = *ShortArray(1)) + shortVararg(xs = *ShortArray(1) { 1 }) + + intVararg(*intArrayOf(1)) + intVararg(*IntArray(1)) + intVararg(*IntArray(1) { 1 }) + intVararg(xs = *intArrayOf(1)) + intVararg(xs = *IntArray(1)) + intVararg(xs = *IntArray(1) { 1 }) + + longVararg(*longArrayOf(1L)) + longVararg(*LongArray(1)) + longVararg(*LongArray(1) { 1L }) + longVararg(xs = *longArrayOf(1L)) + longVararg(xs = *LongArray(1)) + longVararg(xs = *LongArray(1) { 1L }) + + floatVararg(*floatArrayOf(1.0f)) + floatVararg(*FloatArray(1)) + floatVararg(*FloatArray(1) { 1.0f }) + floatVararg(xs = *floatArrayOf(1.0f)) + floatVararg(xs = *FloatArray(1)) + floatVararg(xs = *FloatArray(1) { 1.0f }) + + doubleVararg(*doubleArrayOf(1.0)) + doubleVararg(*DoubleArray(1)) + doubleVararg(*DoubleArray(1) { 1.0 }) + doubleVararg(xs = *doubleArrayOf(1.0)) + doubleVararg(xs = *DoubleArray(1)) + doubleVararg(xs = *DoubleArray(1) { 1.0 }) + + anyVararg(*arrayOf(1)) + anyVararg(*Array(1) { 1 }) + anyVararg(*arrayOfNulls(1)) + anyVararg(xs = *arrayOf(1)) + anyVararg(xs = *Array(1) { 1 }) + anyVararg(xs = *arrayOfNulls(1)) + + genericVararg(*arrayOf(1)) + genericVararg(*Array(1) { 1 }) + genericVararg(*arrayOfNulls(1)) + genericVararg(xs = *arrayOf(1)) + genericVararg(xs = *Array(1) { 1 }) + genericVararg(xs = *arrayOfNulls(1)) +} + +// 0 copyOf +// 0 clone \ No newline at end of file diff --git a/compiler/tests-ir-jvm/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java b/compiler/tests-ir-jvm/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java index da495a1c126..78a92cd8495 100644 --- a/compiler/tests-ir-jvm/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java +++ b/compiler/tests-ir-jvm/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java @@ -19688,6 +19688,12 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes doTest(fileName); } + @TestMetadata("doNotCopyImmediatelyCreatedArrays.kt") + public void testDoNotCopyImmediatelyCreatedArrays() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/vararg/doNotCopyImmediatelyCreatedArrays.kt"); + doTest(fileName); + } + @TestMetadata("kt1978.kt") public void testKt1978() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/vararg/kt1978.kt"); diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java index 315fdb42ca4..70f29ac434a 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java @@ -19688,6 +19688,12 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest { doTest(fileName); } + @TestMetadata("doNotCopyImmediatelyCreatedArrays.kt") + public void testDoNotCopyImmediatelyCreatedArrays() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/vararg/doNotCopyImmediatelyCreatedArrays.kt"); + doTest(fileName); + } + @TestMetadata("kt1978.kt") public void testKt1978() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/vararg/kt1978.kt"); diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/BytecodeTextTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/BytecodeTextTestGenerated.java index 73879200d6f..86d8f514ed4 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/BytecodeTextTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/BytecodeTextTestGenerated.java @@ -2202,6 +2202,21 @@ public class BytecodeTextTestGenerated extends AbstractBytecodeTextTest { } } + @TestMetadata("compiler/testData/codegen/bytecodeText/varargs") + @TestDataPath("$PROJECT_ROOT") + @RunWith(JUnit3RunnerWithInners.class) + public static class Varargs extends AbstractBytecodeTextTest { + public void testAllFilesPresentInVarargs() throws Exception { + KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("compiler/testData/codegen/bytecodeText/varargs"), Pattern.compile("^(.+)\\.kt$"), TargetBackend.ANY, true); + } + + @TestMetadata("doNotCopyImmediatelyCreatedArrays.kt") + public void testDoNotCopyImmediatelyCreatedArrays() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/bytecodeText/varargs/doNotCopyImmediatelyCreatedArrays.kt"); + doTest(fileName); + } + } + @TestMetadata("compiler/testData/codegen/bytecodeText/when") @TestDataPath("$PROJECT_ROOT") @RunWith(JUnit3RunnerWithInners.class) diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java index f4f8af9a1e3..3effa38f59f 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java @@ -19688,6 +19688,12 @@ public class LightAnalysisModeTestGenerated extends AbstractLightAnalysisModeTes doTest(fileName); } + @TestMetadata("doNotCopyImmediatelyCreatedArrays.kt") + public void testDoNotCopyImmediatelyCreatedArrays() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/vararg/doNotCopyImmediatelyCreatedArrays.kt"); + doTest(fileName); + } + @TestMetadata("kt1978.kt") public void testKt1978() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/vararg/kt1978.kt"); diff --git a/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/JsCodegenBoxTestGenerated.java b/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/JsCodegenBoxTestGenerated.java index bd63ea2bcd9..f32ad268026 100644 --- a/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/JsCodegenBoxTestGenerated.java +++ b/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/JsCodegenBoxTestGenerated.java @@ -23666,6 +23666,12 @@ public class JsCodegenBoxTestGenerated extends AbstractJsCodegenBoxTest { throw new AssertionError("Looks like this test can be unmuted. Remove IGNORE_BACKEND directive for that."); } + @TestMetadata("doNotCopyImmediatelyCreatedArrays.kt") + public void testDoNotCopyImmediatelyCreatedArrays() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/vararg/doNotCopyImmediatelyCreatedArrays.kt"); + doTest(fileName); + } + @TestMetadata("kt1978.kt") public void testKt1978() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/vararg/kt1978.kt"); From 3994034f463fb396d6eba9c5c2db468f6f5fcc16 Mon Sep 17 00:00:00 2001 From: Dmitry Petrov Date: Thu, 28 Sep 2017 10:32:28 +0300 Subject: [PATCH 134/212] Keep track of synthetic accessor parameter types Accessor parameter types may be different from callee parameter types in case of generic methods specialized by primitive types: open class Base { protected fun foo(x: T) {} } // in different package class Derived : Base { inner class Inner { fun bar() { foo(42L) } } } Synthetic accessor for 'Base.foo' in 'Derived' has signature '(J)V' (not '(Ljava.lang.Object;)V' or '(Ljava.lang.Long;)V'), and should box its parameter. Note that in Java the corresponding synthetic accessor has signature '(Ljava.lang.Long;)V' with auto-boxing at call site. #KT-20491 Fixed --- .../kotlin/codegen/MemberCodegen.java | 22 ++++++++++---- .../codegen/state/KotlinTypeMapper.java | 4 +-- .../accessorForGenericConstructor.kt | 20 +++++++++++++ .../accessorForGenericMethod.kt | 29 +++++++++++++++++++ .../accessorForGenericMethodWithDefaults.kt | 29 +++++++++++++++++++ .../ir/IrBlackBoxCodegenTestGenerated.java | 18 ++++++++++++ .../codegen/BlackBoxCodegenTestGenerated.java | 18 ++++++++++++ .../LightAnalysisModeTestGenerated.java | 18 ++++++++++++ .../semantics/JsCodegenBoxTestGenerated.java | 18 ++++++++++++ 9 files changed, 168 insertions(+), 8 deletions(-) create mode 100644 compiler/testData/codegen/box/syntheticAccessors/accessorForGenericConstructor.kt create mode 100644 compiler/testData/codegen/box/syntheticAccessors/accessorForGenericMethod.kt create mode 100644 compiler/testData/codegen/box/syntheticAccessors/accessorForGenericMethodWithDefaults.kt diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/MemberCodegen.java b/compiler/backend/src/org/jetbrains/kotlin/codegen/MemberCodegen.java index f9b35847729..25b92ce0b9a 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/MemberCodegen.java +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/MemberCodegen.java @@ -813,27 +813,37 @@ public abstract class MemberCodegen; } - public static boolean isStaticAccessor(@NotNull CallableMemberDescriptor descriptor) { + public static boolean isStaticAccessor(@Nullable CallableMemberDescriptor descriptor) { if (descriptor instanceof AccessorForConstructorDescriptor) return false; return isAccessor(descriptor); } diff --git a/compiler/testData/codegen/box/syntheticAccessors/accessorForGenericConstructor.kt b/compiler/testData/codegen/box/syntheticAccessors/accessorForGenericConstructor.kt new file mode 100644 index 00000000000..9a97980a5a6 --- /dev/null +++ b/compiler/testData/codegen/box/syntheticAccessors/accessorForGenericConstructor.kt @@ -0,0 +1,20 @@ +fun box(): String { + A.Nested().nestedA() + A.Nested().Inner().innerA() + A.companionA() + return "OK" +} + +class A private constructor(val x: T, val y: Int = 0) { + class Nested { + fun nestedA() = A(1L) + + inner class Inner { + fun innerA() = A(1L) + } + } + + companion object { + fun companionA() = A(1L) + } +} \ No newline at end of file diff --git a/compiler/testData/codegen/box/syntheticAccessors/accessorForGenericMethod.kt b/compiler/testData/codegen/box/syntheticAccessors/accessorForGenericMethod.kt new file mode 100644 index 00000000000..a5ffca91336 --- /dev/null +++ b/compiler/testData/codegen/box/syntheticAccessors/accessorForGenericMethod.kt @@ -0,0 +1,29 @@ +// FILE: test.kt +import b.B + +fun box() = + B().getOK() + +// FILE: a.kt +package a + +open class A { + protected fun getO(x: T) = "O" + protected fun getK(x: T) = "K" +} + +// FILE: b.kt +package b + +import a.A + +class B : A() { + inner class Inner { + fun innerGetO() = getO(0L) + } + + fun lambdaGetK() = { -> getK(0L) } + + fun getOK() = + Inner().innerGetO() + lambdaGetK().invoke() +} \ No newline at end of file diff --git a/compiler/testData/codegen/box/syntheticAccessors/accessorForGenericMethodWithDefaults.kt b/compiler/testData/codegen/box/syntheticAccessors/accessorForGenericMethodWithDefaults.kt new file mode 100644 index 00000000000..943d7e681cd --- /dev/null +++ b/compiler/testData/codegen/box/syntheticAccessors/accessorForGenericMethodWithDefaults.kt @@ -0,0 +1,29 @@ +// FILE: test.kt +import b.B + +fun box() = + B().getOK() + +// FILE: a.kt +package a + +open class A { + protected fun getO(x: T, z: String = "") = "O" + z + protected fun getK(x: T, z: String = "") = "K" + z +} + +// FILE: b.kt +package b + +import a.A + +class B : A() { + inner class Inner { + fun innerGetO() = getO(0L) + } + + fun lambdaGetK() = { -> getK(0L) } + + fun getOK() = + Inner().innerGetO() + lambdaGetK().invoke() +} \ No newline at end of file diff --git a/compiler/tests-ir-jvm/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java b/compiler/tests-ir-jvm/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java index 78a92cd8495..bc9a65fc5f7 100644 --- a/compiler/tests-ir-jvm/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java +++ b/compiler/tests-ir-jvm/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java @@ -18967,6 +18967,24 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes @TestDataPath("$PROJECT_ROOT") @RunWith(JUnit3RunnerWithInners.class) public static class SyntheticAccessors extends AbstractIrBlackBoxCodegenTest { + @TestMetadata("accessorForGenericConstructor.kt") + public void testAccessorForGenericConstructor() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/syntheticAccessors/accessorForGenericConstructor.kt"); + doTest(fileName); + } + + @TestMetadata("accessorForGenericMethod.kt") + public void testAccessorForGenericMethod() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/syntheticAccessors/accessorForGenericMethod.kt"); + doTest(fileName); + } + + @TestMetadata("accessorForGenericMethodWithDefaults.kt") + public void testAccessorForGenericMethodWithDefaults() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/syntheticAccessors/accessorForGenericMethodWithDefaults.kt"); + doTest(fileName); + } + @TestMetadata("accessorForProtected.kt") public void testAccessorForProtected() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/syntheticAccessors/accessorForProtected.kt"); diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java index 70f29ac434a..30b4d0112c6 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java @@ -18967,6 +18967,24 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest { @TestDataPath("$PROJECT_ROOT") @RunWith(JUnit3RunnerWithInners.class) public static class SyntheticAccessors extends AbstractBlackBoxCodegenTest { + @TestMetadata("accessorForGenericConstructor.kt") + public void testAccessorForGenericConstructor() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/syntheticAccessors/accessorForGenericConstructor.kt"); + doTest(fileName); + } + + @TestMetadata("accessorForGenericMethod.kt") + public void testAccessorForGenericMethod() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/syntheticAccessors/accessorForGenericMethod.kt"); + doTest(fileName); + } + + @TestMetadata("accessorForGenericMethodWithDefaults.kt") + public void testAccessorForGenericMethodWithDefaults() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/syntheticAccessors/accessorForGenericMethodWithDefaults.kt"); + doTest(fileName); + } + @TestMetadata("accessorForProtected.kt") public void testAccessorForProtected() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/syntheticAccessors/accessorForProtected.kt"); diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java index 3effa38f59f..8510ee1169f 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java @@ -18967,6 +18967,24 @@ public class LightAnalysisModeTestGenerated extends AbstractLightAnalysisModeTes @TestDataPath("$PROJECT_ROOT") @RunWith(JUnit3RunnerWithInners.class) public static class SyntheticAccessors extends AbstractLightAnalysisModeTest { + @TestMetadata("accessorForGenericConstructor.kt") + public void testAccessorForGenericConstructor() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/syntheticAccessors/accessorForGenericConstructor.kt"); + doTest(fileName); + } + + @TestMetadata("accessorForGenericMethod.kt") + public void testAccessorForGenericMethod() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/syntheticAccessors/accessorForGenericMethod.kt"); + doTest(fileName); + } + + @TestMetadata("accessorForGenericMethodWithDefaults.kt") + public void testAccessorForGenericMethodWithDefaults() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/syntheticAccessors/accessorForGenericMethodWithDefaults.kt"); + doTest(fileName); + } + @TestMetadata("accessorForProtected.kt") public void testAccessorForProtected() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/syntheticAccessors/accessorForProtected.kt"); diff --git a/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/JsCodegenBoxTestGenerated.java b/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/JsCodegenBoxTestGenerated.java index f32ad268026..240799a4fe4 100644 --- a/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/JsCodegenBoxTestGenerated.java +++ b/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/JsCodegenBoxTestGenerated.java @@ -22849,6 +22849,24 @@ public class JsCodegenBoxTestGenerated extends AbstractJsCodegenBoxTest { @TestDataPath("$PROJECT_ROOT") @RunWith(JUnit3RunnerWithInners.class) public static class SyntheticAccessors extends AbstractJsCodegenBoxTest { + @TestMetadata("accessorForGenericConstructor.kt") + public void testAccessorForGenericConstructor() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/syntheticAccessors/accessorForGenericConstructor.kt"); + doTest(fileName); + } + + @TestMetadata("accessorForGenericMethod.kt") + public void testAccessorForGenericMethod() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/syntheticAccessors/accessorForGenericMethod.kt"); + doTest(fileName); + } + + @TestMetadata("accessorForGenericMethodWithDefaults.kt") + public void testAccessorForGenericMethodWithDefaults() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/syntheticAccessors/accessorForGenericMethodWithDefaults.kt"); + doTest(fileName); + } + @TestMetadata("accessorForProtected.kt") public void testAccessorForProtected() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/syntheticAccessors/accessorForProtected.kt"); From f4f1ea91d9b38fc6009e0bae247d33fcf5e07632 Mon Sep 17 00:00:00 2001 From: Dmitry Petrov Date: Thu, 28 Sep 2017 11:31:19 +0300 Subject: [PATCH 135/212] Use accessible get/set arguments for collection element receiver When generating collection element receiver (such as 'a[i]'), accessible descriptor for get/set operator should be used. Otherwise, if the corresponding get/set operator fun is called via an accessor, its argument types may be different in case of generic fun specialized with primitive types. #KT-20387 Fixed --- .../kotlin/codegen/ExpressionCodegen.java | 4 +++- .../codegen/box/operatorConventions/kt20387.kt | 17 +++++++++++++++++ .../ir/IrBlackBoxCodegenTestGenerated.java | 6 ++++++ .../codegen/BlackBoxCodegenTestGenerated.java | 6 ++++++ .../codegen/LightAnalysisModeTestGenerated.java | 6 ++++++ .../semantics/JsCodegenBoxTestGenerated.java | 6 ++++++ 6 files changed, 44 insertions(+), 1 deletion(-) create mode 100644 compiler/testData/codegen/box/operatorConventions/kt20387.kt diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/ExpressionCodegen.java b/compiler/backend/src/org/jetbrains/kotlin/codegen/ExpressionCodegen.java index 2bf0aec03df..40af774d941 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/ExpressionCodegen.java +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/ExpressionCodegen.java @@ -3914,7 +3914,9 @@ public class ExpressionCodegen extends KtVisitor impleme boolean isGetter = OperatorNameConventions.GET.equals(operationDescriptor.getName()); - Callable callable = resolveToCallable(operationDescriptor, false, isGetter ? resolvedGetCall : resolvedSetCall); + ResolvedCall resolvedCall = isGetter ? resolvedGetCall : resolvedSetCall; + assert resolvedCall != null : "No resolved call for " + operationDescriptor; + Callable callable = resolveToCallable(accessibleFunctionDescriptor(resolvedCall), false, resolvedCall); Callable callableMethod = resolveToCallableMethod(operationDescriptor, false); Type[] argumentTypes = callableMethod.getParameterTypes(); diff --git a/compiler/testData/codegen/box/operatorConventions/kt20387.kt b/compiler/testData/codegen/box/operatorConventions/kt20387.kt new file mode 100644 index 00000000000..95fcaa70ec6 --- /dev/null +++ b/compiler/testData/codegen/box/operatorConventions/kt20387.kt @@ -0,0 +1,17 @@ +// FILE: test.kt +import base.* + +class Derived : Base() { + inner class Inner { + fun foo() = this@Derived[0L] + } +} + +fun box() = Derived().Inner().foo() + +// FILE: Base.kt +package base + +open class Base { + protected operator fun get(key: K) = "OK" +} \ No newline at end of file diff --git a/compiler/tests-ir-jvm/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java b/compiler/tests-ir-jvm/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java index bc9a65fc5f7..a8801ae0325 100644 --- a/compiler/tests-ir-jvm/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java +++ b/compiler/tests-ir-jvm/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java @@ -12194,6 +12194,12 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes doTest(fileName); } + @TestMetadata("kt20387.kt") + public void testKt20387() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/operatorConventions/kt20387.kt"); + doTest(fileName); + } + @TestMetadata("kt4152.kt") public void testKt4152() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/operatorConventions/kt4152.kt"); diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java index 30b4d0112c6..07412989dad 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java @@ -12194,6 +12194,12 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest { doTest(fileName); } + @TestMetadata("kt20387.kt") + public void testKt20387() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/operatorConventions/kt20387.kt"); + doTest(fileName); + } + @TestMetadata("kt4152.kt") public void testKt4152() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/operatorConventions/kt4152.kt"); diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java index 8510ee1169f..b647c12016c 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java @@ -12194,6 +12194,12 @@ public class LightAnalysisModeTestGenerated extends AbstractLightAnalysisModeTes doTest(fileName); } + @TestMetadata("kt20387.kt") + public void testKt20387() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/operatorConventions/kt20387.kt"); + doTest(fileName); + } + @TestMetadata("kt4152.kt") public void testKt4152() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/operatorConventions/kt4152.kt"); diff --git a/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/JsCodegenBoxTestGenerated.java b/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/JsCodegenBoxTestGenerated.java index 240799a4fe4..47403e25b3b 100644 --- a/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/JsCodegenBoxTestGenerated.java +++ b/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/JsCodegenBoxTestGenerated.java @@ -13454,6 +13454,12 @@ public class JsCodegenBoxTestGenerated extends AbstractJsCodegenBoxTest { doTest(fileName); } + @TestMetadata("kt20387.kt") + public void testKt20387() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/operatorConventions/kt20387.kt"); + doTest(fileName); + } + @TestMetadata("kt4152.kt") public void testKt4152() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/operatorConventions/kt4152.kt"); From 3158700500adc43a0a9e8e10bafcb5948632dfdd Mon Sep 17 00:00:00 2001 From: Dmitry Petrov Date: Thu, 28 Sep 2017 11:40:17 +0300 Subject: [PATCH 136/212] Add test for generic setValue called via synthetic accessor Synthetic accessor for 'setValue' was generated incorrectly, specific case of KT-20491 (Incorrect synthetic accessor generated for a generic base class function specialized with primitive type). Make sure there's no equivalent of KT-20387 for delegated properties. --- .../genericSetValueViaSyntheticAccessor.kt | 25 +++++++++++++++++++ .../ir/IrBlackBoxCodegenTestGenerated.java | 6 +++++ .../codegen/BlackBoxCodegenTestGenerated.java | 6 +++++ .../LightAnalysisModeTestGenerated.java | 6 +++++ .../semantics/JsCodegenBoxTestGenerated.java | 6 +++++ 5 files changed, 49 insertions(+) create mode 100644 compiler/testData/codegen/box/delegatedProperty/genericSetValueViaSyntheticAccessor.kt diff --git a/compiler/testData/codegen/box/delegatedProperty/genericSetValueViaSyntheticAccessor.kt b/compiler/testData/codegen/box/delegatedProperty/genericSetValueViaSyntheticAccessor.kt new file mode 100644 index 00000000000..cfcaceb9ebc --- /dev/null +++ b/compiler/testData/codegen/box/delegatedProperty/genericSetValueViaSyntheticAccessor.kt @@ -0,0 +1,25 @@ +// FILE: Var.kt +package pvar + +open class PVar(private var value: T) { + protected operator fun getValue(thisRef: Any?, prop: Any?) = value + + protected operator fun setValue(thisRef: Any?, prop: Any?, newValue: T) { + value = newValue + } +} + +// FILE: test.kt +import pvar.* + +class C : PVar(42L) { + inner class Inner { + var x by this@C + } +} + +fun box(): String { + val inner = C().Inner() + inner.x = 1L + return "OK" +} \ No newline at end of file diff --git a/compiler/tests-ir-jvm/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java b/compiler/tests-ir-jvm/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java index a8801ae0325..80800891a98 100644 --- a/compiler/tests-ir-jvm/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java +++ b/compiler/tests-ir-jvm/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java @@ -6923,6 +6923,12 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes throw new AssertionError("Looks like this test can be unmuted. Remove IGNORE_BACKEND directive for that."); } + @TestMetadata("genericSetValueViaSyntheticAccessor.kt") + public void testGenericSetValueViaSyntheticAccessor() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/delegatedProperty/genericSetValueViaSyntheticAccessor.kt"); + doTest(fileName); + } + @TestMetadata("getAsExtensionFun.kt") public void testGetAsExtensionFun() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/delegatedProperty/getAsExtensionFun.kt"); diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java index 07412989dad..cca5d666cd8 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java @@ -6923,6 +6923,12 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest { throw new AssertionError("Looks like this test can be unmuted. Remove IGNORE_BACKEND directive for that."); } + @TestMetadata("genericSetValueViaSyntheticAccessor.kt") + public void testGenericSetValueViaSyntheticAccessor() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/delegatedProperty/genericSetValueViaSyntheticAccessor.kt"); + doTest(fileName); + } + @TestMetadata("getAsExtensionFun.kt") public void testGetAsExtensionFun() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/delegatedProperty/getAsExtensionFun.kt"); diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java index b647c12016c..a97ded3eadf 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java @@ -6923,6 +6923,12 @@ public class LightAnalysisModeTestGenerated extends AbstractLightAnalysisModeTes doTest(fileName); } + @TestMetadata("genericSetValueViaSyntheticAccessor.kt") + public void testGenericSetValueViaSyntheticAccessor() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/delegatedProperty/genericSetValueViaSyntheticAccessor.kt"); + doTest(fileName); + } + @TestMetadata("getAsExtensionFun.kt") public void testGetAsExtensionFun() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/delegatedProperty/getAsExtensionFun.kt"); diff --git a/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/JsCodegenBoxTestGenerated.java b/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/JsCodegenBoxTestGenerated.java index 47403e25b3b..7a0d53e6ca3 100644 --- a/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/JsCodegenBoxTestGenerated.java +++ b/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/JsCodegenBoxTestGenerated.java @@ -7619,6 +7619,12 @@ public class JsCodegenBoxTestGenerated extends AbstractJsCodegenBoxTest { throw new AssertionError("Looks like this test can be unmuted. Remove IGNORE_BACKEND directive for that."); } + @TestMetadata("genericSetValueViaSyntheticAccessor.kt") + public void testGenericSetValueViaSyntheticAccessor() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/delegatedProperty/genericSetValueViaSyntheticAccessor.kt"); + doTest(fileName); + } + @TestMetadata("getAsExtensionFun.kt") public void testGetAsExtensionFun() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/delegatedProperty/getAsExtensionFun.kt"); From 5edeb359c80517311cbf55f6d722c28e760ccb0c Mon Sep 17 00:00:00 2001 From: Mikhail Glukhikh Date: Tue, 26 Sep 2017 13:55:08 +0300 Subject: [PATCH 137/212] Split multi module and multi platform highlighting tests Now both of them can execute without problems --- .../resolve/MultiModuleHighlightingTest.kt | 68 -------------- .../resolve/MultiPlatformHighlightingTest.kt | 88 +++++++++++++++++++ 2 files changed, 88 insertions(+), 68 deletions(-) create mode 100644 idea/tests/org/jetbrains/kotlin/idea/caches/resolve/MultiPlatformHighlightingTest.kt diff --git a/idea/tests/org/jetbrains/kotlin/idea/caches/resolve/MultiModuleHighlightingTest.kt b/idea/tests/org/jetbrains/kotlin/idea/caches/resolve/MultiModuleHighlightingTest.kt index d41ae568127..83f84f17ddf 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/caches/resolve/MultiModuleHighlightingTest.kt +++ b/idea/tests/org/jetbrains/kotlin/idea/caches/resolve/MultiModuleHighlightingTest.kt @@ -30,14 +30,10 @@ import com.intellij.psi.util.PsiModificationTracker import org.jetbrains.kotlin.analyzer.ModuleInfo import org.jetbrains.kotlin.analyzer.ResolverForModuleComputationTracker import org.jetbrains.kotlin.cli.common.arguments.K2JVMCompilerArguments -import org.jetbrains.kotlin.codegen.forTestCompile.ForTestCompileRuntime -import org.jetbrains.kotlin.config.JvmTarget import org.jetbrains.kotlin.config.LanguageVersion -import org.jetbrains.kotlin.config.TargetPlatformKind import org.jetbrains.kotlin.idea.completion.test.withServiceRegistered import org.jetbrains.kotlin.idea.facet.KotlinFacetConfiguration import org.jetbrains.kotlin.idea.facet.KotlinFacetType -import org.jetbrains.kotlin.idea.framework.JSLibraryKind import org.jetbrains.kotlin.idea.project.KotlinCodeBlockModificationListener import org.jetbrains.kotlin.idea.project.KotlinModuleModificationTracker import org.jetbrains.kotlin.idea.test.PluginTestCaseBase @@ -227,68 +223,4 @@ open class MultiModuleHighlightingTest : AbstractMultiModuleHighlightingTest() { configuration.configure() } } - - // Some tests are ignored below. They fail because markers are not stripped correctly in multi-module highlighting tests. - // TODO: fix this in the test framework and unignore the tests - class MultiPlatform : AbstractMultiModuleHighlightingTest() { - override fun getTestDataPath() = "${PluginTestCaseBase.getTestDataPathBase()}/multiModuleHighlighting/multiplatform/" - - fun testBasic() { - doMultiPlatformTest(TargetPlatformKind.Jvm[JvmTarget.JVM_1_6]) - } - - fun testHeaderClass() { - doMultiPlatformTest(TargetPlatformKind.Jvm[JvmTarget.JVM_1_6]) - } - - fun testHeaderWithoutImplForBoth() { - doMultiPlatformTest(TargetPlatformKind.Jvm[JvmTarget.JVM_1_6], TargetPlatformKind.JavaScript) - } - - fun ignore_testHeaderPartiallyImplemented() { - doMultiPlatformTest(TargetPlatformKind.Jvm[JvmTarget.JVM_1_6]) - } - - fun testHeaderFunctionProperty() { - doMultiPlatformTest(TargetPlatformKind.Jvm[JvmTarget.JVM_1_6]) - } - - fun testSuppressHeaderWithoutImpl() { - doMultiPlatformTest(TargetPlatformKind.Jvm[JvmTarget.JVM_1_6]) - } - - fun testCatchHeaderExceptionInPlatformModule() { - doMultiPlatformTest(TargetPlatformKind.Jvm[JvmTarget.JVM_1_6], withStdlibCommon = true) - } - - fun testWithOverrides() { - doMultiPlatformTest(TargetPlatformKind.Jvm[JvmTarget.JVM_1_6]) - } - - fun testUseCorrectBuiltInsForCommonModule() { - doMultiPlatformTest(TargetPlatformKind.Jvm[JvmTarget.JVM_1_8], TargetPlatformKind.JavaScript, - withStdlibCommon = true, jdk = FULL_JDK, configureModule = { module, platform -> - if (platform == TargetPlatformKind.JavaScript) { - module.addLibrary(ForTestCompileRuntime.stdlibJsForTests(), kind = JSLibraryKind) - module.addLibrary(ForTestCompileRuntime.stdlibCommonForTests()) - } - }) - } - - fun testHeaderClassImplTypealias() { - doMultiPlatformTest(TargetPlatformKind.Jvm[JvmTarget.JVM_1_6]) - } - - fun testHeaderFunUsesStdlibInSignature() { - doMultiPlatformTest(TargetPlatformKind.Jvm[JvmTarget.JVM_1_6], withStdlibCommon = true, configureModule = { module, platform -> - if (platform is TargetPlatformKind.Jvm) { - module.addLibrary(ForTestCompileRuntime.runtimeJarForTests()) - } - }) - } - - fun ignore_testNestedClassWithoutImpl() { - doMultiPlatformTest(TargetPlatformKind.Jvm[JvmTarget.JVM_1_6]) - } - } } diff --git a/idea/tests/org/jetbrains/kotlin/idea/caches/resolve/MultiPlatformHighlightingTest.kt b/idea/tests/org/jetbrains/kotlin/idea/caches/resolve/MultiPlatformHighlightingTest.kt new file mode 100644 index 00000000000..fce4f3c0328 --- /dev/null +++ b/idea/tests/org/jetbrains/kotlin/idea/caches/resolve/MultiPlatformHighlightingTest.kt @@ -0,0 +1,88 @@ +/* + * Copyright 2010-2017 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.caches.resolve + +import org.jetbrains.kotlin.codegen.forTestCompile.ForTestCompileRuntime +import org.jetbrains.kotlin.config.JvmTarget +import org.jetbrains.kotlin.config.TargetPlatformKind +import org.jetbrains.kotlin.idea.framework.JSLibraryKind +import org.jetbrains.kotlin.idea.test.PluginTestCaseBase +import org.jetbrains.kotlin.test.TestJdkKind + +// Some tests are ignored below. They fail because markers are not stripped correctly in multi-module highlighting tests. +// TODO: fix this in the test framework and unignore the tests +class MultiPlatformHighlightingTest : AbstractMultiModuleHighlightingTest() { + override fun getTestDataPath() = "${PluginTestCaseBase.getTestDataPathBase()}/multiModuleHighlighting/multiplatform/" + + fun testBasic() { + doMultiPlatformTest(TargetPlatformKind.Jvm[JvmTarget.JVM_1_6]) + } + + fun testHeaderClass() { + doMultiPlatformTest(TargetPlatformKind.Jvm[JvmTarget.JVM_1_6]) + } + + fun testHeaderWithoutImplForBoth() { + doMultiPlatformTest(TargetPlatformKind.Jvm[JvmTarget.JVM_1_6], TargetPlatformKind.JavaScript) + } + + fun ignore_testHeaderPartiallyImplemented() { + doMultiPlatformTest(TargetPlatformKind.Jvm[JvmTarget.JVM_1_6]) + } + + fun testHeaderFunctionProperty() { + doMultiPlatformTest(TargetPlatformKind.Jvm[JvmTarget.JVM_1_6]) + } + + fun testSuppressHeaderWithoutImpl() { + doMultiPlatformTest(TargetPlatformKind.Jvm[JvmTarget.JVM_1_6]) + } + + fun testCatchHeaderExceptionInPlatformModule() { + doMultiPlatformTest(TargetPlatformKind.Jvm[JvmTarget.JVM_1_6], withStdlibCommon = true) + } + + fun testWithOverrides() { + doMultiPlatformTest(TargetPlatformKind.Jvm[JvmTarget.JVM_1_6]) + } + + fun testUseCorrectBuiltInsForCommonModule() { + doMultiPlatformTest(TargetPlatformKind.Jvm[JvmTarget.JVM_1_8], TargetPlatformKind.JavaScript, + withStdlibCommon = true, jdk = TestJdkKind.FULL_JDK, configureModule = { module, platform -> + if (platform == TargetPlatformKind.JavaScript) { + module.addLibrary(ForTestCompileRuntime.stdlibJsForTests(), kind = JSLibraryKind) + module.addLibrary(ForTestCompileRuntime.stdlibCommonForTests()) + } + }) + } + + fun testHeaderClassImplTypealias() { + doMultiPlatformTest(TargetPlatformKind.Jvm[JvmTarget.JVM_1_6]) + } + + fun testHeaderFunUsesStdlibInSignature() { + doMultiPlatformTest(TargetPlatformKind.Jvm[JvmTarget.JVM_1_6], withStdlibCommon = true, configureModule = { module, platform -> + if (platform is TargetPlatformKind.Jvm) { + module.addLibrary(ForTestCompileRuntime.runtimeJarForTests()) + } + }) + } + + fun ignore_testNestedClassWithoutImpl() { + doMultiPlatformTest(TargetPlatformKind.Jvm[JvmTarget.JVM_1_6]) + } +} \ No newline at end of file From 390de737e714430a212ff40574944c7a00a17775 Mon Sep 17 00:00:00 2001 From: Mikhail Glukhikh Date: Tue, 26 Sep 2017 13:59:47 +0300 Subject: [PATCH 138/212] Fix messages in some multi platform highlighting tests --- .../multiplatform/basic/common/common.kt | 2 +- .../multiModuleHighlighting/multiplatform/basic/jvm/jvm.kt | 2 +- .../multiplatform/headerWithoutImplForBoth/common/common.kt | 2 +- .../multiplatform/suppressHeaderWithoutImpl/common/common.kt | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/idea/testData/multiModuleHighlighting/multiplatform/basic/common/common.kt b/idea/testData/multiModuleHighlighting/multiplatform/basic/common/common.kt index 49885064c03..abb6e871d85 100644 --- a/idea/testData/multiModuleHighlighting/multiplatform/basic/common/common.kt +++ b/idea/testData/multiModuleHighlighting/multiplatform/basic/common/common.kt @@ -1,3 +1,3 @@ -expect class My { +expect class My { } diff --git a/idea/testData/multiModuleHighlighting/multiplatform/basic/jvm/jvm.kt b/idea/testData/multiModuleHighlighting/multiplatform/basic/jvm/jvm.kt index 420dd83b9f8..2634e8e96bf 100644 --- a/idea/testData/multiModuleHighlighting/multiplatform/basic/jvm/jvm.kt +++ b/idea/testData/multiModuleHighlighting/multiplatform/basic/jvm/jvm.kt @@ -2,7 +2,7 @@ actual class His { +expect class His { } diff --git a/idea/testData/multiModuleHighlighting/multiplatform/headerWithoutImplForBoth/common/common.kt b/idea/testData/multiModuleHighlighting/multiplatform/headerWithoutImplForBoth/common/common.kt index 2cd06749bb5..517da8f706f 100644 --- a/idea/testData/multiModuleHighlighting/multiplatform/headerWithoutImplForBoth/common/common.kt +++ b/idea/testData/multiModuleHighlighting/multiplatform/headerWithoutImplForBoth/common/common.kt @@ -1,3 +1,3 @@ -expect class My { +expect class My { } diff --git a/idea/testData/multiModuleHighlighting/multiplatform/suppressHeaderWithoutImpl/common/common.kt b/idea/testData/multiModuleHighlighting/multiplatform/suppressHeaderWithoutImpl/common/common.kt index e090b7100e0..dbfd34ba892 100644 --- a/idea/testData/multiModuleHighlighting/multiplatform/suppressHeaderWithoutImpl/common/common.kt +++ b/idea/testData/multiModuleHighlighting/multiplatform/suppressHeaderWithoutImpl/common/common.kt @@ -4,4 +4,4 @@ expect interface Event @Suppress("SOMETHING_WRONG") -expect class Wrong +expect class Wrong From 848a80a266cb4e0f0fc611087cc6343e0b0ab8da Mon Sep 17 00:00:00 2001 From: Mikhail Glukhikh Date: Tue, 26 Sep 2017 14:17:56 +0300 Subject: [PATCH 139/212] Add test (with incorrect work yet) for KT-17374 --- .../multiplatform/transitive/common/common.kt | 1 + .../multiplatform/transitive/jvm_base/base.kt | 3 +++ .../multiplatform/transitive/jvm_user/user.kt | 3 +++ .../resolve/MultiPlatformHighlightingTest.kt | 21 +++++++++++++++++++ .../idea/stubs/AbstractMultiModuleTest.kt | 21 +++++++++++++------ 5 files changed, 43 insertions(+), 6 deletions(-) create mode 100644 idea/testData/multiModuleHighlighting/multiplatform/transitive/common/common.kt create mode 100644 idea/testData/multiModuleHighlighting/multiplatform/transitive/jvm_base/base.kt create mode 100644 idea/testData/multiModuleHighlighting/multiplatform/transitive/jvm_user/user.kt diff --git a/idea/testData/multiModuleHighlighting/multiplatform/transitive/common/common.kt b/idea/testData/multiModuleHighlighting/multiplatform/transitive/common/common.kt new file mode 100644 index 00000000000..d79a7b292e8 --- /dev/null +++ b/idea/testData/multiModuleHighlighting/multiplatform/transitive/common/common.kt @@ -0,0 +1 @@ +expect fun foo(): Int \ No newline at end of file diff --git a/idea/testData/multiModuleHighlighting/multiplatform/transitive/jvm_base/base.kt b/idea/testData/multiModuleHighlighting/multiplatform/transitive/jvm_base/base.kt new file mode 100644 index 00000000000..3ec588cd03d --- /dev/null +++ b/idea/testData/multiModuleHighlighting/multiplatform/transitive/jvm_base/base.kt @@ -0,0 +1,3 @@ +fun bar(): Int { + return 42 +} \ No newline at end of file diff --git a/idea/testData/multiModuleHighlighting/multiplatform/transitive/jvm_user/user.kt b/idea/testData/multiModuleHighlighting/multiplatform/transitive/jvm_user/user.kt new file mode 100644 index 00000000000..55ccc114ba2 --- /dev/null +++ b/idea/testData/multiModuleHighlighting/multiplatform/transitive/jvm_user/user.kt @@ -0,0 +1,3 @@ +fun user(): Int { + return 2 * bar() +} \ No newline at end of file diff --git a/idea/tests/org/jetbrains/kotlin/idea/caches/resolve/MultiPlatformHighlightingTest.kt b/idea/tests/org/jetbrains/kotlin/idea/caches/resolve/MultiPlatformHighlightingTest.kt index fce4f3c0328..f742dd3d10c 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/caches/resolve/MultiPlatformHighlightingTest.kt +++ b/idea/tests/org/jetbrains/kotlin/idea/caches/resolve/MultiPlatformHighlightingTest.kt @@ -20,6 +20,7 @@ import org.jetbrains.kotlin.codegen.forTestCompile.ForTestCompileRuntime import org.jetbrains.kotlin.config.JvmTarget import org.jetbrains.kotlin.config.TargetPlatformKind import org.jetbrains.kotlin.idea.framework.JSLibraryKind +import org.jetbrains.kotlin.idea.stubs.createFacet import org.jetbrains.kotlin.idea.test.PluginTestCaseBase import org.jetbrains.kotlin.test.TestJdkKind @@ -85,4 +86,24 @@ class MultiPlatformHighlightingTest : AbstractMultiModuleHighlightingTest() { fun ignore_testNestedClassWithoutImpl() { doMultiPlatformTest(TargetPlatformKind.Jvm[JvmTarget.JVM_1_6]) } + + fun testTransitive() { + val commonModule = module("common", TestJdkKind.MOCK_JDK) + commonModule.createFacet(TargetPlatformKind.Common, false) + val jvmPlatform = TargetPlatformKind.Jvm[JvmTarget.JVM_1_6] + + val baseModule = module("jvm_base", TestJdkKind.MOCK_JDK) + baseModule.createFacet(jvmPlatform, implementedModuleName = "common") + baseModule.enableMultiPlatform() + baseModule.addDependency(commonModule) + + val userModule = module("jvm_user", TestJdkKind.MOCK_JDK) + userModule.createFacet(jvmPlatform) + userModule.enableMultiPlatform() + userModule.addDependency(commonModule) + userModule.addDependency(baseModule) + + checkHighlightingInAllFiles() + } + } \ No newline at end of file diff --git a/idea/tests/org/jetbrains/kotlin/idea/stubs/AbstractMultiModuleTest.kt b/idea/tests/org/jetbrains/kotlin/idea/stubs/AbstractMultiModuleTest.kt index cbc3a29d36f..107423f6e24 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/stubs/AbstractMultiModuleTest.kt +++ b/idea/tests/org/jetbrains/kotlin/idea/stubs/AbstractMultiModuleTest.kt @@ -118,15 +118,24 @@ abstract class AbstractMultiModuleTest : DaemonAnalyzerTestCase() { } } -fun Module.createFacet(platformKind: TargetPlatformKind<*>? = null, useProjectSettings: Boolean = true) { +fun Module.createFacet( + platformKind: TargetPlatformKind<*>? = null, + useProjectSettings: Boolean = true, + implementedModuleName: String? = null +) { val accessToken = WriteAction.start() try { val modelsProvider = IdeModifiableModelsProviderImpl(project) - getOrCreateFacet(modelsProvider, useProjectSettings).configuration.settings.initializeIfNeeded( - this, - modelsProvider.getModifiableRootModel(this), - platformKind - ) + with (getOrCreateFacet(modelsProvider, useProjectSettings).configuration.settings) { + initializeIfNeeded( + this@createFacet, + modelsProvider.getModifiableRootModel(this@createFacet), + platformKind + ) + if (implementedModuleName != null) { + this.implementedModuleName = implementedModuleName + } + } modelsProvider.commit() } finally { From c9f11e4bc23d872a40f451f2650860cf5677e65c Mon Sep 17 00:00:00 2001 From: Mikhail Glukhikh Date: Tue, 26 Sep 2017 17:28:34 +0300 Subject: [PATCH 140/212] Add implements common dependency for regular multiplatform tests --- .../caches/resolve/AbstractMultiModuleHighlightingTest.kt | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/idea/tests/org/jetbrains/kotlin/idea/caches/resolve/AbstractMultiModuleHighlightingTest.kt b/idea/tests/org/jetbrains/kotlin/idea/caches/resolve/AbstractMultiModuleHighlightingTest.kt index e4a4bc5a142..73d2dbc7b96 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/caches/resolve/AbstractMultiModuleHighlightingTest.kt +++ b/idea/tests/org/jetbrains/kotlin/idea/caches/resolve/AbstractMultiModuleHighlightingTest.kt @@ -40,7 +40,8 @@ abstract class AbstractMultiModuleHighlightingTest : AbstractMultiHighlightingTe configureModule: (Module, TargetPlatformKind<*>) -> Unit = { _, _ -> }, jdk: TestJdkKind = TestJdkKind.MOCK_JDK ) { - val commonModule = module("common", jdk) + val commonModuleName = "common" + val commonModule = module(commonModuleName, jdk) commonModule.createFacet(TargetPlatformKind.Common, false) if (withStdlibCommon) { commonModule.addLibrary(ForTestCompileRuntime.stdlibCommonForTests(), kind = CommonLibraryKind) @@ -53,7 +54,7 @@ abstract class AbstractMultiModuleHighlightingTest : AbstractMultiHighlightingTe else -> error("Unsupported platform: $platform") } val platformModule = module(path, jdk) - platformModule.createFacet(platform) + platformModule.createFacet(platform, implementedModuleName = commonModuleName) platformModule.enableMultiPlatform() platformModule.addDependency(commonModule) configureModule(platformModule, platform) From 5687fe6e39db411e3904b0bb997033239fa01091 Mon Sep 17 00:00:00 2001 From: Mikhail Glukhikh Date: Tue, 26 Sep 2017 16:15:50 +0300 Subject: [PATCH 141/212] Introduce ModuleDescriptor.findImplementingDescriptor() via facets This function is now used instead of allImplementingCompatibleModules, thus allowing it to be deleted together with allImplementingModules So #KT-17369 Fixed So #KT-17374 Fixed May fix also some other MPP issues --- .../kotlin/analyzer/AnalyzerFacade.kt | 12 ------- .../kotlin/descriptors/ModuleDescriptor.kt | 3 -- .../descriptors/impl/ModuleDescriptorImpl.kt | 11 +----- .../jetbrains/kotlin/types/ErrorUtils.java | 6 ---- .../caches/resolve/KotlinCacheService.kt | 2 ++ .../caches/resolve/KotlinCacheServiceImpl.kt | 6 ++-- .../run/KotlinMultiplatformJUnitRecognizer.kt | 4 +-- .../jetbrains/kotlin/idea/facet/facetUtils.kt | 34 +++++++++++++++++++ .../highlighter/PlatformExpectedAnnotator.kt | 25 ++------------ .../highlighter/markers/HasActualMarker.kt | 6 ++-- .../highlighter/markers/HasExpectedMarker.kt | 13 ++++++- .../markers/KotlinLineMarkerProvider.kt | 4 +-- .../inspections/UnusedSymbolInspection.kt | 4 +-- .../multiplatform/transitive/common/common.kt | 2 +- 14 files changed, 66 insertions(+), 66 deletions(-) rename idea/{idea-analysis => }/src/org/jetbrains/kotlin/idea/highlighter/PlatformExpectedAnnotator.kt (77%) diff --git a/compiler/frontend/src/org/jetbrains/kotlin/analyzer/AnalyzerFacade.kt b/compiler/frontend/src/org/jetbrains/kotlin/analyzer/AnalyzerFacade.kt index c3c58e723a9..59de04c2c84 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/analyzer/AnalyzerFacade.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/analyzer/AnalyzerFacade.kt @@ -118,7 +118,6 @@ class ResolverForProjectImpl( moduleDescriptor.setDependencies(LazyModuleDependencies( projectContext.storageManager, module, - modulePlatforms, firstDependency, this)) @@ -270,7 +269,6 @@ abstract class AnalyzerFacade { class LazyModuleDependencies( storageManager: StorageManager, private val module: M, - modulePlatforms: (M) -> MultiTargetPlatform?, firstDependency: M? = null, private val resolverForProject: ResolverForProjectImpl ) : ModuleDependencies { @@ -292,14 +290,6 @@ class LazyModuleDependencies( }.toList() } - private val implementingModules = storageManager.createLazyValue { - if (modulePlatforms(module) != MultiTargetPlatform.Common) emptySet() - else resolverForProject.modules - .filterTo(mutableSetOf()) { - modulePlatforms(it) != MultiTargetPlatform.Common && module in it.dependencies() - } - } - override val allDependencies: List get() = dependencies() override val modulesWhoseInternalsAreVisible: Set @@ -308,8 +298,6 @@ class LazyModuleDependencies( resolverForProject.descriptorForModule(it as M) } - override val allImplementingModules: Set - get() = implementingModules().mapTo(mutableSetOf()) { resolverForProject.descriptorForModule(it) } } diff --git a/core/descriptors/src/org/jetbrains/kotlin/descriptors/ModuleDescriptor.kt b/core/descriptors/src/org/jetbrains/kotlin/descriptors/ModuleDescriptor.kt index a9262fe6349..d5a2164a41a 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/descriptors/ModuleDescriptor.kt +++ b/core/descriptors/src/org/jetbrains/kotlin/descriptors/ModuleDescriptor.kt @@ -40,9 +40,6 @@ interface ModuleDescriptor : DeclarationDescriptor { */ val allDependencyModules: List - // All platform-specific modules depending on common 'this' module (result is empty if this is platform-specific itself) - val allImplementingModules: Set - fun getCapability(capability: Capability): T? class Capability(val name: String) { diff --git a/core/descriptors/src/org/jetbrains/kotlin/descriptors/impl/ModuleDescriptorImpl.kt b/core/descriptors/src/org/jetbrains/kotlin/descriptors/impl/ModuleDescriptorImpl.kt index 1564e153448..b703f9a3482 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/descriptors/impl/ModuleDescriptorImpl.kt +++ b/core/descriptors/src/org/jetbrains/kotlin/descriptors/impl/ModuleDescriptorImpl.kt @@ -48,9 +48,6 @@ class ModuleDescriptorImpl @JvmOverloads constructor( private var packageFragmentProviderForModuleContent: PackageFragmentProvider? = null override var isValid: Boolean = true - set(value) { - field = value - } override fun assertValid() { if (!isValid) { @@ -68,9 +65,6 @@ class ModuleDescriptorImpl @JvmOverloads constructor( override val allDependencyModules: List get() = this.dependencies.sure { "Dependencies of module $id were not set" }.allDependencies.filter { it != this } - override val allImplementingModules: Set - get() = this.dependencies.sure { "Dependencies of module $id were not set" }.allImplementingModules - override fun getPackage(fqName: FqName): PackageViewDescriptor { assertValid() return packages(fqName) @@ -144,12 +138,9 @@ class ModuleDescriptorImpl @JvmOverloads constructor( interface ModuleDependencies { val allDependencies: List val modulesWhoseInternalsAreVisible: Set - val allImplementingModules: Set } class ModuleDependenciesImpl( override val allDependencies: List, override val modulesWhoseInternalsAreVisible: Set -) : ModuleDependencies { - override val allImplementingModules: Set = emptySet() -} +) : ModuleDependencies \ No newline at end of file diff --git a/core/descriptors/src/org/jetbrains/kotlin/types/ErrorUtils.java b/core/descriptors/src/org/jetbrains/kotlin/types/ErrorUtils.java index cf21ac75fe3..c6885e3a1db 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/types/ErrorUtils.java +++ b/core/descriptors/src/org/jetbrains/kotlin/types/ErrorUtils.java @@ -85,12 +85,6 @@ public class ErrorUtils { return emptyList(); } - @NotNull - @Override - public Set getAllImplementingModules() { - return emptySet(); - } - @Override public R accept(@NotNull DeclarationDescriptorVisitor visitor, D data) { return null; diff --git a/idea/ide-common/src/org/jetbrains/kotlin/caches/resolve/KotlinCacheService.kt b/idea/ide-common/src/org/jetbrains/kotlin/caches/resolve/KotlinCacheService.kt index e38c48848cd..d47377a7c55 100644 --- a/idea/ide-common/src/org/jetbrains/kotlin/caches/resolve/KotlinCacheService.kt +++ b/idea/ide-common/src/org/jetbrains/kotlin/caches/resolve/KotlinCacheService.kt @@ -19,6 +19,7 @@ package org.jetbrains.kotlin.caches.resolve import com.intellij.openapi.components.ServiceManager import com.intellij.openapi.project.Project import com.intellij.psi.PsiFile +import org.jetbrains.kotlin.analyzer.ModuleInfo import org.jetbrains.kotlin.idea.resolve.ResolutionFacade import org.jetbrains.kotlin.psi.KtElement import org.jetbrains.kotlin.resolve.TargetPlatform @@ -33,4 +34,5 @@ interface KotlinCacheService { fun getResolutionFacadeByFile(file: PsiFile, platform: TargetPlatform): ResolutionFacade fun getSuppressionCache(): KotlinSuppressCache + fun getResolutionFacadeByModuleInfo(moduleInfo: ModuleInfo, platform: TargetPlatform): ResolutionFacade? } \ No newline at end of file diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/resolve/KotlinCacheServiceImpl.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/resolve/KotlinCacheServiceImpl.kt index 4f6bc881abb..ce546117cc9 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/resolve/KotlinCacheServiceImpl.kt +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/resolve/KotlinCacheServiceImpl.kt @@ -28,8 +28,7 @@ import com.intellij.psi.util.CachedValueProvider import com.intellij.psi.util.CachedValuesManager import com.intellij.psi.util.PsiModificationTracker import com.intellij.util.containers.SLRUCache -import org.jetbrains.kotlin.analyzer.LanguageSettingsProvider -import org.jetbrains.kotlin.analyzer.EmptyResolverForProject +import org.jetbrains.kotlin.analyzer.ModuleInfo import org.jetbrains.kotlin.builtins.KotlinBuiltIns import org.jetbrains.kotlin.caches.resolve.KotlinCacheService import org.jetbrains.kotlin.config.LanguageFeature @@ -367,6 +366,9 @@ class KotlinCacheServiceImpl(val project: Project) : KotlinCacheService { return ResolutionFacadeImpl(projectFacade, moduleInfo) } + override fun getResolutionFacadeByModuleInfo(moduleInfo: ModuleInfo, platform: TargetPlatform): ResolutionFacade? = + (moduleInfo as? IdeaModuleInfo)?.let { getResolutionFacadeByModuleInfo(it, platform) } + private fun Collection.filterNotInProjectSource(moduleInfo: IdeaModuleInfo) = mapNotNull { if (it is KtCodeFragment) it.getContextFile() else it }.filter { diff --git a/idea/idea-jvm/src/org/jetbrains/kotlin/idea/run/KotlinMultiplatformJUnitRecognizer.kt b/idea/idea-jvm/src/org/jetbrains/kotlin/idea/run/KotlinMultiplatformJUnitRecognizer.kt index bfebf76b95c..3df59c32baf 100644 --- a/idea/idea-jvm/src/org/jetbrains/kotlin/idea/run/KotlinMultiplatformJUnitRecognizer.kt +++ b/idea/idea-jvm/src/org/jetbrains/kotlin/idea/run/KotlinMultiplatformJUnitRecognizer.kt @@ -26,7 +26,7 @@ import org.jetbrains.kotlin.descriptors.TypeAliasDescriptor import org.jetbrains.kotlin.descriptors.annotations.AnnotationWithTarget import org.jetbrains.kotlin.idea.caches.resolve.analyze import org.jetbrains.kotlin.idea.caches.resolve.findModuleDescriptor -import org.jetbrains.kotlin.idea.highlighter.allImplementingCompatibleModules +import org.jetbrains.kotlin.idea.facet.findImplementingDescriptors import org.jetbrains.kotlin.idea.highlighter.markers.actualsFor import org.jetbrains.kotlin.idea.project.targetPlatform import org.jetbrains.kotlin.idea.util.module @@ -41,7 +41,7 @@ class KotlinMultiplatformJUnitRecognizer : JUnitRecognizer() { if (origin.module?.targetPlatform !is TargetPlatformKind.Common) return false val moduleDescriptor = origin.containingKtFile.findModuleDescriptor() - val implModules = moduleDescriptor.allImplementingCompatibleModules + val implModules = moduleDescriptor.findImplementingDescriptors() if (implModules.isEmpty()) return false val bindingContext = origin.analyze(BodyResolveMode.PARTIAL) diff --git a/idea/src/org/jetbrains/kotlin/idea/facet/facetUtils.kt b/idea/src/org/jetbrains/kotlin/idea/facet/facetUtils.kt index faa41192840..ccf163d2ef8 100644 --- a/idea/src/org/jetbrains/kotlin/idea/facet/facetUtils.kt +++ b/idea/src/org/jetbrains/kotlin/idea/facet/facetUtils.kt @@ -17,6 +17,7 @@ package org.jetbrains.kotlin.idea.facet import com.intellij.openapi.externalSystem.service.project.IdeModifiableModelsProvider +import com.intellij.openapi.externalSystem.service.project.IdeModifiableModelsProviderImpl import com.intellij.openapi.module.Module import com.intellij.openapi.project.Project import com.intellij.openapi.projectRoots.JavaSdk @@ -26,9 +27,13 @@ import com.intellij.openapi.roots.ModuleRootManager import com.intellij.openapi.roots.ModuleRootModel import com.intellij.openapi.util.io.FileUtil import com.intellij.openapi.util.text.StringUtil +import org.jetbrains.kotlin.analyzer.ModuleInfo +import org.jetbrains.kotlin.caches.resolve.KotlinCacheService import org.jetbrains.kotlin.cli.common.arguments.* import org.jetbrains.kotlin.compilerRunner.ArgumentUtils import org.jetbrains.kotlin.config.* +import org.jetbrains.kotlin.descriptors.ModuleDescriptor +import org.jetbrains.kotlin.idea.caches.resolve.* import org.jetbrains.kotlin.idea.compiler.configuration.Kotlin2JsCompilerArgumentsHolder import org.jetbrains.kotlin.idea.compiler.configuration.Kotlin2JvmCompilerArgumentsHolder import org.jetbrains.kotlin.idea.compiler.configuration.KotlinCommonCompilerArgumentsHolder @@ -111,6 +116,35 @@ val mavenLibraryIdToPlatform: Map> by lazy { .toMap() } +private fun Module.findImplementedModuleName(modelsProvider: IdeModifiableModelsProvider): String? { + val facetModel = modelsProvider.getModifiableFacetModel(this) + val facet = facetModel.findFacet(KotlinFacetType.TYPE_ID, KotlinFacetType.INSTANCE.defaultFacetName) + return facet?.configuration?.settings?.implementedModuleName +} + +private fun Module.findImplementingModules(modelsProvider: IdeModifiableModelsProvider): List { + return modelsProvider.modules.filter { module -> + module.findImplementedModuleName(modelsProvider) == name + } +} + +fun ModuleDescriptor.findImplementingDescriptors(): List { + val moduleSourceInfo = getCapability(ModuleInfo.Capability) as? ModuleSourceInfo ?: return emptyList() + val module = moduleSourceInfo.module + val modelsProvider = IdeModifiableModelsProviderImpl(module.project) + val implementingModules = module.findImplementingModules(modelsProvider) + return implementingModules.mapNotNull { + val implementingModuleInfo = when (moduleSourceInfo) { + is ModuleProductionSourceInfo -> it.productionSourceInfo() + is ModuleTestSourceInfo -> it.testSourceInfo() + else -> null + } + implementingModuleInfo?.let { + KotlinCacheService.getInstance(module.project).getResolutionFacadeByModuleInfo(it, it.platform)?.moduleDescriptor + } + } +} + fun Module.getOrCreateFacet(modelsProvider: IdeModifiableModelsProvider, useProjectSettings: Boolean, commitModel: Boolean = false): KotlinFacet { diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/highlighter/PlatformExpectedAnnotator.kt b/idea/src/org/jetbrains/kotlin/idea/highlighter/PlatformExpectedAnnotator.kt similarity index 77% rename from idea/idea-analysis/src/org/jetbrains/kotlin/idea/highlighter/PlatformExpectedAnnotator.kt rename to idea/src/org/jetbrains/kotlin/idea/highlighter/PlatformExpectedAnnotator.kt index 0697129138d..a57b522eab8 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/highlighter/PlatformExpectedAnnotator.kt +++ b/idea/src/org/jetbrains/kotlin/idea/highlighter/PlatformExpectedAnnotator.kt @@ -1,5 +1,5 @@ /* - * Copyright 2010-2016 JetBrains s.r.o. + * Copyright 2010-2017 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. @@ -19,14 +19,11 @@ package org.jetbrains.kotlin.idea.highlighter import com.intellij.lang.annotation.AnnotationHolder import com.intellij.lang.annotation.Annotator import com.intellij.psi.PsiElement -import org.jetbrains.kotlin.analyzer.ModuleInfo import org.jetbrains.kotlin.caches.resolve.KotlinCacheService import org.jetbrains.kotlin.descriptors.MemberDescriptor -import org.jetbrains.kotlin.descriptors.ModuleDescriptor -import org.jetbrains.kotlin.idea.caches.resolve.ModuleProductionSourceInfo -import org.jetbrains.kotlin.idea.caches.resolve.ModuleTestSourceInfo import org.jetbrains.kotlin.idea.caches.resolve.findModuleDescriptor import org.jetbrains.kotlin.idea.core.toDescriptor +import org.jetbrains.kotlin.idea.facet.findImplementingDescriptors import org.jetbrains.kotlin.idea.project.TargetPlatformDetector import org.jetbrains.kotlin.psi.KtClassOrObject import org.jetbrains.kotlin.psi.KtDeclaration @@ -37,22 +34,6 @@ import org.jetbrains.kotlin.resolve.TargetPlatform import org.jetbrains.kotlin.resolve.checkers.ExpectedActualDeclarationChecker import org.jetbrains.kotlin.resolve.diagnostics.SimpleDiagnostics -val ModuleDescriptor.sourceKind: SourceKind - get() = when (getCapability(ModuleInfo.Capability)) { - is ModuleProductionSourceInfo -> SourceKind.PRODUCTION - is ModuleTestSourceInfo -> SourceKind.TEST - else -> SourceKind.OTHER - } - -enum class SourceKind { OTHER, PRODUCTION, TEST } - -val ModuleDescriptor.allImplementingCompatibleModules - get() = allImplementingModules.filter { other -> - this.sourceKind == SourceKind.OTHER || - other.sourceKind == SourceKind.OTHER || - other.sourceKind == this.sourceKind - } - class PlatformExpectedAnnotator : Annotator { override fun annotate(element: PsiElement, holder: AnnotationHolder) { val declaration = element as? KtDeclaration ?: return @@ -60,7 +41,7 @@ class PlatformExpectedAnnotator : Annotator { if (TargetPlatformDetector.getPlatform(declaration.containingKtFile) !is TargetPlatform.Common) return - val implementingModules = declaration.findModuleDescriptor().allImplementingCompatibleModules + val implementingModules = declaration.findModuleDescriptor().findImplementingDescriptors() if (implementingModules.isEmpty()) return val descriptor = declaration.toDescriptor() as? MemberDescriptor ?: return diff --git a/idea/src/org/jetbrains/kotlin/idea/highlighter/markers/HasActualMarker.kt b/idea/src/org/jetbrains/kotlin/idea/highlighter/markers/HasActualMarker.kt index 18e2ed44336..ace7b71a986 100644 --- a/idea/src/org/jetbrains/kotlin/idea/highlighter/markers/HasActualMarker.kt +++ b/idea/src/org/jetbrains/kotlin/idea/highlighter/markers/HasActualMarker.kt @@ -22,7 +22,7 @@ import org.jetbrains.kotlin.descriptors.* import org.jetbrains.kotlin.idea.caches.resolve.findModuleDescriptor import org.jetbrains.kotlin.idea.caches.resolve.unsafeResolveToDescriptor import org.jetbrains.kotlin.idea.core.toDescriptor -import org.jetbrains.kotlin.idea.highlighter.allImplementingCompatibleModules +import org.jetbrains.kotlin.idea.facet.findImplementingDescriptors import org.jetbrains.kotlin.psi.KtDeclaration import org.jetbrains.kotlin.resolve.DescriptorToSourceUtils import org.jetbrains.kotlin.resolve.MultiTargetPlatform @@ -48,7 +48,7 @@ fun getPlatformActualTooltip(declaration: KtDeclaration): String? { val descriptor = declaration.toDescriptor() as? MemberDescriptor ?: return null val commonModuleDescriptor = declaration.containingKtFile.findModuleDescriptor() - val platformModulesWithActuals = commonModuleDescriptor.allImplementingCompatibleModules.filter { + val platformModulesWithActuals = commonModuleDescriptor.findImplementingDescriptors().filter { it.hasActualsFor(descriptor) } if (platformModulesWithActuals.isEmpty()) return null @@ -74,7 +74,7 @@ private fun DeclarationDescriptor.actualsForExpected(): Collection SourceKind.PRODUCTION + is ModuleTestSourceInfo -> SourceKind.TEST + else -> SourceKind.OTHER + } + +enum class SourceKind { OTHER, PRODUCTION, TEST } + fun ModuleDescriptor.commonModuleOrNull(): ModuleDescriptor? { val sourceKind = sourceKind return allDependencyModules.firstOrNull { dependency -> diff --git a/idea/src/org/jetbrains/kotlin/idea/highlighter/markers/KotlinLineMarkerProvider.kt b/idea/src/org/jetbrains/kotlin/idea/highlighter/markers/KotlinLineMarkerProvider.kt index b3a5e2f686e..fe8eee17fe6 100644 --- a/idea/src/org/jetbrains/kotlin/idea/highlighter/markers/KotlinLineMarkerProvider.kt +++ b/idea/src/org/jetbrains/kotlin/idea/highlighter/markers/KotlinLineMarkerProvider.kt @@ -44,7 +44,7 @@ import org.jetbrains.kotlin.idea.caches.resolve.findModuleDescriptor import org.jetbrains.kotlin.idea.core.isInheritable import org.jetbrains.kotlin.idea.core.isOverridable import org.jetbrains.kotlin.idea.core.toDescriptor -import org.jetbrains.kotlin.idea.highlighter.allImplementingCompatibleModules +import org.jetbrains.kotlin.idea.facet.findImplementingDescriptors import org.jetbrains.kotlin.idea.util.ProjectRootsUtil import org.jetbrains.kotlin.lexer.KtTokens import org.jetbrains.kotlin.psi.* @@ -292,7 +292,7 @@ private fun collectActualMarkers(declaration: KtNamedDeclaration, val descriptor = declaration.toDescriptor() as? MemberDescriptor ?: return val commonModuleDescriptor = declaration.containingKtFile.findModuleDescriptor() - if (commonModuleDescriptor.allImplementingCompatibleModules.none { it.hasActualsFor(descriptor) }) return + if (commonModuleDescriptor.findImplementingDescriptors().none { it.hasActualsFor(descriptor) }) return val anchor = declaration.nameIdentifier ?: declaration diff --git a/idea/src/org/jetbrains/kotlin/idea/inspections/UnusedSymbolInspection.kt b/idea/src/org/jetbrains/kotlin/idea/inspections/UnusedSymbolInspection.kt index fb35dcf561e..12c13394b4b 100644 --- a/idea/src/org/jetbrains/kotlin/idea/inspections/UnusedSymbolInspection.kt +++ b/idea/src/org/jetbrains/kotlin/idea/inspections/UnusedSymbolInspection.kt @@ -53,9 +53,9 @@ import org.jetbrains.kotlin.idea.caches.resolve.findModuleDescriptor import org.jetbrains.kotlin.idea.caches.resolve.resolveToDescriptorIfAny import org.jetbrains.kotlin.idea.core.isInheritable import org.jetbrains.kotlin.idea.core.toDescriptor +import org.jetbrains.kotlin.idea.facet.findImplementingDescriptors import org.jetbrains.kotlin.idea.findUsages.KotlinFindUsagesHandlerFactory import org.jetbrains.kotlin.idea.findUsages.handlers.KotlinFindClassUsagesHandler -import org.jetbrains.kotlin.idea.highlighter.allImplementingCompatibleModules import org.jetbrains.kotlin.idea.highlighter.markers.hasActualsFor import org.jetbrains.kotlin.idea.imports.importableFqName import org.jetbrains.kotlin.idea.references.mainReference @@ -334,7 +334,7 @@ class UnusedSymbolInspection : AbstractKotlinInspection() { descriptor as? MemberDescriptor ?: return false val commonModuleDescriptor = declaration.containingKtFile.findModuleDescriptor() - return commonModuleDescriptor.allImplementingCompatibleModules.any { it.hasActualsFor(descriptor) } || + return commonModuleDescriptor.findImplementingDescriptors().any { it.hasActualsFor(descriptor) } || commonModuleDescriptor.hasActualsFor(descriptor) } diff --git a/idea/testData/multiModuleHighlighting/multiplatform/transitive/common/common.kt b/idea/testData/multiModuleHighlighting/multiplatform/transitive/common/common.kt index d79a7b292e8..f6b60713910 100644 --- a/idea/testData/multiModuleHighlighting/multiplatform/transitive/common/common.kt +++ b/idea/testData/multiModuleHighlighting/multiplatform/transitive/common/common.kt @@ -1 +1 @@ -expect fun foo(): Int \ No newline at end of file +expect fun foo(): Int \ No newline at end of file From fa23471397d59351fb386fabb2038af3264f4e1e Mon Sep 17 00:00:00 2001 From: Mikhail Glukhikh Date: Tue, 26 Sep 2017 18:30:20 +0300 Subject: [PATCH 142/212] Add test for KT-19222 to fix behaviour Issue was fixed together with KT-17374 So #KT-19222 Fixed --- .../transitive/common/common.kt | 1 + .../transitive/jvm_base/base.kt | 3 +++ .../transitive/jvm_user/user.kt | 3 +++ .../resolve/MultiModuleLineMarkerTest.kt | 21 +++++++++++++++++++ 4 files changed, 28 insertions(+) create mode 100644 idea/testData/multiModuleLineMarker/transitive/common/common.kt create mode 100644 idea/testData/multiModuleLineMarker/transitive/jvm_base/base.kt create mode 100644 idea/testData/multiModuleLineMarker/transitive/jvm_user/user.kt diff --git a/idea/testData/multiModuleLineMarker/transitive/common/common.kt b/idea/testData/multiModuleLineMarker/transitive/common/common.kt new file mode 100644 index 00000000000..cc1c972043c --- /dev/null +++ b/idea/testData/multiModuleLineMarker/transitive/common/common.kt @@ -0,0 +1 @@ +expect fun foo(): Int \ No newline at end of file diff --git a/idea/testData/multiModuleLineMarker/transitive/jvm_base/base.kt b/idea/testData/multiModuleLineMarker/transitive/jvm_base/base.kt new file mode 100644 index 00000000000..ed077971da3 --- /dev/null +++ b/idea/testData/multiModuleLineMarker/transitive/jvm_base/base.kt @@ -0,0 +1,3 @@ +// !CHECK_HIGHLIGHTING + +actual fun foo() = 42 \ No newline at end of file diff --git a/idea/testData/multiModuleLineMarker/transitive/jvm_user/user.kt b/idea/testData/multiModuleLineMarker/transitive/jvm_user/user.kt new file mode 100644 index 00000000000..230123f2b07 --- /dev/null +++ b/idea/testData/multiModuleLineMarker/transitive/jvm_user/user.kt @@ -0,0 +1,3 @@ +// !CHECK_HIGHLIGHTING + +fun bar() = foo() \ No newline at end of file diff --git a/idea/tests/org/jetbrains/kotlin/idea/caches/resolve/MultiModuleLineMarkerTest.kt b/idea/tests/org/jetbrains/kotlin/idea/caches/resolve/MultiModuleLineMarkerTest.kt index 5123127117a..47756505aba 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/caches/resolve/MultiModuleLineMarkerTest.kt +++ b/idea/tests/org/jetbrains/kotlin/idea/caches/resolve/MultiModuleLineMarkerTest.kt @@ -20,7 +20,9 @@ import com.intellij.openapi.roots.CompilerModuleExtension import com.intellij.openapi.roots.ModuleRootModificationUtil import org.jetbrains.kotlin.config.JvmTarget import org.jetbrains.kotlin.config.TargetPlatformKind +import org.jetbrains.kotlin.idea.stubs.createFacet import org.jetbrains.kotlin.idea.test.PluginTestCaseBase +import org.jetbrains.kotlin.test.TestJdkKind class MultiModuleLineMarkerTest : AbstractMultiModuleHighlightingTest() { @@ -63,4 +65,23 @@ class MultiModuleLineMarkerTest : AbstractMultiModuleHighlightingTest() { } }) } + + fun testTransitive() { + val commonModule = module("common", TestJdkKind.MOCK_JDK) + commonModule.createFacet(TargetPlatformKind.Common, false) + val jvmPlatform = TargetPlatformKind.Jvm[JvmTarget.JVM_1_6] + + val baseModule = module("jvm_base", TestJdkKind.MOCK_JDK) + baseModule.createFacet(jvmPlatform, implementedModuleName = "common") + baseModule.enableMultiPlatform() + baseModule.addDependency(commonModule) + + val userModule = module("jvm_user", TestJdkKind.MOCK_JDK) + userModule.createFacet(jvmPlatform) + userModule.enableMultiPlatform() + userModule.addDependency(commonModule) + userModule.addDependency(baseModule) + + checkHighlightingInAllFiles() + } } \ No newline at end of file From 43f1dbeabfc6e0071c822d580caef0f9052c408b Mon Sep 17 00:00:00 2001 From: Mikhail Glukhikh Date: Tue, 26 Sep 2017 19:34:21 +0300 Subject: [PATCH 143/212] Introduce cached ModuleDescriptor.implementingDescriptors This property is used instead of findImplementingDescriptors, which is basically too slow --- .../run/KotlinMultiplatformJUnitRecognizer.kt | 4 ++-- .../jetbrains/kotlin/idea/facet/facetUtils.kt | 24 ++++++++++++++----- .../highlighter/PlatformExpectedAnnotator.kt | 4 ++-- .../highlighter/markers/HasActualMarker.kt | 6 ++--- .../markers/KotlinLineMarkerProvider.kt | 4 ++-- .../inspections/UnusedSymbolInspection.kt | 4 ++-- 6 files changed, 29 insertions(+), 17 deletions(-) diff --git a/idea/idea-jvm/src/org/jetbrains/kotlin/idea/run/KotlinMultiplatformJUnitRecognizer.kt b/idea/idea-jvm/src/org/jetbrains/kotlin/idea/run/KotlinMultiplatformJUnitRecognizer.kt index 3df59c32baf..fd0b61faf23 100644 --- a/idea/idea-jvm/src/org/jetbrains/kotlin/idea/run/KotlinMultiplatformJUnitRecognizer.kt +++ b/idea/idea-jvm/src/org/jetbrains/kotlin/idea/run/KotlinMultiplatformJUnitRecognizer.kt @@ -26,7 +26,7 @@ import org.jetbrains.kotlin.descriptors.TypeAliasDescriptor import org.jetbrains.kotlin.descriptors.annotations.AnnotationWithTarget import org.jetbrains.kotlin.idea.caches.resolve.analyze import org.jetbrains.kotlin.idea.caches.resolve.findModuleDescriptor -import org.jetbrains.kotlin.idea.facet.findImplementingDescriptors +import org.jetbrains.kotlin.idea.facet.implementingDescriptors import org.jetbrains.kotlin.idea.highlighter.markers.actualsFor import org.jetbrains.kotlin.idea.project.targetPlatform import org.jetbrains.kotlin.idea.util.module @@ -41,7 +41,7 @@ class KotlinMultiplatformJUnitRecognizer : JUnitRecognizer() { if (origin.module?.targetPlatform !is TargetPlatformKind.Common) return false val moduleDescriptor = origin.containingKtFile.findModuleDescriptor() - val implModules = moduleDescriptor.findImplementingDescriptors() + val implModules = moduleDescriptor.implementingDescriptors if (implModules.isEmpty()) return false val bindingContext = origin.analyze(BodyResolveMode.PARTIAL) diff --git a/idea/src/org/jetbrains/kotlin/idea/facet/facetUtils.kt b/idea/src/org/jetbrains/kotlin/idea/facet/facetUtils.kt index ccf163d2ef8..c370b7dd9ab 100644 --- a/idea/src/org/jetbrains/kotlin/idea/facet/facetUtils.kt +++ b/idea/src/org/jetbrains/kotlin/idea/facet/facetUtils.kt @@ -25,8 +25,10 @@ import com.intellij.openapi.projectRoots.JavaSdkVersion import com.intellij.openapi.projectRoots.ProjectJdkTable import com.intellij.openapi.roots.ModuleRootManager import com.intellij.openapi.roots.ModuleRootModel +import com.intellij.openapi.roots.ProjectRootModificationTracker import com.intellij.openapi.util.io.FileUtil import com.intellij.openapi.util.text.StringUtil +import com.intellij.psi.util.CachedValueProvider import org.jetbrains.kotlin.analyzer.ModuleInfo import org.jetbrains.kotlin.caches.resolve.KotlinCacheService import org.jetbrains.kotlin.cli.common.arguments.* @@ -128,11 +130,9 @@ private fun Module.findImplementingModules(modelsProvider: IdeModifiableModelsPr } } -fun ModuleDescriptor.findImplementingDescriptors(): List { - val moduleSourceInfo = getCapability(ModuleInfo.Capability) as? ModuleSourceInfo ?: return emptyList() - val module = moduleSourceInfo.module - val modelsProvider = IdeModifiableModelsProviderImpl(module.project) - val implementingModules = module.findImplementingModules(modelsProvider) +private fun Module.findImplementingDescriptors(moduleSourceInfo: ModuleSourceInfo): List { + val modelsProvider = IdeModifiableModelsProviderImpl(project) + val implementingModules = findImplementingModules(modelsProvider) return implementingModules.mapNotNull { val implementingModuleInfo = when (moduleSourceInfo) { is ModuleProductionSourceInfo -> it.productionSourceInfo() @@ -140,11 +140,23 @@ fun ModuleDescriptor.findImplementingDescriptors(): List { else -> null } implementingModuleInfo?.let { - KotlinCacheService.getInstance(module.project).getResolutionFacadeByModuleInfo(it, it.platform)?.moduleDescriptor + KotlinCacheService.getInstance(project).getResolutionFacadeByModuleInfo(it, it.platform)?.moduleDescriptor } } } +val ModuleDescriptor.implementingDescriptors: List + get() { + val moduleSourceInfo = getCapability(ModuleInfo.Capability) as? ModuleSourceInfo ?: return emptyList() + val module = moduleSourceInfo.module + return module.cached(CachedValueProvider { + CachedValueProvider.Result( + module.findImplementingDescriptors(moduleSourceInfo), + ProjectRootModificationTracker.getInstance(module.project) + ) + }) + } + fun Module.getOrCreateFacet(modelsProvider: IdeModifiableModelsProvider, useProjectSettings: Boolean, commitModel: Boolean = false): KotlinFacet { diff --git a/idea/src/org/jetbrains/kotlin/idea/highlighter/PlatformExpectedAnnotator.kt b/idea/src/org/jetbrains/kotlin/idea/highlighter/PlatformExpectedAnnotator.kt index a57b522eab8..4ccb08c6fca 100644 --- a/idea/src/org/jetbrains/kotlin/idea/highlighter/PlatformExpectedAnnotator.kt +++ b/idea/src/org/jetbrains/kotlin/idea/highlighter/PlatformExpectedAnnotator.kt @@ -23,7 +23,7 @@ import org.jetbrains.kotlin.caches.resolve.KotlinCacheService import org.jetbrains.kotlin.descriptors.MemberDescriptor import org.jetbrains.kotlin.idea.caches.resolve.findModuleDescriptor import org.jetbrains.kotlin.idea.core.toDescriptor -import org.jetbrains.kotlin.idea.facet.findImplementingDescriptors +import org.jetbrains.kotlin.idea.facet.implementingDescriptors import org.jetbrains.kotlin.idea.project.TargetPlatformDetector import org.jetbrains.kotlin.psi.KtClassOrObject import org.jetbrains.kotlin.psi.KtDeclaration @@ -41,7 +41,7 @@ class PlatformExpectedAnnotator : Annotator { if (TargetPlatformDetector.getPlatform(declaration.containingKtFile) !is TargetPlatform.Common) return - val implementingModules = declaration.findModuleDescriptor().findImplementingDescriptors() + val implementingModules = declaration.findModuleDescriptor().implementingDescriptors if (implementingModules.isEmpty()) return val descriptor = declaration.toDescriptor() as? MemberDescriptor ?: return diff --git a/idea/src/org/jetbrains/kotlin/idea/highlighter/markers/HasActualMarker.kt b/idea/src/org/jetbrains/kotlin/idea/highlighter/markers/HasActualMarker.kt index ace7b71a986..c578bb1bce9 100644 --- a/idea/src/org/jetbrains/kotlin/idea/highlighter/markers/HasActualMarker.kt +++ b/idea/src/org/jetbrains/kotlin/idea/highlighter/markers/HasActualMarker.kt @@ -22,7 +22,7 @@ import org.jetbrains.kotlin.descriptors.* import org.jetbrains.kotlin.idea.caches.resolve.findModuleDescriptor import org.jetbrains.kotlin.idea.caches.resolve.unsafeResolveToDescriptor import org.jetbrains.kotlin.idea.core.toDescriptor -import org.jetbrains.kotlin.idea.facet.findImplementingDescriptors +import org.jetbrains.kotlin.idea.facet.implementingDescriptors import org.jetbrains.kotlin.psi.KtDeclaration import org.jetbrains.kotlin.resolve.DescriptorToSourceUtils import org.jetbrains.kotlin.resolve.MultiTargetPlatform @@ -48,7 +48,7 @@ fun getPlatformActualTooltip(declaration: KtDeclaration): String? { val descriptor = declaration.toDescriptor() as? MemberDescriptor ?: return null val commonModuleDescriptor = declaration.containingKtFile.findModuleDescriptor() - val platformModulesWithActuals = commonModuleDescriptor.findImplementingDescriptors().filter { + val platformModulesWithActuals = commonModuleDescriptor.implementingDescriptors.filter { it.hasActualsFor(descriptor) } if (platformModulesWithActuals.isEmpty()) return null @@ -74,7 +74,7 @@ private fun DeclarationDescriptor.actualsForExpected(): Collection Date: Mon, 25 Sep 2017 14:02:14 +0300 Subject: [PATCH 144/212] Fix loading additional compiler arguments from facets for libraries --- .../kotlin/idea/compiler/IDELanguageSettingsProvider.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/compiler/IDELanguageSettingsProvider.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/compiler/IDELanguageSettingsProvider.kt index bfae1e7df72..d2f66fdc0fd 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/compiler/IDELanguageSettingsProvider.kt +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/compiler/IDELanguageSettingsProvider.kt @@ -41,7 +41,7 @@ object IDELanguageSettingsProvider : LanguageSettingsProvider { val map = mutableMapOf, Any>() for (module in ModuleManager.getInstance(project).modules) { val settings = KotlinFacetSettingsProvider.getInstance(project).getSettings(module) ?: continue - val compilerArguments = settings.compilerArguments as? K2JVMCompilerArguments ?: continue + val compilerArguments = settings.mergedCompilerArguments as? K2JVMCompilerArguments ?: continue val jsr305state = Jsr305State.findByDescription(compilerArguments.jsr305) if (jsr305state != null && jsr305state != Jsr305State.IGNORE) { From 5b7c766a54b8642f01afb5020de59916e9fb5432 Mon Sep 17 00:00:00 2001 From: Denis Zharkov Date: Mon, 25 Sep 2017 19:05:53 +0300 Subject: [PATCH 145/212] Use Jsr305State.DEFAULT instead of IGNORE as a default value --- .../compiler/IDELanguageSettingsProvider.kt | 2 +- .../highlighterJsr305/project/Default.kt | 5 ++++ .../highlighterJsr305/project/Ignore.kt | 5 ++++ .../project/{A.kt => Strict.kt} | 0 .../highlighterJsr305/project/Warn.kt | 5 ++++ .../highlighter/Jsr305HighlightingTest.kt | 30 ++++++++++++++++--- 6 files changed, 42 insertions(+), 5 deletions(-) create mode 100644 idea/testData/highlighterJsr305/project/Default.kt create mode 100644 idea/testData/highlighterJsr305/project/Ignore.kt rename idea/testData/highlighterJsr305/project/{A.kt => Strict.kt} (100%) create mode 100644 idea/testData/highlighterJsr305/project/Warn.kt diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/compiler/IDELanguageSettingsProvider.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/compiler/IDELanguageSettingsProvider.kt index d2f66fdc0fd..536c625547b 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/compiler/IDELanguageSettingsProvider.kt +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/compiler/IDELanguageSettingsProvider.kt @@ -44,7 +44,7 @@ object IDELanguageSettingsProvider : LanguageSettingsProvider { val compilerArguments = settings.mergedCompilerArguments as? K2JVMCompilerArguments ?: continue val jsr305state = Jsr305State.findByDescription(compilerArguments.jsr305) - if (jsr305state != null && jsr305state != Jsr305State.IGNORE) { + if (jsr305state != null && jsr305state != Jsr305State.DEFAULT) { map.put(AnalysisFlag.jsr305, jsr305state) break } diff --git a/idea/testData/highlighterJsr305/project/Default.kt b/idea/testData/highlighterJsr305/project/Default.kt new file mode 100644 index 00000000000..11095962c0e --- /dev/null +++ b/idea/testData/highlighterJsr305/project/Default.kt @@ -0,0 +1,5 @@ +import foo.A + +fun main(a: A) { + a.field.length +} diff --git a/idea/testData/highlighterJsr305/project/Ignore.kt b/idea/testData/highlighterJsr305/project/Ignore.kt new file mode 100644 index 00000000000..ff4506b7ea3 --- /dev/null +++ b/idea/testData/highlighterJsr305/project/Ignore.kt @@ -0,0 +1,5 @@ +import foo.A + +fun main(a: A) { + a.field.length +} diff --git a/idea/testData/highlighterJsr305/project/A.kt b/idea/testData/highlighterJsr305/project/Strict.kt similarity index 100% rename from idea/testData/highlighterJsr305/project/A.kt rename to idea/testData/highlighterJsr305/project/Strict.kt diff --git a/idea/testData/highlighterJsr305/project/Warn.kt b/idea/testData/highlighterJsr305/project/Warn.kt new file mode 100644 index 00000000000..11095962c0e --- /dev/null +++ b/idea/testData/highlighterJsr305/project/Warn.kt @@ -0,0 +1,5 @@ +import foo.A + +fun main(a: A) { + a.field.length +} diff --git a/idea/tests/org/jetbrains/kotlin/idea/highlighter/Jsr305HighlightingTest.kt b/idea/tests/org/jetbrains/kotlin/idea/highlighter/Jsr305HighlightingTest.kt index 4ef3108388d..ca57f15b242 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/highlighter/Jsr305HighlightingTest.kt +++ b/idea/tests/org/jetbrains/kotlin/idea/highlighter/Jsr305HighlightingTest.kt @@ -19,7 +19,6 @@ package org.jetbrains.kotlin.idea.highlighter import com.intellij.openapi.module.Module import com.intellij.openapi.roots.ModifiableRootModel import com.intellij.testFramework.LightProjectDescriptor -import org.jetbrains.kotlin.cli.common.arguments.K2JVMCompilerArguments import org.jetbrains.kotlin.codegen.forTestCompile.ForTestCompileRuntime import org.jetbrains.kotlin.config.JvmTarget import org.jetbrains.kotlin.config.KotlinFacetSettingsProvider @@ -46,13 +45,36 @@ class Jsr305HighlightingTest : KotlinLightCodeInsightFixtureTestCase() { super.configureModule(module, model) module.createFacet(TargetPlatformKind.Jvm(JvmTarget.JVM_1_8)) val facetSettings = KotlinFacetSettingsProvider.getInstance(project).getInitializedSettings(module) - (facetSettings.compilerArguments as K2JVMCompilerArguments).jsr305 = Jsr305State.STRICT.description + + facetSettings.apply { + val jsrStateByTestName = + Jsr305State.findByDescription(getTestName(true)) ?: return@apply + + compilerSettings!!.additionalArguments += " -Xjsr305=${jsrStateByTestName.description}" + updateMergedArguments() + } } } } - fun testSimple() { - myFixture.configureByFile("A.kt") + fun testIgnore() { + doTest() + } + + fun testWarn() { + doTest() + } + + fun testStrict() { + doTest() + } + + fun testDefault() { + doTest() + } + + private fun doTest() { + myFixture.configureByFile("${getTestName(false)}.kt") myFixture.checkHighlighting() } From 5c5776a6b539d88a18fbf6744a332cdfd67a38db Mon Sep 17 00:00:00 2001 From: Mikhail Glukhikh Date: Thu, 14 Sep 2017 16:54:41 +0300 Subject: [PATCH 146/212] Use resolveToDescriptorIfAny in IDELightClassGenerationSupport --- .../idea/caches/resolve/IDELightClassGenerationSupport.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/resolve/IDELightClassGenerationSupport.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/resolve/IDELightClassGenerationSupport.kt index d9b0ac8dbc7..c81f2f36346 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/resolve/IDELightClassGenerationSupport.kt +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/resolve/IDELightClassGenerationSupport.kt @@ -219,7 +219,7 @@ class IDELightClassGenerationSupport(private val project: Project) : LightClassG override fun resolveToDescriptor(declaration: KtDeclaration): DeclarationDescriptor? { try { - return declaration.unsafeResolveToDescriptor() + return declaration.resolveToDescriptorIfAny(BodyResolveMode.FULL) } catch (e: NoDescriptorForDeclarationException) { return null From 04157c41374fc20fc24e92b5c33d99c7b1df7602 Mon Sep 17 00:00:00 2001 From: Mikhail Glukhikh Date: Mon, 25 Sep 2017 16:48:12 +0300 Subject: [PATCH 147/212] LazyDeclarationResolver.java --> kt --- .../{LazyDeclarationResolver.java => LazyDeclarationResolver.kt} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/{LazyDeclarationResolver.java => LazyDeclarationResolver.kt} (100%) diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/LazyDeclarationResolver.java b/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/LazyDeclarationResolver.kt similarity index 100% rename from compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/LazyDeclarationResolver.java rename to compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/LazyDeclarationResolver.kt From adf0b25c0b55dd2ecb8a512aa2a0dcfcb95d0af7 Mon Sep 17 00:00:00 2001 From: Mikhail Glukhikh Date: Mon, 25 Sep 2017 16:55:09 +0300 Subject: [PATCH 148/212] LazyDeclarationResolver.kt: convert to Kotlin --- .../resolve/lazy/LazyDeclarationResolver.kt | 385 ++++++++---------- 1 file changed, 164 insertions(+), 221 deletions(-) diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/LazyDeclarationResolver.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/LazyDeclarationResolver.kt index e8a0951552a..f94f94bbae1 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/LazyDeclarationResolver.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/LazyDeclarationResolver.kt @@ -14,294 +14,237 @@ * limitations under the License. */ -package org.jetbrains.kotlin.resolve.lazy; +package org.jetbrains.kotlin.resolve.lazy -import com.intellij.psi.PsiElement; -import com.intellij.psi.util.PsiTreeUtil; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.kotlin.context.GlobalContext; -import org.jetbrains.kotlin.descriptors.*; -import org.jetbrains.kotlin.incremental.KotlinLookupLocation; -import org.jetbrains.kotlin.incremental.components.LookupLocation; -import org.jetbrains.kotlin.incremental.components.NoLookupLocation; -import org.jetbrains.kotlin.name.FqName; -import org.jetbrains.kotlin.name.Name; -import org.jetbrains.kotlin.psi.*; -import org.jetbrains.kotlin.psi.psiUtil.PsiUtilsKt; -import org.jetbrains.kotlin.renderer.DescriptorRenderer; -import org.jetbrains.kotlin.resolve.BindingContext; -import org.jetbrains.kotlin.resolve.BindingTrace; -import org.jetbrains.kotlin.resolve.lazy.descriptors.AbstractLazyMemberScope; -import org.jetbrains.kotlin.resolve.lazy.descriptors.LazyPackageDescriptor; -import org.jetbrains.kotlin.resolve.scopes.MemberScope; -import org.jetbrains.kotlin.storage.LockBasedLazyResolveStorageManager; +import com.intellij.psi.util.PsiTreeUtil +import org.jetbrains.kotlin.context.GlobalContext +import org.jetbrains.kotlin.descriptors.* +import org.jetbrains.kotlin.incremental.KotlinLookupLocation +import org.jetbrains.kotlin.incremental.components.LookupLocation +import org.jetbrains.kotlin.incremental.components.NoLookupLocation +import org.jetbrains.kotlin.psi.* +import org.jetbrains.kotlin.psi.psiUtil.getElementTextWithContext +import org.jetbrains.kotlin.renderer.DescriptorRenderer +import org.jetbrains.kotlin.resolve.BindingContext +import org.jetbrains.kotlin.resolve.BindingTrace +import org.jetbrains.kotlin.resolve.lazy.descriptors.AbstractLazyMemberScope +import org.jetbrains.kotlin.resolve.scopes.MemberScope +import org.jetbrains.kotlin.storage.LockBasedLazyResolveStorageManager +import javax.inject.Inject -import javax.inject.Inject; -import java.util.List; +open class LazyDeclarationResolver @Deprecated("") constructor( + globalContext: GlobalContext, + delegationTrace: BindingTrace, + private val topLevelDescriptorProvider: TopLevelDescriptorProvider, + private val absentDescriptorHandler: AbsentDescriptorHandler +) { + private val trace: BindingTrace -public class LazyDeclarationResolver { + protected lateinit var scopeProvider: DeclarationScopeProvider - @NotNull private final TopLevelDescriptorProvider topLevelDescriptorProvider; - @NotNull private final AbsentDescriptorHandler absentDescriptorHandler; - @NotNull private final BindingTrace trace; - - protected DeclarationScopeProvider scopeProvider; + private val bindingContext: BindingContext + get() = trace.bindingContext // component dependency cycle @Inject - public void setDeclarationScopeProvider(@NotNull DeclarationScopeProviderImpl scopeProvider) { - this.scopeProvider = scopeProvider; + fun setDeclarationScopeProvider(scopeProvider: DeclarationScopeProviderImpl) { + this.scopeProvider = scopeProvider } - @Deprecated - public LazyDeclarationResolver( - @NotNull GlobalContext globalContext, - @NotNull BindingTrace delegationTrace, - @NotNull TopLevelDescriptorProvider topLevelDescriptorProvider, - @NotNull AbsentDescriptorHandler absentDescriptorHandler - ) { - this.topLevelDescriptorProvider = topLevelDescriptorProvider; - this.absentDescriptorHandler = absentDescriptorHandler; - LockBasedLazyResolveStorageManager lockBasedLazyResolveStorageManager = - new LockBasedLazyResolveStorageManager(globalContext.getStorageManager()); + init { + val lockBasedLazyResolveStorageManager = LockBasedLazyResolveStorageManager(globalContext.storageManager) - this.trace = lockBasedLazyResolveStorageManager.createSafeTrace(delegationTrace); + this.trace = lockBasedLazyResolveStorageManager.createSafeTrace(delegationTrace) } - @NotNull - public ClassDescriptor getClassDescriptor(@NotNull KtClassOrObject classOrObject, @NotNull LookupLocation location) { - return findClassDescriptor(classOrObject, location); - } + open fun getClassDescriptor(classOrObject: KtClassOrObject, location: LookupLocation): ClassDescriptor = + findClassDescriptor(classOrObject, location) - @NotNull - public ScriptDescriptor getScriptDescriptor(@NotNull KtScript script, @NotNull LookupLocation location) { - return (ScriptDescriptor) findClassDescriptor(script, location); - } + fun getScriptDescriptor(script: KtScript, location: LookupLocation): ScriptDescriptor = + findClassDescriptor(script, location) as ScriptDescriptor - @NotNull - private ClassDescriptor findClassDescriptor( - @NotNull KtNamedDeclaration classObjectOrScript, - @NotNull LookupLocation location - ) { - MemberScope scope = getMemberScopeDeclaredIn(classObjectOrScript, location); + private fun findClassDescriptor( + classObjectOrScript: KtNamedDeclaration, + location: LookupLocation + ): ClassDescriptor { + val scope = getMemberScopeDeclaredIn(classObjectOrScript, location) // Why not use the result here. Because it may be that there is a redeclaration: // class A {} class A { fun foo(): A} // and if we find the class by name only, we may b-not get the right one. // This call is only needed to make sure the classes are written to trace - ClassifierDescriptor scopeDescriptor = scope.getContributedClassifier(classObjectOrScript.getNameAsSafeName(), location); - DeclarationDescriptor descriptor = getBindingContext().get(BindingContext.DECLARATION_TO_DESCRIPTOR, classObjectOrScript); + val scopeDescriptor = scope.getContributedClassifier(classObjectOrScript.nameAsSafeName, location) + val descriptor = bindingContext.get(BindingContext.DECLARATION_TO_DESCRIPTOR, classObjectOrScript) - if (descriptor == null) { - String providerInfoString = null; - if (scope instanceof AbstractLazyMemberScope) { - AbstractLazyMemberScope lazyMemberScope = (AbstractLazyMemberScope) scope; - providerInfoString = lazyMemberScope.toProviderString(); + if (descriptor !is ClassDescriptor) { + + var providerInfoString: String? = null + if (scope is AbstractLazyMemberScope<*, *>) { + providerInfoString = scope.toProviderString() } - throw new IllegalArgumentException( + throw IllegalArgumentException( String.format( "Could not find a classifier for %s.\n" + "Found descriptor: %s (%s).\n" + "Scope: %s.\n" + "Provider: %s.", - PsiUtilsKt.getElementTextWithContext(classObjectOrScript), - scopeDescriptor != null ? DescriptorRenderer.DEBUG_TEXT.render(scopeDescriptor) : "null", - scopeDescriptor != null ? (scopeDescriptor.getContainingDeclaration().getClass()) : null, + classObjectOrScript.getElementTextWithContext(), + scopeDescriptor?.let { DescriptorRenderer.DEBUG_TEXT.render(it) } ?: "null", + scopeDescriptor?.containingDeclaration?.javaClass, scope, - providerInfoString != null ? providerInfoString : "null" + providerInfoString ?: "null" ) - ); + ) } - return (ClassDescriptor) descriptor; + return descriptor } - @NotNull - private BindingContext getBindingContext() { - return trace.getBindingContext(); - } + fun resolveToDescriptor(declaration: KtDeclaration): DeclarationDescriptor = + resolveToDescriptor(declaration, /*track =*/true) - @NotNull - public DeclarationDescriptor resolveToDescriptor(@NotNull KtDeclaration declaration) { - return resolveToDescriptor(declaration, /*track =*/true); - } + private fun resolveToDescriptor(declaration: KtDeclaration, track: Boolean): DeclarationDescriptor { + return declaration.accept(object : KtVisitor() { + private fun lookupLocationFor(declaration: KtDeclaration, isTopLevel: Boolean): LookupLocation = + if (isTopLevel && track) KotlinLookupLocation(declaration) + else NoLookupLocation.WHEN_RESOLVE_DECLARATION - @NotNull - private DeclarationDescriptor resolveToDescriptor(@NotNull KtDeclaration declaration, boolean track) { - DeclarationDescriptor result = declaration.accept(new KtVisitor() { - @NotNull - private LookupLocation lookupLocationFor(@NotNull KtDeclaration declaration, boolean isTopLevel) { - return isTopLevel && track ? new KotlinLookupLocation(declaration) : NoLookupLocation.WHEN_RESOLVE_DECLARATION; - } + override fun visitClass(klass: KtClass, data: Nothing?): DeclarationDescriptor = + getClassDescriptor(klass, lookupLocationFor(klass, klass.isTopLevel())) - @Override - public DeclarationDescriptor visitClass(@NotNull KtClass klass, Void data) { - return getClassDescriptor(klass, lookupLocationFor(klass, klass.isTopLevel())); - } + override fun visitObjectDeclaration(declaration: KtObjectDeclaration, data: Nothing?): DeclarationDescriptor = + getClassDescriptor(declaration, lookupLocationFor(declaration, declaration.isTopLevel())) - @Override - public DeclarationDescriptor visitObjectDeclaration(@NotNull KtObjectDeclaration declaration, Void data) { - return getClassDescriptor(declaration, lookupLocationFor(declaration, declaration.isTopLevel())); - } + override fun visitTypeParameter(parameter: KtTypeParameter, data: Nothing?): DeclarationDescriptor { + val ownerElement = PsiTreeUtil.getParentOfType(parameter, KtTypeParameterListOwner::class.java) ?: error("Owner not found for type parameter: " + parameter.text) + val ownerDescriptor = resolveToDescriptor(ownerElement, /*track =*/false) - @Override - public DeclarationDescriptor visitTypeParameter(@NotNull KtTypeParameter parameter, Void data) { - KtTypeParameterListOwner ownerElement = PsiTreeUtil.getParentOfType(parameter, KtTypeParameterListOwner.class); - assert ownerElement != null : "Owner not found for type parameter: " + parameter.getText(); - DeclarationDescriptor ownerDescriptor = resolveToDescriptor(ownerElement, /*track =*/false); - - List typeParameters; - if (ownerDescriptor instanceof CallableDescriptor) { - CallableDescriptor callableDescriptor = (CallableDescriptor) ownerDescriptor; - typeParameters = callableDescriptor.getTypeParameters(); - } - else if (ownerDescriptor instanceof ClassifierDescriptorWithTypeParameters) { - ClassifierDescriptorWithTypeParameters classifierDescriptor = (ClassifierDescriptorWithTypeParameters) ownerDescriptor; - typeParameters = classifierDescriptor.getTypeConstructor().getParameters(); - } - else { - throw new IllegalStateException("Unknown owner kind for a type parameter: " + ownerDescriptor); + val typeParameters: List + typeParameters = when (ownerDescriptor) { + is CallableDescriptor -> ownerDescriptor.typeParameters + is ClassifierDescriptorWithTypeParameters -> ownerDescriptor.typeConstructor.parameters + else -> throw IllegalStateException("Unknown owner kind for a type parameter: " + ownerDescriptor) } - Name name = parameter.getNameAsSafeName(); - for (TypeParameterDescriptor typeParameterDescriptor : typeParameters) { - if (typeParameterDescriptor.getName().equals(name)) { - return typeParameterDescriptor; + val name = parameter.nameAsSafeName + return typeParameters.firstOrNull { it.name == name } + ?: throw IllegalStateException("Type parameter $name not found for $ownerDescriptor") + } + + override fun visitNamedFunction(function: KtNamedFunction, data: Nothing?): DeclarationDescriptor? { + val location = lookupLocationFor(function, function.isTopLevel) + val scopeForDeclaration = getMemberScopeDeclaredIn(function, location) + scopeForDeclaration.getContributedFunctions(function.nameAsSafeName, location) + return bindingContext.get(BindingContext.DECLARATION_TO_DESCRIPTOR, function) + } + + override fun visitParameter(parameter: KtParameter, data: Nothing?): DeclarationDescriptor? { + val grandFather = parameter.parent.parent + when (grandFather) { + is KtPrimaryConstructor -> { + val jetClass = grandFather.getContainingClassOrObject() + // This is a primary constructor parameter + val classDescriptor = getClassDescriptor(jetClass, lookupLocationFor(jetClass, false)) + return when { + parameter.hasValOrVar() -> { + classDescriptor.defaultType.memberScope.getContributedVariables( + parameter.nameAsSafeName, lookupLocationFor(parameter, false)) + bindingContext.get(BindingContext.PRIMARY_CONSTRUCTOR_PARAMETER, parameter) + } + else -> { + val constructor = classDescriptor.unsubstitutedPrimaryConstructor + ?: error("There are constructor parameters found, so a constructor should also exist") + constructor.valueParameters + bindingContext.get(BindingContext.VALUE_PARAMETER, parameter) + } + } } - } - - throw new IllegalStateException("Type parameter " + name + " not found for " + ownerDescriptor); - } - - @Override - public DeclarationDescriptor visitNamedFunction(@NotNull KtNamedFunction function, Void data) { - LookupLocation location = lookupLocationFor(function, function.isTopLevel()); - MemberScope scopeForDeclaration = getMemberScopeDeclaredIn(function, location); - scopeForDeclaration.getContributedFunctions(function.getNameAsSafeName(), location); - return getBindingContext().get(BindingContext.DECLARATION_TO_DESCRIPTOR, function); - } - - @Override - public DeclarationDescriptor visitParameter(@NotNull KtParameter parameter, Void data) { - PsiElement grandFather = parameter.getParent().getParent(); - if (grandFather instanceof KtPrimaryConstructor) { - KtClassOrObject jetClass = ((KtPrimaryConstructor) grandFather).getContainingClassOrObject(); - // This is a primary constructor parameter - ClassDescriptor classDescriptor = getClassDescriptor(jetClass, lookupLocationFor(jetClass, false)); - if (parameter.hasValOrVar()) { - classDescriptor.getDefaultType().getMemberScope().getContributedVariables(parameter.getNameAsSafeName(), lookupLocationFor(parameter, false)); - return getBindingContext().get(BindingContext.PRIMARY_CONSTRUCTOR_PARAMETER, parameter); + is KtNamedFunction -> { + val function = visitNamedFunction(grandFather, data) as? FunctionDescriptor + function?.valueParameters + return bindingContext.get(BindingContext.VALUE_PARAMETER, parameter) } - else { - ConstructorDescriptor constructor = classDescriptor.getUnsubstitutedPrimaryConstructor(); - assert constructor != null: "There are constructor parameters found, so a constructor should also exist"; - constructor.getValueParameters(); - return getBindingContext().get(BindingContext.VALUE_PARAMETER, parameter); + is KtSecondaryConstructor -> { + val constructorDescriptor = visitSecondaryConstructor( + grandFather, data + ) as? ConstructorDescriptor + constructorDescriptor?.valueParameters + return bindingContext.get(BindingContext.VALUE_PARAMETER, parameter) } - } - else if (grandFather instanceof KtNamedFunction) { - FunctionDescriptor function = (FunctionDescriptor) visitNamedFunction((KtNamedFunction) grandFather, data); - function.getValueParameters(); - return getBindingContext().get(BindingContext.VALUE_PARAMETER, parameter); - } - else if (grandFather instanceof KtSecondaryConstructor) { - ConstructorDescriptor constructorDescriptor = (ConstructorDescriptor) visitSecondaryConstructor( - (KtSecondaryConstructor) grandFather, data - ); - constructorDescriptor.getValueParameters(); - return getBindingContext().get(BindingContext.VALUE_PARAMETER, parameter); - } - else { - //TODO: support parameters in accessors and other places(?) - return super.visitParameter(parameter, data); + else -> //TODO: support parameters in accessors and other places(?) + return super.visitParameter(parameter, data) } } - @Override - public DeclarationDescriptor visitSecondaryConstructor(@NotNull KtSecondaryConstructor constructor, Void data) { - getClassDescriptor((KtClassOrObject) constructor.getParent().getParent(), lookupLocationFor(constructor, false)).getConstructors(); - return getBindingContext().get(BindingContext.CONSTRUCTOR, constructor); + override fun visitSecondaryConstructor(constructor: KtSecondaryConstructor, data: Nothing?): DeclarationDescriptor? { + getClassDescriptor(constructor.parent.parent as KtClassOrObject, lookupLocationFor(constructor, false)).constructors + return bindingContext.get(BindingContext.CONSTRUCTOR, constructor) } - @Override - public DeclarationDescriptor visitPrimaryConstructor(@NotNull KtPrimaryConstructor constructor, Void data) { - getClassDescriptor(constructor.getContainingClassOrObject(), lookupLocationFor(constructor, false)).getConstructors(); - return getBindingContext().get(BindingContext.CONSTRUCTOR, constructor); + override fun visitPrimaryConstructor(constructor: KtPrimaryConstructor, data: Nothing?): DeclarationDescriptor? { + getClassDescriptor(constructor.getContainingClassOrObject(), lookupLocationFor(constructor, false)).constructors + return bindingContext.get(BindingContext.CONSTRUCTOR, constructor) } - @Override - public DeclarationDescriptor visitProperty(@NotNull KtProperty property, Void data) { - LookupLocation location = lookupLocationFor(property, property.isTopLevel()); - MemberScope scopeForDeclaration = getMemberScopeDeclaredIn(property, location); - scopeForDeclaration.getContributedVariables(property.getNameAsSafeName(), location); - return getBindingContext().get(BindingContext.DECLARATION_TO_DESCRIPTOR, property); + override fun visitProperty(property: KtProperty, data: Nothing?): DeclarationDescriptor? { + val location = lookupLocationFor(property, property.isTopLevel) + val scopeForDeclaration = getMemberScopeDeclaredIn(property, location) + scopeForDeclaration.getContributedVariables(property.nameAsSafeName, location) + return bindingContext.get(BindingContext.DECLARATION_TO_DESCRIPTOR, property) } - @Override - public DeclarationDescriptor visitDestructuringDeclarationEntry( - @NotNull KtDestructuringDeclarationEntry destructuringDeclarationEntry, Void data - ) { - LookupLocation location = lookupLocationFor(destructuringDeclarationEntry, false); - KtDestructuringDeclaration destructuringDeclaration = ((KtDestructuringDeclaration) destructuringDeclarationEntry.getParent()); - MemberScope scopeForDeclaration = getMemberScopeDeclaredIn(destructuringDeclaration, location); - scopeForDeclaration.getContributedVariables(destructuringDeclarationEntry.getNameAsSafeName(), location); - return getBindingContext().get(BindingContext.DECLARATION_TO_DESCRIPTOR, destructuringDeclarationEntry); + override fun visitDestructuringDeclarationEntry( + destructuringDeclarationEntry: KtDestructuringDeclarationEntry, data: Nothing? + ): DeclarationDescriptor? { + val location = lookupLocationFor(destructuringDeclarationEntry, false) + val destructuringDeclaration = destructuringDeclarationEntry.parent as KtDestructuringDeclaration + val scopeForDeclaration = getMemberScopeDeclaredIn(destructuringDeclaration, location) + scopeForDeclaration.getContributedVariables(destructuringDeclarationEntry.nameAsSafeName, location) + return bindingContext.get(BindingContext.DECLARATION_TO_DESCRIPTOR, destructuringDeclarationEntry) } - @Override - public DeclarationDescriptor visitTypeAlias(@NotNull KtTypeAlias typeAlias, Void data) { - LookupLocation location = lookupLocationFor(typeAlias, typeAlias.isTopLevel()); - MemberScope scopeForDeclaration = getMemberScopeDeclaredIn(typeAlias, location); - scopeForDeclaration.getContributedClassifier(typeAlias.getNameAsSafeName(), location); - return getBindingContext().get(BindingContext.DECLARATION_TO_DESCRIPTOR, typeAlias); + override fun visitTypeAlias(typeAlias: KtTypeAlias, data: Nothing?): DeclarationDescriptor? { + val location = lookupLocationFor(typeAlias, typeAlias.isTopLevel()) + val scopeForDeclaration = getMemberScopeDeclaredIn(typeAlias, location) + scopeForDeclaration.getContributedClassifier(typeAlias.nameAsSafeName, location) + return bindingContext.get(BindingContext.DECLARATION_TO_DESCRIPTOR, typeAlias) } - @Override - public DeclarationDescriptor visitScript(@NotNull KtScript script, Void data) { - return getScriptDescriptor(script, lookupLocationFor(script, true)); - } + override fun visitScript(script: KtScript, data: Nothing?): DeclarationDescriptor = + getScriptDescriptor(script, lookupLocationFor(script, true)) - @Override - public DeclarationDescriptor visitKtElement(@NotNull KtElement element, Void data) { - throw new IllegalArgumentException("Unsupported declaration type: " + element + " " + - PsiUtilsKt.getElementTextWithContext(element)); + override fun visitKtElement(element: KtElement, data: Nothing?): DeclarationDescriptor? { + throw IllegalArgumentException("Unsupported declaration type: " + element + " " + + element.getElementTextWithContext()) } - }, null); - if (result == null) { - return absentDescriptorHandler.diagnoseDescriptorNotFound(declaration); - } - return result; + }, null) ?: absentDescriptorHandler.diagnoseDescriptorNotFound(declaration) } - @NotNull - /*package*/ MemberScope getMemberScopeDeclaredIn(@NotNull KtDeclaration declaration, @NotNull LookupLocation location) { - KtDeclaration parentDeclaration = KtStubbedPsiUtil.getContainingDeclaration(declaration); - boolean isTopLevel = parentDeclaration == null; + internal fun getMemberScopeDeclaredIn(declaration: KtDeclaration, location: LookupLocation): + /*package*/ MemberScope { + val parentDeclaration = KtStubbedPsiUtil.getContainingDeclaration(declaration) + val isTopLevel = parentDeclaration == null if (isTopLevel) { // for top level declarations we search directly in package because of possible conflicts with imports - KtFile ktFile = (KtFile) declaration.getContainingFile(); - FqName fqName = ktFile.getPackageFqName(); - topLevelDescriptorProvider.assertValid(); - LazyPackageDescriptor packageDescriptor = topLevelDescriptorProvider.getPackageFragment(fqName); + val ktFile = declaration.containingFile as KtFile + val fqName = ktFile.packageFqName + topLevelDescriptorProvider.assertValid() + val packageDescriptor = topLevelDescriptorProvider.getPackageFragment(fqName) if (packageDescriptor == null) { - if (topLevelDescriptorProvider instanceof LazyClassContext) { - ((LazyClassContext) topLevelDescriptorProvider).getDeclarationProviderFactory().diagnoseMissingPackageFragment(ktFile); + if (topLevelDescriptorProvider is LazyClassContext) { + topLevelDescriptorProvider.declarationProviderFactory.diagnoseMissingPackageFragment(ktFile) } else { - throw new IllegalStateException("Cannot find package fragment for file " + ktFile.getName() + " with package " + fqName); + throw IllegalStateException("Cannot find package fragment for file " + ktFile.name + " with package " + fqName) } } - return packageDescriptor.getMemberScope(); + return packageDescriptor!!.getMemberScope() } else { - if (parentDeclaration instanceof KtClassOrObject) { - return getClassDescriptor((KtClassOrObject) parentDeclaration, location).getUnsubstitutedMemberScope(); - } - else if (parentDeclaration instanceof KtScript) { - return getScriptDescriptor((KtScript) parentDeclaration, location).getUnsubstitutedMemberScope(); - } - else { - throw new IllegalStateException("Don't call this method for local declarations: " + declaration + "\n" + - PsiUtilsKt.getElementTextWithContext(declaration)); + return when (parentDeclaration) { + is KtClassOrObject -> getClassDescriptor(parentDeclaration, location).unsubstitutedMemberScope + is KtScript -> getScriptDescriptor(parentDeclaration, location).unsubstitutedMemberScope + else -> throw IllegalStateException("Don't call this method for local declarations: " + declaration + "\n" + + declaration.getElementTextWithContext()) } } } From 5c0bc266b3bf82c74ee1deb5cce31e26bf58f22e Mon Sep 17 00:00:00 2001 From: Mikhail Glukhikh Date: Mon, 25 Sep 2017 16:56:58 +0300 Subject: [PATCH 149/212] Do not use unsafe getClassDescriptor() inside resolveToDescriptor Introduce getClassDescriptorIfAny / findClassDescriptorIfAny instead May fix KT-18740 / EA-76201 --- .../resolve/lazy/LazyDeclarationResolver.kt | 47 ++++++++++++------- .../expressions/LocalClassifierAnalyzer.kt | 9 +++- 2 files changed, 38 insertions(+), 18 deletions(-) diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/LazyDeclarationResolver.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/LazyDeclarationResolver.kt index f94f94bbae1..c9d2a25f6c3 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/LazyDeclarationResolver.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/LazyDeclarationResolver.kt @@ -57,26 +57,40 @@ open class LazyDeclarationResolver @Deprecated("") constructor( this.trace = lockBasedLazyResolveStorageManager.createSafeTrace(delegationTrace) } + open fun getClassDescriptorIfAny(classOrObject: KtClassOrObject, location: LookupLocation): ClassDescriptor? = + findClassDescriptorIfAny(classOrObject, location) + open fun getClassDescriptor(classOrObject: KtClassOrObject, location: LookupLocation): ClassDescriptor = findClassDescriptor(classOrObject, location) fun getScriptDescriptor(script: KtScript, location: LookupLocation): ScriptDescriptor = findClassDescriptor(script, location) as ScriptDescriptor - private fun findClassDescriptor( + private fun findClassDescriptorIfAny( classObjectOrScript: KtNamedDeclaration, location: LookupLocation - ): ClassDescriptor { + ): ClassDescriptor? { val scope = getMemberScopeDeclaredIn(classObjectOrScript, location) // Why not use the result here. Because it may be that there is a redeclaration: // class A {} class A { fun foo(): A} // and if we find the class by name only, we may b-not get the right one. // This call is only needed to make sure the classes are written to trace - val scopeDescriptor = scope.getContributedClassifier(classObjectOrScript.nameAsSafeName, location) + scope.getContributedClassifier(classObjectOrScript.nameAsSafeName, location) val descriptor = bindingContext.get(BindingContext.DECLARATION_TO_DESCRIPTOR, classObjectOrScript) - if (descriptor !is ClassDescriptor) { + return descriptor as? ClassDescriptor + } + + private fun findClassDescriptor( + classObjectOrScript: KtNamedDeclaration, + location: LookupLocation + ): ClassDescriptor { + val descriptor = findClassDescriptorIfAny(classObjectOrScript, location) + + if (descriptor == null) { + val scope = getMemberScopeDeclaredIn(classObjectOrScript, location) + val scopeDescriptor = scope.getContributedClassifier(classObjectOrScript.nameAsSafeName, location) var providerInfoString: String? = null if (scope is AbstractLazyMemberScope<*, *>) { @@ -101,23 +115,23 @@ open class LazyDeclarationResolver @Deprecated("") constructor( } fun resolveToDescriptor(declaration: KtDeclaration): DeclarationDescriptor = - resolveToDescriptor(declaration, /*track =*/true) + resolveToDescriptor(declaration, /*track =*/true) ?: absentDescriptorHandler.diagnoseDescriptorNotFound(declaration) - private fun resolveToDescriptor(declaration: KtDeclaration, track: Boolean): DeclarationDescriptor { + private fun resolveToDescriptor(declaration: KtDeclaration, track: Boolean): DeclarationDescriptor? { return declaration.accept(object : KtVisitor() { private fun lookupLocationFor(declaration: KtDeclaration, isTopLevel: Boolean): LookupLocation = if (isTopLevel && track) KotlinLookupLocation(declaration) else NoLookupLocation.WHEN_RESOLVE_DECLARATION - override fun visitClass(klass: KtClass, data: Nothing?): DeclarationDescriptor = - getClassDescriptor(klass, lookupLocationFor(klass, klass.isTopLevel())) + override fun visitClass(klass: KtClass, data: Nothing?): DeclarationDescriptor? = + getClassDescriptorIfAny(klass, lookupLocationFor(klass, klass.isTopLevel())) - override fun visitObjectDeclaration(declaration: KtObjectDeclaration, data: Nothing?): DeclarationDescriptor = - getClassDescriptor(declaration, lookupLocationFor(declaration, declaration.isTopLevel())) + override fun visitObjectDeclaration(declaration: KtObjectDeclaration, data: Nothing?): DeclarationDescriptor? = + getClassDescriptorIfAny(declaration, lookupLocationFor(declaration, declaration.isTopLevel())) - override fun visitTypeParameter(parameter: KtTypeParameter, data: Nothing?): DeclarationDescriptor { + override fun visitTypeParameter(parameter: KtTypeParameter, data: Nothing?): DeclarationDescriptor? { val ownerElement = PsiTreeUtil.getParentOfType(parameter, KtTypeParameterListOwner::class.java) ?: error("Owner not found for type parameter: " + parameter.text) - val ownerDescriptor = resolveToDescriptor(ownerElement, /*track =*/false) + val ownerDescriptor = resolveToDescriptor(ownerElement, /*track =*/false) ?: return null val typeParameters: List typeParameters = when (ownerDescriptor) { @@ -144,8 +158,9 @@ open class LazyDeclarationResolver @Deprecated("") constructor( is KtPrimaryConstructor -> { val jetClass = grandFather.getContainingClassOrObject() // This is a primary constructor parameter - val classDescriptor = getClassDescriptor(jetClass, lookupLocationFor(jetClass, false)) + val classDescriptor = getClassDescriptorIfAny(jetClass, lookupLocationFor(jetClass, false)) return when { + classDescriptor == null -> null parameter.hasValOrVar() -> { classDescriptor.defaultType.memberScope.getContributedVariables( parameter.nameAsSafeName, lookupLocationFor(parameter, false)) @@ -177,12 +192,12 @@ open class LazyDeclarationResolver @Deprecated("") constructor( } override fun visitSecondaryConstructor(constructor: KtSecondaryConstructor, data: Nothing?): DeclarationDescriptor? { - getClassDescriptor(constructor.parent.parent as KtClassOrObject, lookupLocationFor(constructor, false)).constructors + getClassDescriptorIfAny(constructor.parent.parent as KtClassOrObject, lookupLocationFor(constructor, false))?.constructors return bindingContext.get(BindingContext.CONSTRUCTOR, constructor) } override fun visitPrimaryConstructor(constructor: KtPrimaryConstructor, data: Nothing?): DeclarationDescriptor? { - getClassDescriptor(constructor.getContainingClassOrObject(), lookupLocationFor(constructor, false)).constructors + getClassDescriptorIfAny(constructor.getContainingClassOrObject(), lookupLocationFor(constructor, false))?.constructors return bindingContext.get(BindingContext.CONSTRUCTOR, constructor) } @@ -217,7 +232,7 @@ open class LazyDeclarationResolver @Deprecated("") constructor( throw IllegalArgumentException("Unsupported declaration type: " + element + " " + element.getElementTextWithContext()) } - }, null) ?: absentDescriptorHandler.diagnoseDescriptorNotFound(declaration) + }, null) } internal fun getMemberScopeDeclaredIn(declaration: KtDeclaration, location: LookupLocation): diff --git a/compiler/frontend/src/org/jetbrains/kotlin/types/expressions/LocalClassifierAnalyzer.kt b/compiler/frontend/src/org/jetbrains/kotlin/types/expressions/LocalClassifierAnalyzer.kt index 38aa306cfb0..28389553ef9 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/types/expressions/LocalClassifierAnalyzer.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/types/expressions/LocalClassifierAnalyzer.kt @@ -18,10 +18,8 @@ package org.jetbrains.kotlin.types.expressions import com.intellij.psi.PsiElement import com.intellij.psi.util.PsiTreeUtil -import org.jetbrains.kotlin.config.CompilerConfiguration import org.jetbrains.kotlin.config.LanguageVersionSettings import org.jetbrains.kotlin.config.TargetPlatformVersion -import org.jetbrains.kotlin.config.languageVersionSettings import org.jetbrains.kotlin.container.get import org.jetbrains.kotlin.context.GlobalContext import org.jetbrains.kotlin.context.withModule @@ -200,6 +198,13 @@ class LocalLazyDeclarationResolver( } return super.getClassDescriptor(classOrObject, location) } + + override fun getClassDescriptorIfAny(classOrObject: KtClassOrObject, location: LookupLocation): ClassDescriptor? { + if (localClassDescriptorManager.isMyClass(classOrObject)) { + return localClassDescriptorManager.getClassDescriptor(classOrObject, scopeProvider) + } + return super.getClassDescriptorIfAny(classOrObject, location) + } } From e8682fa9b993c8bab189b323cc51e7df1d26e7d7 Mon Sep 17 00:00:00 2001 From: Mikhail Glukhikh Date: Thu, 28 Sep 2017 17:33:10 +0300 Subject: [PATCH 150/212] Use diagnoseDescriptorNotFound() in findClassDescriptor --- .../resolve/lazy/LazyDeclarationResolver.kt | 33 ++----------------- 1 file changed, 3 insertions(+), 30 deletions(-) diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/LazyDeclarationResolver.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/LazyDeclarationResolver.kt index c9d2a25f6c3..8daa2b02cfb 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/LazyDeclarationResolver.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/LazyDeclarationResolver.kt @@ -24,10 +24,8 @@ import org.jetbrains.kotlin.incremental.components.LookupLocation import org.jetbrains.kotlin.incremental.components.NoLookupLocation import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.psi.psiUtil.getElementTextWithContext -import org.jetbrains.kotlin.renderer.DescriptorRenderer import org.jetbrains.kotlin.resolve.BindingContext import org.jetbrains.kotlin.resolve.BindingTrace -import org.jetbrains.kotlin.resolve.lazy.descriptors.AbstractLazyMemberScope import org.jetbrains.kotlin.resolve.scopes.MemberScope import org.jetbrains.kotlin.storage.LockBasedLazyResolveStorageManager import javax.inject.Inject @@ -85,34 +83,9 @@ open class LazyDeclarationResolver @Deprecated("") constructor( private fun findClassDescriptor( classObjectOrScript: KtNamedDeclaration, location: LookupLocation - ): ClassDescriptor { - val descriptor = findClassDescriptorIfAny(classObjectOrScript, location) - - if (descriptor == null) { - val scope = getMemberScopeDeclaredIn(classObjectOrScript, location) - val scopeDescriptor = scope.getContributedClassifier(classObjectOrScript.nameAsSafeName, location) - - var providerInfoString: String? = null - if (scope is AbstractLazyMemberScope<*, *>) { - providerInfoString = scope.toProviderString() - } - throw IllegalArgumentException( - String.format( - "Could not find a classifier for %s.\n" + - "Found descriptor: %s (%s).\n" + - "Scope: %s.\n" + - "Provider: %s.", - classObjectOrScript.getElementTextWithContext(), - scopeDescriptor?.let { DescriptorRenderer.DEBUG_TEXT.render(it) } ?: "null", - scopeDescriptor?.containingDeclaration?.javaClass, - scope, - providerInfoString ?: "null" - ) - ) - } - - return descriptor - } + ): ClassDescriptor = + findClassDescriptorIfAny(classObjectOrScript, location) + ?: (absentDescriptorHandler.diagnoseDescriptorNotFound(classObjectOrScript) as ClassDescriptor) fun resolveToDescriptor(declaration: KtDeclaration): DeclarationDescriptor = resolveToDescriptor(declaration, /*track =*/true) ?: absentDescriptorHandler.diagnoseDescriptorNotFound(declaration) From 796e0feaa4e3228b640bb49c277370385e083cce Mon Sep 17 00:00:00 2001 From: Anton Bannykh Date: Thu, 28 Sep 2017 19:45:44 +0300 Subject: [PATCH 151/212] Don't set publish tag in package.json since it overrides the CLI flags --- js/npm.templates/kotlin-compiler/package.json | 3 --- js/npm.templates/kotlin/package.json | 5 +---- 2 files changed, 1 insertion(+), 7 deletions(-) diff --git a/js/npm.templates/kotlin-compiler/package.json b/js/npm.templates/kotlin-compiler/package.json index ff1651e537c..04612fab7ab 100644 --- a/js/npm.templates/kotlin-compiler/package.json +++ b/js/npm.templates/kotlin-compiler/package.json @@ -21,8 +21,5 @@ "homepage": "kotlinlang.org", "bin": { "kotlinc-js": "bin/kotlinc-js-runner.js" - }, - "publishConfig" : { - "tag" : "dev" } } diff --git a/js/npm.templates/kotlin/package.json b/js/npm.templates/kotlin/package.json index aa42b62390f..2fac326ba12 100644 --- a/js/npm.templates/kotlin/package.json +++ b/js/npm.templates/kotlin/package.json @@ -19,8 +19,5 @@ "bugs": { "url": "kotl.in/issue" }, - "homepage": "kotlinlang.org", - "publishConfig" : { - "tag" : "dev" - } + "homepage": "kotlinlang.org" } From 9ffd0db4a87116a0c825f2f0163b8ad3eb1a922f Mon Sep 17 00:00:00 2001 From: Francesco Vasco Date: Wed, 27 Sep 2017 22:09:10 +0200 Subject: [PATCH 152/212] Avoid ISUB in kotlin.repeat --- libraries/stdlib/src/kotlin/util/Standard.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/libraries/stdlib/src/kotlin/util/Standard.kt b/libraries/stdlib/src/kotlin/util/Standard.kt index ab1835108af..e524197ebab 100644 --- a/libraries/stdlib/src/kotlin/util/Standard.kt +++ b/libraries/stdlib/src/kotlin/util/Standard.kt @@ -82,7 +82,7 @@ public inline fun T.takeUnless(predicate: (T) -> Boolean): T? = if (!predica */ @kotlin.internal.InlineOnly public inline fun repeat(times: Int, action: (Int) -> Unit) { - for (index in 0..times - 1) { + for (index in 0 until times) { action(index) } -} \ No newline at end of file +} From 779b9c6fcc1300ee9f27d569185fc02fb2f9a0d4 Mon Sep 17 00:00:00 2001 From: Ilya Gorbunov Date: Thu, 28 Sep 2017 22:01:59 +0300 Subject: [PATCH 153/212] Change TeamCity build status badge to point to the compiler build configuration --- ReadMe.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ReadMe.md b/ReadMe.md index 2a898773630..1283f41ba67 100644 --- a/ReadMe.md +++ b/ReadMe.md @@ -1,6 +1,6 @@ [![official project](http://jb.gg/badges/official.svg)](https://confluence.jetbrains.com/display/ALL/JetBrains+on+GitHub) -[![TeamCity (simple build status)](https://img.shields.io/teamcity/http/teamcity.jetbrains.com/s/bt345.svg)](https://teamcity.jetbrains.com/viewType.html?buildTypeId=bt345&branch_Kotlin=%3Cdefault%3E&tab=buildTypeStatusDiv) +[![TeamCity (simple build status)](https://img.shields.io/teamcity/http/teamcity.jetbrains.com/s/Kotlin_dev_Compiler.svg)](https://teamcity.jetbrains.com/viewType.html?buildTypeId=Kotlin_dev_Compiler&branch_Kotlin_dev=%3Cdefault%3E&tab=buildTypeStatusDiv) [![Maven Central](https://img.shields.io/maven-central/v/org.jetbrains.kotlin/kotlin-maven-plugin.svg)](http://search.maven.org/#search%7Cga%7C1%7Cg%3A%22org.jetbrains.kotlin%22) [![GitHub license](https://img.shields.io/badge/license-Apache%20License%202.0-blue.svg?style=flat)](http://www.apache.org/licenses/LICENSE-2.0) From 62f293280c7440d3e457939d31c37d9baaeda54d Mon Sep 17 00:00:00 2001 From: Alexey Tsvetkov Date: Fri, 15 Sep 2017 16:35:30 +0300 Subject: [PATCH 154/212] Gradle: compile tests incrementally when main is changed #KT-17674 fixed --- .../daemon/common/CompilationOptions.kt | 4 +- .../kotlin/daemon/CompileServiceImpl.kt | 9 +- .../kotlin/incremental/BuildDiffsStorage.kt | 132 ++++++++++++++++++ .../jetbrains/kotlin/incremental/BuildInfo.kt | 2 +- .../incremental/IncrementalCompilerRunner.kt | 25 ++-- .../IncrementalJvmCompilerRunner.kt | 96 ++++++++++--- .../incremental/BuildDiffsStorageTest.kt | 102 ++++++++++++++ .../kotlin/gradle/KotlinGradlePluginIT.kt | 26 +++- .../kotlin/gradle/TestRootAffectedIT.kt | 27 +--- .../GradleCompilerEnvironment.kt | 4 +- .../GradleKotlinCompilerRunner.kt | 4 +- .../jetbrains/kotlin/gradle/tasks/Tasks.kt | 6 +- 12 files changed, 371 insertions(+), 66 deletions(-) create mode 100644 compiler/incremental-compilation-impl/src/org/jetbrains/kotlin/incremental/BuildDiffsStorage.kt create mode 100644 compiler/incremental-compilation-impl/test/org/jetbrains/kotlin/incremental/BuildDiffsStorageTest.kt diff --git a/compiler/daemon/daemon-common/src/org/jetbrains/kotlin/daemon/common/CompilationOptions.kt b/compiler/daemon/daemon-common/src/org/jetbrains/kotlin/daemon/common/CompilationOptions.kt index 3ebd25bc0b5..373cb9569dd 100644 --- a/compiler/daemon/daemon-common/src/org/jetbrains/kotlin/daemon/common/CompilationOptions.kt +++ b/compiler/daemon/daemon-common/src/org/jetbrains/kotlin/daemon/common/CompilationOptions.kt @@ -48,7 +48,9 @@ class IncrementalCompilationOptions( /** @See [ReportSeverity] */ reportSeverity: Int, /** @See [CompilationResultCategory]] */ - requestedCompilationResults: Array + requestedCompilationResults: Array, + val resultDifferenceFile: File? = null, + val friendDifferenceFile: File? = null ) : CompilationOptions(compilerMode, targetPlatform, reportCategories, reportSeverity, requestedCompilationResults) { companion object { const val serialVersionUID: Long = 0 diff --git a/compiler/daemon/src/org/jetbrains/kotlin/daemon/CompileServiceImpl.kt b/compiler/daemon/src/org/jetbrains/kotlin/daemon/CompileServiceImpl.kt index f95b8bf708d..578f6fc84e3 100644 --- a/compiler/daemon/src/org/jetbrains/kotlin/daemon/CompileServiceImpl.kt +++ b/compiler/daemon/src/org/jetbrains/kotlin/daemon/CompileServiceImpl.kt @@ -507,9 +507,12 @@ class CompileServiceImpl( workingDir, enabled = true) - return IncrementalJvmCompilerRunner(workingDir, javaSourceRoots, versions, reporter, annotationFileUpdater, - artifactChanges, changesRegistry) - .compile(allKotlinFiles, k2jvmArgs, compilerMessageCollector, { changedFiles }) + val compiler = IncrementalJvmCompilerRunner(workingDir, javaSourceRoots, versions, + reporter, annotationFileUpdater, + artifactChanges, changesRegistry, + buildHistoryFile = incrementalCompilationOptions.resultDifferenceFile, + friendBuildHistoryFile = incrementalCompilationOptions.friendDifferenceFile) + return compiler.compile(allKotlinFiles, k2jvmArgs, compilerMessageCollector, { changedFiles }) } override fun leaseReplSession( diff --git a/compiler/incremental-compilation-impl/src/org/jetbrains/kotlin/incremental/BuildDiffsStorage.kt b/compiler/incremental-compilation-impl/src/org/jetbrains/kotlin/incremental/BuildDiffsStorage.kt new file mode 100644 index 00000000000..1ba8074d4b1 --- /dev/null +++ b/compiler/incremental-compilation-impl/src/org/jetbrains/kotlin/incremental/BuildDiffsStorage.kt @@ -0,0 +1,132 @@ +/* + * Copyright 2010-2017 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.incremental + +import org.jetbrains.annotations.TestOnly +import org.jetbrains.kotlin.name.FqName +import java.io.File +import java.io.IOException +import java.io.ObjectInputStream +import java.io.ObjectOutputStream + +data class BuildDifference(val ts: Long, val isIncremental: Boolean, val dirtyData: DirtyData) + +// todo: storage format can be optimized by compressing fq-names +data class BuildDiffsStorage(val buildDiffs: List) { + companion object { + fun readFromFile(file: File, reporter: ICReporter?): BuildDiffsStorage? { + fun reportFail(reason: String) { + reporter?.report { "Could not read diff from file $file: $reason" } + } + + if (!file.exists()) return null + + try { + ObjectInputStream(file.inputStream().buffered()).use { input -> + val version = input.readInt() + if (version != CURRENT_VERSION) { + reportFail("incompatible version $version, actual version is $CURRENT_VERSION") + return null + } + + val size = input.readInt() + val result = ArrayList(size) + repeat(size) { + result.add(input.readBuildDifference()) + } + return BuildDiffsStorage(result) + } + } + catch (e: IOException) { + reportFail(e.toString()) + } + + return null + } + + fun writeToFile(file: File, storage: BuildDiffsStorage, reporter: ICReporter?) { + file.parentFile.mkdirs() + + try { + ObjectOutputStream(file.outputStream().buffered()).use { output -> + output.writeInt(CURRENT_VERSION) + + val diffsToWrite = storage.buildDiffs.sortedBy { it.ts }.takeLast(MAX_DIFFS_ENTRIES) + output.writeInt(diffsToWrite.size) + for (diff in diffsToWrite) { + output.writeBuildDifference(diff) + } + } + } + catch (e: IOException) { + reporter?.report { "Could not write diff to file $file: $e" } + } + } + + private fun ObjectInputStream.readBuildDifference(): BuildDifference { + val ts = readLong() + val isIncremental = readBoolean() + val dirtyData = readDirtyData() + return BuildDifference(ts, isIncremental, dirtyData) + } + + private fun ObjectOutputStream.writeBuildDifference(diff: BuildDifference) { + writeLong(diff.ts) + writeBoolean(diff.isIncremental) + writeDirtyData(diff.dirtyData) + } + + private fun ObjectInputStream.readDirtyData(): DirtyData { + val lookupSymbolSize = readInt() + val lookupSymbols = ArrayList(lookupSymbolSize) + repeat(lookupSymbolSize) { + val name = readUTF() + val scope = readUTF() + lookupSymbols.add(LookupSymbol(name = name, scope = scope)) + } + + val dirtyClassesSize = readInt() + val dirtyClassesFqNames = ArrayList(dirtyClassesSize) + repeat(dirtyClassesSize) { + val fqNameString = readUTF() + dirtyClassesFqNames.add(FqName(fqNameString)) + } + + return DirtyData(lookupSymbols, dirtyClassesFqNames) + } + + private fun ObjectOutputStream.writeDirtyData(dirtyData: DirtyData) { + val lookupSymbols = dirtyData.dirtyLookupSymbols + writeInt(lookupSymbols.size) + for ((name, scope) in lookupSymbols) { + writeUTF(name) + writeUTF(scope) + } + + val dirtyClassesFqNames = dirtyData.dirtyClassesFqNames + writeInt(dirtyClassesFqNames.size) + for (fqName in dirtyClassesFqNames) { + writeUTF(fqName.asString()) + } + } + + internal val MAX_DIFFS_ENTRIES: Int = 10 + + @set:TestOnly + var CURRENT_VERSION: Int = 0 + } +} \ No newline at end of file diff --git a/compiler/incremental-compilation-impl/src/org/jetbrains/kotlin/incremental/BuildInfo.kt b/compiler/incremental-compilation-impl/src/org/jetbrains/kotlin/incremental/BuildInfo.kt index d5cfc2ded94..d5149dfadb9 100644 --- a/compiler/incremental-compilation-impl/src/org/jetbrains/kotlin/incremental/BuildInfo.kt +++ b/compiler/incremental-compilation-impl/src/org/jetbrains/kotlin/incremental/BuildInfo.kt @@ -18,7 +18,7 @@ package org.jetbrains.kotlin.incremental import java.io.* -internal data class BuildInfo(val startTS: Long) : Serializable { +data class BuildInfo(val startTS: Long) : Serializable { companion object { fun read(file: File): BuildInfo? = try { diff --git a/compiler/incremental-compilation-impl/src/org/jetbrains/kotlin/incremental/IncrementalCompilerRunner.kt b/compiler/incremental-compilation-impl/src/org/jetbrains/kotlin/incremental/IncrementalCompilerRunner.kt index fcd9688ea0b..dfa187249b7 100644 --- a/compiler/incremental-compilation-impl/src/org/jetbrains/kotlin/incremental/IncrementalCompilerRunner.kt +++ b/compiler/incremental-compilation-impl/src/org/jetbrains/kotlin/incremental/IncrementalCompilerRunner.kt @@ -255,16 +255,9 @@ abstract class IncrementalCompilerRunner< if (exitCode == ExitCode.OK && compilationMode is CompilationMode.Incremental) { buildDirtyLookupSymbols.addAll(additionalDirtyLookupSymbols()) } - if (changesRegistry != null) { - if (compilationMode is CompilationMode.Incremental) { - val dirtyData = DirtyData(buildDirtyLookupSymbols, buildDirtyFqNames) - changesRegistry.registerChanges(currentBuildInfo.startTS, dirtyData) - } - else { - assert(compilationMode is CompilationMode.Rebuild) { "Unexpected compilation mode: ${compilationMode::class.java}" } - changesRegistry.unknownChanges(currentBuildInfo.startTS) - } - } + + val dirtyData = DirtyData(buildDirtyLookupSymbols, buildDirtyFqNames) + processChangesAfterBuild(compilationMode, currentBuildInfo, dirtyData) if (exitCode == ExitCode.OK) { cacheVersions.forEach { it.saveIfNeeded() } @@ -273,6 +266,18 @@ abstract class IncrementalCompilerRunner< return exitCode } + protected open fun processChangesAfterBuild(compilationMode: CompilationMode, currentBuildInfo: BuildInfo, dirtyData: DirtyData) { + if (changesRegistry == null) return + + if (compilationMode is CompilationMode.Incremental) { + changesRegistry.registerChanges(currentBuildInfo.startTS, dirtyData) + } + else { + assert(compilationMode is CompilationMode.Rebuild) { "Unexpected compilation mode: ${compilationMode::class.java}" } + changesRegistry.unknownChanges(currentBuildInfo.startTS) + } + } + companion object { const val DIRTY_SOURCES_FILE_NAME = "dirty-sources.txt" const val LAST_BUILD_INFO_FILE_NAME = "last-build.bin" diff --git a/compiler/incremental-compilation-impl/src/org/jetbrains/kotlin/incremental/IncrementalJvmCompilerRunner.kt b/compiler/incremental-compilation-impl/src/org/jetbrains/kotlin/incremental/IncrementalJvmCompilerRunner.kt index 881e14df20c..45ab3f6d3f8 100644 --- a/compiler/incremental-compilation-impl/src/org/jetbrains/kotlin/incremental/IncrementalJvmCompilerRunner.kt +++ b/compiler/incremental-compilation-impl/src/org/jetbrains/kotlin/incremental/IncrementalJvmCompilerRunner.kt @@ -16,10 +16,10 @@ package org.jetbrains.kotlin.incremental +import com.intellij.openapi.util.io.FileUtil import org.jetbrains.kotlin.annotation.AnnotationFileUpdater import org.jetbrains.kotlin.build.GeneratedFile import org.jetbrains.kotlin.build.GeneratedJvmClass -import org.jetbrains.kotlin.build.isModuleMappingFile import org.jetbrains.kotlin.build.JvmSourceRoot import org.jetbrains.kotlin.cli.common.ExitCode import org.jetbrains.kotlin.cli.common.arguments.K2JVMCompilerArguments @@ -38,6 +38,7 @@ import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.resolve.jvm.JvmClassName import java.io.File import java.util.* +import kotlin.collections.HashSet fun makeIncrementally( cachesDir: File, @@ -89,7 +90,9 @@ class IncrementalJvmCompilerRunner( reporter: ICReporter, private var kaptAnnotationsFileUpdater: AnnotationFileUpdater? = null, artifactChangesProvider: ArtifactChangesProvider? = null, - changesRegistry: ChangesRegistry? = null + changesRegistry: ChangesRegistry? = null, + private val buildHistoryFile: File? = null, + private val friendBuildHistoryFile: File? = null ) : IncrementalCompilerRunner( workingDir, "caches-jvm", @@ -110,16 +113,58 @@ class IncrementalJvmCompilerRunner( private var javaFilesProcessor = ChangedJavaFilesProcessor(reporter) override fun calculateSourcesToCompile(caches: IncrementalJvmCachesManager, changedFiles: ChangedFiles.Known, args: K2JVMCompilerArguments): CompilationMode { - val removedClassFiles = changedFiles.removed.filter(File::isClassFile) - if (removedClassFiles.any()) return CompilationMode.Rebuild { "Removed class files: ${reporter.pathsAsString(removedClassFiles)}" } + val dirtyFiles = getDirtyFiles(changedFiles) - val modifiedClassFiles = changedFiles.modified.filter(File::isClassFile) - if (modifiedClassFiles.any()) return CompilationMode.Rebuild { "Modified class files: ${reporter.pathsAsString(modifiedClassFiles)}" } + fun markDirtyBy(lookupSymbols: Collection) { + if (lookupSymbols.isEmpty()) return + + val dirtyFilesFromLookups = mapLookupSymbolsToFiles(caches.lookupCache, lookupSymbols, reporter) + dirtyFiles.addAll(dirtyFilesFromLookups) + } + + fun markDirtyBy(dirtyClassesFqNames: Collection) { + if (dirtyClassesFqNames.isEmpty()) return + + val fqNamesWithSubtypes = dirtyClassesFqNames.flatMap { withSubtypes(it, listOf(caches.platformCache)) } + val dirtyFilesFromFqNames = mapClassesFqNamesToFiles(listOf(caches.platformCache), fqNamesWithSubtypes, reporter) + dirtyFiles.addAll(dirtyFilesFromFqNames) + } + + val lastBuildInfo = BuildInfo.read(lastBuildInfoFile) + reporter.report { "Last Kotlin Build info -- $lastBuildInfo" } + + val changesFromFriend by lazy { + val myLastTS = lastBuildInfo?.startTS ?: return@lazy ChangesEither.Unknown() + val storage = friendBuildHistoryFile?.let { BuildDiffsStorage.readFromFile(it, reporter) } ?: return@lazy ChangesEither.Unknown() + + val (prevDiffs, newDiffs) = storage.buildDiffs.partition { it.ts < myLastTS } + if (prevDiffs.isEmpty()) return@lazy ChangesEither.Unknown() + + val dirtyLookupSymbols = HashSet() + val dirtyClassesFqNames = HashSet() + for ((_, isIncremental, dirtyData) in newDiffs) { + if (!isIncremental) return@lazy ChangesEither.Unknown() + + dirtyLookupSymbols.addAll(dirtyData.dirtyLookupSymbols) + dirtyClassesFqNames.addAll(dirtyData.dirtyClassesFqNames) + } + + markDirtyBy(dirtyLookupSymbols) + markDirtyBy(dirtyClassesFqNames) + ChangesEither.Known(dirtyLookupSymbols, dirtyClassesFqNames) + } + val friendDirs = args.friendPaths?.map { File(it) } ?: emptyList() + for (file in changedFiles.removed.asSequence() + changedFiles.modified.asSequence()) { + if (!file.isClassFile()) continue + + val isFriendClassFile = friendDirs.any { FileUtil.isAncestor(it, file, false) } + if (isFriendClassFile && changesFromFriend is ChangesEither.Known) continue + + return CompilationMode.Rebuild { "Cannot get changes from modified or removed class file: ${reporter.pathsAsString(file)}" } + } val classpathSet = args.classpathAsList.toHashSet() val modifiedClasspathEntries = changedFiles.modified.filter { it in classpathSet } - val lastBuildInfo = BuildInfo.read(lastBuildInfoFile) - reporter.report { "Last Kotlin Build info -- $lastBuildInfo" } val classpathChanges = getClasspathChanges(modifiedClasspathEntries, lastBuildInfo) if (classpathChanges !is ChangesEither.Known) { return CompilationMode.Rebuild { "could not get changes from modified classpath entries: ${reporter.pathsAsString(modifiedClasspathEntries)}" } @@ -131,21 +176,9 @@ class IncrementalJvmCompilerRunner( is ChangesEither.Unknown -> return CompilationMode.Rebuild { "Could not get changes for java files" } } - val dirtyFiles = getDirtyFiles(changedFiles) - val lookupSymbols = HashSet() - lookupSymbols.addAll(affectedJavaSymbols) - lookupSymbols.addAll(classpathChanges.lookupSymbols) - - if (lookupSymbols.any()) { - val dirtyFilesFromLookups = mapLookupSymbolsToFiles(caches.lookupCache, lookupSymbols, reporter) - dirtyFiles.addAll(dirtyFilesFromLookups) - } - - val dirtyClassesFqNames = classpathChanges.fqNames.flatMap { withSubtypes(it, listOf(caches.platformCache)) } - if (dirtyClassesFqNames.any()) { - val dirtyFilesFromFqNames = mapClassesFqNamesToFiles(listOf(caches.platformCache), dirtyClassesFqNames, reporter) - dirtyFiles.addAll(dirtyFilesFromFqNames) - } + markDirtyBy(affectedJavaSymbols) + markDirtyBy(classpathChanges.lookupSymbols) + markDirtyBy(classpathChanges.fqNames) return CompilationMode.Incremental(dirtyFiles) } @@ -263,6 +296,23 @@ class IncrementalJvmCompilerRunner( override fun additionalDirtyLookupSymbols(): Iterable = javaFilesProcessor.allChangedSymbols + override fun processChangesAfterBuild(compilationMode: CompilationMode, currentBuildInfo: BuildInfo, dirtyData: DirtyData) { + super.processChangesAfterBuild(compilationMode, currentBuildInfo, dirtyData) + + if (buildHistoryFile == null) return + + val prevDiffs = BuildDiffsStorage.readFromFile(buildHistoryFile, reporter)?.buildDiffs ?: emptyList() + val newDiff = if (compilationMode is CompilationMode.Incremental) { + BuildDifference(currentBuildInfo.startTS, true, dirtyData) + } + else { + val emptyDirtyData = DirtyData() + BuildDifference(currentBuildInfo.startTS, false, emptyDirtyData) + } + + BuildDiffsStorage.writeToFile(buildHistoryFile, BuildDiffsStorage(prevDiffs + newDiff), reporter) + } + override fun makeServices( args: K2JVMCompilerArguments, lookupTracker: LookupTracker, diff --git a/compiler/incremental-compilation-impl/test/org/jetbrains/kotlin/incremental/BuildDiffsStorageTest.kt b/compiler/incremental-compilation-impl/test/org/jetbrains/kotlin/incremental/BuildDiffsStorageTest.kt new file mode 100644 index 00000000000..66f34b3d09a --- /dev/null +++ b/compiler/incremental-compilation-impl/test/org/jetbrains/kotlin/incremental/BuildDiffsStorageTest.kt @@ -0,0 +1,102 @@ +/* + * Copyright 2010-2017 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.incremental + +import org.jetbrains.kotlin.name.FqName +import org.junit.After +import org.junit.Assert +import org.junit.Before +import org.junit.Test +import java.io.File +import java.io.OutputStream +import java.util.* + +class BuildDiffsStorageTest { + lateinit var storageFile: File + private val random = Random(System.currentTimeMillis()) + + @Before + fun setUp() { + storageFile = File.createTempFile("BuildDiffsStorageTest", "storage") + } + + @After + fun tearDown() { + storageFile.delete() + } + + @Test + fun testToString() { + val lookupSymbols = listOf(LookupSymbol("foo", "bar")) + val fqNames = listOf(FqName("fizz.Buzz")) + val diff = BuildDifference(100, true, DirtyData(lookupSymbols, fqNames)) + val diffs = BuildDiffsStorage(listOf(diff)) + Assert.assertEquals("BuildDiffsStorage(buildDiffs=[BuildDifference(ts=100, isIncremental=true, dirtyData=DirtyData(dirtyLookupSymbols=[LookupSymbol(name=foo, scope=bar)], dirtyClassesFqNames=[fizz.Buzz]))])", + diffs.toString()) + } + + @Test + fun writeReadSimple() { + val diffs = BuildDiffsStorage(listOf(getRandomDiff())) + BuildDiffsStorage.writeToFile(storageFile, diffs, reporter = null) + + val diffsDeserialized = BuildDiffsStorage.readFromFile(storageFile, reporter = null) + Assert.assertEquals(diffs.toString(), diffsDeserialized.toString()) + } + + @Test + fun writeReadMany() { + val generated = Array(20) { getRandomDiff() }.toList() + val diffs = BuildDiffsStorage(generated) + BuildDiffsStorage.writeToFile(storageFile, diffs, reporter = null) + + val diffsDeserialized = BuildDiffsStorage.readFromFile(storageFile, reporter = null) + val expected = generated.sortedBy { it.ts }.takeLast(BuildDiffsStorage.MAX_DIFFS_ENTRIES).toTypedArray() + Assert.assertArrayEquals(expected, diffsDeserialized?.buildDiffs?.toTypedArray()) + } + + @Test + fun readFileNotExist() { + storageFile.delete() + + val diffsDeserialized = BuildDiffsStorage.readFromFile(storageFile, reporter = null) + Assert.assertEquals(null, diffsDeserialized) + } + + @Test + fun versionChanged() { + val diffs = BuildDiffsStorage(listOf(getRandomDiff())) + BuildDiffsStorage.writeToFile(storageFile, diffs, reporter = null) + + val versionBackup = BuildDiffsStorage.CURRENT_VERSION + try { + BuildDiffsStorage.CURRENT_VERSION++ + val diffsDeserialized = BuildDiffsStorage.readFromFile(storageFile, reporter = null) + Assert.assertEquals(null, diffsDeserialized) + } + finally { + BuildDiffsStorage.CURRENT_VERSION = versionBackup + } + } + + private fun getRandomDiff(): BuildDifference { + val ts = random.nextLong() + val lookupSymbols = listOf(LookupSymbol("foo", "bar")) + val fqNames = listOf(FqName("fizz.Buzz")) + return BuildDifference(ts, true, DirtyData(lookupSymbols, fqNames)) + } +} \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/KotlinGradlePluginIT.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/KotlinGradlePluginIT.kt index d8079c024bd..eb2e4f17567 100644 --- a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/KotlinGradlePluginIT.kt +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/KotlinGradlePluginIT.kt @@ -20,10 +20,7 @@ import org.gradle.api.logging.LogLevel import com.intellij.openapi.util.io.FileUtil import org.jetbrains.kotlin.gradle.plugin.CopyClassesToJavaOutputStatus import org.jetbrains.kotlin.gradle.tasks.USING_INCREMENTAL_COMPILATION_MESSAGE -import org.jetbrains.kotlin.gradle.util.checkBytecodeContains -import org.jetbrains.kotlin.gradle.util.getFileByName -import org.jetbrains.kotlin.gradle.util.getFilesByNames -import org.jetbrains.kotlin.gradle.util.modify +import org.jetbrains.kotlin.gradle.util.* import org.junit.Test import java.io.File import java.util.zip.ZipFile @@ -490,6 +487,27 @@ class KotlinGradleIT: BaseGradleIT() { } } + @Test + fun testIncrementalTestCompile() { + val project = Project("kotlinProject", GRADLE_VERSION) + val options = defaultBuildOptions().copy(incremental = true) + + project.build("build", options = options) { + assertSuccessful() + } + + val joinerKt = project.projectDir.getFileByName("KotlinGreetingJoiner.kt") + joinerKt.modify { + it.replace("class KotlinGreetingJoiner", "internal class KotlinGreetingJoiner") + } + + project.build("build", options = options) { + assertSuccessful() + val testJoinerKt = project.projectDir.getFileByName("TestKotlinGreetingJoiner.kt") + assertCompiledKotlinSources(project.relativize(joinerKt, testJoinerKt)) + } + } + @Test fun testLanguageVersionApiVersionExplicit() { val project = Project("kotlinProject", "3.3") diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/TestRootAffectedIT.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/TestRootAffectedIT.kt index 04b9d34cfb9..0eab7d30ac5 100644 --- a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/TestRootAffectedIT.kt +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/TestRootAffectedIT.kt @@ -1,15 +1,13 @@ package org.jetbrains.kotlin.gradle -import org.jetbrains.kotlin.gradle.util.allKotlinFiles import org.jetbrains.kotlin.gradle.util.getFileByName import org.jetbrains.kotlin.gradle.util.modify import org.junit.Test -import java.io.File class TestRootAffectedIT : BaseGradleIT() { @Test fun testSourceRootClassIsModifiedIC() { - val project = Project("kotlinProject", "2.10") + val project = Project("kotlinProject", "4.1") val buildOptions = defaultBuildOptions().copy(incremental = true) project.build("build", options = buildOptions) { @@ -26,8 +24,8 @@ class TestRootAffectedIT : BaseGradleIT() { project.build("build", options = buildOptions) { assertSuccessful() - val expectedToCompile = project.relativize(listOf(kotlinGreetingJoinerFile) + project.allTestKotlinFiles()) - assertCompiledKotlinSources(expectedToCompile) + val testKotlinGreetingJoinerFile = project.projectDir.getFileByName("TestKotlinGreetingJoiner.kt") + assertCompiledKotlinSources(project.relativize(kotlinGreetingJoinerFile, testKotlinGreetingJoinerFile)) } project.build("build", options = buildOptions) { @@ -38,7 +36,8 @@ class TestRootAffectedIT : BaseGradleIT() { @Test fun testSourceRootClassIsRemovedIC() { - val project = Project("kotlinProject", "2.10") + // todo: update Gradle after https://github.com/gradle/gradle/issues/3051 is resolved + val project = Project("kotlinProject", "3.0") val buildOptions = defaultBuildOptions().copy(incremental = true) project.build("build", options = buildOptions) { @@ -48,12 +47,6 @@ class TestRootAffectedIT : BaseGradleIT() { val dummyFile = project.projectDir.getFileByName("Dummy.kt") dummyFile.delete() - project.build("build", options = buildOptions) { - assertSuccessful() - val expectedToCompile = project.relativize(project.allTestKotlinFiles()) - assertCompiledKotlinSources(expectedToCompile) - } - project.build("build", options = buildOptions) { assertSuccessful() assertCompiledKotlinSources(emptyList()) @@ -62,7 +55,7 @@ class TestRootAffectedIT : BaseGradleIT() { @Test fun testTestRootClassIsRemovedIC() { - val project = Project("kotlinProject", "2.10") + val project = Project("kotlinProject", "4.1") val buildOptions = defaultBuildOptions().copy(incremental = true) project.build("build", options = buildOptions) { @@ -76,13 +69,5 @@ class TestRootAffectedIT : BaseGradleIT() { assertSuccessful() assertCompiledKotlinSources(emptyList()) } - - project.build("build", options = buildOptions) { - assertSuccessful() - assertCompiledKotlinSources(emptyList()) - } } - - private fun Project.allTestKotlinFiles(): Iterable = - File(projectDir, "src/test").allKotlinFiles() } \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/compilerRunner/GradleCompilerEnvironment.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/compilerRunner/GradleCompilerEnvironment.kt index b37381c5b28..640e6e799f3 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/compilerRunner/GradleCompilerEnvironment.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/compilerRunner/GradleCompilerEnvironment.kt @@ -36,5 +36,7 @@ internal class GradleIncrementalCompilerEnvironment( compilerArgs: CommonCompilerArguments, val kaptAnnotationsFileUpdater: AnnotationFileUpdater? = null, val artifactDifferenceRegistryProvider: ArtifactDifferenceRegistryProvider? = null, - val artifactFile: File? = null + val artifactFile: File? = null, + val buildHistoryFile: File? = null, + val friendBuildHistoryFile: File? = null ) : GradleCompilerEnvironment(compilerClasspath, messageCollector, outputItemsCollector, compilerArgs) \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/compilerRunner/GradleKotlinCompilerRunner.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/compilerRunner/GradleKotlinCompilerRunner.kt index 52f0f88b03d..a117ea566c3 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/compilerRunner/GradleKotlinCompilerRunner.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/compilerRunner/GradleKotlinCompilerRunner.kt @@ -255,7 +255,9 @@ internal class GradleCompilerRunner(private val project: Project) : KotlinCompil reportSeverity = reportSeverity(verbose), requestedCompilationResults = arrayOf(CompilationResultCategory.IC_COMPILE_ITERATION.code), compilerMode = CompilerMode.INCREMENTAL_COMPILER, - targetPlatform = targetPlatform + targetPlatform = targetPlatform, + resultDifferenceFile = environment.buildHistoryFile, + friendDifferenceFile = environment.friendBuildHistoryFile ) val servicesFacade = GradleIncrementalCompilerServicesFacadeImpl(project, environment) val argsArray = ArgumentUtils.convertArgumentsToStringList(environment.compilerArgs).toTypedArray() diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/tasks/Tasks.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/tasks/Tasks.kt index 376edf79f86..7f6c9f133db 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/tasks/Tasks.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/tasks/Tasks.kt @@ -243,6 +243,7 @@ open class KotlinCompile : AbstractKotlinCompile(), Kotl internal open val sourceRootsContainer = FilteringSourceRootsContainer() private var kaptAnnotationsFileUpdater: AnnotationFileUpdater? = null + val buildHistoryFile: File = File(taskBuildDirectory, "build-history.bin") val kaptOptions = KaptOptions() @@ -316,10 +317,13 @@ open class KotlinCompile : AbstractKotlinCompile(), Kotl !incremental -> GradleCompilerEnvironment(computedCompilerClasspath, messageCollector, outputItemCollector, args) else -> { logger.warn(USING_INCREMENTAL_COMPILATION_MESSAGE) + val friendTask = friendTaskName?.let { project.tasks.findByName(it) as? KotlinCompile } GradleIncrementalCompilerEnvironment(computedCompilerClasspath, changedFiles, reporter, taskBuildDirectory, messageCollector, outputItemCollector, args, kaptAnnotationsFileUpdater, artifactDifferenceRegistryProvider, - artifactFile) + artifactFile = artifactFile, + buildHistoryFile = buildHistoryFile, + friendBuildHistoryFile = friendTask?.buildHistoryFile) } } From 13bf35f48eda7564b2abdc5bfb52259eaa723821 Mon Sep 17 00:00:00 2001 From: Denis Zharkov Date: Thu, 28 Sep 2017 15:29:26 +0300 Subject: [PATCH 155/212] Make TYPE_USE default qualifiers overriding all other applicabilities If there is default qualifier with TYPE_USE closer than one with METHOD then its nullability should be considered even when enhancing return type #KT-20016 Fixed --- .../tests/jsr305/typeUseVsMethodConflict.kt | 80 +++++++++++++++++++ .../tests/jsr305/typeUseVsMethodConflict.txt | 32 ++++++++ ...sNoAnnotationInClasspathTestGenerated.java | 6 ++ ...pathWithFastClassReadingTestGenerated.java | 6 ++ .../ForeignJava8AnnotationsTestGenerated.java | 6 ++ ...cForeignJava8AnnotationsTestGenerated.java | 6 ++ .../java/AnnotationTypeQualifierResolver.kt | 8 +- .../kotlin/load/java/lazy/context.kt | 5 +- 8 files changed, 143 insertions(+), 6 deletions(-) create mode 100644 compiler/testData/foreignAnnotationsJava8/tests/jsr305/typeUseVsMethodConflict.kt create mode 100644 compiler/testData/foreignAnnotationsJava8/tests/jsr305/typeUseVsMethodConflict.txt diff --git a/compiler/testData/foreignAnnotationsJava8/tests/jsr305/typeUseVsMethodConflict.kt b/compiler/testData/foreignAnnotationsJava8/tests/jsr305/typeUseVsMethodConflict.kt new file mode 100644 index 00000000000..d9931c5c933 --- /dev/null +++ b/compiler/testData/foreignAnnotationsJava8/tests/jsr305/typeUseVsMethodConflict.kt @@ -0,0 +1,80 @@ +// !DIAGNOSTICS: -UNUSED_VARIABLE -UNUSED_PARAMETER +// SKIP_JAVAC +// SKIP_COMPILED_JAVA + +// FILE: spr/NonNullApi.java + +package spr; + +import java.lang.annotation.Documented; +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; +import javax.annotation.Nonnull; +import javax.annotation.meta.TypeQualifierDefault; + +@Target({ElementType.TYPE, ElementType.TYPE_USE}) +@Retention(RetentionPolicy.RUNTIME) +@Documented +@Nonnull +@TypeQualifierDefault({ElementType.TYPE_USE, ElementType.METHOD}) +public @interface NonNullApi { +} + +// FILE: spr/NullableApi.java + +package spr; + +import java.lang.annotation.Documented; +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; +import javax.annotation.Nonnull; +import javax.annotation.meta.TypeQualifierDefault; +import javax.annotation.meta.When; + +@Target({ElementType.TYPE_USE}) +@Retention(RetentionPolicy.RUNTIME) +@Documented +@Nonnull(when = When.MAYBE) +@TypeQualifierDefault({ElementType.TYPE_USE}) +public @interface NullableApi { +} + +// FILE: A.java + +import spr.*; +import java.util.*; + +@NonNullApi +public class A { + public String foo(String x) { return ""; } + public @NullableApi String bar(@NullableApi String y) { return ""; } + public @NullableApi List baz1() { return null; } + public List<@NullableApi String> baz2() { return null; } + public @NullableApi List<@NonNullApi String> baz3() { return null; } +} + +// FILE: main.kt + +fun main(a: A) { + a.foo("").length + a.foo(null)?.length + + a.bar("").length + a.bar(null)?.length + + a.baz1().get(0).length + a.baz1()!!.get(0).length + a.baz1()!!.get(0)?.length + + a.baz2().get(0).length + a.baz2()!!.get(0).length + a.baz2()!!.get(0)?.length + + a.baz3().get(0).length + a.baz3()!!.get(0).length + a.baz3()!!.get(0)?.length +} diff --git a/compiler/testData/foreignAnnotationsJava8/tests/jsr305/typeUseVsMethodConflict.txt b/compiler/testData/foreignAnnotationsJava8/tests/jsr305/typeUseVsMethodConflict.txt new file mode 100644 index 00000000000..2cf8d4c01fb --- /dev/null +++ b/compiler/testData/foreignAnnotationsJava8/tests/jsr305/typeUseVsMethodConflict.txt @@ -0,0 +1,32 @@ +package + +public fun main(/*0*/ a: A): kotlin.Unit + +@spr.NonNullApi public open class A { + public constructor A() + @spr.NullableApi public open fun bar(/*0*/ @spr.NullableApi y: @spr.NullableApi kotlin.String?): @spr.NullableApi kotlin.String? + @spr.NullableApi public open fun baz1(): (@spr.NullableApi kotlin.collections.MutableList?..@spr.NullableApi kotlin.collections.List?) + public open fun baz2(): kotlin.collections.(Mutable)List<@spr.NullableApi kotlin.String?> + @spr.NullableApi public open fun baz3(): (@spr.NullableApi kotlin.collections.MutableList<@spr.NonNullApi kotlin.String>?..@spr.NullableApi kotlin.collections.List<@spr.NonNullApi kotlin.String>?) + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open fun foo(/*0*/ x: kotlin.String): kotlin.String + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String +} + +package spr { + + @kotlin.annotation.Target(allowedTargets = {AnnotationTarget.CLASS, AnnotationTarget.FILE, AnnotationTarget.TYPE}) @kotlin.annotation.Retention(value = AnnotationRetention.RUNTIME) @kotlin.annotation.MustBeDocumented @javax.annotation.Nonnull @javax.annotation.meta.TypeQualifierDefault(value = {ElementType.TYPE_USE, ElementType.METHOD}) public final annotation class NonNullApi : kotlin.Annotation { + public constructor NonNullApi() + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String + } + + @kotlin.annotation.Target(allowedTargets = {AnnotationTarget.TYPE}) @kotlin.annotation.Retention(value = AnnotationRetention.RUNTIME) @kotlin.annotation.MustBeDocumented @javax.annotation.Nonnull(when = When.MAYBE) @javax.annotation.meta.TypeQualifierDefault(value = {ElementType.TYPE_USE}) public final annotation class NullableApi : kotlin.Annotation { + public constructor NullableApi() + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String + } +} diff --git a/compiler/tests-java8/tests/org/jetbrains/kotlin/checkers/ForeignJava8AnnotationsNoAnnotationInClasspathTestGenerated.java b/compiler/tests-java8/tests/org/jetbrains/kotlin/checkers/ForeignJava8AnnotationsNoAnnotationInClasspathTestGenerated.java index 9e2d1b7cc9e..4e59e622e7b 100644 --- a/compiler/tests-java8/tests/org/jetbrains/kotlin/checkers/ForeignJava8AnnotationsNoAnnotationInClasspathTestGenerated.java +++ b/compiler/tests-java8/tests/org/jetbrains/kotlin/checkers/ForeignJava8AnnotationsNoAnnotationInClasspathTestGenerated.java @@ -79,6 +79,12 @@ public class ForeignJava8AnnotationsNoAnnotationInClasspathTestGenerated extends String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotationsJava8/tests/jsr305/typeArguments.kt"); doTest(fileName); } + + @TestMetadata("typeUseVsMethodConflict.kt") + public void testTypeUseVsMethodConflict() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotationsJava8/tests/jsr305/typeUseVsMethodConflict.kt"); + doTest(fileName); + } } @TestMetadata("compiler/testData/foreignAnnotationsJava8/tests/typeEnhancement") diff --git a/compiler/tests-java8/tests/org/jetbrains/kotlin/checkers/ForeignJava8AnnotationsNoAnnotationInClasspathWithFastClassReadingTestGenerated.java b/compiler/tests-java8/tests/org/jetbrains/kotlin/checkers/ForeignJava8AnnotationsNoAnnotationInClasspathWithFastClassReadingTestGenerated.java index 55cfc358e17..33ac4d93fbf 100644 --- a/compiler/tests-java8/tests/org/jetbrains/kotlin/checkers/ForeignJava8AnnotationsNoAnnotationInClasspathWithFastClassReadingTestGenerated.java +++ b/compiler/tests-java8/tests/org/jetbrains/kotlin/checkers/ForeignJava8AnnotationsNoAnnotationInClasspathWithFastClassReadingTestGenerated.java @@ -79,6 +79,12 @@ public class ForeignJava8AnnotationsNoAnnotationInClasspathWithFastClassReadingT String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotationsJava8/tests/jsr305/typeArguments.kt"); doTest(fileName); } + + @TestMetadata("typeUseVsMethodConflict.kt") + public void testTypeUseVsMethodConflict() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotationsJava8/tests/jsr305/typeUseVsMethodConflict.kt"); + doTest(fileName); + } } @TestMetadata("compiler/testData/foreignAnnotationsJava8/tests/typeEnhancement") diff --git a/compiler/tests-java8/tests/org/jetbrains/kotlin/checkers/ForeignJava8AnnotationsTestGenerated.java b/compiler/tests-java8/tests/org/jetbrains/kotlin/checkers/ForeignJava8AnnotationsTestGenerated.java index be60ddb5e36..5822c98f8e3 100644 --- a/compiler/tests-java8/tests/org/jetbrains/kotlin/checkers/ForeignJava8AnnotationsTestGenerated.java +++ b/compiler/tests-java8/tests/org/jetbrains/kotlin/checkers/ForeignJava8AnnotationsTestGenerated.java @@ -79,6 +79,12 @@ public class ForeignJava8AnnotationsTestGenerated extends AbstractForeignJava8An String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotationsJava8/tests/jsr305/typeArguments.kt"); doTest(fileName); } + + @TestMetadata("typeUseVsMethodConflict.kt") + public void testTypeUseVsMethodConflict() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotationsJava8/tests/jsr305/typeUseVsMethodConflict.kt"); + doTest(fileName); + } } @TestMetadata("compiler/testData/foreignAnnotationsJava8/tests/typeEnhancement") diff --git a/compiler/tests-java8/tests/org/jetbrains/kotlin/checkers/javac/JavacForeignJava8AnnotationsTestGenerated.java b/compiler/tests-java8/tests/org/jetbrains/kotlin/checkers/javac/JavacForeignJava8AnnotationsTestGenerated.java index b54e4241237..ab8fa8f1b6d 100644 --- a/compiler/tests-java8/tests/org/jetbrains/kotlin/checkers/javac/JavacForeignJava8AnnotationsTestGenerated.java +++ b/compiler/tests-java8/tests/org/jetbrains/kotlin/checkers/javac/JavacForeignJava8AnnotationsTestGenerated.java @@ -79,6 +79,12 @@ public class JavacForeignJava8AnnotationsTestGenerated extends AbstractJavacFore String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotationsJava8/tests/jsr305/typeArguments.kt"); doTest(fileName); } + + @TestMetadata("typeUseVsMethodConflict.kt") + public void testTypeUseVsMethodConflict() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotationsJava8/tests/jsr305/typeUseVsMethodConflict.kt"); + doTest(fileName); + } } @TestMetadata("compiler/testData/foreignAnnotationsJava8/tests/typeEnhancement") diff --git a/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/AnnotationTypeQualifierResolver.kt b/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/AnnotationTypeQualifierResolver.kt index 2bc0f256b7d..db0150fb6e9 100644 --- a/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/AnnotationTypeQualifierResolver.kt +++ b/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/AnnotationTypeQualifierResolver.kt @@ -42,10 +42,14 @@ class AnnotationTypeQualifierResolver(storageManager: StorageManager, val jsr305 private val typeQualifier: AnnotationDescriptor, private val applicability: Int ) { - private fun isApplicableTo(elementType: QualifierApplicabilityType) = (applicability and (1 shl elementType.ordinal)) != 0 - operator fun component1() = typeQualifier operator fun component2() = QualifierApplicabilityType.values().filter(this::isApplicableTo) + + private fun isApplicableTo(elementType: QualifierApplicabilityType) = + isApplicableConsideringMask(QualifierApplicabilityType.TYPE_USE) || isApplicableConsideringMask(elementType) + + private fun isApplicableConsideringMask(elementType: QualifierApplicabilityType) = + (applicability and (1 shl elementType.ordinal)) != 0 } private val resolvedNicknames = diff --git a/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/lazy/context.kt b/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/lazy/context.kt index 6ee1f4778b5..4fa7f711b58 100644 --- a/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/lazy/context.kt +++ b/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/lazy/context.kt @@ -78,10 +78,7 @@ class JavaTypeQualifiersByElementType( operator fun get( applicabilityType: AnnotationTypeQualifierResolver.QualifierApplicabilityType? ): JavaTypeQualifiers? { - val nullabilityQualifierWithMigrationStatus = - nullabilityQualifiers[applicabilityType] - ?: nullabilityQualifiers[AnnotationTypeQualifierResolver.QualifierApplicabilityType.TYPE_USE] - ?: return null + val nullabilityQualifierWithMigrationStatus = nullabilityQualifiers[applicabilityType] ?: return null return JavaTypeQualifiers( nullabilityQualifierWithMigrationStatus.qualifier, null, From 676e5d2a887813e99f6119a4ddb19d84a0a5502f Mon Sep 17 00:00:00 2001 From: Simon Ogorodnik Date: Fri, 29 Sep 2017 14:20:26 +0300 Subject: [PATCH 156/212] Add 1.2-Beta to changelog --- ChangeLog.md | 78 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 78 insertions(+) diff --git a/ChangeLog.md b/ChangeLog.md index 6bde6ee6116..cf092be65b7 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -3,6 +3,84 @@ +## 1.2-Beta + +### Android + +#### New Features + +- [`KT-20051`](https://youtrack.jetbrains.com/issue/KT-20051) Quickfixes to support @Parcelize +#### Fixes + +- [`KT-19747`](https://youtrack.jetbrains.com/issue/KT-19747) Android extensions + Parcelable: VerifyError in case of RawValue annotation on a type when it's unknown how to parcel it +- [`KT-19899`](https://youtrack.jetbrains.com/issue/KT-19899) Parcelize: Building with ProGuard enabled +- [`KT-19988`](https://youtrack.jetbrains.com/issue/KT-19988) [Android Extensions] inner class LayoutContainer causes NoSuchMethodError +- [`KT-20002`](https://youtrack.jetbrains.com/issue/KT-20002) Parcelize explodes on LongArray +- [`KT-20019`](https://youtrack.jetbrains.com/issue/KT-20019) Parcelize does not propogate flags argument when writing nested Parcelable +- [`KT-20020`](https://youtrack.jetbrains.com/issue/KT-20020) Parcelize does not use primitive array read/write methods on Parcel +- [`KT-20021`](https://youtrack.jetbrains.com/issue/KT-20021) Parcelize does not serialize Parcelable enum as Parcelable +- [`KT-20022`](https://youtrack.jetbrains.com/issue/KT-20022) Parcelize should dispatch directly to java.lang.Enum when writing an enum. +- [`KT-20034`](https://youtrack.jetbrains.com/issue/KT-20034) Application installation failed (INSTALL_FAILED_DEXOPT) in Android 4.3 devices if I use Parcelize +- [`KT-20057`](https://youtrack.jetbrains.com/issue/KT-20057) Parcelize should use specialized write/create methods where available. +- [`KT-20062`](https://youtrack.jetbrains.com/issue/KT-20062) Parceler should allow otherwise un-parcelable property types in enclosing class. +- [`KT-20170`](https://youtrack.jetbrains.com/issue/KT-20170) UAST: Getting the location of a UIdentifier is tricky + +### Compiler + +- [`KT-4565`](https://youtrack.jetbrains.com/issue/KT-4565) Support smart casting of safe cast's subject (and also safe call's receiver) +- [`KT-8492`](https://youtrack.jetbrains.com/issue/KT-8492) Null check should work after save call with elvis in condition +- [`KT-9327`](https://youtrack.jetbrains.com/issue/KT-9327) Need a way to check whether a lateinit property was assigned +- [`KT-14138`](https://youtrack.jetbrains.com/issue/KT-14138) Allow lateinit local variables +- [`KT-15461`](https://youtrack.jetbrains.com/issue/KT-15461) Allow lateinit top level properties +- [`KT-7257`](https://youtrack.jetbrains.com/issue/KT-7257) NPE when accessing properties of enum from inner lambda on initialization +- [`KT-9580`](https://youtrack.jetbrains.com/issue/KT-9580) Report an error if 'setparam' target does not make sense for a parameter declaration +- [`KT-16310`](https://youtrack.jetbrains.com/issue/KT-16310) Nested classes inside enum entries capturing outer members +- [`KT-20155`](https://youtrack.jetbrains.com/issue/KT-20155) Confusing diagnostics on a nested interface in inner class + +### IDE + +- [`KT-14175`](https://youtrack.jetbrains.com/issue/KT-14175) Surround with try ... catch (... finally) doesn't work for expressions +- [`KT-20308`](https://youtrack.jetbrains.com/issue/KT-20308) New Gradle with Kotlin DSL project wizard +- [`KT-18353`](https://youtrack.jetbrains.com/issue/KT-18353) Support UAST for .kts files +- [`KT-19823`](https://youtrack.jetbrains.com/issue/KT-19823) Kotlin Gradle project import into IntelliJ: import kapt generated classes into classpath +- [`KT-20185`](https://youtrack.jetbrains.com/issue/KT-20185) Stub and PSI element type mismatch for "var nullableSuspend: (suspend (P) -> Unit)? = null" + +### Language design + +- [`KT-14486`](https://youtrack.jetbrains.com/issue/KT-14486) Allow smart cast in closure if a local variable is modified only before it (and not after or inside) +- [`KT-15667`](https://youtrack.jetbrains.com/issue/KT-15667) Support "::foo" as a short-hand syntax for bound callable reference to "this::foo" +- [`KT-16681`](https://youtrack.jetbrains.com/issue/KT-16681) kotlin allows mutating the field of read-only property + +### Libraries + +- [`KT-19258`](https://youtrack.jetbrains.com/issue/KT-19258) Java 9: module-info.java with `requires kotlin.stdlib` causes compiler to fail: "module reads package from both kotlin.reflect and kotlin.stdlib" + +### Tools + +- [`KT-19692`](https://youtrack.jetbrains.com/issue/KT-19692) kotlin-jpa plugin doesn't support @MappedSuperclass annotation +- [`KT-20030`](https://youtrack.jetbrains.com/issue/KT-20030) Parcelize can directly reference writeToParcel and CREATOR for final, non-Parcelize Parcelable types in same compilation unit. +- [`KT-19742`](https://youtrack.jetbrains.com/issue/KT-19742) [Android extensions] Calling clearFindViewByIdCache causes NPE +- [`KT-19749`](https://youtrack.jetbrains.com/issue/KT-19749) Android extensions + Parcelable: NoSuchMethodError on attempt to pack into parcel a serializable object +- [`KT-20026`](https://youtrack.jetbrains.com/issue/KT-20026) Parcelize overrides describeContents despite being already implemented. +- [`KT-20027`](https://youtrack.jetbrains.com/issue/KT-20027) Parcelize uses wrong classloader when reading parcelable type. +- [`KT-20029`](https://youtrack.jetbrains.com/issue/KT-20029) Parcelize should not directly reference parcel methods on types outside compilation unit +- [`KT-20032`](https://youtrack.jetbrains.com/issue/KT-20032) Parcelize does not respect type nullability in case of Parcelize parcelables + +### Tools. CLI + +- [`KT-10563`](https://youtrack.jetbrains.com/issue/KT-10563) Support a command line argument -Werror to treat warnings as errors + +### Tools. Gradle + +- [`KT-20212`](https://youtrack.jetbrains.com/issue/KT-20212) Cannot access internal components from test code + +### Tools. kapt + +- [`KT-17923`](https://youtrack.jetbrains.com/issue/KT-17923) Reference to Dagger generated class is highlighted red +- [`KT-18923`](https://youtrack.jetbrains.com/issue/KT-18923) Kapt: Do not use the Kotlin error message collector to issue errors from kapt +- [`KT-19097`](https://youtrack.jetbrains.com/issue/KT-19097) Request: Decent support of `kapt.kotlin.generated` on Intellij/Android Studio +- [`KT-20001`](https://youtrack.jetbrains.com/issue/KT-20001) kapt generate stubs Gradle task does not depend on the compilation of sub-project kapt dependencies + ## 1.1.50 ### Android From 43c6f8b9b14ddd304ae1471faa254c04b15a141f Mon Sep 17 00:00:00 2001 From: Alexey Andreev Date: Tue, 26 Sep 2017 16:20:07 +0300 Subject: [PATCH 157/212] JS: fix copying fun with default args from interface to abstract class See KT-20451 --- ...heritedFromInterfaceViaAbstractSuperclass.kt | 17 +++++++++++++++++ .../ir/IrBlackBoxCodegenTestGenerated.java | 6 ++++++ .../codegen/BlackBoxCodegenTestGenerated.java | 6 ++++++ .../codegen/LightAnalysisModeTestGenerated.java | 6 ++++++ .../semantics/JsCodegenBoxTestGenerated.java | 6 ++++++ .../declaration/ClassModelGenerator.kt | 9 ++++++--- 6 files changed, 47 insertions(+), 3 deletions(-) create mode 100644 compiler/testData/codegen/box/defaultArguments/inheritedFromInterfaceViaAbstractSuperclass.kt diff --git a/compiler/testData/codegen/box/defaultArguments/inheritedFromInterfaceViaAbstractSuperclass.kt b/compiler/testData/codegen/box/defaultArguments/inheritedFromInterfaceViaAbstractSuperclass.kt new file mode 100644 index 00000000000..b74007df30e --- /dev/null +++ b/compiler/testData/codegen/box/defaultArguments/inheritedFromInterfaceViaAbstractSuperclass.kt @@ -0,0 +1,17 @@ +interface I { + fun foo(x: Int = 23): String +} + +abstract class Base : I + +class C : Base(), I { + override fun foo(x: Int) = "C:$x" +} + +fun box(): String { + val x: I = C() + val r = x.foo() + ";" + x.foo(42) + if (r != "C:23;C:42") return "fail: $r" + + return "OK" +} \ No newline at end of file diff --git a/compiler/tests-ir-jvm/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java b/compiler/tests-ir-jvm/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java index 80800891a98..432c90eac09 100644 --- a/compiler/tests-ir-jvm/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java +++ b/compiler/tests-ir-jvm/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java @@ -6479,6 +6479,12 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes throw new AssertionError("Looks like this test can be unmuted. Remove IGNORE_BACKEND directive for that."); } + @TestMetadata("inheritedFromInterfaceViaAbstractSuperclass.kt") + public void testInheritedFromInterfaceViaAbstractSuperclass() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/defaultArguments/inheritedFromInterfaceViaAbstractSuperclass.kt"); + doTest(fileName); + } + @TestMetadata("kt6382.kt") public void testKt6382() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/defaultArguments/kt6382.kt"); diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java index cca5d666cd8..76893a87724 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java @@ -6479,6 +6479,12 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest { throw new AssertionError("Looks like this test can be unmuted. Remove IGNORE_BACKEND directive for that."); } + @TestMetadata("inheritedFromInterfaceViaAbstractSuperclass.kt") + public void testInheritedFromInterfaceViaAbstractSuperclass() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/defaultArguments/inheritedFromInterfaceViaAbstractSuperclass.kt"); + doTest(fileName); + } + @TestMetadata("kt6382.kt") public void testKt6382() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/defaultArguments/kt6382.kt"); diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java index a97ded3eadf..93dee7c4d1f 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java @@ -6479,6 +6479,12 @@ public class LightAnalysisModeTestGenerated extends AbstractLightAnalysisModeTes KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("compiler/testData/codegen/box/defaultArguments"), Pattern.compile("^(.+)\\.kt$"), TargetBackend.JVM, true); } + @TestMetadata("inheritedFromInterfaceViaAbstractSuperclass.kt") + public void testInheritedFromInterfaceViaAbstractSuperclass() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/defaultArguments/inheritedFromInterfaceViaAbstractSuperclass.kt"); + doTest(fileName); + } + @TestMetadata("kt6382.kt") public void testKt6382() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/defaultArguments/kt6382.kt"); diff --git a/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/JsCodegenBoxTestGenerated.java b/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/JsCodegenBoxTestGenerated.java index 7a0d53e6ca3..f7196604228 100644 --- a/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/JsCodegenBoxTestGenerated.java +++ b/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/JsCodegenBoxTestGenerated.java @@ -7151,6 +7151,12 @@ public class JsCodegenBoxTestGenerated extends AbstractJsCodegenBoxTest { doTest(fileName); } + @TestMetadata("inheritedFromInterfaceViaAbstractSuperclass.kt") + public void testInheritedFromInterfaceViaAbstractSuperclass() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/defaultArguments/inheritedFromInterfaceViaAbstractSuperclass.kt"); + doTest(fileName); + } + @TestMetadata("kt6382.kt") public void testKt6382() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/defaultArguments/kt6382.kt"); diff --git a/js/js.translator/src/org/jetbrains/kotlin/js/translate/declaration/ClassModelGenerator.kt b/js/js.translator/src/org/jetbrains/kotlin/js/translate/declaration/ClassModelGenerator.kt index 83b68ab0bc7..241ed123c7b 100644 --- a/js/js.translator/src/org/jetbrains/kotlin/js/translate/declaration/ClassModelGenerator.kt +++ b/js/js.translator/src/org/jetbrains/kotlin/js/translate/declaration/ClassModelGenerator.kt @@ -54,7 +54,7 @@ class ClassModelGenerator(val context: TranslationContext) { // Traverse fake non-abstract member. Current class does not provide their implementation, // it can be inherited from interface. - for (member in members.filter { !it.kind.isReal && it.modality != Modality.ABSTRACT }) { + for (member in members.filter { !it.kind.isReal }) { if (member is FunctionDescriptor) { tryCopyWhenImplementingInterfaceWithDefaultArgs(member, model) } @@ -63,7 +63,7 @@ class ClassModelGenerator(val context: TranslationContext) { // Copy *implementation* functions (i.e. those ones which end with `$default` suffix) // of Kotlin functions with optional parameters. - if (member is FunctionDescriptor && !hasImplementationInPrototype(member)) { + if (member is FunctionDescriptor && !hasImplementationInPrototype(member) && member.modality != Modality.ABSTRACT) { copyMemberWithOptionalArgs(descriptor, member, model, Namer.DEFAULT_PARAMETER_IMPLEMENTOR_SUFFIX) } } @@ -155,7 +155,10 @@ class ClassModelGenerator(val context: TranslationContext) { // When none found, we have nothing to copy, ignore. // When multiple found, our current class should provide implementation, ignore. val memberToCopy = member.findNonRepeatingOverriddenDescriptors({ overriddenDescriptors }, { original }) - .singleOrNull { it.modality != Modality.ABSTRACT } ?: return null + .singleOrNull { + it.modality != Modality.ABSTRACT || + (it is FunctionDescriptor && it.hasOwnParametersWithDefaultValue()) + } ?: return null // If found member is not from interface, we don't need to copy it, it's already in prototype if ((memberToCopy.containingDeclaration as ClassDescriptor).kind != ClassKind.INTERFACE) return null From bf87826dd130b8a3908037bec079e43f34bcdcd5 Mon Sep 17 00:00:00 2001 From: Alexey Andreev Date: Wed, 27 Sep 2017 13:54:34 +0300 Subject: [PATCH 158/212] JS: add test to prove that KT-15622 is no more reproducible --- .../js/test/semantics/BoxJsTestGenerated.java | 6 +++ .../box/coroutines/nativeExceptions.kt | 53 +++++++++++++++++++ 2 files changed, 59 insertions(+) create mode 100644 js/js.translator/testData/box/coroutines/nativeExceptions.kt diff --git a/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/BoxJsTestGenerated.java b/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/BoxJsTestGenerated.java index 707fac75316..132db01c201 100644 --- a/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/BoxJsTestGenerated.java +++ b/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/BoxJsTestGenerated.java @@ -925,6 +925,12 @@ public class BoxJsTestGenerated extends AbstractBoxJsTest { String fileName = KotlinTestUtils.navigationMetadata("js/js.translator/testData/box/coroutines/localVarOptimization.kt"); doTest(fileName); } + + @TestMetadata("nativeExceptions.kt") + public void testNativeExceptions() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("js/js.translator/testData/box/coroutines/nativeExceptions.kt"); + doTest(fileName); + } } @TestMetadata("js/js.translator/testData/box/crossModuleRef") diff --git a/js/js.translator/testData/box/coroutines/nativeExceptions.kt b/js/js.translator/testData/box/coroutines/nativeExceptions.kt new file mode 100644 index 00000000000..b610f0b5807 --- /dev/null +++ b/js/js.translator/testData/box/coroutines/nativeExceptions.kt @@ -0,0 +1,53 @@ +// EXPECTED_REACHABLE_NODES: 1123 +import kotlin.coroutines.experimental.* +import kotlin.coroutines.experimental.intrinsics.* + +private var next: () -> Unit = {} +private var stopped = false + +suspend fun delay(): Unit = suspendCoroutine { c -> + next = { c.resume(Unit) } +} + +fun build(c: suspend () -> Unit) { + c.startCoroutine(object : Continuation { + override fun resume(x: Unit) { + stopped = true + } + + override fun resumeWithException(x: Throwable) { + stopped = true + } + + override val context = EmptyCoroutineContext + }) +} + +fun box(): String { + var log = "" + + build { + try { + log += "before delay;" + delay() + log += "after delay;" + js("undefined").lalala + log += "ignore;" + } + catch (e: dynamic) { + log += "caught ${e.name};" + } + finally { + log += "finally;" + } + } + + while (!stopped) { + log += "@;" + next() + } + + if (log != "before delay;@;after delay;caught TypeError;finally;") return "fail: $log" + + return "OK" +} \ No newline at end of file From 992cc61abc8d3025d4e5b4dc8b1b7b891e74fd75 Mon Sep 17 00:00:00 2001 From: Alexey Andreev Date: Wed, 27 Sep 2017 14:05:23 +0300 Subject: [PATCH 159/212] JS: prove that KT-15292 is no more reproducible --- .../kotlin/js/test/JsLineNumberTestGenerated.java | 6 ++++++ .../testData/lineNumbers/coroutineNullAssertion.kt | 11 +++++++++++ 2 files changed, 17 insertions(+) create mode 100644 js/js.translator/testData/lineNumbers/coroutineNullAssertion.kt diff --git a/js/js.tests/test/org/jetbrains/kotlin/js/test/JsLineNumberTestGenerated.java b/js/js.tests/test/org/jetbrains/kotlin/js/test/JsLineNumberTestGenerated.java index ced2d2bc304..73c1f42009b 100644 --- a/js/js.tests/test/org/jetbrains/kotlin/js/test/JsLineNumberTestGenerated.java +++ b/js/js.tests/test/org/jetbrains/kotlin/js/test/JsLineNumberTestGenerated.java @@ -90,6 +90,12 @@ public class JsLineNumberTestGenerated extends AbstractJsLineNumberTest { doTest(fileName); } + @TestMetadata("coroutineNullAssertion.kt") + public void testCoroutineNullAssertion() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("js/js.translator/testData/lineNumbers/coroutineNullAssertion.kt"); + doTest(fileName); + } + @TestMetadata("dataClass.kt") public void testDataClass() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("js/js.translator/testData/lineNumbers/dataClass.kt"); diff --git a/js/js.translator/testData/lineNumbers/coroutineNullAssertion.kt b/js/js.translator/testData/lineNumbers/coroutineNullAssertion.kt new file mode 100644 index 00000000000..6bde8933151 --- /dev/null +++ b/js/js.translator/testData/lineNumbers/coroutineNullAssertion.kt @@ -0,0 +1,11 @@ +suspend fun foo() { + delay() + null!! + delay() + println("OK") +} + +suspend fun delay() { +} + +// LINES: 6 1 1 1 1 6 1 1 * 6 2 2 2 2 2 * 3 3 4 4 4 4 4 5 5 * 9 \ No newline at end of file From bad50c03a7f92c160633df9b8b0b6460c8e38ce6 Mon Sep 17 00:00:00 2001 From: Alexey Andreev Date: Mon, 11 Sep 2017 15:07:58 +0300 Subject: [PATCH 160/212] JS: support cross-module inlining of suspend functions See KT-18063 --- .../js/ast/DebugJsAstProtoBuf.java | 46 +++++++- .../multiModule/inlineMultiModule.kt | 69 ++++++++++++ .../multiModule/inlineMultiModuleOverride.kt | 80 ++++++++++++++ .../inlineMultiModuleWithController.kt | 77 +++++++++++++ .../ir/IrBlackBoxCodegenTestGenerated.java | 24 +++++ .../codegen/BlackBoxCodegenTestGenerated.java | 24 +++++ .../LightAnalysisModeTestGenerated.java | 24 +++++ .../js/backend/ast/JsVisitorWithContext.java | 19 ++++ .../ast/metadata/metadataProperties.kt | 4 + .../kotlin/js/inline/FunctionReader.kt | 27 +++-- .../jetbrains/kotlin/js/inline/JsInliner.java | 2 + js/js.libraries/src/js/markerFunctions.js | 13 +++ js/js.serializer/src/js-ast.proto | 4 + .../serialization/js/ast/JsAstDeserializer.kt | 4 + .../serialization/js/ast/JsAstProtoBuf.java | 36 +++++++ .../serialization/js/ast/JsAstSerializer.kt | 4 + .../semantics/JsCodegenBoxTestGenerated.java | 18 ++++ .../kotlin/js/translate/context/Namer.java | 24 +---- .../declaration/AbstractDeclarationVisitor.kt | 42 ++++++-- .../declaration/inlineCoroutineUtil.kt | 101 ++++++++++++++++++ .../expression/FunctionTranslator.kt | 2 +- .../js/translate/utils/TranslationUtils.java | 2 +- 22 files changed, 599 insertions(+), 47 deletions(-) create mode 100644 compiler/testData/codegen/box/coroutines/multiModule/inlineMultiModule.kt create mode 100644 compiler/testData/codegen/box/coroutines/multiModule/inlineMultiModuleOverride.kt create mode 100644 compiler/testData/codegen/box/coroutines/multiModule/inlineMultiModuleWithController.kt create mode 100644 js/js.translator/src/org/jetbrains/kotlin/js/translate/declaration/inlineCoroutineUtil.kt diff --git a/build-common/test/org/jetbrains/kotlin/serialization/js/ast/DebugJsAstProtoBuf.java b/build-common/test/org/jetbrains/kotlin/serialization/js/ast/DebugJsAstProtoBuf.java index 5ee90c76468..8f32bf61ac4 100644 --- a/build-common/test/org/jetbrains/kotlin/serialization/js/ast/DebugJsAstProtoBuf.java +++ b/build-common/test/org/jetbrains/kotlin/serialization/js/ast/DebugJsAstProtoBuf.java @@ -211,6 +211,22 @@ public final class DebugJsAstProtoBuf { * UNBOX_CHAR = 4; */ UNBOX_CHAR(3, 4), + /** + * SUSPEND_CALL = 5; + */ + SUSPEND_CALL(4, 5), + /** + * COROUTINE_RESULT = 6; + */ + COROUTINE_RESULT(5, 6), + /** + * COROUTINE_CONTROLLER = 7; + */ + COROUTINE_CONTROLLER(6, 7), + /** + * COROUTINE_RECEIVER = 8; + */ + COROUTINE_RECEIVER(7, 8), ; /** @@ -229,6 +245,22 @@ public final class DebugJsAstProtoBuf { * UNBOX_CHAR = 4; */ public static final int UNBOX_CHAR_VALUE = 4; + /** + * SUSPEND_CALL = 5; + */ + public static final int SUSPEND_CALL_VALUE = 5; + /** + * COROUTINE_RESULT = 6; + */ + public static final int COROUTINE_RESULT_VALUE = 6; + /** + * COROUTINE_CONTROLLER = 7; + */ + public static final int COROUTINE_CONTROLLER_VALUE = 7; + /** + * COROUTINE_RECEIVER = 8; + */ + public static final int COROUTINE_RECEIVER_VALUE = 8; public final int getNumber() { return value; } @@ -239,6 +271,10 @@ public final class DebugJsAstProtoBuf { case 2: return WRAP_FUNCTION; case 3: return TO_BOXED_CHAR; case 4: return UNBOX_CHAR; + case 5: return SUSPEND_CALL; + case 6: return COROUTINE_RESULT; + case 7: return COROUTINE_CONTROLLER; + case 8: return COROUTINE_RECEIVER; default: return null; } } @@ -49361,10 +49397,12 @@ public final class DebugJsAstProtoBuf { "t.Fragment*@\n\013SideEffects\022\021\n\rAFFECTS_STA" + "TE\020\001\022\024\n\020DEPENDS_ON_STATE\020\002\022\010\n\004PURE\020\003*?\n\016" + "InlineStrategy\022\017\n\013AS_FUNCTION\020\000\022\014\n\010IN_PL" + - "ACE\020\001\022\016\n\nNOT_INLINE\020\002*c\n\017SpecialFunction" + - "\022\032\n\026DEFINE_INLINE_FUNCTION\020\001\022\021\n\rWRAP_FUN" + - "CTION\020\002\022\021\n\rTO_BOXED_CHAR\020\003\022\016\n\nUNBOX_CHAR" + - "\020\004B\024B\022DebugJsAstProtoBuf" + "ACE\020\001\022\016\n\nNOT_INLINE\020\002*\275\001\n\017SpecialFunctio" + + "n\022\032\n\026DEFINE_INLINE_FUNCTION\020\001\022\021\n\rWRAP_FU" + + "NCTION\020\002\022\021\n\rTO_BOXED_CHAR\020\003\022\016\n\nUNBOX_CHA" + + "R\020\004\022\020\n\014SUSPEND_CALL\020\005\022\024\n\020COROUTINE_RESUL" + + "T\020\006\022\030\n\024COROUTINE_CONTROLLER\020\007\022\026\n\022COROUTI" + + "NE_RECEIVER\020\010B\024B\022DebugJsAstProtoBuf" }; org.jetbrains.kotlin.protobuf.Descriptors.FileDescriptor.InternalDescriptorAssigner assigner = new org.jetbrains.kotlin.protobuf.Descriptors.FileDescriptor. InternalDescriptorAssigner() { diff --git a/compiler/testData/codegen/box/coroutines/multiModule/inlineMultiModule.kt b/compiler/testData/codegen/box/coroutines/multiModule/inlineMultiModule.kt new file mode 100644 index 00000000000..ad5db0563d9 --- /dev/null +++ b/compiler/testData/codegen/box/coroutines/multiModule/inlineMultiModule.kt @@ -0,0 +1,69 @@ +// IGNORE_BACKEND: NATIVE +// WITH_COROUTINES +// WITH_RUNTIME + +// MODULE: lib(support) +// FILE: lib.kt + +import helpers.* +import kotlin.coroutines.experimental.* +import kotlin.coroutines.experimental.intrinsics.* + +var continuation: () -> Unit = { } +var log = "" +var finished = false + +suspend fun foo(v: T): T = suspendCoroutineOrReturn { x -> + continuation = { + x.resume(v) + } + log += "foo($v);" + COROUTINE_SUSPENDED +} + +inline suspend fun bar(v: String) { + log += "before bar($v);" + foo("1:$v") + log += "inside bar($v);" + foo("2:$v") + log += "after bar($v);" +} + +fun builder(c: suspend () -> Unit) { + c.startCoroutine(handleResultContinuation { + continuation = { } + finished = true + }) +} + +// MODULE: main(lib) +// FILE: main.kt + +import kotlin.coroutines.experimental.* +import kotlin.coroutines.experimental.intrinsics.* + +suspend fun baz() { + bar("A") + log += "between bar;" + bar("B") +} + +val expectedString = + "before bar(A);foo(1:A);@;inside bar(A);foo(2:A);@;after bar(A);" + + "between bar;" + + "before bar(B);foo(1:B);@;inside bar(B);foo(2:B);@;after bar(B);" + +fun box(): String { + builder { + baz() + } + + while (!finished) { + log += "@;" + continuation() + } + + if (log != expectedString) return "fail: $log" + + return "OK" +} diff --git a/compiler/testData/codegen/box/coroutines/multiModule/inlineMultiModuleOverride.kt b/compiler/testData/codegen/box/coroutines/multiModule/inlineMultiModuleOverride.kt new file mode 100644 index 00000000000..bc9a47a50f5 --- /dev/null +++ b/compiler/testData/codegen/box/coroutines/multiModule/inlineMultiModuleOverride.kt @@ -0,0 +1,80 @@ +// IGNORE_BACKEND: NATIVE +// IGNORE_BACKEND: JVM +// WITH_COROUTINES +// WITH_RUNTIME + +// MODULE: lib(support) +// FILE: lib.kt + +import helpers.* +import kotlin.coroutines.experimental.* +import kotlin.coroutines.experimental.intrinsics.* + +var continuation: () -> Unit = { } +var log = "" +var finished = false + +suspend fun foo(v: T): T = suspendCoroutineOrReturn { x -> + continuation = { + x.resume(v) + } + log += "foo($v);" + COROUTINE_SUSPENDED +} + +interface I { + suspend fun bar() +} + +class A(val v: String) : I { + override inline suspend fun bar() { + log += "before bar($v);" + foo("1:$v") + log += "inside bar($v);" + foo("2:$v") + log += "after bar($v);" + } +} + +fun builder(c: suspend () -> Unit) { + c.startCoroutine(handleResultContinuation { + continuation = { } + finished = true + }) +} + +// MODULE: main(lib) +// FILE: main.kt + +import kotlin.coroutines.experimental.* +import kotlin.coroutines.experimental.intrinsics.* + +suspend fun baz() { + val a = A("A") + a.bar() + + log += "between bar;" + + val b: I = A("B") + b.bar() +} + +val expectedString = + "before bar(A);foo(1:A);@;inside bar(A);foo(2:A);@;after bar(A);" + + "between bar;" + + "before bar(B);foo(1:B);@;inside bar(B);foo(2:B);@;after bar(B);" + +fun box(): String { + builder { + baz() + } + + while (!finished) { + log += "@;" + continuation() + } + + if (log != expectedString) return "fail: $log" + + return "OK" +} diff --git a/compiler/testData/codegen/box/coroutines/multiModule/inlineMultiModuleWithController.kt b/compiler/testData/codegen/box/coroutines/multiModule/inlineMultiModuleWithController.kt new file mode 100644 index 00000000000..902ef8e991f --- /dev/null +++ b/compiler/testData/codegen/box/coroutines/multiModule/inlineMultiModuleWithController.kt @@ -0,0 +1,77 @@ +// IGNORE_BACKEND: NATIVE +// WITH_COROUTINES +// WITH_RUNTIME + +// MODULE: lib(support) +// FILE: lib.kt + +import helpers.* +import kotlin.coroutines.experimental.* +import kotlin.coroutines.experimental.intrinsics.* + +var continuation: () -> Unit = { } +var log = "" +var finished = false + +class C { + var v: String = "" + + inline suspend fun bar() { + log += "before bar($v);" + foo("1:$v") + log += "inside bar($v);" + foo("2:$v") + log += "after bar($v);" + } +} + +suspend fun foo(v: T): T = suspendCoroutineOrReturn { x -> + continuation = { + x.resume(v) + } + log += "foo($v);" + COROUTINE_SUSPENDED +} + +fun C.builder(c: suspend C.() -> Unit) { + c.startCoroutine(this, handleResultContinuation { + continuation = { } + finished = true + }) +} + +// MODULE: main(lib) +// FILE: main.kt + +import kotlin.coroutines.experimental.* +import kotlin.coroutines.experimental.intrinsics.* + +suspend fun C.baz() { + v = "A" + bar() + log += "between bar;" + v = "B" + bar() +} + +val expectedString = + "before bar(A);foo(1:A);@;inside bar(A);foo(2:A);@;after bar(A);" + + "between bar;" + + "before bar(B);foo(1:B);@;inside bar(B);foo(2:B);@;after bar(B);" + +fun box(): String { + var c = C() + + c.builder { + baz() + } + + while (!finished) { + log += "@;" + continuation() + } + + if (log != expectedString) return "fail: $log" + + return "OK" +} diff --git a/compiler/tests-ir-jvm/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java b/compiler/tests-ir-jvm/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java index 432c90eac09..4584c79d688 100644 --- a/compiler/tests-ir-jvm/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java +++ b/compiler/tests-ir-jvm/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java @@ -5788,6 +5788,30 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes doTest(fileName); } + @TestMetadata("inlineMultiModule.kt") + public void testInlineMultiModule() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/coroutines/multiModule/inlineMultiModule.kt"); + doTest(fileName); + } + + @TestMetadata("inlineMultiModuleOverride.kt") + public void testInlineMultiModuleOverride() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/coroutines/multiModule/inlineMultiModuleOverride.kt"); + try { + doTest(fileName); + } + catch (Throwable ignore) { + return; + } + throw new AssertionError("Looks like this test can be unmuted. Remove IGNORE_BACKEND directive for that."); + } + + @TestMetadata("inlineMultiModuleWithController.kt") + public void testInlineMultiModuleWithController() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/coroutines/multiModule/inlineMultiModuleWithController.kt"); + doTest(fileName); + } + @TestMetadata("simple.kt") public void testSimple() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/coroutines/multiModule/simple.kt"); diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java index 76893a87724..7ad0b3590e2 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java @@ -5788,6 +5788,30 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest { doTest(fileName); } + @TestMetadata("inlineMultiModule.kt") + public void testInlineMultiModule() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/coroutines/multiModule/inlineMultiModule.kt"); + doTest(fileName); + } + + @TestMetadata("inlineMultiModuleOverride.kt") + public void testInlineMultiModuleOverride() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/coroutines/multiModule/inlineMultiModuleOverride.kt"); + try { + doTest(fileName); + } + catch (Throwable ignore) { + return; + } + throw new AssertionError("Looks like this test can be unmuted. Remove IGNORE_BACKEND directive for that."); + } + + @TestMetadata("inlineMultiModuleWithController.kt") + public void testInlineMultiModuleWithController() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/coroutines/multiModule/inlineMultiModuleWithController.kt"); + doTest(fileName); + } + @TestMetadata("simple.kt") public void testSimple() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/coroutines/multiModule/simple.kt"); diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java index 93dee7c4d1f..bcac1e48bcb 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java @@ -5778,6 +5778,18 @@ public class LightAnalysisModeTestGenerated extends AbstractLightAnalysisModeTes @TestDataPath("$PROJECT_ROOT") @RunWith(JUnit3RunnerWithInners.class) public static class MultiModule extends AbstractLightAnalysisModeTest { + @TestMetadata("inlineMultiModuleOverride.kt") + public void ignoreInlineMultiModuleOverride() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/coroutines/multiModule/inlineMultiModuleOverride.kt"); + try { + doTest(fileName); + } + catch (Throwable ignore) { + return; + } + throw new AssertionError("Looks like this test can be unmuted. Remove IGNORE_BACKEND directive for that."); + } + public void testAllFilesPresentInMultiModule() throws Exception { KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("compiler/testData/codegen/box/coroutines/multiModule"), Pattern.compile("^(.+)\\.kt$"), TargetBackend.JVM, true); } @@ -5788,6 +5800,18 @@ public class LightAnalysisModeTestGenerated extends AbstractLightAnalysisModeTes doTest(fileName); } + @TestMetadata("inlineMultiModule.kt") + public void testInlineMultiModule() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/coroutines/multiModule/inlineMultiModule.kt"); + doTest(fileName); + } + + @TestMetadata("inlineMultiModuleWithController.kt") + public void testInlineMultiModuleWithController() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/coroutines/multiModule/inlineMultiModuleWithController.kt"); + doTest(fileName); + } + @TestMetadata("simple.kt") public void testSimple() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/coroutines/multiModule/simple.kt"); diff --git a/js/js.ast/src/org/jetbrains/kotlin/js/backend/ast/JsVisitorWithContext.java b/js/js.ast/src/org/jetbrains/kotlin/js/backend/ast/JsVisitorWithContext.java index 878f4d155f2..95c5dc6945d 100644 --- a/js/js.ast/src/org/jetbrains/kotlin/js/backend/ast/JsVisitorWithContext.java +++ b/js/js.ast/src/org/jetbrains/kotlin/js/backend/ast/JsVisitorWithContext.java @@ -59,19 +59,26 @@ public abstract class JsVisitorWithContext { doAcceptStatementList(statements); } + public void endVisit(@NotNull JsExpression x, @NotNull JsContext ctx) { + } + public void endVisit(@NotNull JsArrayAccess x, @NotNull JsContext ctx) { + endVisit((JsExpression) x, ctx); } public void endVisit(@NotNull JsArrayLiteral x, @NotNull JsContext ctx) { + endVisit((JsExpression) x, ctx); } public void endVisit(@NotNull JsBinaryOperation x, @NotNull JsContext ctx) { + endVisit((JsExpression) x, ctx); } public void endVisit(@NotNull JsBlock x, @NotNull JsContext ctx) { } public void endVisit(@NotNull JsBooleanLiteral x, @NotNull JsContext ctx) { + endVisit((JsExpression) x, ctx); } public void endVisit(@NotNull JsBreak x, @NotNull JsContext ctx) { @@ -84,6 +91,7 @@ public abstract class JsVisitorWithContext { } public void endVisit(@NotNull JsConditional x, @NotNull JsContext ctx) { + endVisit((JsExpression) x, ctx); } public void endVisit(@NotNull JsContinue x, @NotNull JsContext ctx) { @@ -111,12 +119,14 @@ public abstract class JsVisitorWithContext { } public void endVisit(@NotNull JsFunction x, @NotNull JsContext ctx) { + endVisit((JsExpression) x, ctx); } public void endVisit(@NotNull JsIf x, @NotNull JsContext ctx) { } public void endVisit(@NotNull JsInvocation x, @NotNull JsContext ctx) { + endVisit((JsExpression) x, ctx); } public void endVisit(@NotNull JsLabel x, @NotNull JsContext ctx) { @@ -126,27 +136,33 @@ public abstract class JsVisitorWithContext { } public void endVisit(@NotNull JsNameRef x, @NotNull JsContext ctx) { + endVisit((JsExpression) x, ctx); } public void endVisit(@NotNull JsNew x, @NotNull JsContext ctx) { } public void endVisit(@NotNull JsNullLiteral x, @NotNull JsContext ctx) { + endVisit((JsExpression) x, ctx); } public void endVisit(@NotNull JsNumberLiteral x, @NotNull JsContext ctx) { + endVisit((JsExpression) x, ctx); } public void endVisit(@NotNull JsObjectLiteral x, @NotNull JsContext ctx) { + endVisit((JsExpression) x, ctx); } public void endVisit(@NotNull JsParameter x, @NotNull JsContext ctx) { } public void endVisit(@NotNull JsPostfixOperation x, @NotNull JsContext ctx) { + endVisit((JsExpression) x, ctx); } public void endVisit(@NotNull JsPrefixOperation x, @NotNull JsContext ctx) { + endVisit((JsExpression) x, ctx); } public void endVisit(@NotNull JsProgram x, @NotNull JsContext ctx) { @@ -156,18 +172,21 @@ public abstract class JsVisitorWithContext { } public void endVisit(@NotNull JsRegExp x, @NotNull JsContext ctx) { + endVisit((JsExpression) x, ctx); } public void endVisit(@NotNull JsReturn x, @NotNull JsContext ctx) { } public void endVisit(@NotNull JsStringLiteral x, @NotNull JsContext ctx) { + endVisit((JsExpression) x, ctx); } public void endVisit(@NotNull JsSwitch x, @NotNull JsContext ctx) { } public void endVisit(@NotNull JsThisRef x, @NotNull JsContext ctx) { + endVisit((JsExpression) x, ctx); } public void endVisit(@NotNull JsThrow x, @NotNull JsContext ctx) { diff --git a/js/js.ast/src/org/jetbrains/kotlin/js/backend/ast/metadata/metadataProperties.kt b/js/js.ast/src/org/jetbrains/kotlin/js/backend/ast/metadata/metadataProperties.kt index 1a54f7ff717..a4e5eb3898d 100644 --- a/js/js.ast/src/org/jetbrains/kotlin/js/backend/ast/metadata/metadataProperties.kt +++ b/js/js.ast/src/org/jetbrains/kotlin/js/backend/ast/metadata/metadataProperties.kt @@ -147,6 +147,10 @@ enum class SpecialFunction(val suggestedName: String) { WRAP_FUNCTION("wrapFunction"), TO_BOXED_CHAR("toBoxedChar"), UNBOX_CHAR("unboxChar"), + SUSPEND_CALL("suspendCall"), + COROUTINE_RESULT("coroutineResult"), + COROUTINE_CONTROLLER("coroutineController"), + COROUTINE_RECEIVER("coroutineReceiver") } enum class BoxingKind { diff --git a/js/js.inliner/src/org/jetbrains/kotlin/js/inline/FunctionReader.kt b/js/js.inliner/src/org/jetbrains/kotlin/js/inline/FunctionReader.kt index c01ad90a15d..aa1a6f34813 100644 --- a/js/js.inliner/src/org/jetbrains/kotlin/js/inline/FunctionReader.kt +++ b/js/js.inliner/src/org/jetbrains/kotlin/js/inline/FunctionReader.kt @@ -49,7 +49,10 @@ private val JS_IDENTIFIER_PART = "$JS_IDENTIFIER_START\\p{Pc}\\p{Mc}\\p{Mn}\\d" private val JS_IDENTIFIER="[$JS_IDENTIFIER_START][$JS_IDENTIFIER_PART]*" private val DEFINE_MODULE_PATTERN = ("($JS_IDENTIFIER)\\.defineModule\\(\\s*(['\"])([^'\"]+)\\2\\s*,\\s*(\\w+)\\s*\\)").toRegex().toPattern() private val DEFINE_MODULE_FIND_PATTERN = ".defineModule(" -private val WRAP_FUNCTION_PATTERN = Regex("var\\s+($JS_IDENTIFIER)\\s*=\\s*($JS_IDENTIFIER)\\.wrapFunction\\s*;").toPattern() + +private val specialFunctions = enumValues().joinToString("|") { it.suggestedName } +private val specialFunctionsByName = enumValues().associateBy { it.suggestedName } +private val SPECIAL_FUNCTION_PATTERN = Regex("var\\s+($JS_IDENTIFIER)\\s*=\\s*($JS_IDENTIFIER)\\.($specialFunctions)\\s*;").toPattern() class FunctionReader( private val reporter: JsConfig.Reporter, @@ -72,13 +75,15 @@ class FunctionReader( val fileContent: String, val moduleVariable: String, val kotlinVariable: String, - val wrapFunctionVariable: String?, + val specialFunctions: Map, offsetToSourceMappingProvider: () -> OffsetToSourceMapping, val sourceMap: SourceMap? ) { val offsetToSourceMapping by lazy(offsetToSourceMappingProvider) - val wrapFunctionRegex = wrapFunctionVariable?.let { Regex("\\s*$it\\s*\\(\\s*").toPattern() } + val wrapFunctionRegex = specialFunctions.entries + .singleOrNull { (_, v) -> v == SpecialFunction.WRAP_FUNCTION }?.key + ?.let { Regex("\\s*$it\\s*\\(\\s*").toPattern() } } private val moduleNameToInfo by lazy { @@ -100,8 +105,12 @@ class FunctionReader( val moduleVariable = preciseMatcher.group(4) val kotlinVariable = preciseMatcher.group(1) - val wrapFunctionVariable = WRAP_FUNCTION_PATTERN.matcher(content).let { matcher -> - if (matcher.find() && matcher.group(2) == kotlinVariable) matcher.group(1) else null + val matcher = SPECIAL_FUNCTION_PATTERN.matcher(content) + val specialFunctions = mutableMapOf() + while (matcher.find()) { + if (matcher.group(2) == kotlinVariable) { + specialFunctions[matcher.group(1)] = specialFunctionsByName[matcher.group(3)]!! + } } val sourceMap = sourceMapContent?.let { @@ -120,7 +129,7 @@ class FunctionReader( fileContent = content, moduleVariable = moduleVariable, kotlinVariable = kotlinVariable, - wrapFunctionVariable = wrapFunctionVariable, + specialFunctions = specialFunctions, offsetToSourceMappingProvider = { OffsetToSourceMapping(content) }, sourceMap = sourceMap ) @@ -246,9 +255,9 @@ class FunctionReader( function.markInlineArguments(descriptor) markDefaultParams(function) - info.wrapFunctionVariable.let { wrapFunction -> - for (externalName in (collectReferencedNames(function) - allDefinedNames).filter { it.ident == wrapFunction }) { - externalName.specialFunction = SpecialFunction.WRAP_FUNCTION + for (externalName in (collectReferencedNames(function) - allDefinedNames)) { + info.specialFunctions[externalName.ident]?.let { + externalName.specialFunction = it } } diff --git a/js/js.inliner/src/org/jetbrains/kotlin/js/inline/JsInliner.java b/js/js.inliner/src/org/jetbrains/kotlin/js/inline/JsInliner.java index 1b88c5d3267..4b73f125329 100644 --- a/js/js.inliner/src/org/jetbrains/kotlin/js/inline/JsInliner.java +++ b/js/js.inliner/src/org/jetbrains/kotlin/js/inline/JsInliner.java @@ -43,6 +43,7 @@ import java.util.stream.Collectors; import java.util.stream.Stream; import static org.jetbrains.kotlin.js.inline.util.CollectUtilsKt.getImportTag; +import static org.jetbrains.kotlin.js.translate.declaration.InlineCoroutineUtilKt.transformSpecialFunctionsToCoroutineMetadata; import static org.jetbrains.kotlin.js.translate.utils.JsAstUtils.flattenStatement; import static org.jetbrains.kotlin.js.translate.utils.JsAstUtils.pureFqn; @@ -348,6 +349,7 @@ public class JsInliner extends JsVisitorWithContextImpl { } JsFunction function = functionWithWrapper.getFunction().deepCopy(); + function.setBody(transformSpecialFunctionsToCoroutineMetadata(function.getBody())); if (functionWithWrapper.getWrapperBody() != null) { applyWrapper(functionWithWrapper.getWrapperBody(), function, functionWithWrapper.getFunction(), inliningContext); } diff --git a/js/js.libraries/src/js/markerFunctions.js b/js/js.libraries/src/js/markerFunctions.js index eab19252910..e02aaafb26e 100644 --- a/js/js.libraries/src/js/markerFunctions.js +++ b/js/js.libraries/src/js/markerFunctions.js @@ -61,3 +61,16 @@ Kotlin.andPredicate = function (a, b) { Kotlin.kotlinModuleMetadata = function (abiVersion, moduleName, data) { }; + +Kotlin.suspendCall = function(value) { + return value; +}; + +Kotlin.coroutineResult = function(qualifier) { +}; + +Kotlin.coroutineController = function(qualifier) { +}; + +Kotlin.coroutineReceiver = function(qualifier) { +}; \ No newline at end of file diff --git a/js/js.serializer/src/js-ast.proto b/js/js.serializer/src/js-ast.proto index 6a904c7dee3..9635474d45d 100644 --- a/js/js.serializer/src/js-ast.proto +++ b/js/js.serializer/src/js-ast.proto @@ -435,6 +435,10 @@ enum SpecialFunction { WRAP_FUNCTION = 2; TO_BOXED_CHAR = 3; UNBOX_CHAR = 4; + SUSPEND_CALL = 5; + COROUTINE_RESULT = 6; + COROUTINE_CONTROLLER = 7; + COROUTINE_RECEIVER = 8; } diff --git a/js/js.serializer/src/org/jetbrains/kotlin/serialization/js/ast/JsAstDeserializer.kt b/js/js.serializer/src/org/jetbrains/kotlin/serialization/js/ast/JsAstDeserializer.kt index 686dbe9c8c7..06ccb635204 100644 --- a/js/js.serializer/src/org/jetbrains/kotlin/serialization/js/ast/JsAstDeserializer.kt +++ b/js/js.serializer/src/org/jetbrains/kotlin/serialization/js/ast/JsAstDeserializer.kt @@ -522,6 +522,10 @@ class JsAstDeserializer(program: JsProgram, private val sourceRoots: Iterable SpecialFunction.WRAP_FUNCTION JsAstProtoBuf.SpecialFunction.TO_BOXED_CHAR -> SpecialFunction.TO_BOXED_CHAR JsAstProtoBuf.SpecialFunction.UNBOX_CHAR -> SpecialFunction.UNBOX_CHAR + JsAstProtoBuf.SpecialFunction.SUSPEND_CALL -> SpecialFunction.SUSPEND_CALL + JsAstProtoBuf.SpecialFunction.COROUTINE_RESULT -> SpecialFunction.COROUTINE_RESULT + JsAstProtoBuf.SpecialFunction.COROUTINE_CONTROLLER -> SpecialFunction.COROUTINE_CONTROLLER + JsAstProtoBuf.SpecialFunction.COROUTINE_RECEIVER -> SpecialFunction.COROUTINE_RECEIVER } private fun withLocation(fileId: Int?, location: Location?, action: () -> T): T { diff --git a/js/js.serializer/src/org/jetbrains/kotlin/serialization/js/ast/JsAstProtoBuf.java b/js/js.serializer/src/org/jetbrains/kotlin/serialization/js/ast/JsAstProtoBuf.java index 21c70d3290c..cb5593bd162 100644 --- a/js/js.serializer/src/org/jetbrains/kotlin/serialization/js/ast/JsAstProtoBuf.java +++ b/js/js.serializer/src/org/jetbrains/kotlin/serialization/js/ast/JsAstProtoBuf.java @@ -159,6 +159,22 @@ public final class JsAstProtoBuf { * UNBOX_CHAR = 4; */ UNBOX_CHAR(3, 4), + /** + * SUSPEND_CALL = 5; + */ + SUSPEND_CALL(4, 5), + /** + * COROUTINE_RESULT = 6; + */ + COROUTINE_RESULT(5, 6), + /** + * COROUTINE_CONTROLLER = 7; + */ + COROUTINE_CONTROLLER(6, 7), + /** + * COROUTINE_RECEIVER = 8; + */ + COROUTINE_RECEIVER(7, 8), ; /** @@ -177,6 +193,22 @@ public final class JsAstProtoBuf { * UNBOX_CHAR = 4; */ public static final int UNBOX_CHAR_VALUE = 4; + /** + * SUSPEND_CALL = 5; + */ + public static final int SUSPEND_CALL_VALUE = 5; + /** + * COROUTINE_RESULT = 6; + */ + public static final int COROUTINE_RESULT_VALUE = 6; + /** + * COROUTINE_CONTROLLER = 7; + */ + public static final int COROUTINE_CONTROLLER_VALUE = 7; + /** + * COROUTINE_RECEIVER = 8; + */ + public static final int COROUTINE_RECEIVER_VALUE = 8; public final int getNumber() { return value; } @@ -187,6 +219,10 @@ public final class JsAstProtoBuf { case 2: return WRAP_FUNCTION; case 3: return TO_BOXED_CHAR; case 4: return UNBOX_CHAR; + case 5: return SUSPEND_CALL; + case 6: return COROUTINE_RESULT; + case 7: return COROUTINE_CONTROLLER; + case 8: return COROUTINE_RECEIVER; default: return null; } } diff --git a/js/js.serializer/src/org/jetbrains/kotlin/serialization/js/ast/JsAstSerializer.kt b/js/js.serializer/src/org/jetbrains/kotlin/serialization/js/ast/JsAstSerializer.kt index 46ac9253136..a6275fc2f62 100644 --- a/js/js.serializer/src/org/jetbrains/kotlin/serialization/js/ast/JsAstSerializer.kt +++ b/js/js.serializer/src/org/jetbrains/kotlin/serialization/js/ast/JsAstSerializer.kt @@ -558,6 +558,10 @@ class JsAstSerializer(private val pathResolver: (File) -> String) { SpecialFunction.WRAP_FUNCTION -> JsAstProtoBuf.SpecialFunction.WRAP_FUNCTION SpecialFunction.TO_BOXED_CHAR -> JsAstProtoBuf.SpecialFunction.TO_BOXED_CHAR SpecialFunction.UNBOX_CHAR -> JsAstProtoBuf.SpecialFunction.UNBOX_CHAR + SpecialFunction.SUSPEND_CALL -> JsAstProtoBuf.SpecialFunction.SUSPEND_CALL + SpecialFunction.COROUTINE_RESULT -> JsAstProtoBuf.SpecialFunction.COROUTINE_RESULT + SpecialFunction.COROUTINE_CONTROLLER -> JsAstProtoBuf.SpecialFunction.COROUTINE_CONTROLLER + SpecialFunction.COROUTINE_RECEIVER -> JsAstProtoBuf.SpecialFunction.COROUTINE_RECEIVER } private fun serialize(name: JsName): Int = nameMap.getOrPut(name) { diff --git a/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/JsCodegenBoxTestGenerated.java b/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/JsCodegenBoxTestGenerated.java index f7196604228..ba10b1f4037 100644 --- a/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/JsCodegenBoxTestGenerated.java +++ b/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/JsCodegenBoxTestGenerated.java @@ -6424,6 +6424,24 @@ public class JsCodegenBoxTestGenerated extends AbstractJsCodegenBoxTest { doTest(fileName); } + @TestMetadata("inlineMultiModule.kt") + public void testInlineMultiModule() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/coroutines/multiModule/inlineMultiModule.kt"); + doTest(fileName); + } + + @TestMetadata("inlineMultiModuleOverride.kt") + public void testInlineMultiModuleOverride() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/coroutines/multiModule/inlineMultiModuleOverride.kt"); + doTest(fileName); + } + + @TestMetadata("inlineMultiModuleWithController.kt") + public void testInlineMultiModuleWithController() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/coroutines/multiModule/inlineMultiModuleWithController.kt"); + doTest(fileName); + } + @TestMetadata("simple.kt") public void testSimple() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/coroutines/multiModule/simple.kt"); diff --git a/js/js.translator/src/org/jetbrains/kotlin/js/translate/context/Namer.java b/js/js.translator/src/org/jetbrains/kotlin/js/translate/context/Namer.java index b932ba79101..5db760caffe 100644 --- a/js/js.translator/src/org/jetbrains/kotlin/js/translate/context/Namer.java +++ b/js/js.translator/src/org/jetbrains/kotlin/js/translate/context/Namer.java @@ -95,7 +95,6 @@ public final class Namer { public static final JsNameRef IS_ARRAY_FUN_REF = new JsNameRef("isArray", "Array"); public static final String DEFINE_INLINE_FUNCTION = "defineInlineFunction"; - private static final String WRAP_FUNCTION = "wrapFunction"; public static final String DEFAULT_PARAMETER_IMPLEMENTOR_SUFFIX = "$default"; private static final JsNameRef JS_OBJECT = new JsNameRef("Object"); @@ -324,30 +323,9 @@ public final class Namer { return pureFqn("Long", kotlinObject()); } - @NotNull - private static JsNameRef createInlineFunction() { - return pureFqn(DEFINE_INLINE_FUNCTION, kotlinObject()); - } - - @NotNull - private static JsNameRef wrapFunction() { - return pureFqn(WRAP_FUNCTION, kotlinObject()); - } - @NotNull public static JsExpression createSpecialFunction(@NotNull SpecialFunction specialFunction) { - switch (specialFunction) { - case DEFINE_INLINE_FUNCTION: - return createInlineFunction(); - case WRAP_FUNCTION: - return wrapFunction(); - case TO_BOXED_CHAR: - return pureFqn("toBoxedChar", kotlinObject()); - case UNBOX_CHAR: - return pureFqn("unboxChar", kotlinObject()); - default: - throw new IllegalArgumentException("Unknown function: " + specialFunction); - } + return pureFqn(specialFunction.getSuggestedName(), kotlinObject()); } @NotNull diff --git a/js/js.translator/src/org/jetbrains/kotlin/js/translate/declaration/AbstractDeclarationVisitor.kt b/js/js.translator/src/org/jetbrains/kotlin/js/translate/declaration/AbstractDeclarationVisitor.kt index 2b8ec1f5e3b..5c9a778fd8d 100644 --- a/js/js.translator/src/org/jetbrains/kotlin/js/translate/declaration/AbstractDeclarationVisitor.kt +++ b/js/js.translator/src/org/jetbrains/kotlin/js/translate/declaration/AbstractDeclarationVisitor.kt @@ -21,15 +21,17 @@ import org.jetbrains.kotlin.descriptors.Modality import org.jetbrains.kotlin.descriptors.PropertyDescriptor import org.jetbrains.kotlin.descriptors.isOverridable import org.jetbrains.kotlin.js.backend.ast.JsExpression +import org.jetbrains.kotlin.js.backend.ast.JsFunction import org.jetbrains.kotlin.js.backend.ast.JsName +import org.jetbrains.kotlin.js.backend.ast.metadata.coroutineMetadata +import org.jetbrains.kotlin.js.descriptorUtils.shouldBeExported import org.jetbrains.kotlin.js.translate.context.TranslationContext -import org.jetbrains.kotlin.js.translate.expression.translateAndAliasParameters -import org.jetbrains.kotlin.js.translate.expression.translateFunction -import org.jetbrains.kotlin.js.translate.expression.wrapWithInlineMetadata +import org.jetbrains.kotlin.js.translate.expression.* import org.jetbrains.kotlin.js.translate.general.TranslatorVisitor import org.jetbrains.kotlin.js.translate.utils.* import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.resolve.descriptorUtil.isExtensionProperty +import org.jetbrains.kotlin.resolve.source.getPsi abstract class AbstractDeclarationVisitor : TranslatorVisitor() { override fun emptyResult(context: TranslationContext) { } @@ -52,7 +54,7 @@ abstract class AbstractDeclarationVisitor : TranslatorVisitor() { val defaultTranslator = DefaultPropertyTranslator(descriptor, context, getBackingFieldReference(descriptor)) val getter = descriptor.getter!! val getterExpr = if (expression.hasCustomGetter()) { - translateFunction(getter, expression.getter!!, propertyContext) + translateFunction(getter, expression.getter!!, propertyContext).first } else { val function = context.getFunctionObject(getter) @@ -64,7 +66,7 @@ abstract class AbstractDeclarationVisitor : TranslatorVisitor() { val setterExpr = if (descriptor.isVar) { val setter = descriptor.setter!! if (expression.hasCustomSetter()) { - translateFunction(setter, expression.setter!!, propertyContext) + translateFunction(setter, expression.setter!!, propertyContext).first } else { val function = context.getFunctionObject(setter) @@ -88,8 +90,23 @@ abstract class AbstractDeclarationVisitor : TranslatorVisitor() { override fun visitNamedFunction(expression: KtNamedFunction, context: TranslationContext) { val descriptor = BindingUtils.getFunctionDescriptor(context.bindingContext(), expression) - val jsFunction = if (descriptor.modality != Modality.ABSTRACT) translateFunction(descriptor, expression, context) else null - addFunction(descriptor, jsFunction, expression) + val functionAndContext = if (descriptor.modality != Modality.ABSTRACT) { + translateFunction(descriptor, expression, context) + } + else { + null + } + addFunction(descriptor, functionAndContext?.first, expression) + + if (descriptor.isSuspend && descriptor.isInline && descriptor.shouldBeExported(context.config) && functionAndContext != null) { + val innerContext = functionAndContext.second + val inlineFunction = transformCoroutineMetadataToSpecialFunctions(context, functionAndContext.first.deepCopy() as JsFunction) + inlineFunction.name = null + inlineFunction.coroutineMetadata = null + val metadata = InlineMetadata.compose(inlineFunction, descriptor, innerContext) + val functionWithMetadata = metadata.functionWithMetadata(context, descriptor.source.getPsi()) + context.addDeclarationStatement(functionWithMetadata.makeStmt()) + } } override fun visitTypeAlias(typeAlias: KtTypeAlias, data: TranslationContext?) {} @@ -98,7 +115,7 @@ abstract class AbstractDeclarationVisitor : TranslatorVisitor() { descriptor: FunctionDescriptor, expression: KtDeclarationWithBody, context: TranslationContext - ): JsExpression { + ): Pair { val function = context.getFunctionObject(descriptor) function.source = expression.finalElement val innerContext = context.newDeclaration(descriptor).translateAndAliasParameters(descriptor, function.parameters) @@ -113,7 +130,14 @@ abstract class AbstractDeclarationVisitor : TranslatorVisitor() { function.body.statements += FunctionBodyTranslator.setDefaultValueForArguments(descriptor, innerContext) } innerContext.translateFunction(expression, function) - return innerContext.wrapWithInlineMetadata(context, function, descriptor) + val result = if (descriptor.isSuspend && descriptor.shouldBeExported(context.config)) { + function + } + else { + innerContext.wrapWithInlineMetadata(context, function, descriptor) + } + + return Pair(result, innerContext) } // used from kotlinx.serialization diff --git a/js/js.translator/src/org/jetbrains/kotlin/js/translate/declaration/inlineCoroutineUtil.kt b/js/js.translator/src/org/jetbrains/kotlin/js/translate/declaration/inlineCoroutineUtil.kt new file mode 100644 index 00000000000..7c14f3749ff --- /dev/null +++ b/js/js.translator/src/org/jetbrains/kotlin/js/translate/declaration/inlineCoroutineUtil.kt @@ -0,0 +1,101 @@ +/* + * Copyright 2010-2017 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. + */ + +/* + * Copyright 2010-2017 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.js.translate.declaration + +import org.jetbrains.kotlin.js.backend.ast.* +import org.jetbrains.kotlin.js.backend.ast.metadata.* +import org.jetbrains.kotlin.js.translate.context.TranslationContext +import org.jetbrains.kotlin.js.translate.utils.TranslationUtils +import org.jetbrains.kotlin.js.translate.utils.name + +fun transformCoroutineMetadataToSpecialFunctions(context: TranslationContext, node: T): T { + val visitor = object : JsVisitorWithContextImpl() { + override fun endVisit(x: JsNameRef, ctx: JsContext) { + val specialFunction = when { + x.coroutineController -> SpecialFunction.COROUTINE_CONTROLLER + x.coroutineReceiver -> SpecialFunction.COROUTINE_RECEIVER + x.coroutineResult -> SpecialFunction.COROUTINE_RESULT + else -> null + } + if (specialFunction != null) { + val arguments = listOfNotNull(x.qualifier).toTypedArray() + ctx.replaceMe(TranslationUtils.invokeSpecialFunction(context, specialFunction, *arguments).source(x.source)) + } + else { + super.endVisit(x, ctx) + } + } + + override fun endVisit(x: JsExpression, ctx: JsContext) { + if (x.isSuspend) { + x.isSuspend = false + ctx.replaceMe(TranslationUtils.invokeSpecialFunction(context, SpecialFunction.SUSPEND_CALL, x).source(x.source)) + } + } + } + return visitor.accept(node) +} + +fun transformSpecialFunctionsToCoroutineMetadata(node: T): T { + val visitor = object : JsVisitorWithContextImpl() { + override fun endVisit(x: JsInvocation, ctx: JsContext) { + x.qualifier.name?.specialFunction?.let { specialFunction -> + val replacement = when (specialFunction) { + SpecialFunction.COROUTINE_CONTROLLER -> { + JsNameRef("\$\$controller\$\$", x.arguments.getOrNull(0)).apply { + coroutineController = true + } + } + SpecialFunction.COROUTINE_RECEIVER -> { + JsNameRef("\$this\$", x.arguments.getOrNull(0)).apply { + coroutineReceiver = true + } + } + SpecialFunction.COROUTINE_RESULT -> { + JsNameRef("\$result\$", x.arguments.getOrNull(0)).apply { + coroutineResult = true + } + } + SpecialFunction.SUSPEND_CALL -> { + x.arguments[0].apply { + isSuspend = true + } + } + else -> null + } + replacement?.let { ctx.replaceMe(it) } + } + } + } + return visitor.accept(node) +} \ No newline at end of file diff --git a/js/js.translator/src/org/jetbrains/kotlin/js/translate/expression/FunctionTranslator.kt b/js/js.translator/src/org/jetbrains/kotlin/js/translate/expression/FunctionTranslator.kt index 73f55169dc5..ae52db9da4a 100644 --- a/js/js.translator/src/org/jetbrains/kotlin/js/translate/expression/FunctionTranslator.kt +++ b/js/js.translator/src/org/jetbrains/kotlin/js/translate/expression/FunctionTranslator.kt @@ -112,7 +112,7 @@ fun TranslationContext.wrapWithInlineMetadata( if (descriptor.shouldBeExported(config)) { val metadata = InlineMetadata.compose(function, descriptor, this) val functionWithMetadata = metadata.functionWithMetadata(outerContext, sourceInfo) - config.configuration[JSConfigurationKeys.INCREMENTAL_RESULTS_CONSUMER]?.apply { + config.configuration[JSConfigurationKeys.INCREMENTAL_RESULTS_CONSUMER]?.apply { val psiFile = (descriptor.source.containingFile as? PsiSourceFile)?.psiFile ?: return@apply val file = VfsUtilCore.virtualToIoFile(psiFile.virtualFile) diff --git a/js/js.translator/src/org/jetbrains/kotlin/js/translate/utils/TranslationUtils.java b/js/js.translator/src/org/jetbrains/kotlin/js/translate/utils/TranslationUtils.java index 35d98c35268..3cfa71d1a67 100644 --- a/js/js.translator/src/org/jetbrains/kotlin/js/translate/utils/TranslationUtils.java +++ b/js/js.translator/src/org/jetbrains/kotlin/js/translate/utils/TranslationUtils.java @@ -526,7 +526,7 @@ public final class TranslationUtils { } @NotNull - private static JsInvocation invokeSpecialFunction( + public static JsInvocation invokeSpecialFunction( @NotNull TranslationContext context, @NotNull SpecialFunction function, @NotNull JsExpression... arguments ) { From 0269c3309afcc9d52da630d5f95d2bd92b624b8d Mon Sep 17 00:00:00 2001 From: Alexey Andreev Date: Tue, 26 Sep 2017 19:26:16 +0300 Subject: [PATCH 161/212] JS: fix parsing of wrong `delete` operation in js function. See KT-15294 --- .../testsWithJsStdLib/jsCode/deleteOperation.kt | 8 ++++++++ .../testsWithJsStdLib/jsCode/deleteOperation.txt | 3 +++ .../DiagnosticsTestWithJsStdLibGenerated.java | 6 ++++++ .../src/com/google/gwt/dev/js/JsAstMapper.java | 4 +--- .../google/gwt/dev/js/rhino/MessagesBundle.java | 2 ++ .../src/com/google/gwt/dev/js/rhino/Parser.java | 15 +++++++++++++-- 6 files changed, 33 insertions(+), 5 deletions(-) create mode 100644 compiler/testData/diagnostics/testsWithJsStdLib/jsCode/deleteOperation.kt create mode 100644 compiler/testData/diagnostics/testsWithJsStdLib/jsCode/deleteOperation.txt diff --git a/compiler/testData/diagnostics/testsWithJsStdLib/jsCode/deleteOperation.kt b/compiler/testData/diagnostics/testsWithJsStdLib/jsCode/deleteOperation.kt new file mode 100644 index 00000000000..0d63a37f396 --- /dev/null +++ b/compiler/testData/diagnostics/testsWithJsStdLib/jsCode/deleteOperation.kt @@ -0,0 +1,8 @@ +// !DIAGNOSTICS: -UNUSED_PARAMETER + +fun foo(x: Any) { + js("delete x.foo;") + js("delete x['bar'];") + js("delete x.baz();") + js("delete this;") +} \ No newline at end of file diff --git a/compiler/testData/diagnostics/testsWithJsStdLib/jsCode/deleteOperation.txt b/compiler/testData/diagnostics/testsWithJsStdLib/jsCode/deleteOperation.txt new file mode 100644 index 00000000000..199e30b63e6 --- /dev/null +++ b/compiler/testData/diagnostics/testsWithJsStdLib/jsCode/deleteOperation.txt @@ -0,0 +1,3 @@ +package + +public fun foo(/*0*/ x: kotlin.Any): kotlin.Unit diff --git a/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestWithJsStdLibGenerated.java b/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestWithJsStdLibGenerated.java index 0e62b5bdb38..dd2b81ba1da 100644 --- a/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestWithJsStdLibGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestWithJsStdLibGenerated.java @@ -368,6 +368,12 @@ public class DiagnosticsTestWithJsStdLibGenerated extends AbstractDiagnosticsTes doTest(fileName); } + @TestMetadata("deleteOperation.kt") + public void testDeleteOperation() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/diagnostics/testsWithJsStdLib/jsCode/deleteOperation.kt"); + doTest(fileName); + } + @TestMetadata("error.kt") public void testError() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/diagnostics/testsWithJsStdLib/jsCode/error.kt"); diff --git a/js/js.parser/src/com/google/gwt/dev/js/JsAstMapper.java b/js/js.parser/src/com/google/gwt/dev/js/JsAstMapper.java index 5893b4f2dc5..9f8a10069c0 100644 --- a/js/js.parser/src/com/google/gwt/dev/js/JsAstMapper.java +++ b/js/js.parser/src/com/google/gwt/dev/js/JsAstMapper.java @@ -392,9 +392,7 @@ public class JsAstMapper { JsUnaryOperator.DELETE, to); } else { - throw createParserException( - "'delete' can only operate on property names and array elements", - from); + return new JsNullLiteral(); } } diff --git a/js/js.parser/src/com/google/gwt/dev/js/rhino/MessagesBundle.java b/js/js.parser/src/com/google/gwt/dev/js/rhino/MessagesBundle.java index 7a9e976b7c2..dfe4d5f189a 100644 --- a/js/js.parser/src/com/google/gwt/dev/js/rhino/MessagesBundle.java +++ b/js/js.parser/src/com/google/gwt/dev/js/rhino/MessagesBundle.java @@ -81,5 +81,7 @@ public class MessagesBundle extends ListResourceBundle { {"msg.catch.unreachable", "any catch clauses following an unqualified catch are unreachable"}, {"msg.no.name.after.dot", "missing name after . operator"}, {"msg.jsni.expected.identifier", "Expected an identifier in JSNI reference"}, + {"msg.wrong.delete argument", "Wrong argument for ''delete'' operation. " + + "Must be either property reference or array subscript expression."}, }; } \ No newline at end of file diff --git a/js/js.parser/src/com/google/gwt/dev/js/rhino/Parser.java b/js/js.parser/src/com/google/gwt/dev/js/rhino/Parser.java index ec226b44311..b8b7562f7c4 100644 --- a/js/js.parser/src/com/google/gwt/dev/js/rhino/Parser.java +++ b/js/js.parser/src/com/google/gwt/dev/js/rhino/Parser.java @@ -37,6 +37,8 @@ package com.google.gwt.dev.js.rhino; +import org.jetbrains.annotations.NotNull; + import java.io.IOException; import java.util.ArrayList; import java.util.List; @@ -890,8 +892,13 @@ public class Parser { case TokenStream.DEC: return nf.createUnary(tt, TokenStream.PRE, memberExpr(ts, true), position); - case TokenStream.DELPROP: - return nf.createUnary(TokenStream.DELPROP, unaryExpr(ts), position); + case TokenStream.DELPROP: { + Node argument = unaryExpr(ts); + if (!isValidDeleteArgument(argument)) { + Context.reportError("msg.wrong.delete argument", argument.getPosition(), ts.lastPosition); + } + return nf.createUnary(TokenStream.DELPROP, argument, position); + } case TokenStream.ERROR: break; @@ -922,6 +929,10 @@ public class Parser { return nf.createName("err", position); // Only reached on error. Try to continue. } + private static boolean isValidDeleteArgument(@NotNull Node node) { + return node.type == TokenStream.GETPROP || node.type == TokenStream.GETELEM; + } + private Node argumentList(TokenStream ts, Node listNode) throws IOException, JavaScriptException { boolean matched; ts.flags |= TokenStream.TSF_REGEXP; From f63e33b23d1cc5231fd1ff57fb6c13089a1ae900 Mon Sep 17 00:00:00 2001 From: Alexey Sedunov Date: Tue, 12 Sep 2017 20:17:06 +0300 Subject: [PATCH 162/212] Modules: Support production-on-test dependency This feature is supported in IDEA project configuration and can be used in Maven/Gradle-based projects #KT-20112 Fixed --- .../kotlin/idea/KotlinPluginUtil.java | 0 .../idea/caches/resolve/IdeaModuleInfos.kt | 37 ++- .../idea/maven/KotlinMavenImporterTest.kt | 215 ++++++++++++++++++ 3 files changed, 242 insertions(+), 10 deletions(-) rename idea/{ => idea-analysis}/src/org/jetbrains/kotlin/idea/KotlinPluginUtil.java (100%) diff --git a/idea/src/org/jetbrains/kotlin/idea/KotlinPluginUtil.java b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/KotlinPluginUtil.java similarity index 100% rename from idea/src/org/jetbrains/kotlin/idea/KotlinPluginUtil.java rename to idea/idea-analysis/src/org/jetbrains/kotlin/idea/KotlinPluginUtil.java diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/resolve/IdeaModuleInfos.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/resolve/IdeaModuleInfos.kt index bffa8c2a4a4..d046bc971ce 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/resolve/IdeaModuleInfos.kt +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/resolve/IdeaModuleInfos.kt @@ -21,6 +21,7 @@ import com.intellij.openapi.module.impl.scopes.LibraryScopeBase import com.intellij.openapi.project.Project import com.intellij.openapi.projectRoots.Sdk import com.intellij.openapi.roots.* +import com.intellij.openapi.roots.impl.ModuleOrderEntryImpl import com.intellij.openapi.roots.impl.libraries.LibraryEx import com.intellij.openapi.roots.libraries.Library import com.intellij.openapi.util.ModificationTracker @@ -35,6 +36,7 @@ import org.jetbrains.kotlin.analyzer.ModuleInfo import org.jetbrains.kotlin.analyzer.TrackableModuleInfo import org.jetbrains.kotlin.caches.resolve.LibraryModuleInfo import org.jetbrains.kotlin.descriptors.ModuleDescriptor +import org.jetbrains.kotlin.idea.KotlinPluginUtil import org.jetbrains.kotlin.idea.framework.getLibraryPlatform import org.jetbrains.kotlin.idea.project.KotlinModuleModificationTracker import org.jetbrains.kotlin.idea.project.TargetPlatformDetector @@ -58,8 +60,8 @@ interface IdeaModuleInfo : ModuleInfo { override fun dependencies(): List } -private fun orderEntryToModuleInfo(project: Project, orderEntry: OrderEntry, productionOnly: Boolean): List { - fun Module.toInfos() = correspondingModuleInfos().filter { !productionOnly || it is ModuleProductionSourceInfo } +private fun orderEntryToModuleInfo(project: Project, orderEntry: OrderEntry, forProduction: Boolean): List { + fun Module.toInfos() = correspondingModuleInfos().filter { !forProduction || it is ModuleProductionSourceInfo } if (!orderEntry.isValid) return emptyList() @@ -68,7 +70,13 @@ private fun orderEntryToModuleInfo(project: Project, orderEntry: OrderEntry, pro orderEntry.getOwnerModule().toInfos() } is ModuleOrderEntry -> { - orderEntry.module?.toInfos().orEmpty() + val module = orderEntry.module ?: return emptyList() + if (forProduction && orderEntry is ModuleOrderEntryImpl && orderEntry.isProductionOnTestDependency) { + listOfNotNull(module.testSourceInfo()) + } + else { + module.toInfos() + } } is LibraryOrderEntry -> { val library = orderEntry.library ?: return listOf() @@ -88,16 +96,25 @@ fun Module.cached(provider: CachedValueProvider): T { return CachedValuesManager.getManager(project).getCachedValue(this, provider) } -private fun ideaModelDependencies(module: Module, productionOnly: Boolean): List { +private fun OrderEntry.acceptAsDependency(forProduction: Boolean): Boolean { + return this !is ExportableOrderEntry + || !forProduction + // this is needed for Maven/Gradle projects with "production-on-test" dependency + || this is ModuleOrderEntryImpl && isProductionOnTestDependency + || scope.isForProductionCompile +} + +private fun ideaModelDependencies(module: Module, forProduction: Boolean): List { //NOTE: lib dependencies can be processed several times during recursive traversal val result = LinkedHashSet() val dependencyEnumerator = ModuleRootManager.getInstance(module).orderEntries().compileOnly().recursively().exportedOnly() - if (productionOnly) { + if (forProduction && !(KotlinPluginUtil.isMavenModule(module) || KotlinPluginUtil.isGradleModule(module))) { dependencyEnumerator.productionOnly() } - dependencyEnumerator.forEach { - orderEntry -> - result.addAll(orderEntryToModuleInfo(module.project, orderEntry!!, productionOnly)) + dependencyEnumerator.forEach { orderEntry -> + if (orderEntry.acceptAsDependency(forProduction)) { + result.addAll(orderEntryToModuleInfo(module.project, orderEntry!!, forProduction)) + } true } return result.toList() @@ -125,7 +142,7 @@ data class ModuleProductionSourceInfo internal constructor(override val module: override fun dependencies() = module.cached(CachedValueProvider { CachedValueProvider.Result( - ideaModelDependencies(module, productionOnly = true), + ideaModelDependencies(module, forProduction = true), ProjectRootModificationTracker.getInstance(module.project)) }) } @@ -140,7 +157,7 @@ data class ModuleTestSourceInfo internal constructor(override val module: Module override fun dependencies() = module.cached(CachedValueProvider { CachedValueProvider.Result( - ideaModelDependencies(module, productionOnly = false), + ideaModelDependencies(module, forProduction = false), ProjectRootModificationTracker.getInstance(module.project)) }) diff --git a/idea/idea-maven/test/org/jetbrains/kotlin/idea/maven/KotlinMavenImporterTest.kt b/idea/idea-maven/test/org/jetbrains/kotlin/idea/maven/KotlinMavenImporterTest.kt index 438f2d3ce15..ceaf3753f8c 100644 --- a/idea/idea-maven/test/org/jetbrains/kotlin/idea/maven/KotlinMavenImporterTest.kt +++ b/idea/idea-maven/test/org/jetbrains/kotlin/idea/maven/KotlinMavenImporterTest.kt @@ -23,12 +23,16 @@ import com.intellij.openapi.projectRoots.ProjectJdkTable import com.intellij.openapi.roots.LibraryOrderEntry import com.intellij.openapi.roots.ModuleRootManager import com.intellij.openapi.roots.impl.libraries.LibraryEx +import junit.framework.TestCase import org.jetbrains.kotlin.cli.common.arguments.K2JSCompilerArguments import org.jetbrains.kotlin.cli.common.arguments.K2JVMCompilerArguments import org.jetbrains.kotlin.config.* +import org.jetbrains.kotlin.idea.caches.resolve.analyzeAndGetResult import org.jetbrains.kotlin.idea.facet.KotlinFacet import org.jetbrains.kotlin.idea.framework.CommonLibraryKind import org.jetbrains.kotlin.idea.framework.JSLibraryKind +import org.jetbrains.kotlin.idea.refactoring.toPsiFile +import org.jetbrains.kotlin.psi.KtFile import org.junit.Assert import java.io.File @@ -1787,6 +1791,217 @@ class KotlinMavenImporterTest : MavenImportingTestCase() { } } + fun testProductionOnTestDependency() { + createProjectSubDirs( + "module-with-java/src/main/java", + "module-with-java/src/test/java", + "module-with-kotlin/src/main/kotlin", + "module-with-kotlin/src/test/kotlin" + ) + + val dummyFile = createProjectSubFile( + "module-with-kotlin/src/main/kotlin/foo/dummy.kt", + """ + package foo + + fun dummy() { + } + + """.trimIndent() + ) + + val pomA = createModulePom( + "module-with-java", + """ + + test-group + mvnktest + 0.0.0.0-SNAPSHOT + + + module-with-java + + + + + org.apache.maven.plugins + maven-jar-plugin + 2.6 + + + + test-jar + + + + + + + """.trimIndent() + ) + + val pomB = createModulePom( + "module-with-kotlin", + """ + + test-group + mvnktest + 0.0.0.0-SNAPSHOT + + + module-with-kotlin + + + 1.1.4 + 1.8 + true + + + + + + org.jetbrains.kotlin + kotlin-stdlib + ${"$"}{kotlin.version} + + + org.jetbrains.kotlin + kotlin-runtime + ${"$"}{kotlin.version} + + + org.jetbrains.kotlin + kotlin-reflect + ${"$"}{kotlin.version} + + + + test-group + module-with-java + + + + test-group + module-with-java + test-jar + compile + + + + + + + kotlin-maven-plugin + org.jetbrains.kotlin + ${"$"}{kotlin.version} + + + compile + compile + + + ${"$"}{project.basedir}/src/main/kotlin + ${"$"}{project.basedir}/src/main/java + + + + + test-compile + test-compile + + + ${"$"}{project.basedir}/src/test/kotlin + ${"$"}{project.basedir}/src/test/java + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.5.1 + + + + default-compile + none + + + + default-testCompile + none + + + java-compile + compile + compile + + + java-test-compile + test-compile + testCompile + + + + + + """.trimIndent() + ) + + val pomMain = createModulePom( + "", + """ + test-group + mvnktest + 0.0.0.0-SNAPSHOT + + pom + + + 1.1.4 + 1.8 + true + + + + module-with-java + module-with-kotlin + + + + + + test-group + module-with-kotlin + ${"$"}{project.version} + + + test-group + module-with-java + ${"$"}{project.version} + + + test-group + module-with-java + ${"$"}{project.version} + test-jar + test + + + + """.trimIndent() + ) + + importProjects(pomMain, pomA, pomB) + + assertModules("module-with-kotlin", "module-with-java", "mvnktest") + + val dependencies = (dummyFile.toPsiFile(myProject) as KtFile).analyzeAndGetResult().moduleDescriptor.allDependencyModules + TestCase.assertTrue(dependencies.any { it.name.asString() == "" }) + TestCase.assertTrue(dependencies.any { it.name.asString() == "" }) + } + private fun assertImporterStatePresent() { assertNotNull("Kotlin importer component is not present", myTestFixture.module.getComponent(KotlinImporterComponent::class.java)) } From b4847e69e84aa460914f5fe451429e855dbd055c Mon Sep 17 00:00:00 2001 From: Alexey Sedunov Date: Fri, 29 Sep 2017 14:25:08 +0300 Subject: [PATCH 163/212] Minor: Fix test data --- .../org/jetbrains/kotlin/idea/maven/KotlinMavenImporterTest.kt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/idea/idea-maven/test/org/jetbrains/kotlin/idea/maven/KotlinMavenImporterTest.kt b/idea/idea-maven/test/org/jetbrains/kotlin/idea/maven/KotlinMavenImporterTest.kt index ceaf3753f8c..03c2eb62fee 100644 --- a/idea/idea-maven/test/org/jetbrains/kotlin/idea/maven/KotlinMavenImporterTest.kt +++ b/idea/idea-maven/test/org/jetbrains/kotlin/idea/maven/KotlinMavenImporterTest.kt @@ -1409,7 +1409,8 @@ class KotlinMavenImporterTest : MavenImportingTestCase() { listOf("plugin:org.jetbrains.kotlin.allopen:annotation=org.springframework.stereotype.Component", "plugin:org.jetbrains.kotlin.allopen:annotation=org.springframework.transaction.annotation.Transactional", "plugin:org.jetbrains.kotlin.allopen:annotation=org.springframework.scheduling.annotation.Async", - "plugin:org.jetbrains.kotlin.allopen:annotation=org.springframework.cache.annotation.Cacheable"), + "plugin:org.jetbrains.kotlin.allopen:annotation=org.springframework.cache.annotation.Cacheable", + "plugin:org.jetbrains.kotlin.allopen:annotation=org.springframework.boot.test.context.SpringBootTest"), compilerArguments!!.pluginOptions!!.toList() ) } From be21a8477847b88c6185d7904157f45830ac49a9 Mon Sep 17 00:00:00 2001 From: Alexey Sedunov Date: Wed, 27 Sep 2017 15:12:38 +0300 Subject: [PATCH 164/212] Configuration: Fix modification checking in compiler settings UI #KT-18996 Fixed --- .../configuration/KotlinCompilerConfigurableTab.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/idea/src/org/jetbrains/kotlin/idea/compiler/configuration/KotlinCompilerConfigurableTab.java b/idea/src/org/jetbrains/kotlin/idea/compiler/configuration/KotlinCompilerConfigurableTab.java index 936e6548464..3bc2d18255c 100644 --- a/idea/src/org/jetbrains/kotlin/idea/compiler/configuration/KotlinCompilerConfigurableTab.java +++ b/idea/src/org/jetbrains/kotlin/idea/compiler/configuration/KotlinCompilerConfigurableTab.java @@ -443,10 +443,10 @@ public class KotlinCompilerConfigurableTab implements SearchableConfigurable, Co ComparingUtils.isModified(keepAliveCheckBox, compilerWorkspaceSettings.getEnableDaemon()))) || ComparingUtils.isModified(generateSourceMapsCheckBox, k2jsCompilerArguments.getSourceMap()) || - ComparingUtils.isModified(outputPrefixFile, k2jsCompilerArguments.getOutputPrefix()) || - ComparingUtils.isModified(outputPostfixFile, k2jsCompilerArguments.getOutputPostfix()) || + ComparingUtils.isModified(outputPrefixFile, StringUtil.notNullize(k2jsCompilerArguments.getOutputPrefix())) || + ComparingUtils.isModified(outputPostfixFile, StringUtil.notNullize(k2jsCompilerArguments.getOutputPostfix())) || !getSelectedModuleKind().equals(getModuleKindOrDefault(k2jsCompilerArguments.getModuleKind())) || - ComparingUtils.isModified(sourceMapPrefix, k2jsCompilerArguments.getSourceMapPrefix()) || + ComparingUtils.isModified(sourceMapPrefix, StringUtil.notNullize(k2jsCompilerArguments.getSourceMapPrefix())) || !getSelectedSourceMapSourceEmbedding().equals( getSourceMapSourceEmbeddingOrDefault(k2jsCompilerArguments.getSourceMapEmbedSources())) || !getSelectedJvmVersion().equals(getJvmVersionOrDefault(k2jvmCompilerArguments.getJvmTarget())); From 49cbb2219c7678a1bfd5fc2d5fa7ac3b6ba2e4c2 Mon Sep 17 00:00:00 2001 From: Sergey Mashkov Date: Thu, 28 Sep 2017 20:17:14 +0300 Subject: [PATCH 165/212] Maven: reduce maven plugin output #KT-20400 Fixed --- .../src/it/test-plugins/expected.log | 8 -------- .../tools/kotlin-maven-plugin/src/it/simple/expected.log | 3 --- .../java/org/jetbrains/kotlin/maven/K2JVMCompileMojo.java | 2 +- .../org/jetbrains/kotlin/maven/KotlinCompileMojoBase.java | 4 ++-- 4 files changed, 3 insertions(+), 14 deletions(-) diff --git a/libraries/tools/kotlin-maven-plugin-test/src/it/test-plugins/expected.log b/libraries/tools/kotlin-maven-plugin-test/src/it/test-plugins/expected.log index 83cdfeb956f..19e6a306de6 100644 --- a/libraries/tools/kotlin-maven-plugin-test/src/it/test-plugins/expected.log +++ b/libraries/tools/kotlin-maven-plugin-test/src/it/test-plugins/expected.log @@ -1,17 +1,9 @@ -[INFO] Kotlin version @snapshot@ (JRE ) -[INFO] Compiling Kotlin sources from [/test-extension/src/main/kotlin] -[INFO] Module name is test-extension [WARNING] Some JAR files in the classpath have the Kotlin Runtime library bundled into them. This may cause difficult to debug problems if there's a different version of the Kotlin Runtime library in the classpath. Consider removing these libraries from the classpath or use '-Xskip-runtime-version-check' to suppress this warning [WARNING] /local-repo/org/jetbrains/kotlin/kotlin-compiler/@snapshot@/kotlin-compiler-@snapshot@.jar: (-1, -1) Library has Kotlin runtime bundled into it -[INFO] Kotlin version @snapshot@ (JRE ) [WARNING] No sources found skipping Kotlin compile -[INFO] Kotlin version @snapshot@ (JRE ) -[INFO] Compiling Kotlin sources from [/use-test-extension/src/main/kotlin] -[INFO] Module name is use-test-extension [INFO] Applicability test for project use-test-extension [INFO] Applied plugin: 'test-me' [INFO] Configuring test plugin with arguments [INFO] Plugin applied [INFO] Option value: my-special-value -[INFO] Kotlin version @snapshot@ (JRE ) [WARNING] No sources found skipping Kotlin compile diff --git a/libraries/tools/kotlin-maven-plugin/src/it/simple/expected.log b/libraries/tools/kotlin-maven-plugin/src/it/simple/expected.log index 6d4adc457b4..e69de29bb2d 100644 --- a/libraries/tools/kotlin-maven-plugin/src/it/simple/expected.log +++ b/libraries/tools/kotlin-maven-plugin/src/it/simple/expected.log @@ -1,3 +0,0 @@ -[INFO] Kotlin version @snapshot@ (JRE ) -[INFO] Compiling Kotlin sources from [/src/main/kotlin] -[INFO] Module name is test-project diff --git a/libraries/tools/kotlin-maven-plugin/src/main/java/org/jetbrains/kotlin/maven/K2JVMCompileMojo.java b/libraries/tools/kotlin-maven-plugin/src/main/java/org/jetbrains/kotlin/maven/K2JVMCompileMojo.java index 92ca920600f..70c36bfe071 100644 --- a/libraries/tools/kotlin-maven-plugin/src/main/java/org/jetbrains/kotlin/maven/K2JVMCompileMojo.java +++ b/libraries/tools/kotlin-maven-plugin/src/main/java/org/jetbrains/kotlin/maven/K2JVMCompileMojo.java @@ -168,7 +168,7 @@ public class K2JVMCompileMojo extends KotlinCompileMojoBase e @Override public void execute() throws MojoExecutionException, MojoFailureException { - getLog().info("Kotlin version " + KotlinCompilerVersion.VERSION + + getLog().debug("Kotlin version " + KotlinCompilerVersion.VERSION + " (JRE " + System.getProperty("java.runtime.version") + ")"); if (!hasKotlinFilesInSources()) { @@ -433,7 +433,7 @@ public abstract class KotlinCompileMojoBase e if (sourceRoots.isEmpty()) { throw new MojoExecutionException("No source roots to compile"); } - getLog().info("Compiling Kotlin sources from " + sourceRoots); + getLog().debug("Compiling Kotlin sources from " + sourceRoots); return sourceRoots; } From 03f97ff7f1dce7339168507fe9c3b37853e8b5ab Mon Sep 17 00:00:00 2001 From: Simon Ogorodnik Date: Fri, 29 Sep 2017 14:54:23 +0300 Subject: [PATCH 166/212] Revert "Add 1.2-Beta to changelog" This reverts commit 676e5d2a887813e99f6119a4ddb19d84a0a5502f. --- ChangeLog.md | 78 ---------------------------------------------------- 1 file changed, 78 deletions(-) diff --git a/ChangeLog.md b/ChangeLog.md index cf092be65b7..6bde6ee6116 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -3,84 +3,6 @@ -## 1.2-Beta - -### Android - -#### New Features - -- [`KT-20051`](https://youtrack.jetbrains.com/issue/KT-20051) Quickfixes to support @Parcelize -#### Fixes - -- [`KT-19747`](https://youtrack.jetbrains.com/issue/KT-19747) Android extensions + Parcelable: VerifyError in case of RawValue annotation on a type when it's unknown how to parcel it -- [`KT-19899`](https://youtrack.jetbrains.com/issue/KT-19899) Parcelize: Building with ProGuard enabled -- [`KT-19988`](https://youtrack.jetbrains.com/issue/KT-19988) [Android Extensions] inner class LayoutContainer causes NoSuchMethodError -- [`KT-20002`](https://youtrack.jetbrains.com/issue/KT-20002) Parcelize explodes on LongArray -- [`KT-20019`](https://youtrack.jetbrains.com/issue/KT-20019) Parcelize does not propogate flags argument when writing nested Parcelable -- [`KT-20020`](https://youtrack.jetbrains.com/issue/KT-20020) Parcelize does not use primitive array read/write methods on Parcel -- [`KT-20021`](https://youtrack.jetbrains.com/issue/KT-20021) Parcelize does not serialize Parcelable enum as Parcelable -- [`KT-20022`](https://youtrack.jetbrains.com/issue/KT-20022) Parcelize should dispatch directly to java.lang.Enum when writing an enum. -- [`KT-20034`](https://youtrack.jetbrains.com/issue/KT-20034) Application installation failed (INSTALL_FAILED_DEXOPT) in Android 4.3 devices if I use Parcelize -- [`KT-20057`](https://youtrack.jetbrains.com/issue/KT-20057) Parcelize should use specialized write/create methods where available. -- [`KT-20062`](https://youtrack.jetbrains.com/issue/KT-20062) Parceler should allow otherwise un-parcelable property types in enclosing class. -- [`KT-20170`](https://youtrack.jetbrains.com/issue/KT-20170) UAST: Getting the location of a UIdentifier is tricky - -### Compiler - -- [`KT-4565`](https://youtrack.jetbrains.com/issue/KT-4565) Support smart casting of safe cast's subject (and also safe call's receiver) -- [`KT-8492`](https://youtrack.jetbrains.com/issue/KT-8492) Null check should work after save call with elvis in condition -- [`KT-9327`](https://youtrack.jetbrains.com/issue/KT-9327) Need a way to check whether a lateinit property was assigned -- [`KT-14138`](https://youtrack.jetbrains.com/issue/KT-14138) Allow lateinit local variables -- [`KT-15461`](https://youtrack.jetbrains.com/issue/KT-15461) Allow lateinit top level properties -- [`KT-7257`](https://youtrack.jetbrains.com/issue/KT-7257) NPE when accessing properties of enum from inner lambda on initialization -- [`KT-9580`](https://youtrack.jetbrains.com/issue/KT-9580) Report an error if 'setparam' target does not make sense for a parameter declaration -- [`KT-16310`](https://youtrack.jetbrains.com/issue/KT-16310) Nested classes inside enum entries capturing outer members -- [`KT-20155`](https://youtrack.jetbrains.com/issue/KT-20155) Confusing diagnostics on a nested interface in inner class - -### IDE - -- [`KT-14175`](https://youtrack.jetbrains.com/issue/KT-14175) Surround with try ... catch (... finally) doesn't work for expressions -- [`KT-20308`](https://youtrack.jetbrains.com/issue/KT-20308) New Gradle with Kotlin DSL project wizard -- [`KT-18353`](https://youtrack.jetbrains.com/issue/KT-18353) Support UAST for .kts files -- [`KT-19823`](https://youtrack.jetbrains.com/issue/KT-19823) Kotlin Gradle project import into IntelliJ: import kapt generated classes into classpath -- [`KT-20185`](https://youtrack.jetbrains.com/issue/KT-20185) Stub and PSI element type mismatch for "var nullableSuspend: (suspend (P) -> Unit)? = null" - -### Language design - -- [`KT-14486`](https://youtrack.jetbrains.com/issue/KT-14486) Allow smart cast in closure if a local variable is modified only before it (and not after or inside) -- [`KT-15667`](https://youtrack.jetbrains.com/issue/KT-15667) Support "::foo" as a short-hand syntax for bound callable reference to "this::foo" -- [`KT-16681`](https://youtrack.jetbrains.com/issue/KT-16681) kotlin allows mutating the field of read-only property - -### Libraries - -- [`KT-19258`](https://youtrack.jetbrains.com/issue/KT-19258) Java 9: module-info.java with `requires kotlin.stdlib` causes compiler to fail: "module reads package from both kotlin.reflect and kotlin.stdlib" - -### Tools - -- [`KT-19692`](https://youtrack.jetbrains.com/issue/KT-19692) kotlin-jpa plugin doesn't support @MappedSuperclass annotation -- [`KT-20030`](https://youtrack.jetbrains.com/issue/KT-20030) Parcelize can directly reference writeToParcel and CREATOR for final, non-Parcelize Parcelable types in same compilation unit. -- [`KT-19742`](https://youtrack.jetbrains.com/issue/KT-19742) [Android extensions] Calling clearFindViewByIdCache causes NPE -- [`KT-19749`](https://youtrack.jetbrains.com/issue/KT-19749) Android extensions + Parcelable: NoSuchMethodError on attempt to pack into parcel a serializable object -- [`KT-20026`](https://youtrack.jetbrains.com/issue/KT-20026) Parcelize overrides describeContents despite being already implemented. -- [`KT-20027`](https://youtrack.jetbrains.com/issue/KT-20027) Parcelize uses wrong classloader when reading parcelable type. -- [`KT-20029`](https://youtrack.jetbrains.com/issue/KT-20029) Parcelize should not directly reference parcel methods on types outside compilation unit -- [`KT-20032`](https://youtrack.jetbrains.com/issue/KT-20032) Parcelize does not respect type nullability in case of Parcelize parcelables - -### Tools. CLI - -- [`KT-10563`](https://youtrack.jetbrains.com/issue/KT-10563) Support a command line argument -Werror to treat warnings as errors - -### Tools. Gradle - -- [`KT-20212`](https://youtrack.jetbrains.com/issue/KT-20212) Cannot access internal components from test code - -### Tools. kapt - -- [`KT-17923`](https://youtrack.jetbrains.com/issue/KT-17923) Reference to Dagger generated class is highlighted red -- [`KT-18923`](https://youtrack.jetbrains.com/issue/KT-18923) Kapt: Do not use the Kotlin error message collector to issue errors from kapt -- [`KT-19097`](https://youtrack.jetbrains.com/issue/KT-19097) Request: Decent support of `kapt.kotlin.generated` on Intellij/Android Studio -- [`KT-20001`](https://youtrack.jetbrains.com/issue/KT-20001) kapt generate stubs Gradle task does not depend on the compilation of sub-project kapt dependencies - ## 1.1.50 ### Android From 8496944a36d1f4219ba41b098a420e150ba7b1ff Mon Sep 17 00:00:00 2001 From: Alexander Udalov Date: Wed, 20 Sep 2017 18:57:14 +0300 Subject: [PATCH 167/212] Refactor JavaModule, support several roots in one module In case of partial/incremental compilation, a module usually consists of two roots, one of which is source and another is binary. Thus, it's incorrect to divide modules into "binary" and "non-binary", and only look for .class files in "binary" modules in CliJavaModuleResolver.findJavaModule. The more correct way is to think of a module as a collection of roots, and every root is either binary or source --- .../jvm/compiler/ClasspathRootsResolver.kt | 32 ++++++++++++------- .../cli/jvm/modules/CliJavaModuleFinder.kt | 2 +- .../cli/jvm/modules/CliJavaModuleResolver.kt | 4 +-- .../kotlin/resolve/jvm/modules/JavaModule.kt | 21 +++++++----- 4 files changed, 36 insertions(+), 23 deletions(-) diff --git a/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/compiler/ClasspathRootsResolver.kt b/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/compiler/ClasspathRootsResolver.kt index 46cd58d5360..b154fc080f6 100644 --- a/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/compiler/ClasspathRootsResolver.kt +++ b/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/compiler/ClasspathRootsResolver.kt @@ -109,7 +109,10 @@ class ClasspathRootsResolver( val psiFile = psiManager.findFile(moduleInfoFile) ?: return null val psiJavaModule = psiFile.children.singleOrNull { it is PsiJavaModule } as? PsiJavaModule ?: return null - return JavaModule.Explicit(JavaModuleInfo.create(psiJavaModule), root, moduleInfoFile, isBinary = false) + + val roots = listOf(JavaModule.Root(root, isBinary = false)) + + return JavaModule.Explicit(JavaModuleInfo.create(psiJavaModule), roots, moduleInfoFile) } private fun modularBinaryRoot(root: VirtualFile, originalFile: File): JavaModule? { @@ -124,14 +127,16 @@ class ClasspathRootsResolver( if (moduleInfoFile != null) { val moduleInfo = JavaModuleInfo.read(moduleInfoFile) ?: return null - return JavaModule.Explicit(moduleInfo, root, moduleInfoFile, isBinary = true) + return JavaModule.Explicit(moduleInfo, listOf(JavaModule.Root(root, isBinary = true)), moduleInfoFile) } // Only .jar files can be automatic modules if (isJar) { + val moduleRoot = listOf(JavaModule.Root(root, isBinary = true)) + val automaticModuleName = manifest?.getValue(AUTOMATIC_MODULE_NAME) if (automaticModuleName != null) { - return JavaModule.Automatic(automaticModuleName, root) + return JavaModule.Automatic(automaticModuleName, moduleRoot) } val moduleName = LightJavaModule.moduleName(originalFile.nameWithoutExtension) @@ -139,7 +144,7 @@ class ClasspathRootsResolver( report(ERROR, "Cannot infer automatic module name for the file", VfsUtilCore.getVirtualFileForJar(root) ?: root) return null } - return JavaModule.Automatic(moduleName, root) + return JavaModule.Automatic(moduleName, moduleRoot) } return null @@ -169,11 +174,15 @@ class ClasspathRootsResolver( if (existing == null) { javaModuleFinder.addUserModule(module) } - else if (module.moduleRoot != existing.moduleRoot) { - val jar = VfsUtilCore.getVirtualFileForJar(module.moduleRoot) ?: module.moduleRoot - val existingPath = (VfsUtilCore.getVirtualFileForJar(existing.moduleRoot) ?: existing.moduleRoot).path + else if (module.moduleRoots != existing.moduleRoots) { + fun JavaModule.getRootFile() = + moduleRoots.firstOrNull()?.file?.let { VfsUtilCore.getVirtualFileForJar(it) ?: it } + + val thisFile = module.getRootFile() + val existingFile = existing.getRootFile() + val atExistingPath = if (existingFile == null) "" else " at: ${existingFile.path}" report(STRONG_WARNING, "The root is ignored because a module with the same name '${module.name}' " + - "has been found earlier on the module path at: $existingPath", jar) + "has been found earlier on the module path$atExistingPath", thisFile) } } @@ -212,10 +221,9 @@ class ClasspathRootsResolver( report(ERROR, "Module $moduleName cannot be found in the module graph") } else { - result.add(JavaRoot( - module.moduleRoot, - if (module.isBinary) JavaRoot.RootType.BINARY else JavaRoot.RootType.SOURCE - )) + for ((root, isBinary) in module.moduleRoots) { + result.add(JavaRoot(root, if (isBinary) JavaRoot.RootType.BINARY else JavaRoot.RootType.SOURCE)) + } } } diff --git a/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/modules/CliJavaModuleFinder.kt b/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/modules/CliJavaModuleFinder.kt index 87e9eda494e..5abe6b073c1 100644 --- a/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/modules/CliJavaModuleFinder.kt +++ b/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/modules/CliJavaModuleFinder.kt @@ -42,6 +42,6 @@ class CliJavaModuleFinder(jrtFileSystemRoot: VirtualFile?) : JavaModuleFinder { private fun findSystemModule(moduleRoot: VirtualFile): JavaModule.Explicit? { val file = moduleRoot.findChild(PsiJavaModule.MODULE_INFO_CLS_FILE) ?: return null val moduleInfo = JavaModuleInfo.read(file) ?: return null - return JavaModule.Explicit(moduleInfo, moduleRoot, file, isBinary = true) + return JavaModule.Explicit(moduleInfo, listOf(JavaModule.Root(moduleRoot, isBinary = true)), file) } } diff --git a/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/modules/CliJavaModuleResolver.kt b/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/modules/CliJavaModuleResolver.kt index a7e15343179..d3550ba7109 100644 --- a/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/modules/CliJavaModuleResolver.kt +++ b/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/modules/CliJavaModuleResolver.kt @@ -46,13 +46,13 @@ class CliJavaModuleResolver( return when (file.fileType) { KotlinFileType.INSTANCE, JavaFileType.INSTANCE -> sourceModule - JavaClassFileType.INSTANCE -> userModules.firstOrNull { module -> module.isBinary && file in module } + JavaClassFileType.INSTANCE -> userModules.firstOrNull { module -> file in module } else -> null } } private operator fun JavaModule.contains(file: VirtualFile): Boolean = - VfsUtilCore.isAncestor(moduleRoot, file, false) + moduleRoots.any { (root, isBinary) -> isBinary && VfsUtilCore.isAncestor(root, file, false) } override fun checkAccessibility( fileFromOurModule: VirtualFile?, referencedFile: VirtualFile, referencedPackage: FqName? diff --git a/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/modules/JavaModule.kt b/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/modules/JavaModule.kt index 3d183abb2aa..da76e58a924 100644 --- a/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/modules/JavaModule.kt +++ b/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/modules/JavaModule.kt @@ -16,6 +16,7 @@ package org.jetbrains.kotlin.resolve.jvm.modules +import com.intellij.ide.highlighter.JavaClassFileType import com.intellij.openapi.vfs.VirtualFile import org.jetbrains.kotlin.name.FqName @@ -28,11 +29,11 @@ interface JavaModule { val name: String /** - * A directory or the root of a .jar file on the module path. Can also be the path to the `module-info.java` file if that path - * was passed as an explicit argument to the compiler. - * In case of an explicit module, module-info.class file can be found in its children. + * A non-empty list of directories or roots of .jar files on the module path. Can also contain the path to the `module-info.java` file + * if that path was passed as an explicit argument to the compiler. + * In case of an explicit module, module-info.class or module-info.java file must exist in at least one of these roots (the first wins). */ - val moduleRoot: VirtualFile + val moduleRoots: List /** * A module-info.class or module-info.java file where this module was loaded from. @@ -64,7 +65,9 @@ interface JavaModule { */ fun exportsTo(packageFqName: FqName, moduleName: String): Boolean - class Automatic(override val name: String, override val moduleRoot: VirtualFile) : JavaModule { + data class Root(val file: VirtualFile, val isBinary: Boolean) + + class Automatic(override val name: String, override val moduleRoots: List) : JavaModule { override val moduleInfoFile: VirtualFile? get() = null override val isBinary: Boolean get() = true @@ -78,13 +81,15 @@ interface JavaModule { class Explicit( val moduleInfo: JavaModuleInfo, - override val moduleRoot: VirtualFile, - override val moduleInfoFile: VirtualFile, - override val isBinary: Boolean + override val moduleRoots: List, + override val moduleInfoFile: VirtualFile ) : JavaModule { override val name: String get() = moduleInfo.moduleName + override val isBinary: Boolean + get() = moduleInfoFile.fileType == JavaClassFileType.INSTANCE + override fun exports(packageFqName: FqName): Boolean { return moduleInfo.exports.any { (fqName, toModules) -> fqName == packageFqName && toModules.isEmpty() From 848be226eddef60cb83cc5cc805ad00d59bc62f3 Mon Sep 17 00:00:00 2001 From: Alexander Udalov Date: Fri, 22 Sep 2017 14:43:36 +0300 Subject: [PATCH 168/212] Minor, invert JavaModule.isBinary -> isSourceModule --- .../cli/jvm/compiler/ClasspathRootsResolver.kt | 4 +++- .../cli/jvm/modules/CliJavaModuleResolver.kt | 4 ++-- .../kotlin/resolve/jvm/modules/JavaModule.kt | 15 ++++++++------- 3 files changed, 13 insertions(+), 10 deletions(-) diff --git a/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/compiler/ClasspathRootsResolver.kt b/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/compiler/ClasspathRootsResolver.kt index b154fc080f6..5b2d18a2e90 100644 --- a/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/compiler/ClasspathRootsResolver.kt +++ b/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/compiler/ClasspathRootsResolver.kt @@ -161,7 +161,9 @@ class ClasspathRootsResolver( } private fun addModularRoots(modules: List, result: MutableList) { - val sourceModules = modules.filterIsInstance().filterNot(JavaModule::isBinary) + // In current implementation, at most one source module is supported. This can be relaxed in the future if we support another + // compilation mode, similar to java's --module-source-path + val sourceModules = modules.filterIsInstance().filter(JavaModule::isSourceModule) if (sourceModules.size > 1) { for (module in sourceModules) { report(ERROR, "Too many source module declarations found", module.moduleInfoFile) diff --git a/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/modules/CliJavaModuleResolver.kt b/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/modules/CliJavaModuleResolver.kt index d3550ba7109..24fab9f872e 100644 --- a/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/modules/CliJavaModuleResolver.kt +++ b/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/modules/CliJavaModuleResolver.kt @@ -32,12 +32,12 @@ class CliJavaModuleResolver( private val systemModules: List ) : JavaModuleResolver { init { - assert(userModules.count { !it.isBinary } <= 1) { + assert(userModules.count(JavaModule::isSourceModule) <= 1) { "Modules computed by ClasspathRootsResolver cannot have more than one source module: $userModules" } } - private val sourceModule: JavaModule? = userModules.firstOrNull { !it.isBinary } + private val sourceModule: JavaModule? = userModules.firstOrNull(JavaModule::isSourceModule) private fun findJavaModule(file: VirtualFile): JavaModule? { if (file.fileSystem.protocol == StandardFileSystems.JRT_PROTOCOL) { diff --git a/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/modules/JavaModule.kt b/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/modules/JavaModule.kt index da76e58a924..bfe8bbbb9bb 100644 --- a/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/modules/JavaModule.kt +++ b/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/modules/JavaModule.kt @@ -16,7 +16,7 @@ package org.jetbrains.kotlin.resolve.jvm.modules -import com.intellij.ide.highlighter.JavaClassFileType +import com.intellij.ide.highlighter.JavaFileType import com.intellij.openapi.vfs.VirtualFile import org.jetbrains.kotlin.name.FqName @@ -41,10 +41,11 @@ interface JavaModule { val moduleInfoFile: VirtualFile? /** - * `true` if this module is either an automatic module on the module path, or an explicit module loaded from module-info.class. - * `false` if this module is an explicit module loaded from module-info.java. + * `true` if this module is an explicit module loaded from module-info.java, `false` otherwise. This usually corresponds to the module + * currently being compiled. + * Note that in case of partial/incremental compilation, the source module may contain both binary roots and non-binary roots. */ - val isBinary: Boolean + val isSourceModule: Boolean /** * `true` if this module exports the package with the given FQ name to all dependent modules. @@ -70,7 +71,7 @@ interface JavaModule { class Automatic(override val name: String, override val moduleRoots: List) : JavaModule { override val moduleInfoFile: VirtualFile? get() = null - override val isBinary: Boolean get() = true + override val isSourceModule: Boolean get() = false override fun exports(packageFqName: FqName): Boolean = true @@ -87,8 +88,8 @@ interface JavaModule { override val name: String get() = moduleInfo.moduleName - override val isBinary: Boolean - get() = moduleInfoFile.fileType == JavaClassFileType.INSTANCE + override val isSourceModule: Boolean + get() = moduleInfoFile.fileType == JavaFileType.INSTANCE override fun exports(packageFqName: FqName): Boolean { return moduleInfo.exports.any { (fqName, toModules) -> From 0a9c21dbc8d8106e2a4f43d7a4c9fbe0dadf6fb4 Mon Sep 17 00:00:00 2001 From: Alexander Udalov Date: Thu, 21 Sep 2017 19:22:30 +0300 Subject: [PATCH 169/212] Refactor roots computation in ClasspathRootsResolver --- .../jvm/compiler/ClasspathRootsResolver.kt | 84 ++++++++++++------- 1 file changed, 53 insertions(+), 31 deletions(-) diff --git a/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/compiler/ClasspathRootsResolver.kt b/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/compiler/ClasspathRootsResolver.kt index 5b2d18a2e90..6a0f652dbec 100644 --- a/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/compiler/ClasspathRootsResolver.kt +++ b/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/compiler/ClasspathRootsResolver.kt @@ -39,7 +39,6 @@ import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.isValidJavaFqName import org.jetbrains.kotlin.resolve.jvm.modules.JavaModule import org.jetbrains.kotlin.resolve.jvm.modules.JavaModuleInfo -import java.io.File import java.io.IOException import java.util.jar.Attributes import java.util.jar.Manifest @@ -57,49 +56,67 @@ class ClasspathRootsResolver( data class RootsAndModules(val roots: List, val modules: List) - fun convertClasspathRoots(contentRoots: List): RootsAndModules { - val result = mutableListOf() + private data class RootWithPrefix(val root: VirtualFile, val packagePrefix: String?) - val modules = ArrayList() + fun convertClasspathRoots(contentRoots: List): RootsAndModules { + val javaSourceRoots = mutableListOf() + val jvmClasspathRoots = mutableListOf() + val jvmModulePathRoots = mutableListOf() for (contentRoot in contentRoots) { if (contentRoot !is JvmContentRoot) continue val root = contentRootToVirtualFile(contentRoot) ?: continue - when (contentRoot) { - is JavaSourceRoot -> { - val modularRoot = modularSourceRoot(root) - if (modularRoot != null) { - modules += modularRoot - } - else { - result += JavaRoot(root, JavaRoot.RootType.SOURCE, contentRoot.packagePrefix?.let { prefix -> - if (isValidJavaFqName(prefix)) FqName(prefix) - else null.also { - report(STRONG_WARNING, "Invalid package prefix name is ignored: $prefix") - } - }) - } - } - is JvmClasspathRoot -> { - result += JavaRoot(root, JavaRoot.RootType.BINARY) - } - is JvmModulePathRoot -> { - val module = modularBinaryRoot(root, contentRoot.file) - if (module != null) { - modules += module - } - } + is JavaSourceRoot -> javaSourceRoots += RootWithPrefix(root, contentRoot.packagePrefix) + is JvmClasspathRoot -> jvmClasspathRoots += root + is JvmModulePathRoot -> jvmModulePathRoots += root else -> error("Unknown root type: $contentRoot") } } + return computeRoots(javaSourceRoots, jvmClasspathRoots, jvmModulePathRoots) + } + + private fun computeRoots( + javaSourceRoots: List, + jvmClasspathRoots: List, + jvmModulePathRoots: List + ): RootsAndModules { + val result = mutableListOf() + val modules = mutableListOf() + + for ((root, packagePrefix) in javaSourceRoots) { + val modularRoot = modularSourceRoot(root) + if (modularRoot != null) { + modules += modularRoot + } + else { + result += JavaRoot(root, JavaRoot.RootType.SOURCE, packagePrefix?.let { prefix -> + if (isValidJavaFqName(prefix)) FqName(prefix) + else null.also { + report(STRONG_WARNING, "Invalid package prefix name is ignored: $prefix") + } + }) + } + } + + for (root in jvmClasspathRoots) { + result += JavaRoot(root, JavaRoot.RootType.BINARY) + } + + for (root in jvmModulePathRoots) { + val module = modularBinaryRoot(root) + if (module != null) { + modules += module + } + } + addModularRoots(modules, result) return RootsAndModules(result, modules) } - private fun modularSourceRoot(root: VirtualFile): JavaModule.Explicit? { + private fun findSourceModuleInfo(root: VirtualFile): Pair? { val moduleInfoFile = when { root.isDirectory -> root.findChild(PsiJavaModule.MODULE_INFO_FILE) @@ -110,12 +127,16 @@ class ClasspathRootsResolver( val psiFile = psiManager.findFile(moduleInfoFile) ?: return null val psiJavaModule = psiFile.children.singleOrNull { it is PsiJavaModule } as? PsiJavaModule ?: return null - val roots = listOf(JavaModule.Root(root, isBinary = false)) + return moduleInfoFile to psiJavaModule + } + private fun modularSourceRoot(root: VirtualFile): JavaModule.Explicit? { + val (moduleInfoFile, psiJavaModule) = findSourceModuleInfo(root) ?: return null + val roots = listOf(JavaModule.Root(root, isBinary = false)) return JavaModule.Explicit(JavaModuleInfo.create(psiJavaModule), roots, moduleInfoFile) } - private fun modularBinaryRoot(root: VirtualFile, originalFile: File): JavaModule? { + private fun modularBinaryRoot(root: VirtualFile): JavaModule? { val isJar = root.fileSystem.protocol == StandardFileSystems.JAR_PROTOCOL val manifest: Attributes? by lazy(NONE) { readManifestAttributes(root) } @@ -139,6 +160,7 @@ class ClasspathRootsResolver( return JavaModule.Automatic(automaticModuleName, moduleRoot) } + val originalFile = VfsUtilCore.virtualToIoFile(root) val moduleName = LightJavaModule.moduleName(originalFile.nameWithoutExtension) if (moduleName.isEmpty()) { report(ERROR, "Cannot infer automatic module name for the file", VfsUtilCore.getVirtualFileForJar(root) ?: root) From 5348d2e43ad9fa14908503defdaed85d34cec79c Mon Sep 17 00:00:00 2001 From: Alexander Udalov Date: Thu, 21 Sep 2017 19:30:29 +0300 Subject: [PATCH 170/212] Consider module output as part of the same Java module This fixes incremental compilation for explicit Java 9 modules #KT-20064 Fixed #KT-20082 Fixed --- .../jvm/compiler/ClasspathRootsResolver.kt | 21 +++++++++++++++---- .../cli/jvm/compiler/KotlinCoreEnvironment.kt | 11 ++++++++-- 2 files changed, 26 insertions(+), 6 deletions(-) diff --git a/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/compiler/ClasspathRootsResolver.kt b/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/compiler/ClasspathRootsResolver.kt index 6a0f652dbec..07236ab2bab 100644 --- a/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/compiler/ClasspathRootsResolver.kt +++ b/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/compiler/ClasspathRootsResolver.kt @@ -50,7 +50,8 @@ class ClasspathRootsResolver( private val additionalModules: List, private val contentRootToVirtualFile: (JvmContentRoot) -> VirtualFile?, private val javaModuleFinder: CliJavaModuleFinder, - private val requireStdlibModule: Boolean + private val requireStdlibModule: Boolean, + private val outputDirectory: VirtualFile? ) { val javaModuleGraph = JavaModuleGraph(javaModuleFinder) @@ -85,8 +86,10 @@ class ClasspathRootsResolver( val result = mutableListOf() val modules = mutableListOf() + val hasOutputDirectoryInClasspath = outputDirectory in jvmClasspathRoots || outputDirectory in jvmModulePathRoots + for ((root, packagePrefix) in javaSourceRoots) { - val modularRoot = modularSourceRoot(root) + val modularRoot = modularSourceRoot(root, hasOutputDirectoryInClasspath) if (modularRoot != null) { modules += modularRoot } @@ -104,7 +107,13 @@ class ClasspathRootsResolver( result += JavaRoot(root, JavaRoot.RootType.BINARY) } + val outputDirectoryAddedAsPartOfModule = modules.any { module -> module.moduleRoots.any { it.file == outputDirectory } } + for (root in jvmModulePathRoots) { + // Do not add output directory as a separate module if we're compiling an explicit named module. + // It's going to be included as a root of our module in modularSourceRoot. + if (outputDirectoryAddedAsPartOfModule && root == outputDirectory) continue + val module = modularBinaryRoot(root) if (module != null) { modules += module @@ -130,9 +139,13 @@ class ClasspathRootsResolver( return moduleInfoFile to psiJavaModule } - private fun modularSourceRoot(root: VirtualFile): JavaModule.Explicit? { + private fun modularSourceRoot(root: VirtualFile, hasOutputDirectoryInClasspath: Boolean): JavaModule.Explicit? { val (moduleInfoFile, psiJavaModule) = findSourceModuleInfo(root) ?: return null - val roots = listOf(JavaModule.Root(root, isBinary = false)) + val sourceRoot = JavaModule.Root(root, isBinary = false) + val roots = + if (hasOutputDirectoryInClasspath) + listOf(sourceRoot, JavaModule.Root(outputDirectory!!, isBinary = true)) + else listOf(sourceRoot) return JavaModule.Explicit(JavaModuleInfo.create(psiJavaModule), roots, moduleInfoFile) } diff --git a/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/compiler/KotlinCoreEnvironment.kt b/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/compiler/KotlinCoreEnvironment.kt index 6347f6a22f9..5630aac8486 100644 --- a/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/compiler/KotlinCoreEnvironment.kt +++ b/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/compiler/KotlinCoreEnvironment.kt @@ -204,13 +204,19 @@ class KotlinCoreEnvironment private constructor( val javaModuleFinder = CliJavaModuleFinder(jdkHome?.path?.let { path -> jrtFileSystem?.findFileByPath(path + URLUtil.JAR_SEPARATOR) }) + + val outputDirectory = + configuration.get(JVMConfigurationKeys.MODULES)?.singleOrNull()?.getOutputDirectory() + ?: configuration.get(JVMConfigurationKeys.OUTPUT_DIRECTORY)?.absolutePath + classpathRootsResolver = ClasspathRootsResolver( PsiManager.getInstance(project), messageCollector, configuration.getList(JVMConfigurationKeys.ADDITIONAL_JAVA_MODULES), this::contentRootToVirtualFile, javaModuleFinder, - !configuration.getBoolean(CLIConfigurationKeys.ALLOW_KOTLIN_PACKAGE) + !configuration.getBoolean(CLIConfigurationKeys.ALLOW_KOTLIN_PACKAGE), + outputDirectory?.let(this::findLocalFile) ) val (initialRoots, javaModules) = @@ -331,7 +337,8 @@ class KotlinCoreEnvironment private constructor( } } - internal fun findLocalFile(path: String) = applicationEnvironment.localFileSystem.findFileByPath(path) + internal fun findLocalFile(path: String): VirtualFile? = + applicationEnvironment.localFileSystem.findFileByPath(path) private fun findLocalFile(root: JvmContentRoot): VirtualFile? { return findLocalFile(root.file.absolutePath).also { From 39f49f144995d2721565f6b616a9728d49d893aa Mon Sep 17 00:00:00 2001 From: Alexey Tsvetkov Date: Thu, 28 Sep 2017 19:50:50 +0300 Subject: [PATCH 171/212] Ensure dependencies are installed before running Gradle integration tests --- .../build.gradle | 31 +++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/build.gradle b/libraries/tools/kotlin-gradle-plugin-integration-tests/build.gradle index 245d391566e..e13e1efbcac 100644 --- a/libraries/tools/kotlin-gradle-plugin-integration-tests/build.gradle +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/build.gradle @@ -26,6 +26,37 @@ dependencies { testCompile 'org.jetbrains.kotlin:gradle-api:2.2' } +test.dependsOn(":kotlin-allopen:install", + ":kotlin-android-extensions:install", + ":kotlin-build-common:install", + ":kotlin-compiler-embeddable:install", + ":kotlin-gradle-plugin:install", + ":kotlin-reflect:install", + ":kotlin-test:kotlin-test-jvm:install", + ":kotlin-gradle-subplugin-example:install", + ":kotlin-stdlib-jre8:install") + +// Validate that all dependencies 'install' tasks are added to 'test' dependencies +// Test dependencies are specified as paths to avoid forcing dependency resolution +// and also to avoid specifying evaluationDependsOn for each testCompile dependency. +gradle.taskGraph.whenReady { + def notAddedTestTasks = [] + def testDependencies = test.dependsOn + + for (dependency in configurations.getByName("testCompile").allDependencies) { + if (!(dependency instanceof ProjectDependency)) continue + + def task = dependency.dependencyProject.tasks.findByName("install") + if (task != null && !testDependencies.contains(task.path)) { + notAddedTestTasks.add("\"${task.path}\"") + } + } + + if (!notAddedTestTasks.isEmpty()) { + throw new GradleException("Add the following tasks to ${test.path} dependencies:\n ${notAddedTestTasks.join(",\n ")}") + } +} + processResources { expand(project.properties) } From a8cfe19769e81edc76023c90dc53cd4418500253 Mon Sep 17 00:00:00 2001 From: Alexey Tsvetkov Date: Fri, 29 Sep 2017 05:08:59 +0300 Subject: [PATCH 172/212] Add option to debug Kotlin daemon in Gradle integration tests --- .../kotlin/org/jetbrains/kotlin/gradle/BaseGradleIT.kt | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/BaseGradleIT.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/BaseGradleIT.kt index 8c33ef853c1..80056cc47f9 100644 --- a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/BaseGradleIT.kt +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/BaseGradleIT.kt @@ -9,7 +9,6 @@ import org.junit.Assert import org.junit.Before import java.io.File import java.util.regex.Pattern -import kotlin.test.* val SYSTEM_LINE_SEPARATOR: String = System.getProperty("line.separator") @@ -145,7 +144,8 @@ abstract class BaseGradleIT { val forceOutputToStdout: Boolean = false, val debug: Boolean = false, val freeCommandLineArgs: List = emptyList(), - val kotlinVersion: String = KOTLIN_VERSION) + val kotlinVersion: String = KOTLIN_VERSION, + val kotlinDaemonDebugPort: Int? = null) open inner class Project( val projectName: String, @@ -429,6 +429,9 @@ abstract class BaseGradleIT { if (options.debug) { add("-Dorg.gradle.debug=true") } + options.kotlinDaemonDebugPort?.let { port -> + add("-Dkotlin.daemon.jvm.options=-agentlib:jdwp=transport=dt_socket\\,server=y\\,suspend=y\\,address=$port") + } addAll(options.freeCommandLineArgs) } From 72d2e7dd4584a61440c9b587b420d663b221792f Mon Sep 17 00:00:00 2001 From: Alexey Tsvetkov Date: Fri, 29 Sep 2017 21:40:54 +0300 Subject: [PATCH 173/212] Minor: restore accidentally removed import --- .../src/test/kotlin/org/jetbrains/kotlin/gradle/BaseGradleIT.kt | 1 + 1 file changed, 1 insertion(+) diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/BaseGradleIT.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/BaseGradleIT.kt index 80056cc47f9..381e2dc1e88 100644 --- a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/BaseGradleIT.kt +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/BaseGradleIT.kt @@ -9,6 +9,7 @@ import org.junit.Assert import org.junit.Before import java.io.File import java.util.regex.Pattern +import kotlin.test.* val SYSTEM_LINE_SEPARATOR: String = System.getProperty("line.separator") From 791bfde64b48f74c73a272afbedf9dded6d4b881 Mon Sep 17 00:00:00 2001 From: Ilya Gorbunov Date: Fri, 29 Sep 2017 20:20:40 +0300 Subject: [PATCH 174/212] Fork ivy download process Helps to fix download hangs under some circumstances. --- update_dependencies.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/update_dependencies.xml b/update_dependencies.xml index 2320da3266f..5db4d4ea680 100644 --- a/update_dependencies.xml +++ b/update_dependencies.xml @@ -109,7 +109,7 @@ - + From 4b79269cecf20faaec41ea41ad0a359adafab8ac Mon Sep 17 00:00:00 2001 From: Denis Zharkov Date: Wed, 20 Sep 2017 15:39:49 +0300 Subject: [PATCH 175/212] Extract ReadOnly*ControlFlowInfo interfaces from *ControlFlowInfo It's necessary for further optimizations: not for all cases we actually need to build a map The naming is still a subject for discussion --- .../jetbrains/kotlin/cfg/ControlFlowInfo.kt | 25 ++++++++++++++----- .../cfg/ControlFlowInformationProvider.kt | 16 ++++++------ .../kotlin/cfg/PseudocodeVariablesData.kt | 4 +-- .../kotlin/cfg/AbstractDataFlowTest.java | 22 ++++++++-------- 4 files changed, 40 insertions(+), 27 deletions(-) diff --git a/compiler/frontend/src/org/jetbrains/kotlin/cfg/ControlFlowInfo.kt b/compiler/frontend/src/org/jetbrains/kotlin/cfg/ControlFlowInfo.kt index b894cf2dfb8..7e129c3e3a4 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/cfg/ControlFlowInfo.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/cfg/ControlFlowInfo.kt @@ -22,10 +22,10 @@ import org.jetbrains.kotlin.descriptors.VariableDescriptor typealias ImmutableMap = javaslang.collection.Map typealias ImmutableHashMap = javaslang.collection.HashMap -abstract class ControlFlowInfo, D> +abstract class ControlFlowInfo, D : Any> internal constructor( protected val map: ImmutableMap = ImmutableHashMap.empty() -) : ImmutableMap by map { +) : ImmutableMap by map, ReadOnlyControlFlowInfo { abstract protected fun copy(newMap: ImmutableMap): S override fun put(key: VariableDescriptor, value: D): S = put(key, value, this[key].getOrElse(null as D?)) @@ -41,6 +41,9 @@ internal constructor( return copy(map.put(key, value)) } + override fun getOrNull(variableDescriptor: VariableDescriptor): D? = this[variableDescriptor].getOrElse(null as D?) + override fun asMap() = this + fun retainAll(predicate: (VariableDescriptor) -> Boolean): S = copy(map.removeAll(map.keySet().filterNot(predicate))) override fun equals(other: Any?) = map == (other as? ControlFlowInfo<*, *>)?.map @@ -53,16 +56,26 @@ internal constructor( operator fun Tuple2.component1(): T = _1() operator fun Tuple2<*, T>.component2(): T = _2() -fun ImmutableMap.getOrNull(k: K): V? = this[k].getOrElse(null as V?) +interface ReadOnlyControlFlowInfo { + fun getOrNull(variableDescriptor: VariableDescriptor): D? + // Only used in tests + fun asMap(): ImmutableMap +} + +interface ReadOnlyInitControlFlowInfo : ReadOnlyControlFlowInfo { + fun checkDefiniteInitializationInWhen(merge: ReadOnlyInitControlFlowInfo): Boolean +} + +typealias ReadOnlyUseControlFlowInfo = ReadOnlyControlFlowInfo class InitControlFlowInfo(map: ImmutableMap = ImmutableHashMap.empty()) : - ControlFlowInfo(map) { + ControlFlowInfo(map), ReadOnlyInitControlFlowInfo { override fun copy(newMap: ImmutableMap) = InitControlFlowInfo(newMap) // this = output of EXHAUSTIVE_WHEN_ELSE instruction // merge = input of MergeInstruction // returns true if definite initialization in when happens here - fun checkDefiniteInitializationInWhen(merge: InitControlFlowInfo): Boolean { + override fun checkDefiniteInitializationInWhen(merge: ReadOnlyInitControlFlowInfo): Boolean { for ((key, value) in iterator()) { if (value.initState == InitState.INITIALIZED_EXHAUSTIVELY && merge.getOrNull(key)?.initState == InitState.INITIALIZED) { @@ -74,7 +87,7 @@ class InitControlFlowInfo(map: ImmutableMap = ImmutableHashMap.empty()) : - ControlFlowInfo(map) { + ControlFlowInfo(map), ReadOnlyUseControlFlowInfo { override fun copy(newMap: ImmutableMap) = UseControlFlowInfo(newMap) } diff --git a/compiler/frontend/src/org/jetbrains/kotlin/cfg/ControlFlowInformationProvider.kt b/compiler/frontend/src/org/jetbrains/kotlin/cfg/ControlFlowInformationProvider.kt index 43c0516c842..01a51c363b0 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/cfg/ControlFlowInformationProvider.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/cfg/ControlFlowInformationProvider.kt @@ -274,8 +274,8 @@ class ControlFlowInformationProvider private constructor( pseudocode.traverse(TraversalOrder.FORWARD, initializers) { instruction: Instruction, - enterData: ImmutableMap, - exitData: ImmutableMap -> + enterData: ReadOnlyInitControlFlowInfo, + exitData: ReadOnlyInitControlFlowInfo -> val ctxt = VariableInitContext(instruction, reportedDiagnosticMap, enterData, exitData, blockScopeVariableInfo) if (ctxt.variableDescriptor == null) return@traverse @@ -532,7 +532,7 @@ class ControlFlowInformationProvider private constructor( private fun recordInitializedVariables( pseudocode: Pseudocode, - initializersMap: Map> + initializersMap: Map> ) { val initializers = initializersMap[pseudocode.exitInstruction] ?: return val declaredVariables = pseudocodeVariablesData.getDeclaredVariables(pseudocode, false) @@ -554,8 +554,8 @@ class ControlFlowInformationProvider private constructor( val usedValueExpressions = hashSetOf() pseudocode.traverse(TraversalOrder.BACKWARD, variableStatusData) { instruction: Instruction, - enterData: ImmutableMap, - _: ImmutableMap -> + enterData: ReadOnlyUseControlFlowInfo, + _: ReadOnlyUseControlFlowInfo -> val ctxt = VariableUseContext(instruction, reportedDiagnosticMap) val declaredVariables = pseudocodeVariablesData.getDeclaredVariables(instruction.owner, false) @@ -1030,8 +1030,8 @@ class ControlFlowInformationProvider private constructor( private inner class VariableInitContext( instruction: Instruction, map: MutableMap>, - `in`: ImmutableMap, - out: ImmutableMap, + `in`: ReadOnlyInitControlFlowInfo, + out: ReadOnlyInitControlFlowInfo, blockScopeVariableInfo: BlockScopeVariableInfo ) : VariableContext(instruction, map) { internal val enterInitState = initialize(variableDescriptor, blockScopeVariableInfo, `in`) @@ -1040,7 +1040,7 @@ class ControlFlowInformationProvider private constructor( private fun initialize( variableDescriptor: VariableDescriptor?, blockScopeVariableInfo: BlockScopeVariableInfo, - map: ImmutableMap + map: ReadOnlyInitControlFlowInfo ): VariableControlFlowState? { val state = map.getOrNull(variableDescriptor ?: return null) if (state != null) return state diff --git a/compiler/frontend/src/org/jetbrains/kotlin/cfg/PseudocodeVariablesData.kt b/compiler/frontend/src/org/jetbrains/kotlin/cfg/PseudocodeVariablesData.kt index 03765764cfa..16a570addb6 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/cfg/PseudocodeVariablesData.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/cfg/PseudocodeVariablesData.kt @@ -37,7 +37,7 @@ class PseudocodeVariablesData(val pseudocode: Pseudocode, private val bindingCon private val declaredVariablesForDeclaration = hashMapOf>() - val variableInitializers: Map> by lazy { + val variableInitializers: Map> by lazy { computeVariableInitializers() } @@ -143,7 +143,7 @@ class PseudocodeVariablesData(val pseudocode: Pseudocode, private val bindingCon // variable use - val variableUseStatusData: Map> + val variableUseStatusData: Map> get() = pseudocodeVariableDataCollector.collectData(TraversalOrder.BACKWARD, UseControlFlowInfo()) { instruction: Instruction, incomingEdgesData: Collection -> diff --git a/compiler/tests/org/jetbrains/kotlin/cfg/AbstractDataFlowTest.java b/compiler/tests/org/jetbrains/kotlin/cfg/AbstractDataFlowTest.java index 949087bd872..83e808752b8 100644 --- a/compiler/tests/org/jetbrains/kotlin/cfg/AbstractDataFlowTest.java +++ b/compiler/tests/org/jetbrains/kotlin/cfg/AbstractDataFlowTest.java @@ -39,9 +39,9 @@ public abstract class AbstractDataFlowTest extends AbstractPseudocodeTest { @NotNull BindingContext bindingContext ) { PseudocodeVariablesData pseudocodeVariablesData = new PseudocodeVariablesData(pseudocode.getRootPseudocode(), bindingContext); - Map> variableInitializers = + Map> variableInitializers = pseudocodeVariablesData.getVariableInitializers(); - Map> useStatusData = + Map>> useStatusData = pseudocodeVariablesData.getVariableUseStatusData(); String initPrefix = " INIT:"; String usePrefix = " USE:"; @@ -49,16 +49,16 @@ public abstract class AbstractDataFlowTest extends AbstractPseudocodeTest { dumpInstructions(pseudocode, out, (instruction, next, prev) -> { StringBuilder result = new StringBuilder(); - Edges initializersEdges = variableInitializers.get(instruction); - Edges previousInitializersEdges = variableInitializers.get(prev); + Edges initializersEdges = variableInitializers.get(instruction); + Edges previousInitializersEdges = variableInitializers.get(prev); String initializersData = ""; if (initializersEdges != null && !initializersEdges.equals(previousInitializersEdges)) { initializersData = dumpEdgesData(initPrefix, initializersEdges); } result.append(String.format("%1$-" + initializersColumnWidth + "s", initializersData)); - Edges useStatusEdges = useStatusData.get(instruction); - Edges nextUseStatusEdges = useStatusData.get(next); + Edges> useStatusEdges = useStatusData.get(instruction); + Edges> nextUseStatusEdges = useStatusData.get(next); if (useStatusEdges != null && !useStatusEdges.equals(nextUseStatusEdges)) { result.append(dumpEdgesData(usePrefix, useStatusEdges)); } @@ -69,11 +69,11 @@ public abstract class AbstractDataFlowTest extends AbstractPseudocodeTest { private static int countDataColumnWidth( @NotNull String prefix, @NotNull List instructions, - @NotNull Map> data + @NotNull Map> data ) { int maxWidth = 0; for (Instruction instruction : instructions) { - Edges edges = data.get(instruction); + Edges edges = data.get(instruction); if (edges == null) continue; int length = dumpEdgesData(prefix, edges).length(); if (maxWidth < length) { @@ -85,10 +85,10 @@ public abstract class AbstractDataFlowTest extends AbstractPseudocodeTest { } @NotNull - private static > String dumpEdgesData(String prefix, @NotNull Edges edges) { + private static > String dumpEdgesData(String prefix, @NotNull Edges edges) { return prefix + - " in: " + renderVariableMap(edges.getIncoming()) + - " out: " + renderVariableMap(edges.getOutgoing()); + " in: " + renderVariableMap(edges.getIncoming().asMap()) + + " out: " + renderVariableMap(edges.getOutgoing().asMap()); } private static String renderVariableMap(javaslang.collection.Map map) { From 527daced4609268dcc2c63ad4e6e8b3e2433dd78 Mon Sep 17 00:00:00 2001 From: Denis Zharkov Date: Wed, 20 Sep 2017 19:18:58 +0300 Subject: [PATCH 176/212] Optimize CFG for cases of simple variables Parameters/vals with an immediate initializer (which we assume is a rather common situation) do not require any kind of complicated CFA - Unused vals can be simply determined by linear traversal of the pseudocode - Definite assignment is a bit more complicated: a read-instruction of val can be considered as a safe if it's located *after* the first write in the pseudocode. It works almost always beside the case with do/while (see the test changed). This case will be fixed in the further commits The test for kt897.kt will also be fixed further, all other changes might be considered as minor as they mostly change diagnostics for already red code --- .../kotlin/cfg/PseudocodeVariablesData.kt | 340 +++++++++++++++--- .../tests/DefaultValuesCheckWithoutBody.kt | 2 +- .../tests/DefaultValuesTypechecking.kt | 6 +- .../diagnostics/tests/LValueAssignment.kt | 6 +- .../UninitializedOrReassignedVariables.kt | 10 +- .../controlFlowAnalysis/doWhileNotDefined.kt | 2 +- .../tests/controlFlowAnalysis/kt897.kt | 2 +- .../DataFlowInMultiDeclInFor.kt | 2 +- 8 files changed, 297 insertions(+), 73 deletions(-) diff --git a/compiler/frontend/src/org/jetbrains/kotlin/cfg/PseudocodeVariablesData.kt b/compiler/frontend/src/org/jetbrains/kotlin/cfg/PseudocodeVariablesData.kt index 16a570addb6..ead8c09633a 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/cfg/PseudocodeVariablesData.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/cfg/PseudocodeVariablesData.kt @@ -26,16 +26,35 @@ import org.jetbrains.kotlin.cfg.pseudocode.instructions.eval.WriteValueInstructi import org.jetbrains.kotlin.cfg.pseudocode.instructions.special.VariableDeclarationInstruction import org.jetbrains.kotlin.cfg.pseudocodeTraverser.Edges import org.jetbrains.kotlin.cfg.pseudocodeTraverser.TraversalOrder +import org.jetbrains.kotlin.cfg.pseudocodeTraverser.traverse +import org.jetbrains.kotlin.descriptors.PropertyDescriptor import org.jetbrains.kotlin.descriptors.VariableDescriptor -import org.jetbrains.kotlin.psi.KtProperty +import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.resolve.BindingContext import org.jetbrains.kotlin.resolve.BindingContextUtils.variableDescriptorForDeclaration -import java.util.* +import org.jetbrains.kotlin.utils.addToStdlib.safeAs + +private typealias ImmutableSet = javaslang.collection.Set +private typealias ImmutableHashSet = javaslang.collection.HashSet class PseudocodeVariablesData(val pseudocode: Pseudocode, private val bindingContext: BindingContext) { private val pseudocodeVariableDataCollector = PseudocodeVariableDataCollector(bindingContext, pseudocode) - private val declaredVariablesForDeclaration = hashMapOf>() + private class VariablesForDeclaration( + val valsWithTrivialInitializer: Set, + val nonTrivialVariables: Set + ) { + val allVars = + if (nonTrivialVariables.isEmpty()) + valsWithTrivialInitializer + else + LinkedHashSet(valsWithTrivialInitializer).also { it.addAll(nonTrivialVariables) } + } + + private val declaredVariablesForDeclaration = hashMapOf() + private val rootVariables by lazy(LazyThreadSafetyMode.NONE) { + getAllDeclaredVariables(pseudocode, includeInsideLocalDeclarations = true) + } val variableInitializers: Map> by lazy { computeVariableInitializers() @@ -44,49 +63,87 @@ class PseudocodeVariablesData(val pseudocode: Pseudocode, private val bindingCon val blockScopeVariableInfo: BlockScopeVariableInfo get() = pseudocodeVariableDataCollector.blockScopeVariableInfo - fun getDeclaredVariables(pseudocode: Pseudocode, includeInsideLocalDeclarations: Boolean): Set { + fun getDeclaredVariables(pseudocode: Pseudocode, includeInsideLocalDeclarations: Boolean): Set = + getAllDeclaredVariables(pseudocode, includeInsideLocalDeclarations).allVars + + private fun getAllDeclaredVariables(pseudocode: Pseudocode, includeInsideLocalDeclarations: Boolean): VariablesForDeclaration { if (!includeInsideLocalDeclarations) { return getUpperLevelDeclaredVariables(pseudocode) } - val declaredVariables = linkedSetOf() - declaredVariables.addAll(getUpperLevelDeclaredVariables(pseudocode)) + val nonTrivialVariables = linkedSetOf() + val valsWithTrivialInitializer = linkedSetOf() + addVariablesFromPseudocode(pseudocode, nonTrivialVariables, valsWithTrivialInitializer) for (localFunctionDeclarationInstruction in pseudocode.localDeclarations) { val localPseudocode = localFunctionDeclarationInstruction.body - declaredVariables.addAll(getUpperLevelDeclaredVariables(localPseudocode)) + addVariablesFromPseudocode(localPseudocode, nonTrivialVariables, valsWithTrivialInitializer) } - return declaredVariables + return VariablesForDeclaration(valsWithTrivialInitializer, nonTrivialVariables) } - private fun getUpperLevelDeclaredVariables(pseudocode: Pseudocode): Set { - var declaredVariables = declaredVariablesForDeclaration[pseudocode] - if (declaredVariables == null) { - declaredVariables = computeDeclaredVariablesForPseudocode(pseudocode) - declaredVariablesForDeclaration.put(pseudocode, declaredVariables) + private fun addVariablesFromPseudocode( + pseudocode: Pseudocode, + nonTrivialVariables: MutableSet, + valsWithTrivialInitializer: MutableSet + ) { + getUpperLevelDeclaredVariables(pseudocode).let { + nonTrivialVariables.addAll(it.nonTrivialVariables) + valsWithTrivialInitializer.addAll(it.valsWithTrivialInitializer) } - return declaredVariables } - private fun computeDeclaredVariablesForPseudocode(pseudocode: Pseudocode): Set { - val declaredVariables = linkedSetOf() + private fun getUpperLevelDeclaredVariables(pseudocode: Pseudocode) = declaredVariablesForDeclaration.getOrPut(pseudocode) { + computeDeclaredVariablesForPseudocode(pseudocode) + } + + private fun computeDeclaredVariablesForPseudocode(pseudocode: Pseudocode): VariablesForDeclaration { + val valsWithTrivialInitializer = linkedSetOf() + val nonTrivialVariables = linkedSetOf() for (instruction in pseudocode.instructions) { if (instruction is VariableDeclarationInstruction) { val variableDeclarationElement = instruction.variableDeclarationElement - val descriptor = bindingContext.get(BindingContext.DECLARATION_TO_DESCRIPTOR, variableDeclarationElement) - variableDescriptorForDeclaration(descriptor)?.let { - declaredVariables.add(it) + val descriptor = + variableDescriptorForDeclaration( + bindingContext.get(BindingContext.DECLARATION_TO_DESCRIPTOR, variableDeclarationElement) + ) ?: continue + + if (isValWithTrivialInitializer(variableDeclarationElement, descriptor)) { + valsWithTrivialInitializer.add(descriptor) + } + else { + nonTrivialVariables.add(descriptor) } } } - return Collections.unmodifiableSet(declaredVariables) + + return VariablesForDeclaration(valsWithTrivialInitializer, nonTrivialVariables) + } + + private fun isValWithTrivialInitializer(variableDeclarationElement: KtDeclaration, descriptor: VariableDescriptor) = + variableDeclarationElement is KtParameter || variableDeclarationElement is KtObjectDeclaration || + variableDeclarationElement.safeAs()?.isVariableWithTrivialInitializer(descriptor) == true + + private fun KtVariableDeclaration.isVariableWithTrivialInitializer(descriptor: VariableDescriptor): Boolean { + if (descriptor.isPropertyWithoutBackingField()) return true + if (isVar) return false + return initializer != null || safeAs()?.delegate != null || this is KtDestructuringDeclarationEntry + } + + private fun VariableDescriptor.isPropertyWithoutBackingField(): Boolean { + if (this !is PropertyDescriptor) return false + return bindingContext.get(BindingContext.BACKING_FIELD_REQUIRED, this) != true } // variable initializers - private fun computeVariableInitializers(): Map> { + private fun computeVariableInitializers(): Map> { val blockScopeVariableInfo = pseudocodeVariableDataCollector.blockScopeVariableInfo + val resultForValsWithTrivialInitializer = computeInitInfoForTrivialVals() + + if (rootVariables.nonTrivialVariables.isEmpty()) return resultForValsWithTrivialInitializer + return pseudocodeVariableDataCollector.collectData(TraversalOrder.FORWARD, InitControlFlowInfo()) { instruction: Instruction, incomingEdgesData: Collection -> @@ -94,6 +151,88 @@ class PseudocodeVariablesData(val pseudocode: Pseudocode, private val bindingCon val exitInstructionData = addVariableInitStateFromCurrentInstructionIfAny( instruction, enterInstructionData, blockScopeVariableInfo) Edges(enterInstructionData, exitInstructionData) + }.mapValues { + (instruction, edges) -> + val trivialEdges = resultForValsWithTrivialInitializer[instruction]!! + Edges(trivialEdges.incoming.replaceDelegate(edges.incoming), trivialEdges.outgoing.replaceDelegate(edges.outgoing)) + } + } + + private fun computeInitInfoForTrivialVals(): Map> { + val result = hashMapOf>() + var declaredSet = ImmutableHashSet.empty() + var initSet = ImmutableHashSet.empty() + pseudocode.traverse(TraversalOrder.FORWARD) { instruction -> + val enterState = ReadOnlyInitControlFlowInfoImpl(declaredSet, initSet, null) + when (instruction) { + is VariableDeclarationInstruction -> + extractValWithTrivialInitializer(instruction)?.let { + variableDescriptor -> + declaredSet = declaredSet.add(variableDescriptor) + } + is WriteValueInstruction -> { + val variableDescriptor = extractValWithTrivialInitializer(instruction) + if (variableDescriptor != null && instruction.isTrivialInitializer()) { + initSet = initSet.add(variableDescriptor) + } + } + } + + val afterState = ReadOnlyInitControlFlowInfoImpl(declaredSet, initSet, null) + + result[instruction] = Edges(enterState, afterState) + } + return result + } + + private fun WriteValueInstruction.isTrivialInitializer() = + element is KtVariableDeclaration || element is KtParameter + + private inner class ReadOnlyInitControlFlowInfoImpl( + val declaredSet: ImmutableSet, + val initSet: ImmutableSet, + private val delegate: ReadOnlyInitControlFlowInfo? + ) : ReadOnlyInitControlFlowInfo { + override fun getOrNull(variableDescriptor: VariableDescriptor): VariableControlFlowState? { + if (variableDescriptor in declaredSet) { + return VariableControlFlowState.create(isInitialized = variableDescriptor in initSet, isDeclared = true) + } + return delegate?.getOrNull(variableDescriptor) + } + + override fun checkDefiniteInitializationInWhen(merge: ReadOnlyInitControlFlowInfo): Boolean = + delegate?.checkDefiniteInitializationInWhen(merge) ?: false + + fun replaceDelegate(newDelegate: ReadOnlyInitControlFlowInfo): ReadOnlyInitControlFlowInfo = + ReadOnlyInitControlFlowInfoImpl(declaredSet, initSet, newDelegate) + + override fun asMap(): ImmutableMap { + val initial = delegate?.asMap() ?: ImmutableHashMap.empty() + + return declaredSet.fold(initial) { + acc, variableDescriptor -> + acc.put(variableDescriptor, getOrNull(variableDescriptor)!!) + } + } + + override fun equals(other: Any?): Boolean { + if (this === other) return true + if (javaClass != other?.javaClass) return false + + other as ReadOnlyInitControlFlowInfoImpl + + if (declaredSet != other.declaredSet) return false + if (initSet != other.initSet) return false + if (delegate != other.delegate) return false + + return true + } + + override fun hashCode(): Int { + var result = declaredSet.hashCode() + result = 31 * result + initSet.hashCode() + result = 31 * result + (delegate?.hashCode() ?: 0) + return result } } @@ -115,7 +254,10 @@ class PseudocodeVariablesData(val pseudocode: Pseudocode, private val bindingCon if (instruction !is WriteValueInstruction && instruction !is VariableDeclarationInstruction) { return enterInstructionData } - val variable = PseudocodeUtil.extractVariableDescriptorIfAny(instruction, bindingContext) ?: return enterInstructionData + val variable = + PseudocodeUtil.extractVariableDescriptorIfAny(instruction, bindingContext) + ?.takeIf { it in rootVariables.nonTrivialVariables } + ?: return enterInstructionData var exitInstructionData = enterInstructionData if (instruction is WriteValueInstruction) { // if writing to already initialized object @@ -129,10 +271,10 @@ class PseudocodeVariablesData(val pseudocode: Pseudocode, private val bindingCon } else { // instruction instanceof VariableDeclarationInstruction - var enterInitState: VariableControlFlowState? = enterInstructionData.getOrNull(variable) - if (enterInitState == null) { - enterInitState = getDefaultValueForInitializers(variable, instruction, blockScopeVariableInfo) - } + val enterInitState = + enterInstructionData.getOrNull(variable) + ?: getDefaultValueForInitializers(variable, instruction, blockScopeVariableInfo) + if (!enterInitState.mayBeInitialized() || !enterInitState.isDeclared) { val variableDeclarationInfo = VariableControlFlowState.create(enterInitState.initState, isDeclared = true) exitInstructionData = exitInstructionData.put(variable, variableDeclarationInfo, enterInitState) @@ -144,45 +286,127 @@ class PseudocodeVariablesData(val pseudocode: Pseudocode, private val bindingCon // variable use val variableUseStatusData: Map> - get() = pseudocodeVariableDataCollector.collectData(TraversalOrder.BACKWARD, UseControlFlowInfo()) { - instruction: Instruction, incomingEdgesData: Collection -> + get() { + val resultForTrivialVals = computeUseInfoForTrivialVals() + if (rootVariables.nonTrivialVariables.isEmpty()) return resultForTrivialVals - val enterResult: UseControlFlowInfo = if (incomingEdgesData.size == 1) { - incomingEdgesData.single() - } - else { - incomingEdgesData.fold(UseControlFlowInfo()) { result, edgeData -> - edgeData.iterator().fold(result) { subResult, (variableDescriptor, variableUseState) -> - subResult.put(variableDescriptor, variableUseState.merge(subResult.getOrNull(variableDescriptor))) + return pseudocodeVariableDataCollector.collectData(TraversalOrder.BACKWARD, UseControlFlowInfo()) { instruction: Instruction, incomingEdgesData: Collection -> + + val enterResult: UseControlFlowInfo = if (incomingEdgesData.size == 1) { + incomingEdgesData.single() + } + else { + incomingEdgesData.fold(UseControlFlowInfo()) { result, edgeData -> + edgeData.iterator().fold(result) { subResult, (variableDescriptor, variableUseState) -> + subResult.put(variableDescriptor, variableUseState.merge(subResult.getOrNull(variableDescriptor))) + } } } - } - val variableDescriptor = PseudocodeUtil.extractVariableDescriptorFromReference(instruction, bindingContext) - if (variableDescriptor == null || instruction !is ReadValueInstruction && instruction !is WriteValueInstruction) { - Edges(enterResult, enterResult) - } - else { - val exitResult = - if (instruction is ReadValueInstruction) { - enterResult.put(variableDescriptor, VariableUseState.READ) - } - else { - var variableUseState: VariableUseState? = enterResult.getOrNull(variableDescriptor) - if (variableUseState == null) { - variableUseState = VariableUseState.UNUSED - } - when (variableUseState) { - VariableUseState.UNUSED, VariableUseState.ONLY_WRITTEN_NEVER_READ -> - enterResult.put(variableDescriptor, VariableUseState.ONLY_WRITTEN_NEVER_READ) - VariableUseState.WRITTEN_AFTER_READ, VariableUseState.READ -> - enterResult.put(variableDescriptor, VariableUseState.WRITTEN_AFTER_READ) - } - } - Edges(enterResult, exitResult) + val variableDescriptor = + PseudocodeUtil.extractVariableDescriptorFromReference(instruction, bindingContext) + ?.takeIf { it in rootVariables.nonTrivialVariables } + if (variableDescriptor == null || instruction !is ReadValueInstruction && instruction !is WriteValueInstruction) { + Edges(enterResult, enterResult) + } + else { + val exitResult = + if (instruction is ReadValueInstruction) { + enterResult.put(variableDescriptor, VariableUseState.READ) + } + else { + var variableUseState: VariableUseState? = enterResult.getOrNull(variableDescriptor) + if (variableUseState == null) { + variableUseState = VariableUseState.UNUSED + } + when (variableUseState) { + VariableUseState.UNUSED, VariableUseState.ONLY_WRITTEN_NEVER_READ -> + enterResult.put(variableDescriptor, VariableUseState.ONLY_WRITTEN_NEVER_READ) + VariableUseState.WRITTEN_AFTER_READ, VariableUseState.READ -> + enterResult.put(variableDescriptor, VariableUseState.WRITTEN_AFTER_READ) + } + } + Edges(enterResult, exitResult) + } + }.mapValues { + (instruction, edges) -> + val edgeForTrivialVals = resultForTrivialVals[instruction]!! + + Edges( + edgeForTrivialVals.incoming.replaceDelegate(edges.incoming), + edgeForTrivialVals.outgoing.replaceDelegate(edges.outgoing) + ) } } + private fun computeUseInfoForTrivialVals(): Map> { + val used = hashSetOf() + + pseudocode.traverse(TraversalOrder.FORWARD) { instruction -> + if (instruction is ReadValueInstruction) { + extractValWithTrivialInitializer(instruction)?.let { + used.add(it) + } + } + } + + val constantUseInfo = ReadOnlyUseControlFlowInfoImpl(used, null) + val constantEdges = Edges(constantUseInfo, constantUseInfo) + val result = hashMapOf>() + + pseudocode.traverse(TraversalOrder.FORWARD) { instruction -> + result[instruction] = constantEdges + } + return result + } + + private fun extractValWithTrivialInitializer(instruction: Instruction): VariableDescriptor? { + return PseudocodeUtil.extractVariableDescriptorIfAny(instruction, bindingContext)?.takeIf { + it in rootVariables.valsWithTrivialInitializer + } + } + + private inner class ReadOnlyUseControlFlowInfoImpl( + val used: Set, + val delegate: ReadOnlyUseControlFlowInfo? + ) : ReadOnlyUseControlFlowInfo { + override fun getOrNull(variableDescriptor: VariableDescriptor): VariableUseState? { + if (variableDescriptor in used) return VariableUseState.READ + return delegate?.getOrNull(variableDescriptor) + } + + fun replaceDelegate(newDelegate: ReadOnlyUseControlFlowInfo): ReadOnlyUseControlFlowInfo = + ReadOnlyUseControlFlowInfoImpl(used, newDelegate) + + override fun asMap(): ImmutableMap { + val initial = delegate?.asMap() ?: ImmutableHashMap.empty() + + return used.fold(initial) { + acc, variableDescriptor -> + acc.put(variableDescriptor, getOrNull(variableDescriptor)!!) + } + } + + override fun equals(other: Any?): Boolean { + if (this === other) return true + if (javaClass != other?.javaClass) return false + + other as ReadOnlyUseControlFlowInfoImpl + + if (used != other.used) return false + if (delegate != other.delegate) return false + + return true + } + + override fun hashCode(): Int { + var result = used.hashCode() + result = 31 * result + (delegate?.hashCode() ?: 0) + return result + } + + } + companion object { @JvmStatic diff --git a/compiler/testData/diagnostics/tests/DefaultValuesCheckWithoutBody.kt b/compiler/testData/diagnostics/tests/DefaultValuesCheckWithoutBody.kt index ac90467340b..217b1790e5d 100644 --- a/compiler/testData/diagnostics/tests/DefaultValuesCheckWithoutBody.kt +++ b/compiler/testData/diagnostics/tests/DefaultValuesCheckWithoutBody.kt @@ -6,4 +6,4 @@ abstract class Abst { abstract fun foo(x: Int = y, y: Int = x) } -fun extraDiagnostics(x: Int = y, y: Int) \ No newline at end of file +fun extraDiagnostics(x: Int = y, y: Int) diff --git a/compiler/testData/diagnostics/tests/DefaultValuesTypechecking.kt b/compiler/testData/diagnostics/tests/DefaultValuesTypechecking.kt index a6be46b2654..2ab8a0dbbbf 100644 --- a/compiler/testData/diagnostics/tests/DefaultValuesTypechecking.kt +++ b/compiler/testData/diagnostics/tests/DefaultValuesTypechecking.kt @@ -6,10 +6,10 @@ fun bar(x : Int = "", y : Int = x, z // KT-371 Resolve default parameters for constructors -class A(x : Int = y, y : Int = x) { // None of the references is resolved, no types checked - fun foo(bool: Boolean, a: Int = b, b: String = a) {} +class A(x : Int = y, y : Int = x) { // None of the references is resolved, no types checked + fun foo(bool: Boolean, a: Int = b, b: String = a) {} } val z = 3 -fun foo(x: Int = y, y: Int = x, i : Int = z): Int = x + y \ No newline at end of file +fun foo(x: Int = y, y: Int = x, i : Int = z): Int = x + y diff --git a/compiler/testData/diagnostics/tests/LValueAssignment.kt b/compiler/testData/diagnostics/tests/LValueAssignment.kt index 20f4baeea06..b98be9fd2e9 100644 --- a/compiler/testData/diagnostics/tests/LValueAssignment.kt +++ b/compiler/testData/diagnostics/tests/LValueAssignment.kt @@ -51,7 +51,7 @@ fun cannotBe() { 5 = 34 } -fun canBe(i0: Int, j: Int) { +fun canBe(i0: Int, j: Int) { var i = i0 (label@ i) = 34 @@ -61,7 +61,7 @@ fun canBe(i0: Int, j: Int) { (l@ a.a) = 3894 } -fun canBe2(j: Int) { +fun canBe2(j: Int) { (label@ j) = 34 } @@ -140,4 +140,4 @@ fun Array.checkThis() { abstract class Ab { abstract fun getArray() : Array -} \ No newline at end of file +} diff --git a/compiler/testData/diagnostics/tests/controlFlowAnalysis/UninitializedOrReassignedVariables.kt b/compiler/testData/diagnostics/tests/controlFlowAnalysis/UninitializedOrReassignedVariables.kt index 996e2b017c6..a0c29641d42 100644 --- a/compiler/testData/diagnostics/tests/controlFlowAnalysis/UninitializedOrReassignedVariables.kt +++ b/compiler/testData/diagnostics/tests/controlFlowAnalysis/UninitializedOrReassignedVariables.kt @@ -53,7 +53,7 @@ fun t2() { class A() {} -fun t4(a: A) { +fun t4(a: A) { a = A() } @@ -61,7 +61,7 @@ fun t4(a: A) { // reassigned vals fun t1() { - val a : Int = 1 + val a : Int = 1 a = 2 var b : Int = 1 @@ -83,7 +83,7 @@ enum class ProtocolState { fun t3() { val x: ProtocolState = ProtocolState.WAITING x = x.signal() - x = x.signal() //repeat for x + x = x.signal() //repeat for x } fun t4() { @@ -187,7 +187,7 @@ class AnonymousInitializers(var a: String, val b: String) { } } -fun reassignFunParams(a: Int) { +fun reassignFunParams(a: Int) { a = 1 } @@ -345,4 +345,4 @@ fun test(m : M) { fun test1(m : M) { m.x++ m.y-- -} \ No newline at end of file +} diff --git a/compiler/testData/diagnostics/tests/controlFlowAnalysis/doWhileNotDefined.kt b/compiler/testData/diagnostics/tests/controlFlowAnalysis/doWhileNotDefined.kt index e41bcd1a76e..92c4f436540 100644 --- a/compiler/testData/diagnostics/tests/controlFlowAnalysis/doWhileNotDefined.kt +++ b/compiler/testData/diagnostics/tests/controlFlowAnalysis/doWhileNotDefined.kt @@ -2,5 +2,5 @@ fun test(cond1: Boolean) { do { if (cond1) continue val cond2 = false - } while (cond2) // cond2 may be not defined here + } while (cond2) // cond2 may be not defined here } diff --git a/compiler/testData/diagnostics/tests/controlFlowAnalysis/kt897.kt b/compiler/testData/diagnostics/tests/controlFlowAnalysis/kt897.kt index eb279e36d50..ee10f766706 100644 --- a/compiler/testData/diagnostics/tests/controlFlowAnalysis/kt897.kt +++ b/compiler/testData/diagnostics/tests/controlFlowAnalysis/kt897.kt @@ -4,7 +4,7 @@ package kt897 class A() { init { - i = 11 + i = 11 } val i : Int? = null // must be an error diff --git a/compiler/testData/diagnostics/tests/declarationChecks/DataFlowInMultiDeclInFor.kt b/compiler/testData/diagnostics/tests/declarationChecks/DataFlowInMultiDeclInFor.kt index 1feb317b1f0..0911d17433c 100644 --- a/compiler/testData/diagnostics/tests/declarationChecks/DataFlowInMultiDeclInFor.kt +++ b/compiler/testData/diagnostics/tests/declarationChecks/DataFlowInMultiDeclInFor.kt @@ -8,7 +8,7 @@ class A { } fun foo(list: List) { - for (var (c1, c2, c3) in list) { + for (var (c1, c2, c3) in list) { c1 = 1 c3 + 1 } From 8eb36947ca8b5563f2ecbe2e541b095c6133cd66 Mon Sep 17 00:00:00 2001 From: Denis Zharkov Date: Fri, 22 Sep 2017 15:26:14 +0300 Subject: [PATCH 177/212] Minor. Invert and extract condition for checkAssignmentBeforeDeclaration --- .../cfg/ControlFlowInformationProvider.kt | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/compiler/frontend/src/org/jetbrains/kotlin/cfg/ControlFlowInformationProvider.kt b/compiler/frontend/src/org/jetbrains/kotlin/cfg/ControlFlowInformationProvider.kt index 01a51c363b0..1677ba47563 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/cfg/ControlFlowInformationProvider.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/cfg/ControlFlowInformationProvider.kt @@ -486,18 +486,23 @@ class ControlFlowInformationProvider private constructor( } private fun checkAssignmentBeforeDeclaration(ctxt: VariableInitContext, expression: KtExpression) = - if (ctxt.enterInitState?.isDeclared == true - || ctxt.exitInitState?.isDeclared == true - || ctxt.enterInitState?.mayBeInitialized() == true - || ctxt.exitInitState?.mayBeInitialized() != true) { - false - } - else { + if (ctxt.isInitializationBeforeDeclaration()) { if (ctxt.variableDescriptor != null) { report(Errors.INITIALIZATION_BEFORE_DECLARATION.on(expression, ctxt.variableDescriptor), ctxt) } true } + else { + false + } + + private fun VariableInitContext.isInitializationBeforeDeclaration(): Boolean = + // is not declared + enterInitState?.isDeclared != true && exitInitState?.isDeclared != true && + // wasn't initialized before current instruction + enterInitState?.mayBeInitialized() != true && + // became initialized after current instruction + exitInitState?.mayBeInitialized() == true private fun checkInitializationForCustomSetter(ctxt: VariableInitContext, expression: KtExpression): Boolean { val variableDescriptor = ctxt.variableDescriptor From c31b5beb9e5dc957b6702312fc9e45c5f4c1dbe3 Mon Sep 17 00:00:00 2001 From: Denis Zharkov Date: Fri, 22 Sep 2017 18:28:20 +0300 Subject: [PATCH 178/212] Remove redundant check for a variable being initialized after write It's anyway is obvious for write instruction, while effectively after optimizations we treat val with syntactic initializer uninitialized until their immediate initiazer --- .../jetbrains/kotlin/cfg/ControlFlowInformationProvider.kt | 4 +--- .../testData/diagnostics/tests/controlFlowAnalysis/kt897.kt | 2 +- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/compiler/frontend/src/org/jetbrains/kotlin/cfg/ControlFlowInformationProvider.kt b/compiler/frontend/src/org/jetbrains/kotlin/cfg/ControlFlowInformationProvider.kt index 1677ba47563..94af80a4eb0 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/cfg/ControlFlowInformationProvider.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/cfg/ControlFlowInformationProvider.kt @@ -500,9 +500,7 @@ class ControlFlowInformationProvider private constructor( // is not declared enterInitState?.isDeclared != true && exitInitState?.isDeclared != true && // wasn't initialized before current instruction - enterInitState?.mayBeInitialized() != true && - // became initialized after current instruction - exitInitState?.mayBeInitialized() == true + enterInitState?.mayBeInitialized() != true private fun checkInitializationForCustomSetter(ctxt: VariableInitContext, expression: KtExpression): Boolean { val variableDescriptor = ctxt.variableDescriptor diff --git a/compiler/testData/diagnostics/tests/controlFlowAnalysis/kt897.kt b/compiler/testData/diagnostics/tests/controlFlowAnalysis/kt897.kt index ee10f766706..eb279e36d50 100644 --- a/compiler/testData/diagnostics/tests/controlFlowAnalysis/kt897.kt +++ b/compiler/testData/diagnostics/tests/controlFlowAnalysis/kt897.kt @@ -4,7 +4,7 @@ package kt897 class A() { init { - i = 11 + i = 11 } val i : Int? = null // must be an error From a51078fda67990488b8d9adbc7cb09fc37f48675 Mon Sep 17 00:00:00 2001 From: Denis Zharkov Date: Tue, 26 Sep 2017 13:02:23 +0300 Subject: [PATCH 179/212] Turn off optimizations in case of do-while presence --- .../org/jetbrains/kotlin/cfg/PseudocodeVariablesData.kt | 3 ++- .../cfg/pseudocode/ControlFlowInstructionsGenerator.kt | 7 +++++-- .../src/org/jetbrains/kotlin/cfg/pseudocode/Pseudocode.kt | 3 +++ .../org/jetbrains/kotlin/cfg/pseudocode/PseudocodeImpl.kt | 5 ++++- .../tests/controlFlowAnalysis/doWhileNotDefined.kt | 2 +- 5 files changed, 15 insertions(+), 5 deletions(-) diff --git a/compiler/frontend/src/org/jetbrains/kotlin/cfg/PseudocodeVariablesData.kt b/compiler/frontend/src/org/jetbrains/kotlin/cfg/PseudocodeVariablesData.kt index ead8c09633a..7acc068c07a 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/cfg/PseudocodeVariablesData.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/cfg/PseudocodeVariablesData.kt @@ -38,6 +38,7 @@ private typealias ImmutableSet = javaslang.collection.Set private typealias ImmutableHashSet = javaslang.collection.HashSet class PseudocodeVariablesData(val pseudocode: Pseudocode, private val bindingContext: BindingContext) { + private val containsDoWhile = pseudocode.rootPseudocode.containsDoWhile private val pseudocodeVariableDataCollector = PseudocodeVariableDataCollector(bindingContext, pseudocode) private class VariablesForDeclaration( @@ -107,7 +108,7 @@ class PseudocodeVariablesData(val pseudocode: Pseudocode, private val bindingCon bindingContext.get(BindingContext.DECLARATION_TO_DESCRIPTOR, variableDeclarationElement) ) ?: continue - if (isValWithTrivialInitializer(variableDeclarationElement, descriptor)) { + if (!containsDoWhile && isValWithTrivialInitializer(variableDeclarationElement, descriptor)) { valsWithTrivialInitializer.add(descriptor) } else { diff --git a/compiler/frontend/src/org/jetbrains/kotlin/cfg/pseudocode/ControlFlowInstructionsGenerator.kt b/compiler/frontend/src/org/jetbrains/kotlin/cfg/pseudocode/ControlFlowInstructionsGenerator.kt index e86c81cc3a8..487edc5d865 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/cfg/pseudocode/ControlFlowInstructionsGenerator.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/cfg/pseudocode/ControlFlowInstructionsGenerator.kt @@ -19,8 +19,8 @@ package org.jetbrains.kotlin.cfg.pseudocode import com.intellij.util.containers.Stack import org.jetbrains.kotlin.builtins.KotlinBuiltIns import org.jetbrains.kotlin.cfg.* -import org.jetbrains.kotlin.cfg.pseudocode.instructions.Instruction import org.jetbrains.kotlin.cfg.pseudocode.instructions.BlockScope +import org.jetbrains.kotlin.cfg.pseudocode.instructions.Instruction import org.jetbrains.kotlin.cfg.pseudocode.instructions.eval.* import org.jetbrains.kotlin.cfg.pseudocode.instructions.jumps.* import org.jetbrains.kotlin.cfg.pseudocode.instructions.special.* @@ -29,7 +29,6 @@ import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.resolve.calls.model.ResolvedCall import org.jetbrains.kotlin.resolve.constants.CompileTimeConstant import org.jetbrains.kotlin.resolve.scopes.receivers.ReceiverValue - import java.util.* class ControlFlowInstructionsGenerator : ControlFlowBuilderAdapter() { @@ -113,6 +112,10 @@ class ControlFlowInstructionsGenerator : ControlFlowBuilderAdapter() { override fun createUnboundLabel(name: String): Label = pseudocode.createLabel("L" + labelCount++, name) override fun enterLoop(expression: KtLoopExpression): LoopInfo { + if (expression is KtDoWhileExpression) { + (pseudocode.rootPseudocode as PseudocodeImpl).containsDoWhile = true + } + val info = LoopInfo( expression, createUnboundLabel("loop entry point"), diff --git a/compiler/frontend/src/org/jetbrains/kotlin/cfg/pseudocode/Pseudocode.kt b/compiler/frontend/src/org/jetbrains/kotlin/cfg/pseudocode/Pseudocode.kt index b387e2360d6..7ab4903baf6 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/cfg/pseudocode/Pseudocode.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/cfg/pseudocode/Pseudocode.kt @@ -45,6 +45,9 @@ interface Pseudocode { val enterInstruction: SubroutineEnterInstruction + val containsDoWhile: Boolean + val rootPseudocode: Pseudocode + fun getElementValue(element: KtElement?): PseudoValue? fun getValueElements(value: PseudoValue?): List diff --git a/compiler/frontend/src/org/jetbrains/kotlin/cfg/pseudocode/PseudocodeImpl.kt b/compiler/frontend/src/org/jetbrains/kotlin/cfg/pseudocode/PseudocodeImpl.kt index f3b53f2fde1..cb7972476cf 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/cfg/pseudocode/PseudocodeImpl.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/cfg/pseudocode/PseudocodeImpl.kt @@ -77,6 +77,9 @@ class PseudocodeImpl(override val correspondingElement: KtElement) : Pseudocode private var postPrecessed = false + override var containsDoWhile: Boolean = false + internal set + private fun getLocalDeclarations(pseudocode: Pseudocode): Set { val localDeclarations = linkedSetOf() for (instruction in (pseudocode as PseudocodeImpl).mutableInstructionList) { @@ -88,7 +91,7 @@ class PseudocodeImpl(override val correspondingElement: KtElement) : Pseudocode return localDeclarations } - val rootPseudocode: Pseudocode + override val rootPseudocode: Pseudocode get() { var parent = parent while (parent != null) { diff --git a/compiler/testData/diagnostics/tests/controlFlowAnalysis/doWhileNotDefined.kt b/compiler/testData/diagnostics/tests/controlFlowAnalysis/doWhileNotDefined.kt index 92c4f436540..e41bcd1a76e 100644 --- a/compiler/testData/diagnostics/tests/controlFlowAnalysis/doWhileNotDefined.kt +++ b/compiler/testData/diagnostics/tests/controlFlowAnalysis/doWhileNotDefined.kt @@ -2,5 +2,5 @@ fun test(cond1: Boolean) { do { if (cond1) continue val cond2 = false - } while (cond2) // cond2 may be not defined here + } while (cond2) // cond2 may be not defined here } From 477aeef90c65a744a7482082cf7b6fad8371f5c5 Mon Sep 17 00:00:00 2001 From: Denis Zharkov Date: Wed, 27 Sep 2017 14:07:28 +0300 Subject: [PATCH 180/212] Update test data for rendered CFA results after optimizations --- .../ExhaustiveInitialization.instructions | 60 +++---- .../basic/IfWithUninitialized.instructions | 10 +- .../basic/UsageInFunctionLiteral.instructions | 36 ++--- .../UseUninitializedInLambda.instructions | 8 +- .../VariablesInitialization.instructions | 20 +-- .../basic/VariablesUsage.instructions | 10 +- .../initializationInLocalClass.instructions | 14 +- .../cfg-variables/bugs/kt10243.instructions | 36 ++--- .../cfg-variables/bugs/kt4764.instructions | 12 +- .../cfg-variables/bugs/kt5469.instructions | 4 +- .../localObjectInConstructor.instructions | 148 +++++++++--------- ...eferenceToPropertyInitializer.instructions | 66 ++++---- .../varInitializationInIfInCycle.instructions | 42 ++--- .../lexicalScopes/forScope.instructions | 14 +- .../functionLiteralScope.instructions | 26 +-- .../lexicalScopes/ifScope.instructions | 14 +- .../lexicalScopes/localClass.instructions | 26 +-- .../localFunctionScope.instructions | 24 +-- ...localFunctionScopeWithoutBody.instructions | 22 +-- .../lexicalScopes/localObject.instructions | 18 +-- .../objectLiteralScope.instructions | 30 ++-- .../propertyAccessorScope.instructions | 28 ++-- .../lexicalScopes/tryScope.instructions | 28 ++-- 23 files changed, 348 insertions(+), 348 deletions(-) diff --git a/compiler/testData/cfg-variables/basic/ExhaustiveInitialization.instructions b/compiler/testData/cfg-variables/basic/ExhaustiveInitialization.instructions index b6dac5b140b..8dd64ec31c7 100644 --- a/compiler/testData/cfg-variables/basic/ExhaustiveInitialization.instructions +++ b/compiler/testData/cfg-variables/basic/ExhaustiveInitialization.instructions @@ -40,64 +40,64 @@ L0: 1 INIT: in: {} out: {} v(dir: Direction) INIT: in: {} out: {dir=D} magic[FAKE_INITIALIZER](dir: Direction) -> INIT: in: {dir=D} out: {dir=D} - w(dir|) INIT: in: {dir=D} out: {dir=ID} USE: in: {EAST=READ, NORTH=READ, SOUTH=READ, WEST=READ, dir=READ} out: {EAST=READ, NORTH=READ, SOUTH=READ, WEST=READ, dir=READ} + w(dir|) INIT: in: {dir=D} out: {dir=ID} USE: in: {dir=READ} out: {dir=READ} 2 mark({ val res: Int when (dir) { Direction.NORTH -> res = 1 Direction.SOUTH -> res = 2 Direction.WEST -> res = 3 Direction.EAST -> res = 4 } return res }) INIT: in: {dir=ID} out: {dir=ID} v(val res: Int) INIT: in: {dir=ID} out: {dir=ID, res=D} - mark(when (dir) { Direction.NORTH -> res = 1 Direction.SOUTH -> res = 2 Direction.WEST -> res = 3 Direction.EAST -> res = 4 }) INIT: in: {dir=ID, res=D} out: {dir=ID, res=D} USE: in: {EAST=READ, NORTH=READ, SOUTH=READ, WEST=READ, dir=READ, res=READ} out: {EAST=READ, NORTH=READ, SOUTH=READ, WEST=READ, dir=READ, res=READ} - r(dir) -> USE: in: {EAST=READ, NORTH=READ, SOUTH=READ, WEST=READ, res=READ} out: {EAST=READ, NORTH=READ, SOUTH=READ, WEST=READ, dir=READ, res=READ} + mark(when (dir) { Direction.NORTH -> res = 1 Direction.SOUTH -> res = 2 Direction.WEST -> res = 3 Direction.EAST -> res = 4 }) INIT: in: {dir=ID, res=D} out: {dir=ID, res=D} + r(dir) -> mark(Direction.NORTH -> res = 1) mark(Direction.NORTH) - mark(Direction.NORTH) USE: in: {EAST=READ, NORTH=READ, SOUTH=READ, WEST=READ, res=READ} out: {EAST=READ, NORTH=READ, SOUTH=READ, WEST=READ, res=READ} - r(NORTH) -> USE: in: {EAST=READ, SOUTH=READ, WEST=READ, res=READ} out: {EAST=READ, NORTH=READ, SOUTH=READ, WEST=READ, res=READ} + mark(Direction.NORTH) + r(NORTH) -> magic[EQUALS_IN_WHEN_CONDITION](Direction.NORTH|, ) -> - jmp?(L4|) USE: in: {EAST=READ, SOUTH=READ, WEST=READ, res=READ} out: {EAST=READ, SOUTH=READ, WEST=READ, res=READ} + jmp?(L4|) USE: in: {dir=READ, res=READ} out: {dir=READ, res=READ} L3 ['when' entry body]: - r(1) -> USE: in: {res=WRITTEN_AFTER_READ} out: {res=WRITTEN_AFTER_READ} - w(res|) INIT: in: {dir=ID, res=D} out: {dir=ID, res=ID} USE: in: {res=READ} out: {res=WRITTEN_AFTER_READ} - jmp(L2) INIT: in: {dir=ID, res=ID} out: {dir=ID, res=ID} USE: in: {res=READ} out: {res=READ} + r(1) -> USE: in: {dir=READ, res=WRITTEN_AFTER_READ} out: {dir=READ, res=WRITTEN_AFTER_READ} + w(res|) INIT: in: {dir=ID, res=D} out: {dir=ID, res=ID} USE: in: {dir=READ, res=READ} out: {dir=READ, res=WRITTEN_AFTER_READ} + jmp(L2) INIT: in: {dir=ID, res=ID} out: {dir=ID, res=ID} L4 [next 'when' entry]: mark(Direction.SOUTH -> res = 2) INIT: in: {dir=ID, res=D} out: {dir=ID, res=D} mark(Direction.SOUTH) - mark(Direction.SOUTH) USE: in: {EAST=READ, SOUTH=READ, WEST=READ, res=READ} out: {EAST=READ, SOUTH=READ, WEST=READ, res=READ} - r(SOUTH) -> USE: in: {EAST=READ, WEST=READ, res=READ} out: {EAST=READ, SOUTH=READ, WEST=READ, res=READ} + mark(Direction.SOUTH) + r(SOUTH) -> magic[EQUALS_IN_WHEN_CONDITION](Direction.SOUTH|, ) -> - jmp?(L6|) USE: in: {EAST=READ, WEST=READ, res=READ} out: {EAST=READ, WEST=READ, res=READ} + jmp?(L6|) USE: in: {dir=READ, res=READ} out: {dir=READ, res=READ} L5 ['when' entry body]: - r(2) -> USE: in: {res=WRITTEN_AFTER_READ} out: {res=WRITTEN_AFTER_READ} - w(res|) INIT: in: {dir=ID, res=D} out: {dir=ID, res=ID} USE: in: {res=READ} out: {res=WRITTEN_AFTER_READ} - jmp(L2) INIT: in: {dir=ID, res=ID} out: {dir=ID, res=ID} USE: in: {res=READ} out: {res=READ} + r(2) -> USE: in: {dir=READ, res=WRITTEN_AFTER_READ} out: {dir=READ, res=WRITTEN_AFTER_READ} + w(res|) INIT: in: {dir=ID, res=D} out: {dir=ID, res=ID} USE: in: {dir=READ, res=READ} out: {dir=READ, res=WRITTEN_AFTER_READ} + jmp(L2) INIT: in: {dir=ID, res=ID} out: {dir=ID, res=ID} L6 [next 'when' entry]: mark(Direction.WEST -> res = 3) INIT: in: {dir=ID, res=D} out: {dir=ID, res=D} mark(Direction.WEST) - mark(Direction.WEST) USE: in: {EAST=READ, WEST=READ, res=READ} out: {EAST=READ, WEST=READ, res=READ} - r(WEST) -> USE: in: {EAST=READ, res=READ} out: {EAST=READ, WEST=READ, res=READ} + mark(Direction.WEST) + r(WEST) -> magic[EQUALS_IN_WHEN_CONDITION](Direction.WEST|, ) -> - jmp?(L8|) USE: in: {EAST=READ, res=READ} out: {EAST=READ, res=READ} + jmp?(L8|) USE: in: {dir=READ, res=READ} out: {dir=READ, res=READ} L7 ['when' entry body]: - r(3) -> USE: in: {res=WRITTEN_AFTER_READ} out: {res=WRITTEN_AFTER_READ} - w(res|) INIT: in: {dir=ID, res=D} out: {dir=ID, res=ID} USE: in: {res=READ} out: {res=WRITTEN_AFTER_READ} - jmp(L2) INIT: in: {dir=ID, res=ID} out: {dir=ID, res=ID} USE: in: {res=READ} out: {res=READ} + r(3) -> USE: in: {dir=READ, res=WRITTEN_AFTER_READ} out: {dir=READ, res=WRITTEN_AFTER_READ} + w(res|) INIT: in: {dir=ID, res=D} out: {dir=ID, res=ID} USE: in: {dir=READ, res=READ} out: {dir=READ, res=WRITTEN_AFTER_READ} + jmp(L2) INIT: in: {dir=ID, res=ID} out: {dir=ID, res=ID} L8 [next 'when' entry]: mark(Direction.EAST -> res = 4) INIT: in: {dir=ID, res=D} out: {dir=ID, res=D} mark(Direction.EAST) - mark(Direction.EAST) USE: in: {EAST=READ, res=READ} out: {EAST=READ, res=READ} - r(EAST) -> USE: in: {res=READ} out: {EAST=READ, res=READ} + mark(Direction.EAST) + r(EAST) -> magic[EQUALS_IN_WHEN_CONDITION](Direction.EAST|, ) -> - jmp?(L10|) USE: in: {res=READ} out: {res=READ} + jmp?(L10|) USE: in: {dir=READ, res=READ} out: {dir=READ, res=READ} L9 ['when' entry body]: - r(4) -> USE: in: {res=WRITTEN_AFTER_READ} out: {res=WRITTEN_AFTER_READ} - w(res|) INIT: in: {dir=ID, res=D} out: {dir=ID, res=ID} USE: in: {res=READ} out: {res=WRITTEN_AFTER_READ} + r(4) -> USE: in: {dir=READ, res=WRITTEN_AFTER_READ} out: {dir=READ, res=WRITTEN_AFTER_READ} + w(res|) INIT: in: {dir=ID, res=D} out: {dir=ID, res=ID} USE: in: {dir=READ, res=READ} out: {dir=READ, res=WRITTEN_AFTER_READ} jmp(L2) INIT: in: {dir=ID, res=ID} out: {dir=ID, res=ID} L10 [next 'when' entry]: magic[EXHAUSTIVE_WHEN_ELSE](when (dir) { Direction.NORTH -> res = 1 Direction.SOUTH -> res = 2 Direction.WEST -> res = 3 Direction.EAST -> res = 4 }) -> INIT: in: {dir=ID, res=D} out: {dir=ID, res=IED} L2 [after 'when' expression]: - merge(when (dir) { Direction.NORTH -> res = 1 Direction.SOUTH -> res = 2 Direction.WEST -> res = 3 Direction.EAST -> res = 4 }|!, !, !, !) -> INIT: in: {dir=ID, res=ID} out: {dir=ID, res=ID} USE: in: {res=READ} out: {res=READ} - r(res) -> USE: in: {} out: {res=READ} + merge(when (dir) { Direction.NORTH -> res = 1 Direction.SOUTH -> res = 2 Direction.WEST -> res = 3 Direction.EAST -> res = 4 }|!, !, !, !) -> INIT: in: {dir=ID, res=ID} out: {dir=ID, res=ID} USE: in: {dir=READ, res=READ} out: {dir=READ, res=READ} + r(res) -> USE: in: {dir=READ} out: {dir=READ, res=READ} ret(*|) L1 L1: 1 INIT: in: {dir=ID} out: {dir=ID} error: - INIT: in: {} out: {} + sink: - INIT: in: {dir=I?} out: {dir=I?} USE: in: {} out: {} + USE: in: {dir=READ} out: {dir=READ} ===================== diff --git a/compiler/testData/cfg-variables/basic/IfWithUninitialized.instructions b/compiler/testData/cfg-variables/basic/IfWithUninitialized.instructions index 8fef6c3a2bc..beda1c7afb7 100644 --- a/compiler/testData/cfg-variables/basic/IfWithUninitialized.instructions +++ b/compiler/testData/cfg-variables/basic/IfWithUninitialized.instructions @@ -44,13 +44,13 @@ L0: 1 INIT: in: {} out: {} v(vararg a: Any?) INIT: in: {} out: {a=D} magic[FAKE_INITIALIZER](vararg a: Any?) -> INIT: in: {a=D} out: {a=D} - w(a|) INIT: in: {a=D} out: {a=ID} USE: in: {a=READ} out: {a=READ} - r(a) -> INIT: in: {a=ID} out: {a=ID} USE: in: {} out: {a=READ} + w(a|) INIT: in: {a=D} out: {a=ID} + r(a) -> INIT: in: {a=ID} out: {a=ID} ret(*|) L1 L1: error: - INIT: in: {} out: {} + sink: - INIT: in: {a=I?} out: {a=I?} USE: in: {} out: {} -===================== \ No newline at end of file + USE: in: {a=READ} out: {a=READ} +===================== diff --git a/compiler/testData/cfg-variables/basic/UsageInFunctionLiteral.instructions b/compiler/testData/cfg-variables/basic/UsageInFunctionLiteral.instructions index 58677b74e8f..87f08e33434 100644 --- a/compiler/testData/cfg-variables/basic/UsageInFunctionLiteral.instructions +++ b/compiler/testData/cfg-variables/basic/UsageInFunctionLiteral.instructions @@ -8,7 +8,7 @@ fun foo() { } --------------------- L0: - 1 INIT: in: {} out: {} USE: in: {} out: {} + 1 INIT: in: {} out: {} 2 mark({ val a = 1 val f = { x: Int -> val y = x + a use(a) } }) v(val a = 1) INIT: in: {} out: {a=D} r(1) -> INIT: in: {a=D} out: {a=D} @@ -16,16 +16,16 @@ L0: v(val f = { x: Int -> val y = x + a use(a) }) INIT: in: {a=ID} out: {a=ID, f=D} mark({ x: Int -> val y = x + a use(a) }) INIT: in: {a=ID, f=D} out: {a=ID, f=D} jmp?(L2) - d({ x: Int -> val y = x + a use(a) }) INIT: in: {a=I, f=I?} out: {a=I, f=I?} USE: in: {a=READ} out: {a=READ} + d({ x: Int -> val y = x + a use(a) }) INIT: in: {a=ID, f=D, x=ID, y=ID} out: {a=ID, f=D, x=ID, y=ID} L2 [after local declaration]: - r({ x: Int -> val y = x + a use(a) }) -> INIT: in: {a=ID, f=D} out: {a=ID, f=D} - w(f|) INIT: in: {a=ID, f=D} out: {a=ID, f=ID} + r({ x: Int -> val y = x + a use(a) }) -> + w(f|) INIT: in: {a=ID, f=D, x=ID, y=ID} out: {a=ID, f=ID, x=ID, y=ID} L1: - 1 INIT: in: {} out: {} + 1 INIT: in: {a=ID, f=ID, x=ID, y=ID} out: {a=ID, f=ID, x=ID, y=ID} error: sink: - USE: in: {} out: {} + USE: in: {a=READ, x=READ} out: {a=READ, x=READ} ===================== == anonymous_0 == { x: Int -> @@ -39,22 +39,22 @@ L3: magic[FAKE_INITIALIZER](x: Int) -> INIT: in: {a=ID, f=D, x=D} out: {a=ID, f=D, x=D} w(x|) INIT: in: {a=ID, f=D, x=D} out: {a=ID, f=D, x=ID} 4 mark(val y = x + a use(a)) INIT: in: {a=ID, f=D, x=ID} out: {a=ID, f=D, x=ID} - v(val y = x + a) INIT: in: {a=ID, f=D, x=ID} out: {a=ID, f=D, x=ID, y=D} USE: in: {a=READ, x=READ} out: {a=READ, x=READ} - r(x) -> INIT: in: {a=ID, f=D, x=ID, y=D} out: {a=ID, f=D, x=ID, y=D} USE: in: {a=READ} out: {a=READ, x=READ} + v(val y = x + a) INIT: in: {a=ID, f=D, x=ID} out: {a=ID, f=D, x=ID, y=D} + r(x) -> INIT: in: {a=ID, f=D, x=ID, y=D} out: {a=ID, f=D, x=ID, y=D} r(a) -> mark(x + a) call(x + a, plus|, ) -> - w(y|) INIT: in: {a=ID, f=D, x=ID, y=D} out: {a=ID, f=D, x=ID, y=ID} USE: in: {a=READ} out: {a=READ} - r(a) -> INIT: in: {a=ID, f=D, x=ID, y=ID} out: {a=ID, f=D, x=ID, y=ID} USE: in: {} out: {a=READ} + w(y|) INIT: in: {a=ID, f=D, x=ID, y=D} out: {a=ID, f=D, x=ID, y=ID} + r(a) -> INIT: in: {a=ID, f=D, x=ID, y=ID} out: {a=ID, f=D, x=ID, y=ID} mark(use(a)) call(use(a), use|) -> - 3 ret(*|) L4 INIT: in: {a=ID, f=D, x=ID} out: {a=ID, f=D, x=ID} + 3 ret(*|) L4 L4: error: - INIT: in: {} out: {} + sink: - INIT: in: {a=I, f=I?, x=I?} out: {a=I, f=I?, x=I?} USE: in: {} out: {} + USE: in: {a=READ, x=READ} out: {a=READ, x=READ} ===================== == use == fun use(vararg a: Any?) = a @@ -63,13 +63,13 @@ L0: 1 INIT: in: {} out: {} v(vararg a: Any?) INIT: in: {} out: {a=D} magic[FAKE_INITIALIZER](vararg a: Any?) -> INIT: in: {a=D} out: {a=D} - w(a|) INIT: in: {a=D} out: {a=ID} USE: in: {a=READ} out: {a=READ} - r(a) -> INIT: in: {a=ID} out: {a=ID} USE: in: {} out: {a=READ} + w(a|) INIT: in: {a=D} out: {a=ID} + r(a) -> INIT: in: {a=ID} out: {a=ID} ret(*|) L1 L1: error: - INIT: in: {} out: {} + sink: - INIT: in: {a=I?} out: {a=I?} USE: in: {} out: {} -===================== \ No newline at end of file + USE: in: {a=READ} out: {a=READ} +===================== diff --git a/compiler/testData/cfg-variables/basic/UseUninitializedInLambda.instructions b/compiler/testData/cfg-variables/basic/UseUninitializedInLambda.instructions index db7d08ed818..620d1e9dc27 100644 --- a/compiler/testData/cfg-variables/basic/UseUninitializedInLambda.instructions +++ b/compiler/testData/cfg-variables/basic/UseUninitializedInLambda.instructions @@ -5,17 +5,17 @@ L0: 1 INIT: in: {} out: {} v(f: () -> Unit) INIT: in: {} out: {f=D} magic[FAKE_INITIALIZER](f: () -> Unit) -> INIT: in: {f=D} out: {f=D} - w(f|) INIT: in: {f=D} out: {f=ID} USE: in: {f=READ} out: {f=READ} - r(f) -> INIT: in: {f=ID} out: {f=ID} USE: in: {} out: {f=READ} + w(f|) INIT: in: {f=D} out: {f=ID} + r(f) -> INIT: in: {f=ID} out: {f=ID} mark(f()) call(f(), invoke|) -> ret(*|) L1 L1: error: - INIT: in: {} out: {} + sink: - INIT: in: {f=I?} out: {f=I?} USE: in: {} out: {} + USE: in: {f=READ} out: {f=READ} ===================== == foo == fun foo() { diff --git a/compiler/testData/cfg-variables/basic/VariablesInitialization.instructions b/compiler/testData/cfg-variables/basic/VariablesInitialization.instructions index 50aea77f14f..7ffbbe6a3e5 100644 --- a/compiler/testData/cfg-variables/basic/VariablesInitialization.instructions +++ b/compiler/testData/cfg-variables/basic/VariablesInitialization.instructions @@ -17,7 +17,7 @@ L0: w(b|) INIT: in: {a=ID, b=D} out: {a=ID, b=ID} USE: in: {} out: {b=ONLY_WRITTEN_NEVER_READ} r(42) -> INIT: in: {a=ID, b=ID} out: {a=ID, b=ID} L1: - 1 INIT: in: {} out: {} + 1 INIT: in: {a=ID} out: {a=ID} error: sink: @@ -37,18 +37,18 @@ L0: w(foo|) INIT: in: {foo=D} out: {foo=ID} 2 mark({ foo.c foo.c = 2 42 }) INIT: in: {foo=ID} out: {foo=ID} mark(foo.c) - r(foo) -> USE: in: {c=READ, foo=READ} out: {c=READ, foo=READ} - r(c|) -> USE: in: {c=ONLY_WRITTEN_NEVER_READ, foo=READ} out: {c=READ, foo=READ} - r(foo) -> USE: in: {c=ONLY_WRITTEN_NEVER_READ} out: {c=ONLY_WRITTEN_NEVER_READ, foo=READ} - r(2) -> USE: in: {c=ONLY_WRITTEN_NEVER_READ} out: {c=ONLY_WRITTEN_NEVER_READ} - w(foo.c|, ) USE: in: {} out: {c=ONLY_WRITTEN_NEVER_READ} + r(foo) -> + r(c|) -> + r(foo) -> + r(2) -> + w(foo.c|, ) r(42) -> L1: 1 error: - INIT: in: {} out: {} + sink: - INIT: in: {foo=I?} out: {foo=I?} USE: in: {} out: {} + USE: in: {foo=READ} out: {foo=READ} ===================== == Foo == interface Foo { @@ -61,7 +61,7 @@ L0: L1: INIT: in: {c=D} out: {c=D} error: - INIT: in: {} out: {} + sink: - INIT: in: {c=-} out: {c=-} USE: in: {} out: {} + USE: in: {} out: {} ===================== diff --git a/compiler/testData/cfg-variables/basic/VariablesUsage.instructions b/compiler/testData/cfg-variables/basic/VariablesUsage.instructions index 87940f1b4cf..faae6aef3d4 100644 --- a/compiler/testData/cfg-variables/basic/VariablesUsage.instructions +++ b/compiler/testData/cfg-variables/basic/VariablesUsage.instructions @@ -53,13 +53,13 @@ L0: 1 INIT: in: {} out: {} v(a: Int) INIT: in: {} out: {a=D} magic[FAKE_INITIALIZER](a: Int) -> INIT: in: {a=D} out: {a=D} - w(a|) INIT: in: {a=D} out: {a=ID} USE: in: {a=READ} out: {a=READ} - r(a) -> INIT: in: {a=ID} out: {a=ID} USE: in: {} out: {a=READ} + w(a|) INIT: in: {a=D} out: {a=ID} + r(a) -> INIT: in: {a=ID} out: {a=ID} ret(*|) L1 L1: error: - INIT: in: {} out: {} + sink: - INIT: in: {a=I?} out: {a=I?} USE: in: {} out: {} -===================== \ No newline at end of file + USE: in: {a=READ} out: {a=READ} +===================== diff --git a/compiler/testData/cfg-variables/bugs/initializationInLocalClass.instructions b/compiler/testData/cfg-variables/bugs/initializationInLocalClass.instructions index 6b5f23273a4..0d11c4d3e54 100644 --- a/compiler/testData/cfg-variables/bugs/initializationInLocalClass.instructions +++ b/compiler/testData/cfg-variables/bugs/initializationInLocalClass.instructions @@ -10,18 +10,18 @@ fun foo() { } --------------------- L0: - 1 INIT: in: {} out: {} USE: in: {length=READ} out: {length=READ} + 1 INIT: in: {} out: {} USE: in: {} out: {} 2 mark({ var x: String class A { init { x = "" } } x.length }) v(var x: String) INIT: in: {} out: {x=D} - jmp?(L2) INIT: in: {x=D} out: {x=D} USE: in: {length=READ, x=READ} out: {length=READ, x=READ} + jmp?(L2) INIT: in: {x=D} out: {x=D} USE: in: {x=READ} out: {x=READ} 3 mark({ x = "" }) mark("") - r("") -> USE: in: {length=READ, x=WRITTEN_AFTER_READ} out: {length=READ, x=WRITTEN_AFTER_READ} - w(x|) INIT: in: {x=D} out: {x=ID} USE: in: {length=READ, x=READ} out: {length=READ, x=WRITTEN_AFTER_READ} + r("") -> USE: in: {x=WRITTEN_AFTER_READ} out: {x=WRITTEN_AFTER_READ} + w(x|) INIT: in: {x=D} out: {x=ID} USE: in: {x=READ} out: {x=WRITTEN_AFTER_READ} L2 [after local class]: - 2 mark(x.length) INIT: in: {x=I?D} out: {x=I?D} USE: in: {length=READ, x=READ} out: {length=READ, x=READ} - r(x) -> USE: in: {length=READ} out: {length=READ, x=READ} - r(length|) -> USE: in: {} out: {length=READ} + 2 mark(x.length) INIT: in: {x=I?D} out: {x=I?D} USE: in: {x=READ} out: {x=READ} + r(x) -> USE: in: {} out: {x=READ} + r(length|) -> L1: 1 INIT: in: {} out: {} error: diff --git a/compiler/testData/cfg-variables/bugs/kt10243.instructions b/compiler/testData/cfg-variables/bugs/kt10243.instructions index 70bdf82c8a4..17044411ec6 100644 --- a/compiler/testData/cfg-variables/bugs/kt10243.instructions +++ b/compiler/testData/cfg-variables/bugs/kt10243.instructions @@ -32,66 +32,66 @@ L0: mark(try { if (f) { x = 0 } } finally { fun bar() {} }) jmp?(L2) 3 mark({ if (f) { x = 0 } }) - mark(if (f) { x = 0 }) USE: in: {f=READ, x=ONLY_WRITTEN_NEVER_READ} out: {f=READ, x=ONLY_WRITTEN_NEVER_READ} - r(f) -> USE: in: {x=ONLY_WRITTEN_NEVER_READ} out: {f=READ, x=ONLY_WRITTEN_NEVER_READ} + mark(if (f) { x = 0 }) + r(f) -> jf(L3|) 4 mark({ x = 0 }) - r(0) -> USE: in: {x=ONLY_WRITTEN_NEVER_READ} out: {x=ONLY_WRITTEN_NEVER_READ} - w(x|) INIT: in: {f=ID} out: {f=ID, x=I} USE: in: {} out: {x=ONLY_WRITTEN_NEVER_READ} - 3 jmp(L4) INIT: in: {f=ID, x=I} out: {f=ID, x=I} + r(0) -> + w(x|) + 3 jmp(L4) L3 [else branch]: - read (Unit) INIT: in: {f=ID} out: {f=ID} + read (Unit) L4 ['if' expression result]: - merge(if (f) { x = 0 }|!) -> INIT: in: {f=ID, x=I} out: {f=ID, x=I} + merge(if (f) { x = 0 }|!) -> 2 jmp?(L2) jmp(L5) L2 [onExceptionToFinallyBlock]: L6 [start finally]: 3 mark({ fun bar() {} }) jmp?(L7) - d(fun bar() {}) INIT: in: {f=I, x=I} out: {f=I, x=I} + d(fun bar() {}) L7 [after local declaration]: L10 [finish finally]: - 2 jmp(error) INIT: in: {f=ID, x=I} out: {f=ID, x=I} + 2 jmp(error) L5 [skipFinallyToErrorBlock]: L11 [copy of L2, onExceptionToFinallyBlock]: 3 mark({ fun bar() {} }) jmp?(L12) - d(fun bar() {}) INIT: in: {f=I, x=I} out: {f=I, x=I} + d(fun bar() {}) L12 [copy of L7, after local declaration]: - 2 merge(try { if (f) { x = 0 } } finally { fun bar() {} }|) -> INIT: in: {f=ID, x=I} out: {f=ID, x=I} + 2 merge(try { if (f) { x = 0 } } finally { fun bar() {} }|) -> L1: 1 error: sink: - INIT: in: {f=I, x=I} out: {f=I, x=I} USE: in: {} out: {} + USE: in: {f=READ} out: {f=READ} ===================== == bar == fun bar() {} --------------------- L8: - 4 INIT: in: {f=ID, x=I} out: {f=ID, x=I} + 4 INIT: in: {f=ID} out: {f=ID} 5 mark({}) read (Unit) L9: 4 error: - INIT: in: {} out: {} + sink: - INIT: in: {f=I, x=I} out: {f=I, x=I} USE: in: {} out: {} + USE: in: {f=READ} out: {f=READ} ===================== == bar == fun bar() {} --------------------- L2 [copy of L8, null]: - 4 INIT: in: {f=ID, x=I} out: {f=ID, x=I} + 4 INIT: in: {f=ID} out: {f=ID} 5 mark({}) read (Unit) L3 [copy of L9, null]: 4 L0 [copy of error, null]: - INIT: in: {} out: {} + L1 [copy of sink, null]: - INIT: in: {f=I, x=I} out: {f=I, x=I} USE: in: {} out: {} + USE: in: {f=READ} out: {f=READ} ===================== diff --git a/compiler/testData/cfg-variables/bugs/kt4764.instructions b/compiler/testData/cfg-variables/bugs/kt4764.instructions index b08aa6912e0..90955a7ed90 100644 --- a/compiler/testData/cfg-variables/bugs/kt4764.instructions +++ b/compiler/testData/cfg-variables/bugs/kt4764.instructions @@ -78,27 +78,27 @@ L12 [start finally]: mark(println(foo)) magic[UNRESOLVED_CALL](println(foo)|, !) -> L13 [finish finally]: - 5 mark({}) INIT: in: {} out: {} + 5 mark({}) INIT: in: {e=ID} out: {e=ID} read (Unit) 8 ret(*|) L1 USE: in: {} out: {} - 7 jmp(L11) L11 [afterCatches]: - 6 jmp(L14) INIT: in: {foo=ID} out: {foo=ID} + 6 jmp(L14) INIT: in: {e=ID, foo=ID} out: {e=ID, foo=ID} L10 [onExceptionToFinallyBlock]: 9 mark({ println(foo) // Variable 'foo' must be initialized }) USE: in: {foo=READ} out: {foo=READ} r(foo) -> USE: in: {} out: {foo=READ} mark(println(foo)) magic[UNRESOLVED_CALL](println(foo)|, !) -> - 5 mark({}) INIT: in: {} out: {} + 5 mark({}) INIT: in: {e=ID} out: {e=ID} read (Unit) 6 jmp(error) USE: in: {} out: {} L14 [skipFinallyToErrorBlock]: - 9 mark({ println(foo) // Variable 'foo' must be initialized }) INIT: in: {foo=ID} out: {foo=ID} USE: in: {foo=READ} out: {foo=READ} + 9 mark({ println(foo) // Variable 'foo' must be initialized }) INIT: in: {e=ID, foo=ID} out: {e=ID, foo=ID} USE: in: {foo=READ} out: {foo=READ} r(foo) -> USE: in: {} out: {foo=READ} mark(println(foo)) magic[UNRESOLVED_CALL](println(foo)|, !) -> 6 merge(try { foo = "test" } catch (e: Exception) { return "fail" } finally { println(foo) // Variable 'foo' must be initialized }|!, !) -> - 5 jmp(L15) INIT: in: {} out: {} + 5 jmp(L15) INIT: in: {e=ID} out: {e=ID} L8 [else branch]: read (Unit) L15 ['if' expression result]: @@ -111,7 +111,7 @@ L15 ['if' expression result]: ret(*|) L1 USE: in: {} out: {} - 4 jmp(L16) L7 [else branch]: - read (Unit) INIT: in: {} out: {} + read (Unit) INIT: in: {e=ID} out: {e=ID} L16 ['if' expression result]: merge(if (false) { if (false) { var foo: String? = null try { foo = "test" } catch (e: Exception) { return "fail" } finally { println(foo) // Variable 'foo' must be initialized } } return "fail" }|!) -> L6 ['if' expression result]: diff --git a/compiler/testData/cfg-variables/bugs/kt5469.instructions b/compiler/testData/cfg-variables/bugs/kt5469.instructions index 9b8a48de51c..6b5d5fd7807 100644 --- a/compiler/testData/cfg-variables/bugs/kt5469.instructions +++ b/compiler/testData/cfg-variables/bugs/kt5469.instructions @@ -37,9 +37,9 @@ L2 [onException]: magic[UNRESOLVED_CALL](println(foo)|, !) -> 3 jmp(L3) L3 [afterCatches]: - 2 merge(try { foo = 2 throw RuntimeException() } catch (e: Throwable) { println(foo) }|!, ) -> INIT: in: {foo=ID} out: {foo=ID} + 2 merge(try { foo = 2 throw RuntimeException() } catch (e: Throwable) { println(foo) }|!, ) -> L1: - 1 INIT: in: {} out: {} + 1 INIT: in: {e=ID} out: {e=ID} error: sink: diff --git a/compiler/testData/cfg-variables/bugs/localObjectInConstructor.instructions b/compiler/testData/cfg-variables/bugs/localObjectInConstructor.instructions index 0dc5d0dc039..29e878038e6 100644 --- a/compiler/testData/cfg-variables/bugs/localObjectInConstructor.instructions +++ b/compiler/testData/cfg-variables/bugs/localObjectInConstructor.instructions @@ -11,9 +11,9 @@ L0: L1: 1 error: - INIT: in: {} out: {} + sink: - INIT: in: {obj=I?} out: {obj=I?} USE: in: {} out: {} + USE: in: {} out: {} ===================== == Demo0 == class Demo0 { @@ -31,9 +31,9 @@ L0: v(private val some = object { fun foo() { println(state) // Ok } }) INIT: in: {} out: {some=D} mark(object { fun foo() { println(state) // Ok } }) INIT: in: {some=D} out: {some=D} jmp?(L2) - d(fun foo() { println(state) // Ok }) INIT: in: {some=I?} out: {some=I?} USE: in: {state=READ} out: {state=READ} + d(fun foo() { println(state) // Ok }) USE: in: {state=READ} out: {state=READ} L2 [after local declaration]: - r(object { fun foo() { println(state) // Ok } }) -> INIT: in: {some=D} out: {some=D} + r(object { fun foo() { println(state) // Ok } }) -> w(some|) INIT: in: {some=D} out: {some=ID} v(private var state: Boolean = true) INIT: in: {some=ID} out: {some=ID, state=D} r(true) -> INIT: in: {some=ID, state=D} out: {some=ID, state=D} @@ -41,9 +41,9 @@ L2 [after local declaration]: L1: INIT: in: {some=ID, state=ID} out: {some=ID, state=ID} error: - INIT: in: {} out: {} + INIT: in: {some=ID} out: {some=ID} sink: - INIT: in: {some=I?, state=I?} out: {some=I?, state=I?} USE: in: {} out: {} + INIT: in: {some=ID, state=I?} out: {some=ID, state=I?} USE: in: {} out: {} ===================== == foo == fun foo() { @@ -53,16 +53,16 @@ fun foo() { L3: 2 INIT: in: {some=D} out: {some=D} 3 mark({ println(state) // Ok }) - magic[IMPLICIT_RECEIVER](state) -> USE: in: {state=READ} out: {state=READ} - r(state|) -> USE: in: {} out: {state=READ} + magic[IMPLICIT_RECEIVER](state) -> USE: in: {state=READ} out: {state=READ} + r(state|) -> USE: in: {} out: {state=READ} mark(println(state)) call(println(state), println|) -> L4: 2 error: - INIT: in: {} out: {} + sink: - INIT: in: {some=I?} out: {some=I?} USE: in: {} out: {} + USE: in: {} out: {} ===================== == Demo1 == class Demo1 { @@ -83,7 +83,7 @@ L0: v(private val some = object { fun foo() { if (state) state = true println(state) // must be initialized } }) INIT: in: {} out: {some=D} mark(object { fun foo() { if (state) state = true println(state) // must be initialized } }) INIT: in: {some=D} out: {some=D} jmp?(L2) - d(fun foo() { if (state) state = true println(state) // must be initialized }) INIT: in: {some=I?, state=I} out: {some=I?, state=I} USE: in: {state=READ} out: {state=READ} + d(fun foo() { if (state) state = true println(state) // must be initialized }) INIT: in: {some=D, state=I} out: {some=D, state=I} USE: in: {state=READ} out: {state=READ} L2 [after local declaration]: r(object { fun foo() { if (state) state = true println(state) // must be initialized } }) -> INIT: in: {some=D} out: {some=D} w(some|) INIT: in: {some=D} out: {some=ID} @@ -93,9 +93,9 @@ L2 [after local declaration]: L1: INIT: in: {some=ID, state=ID} out: {some=ID, state=ID} error: - INIT: in: {} out: {} + INIT: in: {some=ID} out: {some=ID} sink: - INIT: in: {some=I?, state=I?} out: {some=I?, state=I?} USE: in: {} out: {} + INIT: in: {some=ID, state=I?} out: {some=ID, state=I?} USE: in: {} out: {} ===================== == foo == fun foo() { @@ -111,25 +111,25 @@ L3: mark(if (state) state = true) magic[IMPLICIT_RECEIVER](state) -> r(state|) -> - jf(L5|) USE: in: {state=READ} out: {state=READ} + jf(L5|) USE: in: {state=READ} out: {state=READ} magic[IMPLICIT_RECEIVER](state) -> - r(true) -> USE: in: {state=WRITTEN_AFTER_READ} out: {state=WRITTEN_AFTER_READ} - w(state|, ) INIT: in: {some=D} out: {some=D, state=I} USE: in: {state=READ} out: {state=WRITTEN_AFTER_READ} + r(true) -> USE: in: {state=WRITTEN_AFTER_READ} out: {state=WRITTEN_AFTER_READ} + w(state|, ) INIT: in: {some=D} out: {some=D, state=I} USE: in: {state=READ} out: {state=WRITTEN_AFTER_READ} jmp(L6) INIT: in: {some=D, state=I} out: {some=D, state=I} L5 [else branch]: read (Unit) INIT: in: {some=D} out: {some=D} L6 ['if' expression result]: merge(if (state) state = true|!) -> INIT: in: {some=D, state=I} out: {some=D, state=I} - magic[IMPLICIT_RECEIVER](state) -> USE: in: {state=READ} out: {state=READ} - r(state|) -> USE: in: {} out: {state=READ} + magic[IMPLICIT_RECEIVER](state) -> USE: in: {state=READ} out: {state=READ} + r(state|) -> USE: in: {} out: {state=READ} mark(println(state)) call(println(state), println|) -> L4: 2 error: - INIT: in: {} out: {} + INIT: in: {some=D} out: {some=D} sink: - INIT: in: {some=I?, state=I} out: {some=I?, state=I} USE: in: {} out: {} + INIT: in: {some=D, state=I} out: {some=D, state=I} USE: in: {} out: {} ===================== == Demo1A == class Demo1A { @@ -169,25 +169,25 @@ L0: mark(if (state) state = true) magic[IMPLICIT_RECEIVER](state) -> r(state|) -> - jf(L2|) USE: in: {state=READ} out: {state=READ} + jf(L2|) magic[IMPLICIT_RECEIVER](state) -> - r(true) -> USE: in: {state=WRITTEN_AFTER_READ} out: {state=WRITTEN_AFTER_READ} - w(state|, ) INIT: in: {} out: {state=I} USE: in: {state=READ} out: {state=WRITTEN_AFTER_READ} - jmp(L3) INIT: in: {state=I} out: {state=I} + r(true) -> + w(state|, ) + jmp(L3) L2 [else branch]: - read (Unit) INIT: in: {} out: {} + read (Unit) L3 ['if' expression result]: - merge(if (state) state = true|!) -> INIT: in: {state=I} out: {state=I} - magic[IMPLICIT_RECEIVER](state) -> USE: in: {state=READ} out: {state=READ} - r(state|) -> USE: in: {} out: {state=READ} + merge(if (state) state = true|!) -> + magic[IMPLICIT_RECEIVER](state) -> + r(state|) -> mark(println(state)) call(println(state), println|) -> L1: 1 error: - INIT: in: {} out: {} + sink: - INIT: in: {state=I} out: {state=I} USE: in: {} out: {} + USE: in: {} out: {} ===================== == Demo2 == class Demo2 { @@ -210,7 +210,7 @@ L0: v(private val some = object { fun foo() { if (state) state = true else state = false println(state) // OK } }) INIT: in: {} out: {some=D} mark(object { fun foo() { if (state) state = true else state = false println(state) // OK } }) INIT: in: {some=D} out: {some=D} jmp?(L2) - d(fun foo() { if (state) state = true else state = false println(state) // OK }) INIT: in: {some=I?, state=I} out: {some=I?, state=I} USE: in: {state=READ} out: {state=READ} + d(fun foo() { if (state) state = true else state = false println(state) // OK }) INIT: in: {some=D, state=I} out: {some=D, state=I} USE: in: {state=READ} out: {state=READ} L2 [after local declaration]: r(object { fun foo() { if (state) state = true else state = false println(state) // OK } }) -> INIT: in: {some=D} out: {some=D} w(some|) INIT: in: {some=D} out: {some=ID} @@ -220,9 +220,9 @@ L2 [after local declaration]: L1: INIT: in: {some=ID, state=ID} out: {some=ID, state=ID} error: - INIT: in: {} out: {} + INIT: in: {some=ID} out: {some=ID} sink: - INIT: in: {some=I?, state=I?} out: {some=I?, state=I?} USE: in: {} out: {} + INIT: in: {some=ID, state=I?} out: {some=ID, state=I?} USE: in: {} out: {} ===================== == foo == fun foo() { @@ -238,29 +238,29 @@ L3: 2 INIT: in: {some=D} out: {some=D} 3 mark({ if (state) state = true else state = false println(state) // OK }) mark(if (state) state = true else state = false) - magic[IMPLICIT_RECEIVER](state) -> USE: in: {state=READ} out: {state=READ} - r(state|) -> USE: in: {state=WRITTEN_AFTER_READ} out: {state=READ} + magic[IMPLICIT_RECEIVER](state) -> USE: in: {state=READ} out: {state=READ} + r(state|) -> USE: in: {state=WRITTEN_AFTER_READ} out: {state=READ} jf(L5|) magic[IMPLICIT_RECEIVER](state) -> - r(true) -> USE: in: {state=WRITTEN_AFTER_READ} out: {state=WRITTEN_AFTER_READ} - w(state|, ) INIT: in: {some=D} out: {some=D, state=I} USE: in: {state=READ} out: {state=WRITTEN_AFTER_READ} - jmp(L6) INIT: in: {some=D, state=I} out: {some=D, state=I} USE: in: {state=READ} out: {state=READ} + r(true) -> USE: in: {state=WRITTEN_AFTER_READ} out: {state=WRITTEN_AFTER_READ} + w(state|, ) INIT: in: {some=D} out: {some=D, state=I} USE: in: {state=READ} out: {state=WRITTEN_AFTER_READ} + jmp(L6) INIT: in: {some=D, state=I} out: {some=D, state=I} USE: in: {state=READ} out: {state=READ} L5 [else branch]: magic[IMPLICIT_RECEIVER](state) -> INIT: in: {some=D} out: {some=D} - r(false) -> USE: in: {state=WRITTEN_AFTER_READ} out: {state=WRITTEN_AFTER_READ} - w(state|, ) INIT: in: {some=D} out: {some=D, state=I} USE: in: {state=READ} out: {state=WRITTEN_AFTER_READ} + r(false) -> USE: in: {state=WRITTEN_AFTER_READ} out: {state=WRITTEN_AFTER_READ} + w(state|, ) INIT: in: {some=D} out: {some=D, state=I} USE: in: {state=READ} out: {state=WRITTEN_AFTER_READ} L6 ['if' expression result]: merge(if (state) state = true else state = false|!, !) -> INIT: in: {some=D, state=I} out: {some=D, state=I} - magic[IMPLICIT_RECEIVER](state) -> USE: in: {state=READ} out: {state=READ} - r(state|) -> USE: in: {} out: {state=READ} + magic[IMPLICIT_RECEIVER](state) -> USE: in: {state=READ} out: {state=READ} + r(state|) -> USE: in: {} out: {state=READ} mark(println(state)) call(println(state), println|) -> L4: 2 error: - INIT: in: {} out: {} + INIT: in: {some=D} out: {some=D} sink: - INIT: in: {some=I?, state=I} out: {some=I?, state=I} USE: in: {} out: {} + INIT: in: {some=D, state=I} out: {some=D, state=I} USE: in: {} out: {} ===================== == Demo3 == class Demo3 { @@ -280,9 +280,9 @@ L0: magic[IMPLICIT_RECEIVER](run { if (state) state = true println(state) // OK }) -> INIT: in: {some=D} out: {some=D} mark({ if (state) state = true println(state) // OK }) jmp?(L2) - d({ if (state) state = true println(state) // OK }) INIT: in: {some=I?} out: {some=I?} USE: in: {state=READ} out: {state=READ} + d({ if (state) state = true println(state) // OK }) USE: in: {state=READ} out: {state=READ} L2 [after local declaration]: - r({ if (state) state = true println(state) // OK }) -> INIT: in: {some=D} out: {some=D} + r({ if (state) state = true println(state) // OK }) -> mark(run { if (state) state = true println(state) // OK }) call(run { if (state) state = true println(state) // OK }, run|, ) -> w(some|) INIT: in: {some=D} out: {some=ID} @@ -292,9 +292,9 @@ L2 [after local declaration]: L1: INIT: in: {some=ID, state=ID} out: {some=ID, state=ID} error: - INIT: in: {} out: {} + INIT: in: {some=ID} out: {some=ID} sink: - INIT: in: {some=I?, state=I?} out: {some=I?, state=I?} USE: in: {} out: {} + INIT: in: {some=ID, state=I?} out: {some=ID, state=I?} USE: in: {} out: {} ===================== == anonymous_0 == { @@ -310,25 +310,25 @@ L3: mark(if (state) state = true) magic[IMPLICIT_RECEIVER](state) -> r(state|) -> - jf(L5|) USE: in: {state=READ} out: {state=READ} + jf(L5|) USE: in: {state=READ} out: {state=READ} magic[IMPLICIT_RECEIVER](state) -> - r(true) -> USE: in: {state=WRITTEN_AFTER_READ} out: {state=WRITTEN_AFTER_READ} - w(state|, ) USE: in: {state=READ} out: {state=WRITTEN_AFTER_READ} + r(true) -> USE: in: {state=WRITTEN_AFTER_READ} out: {state=WRITTEN_AFTER_READ} + w(state|, ) USE: in: {state=READ} out: {state=WRITTEN_AFTER_READ} jmp(L6) L5 [else branch]: read (Unit) L6 ['if' expression result]: merge(if (state) state = true|!) -> - magic[IMPLICIT_RECEIVER](state) -> USE: in: {state=READ} out: {state=READ} - r(state|) -> USE: in: {} out: {state=READ} + magic[IMPLICIT_RECEIVER](state) -> USE: in: {state=READ} out: {state=READ} + r(state|) -> USE: in: {} out: {state=READ} mark(println(state)) call(println(state), println|) -> L4: 2 error: - INIT: in: {} out: {} + sink: - INIT: in: {some=I?} out: {some=I?} USE: in: {} out: {} + USE: in: {} out: {} ===================== == exec == fun exec(f: () -> T): T = f() @@ -337,17 +337,17 @@ L0: 1 INIT: in: {} out: {} v(f: () -> T) INIT: in: {} out: {f=D} magic[FAKE_INITIALIZER](f: () -> T) -> INIT: in: {f=D} out: {f=D} - w(f|) INIT: in: {f=D} out: {f=ID} USE: in: {f=READ} out: {f=READ} - r(f) -> INIT: in: {f=ID} out: {f=ID} USE: in: {} out: {f=READ} + w(f|) INIT: in: {f=D} out: {f=ID} + r(f) -> INIT: in: {f=ID} out: {f=ID} mark(f()) call(f(), invoke|) -> ret(*|) L1 L1: error: - INIT: in: {} out: {} + sink: - INIT: in: {f=I?} out: {f=I?} USE: in: {} out: {} + USE: in: {f=READ} out: {f=READ} ===================== == Demo4 == class Demo4 { @@ -366,7 +366,7 @@ L0: v(private val some = exec { if (state) state = true println(state) // must be initialized }) INIT: in: {} out: {some=D} mark({ if (state) state = true println(state) // must be initialized }) INIT: in: {some=D} out: {some=D} jmp?(L2) - d({ if (state) state = true println(state) // must be initialized }) INIT: in: {some=I?, state=I} out: {some=I?, state=I} USE: in: {state=READ} out: {state=READ} + d({ if (state) state = true println(state) // must be initialized }) INIT: in: {some=D, state=I} out: {some=D, state=I} USE: in: {state=READ} out: {state=READ} L2 [after local declaration]: r({ if (state) state = true println(state) // must be initialized }) -> INIT: in: {some=D} out: {some=D} mark(exec { if (state) state = true println(state) // must be initialized }) @@ -378,9 +378,9 @@ L2 [after local declaration]: L1: INIT: in: {some=ID, state=ID} out: {some=ID, state=ID} error: - INIT: in: {} out: {} + INIT: in: {some=ID} out: {some=ID} sink: - INIT: in: {some=I?, state=I?} out: {some=I?, state=I?} USE: in: {} out: {} + INIT: in: {some=ID, state=I?} out: {some=ID, state=I?} USE: in: {} out: {} ===================== == anonymous_1 == { @@ -396,25 +396,25 @@ L3: mark(if (state) state = true) magic[IMPLICIT_RECEIVER](state) -> r(state|) -> - jf(L5|) USE: in: {state=READ} out: {state=READ} + jf(L5|) USE: in: {state=READ} out: {state=READ} magic[IMPLICIT_RECEIVER](state) -> - r(true) -> USE: in: {state=WRITTEN_AFTER_READ} out: {state=WRITTEN_AFTER_READ} - w(state|, ) INIT: in: {some=D} out: {some=D, state=I} USE: in: {state=READ} out: {state=WRITTEN_AFTER_READ} + r(true) -> USE: in: {state=WRITTEN_AFTER_READ} out: {state=WRITTEN_AFTER_READ} + w(state|, ) INIT: in: {some=D} out: {some=D, state=I} USE: in: {state=READ} out: {state=WRITTEN_AFTER_READ} jmp(L6) INIT: in: {some=D, state=I} out: {some=D, state=I} L5 [else branch]: read (Unit) INIT: in: {some=D} out: {some=D} L6 ['if' expression result]: merge(if (state) state = true|!) -> INIT: in: {some=D, state=I} out: {some=D, state=I} - magic[IMPLICIT_RECEIVER](state) -> USE: in: {state=READ} out: {state=READ} - r(state|) -> USE: in: {} out: {state=READ} + magic[IMPLICIT_RECEIVER](state) -> USE: in: {state=READ} out: {state=READ} + r(state|) -> USE: in: {} out: {state=READ} mark(println(state)) call(println(state), println|) -> L4: 2 error: - INIT: in: {} out: {} + INIT: in: {some=D} out: {some=D} sink: - INIT: in: {some=I?, state=I} out: {some=I?, state=I} USE: in: {} out: {} + INIT: in: {some=D, state=I} out: {some=D, state=I} USE: in: {} out: {} ===================== == Demo5 == class Demo5 { @@ -438,16 +438,16 @@ L0: v(private val some = object { fun foo() { if (state) state = true println(state) // OK } }) INIT: in: {state=ID} out: {some=D, state=ID} mark(object { fun foo() { if (state) state = true println(state) // OK } }) INIT: in: {some=D, state=ID} out: {some=D, state=ID} jmp?(L2) - d(fun foo() { if (state) state = true println(state) // OK }) INIT: in: {some=I?, state=I} out: {some=I?, state=I} USE: in: {state=READ} out: {state=READ} + d(fun foo() { if (state) state = true println(state) // OK }) INIT: in: {some=D, state=I} out: {some=D, state=I} USE: in: {state=READ} out: {state=READ} L2 [after local declaration]: r(object { fun foo() { if (state) state = true println(state) // OK } }) -> INIT: in: {some=D, state=ID} out: {some=D, state=ID} w(some|) INIT: in: {some=D, state=ID} out: {some=ID, state=ID} L1: INIT: in: {some=ID, state=ID} out: {some=ID, state=ID} error: - INIT: in: {} out: {} + INIT: in: {some=ID} out: {some=ID} sink: - INIT: in: {some=I?, state=I?} out: {some=I?, state=I?} USE: in: {} out: {} + INIT: in: {some=ID, state=I?} out: {some=ID, state=I?} USE: in: {} out: {} ===================== == foo == fun foo() { @@ -479,7 +479,7 @@ L6 ['if' expression result]: L4: 2 error: - INIT: in: {} out: {} + INIT: in: {some=D} out: {some=D} sink: - INIT: in: {some=I?, state=I} out: {some=I?, state=I} USE: in: {} out: {} + INIT: in: {some=D, state=I} out: {some=D, state=I} USE: in: {} out: {} ===================== diff --git a/compiler/testData/cfg-variables/bugs/referenceToPropertyInitializer.instructions b/compiler/testData/cfg-variables/bugs/referenceToPropertyInitializer.instructions index 89c0240de35..290a82da3e3 100644 --- a/compiler/testData/cfg-variables/bugs/referenceToPropertyInitializer.instructions +++ b/compiler/testData/cfg-variables/bugs/referenceToPropertyInitializer.instructions @@ -10,16 +10,16 @@ L0: v(val sum: (Int)->Int = { x: Int -> sum(x - 1) + x }) INIT: in: {} out: {sum=D} mark({ x: Int -> sum(x - 1) + x }) INIT: in: {sum=D} out: {sum=D} jmp?(L2) - d({ x: Int -> sum(x - 1) + x }) INIT: in: {sum=I?} out: {sum=I?} USE: in: {sum=READ} out: {sum=READ} + d({ x: Int -> sum(x - 1) + x }) INIT: in: {sum=D, x=ID} out: {sum=D, x=ID} L2 [after local declaration]: - r({ x: Int -> sum(x - 1) + x }) -> INIT: in: {sum=D} out: {sum=D} - w(sum|) INIT: in: {sum=D} out: {sum=ID} + r({ x: Int -> sum(x - 1) + x }) -> + w(sum|) INIT: in: {sum=D, x=ID} out: {sum=ID, x=ID} L1: - INIT: in: {sum=ID} out: {sum=ID} + INIT: in: {sum=ID, x=ID} out: {sum=ID, x=ID} error: - INIT: in: {} out: {} + sink: - INIT: in: {sum=I?} out: {sum=I?} USE: in: {} out: {} + USE: in: {sum=READ, x=READ} out: {sum=READ, x=READ} ===================== == anonymous_0 == { x: Int -> @@ -32,24 +32,24 @@ L3: magic[FAKE_INITIALIZER](x: Int) -> INIT: in: {sum=D, x=D} out: {sum=D, x=D} w(x|) INIT: in: {sum=D, x=D} out: {sum=D, x=ID} 3 mark(sum(x - 1) + x) INIT: in: {sum=D, x=ID} out: {sum=D, x=ID} - magic[IMPLICIT_RECEIVER](sum) -> USE: in: {sum=READ, x=READ} out: {sum=READ, x=READ} - r(sum|) -> USE: in: {x=READ} out: {sum=READ, x=READ} + magic[IMPLICIT_RECEIVER](sum) -> + r(sum|) -> r(x) -> r(1) -> mark(x - 1) call(x - 1, minus|, ) -> mark(sum(x - 1)) - call(sum(x - 1), invoke|, ) -> USE: in: {x=READ} out: {x=READ} - r(x) -> USE: in: {} out: {x=READ} + call(sum(x - 1), invoke|, ) -> + r(x) -> mark(sum(x - 1) + x) call(sum(x - 1) + x, plus|, ) -> 2 ret(*|) L4 L4: error: - INIT: in: {} out: {} + sink: - INIT: in: {sum=I?, x=I?} out: {sum=I?, x=I?} USE: in: {} out: {} + USE: in: {sum=READ, x=READ} out: {sum=READ, x=READ} ===================== == A == open class A(val a: A) @@ -62,9 +62,9 @@ L0: L1: INIT: in: {a=ID} out: {a=ID} error: - INIT: in: {} out: {} + sink: - INIT: in: {a=I?} out: {a=I?} USE: in: {} out: {} + USE: in: {} out: {} ===================== == TestObjectLiteral == class TestObjectLiteral { @@ -91,17 +91,17 @@ L0: magic[IMPLICIT_RECEIVER](obj) -> INIT: in: {obj=D, x=D} out: {obj=D, x=D} r(obj|) -> w(x|) INIT: in: {obj=D, x=D} out: {obj=D, x=ID} - 1 jmp?(L2) INIT: in: {obj=D} out: {obj=D} - d(fun foo() { val y = obj }) INIT: in: {obj=I?} out: {obj=I?} USE: in: {obj=READ} out: {obj=READ} + 1 jmp?(L2) INIT: in: {obj=D, x=ID} out: {obj=D, x=ID} + d(fun foo() { val y = obj }) INIT: in: {obj=D, x=ID, y=ID} out: {obj=D, x=ID, y=ID} L2 [after local declaration]: - r(object: A(obj) { init { val x = obj } fun foo() { val y = obj } }) -> INIT: in: {obj=D} out: {obj=D} - w(obj|) INIT: in: {obj=D} out: {obj=ID} + r(object: A(obj) { init { val x = obj } fun foo() { val y = obj } }) -> + w(obj|) INIT: in: {obj=D, x=ID, y=ID} out: {obj=ID, x=ID, y=ID} L1: - INIT: in: {obj=ID} out: {obj=ID} + INIT: in: {obj=ID, x=ID, y=ID} out: {obj=ID, x=ID, y=ID} error: - INIT: in: {} out: {} + sink: - INIT: in: {obj=I?} out: {obj=I?} USE: in: {} out: {} + USE: in: {obj=READ} out: {obj=READ} ===================== == foo == fun foo() { @@ -109,18 +109,18 @@ fun foo() { } --------------------- L3: - 2 INIT: in: {obj=D} out: {obj=D} + 2 INIT: in: {obj=D, x=ID} out: {obj=D, x=ID} 3 mark({ val y = obj }) - v(val y = obj) INIT: in: {obj=D} out: {obj=D, y=D} - magic[IMPLICIT_RECEIVER](obj) -> INIT: in: {obj=D, y=D} out: {obj=D, y=D} USE: in: {obj=READ} out: {obj=READ} - r(obj|) -> USE: in: {} out: {obj=READ} - w(y|) INIT: in: {obj=D, y=D} out: {obj=D, y=ID} + v(val y = obj) INIT: in: {obj=D, x=ID} out: {obj=D, x=ID, y=D} + magic[IMPLICIT_RECEIVER](obj) -> INIT: in: {obj=D, x=ID, y=D} out: {obj=D, x=ID, y=D} + r(obj|) -> + w(y|) INIT: in: {obj=D, x=ID, y=D} out: {obj=D, x=ID, y=ID} L4: - 2 INIT: in: {obj=D} out: {obj=D} + 2 INIT: in: {obj=D, x=ID, y=ID} out: {obj=D, x=ID, y=ID} error: - INIT: in: {} out: {} + sink: - INIT: in: {obj=I?} out: {obj=I?} USE: in: {} out: {} + USE: in: {obj=READ} out: {obj=READ} ===================== == TestOther == class TestOther { @@ -130,8 +130,8 @@ class TestOther { L0: 1 INIT: in: {} out: {} v(val x: Int = x + 1) INIT: in: {} out: {x=D} - magic[IMPLICIT_RECEIVER](x) -> INIT: in: {x=D} out: {x=D} USE: in: {x=READ} out: {x=READ} - r(x|) -> USE: in: {} out: {x=READ} + magic[IMPLICIT_RECEIVER](x) -> INIT: in: {x=D} out: {x=D} + r(x|) -> r(1) -> mark(x + 1) call(x + 1, plus|, ) -> @@ -139,7 +139,7 @@ L0: L1: INIT: in: {x=ID} out: {x=ID} error: - INIT: in: {} out: {} + sink: - INIT: in: {x=I?} out: {x=I?} USE: in: {} out: {} + USE: in: {x=READ} out: {x=READ} ===================== diff --git a/compiler/testData/cfg-variables/bugs/varInitializationInIfInCycle.instructions b/compiler/testData/cfg-variables/bugs/varInitializationInIfInCycle.instructions index f24b711eae8..d5bd6fcf516 100644 --- a/compiler/testData/cfg-variables/bugs/varInitializationInIfInCycle.instructions +++ b/compiler/testData/cfg-variables/bugs/varInitializationInIfInCycle.instructions @@ -18,21 +18,21 @@ L0: v(numbers: Collection) INIT: in: {} out: {numbers=D} magic[FAKE_INITIALIZER](numbers: Collection) -> INIT: in: {numbers=D} out: {numbers=D} w(numbers|) INIT: in: {numbers=D} out: {numbers=ID} - 2 mark({ for (i in numbers) { val b: Boolean if (1 < 2) { b = false } else { b = true } use(b) continue } }) INIT: in: {numbers=ID} out: {numbers=ID} USE: in: {numbers=READ} out: {numbers=READ} - 3 r(numbers) -> USE: in: {} out: {numbers=READ} + 2 mark({ for (i in numbers) { val b: Boolean if (1 < 2) { b = false } else { b = true } use(b) continue } }) INIT: in: {numbers=ID} out: {numbers=ID} + 3 r(numbers) -> mark(numbers) call(numbers, iterator|) -> v(i) INIT: in: {numbers=ID} out: {i=D, numbers=ID} L2 [loop entry point]: L6 [condition entry point]: - mark(numbers) INIT: in: {i=I?D, numbers=ID} out: {i=I?D, numbers=ID} + mark(numbers) INIT: in: {i=D, numbers=ID} out: {i=D, numbers=ID} call(numbers, hasNext) -> jmp?(L3) mark(numbers) call(numbers, next) -> magic[LOOP_RANGE_ITERATION](numbers|) -> - w(i|) INIT: in: {i=I?D, numbers=ID} out: {i=ID, numbers=ID} - mark(for (i in numbers) { val b: Boolean if (1 < 2) { b = false } else { b = true } use(b) continue }) INIT: in: {i=ID, numbers=ID} out: {i=ID, numbers=ID} USE: in: {} out: {} + w(i|) INIT: in: {i=D, numbers=ID} out: {i=ID, numbers=ID} + mark(for (i in numbers) { val b: Boolean if (1 < 2) { b = false } else { b = true } use(b) continue }) INIT: in: {i=ID, numbers=ID} out: {i=ID, numbers=ID} USE: in: {numbers=READ} out: {numbers=READ} L4 [body entry point]: 4 mark({ val b: Boolean if (1 < 2) { b = false } else { b = true } use(b) continue }) v(val b: Boolean) INIT: in: {i=ID, numbers=ID} out: {b=D, i=ID, numbers=ID} @@ -43,29 +43,29 @@ L4 [body entry point]: call(1 < 2, compareTo|, ) -> jf(L7|) 5 mark({ b = false }) - r(false) -> USE: in: {b=WRITTEN_AFTER_READ} out: {b=WRITTEN_AFTER_READ} - w(b|) INIT: in: {b=D, i=ID, numbers=ID} out: {b=ID, i=ID, numbers=ID} USE: in: {b=READ} out: {b=WRITTEN_AFTER_READ} - 4 jmp(L8) INIT: in: {b=ID, i=ID, numbers=ID} out: {b=ID, i=ID, numbers=ID} USE: in: {b=READ} out: {b=READ} + r(false) -> USE: in: {b=WRITTEN_AFTER_READ, numbers=READ} out: {b=WRITTEN_AFTER_READ, numbers=READ} + w(b|) INIT: in: {b=D, i=ID, numbers=ID} out: {b=ID, i=ID, numbers=ID} USE: in: {b=READ, numbers=READ} out: {b=WRITTEN_AFTER_READ, numbers=READ} + 4 jmp(L8) INIT: in: {b=ID, i=ID, numbers=ID} out: {b=ID, i=ID, numbers=ID} USE: in: {b=READ, numbers=READ} out: {b=READ, numbers=READ} L7 [else branch]: 5 mark({ b = true }) INIT: in: {b=D, i=ID, numbers=ID} out: {b=D, i=ID, numbers=ID} - r(true) -> USE: in: {b=WRITTEN_AFTER_READ} out: {b=WRITTEN_AFTER_READ} - w(b|) INIT: in: {b=D, i=ID, numbers=ID} out: {b=ID, i=ID, numbers=ID} USE: in: {b=READ} out: {b=WRITTEN_AFTER_READ} + r(true) -> USE: in: {b=WRITTEN_AFTER_READ, numbers=READ} out: {b=WRITTEN_AFTER_READ, numbers=READ} + w(b|) INIT: in: {b=D, i=ID, numbers=ID} out: {b=ID, i=ID, numbers=ID} USE: in: {b=READ, numbers=READ} out: {b=WRITTEN_AFTER_READ, numbers=READ} L8 ['if' expression result]: - 4 merge(if (1 < 2) { b = false } else { b = true }|!, !) -> INIT: in: {b=ID, i=ID, numbers=ID} out: {b=ID, i=ID, numbers=ID} USE: in: {b=READ} out: {b=READ} - r(b) -> USE: in: {} out: {b=READ} + 4 merge(if (1 < 2) { b = false } else { b = true }|!, !) -> INIT: in: {b=ID, i=ID, numbers=ID} out: {b=ID, i=ID, numbers=ID} USE: in: {b=READ, numbers=READ} out: {b=READ, numbers=READ} + r(b) -> USE: in: {numbers=READ} out: {b=READ, numbers=READ} mark(use(b)) call(use(b), use|) -> - jmp(L6) USE: in: {} out: {} + jmp(L6) USE: in: {numbers=READ} out: {numbers=READ} - 3 jmp(L2) L3 [loop exit point]: L5 [body exit point]: - read (Unit) INIT: in: {i=I?D, numbers=ID} out: {i=I?D, numbers=ID} + read (Unit) INIT: in: {i=ID, numbers=ID} out: {i=ID, numbers=ID} L1: - 1 INIT: in: {numbers=ID} out: {numbers=ID} + 1 error: - INIT: in: {} out: {} + sink: - INIT: in: {numbers=I?} out: {numbers=I?} USE: in: {} out: {} + USE: in: {numbers=READ} out: {numbers=READ} ===================== == use == fun use(vararg a: Any?) = a @@ -74,13 +74,13 @@ L0: 1 INIT: in: {} out: {} v(vararg a: Any?) INIT: in: {} out: {a=D} magic[FAKE_INITIALIZER](vararg a: Any?) -> INIT: in: {a=D} out: {a=D} - w(a|) INIT: in: {a=D} out: {a=ID} USE: in: {a=READ} out: {a=READ} - r(a) -> INIT: in: {a=ID} out: {a=ID} USE: in: {} out: {a=READ} + w(a|) INIT: in: {a=D} out: {a=ID} + r(a) -> INIT: in: {a=ID} out: {a=ID} ret(*|) L1 L1: error: - INIT: in: {} out: {} + sink: - INIT: in: {a=I?} out: {a=I?} USE: in: {} out: {} + USE: in: {a=READ} out: {a=READ} ===================== diff --git a/compiler/testData/cfg-variables/lexicalScopes/forScope.instructions b/compiler/testData/cfg-variables/lexicalScopes/forScope.instructions index 30130fc9fd6..b35b6d17eec 100644 --- a/compiler/testData/cfg-variables/lexicalScopes/forScope.instructions +++ b/compiler/testData/cfg-variables/lexicalScopes/forScope.instructions @@ -11,7 +11,7 @@ L0: 1 INIT: in: {} out: {} 2 mark({ "before" for (i in 1..10) { val a = i } "after" }) mark("before") - r("before") -> USE: in: {} out: {} + r("before") -> 3 r(1) -> r(10) -> mark(1..10) @@ -21,29 +21,29 @@ L0: v(i) INIT: in: {} out: {i=D} L2 [loop entry point]: L6 [condition entry point]: - mark(1..10) INIT: in: {i=I?D} out: {i=I?D} + mark(1..10) INIT: in: {i=D} out: {i=D} call(1..10, hasNext) -> jmp?(L3) mark(1..10) call(1..10, next) -> magic[LOOP_RANGE_ITERATION](1..10|) -> - w(i|) INIT: in: {i=I?D} out: {i=ID} + w(i|) INIT: in: {i=D} out: {i=ID} mark(for (i in 1..10) { val a = i }) INIT: in: {i=ID} out: {i=ID} L4 [body entry point]: 4 mark({ val a = i }) v(val a = i) INIT: in: {i=ID} out: {a=D, i=ID} r(i) -> INIT: in: {a=D, i=ID} out: {a=D, i=ID} w(a|) INIT: in: {a=D, i=ID} out: {a=ID, i=ID} - 3 jmp(L2) INIT: in: {i=ID} out: {i=ID} USE: in: {i=READ} out: {i=READ} + 3 jmp(L2) INIT: in: {a=ID, i=ID} out: {a=ID, i=ID} L3 [loop exit point]: L5 [body exit point]: - read (Unit) INIT: in: {i=I?D} out: {i=I?D} - 2 mark("after") INIT: in: {} out: {} + read (Unit) + 2 mark("after") r("after") -> L1: 1 error: sink: - USE: in: {} out: {} + USE: in: {i=READ} out: {i=READ} ===================== diff --git a/compiler/testData/cfg-variables/lexicalScopes/functionLiteralScope.instructions b/compiler/testData/cfg-variables/lexicalScopes/functionLiteralScope.instructions index 683974c44bf..a2f2b273c00 100644 --- a/compiler/testData/cfg-variables/lexicalScopes/functionLiteralScope.instructions +++ b/compiler/testData/cfg-variables/lexicalScopes/functionLiteralScope.instructions @@ -9,7 +9,7 @@ fun foo() { } --------------------- L0: - 1 INIT: in: {} out: {} USE: in: {} out: {} + 1 INIT: in: {} out: {} 2 mark({ "before" val b = 1 val f = { x: Int -> val a = x + b } "after" }) mark("before") r("before") -> @@ -19,18 +19,18 @@ L0: v(val f = { x: Int -> val a = x + b }) INIT: in: {b=ID} out: {b=ID, f=D} mark({ x: Int -> val a = x + b }) INIT: in: {b=ID, f=D} out: {b=ID, f=D} jmp?(L2) - d({ x: Int -> val a = x + b }) INIT: in: {b=I, f=I?} out: {b=I, f=I?} USE: in: {b=READ} out: {b=READ} + d({ x: Int -> val a = x + b }) INIT: in: {a=ID, b=ID, f=D, x=ID} out: {a=ID, b=ID, f=D, x=ID} L2 [after local declaration]: - r({ x: Int -> val a = x + b }) -> INIT: in: {b=ID, f=D} out: {b=ID, f=D} - w(f|) INIT: in: {b=ID, f=D} out: {b=ID, f=ID} - mark("after") INIT: in: {b=ID, f=ID} out: {b=ID, f=ID} + r({ x: Int -> val a = x + b }) -> + w(f|) INIT: in: {a=ID, b=ID, f=D, x=ID} out: {a=ID, b=ID, f=ID, x=ID} + mark("after") INIT: in: {a=ID, b=ID, f=ID, x=ID} out: {a=ID, b=ID, f=ID, x=ID} r("after") -> L1: - 1 INIT: in: {} out: {} + 1 error: sink: - USE: in: {} out: {} + USE: in: {b=READ, x=READ} out: {b=READ, x=READ} ===================== == anonymous_0 == { x: Int -> @@ -43,16 +43,16 @@ L3: magic[FAKE_INITIALIZER](x: Int) -> INIT: in: {b=ID, f=D, x=D} out: {b=ID, f=D, x=D} w(x|) INIT: in: {b=ID, f=D, x=D} out: {b=ID, f=D, x=ID} 4 mark(val a = x + b) INIT: in: {b=ID, f=D, x=ID} out: {b=ID, f=D, x=ID} - v(val a = x + b) INIT: in: {b=ID, f=D, x=ID} out: {a=D, b=ID, f=D, x=ID} USE: in: {b=READ, x=READ} out: {b=READ, x=READ} - r(x) -> INIT: in: {a=D, b=ID, f=D, x=ID} out: {a=D, b=ID, f=D, x=ID} USE: in: {b=READ} out: {b=READ, x=READ} - r(b) -> USE: in: {} out: {b=READ} + v(val a = x + b) INIT: in: {b=ID, f=D, x=ID} out: {a=D, b=ID, f=D, x=ID} + r(x) -> INIT: in: {a=D, b=ID, f=D, x=ID} out: {a=D, b=ID, f=D, x=ID} + r(b) -> mark(x + b) call(x + b, plus|, ) -> w(a|) INIT: in: {a=D, b=ID, f=D, x=ID} out: {a=ID, b=ID, f=D, x=ID} L4: - 3 INIT: in: {b=ID, f=D, x=ID} out: {b=ID, f=D, x=ID} + 3 INIT: in: {a=ID, b=ID, f=D, x=ID} out: {a=ID, b=ID, f=D, x=ID} error: - INIT: in: {} out: {} + sink: - INIT: in: {b=I, f=I?, x=I?} out: {b=I, f=I?, x=I?} USE: in: {} out: {} + USE: in: {b=READ, x=READ} out: {b=READ, x=READ} ===================== diff --git a/compiler/testData/cfg-variables/lexicalScopes/ifScope.instructions b/compiler/testData/cfg-variables/lexicalScopes/ifScope.instructions index 2485377a635..dc8eab83f12 100644 --- a/compiler/testData/cfg-variables/lexicalScopes/ifScope.instructions +++ b/compiler/testData/cfg-variables/lexicalScopes/ifScope.instructions @@ -22,14 +22,14 @@ L0: v(val a = 1) INIT: in: {} out: {a=D} r(1) -> INIT: in: {a=D} out: {a=D} w(a|) INIT: in: {a=D} out: {a=ID} - 2 jmp(L3) INIT: in: {} out: {} + 2 jmp(L3) INIT: in: {a=ID} out: {a=ID} L2 [else branch]: 3 mark({ val b = 2 }) - v(val b = 2) INIT: in: {} out: {b=D} - r(2) -> INIT: in: {b=D} out: {b=D} - w(b|) INIT: in: {b=D} out: {b=ID} + v(val b = 2) INIT: in: {a=ID} out: {a=ID, b=D} + r(2) -> INIT: in: {a=ID, b=D} out: {a=ID, b=D} + w(b|) INIT: in: {a=ID, b=D} out: {a=ID, b=ID} L3 ['if' expression result]: - 2 merge(if (true) { val a = 1 } else { val b = 2 }|!, !) -> INIT: in: {} out: {} + 2 merge(if (true) { val a = 1 } else { val b = 2 }|!, !) -> INIT: in: {a=ID, b=ID} out: {a=ID, b=ID} mark("after") r("after") -> L1: @@ -37,5 +37,5 @@ L1: error: sink: - USE: in: {} out: {} -===================== \ No newline at end of file + USE: in: {} out: {} +===================== diff --git a/compiler/testData/cfg-variables/lexicalScopes/localClass.instructions b/compiler/testData/cfg-variables/lexicalScopes/localClass.instructions index 4e84af904ae..19bc56d1c05 100644 --- a/compiler/testData/cfg-variables/lexicalScopes/localClass.instructions +++ b/compiler/testData/cfg-variables/lexicalScopes/localClass.instructions @@ -26,18 +26,18 @@ L0: magic[IMPLICIT_RECEIVER](x) -> INIT: in: {a=D, x=ID} out: {a=D, x=ID} r(x|) -> w(a|) INIT: in: {a=D, x=ID} out: {a=ID, x=ID} - 2 jmp?(L3) INIT: in: {x=ID} out: {x=ID} - d(fun foo() { val b = x }) INIT: in: {x=I} out: {x=I} USE: in: {x=READ} out: {x=READ} + 2 jmp?(L3) INIT: in: {a=ID, x=ID} out: {a=ID, x=ID} + d(fun foo() { val b = x }) INIT: in: {a=ID, b=ID, x=ID} out: {a=ID, b=ID, x=ID} L2 [after local class]: L3 [after local declaration]: - mark("after") INIT: in: {x=I?} out: {x=I?} + mark("after") r("after") -> L1: - 1 INIT: in: {} out: {} + 1 error: sink: - USE: in: {} out: {} + USE: in: {} out: {} ===================== == foo == fun foo() { @@ -45,16 +45,16 @@ fun foo() { } --------------------- L4: - 3 INIT: in: {x=ID} out: {x=ID} + 3 INIT: in: {a=ID, x=ID} out: {a=ID, x=ID} 4 mark({ val b = x }) - v(val b = x) INIT: in: {x=ID} out: {b=D, x=ID} - magic[IMPLICIT_RECEIVER](x) -> INIT: in: {b=D, x=ID} out: {b=D, x=ID} USE: in: {x=READ} out: {x=READ} - r(x|) -> USE: in: {} out: {x=READ} - w(b|) INIT: in: {b=D, x=ID} out: {b=ID, x=ID} + v(val b = x) INIT: in: {a=ID, x=ID} out: {a=ID, b=D, x=ID} + magic[IMPLICIT_RECEIVER](x) -> INIT: in: {a=ID, b=D, x=ID} out: {a=ID, b=D, x=ID} + r(x|) -> + w(b|) INIT: in: {a=ID, b=D, x=ID} out: {a=ID, b=ID, x=ID} L5: - 3 INIT: in: {x=ID} out: {x=ID} + 3 INIT: in: {a=ID, b=ID, x=ID} out: {a=ID, b=ID, x=ID} error: - INIT: in: {} out: {} + sink: - INIT: in: {x=I} out: {x=I} USE: in: {} out: {} + USE: in: {} out: {} ===================== diff --git a/compiler/testData/cfg-variables/lexicalScopes/localFunctionScope.instructions b/compiler/testData/cfg-variables/lexicalScopes/localFunctionScope.instructions index 7698ee755fd..8985d98c48e 100644 --- a/compiler/testData/cfg-variables/lexicalScopes/localFunctionScope.instructions +++ b/compiler/testData/cfg-variables/lexicalScopes/localFunctionScope.instructions @@ -9,7 +9,7 @@ fun foo() { } --------------------- L0: - 1 INIT: in: {} out: {} USE: in: {} out: {} + 1 INIT: in: {} out: {} 2 mark({ "before" val b = 1 fun local(x: Int) { val a = x + b } "after" }) mark("before") r("before") -> @@ -17,16 +17,16 @@ L0: r(1) -> INIT: in: {b=D} out: {b=D} w(b|) INIT: in: {b=D} out: {b=ID} jmp?(L2) INIT: in: {b=ID} out: {b=ID} - d(fun local(x: Int) { val a = x + b }) INIT: in: {b=I} out: {b=I} USE: in: {b=READ} out: {b=READ} + d(fun local(x: Int) { val a = x + b }) INIT: in: {a=ID, b=ID, x=ID} out: {a=ID, b=ID, x=ID} L2 [after local declaration]: - mark("after") INIT: in: {b=ID} out: {b=ID} + mark("after") r("after") -> L1: - 1 INIT: in: {} out: {} + 1 error: sink: - USE: in: {} out: {} + USE: in: {b=READ, x=READ} out: {b=READ, x=READ} ===================== == local == fun local(x: Int) { @@ -39,16 +39,16 @@ L3: magic[FAKE_INITIALIZER](x: Int) -> INIT: in: {b=ID, x=D} out: {b=ID, x=D} w(x|) INIT: in: {b=ID, x=D} out: {b=ID, x=ID} 4 mark({ val a = x + b }) INIT: in: {b=ID, x=ID} out: {b=ID, x=ID} - v(val a = x + b) INIT: in: {b=ID, x=ID} out: {a=D, b=ID, x=ID} USE: in: {b=READ, x=READ} out: {b=READ, x=READ} - r(x) -> INIT: in: {a=D, b=ID, x=ID} out: {a=D, b=ID, x=ID} USE: in: {b=READ} out: {b=READ, x=READ} - r(b) -> USE: in: {} out: {b=READ} + v(val a = x + b) INIT: in: {b=ID, x=ID} out: {a=D, b=ID, x=ID} + r(x) -> INIT: in: {a=D, b=ID, x=ID} out: {a=D, b=ID, x=ID} + r(b) -> mark(x + b) call(x + b, plus|, ) -> w(a|) INIT: in: {a=D, b=ID, x=ID} out: {a=ID, b=ID, x=ID} L4: - 3 INIT: in: {b=ID, x=ID} out: {b=ID, x=ID} + 3 INIT: in: {a=ID, b=ID, x=ID} out: {a=ID, b=ID, x=ID} error: - INIT: in: {} out: {} + sink: - INIT: in: {b=I, x=I?} out: {b=I, x=I?} USE: in: {} out: {} -===================== \ No newline at end of file + USE: in: {b=READ, x=READ} out: {b=READ, x=READ} +===================== diff --git a/compiler/testData/cfg-variables/lexicalScopes/localFunctionScopeWithoutBody.instructions b/compiler/testData/cfg-variables/lexicalScopes/localFunctionScopeWithoutBody.instructions index 003bc3b3273..41024162bf8 100644 --- a/compiler/testData/cfg-variables/lexicalScopes/localFunctionScopeWithoutBody.instructions +++ b/compiler/testData/cfg-variables/lexicalScopes/localFunctionScopeWithoutBody.instructions @@ -7,7 +7,7 @@ fun foo() { } --------------------- L0: - 1 INIT: in: {} out: {} USE: in: {} out: {} + 1 INIT: in: {} out: {} 2 mark({ "before" val b = 1 fun local(x: Int) = x + b "after" }) mark("before") r("before") -> @@ -15,16 +15,16 @@ L0: r(1) -> INIT: in: {b=D} out: {b=D} w(b|) INIT: in: {b=D} out: {b=ID} jmp?(L2) INIT: in: {b=ID} out: {b=ID} - d(fun local(x: Int) = x + b) INIT: in: {b=I} out: {b=I} USE: in: {b=READ} out: {b=READ} + d(fun local(x: Int) = x + b) INIT: in: {b=ID, x=ID} out: {b=ID, x=ID} L2 [after local declaration]: - mark("after") INIT: in: {b=ID} out: {b=ID} + mark("after") r("after") -> L1: - 1 INIT: in: {} out: {} + 1 error: sink: - USE: in: {} out: {} + USE: in: {b=READ, x=READ} out: {b=READ, x=READ} ===================== == local == fun local(x: Int) = x + b @@ -33,16 +33,16 @@ L3: 3 INIT: in: {b=ID} out: {b=ID} v(x: Int) INIT: in: {b=ID} out: {b=ID, x=D} magic[FAKE_INITIALIZER](x: Int) -> INIT: in: {b=ID, x=D} out: {b=ID, x=D} - w(x|) INIT: in: {b=ID, x=D} out: {b=ID, x=ID} USE: in: {b=READ, x=READ} out: {b=READ, x=READ} - r(x) -> INIT: in: {b=ID, x=ID} out: {b=ID, x=ID} USE: in: {b=READ} out: {b=READ, x=READ} - r(b) -> USE: in: {} out: {b=READ} + w(x|) INIT: in: {b=ID, x=D} out: {b=ID, x=ID} + r(x) -> INIT: in: {b=ID, x=ID} out: {b=ID, x=ID} + r(b) -> mark(x + b) call(x + b, plus|, ) -> ret(*|) L4 L4: error: - INIT: in: {} out: {} + sink: - INIT: in: {b=I, x=I?} out: {b=I, x=I?} USE: in: {} out: {} -===================== \ No newline at end of file + USE: in: {b=READ, x=READ} out: {b=READ, x=READ} +===================== diff --git a/compiler/testData/cfg-variables/lexicalScopes/localObject.instructions b/compiler/testData/cfg-variables/lexicalScopes/localObject.instructions index a379fa0e05b..3be2504c57f 100644 --- a/compiler/testData/cfg-variables/lexicalScopes/localObject.instructions +++ b/compiler/testData/cfg-variables/lexicalScopes/localObject.instructions @@ -22,8 +22,8 @@ L0: v(val a = 1) INIT: in: {} out: {a=D} r(1) -> INIT: in: {a=D} out: {a=D} w(a|) INIT: in: {a=D} out: {a=ID} - 2 jmp?(L3) INIT: in: {} out: {} - d(fun foo() { val b = 2 }) + 2 jmp?(L3) INIT: in: {a=ID} out: {a=ID} + d(fun foo() { val b = 2 }) INIT: in: {a=ID, b=ID} out: {a=ID, b=ID} L2 [after local class]: L3 [after local declaration]: mark("after") @@ -33,7 +33,7 @@ L1: error: sink: - USE: in: {} out: {} + USE: in: {} out: {} ===================== == foo == fun foo() { @@ -41,15 +41,15 @@ fun foo() { } --------------------- L4: - 3 INIT: in: {} out: {} + 3 INIT: in: {a=ID} out: {a=ID} 4 mark({ val b = 2 }) - v(val b = 2) INIT: in: {} out: {b=D} - r(2) -> INIT: in: {b=D} out: {b=D} - w(b|) INIT: in: {b=D} out: {b=ID} + v(val b = 2) INIT: in: {a=ID} out: {a=ID, b=D} + r(2) -> INIT: in: {a=ID, b=D} out: {a=ID, b=D} + w(b|) INIT: in: {a=ID, b=D} out: {a=ID, b=ID} L5: - 3 INIT: in: {} out: {} + 3 INIT: in: {a=ID, b=ID} out: {a=ID, b=ID} error: sink: - USE: in: {} out: {} + USE: in: {} out: {} ===================== diff --git a/compiler/testData/cfg-variables/lexicalScopes/objectLiteralScope.instructions b/compiler/testData/cfg-variables/lexicalScopes/objectLiteralScope.instructions index 9bd858d4db0..0b801e86894 100644 --- a/compiler/testData/cfg-variables/lexicalScopes/objectLiteralScope.instructions +++ b/compiler/testData/cfg-variables/lexicalScopes/objectLiteralScope.instructions @@ -23,19 +23,19 @@ L0: v(val x = 1) INIT: in: {bar=D} out: {bar=D, x=D} r(1) -> INIT: in: {bar=D, x=D} out: {bar=D, x=D} w(x|) INIT: in: {bar=D, x=D} out: {bar=D, x=ID} - 2 jmp?(L2) INIT: in: {bar=D} out: {bar=D} - d(fun foo() { val a = 2 }) INIT: in: {bar=I?} out: {bar=I?} + 2 jmp?(L2) INIT: in: {bar=D, x=ID} out: {bar=D, x=ID} + d(fun foo() { val a = 2 }) INIT: in: {a=ID, bar=D, x=ID} out: {a=ID, bar=D, x=ID} L2 [after local declaration]: - r(object { init { val x = 1 } fun foo() { val a = 2 } }) -> INIT: in: {bar=D} out: {bar=D} - w(bar|) INIT: in: {bar=D} out: {bar=ID} - mark("after") INIT: in: {bar=ID} out: {bar=ID} + r(object { init { val x = 1 } fun foo() { val a = 2 } }) -> + w(bar|) INIT: in: {a=ID, bar=D, x=ID} out: {a=ID, bar=ID, x=ID} + mark("after") INIT: in: {a=ID, bar=ID, x=ID} out: {a=ID, bar=ID, x=ID} r("after") -> L1: - 1 INIT: in: {} out: {} + 1 error: sink: - USE: in: {} out: {} + USE: in: {} out: {} ===================== == foo == fun foo() { @@ -43,15 +43,15 @@ fun foo() { } --------------------- L3: - 3 INIT: in: {bar=D} out: {bar=D} + 3 INIT: in: {bar=D, x=ID} out: {bar=D, x=ID} 4 mark({ val a = 2 }) - v(val a = 2) INIT: in: {bar=D} out: {a=D, bar=D} - r(2) -> INIT: in: {a=D, bar=D} out: {a=D, bar=D} - w(a|) INIT: in: {a=D, bar=D} out: {a=ID, bar=D} + v(val a = 2) INIT: in: {bar=D, x=ID} out: {a=D, bar=D, x=ID} + r(2) -> INIT: in: {a=D, bar=D, x=ID} out: {a=D, bar=D, x=ID} + w(a|) INIT: in: {a=D, bar=D, x=ID} out: {a=ID, bar=D, x=ID} L4: - 3 INIT: in: {bar=D} out: {bar=D} + 3 INIT: in: {a=ID, bar=D, x=ID} out: {a=ID, bar=D, x=ID} error: - INIT: in: {} out: {} + sink: - INIT: in: {bar=I?} out: {bar=I?} USE: in: {} out: {} -===================== \ No newline at end of file + USE: in: {} out: {} +===================== diff --git a/compiler/testData/cfg-variables/lexicalScopes/propertyAccessorScope.instructions b/compiler/testData/cfg-variables/lexicalScopes/propertyAccessorScope.instructions index 00fb06c2061..abe4cd0ad49 100644 --- a/compiler/testData/cfg-variables/lexicalScopes/propertyAccessorScope.instructions +++ b/compiler/testData/cfg-variables/lexicalScopes/propertyAccessorScope.instructions @@ -16,19 +16,19 @@ L0: 2 mark({ class A { var a : Int get() { return field } set(v: Int) { field = v } } }) jmp?(L2) v(var a : Int get() { return field } set(v: Int) { field = v }) INIT: in: {} out: {a=D} - jmp?(L3) INIT: in: {a=D} out: {a=D} USE: in: {field=ONLY_WRITTEN_NEVER_READ, field=READ} out: {field=ONLY_WRITTEN_NEVER_READ, field=READ} - d(get() { return field }) INIT: in: {a=I?} out: {a=I?} USE: in: {field=READ} out: {field=READ} + jmp?(L3) INIT: in: {a=D} out: {a=D} + d(get() { return field }) INIT: in: {a=I?} out: {a=I?} L3 [after local declaration]: jmp?(L6) INIT: in: {a=D} out: {a=D} - d(set(v: Int) { field = v }) INIT: in: {a=I?, field=I} out: {a=I?, field=I} USE: in: {field=ONLY_WRITTEN_NEVER_READ} out: {field=ONLY_WRITTEN_NEVER_READ} + d(set(v: Int) { field = v }) INIT: in: {a=I?, v=ID} out: {a=I?, v=ID} L1: L2 [after local class]: L6 [after local declaration]: - 1 INIT: in: {} out: {} + 1 INIT: in: {v=ID} out: {v=ID} error: sink: - INIT: in: {field=I} out: {field=I} USE: in: {} out: {} + USE: in: {v=READ} out: {v=READ} ===================== == get_a == get() { @@ -37,15 +37,15 @@ get() { --------------------- L4: 3 INIT: in: {a=D} out: {a=D} - 4 mark({ return field }) USE: in: {field=READ} out: {field=READ} - r(field) -> USE: in: {} out: {field=READ} + 4 mark({ return field }) + r(field) -> ret(*|) L5 L5: 3 error: INIT: in: {} out: {} sink: - INIT: in: {a=I?} out: {a=I?} USE: in: {} out: {} + INIT: in: {a=I?} out: {a=I?} USE: in: {v=READ} out: {v=READ} ===================== == set_a == set(v: Int) { @@ -57,13 +57,13 @@ L7: v(v: Int) INIT: in: {a=D} out: {a=D, v=D} magic[FAKE_INITIALIZER](v: Int) -> INIT: in: {a=D, v=D} out: {a=D, v=D} w(v|) INIT: in: {a=D, v=D} out: {a=D, v=ID} - 4 mark({ field = v }) INIT: in: {a=D, v=ID} out: {a=D, v=ID} USE: in: {field=ONLY_WRITTEN_NEVER_READ, v=READ} out: {field=ONLY_WRITTEN_NEVER_READ, v=READ} - r(v) -> USE: in: {field=ONLY_WRITTEN_NEVER_READ} out: {field=ONLY_WRITTEN_NEVER_READ, v=READ} - w(field|) INIT: in: {a=D, v=ID} out: {a=D, field=I, v=ID} USE: in: {} out: {field=ONLY_WRITTEN_NEVER_READ} + 4 mark({ field = v }) INIT: in: {a=D, v=ID} out: {a=D, v=ID} + r(v) -> + w(field|) L8: - 3 INIT: in: {a=D, field=I, v=ID} out: {a=D, field=I, v=ID} + 3 error: - INIT: in: {} out: {} + INIT: in: {v=ID} out: {v=ID} sink: - INIT: in: {a=I?, field=I, v=I?} out: {a=I?, field=I, v=I?} USE: in: {} out: {} + INIT: in: {a=I?, v=ID} out: {a=I?, v=ID} USE: in: {v=READ} out: {v=READ} ===================== diff --git a/compiler/testData/cfg-variables/lexicalScopes/tryScope.instructions b/compiler/testData/cfg-variables/lexicalScopes/tryScope.instructions index 8d5d8633284..7d0840b0d0f 100644 --- a/compiler/testData/cfg-variables/lexicalScopes/tryScope.instructions +++ b/compiler/testData/cfg-variables/lexicalScopes/tryScope.instructions @@ -26,33 +26,33 @@ L0: call(foo(), foo) -> 2 jmp?(L2) jmp?(L3) - jmp(L4) USE: in: {} out: {} + jmp(L4) L2 [onException]: 3 v(e: Exception) INIT: in: {} out: {e=D} magic[FAKE_INITIALIZER](e: Exception) -> INIT: in: {e=D} out: {e=D} w(e|) INIT: in: {e=D} out: {e=ID} 4 mark({ val a = e }) INIT: in: {e=ID} out: {e=ID} - v(val a = e) INIT: in: {e=ID} out: {a=D, e=ID} USE: in: {e=READ} out: {e=READ} - r(e) -> INIT: in: {a=D, e=ID} out: {a=D, e=ID} USE: in: {} out: {e=READ} + v(val a = e) INIT: in: {e=ID} out: {a=D, e=ID} + r(e) -> INIT: in: {a=D, e=ID} out: {a=D, e=ID} w(a|) INIT: in: {a=D, e=ID} out: {a=ID, e=ID} - 3 jmp(L4) INIT: in: {e=ID} out: {e=ID} + 3 jmp(L4) INIT: in: {a=ID, e=ID} out: {a=ID, e=ID} L4 [afterCatches]: - 2 jmp(L5) INIT: in: {} out: {} + 2 jmp(L5) L3 [onExceptionToFinallyBlock]: L6 [start finally]: 3 mark({ val a = 1 }) - v(val a = 1) INIT: in: {} out: {a=D} - r(1) -> INIT: in: {a=D} out: {a=D} - w(a|) INIT: in: {a=D} out: {a=ID} + v(val a = 1) INIT: in: {a=ID, e=ID} out: {a=D, a=ID, e=ID} + r(1) -> INIT: in: {a=D, a=ID, e=ID} out: {a=D, a=ID, e=ID} + w(a|) INIT: in: {a=D, a=ID, e=ID} out: {a=ID, a=ID, e=ID} L7 [finish finally]: - 2 jmp(error) INIT: in: {} out: {} + 2 jmp(error) INIT: in: {a=ID, a=ID, e=ID} out: {a=ID, a=ID, e=ID} L5 [skipFinallyToErrorBlock]: L8 [copy of L3, onExceptionToFinallyBlock]: 3 mark({ val a = 1 }) - v(val a = 1) INIT: in: {} out: {a=D} - r(1) -> INIT: in: {a=D} out: {a=D} - w(a|) INIT: in: {a=D} out: {a=ID} - 2 merge(try { foo() } catch (e: Exception) { val a = e } finally { val a = 1 }|, !) -> INIT: in: {} out: {} + v(val a = 1) + r(1) -> + w(a|) + 2 merge(try { foo() } catch (e: Exception) { val a = e } finally { val a = 1 }|, !) -> mark("after") r("after") -> L1: @@ -60,5 +60,5 @@ L1: error: sink: - USE: in: {} out: {} + USE: in: {e=READ} out: {e=READ} ===================== From edbf360852101e6b6a7109aeb0c311cc8fde472d Mon Sep 17 00:00:00 2001 From: Denis Zharkov Date: Fri, 29 Sep 2017 16:42:41 +0300 Subject: [PATCH 181/212] Do not render trivial variables in DataFlow tests The reason is that while there are optimizations for them definition of their state is both rather simple and may be confusing in testData --- .../kotlin/cfg/PseudocodeVariablesData.kt | 3 + .../ExhaustiveInitialization.instructions | 60 ++--- .../basic/IfWithUninitialized.instructions | 10 +- .../basic/UsageInFunctionLiteral.instructions | 48 ++-- .../UseUninitializedInLambda.instructions | 10 +- .../VariablesInitialization.instructions | 36 +-- .../basic/VariablesUsage.instructions | 10 +- .../cfg-variables/bugs/kt10243.instructions | 18 +- .../cfg-variables/bugs/kt4764.instructions | 48 ++-- .../cfg-variables/bugs/kt5469.instructions | 26 +- .../localObjectInConstructor.instructions | 252 +++++++++--------- ...eferenceToPropertyInitializer.instructions | 76 +++--- .../varInitializationInIfInCycle.instructions | 52 ++-- .../lexicalScopes/forScope.instructions | 18 +- .../functionLiteralScope.instructions | 38 +-- .../lexicalScopes/ifScope.instructions | 18 +- .../lexicalScopes/localClass.instructions | 32 +-- .../localFunctionScope.instructions | 32 +-- ...localFunctionScopeWithoutBody.instructions | 24 +- .../lexicalScopes/localObject.instructions | 24 +- .../objectLiteralScope.instructions | 32 +-- .../propertyAccessorScope.instructions | 20 +- .../lexicalScopes/tryScope.instructions | 26 +- .../kotlin/cfg/AbstractDataFlowTest.java | 30 ++- 24 files changed, 479 insertions(+), 464 deletions(-) diff --git a/compiler/frontend/src/org/jetbrains/kotlin/cfg/PseudocodeVariablesData.kt b/compiler/frontend/src/org/jetbrains/kotlin/cfg/PseudocodeVariablesData.kt index 7acc068c07a..50c804c5f09 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/cfg/PseudocodeVariablesData.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/cfg/PseudocodeVariablesData.kt @@ -67,6 +67,9 @@ class PseudocodeVariablesData(val pseudocode: Pseudocode, private val bindingCon fun getDeclaredVariables(pseudocode: Pseudocode, includeInsideLocalDeclarations: Boolean): Set = getAllDeclaredVariables(pseudocode, includeInsideLocalDeclarations).allVars + fun isVariableWithTrivialInitializer(variableDescriptor: VariableDescriptor) = + variableDescriptor in rootVariables.valsWithTrivialInitializer + private fun getAllDeclaredVariables(pseudocode: Pseudocode, includeInsideLocalDeclarations: Boolean): VariablesForDeclaration { if (!includeInsideLocalDeclarations) { return getUpperLevelDeclaredVariables(pseudocode) diff --git a/compiler/testData/cfg-variables/basic/ExhaustiveInitialization.instructions b/compiler/testData/cfg-variables/basic/ExhaustiveInitialization.instructions index 8dd64ec31c7..9bb7fb604e4 100644 --- a/compiler/testData/cfg-variables/basic/ExhaustiveInitialization.instructions +++ b/compiler/testData/cfg-variables/basic/ExhaustiveInitialization.instructions @@ -38,66 +38,66 @@ fun foo(dir: Direction): Int { --------------------- L0: 1 INIT: in: {} out: {} - v(dir: Direction) INIT: in: {} out: {dir=D} - magic[FAKE_INITIALIZER](dir: Direction) -> INIT: in: {dir=D} out: {dir=D} - w(dir|) INIT: in: {dir=D} out: {dir=ID} USE: in: {dir=READ} out: {dir=READ} - 2 mark({ val res: Int when (dir) { Direction.NORTH -> res = 1 Direction.SOUTH -> res = 2 Direction.WEST -> res = 3 Direction.EAST -> res = 4 } return res }) INIT: in: {dir=ID} out: {dir=ID} - v(val res: Int) INIT: in: {dir=ID} out: {dir=ID, res=D} - mark(when (dir) { Direction.NORTH -> res = 1 Direction.SOUTH -> res = 2 Direction.WEST -> res = 3 Direction.EAST -> res = 4 }) INIT: in: {dir=ID, res=D} out: {dir=ID, res=D} + v(dir: Direction) INIT: in: {} out: {} + magic[FAKE_INITIALIZER](dir: Direction) -> INIT: in: {} out: {} + w(dir|) INIT: in: {} out: {} USE: in: {} out: {} + 2 mark({ val res: Int when (dir) { Direction.NORTH -> res = 1 Direction.SOUTH -> res = 2 Direction.WEST -> res = 3 Direction.EAST -> res = 4 } return res }) INIT: in: {} out: {} + v(val res: Int) INIT: in: {} out: {res=D} + mark(when (dir) { Direction.NORTH -> res = 1 Direction.SOUTH -> res = 2 Direction.WEST -> res = 3 Direction.EAST -> res = 4 }) INIT: in: {res=D} out: {res=D} r(dir) -> mark(Direction.NORTH -> res = 1) mark(Direction.NORTH) mark(Direction.NORTH) r(NORTH) -> magic[EQUALS_IN_WHEN_CONDITION](Direction.NORTH|, ) -> - jmp?(L4|) USE: in: {dir=READ, res=READ} out: {dir=READ, res=READ} + jmp?(L4|) USE: in: {res=READ} out: {res=READ} L3 ['when' entry body]: - r(1) -> USE: in: {dir=READ, res=WRITTEN_AFTER_READ} out: {dir=READ, res=WRITTEN_AFTER_READ} - w(res|) INIT: in: {dir=ID, res=D} out: {dir=ID, res=ID} USE: in: {dir=READ, res=READ} out: {dir=READ, res=WRITTEN_AFTER_READ} - jmp(L2) INIT: in: {dir=ID, res=ID} out: {dir=ID, res=ID} + r(1) -> USE: in: {res=WRITTEN_AFTER_READ} out: {res=WRITTEN_AFTER_READ} + w(res|) INIT: in: {res=D} out: {res=ID} USE: in: {res=READ} out: {res=WRITTEN_AFTER_READ} + jmp(L2) INIT: in: {res=ID} out: {res=ID} L4 [next 'when' entry]: - mark(Direction.SOUTH -> res = 2) INIT: in: {dir=ID, res=D} out: {dir=ID, res=D} + mark(Direction.SOUTH -> res = 2) INIT: in: {res=D} out: {res=D} mark(Direction.SOUTH) mark(Direction.SOUTH) r(SOUTH) -> magic[EQUALS_IN_WHEN_CONDITION](Direction.SOUTH|, ) -> - jmp?(L6|) USE: in: {dir=READ, res=READ} out: {dir=READ, res=READ} + jmp?(L6|) USE: in: {res=READ} out: {res=READ} L5 ['when' entry body]: - r(2) -> USE: in: {dir=READ, res=WRITTEN_AFTER_READ} out: {dir=READ, res=WRITTEN_AFTER_READ} - w(res|) INIT: in: {dir=ID, res=D} out: {dir=ID, res=ID} USE: in: {dir=READ, res=READ} out: {dir=READ, res=WRITTEN_AFTER_READ} - jmp(L2) INIT: in: {dir=ID, res=ID} out: {dir=ID, res=ID} + r(2) -> USE: in: {res=WRITTEN_AFTER_READ} out: {res=WRITTEN_AFTER_READ} + w(res|) INIT: in: {res=D} out: {res=ID} USE: in: {res=READ} out: {res=WRITTEN_AFTER_READ} + jmp(L2) INIT: in: {res=ID} out: {res=ID} L6 [next 'when' entry]: - mark(Direction.WEST -> res = 3) INIT: in: {dir=ID, res=D} out: {dir=ID, res=D} + mark(Direction.WEST -> res = 3) INIT: in: {res=D} out: {res=D} mark(Direction.WEST) mark(Direction.WEST) r(WEST) -> magic[EQUALS_IN_WHEN_CONDITION](Direction.WEST|, ) -> - jmp?(L8|) USE: in: {dir=READ, res=READ} out: {dir=READ, res=READ} + jmp?(L8|) USE: in: {res=READ} out: {res=READ} L7 ['when' entry body]: - r(3) -> USE: in: {dir=READ, res=WRITTEN_AFTER_READ} out: {dir=READ, res=WRITTEN_AFTER_READ} - w(res|) INIT: in: {dir=ID, res=D} out: {dir=ID, res=ID} USE: in: {dir=READ, res=READ} out: {dir=READ, res=WRITTEN_AFTER_READ} - jmp(L2) INIT: in: {dir=ID, res=ID} out: {dir=ID, res=ID} + r(3) -> USE: in: {res=WRITTEN_AFTER_READ} out: {res=WRITTEN_AFTER_READ} + w(res|) INIT: in: {res=D} out: {res=ID} USE: in: {res=READ} out: {res=WRITTEN_AFTER_READ} + jmp(L2) INIT: in: {res=ID} out: {res=ID} L8 [next 'when' entry]: - mark(Direction.EAST -> res = 4) INIT: in: {dir=ID, res=D} out: {dir=ID, res=D} + mark(Direction.EAST -> res = 4) INIT: in: {res=D} out: {res=D} mark(Direction.EAST) mark(Direction.EAST) r(EAST) -> magic[EQUALS_IN_WHEN_CONDITION](Direction.EAST|, ) -> - jmp?(L10|) USE: in: {dir=READ, res=READ} out: {dir=READ, res=READ} + jmp?(L10|) USE: in: {res=READ} out: {res=READ} L9 ['when' entry body]: - r(4) -> USE: in: {dir=READ, res=WRITTEN_AFTER_READ} out: {dir=READ, res=WRITTEN_AFTER_READ} - w(res|) INIT: in: {dir=ID, res=D} out: {dir=ID, res=ID} USE: in: {dir=READ, res=READ} out: {dir=READ, res=WRITTEN_AFTER_READ} - jmp(L2) INIT: in: {dir=ID, res=ID} out: {dir=ID, res=ID} + r(4) -> USE: in: {res=WRITTEN_AFTER_READ} out: {res=WRITTEN_AFTER_READ} + w(res|) INIT: in: {res=D} out: {res=ID} USE: in: {res=READ} out: {res=WRITTEN_AFTER_READ} + jmp(L2) INIT: in: {res=ID} out: {res=ID} L10 [next 'when' entry]: - magic[EXHAUSTIVE_WHEN_ELSE](when (dir) { Direction.NORTH -> res = 1 Direction.SOUTH -> res = 2 Direction.WEST -> res = 3 Direction.EAST -> res = 4 }) -> INIT: in: {dir=ID, res=D} out: {dir=ID, res=IED} + magic[EXHAUSTIVE_WHEN_ELSE](when (dir) { Direction.NORTH -> res = 1 Direction.SOUTH -> res = 2 Direction.WEST -> res = 3 Direction.EAST -> res = 4 }) -> INIT: in: {res=D} out: {res=IED} L2 [after 'when' expression]: - merge(when (dir) { Direction.NORTH -> res = 1 Direction.SOUTH -> res = 2 Direction.WEST -> res = 3 Direction.EAST -> res = 4 }|!, !, !, !) -> INIT: in: {dir=ID, res=ID} out: {dir=ID, res=ID} USE: in: {dir=READ, res=READ} out: {dir=READ, res=READ} - r(res) -> USE: in: {dir=READ} out: {dir=READ, res=READ} + merge(when (dir) { Direction.NORTH -> res = 1 Direction.SOUTH -> res = 2 Direction.WEST -> res = 3 Direction.EAST -> res = 4 }|!, !, !, !) -> INIT: in: {res=ID} out: {res=ID} USE: in: {res=READ} out: {res=READ} + r(res) -> USE: in: {} out: {res=READ} ret(*|) L1 L1: - 1 INIT: in: {dir=ID} out: {dir=ID} + 1 INIT: in: {} out: {} error: sink: - USE: in: {dir=READ} out: {dir=READ} + USE: in: {} out: {} ===================== diff --git a/compiler/testData/cfg-variables/basic/IfWithUninitialized.instructions b/compiler/testData/cfg-variables/basic/IfWithUninitialized.instructions index beda1c7afb7..d4606e0ae29 100644 --- a/compiler/testData/cfg-variables/basic/IfWithUninitialized.instructions +++ b/compiler/testData/cfg-variables/basic/IfWithUninitialized.instructions @@ -42,15 +42,15 @@ fun use(vararg a: Any?) = a --------------------- L0: 1 INIT: in: {} out: {} - v(vararg a: Any?) INIT: in: {} out: {a=D} - magic[FAKE_INITIALIZER](vararg a: Any?) -> INIT: in: {a=D} out: {a=D} - w(a|) INIT: in: {a=D} out: {a=ID} - r(a) -> INIT: in: {a=ID} out: {a=ID} + v(vararg a: Any?) INIT: in: {} out: {} + magic[FAKE_INITIALIZER](vararg a: Any?) -> INIT: in: {} out: {} + w(a|) INIT: in: {} out: {} + r(a) -> INIT: in: {} out: {} ret(*|) L1 L1: error: sink: - USE: in: {a=READ} out: {a=READ} + USE: in: {} out: {} ===================== diff --git a/compiler/testData/cfg-variables/basic/UsageInFunctionLiteral.instructions b/compiler/testData/cfg-variables/basic/UsageInFunctionLiteral.instructions index 87f08e33434..3316e336849 100644 --- a/compiler/testData/cfg-variables/basic/UsageInFunctionLiteral.instructions +++ b/compiler/testData/cfg-variables/basic/UsageInFunctionLiteral.instructions @@ -10,22 +10,22 @@ fun foo() { L0: 1 INIT: in: {} out: {} 2 mark({ val a = 1 val f = { x: Int -> val y = x + a use(a) } }) - v(val a = 1) INIT: in: {} out: {a=D} - r(1) -> INIT: in: {a=D} out: {a=D} - w(a|) INIT: in: {a=D} out: {a=ID} - v(val f = { x: Int -> val y = x + a use(a) }) INIT: in: {a=ID} out: {a=ID, f=D} - mark({ x: Int -> val y = x + a use(a) }) INIT: in: {a=ID, f=D} out: {a=ID, f=D} + v(val a = 1) INIT: in: {} out: {} + r(1) -> INIT: in: {} out: {} + w(a|) INIT: in: {} out: {} + v(val f = { x: Int -> val y = x + a use(a) }) INIT: in: {} out: {} + mark({ x: Int -> val y = x + a use(a) }) INIT: in: {} out: {} jmp?(L2) - d({ x: Int -> val y = x + a use(a) }) INIT: in: {a=ID, f=D, x=ID, y=ID} out: {a=ID, f=D, x=ID, y=ID} + d({ x: Int -> val y = x + a use(a) }) INIT: in: {} out: {} L2 [after local declaration]: r({ x: Int -> val y = x + a use(a) }) -> - w(f|) INIT: in: {a=ID, f=D, x=ID, y=ID} out: {a=ID, f=ID, x=ID, y=ID} + w(f|) INIT: in: {} out: {} L1: - 1 INIT: in: {a=ID, f=ID, x=ID, y=ID} out: {a=ID, f=ID, x=ID, y=ID} + 1 INIT: in: {} out: {} error: sink: - USE: in: {a=READ, x=READ} out: {a=READ, x=READ} + USE: in: {} out: {} ===================== == anonymous_0 == { x: Int -> @@ -34,18 +34,18 @@ sink: } --------------------- L3: - 3 INIT: in: {a=ID, f=D} out: {a=ID, f=D} - v(x: Int) INIT: in: {a=ID, f=D} out: {a=ID, f=D, x=D} - magic[FAKE_INITIALIZER](x: Int) -> INIT: in: {a=ID, f=D, x=D} out: {a=ID, f=D, x=D} - w(x|) INIT: in: {a=ID, f=D, x=D} out: {a=ID, f=D, x=ID} - 4 mark(val y = x + a use(a)) INIT: in: {a=ID, f=D, x=ID} out: {a=ID, f=D, x=ID} - v(val y = x + a) INIT: in: {a=ID, f=D, x=ID} out: {a=ID, f=D, x=ID, y=D} - r(x) -> INIT: in: {a=ID, f=D, x=ID, y=D} out: {a=ID, f=D, x=ID, y=D} + 3 INIT: in: {} out: {} + v(x: Int) INIT: in: {} out: {} + magic[FAKE_INITIALIZER](x: Int) -> INIT: in: {} out: {} + w(x|) INIT: in: {} out: {} + 4 mark(val y = x + a use(a)) INIT: in: {} out: {} + v(val y = x + a) INIT: in: {} out: {} + r(x) -> INIT: in: {} out: {} r(a) -> mark(x + a) call(x + a, plus|, ) -> - w(y|) INIT: in: {a=ID, f=D, x=ID, y=D} out: {a=ID, f=D, x=ID, y=ID} - r(a) -> INIT: in: {a=ID, f=D, x=ID, y=ID} out: {a=ID, f=D, x=ID, y=ID} + w(y|) INIT: in: {} out: {} + r(a) -> INIT: in: {} out: {} mark(use(a)) call(use(a), use|) -> 3 ret(*|) L4 @@ -54,22 +54,22 @@ L4: error: sink: - USE: in: {a=READ, x=READ} out: {a=READ, x=READ} + USE: in: {} out: {} ===================== == use == fun use(vararg a: Any?) = a --------------------- L0: 1 INIT: in: {} out: {} - v(vararg a: Any?) INIT: in: {} out: {a=D} - magic[FAKE_INITIALIZER](vararg a: Any?) -> INIT: in: {a=D} out: {a=D} - w(a|) INIT: in: {a=D} out: {a=ID} - r(a) -> INIT: in: {a=ID} out: {a=ID} + v(vararg a: Any?) INIT: in: {} out: {} + magic[FAKE_INITIALIZER](vararg a: Any?) -> INIT: in: {} out: {} + w(a|) INIT: in: {} out: {} + r(a) -> INIT: in: {} out: {} ret(*|) L1 L1: error: sink: - USE: in: {a=READ} out: {a=READ} + USE: in: {} out: {} ===================== diff --git a/compiler/testData/cfg-variables/basic/UseUninitializedInLambda.instructions b/compiler/testData/cfg-variables/basic/UseUninitializedInLambda.instructions index 620d1e9dc27..aadd7c026d2 100644 --- a/compiler/testData/cfg-variables/basic/UseUninitializedInLambda.instructions +++ b/compiler/testData/cfg-variables/basic/UseUninitializedInLambda.instructions @@ -3,10 +3,10 @@ fun bar(f: () -> Unit) = f() --------------------- L0: 1 INIT: in: {} out: {} - v(f: () -> Unit) INIT: in: {} out: {f=D} - magic[FAKE_INITIALIZER](f: () -> Unit) -> INIT: in: {f=D} out: {f=D} - w(f|) INIT: in: {f=D} out: {f=ID} - r(f) -> INIT: in: {f=ID} out: {f=ID} + v(f: () -> Unit) INIT: in: {} out: {} + magic[FAKE_INITIALIZER](f: () -> Unit) -> INIT: in: {} out: {} + w(f|) INIT: in: {} out: {} + r(f) -> INIT: in: {} out: {} mark(f()) call(f(), invoke|) -> ret(*|) L1 @@ -15,7 +15,7 @@ L1: error: sink: - USE: in: {f=READ} out: {f=READ} + USE: in: {} out: {} ===================== == foo == fun foo() { diff --git a/compiler/testData/cfg-variables/basic/VariablesInitialization.instructions b/compiler/testData/cfg-variables/basic/VariablesInitialization.instructions index 7ffbbe6a3e5..9d344f7e2dc 100644 --- a/compiler/testData/cfg-variables/basic/VariablesInitialization.instructions +++ b/compiler/testData/cfg-variables/basic/VariablesInitialization.instructions @@ -7,21 +7,21 @@ fun foo() { } --------------------- L0: - 1 INIT: in: {} out: {} USE: in: {} out: {} + 1 INIT: in: {} out: {} USE: in: {} out: {} 2 mark({ val a = 1 val b: Int b = 2 42 }) - v(val a = 1) INIT: in: {} out: {a=D} - r(1) -> INIT: in: {a=D} out: {a=D} - w(a|) INIT: in: {a=D} out: {a=ID} - v(val b: Int) INIT: in: {a=ID} out: {a=ID, b=D} - r(2) -> INIT: in: {a=ID, b=D} out: {a=ID, b=D} USE: in: {b=ONLY_WRITTEN_NEVER_READ} out: {b=ONLY_WRITTEN_NEVER_READ} - w(b|) INIT: in: {a=ID, b=D} out: {a=ID, b=ID} USE: in: {} out: {b=ONLY_WRITTEN_NEVER_READ} - r(42) -> INIT: in: {a=ID, b=ID} out: {a=ID, b=ID} + v(val a = 1) INIT: in: {} out: {} + r(1) -> INIT: in: {} out: {} + w(a|) INIT: in: {} out: {} + v(val b: Int) INIT: in: {} out: {b=D} + r(2) -> INIT: in: {b=D} out: {b=D} USE: in: {b=ONLY_WRITTEN_NEVER_READ} out: {b=ONLY_WRITTEN_NEVER_READ} + w(b|) INIT: in: {b=D} out: {b=ID} USE: in: {} out: {b=ONLY_WRITTEN_NEVER_READ} + r(42) -> INIT: in: {b=ID} out: {b=ID} L1: - 1 INIT: in: {a=ID} out: {a=ID} + 1 INIT: in: {} out: {} error: sink: - USE: in: {} out: {} + USE: in: {} out: {} ===================== == bar == fun bar(foo: Foo) { @@ -32,10 +32,10 @@ fun bar(foo: Foo) { --------------------- L0: 1 INIT: in: {} out: {} - v(foo: Foo) INIT: in: {} out: {foo=D} - magic[FAKE_INITIALIZER](foo: Foo) -> INIT: in: {foo=D} out: {foo=D} - w(foo|) INIT: in: {foo=D} out: {foo=ID} - 2 mark({ foo.c foo.c = 2 42 }) INIT: in: {foo=ID} out: {foo=ID} + v(foo: Foo) INIT: in: {} out: {} + magic[FAKE_INITIALIZER](foo: Foo) -> INIT: in: {} out: {} + w(foo|) INIT: in: {} out: {} + 2 mark({ foo.c foo.c = 2 42 }) INIT: in: {} out: {} mark(foo.c) r(foo) -> r(c|) -> @@ -48,7 +48,7 @@ L1: error: sink: - USE: in: {foo=READ} out: {foo=READ} + USE: in: {} out: {} ===================== == Foo == interface Foo { @@ -57,11 +57,11 @@ interface Foo { --------------------- L0: 1 INIT: in: {} out: {} - v(var c: Int) INIT: in: {} out: {c=D} + v(var c: Int) INIT: in: {} out: {} L1: - INIT: in: {c=D} out: {c=D} + INIT: in: {} out: {} error: sink: - USE: in: {} out: {} + USE: in: {} out: {} ===================== diff --git a/compiler/testData/cfg-variables/basic/VariablesUsage.instructions b/compiler/testData/cfg-variables/basic/VariablesUsage.instructions index faae6aef3d4..120ab47ef92 100644 --- a/compiler/testData/cfg-variables/basic/VariablesUsage.instructions +++ b/compiler/testData/cfg-variables/basic/VariablesUsage.instructions @@ -51,15 +51,15 @@ fun use(a: Int) = a --------------------- L0: 1 INIT: in: {} out: {} - v(a: Int) INIT: in: {} out: {a=D} - magic[FAKE_INITIALIZER](a: Int) -> INIT: in: {a=D} out: {a=D} - w(a|) INIT: in: {a=D} out: {a=ID} - r(a) -> INIT: in: {a=ID} out: {a=ID} + v(a: Int) INIT: in: {} out: {} + magic[FAKE_INITIALIZER](a: Int) -> INIT: in: {} out: {} + w(a|) INIT: in: {} out: {} + r(a) -> INIT: in: {} out: {} ret(*|) L1 L1: error: sink: - USE: in: {a=READ} out: {a=READ} + USE: in: {} out: {} ===================== diff --git a/compiler/testData/cfg-variables/bugs/kt10243.instructions b/compiler/testData/cfg-variables/bugs/kt10243.instructions index 17044411ec6..f350f845553 100644 --- a/compiler/testData/cfg-variables/bugs/kt10243.instructions +++ b/compiler/testData/cfg-variables/bugs/kt10243.instructions @@ -25,10 +25,10 @@ fun foo(f: Boolean) { --------------------- L0: 1 INIT: in: {} out: {} - v(f: Boolean) INIT: in: {} out: {f=D} - magic[FAKE_INITIALIZER](f: Boolean) -> INIT: in: {f=D} out: {f=D} - w(f|) INIT: in: {f=D} out: {f=ID} - 2 mark({ try { if (f) { x = 0 } } finally { fun bar() {} } }) INIT: in: {f=ID} out: {f=ID} + v(f: Boolean) INIT: in: {} out: {} + magic[FAKE_INITIALIZER](f: Boolean) -> INIT: in: {} out: {} + w(f|) INIT: in: {} out: {} + 2 mark({ try { if (f) { x = 0 } } finally { fun bar() {} } }) INIT: in: {} out: {} mark(try { if (f) { x = 0 } } finally { fun bar() {} }) jmp?(L2) 3 mark({ if (f) { x = 0 } }) @@ -65,13 +65,13 @@ L1: error: sink: - USE: in: {f=READ} out: {f=READ} + USE: in: {} out: {} ===================== == bar == fun bar() {} --------------------- L8: - 4 INIT: in: {f=ID} out: {f=ID} + 4 INIT: in: {} out: {} 5 mark({}) read (Unit) L9: @@ -79,13 +79,13 @@ L9: error: sink: - USE: in: {f=READ} out: {f=READ} + USE: in: {} out: {} ===================== == bar == fun bar() {} --------------------- L2 [copy of L8, null]: - 4 INIT: in: {f=ID} out: {f=ID} + 4 INIT: in: {} out: {} 5 mark({}) read (Unit) L3 [copy of L9, null]: @@ -93,5 +93,5 @@ L3 [copy of L9, null]: L0 [copy of error, null]: L1 [copy of sink, null]: - USE: in: {f=READ} out: {f=READ} + USE: in: {} out: {} ===================== diff --git a/compiler/testData/cfg-variables/bugs/kt4764.instructions b/compiler/testData/cfg-variables/bugs/kt4764.instructions index 90955a7ed90..cca1dbf8cb7 100644 --- a/compiler/testData/cfg-variables/bugs/kt4764.instructions +++ b/compiler/testData/cfg-variables/bugs/kt4764.instructions @@ -39,7 +39,7 @@ L4 [start finally]: 5 mark({}) read (Unit) L5 [finish finally]: - 4 ret(*|) L1 USE: in: {} out: {} + 4 ret(*|) L1 USE: in: {} out: {} - 3 jmp(L6) L3 [else branch]: 4 mark({ if (false) { if (false) { var foo: String? = null try { foo = "test" } catch (e: Exception) { return "fail" } finally { println(foo) // Variable 'foo' must be initialized } } return "fail" } }) INIT: in: {} out: {} @@ -49,56 +49,56 @@ L3 [else branch]: 5 mark({ if (false) { var foo: String? = null try { foo = "test" } catch (e: Exception) { return "fail" } finally { println(foo) // Variable 'foo' must be initialized } } return "fail" }) mark(if (false) { var foo: String? = null try { foo = "test" } catch (e: Exception) { return "fail" } finally { println(foo) // Variable 'foo' must be initialized } }) r(false) -> - jf(L8|) USE: in: {} out: {} + jf(L8|) USE: in: {} out: {} 6 mark({ var foo: String? = null try { foo = "test" } catch (e: Exception) { return "fail" } finally { println(foo) // Variable 'foo' must be initialized } }) v(var foo: String? = null) INIT: in: {} out: {foo=D} r(null) -> INIT: in: {foo=D} out: {foo=D} w(foo|) INIT: in: {foo=D} out: {foo=ID} mark(try { foo = "test" } catch (e: Exception) { return "fail" } finally { println(foo) // Variable 'foo' must be initialized }) INIT: in: {foo=ID} out: {foo=ID} jmp?(L9) - jmp?(L10) USE: in: {foo=READ} out: {foo=READ} + jmp?(L10) USE: in: {foo=READ} out: {foo=READ} 7 mark({ foo = "test" }) mark("test") - r("test") -> USE: in: {foo=WRITTEN_AFTER_READ} out: {foo=WRITTEN_AFTER_READ} - w(foo|) USE: in: {foo=READ} out: {foo=WRITTEN_AFTER_READ} + r("test") -> USE: in: {foo=WRITTEN_AFTER_READ} out: {foo=WRITTEN_AFTER_READ} + w(foo|) USE: in: {foo=READ} out: {foo=WRITTEN_AFTER_READ} 6 jmp?(L9) jmp?(L10) jmp(L11) L9 [onException]: - 7 v(e: Exception) INIT: in: {foo=ID} out: {e=D, foo=ID} - magic[FAKE_INITIALIZER](e: Exception) -> INIT: in: {e=D, foo=ID} out: {e=D, foo=ID} - w(e|) INIT: in: {e=D, foo=ID} out: {e=ID, foo=ID} - 8 mark({ return "fail" }) INIT: in: {e=ID, foo=ID} out: {e=ID, foo=ID} + 7 v(e: Exception) INIT: in: {foo=ID} out: {foo=ID} + magic[FAKE_INITIALIZER](e: Exception) -> INIT: in: {foo=ID} out: {foo=ID} + w(e|) INIT: in: {foo=ID} out: {foo=ID} + 8 mark({ return "fail" }) INIT: in: {foo=ID} out: {foo=ID} jmp?(L2) mark("fail") r("fail") -> L12 [start finally]: - 9 mark({ println(foo) // Variable 'foo' must be initialized }) USE: in: {foo=READ} out: {foo=READ} - r(foo) -> USE: in: {} out: {foo=READ} + 9 mark({ println(foo) // Variable 'foo' must be initialized }) USE: in: {foo=READ} out: {foo=READ} + r(foo) -> USE: in: {} out: {foo=READ} mark(println(foo)) magic[UNRESOLVED_CALL](println(foo)|, !) -> L13 [finish finally]: - 5 mark({}) INIT: in: {e=ID} out: {e=ID} + 5 mark({}) INIT: in: {} out: {} read (Unit) - 8 ret(*|) L1 USE: in: {} out: {} + 8 ret(*|) L1 USE: in: {} out: {} - 7 jmp(L11) L11 [afterCatches]: - 6 jmp(L14) INIT: in: {e=ID, foo=ID} out: {e=ID, foo=ID} + 6 jmp(L14) INIT: in: {foo=ID} out: {foo=ID} L10 [onExceptionToFinallyBlock]: - 9 mark({ println(foo) // Variable 'foo' must be initialized }) USE: in: {foo=READ} out: {foo=READ} - r(foo) -> USE: in: {} out: {foo=READ} + 9 mark({ println(foo) // Variable 'foo' must be initialized }) USE: in: {foo=READ} out: {foo=READ} + r(foo) -> USE: in: {} out: {foo=READ} mark(println(foo)) magic[UNRESOLVED_CALL](println(foo)|, !) -> - 5 mark({}) INIT: in: {e=ID} out: {e=ID} + 5 mark({}) INIT: in: {} out: {} read (Unit) - 6 jmp(error) USE: in: {} out: {} + 6 jmp(error) USE: in: {} out: {} L14 [skipFinallyToErrorBlock]: - 9 mark({ println(foo) // Variable 'foo' must be initialized }) INIT: in: {e=ID, foo=ID} out: {e=ID, foo=ID} USE: in: {foo=READ} out: {foo=READ} - r(foo) -> USE: in: {} out: {foo=READ} + 9 mark({ println(foo) // Variable 'foo' must be initialized }) INIT: in: {foo=ID} out: {foo=ID} USE: in: {foo=READ} out: {foo=READ} + r(foo) -> USE: in: {} out: {foo=READ} mark(println(foo)) magic[UNRESOLVED_CALL](println(foo)|, !) -> 6 merge(try { foo = "test" } catch (e: Exception) { return "fail" } finally { println(foo) // Variable 'foo' must be initialized }|!, !) -> - 5 jmp(L15) INIT: in: {e=ID} out: {e=ID} + 5 jmp(L15) INIT: in: {} out: {} L8 [else branch]: read (Unit) L15 ['if' expression result]: @@ -108,10 +108,10 @@ L15 ['if' expression result]: r("fail") -> mark({}) read (Unit) - ret(*|) L1 USE: in: {} out: {} + ret(*|) L1 USE: in: {} out: {} - 4 jmp(L16) L7 [else branch]: - read (Unit) INIT: in: {e=ID} out: {e=ID} + read (Unit) INIT: in: {} out: {} L16 ['if' expression result]: merge(if (false) { if (false) { var foo: String? = null try { foo = "test" } catch (e: Exception) { return "fail" } finally { println(foo) // Variable 'foo' must be initialized } } return "fail" }|!) -> L6 ['if' expression result]: @@ -133,5 +133,5 @@ L1: error: sink: - USE: in: {} out: {} + USE: in: {} out: {} ===================== diff --git a/compiler/testData/cfg-variables/bugs/kt5469.instructions b/compiler/testData/cfg-variables/bugs/kt5469.instructions index 6b5d5fd7807..2bffc859dba 100644 --- a/compiler/testData/cfg-variables/bugs/kt5469.instructions +++ b/compiler/testData/cfg-variables/bugs/kt5469.instructions @@ -10,38 +10,38 @@ fun f() { } --------------------- L0: - 1 INIT: in: {} out: {} USE: in: {} out: {} + 1 INIT: in: {} out: {} USE: in: {} out: {} 2 mark({ var foo = 1 try { foo = 2 throw RuntimeException() } catch (e: Throwable) { println(foo) } }) v(var foo = 1) INIT: in: {} out: {foo=D} r(1) -> INIT: in: {foo=D} out: {foo=D} w(foo|) INIT: in: {foo=D} out: {foo=ID} mark(try { foo = 2 throw RuntimeException() } catch (e: Throwable) { println(foo) }) INIT: in: {foo=ID} out: {foo=ID} - jmp?(L2) USE: in: {foo=READ} out: {foo=READ} + jmp?(L2) USE: in: {foo=READ} out: {foo=READ} 3 mark({ foo = 2 throw RuntimeException() }) - r(2) -> USE: in: {foo=WRITTEN_AFTER_READ} out: {foo=WRITTEN_AFTER_READ} - w(foo|) USE: in: {foo=READ} out: {foo=WRITTEN_AFTER_READ} + r(2) -> USE: in: {foo=WRITTEN_AFTER_READ} out: {foo=WRITTEN_AFTER_READ} + w(foo|) USE: in: {foo=READ} out: {foo=WRITTEN_AFTER_READ} mark(throw RuntimeException()) - jmp?(L2) USE: in: {foo=READ} out: {foo=READ} + jmp?(L2) USE: in: {foo=READ} out: {foo=READ} mark(RuntimeException()) call(RuntimeException(), ) -> - throw (throw RuntimeException()|) USE: in: {} out: {} + throw (throw RuntimeException()|) USE: in: {} out: {} - 2 jmp?(L2) - jmp(L3) L2 [onException]: - 3 v(e: Throwable) INIT: in: {foo=ID} out: {e=D, foo=ID} - magic[FAKE_INITIALIZER](e: Throwable) -> INIT: in: {e=D, foo=ID} out: {e=D, foo=ID} - w(e|) INIT: in: {e=D, foo=ID} out: {e=ID, foo=ID} - 4 mark({ println(foo) }) INIT: in: {e=ID, foo=ID} out: {e=ID, foo=ID} USE: in: {foo=READ} out: {foo=READ} - r(foo) -> USE: in: {} out: {foo=READ} + 3 v(e: Throwable) INIT: in: {foo=ID} out: {foo=ID} + magic[FAKE_INITIALIZER](e: Throwable) -> INIT: in: {foo=ID} out: {foo=ID} + w(e|) INIT: in: {foo=ID} out: {foo=ID} + 4 mark({ println(foo) }) INIT: in: {foo=ID} out: {foo=ID} USE: in: {foo=READ} out: {foo=READ} + r(foo) -> USE: in: {} out: {foo=READ} mark(println(foo)) magic[UNRESOLVED_CALL](println(foo)|, !) -> 3 jmp(L3) L3 [afterCatches]: 2 merge(try { foo = 2 throw RuntimeException() } catch (e: Throwable) { println(foo) }|!, ) -> L1: - 1 INIT: in: {e=ID} out: {e=ID} + 1 INIT: in: {} out: {} error: sink: - USE: in: {} out: {} + USE: in: {} out: {} ===================== diff --git a/compiler/testData/cfg-variables/bugs/localObjectInConstructor.instructions b/compiler/testData/cfg-variables/bugs/localObjectInConstructor.instructions index 29e878038e6..72611e50337 100644 --- a/compiler/testData/cfg-variables/bugs/localObjectInConstructor.instructions +++ b/compiler/testData/cfg-variables/bugs/localObjectInConstructor.instructions @@ -3,17 +3,17 @@ fun println(obj: Any?) {} --------------------- L0: 1 INIT: in: {} out: {} - v(obj: Any?) INIT: in: {} out: {obj=D} - magic[FAKE_INITIALIZER](obj: Any?) -> INIT: in: {obj=D} out: {obj=D} - w(obj|) INIT: in: {obj=D} out: {obj=ID} - 2 mark({}) INIT: in: {obj=ID} out: {obj=ID} + v(obj: Any?) INIT: in: {} out: {} + magic[FAKE_INITIALIZER](obj: Any?) -> INIT: in: {} out: {} + w(obj|) INIT: in: {} out: {} + 2 mark({}) INIT: in: {} out: {} read (Unit) L1: 1 error: sink: - USE: in: {} out: {} + USE: in: {} out: {} ===================== == Demo0 == class Demo0 { @@ -28,22 +28,22 @@ class Demo0 { --------------------- L0: 1 INIT: in: {} out: {} - v(private val some = object { fun foo() { println(state) // Ok } }) INIT: in: {} out: {some=D} - mark(object { fun foo() { println(state) // Ok } }) INIT: in: {some=D} out: {some=D} + v(private val some = object { fun foo() { println(state) // Ok } }) INIT: in: {} out: {} + mark(object { fun foo() { println(state) // Ok } }) INIT: in: {} out: {} jmp?(L2) - d(fun foo() { println(state) // Ok }) USE: in: {state=READ} out: {state=READ} + d(fun foo() { println(state) // Ok }) USE: in: {state=READ} out: {state=READ} L2 [after local declaration]: r(object { fun foo() { println(state) // Ok } }) -> - w(some|) INIT: in: {some=D} out: {some=ID} - v(private var state: Boolean = true) INIT: in: {some=ID} out: {some=ID, state=D} - r(true) -> INIT: in: {some=ID, state=D} out: {some=ID, state=D} - w(state|) INIT: in: {some=ID, state=D} out: {some=ID, state=ID} + w(some|) INIT: in: {} out: {} + v(private var state: Boolean = true) INIT: in: {} out: {state=D} + r(true) -> INIT: in: {state=D} out: {state=D} + w(state|) INIT: in: {state=D} out: {state=ID} L1: - INIT: in: {some=ID, state=ID} out: {some=ID, state=ID} + INIT: in: {state=ID} out: {state=ID} error: - INIT: in: {some=ID} out: {some=ID} + INIT: in: {} out: {} sink: - INIT: in: {some=ID, state=I?} out: {some=ID, state=I?} USE: in: {} out: {} + INIT: in: {state=I?} out: {state=I?} USE: in: {} out: {} ===================== == foo == fun foo() { @@ -51,10 +51,10 @@ fun foo() { } --------------------- L3: - 2 INIT: in: {some=D} out: {some=D} + 2 INIT: in: {} out: {} 3 mark({ println(state) // Ok }) - magic[IMPLICIT_RECEIVER](state) -> USE: in: {state=READ} out: {state=READ} - r(state|) -> USE: in: {} out: {state=READ} + magic[IMPLICIT_RECEIVER](state) -> USE: in: {state=READ} out: {state=READ} + r(state|) -> USE: in: {} out: {state=READ} mark(println(state)) call(println(state), println|) -> L4: @@ -62,7 +62,7 @@ L4: error: sink: - USE: in: {} out: {} + USE: in: {} out: {} ===================== == Demo1 == class Demo1 { @@ -80,22 +80,22 @@ class Demo1 { --------------------- L0: 1 INIT: in: {} out: {} - v(private val some = object { fun foo() { if (state) state = true println(state) // must be initialized } }) INIT: in: {} out: {some=D} - mark(object { fun foo() { if (state) state = true println(state) // must be initialized } }) INIT: in: {some=D} out: {some=D} + v(private val some = object { fun foo() { if (state) state = true println(state) // must be initialized } }) INIT: in: {} out: {} + mark(object { fun foo() { if (state) state = true println(state) // must be initialized } }) INIT: in: {} out: {} jmp?(L2) - d(fun foo() { if (state) state = true println(state) // must be initialized }) INIT: in: {some=D, state=I} out: {some=D, state=I} USE: in: {state=READ} out: {state=READ} + d(fun foo() { if (state) state = true println(state) // must be initialized }) INIT: in: {state=I} out: {state=I} USE: in: {state=READ} out: {state=READ} L2 [after local declaration]: - r(object { fun foo() { if (state) state = true println(state) // must be initialized } }) -> INIT: in: {some=D} out: {some=D} - w(some|) INIT: in: {some=D} out: {some=ID} - v(private var state: Boolean = true) INIT: in: {some=ID} out: {some=ID, state=D} - r(true) -> INIT: in: {some=ID, state=D} out: {some=ID, state=D} - w(state|) INIT: in: {some=ID, state=D} out: {some=ID, state=ID} + r(object { fun foo() { if (state) state = true println(state) // must be initialized } }) -> INIT: in: {} out: {} + w(some|) INIT: in: {} out: {} + v(private var state: Boolean = true) INIT: in: {} out: {state=D} + r(true) -> INIT: in: {state=D} out: {state=D} + w(state|) INIT: in: {state=D} out: {state=ID} L1: - INIT: in: {some=ID, state=ID} out: {some=ID, state=ID} + INIT: in: {state=ID} out: {state=ID} error: - INIT: in: {some=ID} out: {some=ID} + INIT: in: {} out: {} sink: - INIT: in: {some=ID, state=I?} out: {some=ID, state=I?} USE: in: {} out: {} + INIT: in: {state=I?} out: {state=I?} USE: in: {} out: {} ===================== == foo == fun foo() { @@ -106,30 +106,30 @@ fun foo() { } --------------------- L3: - 2 INIT: in: {some=D} out: {some=D} + 2 INIT: in: {} out: {} 3 mark({ if (state) state = true println(state) // must be initialized }) mark(if (state) state = true) magic[IMPLICIT_RECEIVER](state) -> r(state|) -> - jf(L5|) USE: in: {state=READ} out: {state=READ} + jf(L5|) USE: in: {state=READ} out: {state=READ} magic[IMPLICIT_RECEIVER](state) -> - r(true) -> USE: in: {state=WRITTEN_AFTER_READ} out: {state=WRITTEN_AFTER_READ} - w(state|, ) INIT: in: {some=D} out: {some=D, state=I} USE: in: {state=READ} out: {state=WRITTEN_AFTER_READ} - jmp(L6) INIT: in: {some=D, state=I} out: {some=D, state=I} + r(true) -> USE: in: {state=WRITTEN_AFTER_READ} out: {state=WRITTEN_AFTER_READ} + w(state|, ) INIT: in: {} out: {state=I} USE: in: {state=READ} out: {state=WRITTEN_AFTER_READ} + jmp(L6) INIT: in: {state=I} out: {state=I} L5 [else branch]: - read (Unit) INIT: in: {some=D} out: {some=D} + read (Unit) INIT: in: {} out: {} L6 ['if' expression result]: - merge(if (state) state = true|!) -> INIT: in: {some=D, state=I} out: {some=D, state=I} - magic[IMPLICIT_RECEIVER](state) -> USE: in: {state=READ} out: {state=READ} - r(state|) -> USE: in: {} out: {state=READ} + merge(if (state) state = true|!) -> INIT: in: {state=I} out: {state=I} + magic[IMPLICIT_RECEIVER](state) -> USE: in: {state=READ} out: {state=READ} + r(state|) -> USE: in: {} out: {state=READ} mark(println(state)) call(println(state), println|) -> L4: 2 error: - INIT: in: {some=D} out: {some=D} + INIT: in: {} out: {} sink: - INIT: in: {some=D, state=I} out: {some=D, state=I} USE: in: {} out: {} + INIT: in: {state=I} out: {state=I} USE: in: {} out: {} ===================== == Demo1A == class Demo1A { @@ -207,22 +207,22 @@ class Demo2 { --------------------- L0: 1 INIT: in: {} out: {} - v(private val some = object { fun foo() { if (state) state = true else state = false println(state) // OK } }) INIT: in: {} out: {some=D} - mark(object { fun foo() { if (state) state = true else state = false println(state) // OK } }) INIT: in: {some=D} out: {some=D} + v(private val some = object { fun foo() { if (state) state = true else state = false println(state) // OK } }) INIT: in: {} out: {} + mark(object { fun foo() { if (state) state = true else state = false println(state) // OK } }) INIT: in: {} out: {} jmp?(L2) - d(fun foo() { if (state) state = true else state = false println(state) // OK }) INIT: in: {some=D, state=I} out: {some=D, state=I} USE: in: {state=READ} out: {state=READ} + d(fun foo() { if (state) state = true else state = false println(state) // OK }) INIT: in: {state=I} out: {state=I} USE: in: {state=READ} out: {state=READ} L2 [after local declaration]: - r(object { fun foo() { if (state) state = true else state = false println(state) // OK } }) -> INIT: in: {some=D} out: {some=D} - w(some|) INIT: in: {some=D} out: {some=ID} - v(private var state: Boolean = true) INIT: in: {some=ID} out: {some=ID, state=D} - r(true) -> INIT: in: {some=ID, state=D} out: {some=ID, state=D} - w(state|) INIT: in: {some=ID, state=D} out: {some=ID, state=ID} + r(object { fun foo() { if (state) state = true else state = false println(state) // OK } }) -> INIT: in: {} out: {} + w(some|) INIT: in: {} out: {} + v(private var state: Boolean = true) INIT: in: {} out: {state=D} + r(true) -> INIT: in: {state=D} out: {state=D} + w(state|) INIT: in: {state=D} out: {state=ID} L1: - INIT: in: {some=ID, state=ID} out: {some=ID, state=ID} + INIT: in: {state=ID} out: {state=ID} error: - INIT: in: {some=ID} out: {some=ID} + INIT: in: {} out: {} sink: - INIT: in: {some=ID, state=I?} out: {some=ID, state=I?} USE: in: {} out: {} + INIT: in: {state=I?} out: {state=I?} USE: in: {} out: {} ===================== == foo == fun foo() { @@ -235,32 +235,32 @@ fun foo() { } --------------------- L3: - 2 INIT: in: {some=D} out: {some=D} + 2 INIT: in: {} out: {} 3 mark({ if (state) state = true else state = false println(state) // OK }) mark(if (state) state = true else state = false) - magic[IMPLICIT_RECEIVER](state) -> USE: in: {state=READ} out: {state=READ} - r(state|) -> USE: in: {state=WRITTEN_AFTER_READ} out: {state=READ} + magic[IMPLICIT_RECEIVER](state) -> USE: in: {state=READ} out: {state=READ} + r(state|) -> USE: in: {state=WRITTEN_AFTER_READ} out: {state=READ} jf(L5|) magic[IMPLICIT_RECEIVER](state) -> - r(true) -> USE: in: {state=WRITTEN_AFTER_READ} out: {state=WRITTEN_AFTER_READ} - w(state|, ) INIT: in: {some=D} out: {some=D, state=I} USE: in: {state=READ} out: {state=WRITTEN_AFTER_READ} - jmp(L6) INIT: in: {some=D, state=I} out: {some=D, state=I} USE: in: {state=READ} out: {state=READ} + r(true) -> USE: in: {state=WRITTEN_AFTER_READ} out: {state=WRITTEN_AFTER_READ} + w(state|, ) INIT: in: {} out: {state=I} USE: in: {state=READ} out: {state=WRITTEN_AFTER_READ} + jmp(L6) INIT: in: {state=I} out: {state=I} USE: in: {state=READ} out: {state=READ} L5 [else branch]: - magic[IMPLICIT_RECEIVER](state) -> INIT: in: {some=D} out: {some=D} - r(false) -> USE: in: {state=WRITTEN_AFTER_READ} out: {state=WRITTEN_AFTER_READ} - w(state|, ) INIT: in: {some=D} out: {some=D, state=I} USE: in: {state=READ} out: {state=WRITTEN_AFTER_READ} + magic[IMPLICIT_RECEIVER](state) -> INIT: in: {} out: {} + r(false) -> USE: in: {state=WRITTEN_AFTER_READ} out: {state=WRITTEN_AFTER_READ} + w(state|, ) INIT: in: {} out: {state=I} USE: in: {state=READ} out: {state=WRITTEN_AFTER_READ} L6 ['if' expression result]: - merge(if (state) state = true else state = false|!, !) -> INIT: in: {some=D, state=I} out: {some=D, state=I} - magic[IMPLICIT_RECEIVER](state) -> USE: in: {state=READ} out: {state=READ} - r(state|) -> USE: in: {} out: {state=READ} + merge(if (state) state = true else state = false|!, !) -> INIT: in: {state=I} out: {state=I} + magic[IMPLICIT_RECEIVER](state) -> USE: in: {state=READ} out: {state=READ} + r(state|) -> USE: in: {} out: {state=READ} mark(println(state)) call(println(state), println|) -> L4: 2 error: - INIT: in: {some=D} out: {some=D} + INIT: in: {} out: {} sink: - INIT: in: {some=D, state=I} out: {some=D, state=I} USE: in: {} out: {} + INIT: in: {state=I} out: {state=I} USE: in: {} out: {} ===================== == Demo3 == class Demo3 { @@ -276,25 +276,25 @@ class Demo3 { --------------------- L0: 1 INIT: in: {} out: {} - v(private val some = run { if (state) state = true println(state) // OK }) INIT: in: {} out: {some=D} - magic[IMPLICIT_RECEIVER](run { if (state) state = true println(state) // OK }) -> INIT: in: {some=D} out: {some=D} + v(private val some = run { if (state) state = true println(state) // OK }) INIT: in: {} out: {} + magic[IMPLICIT_RECEIVER](run { if (state) state = true println(state) // OK }) -> INIT: in: {} out: {} mark({ if (state) state = true println(state) // OK }) jmp?(L2) - d({ if (state) state = true println(state) // OK }) USE: in: {state=READ} out: {state=READ} + d({ if (state) state = true println(state) // OK }) USE: in: {state=READ} out: {state=READ} L2 [after local declaration]: r({ if (state) state = true println(state) // OK }) -> mark(run { if (state) state = true println(state) // OK }) call(run { if (state) state = true println(state) // OK }, run|, ) -> - w(some|) INIT: in: {some=D} out: {some=ID} - v(private var state: Boolean = true) INIT: in: {some=ID} out: {some=ID, state=D} - r(true) -> INIT: in: {some=ID, state=D} out: {some=ID, state=D} - w(state|) INIT: in: {some=ID, state=D} out: {some=ID, state=ID} + w(some|) INIT: in: {} out: {} + v(private var state: Boolean = true) INIT: in: {} out: {state=D} + r(true) -> INIT: in: {state=D} out: {state=D} + w(state|) INIT: in: {state=D} out: {state=ID} L1: - INIT: in: {some=ID, state=ID} out: {some=ID, state=ID} + INIT: in: {state=ID} out: {state=ID} error: - INIT: in: {some=ID} out: {some=ID} + INIT: in: {} out: {} sink: - INIT: in: {some=ID, state=I?} out: {some=ID, state=I?} USE: in: {} out: {} + INIT: in: {state=I?} out: {state=I?} USE: in: {} out: {} ===================== == anonymous_0 == { @@ -305,22 +305,22 @@ sink: } --------------------- L3: - 2 INIT: in: {some=D} out: {some=D} + 2 INIT: in: {} out: {} 3 mark(if (state) state = true println(state) // OK) mark(if (state) state = true) magic[IMPLICIT_RECEIVER](state) -> r(state|) -> - jf(L5|) USE: in: {state=READ} out: {state=READ} + jf(L5|) USE: in: {state=READ} out: {state=READ} magic[IMPLICIT_RECEIVER](state) -> - r(true) -> USE: in: {state=WRITTEN_AFTER_READ} out: {state=WRITTEN_AFTER_READ} - w(state|, ) USE: in: {state=READ} out: {state=WRITTEN_AFTER_READ} + r(true) -> USE: in: {state=WRITTEN_AFTER_READ} out: {state=WRITTEN_AFTER_READ} + w(state|, ) USE: in: {state=READ} out: {state=WRITTEN_AFTER_READ} jmp(L6) L5 [else branch]: read (Unit) L6 ['if' expression result]: merge(if (state) state = true|!) -> - magic[IMPLICIT_RECEIVER](state) -> USE: in: {state=READ} out: {state=READ} - r(state|) -> USE: in: {} out: {state=READ} + magic[IMPLICIT_RECEIVER](state) -> USE: in: {state=READ} out: {state=READ} + r(state|) -> USE: in: {} out: {state=READ} mark(println(state)) call(println(state), println|) -> L4: @@ -328,17 +328,17 @@ L4: error: sink: - USE: in: {} out: {} + USE: in: {} out: {} ===================== == exec == fun exec(f: () -> T): T = f() --------------------- L0: 1 INIT: in: {} out: {} - v(f: () -> T) INIT: in: {} out: {f=D} - magic[FAKE_INITIALIZER](f: () -> T) -> INIT: in: {f=D} out: {f=D} - w(f|) INIT: in: {f=D} out: {f=ID} - r(f) -> INIT: in: {f=ID} out: {f=ID} + v(f: () -> T) INIT: in: {} out: {} + magic[FAKE_INITIALIZER](f: () -> T) -> INIT: in: {} out: {} + w(f|) INIT: in: {} out: {} + r(f) -> INIT: in: {} out: {} mark(f()) call(f(), invoke|) -> ret(*|) L1 @@ -347,7 +347,7 @@ L1: error: sink: - USE: in: {f=READ} out: {f=READ} + USE: in: {} out: {} ===================== == Demo4 == class Demo4 { @@ -363,24 +363,24 @@ class Demo4 { --------------------- L0: 1 INIT: in: {} out: {} - v(private val some = exec { if (state) state = true println(state) // must be initialized }) INIT: in: {} out: {some=D} - mark({ if (state) state = true println(state) // must be initialized }) INIT: in: {some=D} out: {some=D} + v(private val some = exec { if (state) state = true println(state) // must be initialized }) INIT: in: {} out: {} + mark({ if (state) state = true println(state) // must be initialized }) INIT: in: {} out: {} jmp?(L2) - d({ if (state) state = true println(state) // must be initialized }) INIT: in: {some=D, state=I} out: {some=D, state=I} USE: in: {state=READ} out: {state=READ} + d({ if (state) state = true println(state) // must be initialized }) INIT: in: {state=I} out: {state=I} USE: in: {state=READ} out: {state=READ} L2 [after local declaration]: - r({ if (state) state = true println(state) // must be initialized }) -> INIT: in: {some=D} out: {some=D} + r({ if (state) state = true println(state) // must be initialized }) -> INIT: in: {} out: {} mark(exec { if (state) state = true println(state) // must be initialized }) call(exec { if (state) state = true println(state) // must be initialized }, exec|) -> - w(some|) INIT: in: {some=D} out: {some=ID} - v(private var state: Boolean = true) INIT: in: {some=ID} out: {some=ID, state=D} - r(true) -> INIT: in: {some=ID, state=D} out: {some=ID, state=D} - w(state|) INIT: in: {some=ID, state=D} out: {some=ID, state=ID} + w(some|) INIT: in: {} out: {} + v(private var state: Boolean = true) INIT: in: {} out: {state=D} + r(true) -> INIT: in: {state=D} out: {state=D} + w(state|) INIT: in: {state=D} out: {state=ID} L1: - INIT: in: {some=ID, state=ID} out: {some=ID, state=ID} + INIT: in: {state=ID} out: {state=ID} error: - INIT: in: {some=ID} out: {some=ID} + INIT: in: {} out: {} sink: - INIT: in: {some=ID, state=I?} out: {some=ID, state=I?} USE: in: {} out: {} + INIT: in: {state=I?} out: {state=I?} USE: in: {} out: {} ===================== == anonymous_1 == { @@ -391,30 +391,30 @@ sink: } --------------------- L3: - 2 INIT: in: {some=D} out: {some=D} + 2 INIT: in: {} out: {} 3 mark(if (state) state = true println(state) // must be initialized) mark(if (state) state = true) magic[IMPLICIT_RECEIVER](state) -> r(state|) -> - jf(L5|) USE: in: {state=READ} out: {state=READ} + jf(L5|) USE: in: {state=READ} out: {state=READ} magic[IMPLICIT_RECEIVER](state) -> - r(true) -> USE: in: {state=WRITTEN_AFTER_READ} out: {state=WRITTEN_AFTER_READ} - w(state|, ) INIT: in: {some=D} out: {some=D, state=I} USE: in: {state=READ} out: {state=WRITTEN_AFTER_READ} - jmp(L6) INIT: in: {some=D, state=I} out: {some=D, state=I} + r(true) -> USE: in: {state=WRITTEN_AFTER_READ} out: {state=WRITTEN_AFTER_READ} + w(state|, ) INIT: in: {} out: {state=I} USE: in: {state=READ} out: {state=WRITTEN_AFTER_READ} + jmp(L6) INIT: in: {state=I} out: {state=I} L5 [else branch]: - read (Unit) INIT: in: {some=D} out: {some=D} + read (Unit) INIT: in: {} out: {} L6 ['if' expression result]: - merge(if (state) state = true|!) -> INIT: in: {some=D, state=I} out: {some=D, state=I} - magic[IMPLICIT_RECEIVER](state) -> USE: in: {state=READ} out: {state=READ} - r(state|) -> USE: in: {} out: {state=READ} + merge(if (state) state = true|!) -> INIT: in: {state=I} out: {state=I} + magic[IMPLICIT_RECEIVER](state) -> USE: in: {state=READ} out: {state=READ} + r(state|) -> USE: in: {} out: {state=READ} mark(println(state)) call(println(state), println|) -> L4: 2 error: - INIT: in: {some=D} out: {some=D} + INIT: in: {} out: {} sink: - INIT: in: {some=D, state=I} out: {some=D, state=I} USE: in: {} out: {} + INIT: in: {state=I} out: {state=I} USE: in: {} out: {} ===================== == Demo5 == class Demo5 { @@ -435,19 +435,19 @@ L0: v(private var state: Boolean = true) INIT: in: {} out: {state=D} r(true) -> INIT: in: {state=D} out: {state=D} w(state|) INIT: in: {state=D} out: {state=ID} - v(private val some = object { fun foo() { if (state) state = true println(state) // OK } }) INIT: in: {state=ID} out: {some=D, state=ID} - mark(object { fun foo() { if (state) state = true println(state) // OK } }) INIT: in: {some=D, state=ID} out: {some=D, state=ID} + v(private val some = object { fun foo() { if (state) state = true println(state) // OK } }) INIT: in: {state=ID} out: {state=ID} + mark(object { fun foo() { if (state) state = true println(state) // OK } }) INIT: in: {state=ID} out: {state=ID} jmp?(L2) - d(fun foo() { if (state) state = true println(state) // OK }) INIT: in: {some=D, state=I} out: {some=D, state=I} USE: in: {state=READ} out: {state=READ} + d(fun foo() { if (state) state = true println(state) // OK }) INIT: in: {state=I} out: {state=I} USE: in: {state=READ} out: {state=READ} L2 [after local declaration]: - r(object { fun foo() { if (state) state = true println(state) // OK } }) -> INIT: in: {some=D, state=ID} out: {some=D, state=ID} - w(some|) INIT: in: {some=D, state=ID} out: {some=ID, state=ID} + r(object { fun foo() { if (state) state = true println(state) // OK } }) -> INIT: in: {state=ID} out: {state=ID} + w(some|) INIT: in: {state=ID} out: {state=ID} L1: - INIT: in: {some=ID, state=ID} out: {some=ID, state=ID} + INIT: in: {state=ID} out: {state=ID} error: - INIT: in: {some=ID} out: {some=ID} + INIT: in: {} out: {} sink: - INIT: in: {some=ID, state=I?} out: {some=ID, state=I?} USE: in: {} out: {} + INIT: in: {state=I?} out: {state=I?} USE: in: {} out: {} ===================== == foo == fun foo() { @@ -458,28 +458,28 @@ fun foo() { } --------------------- L3: - 2 INIT: in: {some=D, state=ID} out: {some=D, state=ID} + 2 INIT: in: {state=ID} out: {state=ID} 3 mark({ if (state) state = true println(state) // OK }) mark(if (state) state = true) magic[IMPLICIT_RECEIVER](state) -> r(state|) -> - jf(L5|) USE: in: {state=READ} out: {state=READ} + jf(L5|) USE: in: {state=READ} out: {state=READ} magic[IMPLICIT_RECEIVER](state) -> - r(true) -> USE: in: {state=WRITTEN_AFTER_READ} out: {state=WRITTEN_AFTER_READ} - w(state|, ) USE: in: {state=READ} out: {state=WRITTEN_AFTER_READ} + r(true) -> USE: in: {state=WRITTEN_AFTER_READ} out: {state=WRITTEN_AFTER_READ} + w(state|, ) USE: in: {state=READ} out: {state=WRITTEN_AFTER_READ} jmp(L6) L5 [else branch]: read (Unit) L6 ['if' expression result]: merge(if (state) state = true|!) -> - magic[IMPLICIT_RECEIVER](state) -> USE: in: {state=READ} out: {state=READ} - r(state|) -> USE: in: {} out: {state=READ} + magic[IMPLICIT_RECEIVER](state) -> USE: in: {state=READ} out: {state=READ} + r(state|) -> USE: in: {} out: {state=READ} mark(println(state)) call(println(state), println|) -> L4: 2 error: - INIT: in: {some=D} out: {some=D} + INIT: in: {} out: {} sink: - INIT: in: {some=D, state=I} out: {some=D, state=I} USE: in: {} out: {} + INIT: in: {state=I} out: {state=I} USE: in: {} out: {} ===================== diff --git a/compiler/testData/cfg-variables/bugs/referenceToPropertyInitializer.instructions b/compiler/testData/cfg-variables/bugs/referenceToPropertyInitializer.instructions index 290a82da3e3..bbac4a9a2a7 100644 --- a/compiler/testData/cfg-variables/bugs/referenceToPropertyInitializer.instructions +++ b/compiler/testData/cfg-variables/bugs/referenceToPropertyInitializer.instructions @@ -7,19 +7,19 @@ class TestFunctionLiteral { --------------------- L0: 1 INIT: in: {} out: {} - v(val sum: (Int)->Int = { x: Int -> sum(x - 1) + x }) INIT: in: {} out: {sum=D} - mark({ x: Int -> sum(x - 1) + x }) INIT: in: {sum=D} out: {sum=D} + v(val sum: (Int)->Int = { x: Int -> sum(x - 1) + x }) INIT: in: {} out: {} + mark({ x: Int -> sum(x - 1) + x }) INIT: in: {} out: {} jmp?(L2) - d({ x: Int -> sum(x - 1) + x }) INIT: in: {sum=D, x=ID} out: {sum=D, x=ID} + d({ x: Int -> sum(x - 1) + x }) INIT: in: {} out: {} L2 [after local declaration]: r({ x: Int -> sum(x - 1) + x }) -> - w(sum|) INIT: in: {sum=D, x=ID} out: {sum=ID, x=ID} + w(sum|) INIT: in: {} out: {} L1: - INIT: in: {sum=ID, x=ID} out: {sum=ID, x=ID} + INIT: in: {} out: {} error: sink: - USE: in: {sum=READ, x=READ} out: {sum=READ, x=READ} + USE: in: {} out: {} ===================== == anonymous_0 == { x: Int -> @@ -27,11 +27,11 @@ sink: } --------------------- L3: - 2 INIT: in: {sum=D} out: {sum=D} - v(x: Int) INIT: in: {sum=D} out: {sum=D, x=D} - magic[FAKE_INITIALIZER](x: Int) -> INIT: in: {sum=D, x=D} out: {sum=D, x=D} - w(x|) INIT: in: {sum=D, x=D} out: {sum=D, x=ID} - 3 mark(sum(x - 1) + x) INIT: in: {sum=D, x=ID} out: {sum=D, x=ID} + 2 INIT: in: {} out: {} + v(x: Int) INIT: in: {} out: {} + magic[FAKE_INITIALIZER](x: Int) -> INIT: in: {} out: {} + w(x|) INIT: in: {} out: {} + 3 mark(sum(x - 1) + x) INIT: in: {} out: {} magic[IMPLICIT_RECEIVER](sum) -> r(sum|) -> r(x) -> @@ -49,22 +49,22 @@ L4: error: sink: - USE: in: {sum=READ, x=READ} out: {sum=READ, x=READ} + USE: in: {} out: {} ===================== == A == open class A(val a: A) --------------------- L0: 1 INIT: in: {} out: {} - v(val a: A) INIT: in: {} out: {a=D} - magic[FAKE_INITIALIZER](val a: A) -> INIT: in: {a=D} out: {a=D} - w(a|) INIT: in: {a=D} out: {a=ID} + v(val a: A) INIT: in: {} out: {} + magic[FAKE_INITIALIZER](val a: A) -> INIT: in: {} out: {} + w(a|) INIT: in: {} out: {} L1: - INIT: in: {a=ID} out: {a=ID} + INIT: in: {} out: {} error: sink: - USE: in: {} out: {} + USE: in: {} out: {} ===================== == TestObjectLiteral == class TestObjectLiteral { @@ -80,28 +80,28 @@ class TestObjectLiteral { --------------------- L0: 1 INIT: in: {} out: {} - v(val obj: A = object: A(obj) { init { val x = obj } fun foo() { val y = obj } }) INIT: in: {} out: {obj=D} - mark(object: A(obj) { init { val x = obj } fun foo() { val y = obj } }) INIT: in: {obj=D} out: {obj=D} + v(val obj: A = object: A(obj) { init { val x = obj } fun foo() { val y = obj } }) INIT: in: {} out: {} + mark(object: A(obj) { init { val x = obj } fun foo() { val y = obj } }) INIT: in: {} out: {} magic[IMPLICIT_RECEIVER](obj) -> r(obj|) -> mark(A(obj)) call(A(obj), |) -> 2 mark({ val x = obj }) - v(val x = obj) INIT: in: {obj=D} out: {obj=D, x=D} - magic[IMPLICIT_RECEIVER](obj) -> INIT: in: {obj=D, x=D} out: {obj=D, x=D} + v(val x = obj) INIT: in: {} out: {} + magic[IMPLICIT_RECEIVER](obj) -> INIT: in: {} out: {} r(obj|) -> - w(x|) INIT: in: {obj=D, x=D} out: {obj=D, x=ID} - 1 jmp?(L2) INIT: in: {obj=D, x=ID} out: {obj=D, x=ID} - d(fun foo() { val y = obj }) INIT: in: {obj=D, x=ID, y=ID} out: {obj=D, x=ID, y=ID} + w(x|) INIT: in: {} out: {} + 1 jmp?(L2) INIT: in: {} out: {} + d(fun foo() { val y = obj }) INIT: in: {} out: {} L2 [after local declaration]: r(object: A(obj) { init { val x = obj } fun foo() { val y = obj } }) -> - w(obj|) INIT: in: {obj=D, x=ID, y=ID} out: {obj=ID, x=ID, y=ID} + w(obj|) INIT: in: {} out: {} L1: - INIT: in: {obj=ID, x=ID, y=ID} out: {obj=ID, x=ID, y=ID} + INIT: in: {} out: {} error: sink: - USE: in: {obj=READ} out: {obj=READ} + USE: in: {} out: {} ===================== == foo == fun foo() { @@ -109,18 +109,18 @@ fun foo() { } --------------------- L3: - 2 INIT: in: {obj=D, x=ID} out: {obj=D, x=ID} + 2 INIT: in: {} out: {} 3 mark({ val y = obj }) - v(val y = obj) INIT: in: {obj=D, x=ID} out: {obj=D, x=ID, y=D} - magic[IMPLICIT_RECEIVER](obj) -> INIT: in: {obj=D, x=ID, y=D} out: {obj=D, x=ID, y=D} + v(val y = obj) INIT: in: {} out: {} + magic[IMPLICIT_RECEIVER](obj) -> INIT: in: {} out: {} r(obj|) -> - w(y|) INIT: in: {obj=D, x=ID, y=D} out: {obj=D, x=ID, y=ID} + w(y|) INIT: in: {} out: {} L4: - 2 INIT: in: {obj=D, x=ID, y=ID} out: {obj=D, x=ID, y=ID} + 2 INIT: in: {} out: {} error: sink: - USE: in: {obj=READ} out: {obj=READ} + USE: in: {} out: {} ===================== == TestOther == class TestOther { @@ -129,17 +129,17 @@ class TestOther { --------------------- L0: 1 INIT: in: {} out: {} - v(val x: Int = x + 1) INIT: in: {} out: {x=D} - magic[IMPLICIT_RECEIVER](x) -> INIT: in: {x=D} out: {x=D} + v(val x: Int = x + 1) INIT: in: {} out: {} + magic[IMPLICIT_RECEIVER](x) -> INIT: in: {} out: {} r(x|) -> r(1) -> mark(x + 1) call(x + 1, plus|, ) -> - w(x|) INIT: in: {x=D} out: {x=ID} + w(x|) INIT: in: {} out: {} L1: - INIT: in: {x=ID} out: {x=ID} + INIT: in: {} out: {} error: sink: - USE: in: {x=READ} out: {x=READ} + USE: in: {} out: {} ===================== diff --git a/compiler/testData/cfg-variables/bugs/varInitializationInIfInCycle.instructions b/compiler/testData/cfg-variables/bugs/varInitializationInIfInCycle.instructions index d5bd6fcf516..90cc8f2a78b 100644 --- a/compiler/testData/cfg-variables/bugs/varInitializationInIfInCycle.instructions +++ b/compiler/testData/cfg-variables/bugs/varInitializationInIfInCycle.instructions @@ -15,72 +15,72 @@ fun foo(numbers: Collection) { --------------------- L0: 1 INIT: in: {} out: {} - v(numbers: Collection) INIT: in: {} out: {numbers=D} - magic[FAKE_INITIALIZER](numbers: Collection) -> INIT: in: {numbers=D} out: {numbers=D} - w(numbers|) INIT: in: {numbers=D} out: {numbers=ID} - 2 mark({ for (i in numbers) { val b: Boolean if (1 < 2) { b = false } else { b = true } use(b) continue } }) INIT: in: {numbers=ID} out: {numbers=ID} + v(numbers: Collection) INIT: in: {} out: {} + magic[FAKE_INITIALIZER](numbers: Collection) -> INIT: in: {} out: {} + w(numbers|) INIT: in: {} out: {} + 2 mark({ for (i in numbers) { val b: Boolean if (1 < 2) { b = false } else { b = true } use(b) continue } }) INIT: in: {} out: {} 3 r(numbers) -> mark(numbers) call(numbers, iterator|) -> - v(i) INIT: in: {numbers=ID} out: {i=D, numbers=ID} + v(i) INIT: in: {} out: {} L2 [loop entry point]: L6 [condition entry point]: - mark(numbers) INIT: in: {i=D, numbers=ID} out: {i=D, numbers=ID} + mark(numbers) INIT: in: {} out: {} call(numbers, hasNext) -> jmp?(L3) mark(numbers) call(numbers, next) -> magic[LOOP_RANGE_ITERATION](numbers|) -> - w(i|) INIT: in: {i=D, numbers=ID} out: {i=ID, numbers=ID} - mark(for (i in numbers) { val b: Boolean if (1 < 2) { b = false } else { b = true } use(b) continue }) INIT: in: {i=ID, numbers=ID} out: {i=ID, numbers=ID} USE: in: {numbers=READ} out: {numbers=READ} + w(i|) INIT: in: {} out: {} + mark(for (i in numbers) { val b: Boolean if (1 < 2) { b = false } else { b = true } use(b) continue }) INIT: in: {} out: {} USE: in: {} out: {} L4 [body entry point]: 4 mark({ val b: Boolean if (1 < 2) { b = false } else { b = true } use(b) continue }) - v(val b: Boolean) INIT: in: {i=ID, numbers=ID} out: {b=D, i=ID, numbers=ID} - mark(if (1 < 2) { b = false } else { b = true }) INIT: in: {b=D, i=ID, numbers=ID} out: {b=D, i=ID, numbers=ID} + v(val b: Boolean) INIT: in: {} out: {b=D} + mark(if (1 < 2) { b = false } else { b = true }) INIT: in: {b=D} out: {b=D} r(1) -> r(2) -> mark(1 < 2) call(1 < 2, compareTo|, ) -> jf(L7|) 5 mark({ b = false }) - r(false) -> USE: in: {b=WRITTEN_AFTER_READ, numbers=READ} out: {b=WRITTEN_AFTER_READ, numbers=READ} - w(b|) INIT: in: {b=D, i=ID, numbers=ID} out: {b=ID, i=ID, numbers=ID} USE: in: {b=READ, numbers=READ} out: {b=WRITTEN_AFTER_READ, numbers=READ} - 4 jmp(L8) INIT: in: {b=ID, i=ID, numbers=ID} out: {b=ID, i=ID, numbers=ID} USE: in: {b=READ, numbers=READ} out: {b=READ, numbers=READ} + r(false) -> USE: in: {b=WRITTEN_AFTER_READ} out: {b=WRITTEN_AFTER_READ} + w(b|) INIT: in: {b=D} out: {b=ID} USE: in: {b=READ} out: {b=WRITTEN_AFTER_READ} + 4 jmp(L8) INIT: in: {b=ID} out: {b=ID} USE: in: {b=READ} out: {b=READ} L7 [else branch]: - 5 mark({ b = true }) INIT: in: {b=D, i=ID, numbers=ID} out: {b=D, i=ID, numbers=ID} - r(true) -> USE: in: {b=WRITTEN_AFTER_READ, numbers=READ} out: {b=WRITTEN_AFTER_READ, numbers=READ} - w(b|) INIT: in: {b=D, i=ID, numbers=ID} out: {b=ID, i=ID, numbers=ID} USE: in: {b=READ, numbers=READ} out: {b=WRITTEN_AFTER_READ, numbers=READ} + 5 mark({ b = true }) INIT: in: {b=D} out: {b=D} + r(true) -> USE: in: {b=WRITTEN_AFTER_READ} out: {b=WRITTEN_AFTER_READ} + w(b|) INIT: in: {b=D} out: {b=ID} USE: in: {b=READ} out: {b=WRITTEN_AFTER_READ} L8 ['if' expression result]: - 4 merge(if (1 < 2) { b = false } else { b = true }|!, !) -> INIT: in: {b=ID, i=ID, numbers=ID} out: {b=ID, i=ID, numbers=ID} USE: in: {b=READ, numbers=READ} out: {b=READ, numbers=READ} - r(b) -> USE: in: {numbers=READ} out: {b=READ, numbers=READ} + 4 merge(if (1 < 2) { b = false } else { b = true }|!, !) -> INIT: in: {b=ID} out: {b=ID} USE: in: {b=READ} out: {b=READ} + r(b) -> USE: in: {} out: {b=READ} mark(use(b)) call(use(b), use|) -> - jmp(L6) USE: in: {numbers=READ} out: {numbers=READ} + jmp(L6) USE: in: {} out: {} - 3 jmp(L2) L3 [loop exit point]: L5 [body exit point]: - read (Unit) INIT: in: {i=ID, numbers=ID} out: {i=ID, numbers=ID} + read (Unit) INIT: in: {} out: {} L1: 1 error: sink: - USE: in: {numbers=READ} out: {numbers=READ} + USE: in: {} out: {} ===================== == use == fun use(vararg a: Any?) = a --------------------- L0: 1 INIT: in: {} out: {} - v(vararg a: Any?) INIT: in: {} out: {a=D} - magic[FAKE_INITIALIZER](vararg a: Any?) -> INIT: in: {a=D} out: {a=D} - w(a|) INIT: in: {a=D} out: {a=ID} - r(a) -> INIT: in: {a=ID} out: {a=ID} + v(vararg a: Any?) INIT: in: {} out: {} + magic[FAKE_INITIALIZER](vararg a: Any?) -> INIT: in: {} out: {} + w(a|) INIT: in: {} out: {} + r(a) -> INIT: in: {} out: {} ret(*|) L1 L1: error: sink: - USE: in: {a=READ} out: {a=READ} + USE: in: {} out: {} ===================== diff --git a/compiler/testData/cfg-variables/lexicalScopes/forScope.instructions b/compiler/testData/cfg-variables/lexicalScopes/forScope.instructions index b35b6d17eec..d82f2aac219 100644 --- a/compiler/testData/cfg-variables/lexicalScopes/forScope.instructions +++ b/compiler/testData/cfg-variables/lexicalScopes/forScope.instructions @@ -18,23 +18,23 @@ L0: call(1..10, rangeTo|, ) -> mark(1..10) call(1..10, iterator|) -> - v(i) INIT: in: {} out: {i=D} + v(i) INIT: in: {} out: {} L2 [loop entry point]: L6 [condition entry point]: - mark(1..10) INIT: in: {i=D} out: {i=D} + mark(1..10) INIT: in: {} out: {} call(1..10, hasNext) -> jmp?(L3) mark(1..10) call(1..10, next) -> magic[LOOP_RANGE_ITERATION](1..10|) -> - w(i|) INIT: in: {i=D} out: {i=ID} - mark(for (i in 1..10) { val a = i }) INIT: in: {i=ID} out: {i=ID} + w(i|) INIT: in: {} out: {} + mark(for (i in 1..10) { val a = i }) INIT: in: {} out: {} L4 [body entry point]: 4 mark({ val a = i }) - v(val a = i) INIT: in: {i=ID} out: {a=D, i=ID} - r(i) -> INIT: in: {a=D, i=ID} out: {a=D, i=ID} - w(a|) INIT: in: {a=D, i=ID} out: {a=ID, i=ID} - 3 jmp(L2) INIT: in: {a=ID, i=ID} out: {a=ID, i=ID} + v(val a = i) INIT: in: {} out: {} + r(i) -> INIT: in: {} out: {} + w(a|) INIT: in: {} out: {} + 3 jmp(L2) INIT: in: {} out: {} L3 [loop exit point]: L5 [body exit point]: read (Unit) @@ -45,5 +45,5 @@ L1: error: sink: - USE: in: {i=READ} out: {i=READ} + USE: in: {} out: {} ===================== diff --git a/compiler/testData/cfg-variables/lexicalScopes/functionLiteralScope.instructions b/compiler/testData/cfg-variables/lexicalScopes/functionLiteralScope.instructions index a2f2b273c00..cf296215eb8 100644 --- a/compiler/testData/cfg-variables/lexicalScopes/functionLiteralScope.instructions +++ b/compiler/testData/cfg-variables/lexicalScopes/functionLiteralScope.instructions @@ -13,24 +13,24 @@ L0: 2 mark({ "before" val b = 1 val f = { x: Int -> val a = x + b } "after" }) mark("before") r("before") -> - v(val b = 1) INIT: in: {} out: {b=D} - r(1) -> INIT: in: {b=D} out: {b=D} - w(b|) INIT: in: {b=D} out: {b=ID} - v(val f = { x: Int -> val a = x + b }) INIT: in: {b=ID} out: {b=ID, f=D} - mark({ x: Int -> val a = x + b }) INIT: in: {b=ID, f=D} out: {b=ID, f=D} + v(val b = 1) INIT: in: {} out: {} + r(1) -> INIT: in: {} out: {} + w(b|) INIT: in: {} out: {} + v(val f = { x: Int -> val a = x + b }) INIT: in: {} out: {} + mark({ x: Int -> val a = x + b }) INIT: in: {} out: {} jmp?(L2) - d({ x: Int -> val a = x + b }) INIT: in: {a=ID, b=ID, f=D, x=ID} out: {a=ID, b=ID, f=D, x=ID} + d({ x: Int -> val a = x + b }) INIT: in: {} out: {} L2 [after local declaration]: r({ x: Int -> val a = x + b }) -> - w(f|) INIT: in: {a=ID, b=ID, f=D, x=ID} out: {a=ID, b=ID, f=ID, x=ID} - mark("after") INIT: in: {a=ID, b=ID, f=ID, x=ID} out: {a=ID, b=ID, f=ID, x=ID} + w(f|) INIT: in: {} out: {} + mark("after") INIT: in: {} out: {} r("after") -> L1: 1 error: sink: - USE: in: {b=READ, x=READ} out: {b=READ, x=READ} + USE: in: {} out: {} ===================== == anonymous_0 == { x: Int -> @@ -38,21 +38,21 @@ sink: } --------------------- L3: - 3 INIT: in: {b=ID, f=D} out: {b=ID, f=D} - v(x: Int) INIT: in: {b=ID, f=D} out: {b=ID, f=D, x=D} - magic[FAKE_INITIALIZER](x: Int) -> INIT: in: {b=ID, f=D, x=D} out: {b=ID, f=D, x=D} - w(x|) INIT: in: {b=ID, f=D, x=D} out: {b=ID, f=D, x=ID} - 4 mark(val a = x + b) INIT: in: {b=ID, f=D, x=ID} out: {b=ID, f=D, x=ID} - v(val a = x + b) INIT: in: {b=ID, f=D, x=ID} out: {a=D, b=ID, f=D, x=ID} - r(x) -> INIT: in: {a=D, b=ID, f=D, x=ID} out: {a=D, b=ID, f=D, x=ID} + 3 INIT: in: {} out: {} + v(x: Int) INIT: in: {} out: {} + magic[FAKE_INITIALIZER](x: Int) -> INIT: in: {} out: {} + w(x|) INIT: in: {} out: {} + 4 mark(val a = x + b) INIT: in: {} out: {} + v(val a = x + b) INIT: in: {} out: {} + r(x) -> INIT: in: {} out: {} r(b) -> mark(x + b) call(x + b, plus|, ) -> - w(a|) INIT: in: {a=D, b=ID, f=D, x=ID} out: {a=ID, b=ID, f=D, x=ID} + w(a|) INIT: in: {} out: {} L4: - 3 INIT: in: {a=ID, b=ID, f=D, x=ID} out: {a=ID, b=ID, f=D, x=ID} + 3 INIT: in: {} out: {} error: sink: - USE: in: {b=READ, x=READ} out: {b=READ, x=READ} + USE: in: {} out: {} ===================== diff --git a/compiler/testData/cfg-variables/lexicalScopes/ifScope.instructions b/compiler/testData/cfg-variables/lexicalScopes/ifScope.instructions index dc8eab83f12..b8680fc8589 100644 --- a/compiler/testData/cfg-variables/lexicalScopes/ifScope.instructions +++ b/compiler/testData/cfg-variables/lexicalScopes/ifScope.instructions @@ -19,17 +19,17 @@ L0: r(true) -> jf(L2|) 3 mark({ val a = 1 }) - v(val a = 1) INIT: in: {} out: {a=D} - r(1) -> INIT: in: {a=D} out: {a=D} - w(a|) INIT: in: {a=D} out: {a=ID} - 2 jmp(L3) INIT: in: {a=ID} out: {a=ID} + v(val a = 1) INIT: in: {} out: {} + r(1) -> INIT: in: {} out: {} + w(a|) INIT: in: {} out: {} + 2 jmp(L3) INIT: in: {} out: {} L2 [else branch]: 3 mark({ val b = 2 }) - v(val b = 2) INIT: in: {a=ID} out: {a=ID, b=D} - r(2) -> INIT: in: {a=ID, b=D} out: {a=ID, b=D} - w(b|) INIT: in: {a=ID, b=D} out: {a=ID, b=ID} + v(val b = 2) INIT: in: {} out: {} + r(2) -> INIT: in: {} out: {} + w(b|) INIT: in: {} out: {} L3 ['if' expression result]: - 2 merge(if (true) { val a = 1 } else { val b = 2 }|!, !) -> INIT: in: {a=ID, b=ID} out: {a=ID, b=ID} + 2 merge(if (true) { val a = 1 } else { val b = 2 }|!, !) -> INIT: in: {} out: {} mark("after") r("after") -> L1: @@ -37,5 +37,5 @@ L1: error: sink: - USE: in: {} out: {} + USE: in: {} out: {} ===================== diff --git a/compiler/testData/cfg-variables/lexicalScopes/localClass.instructions b/compiler/testData/cfg-variables/lexicalScopes/localClass.instructions index 19bc56d1c05..e4568fcd064 100644 --- a/compiler/testData/cfg-variables/lexicalScopes/localClass.instructions +++ b/compiler/testData/cfg-variables/lexicalScopes/localClass.instructions @@ -18,16 +18,16 @@ L0: mark("before") r("before") -> jmp?(L2) - v(val x: Int) INIT: in: {} out: {x=D} - magic[FAKE_INITIALIZER](val x: Int) -> INIT: in: {x=D} out: {x=D} - w(x|) INIT: in: {x=D} out: {x=ID} - 3 mark({ val a = x }) INIT: in: {x=ID} out: {x=ID} - v(val a = x) INIT: in: {x=ID} out: {a=D, x=ID} - magic[IMPLICIT_RECEIVER](x) -> INIT: in: {a=D, x=ID} out: {a=D, x=ID} + v(val x: Int) INIT: in: {} out: {} + magic[FAKE_INITIALIZER](val x: Int) -> INIT: in: {} out: {} + w(x|) INIT: in: {} out: {} + 3 mark({ val a = x }) INIT: in: {} out: {} + v(val a = x) INIT: in: {} out: {} + magic[IMPLICIT_RECEIVER](x) -> INIT: in: {} out: {} r(x|) -> - w(a|) INIT: in: {a=D, x=ID} out: {a=ID, x=ID} - 2 jmp?(L3) INIT: in: {a=ID, x=ID} out: {a=ID, x=ID} - d(fun foo() { val b = x }) INIT: in: {a=ID, b=ID, x=ID} out: {a=ID, b=ID, x=ID} + w(a|) INIT: in: {} out: {} + 2 jmp?(L3) INIT: in: {} out: {} + d(fun foo() { val b = x }) INIT: in: {} out: {} L2 [after local class]: L3 [after local declaration]: mark("after") @@ -37,7 +37,7 @@ L1: error: sink: - USE: in: {} out: {} + USE: in: {} out: {} ===================== == foo == fun foo() { @@ -45,16 +45,16 @@ fun foo() { } --------------------- L4: - 3 INIT: in: {a=ID, x=ID} out: {a=ID, x=ID} + 3 INIT: in: {} out: {} 4 mark({ val b = x }) - v(val b = x) INIT: in: {a=ID, x=ID} out: {a=ID, b=D, x=ID} - magic[IMPLICIT_RECEIVER](x) -> INIT: in: {a=ID, b=D, x=ID} out: {a=ID, b=D, x=ID} + v(val b = x) INIT: in: {} out: {} + magic[IMPLICIT_RECEIVER](x) -> INIT: in: {} out: {} r(x|) -> - w(b|) INIT: in: {a=ID, b=D, x=ID} out: {a=ID, b=ID, x=ID} + w(b|) INIT: in: {} out: {} L5: - 3 INIT: in: {a=ID, b=ID, x=ID} out: {a=ID, b=ID, x=ID} + 3 INIT: in: {} out: {} error: sink: - USE: in: {} out: {} + USE: in: {} out: {} ===================== diff --git a/compiler/testData/cfg-variables/lexicalScopes/localFunctionScope.instructions b/compiler/testData/cfg-variables/lexicalScopes/localFunctionScope.instructions index 8985d98c48e..14a16c62a41 100644 --- a/compiler/testData/cfg-variables/lexicalScopes/localFunctionScope.instructions +++ b/compiler/testData/cfg-variables/lexicalScopes/localFunctionScope.instructions @@ -13,11 +13,11 @@ L0: 2 mark({ "before" val b = 1 fun local(x: Int) { val a = x + b } "after" }) mark("before") r("before") -> - v(val b = 1) INIT: in: {} out: {b=D} - r(1) -> INIT: in: {b=D} out: {b=D} - w(b|) INIT: in: {b=D} out: {b=ID} - jmp?(L2) INIT: in: {b=ID} out: {b=ID} - d(fun local(x: Int) { val a = x + b }) INIT: in: {a=ID, b=ID, x=ID} out: {a=ID, b=ID, x=ID} + v(val b = 1) INIT: in: {} out: {} + r(1) -> INIT: in: {} out: {} + w(b|) INIT: in: {} out: {} + jmp?(L2) INIT: in: {} out: {} + d(fun local(x: Int) { val a = x + b }) INIT: in: {} out: {} L2 [after local declaration]: mark("after") r("after") -> @@ -26,7 +26,7 @@ L1: error: sink: - USE: in: {b=READ, x=READ} out: {b=READ, x=READ} + USE: in: {} out: {} ===================== == local == fun local(x: Int) { @@ -34,21 +34,21 @@ fun local(x: Int) { } --------------------- L3: - 3 INIT: in: {b=ID} out: {b=ID} - v(x: Int) INIT: in: {b=ID} out: {b=ID, x=D} - magic[FAKE_INITIALIZER](x: Int) -> INIT: in: {b=ID, x=D} out: {b=ID, x=D} - w(x|) INIT: in: {b=ID, x=D} out: {b=ID, x=ID} - 4 mark({ val a = x + b }) INIT: in: {b=ID, x=ID} out: {b=ID, x=ID} - v(val a = x + b) INIT: in: {b=ID, x=ID} out: {a=D, b=ID, x=ID} - r(x) -> INIT: in: {a=D, b=ID, x=ID} out: {a=D, b=ID, x=ID} + 3 INIT: in: {} out: {} + v(x: Int) INIT: in: {} out: {} + magic[FAKE_INITIALIZER](x: Int) -> INIT: in: {} out: {} + w(x|) INIT: in: {} out: {} + 4 mark({ val a = x + b }) INIT: in: {} out: {} + v(val a = x + b) INIT: in: {} out: {} + r(x) -> INIT: in: {} out: {} r(b) -> mark(x + b) call(x + b, plus|, ) -> - w(a|) INIT: in: {a=D, b=ID, x=ID} out: {a=ID, b=ID, x=ID} + w(a|) INIT: in: {} out: {} L4: - 3 INIT: in: {a=ID, b=ID, x=ID} out: {a=ID, b=ID, x=ID} + 3 INIT: in: {} out: {} error: sink: - USE: in: {b=READ, x=READ} out: {b=READ, x=READ} + USE: in: {} out: {} ===================== diff --git a/compiler/testData/cfg-variables/lexicalScopes/localFunctionScopeWithoutBody.instructions b/compiler/testData/cfg-variables/lexicalScopes/localFunctionScopeWithoutBody.instructions index 41024162bf8..8110cefbaf0 100644 --- a/compiler/testData/cfg-variables/lexicalScopes/localFunctionScopeWithoutBody.instructions +++ b/compiler/testData/cfg-variables/lexicalScopes/localFunctionScopeWithoutBody.instructions @@ -11,11 +11,11 @@ L0: 2 mark({ "before" val b = 1 fun local(x: Int) = x + b "after" }) mark("before") r("before") -> - v(val b = 1) INIT: in: {} out: {b=D} - r(1) -> INIT: in: {b=D} out: {b=D} - w(b|) INIT: in: {b=D} out: {b=ID} - jmp?(L2) INIT: in: {b=ID} out: {b=ID} - d(fun local(x: Int) = x + b) INIT: in: {b=ID, x=ID} out: {b=ID, x=ID} + v(val b = 1) INIT: in: {} out: {} + r(1) -> INIT: in: {} out: {} + w(b|) INIT: in: {} out: {} + jmp?(L2) INIT: in: {} out: {} + d(fun local(x: Int) = x + b) INIT: in: {} out: {} L2 [after local declaration]: mark("after") r("after") -> @@ -24,17 +24,17 @@ L1: error: sink: - USE: in: {b=READ, x=READ} out: {b=READ, x=READ} + USE: in: {} out: {} ===================== == local == fun local(x: Int) = x + b --------------------- L3: - 3 INIT: in: {b=ID} out: {b=ID} - v(x: Int) INIT: in: {b=ID} out: {b=ID, x=D} - magic[FAKE_INITIALIZER](x: Int) -> INIT: in: {b=ID, x=D} out: {b=ID, x=D} - w(x|) INIT: in: {b=ID, x=D} out: {b=ID, x=ID} - r(x) -> INIT: in: {b=ID, x=ID} out: {b=ID, x=ID} + 3 INIT: in: {} out: {} + v(x: Int) INIT: in: {} out: {} + magic[FAKE_INITIALIZER](x: Int) -> INIT: in: {} out: {} + w(x|) INIT: in: {} out: {} + r(x) -> INIT: in: {} out: {} r(b) -> mark(x + b) call(x + b, plus|, ) -> @@ -44,5 +44,5 @@ L4: error: sink: - USE: in: {b=READ, x=READ} out: {b=READ, x=READ} + USE: in: {} out: {} ===================== diff --git a/compiler/testData/cfg-variables/lexicalScopes/localObject.instructions b/compiler/testData/cfg-variables/lexicalScopes/localObject.instructions index 3be2504c57f..9d654cdedeb 100644 --- a/compiler/testData/cfg-variables/lexicalScopes/localObject.instructions +++ b/compiler/testData/cfg-variables/lexicalScopes/localObject.instructions @@ -19,11 +19,11 @@ L0: r("before") -> jmp?(L2) 3 mark({ val a = 1 }) - v(val a = 1) INIT: in: {} out: {a=D} - r(1) -> INIT: in: {a=D} out: {a=D} - w(a|) INIT: in: {a=D} out: {a=ID} - 2 jmp?(L3) INIT: in: {a=ID} out: {a=ID} - d(fun foo() { val b = 2 }) INIT: in: {a=ID, b=ID} out: {a=ID, b=ID} + v(val a = 1) INIT: in: {} out: {} + r(1) -> INIT: in: {} out: {} + w(a|) INIT: in: {} out: {} + 2 jmp?(L3) INIT: in: {} out: {} + d(fun foo() { val b = 2 }) INIT: in: {} out: {} L2 [after local class]: L3 [after local declaration]: mark("after") @@ -33,7 +33,7 @@ L1: error: sink: - USE: in: {} out: {} + USE: in: {} out: {} ===================== == foo == fun foo() { @@ -41,15 +41,15 @@ fun foo() { } --------------------- L4: - 3 INIT: in: {a=ID} out: {a=ID} + 3 INIT: in: {} out: {} 4 mark({ val b = 2 }) - v(val b = 2) INIT: in: {a=ID} out: {a=ID, b=D} - r(2) -> INIT: in: {a=ID, b=D} out: {a=ID, b=D} - w(b|) INIT: in: {a=ID, b=D} out: {a=ID, b=ID} + v(val b = 2) INIT: in: {} out: {} + r(2) -> INIT: in: {} out: {} + w(b|) INIT: in: {} out: {} L5: - 3 INIT: in: {a=ID, b=ID} out: {a=ID, b=ID} + 3 INIT: in: {} out: {} error: sink: - USE: in: {} out: {} + USE: in: {} out: {} ===================== diff --git a/compiler/testData/cfg-variables/lexicalScopes/objectLiteralScope.instructions b/compiler/testData/cfg-variables/lexicalScopes/objectLiteralScope.instructions index 0b801e86894..3d6ce75fad7 100644 --- a/compiler/testData/cfg-variables/lexicalScopes/objectLiteralScope.instructions +++ b/compiler/testData/cfg-variables/lexicalScopes/objectLiteralScope.instructions @@ -17,25 +17,25 @@ L0: 2 mark({ "before" val bar = object { init { val x = 1 } fun foo() { val a = 2 } } "after" }) mark("before") r("before") -> - v(val bar = object { init { val x = 1 } fun foo() { val a = 2 } }) INIT: in: {} out: {bar=D} - mark(object { init { val x = 1 } fun foo() { val a = 2 } }) INIT: in: {bar=D} out: {bar=D} + v(val bar = object { init { val x = 1 } fun foo() { val a = 2 } }) INIT: in: {} out: {} + mark(object { init { val x = 1 } fun foo() { val a = 2 } }) INIT: in: {} out: {} 3 mark({ val x = 1 }) - v(val x = 1) INIT: in: {bar=D} out: {bar=D, x=D} - r(1) -> INIT: in: {bar=D, x=D} out: {bar=D, x=D} - w(x|) INIT: in: {bar=D, x=D} out: {bar=D, x=ID} - 2 jmp?(L2) INIT: in: {bar=D, x=ID} out: {bar=D, x=ID} - d(fun foo() { val a = 2 }) INIT: in: {a=ID, bar=D, x=ID} out: {a=ID, bar=D, x=ID} + v(val x = 1) INIT: in: {} out: {} + r(1) -> INIT: in: {} out: {} + w(x|) INIT: in: {} out: {} + 2 jmp?(L2) INIT: in: {} out: {} + d(fun foo() { val a = 2 }) INIT: in: {} out: {} L2 [after local declaration]: r(object { init { val x = 1 } fun foo() { val a = 2 } }) -> - w(bar|) INIT: in: {a=ID, bar=D, x=ID} out: {a=ID, bar=ID, x=ID} - mark("after") INIT: in: {a=ID, bar=ID, x=ID} out: {a=ID, bar=ID, x=ID} + w(bar|) INIT: in: {} out: {} + mark("after") INIT: in: {} out: {} r("after") -> L1: 1 error: sink: - USE: in: {} out: {} + USE: in: {} out: {} ===================== == foo == fun foo() { @@ -43,15 +43,15 @@ fun foo() { } --------------------- L3: - 3 INIT: in: {bar=D, x=ID} out: {bar=D, x=ID} + 3 INIT: in: {} out: {} 4 mark({ val a = 2 }) - v(val a = 2) INIT: in: {bar=D, x=ID} out: {a=D, bar=D, x=ID} - r(2) -> INIT: in: {a=D, bar=D, x=ID} out: {a=D, bar=D, x=ID} - w(a|) INIT: in: {a=D, bar=D, x=ID} out: {a=ID, bar=D, x=ID} + v(val a = 2) INIT: in: {} out: {} + r(2) -> INIT: in: {} out: {} + w(a|) INIT: in: {} out: {} L4: - 3 INIT: in: {a=ID, bar=D, x=ID} out: {a=ID, bar=D, x=ID} + 3 INIT: in: {} out: {} error: sink: - USE: in: {} out: {} + USE: in: {} out: {} ===================== diff --git a/compiler/testData/cfg-variables/lexicalScopes/propertyAccessorScope.instructions b/compiler/testData/cfg-variables/lexicalScopes/propertyAccessorScope.instructions index abe4cd0ad49..249f2d881f6 100644 --- a/compiler/testData/cfg-variables/lexicalScopes/propertyAccessorScope.instructions +++ b/compiler/testData/cfg-variables/lexicalScopes/propertyAccessorScope.instructions @@ -20,15 +20,15 @@ L0: d(get() { return field }) INIT: in: {a=I?} out: {a=I?} L3 [after local declaration]: jmp?(L6) INIT: in: {a=D} out: {a=D} - d(set(v: Int) { field = v }) INIT: in: {a=I?, v=ID} out: {a=I?, v=ID} + d(set(v: Int) { field = v }) INIT: in: {a=I?} out: {a=I?} L1: L2 [after local class]: L6 [after local declaration]: - 1 INIT: in: {v=ID} out: {v=ID} + 1 INIT: in: {} out: {} error: sink: - USE: in: {v=READ} out: {v=READ} + USE: in: {} out: {} ===================== == get_a == get() { @@ -45,7 +45,7 @@ L5: error: INIT: in: {} out: {} sink: - INIT: in: {a=I?} out: {a=I?} USE: in: {v=READ} out: {v=READ} + INIT: in: {a=I?} out: {a=I?} USE: in: {} out: {} ===================== == set_a == set(v: Int) { @@ -54,16 +54,16 @@ set(v: Int) { --------------------- L7: 3 INIT: in: {a=D} out: {a=D} - v(v: Int) INIT: in: {a=D} out: {a=D, v=D} - magic[FAKE_INITIALIZER](v: Int) -> INIT: in: {a=D, v=D} out: {a=D, v=D} - w(v|) INIT: in: {a=D, v=D} out: {a=D, v=ID} - 4 mark({ field = v }) INIT: in: {a=D, v=ID} out: {a=D, v=ID} + v(v: Int) INIT: in: {a=D} out: {a=D} + magic[FAKE_INITIALIZER](v: Int) -> INIT: in: {a=D} out: {a=D} + w(v|) INIT: in: {a=D} out: {a=D} + 4 mark({ field = v }) INIT: in: {a=D} out: {a=D} r(v) -> w(field|) L8: 3 error: - INIT: in: {v=ID} out: {v=ID} + INIT: in: {} out: {} sink: - INIT: in: {a=I?, v=ID} out: {a=I?, v=ID} USE: in: {v=READ} out: {v=READ} + INIT: in: {a=I?} out: {a=I?} USE: in: {} out: {} ===================== diff --git a/compiler/testData/cfg-variables/lexicalScopes/tryScope.instructions b/compiler/testData/cfg-variables/lexicalScopes/tryScope.instructions index 7d0840b0d0f..ac9e198e8b6 100644 --- a/compiler/testData/cfg-variables/lexicalScopes/tryScope.instructions +++ b/compiler/testData/cfg-variables/lexicalScopes/tryScope.instructions @@ -28,24 +28,24 @@ L0: jmp?(L3) jmp(L4) L2 [onException]: - 3 v(e: Exception) INIT: in: {} out: {e=D} - magic[FAKE_INITIALIZER](e: Exception) -> INIT: in: {e=D} out: {e=D} - w(e|) INIT: in: {e=D} out: {e=ID} - 4 mark({ val a = e }) INIT: in: {e=ID} out: {e=ID} - v(val a = e) INIT: in: {e=ID} out: {a=D, e=ID} - r(e) -> INIT: in: {a=D, e=ID} out: {a=D, e=ID} - w(a|) INIT: in: {a=D, e=ID} out: {a=ID, e=ID} - 3 jmp(L4) INIT: in: {a=ID, e=ID} out: {a=ID, e=ID} + 3 v(e: Exception) INIT: in: {} out: {} + magic[FAKE_INITIALIZER](e: Exception) -> INIT: in: {} out: {} + w(e|) INIT: in: {} out: {} + 4 mark({ val a = e }) INIT: in: {} out: {} + v(val a = e) INIT: in: {} out: {} + r(e) -> INIT: in: {} out: {} + w(a|) INIT: in: {} out: {} + 3 jmp(L4) INIT: in: {} out: {} L4 [afterCatches]: 2 jmp(L5) L3 [onExceptionToFinallyBlock]: L6 [start finally]: 3 mark({ val a = 1 }) - v(val a = 1) INIT: in: {a=ID, e=ID} out: {a=D, a=ID, e=ID} - r(1) -> INIT: in: {a=D, a=ID, e=ID} out: {a=D, a=ID, e=ID} - w(a|) INIT: in: {a=D, a=ID, e=ID} out: {a=ID, a=ID, e=ID} + v(val a = 1) INIT: in: {} out: {} + r(1) -> INIT: in: {} out: {} + w(a|) INIT: in: {} out: {} L7 [finish finally]: - 2 jmp(error) INIT: in: {a=ID, a=ID, e=ID} out: {a=ID, a=ID, e=ID} + 2 jmp(error) INIT: in: {} out: {} L5 [skipFinallyToErrorBlock]: L8 [copy of L3, onExceptionToFinallyBlock]: 3 mark({ val a = 1 }) @@ -60,5 +60,5 @@ L1: error: sink: - USE: in: {e=READ} out: {e=READ} + USE: in: {} out: {} ===================== diff --git a/compiler/tests/org/jetbrains/kotlin/cfg/AbstractDataFlowTest.java b/compiler/tests/org/jetbrains/kotlin/cfg/AbstractDataFlowTest.java index 83e808752b8..58380e00b6e 100644 --- a/compiler/tests/org/jetbrains/kotlin/cfg/AbstractDataFlowTest.java +++ b/compiler/tests/org/jetbrains/kotlin/cfg/AbstractDataFlowTest.java @@ -45,7 +45,8 @@ public abstract class AbstractDataFlowTest extends AbstractPseudocodeTest { pseudocodeVariablesData.getVariableUseStatusData(); String initPrefix = " INIT:"; String usePrefix = " USE:"; - int initializersColumnWidth = countDataColumnWidth(initPrefix, pseudocode.getInstructionsIncludingDeadCode(), variableInitializers); + int initializersColumnWidth = countDataColumnWidth(initPrefix, pseudocode.getInstructionsIncludingDeadCode(), variableInitializers, + pseudocodeVariablesData); dumpInstructions(pseudocode, out, (instruction, next, prev) -> { StringBuilder result = new StringBuilder(); @@ -53,14 +54,14 @@ public abstract class AbstractDataFlowTest extends AbstractPseudocodeTest { Edges previousInitializersEdges = variableInitializers.get(prev); String initializersData = ""; if (initializersEdges != null && !initializersEdges.equals(previousInitializersEdges)) { - initializersData = dumpEdgesData(initPrefix, initializersEdges); + initializersData = dumpEdgesData(initPrefix, initializersEdges, pseudocodeVariablesData); } result.append(String.format("%1$-" + initializersColumnWidth + "s", initializersData)); Edges> useStatusEdges = useStatusData.get(instruction); Edges> nextUseStatusEdges = useStatusData.get(next); if (useStatusEdges != null && !useStatusEdges.equals(nextUseStatusEdges)) { - result.append(dumpEdgesData(usePrefix, useStatusEdges)); + result.append(dumpEdgesData(usePrefix, useStatusEdges, pseudocodeVariablesData)); } return result.toString(); }); @@ -69,13 +70,14 @@ public abstract class AbstractDataFlowTest extends AbstractPseudocodeTest { private static int countDataColumnWidth( @NotNull String prefix, @NotNull List instructions, - @NotNull Map> data + @NotNull Map> data, + @NotNull PseudocodeVariablesData variablesData ) { int maxWidth = 0; for (Instruction instruction : instructions) { Edges edges = data.get(instruction); if (edges == null) continue; - int length = dumpEdgesData(prefix, edges).length(); + int length = dumpEdgesData(prefix, edges, variablesData).length(); if (maxWidth < length) { maxWidth = length; } @@ -85,17 +87,27 @@ public abstract class AbstractDataFlowTest extends AbstractPseudocodeTest { } @NotNull - private static > String dumpEdgesData(String prefix, @NotNull Edges edges) { + private static > String dumpEdgesData( + String prefix, + @NotNull Edges edges, + @NotNull PseudocodeVariablesData variablesData + ) { return prefix + - " in: " + renderVariableMap(edges.getIncoming().asMap()) + - " out: " + renderVariableMap(edges.getOutgoing().asMap()); + " in: " + renderVariableMap(edges.getIncoming().asMap(), variablesData) + + " out: " + renderVariableMap(edges.getOutgoing().asMap(), variablesData); } - private static String renderVariableMap(javaslang.collection.Map map) { + private static String renderVariableMap( + javaslang.collection.Map map, + PseudocodeVariablesData variablesData + ) { List result = Lists.newArrayList(); for (Tuple2 entry : map) { VariableDescriptor variable = entry._1; S state = entry._2; + + if (variablesData.isVariableWithTrivialInitializer(variable)) continue; + result.add(variable.getName() + "=" + state); } Collections.sort(result); From 9aa25f8af8df96abeac77bc454c18340e5ae2363 Mon Sep 17 00:00:00 2001 From: Mikhail Glukhikh Date: Fri, 29 Sep 2017 14:27:42 +0300 Subject: [PATCH 182/212] Code cleanup: shadowed declarations filter --- .../idea/util/ShadowedDeclarationsFilter.kt | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/idea/ide-common/src/org/jetbrains/kotlin/idea/util/ShadowedDeclarationsFilter.kt b/idea/ide-common/src/org/jetbrains/kotlin/idea/util/ShadowedDeclarationsFilter.kt index e6f619c02b1..7f39da2367a 100644 --- a/idea/ide-common/src/org/jetbrains/kotlin/idea/util/ShadowedDeclarationsFilter.kt +++ b/idea/ide-common/src/org/jetbrains/kotlin/idea/util/ShadowedDeclarationsFilter.kt @@ -102,14 +102,13 @@ class ShadowedDeclarationsFilter( } } - private fun signature(descriptor: DeclarationDescriptor): Any { - return when (descriptor) { - is SimpleFunctionDescriptor -> FunctionSignature(descriptor) - is VariableDescriptor -> descriptor.name - is ClassDescriptor -> descriptor.importableFqName ?: descriptor - else -> descriptor - } - } + private fun signature(descriptor: DeclarationDescriptor): Any = + when (descriptor) { + is SimpleFunctionDescriptor -> FunctionSignature(descriptor) + is VariableDescriptor -> descriptor.name + is ClassDescriptor -> descriptor.importableFqName ?: descriptor + else -> descriptor + } private fun packageName(descriptor: DeclarationDescriptor) = descriptor.importableFqName?.parent() @@ -122,7 +121,7 @@ class ShadowedDeclarationsFilter( val first = descriptors.first() if (first is ClassDescriptor) { // for classes with the same FQ-name we simply take the first one - return listOf(first) + return listOf(first) } val isFunction = first is FunctionDescriptor @@ -203,7 +202,7 @@ class ShadowedDeclarationsFilter( val dataFlowInfo = bindingContext.getDataFlowInfoBefore(context) val context = BasicCallResolutionContext.create(bindingTrace, scope, newCall, TypeUtils.NO_EXPECTED_TYPE, dataFlowInfo, ContextDependency.INDEPENDENT, CheckArgumentTypesMode.CHECK_VALUE_ARGUMENTS, - false, resolutionFacade.frontendService()) + false, /* languageVersionSettings */ resolutionFacade.frontendService()) val callResolver = resolutionFacade.frontendService() val results = if (isFunction) callResolver.resolveFunctionCall(context) else callResolver.resolveSimpleProperty(context) val resultingDescriptors = results.resultingCalls.map { it.resultingDescriptor } From 912ddfcb2b18974c4846aa967fdb8c9b01d4ce91 Mon Sep 17 00:00:00 2001 From: Mikhail Glukhikh Date: Fri, 29 Sep 2017 15:27:35 +0300 Subject: [PATCH 183/212] Build name correctly in ShadowedDeclarationsFilter So #KT-16383 Fixed Also should fix EA-104812, EA-99338, EA-107064 --- .../kotlin/idea/util/ShadowedDeclarationsFilter.kt | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/idea/ide-common/src/org/jetbrains/kotlin/idea/util/ShadowedDeclarationsFilter.kt b/idea/ide-common/src/org/jetbrains/kotlin/idea/util/ShadowedDeclarationsFilter.kt index 7f39da2367a..c4dc9e1b312 100644 --- a/idea/ide-common/src/org/jetbrains/kotlin/idea/util/ShadowedDeclarationsFilter.kt +++ b/idea/ide-common/src/org/jetbrains/kotlin/idea/util/ShadowedDeclarationsFilter.kt @@ -118,14 +118,19 @@ class ShadowedDeclarationsFilter( ): Collection { if (descriptors.size == 1) return descriptors - val first = descriptors.first() + val first = descriptors.firstOrNull { + it is ClassDescriptor || it is ConstructorDescriptor || it is CallableDescriptor && !it.name.isSpecial + } ?: return descriptors if (first is ClassDescriptor) { // for classes with the same FQ-name we simply take the first one return listOf(first) } val isFunction = first is FunctionDescriptor - val name = first.name + val name = when (first) { + is ConstructorDescriptor -> first.constructedClass.name + else -> first.name + } val parameters = (first as CallableDescriptor).valueParameters val dummyArgumentExpressions = dummyExpressionFactory.createDummyExpressions(parameters.size) From 212132266502ebed5b19a3d91064868dd78ba051 Mon Sep 17 00:00:00 2001 From: Toshiaki Kameyama Date: Mon, 2 Oct 2017 05:11:29 +0300 Subject: [PATCH 184/212] Fix useless "Remove curly braces" before Chinese character So #KT-20409 Fixed --- .../org/jetbrains/kotlin/psi/psiUtil/ktPsiUtil.kt | 2 +- .../necessaryBrackets6.kt | 5 +++++ .../necessaryBrackets1.kt | 4 ++++ .../necessaryBrackets1.kt.after | 4 ++++ .../necessaryBrackets2.kt | 4 ++++ .../necessaryBrackets2.kt.after | 4 ++++ .../idea/intentions/IntentionTestGenerated.java | 6 ++++++ .../kotlin/idea/quickfix/QuickFixTestGenerated.java | 12 ++++++++++++ 8 files changed, 40 insertions(+), 1 deletion(-) create mode 100644 idea/testData/intentions/removeCurlyBracesFromTemplate/necessaryBrackets6.kt create mode 100644 idea/testData/quickfix/removeToStringInStringTemplate/necessaryBrackets1.kt create mode 100644 idea/testData/quickfix/removeToStringInStringTemplate/necessaryBrackets1.kt.after create mode 100644 idea/testData/quickfix/removeToStringInStringTemplate/necessaryBrackets2.kt create mode 100644 idea/testData/quickfix/removeToStringInStringTemplate/necessaryBrackets2.kt.after diff --git a/compiler/frontend/src/org/jetbrains/kotlin/psi/psiUtil/ktPsiUtil.kt b/compiler/frontend/src/org/jetbrains/kotlin/psi/psiUtil/ktPsiUtil.kt index ed8ac919e10..104e8a5e9a2 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/psi/psiUtil/ktPsiUtil.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/psi/psiUtil/ktPsiUtil.kt @@ -460,7 +460,7 @@ fun KtExpression.getOutermostParenthesizerOrThis(): KtExpression { fun PsiElement.isFunctionalExpression(): Boolean = this is KtNamedFunction && nameIdentifier == null -private val BAD_NEIGHBOUR_FOR_SIMPLE_TEMPLATE_ENTRY_PATTERN = Regex("[a-zA-Z0-9_].*") +private val BAD_NEIGHBOUR_FOR_SIMPLE_TEMPLATE_ENTRY_PATTERN = Regex("([a-zA-Z0-9_]|[^\\p{ASCII}]).*") fun canPlaceAfterSimpleNameEntry(element: PsiElement?): Boolean { val entryText = element?.text ?: return true diff --git a/idea/testData/intentions/removeCurlyBracesFromTemplate/necessaryBrackets6.kt b/idea/testData/intentions/removeCurlyBracesFromTemplate/necessaryBrackets6.kt new file mode 100644 index 00000000000..d2631e4010a --- /dev/null +++ b/idea/testData/intentions/removeCurlyBracesFromTemplate/necessaryBrackets6.kt @@ -0,0 +1,5 @@ +// IS_APPLICABLE: false +fun foo() { + val x = 3 + val y = "${x}コトリン" +} \ No newline at end of file diff --git a/idea/testData/quickfix/removeToStringInStringTemplate/necessaryBrackets1.kt b/idea/testData/quickfix/removeToStringInStringTemplate/necessaryBrackets1.kt new file mode 100644 index 00000000000..4724b5f36ed --- /dev/null +++ b/idea/testData/quickfix/removeToStringInStringTemplate/necessaryBrackets1.kt @@ -0,0 +1,4 @@ +// "Remove 'toString()' call" "true" + +val foo = "test" +val bar = "${foo.toString()}_" \ No newline at end of file diff --git a/idea/testData/quickfix/removeToStringInStringTemplate/necessaryBrackets1.kt.after b/idea/testData/quickfix/removeToStringInStringTemplate/necessaryBrackets1.kt.after new file mode 100644 index 00000000000..0bd3e81b843 --- /dev/null +++ b/idea/testData/quickfix/removeToStringInStringTemplate/necessaryBrackets1.kt.after @@ -0,0 +1,4 @@ +// "Remove 'toString()' call" "true" + +val foo = "test" +val bar = "${foo}_" \ No newline at end of file diff --git a/idea/testData/quickfix/removeToStringInStringTemplate/necessaryBrackets2.kt b/idea/testData/quickfix/removeToStringInStringTemplate/necessaryBrackets2.kt new file mode 100644 index 00000000000..e250e4ae303 --- /dev/null +++ b/idea/testData/quickfix/removeToStringInStringTemplate/necessaryBrackets2.kt @@ -0,0 +1,4 @@ +// "Remove 'toString()' call" "true" + +val foo = "test" +val bar = "${foo.toString()}コトリン" \ No newline at end of file diff --git a/idea/testData/quickfix/removeToStringInStringTemplate/necessaryBrackets2.kt.after b/idea/testData/quickfix/removeToStringInStringTemplate/necessaryBrackets2.kt.after new file mode 100644 index 00000000000..532875ac3c0 --- /dev/null +++ b/idea/testData/quickfix/removeToStringInStringTemplate/necessaryBrackets2.kt.after @@ -0,0 +1,4 @@ +// "Remove 'toString()' call" "true" + +val foo = "test" +val bar = "${foo}コトリン" \ No newline at end of file diff --git a/idea/tests/org/jetbrains/kotlin/idea/intentions/IntentionTestGenerated.java b/idea/tests/org/jetbrains/kotlin/idea/intentions/IntentionTestGenerated.java index 5ae9c43d843..2b59dad1718 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/intentions/IntentionTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/intentions/IntentionTestGenerated.java @@ -12620,6 +12620,12 @@ public class IntentionTestGenerated extends AbstractIntentionTest { doTest(fileName); } + @TestMetadata("necessaryBrackets6.kt") + public void testNecessaryBrackets6() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/intentions/removeCurlyBracesFromTemplate/necessaryBrackets6.kt"); + doTest(fileName); + } + @TestMetadata("unnecessaryBrackets1.kt") public void testUnnecessaryBrackets1() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("idea/testData/intentions/removeCurlyBracesFromTemplate/unnecessaryBrackets1.kt"); diff --git a/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java b/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java index 5c0631ba9f7..9c7ef95138d 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java @@ -8879,6 +8879,18 @@ public class QuickFixTestGenerated extends AbstractQuickFixTest { doTest(fileName); } + @TestMetadata("necessaryBrackets1.kt") + public void testNecessaryBrackets1() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/quickfix/removeToStringInStringTemplate/necessaryBrackets1.kt"); + doTest(fileName); + } + + @TestMetadata("necessaryBrackets2.kt") + public void testNecessaryBrackets2() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/quickfix/removeToStringInStringTemplate/necessaryBrackets2.kt"); + doTest(fileName); + } + @TestMetadata("simple.kt") public void testSimple() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("idea/testData/quickfix/removeToStringInStringTemplate/simple.kt"); From aabe23d41050336c89810c5c4d1f932956a2569a Mon Sep 17 00:00:00 2001 From: Alexey Sedunov Date: Mon, 2 Oct 2017 15:17:30 +0300 Subject: [PATCH 185/212] Minor: Fix coroutine package name in quick fix tests --- idea/testData/quickfix/modifiers/suspend/createCoroutine.kt | 4 ++-- .../quickfix/modifiers/suspend/createCoroutine.kt.after | 4 ++-- idea/testData/quickfix/modifiers/suspend/startCoroutine.kt | 4 ++-- .../quickfix/modifiers/suspend/startCoroutine.kt.after | 4 ++-- .../quickfix/modifiers/suspend/startCoroutineNoImport.kt | 2 +- .../modifiers/suspend/startCoroutineNoImport.kt.after | 2 +- 6 files changed, 10 insertions(+), 10 deletions(-) diff --git a/idea/testData/quickfix/modifiers/suspend/createCoroutine.kt b/idea/testData/quickfix/modifiers/suspend/createCoroutine.kt index 984458f7474..89d498d6b4a 100644 --- a/idea/testData/quickfix/modifiers/suspend/createCoroutine.kt +++ b/idea/testData/quickfix/modifiers/suspend/createCoroutine.kt @@ -1,8 +1,8 @@ // "Make block type suspend" "true" // WITH_RUNTIME -import kotlin.coroutines.suspendCoroutine -import kotlin.coroutines.createCoroutine +import kotlin.coroutines.experimental.suspendCoroutine +import kotlin.coroutines.experimental.createCoroutine suspend fun suspending(): T { val block: () -> T = { null!! } diff --git a/idea/testData/quickfix/modifiers/suspend/createCoroutine.kt.after b/idea/testData/quickfix/modifiers/suspend/createCoroutine.kt.after index 83cde5c4b0e..f9831d9518e 100644 --- a/idea/testData/quickfix/modifiers/suspend/createCoroutine.kt.after +++ b/idea/testData/quickfix/modifiers/suspend/createCoroutine.kt.after @@ -1,8 +1,8 @@ // "Make block type suspend" "true" // WITH_RUNTIME -import kotlin.coroutines.suspendCoroutine -import kotlin.coroutines.createCoroutine +import kotlin.coroutines.experimental.suspendCoroutine +import kotlin.coroutines.experimental.createCoroutine suspend fun suspending(): T { val block: suspend () -> T = { null!! } diff --git a/idea/testData/quickfix/modifiers/suspend/startCoroutine.kt b/idea/testData/quickfix/modifiers/suspend/startCoroutine.kt index f22becf7022..9649cc97386 100644 --- a/idea/testData/quickfix/modifiers/suspend/startCoroutine.kt +++ b/idea/testData/quickfix/modifiers/suspend/startCoroutine.kt @@ -1,7 +1,7 @@ // "Make block type suspend" "true" // WITH_RUNTIME -import kotlin.coroutines.suspendCoroutine -import kotlin.coroutines.startCoroutine +import kotlin.coroutines.experimental.suspendCoroutine +import kotlin.coroutines.experimental.startCoroutine suspend fun suspending(block: () -> T): T = suspendCoroutine { block.startCoroutine(it) } \ No newline at end of file diff --git a/idea/testData/quickfix/modifiers/suspend/startCoroutine.kt.after b/idea/testData/quickfix/modifiers/suspend/startCoroutine.kt.after index de1243cd7b7..f4d34393b5b 100644 --- a/idea/testData/quickfix/modifiers/suspend/startCoroutine.kt.after +++ b/idea/testData/quickfix/modifiers/suspend/startCoroutine.kt.after @@ -1,7 +1,7 @@ // "Make block type suspend" "true" // WITH_RUNTIME -import kotlin.coroutines.suspendCoroutine -import kotlin.coroutines.startCoroutine +import kotlin.coroutines.experimental.suspendCoroutine +import kotlin.coroutines.experimental.startCoroutine suspend fun suspending(block: suspend () -> T): T = suspendCoroutine { block.startCoroutine(it) } \ No newline at end of file diff --git a/idea/testData/quickfix/modifiers/suspend/startCoroutineNoImport.kt b/idea/testData/quickfix/modifiers/suspend/startCoroutineNoImport.kt index e2ebf7dc251..c14fef70ac7 100644 --- a/idea/testData/quickfix/modifiers/suspend/startCoroutineNoImport.kt +++ b/idea/testData/quickfix/modifiers/suspend/startCoroutineNoImport.kt @@ -2,6 +2,6 @@ // WITH_RUNTIME // DISABLE-ERRORS -import kotlin.coroutines.suspendCoroutine +import kotlin.coroutines.experimental.suspendCoroutine suspend fun suspending(block: () -> T): T = suspendCoroutine { block.startCoroutine(it) } \ No newline at end of file diff --git a/idea/testData/quickfix/modifiers/suspend/startCoroutineNoImport.kt.after b/idea/testData/quickfix/modifiers/suspend/startCoroutineNoImport.kt.after index fff8e1e7294..c5483dde2cf 100644 --- a/idea/testData/quickfix/modifiers/suspend/startCoroutineNoImport.kt.after +++ b/idea/testData/quickfix/modifiers/suspend/startCoroutineNoImport.kt.after @@ -2,6 +2,6 @@ // WITH_RUNTIME // DISABLE-ERRORS -import kotlin.coroutines.suspendCoroutine +import kotlin.coroutines.experimental.suspendCoroutine suspend fun suspending(block: suspend () -> T): T = suspendCoroutine { block.startCoroutine(it) } \ No newline at end of file From 9afd2d367bdb332d230fa4818961a843dc1b5084 Mon Sep 17 00:00:00 2001 From: Alexey Sedunov Date: Fri, 29 Sep 2017 15:20:42 +0300 Subject: [PATCH 186/212] Minor: Fix ReferenceResolveTestGenerated test data --- idea/testData/resolve/references/JavaParameter.kt | 2 +- idea/testData/resolve/references/fileRefInRawStringLiteral.kt | 4 ++-- idea/testData/resolve/references/fileRefInStringLiteral.kt | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/idea/testData/resolve/references/JavaParameter.kt b/idea/testData/resolve/references/JavaParameter.kt index 01e35444aa5..09415412879 100644 --- a/idea/testData/resolve/references/JavaParameter.kt +++ b/idea/testData/resolve/references/JavaParameter.kt @@ -3,4 +3,4 @@ lateinit var y: java.nio.CharBuffer val h = x.read(p0 = y) -// REF: CharBuffer var1 +// REF: java.nio.CharBuffer charBuffer diff --git a/idea/testData/resolve/references/fileRefInRawStringLiteral.kt b/idea/testData/resolve/references/fileRefInRawStringLiteral.kt index ee1097565d7..2856211dd1b 100644 --- a/idea/testData/resolve/references/fileRefInRawStringLiteral.kt +++ b/idea/testData/resolve/references/fileRefInRawStringLiteral.kt @@ -1,5 +1,5 @@ fun foo() { - val s = """idea/testData/resolve/references/fileRefInRawStringLiteral.Data.java""" + val s = """fileRefInRawStringLiteral.Data.java""" } -// REF: /src//resolve/references.fileRefInRawStringLiteral.Data.java \ No newline at end of file +// REF: /src.fileRefInRawStringLiteral.Data.java \ No newline at end of file diff --git a/idea/testData/resolve/references/fileRefInStringLiteral.kt b/idea/testData/resolve/references/fileRefInStringLiteral.kt index 384d4deac67..9273ccea55c 100644 --- a/idea/testData/resolve/references/fileRefInStringLiteral.kt +++ b/idea/testData/resolve/references/fileRefInStringLiteral.kt @@ -1,5 +1,5 @@ fun foo() { - val s = "idea/testData/resolve/references/fileRefInStringLiteral.Data.java" + val s = "fileRefInStringLiteral.Data.java" } -// REF: /src//resolve/references.fileRefInStringLiteral.Data.java \ No newline at end of file +// REF: /src.fileRefInStringLiteral.Data.java \ No newline at end of file From ea99a2b537817d97953d1a8d11aa352d288e3913 Mon Sep 17 00:00:00 2001 From: Alexey Sedunov Date: Mon, 2 Oct 2017 15:19:00 +0300 Subject: [PATCH 187/212] Kotlin Facet: Fix deserialization of "implements" dependency --- .../kotlin/config/facetSerialization.kt | 2 +- .../implementsDependency/module1/module1.iml | 20 +++++++++ .../implementsDependency/module1/src/foo.kt | 0 .../implementsDependency/module2/module2.iml | 28 +++++++++++++ .../implementsDependency/module2/src/foo.kt | 0 .../implementsDependency/projectFile.ipr | 42 +++++++++++++++++++ .../configuration/ConfigureKotlinTest.java | 14 +++++++ 7 files changed, 105 insertions(+), 1 deletion(-) create mode 100644 idea/testData/configuration/implementsDependency/module1/module1.iml create mode 100644 idea/testData/configuration/implementsDependency/module1/src/foo.kt create mode 100644 idea/testData/configuration/implementsDependency/module2/module2.iml create mode 100644 idea/testData/configuration/implementsDependency/module2/src/foo.kt create mode 100644 idea/testData/configuration/implementsDependency/projectFile.ipr diff --git a/idea/idea-jps-common/src/org/jetbrains/kotlin/config/facetSerialization.kt b/idea/idea-jps-common/src/org/jetbrains/kotlin/config/facetSerialization.kt index 439a14b3a29..2b8938ea570 100644 --- a/idea/idea-jps-common/src/org/jetbrains/kotlin/config/facetSerialization.kt +++ b/idea/idea-jps-common/src/org/jetbrains/kotlin/config/facetSerialization.kt @@ -97,7 +97,7 @@ private fun readV2AndLaterConfig(element: Element): KotlinFacetSettings { val platformName = element.getAttributeValue("platform") val platformKind = TargetPlatformKind.ALL_PLATFORMS.firstOrNull { it.description == platformName } ?: TargetPlatformKind.DEFAULT_PLATFORM element.getChild("implements")?.let { - implementedModuleName = (element.content.firstOrNull() as? Text)?.textTrim + implementedModuleName = (it.content.firstOrNull() as? Text)?.textTrim } element.getChild("compilerSettings")?.let { compilerSettings = CompilerSettings() diff --git a/idea/testData/configuration/implementsDependency/module1/module1.iml b/idea/testData/configuration/implementsDependency/module1/module1.iml new file mode 100644 index 00000000000..952af62b5e9 --- /dev/null +++ b/idea/testData/configuration/implementsDependency/module1/module1.iml @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/idea/testData/configuration/implementsDependency/module1/src/foo.kt b/idea/testData/configuration/implementsDependency/module1/src/foo.kt new file mode 100644 index 00000000000..e69de29bb2d diff --git a/idea/testData/configuration/implementsDependency/module2/module2.iml b/idea/testData/configuration/implementsDependency/module2/module2.iml new file mode 100644 index 00000000000..8856802fb74 --- /dev/null +++ b/idea/testData/configuration/implementsDependency/module2/module2.iml @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + module1 + + + + + + + + \ No newline at end of file diff --git a/idea/testData/configuration/implementsDependency/module2/src/foo.kt b/idea/testData/configuration/implementsDependency/module2/src/foo.kt new file mode 100644 index 00000000000..e69de29bb2d diff --git a/idea/testData/configuration/implementsDependency/projectFile.ipr b/idea/testData/configuration/implementsDependency/projectFile.ipr new file mode 100644 index 00000000000..eb21fb4ea1a --- /dev/null +++ b/idea/testData/configuration/implementsDependency/projectFile.ipr @@ -0,0 +1,42 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/idea/tests/org/jetbrains/kotlin/idea/configuration/ConfigureKotlinTest.java b/idea/tests/org/jetbrains/kotlin/idea/configuration/ConfigureKotlinTest.java index 1672f2469c9..c52038dfb12 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/configuration/ConfigureKotlinTest.java +++ b/idea/tests/org/jetbrains/kotlin/idea/configuration/ConfigureKotlinTest.java @@ -18,6 +18,7 @@ package org.jetbrains.kotlin.idea.configuration; import com.intellij.openapi.externalSystem.service.project.IdeModifiableModelsProviderImpl; import com.intellij.openapi.module.Module; +import com.intellij.openapi.module.ModuleManager; import com.intellij.openapi.roots.LibraryOrderEntry; import com.intellij.openapi.roots.ModuleRootManager; import com.intellij.openapi.roots.RootPolicy; @@ -236,6 +237,19 @@ public class ConfigureKotlinTest extends AbstractConfigureKotlinTest { assertEquals("-version -Xallow-kotlin-package -Xskip-metadata-version-check", settings.getCompilerSettings().getAdditionalArguments()); } + public void testImplementsDependency() { + ModuleManager moduleManager = ModuleManager.getInstance(myProject); + + Module module1 = moduleManager.findModuleByName("module1"); + assert module1 != null; + + Module module2 = moduleManager.findModuleByName("module2"); + assert module2 != null; + + assertEquals(KotlinFacet.Companion.get(module1).getConfiguration().getSettings().getImplementedModuleName(), null); + assertEquals(KotlinFacet.Companion.get(module2).getConfiguration().getSettings().getImplementedModuleName(), "module1"); + } + private void configureFacetAndCheckJvm(JvmTarget jvmTarget) { IdeModifiableModelsProviderImpl modelsProvider = new IdeModifiableModelsProviderImpl(getProject()); try { From 67798d73a1a43f7a7ab433fb1a86d6ce9113ad22 Mon Sep 17 00:00:00 2001 From: Alexey Sedunov Date: Fri, 29 Sep 2017 16:09:50 +0300 Subject: [PATCH 188/212] Minor: Fix multi-module test data This is required since "implements" dependency is now specified explicitly in the Kotlin facet configuration --- .../headerPrimaryConstructor/after/JS/JS.iml | 1 + .../headerPrimaryConstructor/after/JVM/JVM.iml | 1 + .../headerPrimaryConstructor/before/JS/JS.iml | 1 + .../headerPrimaryConstructor/before/JVM/JVM.iml | 1 + .../headerPrimaryConstructorNoParams/after/JS/JS.iml | 1 + .../headerPrimaryConstructorNoParams/after/JVM/JVM.iml | 1 + .../headerPrimaryConstructorNoParams/before/JS/JS.iml | 1 + .../headerPrimaryConstructorNoParams/before/JVM/JVM.iml | 1 + .../headerSecondaryConstructor/after/JS/JS.iml | 1 + .../headerSecondaryConstructor/after/JVM/JVM.iml | 1 + .../headerSecondaryConstructor/before/JS/JS.iml | 1 + .../headerSecondaryConstructor/before/JVM/JVM.iml | 1 + .../headersAndImplsByHeaderClassMemberFun/after/JS/JS.iml | 1 + .../headersAndImplsByHeaderClassMemberFun/after/JVM/JVM.iml | 1 + .../headersAndImplsByHeaderClassMemberFun/before/JS/JS.iml | 1 + .../headersAndImplsByHeaderClassMemberFun/before/JVM/JVM.iml | 1 + .../headersAndImplsByHeaderFun/after/JS/JS.iml | 1 + .../headersAndImplsByHeaderFun/after/JVM/JVM.iml | 1 + .../headersAndImplsByHeaderFun/before/JS/JS.iml | 1 + .../headersAndImplsByHeaderFun/before/JVM/JVM.iml | 1 + .../headersAndImplsByImplClassMemberFun/after/JS/JS.iml | 1 + .../headersAndImplsByImplClassMemberFun/after/JVM/JVM.iml | 1 + .../headersAndImplsByImplClassMemberFun/before/JS/JS.iml | 1 + .../headersAndImplsByImplClassMemberFun/before/JVM/JVM.iml | 1 + .../headersAndImplsByImplFun/after/JS/JS.iml | 1 + .../headersAndImplsByImplFun/after/JVM/JVM.iml | 1 + .../headersAndImplsByImplFun/before/JS/JS.iml | 1 + .../headersAndImplsByImplFun/before/JVM/JVM.iml | 1 + .../implPrimaryConstructor/after/JS/JS.iml | 1 + .../implPrimaryConstructor/after/JVM/JVM.iml | 1 + .../implPrimaryConstructor/before/JS/JS.iml | 1 + .../implPrimaryConstructor/before/JVM/JVM.iml | 1 + .../implPrimaryConstructorNoParams/after/JS/JS.iml | 1 + .../implPrimaryConstructorNoParams/after/JVM/JVM.iml | 1 + .../implPrimaryConstructorNoParams/before/JS/JS.iml | 1 + .../implPrimaryConstructorNoParams/before/JVM/JVM.iml | 1 + .../implSecondaryConstructor/after/JS/JS.iml | 1 + .../implSecondaryConstructor/after/JVM/JVM.iml | 1 + .../implSecondaryConstructor/before/JS/JS.iml | 1 + .../implSecondaryConstructor/before/JVM/JVM.iml | 1 + .../headersAndImplsByHeaderClass/after/JS/JS.iml | 1 + .../headersAndImplsByHeaderClass/after/JVM/JVM.iml | 1 + .../headersAndImplsByHeaderClass/before/JS/JS.iml | 1 + .../headersAndImplsByHeaderClass/before/JVM/JVM.iml | 1 + .../headersAndImplsByHeaderClassMemberFun/after/JS/JS.iml | 1 + .../headersAndImplsByHeaderClassMemberFun/after/JVM/JVM.iml | 1 + .../headersAndImplsByHeaderClassMemberFun/before/JS/JS.iml | 1 + .../headersAndImplsByHeaderClassMemberFun/before/JVM/JVM.iml | 1 + .../after/JS/JS.iml | 1 + .../after/JVM/JVM.iml | 1 + .../before/JS/JS.iml | 1 + .../before/JVM/JVM.iml | 1 + .../headersAndImplsByHeaderClassMemberVal/after/JS/JS.iml | 1 + .../headersAndImplsByHeaderClassMemberVal/after/JVM/JVM.iml | 1 + .../headersAndImplsByHeaderClassMemberVal/before/JS/JS.iml | 1 + .../headersAndImplsByHeaderClassMemberVal/before/JVM/JVM.iml | 1 + .../after/JS/JS.iml | 1 + .../after/JVM/JVM.iml | 1 + .../before/JS/JS.iml | 1 + .../before/JVM/JVM.iml | 1 + .../after/JS/JS.iml | 1 + .../after/JVM/JVM.iml | 1 + .../before/JS/JS.iml | 1 + .../before/JVM/JVM.iml | 1 + .../headersAndImplsByHeaderFun/after/JS/JS.iml | 1 + .../headersAndImplsByHeaderFun/after/JVM/JVM.iml | 1 + .../headersAndImplsByHeaderFun/before/JS/JS.iml | 1 + .../headersAndImplsByHeaderFun/before/JVM/JVM.iml | 1 + .../headersAndImplsByHeaderFunParameter/after/JS/JS.iml | 1 + .../headersAndImplsByHeaderFunParameter/after/JVM/JVM.iml | 1 + .../headersAndImplsByHeaderFunParameter/before/JS/JS.iml | 1 + .../headersAndImplsByHeaderFunParameter/before/JVM/JVM.iml | 1 + .../headersAndImplsByHeaderVal/after/JS/JS.iml | 1 + .../headersAndImplsByHeaderVal/after/JVM/JVM.iml | 1 + .../headersAndImplsByHeaderVal/before/JS/JS.iml | 1 + .../headersAndImplsByHeaderVal/before/JVM/JVM.iml | 1 + .../headersAndImplsByImplClass/after/JS/JS.iml | 1 + .../headersAndImplsByImplClass/after/JVM/JVM.iml | 1 + .../headersAndImplsByImplClass/before/JS/JS.iml | 1 + .../headersAndImplsByImplClass/before/JVM/JVM.iml | 1 + .../headersAndImplsByImplClassMemberFun/after/JS/JS.iml | 1 + .../headersAndImplsByImplClassMemberFun/after/JVM/JVM.iml | 1 + .../headersAndImplsByImplClassMemberFun/before/JS/JS.iml | 1 + .../headersAndImplsByImplClassMemberFun/before/JVM/JVM.iml | 1 + .../after/JS/JS.iml | 1 + .../after/JVM/JVM.iml | 1 + .../before/JS/JS.iml | 1 + .../before/JVM/JVM.iml | 1 + .../headersAndImplsByImplClassMemberVal/after/JS/JS.iml | 1 + .../headersAndImplsByImplClassMemberVal/after/JVM/JVM.iml | 1 + .../headersAndImplsByImplClassMemberVal/before/JS/JS.iml | 1 + .../headersAndImplsByImplClassMemberVal/before/JVM/JVM.iml | 1 + .../after/JS/JS.iml | 1 + .../after/JVM/JVM.iml | 1 + .../before/JS/JS.iml | 1 + .../before/JVM/JVM.iml | 1 + .../after/JS/JS.iml | 1 + .../after/JVM/JVM.iml | 1 + .../before/JS/JS.iml | 1 + .../before/JVM/JVM.iml | 1 + .../renameMultiModule/headersAndImplsByImplFun/after/JS/JS.iml | 1 + .../headersAndImplsByImplFun/after/JVM/JVM.iml | 1 + .../renameMultiModule/headersAndImplsByImplFun/before/JS/JS.iml | 1 + .../headersAndImplsByImplFun/before/JVM/JVM.iml | 1 + .../headersAndImplsByImplFunParameter/after/JS/JS.iml | 1 + .../headersAndImplsByImplFunParameter/after/JVM/JVM.iml | 1 + .../headersAndImplsByImplFunParameter/before/JS/JS.iml | 1 + .../headersAndImplsByImplFunParameter/before/JVM/JVM.iml | 1 + .../renameMultiModule/headersAndImplsByImplVal/after/JS/JS.iml | 1 + .../headersAndImplsByImplVal/after/JVM/JVM.iml | 1 + .../renameMultiModule/headersAndImplsByImplVal/before/JS/JS.iml | 1 + .../headersAndImplsByImplVal/before/JVM/JVM.iml | 1 + .../safeDeleteMultiModule/byHeaderClass/after/JS/JS.iml | 1 + .../safeDeleteMultiModule/byHeaderClass/after/JVM/JVM.iml | 1 + .../safeDeleteMultiModule/byHeaderClass/before/JS/JS.iml | 1 + .../safeDeleteMultiModule/byHeaderClass/before/JVM/JVM.iml | 1 + .../byHeaderClassMemberFun/after/JS/JS.iml | 1 + .../byHeaderClassMemberFun/after/JVM/JVM.iml | 1 + .../byHeaderClassMemberFun/before/JS/JS.iml | 1 + .../byHeaderClassMemberFun/before/JVM/JVM.iml | 1 + .../byHeaderClassMemberFunParameter/after/JS/JS.iml | 1 + .../byHeaderClassMemberFunParameter/after/JVM/JVM.iml | 1 + .../byHeaderClassMemberFunParameter/before/JS/JS.iml | 1 + .../byHeaderClassMemberFunParameter/before/JVM/JVM.iml | 1 + .../byHeaderClassMemberVal/after/JS/JS.iml | 1 + .../byHeaderClassMemberVal/after/JVM/JVM.iml | 1 + .../byHeaderClassMemberVal/before/JS/JS.iml | 1 + .../byHeaderClassMemberVal/before/JVM/JVM.iml | 1 + .../byHeaderClassPrimaryConstructorParameter/after/JS/JS.iml | 1 + .../byHeaderClassPrimaryConstructorParameter/after/JVM/JVM.iml | 1 + .../byHeaderClassPrimaryConstructorParameter/before/JS/JS.iml | 1 + .../byHeaderClassPrimaryConstructorParameter/before/JVM/JVM.iml | 1 + .../byHeaderClassSecondaryConstructor/after/JS/JS.iml | 1 + .../byHeaderClassSecondaryConstructor/after/JVM/JVM.iml | 1 + .../byHeaderClassSecondaryConstructor/before/JS/JS.iml | 1 + .../byHeaderClassSecondaryConstructor/before/JVM/JVM.iml | 1 + .../byHeaderClassSecondaryConstructorParameter/after/JS/JS.iml | 1 + .../after/JVM/JVM.iml | 1 + .../byHeaderClassSecondaryConstructorParameter/before/JS/JS.iml | 1 + .../before/JVM/JVM.iml | 1 + .../safeDeleteMultiModule/byHeaderFun/after/JS/JS.iml | 1 + .../safeDeleteMultiModule/byHeaderFun/after/JVM/JVM.iml | 1 + .../safeDeleteMultiModule/byHeaderFun/before/JS/JS.iml | 1 + .../safeDeleteMultiModule/byHeaderFun/before/JVM/JVM.iml | 1 + .../safeDeleteMultiModule/byHeaderFunParamerer/after/JS/JS.iml | 1 + .../byHeaderFunParamerer/after/JVM/JVM.iml | 1 + .../safeDeleteMultiModule/byHeaderFunParamerer/before/JS/JS.iml | 1 + .../byHeaderFunParamerer/before/JVM/JVM.iml | 1 + .../byHeaderFunVarargParamerer/after/JS/JS.iml | 1 + .../byHeaderFunVarargParamerer/after/JVM/JVM.iml | 1 + .../byHeaderFunVarargParamerer/before/JS/JS.iml | 1 + .../byHeaderFunVarargParamerer/before/JVM/JVM.iml | 1 + .../safeDeleteMultiModule/byHeaderVal/after/JS/JS.iml | 1 + .../safeDeleteMultiModule/byHeaderVal/after/JVM/JVM.iml | 1 + .../safeDeleteMultiModule/byHeaderVal/before/JS/JS.iml | 1 + .../safeDeleteMultiModule/byHeaderVal/before/JVM/JVM.iml | 1 + .../safeDeleteMultiModule/byImplClass/after/JS/JS.iml | 1 + .../safeDeleteMultiModule/byImplClass/after/JVM/JVM.iml | 1 + .../safeDeleteMultiModule/byImplClass/before/JS/JS.iml | 1 + .../safeDeleteMultiModule/byImplClass/before/JVM/JVM.iml | 1 + .../safeDeleteMultiModule/byImplClassMemberFun/after/JS/JS.iml | 1 + .../byImplClassMemberFun/after/JVM/JVM.iml | 1 + .../safeDeleteMultiModule/byImplClassMemberFun/before/JS/JS.iml | 1 + .../byImplClassMemberFun/before/JVM/JVM.iml | 1 + .../after/JS/JS.iml | 1 + .../after/JVM/JVM.iml | 1 + .../before/JS/JS.iml | 1 + .../before/JVM/JVM.iml | 1 + .../safeDeleteMultiModule/byImplClassMemberVal/after/JS/JS.iml | 1 + .../byImplClassMemberVal/after/JVM/JVM.iml | 1 + .../safeDeleteMultiModule/byImplClassMemberVal/before/JS/JS.iml | 1 + .../byImplClassMemberVal/before/JVM/JVM.iml | 1 + .../after/JS/JS.iml | 1 + .../after/JVM/JVM.iml | 1 + .../before/JS/JS.iml | 1 + .../before/JVM/JVM.iml | 1 + .../byImplClassSecondaryConstructor/after/JS/JS.iml | 1 + .../byImplClassSecondaryConstructor/after/JVM/JVM.iml | 1 + .../byImplClassSecondaryConstructor/before/JS/JS.iml | 1 + .../byImplClassSecondaryConstructor/before/JVM/JVM.iml | 1 + .../after/JS/JS.iml | 1 + .../after/JVM/JVM.iml | 1 + .../before/JS/JS.iml | 1 + .../before/JVM/JVM.iml | 1 + .../refactoring/safeDeleteMultiModule/byImplFun/after/JS/JS.iml | 1 + .../safeDeleteMultiModule/byImplFun/after/JVM/JVM.iml | 1 + .../safeDeleteMultiModule/byImplFun/before/JS/JS.iml | 1 + .../safeDeleteMultiModule/byImplFun/before/JVM/JVM.iml | 1 + .../byImplFunParamererLiftingToHeader/after/JS/JS.iml | 1 + .../byImplFunParamererLiftingToHeader/after/JVM/JVM.iml | 1 + .../byImplFunParamererLiftingToHeader/before/JS/JS.iml | 1 + .../byImplFunParamererLiftingToHeader/before/JVM/JVM.iml | 1 + .../byImplFunParamererNoLiftingToHeader/after/JS/JS.iml | 1 + .../byImplFunParamererNoLiftingToHeader/after/JVM/JVM.iml | 1 + .../byImplFunParamererNoLiftingToHeader/before/JS/JS.iml | 1 + .../byImplFunParamererNoLiftingToHeader/before/JVM/JVM.iml | 1 + .../refactoring/safeDeleteMultiModule/byImplVal/after/JS/JS.iml | 1 + .../safeDeleteMultiModule/byImplVal/after/JVM/JVM.iml | 1 + .../safeDeleteMultiModule/byImplVal/before/JS/JS.iml | 1 + .../safeDeleteMultiModule/byImplVal/before/JVM/JVM.iml | 1 + .../jetbrains/kotlin/idea/quickfix/QuickFixMultiModuleTest.kt | 2 +- 201 files changed, 201 insertions(+), 1 deletion(-) diff --git a/idea/testData/refactoring/changeSignatureMultiModule/headerPrimaryConstructor/after/JS/JS.iml b/idea/testData/refactoring/changeSignatureMultiModule/headerPrimaryConstructor/after/JS/JS.iml index 82d3e6bdf49..3de270f43fa 100644 --- a/idea/testData/refactoring/changeSignatureMultiModule/headerPrimaryConstructor/after/JS/JS.iml +++ b/idea/testData/refactoring/changeSignatureMultiModule/headerPrimaryConstructor/after/JS/JS.iml @@ -3,6 +3,7 @@ + Common diff --git a/idea/testData/refactoring/changeSignatureMultiModule/headerPrimaryConstructor/after/JVM/JVM.iml b/idea/testData/refactoring/changeSignatureMultiModule/headerPrimaryConstructor/after/JVM/JVM.iml index c3173af9ec7..76d2b885834 100644 --- a/idea/testData/refactoring/changeSignatureMultiModule/headerPrimaryConstructor/after/JVM/JVM.iml +++ b/idea/testData/refactoring/changeSignatureMultiModule/headerPrimaryConstructor/after/JVM/JVM.iml @@ -3,6 +3,7 @@ + Common diff --git a/idea/testData/refactoring/changeSignatureMultiModule/headerPrimaryConstructor/before/JS/JS.iml b/idea/testData/refactoring/changeSignatureMultiModule/headerPrimaryConstructor/before/JS/JS.iml index 82d3e6bdf49..3de270f43fa 100644 --- a/idea/testData/refactoring/changeSignatureMultiModule/headerPrimaryConstructor/before/JS/JS.iml +++ b/idea/testData/refactoring/changeSignatureMultiModule/headerPrimaryConstructor/before/JS/JS.iml @@ -3,6 +3,7 @@ + Common diff --git a/idea/testData/refactoring/changeSignatureMultiModule/headerPrimaryConstructor/before/JVM/JVM.iml b/idea/testData/refactoring/changeSignatureMultiModule/headerPrimaryConstructor/before/JVM/JVM.iml index c3173af9ec7..76d2b885834 100644 --- a/idea/testData/refactoring/changeSignatureMultiModule/headerPrimaryConstructor/before/JVM/JVM.iml +++ b/idea/testData/refactoring/changeSignatureMultiModule/headerPrimaryConstructor/before/JVM/JVM.iml @@ -3,6 +3,7 @@ + Common diff --git a/idea/testData/refactoring/changeSignatureMultiModule/headerPrimaryConstructorNoParams/after/JS/JS.iml b/idea/testData/refactoring/changeSignatureMultiModule/headerPrimaryConstructorNoParams/after/JS/JS.iml index 82d3e6bdf49..3de270f43fa 100644 --- a/idea/testData/refactoring/changeSignatureMultiModule/headerPrimaryConstructorNoParams/after/JS/JS.iml +++ b/idea/testData/refactoring/changeSignatureMultiModule/headerPrimaryConstructorNoParams/after/JS/JS.iml @@ -3,6 +3,7 @@ + Common diff --git a/idea/testData/refactoring/changeSignatureMultiModule/headerPrimaryConstructorNoParams/after/JVM/JVM.iml b/idea/testData/refactoring/changeSignatureMultiModule/headerPrimaryConstructorNoParams/after/JVM/JVM.iml index c3173af9ec7..76d2b885834 100644 --- a/idea/testData/refactoring/changeSignatureMultiModule/headerPrimaryConstructorNoParams/after/JVM/JVM.iml +++ b/idea/testData/refactoring/changeSignatureMultiModule/headerPrimaryConstructorNoParams/after/JVM/JVM.iml @@ -3,6 +3,7 @@ + Common diff --git a/idea/testData/refactoring/changeSignatureMultiModule/headerPrimaryConstructorNoParams/before/JS/JS.iml b/idea/testData/refactoring/changeSignatureMultiModule/headerPrimaryConstructorNoParams/before/JS/JS.iml index 82d3e6bdf49..3de270f43fa 100644 --- a/idea/testData/refactoring/changeSignatureMultiModule/headerPrimaryConstructorNoParams/before/JS/JS.iml +++ b/idea/testData/refactoring/changeSignatureMultiModule/headerPrimaryConstructorNoParams/before/JS/JS.iml @@ -3,6 +3,7 @@ + Common diff --git a/idea/testData/refactoring/changeSignatureMultiModule/headerPrimaryConstructorNoParams/before/JVM/JVM.iml b/idea/testData/refactoring/changeSignatureMultiModule/headerPrimaryConstructorNoParams/before/JVM/JVM.iml index c3173af9ec7..76d2b885834 100644 --- a/idea/testData/refactoring/changeSignatureMultiModule/headerPrimaryConstructorNoParams/before/JVM/JVM.iml +++ b/idea/testData/refactoring/changeSignatureMultiModule/headerPrimaryConstructorNoParams/before/JVM/JVM.iml @@ -3,6 +3,7 @@ + Common diff --git a/idea/testData/refactoring/changeSignatureMultiModule/headerSecondaryConstructor/after/JS/JS.iml b/idea/testData/refactoring/changeSignatureMultiModule/headerSecondaryConstructor/after/JS/JS.iml index 82d3e6bdf49..3de270f43fa 100644 --- a/idea/testData/refactoring/changeSignatureMultiModule/headerSecondaryConstructor/after/JS/JS.iml +++ b/idea/testData/refactoring/changeSignatureMultiModule/headerSecondaryConstructor/after/JS/JS.iml @@ -3,6 +3,7 @@ + Common diff --git a/idea/testData/refactoring/changeSignatureMultiModule/headerSecondaryConstructor/after/JVM/JVM.iml b/idea/testData/refactoring/changeSignatureMultiModule/headerSecondaryConstructor/after/JVM/JVM.iml index c3173af9ec7..76d2b885834 100644 --- a/idea/testData/refactoring/changeSignatureMultiModule/headerSecondaryConstructor/after/JVM/JVM.iml +++ b/idea/testData/refactoring/changeSignatureMultiModule/headerSecondaryConstructor/after/JVM/JVM.iml @@ -3,6 +3,7 @@ + Common diff --git a/idea/testData/refactoring/changeSignatureMultiModule/headerSecondaryConstructor/before/JS/JS.iml b/idea/testData/refactoring/changeSignatureMultiModule/headerSecondaryConstructor/before/JS/JS.iml index 82d3e6bdf49..3de270f43fa 100644 --- a/idea/testData/refactoring/changeSignatureMultiModule/headerSecondaryConstructor/before/JS/JS.iml +++ b/idea/testData/refactoring/changeSignatureMultiModule/headerSecondaryConstructor/before/JS/JS.iml @@ -3,6 +3,7 @@ + Common diff --git a/idea/testData/refactoring/changeSignatureMultiModule/headerSecondaryConstructor/before/JVM/JVM.iml b/idea/testData/refactoring/changeSignatureMultiModule/headerSecondaryConstructor/before/JVM/JVM.iml index c3173af9ec7..76d2b885834 100644 --- a/idea/testData/refactoring/changeSignatureMultiModule/headerSecondaryConstructor/before/JVM/JVM.iml +++ b/idea/testData/refactoring/changeSignatureMultiModule/headerSecondaryConstructor/before/JVM/JVM.iml @@ -3,6 +3,7 @@ + Common diff --git a/idea/testData/refactoring/changeSignatureMultiModule/headersAndImplsByHeaderClassMemberFun/after/JS/JS.iml b/idea/testData/refactoring/changeSignatureMultiModule/headersAndImplsByHeaderClassMemberFun/after/JS/JS.iml index 82d3e6bdf49..3de270f43fa 100644 --- a/idea/testData/refactoring/changeSignatureMultiModule/headersAndImplsByHeaderClassMemberFun/after/JS/JS.iml +++ b/idea/testData/refactoring/changeSignatureMultiModule/headersAndImplsByHeaderClassMemberFun/after/JS/JS.iml @@ -3,6 +3,7 @@ + Common diff --git a/idea/testData/refactoring/changeSignatureMultiModule/headersAndImplsByHeaderClassMemberFun/after/JVM/JVM.iml b/idea/testData/refactoring/changeSignatureMultiModule/headersAndImplsByHeaderClassMemberFun/after/JVM/JVM.iml index c3173af9ec7..76d2b885834 100644 --- a/idea/testData/refactoring/changeSignatureMultiModule/headersAndImplsByHeaderClassMemberFun/after/JVM/JVM.iml +++ b/idea/testData/refactoring/changeSignatureMultiModule/headersAndImplsByHeaderClassMemberFun/after/JVM/JVM.iml @@ -3,6 +3,7 @@ + Common diff --git a/idea/testData/refactoring/changeSignatureMultiModule/headersAndImplsByHeaderClassMemberFun/before/JS/JS.iml b/idea/testData/refactoring/changeSignatureMultiModule/headersAndImplsByHeaderClassMemberFun/before/JS/JS.iml index 82d3e6bdf49..3de270f43fa 100644 --- a/idea/testData/refactoring/changeSignatureMultiModule/headersAndImplsByHeaderClassMemberFun/before/JS/JS.iml +++ b/idea/testData/refactoring/changeSignatureMultiModule/headersAndImplsByHeaderClassMemberFun/before/JS/JS.iml @@ -3,6 +3,7 @@ + Common diff --git a/idea/testData/refactoring/changeSignatureMultiModule/headersAndImplsByHeaderClassMemberFun/before/JVM/JVM.iml b/idea/testData/refactoring/changeSignatureMultiModule/headersAndImplsByHeaderClassMemberFun/before/JVM/JVM.iml index c3173af9ec7..76d2b885834 100644 --- a/idea/testData/refactoring/changeSignatureMultiModule/headersAndImplsByHeaderClassMemberFun/before/JVM/JVM.iml +++ b/idea/testData/refactoring/changeSignatureMultiModule/headersAndImplsByHeaderClassMemberFun/before/JVM/JVM.iml @@ -3,6 +3,7 @@ + Common diff --git a/idea/testData/refactoring/changeSignatureMultiModule/headersAndImplsByHeaderFun/after/JS/JS.iml b/idea/testData/refactoring/changeSignatureMultiModule/headersAndImplsByHeaderFun/after/JS/JS.iml index 82d3e6bdf49..3de270f43fa 100644 --- a/idea/testData/refactoring/changeSignatureMultiModule/headersAndImplsByHeaderFun/after/JS/JS.iml +++ b/idea/testData/refactoring/changeSignatureMultiModule/headersAndImplsByHeaderFun/after/JS/JS.iml @@ -3,6 +3,7 @@ + Common diff --git a/idea/testData/refactoring/changeSignatureMultiModule/headersAndImplsByHeaderFun/after/JVM/JVM.iml b/idea/testData/refactoring/changeSignatureMultiModule/headersAndImplsByHeaderFun/after/JVM/JVM.iml index c3173af9ec7..76d2b885834 100644 --- a/idea/testData/refactoring/changeSignatureMultiModule/headersAndImplsByHeaderFun/after/JVM/JVM.iml +++ b/idea/testData/refactoring/changeSignatureMultiModule/headersAndImplsByHeaderFun/after/JVM/JVM.iml @@ -3,6 +3,7 @@ + Common diff --git a/idea/testData/refactoring/changeSignatureMultiModule/headersAndImplsByHeaderFun/before/JS/JS.iml b/idea/testData/refactoring/changeSignatureMultiModule/headersAndImplsByHeaderFun/before/JS/JS.iml index 82d3e6bdf49..3de270f43fa 100644 --- a/idea/testData/refactoring/changeSignatureMultiModule/headersAndImplsByHeaderFun/before/JS/JS.iml +++ b/idea/testData/refactoring/changeSignatureMultiModule/headersAndImplsByHeaderFun/before/JS/JS.iml @@ -3,6 +3,7 @@ + Common diff --git a/idea/testData/refactoring/changeSignatureMultiModule/headersAndImplsByHeaderFun/before/JVM/JVM.iml b/idea/testData/refactoring/changeSignatureMultiModule/headersAndImplsByHeaderFun/before/JVM/JVM.iml index c3173af9ec7..76d2b885834 100644 --- a/idea/testData/refactoring/changeSignatureMultiModule/headersAndImplsByHeaderFun/before/JVM/JVM.iml +++ b/idea/testData/refactoring/changeSignatureMultiModule/headersAndImplsByHeaderFun/before/JVM/JVM.iml @@ -3,6 +3,7 @@ + Common diff --git a/idea/testData/refactoring/changeSignatureMultiModule/headersAndImplsByImplClassMemberFun/after/JS/JS.iml b/idea/testData/refactoring/changeSignatureMultiModule/headersAndImplsByImplClassMemberFun/after/JS/JS.iml index 82d3e6bdf49..3de270f43fa 100644 --- a/idea/testData/refactoring/changeSignatureMultiModule/headersAndImplsByImplClassMemberFun/after/JS/JS.iml +++ b/idea/testData/refactoring/changeSignatureMultiModule/headersAndImplsByImplClassMemberFun/after/JS/JS.iml @@ -3,6 +3,7 @@ + Common diff --git a/idea/testData/refactoring/changeSignatureMultiModule/headersAndImplsByImplClassMemberFun/after/JVM/JVM.iml b/idea/testData/refactoring/changeSignatureMultiModule/headersAndImplsByImplClassMemberFun/after/JVM/JVM.iml index c3173af9ec7..76d2b885834 100644 --- a/idea/testData/refactoring/changeSignatureMultiModule/headersAndImplsByImplClassMemberFun/after/JVM/JVM.iml +++ b/idea/testData/refactoring/changeSignatureMultiModule/headersAndImplsByImplClassMemberFun/after/JVM/JVM.iml @@ -3,6 +3,7 @@ + Common diff --git a/idea/testData/refactoring/changeSignatureMultiModule/headersAndImplsByImplClassMemberFun/before/JS/JS.iml b/idea/testData/refactoring/changeSignatureMultiModule/headersAndImplsByImplClassMemberFun/before/JS/JS.iml index 82d3e6bdf49..3de270f43fa 100644 --- a/idea/testData/refactoring/changeSignatureMultiModule/headersAndImplsByImplClassMemberFun/before/JS/JS.iml +++ b/idea/testData/refactoring/changeSignatureMultiModule/headersAndImplsByImplClassMemberFun/before/JS/JS.iml @@ -3,6 +3,7 @@ + Common diff --git a/idea/testData/refactoring/changeSignatureMultiModule/headersAndImplsByImplClassMemberFun/before/JVM/JVM.iml b/idea/testData/refactoring/changeSignatureMultiModule/headersAndImplsByImplClassMemberFun/before/JVM/JVM.iml index c3173af9ec7..76d2b885834 100644 --- a/idea/testData/refactoring/changeSignatureMultiModule/headersAndImplsByImplClassMemberFun/before/JVM/JVM.iml +++ b/idea/testData/refactoring/changeSignatureMultiModule/headersAndImplsByImplClassMemberFun/before/JVM/JVM.iml @@ -3,6 +3,7 @@ + Common diff --git a/idea/testData/refactoring/changeSignatureMultiModule/headersAndImplsByImplFun/after/JS/JS.iml b/idea/testData/refactoring/changeSignatureMultiModule/headersAndImplsByImplFun/after/JS/JS.iml index 82d3e6bdf49..3de270f43fa 100644 --- a/idea/testData/refactoring/changeSignatureMultiModule/headersAndImplsByImplFun/after/JS/JS.iml +++ b/idea/testData/refactoring/changeSignatureMultiModule/headersAndImplsByImplFun/after/JS/JS.iml @@ -3,6 +3,7 @@ + Common diff --git a/idea/testData/refactoring/changeSignatureMultiModule/headersAndImplsByImplFun/after/JVM/JVM.iml b/idea/testData/refactoring/changeSignatureMultiModule/headersAndImplsByImplFun/after/JVM/JVM.iml index c3173af9ec7..76d2b885834 100644 --- a/idea/testData/refactoring/changeSignatureMultiModule/headersAndImplsByImplFun/after/JVM/JVM.iml +++ b/idea/testData/refactoring/changeSignatureMultiModule/headersAndImplsByImplFun/after/JVM/JVM.iml @@ -3,6 +3,7 @@ + Common diff --git a/idea/testData/refactoring/changeSignatureMultiModule/headersAndImplsByImplFun/before/JS/JS.iml b/idea/testData/refactoring/changeSignatureMultiModule/headersAndImplsByImplFun/before/JS/JS.iml index 82d3e6bdf49..3de270f43fa 100644 --- a/idea/testData/refactoring/changeSignatureMultiModule/headersAndImplsByImplFun/before/JS/JS.iml +++ b/idea/testData/refactoring/changeSignatureMultiModule/headersAndImplsByImplFun/before/JS/JS.iml @@ -3,6 +3,7 @@ + Common diff --git a/idea/testData/refactoring/changeSignatureMultiModule/headersAndImplsByImplFun/before/JVM/JVM.iml b/idea/testData/refactoring/changeSignatureMultiModule/headersAndImplsByImplFun/before/JVM/JVM.iml index c3173af9ec7..76d2b885834 100644 --- a/idea/testData/refactoring/changeSignatureMultiModule/headersAndImplsByImplFun/before/JVM/JVM.iml +++ b/idea/testData/refactoring/changeSignatureMultiModule/headersAndImplsByImplFun/before/JVM/JVM.iml @@ -3,6 +3,7 @@ + Common diff --git a/idea/testData/refactoring/changeSignatureMultiModule/implPrimaryConstructor/after/JS/JS.iml b/idea/testData/refactoring/changeSignatureMultiModule/implPrimaryConstructor/after/JS/JS.iml index 82d3e6bdf49..3de270f43fa 100644 --- a/idea/testData/refactoring/changeSignatureMultiModule/implPrimaryConstructor/after/JS/JS.iml +++ b/idea/testData/refactoring/changeSignatureMultiModule/implPrimaryConstructor/after/JS/JS.iml @@ -3,6 +3,7 @@ + Common diff --git a/idea/testData/refactoring/changeSignatureMultiModule/implPrimaryConstructor/after/JVM/JVM.iml b/idea/testData/refactoring/changeSignatureMultiModule/implPrimaryConstructor/after/JVM/JVM.iml index c3173af9ec7..76d2b885834 100644 --- a/idea/testData/refactoring/changeSignatureMultiModule/implPrimaryConstructor/after/JVM/JVM.iml +++ b/idea/testData/refactoring/changeSignatureMultiModule/implPrimaryConstructor/after/JVM/JVM.iml @@ -3,6 +3,7 @@ + Common diff --git a/idea/testData/refactoring/changeSignatureMultiModule/implPrimaryConstructor/before/JS/JS.iml b/idea/testData/refactoring/changeSignatureMultiModule/implPrimaryConstructor/before/JS/JS.iml index 82d3e6bdf49..3de270f43fa 100644 --- a/idea/testData/refactoring/changeSignatureMultiModule/implPrimaryConstructor/before/JS/JS.iml +++ b/idea/testData/refactoring/changeSignatureMultiModule/implPrimaryConstructor/before/JS/JS.iml @@ -3,6 +3,7 @@ + Common diff --git a/idea/testData/refactoring/changeSignatureMultiModule/implPrimaryConstructor/before/JVM/JVM.iml b/idea/testData/refactoring/changeSignatureMultiModule/implPrimaryConstructor/before/JVM/JVM.iml index c3173af9ec7..76d2b885834 100644 --- a/idea/testData/refactoring/changeSignatureMultiModule/implPrimaryConstructor/before/JVM/JVM.iml +++ b/idea/testData/refactoring/changeSignatureMultiModule/implPrimaryConstructor/before/JVM/JVM.iml @@ -3,6 +3,7 @@ + Common diff --git a/idea/testData/refactoring/changeSignatureMultiModule/implPrimaryConstructorNoParams/after/JS/JS.iml b/idea/testData/refactoring/changeSignatureMultiModule/implPrimaryConstructorNoParams/after/JS/JS.iml index 82d3e6bdf49..3de270f43fa 100644 --- a/idea/testData/refactoring/changeSignatureMultiModule/implPrimaryConstructorNoParams/after/JS/JS.iml +++ b/idea/testData/refactoring/changeSignatureMultiModule/implPrimaryConstructorNoParams/after/JS/JS.iml @@ -3,6 +3,7 @@ + Common diff --git a/idea/testData/refactoring/changeSignatureMultiModule/implPrimaryConstructorNoParams/after/JVM/JVM.iml b/idea/testData/refactoring/changeSignatureMultiModule/implPrimaryConstructorNoParams/after/JVM/JVM.iml index c3173af9ec7..76d2b885834 100644 --- a/idea/testData/refactoring/changeSignatureMultiModule/implPrimaryConstructorNoParams/after/JVM/JVM.iml +++ b/idea/testData/refactoring/changeSignatureMultiModule/implPrimaryConstructorNoParams/after/JVM/JVM.iml @@ -3,6 +3,7 @@ + Common diff --git a/idea/testData/refactoring/changeSignatureMultiModule/implPrimaryConstructorNoParams/before/JS/JS.iml b/idea/testData/refactoring/changeSignatureMultiModule/implPrimaryConstructorNoParams/before/JS/JS.iml index 82d3e6bdf49..3de270f43fa 100644 --- a/idea/testData/refactoring/changeSignatureMultiModule/implPrimaryConstructorNoParams/before/JS/JS.iml +++ b/idea/testData/refactoring/changeSignatureMultiModule/implPrimaryConstructorNoParams/before/JS/JS.iml @@ -3,6 +3,7 @@ + Common diff --git a/idea/testData/refactoring/changeSignatureMultiModule/implPrimaryConstructorNoParams/before/JVM/JVM.iml b/idea/testData/refactoring/changeSignatureMultiModule/implPrimaryConstructorNoParams/before/JVM/JVM.iml index c3173af9ec7..76d2b885834 100644 --- a/idea/testData/refactoring/changeSignatureMultiModule/implPrimaryConstructorNoParams/before/JVM/JVM.iml +++ b/idea/testData/refactoring/changeSignatureMultiModule/implPrimaryConstructorNoParams/before/JVM/JVM.iml @@ -3,6 +3,7 @@ + Common diff --git a/idea/testData/refactoring/changeSignatureMultiModule/implSecondaryConstructor/after/JS/JS.iml b/idea/testData/refactoring/changeSignatureMultiModule/implSecondaryConstructor/after/JS/JS.iml index 82d3e6bdf49..3de270f43fa 100644 --- a/idea/testData/refactoring/changeSignatureMultiModule/implSecondaryConstructor/after/JS/JS.iml +++ b/idea/testData/refactoring/changeSignatureMultiModule/implSecondaryConstructor/after/JS/JS.iml @@ -3,6 +3,7 @@ + Common diff --git a/idea/testData/refactoring/changeSignatureMultiModule/implSecondaryConstructor/after/JVM/JVM.iml b/idea/testData/refactoring/changeSignatureMultiModule/implSecondaryConstructor/after/JVM/JVM.iml index c3173af9ec7..76d2b885834 100644 --- a/idea/testData/refactoring/changeSignatureMultiModule/implSecondaryConstructor/after/JVM/JVM.iml +++ b/idea/testData/refactoring/changeSignatureMultiModule/implSecondaryConstructor/after/JVM/JVM.iml @@ -3,6 +3,7 @@ + Common diff --git a/idea/testData/refactoring/changeSignatureMultiModule/implSecondaryConstructor/before/JS/JS.iml b/idea/testData/refactoring/changeSignatureMultiModule/implSecondaryConstructor/before/JS/JS.iml index 82d3e6bdf49..3de270f43fa 100644 --- a/idea/testData/refactoring/changeSignatureMultiModule/implSecondaryConstructor/before/JS/JS.iml +++ b/idea/testData/refactoring/changeSignatureMultiModule/implSecondaryConstructor/before/JS/JS.iml @@ -3,6 +3,7 @@ + Common diff --git a/idea/testData/refactoring/changeSignatureMultiModule/implSecondaryConstructor/before/JVM/JVM.iml b/idea/testData/refactoring/changeSignatureMultiModule/implSecondaryConstructor/before/JVM/JVM.iml index c3173af9ec7..76d2b885834 100644 --- a/idea/testData/refactoring/changeSignatureMultiModule/implSecondaryConstructor/before/JVM/JVM.iml +++ b/idea/testData/refactoring/changeSignatureMultiModule/implSecondaryConstructor/before/JVM/JVM.iml @@ -3,6 +3,7 @@ + Common diff --git a/idea/testData/refactoring/renameMultiModule/headersAndImplsByHeaderClass/after/JS/JS.iml b/idea/testData/refactoring/renameMultiModule/headersAndImplsByHeaderClass/after/JS/JS.iml index 82d3e6bdf49..3de270f43fa 100644 --- a/idea/testData/refactoring/renameMultiModule/headersAndImplsByHeaderClass/after/JS/JS.iml +++ b/idea/testData/refactoring/renameMultiModule/headersAndImplsByHeaderClass/after/JS/JS.iml @@ -3,6 +3,7 @@ + Common diff --git a/idea/testData/refactoring/renameMultiModule/headersAndImplsByHeaderClass/after/JVM/JVM.iml b/idea/testData/refactoring/renameMultiModule/headersAndImplsByHeaderClass/after/JVM/JVM.iml index c3173af9ec7..76d2b885834 100644 --- a/idea/testData/refactoring/renameMultiModule/headersAndImplsByHeaderClass/after/JVM/JVM.iml +++ b/idea/testData/refactoring/renameMultiModule/headersAndImplsByHeaderClass/after/JVM/JVM.iml @@ -3,6 +3,7 @@ + Common diff --git a/idea/testData/refactoring/renameMultiModule/headersAndImplsByHeaderClass/before/JS/JS.iml b/idea/testData/refactoring/renameMultiModule/headersAndImplsByHeaderClass/before/JS/JS.iml index 82d3e6bdf49..3de270f43fa 100644 --- a/idea/testData/refactoring/renameMultiModule/headersAndImplsByHeaderClass/before/JS/JS.iml +++ b/idea/testData/refactoring/renameMultiModule/headersAndImplsByHeaderClass/before/JS/JS.iml @@ -3,6 +3,7 @@ + Common diff --git a/idea/testData/refactoring/renameMultiModule/headersAndImplsByHeaderClass/before/JVM/JVM.iml b/idea/testData/refactoring/renameMultiModule/headersAndImplsByHeaderClass/before/JVM/JVM.iml index c3173af9ec7..76d2b885834 100644 --- a/idea/testData/refactoring/renameMultiModule/headersAndImplsByHeaderClass/before/JVM/JVM.iml +++ b/idea/testData/refactoring/renameMultiModule/headersAndImplsByHeaderClass/before/JVM/JVM.iml @@ -3,6 +3,7 @@ + Common diff --git a/idea/testData/refactoring/renameMultiModule/headersAndImplsByHeaderClassMemberFun/after/JS/JS.iml b/idea/testData/refactoring/renameMultiModule/headersAndImplsByHeaderClassMemberFun/after/JS/JS.iml index 82d3e6bdf49..3de270f43fa 100644 --- a/idea/testData/refactoring/renameMultiModule/headersAndImplsByHeaderClassMemberFun/after/JS/JS.iml +++ b/idea/testData/refactoring/renameMultiModule/headersAndImplsByHeaderClassMemberFun/after/JS/JS.iml @@ -3,6 +3,7 @@ + Common diff --git a/idea/testData/refactoring/renameMultiModule/headersAndImplsByHeaderClassMemberFun/after/JVM/JVM.iml b/idea/testData/refactoring/renameMultiModule/headersAndImplsByHeaderClassMemberFun/after/JVM/JVM.iml index c3173af9ec7..76d2b885834 100644 --- a/idea/testData/refactoring/renameMultiModule/headersAndImplsByHeaderClassMemberFun/after/JVM/JVM.iml +++ b/idea/testData/refactoring/renameMultiModule/headersAndImplsByHeaderClassMemberFun/after/JVM/JVM.iml @@ -3,6 +3,7 @@ + Common diff --git a/idea/testData/refactoring/renameMultiModule/headersAndImplsByHeaderClassMemberFun/before/JS/JS.iml b/idea/testData/refactoring/renameMultiModule/headersAndImplsByHeaderClassMemberFun/before/JS/JS.iml index 82d3e6bdf49..3de270f43fa 100644 --- a/idea/testData/refactoring/renameMultiModule/headersAndImplsByHeaderClassMemberFun/before/JS/JS.iml +++ b/idea/testData/refactoring/renameMultiModule/headersAndImplsByHeaderClassMemberFun/before/JS/JS.iml @@ -3,6 +3,7 @@ + Common diff --git a/idea/testData/refactoring/renameMultiModule/headersAndImplsByHeaderClassMemberFun/before/JVM/JVM.iml b/idea/testData/refactoring/renameMultiModule/headersAndImplsByHeaderClassMemberFun/before/JVM/JVM.iml index c3173af9ec7..76d2b885834 100644 --- a/idea/testData/refactoring/renameMultiModule/headersAndImplsByHeaderClassMemberFun/before/JVM/JVM.iml +++ b/idea/testData/refactoring/renameMultiModule/headersAndImplsByHeaderClassMemberFun/before/JVM/JVM.iml @@ -3,6 +3,7 @@ + Common diff --git a/idea/testData/refactoring/renameMultiModule/headersAndImplsByHeaderClassMemberFunParameter/after/JS/JS.iml b/idea/testData/refactoring/renameMultiModule/headersAndImplsByHeaderClassMemberFunParameter/after/JS/JS.iml index 82d3e6bdf49..3de270f43fa 100644 --- a/idea/testData/refactoring/renameMultiModule/headersAndImplsByHeaderClassMemberFunParameter/after/JS/JS.iml +++ b/idea/testData/refactoring/renameMultiModule/headersAndImplsByHeaderClassMemberFunParameter/after/JS/JS.iml @@ -3,6 +3,7 @@ + Common diff --git a/idea/testData/refactoring/renameMultiModule/headersAndImplsByHeaderClassMemberFunParameter/after/JVM/JVM.iml b/idea/testData/refactoring/renameMultiModule/headersAndImplsByHeaderClassMemberFunParameter/after/JVM/JVM.iml index c3173af9ec7..76d2b885834 100644 --- a/idea/testData/refactoring/renameMultiModule/headersAndImplsByHeaderClassMemberFunParameter/after/JVM/JVM.iml +++ b/idea/testData/refactoring/renameMultiModule/headersAndImplsByHeaderClassMemberFunParameter/after/JVM/JVM.iml @@ -3,6 +3,7 @@ + Common diff --git a/idea/testData/refactoring/renameMultiModule/headersAndImplsByHeaderClassMemberFunParameter/before/JS/JS.iml b/idea/testData/refactoring/renameMultiModule/headersAndImplsByHeaderClassMemberFunParameter/before/JS/JS.iml index 82d3e6bdf49..3de270f43fa 100644 --- a/idea/testData/refactoring/renameMultiModule/headersAndImplsByHeaderClassMemberFunParameter/before/JS/JS.iml +++ b/idea/testData/refactoring/renameMultiModule/headersAndImplsByHeaderClassMemberFunParameter/before/JS/JS.iml @@ -3,6 +3,7 @@ + Common diff --git a/idea/testData/refactoring/renameMultiModule/headersAndImplsByHeaderClassMemberFunParameter/before/JVM/JVM.iml b/idea/testData/refactoring/renameMultiModule/headersAndImplsByHeaderClassMemberFunParameter/before/JVM/JVM.iml index c3173af9ec7..76d2b885834 100644 --- a/idea/testData/refactoring/renameMultiModule/headersAndImplsByHeaderClassMemberFunParameter/before/JVM/JVM.iml +++ b/idea/testData/refactoring/renameMultiModule/headersAndImplsByHeaderClassMemberFunParameter/before/JVM/JVM.iml @@ -3,6 +3,7 @@ + Common diff --git a/idea/testData/refactoring/renameMultiModule/headersAndImplsByHeaderClassMemberVal/after/JS/JS.iml b/idea/testData/refactoring/renameMultiModule/headersAndImplsByHeaderClassMemberVal/after/JS/JS.iml index 82d3e6bdf49..3de270f43fa 100644 --- a/idea/testData/refactoring/renameMultiModule/headersAndImplsByHeaderClassMemberVal/after/JS/JS.iml +++ b/idea/testData/refactoring/renameMultiModule/headersAndImplsByHeaderClassMemberVal/after/JS/JS.iml @@ -3,6 +3,7 @@ + Common diff --git a/idea/testData/refactoring/renameMultiModule/headersAndImplsByHeaderClassMemberVal/after/JVM/JVM.iml b/idea/testData/refactoring/renameMultiModule/headersAndImplsByHeaderClassMemberVal/after/JVM/JVM.iml index c3173af9ec7..76d2b885834 100644 --- a/idea/testData/refactoring/renameMultiModule/headersAndImplsByHeaderClassMemberVal/after/JVM/JVM.iml +++ b/idea/testData/refactoring/renameMultiModule/headersAndImplsByHeaderClassMemberVal/after/JVM/JVM.iml @@ -3,6 +3,7 @@ + Common diff --git a/idea/testData/refactoring/renameMultiModule/headersAndImplsByHeaderClassMemberVal/before/JS/JS.iml b/idea/testData/refactoring/renameMultiModule/headersAndImplsByHeaderClassMemberVal/before/JS/JS.iml index 82d3e6bdf49..3de270f43fa 100644 --- a/idea/testData/refactoring/renameMultiModule/headersAndImplsByHeaderClassMemberVal/before/JS/JS.iml +++ b/idea/testData/refactoring/renameMultiModule/headersAndImplsByHeaderClassMemberVal/before/JS/JS.iml @@ -3,6 +3,7 @@ + Common diff --git a/idea/testData/refactoring/renameMultiModule/headersAndImplsByHeaderClassMemberVal/before/JVM/JVM.iml b/idea/testData/refactoring/renameMultiModule/headersAndImplsByHeaderClassMemberVal/before/JVM/JVM.iml index c3173af9ec7..76d2b885834 100644 --- a/idea/testData/refactoring/renameMultiModule/headersAndImplsByHeaderClassMemberVal/before/JVM/JVM.iml +++ b/idea/testData/refactoring/renameMultiModule/headersAndImplsByHeaderClassMemberVal/before/JVM/JVM.iml @@ -3,6 +3,7 @@ + Common diff --git a/idea/testData/refactoring/renameMultiModule/headersAndImplsByHeaderClassPrimaryConstructorParameter/after/JS/JS.iml b/idea/testData/refactoring/renameMultiModule/headersAndImplsByHeaderClassPrimaryConstructorParameter/after/JS/JS.iml index 82d3e6bdf49..3de270f43fa 100644 --- a/idea/testData/refactoring/renameMultiModule/headersAndImplsByHeaderClassPrimaryConstructorParameter/after/JS/JS.iml +++ b/idea/testData/refactoring/renameMultiModule/headersAndImplsByHeaderClassPrimaryConstructorParameter/after/JS/JS.iml @@ -3,6 +3,7 @@ + Common diff --git a/idea/testData/refactoring/renameMultiModule/headersAndImplsByHeaderClassPrimaryConstructorParameter/after/JVM/JVM.iml b/idea/testData/refactoring/renameMultiModule/headersAndImplsByHeaderClassPrimaryConstructorParameter/after/JVM/JVM.iml index c3173af9ec7..76d2b885834 100644 --- a/idea/testData/refactoring/renameMultiModule/headersAndImplsByHeaderClassPrimaryConstructorParameter/after/JVM/JVM.iml +++ b/idea/testData/refactoring/renameMultiModule/headersAndImplsByHeaderClassPrimaryConstructorParameter/after/JVM/JVM.iml @@ -3,6 +3,7 @@ + Common diff --git a/idea/testData/refactoring/renameMultiModule/headersAndImplsByHeaderClassPrimaryConstructorParameter/before/JS/JS.iml b/idea/testData/refactoring/renameMultiModule/headersAndImplsByHeaderClassPrimaryConstructorParameter/before/JS/JS.iml index 82d3e6bdf49..3de270f43fa 100644 --- a/idea/testData/refactoring/renameMultiModule/headersAndImplsByHeaderClassPrimaryConstructorParameter/before/JS/JS.iml +++ b/idea/testData/refactoring/renameMultiModule/headersAndImplsByHeaderClassPrimaryConstructorParameter/before/JS/JS.iml @@ -3,6 +3,7 @@ + Common diff --git a/idea/testData/refactoring/renameMultiModule/headersAndImplsByHeaderClassPrimaryConstructorParameter/before/JVM/JVM.iml b/idea/testData/refactoring/renameMultiModule/headersAndImplsByHeaderClassPrimaryConstructorParameter/before/JVM/JVM.iml index c3173af9ec7..76d2b885834 100644 --- a/idea/testData/refactoring/renameMultiModule/headersAndImplsByHeaderClassPrimaryConstructorParameter/before/JVM/JVM.iml +++ b/idea/testData/refactoring/renameMultiModule/headersAndImplsByHeaderClassPrimaryConstructorParameter/before/JVM/JVM.iml @@ -3,6 +3,7 @@ + Common diff --git a/idea/testData/refactoring/renameMultiModule/headersAndImplsByHeaderClassSecondaryConstructorParameter/after/JS/JS.iml b/idea/testData/refactoring/renameMultiModule/headersAndImplsByHeaderClassSecondaryConstructorParameter/after/JS/JS.iml index 82d3e6bdf49..3de270f43fa 100644 --- a/idea/testData/refactoring/renameMultiModule/headersAndImplsByHeaderClassSecondaryConstructorParameter/after/JS/JS.iml +++ b/idea/testData/refactoring/renameMultiModule/headersAndImplsByHeaderClassSecondaryConstructorParameter/after/JS/JS.iml @@ -3,6 +3,7 @@ + Common diff --git a/idea/testData/refactoring/renameMultiModule/headersAndImplsByHeaderClassSecondaryConstructorParameter/after/JVM/JVM.iml b/idea/testData/refactoring/renameMultiModule/headersAndImplsByHeaderClassSecondaryConstructorParameter/after/JVM/JVM.iml index c3173af9ec7..76d2b885834 100644 --- a/idea/testData/refactoring/renameMultiModule/headersAndImplsByHeaderClassSecondaryConstructorParameter/after/JVM/JVM.iml +++ b/idea/testData/refactoring/renameMultiModule/headersAndImplsByHeaderClassSecondaryConstructorParameter/after/JVM/JVM.iml @@ -3,6 +3,7 @@ + Common diff --git a/idea/testData/refactoring/renameMultiModule/headersAndImplsByHeaderClassSecondaryConstructorParameter/before/JS/JS.iml b/idea/testData/refactoring/renameMultiModule/headersAndImplsByHeaderClassSecondaryConstructorParameter/before/JS/JS.iml index 82d3e6bdf49..3de270f43fa 100644 --- a/idea/testData/refactoring/renameMultiModule/headersAndImplsByHeaderClassSecondaryConstructorParameter/before/JS/JS.iml +++ b/idea/testData/refactoring/renameMultiModule/headersAndImplsByHeaderClassSecondaryConstructorParameter/before/JS/JS.iml @@ -3,6 +3,7 @@ + Common diff --git a/idea/testData/refactoring/renameMultiModule/headersAndImplsByHeaderClassSecondaryConstructorParameter/before/JVM/JVM.iml b/idea/testData/refactoring/renameMultiModule/headersAndImplsByHeaderClassSecondaryConstructorParameter/before/JVM/JVM.iml index c3173af9ec7..76d2b885834 100644 --- a/idea/testData/refactoring/renameMultiModule/headersAndImplsByHeaderClassSecondaryConstructorParameter/before/JVM/JVM.iml +++ b/idea/testData/refactoring/renameMultiModule/headersAndImplsByHeaderClassSecondaryConstructorParameter/before/JVM/JVM.iml @@ -3,6 +3,7 @@ + Common diff --git a/idea/testData/refactoring/renameMultiModule/headersAndImplsByHeaderFun/after/JS/JS.iml b/idea/testData/refactoring/renameMultiModule/headersAndImplsByHeaderFun/after/JS/JS.iml index 82d3e6bdf49..3de270f43fa 100644 --- a/idea/testData/refactoring/renameMultiModule/headersAndImplsByHeaderFun/after/JS/JS.iml +++ b/idea/testData/refactoring/renameMultiModule/headersAndImplsByHeaderFun/after/JS/JS.iml @@ -3,6 +3,7 @@ + Common diff --git a/idea/testData/refactoring/renameMultiModule/headersAndImplsByHeaderFun/after/JVM/JVM.iml b/idea/testData/refactoring/renameMultiModule/headersAndImplsByHeaderFun/after/JVM/JVM.iml index c3173af9ec7..76d2b885834 100644 --- a/idea/testData/refactoring/renameMultiModule/headersAndImplsByHeaderFun/after/JVM/JVM.iml +++ b/idea/testData/refactoring/renameMultiModule/headersAndImplsByHeaderFun/after/JVM/JVM.iml @@ -3,6 +3,7 @@ + Common diff --git a/idea/testData/refactoring/renameMultiModule/headersAndImplsByHeaderFun/before/JS/JS.iml b/idea/testData/refactoring/renameMultiModule/headersAndImplsByHeaderFun/before/JS/JS.iml index 82d3e6bdf49..3de270f43fa 100644 --- a/idea/testData/refactoring/renameMultiModule/headersAndImplsByHeaderFun/before/JS/JS.iml +++ b/idea/testData/refactoring/renameMultiModule/headersAndImplsByHeaderFun/before/JS/JS.iml @@ -3,6 +3,7 @@ + Common diff --git a/idea/testData/refactoring/renameMultiModule/headersAndImplsByHeaderFun/before/JVM/JVM.iml b/idea/testData/refactoring/renameMultiModule/headersAndImplsByHeaderFun/before/JVM/JVM.iml index c3173af9ec7..76d2b885834 100644 --- a/idea/testData/refactoring/renameMultiModule/headersAndImplsByHeaderFun/before/JVM/JVM.iml +++ b/idea/testData/refactoring/renameMultiModule/headersAndImplsByHeaderFun/before/JVM/JVM.iml @@ -3,6 +3,7 @@ + Common diff --git a/idea/testData/refactoring/renameMultiModule/headersAndImplsByHeaderFunParameter/after/JS/JS.iml b/idea/testData/refactoring/renameMultiModule/headersAndImplsByHeaderFunParameter/after/JS/JS.iml index 82d3e6bdf49..3de270f43fa 100644 --- a/idea/testData/refactoring/renameMultiModule/headersAndImplsByHeaderFunParameter/after/JS/JS.iml +++ b/idea/testData/refactoring/renameMultiModule/headersAndImplsByHeaderFunParameter/after/JS/JS.iml @@ -3,6 +3,7 @@ + Common diff --git a/idea/testData/refactoring/renameMultiModule/headersAndImplsByHeaderFunParameter/after/JVM/JVM.iml b/idea/testData/refactoring/renameMultiModule/headersAndImplsByHeaderFunParameter/after/JVM/JVM.iml index c3173af9ec7..76d2b885834 100644 --- a/idea/testData/refactoring/renameMultiModule/headersAndImplsByHeaderFunParameter/after/JVM/JVM.iml +++ b/idea/testData/refactoring/renameMultiModule/headersAndImplsByHeaderFunParameter/after/JVM/JVM.iml @@ -3,6 +3,7 @@ + Common diff --git a/idea/testData/refactoring/renameMultiModule/headersAndImplsByHeaderFunParameter/before/JS/JS.iml b/idea/testData/refactoring/renameMultiModule/headersAndImplsByHeaderFunParameter/before/JS/JS.iml index 82d3e6bdf49..3de270f43fa 100644 --- a/idea/testData/refactoring/renameMultiModule/headersAndImplsByHeaderFunParameter/before/JS/JS.iml +++ b/idea/testData/refactoring/renameMultiModule/headersAndImplsByHeaderFunParameter/before/JS/JS.iml @@ -3,6 +3,7 @@ + Common diff --git a/idea/testData/refactoring/renameMultiModule/headersAndImplsByHeaderFunParameter/before/JVM/JVM.iml b/idea/testData/refactoring/renameMultiModule/headersAndImplsByHeaderFunParameter/before/JVM/JVM.iml index c3173af9ec7..76d2b885834 100644 --- a/idea/testData/refactoring/renameMultiModule/headersAndImplsByHeaderFunParameter/before/JVM/JVM.iml +++ b/idea/testData/refactoring/renameMultiModule/headersAndImplsByHeaderFunParameter/before/JVM/JVM.iml @@ -3,6 +3,7 @@ + Common diff --git a/idea/testData/refactoring/renameMultiModule/headersAndImplsByHeaderVal/after/JS/JS.iml b/idea/testData/refactoring/renameMultiModule/headersAndImplsByHeaderVal/after/JS/JS.iml index 82d3e6bdf49..3de270f43fa 100644 --- a/idea/testData/refactoring/renameMultiModule/headersAndImplsByHeaderVal/after/JS/JS.iml +++ b/idea/testData/refactoring/renameMultiModule/headersAndImplsByHeaderVal/after/JS/JS.iml @@ -3,6 +3,7 @@ + Common diff --git a/idea/testData/refactoring/renameMultiModule/headersAndImplsByHeaderVal/after/JVM/JVM.iml b/idea/testData/refactoring/renameMultiModule/headersAndImplsByHeaderVal/after/JVM/JVM.iml index c3173af9ec7..76d2b885834 100644 --- a/idea/testData/refactoring/renameMultiModule/headersAndImplsByHeaderVal/after/JVM/JVM.iml +++ b/idea/testData/refactoring/renameMultiModule/headersAndImplsByHeaderVal/after/JVM/JVM.iml @@ -3,6 +3,7 @@ + Common diff --git a/idea/testData/refactoring/renameMultiModule/headersAndImplsByHeaderVal/before/JS/JS.iml b/idea/testData/refactoring/renameMultiModule/headersAndImplsByHeaderVal/before/JS/JS.iml index 82d3e6bdf49..3de270f43fa 100644 --- a/idea/testData/refactoring/renameMultiModule/headersAndImplsByHeaderVal/before/JS/JS.iml +++ b/idea/testData/refactoring/renameMultiModule/headersAndImplsByHeaderVal/before/JS/JS.iml @@ -3,6 +3,7 @@ + Common diff --git a/idea/testData/refactoring/renameMultiModule/headersAndImplsByHeaderVal/before/JVM/JVM.iml b/idea/testData/refactoring/renameMultiModule/headersAndImplsByHeaderVal/before/JVM/JVM.iml index c3173af9ec7..76d2b885834 100644 --- a/idea/testData/refactoring/renameMultiModule/headersAndImplsByHeaderVal/before/JVM/JVM.iml +++ b/idea/testData/refactoring/renameMultiModule/headersAndImplsByHeaderVal/before/JVM/JVM.iml @@ -3,6 +3,7 @@ + Common diff --git a/idea/testData/refactoring/renameMultiModule/headersAndImplsByImplClass/after/JS/JS.iml b/idea/testData/refactoring/renameMultiModule/headersAndImplsByImplClass/after/JS/JS.iml index 82d3e6bdf49..3de270f43fa 100644 --- a/idea/testData/refactoring/renameMultiModule/headersAndImplsByImplClass/after/JS/JS.iml +++ b/idea/testData/refactoring/renameMultiModule/headersAndImplsByImplClass/after/JS/JS.iml @@ -3,6 +3,7 @@ + Common diff --git a/idea/testData/refactoring/renameMultiModule/headersAndImplsByImplClass/after/JVM/JVM.iml b/idea/testData/refactoring/renameMultiModule/headersAndImplsByImplClass/after/JVM/JVM.iml index c3173af9ec7..76d2b885834 100644 --- a/idea/testData/refactoring/renameMultiModule/headersAndImplsByImplClass/after/JVM/JVM.iml +++ b/idea/testData/refactoring/renameMultiModule/headersAndImplsByImplClass/after/JVM/JVM.iml @@ -3,6 +3,7 @@ + Common diff --git a/idea/testData/refactoring/renameMultiModule/headersAndImplsByImplClass/before/JS/JS.iml b/idea/testData/refactoring/renameMultiModule/headersAndImplsByImplClass/before/JS/JS.iml index 82d3e6bdf49..3de270f43fa 100644 --- a/idea/testData/refactoring/renameMultiModule/headersAndImplsByImplClass/before/JS/JS.iml +++ b/idea/testData/refactoring/renameMultiModule/headersAndImplsByImplClass/before/JS/JS.iml @@ -3,6 +3,7 @@ + Common diff --git a/idea/testData/refactoring/renameMultiModule/headersAndImplsByImplClass/before/JVM/JVM.iml b/idea/testData/refactoring/renameMultiModule/headersAndImplsByImplClass/before/JVM/JVM.iml index c3173af9ec7..76d2b885834 100644 --- a/idea/testData/refactoring/renameMultiModule/headersAndImplsByImplClass/before/JVM/JVM.iml +++ b/idea/testData/refactoring/renameMultiModule/headersAndImplsByImplClass/before/JVM/JVM.iml @@ -3,6 +3,7 @@ + Common diff --git a/idea/testData/refactoring/renameMultiModule/headersAndImplsByImplClassMemberFun/after/JS/JS.iml b/idea/testData/refactoring/renameMultiModule/headersAndImplsByImplClassMemberFun/after/JS/JS.iml index 82d3e6bdf49..3de270f43fa 100644 --- a/idea/testData/refactoring/renameMultiModule/headersAndImplsByImplClassMemberFun/after/JS/JS.iml +++ b/idea/testData/refactoring/renameMultiModule/headersAndImplsByImplClassMemberFun/after/JS/JS.iml @@ -3,6 +3,7 @@ + Common diff --git a/idea/testData/refactoring/renameMultiModule/headersAndImplsByImplClassMemberFun/after/JVM/JVM.iml b/idea/testData/refactoring/renameMultiModule/headersAndImplsByImplClassMemberFun/after/JVM/JVM.iml index c3173af9ec7..76d2b885834 100644 --- a/idea/testData/refactoring/renameMultiModule/headersAndImplsByImplClassMemberFun/after/JVM/JVM.iml +++ b/idea/testData/refactoring/renameMultiModule/headersAndImplsByImplClassMemberFun/after/JVM/JVM.iml @@ -3,6 +3,7 @@ + Common diff --git a/idea/testData/refactoring/renameMultiModule/headersAndImplsByImplClassMemberFun/before/JS/JS.iml b/idea/testData/refactoring/renameMultiModule/headersAndImplsByImplClassMemberFun/before/JS/JS.iml index 82d3e6bdf49..3de270f43fa 100644 --- a/idea/testData/refactoring/renameMultiModule/headersAndImplsByImplClassMemberFun/before/JS/JS.iml +++ b/idea/testData/refactoring/renameMultiModule/headersAndImplsByImplClassMemberFun/before/JS/JS.iml @@ -3,6 +3,7 @@ + Common diff --git a/idea/testData/refactoring/renameMultiModule/headersAndImplsByImplClassMemberFun/before/JVM/JVM.iml b/idea/testData/refactoring/renameMultiModule/headersAndImplsByImplClassMemberFun/before/JVM/JVM.iml index c3173af9ec7..76d2b885834 100644 --- a/idea/testData/refactoring/renameMultiModule/headersAndImplsByImplClassMemberFun/before/JVM/JVM.iml +++ b/idea/testData/refactoring/renameMultiModule/headersAndImplsByImplClassMemberFun/before/JVM/JVM.iml @@ -3,6 +3,7 @@ + Common diff --git a/idea/testData/refactoring/renameMultiModule/headersAndImplsByImplClassMemberFunParameter/after/JS/JS.iml b/idea/testData/refactoring/renameMultiModule/headersAndImplsByImplClassMemberFunParameter/after/JS/JS.iml index 82d3e6bdf49..3de270f43fa 100644 --- a/idea/testData/refactoring/renameMultiModule/headersAndImplsByImplClassMemberFunParameter/after/JS/JS.iml +++ b/idea/testData/refactoring/renameMultiModule/headersAndImplsByImplClassMemberFunParameter/after/JS/JS.iml @@ -3,6 +3,7 @@ + Common diff --git a/idea/testData/refactoring/renameMultiModule/headersAndImplsByImplClassMemberFunParameter/after/JVM/JVM.iml b/idea/testData/refactoring/renameMultiModule/headersAndImplsByImplClassMemberFunParameter/after/JVM/JVM.iml index c3173af9ec7..76d2b885834 100644 --- a/idea/testData/refactoring/renameMultiModule/headersAndImplsByImplClassMemberFunParameter/after/JVM/JVM.iml +++ b/idea/testData/refactoring/renameMultiModule/headersAndImplsByImplClassMemberFunParameter/after/JVM/JVM.iml @@ -3,6 +3,7 @@ + Common diff --git a/idea/testData/refactoring/renameMultiModule/headersAndImplsByImplClassMemberFunParameter/before/JS/JS.iml b/idea/testData/refactoring/renameMultiModule/headersAndImplsByImplClassMemberFunParameter/before/JS/JS.iml index 82d3e6bdf49..3de270f43fa 100644 --- a/idea/testData/refactoring/renameMultiModule/headersAndImplsByImplClassMemberFunParameter/before/JS/JS.iml +++ b/idea/testData/refactoring/renameMultiModule/headersAndImplsByImplClassMemberFunParameter/before/JS/JS.iml @@ -3,6 +3,7 @@ + Common diff --git a/idea/testData/refactoring/renameMultiModule/headersAndImplsByImplClassMemberFunParameter/before/JVM/JVM.iml b/idea/testData/refactoring/renameMultiModule/headersAndImplsByImplClassMemberFunParameter/before/JVM/JVM.iml index c3173af9ec7..76d2b885834 100644 --- a/idea/testData/refactoring/renameMultiModule/headersAndImplsByImplClassMemberFunParameter/before/JVM/JVM.iml +++ b/idea/testData/refactoring/renameMultiModule/headersAndImplsByImplClassMemberFunParameter/before/JVM/JVM.iml @@ -3,6 +3,7 @@ + Common diff --git a/idea/testData/refactoring/renameMultiModule/headersAndImplsByImplClassMemberVal/after/JS/JS.iml b/idea/testData/refactoring/renameMultiModule/headersAndImplsByImplClassMemberVal/after/JS/JS.iml index 82d3e6bdf49..3de270f43fa 100644 --- a/idea/testData/refactoring/renameMultiModule/headersAndImplsByImplClassMemberVal/after/JS/JS.iml +++ b/idea/testData/refactoring/renameMultiModule/headersAndImplsByImplClassMemberVal/after/JS/JS.iml @@ -3,6 +3,7 @@ + Common diff --git a/idea/testData/refactoring/renameMultiModule/headersAndImplsByImplClassMemberVal/after/JVM/JVM.iml b/idea/testData/refactoring/renameMultiModule/headersAndImplsByImplClassMemberVal/after/JVM/JVM.iml index c3173af9ec7..76d2b885834 100644 --- a/idea/testData/refactoring/renameMultiModule/headersAndImplsByImplClassMemberVal/after/JVM/JVM.iml +++ b/idea/testData/refactoring/renameMultiModule/headersAndImplsByImplClassMemberVal/after/JVM/JVM.iml @@ -3,6 +3,7 @@ + Common diff --git a/idea/testData/refactoring/renameMultiModule/headersAndImplsByImplClassMemberVal/before/JS/JS.iml b/idea/testData/refactoring/renameMultiModule/headersAndImplsByImplClassMemberVal/before/JS/JS.iml index 82d3e6bdf49..3de270f43fa 100644 --- a/idea/testData/refactoring/renameMultiModule/headersAndImplsByImplClassMemberVal/before/JS/JS.iml +++ b/idea/testData/refactoring/renameMultiModule/headersAndImplsByImplClassMemberVal/before/JS/JS.iml @@ -3,6 +3,7 @@ + Common diff --git a/idea/testData/refactoring/renameMultiModule/headersAndImplsByImplClassMemberVal/before/JVM/JVM.iml b/idea/testData/refactoring/renameMultiModule/headersAndImplsByImplClassMemberVal/before/JVM/JVM.iml index c3173af9ec7..76d2b885834 100644 --- a/idea/testData/refactoring/renameMultiModule/headersAndImplsByImplClassMemberVal/before/JVM/JVM.iml +++ b/idea/testData/refactoring/renameMultiModule/headersAndImplsByImplClassMemberVal/before/JVM/JVM.iml @@ -3,6 +3,7 @@ + Common diff --git a/idea/testData/refactoring/renameMultiModule/headersAndImplsByImplClassPrimaryConstructorParameter/after/JS/JS.iml b/idea/testData/refactoring/renameMultiModule/headersAndImplsByImplClassPrimaryConstructorParameter/after/JS/JS.iml index 82d3e6bdf49..3de270f43fa 100644 --- a/idea/testData/refactoring/renameMultiModule/headersAndImplsByImplClassPrimaryConstructorParameter/after/JS/JS.iml +++ b/idea/testData/refactoring/renameMultiModule/headersAndImplsByImplClassPrimaryConstructorParameter/after/JS/JS.iml @@ -3,6 +3,7 @@ + Common diff --git a/idea/testData/refactoring/renameMultiModule/headersAndImplsByImplClassPrimaryConstructorParameter/after/JVM/JVM.iml b/idea/testData/refactoring/renameMultiModule/headersAndImplsByImplClassPrimaryConstructorParameter/after/JVM/JVM.iml index c3173af9ec7..76d2b885834 100644 --- a/idea/testData/refactoring/renameMultiModule/headersAndImplsByImplClassPrimaryConstructorParameter/after/JVM/JVM.iml +++ b/idea/testData/refactoring/renameMultiModule/headersAndImplsByImplClassPrimaryConstructorParameter/after/JVM/JVM.iml @@ -3,6 +3,7 @@ + Common diff --git a/idea/testData/refactoring/renameMultiModule/headersAndImplsByImplClassPrimaryConstructorParameter/before/JS/JS.iml b/idea/testData/refactoring/renameMultiModule/headersAndImplsByImplClassPrimaryConstructorParameter/before/JS/JS.iml index 82d3e6bdf49..3de270f43fa 100644 --- a/idea/testData/refactoring/renameMultiModule/headersAndImplsByImplClassPrimaryConstructorParameter/before/JS/JS.iml +++ b/idea/testData/refactoring/renameMultiModule/headersAndImplsByImplClassPrimaryConstructorParameter/before/JS/JS.iml @@ -3,6 +3,7 @@ + Common diff --git a/idea/testData/refactoring/renameMultiModule/headersAndImplsByImplClassPrimaryConstructorParameter/before/JVM/JVM.iml b/idea/testData/refactoring/renameMultiModule/headersAndImplsByImplClassPrimaryConstructorParameter/before/JVM/JVM.iml index c3173af9ec7..76d2b885834 100644 --- a/idea/testData/refactoring/renameMultiModule/headersAndImplsByImplClassPrimaryConstructorParameter/before/JVM/JVM.iml +++ b/idea/testData/refactoring/renameMultiModule/headersAndImplsByImplClassPrimaryConstructorParameter/before/JVM/JVM.iml @@ -3,6 +3,7 @@ + Common diff --git a/idea/testData/refactoring/renameMultiModule/headersAndImplsByImplClassSecondaryConstructorParameter/after/JS/JS.iml b/idea/testData/refactoring/renameMultiModule/headersAndImplsByImplClassSecondaryConstructorParameter/after/JS/JS.iml index 82d3e6bdf49..3de270f43fa 100644 --- a/idea/testData/refactoring/renameMultiModule/headersAndImplsByImplClassSecondaryConstructorParameter/after/JS/JS.iml +++ b/idea/testData/refactoring/renameMultiModule/headersAndImplsByImplClassSecondaryConstructorParameter/after/JS/JS.iml @@ -3,6 +3,7 @@ + Common diff --git a/idea/testData/refactoring/renameMultiModule/headersAndImplsByImplClassSecondaryConstructorParameter/after/JVM/JVM.iml b/idea/testData/refactoring/renameMultiModule/headersAndImplsByImplClassSecondaryConstructorParameter/after/JVM/JVM.iml index c3173af9ec7..76d2b885834 100644 --- a/idea/testData/refactoring/renameMultiModule/headersAndImplsByImplClassSecondaryConstructorParameter/after/JVM/JVM.iml +++ b/idea/testData/refactoring/renameMultiModule/headersAndImplsByImplClassSecondaryConstructorParameter/after/JVM/JVM.iml @@ -3,6 +3,7 @@ + Common diff --git a/idea/testData/refactoring/renameMultiModule/headersAndImplsByImplClassSecondaryConstructorParameter/before/JS/JS.iml b/idea/testData/refactoring/renameMultiModule/headersAndImplsByImplClassSecondaryConstructorParameter/before/JS/JS.iml index 82d3e6bdf49..3de270f43fa 100644 --- a/idea/testData/refactoring/renameMultiModule/headersAndImplsByImplClassSecondaryConstructorParameter/before/JS/JS.iml +++ b/idea/testData/refactoring/renameMultiModule/headersAndImplsByImplClassSecondaryConstructorParameter/before/JS/JS.iml @@ -3,6 +3,7 @@ + Common diff --git a/idea/testData/refactoring/renameMultiModule/headersAndImplsByImplClassSecondaryConstructorParameter/before/JVM/JVM.iml b/idea/testData/refactoring/renameMultiModule/headersAndImplsByImplClassSecondaryConstructorParameter/before/JVM/JVM.iml index c3173af9ec7..76d2b885834 100644 --- a/idea/testData/refactoring/renameMultiModule/headersAndImplsByImplClassSecondaryConstructorParameter/before/JVM/JVM.iml +++ b/idea/testData/refactoring/renameMultiModule/headersAndImplsByImplClassSecondaryConstructorParameter/before/JVM/JVM.iml @@ -3,6 +3,7 @@ + Common diff --git a/idea/testData/refactoring/renameMultiModule/headersAndImplsByImplFun/after/JS/JS.iml b/idea/testData/refactoring/renameMultiModule/headersAndImplsByImplFun/after/JS/JS.iml index 82d3e6bdf49..3de270f43fa 100644 --- a/idea/testData/refactoring/renameMultiModule/headersAndImplsByImplFun/after/JS/JS.iml +++ b/idea/testData/refactoring/renameMultiModule/headersAndImplsByImplFun/after/JS/JS.iml @@ -3,6 +3,7 @@ + Common diff --git a/idea/testData/refactoring/renameMultiModule/headersAndImplsByImplFun/after/JVM/JVM.iml b/idea/testData/refactoring/renameMultiModule/headersAndImplsByImplFun/after/JVM/JVM.iml index c3173af9ec7..76d2b885834 100644 --- a/idea/testData/refactoring/renameMultiModule/headersAndImplsByImplFun/after/JVM/JVM.iml +++ b/idea/testData/refactoring/renameMultiModule/headersAndImplsByImplFun/after/JVM/JVM.iml @@ -3,6 +3,7 @@ + Common diff --git a/idea/testData/refactoring/renameMultiModule/headersAndImplsByImplFun/before/JS/JS.iml b/idea/testData/refactoring/renameMultiModule/headersAndImplsByImplFun/before/JS/JS.iml index 82d3e6bdf49..3de270f43fa 100644 --- a/idea/testData/refactoring/renameMultiModule/headersAndImplsByImplFun/before/JS/JS.iml +++ b/idea/testData/refactoring/renameMultiModule/headersAndImplsByImplFun/before/JS/JS.iml @@ -3,6 +3,7 @@ + Common diff --git a/idea/testData/refactoring/renameMultiModule/headersAndImplsByImplFun/before/JVM/JVM.iml b/idea/testData/refactoring/renameMultiModule/headersAndImplsByImplFun/before/JVM/JVM.iml index c3173af9ec7..76d2b885834 100644 --- a/idea/testData/refactoring/renameMultiModule/headersAndImplsByImplFun/before/JVM/JVM.iml +++ b/idea/testData/refactoring/renameMultiModule/headersAndImplsByImplFun/before/JVM/JVM.iml @@ -3,6 +3,7 @@ + Common diff --git a/idea/testData/refactoring/renameMultiModule/headersAndImplsByImplFunParameter/after/JS/JS.iml b/idea/testData/refactoring/renameMultiModule/headersAndImplsByImplFunParameter/after/JS/JS.iml index 82d3e6bdf49..3de270f43fa 100644 --- a/idea/testData/refactoring/renameMultiModule/headersAndImplsByImplFunParameter/after/JS/JS.iml +++ b/idea/testData/refactoring/renameMultiModule/headersAndImplsByImplFunParameter/after/JS/JS.iml @@ -3,6 +3,7 @@ + Common diff --git a/idea/testData/refactoring/renameMultiModule/headersAndImplsByImplFunParameter/after/JVM/JVM.iml b/idea/testData/refactoring/renameMultiModule/headersAndImplsByImplFunParameter/after/JVM/JVM.iml index c3173af9ec7..76d2b885834 100644 --- a/idea/testData/refactoring/renameMultiModule/headersAndImplsByImplFunParameter/after/JVM/JVM.iml +++ b/idea/testData/refactoring/renameMultiModule/headersAndImplsByImplFunParameter/after/JVM/JVM.iml @@ -3,6 +3,7 @@ + Common diff --git a/idea/testData/refactoring/renameMultiModule/headersAndImplsByImplFunParameter/before/JS/JS.iml b/idea/testData/refactoring/renameMultiModule/headersAndImplsByImplFunParameter/before/JS/JS.iml index 82d3e6bdf49..3de270f43fa 100644 --- a/idea/testData/refactoring/renameMultiModule/headersAndImplsByImplFunParameter/before/JS/JS.iml +++ b/idea/testData/refactoring/renameMultiModule/headersAndImplsByImplFunParameter/before/JS/JS.iml @@ -3,6 +3,7 @@ + Common diff --git a/idea/testData/refactoring/renameMultiModule/headersAndImplsByImplFunParameter/before/JVM/JVM.iml b/idea/testData/refactoring/renameMultiModule/headersAndImplsByImplFunParameter/before/JVM/JVM.iml index c3173af9ec7..76d2b885834 100644 --- a/idea/testData/refactoring/renameMultiModule/headersAndImplsByImplFunParameter/before/JVM/JVM.iml +++ b/idea/testData/refactoring/renameMultiModule/headersAndImplsByImplFunParameter/before/JVM/JVM.iml @@ -3,6 +3,7 @@ + Common diff --git a/idea/testData/refactoring/renameMultiModule/headersAndImplsByImplVal/after/JS/JS.iml b/idea/testData/refactoring/renameMultiModule/headersAndImplsByImplVal/after/JS/JS.iml index 82d3e6bdf49..3de270f43fa 100644 --- a/idea/testData/refactoring/renameMultiModule/headersAndImplsByImplVal/after/JS/JS.iml +++ b/idea/testData/refactoring/renameMultiModule/headersAndImplsByImplVal/after/JS/JS.iml @@ -3,6 +3,7 @@ + Common diff --git a/idea/testData/refactoring/renameMultiModule/headersAndImplsByImplVal/after/JVM/JVM.iml b/idea/testData/refactoring/renameMultiModule/headersAndImplsByImplVal/after/JVM/JVM.iml index c3173af9ec7..76d2b885834 100644 --- a/idea/testData/refactoring/renameMultiModule/headersAndImplsByImplVal/after/JVM/JVM.iml +++ b/idea/testData/refactoring/renameMultiModule/headersAndImplsByImplVal/after/JVM/JVM.iml @@ -3,6 +3,7 @@ + Common diff --git a/idea/testData/refactoring/renameMultiModule/headersAndImplsByImplVal/before/JS/JS.iml b/idea/testData/refactoring/renameMultiModule/headersAndImplsByImplVal/before/JS/JS.iml index 82d3e6bdf49..3de270f43fa 100644 --- a/idea/testData/refactoring/renameMultiModule/headersAndImplsByImplVal/before/JS/JS.iml +++ b/idea/testData/refactoring/renameMultiModule/headersAndImplsByImplVal/before/JS/JS.iml @@ -3,6 +3,7 @@ + Common diff --git a/idea/testData/refactoring/renameMultiModule/headersAndImplsByImplVal/before/JVM/JVM.iml b/idea/testData/refactoring/renameMultiModule/headersAndImplsByImplVal/before/JVM/JVM.iml index c3173af9ec7..76d2b885834 100644 --- a/idea/testData/refactoring/renameMultiModule/headersAndImplsByImplVal/before/JVM/JVM.iml +++ b/idea/testData/refactoring/renameMultiModule/headersAndImplsByImplVal/before/JVM/JVM.iml @@ -3,6 +3,7 @@ + Common diff --git a/idea/testData/refactoring/safeDeleteMultiModule/byHeaderClass/after/JS/JS.iml b/idea/testData/refactoring/safeDeleteMultiModule/byHeaderClass/after/JS/JS.iml index 82d3e6bdf49..3de270f43fa 100644 --- a/idea/testData/refactoring/safeDeleteMultiModule/byHeaderClass/after/JS/JS.iml +++ b/idea/testData/refactoring/safeDeleteMultiModule/byHeaderClass/after/JS/JS.iml @@ -3,6 +3,7 @@ + Common diff --git a/idea/testData/refactoring/safeDeleteMultiModule/byHeaderClass/after/JVM/JVM.iml b/idea/testData/refactoring/safeDeleteMultiModule/byHeaderClass/after/JVM/JVM.iml index c3173af9ec7..76d2b885834 100644 --- a/idea/testData/refactoring/safeDeleteMultiModule/byHeaderClass/after/JVM/JVM.iml +++ b/idea/testData/refactoring/safeDeleteMultiModule/byHeaderClass/after/JVM/JVM.iml @@ -3,6 +3,7 @@ + Common diff --git a/idea/testData/refactoring/safeDeleteMultiModule/byHeaderClass/before/JS/JS.iml b/idea/testData/refactoring/safeDeleteMultiModule/byHeaderClass/before/JS/JS.iml index 82d3e6bdf49..3de270f43fa 100644 --- a/idea/testData/refactoring/safeDeleteMultiModule/byHeaderClass/before/JS/JS.iml +++ b/idea/testData/refactoring/safeDeleteMultiModule/byHeaderClass/before/JS/JS.iml @@ -3,6 +3,7 @@ + Common diff --git a/idea/testData/refactoring/safeDeleteMultiModule/byHeaderClass/before/JVM/JVM.iml b/idea/testData/refactoring/safeDeleteMultiModule/byHeaderClass/before/JVM/JVM.iml index c3173af9ec7..76d2b885834 100644 --- a/idea/testData/refactoring/safeDeleteMultiModule/byHeaderClass/before/JVM/JVM.iml +++ b/idea/testData/refactoring/safeDeleteMultiModule/byHeaderClass/before/JVM/JVM.iml @@ -3,6 +3,7 @@ + Common diff --git a/idea/testData/refactoring/safeDeleteMultiModule/byHeaderClassMemberFun/after/JS/JS.iml b/idea/testData/refactoring/safeDeleteMultiModule/byHeaderClassMemberFun/after/JS/JS.iml index 82d3e6bdf49..3de270f43fa 100644 --- a/idea/testData/refactoring/safeDeleteMultiModule/byHeaderClassMemberFun/after/JS/JS.iml +++ b/idea/testData/refactoring/safeDeleteMultiModule/byHeaderClassMemberFun/after/JS/JS.iml @@ -3,6 +3,7 @@ + Common diff --git a/idea/testData/refactoring/safeDeleteMultiModule/byHeaderClassMemberFun/after/JVM/JVM.iml b/idea/testData/refactoring/safeDeleteMultiModule/byHeaderClassMemberFun/after/JVM/JVM.iml index c3173af9ec7..76d2b885834 100644 --- a/idea/testData/refactoring/safeDeleteMultiModule/byHeaderClassMemberFun/after/JVM/JVM.iml +++ b/idea/testData/refactoring/safeDeleteMultiModule/byHeaderClassMemberFun/after/JVM/JVM.iml @@ -3,6 +3,7 @@ + Common diff --git a/idea/testData/refactoring/safeDeleteMultiModule/byHeaderClassMemberFun/before/JS/JS.iml b/idea/testData/refactoring/safeDeleteMultiModule/byHeaderClassMemberFun/before/JS/JS.iml index 82d3e6bdf49..3de270f43fa 100644 --- a/idea/testData/refactoring/safeDeleteMultiModule/byHeaderClassMemberFun/before/JS/JS.iml +++ b/idea/testData/refactoring/safeDeleteMultiModule/byHeaderClassMemberFun/before/JS/JS.iml @@ -3,6 +3,7 @@ + Common diff --git a/idea/testData/refactoring/safeDeleteMultiModule/byHeaderClassMemberFun/before/JVM/JVM.iml b/idea/testData/refactoring/safeDeleteMultiModule/byHeaderClassMemberFun/before/JVM/JVM.iml index c3173af9ec7..76d2b885834 100644 --- a/idea/testData/refactoring/safeDeleteMultiModule/byHeaderClassMemberFun/before/JVM/JVM.iml +++ b/idea/testData/refactoring/safeDeleteMultiModule/byHeaderClassMemberFun/before/JVM/JVM.iml @@ -3,6 +3,7 @@ + Common diff --git a/idea/testData/refactoring/safeDeleteMultiModule/byHeaderClassMemberFunParameter/after/JS/JS.iml b/idea/testData/refactoring/safeDeleteMultiModule/byHeaderClassMemberFunParameter/after/JS/JS.iml index 82d3e6bdf49..3de270f43fa 100644 --- a/idea/testData/refactoring/safeDeleteMultiModule/byHeaderClassMemberFunParameter/after/JS/JS.iml +++ b/idea/testData/refactoring/safeDeleteMultiModule/byHeaderClassMemberFunParameter/after/JS/JS.iml @@ -3,6 +3,7 @@ + Common diff --git a/idea/testData/refactoring/safeDeleteMultiModule/byHeaderClassMemberFunParameter/after/JVM/JVM.iml b/idea/testData/refactoring/safeDeleteMultiModule/byHeaderClassMemberFunParameter/after/JVM/JVM.iml index c3173af9ec7..76d2b885834 100644 --- a/idea/testData/refactoring/safeDeleteMultiModule/byHeaderClassMemberFunParameter/after/JVM/JVM.iml +++ b/idea/testData/refactoring/safeDeleteMultiModule/byHeaderClassMemberFunParameter/after/JVM/JVM.iml @@ -3,6 +3,7 @@ + Common diff --git a/idea/testData/refactoring/safeDeleteMultiModule/byHeaderClassMemberFunParameter/before/JS/JS.iml b/idea/testData/refactoring/safeDeleteMultiModule/byHeaderClassMemberFunParameter/before/JS/JS.iml index 82d3e6bdf49..3de270f43fa 100644 --- a/idea/testData/refactoring/safeDeleteMultiModule/byHeaderClassMemberFunParameter/before/JS/JS.iml +++ b/idea/testData/refactoring/safeDeleteMultiModule/byHeaderClassMemberFunParameter/before/JS/JS.iml @@ -3,6 +3,7 @@ + Common diff --git a/idea/testData/refactoring/safeDeleteMultiModule/byHeaderClassMemberFunParameter/before/JVM/JVM.iml b/idea/testData/refactoring/safeDeleteMultiModule/byHeaderClassMemberFunParameter/before/JVM/JVM.iml index c3173af9ec7..76d2b885834 100644 --- a/idea/testData/refactoring/safeDeleteMultiModule/byHeaderClassMemberFunParameter/before/JVM/JVM.iml +++ b/idea/testData/refactoring/safeDeleteMultiModule/byHeaderClassMemberFunParameter/before/JVM/JVM.iml @@ -3,6 +3,7 @@ + Common diff --git a/idea/testData/refactoring/safeDeleteMultiModule/byHeaderClassMemberVal/after/JS/JS.iml b/idea/testData/refactoring/safeDeleteMultiModule/byHeaderClassMemberVal/after/JS/JS.iml index 82d3e6bdf49..3de270f43fa 100644 --- a/idea/testData/refactoring/safeDeleteMultiModule/byHeaderClassMemberVal/after/JS/JS.iml +++ b/idea/testData/refactoring/safeDeleteMultiModule/byHeaderClassMemberVal/after/JS/JS.iml @@ -3,6 +3,7 @@ + Common diff --git a/idea/testData/refactoring/safeDeleteMultiModule/byHeaderClassMemberVal/after/JVM/JVM.iml b/idea/testData/refactoring/safeDeleteMultiModule/byHeaderClassMemberVal/after/JVM/JVM.iml index c3173af9ec7..76d2b885834 100644 --- a/idea/testData/refactoring/safeDeleteMultiModule/byHeaderClassMemberVal/after/JVM/JVM.iml +++ b/idea/testData/refactoring/safeDeleteMultiModule/byHeaderClassMemberVal/after/JVM/JVM.iml @@ -3,6 +3,7 @@ + Common diff --git a/idea/testData/refactoring/safeDeleteMultiModule/byHeaderClassMemberVal/before/JS/JS.iml b/idea/testData/refactoring/safeDeleteMultiModule/byHeaderClassMemberVal/before/JS/JS.iml index 82d3e6bdf49..3de270f43fa 100644 --- a/idea/testData/refactoring/safeDeleteMultiModule/byHeaderClassMemberVal/before/JS/JS.iml +++ b/idea/testData/refactoring/safeDeleteMultiModule/byHeaderClassMemberVal/before/JS/JS.iml @@ -3,6 +3,7 @@ + Common diff --git a/idea/testData/refactoring/safeDeleteMultiModule/byHeaderClassMemberVal/before/JVM/JVM.iml b/idea/testData/refactoring/safeDeleteMultiModule/byHeaderClassMemberVal/before/JVM/JVM.iml index c3173af9ec7..76d2b885834 100644 --- a/idea/testData/refactoring/safeDeleteMultiModule/byHeaderClassMemberVal/before/JVM/JVM.iml +++ b/idea/testData/refactoring/safeDeleteMultiModule/byHeaderClassMemberVal/before/JVM/JVM.iml @@ -3,6 +3,7 @@ + Common diff --git a/idea/testData/refactoring/safeDeleteMultiModule/byHeaderClassPrimaryConstructorParameter/after/JS/JS.iml b/idea/testData/refactoring/safeDeleteMultiModule/byHeaderClassPrimaryConstructorParameter/after/JS/JS.iml index 82d3e6bdf49..3de270f43fa 100644 --- a/idea/testData/refactoring/safeDeleteMultiModule/byHeaderClassPrimaryConstructorParameter/after/JS/JS.iml +++ b/idea/testData/refactoring/safeDeleteMultiModule/byHeaderClassPrimaryConstructorParameter/after/JS/JS.iml @@ -3,6 +3,7 @@ + Common diff --git a/idea/testData/refactoring/safeDeleteMultiModule/byHeaderClassPrimaryConstructorParameter/after/JVM/JVM.iml b/idea/testData/refactoring/safeDeleteMultiModule/byHeaderClassPrimaryConstructorParameter/after/JVM/JVM.iml index c3173af9ec7..76d2b885834 100644 --- a/idea/testData/refactoring/safeDeleteMultiModule/byHeaderClassPrimaryConstructorParameter/after/JVM/JVM.iml +++ b/idea/testData/refactoring/safeDeleteMultiModule/byHeaderClassPrimaryConstructorParameter/after/JVM/JVM.iml @@ -3,6 +3,7 @@ + Common diff --git a/idea/testData/refactoring/safeDeleteMultiModule/byHeaderClassPrimaryConstructorParameter/before/JS/JS.iml b/idea/testData/refactoring/safeDeleteMultiModule/byHeaderClassPrimaryConstructorParameter/before/JS/JS.iml index 82d3e6bdf49..3de270f43fa 100644 --- a/idea/testData/refactoring/safeDeleteMultiModule/byHeaderClassPrimaryConstructorParameter/before/JS/JS.iml +++ b/idea/testData/refactoring/safeDeleteMultiModule/byHeaderClassPrimaryConstructorParameter/before/JS/JS.iml @@ -3,6 +3,7 @@ + Common diff --git a/idea/testData/refactoring/safeDeleteMultiModule/byHeaderClassPrimaryConstructorParameter/before/JVM/JVM.iml b/idea/testData/refactoring/safeDeleteMultiModule/byHeaderClassPrimaryConstructorParameter/before/JVM/JVM.iml index c3173af9ec7..76d2b885834 100644 --- a/idea/testData/refactoring/safeDeleteMultiModule/byHeaderClassPrimaryConstructorParameter/before/JVM/JVM.iml +++ b/idea/testData/refactoring/safeDeleteMultiModule/byHeaderClassPrimaryConstructorParameter/before/JVM/JVM.iml @@ -3,6 +3,7 @@ + Common diff --git a/idea/testData/refactoring/safeDeleteMultiModule/byHeaderClassSecondaryConstructor/after/JS/JS.iml b/idea/testData/refactoring/safeDeleteMultiModule/byHeaderClassSecondaryConstructor/after/JS/JS.iml index 82d3e6bdf49..3de270f43fa 100644 --- a/idea/testData/refactoring/safeDeleteMultiModule/byHeaderClassSecondaryConstructor/after/JS/JS.iml +++ b/idea/testData/refactoring/safeDeleteMultiModule/byHeaderClassSecondaryConstructor/after/JS/JS.iml @@ -3,6 +3,7 @@ + Common diff --git a/idea/testData/refactoring/safeDeleteMultiModule/byHeaderClassSecondaryConstructor/after/JVM/JVM.iml b/idea/testData/refactoring/safeDeleteMultiModule/byHeaderClassSecondaryConstructor/after/JVM/JVM.iml index c3173af9ec7..76d2b885834 100644 --- a/idea/testData/refactoring/safeDeleteMultiModule/byHeaderClassSecondaryConstructor/after/JVM/JVM.iml +++ b/idea/testData/refactoring/safeDeleteMultiModule/byHeaderClassSecondaryConstructor/after/JVM/JVM.iml @@ -3,6 +3,7 @@ + Common diff --git a/idea/testData/refactoring/safeDeleteMultiModule/byHeaderClassSecondaryConstructor/before/JS/JS.iml b/idea/testData/refactoring/safeDeleteMultiModule/byHeaderClassSecondaryConstructor/before/JS/JS.iml index 82d3e6bdf49..3de270f43fa 100644 --- a/idea/testData/refactoring/safeDeleteMultiModule/byHeaderClassSecondaryConstructor/before/JS/JS.iml +++ b/idea/testData/refactoring/safeDeleteMultiModule/byHeaderClassSecondaryConstructor/before/JS/JS.iml @@ -3,6 +3,7 @@ + Common diff --git a/idea/testData/refactoring/safeDeleteMultiModule/byHeaderClassSecondaryConstructor/before/JVM/JVM.iml b/idea/testData/refactoring/safeDeleteMultiModule/byHeaderClassSecondaryConstructor/before/JVM/JVM.iml index c3173af9ec7..76d2b885834 100644 --- a/idea/testData/refactoring/safeDeleteMultiModule/byHeaderClassSecondaryConstructor/before/JVM/JVM.iml +++ b/idea/testData/refactoring/safeDeleteMultiModule/byHeaderClassSecondaryConstructor/before/JVM/JVM.iml @@ -3,6 +3,7 @@ + Common diff --git a/idea/testData/refactoring/safeDeleteMultiModule/byHeaderClassSecondaryConstructorParameter/after/JS/JS.iml b/idea/testData/refactoring/safeDeleteMultiModule/byHeaderClassSecondaryConstructorParameter/after/JS/JS.iml index 82d3e6bdf49..3de270f43fa 100644 --- a/idea/testData/refactoring/safeDeleteMultiModule/byHeaderClassSecondaryConstructorParameter/after/JS/JS.iml +++ b/idea/testData/refactoring/safeDeleteMultiModule/byHeaderClassSecondaryConstructorParameter/after/JS/JS.iml @@ -3,6 +3,7 @@ + Common diff --git a/idea/testData/refactoring/safeDeleteMultiModule/byHeaderClassSecondaryConstructorParameter/after/JVM/JVM.iml b/idea/testData/refactoring/safeDeleteMultiModule/byHeaderClassSecondaryConstructorParameter/after/JVM/JVM.iml index c3173af9ec7..76d2b885834 100644 --- a/idea/testData/refactoring/safeDeleteMultiModule/byHeaderClassSecondaryConstructorParameter/after/JVM/JVM.iml +++ b/idea/testData/refactoring/safeDeleteMultiModule/byHeaderClassSecondaryConstructorParameter/after/JVM/JVM.iml @@ -3,6 +3,7 @@ + Common diff --git a/idea/testData/refactoring/safeDeleteMultiModule/byHeaderClassSecondaryConstructorParameter/before/JS/JS.iml b/idea/testData/refactoring/safeDeleteMultiModule/byHeaderClassSecondaryConstructorParameter/before/JS/JS.iml index 82d3e6bdf49..3de270f43fa 100644 --- a/idea/testData/refactoring/safeDeleteMultiModule/byHeaderClassSecondaryConstructorParameter/before/JS/JS.iml +++ b/idea/testData/refactoring/safeDeleteMultiModule/byHeaderClassSecondaryConstructorParameter/before/JS/JS.iml @@ -3,6 +3,7 @@ + Common diff --git a/idea/testData/refactoring/safeDeleteMultiModule/byHeaderClassSecondaryConstructorParameter/before/JVM/JVM.iml b/idea/testData/refactoring/safeDeleteMultiModule/byHeaderClassSecondaryConstructorParameter/before/JVM/JVM.iml index c3173af9ec7..76d2b885834 100644 --- a/idea/testData/refactoring/safeDeleteMultiModule/byHeaderClassSecondaryConstructorParameter/before/JVM/JVM.iml +++ b/idea/testData/refactoring/safeDeleteMultiModule/byHeaderClassSecondaryConstructorParameter/before/JVM/JVM.iml @@ -3,6 +3,7 @@ + Common diff --git a/idea/testData/refactoring/safeDeleteMultiModule/byHeaderFun/after/JS/JS.iml b/idea/testData/refactoring/safeDeleteMultiModule/byHeaderFun/after/JS/JS.iml index 82d3e6bdf49..3de270f43fa 100644 --- a/idea/testData/refactoring/safeDeleteMultiModule/byHeaderFun/after/JS/JS.iml +++ b/idea/testData/refactoring/safeDeleteMultiModule/byHeaderFun/after/JS/JS.iml @@ -3,6 +3,7 @@ + Common diff --git a/idea/testData/refactoring/safeDeleteMultiModule/byHeaderFun/after/JVM/JVM.iml b/idea/testData/refactoring/safeDeleteMultiModule/byHeaderFun/after/JVM/JVM.iml index c3173af9ec7..76d2b885834 100644 --- a/idea/testData/refactoring/safeDeleteMultiModule/byHeaderFun/after/JVM/JVM.iml +++ b/idea/testData/refactoring/safeDeleteMultiModule/byHeaderFun/after/JVM/JVM.iml @@ -3,6 +3,7 @@ + Common diff --git a/idea/testData/refactoring/safeDeleteMultiModule/byHeaderFun/before/JS/JS.iml b/idea/testData/refactoring/safeDeleteMultiModule/byHeaderFun/before/JS/JS.iml index 82d3e6bdf49..3de270f43fa 100644 --- a/idea/testData/refactoring/safeDeleteMultiModule/byHeaderFun/before/JS/JS.iml +++ b/idea/testData/refactoring/safeDeleteMultiModule/byHeaderFun/before/JS/JS.iml @@ -3,6 +3,7 @@ + Common diff --git a/idea/testData/refactoring/safeDeleteMultiModule/byHeaderFun/before/JVM/JVM.iml b/idea/testData/refactoring/safeDeleteMultiModule/byHeaderFun/before/JVM/JVM.iml index c3173af9ec7..76d2b885834 100644 --- a/idea/testData/refactoring/safeDeleteMultiModule/byHeaderFun/before/JVM/JVM.iml +++ b/idea/testData/refactoring/safeDeleteMultiModule/byHeaderFun/before/JVM/JVM.iml @@ -3,6 +3,7 @@ + Common diff --git a/idea/testData/refactoring/safeDeleteMultiModule/byHeaderFunParamerer/after/JS/JS.iml b/idea/testData/refactoring/safeDeleteMultiModule/byHeaderFunParamerer/after/JS/JS.iml index 82d3e6bdf49..3de270f43fa 100644 --- a/idea/testData/refactoring/safeDeleteMultiModule/byHeaderFunParamerer/after/JS/JS.iml +++ b/idea/testData/refactoring/safeDeleteMultiModule/byHeaderFunParamerer/after/JS/JS.iml @@ -3,6 +3,7 @@ + Common diff --git a/idea/testData/refactoring/safeDeleteMultiModule/byHeaderFunParamerer/after/JVM/JVM.iml b/idea/testData/refactoring/safeDeleteMultiModule/byHeaderFunParamerer/after/JVM/JVM.iml index c3173af9ec7..76d2b885834 100644 --- a/idea/testData/refactoring/safeDeleteMultiModule/byHeaderFunParamerer/after/JVM/JVM.iml +++ b/idea/testData/refactoring/safeDeleteMultiModule/byHeaderFunParamerer/after/JVM/JVM.iml @@ -3,6 +3,7 @@ + Common diff --git a/idea/testData/refactoring/safeDeleteMultiModule/byHeaderFunParamerer/before/JS/JS.iml b/idea/testData/refactoring/safeDeleteMultiModule/byHeaderFunParamerer/before/JS/JS.iml index 82d3e6bdf49..3de270f43fa 100644 --- a/idea/testData/refactoring/safeDeleteMultiModule/byHeaderFunParamerer/before/JS/JS.iml +++ b/idea/testData/refactoring/safeDeleteMultiModule/byHeaderFunParamerer/before/JS/JS.iml @@ -3,6 +3,7 @@ + Common diff --git a/idea/testData/refactoring/safeDeleteMultiModule/byHeaderFunParamerer/before/JVM/JVM.iml b/idea/testData/refactoring/safeDeleteMultiModule/byHeaderFunParamerer/before/JVM/JVM.iml index c3173af9ec7..76d2b885834 100644 --- a/idea/testData/refactoring/safeDeleteMultiModule/byHeaderFunParamerer/before/JVM/JVM.iml +++ b/idea/testData/refactoring/safeDeleteMultiModule/byHeaderFunParamerer/before/JVM/JVM.iml @@ -3,6 +3,7 @@ + Common diff --git a/idea/testData/refactoring/safeDeleteMultiModule/byHeaderFunVarargParamerer/after/JS/JS.iml b/idea/testData/refactoring/safeDeleteMultiModule/byHeaderFunVarargParamerer/after/JS/JS.iml index 82d3e6bdf49..3de270f43fa 100644 --- a/idea/testData/refactoring/safeDeleteMultiModule/byHeaderFunVarargParamerer/after/JS/JS.iml +++ b/idea/testData/refactoring/safeDeleteMultiModule/byHeaderFunVarargParamerer/after/JS/JS.iml @@ -3,6 +3,7 @@ + Common diff --git a/idea/testData/refactoring/safeDeleteMultiModule/byHeaderFunVarargParamerer/after/JVM/JVM.iml b/idea/testData/refactoring/safeDeleteMultiModule/byHeaderFunVarargParamerer/after/JVM/JVM.iml index c3173af9ec7..76d2b885834 100644 --- a/idea/testData/refactoring/safeDeleteMultiModule/byHeaderFunVarargParamerer/after/JVM/JVM.iml +++ b/idea/testData/refactoring/safeDeleteMultiModule/byHeaderFunVarargParamerer/after/JVM/JVM.iml @@ -3,6 +3,7 @@ + Common diff --git a/idea/testData/refactoring/safeDeleteMultiModule/byHeaderFunVarargParamerer/before/JS/JS.iml b/idea/testData/refactoring/safeDeleteMultiModule/byHeaderFunVarargParamerer/before/JS/JS.iml index 82d3e6bdf49..3de270f43fa 100644 --- a/idea/testData/refactoring/safeDeleteMultiModule/byHeaderFunVarargParamerer/before/JS/JS.iml +++ b/idea/testData/refactoring/safeDeleteMultiModule/byHeaderFunVarargParamerer/before/JS/JS.iml @@ -3,6 +3,7 @@ + Common diff --git a/idea/testData/refactoring/safeDeleteMultiModule/byHeaderFunVarargParamerer/before/JVM/JVM.iml b/idea/testData/refactoring/safeDeleteMultiModule/byHeaderFunVarargParamerer/before/JVM/JVM.iml index c3173af9ec7..76d2b885834 100644 --- a/idea/testData/refactoring/safeDeleteMultiModule/byHeaderFunVarargParamerer/before/JVM/JVM.iml +++ b/idea/testData/refactoring/safeDeleteMultiModule/byHeaderFunVarargParamerer/before/JVM/JVM.iml @@ -3,6 +3,7 @@ + Common diff --git a/idea/testData/refactoring/safeDeleteMultiModule/byHeaderVal/after/JS/JS.iml b/idea/testData/refactoring/safeDeleteMultiModule/byHeaderVal/after/JS/JS.iml index 82d3e6bdf49..3de270f43fa 100644 --- a/idea/testData/refactoring/safeDeleteMultiModule/byHeaderVal/after/JS/JS.iml +++ b/idea/testData/refactoring/safeDeleteMultiModule/byHeaderVal/after/JS/JS.iml @@ -3,6 +3,7 @@ + Common diff --git a/idea/testData/refactoring/safeDeleteMultiModule/byHeaderVal/after/JVM/JVM.iml b/idea/testData/refactoring/safeDeleteMultiModule/byHeaderVal/after/JVM/JVM.iml index c3173af9ec7..76d2b885834 100644 --- a/idea/testData/refactoring/safeDeleteMultiModule/byHeaderVal/after/JVM/JVM.iml +++ b/idea/testData/refactoring/safeDeleteMultiModule/byHeaderVal/after/JVM/JVM.iml @@ -3,6 +3,7 @@ + Common diff --git a/idea/testData/refactoring/safeDeleteMultiModule/byHeaderVal/before/JS/JS.iml b/idea/testData/refactoring/safeDeleteMultiModule/byHeaderVal/before/JS/JS.iml index 82d3e6bdf49..3de270f43fa 100644 --- a/idea/testData/refactoring/safeDeleteMultiModule/byHeaderVal/before/JS/JS.iml +++ b/idea/testData/refactoring/safeDeleteMultiModule/byHeaderVal/before/JS/JS.iml @@ -3,6 +3,7 @@ + Common diff --git a/idea/testData/refactoring/safeDeleteMultiModule/byHeaderVal/before/JVM/JVM.iml b/idea/testData/refactoring/safeDeleteMultiModule/byHeaderVal/before/JVM/JVM.iml index c3173af9ec7..76d2b885834 100644 --- a/idea/testData/refactoring/safeDeleteMultiModule/byHeaderVal/before/JVM/JVM.iml +++ b/idea/testData/refactoring/safeDeleteMultiModule/byHeaderVal/before/JVM/JVM.iml @@ -3,6 +3,7 @@ + Common diff --git a/idea/testData/refactoring/safeDeleteMultiModule/byImplClass/after/JS/JS.iml b/idea/testData/refactoring/safeDeleteMultiModule/byImplClass/after/JS/JS.iml index 82d3e6bdf49..3de270f43fa 100644 --- a/idea/testData/refactoring/safeDeleteMultiModule/byImplClass/after/JS/JS.iml +++ b/idea/testData/refactoring/safeDeleteMultiModule/byImplClass/after/JS/JS.iml @@ -3,6 +3,7 @@ + Common diff --git a/idea/testData/refactoring/safeDeleteMultiModule/byImplClass/after/JVM/JVM.iml b/idea/testData/refactoring/safeDeleteMultiModule/byImplClass/after/JVM/JVM.iml index c3173af9ec7..76d2b885834 100644 --- a/idea/testData/refactoring/safeDeleteMultiModule/byImplClass/after/JVM/JVM.iml +++ b/idea/testData/refactoring/safeDeleteMultiModule/byImplClass/after/JVM/JVM.iml @@ -3,6 +3,7 @@ + Common diff --git a/idea/testData/refactoring/safeDeleteMultiModule/byImplClass/before/JS/JS.iml b/idea/testData/refactoring/safeDeleteMultiModule/byImplClass/before/JS/JS.iml index 82d3e6bdf49..3de270f43fa 100644 --- a/idea/testData/refactoring/safeDeleteMultiModule/byImplClass/before/JS/JS.iml +++ b/idea/testData/refactoring/safeDeleteMultiModule/byImplClass/before/JS/JS.iml @@ -3,6 +3,7 @@ + Common diff --git a/idea/testData/refactoring/safeDeleteMultiModule/byImplClass/before/JVM/JVM.iml b/idea/testData/refactoring/safeDeleteMultiModule/byImplClass/before/JVM/JVM.iml index c3173af9ec7..76d2b885834 100644 --- a/idea/testData/refactoring/safeDeleteMultiModule/byImplClass/before/JVM/JVM.iml +++ b/idea/testData/refactoring/safeDeleteMultiModule/byImplClass/before/JVM/JVM.iml @@ -3,6 +3,7 @@ + Common diff --git a/idea/testData/refactoring/safeDeleteMultiModule/byImplClassMemberFun/after/JS/JS.iml b/idea/testData/refactoring/safeDeleteMultiModule/byImplClassMemberFun/after/JS/JS.iml index 82d3e6bdf49..3de270f43fa 100644 --- a/idea/testData/refactoring/safeDeleteMultiModule/byImplClassMemberFun/after/JS/JS.iml +++ b/idea/testData/refactoring/safeDeleteMultiModule/byImplClassMemberFun/after/JS/JS.iml @@ -3,6 +3,7 @@ + Common diff --git a/idea/testData/refactoring/safeDeleteMultiModule/byImplClassMemberFun/after/JVM/JVM.iml b/idea/testData/refactoring/safeDeleteMultiModule/byImplClassMemberFun/after/JVM/JVM.iml index c3173af9ec7..76d2b885834 100644 --- a/idea/testData/refactoring/safeDeleteMultiModule/byImplClassMemberFun/after/JVM/JVM.iml +++ b/idea/testData/refactoring/safeDeleteMultiModule/byImplClassMemberFun/after/JVM/JVM.iml @@ -3,6 +3,7 @@ + Common diff --git a/idea/testData/refactoring/safeDeleteMultiModule/byImplClassMemberFun/before/JS/JS.iml b/idea/testData/refactoring/safeDeleteMultiModule/byImplClassMemberFun/before/JS/JS.iml index 82d3e6bdf49..3de270f43fa 100644 --- a/idea/testData/refactoring/safeDeleteMultiModule/byImplClassMemberFun/before/JS/JS.iml +++ b/idea/testData/refactoring/safeDeleteMultiModule/byImplClassMemberFun/before/JS/JS.iml @@ -3,6 +3,7 @@ + Common diff --git a/idea/testData/refactoring/safeDeleteMultiModule/byImplClassMemberFun/before/JVM/JVM.iml b/idea/testData/refactoring/safeDeleteMultiModule/byImplClassMemberFun/before/JVM/JVM.iml index c3173af9ec7..76d2b885834 100644 --- a/idea/testData/refactoring/safeDeleteMultiModule/byImplClassMemberFun/before/JVM/JVM.iml +++ b/idea/testData/refactoring/safeDeleteMultiModule/byImplClassMemberFun/before/JVM/JVM.iml @@ -3,6 +3,7 @@ + Common diff --git a/idea/testData/refactoring/safeDeleteMultiModule/byImplClassMemberFunParameterLiftingToHeader/after/JS/JS.iml b/idea/testData/refactoring/safeDeleteMultiModule/byImplClassMemberFunParameterLiftingToHeader/after/JS/JS.iml index 82d3e6bdf49..3de270f43fa 100644 --- a/idea/testData/refactoring/safeDeleteMultiModule/byImplClassMemberFunParameterLiftingToHeader/after/JS/JS.iml +++ b/idea/testData/refactoring/safeDeleteMultiModule/byImplClassMemberFunParameterLiftingToHeader/after/JS/JS.iml @@ -3,6 +3,7 @@ + Common diff --git a/idea/testData/refactoring/safeDeleteMultiModule/byImplClassMemberFunParameterLiftingToHeader/after/JVM/JVM.iml b/idea/testData/refactoring/safeDeleteMultiModule/byImplClassMemberFunParameterLiftingToHeader/after/JVM/JVM.iml index c3173af9ec7..76d2b885834 100644 --- a/idea/testData/refactoring/safeDeleteMultiModule/byImplClassMemberFunParameterLiftingToHeader/after/JVM/JVM.iml +++ b/idea/testData/refactoring/safeDeleteMultiModule/byImplClassMemberFunParameterLiftingToHeader/after/JVM/JVM.iml @@ -3,6 +3,7 @@ + Common diff --git a/idea/testData/refactoring/safeDeleteMultiModule/byImplClassMemberFunParameterLiftingToHeader/before/JS/JS.iml b/idea/testData/refactoring/safeDeleteMultiModule/byImplClassMemberFunParameterLiftingToHeader/before/JS/JS.iml index 82d3e6bdf49..3de270f43fa 100644 --- a/idea/testData/refactoring/safeDeleteMultiModule/byImplClassMemberFunParameterLiftingToHeader/before/JS/JS.iml +++ b/idea/testData/refactoring/safeDeleteMultiModule/byImplClassMemberFunParameterLiftingToHeader/before/JS/JS.iml @@ -3,6 +3,7 @@ + Common diff --git a/idea/testData/refactoring/safeDeleteMultiModule/byImplClassMemberFunParameterLiftingToHeader/before/JVM/JVM.iml b/idea/testData/refactoring/safeDeleteMultiModule/byImplClassMemberFunParameterLiftingToHeader/before/JVM/JVM.iml index c3173af9ec7..76d2b885834 100644 --- a/idea/testData/refactoring/safeDeleteMultiModule/byImplClassMemberFunParameterLiftingToHeader/before/JVM/JVM.iml +++ b/idea/testData/refactoring/safeDeleteMultiModule/byImplClassMemberFunParameterLiftingToHeader/before/JVM/JVM.iml @@ -3,6 +3,7 @@ + Common diff --git a/idea/testData/refactoring/safeDeleteMultiModule/byImplClassMemberVal/after/JS/JS.iml b/idea/testData/refactoring/safeDeleteMultiModule/byImplClassMemberVal/after/JS/JS.iml index 82d3e6bdf49..3de270f43fa 100644 --- a/idea/testData/refactoring/safeDeleteMultiModule/byImplClassMemberVal/after/JS/JS.iml +++ b/idea/testData/refactoring/safeDeleteMultiModule/byImplClassMemberVal/after/JS/JS.iml @@ -3,6 +3,7 @@ + Common diff --git a/idea/testData/refactoring/safeDeleteMultiModule/byImplClassMemberVal/after/JVM/JVM.iml b/idea/testData/refactoring/safeDeleteMultiModule/byImplClassMemberVal/after/JVM/JVM.iml index c3173af9ec7..76d2b885834 100644 --- a/idea/testData/refactoring/safeDeleteMultiModule/byImplClassMemberVal/after/JVM/JVM.iml +++ b/idea/testData/refactoring/safeDeleteMultiModule/byImplClassMemberVal/after/JVM/JVM.iml @@ -3,6 +3,7 @@ + Common diff --git a/idea/testData/refactoring/safeDeleteMultiModule/byImplClassMemberVal/before/JS/JS.iml b/idea/testData/refactoring/safeDeleteMultiModule/byImplClassMemberVal/before/JS/JS.iml index 82d3e6bdf49..3de270f43fa 100644 --- a/idea/testData/refactoring/safeDeleteMultiModule/byImplClassMemberVal/before/JS/JS.iml +++ b/idea/testData/refactoring/safeDeleteMultiModule/byImplClassMemberVal/before/JS/JS.iml @@ -3,6 +3,7 @@ + Common diff --git a/idea/testData/refactoring/safeDeleteMultiModule/byImplClassMemberVal/before/JVM/JVM.iml b/idea/testData/refactoring/safeDeleteMultiModule/byImplClassMemberVal/before/JVM/JVM.iml index c3173af9ec7..76d2b885834 100644 --- a/idea/testData/refactoring/safeDeleteMultiModule/byImplClassMemberVal/before/JVM/JVM.iml +++ b/idea/testData/refactoring/safeDeleteMultiModule/byImplClassMemberVal/before/JVM/JVM.iml @@ -3,6 +3,7 @@ + Common diff --git a/idea/testData/refactoring/safeDeleteMultiModule/byImplClassPrimaryConstructorParameterLiftingToHeader/after/JS/JS.iml b/idea/testData/refactoring/safeDeleteMultiModule/byImplClassPrimaryConstructorParameterLiftingToHeader/after/JS/JS.iml index 82d3e6bdf49..3de270f43fa 100644 --- a/idea/testData/refactoring/safeDeleteMultiModule/byImplClassPrimaryConstructorParameterLiftingToHeader/after/JS/JS.iml +++ b/idea/testData/refactoring/safeDeleteMultiModule/byImplClassPrimaryConstructorParameterLiftingToHeader/after/JS/JS.iml @@ -3,6 +3,7 @@ + Common diff --git a/idea/testData/refactoring/safeDeleteMultiModule/byImplClassPrimaryConstructorParameterLiftingToHeader/after/JVM/JVM.iml b/idea/testData/refactoring/safeDeleteMultiModule/byImplClassPrimaryConstructorParameterLiftingToHeader/after/JVM/JVM.iml index c3173af9ec7..76d2b885834 100644 --- a/idea/testData/refactoring/safeDeleteMultiModule/byImplClassPrimaryConstructorParameterLiftingToHeader/after/JVM/JVM.iml +++ b/idea/testData/refactoring/safeDeleteMultiModule/byImplClassPrimaryConstructorParameterLiftingToHeader/after/JVM/JVM.iml @@ -3,6 +3,7 @@ + Common diff --git a/idea/testData/refactoring/safeDeleteMultiModule/byImplClassPrimaryConstructorParameterLiftingToHeader/before/JS/JS.iml b/idea/testData/refactoring/safeDeleteMultiModule/byImplClassPrimaryConstructorParameterLiftingToHeader/before/JS/JS.iml index 82d3e6bdf49..3de270f43fa 100644 --- a/idea/testData/refactoring/safeDeleteMultiModule/byImplClassPrimaryConstructorParameterLiftingToHeader/before/JS/JS.iml +++ b/idea/testData/refactoring/safeDeleteMultiModule/byImplClassPrimaryConstructorParameterLiftingToHeader/before/JS/JS.iml @@ -3,6 +3,7 @@ + Common diff --git a/idea/testData/refactoring/safeDeleteMultiModule/byImplClassPrimaryConstructorParameterLiftingToHeader/before/JVM/JVM.iml b/idea/testData/refactoring/safeDeleteMultiModule/byImplClassPrimaryConstructorParameterLiftingToHeader/before/JVM/JVM.iml index c3173af9ec7..76d2b885834 100644 --- a/idea/testData/refactoring/safeDeleteMultiModule/byImplClassPrimaryConstructorParameterLiftingToHeader/before/JVM/JVM.iml +++ b/idea/testData/refactoring/safeDeleteMultiModule/byImplClassPrimaryConstructorParameterLiftingToHeader/before/JVM/JVM.iml @@ -3,6 +3,7 @@ + Common diff --git a/idea/testData/refactoring/safeDeleteMultiModule/byImplClassSecondaryConstructor/after/JS/JS.iml b/idea/testData/refactoring/safeDeleteMultiModule/byImplClassSecondaryConstructor/after/JS/JS.iml index 82d3e6bdf49..3de270f43fa 100644 --- a/idea/testData/refactoring/safeDeleteMultiModule/byImplClassSecondaryConstructor/after/JS/JS.iml +++ b/idea/testData/refactoring/safeDeleteMultiModule/byImplClassSecondaryConstructor/after/JS/JS.iml @@ -3,6 +3,7 @@ + Common diff --git a/idea/testData/refactoring/safeDeleteMultiModule/byImplClassSecondaryConstructor/after/JVM/JVM.iml b/idea/testData/refactoring/safeDeleteMultiModule/byImplClassSecondaryConstructor/after/JVM/JVM.iml index c3173af9ec7..76d2b885834 100644 --- a/idea/testData/refactoring/safeDeleteMultiModule/byImplClassSecondaryConstructor/after/JVM/JVM.iml +++ b/idea/testData/refactoring/safeDeleteMultiModule/byImplClassSecondaryConstructor/after/JVM/JVM.iml @@ -3,6 +3,7 @@ + Common diff --git a/idea/testData/refactoring/safeDeleteMultiModule/byImplClassSecondaryConstructor/before/JS/JS.iml b/idea/testData/refactoring/safeDeleteMultiModule/byImplClassSecondaryConstructor/before/JS/JS.iml index 82d3e6bdf49..3de270f43fa 100644 --- a/idea/testData/refactoring/safeDeleteMultiModule/byImplClassSecondaryConstructor/before/JS/JS.iml +++ b/idea/testData/refactoring/safeDeleteMultiModule/byImplClassSecondaryConstructor/before/JS/JS.iml @@ -3,6 +3,7 @@ + Common diff --git a/idea/testData/refactoring/safeDeleteMultiModule/byImplClassSecondaryConstructor/before/JVM/JVM.iml b/idea/testData/refactoring/safeDeleteMultiModule/byImplClassSecondaryConstructor/before/JVM/JVM.iml index c3173af9ec7..76d2b885834 100644 --- a/idea/testData/refactoring/safeDeleteMultiModule/byImplClassSecondaryConstructor/before/JVM/JVM.iml +++ b/idea/testData/refactoring/safeDeleteMultiModule/byImplClassSecondaryConstructor/before/JVM/JVM.iml @@ -3,6 +3,7 @@ + Common diff --git a/idea/testData/refactoring/safeDeleteMultiModule/byImplClassSecondaryConstructorParameterLiftingToHeader/after/JS/JS.iml b/idea/testData/refactoring/safeDeleteMultiModule/byImplClassSecondaryConstructorParameterLiftingToHeader/after/JS/JS.iml index 82d3e6bdf49..3de270f43fa 100644 --- a/idea/testData/refactoring/safeDeleteMultiModule/byImplClassSecondaryConstructorParameterLiftingToHeader/after/JS/JS.iml +++ b/idea/testData/refactoring/safeDeleteMultiModule/byImplClassSecondaryConstructorParameterLiftingToHeader/after/JS/JS.iml @@ -3,6 +3,7 @@ + Common diff --git a/idea/testData/refactoring/safeDeleteMultiModule/byImplClassSecondaryConstructorParameterLiftingToHeader/after/JVM/JVM.iml b/idea/testData/refactoring/safeDeleteMultiModule/byImplClassSecondaryConstructorParameterLiftingToHeader/after/JVM/JVM.iml index c3173af9ec7..76d2b885834 100644 --- a/idea/testData/refactoring/safeDeleteMultiModule/byImplClassSecondaryConstructorParameterLiftingToHeader/after/JVM/JVM.iml +++ b/idea/testData/refactoring/safeDeleteMultiModule/byImplClassSecondaryConstructorParameterLiftingToHeader/after/JVM/JVM.iml @@ -3,6 +3,7 @@ + Common diff --git a/idea/testData/refactoring/safeDeleteMultiModule/byImplClassSecondaryConstructorParameterLiftingToHeader/before/JS/JS.iml b/idea/testData/refactoring/safeDeleteMultiModule/byImplClassSecondaryConstructorParameterLiftingToHeader/before/JS/JS.iml index 82d3e6bdf49..3de270f43fa 100644 --- a/idea/testData/refactoring/safeDeleteMultiModule/byImplClassSecondaryConstructorParameterLiftingToHeader/before/JS/JS.iml +++ b/idea/testData/refactoring/safeDeleteMultiModule/byImplClassSecondaryConstructorParameterLiftingToHeader/before/JS/JS.iml @@ -3,6 +3,7 @@ + Common diff --git a/idea/testData/refactoring/safeDeleteMultiModule/byImplClassSecondaryConstructorParameterLiftingToHeader/before/JVM/JVM.iml b/idea/testData/refactoring/safeDeleteMultiModule/byImplClassSecondaryConstructorParameterLiftingToHeader/before/JVM/JVM.iml index c3173af9ec7..76d2b885834 100644 --- a/idea/testData/refactoring/safeDeleteMultiModule/byImplClassSecondaryConstructorParameterLiftingToHeader/before/JVM/JVM.iml +++ b/idea/testData/refactoring/safeDeleteMultiModule/byImplClassSecondaryConstructorParameterLiftingToHeader/before/JVM/JVM.iml @@ -3,6 +3,7 @@ + Common diff --git a/idea/testData/refactoring/safeDeleteMultiModule/byImplFun/after/JS/JS.iml b/idea/testData/refactoring/safeDeleteMultiModule/byImplFun/after/JS/JS.iml index 82d3e6bdf49..3de270f43fa 100644 --- a/idea/testData/refactoring/safeDeleteMultiModule/byImplFun/after/JS/JS.iml +++ b/idea/testData/refactoring/safeDeleteMultiModule/byImplFun/after/JS/JS.iml @@ -3,6 +3,7 @@ + Common diff --git a/idea/testData/refactoring/safeDeleteMultiModule/byImplFun/after/JVM/JVM.iml b/idea/testData/refactoring/safeDeleteMultiModule/byImplFun/after/JVM/JVM.iml index c3173af9ec7..76d2b885834 100644 --- a/idea/testData/refactoring/safeDeleteMultiModule/byImplFun/after/JVM/JVM.iml +++ b/idea/testData/refactoring/safeDeleteMultiModule/byImplFun/after/JVM/JVM.iml @@ -3,6 +3,7 @@ + Common diff --git a/idea/testData/refactoring/safeDeleteMultiModule/byImplFun/before/JS/JS.iml b/idea/testData/refactoring/safeDeleteMultiModule/byImplFun/before/JS/JS.iml index 82d3e6bdf49..3de270f43fa 100644 --- a/idea/testData/refactoring/safeDeleteMultiModule/byImplFun/before/JS/JS.iml +++ b/idea/testData/refactoring/safeDeleteMultiModule/byImplFun/before/JS/JS.iml @@ -3,6 +3,7 @@ + Common diff --git a/idea/testData/refactoring/safeDeleteMultiModule/byImplFun/before/JVM/JVM.iml b/idea/testData/refactoring/safeDeleteMultiModule/byImplFun/before/JVM/JVM.iml index c3173af9ec7..76d2b885834 100644 --- a/idea/testData/refactoring/safeDeleteMultiModule/byImplFun/before/JVM/JVM.iml +++ b/idea/testData/refactoring/safeDeleteMultiModule/byImplFun/before/JVM/JVM.iml @@ -3,6 +3,7 @@ + Common diff --git a/idea/testData/refactoring/safeDeleteMultiModule/byImplFunParamererLiftingToHeader/after/JS/JS.iml b/idea/testData/refactoring/safeDeleteMultiModule/byImplFunParamererLiftingToHeader/after/JS/JS.iml index 82d3e6bdf49..3de270f43fa 100644 --- a/idea/testData/refactoring/safeDeleteMultiModule/byImplFunParamererLiftingToHeader/after/JS/JS.iml +++ b/idea/testData/refactoring/safeDeleteMultiModule/byImplFunParamererLiftingToHeader/after/JS/JS.iml @@ -3,6 +3,7 @@ + Common diff --git a/idea/testData/refactoring/safeDeleteMultiModule/byImplFunParamererLiftingToHeader/after/JVM/JVM.iml b/idea/testData/refactoring/safeDeleteMultiModule/byImplFunParamererLiftingToHeader/after/JVM/JVM.iml index c3173af9ec7..76d2b885834 100644 --- a/idea/testData/refactoring/safeDeleteMultiModule/byImplFunParamererLiftingToHeader/after/JVM/JVM.iml +++ b/idea/testData/refactoring/safeDeleteMultiModule/byImplFunParamererLiftingToHeader/after/JVM/JVM.iml @@ -3,6 +3,7 @@ + Common diff --git a/idea/testData/refactoring/safeDeleteMultiModule/byImplFunParamererLiftingToHeader/before/JS/JS.iml b/idea/testData/refactoring/safeDeleteMultiModule/byImplFunParamererLiftingToHeader/before/JS/JS.iml index 82d3e6bdf49..3de270f43fa 100644 --- a/idea/testData/refactoring/safeDeleteMultiModule/byImplFunParamererLiftingToHeader/before/JS/JS.iml +++ b/idea/testData/refactoring/safeDeleteMultiModule/byImplFunParamererLiftingToHeader/before/JS/JS.iml @@ -3,6 +3,7 @@ + Common diff --git a/idea/testData/refactoring/safeDeleteMultiModule/byImplFunParamererLiftingToHeader/before/JVM/JVM.iml b/idea/testData/refactoring/safeDeleteMultiModule/byImplFunParamererLiftingToHeader/before/JVM/JVM.iml index c3173af9ec7..76d2b885834 100644 --- a/idea/testData/refactoring/safeDeleteMultiModule/byImplFunParamererLiftingToHeader/before/JVM/JVM.iml +++ b/idea/testData/refactoring/safeDeleteMultiModule/byImplFunParamererLiftingToHeader/before/JVM/JVM.iml @@ -3,6 +3,7 @@ + Common diff --git a/idea/testData/refactoring/safeDeleteMultiModule/byImplFunParamererNoLiftingToHeader/after/JS/JS.iml b/idea/testData/refactoring/safeDeleteMultiModule/byImplFunParamererNoLiftingToHeader/after/JS/JS.iml index 82d3e6bdf49..3de270f43fa 100644 --- a/idea/testData/refactoring/safeDeleteMultiModule/byImplFunParamererNoLiftingToHeader/after/JS/JS.iml +++ b/idea/testData/refactoring/safeDeleteMultiModule/byImplFunParamererNoLiftingToHeader/after/JS/JS.iml @@ -3,6 +3,7 @@ + Common diff --git a/idea/testData/refactoring/safeDeleteMultiModule/byImplFunParamererNoLiftingToHeader/after/JVM/JVM.iml b/idea/testData/refactoring/safeDeleteMultiModule/byImplFunParamererNoLiftingToHeader/after/JVM/JVM.iml index c3173af9ec7..76d2b885834 100644 --- a/idea/testData/refactoring/safeDeleteMultiModule/byImplFunParamererNoLiftingToHeader/after/JVM/JVM.iml +++ b/idea/testData/refactoring/safeDeleteMultiModule/byImplFunParamererNoLiftingToHeader/after/JVM/JVM.iml @@ -3,6 +3,7 @@ + Common diff --git a/idea/testData/refactoring/safeDeleteMultiModule/byImplFunParamererNoLiftingToHeader/before/JS/JS.iml b/idea/testData/refactoring/safeDeleteMultiModule/byImplFunParamererNoLiftingToHeader/before/JS/JS.iml index 82d3e6bdf49..3de270f43fa 100644 --- a/idea/testData/refactoring/safeDeleteMultiModule/byImplFunParamererNoLiftingToHeader/before/JS/JS.iml +++ b/idea/testData/refactoring/safeDeleteMultiModule/byImplFunParamererNoLiftingToHeader/before/JS/JS.iml @@ -3,6 +3,7 @@ + Common diff --git a/idea/testData/refactoring/safeDeleteMultiModule/byImplFunParamererNoLiftingToHeader/before/JVM/JVM.iml b/idea/testData/refactoring/safeDeleteMultiModule/byImplFunParamererNoLiftingToHeader/before/JVM/JVM.iml index c3173af9ec7..76d2b885834 100644 --- a/idea/testData/refactoring/safeDeleteMultiModule/byImplFunParamererNoLiftingToHeader/before/JVM/JVM.iml +++ b/idea/testData/refactoring/safeDeleteMultiModule/byImplFunParamererNoLiftingToHeader/before/JVM/JVM.iml @@ -3,6 +3,7 @@ + Common diff --git a/idea/testData/refactoring/safeDeleteMultiModule/byImplVal/after/JS/JS.iml b/idea/testData/refactoring/safeDeleteMultiModule/byImplVal/after/JS/JS.iml index 82d3e6bdf49..3de270f43fa 100644 --- a/idea/testData/refactoring/safeDeleteMultiModule/byImplVal/after/JS/JS.iml +++ b/idea/testData/refactoring/safeDeleteMultiModule/byImplVal/after/JS/JS.iml @@ -3,6 +3,7 @@ + Common diff --git a/idea/testData/refactoring/safeDeleteMultiModule/byImplVal/after/JVM/JVM.iml b/idea/testData/refactoring/safeDeleteMultiModule/byImplVal/after/JVM/JVM.iml index c3173af9ec7..76d2b885834 100644 --- a/idea/testData/refactoring/safeDeleteMultiModule/byImplVal/after/JVM/JVM.iml +++ b/idea/testData/refactoring/safeDeleteMultiModule/byImplVal/after/JVM/JVM.iml @@ -3,6 +3,7 @@ + Common diff --git a/idea/testData/refactoring/safeDeleteMultiModule/byImplVal/before/JS/JS.iml b/idea/testData/refactoring/safeDeleteMultiModule/byImplVal/before/JS/JS.iml index 82d3e6bdf49..3de270f43fa 100644 --- a/idea/testData/refactoring/safeDeleteMultiModule/byImplVal/before/JS/JS.iml +++ b/idea/testData/refactoring/safeDeleteMultiModule/byImplVal/before/JS/JS.iml @@ -3,6 +3,7 @@ + Common diff --git a/idea/testData/refactoring/safeDeleteMultiModule/byImplVal/before/JVM/JVM.iml b/idea/testData/refactoring/safeDeleteMultiModule/byImplVal/before/JVM/JVM.iml index c3173af9ec7..76d2b885834 100644 --- a/idea/testData/refactoring/safeDeleteMultiModule/byImplVal/before/JVM/JVM.iml +++ b/idea/testData/refactoring/safeDeleteMultiModule/byImplVal/before/JVM/JVM.iml @@ -3,6 +3,7 @@ + Common diff --git a/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixMultiModuleTest.kt b/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixMultiModuleTest.kt index 7a393f9c782..e1a8960d49b 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixMultiModuleTest.kt +++ b/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixMultiModuleTest.kt @@ -32,7 +32,7 @@ class QuickFixMultiModuleTest : AbstractQuickFixMultiModuleTest() { impls.forEach { (implName, implKind) -> val implModule = module(implName, hasTestRoot = withTests) - implModule.createFacet(implKind) + implModule.createFacet(implKind, implementedModuleName = expectName) implModule.enableMultiPlatform() implModule.addDependency(commonModule) } From b288406e3c331edf3d4afc5bad0f312315e453b3 Mon Sep 17 00:00:00 2001 From: Alexey Sedunov Date: Fri, 29 Sep 2017 18:25:29 +0300 Subject: [PATCH 189/212] Multiplatform: Fix dependencies of implementing module descriptors cache This fixes some failing tests --- .../jetbrains/kotlin/idea/facet/facetUtils.kt | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/idea/src/org/jetbrains/kotlin/idea/facet/facetUtils.kt b/idea/src/org/jetbrains/kotlin/idea/facet/facetUtils.kt index c370b7dd9ab..ad68853f91e 100644 --- a/idea/src/org/jetbrains/kotlin/idea/facet/facetUtils.kt +++ b/idea/src/org/jetbrains/kotlin/idea/facet/facetUtils.kt @@ -130,18 +130,15 @@ private fun Module.findImplementingModules(modelsProvider: IdeModifiableModelsPr } } -private fun Module.findImplementingDescriptors(moduleSourceInfo: ModuleSourceInfo): List { +private fun Module.findImplementingModuleInfos(moduleSourceInfo: ModuleSourceInfo): List { val modelsProvider = IdeModifiableModelsProviderImpl(project) val implementingModules = findImplementingModules(modelsProvider) return implementingModules.mapNotNull { - val implementingModuleInfo = when (moduleSourceInfo) { + when (moduleSourceInfo) { is ModuleProductionSourceInfo -> it.productionSourceInfo() is ModuleTestSourceInfo -> it.testSourceInfo() else -> null } - implementingModuleInfo?.let { - KotlinCacheService.getInstance(project).getResolutionFacadeByModuleInfo(it, it.platform)?.moduleDescriptor - } } } @@ -150,9 +147,14 @@ val ModuleDescriptor.implementingDescriptors: List val moduleSourceInfo = getCapability(ModuleInfo.Capability) as? ModuleSourceInfo ?: return emptyList() val module = moduleSourceInfo.module return module.cached(CachedValueProvider { + val implementingModuleInfos = module.findImplementingModuleInfos(moduleSourceInfo) + val implementingModuleDescriptors = implementingModuleInfos.mapNotNull { + KotlinCacheService.getInstance(module.project).getResolutionFacadeByModuleInfo(it, it.platform)?.moduleDescriptor + } CachedValueProvider.Result( - module.findImplementingDescriptors(moduleSourceInfo), - ProjectRootModificationTracker.getInstance(module.project) + implementingModuleDescriptors, + *(implementingModuleInfos.map { it.createModificationTracker() } + + ProjectRootModificationTracker.getInstance(module.project)).toTypedArray() ) }) } From b839081349ed6c724deed01f489500a1eaac6f1d Mon Sep 17 00:00:00 2001 From: Nicolay Mitropolsky Date: Mon, 2 Oct 2017 13:20:06 +0300 Subject: [PATCH 190/212] Support for collections literals in LightAnnotations (KT-20543) --- .../asJava/elements/lightAnnotations.kt | 8 ++++- .../kotlin/asJava/KtLightAnnotationTest.kt | 33 +++++++++++++++++++ 2 files changed, 40 insertions(+), 1 deletion(-) diff --git a/compiler/light-classes/src/org/jetbrains/kotlin/asJava/elements/lightAnnotations.kt b/compiler/light-classes/src/org/jetbrains/kotlin/asJava/elements/lightAnnotations.kt index 8844bd063f5..036ff13a5df 100644 --- a/compiler/light-classes/src/org/jetbrains/kotlin/asJava/elements/lightAnnotations.kt +++ b/compiler/light-classes/src/org/jetbrains/kotlin/asJava/elements/lightAnnotations.kt @@ -183,7 +183,13 @@ class KtLightAnnotationForSourceEntry( private val _initializers by lazyPub { delegate.initializers.mapIndexed { i, it -> wrapAnnotationValue(it, this, { - (originalExpression as KtCallElement).valueArguments[i].getArgumentExpression()!! + originalExpression.let { + when (it) { + is KtCallElement -> it.valueArguments[i].getArgumentExpression()!! + is KtCollectionLiteralExpression -> it.getInnerExpressions()[i] + else -> throw UnsupportedOperationException("cant process $it of type ${it?.javaClass}") + } + } }) }.toTypedArray() } diff --git a/idea/tests/org/jetbrains/kotlin/asJava/KtLightAnnotationTest.kt b/idea/tests/org/jetbrains/kotlin/asJava/KtLightAnnotationTest.kt index 5286491bf15..8835b08849d 100644 --- a/idea/tests/org/jetbrains/kotlin/asJava/KtLightAnnotationTest.kt +++ b/idea/tests/org/jetbrains/kotlin/asJava/KtLightAnnotationTest.kt @@ -16,9 +16,14 @@ package org.jetbrains.kotlin.asJava +import com.intellij.openapi.application.WriteAction +import com.intellij.openapi.externalSystem.service.project.IdeModifiableModelsProviderImpl import com.intellij.psi.* import com.intellij.testFramework.LightProjectDescriptor import junit.framework.TestCase +import org.jetbrains.kotlin.config.LanguageFeature +import org.jetbrains.kotlin.idea.facet.configureFacet +import org.jetbrains.kotlin.idea.facet.getOrCreateFacet import org.jetbrains.kotlin.idea.test.KotlinLightCodeInsightFixtureTestCase import org.jetbrains.kotlin.idea.test.KotlinWithJdkAndRuntimeLightProjectDescriptor @@ -202,6 +207,25 @@ class KtLightAnnotationTest : KotlinLightCodeInsightFixtureTestCase() { assertTextAndRange("\"def\"", annotationAttributeVal.initializers[1]) } + fun testKotlinAnnotationWithStringArrayLiteral() { + configureKotlinVersion("1.2") + myFixture.configureByText("AnnotatedClass.kt", """ + annotation class Anno(val params: Array) + @Anno(params = ["abc", "def"]) + class AnnotatedClass + """.trimIndent()) + myFixture.testHighlighting("AnnotatedClass.kt") + + val annotations = myFixture.findClass("AnnotatedClass").expectAnnotations(1) + val annotationAttributeVal = annotations.first().findAttributeValue("params") as PsiElement + assertTextAndRange("[\"abc\", \"def\"]", annotationAttributeVal) + + annotationAttributeVal as PsiArrayInitializerMemberValue + assertTextAndRange("\"abc\"", annotationAttributeVal.initializers[0]) + assertTextAndRange("\"def\"", annotationAttributeVal.initializers[1]) + } + + fun testKotlinAnnotationsArray() { myFixture.configureByText("AnnotatedClass.kt", """ annotation class Anno1(val anno2: Array) @@ -376,4 +400,13 @@ class KtLightAnnotationTest : KotlinLightCodeInsightFixtureTestCase() { number, size) } + private fun configureKotlinVersion(version: String) { + WriteAction.run { + val modelsProvider = IdeModifiableModelsProviderImpl(project) + val facet = module.getOrCreateFacet(modelsProvider, useProjectSettings = false) + facet.configureFacet(version, LanguageFeature.State.DISABLED, null, modelsProvider) + modelsProvider.commit() + } + } + } \ No newline at end of file From 5c4c77a80a8cffb9647b554e27dc6af0db89de42 Mon Sep 17 00:00:00 2001 From: Mikhail Glukhikh Date: Thu, 28 Sep 2017 18:41:37 +0300 Subject: [PATCH 191/212] Determine enclosing element correctly inside base constructor So #KT-17680 Fixed So #KT-18740 Fixed So EA-76201 Fixed --- .../org/jetbrains/kotlin/psi/KtPsiUtil.java | 2 +- .../anonymousObjectInBaseConstructor.kt | 25 +++++++++++++++++++ .../functionLiteralInBaseConstructor.kt | 14 +++++++++++ ...esolveDescriptorRendererTestGenerated.java | 12 +++++++++ 4 files changed, 52 insertions(+), 1 deletion(-) create mode 100644 idea/testData/resolve/additionalLazyResolve/anonymousObjectInBaseConstructor.kt create mode 100644 idea/testData/resolve/additionalLazyResolve/functionLiteralInBaseConstructor.kt diff --git a/compiler/frontend/src/org/jetbrains/kotlin/psi/KtPsiUtil.java b/compiler/frontend/src/org/jetbrains/kotlin/psi/KtPsiUtil.java index f39657bde07..d04a00447b5 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/psi/KtPsiUtil.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/psi/KtPsiUtil.java @@ -854,7 +854,7 @@ public class KtPsiUtil { return (KtElement) current; } } - if (current instanceof KtDelegatedSuperTypeEntry) { + if (current instanceof KtDelegatedSuperTypeEntry || current instanceof KtSuperTypeCallEntry) { PsiElement grandParent = current.getParent().getParent(); if (grandParent instanceof KtClassOrObject && !(grandParent.getParent() instanceof KtObjectLiteralExpression)) { return (KtElement) grandParent; diff --git a/idea/testData/resolve/additionalLazyResolve/anonymousObjectInBaseConstructor.kt b/idea/testData/resolve/additionalLazyResolve/anonymousObjectInBaseConstructor.kt new file mode 100644 index 00000000000..b2ea7410131 --- /dev/null +++ b/idea/testData/resolve/additionalLazyResolve/anonymousObjectInBaseConstructor.kt @@ -0,0 +1,25 @@ +package test + +interface A { + fun get(x : Int) +} + +open class B(val a: A) + +class C : B(object : A { + override fun get(x : Int) {} +}) + +//package test +//public interface A defined in test +//public abstract fun get(x: kotlin.Int): kotlin.Unit defined in test.A +//value-parameter x: kotlin.Int defined in test.A.get +//public open class B defined in test +//public constructor B(a: test.A) defined in test.B +//value-parameter a: test.A defined in test.B. +//public final class C : test.B defined in test +//public constructor C() defined in test.C +//local final class : test.A defined in test.C. +//public constructor () defined in test.C.. +//public open fun get(x: kotlin.Int): kotlin.Unit defined in test.C.. +//value-parameter x: kotlin.Int defined in test.C...get \ No newline at end of file diff --git a/idea/testData/resolve/additionalLazyResolve/functionLiteralInBaseConstructor.kt b/idea/testData/resolve/additionalLazyResolve/functionLiteralInBaseConstructor.kt new file mode 100644 index 00000000000..3b86d19dae9 --- /dev/null +++ b/idea/testData/resolve/additionalLazyResolve/functionLiteralInBaseConstructor.kt @@ -0,0 +1,14 @@ +package test + +open class B(val foo: () -> Unit) + +class C : B({ + +}) + +//package test +//public open class B defined in test +//public constructor B(foo: () -> kotlin.Unit) defined in test.B +//value-parameter foo: () -> kotlin.Unit defined in test.B. +//public final class C : test.B defined in test +//public constructor C() defined in test.C \ No newline at end of file diff --git a/idea/tests/org/jetbrains/kotlin/idea/resolve/AdditionalResolveDescriptorRendererTestGenerated.java b/idea/tests/org/jetbrains/kotlin/idea/resolve/AdditionalResolveDescriptorRendererTestGenerated.java index d958df69050..91b2141d772 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/resolve/AdditionalResolveDescriptorRendererTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/resolve/AdditionalResolveDescriptorRendererTestGenerated.java @@ -36,6 +36,12 @@ public class AdditionalResolveDescriptorRendererTestGenerated extends AbstractAd KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("idea/testData/resolve/additionalLazyResolve"), Pattern.compile("^(.+)\\.kt$"), TargetBackend.ANY, true); } + @TestMetadata("anonymousObjectInBaseConstructor.kt") + public void testAnonymousObjectInBaseConstructor() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/resolve/additionalLazyResolve/anonymousObjectInBaseConstructor.kt"); + doTest(fileName); + } + @TestMetadata("anonymousObjectInClassInitializer.kt") public void testAnonymousObjectInClassInitializer() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("idea/testData/resolve/additionalLazyResolve/anonymousObjectInClassInitializer.kt"); @@ -48,6 +54,12 @@ public class AdditionalResolveDescriptorRendererTestGenerated extends AbstractAd doTest(fileName); } + @TestMetadata("functionLiteralInBaseConstructor.kt") + public void testFunctionLiteralInBaseConstructor() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/resolve/additionalLazyResolve/functionLiteralInBaseConstructor.kt"); + doTest(fileName); + } + @TestMetadata("localClassInClassInitializer.kt") public void testLocalClassInClassInitializer() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("idea/testData/resolve/additionalLazyResolve/localClassInClassInitializer.kt"); From b3fe57244712a8525053f3f8d43e8edbe954c30f Mon Sep 17 00:00:00 2001 From: Mikhail Glukhikh Date: Thu, 28 Sep 2017 19:04:45 +0300 Subject: [PATCH 192/212] Minor fix for EA-108087 --- .../jetbrains/kotlin/resolve/lazy/LazyDeclarationResolver.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/LazyDeclarationResolver.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/LazyDeclarationResolver.kt index 8daa2b02cfb..7e0669dcebd 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/LazyDeclarationResolver.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/LazyDeclarationResolver.kt @@ -185,7 +185,7 @@ open class LazyDeclarationResolver @Deprecated("") constructor( destructuringDeclarationEntry: KtDestructuringDeclarationEntry, data: Nothing? ): DeclarationDescriptor? { val location = lookupLocationFor(destructuringDeclarationEntry, false) - val destructuringDeclaration = destructuringDeclarationEntry.parent as KtDestructuringDeclaration + val destructuringDeclaration = destructuringDeclarationEntry.parent as? KtDestructuringDeclaration ?: return null val scopeForDeclaration = getMemberScopeDeclaredIn(destructuringDeclaration, location) scopeForDeclaration.getContributedVariables(destructuringDeclarationEntry.nameAsSafeName, location) return bindingContext.get(BindingContext.DECLARATION_TO_DESCRIPTOR, destructuringDeclarationEntry) From 21e91c405282db17065d306dff81ad492cd986fc Mon Sep 17 00:00:00 2001 From: Alexey Andreev Date: Wed, 27 Sep 2017 15:43:04 +0300 Subject: [PATCH 193/212] JS: rename -source-map-source-roots to -source-map-base-dirs See KT-19906 --- .../kotlin/cli/common/arguments/K2JSCompilerArguments.kt | 5 +++-- .../cli/src/org/jetbrains/kotlin/cli/js/K2JSCompiler.java | 6 +++--- compiler/testData/cli/js/jsHelp.out | 3 +-- .../testData/cli/js/sourceMapDuplicateRelativePaths.args | 2 +- compiler/testData/cli/js/sourceMapRootManual.args | 2 +- compiler/testData/cli/js/sourceMapRootMissing.args | 2 +- compiler/testData/cli/js/sourceMapRootMultiple.args | 2 +- .../kotlin/compilerRunner/JpsKotlinCompilerRunner.kt | 2 +- 8 files changed, 12 insertions(+), 12 deletions(-) diff --git a/compiler/cli/cli-common/src/org/jetbrains/kotlin/cli/common/arguments/K2JSCompilerArguments.kt b/compiler/cli/cli-common/src/org/jetbrains/kotlin/cli/common/arguments/K2JSCompilerArguments.kt index b6d1acacbef..a3a61b0f608 100644 --- a/compiler/cli/cli-common/src/org/jetbrains/kotlin/cli/common/arguments/K2JSCompilerArguments.kt +++ b/compiler/cli/cli-common/src/org/jetbrains/kotlin/cli/common/arguments/K2JSCompilerArguments.kt @@ -48,11 +48,12 @@ class K2JSCompilerArguments : CommonCompilerArguments() { var sourceMapPrefix: String? by FreezableVar(null) @Argument( - value = "-source-map-source-roots", + value = "-source-map-base-dirs", + deprecatedName = "-source-map-source-roots", valueDescription = "", description = "Base directories which are used to calculate relative paths to source files in source map" ) - var sourceMapSourceRoots: String? by FreezableVar(null) + var sourceMapBaseDirs: String? by FreezableVar(null) @GradleOption(DefaultValues.JsSourceMapContentModes::class) @Argument( diff --git a/compiler/cli/src/org/jetbrains/kotlin/cli/js/K2JSCompiler.java b/compiler/cli/src/org/jetbrains/kotlin/cli/js/K2JSCompiler.java index 04926cb3d11..24b6088880d 100644 --- a/compiler/cli/src/org/jetbrains/kotlin/cli/js/K2JSCompiler.java +++ b/compiler/cli/src/org/jetbrains/kotlin/cli/js/K2JSCompiler.java @@ -357,8 +357,8 @@ public class K2JSCompiler extends CLICompiler { configuration.put(JSConfigurationKeys.SOURCE_MAP_PREFIX, arguments.getSourceMapPrefix()); } - String sourceMapSourceRoots = arguments.getSourceMapSourceRoots() != null ? - arguments.getSourceMapSourceRoots() : + String sourceMapSourceRoots = arguments.getSourceMapBaseDirs() != null ? + arguments.getSourceMapBaseDirs() : calculateSourceMapSourceRoot(messageCollector, arguments); List sourceMapSourceRootList = StringUtil.split(sourceMapSourceRoots, File.pathSeparator); configuration.put(JSConfigurationKeys.SOURCE_MAP_SOURCE_ROOTS, sourceMapSourceRootList); @@ -367,7 +367,7 @@ public class K2JSCompiler extends CLICompiler { if (arguments.getSourceMapPrefix() != null) { messageCollector.report(WARNING, "source-map-prefix argument has no effect without source map", null); } - if (arguments.getSourceMapSourceRoots() != null) { + if (arguments.getSourceMapBaseDirs() != null) { messageCollector.report(WARNING, "source-map-source-root argument has no effect without source map", null); } } diff --git a/compiler/testData/cli/js/jsHelp.out b/compiler/testData/cli/js/jsHelp.out index c1334ac1393..f76e57906fe 100644 --- a/compiler/testData/cli/js/jsHelp.out +++ b/compiler/testData/cli/js/jsHelp.out @@ -10,11 +10,10 @@ where possible options include: -output-postfix Path to file which will be added to the end of output file -output-prefix Path to file which will be added to the beginning of output file -source-map Generate source map + -source-map-base-dirs Base directories which are used to calculate relative paths to source files in source map -source-map-embed-sources { always, never, inlining } Embed source files into source map -source-map-prefix Prefix for paths in a source map - -source-map-source-roots - Base directories which are used to calculate relative paths to source files in source map -target { v5 } Generate JS files for specific ECMA version -api-version Allow to use declarations only from the specified version of bundled libraries -X Print a synopsis of advanced options diff --git a/compiler/testData/cli/js/sourceMapDuplicateRelativePaths.args b/compiler/testData/cli/js/sourceMapDuplicateRelativePaths.args index e99539d99f3..77f63052fe4 100644 --- a/compiler/testData/cli/js/sourceMapDuplicateRelativePaths.args +++ b/compiler/testData/cli/js/sourceMapDuplicateRelativePaths.args @@ -1,7 +1,7 @@ $TESTDATA_DIR$/sourceMapDuplicatePath/ -no-stdlib -source-map --source-map-source-roots +-source-map-base-dirs $TESTDATA_DIR$/sourceMapDuplicatePath/foo:$TESTDATA_DIR$/sourceMapDuplicatePath/bar -output $TEMP_DIR$/out.js diff --git a/compiler/testData/cli/js/sourceMapRootManual.args b/compiler/testData/cli/js/sourceMapRootManual.args index 92d3231bc81..e280b72da6f 100644 --- a/compiler/testData/cli/js/sourceMapRootManual.args +++ b/compiler/testData/cli/js/sourceMapRootManual.args @@ -2,7 +2,7 @@ $TESTDATA_DIR$/sourceMapRoot/foo/file1.kt $TESTDATA_DIR$/sourceMapRoot/bar/file2.kt -no-stdlib -source-map --source-map-source-roots +-source-map-base-dirs $TESTDATA_DIR$/ -output $TEMP_DIR$/out.js diff --git a/compiler/testData/cli/js/sourceMapRootMissing.args b/compiler/testData/cli/js/sourceMapRootMissing.args index 1afe84d1637..b7142ce5ce6 100644 --- a/compiler/testData/cli/js/sourceMapRootMissing.args +++ b/compiler/testData/cli/js/sourceMapRootMissing.args @@ -4,7 +4,7 @@ $TESTDATA_DIR$/sourceMapRoot/bar/baz/file3.kt $TESTDATA_DIR$/sourceMapRoot/foo/baz/file4.kt -no-stdlib -source-map --source-map-source-roots +-source-map-base-dirs $TESTDATA_DIR$/sourceMapRoot/foo -output $TEMP_DIR$/out.js diff --git a/compiler/testData/cli/js/sourceMapRootMultiple.args b/compiler/testData/cli/js/sourceMapRootMultiple.args index 1cc53c0a34b..6e122e374a2 100644 --- a/compiler/testData/cli/js/sourceMapRootMultiple.args +++ b/compiler/testData/cli/js/sourceMapRootMultiple.args @@ -2,7 +2,7 @@ $TESTDATA_DIR$/sourceMapRoot/foo/file1.kt $TESTDATA_DIR$/sourceMapRoot/bar/file2.kt -no-stdlib -source-map --source-map-source-roots +-source-map-base-dirs $TESTDATA_DIR$/foo:$TESTDATA_DIR$/bar -output $TEMP_DIR$/out.js diff --git a/jps-plugin/src/org/jetbrains/kotlin/compilerRunner/JpsKotlinCompilerRunner.kt b/jps-plugin/src/org/jetbrains/kotlin/compilerRunner/JpsKotlinCompilerRunner.kt index c32fe8ac171..1984d68caba 100644 --- a/jps-plugin/src/org/jetbrains/kotlin/compilerRunner/JpsKotlinCompilerRunner.kt +++ b/jps-plugin/src/org/jetbrains/kotlin/compilerRunner/JpsKotlinCompilerRunner.kt @@ -97,7 +97,7 @@ class JpsKotlinCompilerRunner : KotlinCompilerRunner() { setupK2JsArguments(outputFile, sourceFiles, libraries, friendModules, arguments) if (arguments.sourceMap) { - arguments.sourceMapSourceRoots = sourceRoots.joinToString(File.pathSeparator) { it.path } + arguments.sourceMapBaseDirs = sourceRoots.joinToString(File.pathSeparator) { it.path } } log.debug("K2JS: arguments after setup" + ArgumentUtils.convertArgumentsToStringList(arguments)) From 10f7f619914f6c629421a107cd474cba43cdd9fb Mon Sep 17 00:00:00 2001 From: Alexey Andreev Date: Tue, 3 Oct 2017 14:50:24 +0300 Subject: [PATCH 194/212] Fix compilation of Gradle JS task --- .../src/main/kotlin/org/jetbrains/kotlin/gradle/tasks/Tasks.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/tasks/Tasks.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/tasks/Tasks.kt index 7f6c9f133db..1215f800b48 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/tasks/Tasks.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/tasks/Tasks.kt @@ -457,7 +457,7 @@ open class Kotlin2JsCompile() : AbstractKotlinCompile(), args.friendModules = friendDependency - args.sourceMapSourceRoots = source.orEmpty() + args.sourceMapBaseDirs = source.orEmpty() .asSequence() .filterIsInstance() .flatMap { it.srcDirs.asSequence() } From 289b0862a7b83bd3dd6ba4fabd840edf0d85715d Mon Sep 17 00:00:00 2001 From: Simon Ogorodnik Date: Mon, 2 Oct 2017 19:21:08 +0300 Subject: [PATCH 195/212] Fix MavenTestCase to use Maven mirror only when it available --- .../kotlin/idea/maven/MavenTestCase.java | 40 ++++++++++++++++--- 1 file changed, 35 insertions(+), 5 deletions(-) diff --git a/idea/idea-maven/test/org/jetbrains/kotlin/idea/maven/MavenTestCase.java b/idea/idea-maven/test/org/jetbrains/kotlin/idea/maven/MavenTestCase.java index d25f11e2ad2..c8918d34553 100644 --- a/idea/idea-maven/test/org/jetbrains/kotlin/idea/maven/MavenTestCase.java +++ b/idea/idea-maven/test/org/jetbrains/kotlin/idea/maven/MavenTestCase.java @@ -47,11 +47,35 @@ import java.io.File; import java.io.IOException; import java.lang.reflect.Field; import java.lang.reflect.Modifier; +import java.net.HttpURLConnection; +import java.net.URL; import java.util.*; import java.util.List; import java.util.concurrent.TimeUnit; public abstract class MavenTestCase extends UsefulTestCase { + + private static final String mavenMirrorUrl = System.getProperty("idea.maven.test.mirror", + // use JB maven proxy server for internal use by default, see details at + // https://confluence.jetbrains.com/display/JBINT/Maven+proxy+server + "http://maven.labs.intellij.net/repo1"); + private static boolean mirrorDiscoverable = false; + + static { + try { + URL url = new URL(mavenMirrorUrl); + HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection(); + urlConnection.setConnectTimeout(1000); + int responseCode = urlConnection.getResponseCode(); + if(responseCode < 400) { + mirrorDiscoverable = true; + } + } + catch (Exception e) { + mirrorDiscoverable = false; + } + } + private File ourTempDir; protected IdeaProjectTestFixture myTestFixture; @@ -319,16 +343,22 @@ public abstract class MavenTestCase extends UsefulTestCase { } private static String createSettingsXmlContent(String content) { - String mirror = System.getProperty("idea.maven.test.mirror", - // use JB maven proxy server for internal use by default, see details at - // https://confluence.jetbrains.com/display/JBINT/Maven+proxy+server - "http://maven.labs.intellij.net/repo1"); + + if (!mirrorDiscoverable) { + System.err.println("Maven mirror at " + mavenMirrorUrl + " not reachable, so not using it."); + + return "" + + content + + ""; + } + + System.out.println("Using Maven mirror at " + mavenMirrorUrl); return "" + content + "" + " " + " jb-central-proxy" + - " " + mirror + "" + + " " + mavenMirrorUrl + "" + " external:*" + " " + "" + From 228588a87cb519c36ba2f94d8aeb67a873336057 Mon Sep 17 00:00:00 2001 From: Simon Ogorodnik Date: Tue, 3 Oct 2017 15:45:36 +0300 Subject: [PATCH 196/212] Fix TestExecutedOnlyOnceTest by properly setting RunWith When test contains nested test classes Both root and nested classes should be annotated with `@RunWith(JUnit3RunnerWithInners.class)` to avoid running tests twice --- .../jetbrains/kotlin/test/util/TestExecutedOnlyOnceTest.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/compiler/tests/org/jetbrains/kotlin/test/util/TestExecutedOnlyOnceTest.java b/compiler/tests/org/jetbrains/kotlin/test/util/TestExecutedOnlyOnceTest.java index c3729cb2d04..94c174b28d4 100644 --- a/compiler/tests/org/jetbrains/kotlin/test/util/TestExecutedOnlyOnceTest.java +++ b/compiler/tests/org/jetbrains/kotlin/test/util/TestExecutedOnlyOnceTest.java @@ -30,6 +30,7 @@ public class TestExecutedOnlyOnceTest extends TestCase { testA = true; } + @RunWith(JUnit3RunnerWithInners.class) public static class InnerTest extends TestCase { private static boolean testB; private static boolean testC; @@ -44,8 +45,10 @@ public class TestExecutedOnlyOnceTest extends TestCase { testC = true; } + @RunWith(JUnit3RunnerWithInners.class) public static class InnerInnerTest extends TestCase { + @RunWith(JUnit3RunnerWithInners.class) public static class InnerInnerInnerTest extends TestCase { private static boolean testD; private static boolean testE; From 8aa4b75e1c908b32240a384c82dc006669c7ae29 Mon Sep 17 00:00:00 2001 From: Nikolay Krasko Date: Tue, 26 Sep 2017 16:05:04 +0300 Subject: [PATCH 197/212] Quick fix for module is absent in module-info requirements (KT-20108) #KT-20108 Fixed --- ...tJava9ModulesCodeInsightFixtureTestCase.kt | 56 +++++++++ ...KotlinMultiModuleJava9ProjectDescriptor.kt | 118 ++++++++++++++++++ .../kotlin/idea/test/PluginTestCaseBase.java | 1 + .../quickfix/KotlinAddRequiredModuleFix.kt | 39 ++++++ .../kotlin/idea/quickfix/QuickFixRegistrar.kt | 2 + .../idea/quickfix/AddRequireModuleTest.kt | 104 +++++++++++++++ 6 files changed, 320 insertions(+) create mode 100644 idea/idea-test-framework/src/org/jetbrains/kotlin/idea/test/KotlinLightJava9ModulesCodeInsightFixtureTestCase.kt create mode 100644 idea/idea-test-framework/src/org/jetbrains/kotlin/idea/test/KotlinMultiModuleJava9ProjectDescriptor.kt create mode 100644 idea/src/org/jetbrains/kotlin/idea/quickfix/KotlinAddRequiredModuleFix.kt create mode 100644 idea/tests/org/jetbrains/kotlin/idea/quickfix/AddRequireModuleTest.kt diff --git a/idea/idea-test-framework/src/org/jetbrains/kotlin/idea/test/KotlinLightJava9ModulesCodeInsightFixtureTestCase.kt b/idea/idea-test-framework/src/org/jetbrains/kotlin/idea/test/KotlinLightJava9ModulesCodeInsightFixtureTestCase.kt new file mode 100644 index 00000000000..c0f1ecafa87 --- /dev/null +++ b/idea/idea-test-framework/src/org/jetbrains/kotlin/idea/test/KotlinLightJava9ModulesCodeInsightFixtureTestCase.kt @@ -0,0 +1,56 @@ +/* + * Copyright 2010-2017 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.test + +import com.intellij.openapi.vfs.VirtualFile +import com.intellij.testFramework.EditorTestUtil +import com.intellij.testFramework.LightProjectDescriptor +import com.intellij.testFramework.VfsTestUtil +import org.intellij.lang.annotations.Language +import org.jetbrains.kotlin.idea.test.KotlinMultiModuleJava9ProjectDescriptor.ModuleDescriptor + +abstract class KotlinLightJava9ModulesCodeInsightFixtureTestCase : KotlinLightCodeInsightFixtureTestCase() { + override fun getProjectDescriptor(): LightProjectDescriptor = KotlinMultiModuleJava9ProjectDescriptor + + override fun tearDown() { + KotlinMultiModuleJava9ProjectDescriptor.cleanupSourceRoots() + super.tearDown() + } + + protected fun addFile(path: String, text: String, module: ModuleDescriptor = ModuleDescriptor.MAIN): VirtualFile = + VfsTestUtil.createFile(module.root(), path, text) + + protected fun addKotlinFile(path: String, @Language("kotlin") text: String, module: ModuleDescriptor = ModuleDescriptor.MAIN): VirtualFile = + addFile(path, text.toTestData(), module) + + protected fun addJavaFile(path: String, @Language("java") text: String, module: ModuleDescriptor = ModuleDescriptor.MAIN): VirtualFile = + addFile(path, text.toTestData(), module) + + protected fun moduleInfo(@Language("JAVA") text: String, module: ModuleDescriptor = ModuleDescriptor.MAIN) = + addFile("module-info.java", text.toTestData(), module) + + protected fun checkModuleInfo(@Language("JAVA") text: String) = + myFixture.checkResult("module-info.java", text.toTestData(), false) +} + +private const val IDENTIFIER_CARET = "CARET" +private const val COMMENT_CARET_CHAR = "/*|*/" +private const val COMMENT_CARET = "/*CARET*/" +private val ADDITIONAL_CARET_MARKERS = arrayOf(IDENTIFIER_CARET, COMMENT_CARET_CHAR, COMMENT_CARET) + +private fun String.toTestData(): String = + ADDITIONAL_CARET_MARKERS.fold(trimIndent()) { result, marker -> result.replace(marker, EditorTestUtil.CARET_TAG, ignoreCase = true) } \ No newline at end of file diff --git a/idea/idea-test-framework/src/org/jetbrains/kotlin/idea/test/KotlinMultiModuleJava9ProjectDescriptor.kt b/idea/idea-test-framework/src/org/jetbrains/kotlin/idea/test/KotlinMultiModuleJava9ProjectDescriptor.kt new file mode 100644 index 00000000000..00249f3d6eb --- /dev/null +++ b/idea/idea-test-framework/src/org/jetbrains/kotlin/idea/test/KotlinMultiModuleJava9ProjectDescriptor.kt @@ -0,0 +1,118 @@ +/* + * Copyright 2010-2017 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.test + +import com.intellij.openapi.application.runWriteAction +import com.intellij.openapi.module.Module +import com.intellij.openapi.module.ModuleManager +import com.intellij.openapi.project.Project +import com.intellij.openapi.projectRoots.Sdk +import com.intellij.openapi.roots.* +import com.intellij.openapi.util.io.FileUtil +import com.intellij.openapi.vfs.VirtualFile +import com.intellij.openapi.vfs.ex.temp.TempFileSystem +import com.intellij.pom.java.LanguageLevel +import com.intellij.testFramework.LightPlatformTestCase +import com.intellij.testFramework.fixtures.DefaultLightProjectDescriptor +import org.jetbrains.jps.model.java.JavaSourceRootType +import org.jetbrains.kotlin.test.TestJdkKind + +/** + * Dependencies: 'main' -> 'm2', 'main' -> 'm4', 'main' -> 'm5', 'main' -> 'm6' => 'm7' + */ +object KotlinMultiModuleJava9ProjectDescriptor : DefaultLightProjectDescriptor() { + enum class ModuleDescriptor(internal val moduleName: String, internal val rootName: String) { + // Dependent for: none, Depends on: M2, M4, M5, M6 + MAIN(TEST_MODULE_NAME, "/not_used/"), + + // Dependent for: MAIN, Depends on: none + M2("${TEST_MODULE_NAME}_m2", "src_m2"), + + // Dependent for: none, Depends on: none + M3("${TEST_MODULE_NAME}_m3", "src_m3"), + + // Dependent for: MAIN, Depends on: none + M4("${TEST_MODULE_NAME}_m4", "src_m4"), + + // Dependent for: MAIN, Depends on: none + M5("${TEST_MODULE_NAME}_m5", "src_m5"), + + // Dependent for: MAIN, Depends on: M7 + M6("${TEST_MODULE_NAME}_m6", "src_m6"), + + // Dependent for: M6, Depends on: none + M7("${TEST_MODULE_NAME}_m7", "src_m7"); + + fun root(): VirtualFile = + if (this == MAIN) LightPlatformTestCase.getSourceRoot() else TempFileSystem.getInstance().findFileByPath("/$rootName")!! + + fun testRoot(): VirtualFile? = + if (this == MAIN) TempFileSystem.getInstance().findFileByPath("/test_src")!! else null + } + + override fun getSdk(): Sdk = PluginTestCaseBase.jdk(TestJdkKind.FULL_JDK_9) + + override fun setUpProject(project: Project, handler: SetupHandler) { + super.setUpProject(project, handler) + + runWriteAction { + val main = ModuleManager.getInstance(project).findModuleByName(TEST_MODULE_NAME)!! + + val m2 = makeModule(project, ModuleDescriptor.M2) + ModuleRootModificationUtil.addDependency(main, m2) + + makeModule(project, ModuleDescriptor.M3) + + val m4 = makeModule(project, ModuleDescriptor.M4) + ModuleRootModificationUtil.addDependency(main, m4) + + val m5 = makeModule(project, ModuleDescriptor.M5) + ModuleRootModificationUtil.addDependency(main, m5) + + val m6 = makeModule(project, ModuleDescriptor.M6) + ModuleRootModificationUtil.addDependency(main, m6) + + val m7 = makeModule(project, ModuleDescriptor.M7) + ModuleRootModificationUtil.addDependency(m6, m7, DependencyScope.COMPILE, true) + } + } + + private fun makeModule(project: Project, descriptor: ModuleDescriptor): Module { + val path = FileUtil.join(FileUtil.getTempDirectory(), "${descriptor.moduleName}.iml") + val module = createModule(project, path) + val sourceRoot = createSourceRoot(module, descriptor.rootName) + createContentEntry(module, sourceRoot) + return module + } + + override fun configureModule(module: Module, model: ModifiableRootModel, contentEntry: ContentEntry) { + model.getModuleExtension(LanguageLevelModuleExtension::class.java).languageLevel = LanguageLevel.JDK_1_9 + if (module.name == TEST_MODULE_NAME) { + val testRoot = createSourceRoot(module, "test_src") + registerSourceRoot(module.project, testRoot) + model.addContentEntry(testRoot).addSourceFolder(testRoot, JavaSourceRootType.TEST_SOURCE) + } + } + + fun cleanupSourceRoots() = runWriteAction { + ModuleDescriptor.values().asSequence() + .filter { it != ModuleDescriptor.MAIN } + .flatMap { it.root().children.asSequence() } + .plus(ModuleDescriptor.MAIN.testRoot()!!.children.asSequence()) + .forEach { it.delete(this) } + } +} \ No newline at end of file diff --git a/idea/idea-test-framework/src/org/jetbrains/kotlin/idea/test/PluginTestCaseBase.java b/idea/idea-test-framework/src/org/jetbrains/kotlin/idea/test/PluginTestCaseBase.java index f91c1e84f36..b3d86cc69dc 100644 --- a/idea/idea-test-framework/src/org/jetbrains/kotlin/idea/test/PluginTestCaseBase.java +++ b/idea/idea-test-framework/src/org/jetbrains/kotlin/idea/test/PluginTestCaseBase.java @@ -21,6 +21,7 @@ import com.intellij.openapi.projectRoots.Sdk; import com.intellij.openapi.util.text.StringUtil; import com.intellij.openapi.vfs.newvfs.impl.VfsRootAccess; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.TestOnly; import org.jetbrains.kotlin.test.KotlinTestUtils; import org.jetbrains.kotlin.test.TestJdkKind; diff --git a/idea/src/org/jetbrains/kotlin/idea/quickfix/KotlinAddRequiredModuleFix.kt b/idea/src/org/jetbrains/kotlin/idea/quickfix/KotlinAddRequiredModuleFix.kt new file mode 100644 index 00000000000..85a6d107b8f --- /dev/null +++ b/idea/src/org/jetbrains/kotlin/idea/quickfix/KotlinAddRequiredModuleFix.kt @@ -0,0 +1,39 @@ +/* + * Copyright 2010-2017 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.quickfix + +import com.intellij.codeInsight.daemon.impl.analysis.JavaModuleGraphUtil +import com.intellij.codeInsight.daemon.impl.quickfix.AddRequiredModuleFix +import com.intellij.codeInsight.intention.IntentionAction +import org.jetbrains.kotlin.diagnostics.Diagnostic +import org.jetbrains.kotlin.diagnostics.DiagnosticFactory +import org.jetbrains.kotlin.psi.KtExpression +import org.jetbrains.kotlin.resolve.jvm.diagnostics.ErrorsJvm + +class KotlinAddRequiredModuleFix { + companion object : KotlinSingleIntentionActionFactory() { + override fun createAction(diagnostic: Diagnostic): IntentionAction? { + val expression = diagnostic.psiElement as? KtExpression ?: return null + val javaModule = JavaModuleGraphUtil.findDescriptorByElement(expression) ?: return null + + val dependDiagnostic = DiagnosticFactory.cast(diagnostic, ErrorsJvm.JAVA_MODULE_DOES_NOT_DEPEND_ON_MODULE) + val moduleName = dependDiagnostic.a + + return AddRequiredModuleFix(javaModule, moduleName) + } + } +} \ No newline at end of file diff --git a/idea/src/org/jetbrains/kotlin/idea/quickfix/QuickFixRegistrar.kt b/idea/src/org/jetbrains/kotlin/idea/quickfix/QuickFixRegistrar.kt index 9a939866246..b212203a1bf 100644 --- a/idea/src/org/jetbrains/kotlin/idea/quickfix/QuickFixRegistrar.kt +++ b/idea/src/org/jetbrains/kotlin/idea/quickfix/QuickFixRegistrar.kt @@ -519,5 +519,7 @@ class QuickFixRegistrar : QuickFixContributor { ASSIGNING_SINGLE_ELEMENT_TO_VARARG_IN_NAMED_FORM_ANNOTATION.registerFactory(ReplaceWithArrayCallInAnnotationFix) ASSIGNING_SINGLE_ELEMENT_TO_VARARG_IN_NAMED_FORM_FUNCTION.registerFactory(SurroundWithArrayOfWithSpreadOperatorInFunctionFix) + + JAVA_MODULE_DOES_NOT_DEPEND_ON_MODULE.registerFactory(KotlinAddRequiredModuleFix) } } diff --git a/idea/tests/org/jetbrains/kotlin/idea/quickfix/AddRequireModuleTest.kt b/idea/tests/org/jetbrains/kotlin/idea/quickfix/AddRequireModuleTest.kt new file mode 100644 index 00000000000..dd2025a2818 --- /dev/null +++ b/idea/tests/org/jetbrains/kotlin/idea/quickfix/AddRequireModuleTest.kt @@ -0,0 +1,104 @@ +/* + * Copyright 2010-2017 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.quickfix + +import com.intellij.codeInsight.daemon.QuickFixBundle +import org.jetbrains.kotlin.idea.test.KotlinLightJava9ModulesCodeInsightFixtureTestCase +import org.jetbrains.kotlin.idea.test.KotlinMultiModuleJava9ProjectDescriptor.ModuleDescriptor.* + + +class KotlinAddRequiredModuleTest : KotlinLightJava9ModulesCodeInsightFixtureTestCase() { + private val messageM2 = QuickFixBundle.message("module.info.add.requires.name", "M_TWO")!! + + override fun setUp() { + super.setUp() + moduleInfo("module M_TWO { exports pkgA; }", M2) + addJavaFile("pkgA/A.java", "package pkgA; public class A {}", M2) + } + + fun testAddRequiresToModuleInfo() { + moduleInfo("module MAIN {}", MAIN) + val editedFile = addKotlinFile( + "pkgB/B.kt", + """ + package pkgB + import pkgA.A + class B(a: /*|*/A) + """, + MAIN) + myFixture.configureFromExistingVirtualFile(editedFile) + + findActionAndExecute(messageM2) + assertNoErrors() + + checkModuleInfo( + """ + module MAIN { + requires M_TWO; + } + """) + } + + fun testNoIdeaModuleDependency() { + moduleInfo("module M_THREE {}", M3) + val editedFile = addKotlinFile( + "pkgB/B.kt", + """ + package pkgB + import pkgA.A + class B(a: /*|*/A) + """, + M3) + myFixture.configureFromExistingVirtualFile(editedFile) + + val actions = myFixture.filterAvailableIntentions(messageM2) + assertEmpty(actions) + } + + fun testAddRequiresToInfoForJavaModule() { + moduleInfo("module MAIN {}", MAIN) + val editedFile = addKotlinFile( + "test.kt", + """ + fun test() { + java.util.logging./*|*/FileHandler() // <-- error; "add 'requires java.logging'" quick fix expected + } + """, + MAIN) + myFixture.configureFromExistingVirtualFile(editedFile) + + findActionAndExecute(QuickFixBundle.message("module.info.add.requires.name", "java.logging")!!) + + assertNoErrors() + checkModuleInfo( + """ + module MAIN { + requires java.logging; + } + """) + } + + private fun assertNoErrors() { + myFixture.checkHighlighting(false, false, false) + } + + private fun findActionAndExecute(message: String) { + val action = myFixture.findSingleIntention(message) + assertNotNull(action) + myFixture.launchAction(action) + } +} \ No newline at end of file From 166682937f7ee0945a6375e455795de8622d7f0d Mon Sep 17 00:00:00 2001 From: Nikolay Krasko Date: Wed, 27 Sep 2017 18:30:35 +0300 Subject: [PATCH 198/212] Copy mock JDK 9 from intellij idea (cherry picked from commit aef9220) --- .../testData/mockJDK9/jre/lib/annotations.jar | Bin 0 -> 24037 bytes compiler/testData/mockJDK9/jre/lib/rt.jar | Bin 0 -> 4231867 bytes .../kotlin/idea/test/PluginTestCaseBase.java | 13 +++++++++++++ 3 files changed, 13 insertions(+) create mode 100644 compiler/testData/mockJDK9/jre/lib/annotations.jar create mode 100644 compiler/testData/mockJDK9/jre/lib/rt.jar diff --git a/compiler/testData/mockJDK9/jre/lib/annotations.jar b/compiler/testData/mockJDK9/jre/lib/annotations.jar new file mode 100644 index 0000000000000000000000000000000000000000..b78e2de180d4dda13f4350cb13237982fece9189 GIT binary patch literal 24037 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 DHLDCK literal 0 HcmV?d00001 diff --git a/compiler/testData/mockJDK9/jre/lib/rt.jar b/compiler/testData/mockJDK9/jre/lib/rt.jar new file mode 100644 index 0000000000000000000000000000000000000000..e5ffffef95be0ad1b828bbb6b281c46f3289b363 GIT binary patch literal 4231867 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
oBTL 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

KnA4-Tub+MoN+9Di{kUSM;FIJHg6rj{0ua9 zBz)e2yx4{oE}&gwQ}7e^#b?s|ye+C!-Awi(-{g5b(XmGHzN5QyuDo3k(-!*I{))H| zF5s1aRX$U{`2C?q?2Vqf8kN5%$ebBp0SY%;oJBGUoAF2mm^>$`!9S+$7aiOi z%mLz;+YYB2;F>?Oz5nxYFq!xow+_Ix$mcD&*+lwh0w zTro{PW*_vHaQMqL3p1yI-Gr74%&~LPDy#?(cAOJN6#mSu8MhGppUCDl#N2h!t){>| zPvi6%WypSdf+^E4;+Ws->yE?9A==3&F3gEm`ooZs*iy3%0jGyee8dDU`9j!IrFb(d z4l8trIL_bSk_?(x13$Tu)R$vEWMQJi5rx}74A3-s+$qmSG@DgEiLaO)+4ZFw$OFri zz&^iSQlKlLb>T-)!xTMY4^l1`DE;ft9?0CLv&6+dNjQ^~z|I$0(+;wB9pRbIkq>IZ z6Y^-lgCUWt0{z(ge4sNv&HB5vpv%%uZPcMwqM}$Dzd7kxO%;&wu_iU+yzm7OqyjKs*Lfk84xhOfg@L$OcwGV7hnzW` zC1}M9Vg3)PFInIfYY|?>(#r+MSE1K`$Bcgx)Gm=91SL{Az%ngEO>pUGID>sXhnLtV zYYxOI>VC-wR;MJ&(2(S*%S%|oQ5x_N$pbJ%QK-VHYXZxG)b`1#G(rIEOS*Sdm!E!K z`+sra2QYiFu{XyJs6PgF8x5yPX$+cL(54L)F35HcK!@L5t#1{4 z_Y_PMoz!fZc+X)6)zx?ViG=H!JGTwVWlBJ1*M=d2?G zsS7c>D*5^lj0dp%<~*-tPIa4)PV=dzV?Hg3k0TGS_2@yY-;Ygpz#QJY!UDb+qf zGxH$CDB`I6^>c`rZ`WXSJav{5;~Ui zV53s68L`mOa}@i^xfE%0wrS(+5|KO1?RYIZw@dVT2J%=>(4>69;Tkgulhp?k@xbeF zg&%}Ypcuvdr)Ay())fg(nUAo9b)Io#-lFproOZsCR8&h{x&C`-?P71qg_3L36W?}N z&7;$XucsD|U|oB#ZdizB9a#LM!9LBrFJAfu!7W?x6_-s`FUl_QN$IZP&?DQ*g=Oc0 z-B@v(hWv5wkh$Ra)^j0q>!ag2I}aj&DFd2`O3to_{KwNB*SdtAh_@0T{8!{H&-iVw zCfrhdps~p1d%&^g?m{@_YMqPj+vm%klX6x-2$D;+ihO{9yFNfa6neAGHZdbl+?*$; zFNc0j3iG<~QO(2sB0p+UN%=3b-n7@UjCBh3 zci?VLONKZAxny(vs53`dH*3PNMXB>b{`{gds=L<9vi?GU(q&s>to^#IqLz+zswL$( z2rjLiAV06&b+}?crLZ8-YR6IP#=ZC8@PzoyT@ghy$OQS1GV&9UShaOiqJr1|fa2$P zTb%6pjBlptyk`*onHa$rCC$D>)0pY|LYl_FzfNO{PrSu6rMUD?dp?{pdLTN!WC9+$ zdLuTOBR)E~081m{S{iH@LRj9$nKTdHOO$OyZ0ALsY5PvGeyzX=(&4<&orT$HpS3` zLArsh<<_8^V|Af)zAt>%bSE0FHs%Yvi5+8-MDmaHTj^V!fL-!rq!A}1-`{&~L_0LM zJb9ZuuUfh{%@|lG8e*AzvW8(b+058eT9B{)ZfA0o`;F62jHL$IB2Ww1e$?1!9Ty+PzrDr(E05IDM z)@HXWq#$!zlCC3dB%^dE=IyTn5Ou`5QU)|*G*0DSKeBs|%1+6;?=mQ0kD63z6Xu{A z#QE!xaSxrM5@Rexd3#GM{_ON6oq6J-{zH;{=V9%Cq{rX$jC0h@o7Y^mP(6H0jCJx6 zgVQw-+2|wbyYSLJ+K}Ku;n}HC$hUZicwoM(I}O|!e&=!j2k|=R64Sd(0V9@2sq8HG z0F>Jsc}MO(A_P%;TKrt~-aSa27NI_lA6%nM?Oo_={*~AuK}S5$`sHU-@$J9$oKO(Zj+Rb^}Z(cj64=5cFbCioUs>s}-0iU*zHe1+~(1M5cXGgd3 zFZ_`C)(q4vBFPnseYi+s=3*gD1_eF59yYdnf*&bfoUl}weT#pyf(_t&$zE~>6x7+{ z7E&EOYL)9#;x^cwJ^P66P#L5%910J!*I%0XfQ9mD@h3pAS6yL>DGRzBvOKG4^z-FI zphBVQrzy9%KuGBYf@<`Mt`9byU@z(%nJ0cu^anGq^&??UX z%zlToff6>GW9=trIeHJUI%rA2@e-I}(Y>%(Z)H)&Hm>x3CdYAKYeu8nVC!{wTe+5r zMZc;u0n|`2@IiQeXmMBpC>k#n{2mPdB!-enH&r_u18V`d><`sc#EmbuBqrWQu4wp z-WzyTSwMGE^)h|~4ystq0(?h$ePtf9wL9C5L zMN+NtkZ8|gVe7|&t_$gyQ(Wx=7fO(bHQx4uG}RWpXQ%n4$kKX}@!-w_^vI0+=pjQ7 z{+LTa5p{P5&|Y@pFX1}gud29?y0@ys6$5aE9-K15ZU@*w$QFJ*kgxdhMyl0L^jqD%;nh~38` zw0_)bPsH21Y@LO!l5{OY2*xxdLG-IHZbye6N|4m$7XVVP1z8 z?U+u?a>iO&?O|n}6x~FQCmQ3H7Q#sTHrnvOrMf zTlV>bpOBu9RM~~W0@>T@1KcNWr~a-4$Laf->nBJHksrq_b{>2EhI_B^=|gA10&Zy3 zSM*SEAGY1waQ!K65hgw>Fxb3!3evU^J)Jkt>GF{kyL(Y=9k+ObL^5f0LEmnci#A>A z7pIjmYfr7|)SqQlPjxOZt{C%0v`Iw=f%g1RyCiARF`-SmYEh7Xt~``S(Jj~}6YAq< zi3OFEkmtiPl|>wqYmubt`D@gNgor?dGTDCS)*!aNGSGLbu|N1mMmONeBhVIWdq~+4 zZW@7{@KKG{{PRvl=5E1yS$^*_A4KZ<~G2{ z^aLN{PymICGS#tUsBE&)w=WJ&DjZ*=LGke?ZcPi}mdjCTGMA9sR;kF#3-(BP z30^8uxa|UX@5F-Ftfy(hF-Bh@el+7_BSZ&}k1V3PNgOt{MEyF#iUBCIHxl9&N(LR? z;zHOmnAJ=64!Xe$u4_a!LnL-;68@rMT{|$Y*p%sM-?4rX+}`HbOcJsx*u0qC5Cz;x z?FrC zr+Z)4PVaY2?*}Nt*S%eBk8Eq-|846GuJOTFyKh_jB7vJThjBBk);)!B)3P94>n>2c zpQn2(gqzck@oQAgdl=(a+X53xqvIZhSS!_Vcax7@oy2UXesJ_T` znX&Jg>m;?%j9RheN|T4|S+W%eaM#!ib08O10ZZC9>lt{pWX=n&7g`%u=k)TOBv{?Zr~cc^mc zv1GA}7j8i8Jd~Y`H(!X!DjG7KCCNlVA0K&S;k6=mm zzQkpw4&Cz-Xe}4 z|IkvTZc(Mqi6iX<5Sm-E0!Tu4q+5Ucf6T4LVX^rT_ZAi08jt&_OzzB59w?2P-#vz7 z<)+y1+@Fc#;Q7J)#YP0ZE3yFbLUqY7WWm`yEtZZVcjI#Wr+?^Zn*JO63UU?422Y@k z&IC7xfw=)XI`)Bq-_D+B;w8{Y+;krC=K;ey9?}LDHrUHA<`$%enV?vl(GM0h%$eF;7Ek| zrLZ{p;ksp6oaqfum`sdM;_2f_s(vz%D_U-o=)GZ{dA#@x9M`nn)y z&C^$dSh{%zOm~e9u2$sV;O+DzhX%SCfZp`N?tFr~KO^ASbW06I3oM8pF#LVqDTN$; zS2g+o_x?b9dC}9h>xL%y0`c7m`?DT*Dt%zmx$qKg$H8A_JBr!7_>$>s>n+28y=!EB z%lC=BIpdbk(aVZBk3{}sL^ar`l6Yuom{A22vQ$TwO@%BjPt@*D*(6LPRO};Bz9;<4 z13tHsIHJpOU^#yd!EzZ1p4~6<#%xPblF!)yN9?P3@0-XM-$pfBdL@Z7pJ$a;d{6r_ zdFahq_R}sOR%9+$S>1+l2x;S;h*Q-?GMfeHteOmWp2<(Xl94KzuPMV=iBsrWC@W!a zgS6kVxR6)E2XR=T0SvlpyLZ^~&cFQ?2$=63e+?o=ZBQ1Cr}PJGsa|sw8Nz~;#&nB$ z3P&jHHX#fh4_;-1JPQO#C+Skxg*t%hI%a@R*di9HvLrE253u&*32T|N$1sK|*K%c# zW)@indXQpdLb6WbiHv2KR4io+!c9jskJA=Y-&=D3xS9H^ANDNn}MrLHh_iyjaz1Pb3TkClxP0G!kQ*1ffo)xI*pze#RnB+TGo@bez5I=c( z*&t@@;s+6PzOgc8+*eR~&xW3$jM>KXU={^ahXsOxHnpcHd#9GbLnyDSpq@n~_e#Lq ze^EOdtdRbNs`1j{0Ha;~EEN~9E2(H@Sznq~#~y_A@ZttN_Bw>h4VXBWS`U_ssSVgh z6CwK$GYuk&ooPUCe7*_1L@HD9FsJdn4CAJ|!)(1GpKo>P5RbLGy8n}|dU8}{5J6uw z`q0jf1Zm<pZbZr_+@qkB2A^K3+TBUp?&fg)5Vhr?5`ET^72+eysF)erc)m{8JMr#0|-O zj5EPGeCVEUJSV63Att&2IzD+f88@j@kA{Cd;xVjsfwp|gMj7dmJ&xA$0WQh^e3CTg zhCVgS`O>Y=2)!#d>iItv;3-V{SMA#f%<_~Pr)RrKGqq5cx2ZT}!c+N7 z;*JwE=!}W^X1&HKGtKO|+cG>V6$^P_AUu1M`#+L-XJU>^U!e0lD9cA+U{E3#$Rz%|0B>@H?V?eM1J{ej9mBW%(=1u(Fie4{wrUjCViBCJR4E>_B=ewe z-|0g&+!p3IfM`$`C{7OteV>G6g69`ma6mC)q|GhsfEevBl3?3$FA}C`Nns+m{e~C# zd_5NOt@I=?c3HrK;%@9*(c+&lDant=sYZD|Ca$X8j8Cy^fWE644wO9RU=V-D>)}QC zv-!XOLVYhAH4Bubjor5N*=n;T#Kuv6 zz7BU4wW$yX?yzwHhdk6m=9_NF2j<}!I6tYU#D6b=1%%47;f;2Cc}&1Qvk-m+?Ogv# z^f~x}yOhxr+ws`U<5}NKb7edgbZS`Ky+>JgyKvaUb@fu@ZJQX8@!MtwxuyS)^Bc-9 z@W+s$Rnkrs-25H9G_FY{$M%=NKbu`)fFY|mJHk!U?SjmD zHt5|%Eva_8eXmZ$-L)Of2;ZBw5$vFAGRmV`Hg@A>eoK%@Pc9D&?NEIsg(GRU46EQafe?vZkgYpA_@&}W>L6ChZjeohBt)SisBLw%X zP2_Hp&Z!g_UUWTgdtG-K0V??Y+|;~pMetGZ2f-C8>v&gl7R3-jpaUtwh}a%l-Y>T@ z_(Rnh5L}PynYp>Wm|HrSy&Uvz8Naa}H`yOV?dIluV(G5H9~_}y!oI`uuE;%!!74Gu zN8Nf1`>F4PJRzywRfyDV8O?q@+KmN2RZ22Mgk zENN;`uK*I5jL=r04E*MohjXE}6R*wv-Pb4Gx3pQP^}0vAH#{ zK_1=Nv*Mxp>RB~=a?X)pg{z*eIRn$x?@a6pj7E-pzb`Y7AN~m~ftP5~lR2V_8yB9!GgEB-N-KqvQ z)I~DxZlcgf{rgP!^?@cPs;V@&^54(-d{xE7PrwLbi{NHiTDTz>qDQGVBl)AM#pPV- zdc;yHeso`IW^~`l$`7;CbpdopN_2A&o zCo91l#0NDiMpEL;Ny)K6X-;gNCm`8*$mmKWgB<-ZQx}NUqoVav zx(2M*BwH444hE0TqVJzc>ei}=`%6Ib>9Zn>I9%=PKo+IZcE|^;gVUyidbpv7(5S(H zebv)oWl%3|`s$-`qEbO2Iy8lQ1Xg;t+9}t@nH2`+=pu{d-ZL9(E3aWA+Df!_w*LCK ztfI6Ew6Y=2go3TgEPI|w=@?Zh7;GeZl?g`#G1(8~TgN6MaEF(jFtu`(WtNR%75SLr z+{|@X{y$H7OH8cHso6LyrMXA*a4~xPiY=R~4a!6K>Z0>B#KxTcD<@n{d}2L<-^FvV zmc+_vx11d0-?G{#tfQuh8I~p(c5)QL=P4C>dCDg|%C@>wL7E3Hzzp)U`1tFU&A(n} zRdt=b&9UD^gBuNkNeOK*StP`{Ma7ZkbN1qbojFKxXQWCN%w2T3a#OI-i=gdw+p+SB zZqzYzX47&Cm{;t03(#lvt_SVAek{8VucfY1a%i3xUKzsGJ!@^VOz2%Z*eCb~?=_x6 zA`NNY5$#6n`Tb(+aC#jHCIkrOz#4G+ujPGz*KOOr;1`3Tjdn~+SoZ;dmgkXA=-MAP za9wP|dEJTdal3JmFA1pZZi+FXD1qj=uR`O(;vVy+I#+|RM>wIzI8C)(X}|vq?bvOO z`8)H62(k5Z5&!pOi2sea`A0jqjjRAvKLbKmRnr{RzQ$~W?!_26#lwNX3GXriB_U-7 z+RjlQ_zMN2L>W1H%Gz4C!SSa@H^2ph2?ldvu*O7kr#*Gdv1C#TgSs7*V7p&Ze)IeZ z_rTz7qJ?b{hd3!jq-^GSd!0zF*Ix5JEjbOZ@w~C0NU%pMb#;x#x8stQBksKOyIx@M zudv-nLv)0?zd|ECWYy`J#8KVe5@8B_WX6b0+Qj7`qP+1}+pXw4>Z6ShA? z61n~rwlNDna|eA|tl_exlB-xKsiAyUOpRP*BOi=dr_~(|ir*_nI2_(jJX$~ObhPfq zb3Ww=x{F5~kn>AVpMZg+@%y+;Hvg6+oYml@NA4gOhKchNQu4+AUE)R;-GOPLEaM1> zJy_Kta`z>Vw&kOS92<0`mSiV=%nwqgXLMiskmi{$DSc#2E5l))b|*F}2h+#Q1~RCh zSEWxNdgE*{!*H=8iC%F+l70OgFIshGStX`QqbK3_+!Zxl!0hf)@IZkBt}O~3b6@(v zZPXZNC-OWWAv&vLcm-A)A6X~2x9y(}(0`t$!)&R6&mY)P_z&!e=>IZJ|KU`|_>VWh zN6AKR;ooeFe)J=hfZJk!{|FAYLIV0bruY^EX)p|MjDeEs4%?x5I-SV7peVg~3NkV* z{&x|-SjIC8b|70Pn{}`2wqw3yk7>^5jcYkQfJuGcU{&D(^TEw}dVUkT);;>r; z6lw7^>waEHr5uZO=BeP*(aPX=q$3PLv2sRjXXcE)*_@v$Y2_jLsjPa_(xH7KAtOO{ z7qjp@X3Zw<_L1I|%1V86nbYD`M|kG`Z3Sj94I)Y@rD)!z_#K#M|<}KaS-bjlv%FU8B59`6FFMNsEPLn5qiwPMQ5Tz>1VNq}hve)1D zqELE>Oi1no1`@+UG|Vu%7j_yJY7?pEBzji)yJH0p@}00c z7#f0+7iz3wQK*&U>I3yrd=JbIE7UBkf}hR_WJ^8e(G3 zjl)}ix#ipvF$Ae~?8?#9wKCPb+g||RxMn4m=`v&r0(1#*BK-g&eS`q?A6?2OF}NDpoY7466OVoMJaXZeZVco58|@dZ6xpvaJC-ioLB zh};jo!8o2>=Hi!_bLNFjVe}FR4tn4~MQ6r}C`g>VF&@`m#91`F~=6Y|D$=mrR( zHw={1kD-6%>42mRqtqs^nlw@|<&mG4-^MOni^~Q7f))r*lZ3EYct)17p(eQ!)yNVo z07s6>-W!+5o&=F{2z!*-IY$fqyk!&hwgPaopPC^k$atC2`{%`z^$PM@h5!KIM)Kd$ z;{UP7{Kw)Ew6-&{5;kx)_&sSn1emNJ9u5Wp z7A;Deg20MnAIcmo#1R#)V|3lsBFx(%3Tt@%?+L1oQ+N8-2DSedg6a21`s@AC)VH5$ z>Tk78Z*G6c7nNN{e71g6AhpB(kO~!tXsT+JAtn{=l8AFq+nc`MhvoCfMh*p3Z%ezG zNzRE0wyHz4<(?JrEqku`SH0PMn;{)44zW~MDymmX^PiHQzfj@J&x9mB)g@vnP8CRb ziwj45IB?`j_a#hTDOGr?BFwy7k!H&GIpHh)steZE@A;JXp;-3;RXYDfpsU;_ zP~oWzO#szEbXw{cRh3-ul$gFntydkfu(8On>a$>AsA6AUgokh$affnw4$$?&0uQLn zSSXb&%53Sn6=C5mxveK%9xqSJk>@$4Z~D&`NYoZ=0%7%8j9LgR$=zK-(nV`#a)a_!?S^PxxhG!`6)hh9$6;_Ij%Vk zYo4CSnfG6tUBkSpzJz#u2wt=KTx_KE3f3|@%^p!F1IwSjh8)Riu43hQekpFse5vKY zTE>8Gn%>}AG%>o9+3H~3M2)nM1ko)BXak069j>^|0o{sEV_W&7YTGE!>gyVv0GbP{ zc^+}q%{>ugPp;*5eR65BGT>%h)kM5Lu&4NJGk-uk`?*;)R~>ROyNnxAn^AK-hfo|M zWV2_BWK@Jjsy#VTwiEeT43w1| z&ALeZmMF|gQ76sjS}~_ni{;2;mxDVK#e(2&fH8e2M8web}?+ShwesMJJZL74VuY^9Fs@sKz4t9!A*sJ?BpGD-!i z!nstWMY_Ui8K#7R$ud@vv@q3uN*fE0vJ4Eln%U+8+Q^Ow3=Q2#o3xfxk?-edZi>TO zZkl_!$+m~QfUYxNezE$7#Y%fe$w@mGtPPgDObW*)7?!`_=%t+u>5_F1s*ybn3nJ_N z#YTSD*F)af=SJT73yv(dtB#DmD~K$%Z-~slPmaw07ae#=;^06tpeELJ27V|D#mLYP zN1v!VLW(27KNGf+N!`<=6UMl&cU;0`AgWO1r>VZnzs=`FW{)xXtj9&%Bg@LSQ0b8Q z%~+_oErhp@LF^#3y+a7PN*Y!Ao@?V{Ff@Q_qGyUECL=5Yk6uANJuDD+z!k`5zAVWS z^{%;Ebp+Fe%hJZgNU=p!(b%Cs#CMh7=Vl!Rw7NO zqV8R=s%kGMhfyUtxw5qN_$Dd^(p4&ZD-dZLjBP*uhy8+QrH?FK*jd&tua9(|xNw$P z*X^O{10`Bo3-D6ekVD0xoEZWCs7#puKqa}T1PYW}@G{Z*r^tp9cj8?_}w224hjXG`UHvebl)-HO3 zv}e@HeIHoB>r9M8AMC%Kxkk9x=&Pgeq|IhKDpeA5VYsh_g#uVfuKm;2O0%9X%3Y%1 zcK#Hd{!aHECbjSbfg!;KmSzI2f9*S}m0K9COJKbq_RYkv=|OI>p*pE+%h}`EPR*?p zX{Y*GWY>k)pjT>>+1VMemqV=3`P_zV*`!dtsqFD!`!wp*C_`q4Wh#PfHs$LqYmDG6 zmj;V)XvS_r5IhmthB~be?CD&Yzk!^J7uRk0<8Ms?^Cv(8% zqu4S+c^Epc7pE;}{lFB!n=$`5IxR2V&oRhvT;O$Y#ezU+{ag%`^L5Rz!*eO?}k7s3Ck5I*oHF< zkt=D*40RYGGb5*Je}tlFLnza5ti~`d=kPL)UyFY!>Of=A7wjX&rc-l-nucI!nlH6zayTJ-NIcCO%He+)FWyp+(zVwVu zF9IU9JdruOQ!$b*bT_}n?1pV#z^&K5j#w3$+bAn7#6?(Xovp@7$Znp&(O5GIaon4H zoW2&>!p8s*Ny=sZuJsOmQdy2YNDFYD3w~};!Lo_Ie&fBad_ka3h7cE2qL5a2T{6i= z7?W(gtrX#MRa}@sWl}0~!}Irvr%ZYLATM3q-dA?mdh798o53Q!DLIffEjRDw&_kpD zsRg0rP(BMx0S-*T3CKdIq@35+J4hQo;)NUtIFkS#i*Vot7MFl4H^h@s0hW3mf_p}| z0VU8F2Nh2leuWhQSJeJ!!7|Ooz^F<3NR0X<0T&AKkb$}sPJp9>GFCAZbYe>TyqhU) zJYe}TeIQpGz7-5uIRo}$9f%8#0Ir-oInv_TH-PdaU{eijxpn{o8U^`ZbM~AfEG9-& z6CE9+F~EAp^x40Jh@KG9}C^MT5~)jgA&m{$-fydQHXByjw}H` z(x9(17Ug8Pa>;znB(w|6(#7*pJweuL{32k5=<|V6YvqZsGp_vhoYEBJrD&o2bvp{> zv#nu1>J4+H`orLQzNnmojEi#Dj&fdKxj7^pgqsd};W8^n#2MOc(Iv!Vx_hsezqVvt z^w&5>ObekqxaLy)h+S_q4{U1Cv|*$aW8*aAvifxsrCbiCJhxaf4GrWu928Awo+$Q9 z>;uHM21MP-7RPLrG`8fxZa0;ki8PxbutU6QL{}z)-T2%Q;0$6sVXn6baHz4n7`GHN zqa!F%AIS$LSm5(5U1IUH?s1x(VFPZ77zg&=OG z3GM5KKTO3+k0fW7t1OpLSb`xbcVFlkn)g6MHRO~=kaKMD7)bUf0=YWW5SlBsAxF2F z`rfBk!!^0>C>-CIs=?G%QSU?T+CZKyxO!aE(1tKfn06z5 zim^8Rsakqe z?yI%u&g`#WfmLB)qncXD(&|Q8k=VHMopboyDRo zQo)8|EU#=UuMBm>D#LqK2Ki_%7`68v+dK3Ydl+k24kMeHC#W9Te*gQ|TJRz#e_TBz z&o#Ir8Rq;vbS}zhDiW~?-LT}BhTu`2=G}cdPH4I#hik%Xq4i;p$eP4AtqJ+xq=2N) zw~-`|ucZ3BMOI@1lf%v!7{RsjLTgsVW-dx>iScCulaRv7uq04%4Ms|8LX)CG>&cz` zi^cDh`UU%TnKg*_RTwjcW~GGsF^#0A*RG8EMm6EN*jwXT4@LWwYR{);ijJ|piUhSH z_x*b7?&0{F+XE|`J5&-qlLITFeSk0Vf8eWlGTT@%VONR+k(vaFOt zom7lT8BZXtlu8ZZ8&tAZVrR#+Tt|av6?er-n?zfAh~7(=6oZ7tM}E2H8);2DsBgMo zui}fOPhJMc^34QLd@F?MDHQ~j2wjMaAZujEPc*#TRF)a?eMRE?8o=e3VA_=uPj{hGPC`Id_i zendx_0Bpmy{T!<8G)7Izb;P@~6*#QKuG_}#OCWx$^$jw{t^tC#4)+Zc3DLIIKCEUj3B%+8yR3 zJRhcnFCoXjO|{EP<$!ruhXDyB^(p;Y06kY@_TX{*0)a^-H)Qo-a{F3r3<1ju2c8xL zE(xkEIGw#`~NQ*y5Uw?N~ta=hdz&Sy$7J1FQ^xF+*PPA+( zntnDt)miM3=xU?zYn?xb>|Cz6RM80135x1ksBbHtFY&WnTM*R!6PGE_b21R>aA6pf zjUb(yB-4k&(UFrO7mI@`EyJoFJETk8z0Wpf*~Hzw-?|t>FUaWjfzx`}Hky2F5X^%= zbO)3)0bLib9Z2a&iFF{tqfIx=;{oXj@kQZ5nKC+I-_VHzKT3Vu-U+ocQ30E(Z3>gR zf>|+f9*yJ?q(GU9ojJj0e~AHA8Aa%t5G#dYq*Y;+(s?SJO}XYqsmK|S&8M_irwZ*58bPnm;6$iT?_KMm^@ z|6xm#NLFVgt)(c5pTuWQVG~yyr;kdFBrHe(gbIRMm({vp8eygO1cSsMtX?aiqnwZQ zZ_?{kQ~`zjqrrp|zSB___sa8gZf*|%PaiNmYbA&JqkO+4EZs8B=A%4ipbPjjjx~ey zQ9J$+&rI%_PMKq<=(E4yQGhBFTs}*8+e z#PPOuJyUfay+DIKZM4e%qA_rp&(1a^a||068OCJ(2(uIFbTow{G!vluDC;5*pr--B zBlD{D1GUM8Gjsr&T{aDLse*x62%DTWr6j%_{e6r>CFRiyya7hz$pjCyr|1i}yDRm0 z6Y2P>L^s@LM#$7{FtokTe-WCqy5L#Ge_j<{FaQ9S|5<1jHZgQDQ+6~kGLf(~wNrBb zPda(B@|F{{0?PN6%=%PyvSPb=WWKqkjk&@Du#Hc!e4(X#hfK9I^;Yy$HD(TMj(b0F z4ufubUiMkk?FIfVe_G!3)>PqAA-t>U^_tT)XU{!1zL(#}>lt zziZqu*z?REcyez!D&oae3GBUpOe#C4cy~}?E-PZdg}Qn#y_x>DrDWq{kfpu}Of+{I zgo=w9CJ=I+9gMaS+N|x@^K+AKLh`Bn$sTS@JPeVz(p03k6Ya977_7CBmVSMOOf?f3 z@4httNjJuuL%20}ixLP5f(*PTBx2;I!YbLXyhL`0$pUAZR{${nNH>7?>Ex?AN1#-m zq!wdlaFrv+Po4)~wmpZNFEJ7h@sNL*u5QMcn)K0lD#1uvgc_VXUXG)o<3uJ9c02;M zNp-5z1>`t*vr|uNDy}JJYsLyQ%?7HLFEE{1tQWl9#Wc}gK3ixe?9#%Q-{;_4FB z8D;Eu;)K+K&1fB(MY>WW$B&XDp${{^UT3q46~1356~g}fCfkDkA)w8Xw8R(x!E_<9 zpfWe(_K79{5_J?h=21T;O3J(s^A>ne((ejd=Fs@%6PeMpV;wIiGGDsm)rI0(&PUm^7PowVxd$6)v-31vpHOnmw*Uc3d*EX(~ zhx3I?`Z#R$A_LpGm#bdAG_5jFL{lj? zZM4qJ$yQQs^QX&-?4TIivJPxdchCt7 zMnBL9Ii+}k@|a#&)s5LsD-<|ehH<`X@j7L$RV}h&n(~$Uj;Vq|Xpseb3R$WxN|P8k zP1hmku=aIJ<7%F3^UleRHF4Q;Goq7U@B2SR+Q+0e9(Hgb@%>;;+GC!hph1&8RtsNct#K zD?%-3^~oU~SQ&A#_?24J4RvSHI-LQyi^bYVw|11tmmc3wklAz1p$n)H#ux{c_e#U~ z7YUa`5(Uq4D+DN~pojYVmcY9as%nogbruf$JY~M&Ixt99b!W_pGd7#l?ODzIHLnHa zFCBEU1(;BaIARC}D}YnYGOILKUFLhm5#A}|M6`$OFbR2v^h#!kdGNHdoxuE+pSsGC z>)|(q2W9ct9idiuL|)(atKKy};m1t*nhAR)aoG^4Qg}o~e1XzfMnRvzx-%td#azN7 zKCyzgz-fQQF_N@U%)+&D@>(b@BwPPVlzG0=1qg{5o=-3kAE9S@#eJ=?*YnaAoP74$ zzi2EzVW5%yi8+CD<9+ep=JNJ>?y0|O+qxUj*0;;qN| z4KWHT4BJIZgbL9e#+@L*tIuFt7?M=`-Vci^kgW4mQrn_vRjKc)z`J2P`yyA_YmKLz7l>PD|AV$I{$iY;5 z=DJ~2VRLDJf6pWwbuox_YQmxzlwh#!I4I3t5{FX4}F%5&nbI~28TK0@(u$W2>zLir<2`BXuNG^r$B-<*N zBFHPq<8{R7JhVsvO#US+ z)KxlQ&4@cys21^drX{`5Yx+@U{+P!;9suhtqWMZQV!Q`XX`pe4WGW$OQyjn5TcKZI zePt6hi)|6=5zIcGGE@0xHZT3nIBZB}NEBp16d9ZrLTLzhD-n%!U#mWe-+PXPuN{@M zN(AYS0jMJ_$NKAQt}!=>hfU>oNxJG}#kxHVITO7LYRalUZ5xubZ$DQ8PDJJ z&TifwfYkw0G)kHc^`^SvxV2QtGvH8V-;O^03&zGm((HP{pOF-9AM)1u5bqNq&NG78&9p$vy{BvnPTcB6Eacq4dtX z;sSx$T^HEWlCc~f&fMJmkKv2UU989mI^0UWNH}`ld_64|Q(R+$P!Z3R5$)r1)sdQP zyltsh-gQ`glq<)h7juV#E*#oC8ym**SFKR!UM{>b#=CgsBHvCgL#B6jQy||PXMr68 zjivuIj0dQoXxg?1kQYe-JX>};MVjIXIrj>xzCVpR%=gXCZd{*15HXk-Yz!t2JBNWi z(=es9k`yz+Z>mW{I$OJKWxX&jji?z?7$noaQC)#$EO+pKj*(PYT37Es@lhKE0D$)Y z?+HuT*jxYODQBy@Y%VY$_=L>)M(tk>Z2cTM;}r5Q<_72XZvS~aOKDoe`1ay!(REFD znMt%?zBk$;`_sIjU~$fkg=?Qo7ShQ&i?EZqm?^?T@~#!CnLmi)lS}wypZxyHV+8OK zG$PpkS=`$72uo7;3f)ngvoi(FM5793Or2m(Qjm|WKR6u=v z*hH3Q1ghDUG*PtmXZ z`6wh1wT3;_{|_2om4^!HDm8&{RUi;afq;?~R$EFFgZdoyhSZoYOQ!ku;3??fZ4m7- zv(}5Xy=kh}0xNTkf7aNy@eBBlqH+-e6eg?+;GUFKyXNvrXTVumB@09`dAuaHEop1{ z{@m)O?+L-qs6$)l3{81iAFLFM9isFCQhT*0N3rBOil06CZ7elqSX?0@0_`h&IDwFi zT~-Czv#eSMv!1U)Ls1pVKAI(%u5KJHIuw{H+Wxp;Kyq?xy`sJeWHk+Up`8Wh&y^sWWG@t{^MA~j+%lWdj$ z74xXU>Tr( zR@JIvij~rMHPVrUFHUIJ=M??V)n?ET>^Z$L#Xh4yQ?DZs`JbDI!KQAWD1M`xl=nvo zwHm)pBsGn67=7^SC2!GV<^``R8WQ&ITPZ!k@IP0o;!~;;6%ayMmRwXqaYI(tQ)lE$BntkcU z*(-!%j~HwBn_#NhC&RVYl+i0({cdvDjHt#gj${v-DDldqz-!8zs10fhJx8(~Z4KW* zx?-5@V7l5Xk9v0(PrsLQ7sy51lz)`RzK!Te=+Ic!fi&UiH^P*=Npj3(Xo|!o<-N0zuvtxTc?V( z0dmA~>}50}@q#{<4>0_zKY=dx+VJ2yK+SfaQB%tY>%L{{Q|I}7P7a*!lC#+bnz~p~ z!m8x%QoY|(_8Fk+rCo;D_n6ikqpw_$)LFS&p&P=bPc1MoLn1{sVmC89sZ+HN=>q}& z8Tgl$(kEqtpt9GHP5qrjV}{IS(MJ^Aw@_Us23{hPpsIG`)Jfyl*bq{C8Jnp+5$60L z8};6ARhCtGYZfwJR_e23I}1z431+f2QRjs3MrdekKHZ2}W7Dx_LjI)!Fb<;Cdy0TF zIfA6`n)KM*PSXf}{9f59t)XrHPJh;(oVt`-wI@BhSoNN3K0%dD+a;-Mg3|?L!9M+g zt*EB48PUVu1;1Ql4LFFydlo7JkaM)SNgU0V>H^N)ttZdTnY)_mS)(s9pQq6L3-EiEIq2P zvB3hx2E0gdPdojERXhF1Hg~*z>FR;ZUqjd@vE8?xA=UqK=I5TX#M3Yyn3^@pn<2vtT18?vGt zw>k$pjt=5t6X@AP93~4gwn7lf zFF;LX{)rCqXah7vMqyV%frAKAB#kOT^s$)yF}Fcjx%vhEV81gv;3EVtb^^=Mj{Sq( zJh_J8MTwq*&=F@vHdrAxjTWy{C4M?mrpb@Huv*X@bnq{XBUB@_O<&ARqt3)Sf=ypS zTy8WUv|&j8}d5xkZg%djHkxUxV5)5ZrO zu&*zS^qVM;1E*{dag-)T5YT~TJj_U52IqGuiyf8h?w$#mTLU4o^5TJqohj&ek*K+J zUy-0MS1k(^1G5GjX-8b4k=7#ODKe521X}RR^~s>sw49)4(I1811}4HMG9Wa>-0Gss z1ar?c@;Bie1+>joEN6}U#`h!>`n30Oh?S<#@mBW@Ku}Oxgiu1&pNfCwOWvA3C zS*K7E!oN9h8PCv8XJ#AI8)BKw8Wc zub^UiQxS?1`rElV+^<}Zhu4g^`Y`FT+|bf}m_cMSqI3>u%pcoUx@iGU2fDNHd;PHc zx%eZUK@kiZx?u(^u?Q(fUF}d#7P>qK;;Ie0>ir@KiJxX+hfWqk4Y14k!2udwgf~+E z@J<3kcY%Guk6@HeylaJ~x?nVXg!t|q!a?rfw>%!g)ob<+gX4{NTI>l6s&UihdJ9)# zOskC=%o$P2gSKf|J>&SCyD_YcyKEys;6u!?LH)rg`v|QQ?;Xjx>)QO<-JT{DHmh&@ zG3dlidm>nGa}mbo;*vXd9c=Du0toy#g?#>@^;@0w96sFEMZ_X=X>l0NQ@_T92NLvX zY}`D?#9^)A&a7c@d*6SlH+ELE-`4oakpq4-!2d@UrD$Sr{UZP>8yH%f{70^=H0HSQ z3&F=|0*yEc1SS~3UH)sO}>$5mUyk`NeIi3g*Wa9*CP!%@D-Szl4` z7pK{NLL5`)!F~lCW(V!wR@{pA-pvIn^Oq|Vm1iBm4lEE`mZJ*S4I5~bk<7DdtjGR2 z=*QyoL3A#M3gngjQ5Co4DRG`(&hZ=hQK0Oel-*Edi6okn_zytzd^B;?s?@~Djb1d? zahtuZ=&i@xZfCYh7!*;zWA4b64{muNv2JZ*TQ8+-C)B2APDXnsr#3zPgVlGGzS1ly zM?S+?0rwCBZJw%{2^etmix_yrk@wR#9?3rJ5bF7nJ3?OjaLo;hR@7AUwxCD;^f70oP}pvBHcvbA3@SO4B&AtZoPBL) zvfO^TN-9#8HUp`pb0nE3X@sBNOZBjz2mJ;My(uWV$%J+PplBu_CQ>TUQO`n0+Z96L z^Xq86-o-B72ezQ`g4nSp-mlE*_lcH2;HVSBfyZPjdabbTAW}rl8RIOoG;zV9y1+-2 z>bzy>tYxJH3jTs^5OI+j!?>M3o~|s#_bDaK9mDb3Gd+(^ciC{i1})EM(I}+22PmjV za&V1Na%bL<6mNY_tEg37Od&=Uc~SsL46M3>@7; ziguM_+X3(F>^w8@BZZnb3vICTfBDjJ7mEe3CIbN2PyzrT_#eM?{;@2lv^~6)hj72A zF1+5^GSPt`0nv~k+~^=$ek^54F{b?yZuAqa^$i-Z8?Zr|)`e&_H_DqdZ}pw=+4uE7ZLi1z}GeOPldg;qBn`y!PswEFDpUvpp@$D zALwBotk69(;Qh#nTygJL2>l8o)O}X8yUkbYB-}ozYw0A?>YPg4VI0Kg-PfT<4SR;U zB^UZwlL8)!#JfeW{vIFNX?5R`3fboseRUK12y*c5g~xY1Cl>O)K>U7~hX~~$;@jI- z!uyK)&3`;X4|7|TIvnZeG00dQ>ousROEnCF;0{!qz$6brNAgxUAw^i`Aa&etBR(M2 zKmd1oJCAcq@XJ{X-(JeG#30JIjV)zxe%onIq);_uxU`sgw@iCde>Q!SJyNTo%`Qf5I=RHb3J+e{(TWefq=BZ~S@Byo zYqtbco93V_vQ<5cFm<#jv^A-tg86`nXSM{>k<-m~Z?RH=dvoRFEdhfRrOxv)OTSJxJdAx6I<>M$91JyY%Q?E-_N08F?T-(^WKSvS@*+}23@i9YbXsF8DH}Tm z#F82tTL_Ft6M01_7F~j(Faq+lPl)@G848wC}x7u46KZwQJf;vs4znmo*EE>KlYjsI7qOgY;i+QsJ!bXJ%DJRj?Ff~X0|<** zmgJe4`_1zWyf;Y+7SdiW_BN~dRu*95*ZC|AmTfqhRH|3SQ*0I*Q^Vlh}@fNJc z*Jq2Tnsep*DskPc5LZdwG;LGRFXzBh`ht&Tj~a|qeZ}e^Tc43!E3r*gXUSMDthk=r zC-8ee8mTm%^HMX*uQm7bO68gOP_U#Q4+sUN8ob9)c`0Yyjv7-xhNyNrl%F2qGWqE! zVL?DYb;dplrpoQ9&a{<%Bb`D{H2gGB;$U#)%kkO;9aP8~6O?<*kTm>UE_Re#>eoq? zPp7}d%-lbAW&!zYmilaD9Ot4NHZD6UObu{o?ur-P`U6L2DeGJlhT7ObnS}MIfZt$6nF~LTQ|;IZFk@dh znIK+hXi37IwC`h`ZklI7Kdw9j^B38T$d42=eT?z8z|L$XaM4Gtfa-;@{a;cIkgAlA zl}eeN7HG>3d7;}xQ+-VcPLY3;qQpym0pS3IzBp`=p|u3_TKlUCR_79ijCH{?svh48 z{|;fDrL;%dC*%l&FDG5~om8fn)68R}Rx5r}L8o4#(P$Gv@PcC3)&V9qa79OsYh}kU z327tj+(Q!^fagth7-@HLVKs^5b&xLm(_*JiM;)2+M_D;zxp?E&FrA3iwIhkpwk%hS zyi#B(ThT>$E@e!K6TRZRqQWyjPkfSzCOcC>NEdu2 z4*$9JJf^a0htX2;!i@FC07(a}ZU(|`?yN2OHmF9ci%UUK)Qr18 z*H1?W;35_al)a_(#F)|S*3St)K2www4U?DZ)BuK`=HpsT8ohwLHrC|ANH&7EO3Exk z%!!dKzzWAc&x{8BFVfcEwhiVYI^!LH&ZYR2BQ6XmulsFWbeysCbi*F^Sri+?TuQ7# z&BX3}*QowNOs+pNbMZOT8*|de;#ylqENFw>OogeI! z4OFOV{CW{tClM|egN}v1J2kYNM^U@6s$jwrYfJHGl781JMR|{byBW`u%GDoJM zs0^c2s-rvNG60i;YUZA^l4)d!Q36$JcuA?|^bnSg=<3B)T8Hf1U@u0LeWqi}CP*z0 zMj{nKyqDY>`E!P2k2m7aVrwAUiF+aue8$6pLR_Ujg{ z=C{Y?UPyZfTZY^m^oqd|N?Y~bLERb`t7UJzC-^oeS)h}uxjZ-v9(s?Jz= zTmfeAf{#nY#UKvE#)OfX8M{UM3O|Ec;frh*$bh$3;REcp`%IFLu@$Kf8o+fH+OcY(Q^d;a-vn z27p+DA&;xdO5Ej+PZ5fx3F-_NQ z6$n^%R(>@2K;iS{%c8k+WlYg8Qouy>*!LTp# zK-X|BDD|-|APGw=V9Ej0Z)Ng9=JjTcgMkHi?UJjp0psReatD(XRWjP3O1|DXTw)aZ zd{OB6e)ZeM=*3LpP=@>t*d+WDQNS zkuCqfvKFy~sYk(DKA>)!F+!lrHbMLA_PvAohh7VH+PUPHE{^vzKab-o-`ae@v=GB< zqHePM4cv`QLm74-{xq2N18K zw6KCL^1z=Xjcr#7y4%|5QmpO2oT4~T8`^Sn*`zREO~XoHXAv7>VwQy&I?~1%7{}W~ zQQb1IlurZMYEA8N-RfX^7Ev?kTb5BEqi_l&%o~W^7UoO_; zZp|c?bBCnKIxBU?64(Q#=E%Z+9AX;wGPJSeW8A25A>^U(O!52e`BPI}b@LGwvzocP zg?9Gu@|mH1&7fo&^Dn$u2oh|8hR!~V5^1|dFm5g)^#Xk#yxmG6+ z6o;!p_1?DS>|GWyOkaO7E-oz^-|f?n&NnWP(z-C0)Us;zWV@yZ{NWWUyF;f7UG_qf z{v=UK>Ehd!Le_Yz6S%|&a*xqsTzOWc0&(py>*XYKR7;Z!2_H&JP^WZOQp; zloKqR9~JUIGgbtQx$;Jn{z2cO!xu&H22Bk@7;&tK8y(Ov=(31EksA;rphn@xrh6ry z;~y@>(?LMfD$J7eVvj&s94XW_0bxtJ8V)v^!z1ML-zN5@NHt-dAiTY@P3}qg1+OS1 zC;#Qc`bV*+BSjIM<^u%k^Hs~1aS0*1S@{b@Rny5IT$m@w5xiwC-q)73F(&k~Xg3V` z;*kPmK_W>bx+K?#HwGEywrh^nppyEqW5!TGPY3Xd~N0=OYukWg37@f z?*$JzOD+QsHRY; zrc`Npz|Bmtj*?8*pw{2|bDJ}U>4Ls~1fUfvX_y9W`!jM+A*#fcCJXf%{{G|ixKy^8 z{5@ln!gu7Zv7?2R0$*>P_Kwy9NXOshVzg4U{aV7BGNkbZTQfqgC3MjGQWeWs&sG7j zva-ulbO-1ghMq0L5-mdQEkSQQhQ2(wv0YNQZ@7-$Qn=#5#yO8nfU;NqVxxZrcd@4KUb|^x28T%ULQQxrcFhi%OH(Y(ntItJ1m*yTTSp`L2Lj@X2t_J zDi}KAdE86l$jOr2bRP^$`~7ID8xY0re)bXPs4f_&;<9;|Jjei zNZi)*;7gyhTp_J3!F@jZlnb^h9x=z>eEws~#Y4cti29;uXWI8C6@3}w5ZxW91>+S^-g;Ll9EtSy(#Z821v^tv>#laUsK=zahQ{CbVnF1y zMO-UdVFwKqAT)>*WaM-N4^bgVc4bW%6m%Es5%xlxXHxe3d$w&pObH z3C;^W;jvcIpLb@2S=vFM-w1~o)fxGRJA!Rs9Ez^F>Yg|7cL$an%)PijCi#jf#~2KR z*KN%`;#oZ)2YEvg>IupU?x3)V{De>r4aGJ&t(n4FrO*MDY+%gsm27Bq7?1hHOmK8l zPbc*En9~p>8A!g@$&Eij2bgSaowdDyx&+`UN zY)`YBxmnF6ZIJMT4~}%$%sFw3@pj=Er3vAul}&^nyGFKF^6lXgPG2(bEpUr<=JV|V z6JG6@4!RSa5xVXQ;N1GNYp>!1kPtE4LNzB9#3mWE7L=lUeU-chjRV|u%EB>&PyVG=Oj4ApmK%mAg4qo$j}LBS5aOP=1?7P9_I`CmB%OAQZ8I$z zxIY_2kUDxSYTLpYWG`5At7}34@!}y2Y;NN%0E9bK_@mgi7Bo835J1m#%w7c@A zc?HdvlJ_hLa=H-tNbrlDNcp6#saf+}gYTrDlX`^rf%2XRm)b2t5P;0K*g;vAyL>Ph zYB96K*DRh0btiy~+f1xH7In|X_?otp%U;TRmeZsgeOZ+z$||&hrsiK4h->22EkI6f zY#rw3TwS}Ev%8RsC2-kV4MCMu2yH=IGTu5ZVCSi2!>4u6d=wbMG^6$11K z$S1*aPvo<0jZW+ktVVvj-5P!)DEh#mVy!B`8GL;%maEXn{R;a=&lTQe@|2W;@~H=F z#r6C+?`zgK?Ca%q+_0!g5z$Zq#rNT@B*=VEVLGR2WPA) zJ^~tbnbM=){a%>r%d8|>jEkAau51b21UoZ}?}-`5mC4EPQ-zVfV_mi4{xd&f@u5yl zOXZWiJdn%b42<&2P}tv67DlDOxGM$CF7M}t!Y=fHd83jE4csl(iG5`Sw=6$+dBx4& zO`g#$X}!F%{w>cv4O|NQlHKfDPK==3`OC$PV=h@Peg$e_1+@x=9eIx5h~AyrPN!cv zsQ5)E>f>hVlm_aJ^JWCX$*byT>dI#syW9^^T^J2(*Cw~C8yM< z8m|7+aptL*OJI`phdSZFQAT;bAap6_?I(yJ)R4X>lDHP98VL!dJ81#V;TRS9M2=KQ z>|4lc-?pWtv;}pw9TMqQ^o2oaHG4#i^4G9EbhYaQmDW_57jt(&8WH&{Fl(A}sJdL+ zIyCj7`aI&LD|W?}P?-gr16tLIvn?B)(2mu^lC`q7*81e%JQsQ zW?pmQHT=WnqSYyWO~BR4vT_!BVURWnUrETRhIVkQ)$u%zcJlU|(L?UCu-^*%JjJ?) z!)R7;fi3#lIvBA;hvvgvHx;<$4)Q>weH8MgE0cVOi0o1~NvUO8IN5rM5!mbd$H8`Z0;wMHc0`qCcJB{o3wEx}!{L;YR; zt-)QSL;hX2L(jYLLo~5juDuDzq}H{FcEv7LrE%j>=Muh6vO|Sl?9HZe#d;$p%0ifW zpOsW-8So%qN63a8tZ_F>F?v}Y_WT?UHhuE3Cv7nZ0kK9-uR^~h2QegeR%u$#(tr!s zQvFtA6@u8jw^H*ua6RZ1~6AcGd zcwfemplJ8x9ofy+|KQ-^g6R$vH>Xs2gaM|yZ4+^Kn`%UB5bBy@Jx#4n+MU$}Ho2+8 zP@E^JvuwqP8caV4#fF|Jja%;?wc9Bm4u=cl`R6`pF4S=+PWkg6LN7w9$?ra0nPj#QCLzxA4-7r`{0+EbY3T$14Rn;qV zywTjE^9fgOS`z*-21d3+LNEAOBUJ~CH!U&UkKNid-oM8jVve^Cs) zf_hALP>x#|XqfXJuI%#bpVURlMf&aEB`fgp_SML^8<#)S?t*#Jo;;K*k(7Lwj zId1h!jum0wYx-fZZXfX2z^!@3VIch(HG5Lvn^r`d%UJz5+Cw$4Zbe{jD&`IxEs=7t zZc$)v*5(c^O_4*eZXIB566OwW&5^{R8+Lt{C$P0mYKQ|{rhOlc-!Z98^E41AcA^zL z2tZf4(0E%Yo3M$;;MI|)BMy_;elng6#2Vd*t3;PRl$eed(;w=R8{!>0DABwmGcluz zas=7DJ{$u$6*px3d^4B>*F0$NKWId^K|pG6%JJ*A_V01qK~o*}rr{m1s2r$Smj_4o zS|OHY03@Xfb2&kRw)9hg-1u5 zP$lP3{>=AROzo<;5~oLia|3^F?JUKt+ACF~T%KgjE9rWT#;mUoGheMj0mehcLnVLA z_H5aLzH?{)iaBJ(3@W})>gb$#6woWKQsE3*(Zhmh2){yhsYYbUt9OI4fbQa%8gU^5 z;?%1!pu1btTScFmeyM5*;lXrI+ox@{HjfBj>?62anzyVDo#E6xGVYOWuT_sm*E45Q zI48{0zgzk{KX*)-k8-3aH}aLWOUd?P1Mn$3g0m+xShDJ6ouJbl%`bLN{otcvBV;Y0 zofbti>j_eG9YK>Yf0O^{a|_ZaUhpUaK+~p~YuDBZS~ldC$Poe8Sw*@f0nokDmyD=M zZ%lP;IFeL88uMi5l;Kt$q&ia4Q>TIqx)f3-2-JH?U!Yjh`Sx12rMpLGUZ}*)p}H>? z?w;iVvX8J@LGbpUW!S=v;*>a&Azc#kw1Ss4ym|BafuJ8inGGc26kpQ7)Hf+P(G7v* zHEPd@TPvBfxgqgaNpv%R10b+WYl8m})qL%doCUb=Ny(7rKHM7wWPSfE!+rT^R}l#-IRV#S zwwJi*e8bVU>>3vcAIaahaNREU?A~BI6fS4mq`H4hA!onlW_QJ_%j0+@`BY4s_B{S2 ztR!^UW(E=haGJCGoK z+70W!|H+o&BaEawSY{a6^#Jo8dbXfnPkBYK2=GOFA6#-S^@U?Q6DWjvus&t};BH4A zt($9^iz&Yr^{Mk!ncwxyD_VQ2mcehqo!U0HRJXjgxfAxftm$qM0x9T9wo6-z*>5?y zn0}V-?xyrmAjRSRvKvq)I_}mAp{~X2@bCG+sv0!?)#?Z@L}rmpcM!nLlRQC9=Mj&e zvM4Q*gE)O9jnWj;D;fd_FG}o2%RIBIOG{*~o*q9{pfLyv?qU4g8`qNNE6C=NlIS0+ zYEgFkpuam6DEfSr$FAN9f;`rKr> zD5ZNPk&0~JR9ZY#T(qTb@POiH=c+wfBfQG@TZ zapN~s^@pi;*%!9?t-VFk=g-&FPw44=jZ>?SXXma@?5$#g5_R64 zxMOx+f#~Cb*Q|%?PxR@dmQxPRW3~_7lI;@6(6Bl95^0W@Qk-OJxU(RWN%#v9ynTkM zq!=o`v-CbC^B(-BCmKS1q?$eRW~^w!8Nf7PhpxMjjCzY1fB6PWjmqi7JYxXkKnT9{ z<1H{JR`(C0+Rn;hT1C{E;aN=Gy`x0$4BzhiGk#y zr9NKL9p(g4pVi-KzFO+zKDH0UG#Od7yfHf_##eQJr@dI3Qg&ZTpxtsmA-kgAYu@r_ zI5h?ORMf}YcJ({RO%6=+k6mB8m0wQBT%U2$wKHs8drWbhk3H^~m;ao-Lw_r#mQCkVc^>!Fh;NpIl({L1d3nG1E4yv1ny=Reizt4LqAIO-%=rg~vYU2wAOIQt6@#u$h96D7_j9wN zx1s^*OLMimf!{*^iQ?AlvsECY@_h{K%y;_x>78~*+TNVO8DD&LhXY+%>nzOCPBiGs zXxuSPnZXU~utP$zpd&kStEe3IQS|x59iILX1m^Qd!H^auMqa#<;$GEEUm@xi8PeN~ zJcLQ_bBw1f`S0`f-_KqWd}N6E&MfDaH|7XC1rLswdd9^AiEI;%Zfqq>86OH74i9=l zgh&y~)VcQN$)df6zZ5L4Mhl8m{42GM3ovwu*6mh&)2^l33iaj4z(99-Q9kUZ=IeQr z?lP|_Xa_|4)C>Cr=0ZSUXyt8>oX19L=TJJV#a17IN#T_)>6e%^ct{AY&53{8Q)(|> zrAPY(PCKEhdm+EhUHoI058e$4y6n2F2j3R?imx46Q;KZfOfe7YkSxAZ?`Bi?sKk~Q z9-6r&Zv-#~DK6{_t^!{17PZR1!nsi%JIY6jd=XSXpdRzs-UW!1zR*4%O+I*FfY!D0 zujv;B$Yy%}ZJQJZPQeEL8(sS2+q+8i|81)Mle;KlW9Z~W`ak4S{PfG3bLW0Js~q8*R*`F_ihBu2oSjR6`Xe48t$1+}{Yp<&qgOv(KyNQ)b==UpmZ zHb47YV#CTdq23Dip4Pg}A^KzjFQKXW=?7BVeym_JqCR~fnQLA_jqQk=i_~s!h{Und z@a;5o1=NUo&m@Pe@&y4X$uyv#%Fd4t`Ooko$?J%vg3U;VJer+rav5|zE9GfeoRk?J zLuf7;l@IO>@Z+t3uSBJT^QzsXqeDh?`PZFW>f( zx@YOaOcTi%6OYT|t4k<#MyM~HrB^ZOti*;N0~s5{+FsCX0^dPHpd$0k|9+Bti+_K6 zrS=+Bp3tOS-)}Lx=aK$Be5^7&M4Jw5M_&F@Q|4(yQ=t)Obx<0ax`>%{N8n!#Uiy^h ztij(5TpGClBqrv6?mebxXhi>G9XSj4FLLU(7efKr!?rcyVv$>(aUjv^AI^t=z~fsO z1d|~_^Sp1SFbW~#5p@aU;}L<)a{QeRARWpk<$bSs? zqC(_Q%v=~Mq@&1pe2R$Z)N1h+ZQ+vX)Zqzy6y3c@t+kcwp|Q78#2#tqR&_xmR-v&L$v}%ZM)+om2W%0mW4^ ziS)>LlV4j^3Rjq@`7tAP-c)?I`JGbUE8g7*Esmv~E*mXq{Rxe5wg^jSBk`0`R{ooI zYIdy3J(rAz1$^xH1vBZSDP>x0>bOj9E-zi-g!(4wW_Jd>l$@;EUa8sCGXh%^m$qt5 z`7VB>tUw)gUV$vt&~#mSJpa`UsLBOzhDO z41j+Gm^QgS+?XlVfp&;F_E5900lA7(-572}yLw+U4h|QmA;L4Oi31kyYx7lKPspcI zNRF1!$z~Wmwq}(adSki)gon!&>K6_S*OLLm2>-<~r+*jh(2?@Mq6z%^nSIirVu=Bk z$lh|bdnG0m1Q&b+IPNe~Y!Rn89+}8r3hl$d2B8lP$`Qb>?)WXf%|j|(#y)5)AbXH1 zc7am_#4?RTCkHJBEd|(DKs@$0@iSL|x@^MO0hYM(q;}WgNq$0`N0cXc3 zEXIKLiQCMUq+(q)B{i8P9;9NXjlRJSXDBkf;^-_1EOLyP4jyw#flU!mx1x{}1w^-; zzw6u~K^}su4Us`^p9uLg+!NH}v~f9mw_|`njPAr2LvQ*R~qnt9}jI1i6e3`I6iNxv* zEA4clUa6E_#JG$mmAY081^_v{gYb1dlOW&i_ar+(kpCXL$c!kNbkSy?@lh@7VwLRp z;)Ufo$-EzFntpmy1N#2A$NpMD^DC(;hO$MpFDjaT7|A&7N$UO=1fzhHO2#oO|G;q` zcS5J}Jk0MNi-FJIP*UlBle68uRIZeSO=viF8tzYDt70-<%2s9rSjRYNM+!ieiRn%f zg$;sqtR>GPp=J&#)MQtN{_5??r)=|bd8rm+%gck0ffLKgHk$|3n){_1yH?(KS291a z))DEXV-23?QvX61lV~)GKxjw&Cc^qy&`kt&21xctJz9H%(FSCHl#_ER0E;10a%ZAdTxUtsQ6YqlDhkgv zYx{?Wrmb0w%Lp2g_EO2u6v9hNcfWsgVe2q5{sQ@)2lW5rJizkbC0ymF0*VmoXDMBW z>z1^bAkthVTVWUWLGBE;ZQhxcg2HLf#wWyv*43r=!reSlxkYK`|kUxw#&SpvYsEE!%iUF_{mDbQ@tX*^S7)1p=x*v&fjs?!}+%E1!;E7sOQW4 zA{BUekfCd}7?B8CvlzGZ*Kfg-E+lDhZ@fsblGvpW5yg$7CuBG|fc;k$cdW@`P zH_H4BSj%_i-uUp29Oke}_Q^AczuYoZQa!u3)W!Z-qT0(M&5;k8JQUKp4tXgw8vrKF zbt{!@cS33j$n-c@kxmVr^NZ~Ig$G2jLL%gu}2Zi#%8+ z^^-XV=1aI)0gkf2RBa+=c<&ds^~|H3r`?2+@T{}InGOQ5=YPx07jEW!&1D-dmUsiZ zk%Wf4wk9nJ!C`;!z^c1cif_>=n#Me#h8?iIn!Xwo?>Evbawq(O6# zpeSA5NJIXi)p5GtQ8UK+wbw|$T)PzMU%?MOuU*CyJI=p@ByCf*@jsore0!5ri3zM! z290gZ!7GdO=) za4cnz>@TVu!{V{pUA@tI%`8+cTh)R&5TjP%Ix2-AZi%WY)HPO?%;U42-fqSCASr#h zz;*j%O7<{N9gz$(a-6gXxA2^_=wXe6Ojh{>0j&GKMZA?F+p{8KFq*|*%-V&N8oqMf z94tE;gQ@SzUAHJ9W{j6&V~ zo(dvm*>4dI{znn9{f~%b{vo1Ic7!bKu;5vAX%tFD3q96GMb6^LVCDEgWX|H6LBM|I z;!p#P0Oy^^U$`#90%Cw*_6r*%B1LezE{--ED{%rl4+{^=4hMqY=i@GkKilSt12{)% z{BU7tRx4RC85$WJ^*A*(btSbG?0EaPAu5STi`t&0SoqV~nbtwyI^+oSmh-vXp(fcag4x1NqQV|ggg z=5en7X(n)?IUFv2aQ|H=EBW7GH)G%x$1G~xR~pzQs6vxT>Ln^n7DnmBQ?O0AW$YvHrqS<|z!KwuK*PjeKs&)9wW8$XG@(3ok+oeXaa5 z4tK!SX9CN4%3x(n3Gj1-`HY)2dkFwRL#^(zImDO49^t9}X^+l*mu{9$@EZuWEoq2F z_N&S>v`yuHRy?vGIH1k2`%eMhL-RUL^6_8JV&kIsVDOWh0-e1giE%MFi+58elOm-d zoc2@Z$z<`sLcpt^)iAK?>*}bezFs1{O9E?7G51#VmGdFr>Q7|k(b*p2=y8l}60JDg z_#uz>j1zs__smWeXZ?z9kwWof#4)p5xL?I(R?fw~go38aoj2;;!W!K~W!@4(FGNVx zN~w@S(k$s@utd6~R6tBkGU-LUX(X-!N(OCVCOL6!y!jkT+NH`L!Ok($M9D!+V5Y>J zf%KAf!~qd+)ab>J*tH}SQWWK0a}09JFtfh@R?muWu!3d2rD*wmvH7-i{jf50HDs`~ zXHYP*GBtMo-#6s{P3S98)%{0X2G*mx7 zlOGA}!c=Y>nxR=NLQFHzwFukx<-UfQT4!PmcUJ}Bb1U;pfN?Y53e-t;=6Nwna-1aU z+_W+Y!zzS0hl0orl8KUK+<1*8I#)DVEpi{p-M<6%kv)L68iWOEQ=+nq6FDL74v%Dq z^7nSrp!W>}dBfv} zZT^v#p<-kI-zhyYN?X#vN{FB0adzvkNhzk-9!SOD9!qL-F-V}w7@_fQBaiVk=kyn~ zU2+0-vmv0m4?p-+S&vucf{_L?GVXISuCoTby}P?WIEU@fscg&$6_@QMgopa!g`!mt z5G%JLI@4@9Ec6j5#v{A{Px>KbhXxpO&Ba#(3ob%@svrEtRii5@+#0RVabLSpHvh@r;`XS(|@0&XG?O#Pn z5HnAKS|{Z&8VhNDO9YnWI9jT<#fEE|Lc_u_4mS!=!gH#g^F2QonUif!>NHZ7^QU1X zZ`F}0t+b{iwKGU=$Ba^nrq<{*NV(9p>++X(aU;}iV-KP%ry3ZTkOo15-9^QDi5PMd z%saa+jA;M|lcVv|(Tah#TlF>uQgWt>oabm|pIDJB95Tz3Sb;JYaR7G=(3gVapVHaa$2<)~KU#vF_UbS|)abG{N z4aiS)y+0)(wyWq@`BDTH;#8Q}UmU~rzV}+NoUk}7XoLkIwU%~npSd z1y5l-$Tkbx#JLPGG|4+M%y-$(Q)Pbl$vIg__C}_fosugR2?`bv|9wysp}gv#-6)zt@Mh zyCLe)y<}y-=gu^Kb%R6E%BqJ3Z362?!y5i&EKPfZASe_ZIh+3cfY1QCz`bySkTkdE zBG+=zW&9nD-FovD?MkxImXFj(P?e|L28LCanJ0xMglx{DY>W8eKg2$MZ20_m)EyNu z(gV=Ya4T*kM`P-h5}<9n`D3hGUb_01_IW%7{R2->3YPJ`4P7LzCsuqulVWAMzcdp` z9fDY&3&N$Qhe$DE4FyI?nKrh^^PHHdQuua>qQ~Px4sFV=jm{$&VDVlgB8d0iQb`Y%Vy?^MfF>_#aW^e#4d*H5?>g7Sg z+mA zM`m=17QHDlB|nfTmRrwZI8LYOh?8^(?|EnkyOSnJdh=Sk#?rURsZE>wl9y)Y-CIU` zDA=5E)ES1HB-i@&G10BF|M@(_VxRwpH)&k`>o54S(&ba|9J+M1p^jZEY5kKXtr=e&rpAx$8@lQjGqkK<;@Qfm4J^&m(io${BHg{sV2 zM(MOoz&~kJHei<>TV*CUGgXZ~D9a-(qE@^~&^$MHjuIA+&E}+^Oeb&r4i{0vB4E|j zE<<4L)Tof?tn&ibRp6+w)Y+{d`eh{LZ+aUk_?gDM$5miY32Rv%r~%4qBb#X*;BVk$ zy%wj&M`?(e2R5M+2^8uj?CV>Fyj3sspN5k|`X;)Zqs*`$oN5EQIQxyW`rF||U)@LK zskIvOSyykappg$-wy#*qlos~MXpMX-0Z%{HxlDPSa4ssNVo~tknh@w;r`jPFQ+UPqtKD&7 zF7-1t>wv4ywSDa(e@eiZCBrn7n1w$^``1GJ$hwQm0{i2KGuDqE^#5le{x2AzvZzXr0M3aqV|nhJ}P-;hAlyB8j`jGYx0*ylU-;8oi8@? zZ&lj#Dk$W1P#pqWR}>Q(`ma#3fbd19Z7(d_B;QZ-?(41Z(rmuzHFKTqrk}fZ+e`i< zY0#H_vhR#`a=2+zXJqPebF+5}I|9cxUXu=x1gE8GJ5bS@VQ$x8h{#Q9*W{WdfMYjs z2~v-1t#tx#cXe@Wn)Um@hn-r@7pEHg43Rs^+w8Viz)v!X0;d!cVcwrYlr`5 zSG*M8MJ{syZw*Yu35G}rtL ztW?kBjI318>4(IMBb#MdudX*8cO09F^!^=DK`u+fdn*Sii zuXxY+%;P;GQbFs41;^@!YvVOAi-D{=^{+S~%N|0THZSnN83r4JtNVwc!tC`O*Lo*W zi*YQ!hLkd$UR)g)sp70=&uG)&;SD(M?@V-$&D~Ik*?p_3Z*Jx{5vvgo_hEh&5knp* z1vC@kfwss{+&D*Yc|M=xf(es(b{_dI_>qc2E+nnV%L;f3KSzngfD9bLQMQFYt!GJT z-zh{mg>>tW?PEuO0$~k*OPrwEDXX4)%E~pI0t%+m=FYgx5j5pNIxSr7^D7?+ViHMW52*=gPi=3~!*D1~bg$He0&dUF1OCog z86Ldi8GNg7@Ic_qh3jX~N4i_72H z+QS#p$PvN3X4&8r5v=a+^V|2Zqv;;-rWMs{CD7nu#w+-tUZYD8?=|g{y`l9JU4IER zI zkcURSY&51UrIJ_9_lP9+@a#JeUW!9;U;JblPyVf&T+=mX?$GK=AjjUSP z(Z;)d&Eyjr&YieM2#%5rv$9KAA%O09w^LBcFOft+86uUFEe%3f8O#MuDs;$~tm9#A z!El}BN>f??MTcN&Zd%-FA@%I zzp;e4`MKLA^Nvv6q5Ka<+Jnl>Z;*)1?2?|9lfkG3>f}YGrfaRQawCS_gPbMd3}qdS z`3_!X^7c$iyf!N44wGCZ9Jm?J>3JNN9{{r~2DKaw5nlUnm^6+H-NJiKl}yKr7Sf>( zbtsRxA}K8R6UzxTIyE>MtyUY84sOI751n8pugH>>Tj)kjhsrK*g8C*2Wa(e64eJ#v zRAbGlA$+H>YBDg#Y?#jOUYv-<%ElgVkAX`2Q$P6GY~7}NR+b>D`ZHN z(-1Rq#Z5dfWQ|MAY{psSGT^r37ifJBhL*OkZdJtN;!Y_d?Mo`QTktio|IRrr2oB0> z;Am~Mwbnteki~Y5TsqyZswxiv8S62S`{>Rr%^~jS0V*#aO^4)%+*zC+X-==Jh#72M zB#?ZrCkyPw&<6e@3#!8FQ@0+suswVC%)Y&d&$Pf^y%hHG^{f;9A>sz18!hZcgNfKD z6UV8pM>{?E2ylzp`e2f$an>p%4HfY-ezNM|ofM8}AqTbXC0u^a!c0gTIOyc>rWPe1W zVM1gy%4l_9^jcKN5(tZOb#XJI-=$FoEUMhLfI)Orobpc6WUMHE>;;n;!yug(yF(fy z(iDYUlH)0nt~|9Soe0Ay^}(oFC)lhF({?^g#S~{c#aD+2q*bZexP})zOY)Nms}IK! zia%ARA>BIxVzL+c?`){-r0@@4&y(}4!j)KK%33u}7@^4Glp=q`vAb&&zVQe4UK~y7 z-&pDXkDTZe27P)DHGa6UWn0;TiBEqwBW~N0EUrv4I}o+D4hU7|*8!37@yHWkC+wWc z^XLxRP4h8Iqi0<9vQ(q-nndkm-kBaSGc>+?u1R&y;tzmrb&ODCiP4&9XG4KSQiVp-5_G znZyh!(NYzrO)$~qJ9RmTnae9m&GGrnXMZQ==E;6KZDu`yJb3pye<9din$z>rb0p2@ zPu7YmEr#gwIG7=uA6&rG%3)tGhbZCQkOIWr3}qp(6FH4L6gLAt5;@6qDKGs=B2<<` z0C<$Ld(qdz9uRrSLGo7pM`-AC4f`(gP%_HW*>Y3>_>uv!`iUqe9lb!NJ7paPhLJ5t zvJZ1-H1-KKch%bAi9791a{JygN4V~Ij(s-|nC9_~;N%vVtWK4Ku@2Dy9g6V-PbGSu zArp^;@1QZi|qEQ>7QC{(Q4_xC4&i_Z*ImYM`MQgfk+kM)$ZQJJ8wr$(C zjnj6Ywr$(C`<&@}?<6yKCYfZCN>z4JKdaW-Ypr)bZ~8>JB2oSb{)3iH%B+&95Ay6p z`dyF@`t9WEU7`=Fz(m_!w2ubVd!FJ^xN*dnpxiskuy?@HiF(d~-bR8PYQ};{=4<>oJX1fTzKeZbbAH%rkJNdWAbhad=@d zC?#MK2hXCwgzjlq)QdCd`3Y@qaqOEDRMF?RxLTC)ZkYb*Mi0MZ9pDX~?q7lPck;|L zp%=}yU@EmkL{{K>6}kjUy_DMXBW3Ba=^+x}wtLQ_)CJdjwKCct+JYm)Xz zCfugIrrZA-ccEqhAncF^-*sDxt>7{yDO<#OnXQaH07}b54ox1*;U=h7!n26GoW2+0 z&9FqcIys`XnmFiG!s`YOx1rY!<>h0jwRxR0xuOioC4#=13eJ_c219Fs%Hl==zp%rq zjT7$R#_6gCKns*=7NikX#0@rBaj91z)Tp|T(piBQT@b7l$q&(7kbX4z!1OA<4%u6w zw^oygg>}Xg6p2uw(JcogC^D)mN05pi%JEUux@>+)NfZwhMw%Cqq5jvP5D&^N>iPj+L@hrX3{g7;MX@}VpPwa+9yO8p)TGf>XX8}3u^&~Qf*;4jXo^| zbJj@nMC50Gzt9JMf5ZOw@?&pK^-=hzpSb=*%x3!kC_iLOJ^!l$$yHmm`;QTXb$w5? z)*>jDuzg*|4xW`oprQ1c@3m|W_$b09oAS;(m^PRsl#-a>FCoDnBqngA|6b^&(aDtA;%gZ8(%6?Ml2L5-zI^Twk;tFe{*Gsa4XpdZ|^a?*&Nv zH%UOQMe3#=jvFN9tHl}(;;W^FN#E{s{9c%PxF?KC5#CkUqP~Lws$6+&#nXFF`vs%esmqkiN`j@!x zBYvMPo;PQ_X}-oVJ&K}V=N3r>&MQ+wZOZ8)C1EY3d-Ju8WbN>+^M0==3I=hLW)a}V zFU!rk$E7wUoIhtK#!jSY*;JG%WlyO0>aB&yekB*?-5AiyVdWUAxZvMUUX0k_Oh{&d zZ{o3dyQQyRd#(N!9Q2cy%uc1rkY6|J*7bne{FfhH$l_QomQJFbiDl2ZAiOi&(U?hb z3lHj40U;|Ew=hum<~HU#e~!jZ7oExSC%@00*IJL8vO#2k_mie$9~-6_ebPb-&j^pn0c{ixFMR{LBWBP8o&r8+z!Ltc4Q>)% zRxmg$CTLAysv(eeQU%DA=^N3<9k%Tpe-Qqp9E< z?FVo9%`JbyF(>)uR)%R#w8)6>H`V9!m!pqD#jL@ZvXmY3u|P8R6?V_Dg^~DfL4pM^ zg2gwp7};IDhdQL82pcJ_YykfZDK4^%w8W@ANDLoc==+xByz|d`bk;}w@(5uo)6ak{CQmHw^%z}0aWEm`5>njD}Y+7Tn3o$x~ueUaEE#^ z23*kvb)C&FMjLLS-+O1EU5{3@Vfm7N6D*=Q+T9chIT5Ct}*Da%2@7lmA$?)%1 z)=`i&xY3Fh9r>UgtTXe!GLcc79@vwGcOv`Mzp&ER& zvBwzZ$PlXsM|zz&cG&mhuC4FBI=+s4^@wj3oxf7gUsyWYlCJ9_N868Z!erHJH-=cB z%wFv}XpOOCL2_|=W~`W+*rSR#hCj}nI*+8hh!B)o-!K;-GAz@r?1&5cgUZuCgda_d zvb}P+s#+V=iStGGtYIOw+Y$-e@o)5H6%kB!h1XwDhR{cwiQ}09)h_bP;R9+31Nw#s z(f}DQu6=qRA9Pt6W^1mZl9Jh3OND=Sx;VIkAMY)0VKN=ZvonaSlV!y{S`< z#z7|mLFHSnPYKoe+VL(MMpVt_yj{~=C{q@l;;N+f8Duw+LPjKSU$5^q4UUvHD5|bG zlel&K)Q&9P#4dS>#CL8{Oo$}o2PsoFGoL2wE3$_t)X`>8aESK>D_B5Ti`)$A10z&N zG=vKENGk3DGst{GHh{lXs;6B{8s6aoKudPXkJK+ZfOl#0>73J`#5{Y#22DzIax~5% zAHg=3MFl{7`(P+-NWAOfJ8uEpY8|&ocAy*8Huz>qwO+TS%XH z{@r9%v~nvwl3E3d(j`^UMrsc*UOV>cQdmu)9&1CB_K#&dJ@N|1xc%%&o?Nj5AN~(2 z>;)3FY~IfgXmhlz^Ta1hOmlP1Qn@d&FDi{&nak};R zHRFEs_4Rm66VTO8D1pY}SdzeA(7%)ztFp7eL{o6Bxr`6oK#Zikp|?<2So*xwl7*O{o@-70Y18B7 zB`u|YDjL_n%F?i}h;pQ>Qzr(q)W}o6<$Q5$P8J!^`Gjoay{+O6Go>9h_N@Awq`fa! z0%ybHa{7E=#arT0b57$47*wt7r1+cBtH)bwXR4aP;I>vADFV5sC<;i*078ZzPWD9o zkp2pWXFe`hTg%*3ricyt{Ve!Q| z>K52BO6FGOq+*A?*M%*8&&Ool>aDje8~DG{N7d zizh7L-sDh)1m{vdpu};<>#=KrGO-__kgqu(@i%Z|G6<2iX8#H*us_1%Fi6a`w9O5S zUO6!Dgd7ZENepEK*vUE$Sw7*gV6iJ_6v|?soR9V3T|=}aT%hmWwK#5o(NHzAeshSs zZu$K3t0aguqF_3nv~*D#!LB6|5jOV!KhBg;=UDhx^8o=N#{&To{=X8%e$?FEPA3vIyAikJjos;+ET;F4ey|LYlum9LoD`4aawN91!?j9ZJxoU!RTw z`{5lmdULr(sJuE}_{s3^75hE>Rv<`3)P7jymrh1>e75&_XnUwo;HM?LkEA&+=6}!d z$szo6xUu_qh?wRxAVG4J{N*u0l7BK_&iPm)!9RL?O7{-(>Nii}bR?tCtAE1o-+V;F zkHcUPn_NG>O7|WXPd?5;_nsDCHr7V>9v5FW;okAU=htmNF5ozw@B0Ayjw#@f8!QDH^~NL3|yb7WbyZ(?PLlL z)2lgLk>TQLtg2?kNC7cIj=jC z`C_tni`*|r^CUiPh4_`p;!?w3wQUlYhw~pr>d}C9zxb8e;^$Y3N&>prY{b1$!FXaCTOspUF9w*v0)Sj>wBz$2s~E$tAM z!Ls8EYc&4;E2A$ya?1gQ;K5m5?qn3LZtT%Q#nWujXT!xdjBJEuO@)>&UuWt`N+jFV zvWd<%F5WM$G+k;#S0?+k__Fz(w-7u{-7pf6)|x=k7!eIaS34%bF-bvJyC%_Q75&~Y zR7`jL$}B^3Kd*1grEM|U{tlDhs;o1-uJYcnfl{4`XZ@x$5x@A>kVbfkRlew1n*U@W zosee&W%{*dIL=w-!Bwo=A0JSvroACPVx6oIGgsB_#WHIMD?t5*yjQpURk826`cOPm zy!`kH=f}#pjO)2Y9=~!`44XMlzcj*JQ@dr4E71DcjK7gdkT^PQ{@!d4%t(Ol5wPFV zbada>hqH){U{OI#Um3-&T|55$o>v!Z74J0sg zdIg@-Ik(`qSIp27O?z!jh@Y&$Oq}ka^f1VIEujrWw;e0@LebZy=z-W8>y@!6bjy{fsZeI z(ujAtt7DKa=t?cHk*=wF5(gI(-0hc+q7JTw;=5pRL5ZhY;6;>a;KYTXr;1*%RT7dO zd4+^hftg4_VTl#MR!hZML{PCCgt5G)vZkc7PD*iWYoja-|1oQOqhoUt^jS{LwFSH- z)iteEA%Ux_#s?Mgj85O@qdTZ0)L9y=G!4U!ep8#htjccc06v>ZQ%Xgophg^CKuysY zP*7M^<7HYl?^&l3+?*N|M#Qj5&YS0gJJ(ARxWUZ z92^QT!e&VSIN`yZp)bCF5=957vdRX5Z!uj4;N*D5Ii5x*Zl(1JrfCF=A|x%Fw&0Fd zSQZc93PtPNUY48A2%`41)=BVju^qSUfZcx3j zgW+6OwLzTNVY0T<-3+_RJziv4(+JZ*q?S!$TVgJCY{U?0f}W#$?pPxlE9Y5@NZHRZX;%ARX# zPOejmnU+!0*N9Gp41-2Lz#0yRpT0o~=CR*r6kBM$BSr_$VqXq~{TM#0xJZEmYKl60 z=@}Foc8#(8O{@iMfKgFTPlE^so811)+;ULJ%#Z=Hg=9gCxg;B%Ez@(?OqB!i?_S@ZMKkma&OkNyL>B`umKKN;B10Sh37Ff12%#<5oBHLlRp$cwx z7U@Q2>yk|T1I$Y*YkZ&+GkvC)&zs;bwe8SBoBIVqexi(T(bv48!6SQUu%f%Es)nkm zwX6xA!D4NFnI-5koIVJkX)In7!{wV}0;755g7x$1US z$z6=&Y0JLLnn@p2!CfnRK@lS1PF#q%4wH(IPjFMD)=tqZhr|JCIo^_Fw?#=onKyhd z3+uGiB&}N#WZ-QB^YA}2*&6Ff>0-O95D#dGRDQP87^z*@MpNM#nASSl((K+uZ<(^B z4Q0tN*p%6lp5pqAUqu5}RNzK4)F!+vLG7UgzN3-E-?g!z4gMS%8WVJO47`nRW%()8 zwIk1+7avr=+)#C2`9dGf5Fa|_&!1F_rm0uUlX(#%zwz(&)N)DiF!1=Icl`IiT+hca zq`cRFRw%Tk6^^c4Rqy#QcRf?IaRG6aj)h%g_J!2A?L%8Q9m&Qj3|u*iLx;AD#@JXO zCfIZF86Yrre+g5q4L=L@mYz^1!ZnP?;c2<~3hxWti>!-@%PQbD6fBpjR#sEo5;us& z`L7u>9Acm{c2Lkeb91>@7M-`DGQb#=b04@D4Glhv!gKK$|^Z+=Od^US4YFg53 z;T=S7+I(iKLl$P3``qbz+ zR$IN4qAd}_z@k%gY+r+;Ay+YpyGI3cO?)v8b3EPIY!DMT6C7M=rAjI*s=d(Y=rw0^ zElehsZC+D1C(@s#@Z-77dva;m|{9F-q_?DMhg%Go!F@3htBfK<>b2S-z~tOC~F z#;U@^O^hXVuvQX8pJgrZzff*vXXw(OWksCY_F{M#fXrYO2{%tLe6;zZ_PUY|pX6e9 z;^&c`Ao9`Hn@(rH>(e|Rx;3OnQ;OOD)-8y z&A}izb}+-}C3<(aLL8T1kA7UHuB;|kblT9;hB0Hya4_3Qv4)$eplsLlwSAU9B#b(f zS;DL_^`nK2HUPsL?CB`qa93L|h2v=@n)(@~SzRG5?ClW*K2$7db47J-rtla~ag5lv zO}Nafq)A~tuN3E&1zW42IT3tZsQn+gRsV@u+~)}Gb5+ze*G#nYa^MEuY3ii~ad;8( zO_vn*Zo;du#plH&&V-e2T~nVSg8TRg{C=`U`(VvU)kPFg^!Zbaf3$+|AvwqWcuPf9 z1MdLDbvE*)MYXEF^czq+rxW2VGK!gm+9+?myBV>Yi_LYF3LzXXMSz$+l&UDnUOW*d zk#%!fjU#MEM+3p9$QDFvUGTO~YK{ZPC;_r}MiUc4B;~nG^$*?hBA%Hzoq!qTLl1Y%0g4ObB+PNp5{s4b(Odp(5*ozE-5Y0;k*+U zJGc}Mz~&Zk3=VFg)2XU093|>p7qmK-3Mjsdyhww%yQBL@<}&VO!nP_Z)xL;y*Ul21 zmhpIKny%4!YMR?0vcKzv|I7=W>!^%w0iJJYn@HL2D=tvxvCbH=?MBqIXR?5ynu~?{ zt-lzCs%^MDH$9xD)sW!+!+&A{ryGju8pfkF{SFg!gm^Q`!H_xLiQN2u>1+{LMXIN! z&&HA~aAac@x%YS&p)Y=46q5QZ#=%~|LGJwcvo?sXrYsMR&*QfTjkv?uYQy;{jz%un z3FfCQL$G@Tg70`hYNu8j@IUmMxP{LaV*JgC{|##0CB09i5E`DXH2~hzO07F08Uv4C zew002021ayE|vln59@(iikRt8mC=VeLgM5xEhHrw`}^Cdx-K z6cT1-EL4)mB~;m(KcbDB6XhUS{J*d63f7`!7THxpXn z?I$OqM#wG39fw61XmWgu6V=<%_y$sX&LUj8a2E$n+i%65E;&ATL@~2UGx(#V6X-hU#_ktlpm2@!edJUR3(PUq5+BS{Hnwfyfb*DJGw8(q* ztq;j*2_7zmnYLjUrooZad3Rf;>kH34s!k4_pKY{#^lo3x*`7`4d_d2O z_cbD?&`Bu=H4j-&BMg1olT}Rm4toKquU98smMF`sCrFGc=Q74Fvdt{mDcbqf?-mL& z2R~`=jg`E_O`G*!?+~rtZJ~W~-YW}vO)aOxm;F@DySnWkmUyjQuFvC)1`e3N;HpdN z8mYkIr5>tkdn$TNtQoBRhoGxP##&#ZUaCra%&hCJ>z#gP0z>xxWnfYE7WNw(I&ifH zqp!l8BOx@W?5s;{qSKvyJ&kVGN!iw*o0ox#1;l!Kf_U`npEojCbv)Asa$@nYxUV)_!xdb8Rd^XQ1S1Wclx$^ogg{-1S?&8KGz~^f2UjG zv@{b5u#r>h;ux@FNfv2x03>DYDWx4r=ZPx%BSfI*xK&m(3zzQ?w7I?s@M_OMIXkN9 z`f2()8axw~R2ntEV8oPMMirA^atHC(Ly^|Q%Q2j3>!4n+Hr-M*d#n}*^=z(5?js7Y zCv@GS7OJh@C1E`w*?zr8ZONm9Mv=Waq??sX1VmKg9RYDE&JB&3U71JW(EH-X=@k+U z+CmIgjqX-Jp`%m-HYclv`k}da1MZN^#E`-UjmeBV=+y5HZ5kF=_%YyHU!bcS6k2A{ zf?H2}4CnBm__?E8Cp>bC93(Z|8>W0ym(_eKS<0@X_K+&nVa)$@y14+xzpGz3hO}H) zrj4}VKw9?4K6VEuDtqwFt^XPJKbSV6w^fo%l2^w7SMOWaj@pD4dLtN1zZ%gbq(JJK3G2$W; z8eLV|Xe|)7N%C4<>tD=BUv9u`w@0bZsrV55Lh9(h3seW>)R&0$i+k&UIcZ10e;-8O z`MBuBha;Zg{y>qvf_4VeiZ$I!-CfhSfuqIF`c#Ikbh_zwjJ?|21NXU0x7kov63%nS zTrRk}stUWYy=Z%g+T&wepGoU*=BGDl0~V8Qp%t1-Uz?xxy`tzI8=AfBd*bQ-lK-`f zo_)U$eOp-hJRp*Hn5fSkx>G~=)*Gp`RxBGPxM$JPC8=w9_Ve=BQCMEI@eK%Qe~vZ+ zUQtsmWWjPX#N=RZ&7dw@{}9Xocy;oRtw077nJ_@Rd^hITBF=|zd@%a9|7v_j<_(1N zB`pz~ZGNWZ!zD)TaD*u2-i+jj@u3-QpyQA`(d4$^6eqO4%8IKru6{qVBXIWLN zuvotN0e6zB^5g?n?6#>f`fcvkc^MA?nQnYu|G<;Uw~p2sqSa9!*qA##f9&`S`r%8i zz&?d;*(sG@ldpLdu7UlL9uLZF)i1%^{4n;7tYuhE*Yf&#tZMYtT;(M*OnlHd>PSdF zORs2Gvsx6W9J5!1*zW-yM%ILl&u`PW)}&b_t{5hgymAf4#wJ#2GMF~YqvmUUXzLi1 z=Oe(Xb=yVrGU?Av-GrJW<`P<1X>h8T{z}eOL%7`mYF!(vPT9Ht3TC?I+n|({Gz}+0 zRJvfpNA#CBnwG#D!e#CWgPO zqAsN4M7j9Zns@F{D)O-gjIGa~Rmt;w_U#L4{AQga)Ab90nYs+}2ZCaWYO7g}%@Eoo-Db&>zoi|LtDn>CiD1T$^$H+z}IJ^DV6?y^P3|C8_pjffD@5Mqa z39Rrv*R|0Iy}DnU33@6LIDBEg>GLx+t%+(4(6+oCp$ZFzn{Mqur5StG8lU7%cUWiE z?`+w3x&;<-w_}Ev(1A%@00gtk%5Fyk-c}1P`UNWN$Qzp5fxqJ1RG6R~e)xM#1Ty(T zuc&9hFMIG*77kWpMle~IdV?-vjwG-9R_)U`6O$!$x;fRhZ`%n?*=Rx%Ry zIvfX6b_;{eb?)+Jb6l|+{_B=-Tzku|{Id236hb(DID)Uv^D9^$)!JIxr)U~3W>(_DM2l-xkHMd#rMPfbkudrmu)kqFcQR#=!wSZVhDc6Bl`S{Cr! zdFDW#yJLUGo9!{m+-VO}7i$P>;lSml$t>JJaW_c!cP1GoV05hNvST$VbA9fJ&IR~C zP6vj;;mw9Td8};*rJ0;Sd#A*Pt zn9wur*d$$W(i{^F42Hj0_C~rjXCkEIWV)#Q%3xkZ(y6v%kgN@k6n{@UM%J_Q=*BtO zB$}$V#C~ZBiHW5nn8(dQU3RUzF5eIw|Jb+=CxL4U6W67^!5vE~s^m_tV>3yiu#DB_ zZ^-A^ba8SpsK%mBoQR9G|1F_}1?Y-fwiPuM-NGLLFRk|&qEYt_Zslh0?RiH2kpo^8 zeG(bd9rHgx;->5MYRoK#mqkCr2M>YhOrA1bOCK3KLK7@is>r zQiPduhGO3syEnau4~!M;p!A5}MTCcVg4WXZ&KC4i0C(a0x zOEtj+3+4^NRel@V8M~*QgW)|!2%<(MSqagq!Znl9A={>KOZ`}=LEedzgUhx*=MHIr zxLP_cLnd;OvQ4x*a>ZJA^oTDG((G{ijm;1;kCpc9=D0F`&Do};)rc=q7Lvk~Hfl6K z$IV6^Osrl3unH$t)-)N_9vYAYR~>Y;P2d~#s8T9FL*Q3YbyWf6b8Y$g8e1dp32^?@ zz6~tFEZp`7XZ>M@SRS`A>rDV@Q*Chy%s855NXqHh?3`Q%yuy6c=;$t}^+@X~*ba70 z=a?f!vnF9Rl0+qLSTZGd%sHehgo?^4)5Su;N*uyF2Oi;U?7BXM)WJF)w8BrPm=zr^|6I85tY-wFxfi&QKS`}0Zyk50QVzvd(an1p0W ziO7lQhE0whbDUoC9I2-^;n+pGZ@&UM<~3*tyW@uUZx2*EU)+B6deuAW<>0jM zEl|D<_^ea)NQEZkAxn5T0C8ja5nfq<2~g~qmAM6c+=xk|F6U^JGDP6;+LnhFp+;_0 zB>ALpVyyt%`NFk(!L{4_le7of-`<(D1LlG@u`*v1{OhfdAU++zG(}je&S86tU3v1w zJF9R*W_k$9Ql>|Ia%F8l+O;}tjfFNV=;S@&L$dZA19J!5FO5#km|Ah3?$eziL3 zp!mf!$k|A65S(kv8XWKu0DbbpnY$^i&n6lT~h`C&aQd zT_f!o)IG?fnsKV2=pAl8pdm_E2MoflNe^x)YQshA_92!2p__5^Rv?p`-kq32sb%f9 zeQiM4kVh^5!Jr*M2fWE!^k^{J-V-=Qh}Y~WV0T~DvNCg_B7OzNt&bNc*p<#(CEOJW z?Rg7rK}JgnA;TB&PvPUnA zA;c*rge8$ladRcciRJO!()uw1Tnd<;VFvygY4}A{)x&-hlPrkyOUr)F0&lY4ovZ7({y{5?TT{swJdCHADP3U`ElRzNInLrwtIgv zopyD+hjX>{P1AAuM8K$b(Ij^xP4?|!8qvL|>>D9{L3>5&7jn__>G>zWlW^$hAf8>$|{1kD0?>UX$(z=EK{kPGIu@~pFJ$S0sQUJ%9%QYZhc04 zHbN*uqffuGxLg$DM>KJ+PJ69KEcgm&4)6Plk7PN6o|j|@yf#3Vd%{8M*D=QRrEG z&&(KG+@pE{a;6oCZ5jzXj3{ZW4>}}vR%qn*Jv@AXvcS{^b}!P$lHyQSJQMgy(gzMF z@yNxeR7MquFDJ#(fD@wkZ5N zwt)z$SW&fAxnNepGzVE%zW*gZX~Esr1F02p6lu~M$FIV*BG(-u-#C$bgwH6r^k_FwZjfSKTi)qyG#?`RP8RL+ z2_ppf<2$I*OW2vfTcKQdWg8LeU{{bQ^%W)QX=9c^wpqSr7sO%0BG>9o(z+ANf^ly5K!5omj>VZqi&{l10gBE^4cyG#T zy;E_Qai`i4a^8V$<(IiIC|QVK__OD4)|6ae{ELMbOOVd&48fIo4K5Lr}9cqBTKNP@GW=^wX+HkRVJ-EVywuX2(zgIB(NAFGk zjgi~yPm8WyZkVzs9V7kM8@<~@#ojimS1BKzn9BETyPUUJcpgt|3{^ybOjv6d04Y(JII9#efAB-LIxt`?b$Nf)BgIeTN0}d|9=LYsbW^-W z%pR#7w0Db-j9;4Ad-hy0_!oxQ0c%Zt#?4hOxk^IIQ{5-$C?Awpss@B2G%27pIS#Q3 z278c2q>)7Q=MjbaP!H!8*yvI1|25gazA)+phNh=DFC2e!NAU%$Sj+c>?ndy4N0Z0l zq`AZ(d~8TPKPOxmMBwI38+@{#9E*%Acy&oUJalWdNnivu5&osz+sNdceQmQTL?zP;M>{z#MchfB24A(GBZ1baW~h;Vri!J^McJ3Lk?QsgI*PiKgLf6!7Q z$`3~3W1tuAk~x++fO&63iIBe9M*kgPhvqXNS#C8?>=y~T>rjQpaad#4Z#;|H_UpL+ z{t3^t1#8M84ytmg_JEzy3@0wDE!sdRL_N~S5t7yvzC2iBNdIXr)uCJVZ*t0h7P)&= zK`jckVpxv{=P@T^U_EjTYF(|%v7@F0g~Q)) zq^x0&oDjY}_!bo1IDg*2cY`^}HDzgDxxUT>J0Q6m6nCB=su_pcg3HDn=WE2q9F}Xb z4Ht>Bk8Y)7Q1=9&Tzo(f55fjj7aO+;+6`y33 zU7|le=@4VD77;%A%t!ea&0j#B{}@>H{6w9PM&DBB6f7fuyw)fF7$Lqvs*U+8=YHk1 zjx(I$y_3nF)}M_&U|kEnw>(%6d$9=qCPJgQQ3|_b&)ItIPc8^1dkh+3(mVZ~DSeFz z*=IKXBoaQIQJV0GS3WO1GQ2+Ocz_pP3S~I~EA%(`UtblSEXJqvlTHiZ@;wB~?# zRU$EF1~>Iy`#1Ny6FtS9nxeo5nLlApS1((6b~0hr4C-&E7;(HI#IkTlUF;OXcix3w}-rJ%6@c@#roUh zquI4emlQ9PCK`(?JGDC1zHQ>GbUZmn!F$%43GJE*Zk&o-d94kviFx)pkJ_LzE8s6p zXEOAnX=Ynz$-Hvqq_^4(;MCRRGR_A$pY)I;Pfv@YNqmh0Y5Z8;t4_uTV3B2TTN**u zI1l;qk-ITC+y;Z($ESK;ga|sz?uJCBGt8#wAWH@?xJt)x^~8g5{(=qWuL=v(DOi#O``e6PetCK-fZ zUkf+oe6=piJHk6QO>3bZ5q=2XpEzzjqe3cAh1J`RpAF(m`~&TTA^=}$-{#qh`WFtI zl5dt0lTYf?O%|BqLK-fid!W507yO3FBd+`IYNv0Y*$E5Bj3%=?8X3r_ z>Xxe{^-hesxh-Rlw|aMi3{-WKgQrSsf=2L^4HFcanH(5!k2C7xai)GI2&Sst9vs`NJa zknjR#e?i80w@U*@k{vAylow6R&xvVJq8|ql4wWY%J?vRii0f8 zLZ|h`8qj-KlD7AfuEGZY(F0?KL2*W-2=xj5+A~CQpoGc* z1wjA>4i63>5$uCQav+UJmuh;l$%_97{jkt3i7!3=;N+IeM-mznA`*^sfbO6SO0X6Q z(ZwY`(&k6)2*DFKLnAsYrt~x?CF29~2$q@D7^s6B8{51tdCsPdv+Wsl^4?7mfP1z;PwV2lMl&WLzkQ_LZ)=c_fUkM zCCjj%HDNqyL4MRg`c911+ZO>PZHxcN&Lssm;>JE18cGl-ROgB!UbvajxhG1 zmtcxH=0q^|;G1v^l5kw~k40+-&A!7#>q^(Yf-xX1+>spE)2}05o3o4KgR*=#?EBj7 zqHuTqKC?vPO*RO42LXX3e|V|eBF!|C^~()IW!Q z*=y@@xluDO!d{A_u-ofo%V1;FYf7 z^gk7U33t9Fzp;3b61Wc$Qc^fKp3(gcN)hLJ>UdN1Ioi3R9fX>xc;~fZJdO!XIgaTI zC&9cKC2D{F&nv$@uZ=6@^4KKW&aDp2JNMUSkq!~l_u@%k;xn6;2e<3r`Z4bu+LGQP zq7lrLFqZTQxHxWqe`@~dea&?@oo0a8zlt6Jc=Q z7*5Q;UawFdG!8O?e12@1!Z(C(5XUOF!+eSWW3Mftyl4sGuBeSigvgF^+4Wl)p^iQh z4Y7oq$E>zqRhMg={kN*78vo8P!d}S#n(f!4`A@B$9^TToeOdX1FYG@^ylwaIzUMC4 z9`_bAYXn!Xo?Qm&(`@ewqZc#ZDoLpsIe5a-#Zfos40Klvh{mgMs|sz^{j!rV_4lMB zE0eb_f<1 zXp5^O#)a6EVmXNUWxPB|>2rEcIx$ETN@Z?V zh9^9MW)2&=K;?4E_4-u4e~4ix^9VYeAHvt{G`DL_C=qZ*vrSjz6ydzNCM*T;sU}q0 z79!WRKq^yfpA2EiOw1vi|I8rR6NA2`%~p`cHz1=`7MTE8-ec)lw<-$pis^%t^lG?{ z_5V;T{-RPOC#l;Q71M3`lzhZ5|2vm^eS35^tFqW^F;@zDL`!qpUWt0ga%5d|IhW|GXK50eNDPsR zKDjT{I%q#_W_;DwRl9 zj+0yQ?J*)BKm7Au=YB%+EGo04I9xe;1*Sy9U2GVUhJs9TLd}X{k121gv-zWm06nbLkBg<>}_23+O5{EGcb7+SU6C8FW zAaIRi7KNrG43?peEV*V|!fGS7MI+l=-zJr=%$}VHiJa&Up*IQqk%kDVjq8Ga|Jn{_ zJn~4|PLKCq<`bT~yh_MhYH^JllLS0GKT{pA${LbRD4< zogOE$l1ET-ZWNg|l+4@Y-?bzxS~UsRkCGOVu6KPHtW|0@Tf zA>Vr$^(_cBzDN7D9fErY`ecIfHwByECF^{DG3*}e>E$rtW^`Z`B*WZ3FIoCoiRh|D z$@RUTdqrO8pSE_d!;c#n|KCg~%=)fv)P2ppmUc#(hUV0~tUNFDn`#H0Jgb`gyi`sc zF&5>;y3u1pD{UIS>3P1{kYy|TR_oaEhIw94ll;=&5ogvpkDYZaytNtP0==}WdW`Dzg1uAu!=(N_JZMP%`k8II>=>Vq>+y%3zfJ9^#p0r=)*Ghjqjw z`yr+ck0F62=chJ-P_;_P%1(DWHe_ov!J!JTpo#Na;}0V)4et1M!cvZ#3*?bsKx59$ z1_b^??nl1(vB_}8JX3NHB=2wp7h8|Su6_EV?mY`+N=eDh4AVTuRIi-OQfNe#a58nn zz%=FQpI0(|CK|dRxiIp9D}9EBAM(z)$2P_FFV#J?FJzM`(l4CMlwt-w5T<5Rwhbc? z?J%9FxjT;8q-I*99`o=4(ipu*{(bJ%IhiKM|92eA-Rrd7Z)Zvt-R5fiNE1+k>97&W z+Uwx@5dC>xD%?xr@2R%3&t4q@h;#(Wd1ZSZ@>^aVIu$4@fm4Bvf}6#IF^V~;l|9xh zFcj>@$8==6I^6y3Oc!U+^}xLh4Yw-?NJ{5HJ{Tlwm3g5Q`g=%l5xqrI4NFLlh*FOc zbW^`?hG;|{s%5l*cnbKFDcc&!>DPq$%%VcMeI-IN-OIXhC4oAnnq`atb+c!&E8r_o;!g>~l5AjK$`OU~ zISn+~o!QEAt$l}1dRS|N*obtXlv3JjKIUZ@pGAlQRY_$`D7FIXpp0gX`i#a0 zOY5no9+h`FRPm2<7Vnq?aiJ^8ZBa0zs<7bxm6Lk}PJC1qUwwKf9m?i#f#ZSJjrJ?j z=U@r1H4*pS*>MVfiUfAfe8P2-FvwT zp%nQEK~ETQ!TyXPkpRLOPKqVG+l)R9rXlyl5$4DMTL9Wn-1yP1QbtH4q zBFPg*j>CMx$C;gu?R1XXnV^>CR3)_o2$?wg45cZfjuCS)_5|f4wIc>0i|nbOBgqd? zS5SOH{n6t|-D6Q#=05ii^s(9S2tK3q&l<%js0uE!AZiMpzK~Yc)PV29uoLmha6s%A zA9^fcVAQuZNh5c4(Fp75uiz0Cd6vBUm{idIbUE&^iD;D-a?)qvps1amKIIEuA*x8f zSQG8s#2uwXe`;Dz6jTN;*0rLBiqbPC9^|57`{)7NUtpqDNh}nnueJq=(7MlR%E*~~ zoIT~2FB0GC6HdIm#tC!mjp~&s2@EdxEq!Ge5&nD<+L>OR4kgk zT@k4>3x*RcMnhKFFW)FF3Fm1qZR0$l^2}!<*PZA_VG~{4jb{1OMY8H1kDxO{%{SHvR9KrLiS}hvd0Cg7)pOdvVYA;$-BH-2XCS?X~utbI&p*JyhVX0^xAus{9# z8-@Vh=QOZl3q<5CLZuRcjl$Z&&L+Zq*9G@$g!DBT5Wz!NP2SKkS)^WbpjdiH(wNnhXqosiL?nZjUdmn2ax}wPod)S-o!>ua ziHvG?7kN^;(NA(|l4|czUNVEHg$9ze!4s|6rPEA^Nd7>R>Xe`n`o;LS&flr)hYg_3n zl$^jd_jiS`XS6AId*bAn?Z}@V`bKy{d<|{M2yomMqj&w3Kz-d_gF(pn-JsK#JNR4e zQU9aKGyRV}eu2qJ5b?}s&Dl?W;?T^vNZCgwrWsz^(sX~s_Y)N3p7&x(<~-!dX^U@Z z3s*ybu$+Alq1!?Cq>t3+n2+4&l#ib7&mN*1=3O+1>DM8oM_MpD0Qky+gGJi-L)t3sLX|)S(W`uJm{{ReYcj#Gifl!I4SqM zKvB`hLKMjm<^iJ#pG)s0oPr?LUENj3R_|#YMq=uIBI(< zJ-4lo;{~irEm1)qIJFz=oSk$|HoX#7)G5ChU!zPDXhX4aiDy%yj*$~F3xw#^Hihv0 zW^6NP`@x+!co!x~2__LDddH5Pz+#VW5U)GMYeD^RhH%@V&G7HxzqE5BQ7uDvs*nT` zCi;8mL*g)>2Jc^3nUDZ`D*U6NDej3eOWJ6re*TJVJkVPuTEtj4nwMkBH3JtPKyZ?% z6jmKgNb_X?o<4uSPZv%n(2Cnh{Kg|M&C9P?kZFeU*VW{)%@kUZ^~r5DdG1}6`#SYn8uL&}X#dljOg=9?v*(>oNPI-3U`YHYQBj5e@+wum-Uxvz zArtBIQuZgwyWk@ZB%K{^v8?`F*D^=(XLr7t+IpPM;ITLnIL&)>ci) zJ68KxX{_yrssss|+`4oFt&6mENA;$==;MZ*OBq_A4YP`L4VWjo|%}*7e)b)W8Z|IM196zpwfKD`hcZA(HV~18ue41{v3IJ`{K8% z(gmsO;kNOoNj?=Ir$_pptY*GTk@VG!~ziYTs*V zkSl94eyH!Peva2I4~Q~vZstuM3d;UG=yv9`;tHb)$1smBwQ}TTGb#DT6S*dE{KRog z{5eJ^^PWI%@_0<4V(co)N_pD*s{H_RK-JU#V)96zAlV^GOfO_ovXgTR7qH6ZmGwu3L8s;!n}OqS z^j4rKk!x{M=KtKMTonk%aN~Zz+|u%EBM{WGKnoR8m6cZ!1x(v^qcmrR3Y81nnl^RK zmQSwT0rJ>@o`O+kx{(!g()Hst{ttN5Ry8DUQsDk*aa8R11gs!fBbYYY8O{6P`-F88 zY%{Te2hB$%nvE>!9`Y%iV~VJ!UA|MU!^Gv(N1w_V-XGMDb1GZLc05ImH#O|kjf5_X zk$%aRPyQaF4Q)e;jh2>qb*E;tihCrX-R%A;%~o^!aiAkJnC4|$84zkZ!FKo%aO*O` z&FNSdgyegK;{YC(Ya&Vi<4$^2lOCo=j2mclvm1Hsx}!Q7hX^}oTDz+&vJh}Lw8V)%)!0S z;|?)&TNb9~T8djY+6&!5?^A_yYpq(Yz(Ly_BHafhtfi4 zqJ}WnWC0!R&rHO}NZf3;3m%y|McF#79bdjk5@xXz3FpQrUHFJj6@0XI2VhYW(Sa5> zZEZ@AVX6^g_WYcp#Q!CsgepK+xMDlorNaR%Vl|6d6Fjp0!TZh?dr}HI>)dVFEG=N| zEjE!RCdqI2AkJ9*f<_OXxxxJMk~wc34!4_?o1w9Sqbq8ke@^K$X~{IlRO*;?O_`$N zXdo{>9uzyYtVQM}13EbXTjoQvS1=ePRaYy|T#P0XwO<}9-Js#H%WQkuqtx{HTMvjs zcpV;adjSKpFCM*JZQQKHYC~KfSW3-c>#*Ap?4=>zc_lHw_&r0&LuD!u%Y8ptzMTNK zemi1?{hC-6{j%qvZ)eE`m&LOM7u|bcOT86>k_yN3n7Xpp13de5rNj|Z_LnTT-$pO% zdPpjJ+fbF;1u$$`u|jMvw4wr1{`aMnyo^uB+DggzP0^$T|T)~{nb&z%`8!DSX|_~qSVtC zFmBo_%~oPZaQs!qhi^}3{zk?y9CVXE-5gyR ztgmDzNYh8drVpksXLI5~=dn%D^$kDSi^2X0{By+v#n?;YgF}$LAZ!9)f|WPOxAKwEzEL**AN&>fRCnhBZ?HKzht7MC8y{eIVlfN>4Buul zAGJf9y-Vy}pdyWMM(n``cHC*+TTTVNLz;B8@I}y(P0{oeN#7TLa`qJt8d+ckchRj~poAbjf`ar$N8DA^&NQ{Xf?9 z|Ln2&PI+J<%#hi>flM?|Aw{X^29Yks{E+^+d~!@;Flhl=ly45}^o^kp6v0U3(7?z{ zTKzqpZ1mr&!Vv7pF9wSl9}AYcJcU^xc%??e{PM}l2sV^U*mc3TL>|6B0F?9FYgj4rMk>=;N30-TTVHZKIYdpL6)jO+N6Vb2w0u zQaU|HCal*G|MB1ORPC)6Du`vA8y1BHwPtO&|#K3+egbi{hqEEq?L zA>S08{~Rqic2zgk)Ngf8&u0XnJ4-`IY+>7oka(Z3{hh>n*0@W>f9 zW7ee~L>q851A=i#p{+~Z$JWxn9Cg*a8hvKoA{>lircKx<$Ffh|N2gtJtcu>U7kIrg6U362K+2nGxeiwN`4 zTEsy)6GX*+KhcpBuKYpqJ${mr$%0*Ioz4TCj%Uf)a4&tzn z)x@^$2%AQkZcWD`u)UO`xPCJX1NWc6kIp)mT_85_vQ1v>0P{&m&ya@FQOLFXsyOWo zJB=Ssizo}7DqgM=(kU-+>T5MF{^q(Stq4v zqEUls16Q=Cd5}c-9cYzp#_B+riGNfd`7|+<(#nZWYu05no6%)WbP(~B6!asRQEb59 z;E-cd*H0zT7IqwDnG~&WPTK%Q`Y8fh^+9%GLk8N_6*i*jx#w`zv|V`X4#D8|*#HW9 zvEg%1Q}1|TEpBtt1c}WOSIxeKYKU`mA|*F;X*6i_=?farCA@z-mdZGxlSXmzS`NNc z+B&6c)_6=tKWa=zu?;61na3)6rht;{!Bf9hbkXRtlyp=qH;(knd2eLk$mA1g6TRXu z7VZndbNsj@Q;t3gm}8wWvvn>L3YxL2(ubxZnLBf@KnDQB(!qZ6R)t#q?W+rPO=ZD59$KRpMZ3BX~y{-}Qaz%F; zC%c~Folwq+9OY7ql9(hZ8V!9xc~-4t;0jK#u#<#F0;s zqP3mvtVmtS>@0NJO%45@#_kdWz64RS9tzQcb4u`W7}N2iVpSgZml5Y!K#g#K390n zhw`y5W#P@mt39~OvPb{54LmUeZ5Z|HzDNV;}JL*quVMHuF3V(nldM_ zIuOel z6ZhyDcIWQlxC8NHy+iRc50L$h&gekxXJnNMP^Ox@})c` z`yt<^NbF+s=U^v7^jplyo9TZdjKqH0hqj&6)S*o!GySb_8oSM5NXCcS=I3ozeOy|JRTh8G)^ zUM4rgIWw|$yD+hfbj7ZehO!Vz*oJB{a9P4QAH$=1$0=jJ&t5~~L7Se?k8d@Rtpk`n zm%;C+f!w=@7pYUDVKo*;vDy-3il4A!Ge`>xuyoBgz^U>t`nz^4u-kKk(@Zf199TZC!k6JKG4 zl^wIG)&;+gp_S{R*<(ql0bFst0FK$^+7$bFf`+)uMs~QNeUH>0MxdPdGt2gOhmh67 zJ?c?K^+<9X!E#JCwsFq{dw1Y7}D)iDu!dWtMTu#hw3UJ8WNqc zVBB8gd)gkHqhCEptqlxD?^)ypgaE%=IaJMPE$!>6|VX%C(&+y27l zuUZqQerbMkCsw(`EZI4v?t^hAc3wVMvE(hWh43V3s!M*wD{4!)%50Gv5ldc?&`H_` zN==f>)RpwQDrMm<>c&ANHtf0qA8PMi+_0CNX#J+Jh;Yw)+tXKFwr$q+AyW-fyo73LP`rd$ru=@c$_dxd zERhR?g=CT~Z3x>@FPRJ5_4tsr8V1_7Q)eACTl2-9)&tLyr9Rfv&y?NL3xd##qR_?s;$2DErp z;QR?M!8!Wl%%upDoJZm>qeJgNTeSy3bB9)f35Y+<7q;xQa+{3pmO1PT(Atz&7l2XW z$SAR)6+JL(yWHMs9a{vX`;}|-=uj;60y7=%%AstXIW;!j7<9gLq6V7f0U`P1b8c_U ztf4{MM|=Hl{dPfiC~LXD`{CPBXAW%xXYTD|UlAX>%T4Uq4t}s65*d4`?$gTn-+qfI)c*JqQGxv`>QnTenL}~X-&lQCjwfr~L_XVK zJ|nhi7miPB>JXHlODIyjC@+t#U%n@dP{msHE+t$5Hq*T|qnH7todRm>pg9=B2qw4T z%l&ksq-$#PohqHi)yWJ<3N`;E0UBjB)J0bKIypc)(~N6E_mpG`SRT8fbISz#$?t5M zpix-?(4U`ITv#Ud4nE~?5YHR>g*T{`G%cGP%Qq{HRPNOB&I|^Je#61qxe~tvkYl-G zYH*?25&|j+HE%@{Cu@Aj=L&wEI?Hc{Gp)<-t#{_!#o{A7a9+Hyv90@6j8+9_k~o zq4qx0nFb#1jSk|PT4+8W-ywX1Mg?G!)W)AKNuAKZp-#0GmCXpUn@eH9{iZ}}`-#rj z(uN(D8yAI}wN$UlE419sVrBB#q{+U!uotE4NZ}Yd5Ax=+6e=CdT`|oM%9D$~J03QD zfu&wC)tDvQaDWfZ$}U%yGtR-p{_+Bjhs7CVrXk6h(E34%fiM3KfS9C%;_!hkG~h>D_#fi- z35<0Nc1+guiJLMhSX2-+{}QXs)g~5yv-Z>k?1w=3g%LF1vwQ~cw-fEtWJCE?{aHWz zhq$kbG6l-|d#NzKna35~faBqGlCETwYRC z6JaUKN}4KZTU{ds7hyEmoHNnqQrgNg1_F2liv}!&*s#Z2DyNe32QcizU>4=_ED}JH z)1G8I_dagl`cQB@e$A%g|Kb^=f;1B9$E=+IlnM?7Mqfe$^QR{?P?FGyq&NlbvQ%bwBD>WdzHnTy>b&THyud{mwtK#nuZIwUXJKe+bQ~ z1ITZ>R?17PYQJIu*YSi7dS(z~Xy9M3Jhz&xscVeLSzD~Y;99VO8+G>)qA1dO#S0lE z=&nzbi>b6>601p6{S;W<_&N_LJ$K`vT9xaRu_&?b%<1T{zB7LUq~N|{h+`%&8mAkj zKf`8aJ~JD*$vtM+X~yngtrclKk_gXRpLG_iTcO*oTDyeN*0N1Ae)S$>kxM|QY^3VD zk1hUcAAs|giLO`ciH;iv*KAD0h%lGD@Dt_kh_I&Y?74z_R(f^MFXA0qWZFx~C|;`u*78u5Gcq>+Nc2k`zs;2nMt z+4o&-P?5R;AH=Uedz}34$;r_>-JUI*{UJNh!U=Ai6gTgO%<1%Y+}&7{qG#xQ(l$z?isI$oarHVI)o2DNpf z;W74Fe8!=hOKW$~nay`LS_ub}7=|*hz@(|PiY5mHYgw1V!s+OI!Isj=KFHSkbKP0| zsylOdZZ^%RsA64MddPQn_FV5>MjIFQN;Cruz)17K+QY~tFGK9~4iZ90%90{^ zdzerXSfzhyn%mL>iK;K42lqM}kYkmEUgHOKa7EgVD0>rICr@x~zV~{Tn%saw>;~aJ zr%2XdvyG2Ml3bw&^j9Wk@zDyH+yIIavwUi5m+Oz+HQQ8M`DH9G@+z&Z=z2305!IPf zHD3-95v~0A-9mg9OHXP9hSc&U-bmN@0u4oYs#e?eW-7(}GT?dN`pt0cx$+}ezxTx=<793*(r)g4|^bbJ$rKLr8f>SW2U67pL~+&{7rA1`E$6 zDX21J&KMRb*a5>(`4pUf#;cznd9l7!&Iwl7;0Ie}Ol$L1u0Ww|5Jz{#YZ>tq%2RgS_@|2wjz8_Zr4Pe580!4GOUwceZ zo+YP#PbaiMWZ$fRewrbZo9Yab3AWm~1GAWnZmxcbJbsky@2JD^L>B*bNJ?L z+4Bm6Mu&+ilWu9X*Xr_Q7s(l}i%MEw%TMhBFB!&k{u7XM0x;j(w~P`kiA;ok#SaCh z=v;cjK*ksl<#P!`xS#WXu!OTZg9(Tph*RX*c*V2A!gnAjtvT26Ek)Qx)C>FxI_J@- zKS-jGj_{6%jYtz&AJ!?0!((O_ED1;ES#N<~q80{_!6h+Cgoq7DzKBt=P&P&qk2h+) zH^8CnibK1DkDxoEUTAU)u1`WG!g~P<_jZtNJjb2XzX_$)DSqaDqIYviPRLaT>#1%8 zJ;e=r1iv{eJrZiLXh;)_^ir}NQG+ER+R%W?6Y3OsTuTqjyrJImuEU7>B|y?E-P5nq z?TE@kQ|_2PIEtxQ(^wlQFZD~z!!>e9&C><;$VJ{Psj;Fh0;9^EM!un4Q(-HR%tn;p z6K+JtzFOiVZz=8fG60b6WdoviZ}fxY|FHBfei{4e+HR{@=Ub>@mZWBi2zMpgx-f}=cL3I&0=0Z@K-Zcdc{ec;tesLr+2%GT0XWy*$qUli=>@L0u36^as zVrWmH8!`3YuOkyfMXW1lhR~d40-txNFZdSUs{m~?vwni%`NHsVPZwRL`bAl$*-ujy z`UKt>H5Wqc&N*P+T5QBKn00OI>NDvCqy$e|RB_g&*PwS5fk7uxgI3>z9(DQRB>IKq zw#{qN{wDKkEnL-eK~#vF??m%eCgair{nAK$jFG>0zc?i@!{I5Wv*>JnQl&8p5D@|4qcWCqaS?<|6&T zJl4GE$)r~7Q~!BKG|fTt?J=o(Garj%aYSF7IT>|+Yt|la_e&<)ANAzSqrxZ$%!NgL zmQRftOihyU>rVVOt3Gi0F48yPYIqR(-!QzNOQUI205;;VB;Ooj5LPQSFC{>bscRoe zB*`WFpZ&Ie;d}w0IH~|*`IOiSrB7?01&6YO3vxf^lO%KtC5&Zh!^u&g_^i*Fe&k6F z(UX+IB)82F>(OZW-W^r}srPb=AIGHfR0BwfWrZV{1m?8zg$m zJhLR_9rV;eByvir70SG3CRX@$oglQSvRsRpBgf#pe zJLq%QYYsByvuEdGnDW*##0_OlAD{o=GvW$ZxT;_AqSyCb%>K}-w(kxlpHgz9xonpk zWNxkk=ndilR75Z#tj>&*9_tCX(wgS8?VivVWsxhlO7`uyiuQp{XlB9ZH@?-+ve*iw zHC`5mY*Pb%*e@0Z!k*LPCLaN|o**|R<_BDLt0)a0n0TyPqc_oeewk%|YiXD`{f=r! z+f_*ehLv(%3s+@dE+ZVl(aR3+XNvp19**2+UkOX=3a!r1vJ|#)WVm#(_l@9b(u#Crz@(j^dAt;oNL2XYM-nYevFYdHSC>icNK<7XGuW-XoF{B>{-9A8 z+m4I&6(30~mP+v@`_@{n*)UhfCS74mYkdGIgjtD)7LNB51rTE8BCcMoj2FYAmWx+% z*;h~X$skY_#xi|`W*$0XGv(TeXBVY6QI-|(8P^a7{0M@mCt}GPZodS(my9F_Fqf9W zs>E?kPo5>n8*u=?iF;|FEfBDg);t0z`g=i`c{qx<2A%2#`Z_&VJ^nm8Z;V`bj`V}hzrycm{muZWa85rb?UR?#W&r~yv zhKO;6c=BRJX{dOlu?rAO4vOrCznVL(^3b!91beu=OGK-IMwAF zE>*OAaY}h%b{iW5r|;sxs`4J~M2R*XWq8aKExU78c*aKbj{a_I;c)$ZH{Co-PAm+M z9p#*6T!kOUfwm81Z$QZ{Qp}xIxo}PPqHrC6rR_J?xnv<7{nSe?r|K_LYDOCFFUz0H zJC!dNrQ09XIbX<`CPsn|nhf74%9d`vP`=XbZrx0!-g3h5N#wxz+v60dPx4r|cn;^Z zFLzPZX4$hdg6{!A)Fsj4o#%B3;&eUO#n_R}*m0JZgX6TWr`9N;FZxWnk`p0mn{Q*k z?*2er2}kqe*v&QrF@xu7pQ3aphWVT~&%|gJ5`OYwCq|sV<3?1D@$9DHjjHv&OKi$Q z0F3vC8OYKv`&$Nog?~TaTZ+Cw@4nKfd`&%G-5x^aY@TXbuPNGzGPT7*)wAYAcUV$p zMHsIuQX-V6_JlLN!sz_C9DaBB;d!w`%UD|=9wqWIk0Ob%pZ~gB@S{-wa2~oFhrYr< zbz?{&0_>x#8a>UX8B1v_lFUx!A=Uby@>=`4Z+6G!lI> zG>01+^b0aRE_s(GrH`lPg7N4o6@&y;js-x&f3yb%i6Y^HMh@^DiL%@sIgMClTswLQh>HnD7R89pJ)jSr0bA3 zFq%?*KQD%F@uetQ=kJl}0V((~_I1Kb1Zo_n7`@4TaU_to@(_uo0>P`yG|*lp5X66+g z6V|kH(6*DltyP{j-t3cFrr+|t2i(3f*087~0l8e=VV{R(MHXqJx_<4gJ=8J`6{<6> zC8pm>qgQbi2SBnI5QSR7j?J8?GDAjZ=uM7+mcn)EQR(SnO=2wcNH7iJv;*4nkvKz0 z043ar&7pY@;bx;K%Te|DfVN?#H$j)lV2BD!j*VegN3ZK8_r>5`>iZk02daTbG8p_{ zz0Ji&5I%(-ZEp0R@KdP6?H7}o&l_ysdDf*1)2(w=(SmTvh2108D=4_N5=M5GGIF*c zi$S6YF-ni=L^rRnotQ^C0#Ir;N*S={Xfg12ZUnnF>I z2tgRBOaz78NDi7MI0QUFToKkNl@kRbqRFA26T*4uTLyAkD5o2KI3&h6Or}Y{oUb7n?Y150b^CY{9G;08AEw!GXii9-?j;rk_VZ__?U~EothDanxB54k!(%mktkTEVxR=fZ>4_`$jAh7Kv#vwQcNyjP+8`oaY`kGX z_H;6HcKZBd5sT9_7HhbgPu(>RU?w8aCN+>eU24~%Lq@vzmqEuV+K?x^kf?ygVq>KL zqPrr;~Q3S$O;ZWMUyETr)q`qM=nRoatZi@jI@-lALf?1)h*TREc2Z0(9tYk8tP zI)~YfiCR-Wh>G;1gag z!&~n%J);ba3J@}9c*dQ%Q*L<6dWOF!#K*a}_zK!G7sZfNhK#&Z^Tt+ao8qc~TCI^> zOGH=6FYrRaOrbR(lF{~C(T-BKWUl>UkyC+RDZ_;=&AuInt-5YV4ZuJgTh)Pldhx;r zajZn7K#qWF<^Xji8h8dqq9=}>yy{&L-MLKi-XVU1ajH{^{43VYng6Fh8;JK4!S!+H znNPe>;rAynOJW?-txWDWiR>k!{M=CP)bs&~_$OH8N?LYbbLasqYVE3|Pfp~|JK^o( z5uL5v%`SZRdKh=lf}4HB8}B4jAE9R{c;`e`(pjB>4B_0g0u1y;Bo6Gn%y<$xl$oGV zRmOcaZATIn;Y|+GV6NQX#8aRL8>EX@5sZPQEbIMQvi}KFb?qA5>jDaMazib(?SE zeB5So^7zhd{BUn(g!M3(juiO!GvaHJ#(N$D2uKwH2Hn=$)~Kt+{i~kt){#RuOw}rRue`PG>ZnOcUxJq!upkWPo(2IN0E&Pte78scV*mu| zCGZm@kU|m?aW9)^aa|~H&2+Zg`G(JF_BE%;`*d@-3P{_q2Bv5m5%W;oE_%9Pn-l#| zOV$v{m?@zySW8rQPF2>a2on0uv=N896u_t^wiJU*smK)b%*1h!UTX|q2em?~R=g!? zQi}30dLP|u-p;rg!ey^Itob6KG0cl`(y27~roT5J9ALa}$y*`TF@u#mr=l$^7~Mz} zW?2A9<2-P$DGO899R4el(5wf49#r}{3po?Z8WnCB8XGQW>ch>&9o?ImKKW{=$Rf?? zD>RlMnWKF4?XydXk5VvKaNho2lNl|tB(T6z+ZhO&ESZmq&k9*$5_>x)7$3!9XpxHB zvTpQARU+WQk0c-eC#z&$typyS<}w^K<@Nz?y@vo_DV(H2RykQ{D7m;&9HvyFXVm9(Fv?S+c?BPp^g#OWP)HnpwFEhfGdN`?FNXj`9~S3rCmEY!7E? zQXg=90%1Q@h#pi5?w0-(oSPfdH_bK6SQ^RYNp;ZLwf>q_zv#jYkt{Al!BwYDPJ>KJ z@pozC#Tr7&V~sFXEn@bPHAwI)AZ=I2q{>jiN8=Dni6B2`DJWrve-ng4!S~VXaA=&y zwPKCzAr&e|eZO}hu6|zPdPQy}WWZ{M7cqx6rWoJc!~KrU{5Fc$GSZx$)?7fww&Dn` z87nn0w83M-!o&lqg4L@p$gBKzKp7#`h;x7V=bcqUID;?_LaIp!1e~IP$@dsVUgfZ^ z=6OH0-=1|fQu)Krv$Mbyo&5$nIRvi)96n_y8kFpZYNJ=2d23 zSmI6DU|9+8FLvQ$6bNIm#yIJ}0n@!4x%*<+$#1Tph+$8rY30TC^A6kzgyqZ>W}mM9 z1Xu#^n4FH0#s2U{g$kLAWY}cTGtlQ$H@W<-LFM8}h3s(cxF2L6zx=N2%Gi8e1A^R8DHQ991D(gXiKaK>T_%Hw z6cgfFn`vxxMR}UbQrz+860%(bnbxEwM|0#xX{=o5E)cSVNcK2ELPCoJ%lnZ~v|kF(PJfVf z){=5{R=5nbS%2~HXeHv(utC=(Mt_mDa9SI8$WEGYax5eUbY=u39YsuP9_|J>|3!4$ zHyEHVd>m#Ew$@xOC$b@w+}xHn?1J)G-^!u%f)W!?eaIG>w+YyqoME9HVZviJr=lcH zOVE|SS09K{YsECH!8Du3w#uNG_y~o{`V zi`Rapu^of%-=iDAut-A|g{ zIC}&(o8%J4)IWn)m-Lfi9L)FbC7=68qKn#2!oI{y{n0d(hdt^-7j zz5tv^@lpHO&Vf4?k+(&gTHg$!NUJVUW1Umh>fAJJb3RJP7=t@$gKJ--FO<$bve)G0 zt7GV@@AXmt6sam=qyU!>K(1SeE*-f+$#9Y1kuTst{Hv$%2ec^3keCUn7)r4i%oGY; zgJ$!9@;rEzm`*jyb-h~isN?((3NZ;?v>XQ&mwvu^xHwUT2sMeKbZ}uOjwRcPGIbSx zwk#+7k@0{6!|#4Z#tkkqzYzMvs@a38*`tPr&tp=LY>11@RSP1#Ye*KnmJ58rFahgLbGR@{ zC?G*$%@Uk4G)c&Ys+>7QQMCezMFRQZ9j@buBk@%ORi@Mf?qUo!wy~4^%25 z&9pqoJ3_d4-LXdyU34+uaWU`tX})tAXF$LYayASF$I`$bh_#llWUJaBB{KH-Bvy~5 zqiPFhk`>C>8s+Sd$rFr^Xl#Mm$$GI({bFf3?B%#tWyFR&uu*2*8(AEvIPXMHlb+j^ z+@5;gu$3#aqQ>IBHgz;5oEJD!eT_by4SbA>kVQ92ZKpPe|J%ajm1zaX!MQY$N@|h` zA+-)RBZMS_C@Z(MIBR-slo?DW+t;G}y9t(}fPg`hECQbv+J2)JN9)mg+$o1xk13$g zTyK=Ai41J|T$$YaUGSvRpkbdoN$glt7?fJe4@EXS2VYWBfs#jc=Gz#BZ^*=vSJo^S z7U9{ci>vM^I4qQFx;rG_c`UrLWf!rba=BK6813qkFEeU8HQxZ51AQ{Ve--WAaB8^T ziqM`qxJK=dcb#5BTyltbLK&{!Azw^QM7pr?6N7U$;oUFJT)q$Xf|J%M6Ey5SFz2q! z=!_FM=rF}^ly12UPpmCaj7=Vj!eU10Vx-67_JVex{mShm@wWBTdtoS$a0*P8}7f6FC9g7~d=8TwUfp(X^d$ejIa4HGA z26?JBV^gW?v?-aJ{jtP{old}wxAVAcLok>RJ~1cU@qIF1QqPXg2< zl_5KecEL&|qZ+6>tn$qZ(#zOI2gbEpnXWR~XTUtL=iFOtX&hvZPgv;vn+~gAn0Z%- z7r`_E68}27Cxl&gY$?Rtn{)obYKVY+bm2T?bm2N-8afFpv>GC`v@p$_sAp*KOyU^V z%r)<3N1s3fEY5fV0r~k!0|AC-QP|}OlP2D1zCdh=(*c~9b1@gQ5j&I1Z#=WFSo2AG zpG*}{x&3sO&3$ZOCf!4X4foZM`9&{5G`y+iButW&dwoIwjg*9wcI@eoa}Xi>zqYs+6dd ztfX{e@SVa1!UYmwR8F|5tyWZNGSZoQH#awa00W(^?eCA?Uyjao+ax{K*XyaPnW?{j zUT3GW*1P#Xe^0le%v&3i#N<9D$#|Cg zWF%>Dda4zz`lyx*_~{jK_%vg7k8}LIKWxLgz?0v3Uhu~5o*hQud{-=r^HBv+-13ynyVHLK+&p9u%7aosQ&3aT*M4Ql*wcT-ih6L)bKW~8jz+{K`N)4} zqdF*$Nh#qc8WTK64nK%SP(DX6E7e9o`!#Y>q-3jlin;cbBgr_VY0IY`nNrCuSs7c& z(UMRyWJ`~97FI;yfko7SS&fVGvSG&Lo0H~hBFdAKKnWf5@r1ZTag-&R%%9Xg9irRg zt<$aNNkdmI=|m4_ZK{xvB#4@NOb(^bTUw4f2(xPs*amOjt2#BA5+myyT4Ba0L=TID zp^+2wl#L)K^mtS=pv6FIv*f$Sgqjphe+BV~g(lLaQUD3}rlL7v|5#o|A_(OX<1=ZH zG_dYBBxOQOg-?AN3LBWG8;D@);lQuF@6S;*gD9p8mz52cXt#*9Qq`CW-t^rH#>EtL z?KdC4oBQ0k1KhLzY-*U-z7(1)rNAk%CG~i*^@WiGVcKW7?w>gVjbj zzs`(#IlGb?Rz^uM5_(RJ-JZ8JWyQ6Vi7rJKH6DL<$BB%l7(HNW)(9gv&eTL#S@+@o zk=!zBY%;Dcv>Z@l2hnO4LPzNDG|I$E&!J-r>vs-b&7lw-neoN4+?1VPgH9qGD3z z!|}2DWqbha!NmwH)RfI_YR*#s66DmB&FMHNb0F&kJpkm98=xKSXa)g|a)uUlHQ@-l z{D1g*r|?YTcT2m|vCTKOZQHhO+eyc^ZQHhO+qTh3rsvz=!T#@=YfkH+PM)e-SFLBQ z`*+A4z0N3_!qk0_Py^SKO=MTtc5-Kv+J)1=9MN|p@@0gv5z>zx?X3FJ_!sueB7<{PZp`74F{i5Q#1t>` zI|}EroY{f~#z8NfdxrT_Bx!wt9y2hK&dlMFVXwMGFV7I2Dq7{+IpbD@$}qL8>Y=fV z?8=_8jO@yRaZ4_3DHVHrLSiF(dr0CXhsMzOu=p>@)aP~bFE%;L@O&poL+Ug zCX0gYScrAV)rQ!lk-MtcoPtOx0KV`rJ$c63Tx=T8sNCyZcNX{5I50OX<3V97!5`Bz zM>Sa29_L&*Rqa15Q@gnVAj_I!9dtQY5v7KMDIW({;t=Rev0$#!LvG8}sAggcQ-q~T z5UxPNR=Q^VlUIWu#wndc75+bt{FE(>LZ1dxL;1>tK&gwbCjO|N4O;j8PSiY$2%JY? zwYBv0IFYbou9tZ8twuXWZjfS1h`#bMI*e|Qd#5;Xvz<6OvkvY%$9G+eFYgbmS~WI8 za>_T#Az1C7YAP>{A2Iffj97A4F+x%$XSXrKgyAvf?uLW|WT!RXGG3ctAj?neFW~MD zt|Wrr=EUomn2@Cf5<5&k1)V(GeqXu`186^g24_7uU^p-)8I96v>vq5B$4M0f(>qCi zpWtS6DlIIyr|$%yY$UW0!YALE3Iu(6c+Sj+ImP^BJ*pBs3TW^}dUyTo^9FPxDoP0G zqImoLZH-F@~X|36ks&>xpcHcKTB0MO&b_p?ack#E--|S&(JK+TkiBeT_YL zfQ}ipDIn30l;kg-a!@oyhPVi$ z-_e6dGYQJ_Y=#M%>%`3svXUt;#b54q?yYQKcE7&bO4-yGK?063D|y$=jVRE%>8T(qg)j1 z!{x^h(%jq>k5N=i0&^nL|74h~MM%#P;v`8eAd3v(8J{uk&J{2H-es0q#tbKxV_UF_ z(~ZRR#__A^uj<($R4ccrSz=bJ$V@B_G$7Zi5rToz={r^p7I;Rh*hlRSiVl=BtmZaR zsFrUfmkNDwWSxgkJPXYPzKst^0$CP)ORksCwAmN)CjC23Xb^6ZFWlNk(k_Z>F&X%m zelV2?+ed?O6}_GvHB1s*FQ%x_(VOFg?!T_l(vYq+z6R5vh&Rn+x z6s$B@StXvKDQely1Q8&&8{@is^1U+jRYVpE@mC3IOEjG;McP-48(}>9OLDahksl&t z%Ehe(NDTcXhfkC#T8d1DR7)<3G0G3mLCSv`Fl+i;zJQP;M1i7ZiSre*JCzC(eN&F) zSi^g55$uc(@UQs-RgDLHlcdNjIJRStW%vSq*T*Cp%BEzTt1=kwE-X~Dlm|noQPnhQ zRT^C!Qh{w@m3SlO8!|{nM&ejVAQl%7%i3G2^c>AQkagO<^I4;Fn*e#KdD_s{OYbFfjQ+Y#|!EKieiQ_Le{mY~uO&-_azbFzE{ z^eDu@0|)##SgwsN(0m|H&%0r)2JKqvpQsOv>6({!q=wJ4o#c(C=|mNa!t6DXD`4wT zV)EM)L+T*QATVzOpBiMKm=z*G?-C{mFWSHke&(9x)M}a-)GET~bl$LyiapzVgxEGI za4SqeSG>4;afw|*<|L?1R&?js0+diYy6vr%(6u&hN~_FvU4&cMDl)WOhTAgaRAq1c-kCM6)+QbDy2Gu(87^B&utHZN zN3R@ru|Ey`8Y{TN!%!S`W>Ez}g#S73`J=zRQKtkZpTv^PVmKX1xjj$d+nVixlFgVr z_geCDFY{Uw8c6eb37?Fgi1wQ$&{h28(irldGvpk00@=<`r&nb8z=k@&txUrk263lQ zonjoA|3O&EbbVvj1 zpo(sIUOkHg0en7jcMsM<(|+{xIL{;^$5xZ-_LO2t0)Vi;5$5FawjCtMm}^GK7Ao0y#U-78%Mk3_hw_0) za6}dqmutas56u#;cc1IuJHJ8R8p&5CcRxoOktc&1+#=|ab5LM|!WN7wQ^5g^%Zl%( zP1wA?l%>C^PP&#?eu?j_V=i5%`S2|YJ13v?B`s?FoYp7}( z zp&#n3z^E8xeTewyjj_o5FctC0qd&t!(CeBBccYdH(T$owg7JB*lVc^Jw!F_(=i$-e;c)zl3CPbwHNXOxcYUb)G+PU z%o?;_F;BPnZ(`a*g0}(AM1gG;;5tJrEbIL@(d|Du`eYW8fZXbVRxRruK^zuzxB!>t zj#Q&X^^9CC)H;&TuvJ2i+^{l>oUBVTznYn@%kM9k_ey>!wu=2ar*LC>Ma0`Or;fWQ zcZuALC|XU0Xa*EBo3LfJPUeqDoe;52gC-?0X&p#4QsWs7?l?8{hPZ%g9Mdb)U%8HD z*V-Zosq8>piina(-2k z^{Q>Y)<2>eAk&jj4+}e(9;zoRVD> z^QUwrR{t4U{R>95m%myMXSstRH94Vrg;1;cpE>)eS5fRa1`6#_kqWiMU7_d`V<~g| zpxC(F!9HyjqRC!c^;5f~IN4W$T}9bv>7c1y?W}BN@X-}#P&_}q?um0SRC&33uL;(b z0$S^NrwP}U;&#Nc8?#EI(KW^H>F=Pc8!>2Ji#_#^CGAH4c*kS!K&Z{qX4+*^Q5mPD zgZgBukl%roTvoZ5aDkN~hc9)GVsh?|>9c({ZlE*28zO*~NBd>t4yFgsOSB`|is`+2 ziX;2e1)c-Y&V*a$hV3&Vwqd$l+_|QXq}~>AD*zYTG2yq(`sRcjE0Nfs2Ry=r(j~4g zY=5LmgxA){b{L(5B8*oQHXNryS`B;s%Dh9ut^Av95aUv&v^iMYvdlrx`2_38Cl`g&@ zQumBqP`ofgQN$}ndzRSX_lY?vlbaX4SZsov0KQ;qYX6|Nsphro@wG0>#qsZGcW_l+ z7gNf%ksfX}kcm>LA-q=8gc8c+i+jExAnBZps{)Gq8_=2T-9K%vYHp6!krq*`?M=PD zHYXLM^ON$kmz;VW5WMX0i&VS1?QIooUy$*Z?KmUa&U!9lix&O3eM|Y|K^|64F*Q}y z8?-67a?JbonsL{Qt-kBk)ibsD2(1+WPMFJ$aF5jEdcrWWEUv4TNMilw4AtO_w+)Xy;?>s&U{V#) zI0Je}vR*(Q0uRYFS3(^fn#Ry*#)pqP+1P53oRB_Z#L-B>JxcY|@Er3lSF0Z@UJqT& zy@h3C_Rt)^Hz0!<_WqoG{aEj9gVm44z*A6@%+QICyki287slHVCg8WZ&D2KYrh!f%0F97BL z#T@$YR&%okxVw@H1`iwExzu7=u{`yhW|4}eqOe0?r#g*m8M{M?jb;Hsxy8YbmP7u* zj#p%*vcus&C|CFE&S~%MG08Ol+tNe#&yL$}_bJ~`I~VuI>9re>x{%EMfiE6zUm!1c zP^b*I;ei5j?7Muxs887_GOzS#V(}CY$%zHSY?y~?53kvQ2QuB8do5@6wXIsZhC6H_&)9L#f`$TWW8b6Fu<_cEwi!2E6f0H^UzE$G|ka<3YKE zPYuW3uy>UyJ40Xe$Ivvs;lCn<_@dzs;S57SMv&!;JC{xCS zITukO@5N*}X{eG78G^;j^vO}eWUQBlmCdEKy+VFeID0fm@#>DAjEHd4NKeLH7N+F$ zc&6FOfGWv(`6{=AC*sRzS&ebZh2cK5M-@T=EjH> zcQx`38*;>Wx6V3ZRH^6CPSlIWttR2Z{T+GdLSZ{gRrZuENJioCD_T(n=SidT~de;CB{+k4I()6ukIV^N=R2 zWQvj^pYo=#2OHylxgji_ws`!EiUjNjmQ}x<9C79?+>GHpQA!X%gj-fC6#(pHRc^WQt{O(`&HabVx;>Zu>B+Z=WCg3j9l7e%6WTogI@QSlpW(eSegTS z>k)~l>@4wTlELlu@3G=YIcQXywfb@qHbzb*9_L1*#HqC$+zoSfQ$x6U4KYhn0 z>I=4I@_^w1ugR$Raf(A(i0QdqE|SfnMj3Cy2Tqw@(Rb;@RnxDH!BP#~(u-AFUL~gy zMX}SH{hA|`X^x$CE;7Y$F~@nBf~z2;Y@)jk(6?LlUu|PY6!Vb@AgGd0FHT@L>SK0Z zLMxud=#h6xe~$nC^vbmbeX#eH%?wqgJ;9{m?l7UoxCBEVYDCWFK&gmi)DKjM5NK&e z_y>X?^GhKdbk7T;!U*L==)DIHHci-{)36W9EU zO?!!p%Sf^|s5O~}iq*{slhqC471Y}kc9)8GL;=AmY6i9UdY+a?BeAQa(UrB4Sey3= zc%Lo01$#iLr{_SpeJd)t+Ld5u@UudOC3>fmAIjP^M?r(yj`c5#X1?f(XCpJj$y^PYR<^Br(Zejh*kOTx+0~~I*~wF7GOpvW@Pn>%-1***}?tPc@R1*?{^gxy6r3=#_4OP*Y6nbWow(Hc4KV9UzFx`8Y%kXYw~s=c7H`MhQO?2?kH z3v1+NTUqbA;~n}c;#*GlsI;|rZT!mvJ^6UTmaS$2ztxb!q((5wp@iPjs;I$3oD7Ir*ydp5h0Dz8LQh#R9SF>MwxtsEM9u9NOod=JuEw&iEE?Ta3H1E92#`=vwD2 zm0}xQe8xk}ZqJ|>A?qw~{%RYP{&Gj*Z^<$rnLgF|o_yP2H3yXlYfWm3Z$1_JDwmq!_Y6T8Ehzm7up;327S;MDE-iMon5_>mpw0%2d^@}H&(j~cV)(GG zAy(1MTmnPaO~FCS_W%!Kvf`mGE0ep^h2)YDYzOYcMCXJ&P2a;D5J&Zomkm;A_%Ctc zUed%SH2$9NR)%{<&%_|TkhvPK%}^M?qO;y#?y6jjdW%9(O-8F1)M1OIww;J*-!RN` z`ohMUz(kbrJ#%!-YFYPCi*3k2!rq1wWlOrN<9?micG{M6T5aoxH= zcx~L4O%<4NR?l-lP=ThG902g(89C~7%T(`-JF-kUuuMfrIWm6RsF6q~zLf3$~Ui2x;>VvQKXpS!+px~&}^AWP(7FQ5Z5#|P7HO9Hn@)4$Hby?HdSW`Sx z{%-C2K}gZ`yTGBeJTYqTWFm655KxPzUj~6uqOywhtxUeI7h6>s%#yEozcV(Ii@Lmi z?XCgRw&j~DBPgewF&pT;Fq`YS6Nb(b?>jbQ=JYHd*|*o!XVl- z6xVmmY5~q1R316ZKpG9y1_GBSTlZ4Rs^#e}WjZFXG{%Gliy+ z%ZRLDCq28KigMZ37<+(yIXqbzT~);()CP7PS0+aCuj$$Z3N4_WS!{+O=BBc-Lz!yc z@C5FQ*L^8R1Gs+ZH_<>nC_>b42ymqRyx$O#v;fwD(5iFSkDh7FRwFR_9tF>?Ziju4 zm$$nXfhuOdU!OhG1(j}llFC5dBX{*FP4(t;7A3Q4qL@B2C7z>7-N^LX+2YS9ju^R7 z$II9+pV}{<GsxB?&F9XGvi9f#)pX!`JAM-_Cl|Q`2liwLonlEF`zCb2RaRcs$7GZS>g8UkHUyOB zE?@6$53E7yp30`|S38x;gQd=7Ph{nTmKWj^@6S8^Fej5lP!vcPl9OmAwZHJMg~5Ro zC5;B{=>VHg;m8C=?YC5k^epWwS~|?zm(rz-Ab*2Lry9*FLGEXk4p% zqBi^fV^F&VIKJWxR5#(5J1?FIsO@8A?pjWtuGVPu0F6)im#h6N(?>Za!MTp;B||Ne zVduo!JGlOrc6H#jjiEc1^BIV=Y?dRC@4)koVddY7;{!!$$!tyDXa8!yQnP@`k3!?} zLsWyx1Xa>k3}-kigDw2{6w0it<)%Fe zP>pvb{BQ!!(&0l%JtI~5Ot#;nP1SmES#`YJvwZVYJ2;!3xz+E7?9VqE9Dc(zwp=hoJK<&x`9>VeokGvv7mR#9Bk9`#)ugUFgkjaa#zV6B z^~e%e#7JD}LnkOCuHS|TncWbE0BX#7C-Ez7B(B(@8M1ol2qZ2ChOpw&H^`@b1I@zl z=3VqMoW2l2>jA-T0$FwTiEJSoW!&aU@oP)P&XA=Vk><+|=H~oVS;bEF+zc+EYGI|$ zqBK(%;5GAc=1e)mKw?)w__pjc8p`rjgSTOg_B1VB$@&|Rbyraa55FaR!iG@M3q6Zh zQJJaQi4v0|OJ-(CN@04HiHuaqx)bpWcX&6yA)R7lYJ?^0D5-F$4oUN?__dGXXC8U8J%Od!iM-Rw>SP!`4ySC&YKwC%tEKOI_r)r@*`0=Lspv^5 z(<<8*X%ETZE&bFp52X&DzQ<~;MlWGhqx!`bK?D7wU3Ask3!SXdn40bE%CHB-F%qtN z&EPZZv5fI!qpudxtjtNVngb?$QIp_?+03maTNooJ8+??A(2lW?El}$XJ{m2|DBn}lp3K)9DcM!mY1Bl*9gtcWWd~VD#@ANT0<+V0m)Su( zF-r-pr%(-^Bz(0l!zjjH5EtX(aOyp?;m(>l`@WlpKDjK{7flLFHFd7BxkUz?!SC5H zVtdww7uYhRLZmja!03e9RpouJY#K?7-A^M+hUjn*?gc4ErqExIFhk1Wm%n{%BS zE~UFLM6mxB&6-DZ5Y-yOvcaTCElm2Zka@Tfdg%3iQQuwTRd`<@tLW>>KgBemhyi$s#C_dq8ld zee-Ce)Txzgl{Zkz-?bC}3%V00r2H1HouLi*t}QV5k3lOf{4oIW3hr}tLZyL@Q0rvM zw<`O`N%jO>BHF1mnrU1^>?zu-QiQ+*ns7ULlw2GqHEVwRN5S~@uUY)|=Pl8pQ*KS~ zo!x&L4%ox8mVW;_Fz3*}ei8iljJu1IxuJoP)&EiC_EA}Vg#O2lv2CbFnja>I45yut z``@mD*O*~AaiU%UoG!gPz0pV_t0-Gx)Q$(U5&d6SjK7dkFWH?|jT7!`PO~{)6K)gT zukWwma=)HNN9YgIEDbevq+{{@FcFFA7l*1k(r^TDrsBRh1W!c8PaxCjIH9Gfqw;{z z($%pAh^QmucVD-)S(1aQdyz?mKu$t zL9;|%G7b()uB}e0N*AG$b4aa$Mv1Bqrd|ffHa@OIO_VIFTIia(#3Ya|LRm4kgQh3Y z{M5{m*S4NhG1v&1I+cvjE=^S|)#znwG&(r;s8h_+q*hIp85rch+&P;{8a-)pU^ z4>#zHEw;_jbJ?YekvCl(wBKjSp{WC9LKyvQkws{Fb(#dcH@~$)XJfQi%_M|p>ZHV^ zb8E0SXEY3KG#7D{3x=Jz#*|TdjP{)g{;CN+5j--6wUQwtNJd8iTo;_lopS~w`Q{f8 zRrFFQZLqg0Qlm+lO!n6WMGzJPAQKze)=jXIsx+lmSlR`vmn>}a6*Y}y>PSQ*|17nX z8UsY&pOnonOn4Wm=#01`B(50%B5YO23tIWvE3+mKmzJcbjw>C~w$2thCW*;(pHqX1 z8%K5f0-NLs;^988A z4^z!XP|4mcD@rW&yifqZkOLpvanVuM(OXTkq(mocdkR4TMpV86OzK&*k1wWMwn~H{ zvFN-ely;$1#uWO*_=X-%m|?;%%dg!0W9IJ-ljrp4Ked_{yG8Z1ixu+ZO^=sPM=TE# zt;;FZGK^fsil&f5Q3>Nc%hKb9BMmRu!~BBue{+l$l4Eoe%Vu>IKc5_cv57D@MdG z`MHDtu6Zd!Hsod=5T@U_qUXOsLMoX#AV1Px@XCzhEq6!TbNT|}Eyq;LggQ_NsD&^l z=TWFAw1$NlIlUL|PlM29Ni*kzDh)D#V9ODg;4{EvhGd=&YDAYeMOYGee``-WvmMf2 zNZk3s;m#jm6Id_wXK-2S(l5f67?*8xZa|#hoj>UaYfM7)-X$)Y6IgjNfJ#NFNY~pL z{atfOmwcx48fWzv=m>SDBe*TJ?yVg;-?iGB*E7QO1^3I4{zY(ujrMChC;uNANZlJ9 zHg_a8-{1h_f~12d+-x?Y3-LHQmo$bDrK`#SYUk<~k!hB2t?(3kG-o(a$kmu=tNT=2 zC@E)X+6=*r3Hx&c5fWLvq+2A}O~HAX@E!`*NK_#`Fgij6W~z~>A*uw+ENEDK4#8Vv zS)|j{Gxw&8|GLgmnYN(}oe@M$9fKMJ?yCDsjS+#ZK8vj(j%_`WoBWWD^)S!XkPmjB z5cYtPPNlExgKRbPYVKeGGaEmcpcC*oC_|7gcs$bszzdxMe64!$>d^ZLo0g96KIyfb z@r7Ee(H}p|ivSM6R7Pf&-=qZQGavKj#Nk&q=R38$q-#Tb@M~I}9-|yya@crlk+E0( zWYJXDZLjvr?$1^C7aE64kLW8WfAn!q3~{beV#qr{J9*jz*K*0OnM(H~Yq1RIEZ4$6 zG7tB6(z(ubsc?!RmIZJ}c25Si*enPRbz3DOq01IIdn!0XZ1f+xm;?GhEAlM^Oe-i3 zDliqRT)`ifKZ^^YiwOLq=WHxSpzY(Fdd=Pa?U$ zJ+Pxfp8rT$QIE8>MrXhS^nX)HXMo&M?mrtAq1(16cmhm z)AxQ^2gmyh{Ngmz-CB(mf0FgO#gy~vv*RGE=kw87EHS7zlFF4Cp27Al=}Izu{hv8kv^<5&um8 zy>aKfg;K`C8_!5~qDI5Ov{)#WkX4S68zYj)RG1$0w}q^E>jA_cfR;yk+BlgiY(!-v zULjWmVwqZbFm7!K3}h)i>F^q4Ui_Om4x#Kb(_n!%HhtoR>7+<9(f!8N((8A*aaYfF!~B7fT5BlQDDiKX{BZX$NmYMCK*wu~T9S zoYbk(y)}@ECZ-avb7|@XuSE$A$l0Lx#6n545-&1?R{F;Rhoa(*My+(lWOZc$=7zG8 zES%1at+$~HVX3Q$%mkLBk7iE;WA=Eu!^~*Hc@@Q16QcqJOSBDNN`|6!QjW#BH>qii zJ}%UX=xg8&SGk6!PvbL350PqEDv)?dcHa{G2XAti9V%Cn}QZAO6LEu(A&>4 zZ@dFT+R%^UlO$Ee(2WrYq4txtT7_%oPcW8_Y1UD~bS=F^yO7>w9E>?RpFLcDKFM_6 ztV;6!?;H>kolJ3>%i0Tu^qA_TWi_~^AM`tm%SH|-R3pq}*~nt5Ri?$wFJJP9&!j0$ z=2M%6AhzU4z7V|_V=(!Zpg4=Z9?;&GzG*xJnBZH1H@W-~p|%s{wp#%&qzAr*+kZ`n z+q?-_zfa8uyC}*Fu%&tEdse<0b9JcJ#GTLG`&%kVry%cN&|RZJS&W9c-})9uD%VLe#^xl0>U3KVp>f_OIq>#m)s2A$4ex?wAQfBE@)xs- z>mJGmh-|@!&{CEYd~?p5TwVs>-#0;rk!^7=R}qFpl*4Z4Twg4m-@ISk6(FAHjv}-{ zU%X$umQ)+OItwpKFh@Oad3_d5u)$ycUS&+=dz_I_xxUyTmxN&?^FE&X^&}?$PRmt( ztsJ-&Rmq`$?jm*pLnUt28xLeJIAX|(OHl6IN9ub9R&@L-OVZ|}A$ip? zh~_G{VPm=O=eR0v@u5@?ln-W))DWJ=@N-&Pj|?uF zyT11g&fTvzHP@RLZ?a}qZi~hfo>!51Mh}S8S3{(b^8>;#FTFOIu}Jb!`7KRebnVb7 zeKEmEaa4nrJBiQA!CW}l7+Jus$V~|-|DP_S@b($AYm|A5pLp}|8LBc zBpDyD^o%H0x$gRli6CA$RCo10+F{9I7qdg0dTFsMrSOg{V&7!tTe`MGG zP;=x6rDbNlks-3lBMd_&H@hGFgl*gljEg$ zNcZSR_-ijsNB9fW3ME8?F4?m_i2J%nG334+WYEOGp1VVTSatJJCL+fU0m<8Lu%WG} z@cN*_4_@DD?8LpJr-R10$2-5Y_o3xugzUg8e1bHlby;H-e*NB1-fiF(l;j6z-A+)Z zGcSd;()F$A%PlYeFIV1Gmbr=e{mrWPhDA`udsB9(Tz(B@WA=1`m%8~hCvPW~BG)?s zTbj^XaK^S!A$jV@IgZJAygaa|HzG?+pCHA$p*7sHZka%3R~eyY9&5D~zGZ%RS#*nc zBv%;J_h?llK>@C4*hd;ZmVSnLlt_WZey_OJlLC4*DF-T}F$LY7!;8#esOl%6W09rc z1YTL~k0kS`La)0;SHy8p?tcn723QPV_&?Tc%0GZ9{(lp4MFU%7I~xHbBNHblQ44Dm zVut@hn7SzFNc|Q-;VIP0+*EzBDKZ$F)CKiygXeEzzJ+=J+3z))|c_lJdsB$g?Xw$4~HOoQ22m_@-@ zsl@ReeO#E-b69@rFpDAb{?YC@2vROp9M2nzn}|uhUdD_{SVe(xQYjxY>D@%=2JF~} zYm|Ayxm|XVvEU|z(9Y4Vy`|@aAYilRzGwT*#e(a>=ElBwpFujt;^qmwdfU#G{-_sO}Jqp@M%e(3@K_|EhD>b`yJynv3Wsbj>Ir zG?-Rz|5B^l0uavTkCf1vD7^V$MyP>NP7%s-iR1$cQ)y+*HZIkTHcB1o^l!tyIW#!A z9w3+=P&(Fux94o)Qv{}v3e;CPlx%lng5|R{-0xH z{QpU`ikp%|0th_WQ8Tuz9k$wTEIS9s{Qx*9UJ>E@-|^=BB6F=X(v>)5+l)*Rc!!C4 zd2#^(cza^u%S>1VjO=qtDy6cyH8nMh>uw(DQBdGi z0DmL66uG>#Jv!P?ItXD}i|9zvCt-9x1j|^CZ6Nf7i5s|=4*;?p;odc}*(MZFeAB^_Hs#Qy?zGGbqc{$dUtE&VQ zS7B$;ULI?2{d2jhnd7lcD2ti>bB`L@)jJ5bL-f0MGdSgh|A;1BGMF7Rtnrl1FJIxK zbDs|U#VZ{t(U2j_b^x!eZ$)SmCb;1zZpk|H67vA_KE|dp0LmBfEWzZM>lC-&_UJkG z7Z&k$o~Yj`S46q#|1=_&P#-<3}0h)tD(qq8y%_g75&hd~oeK=47enbEW0u>qxPe0ORzMFd8Xk4JVI6Y*}|Mrz`yP?n4|G(gh z*C<U;0f3x-0=u0D<@-;HM& zO-Jz7Beie3nx{sou?|!EI)|%}L@ggVhgz$?`u!n&8>L%8$ab`p=~b7KPVK0n0Zh_$ z2)BCI#}I3%y{se>Ury?ZW7z<&Tc4o=!lRG3V3eNT=Ea;1k?YGTOfw8qC_H8A)BR8- zi3`eW+}X2ZN|zkaI#u2FVaw$P+nssWK=orUM(l&o12C7kAcWBO^(2frgXgdr6< zoGe6kOyI>Ui%%fJszIXm?M>zLwsaBU$-p*DO%&^geua0%yEEbx&zXK+i<6?+MG_;& z$1782j5P%_jpwTu*>reTWlN6~?t`Shd$#1RZ!;Mc@=8KLCb^OzpG&jHuXAJLgG4oh<^ESanBM$vLGmWj>2Y_I3b>G$MZd#$d!C+4Itn!Svd|2kKTB{58w^)CjH z9p-Q^HgP;(Nxq1Ip6rsRgw0@JZZKqAz}{lSN=_%n+j~FSQ<9F(6vbmk%^yH_j^tp< zK9Pl%h!M^^Yic$GGKb&A5#uOENtu}p#Ama?!BfGNmZs0N4)NIb3jaPX-Cm+O|JYZT%|Zn4s#oHWTD39))Buof2_3dX_>zn z91T`81?y=S7E*?uOV+Uob8gct>9{%}vJ3?a>t2R4b4R0ghkpW%nD#lzj{j612*R}W z(G$;w`9yGnGjDm2)34<%)g^X8M!gk$%M?nbAFC>VqVuudC6wdPq1ux7QZ}c~-QVD6AL2J^ZL|sgW zYJyH}WnBxCO4iX^DtMRSNwzG?HB)rYNj+*R-4!>yEq7Mrd(Kqp%1nn*a;kTV$ET9X zz9>g_Wwim}RI$4XJWbV|(pg3ai`0b0nK?5>WtA|I`8Q3-9m%`FDpQ(<>n0p!R#|5J zN(fEc;!P{NqZuBK8ipL9vyKfKx~$Hj8@&akSe0T2vfQt;k}*Yu3hxmilqI^N4fXWk zq3Ul~hg$d zT5Xu6PT-183l%2HmSgGED6wMT1NZ0U{_zA6ZiP90f{%B)A>d{T-BCNwuqkW0SAE1= z@_ft*GfTG^)pDe7nL4|1mgWXbqqd9Q#7YgTvm^%G77;i!If1@X!WI||fLloF1Z2)Y zfmuj?T1qLHJ=G719vw4crb|Ysms5dUG|4Nhn9+|*la7j3s<4Uj#Nc3h2qXC+Y8d^w zfpT^cegAO}zf1&yUJ6&j@U?X$hb>D3m_yJID2b+Ud+%&z$%Y)F5bCTbCF(5yMVhSe zMrv)pNb0PRMhxKw!Ig6jHn|Cxwj3?eOn`l1u$6stu$2Six!K%V`dZDrC#HwR-a1Sh znk^yf;hzKwhaFpLo--{e7%3LHM0MQ0^OCh;B#QW!JNg}#aJ5IV7-P`oIOZn-NVJZJULfVci`ZS3?b zJI2rq8Ov_{!#c2aOp3GTsKz&_C&Hy~{G}#SN`FFQP?STJMU7|Uo)YvAt#_de=oQE5 zkzUB5RQ7&#Cgl_sLOL;y24sF0R2lY!!H5!Z%_^ft>OHsCRR$%fZ*WK=*@uuE>DN4s z+XNuzpv%S*V|SitF*7quSK98f$2!_n{OVaY9{di(im6~Cde$D|zfoGAr{{yMRdnL)17xl<3T#SQ#z z$8W~Wr0yLkX*zgkl^g6(QI}C`WUn1}Ze)HpuvZrJnC6a3m%M_=qKC2^MP7A1(zJo4QBeDUuhApxDY|AvYx4?4jt> z`nYMab&4DQT7s z>e4w0<2pxbep^wOHR4@PEVOhRnb}q}&je+W8$G|hxJ!Fp0~ObaPeOBBvBxiiqWTWR z+j2t6*QIoDHvAVECAXQueY<*{9WCX@h`dJ69C?N28&$0-Q$+BnywfSWrP`ya7aqS# zbL$3%h|V1;$k-q*jiL>A*!zj0LQQRNVjp^8SG)Ncm7X_@)Rx3_%28&q?Z`rZ<{Lo7 zs4k-{b4}HK1Yzp>l0ZG`8k*kx>zD2jp?f$J9Z{HC9kuRo#Z*Tn)2{3&0AgQeYDjAh z%WlzVH=nLYZ1*$n`x(*g!06_Nj2%yJ56L^6Dm}_hAJP-Lr(fp{_w^8*J0|xI+n2Od zPvQ%(`yGRK4^H}~c60IZva{An=`~aHz~`l=ax0&Ml+C^yk1MtniMVX=WDkFA8$9R$ z(lzm#!LSQrsh>t(JURc`=1RlsJNnxZfqM0?)ZY*hX>1G7hbQt&#bSXl$>is<7Rs|rV`|d8JY;MXg@&k}hNcl;%feZq_ zIyNGaWkv)H3fhY{ha`IYsF*eK6PR!3CJ5KogAp*LR!r;KU16wDL_ir5VN8!jKo_H- zN&tz{A97vzln@$$oWD2N6O?g9gHdZ8*S(T2VUMm$M@_RgMG5%=t%bj%s_GxjlFAyf z6*BE->V&jywlP#GQ(UVO(1>LW+_?a!?EBZ+SSXqh6B>kq{?=ci0 zIt3sq8^SetNLup#xw?MPI3&tc*`YiDETLLo6}3;u9dS;* z7YZ$BLd1F_{N0+*tvOX$FRb9;YOkuFRI$jifg2ap*8x>eF^12Qc0NyamD(yPf{-fj zNg8KN9na`#a^B$<2UHbLEGi#hk&(A^#JUz zO{4v&E=e?;xXP1#Bcn5FG+p3a)lYbzs3;x0OB!~M#CO(#rHt>-b7aAt4Cvy?%|;@h zPwVt%^Kl8YeC3n42bR&gmF#|zQF@-!iDSi<7C5O87sR<0vEUW~)ztwy0`%u)-?z2v-R zT>!Rj2v>Xf>h_EQhmj(&icc6Ku}V)g9tG&mBD1-uHld~wv`Jo}nI$c5N3`@Bw)Jab zEs4 z;RnEP&G6?Fc=?i_>~vCWZQ>X9t%3)ocw2=rtG<**k-G{cPy*YR8-{e?ONM{IDt_ViZ}<4WZZ6vKS9aOFT@2C-?Q*Mk8fNr{o)Eb&=yi4|e)}Y>v$M99ge}&1WO*yu zd&0zaW-+HOh8(V)Z4k}a@wc^=<9S38g>4-ij6 ze#iF=<-NyhYMQo)b?WoqRxxM`vZ0BiOS$yZBeeapYr2bU8Wbv>Wt0cf3fvWQMzr* zwr<+CZQHhO+qOsAwr$(CbEIwC&K%?By8E0`=9>FF^!LB?_#;YdQNLcR?6+BUku&e@ zqV}0{LyjNz;D;{8!mXH6->Pf0D@J~9B5K6a}vG$(=CHL=FwMU%%7&%jfV_j^Tmcf%SI;(!R6dI-r9ZXry9}>+2hM;=Z6X z<~0x(V^SD~EXGzwCove*W)>}fFI&cQ=_(d4VtXvs46~LY>HFYh#TuC<2xDCim{;?= zlFE(RqcZwo-?m4){z-{W!yBtsd_rU1$&PMICqHzL!qAU;#To7DF9MQgJzQ;OwX%Pl zu~@Oz_Vi$fZoO!+o5|b!@bieK;J=?4Wij@rV@Oy3tG+3udh7d+89#()29lvrOi|A5kaXXES+t2v&XATbHAns;Grqo6X99!p_3zoN$ zsxf`=+AZVD0NQA;RA0t$D+TU{@Wp{BaMHc_RR&UB)njVyY|~vskuyA>qGT5gHpMlp z*^(m7mR(YWe{h8oE>vfZ7XNWoUXNCHN&1@omiZ3)%CGR^pX4d?;-6RQp!Nhd_fxFAs&&(9YMSC` z&5q(r1=fx+wx(1+0$pOx$2Moe(2=>&M=jm02hKabdLH<*Xv+WRUmAEt?FJ~)PpT3P zBme-)KUe4fa3~E?8MFIwDCM1Fo*fJz_!Gh%gNI|>X5 z!iKT9K$oxkoKy=)pJIM@_YzcT_dvTnXEQR%g$X#z^`-M!qp_vR<*{8gd#)oOPzIEm z>`-xa9^?FOA{9;`0U9uRF7>~aP|7!KvCNp&0wi5=^Ou?Uq6CV*V4*FlO1@;g^7WEm ziQjsU&gISDEagdysa!Ni0~Pb`oc;>z3H6(-ub{%gu2nr?FTv$?b}Q2>Cs=zzz|ilt zLnK}=+sqw~ZAAg)>fE;G2>v=ng_^@c3t-|cS&ZIVU`TPa>rH2bik(0iA18^WUnJg( z!={l(gzTI=EX(Uc7EPS1O2a!#zadJ=O#& zHt``o-iGzf=9&h~01Rf6A1m%3}3;z5?rNOJ=4iyC6eIKop;w zstwN^DIc+p_1ua7BFE_8Q?lZ~41_DSlQ|Z)Qpa7>!1S%AwK~qRXh==2$9{JBJS&hL z7_H3Ik*cH3q&AVvV4Y(tb#v6u%jr{SfU}1R@V7m3VQXEUYDASP&Nx!_@qmZ5Uu`yC zY#5?7pXpR~|A0tkrd=1?T&KHW34S~Ag&+n3t)#)me-x3~BOrd|lQ}Vv?SQ`*tNMg0 zyKl~L8*o+W#wVi7?MIK}4|o`N&7AE3r83sxq~e$q|6p$`c0h@>BI9>_8~Jmx;SXt*fvsvol$ur^yijJrgQ2<~Kk`+e{S~Bra_Nc^VD$vZzR>BR0=c1QzpoK# ziWjp601N2Xv4qv`2rWyGcxDIrVmvHxslmcKRBmm37+2s@r?l(*>?0+_(Sgo&S%E!F-@mfoavL!IomWTz3Gh|pKah9c|+tYN*f=eMbWR0ZN}Dpa-R!% z8FYSxFJX+7nVL!Xy(LD9hN^~AoxTnpNKGbFi~ZiE9@V@uBZN^cqwv25KG?AX-(1zN zYY_$QF^E19^V_sD-xin{fpA&*-RG(EAz*&uu zG=LS^J0Y_D1^sXNF%9yAFYm|V5%On-68>X`Dw{gGn%Wtg{x1wRMP=0v`A2`eY&Y=EaCMYiLqTS3}%A86<-b&A6GNvq>PRKoT2)rxZ_dAgn7HQtbI% zW0umLI-e%xK;8`8nMiNqNu~3xLSpjKBEwPoit-TQqo&%KMrYnEyGZ(0Y3sa*IqyQ- zr!%5bZHyX*Wz9La!~54Ld=(sZ8q0EhbRj6l&0jM`)7hPjTmz zMN4YX#_WLfc8s`0DbYo%w#w6Y2B3St->tL4Dz;B!1j{@FVtB~u@2h3!RhF@9^G6(!ZCvjt=aq7T&`3+dYQxA)9g>`s-AEVAKc|{!B z*xkUC7@e@#>*RxSarun4tg%K9KKB0G-zy!t+72^cZE+1iuu(!W18${D#tF36X0aGcqKSQ65Y|Vit(|0L+FG^57E@Uc2bXW z$m8;JR?^jHG((Dp&=->9TqE{uI%(c!rOGaSs=f}=Xk@i6S%xUCQ4tIzO!F?7vGyGU z{Lr1Z=aCiez1g`%Jpo)gBM`cVx>|)h)t9>#BYLN~D9?0zhYW?$ADEGUFR6Ek(|-Xd zYC-)22WOLZy>;iev`3U{Eq@%>Ur&$kg0Sa`%R&C=Kl^cCr;(sg%b%YNMgiOAeIR9X zb`}gu-yb@q#*kK)_zGjfYBz}9H;noh$i3lZNAJfb%+@{eSl59y74zw|gGLggHjwVNqc)W0tYVYc^8E4`U zA|%RrPv-v}bI(9@FcI7JxfAESAuA9t^f+7R?egxmf89K}?aS)};2EoqrGdI`59i~{ zJv$o%@RoPw%C*E;VkjmK5(1lB@7+5z1sk%_KmW~;D5yA89=Zw?k>5xbpQGKxR^vDK zp#FhQWxb##8cHi!cvXJcWhG-k;GVb- zv$aE7NDmr|a+dAv%elK&KE6??dQZX(+Imc@$(nZS$WWoS-PxZ*W}&IHL#>&s-f;D- zv`5`h(q4jEf#z{it8;6qe7UIIT1~}%2Ps!{P@xc_t>T*sN9nD)aan90>wQZ>P2_8@ zdU(S%bQOG?T=Joj21mFG&(nj$V%3`M*irwv)SAc86mWUQ=m4n;Mt2w)$_Q-FV7EtA zi#c8pribssfnN@(-I3ME8Qs4;WLV+4s-I!go=a>Egnq1+0+twyN$Wh!!VnxW1+*e0t5yO<$3^K~ROSCN%EhMG6TwQxWE4WVP9 zIbnEq7bp6$5u+vhLDh+W^>DO1SE*Ja|K7W$bNMv#HXZ@yx#f)Jvm9Z{&_ z_}&bc${?_7liGU;lGCjD(AcfhXxpvcXbG{|NDO>_nVu+1@y#*?tgfd0sicz0O0ar!OMF57zU zmMG_MY^%L2QVtC&!h{2ajYtUN9q$JzW#RlSAKozV)0hKgpcIZ!$zV!8^5@E_r) z;T|7DfksiU?2jOH8;gfJiYsC59dR>H_-jpH^iz%|XyQ#lKGpcHs7LR!uO8e;UuG08 z$x{wm10dh@VTjV$-{{64;)XpKoNRKn>+?+H6K?F<=X+|6=;_q-7UVU-O(dJz3!k{Q zt~U^dua1MY#=$)z80YN6mxcpGcd5EG@izFe{-s$&Cqt8C|0~<}HP6)Kr?(t`o`0q< zE1UkO$1J@JjciQ+r?o_7xS{+RP^7<6vr%}$a=HVng2+84g{edf%7et6?*Q>cmYN26SU_!e=h#{d>AmJ#8>25Tx4f8a~qrfqU7mhj!9gjb_!#-(uKtpGk zMd7gMYEjii75{c!-W)vu76m!tP$iQ!*a~biMq{o6Y1_x(bFs0$TP(&JrEurro%R;qigz#dwP6yWBZ2LC8wS+ouPJWdP>szF zB$$la<`GQ>EQr@Yc$xx-SV^vSYE{0j==aq`HC3ThmkZt+H93`cop$1L%5~X`=J#;0 z)|2WSdXjZ#pj8xdrEAK$)0>J36eS7jB=fZ|eej`BySre__JzJWd?)!#e%CAFNDN<5 z5YpiUfS$5hv@?>1a^upM1l_`FQO{tXLanSo-gB=|8>QVHq(eB($Vfx<)CA(XLexUW znaMc~+znh(dll<0Wf8w2Jc~2MAu7X7_Gt)1DkY+p;lNxvzkiKsc&GU(#h)^v{gjF9 zpJj4!GBvanws&%Jb#O5?`B&t6NIbv%pa8~bUKOYes33w060)mMGy_G@Kz%+LRw3}D zUotcvC9P%M=)ij1UfGYkk)wmd(`7sMuJyd2G0x5R=hkh<*5=qFv_IG+noP2bhNK~D z2y3VgfzL!v?j7)XhkBVf%vChu;>(tRqxy3@a^&!K(Y?d3yFZihJjt~xw4p{N%m?h< zHxBL^w^aI_Lnm%=12*2k1M$}q>e*q3y?6AUy9JWHhwCQ86R{ubzg1S54Avqw7Zynd z#%$+aha!-I4z;yqP`mrk6@ac?CH&b~1x{N3vi>s%K6=H}!I~CLT0sVLH1Z$72 zNBsoA*!_H7fcw9SqGE4tYG>*7e}iChG$A##MGS0r8RnQkx4`peSi6A`3;O zDO(hwYy+&|ZHalLSV+=Aq-s{wE;Vnn)M&L(cYlC*k#&2GW+#npu3Em(b*$Lht9&y2bTJtMsa_cWB8;Q<%W&F&%?9EZYqgynI+ zv)Qmt$6T5j`aM;PH|#LRSQ!oQz*;vhE-0ZZOI2r$;KT3L$xnKE1+6iFaspgi!(}D4q!e^RJWhbms^}d<@|_B@uh`_0xvo% zc%+V6LH)30jqZNW)G5QFv zK(f03tnb9j-!T>-Sw4qgULoxoJ9}dXj$s1sLNdWSL5Io$>_d-iEqy>-AGp|eu~ZB| zH>XmHd5>E>h(((<@>UTe+_zvh`5NL=s(=9vgtH$&gIUP9h-@1sx*mtu}LR6L_ z_0{jk)5yReM-5Axq{o;_fBJV4UtP$~nmtL}Pn8GC_4andG&+_eNJ_ zyNxfp??yF|NWVZo&7Z_(E1jAdM&rjsG*`W83?tInUN&i-qOiI{8i2ykMeMLf@i!wz zupyrD7nIW^FOg`PH*slEo(+K|{*4nIUUDs*N!zQCjLL1{fYVOJu;v?_>XxK$0@b?#Y+kAq=paMC^q^^t3nLWC#s%MBR%m%A`jd2M;$^pm~5s>L<5-v$>h>IFK)yF zoSeM|;>T-WxW-~;I-tsbY&A#$LYhJ{PxF=y*gKV9f%88xMByU21&a$TM9Cu6inEtE z(zU?CBr?Rlib4EXc#{zu^-Wueq)oMP56eb3glE)Ds++wraPZocg}U#N{)~h8!QDF}zj+SN$?wGxb%~STL6?h9(A_8`+%B0V zB*)U-(+>Lr<6yKzZDRv$SHrgxL~74%6u$&q%r1TOU#NZbpPcv_pp%FqgmDKAkXhpw zcRmO3NjP8XeFytVxL>Ax=**i5$b*T9#$CRD=XX6H_>DVUcD)LhYVS(__QP;21L+7q zqZudaghYYrixJ8b+n+71@3469nok^CP#T+8lD65@JLjE_SdC?L%b*RJCg&qLg@-uzVUC@(N6<}kYsunyljrU(MU zL>G?;m2!3(d<9)Un3g}Zs)FlBTw|VvCUaRR{%2}J8vA)MKvWWwwcY|D9&V&82M@Xe z$9|Bo{;F^P&V-{6DSH=U_V&n-df@#Le=peZ@BW@h@nft97E6L7BkQU!e6d|_d!p#$ zia@2ogNLyF(-`5af#vrPGnkL(j=QLS+ zNB&XAgC4C>!727$34S<(HGnLi9wMZ83;DmUnuXE!X)N#J zxiQz9mS=mPzuyfk#Hr2F;yGr zyS5w@F2PLhCm@{!Pf-S(DJxtyIEhgkWL!ra#T~cvDST_$72oJBX!=S@vtopm+_QL= zY4YU$ao377(V9!5E&m->!yMX{l4x^D+xYzQYmLjUhc%3y1iV#g&fNEVhV&Z-xma%N_H(ldEuLd+7)^k*tA44dUwu#f2udj(Q-e za+QN=>?=)bAR}eVOvzWCTe>*P&=B1#g2e{3oP$kxQK~L7r_w;;W?CpI0&U zSfz3Er+ePL*pBpiG#$F0Bdq$4r-#e4?XyINQE6hSj6}8C2d0=bP01GUh3u8( zqrT}4XyYd&ue4a#2;_{sDl@@9jwWUA(WOqy6`VEDQ!L1yPn4Dm6|O_M#VU5%6{0yC z%kc@;$j&6Y*x!8WGcBM~s%^^WVA{2v?dVH7m340JmzyNXKVP`%i=E{_)##MCcP`R$ zB`Rv)hVXvKj8;^uq+b?}4)|M0(VLLm2HR=2a(UHts4+%xr+6DicYJehH~(6Sy$ItC z5&1g>lCPcS+QjPQ4H?RyU&^)2I(>=ax46vhgGE~ljAZK=&NZ(+80 z-HCa0>f_b@0lciK+m&apXpG>bYO2n)QEQIt03Y6n8$n|U4@V$1F9P+)^vDgM|O+hZ9~3TKzg)6 zA{_7>4G{7J4-QcBeohS-bYn=D!yO0M)Ir#G`s%UoJ-jXan=#-$MVc`4I{^<+>OEN= zkew09J4UrZdJfP(!&Ymd${B%SOxSY9o@a*d9vIa9SZr|C>mb#}-iI))^s`1`2E0|H zU~I_P>p zds0t_mL5F0a?G>+#~x&k=KEAU*j*8|L(X?(Jm~C)o^K?%arFBkZ)AGWw+EzefO?Z< z`^R4n-GQqIR(!~-cVOL-_yOvV9cx2zgVt|CI%8RPTswj64)`xl{5!)z?YZuIw%yS7 zr_%Ruy+F4IRd;rNs4w@=?GgOJS?`Z;1iwJ>_w)AA{;={*{_P)o1K_JI-ba=~UMLe^J~?PpJZe=9v0YD-3aYjxu4Evg=T zO_9C_K34lu=z!)|V%r;=B>NKaMCnt=9iUH%yQe;O{?d8}o7vcd>THn@RD2q>C{(h- zei{H}$cVgxRI%5QU`n}`UEUE@5M=-ARe{ix;icXL(QU*~c0m26ae#cb;6GEpk*+Ww zpmGzmSsI!RohmPT0Q?B`?ud`T=2Js7p}tM}1+NPDK3Vmf7Wzrf6jP=MFYS5IjDzQp z-odIqle1e&36)VwtY#@PBYM95 z>tMV{1)DO+$RAKkN{=psY6EIRU&X7jZx3daMmvDmmss@}ye%+trMr0}U2|&hD_!vg zoI@Pu_fhnA)76EV0uCpecI=GdM1!sRd3D6`Wj zpb%qnmqA-NAF`(+es$=&b$#99b&}0k4kR z_PzYe<|bGp-9PGQ1OD*CNs#{cE#A`3T*%eT%+%?BX?!6{;&Y1v2)>tVkdUR1ipWCb zAxK{K1>wKB3vn1Gz+eX8VucY^Q6jLz-3la7AOrUNhry8~97GP-3HNGn69I(AAEvKv zuCiXuPA^~K^8ltr83X(%h7FC(fSMSzMV*r~s!|_~((?phLNL%s5X1#->7or4VWL0_ z!!nmEpFqIud8~4p&6a3R@1k*g&AG!ou`0S?0Tq!LChZpQGx~XJ`bZ0GE{wAIZ_CyBRF31zh(^Gn4rZF}2t*9Y zxlM z+Vr4_9Ab)wv*IFSoC_*{5Lv~>X6!PEV94ZzOV+Tr%Zx+#65{qf0*HONcG5m>6+-LaM=0!oh;SogMZEJ6?4j>MD1;*Xoe0lVW~9~c zU121P7Z8#JD&S`8 zc}2?%Kp<#FkYalwW8`o%sUws?Q6zFK-tvbQ3J1oW7l{&q3x5E9qlEz6<*73^=IG97 zdo1-)cI*A}dIanza`|8cyPQ;rc^1M7vAHuQW}C2W3ZUf^`C_P7?QMIPY@KpW3c&S) z8RO#5Y)~fYI%?IHhzj84yLvW8X~kMIH|PUXACqst(kd9p zs!!B)YXhS#9LQ<@uxZ3&_RW^3KAdRp(Gpg@)1M0UU9y%Lp@AiC9ZOn?wUG}?*)et_ zp@~S2%#83gs);vcA=@;)ynKoHebFNDvxyT2>+%d|U zKa@4AI~?t6ptpM7xK~O1xM8VDF&pj&1g^n~HqbUESwJWlB0(+0U6+IP(k58) zls?Khyw_{oTM4aMI+`EJ6aUIlf`eyjUMe8n+{}{NRFi2Y4lLJ6UU5ybiF+NkHBD&< z7Duj#7O;^tT~xGI*11zdDdW_3f;Rv%15t>|1h@!}9^n862gZo2kH>;7dSH!YfiJ0& z8u-ooOeG_;B?FTW8wQk42M2!`9!eP^Cz{AuRmW+~?p`Zzn$$2IPYx^&YylqNLO{j- z(bx|{j*dx=q?VSUk#;lrq9NG@F=8QUno9Y;N?r``OnrH(^wrnesNw0T$IysS)Nz=O z+LB=_*j&b)!=W@H zEWO*C2Gqg|<`pO9(dL-*8POFrT@$E@!3dRY{6n!R6eEGS6yjMfRrq(<1DN?0BV9Gn z(+#evH8CBw_lbIXY8%SsT6SqElz&T5bz4?tX{BYVC;AI5v}fdQMV$h_ybCbTI@|kB zkWe`9#>ZO}t;#zFF^V^_!Dq7Kp*hT2-^iq#_4Qt;e2wNcG4>G-AwO=JUszzOUX&w= zn>PCtNWK>%iZT0%pk*`tgs{{*7}+WLylt^D$TV_+DHQn27Wr&g(q+C=8%h)x{&-QN z9cw53O$>Ny25 zuWSu-c0yBjg7Xs3oS*)lfxd|*onn`MNPOA6F-;vt*)>Wtui-GvGNDihoc6y%5wELuM~~C`(v+poVeM!hJ_`+M@@DGS%TkE z2{dDkTSf`urZrvoFg5UXiCYv8HQc?dbY-Y=aPAS4w0Kr_6K)vGTAUxKm0&7jvK??z zaqT5$a63WvW77kg!19*bqWX)f$JibZ9kL4Fee!Ye>7T?_yk@((ch{6{BTa=ZtjuAe z+iHcQ6(1PwlfR%%C$;!a@m=w1+bICN*%}2jHpg~LFX)T z`^FBL_4^Qp)Q!H>g3V((wT>0- z^?E#?z{|JoLk(qsLQ2A(x=Z@%`fgTlj~D0IZvkxtDFa2vCppjp;Mc)uMDVlxFvo^C z5CtK~J+JBXyC4x?GgoUgFIgzoUZ%N*P4z*EP47J|nJr2vwG~hgqm`CCZ)m`(t-U0Ls$}cXaUKQ=?I0fn8q*|;aD>#O0l(n_iuE9y zz-UBqc}t@?MFzA%_IXtUv%BNZQQQ5gmOklBB=iXL$gM3(gFPoQeLB~6^&2CLo6VAv zr|Wjy3qJ4#W&o3Tx2R9b3ZDjpuIO0bcaYeo`;PgSx}e56(kCX^!4 z8lW|ylQJlINvUMksMe~Gv=XnMo$N7IXg<41X);|Zu0srVDAH=@)mfoPxnjlxHY?f8 z&Ow_CgYMdK4qajAkh#hyVG2qy~i*w_BbXjzZbrQ=zP~8TRW1TpL_=kXK zWNcmmb#ksi!Xey-eZU(*EK~@eU;w-UD@Vz5;)%%U62teChq2HNhSBO2Baq=3flp8X#Z>x$@gU;qvn+k}1;ZKH zR^4+;V3$0+S2WoQ>+|;uM8GKyXO2ac!HR)vXWE%dZTw0Via>z@)v~*Ugyg!Q4W&`? zsFs9LbF9ewumx|-S0RYt8?uuC#kE873rB@`us;-*H50xduo!QK_?3fEGaz=(G&gSV zBTBF+>jtD^De83Xez$O$<7$#n(bT$y^TW7o!Mvp4fqRLV`v>aDj{^E!O*IO95g(>} zwi8%WowZ96Chsm+P5O;kP+Dpe33tev`CXnLlJSjq;vRp$Q`9?RYS)nQWAs{uUWAJb z-p@HsbR|cArAH3SiCSl%CkvNXk*UwaIc`UifmIOYyobI*czML>JEZdorA59jWb|Ei zsuj9z-2v{6>k}3P&(w?cH3JOSx#xT1op8eWH&-37&)Yu{`id;y-fJ(8s~_*f5!n31 zMH%wER?DzrWFu_~p_+e66J6OMx?M-Dky`GATpJ(f}@?c5-ykcIX4E;ZLv9uxQ1 zF4N`r>-3qs$Q%AQ?0+AJ!R9Kh34geO%AbeupO;%tJ7Y1!AJd$FBLlt)U2;PL2-!13 zXrqLLgn$7QXC4xcqNpg50>uQ-P(c;+FO)b;=11UxbA>{Md%$NE@5sX&fLI7KH&;KA z!smMYx%vQC#>+ye)MTAxUcqWq$fQL2WEGLmBS+x^&#zO$tA17R zkfQ+$RK~xz-Reei9Eb|cW79~b=D@i53fLlrB`rForWU`i9XCe9PmIMX`uR9|2q2&86O3r z864&344!>;b9xyvf<{$&KZUp~FPPols{l$uM6K09&%k6--?zKE;SIo>!p^EvZS+;+ zvS7HFsjCkrdj)E#*YRqRmOVxO@AvyLSwZpk!(;&b;B!R(c)zN4#ulc=)}|(s^8aEo ze3LhokpBbEzy`-i4=Tn2Mu(>ZBMIK4fG`R~fEGjwBu_~)g@(+~-2nPP-}bx!K7rBH zD0M&2jx|g+UaeP4k_=1P-pb7F?z+5ApM2iR>jO+1iVmRIO{S|M2q~p&4^EG#t2$u2 zn@oc`s0#wTqJTK+j{;-Dle%bbsbr)cmX=_B%x*M-oM!|pZ2YFpI(Lh;gnRA7%<*_V zJl*mSZuL}EzXpZ8Kl|Y0Hj<1vFELqRQ|(Ev^iU!0Xzh6D?1#4%DmCJStg$Q_Cv~Z< z;+o?)=3#Hs)FYOk>r~9&&Zvm&IJIecRgoUlKy52RfAQG&N5AYqI$~<0QA0`()v;LD zH;5ID@>QMf+Yg#AeFu};l2b1PFKi&YkDSnSWbT`TW+T-OQq{5kC@?m+T}aj~7C{a9 zTZHJj61ld+9Ai8W`w-U1MvY@rFI>kf#R@4cR+(yOT%5>?)6}o7ipb`oh+Za|AN@{% z7Xa7t3M7Znqk(ebh@g&uTsZ1Bt^subxv&&|QRz3#vTUuON?|x`Yg2rs;YKn?EEBin zILtR?lm`Jx&-Dk(ygl_YwP@2SW0h9SD#|iOQ*E?f9afxvMY2;j!ni8a9m_=km+aSZ zIoTYB*XTS8WRh#!R#J&kOl@hN@L|QU)4>U=E|!&-FvTI!uL+!)oysnET1CX=)pqWA zhm_tYgl}Gjrr!Z_UhebLVRmnpTTxRcpW{stXdi$D9!3|$#msMV^A7_lFG;F<#N5L5 znlQg9ln{*(gr7b;YJ$~H$hEtj(QZAm;ddCuV+fg};|KELcPYf6&^D~o>e|qO9&kDfG z(9MwE(w<(`&e_$$!QSaVER&tFy~)p={a^hP6E80fq=+&y$NG1;*fLY?CKy6lLP87E zZn_^qJDqML=5R_+#@^(QNM0E{LNk+Av(<7~D+H%phZ4)UkV{GN7%y@VE@Bg|*asiwcjHAkk%Q~|cP9r`UjmZ2l0?6( zdZlfAuS6((*1b-5byeyEIsO_7VM3C0l)j-2QT-}r)>z!KbRw;d*Z_J$(PF9w zGpc44TWXjsb1@M@`2OE&EMvw8pa z%oU-GfE8k^_od7(xCUQv2G2nYn1wtqJq43$x1z|-u+6leyDeFLqa$>r(yhP>_As@V zV94A_ksWs_vDTk1CEmP^N*Kz~S^bG~W5~XZDlMor6c-z{k7}<-jzX0%hImuFqTK63?#dg-k^A`^1*|rg^={ln`uLBm2@B^U6y(S_D&n9r+`Ge@Ryw86zsRx-u=x4`bO3-B zn*S!t)Gh7gRQ}_2r|jwMVru(8IA+R^WtO%m#-E#GQv@MNOJz|AwHhg8irC0VTht0* zT8{FS)>;V5hy{?Oy`6)d&6SX**vj_)o|^yPIIAjh_t))l0#L2e&CT}r>)*fMpWBBG z{Pum={azOi{3i$M^nQ;+{dJ(}LAxcICu8_;i(!ELN>F|(6eE_VZ^_bL%2;hO-rbXz z;*5T#MLr8C5{IwI`3hoyn5YvL$T7*R@-&WmPBXQQtm3l3i^0IeDS~WMy)*j25e5&VT8xJgs`2=@} zmW2x{6P%T%ERtfZOj=Qi3f5DHTo3KFEJ@H3zj!svpDUk3GL}o$1u|hl^W|3966aAY zOQo1)Gh<5DMfNUA)|(Yr%g-0ye65%@H+5ngL<2UISSKy0EnD3Rjz$(uTtn4aJyn|m zxfcGT6q%`DO@dPq)4*N?Q+k;+ph8^ zM$sYobIw)B4M#N@bk{}1XIir(%bFrQLIFf+*EKHnWE5-e)F5Bb+Hx z)TBrgG7#s?4lUtY>X9B_)HRBn+7ZZNNzj)kn4_B!((&h7hq;Zcjc_A?4@6S;?1|SeNnpYxF-s3WDO6(n<&6)+aXOeR@utQ}IIqH`vohJ` z$zJkB!fe-?e`IAed1w8Gq48F&1SnQw#BXgFWNc51DKN9)q{m}`f_(^<^!d(I7HehF za}ToR2Kc$&0f_p)ir{!q%(>H%39U)!g*P%#er$fc!paiP9sPluG?MX*5iqiRJ5sn; zeZJkqsj?8rR&Wibjh3|R`mMY>zwxBa!>#Rt(4%O+W#i_eTwP7tS}bF0a1zP}J8=KCD527+kPUlthAa}r}Qr>Yc{G&MB}g)cQ#)uaAlP$;ofUB@=YDy2!4)7 z8xX{7jhAn9s{2}7^9YA05+cMH2^)vof=RNMY#==%-M3~$fD&tNs=0s&o%l3U48^0! z(@U5zpSA6r8~^Qdyyqke4u&vnDOeJhp&P;S?2U<@ zfZ?CIGqxv9hJx($So!%C^T`vvL)u_n5kL-0h?imqoR>iq64O^b$C%BW zg1r{~>#lGh4%6!^?6^*-9ry9XX@_ZH)wBygdcr=&_A}Yr{YfP#gRS=pB|9kO#Is$Q|QIpu8xE z{=p*v9nzlfvY%edF9BQvOQ~y|e)S_U+;HUXi+q1B4O}FJu*xBzH^G-b6kyGRyUG4f zsasNij@A$>1uIDY(oIFIIeB2UO(+jtWYn6-(#fw3Ynis1MR}}@cK+(gCH$2$ZD(TO z*DYHIx1iJDbg;Wz8uEy%0I69+!*tP<$c|0UcGockH-)fc%8XhtnB6I-QY3Nc!-T5!`P1-{`4n?>Ty zWC!fRr^jHliTbEK;*=9;aT>E5Xi5T>95CH!W-Kd$Q@Yhq3i98EUdrE+s)=Lc5i&oP zNPjKkg#^UuatB1EnlrbaTHoz?Mdf@FfstFAqUx>xv@N6#^W1-@Q~rO1y;F2%!M?8@ z+qR82wr$%^I<{@wwr$(#xMRCxyOZ?E+H3E1)?Qj z^0uC0RjTdyjzZ^?WptS_&2b#OOX+aAt!C6*k{<0WgVU;qJ{X_85@9`%kg;n0$x@fQ zHJ;JfvGh7qw6pVSOoujB;#RvJ8yo%N#||0Dm%xXf3XJLLPy{KGrjTnlRxjOWI}C-9 zy~LKnFScCr# zmGho3q9h!{gj=1EeTFl}9l<=iK}EPgBz6|vG(I+zgR0^8JNt|^Avmgr^r}X-ONp80 zHPK+iV_G(b3YVjOLDl%0f)vR<+VEpQI7S{!20r z_d$W14Q3H|%#1SX$>5FgD%w~-M5JquJW<8!g>-~DgX?BPeZ>U(bKv@mX)(Gr?g{KM zqospiFo-K@In0*&i&O*R)k8(9N#fHm%?lJ!lfizVUNl6C75iej6065YZHb*=7Cs`N zsmKUw;~DuW8|Oh1n+IMMgMxt zD!yaMzWNG+5fB=G2r9mXht=hIfy_ae!PCqg+ic8HK9N}t^JZxiWhJLkyQy{o?K#CD zq{DhtNM_YbY(H@+WJ#t?;1uq?hv+%Yj$=IWE55Opn4w&K5!R&B0b3kdo~UNjP!Cc3 z;!SwAyJk|`yDVlMrn464bNIGcs~5dXD>bj%QAsu7jKko}k&@+m_m zBDdAxdX!zHdp(^I@)v_bkp@Le={wYJk?lbAcVw85?#sjiedFl@v9^R=8h*IbGSO&p z%WAjei(>5V2-Y=k3~Bqyaoa6CQm#g~WN4EA0Fcz%y*U=~6=m121ay{{BO1a#v@lUp zsciYB1jA&#Aj+QQKFC`OI}N{4I`n>t%C*`tP2T&3ob&FBK`DEbE)92Rdx<)Btk6A) z>h1H_Fw&YThhmC~n73E9V2~2q3#jWxh&)bpK&5lmm%~6cd+f0Q9u3W@Q}wkkVBfZu zJS)QmX(Lf2QoV%j-Un(%*GP_ZQvUY%O-TIFV_$vC9`s~<+j1M^+)v@SV>uuwK4%lIGHNU;ew;wgUSgc zb!2CACx{y?t;w!0;I|(>>xidCG$zg)d-K4?lzu9=H6eJyBmX3g7$-}sbs&@AKM+`G z!dwV2A-~a7FOt|cCiikdlK?om_lAc02vpLK%Uu%=EF6s#Uzy>9@#YCI=?7Wg0l_@b zNtg$iQK``aL`rGC;En#;-!fB4UD@+oW|ferZ(dcg{Z$VJM#oW@=i?7HZhJ!ZUwWXZ)*haK7FMD>$I3DUPw%UXStDItsv%e@@>_v!I3 z_{ZsN#mMYNV!J|%oj7_&$X_$LkK5g6%`c2PJ2JUD<4BK;B73AQPveR6oV-i7S=tA7 zT!o}}b`l5MaUiYVz9 z#%tJyQPLinFhxl6-2#ddvTHYcM|4r3GqnR^yh*wg*Jf@pTv7FjcxAR^?wu6rqt^I` zS$Ji-z2XuNJ!=9mJ(@6;V$&N4Z0&t}qUdjN%bE-JxhDbQ(r?0|LPnut5Zb5>C-q1l4K4(~HURpr8wsy7?de z(0Aa_Ct~qK(wYbbtUP`*>N{-EMNHXegCbx96|UWe?_B|!k35>!#N(d~tXBq>Mg2;r z{fDgPA<;kj)2TpZQeanUQD3Mz2-FF9W!nA2cXRpo%ZqMQiTyNy)e6KdoljeqOf!QC za%oNqB+4C42jnJxwQ|K!T(h*0rX+f0Rokg1q_enY>4a|OjwYsm@DJ~KAPjG!;0$-> z&>GHLnP}>Q^|Kc&BWs2UYs(9MMzWE!Tk>eDcn;INLK60J))yt&w@Ep_Pa#WRu9E7| z(q%oL^^;G2zsE4Ki@h=Di+S@*pi~xg zq`h3x4n@2y(mlS;iC1GtaLvRu8fiAQ=TlQ8MQb^p?W&2xX7Q(4-)u|@Gqd_ir_8nt z{&9L2w1(O6$;osNSK*)6+s{a`S%$HFK#WepF=DvRIKZi__epB0_uEd?Beu9MosjVOk; z7Js79lBdVWwa7>gY{156qtY+_H#6BenzT#pV+93wiaXY-dt};>upH?F1kew zA#d{-@+X=C{`)tI$=@)Fjll3ptwN?4BJiMoTL`iKI6Dw?`M7@q_rfD1IDvaf_qS-- zq?_rzgfzu&)YH2n4=dJH5@yVY6Hu>TFKWz&Ybr2x%X`Dul2g3A7Hg1GSM@pmK^>FF z5`pJ6_pIZpqxuNZ@}ASR6`jf6x~Tj~dbWJ_`8E44s(KQ~t`aRcVh0+3+-6!0TFok| z^P{NmCW;B8X$(qMRqiB_Q1J%KjVY=_@s|3JEQ*)~A+rfvn*5Uf(Xy_DKXT93Y1>io zWoh{epHDjx@IO~A>-1sVUF}P@wt5L&XP7m%mH9kgVQT-%58ccxB~pN5*Az5qYPlM@ zw#J*285g>NHI->5#2Hi{5YZx&BX&hoCrx=y}| zf?A>2&Em20K~#GCzN=lT*>DOmouf$qAb&hcc-eO?g)ECz4IVd@TFx4@u*r@MdSm|u zfpxm>di;?)-e%W^cucCF%ixYqos8Q)tNcMmQ3@YVESE5r#1&3mb=eObdVs^0BikP-Y%tJCaTw>|X zLsxHL>QuO=1~7zM1xZ*PeHYq=(qC1bQdp;sy5w4=tT%VMQoW+VQ6aY+`*E0*t(yGp z4pDBec&m!f2fB9AzgZDf?bq!1VQIZyY{2DCTRSs+s#$iJ3K`FMK)=v4u>?uhq}CC-?3wf4zX*o2p^b-e)xZ*G~f6O46etT0RHoSojjhCgKNzoz6cMYl!&w93r61%+c`s7BLN57Jwr!MG~uXm}i#De`)`+)?)#$Eq{GmL)6{w{tQ}CKv#-4Z7df*}nf7tY&jNt6lSovaX6o_AixT?4|Pw@SG4{61S;` zTM2g;;M2fI=zDlHfgrWW#NL_XJV>C9eq*<;u*0;sxTfoeg`erMMArP1riP?I59`T# zBDMV9BtO(BLUM#%g6#C0O4feirTj$$v6F!<%MfSg7Hd-xY|}WW5ucs8ZTw_Rmet7) z*95~HhsP+53AY=|nQ=EGTHeGWXZ&t-td6Vscn*V`sarF4iRYy>eZ!dbE$D&ZcS%v_ zKp#VHr0wg}2eA9}5S&j1ya%R@-FC>j`NbzHzxIV{Fa&o%K_5_ZcYS;d^lIe#`>}J) z57oYjjdOuzzi^sPbRSw>7z6ZSqtwolNPAi7i{7=$=J84JB;<0WlfsFNc;jMxA=1QZ z;a8OkYn|XD_)4E}-!#sV&Kd)ysss}CoL~cCnxp%=toZ!>hplj!P0nDY$(;M+FpXxp zRSey3A4~H~xo%k%>UG|3IBu8Vw6}`|Op^Jn-$6>O^9)jOmv6}0xaX^#7xZ2gG6>VA zn`nAb^rH?%ta0XL@8&0-Zkt;WUwkQQnyP78?Z{|yYUG;_%N~gjI}}o(D%{PilYjJo z8X92-=5G-~40Gm~yMmE>kPyCCbX~8d_5bTB-rDRoq00DbE<;G z)kD%5{C-|Jv z)K$2gp(ko)4wsB55?dlTne1gOW{9SVGa^he{-|uY=5Jkty~g*M*|^`QPi$bXVFrM^ zt-PbQs%IO0|3*Oh2GO7W1)BuEu)~IhOuE}A|M%vW-N`EAc~LQxK|#>?V%j-$a4Jr9 z1(n9e%#f&T*Ax;BH~gSO7nyD2`gS$6d-Upt3kn05Ytp!0<>7*nWNXQI18+&Pyx(T3 zG;b|e9ZIYtQ%u!?gsCD45dv0BnWEXgXOC3QL*--1&{@>MQ@hy?c557R*+e%%C+uIM zHto6x`BkKe3QoOt0DFlzojh9lFGx>AK*%5L&)SJJ|d9G&N#JYOEt0ii? zl%JudXo#}BO97>*^+t4mo7!m4qa?w1aeq?A*-aTtq1oQgHDoT0XvKF28cL&zdX$r1 zLWsC2hc7ZYqxjej@f3Dz%r+p=J`TxwJp+2~}(LlL|;fHygYOkkYtYLec&7Htf0aZ4ctaw^pBd1E>x{%CC%tpz#y zwILp>&0S`{@*c3KF;W98+&c%=k4;qc$zODbg`InC64k>WlecmaopG0)iabg&^D>2L zhyX1Ck~F;jxDNw}?>afFjvmTtdvPy`@b6$5Lm_BN@E@)3ddL0W52P0w&=kfuQvLHA zss49~M-yEYIZJSbzG);f$sYvHmQg=4MhPCA!>3yWc{k z+^5qR)1$$dd7|VAQs;PgQ%1^$-51|{USHkhIrkmA`G34Uf(Nj5UFZ$Xf}D8NIQG_%JFFXjy5@8qNjH*w+wgrh>p<8YeowFI(&EL4M! zx4Ne>V|NoFab}`rcsweeJB+XAN^tY=Amm=j<(~dS8`(JNQ+KM()jl_sW&=M@Tww8V z77dcz1<=%}d9F#t{c&^FZ&V;AQhIf$7x5=~)p zmBe7IwMi3Ecdw=rm9BxREa72C%i)=4E!H*XyBUv`s;E(PYNS zLSsf@m%ZSc5hu{*KQB~@ z7xj8572ddZF>Nf)+cI0^2-C{I7r`}$nXVzY2ADNN-pj|?r4mFK(Ud{Q{9!r8I?yB# z5m;Q*#vk@vV=`qVN~c|;* zZeFBVzC34DjUysr+-rPp8_lUIkXOKXx5BU6U-kmKE9!~spWFsqO|fEHj;T~8OD&g; zp?kJ^uT{a~>NSb;?QS*LG?9!d`@1enCyf@TYUU3ks-OzkCo_T11G^U|+m*q=DGX5N7Pj(CF_VkIPTFnF6g=0w05?|s}2XF46?tuxN!I57dX zh-{gcn0inRaBdcr?vZ%JZaIuE=x0UcucA<@WSY2xntLXWDb5HuRP_@s8#mS1Bw^CtdzNcqW5cbEydrfyFlPhHH+ptalp~C@Jw(-YXlWbzc75EUgPVc` z&*1LL+WZ~|*g`bIFl(1fPDyl=d(; zL`rK~8U^hXyrGDlGA)a)mT*D_7Dkr@$vqFVB!BYCJMM3+>B! z)8Ev6AKY2Lr!s15RQu`*k(~olo-go>>1@m_*0!IrEp2>*obYBb>3G_yBCNwmD(K;7 zxs?vG&zvc(YGL&?w!{0*XitTj#U_5Dn*jKj8nNvNVJq5wqZPLTsiUiXQc(gjWT?|1mryUf~gOi2yr|C?!$~T9B z`27*^uMdF#YA0mu?BZl(;v#3}^26R#%*n~#>A#Ik3A@tYk#}SLCSQ?q-xx+ngxwI_ zBT3K@(hv;V#n`>yk`U#}b_TvT(QW~4VKhO3`zf$j{d8muLS3 zE*Klum16%HmZ|mCqdfY#OQ%LG*8FtwZg7$HzcI$kADK@!Qa4su7XxtDMwuukHU(2caN zVTR-jO+%{=hO$mYW~+Ii>0~61jS1c81^~mmY1{WWaY`If?uW3H6Bjl(&_nIhMC)?; zuuLBb{D*((^?vcuf)EHuO7h=|1pn8ZsQg!fk+7?!jp_d=e`<9h4OPCujGGx&Im(tF z$%4`7nlHGlXq)iNh%ElO?V~xzJ&85kTJ+p#Z z-lna{+?q0b%1X8^)@!ZHRX|07Ug<)%trpd39b>6EH+i|yE18Ych;=j1&P`B$jp)Tv z^h$C@ehEyrtr?Z~m0;)c!1UKT+yP^9mbjO*hF1fvQn%7BU6(D1_>4<84_ot@8-kLz zVlyTCfg6C$+ib|#v6~}yGaT#k!tkNOf}c%@l5s^?j+V_<9>e%*$wjewV3K=X*y_1> zP!FszyMj>(xyY+xJ)cNCk&BH9qr6Yw3PZ^mh%MUki+l-Baz!O zGLHt=e(XVl$>~#=P@V%=P84ARm~pS-LI`Ugc@C1R>nr(ZGz0<^sBw`6hlXe&^O9af!iFvIndA!R|=mE;dfF z2iRydK{U>r4GMI$sP<_DQ;4)vqyrw@HhOe&4(FCB>7EHTxhF^>H(*&1FJ%S%wE=h+ z@%b_2^ppOl4Z`AD6XOz2zBWHdz7i=ttWr)PLwN(*O>7Lg8>JS7LD~0Ce#(!kT*rf} z=VwJ1(aTg#*kJfYr@gs$1|5dvMA>2p$GkzsNf^1pPj8X^mH7ydhKx`bDo_`IQBP*C z9+m=bYHUbx6!c^WD7Fm?U4x(@S&WOU;sPi0(N44Dx;{Lqr!^`b2lJP>Xqceo`c`6$ z1^uf90G<#TX+>H@B7}@3OpAh*1jbGw80RpfA|-zlE!iYIVp3fgd0Hqe(+$%lG0a()excilJtrrA_D7pRQfOwPuo(Ap zMi6{Q3Re;0>}GO`bCSqi5Lbq|{}sOTpu*&9D`@6R46!KA;vQ~9;e;G^nx?)-p5|QdPltWso8-rZ=x;Xf+G`n+7p|CytiKX(!sW-+?@e8HcN6_mq&n({!C79RX5}2M|4sn29RsrG)jhFc}6)pt}}q zP-EH757xy%SC}%-dOV%g%W@n&< zYD)+vsPW#1xq509fr<^?Ffxr4@(a?&W`S4?+$gE#>gs(Oy{DB1LylP?#d!gyib`3R zwn&X-#ye@Quxi~s%47(+jc0=%79P$!OqdpzXXvSNdO54?kuT#2H;KlA6n#`+B^Jv@NAln0dAn(3*g}cg#b?UIOoALhpL2{6 ziRK&6ql6jv2g~nVgS`|>?maSQXx7lR5m7%1V%W#E@+;8c2=qh8ea)y?t?~jAxQ5cQs7*JuuF1nsd1P4R{9svpCvUbYdMQ$Pf}8@s80Oi_VOd+_Fx@ zG4%So)Rt*#wy*fa`?88^%!78UL_>+LZD16THkfmYbqT4w*sHl&#*7ACpHfbQD~ZO` z8ol;0F_1rH^m1aEt&y(1ykQ6cAAVH83j3*uRrv&8M|!3VXTJVO4XuLcKaX7r!>S!O zJHY4TR*3H+au}m`fs^%{jcpEQdaDtdTq;@<59Su!T$^mFnyU}%n4)u4tay;Tg|kiE zD~+`+dRZ!lM%Er)){GVGFDlR3^K2bpLm*P)DjFE^Xrya10JiN4tDtfRhj1Vz-H9wf z;m!KP=z1?1*o)n&fjzjkqTq>62{>?*8+hUee3&~FsF9?wVGgQd5I%f0exF zhsrX33`0fM3OaGIiw&XG)nyqAakyqnHfhG#&$3d3n<L+jpcYi>s;FBT~TVN5evN# z`fI#6o%Sz!T9kBC;zTK((VnmMo_DU^Zkf=kWuJ>-X^&bl?bMX(*6Pj?uNfZS^4;9V z|GJU)AR#4VEuQpqZrokZ2dGO$n_*WQGV;GkTX-m$_A4&C=;Mz!l8u^Nb*G}@N z0LvQvB2E1C^2Xvdn#nXJS~?PNi!TbHLKa#*1qK(VCCY zsPS+7O;tj1kh-t-QVa5A&TmTH_8JV<)=ji|=D?~9V1kMZG`W+8i$jIG)!#SaAcklU zXoI`=z2?EEO)Tz0iQ%7k>VzC9@rJ*#gh^Fk!jQFbAEq|ncackgoM|AQ4nxTRMKx65 zw=FcJFFRhk(@jH7n1wLI?<>f_62~K2u0&ByC11AP)3lQ^yPaJrL?QO=dAd*I%*r!6 z`1y`w69cNE6=F-rOpigSBW;-??byWt5kA)o!<^(~afq(?7bk97kY9=`Hwd*{9@*)> zT@!+zpKTD&V4gEtF6p(+(R%|B2Jf>Z@{6m|{SL^qXd{^gGcfSVGUC-`=^48LI0t&v zBNxa56{ci)a07$Np$Br88%-#Oh_wNOg0W}#Gcm*kbLY$>*CzOA0psGqy7#&bR>*zz z#NuwpYQ~$16PA_X*&Jo@l7GJECn^%MG(;Q6UJ3`vNVXwdjUetW$l<HgNFQ4R@)o?A2l+hz;1-A; zK!|7lX6~TCS!vIi^Axp%vci8ra|{pfq*Hy1AZ&k?RVXF$oC1S7mepL5C-3gdgC@Ur}fG?jv0o zBEJz?=kpt|#eLva3gaxTU0pnYhXUZ5HqxN$Hw?+oWu*lY5oT$tn+-$G?h} z)~g+#CprJ1Q5ox$&&>o|FbLl(TR%59$dqQdTH9`V00LwYXPh&)&80XA5GV_wUhW5> zW7q=6vhH}owwXeH3o>nje%RE}2g)@O$)O}D2F&a+(*|-0>P6S{+}}F1IOONbb9cXnrU@LeS1;NDFM;fJaYt=8ieqDy$S3^fwRp-5KOzm=|q*Nv+Mc6(#73GMXnZ@+=1GGU(Af*;d z*Qo)~Mkt;5)wzmLec#!bjYun(>|5j_0EduL>J!>e=(G7M={4sw9g}lk57KY1u+xeX zUMq?Gzya5^yP)r1(EAkvzs5~9nE46Q9I0hFSTUk@gOJ0Ii~45Ol&aS0VCpVysv|=T zPe@WFnW)HQgMx!$4H_NI_Lze}NS=>t2EJsN-mnNT60kWR7f6RPd7sRRY^@}$Qa+Y1 z^CgF6CC6n>(VbAgHv}aoWLFj+q>u)dRfj2*$2Ljs7YaC9;*(7L(1CeF-N|Ug=o#XE zk-nrw9G9Dv#qf*}oy@a&ZIf~oSozmv;}ARyS!8w8>zl)-)WkYgPq!?w^QJ&SS3iUGK_@>n7t8Hvq7J!A_j@kq4!*9`mFaCz_ z2{I?H{r&)Moel}-_^s|GT6JJN@8NnTL5uyCT;|;~1eWpAlhl?!Z44!I&tPo_R07p~61vJsbGFm~}eDh_M!oZ;_?IuZPYdq4NEcsW^ zT$@VDEaU_?A67Fe1#gy2dk!2I-WD)7+xYqN6_0dknsz-} zy2bY!wDrV~d$eHdfbO9C4f1-X&H2#@$Efif18O||d-3$NE&8g}B4Np=!8U^Nz4VP* zV4>*qri!(KRo}e9I}~ul?)j)|(0uwW?vRd2%=}u&oRk?=RCJ;AuyFrgm z^b?wPq39+Q44O|YhW25UZxyYy7Ca@b`%veUot%he9V}p5k?QdJ5zo z{;|-jtS4BXIzg+gc^~@N;nJ^LxGXccp0Q#%AzcRLmdTkI!Wh>C^0vz&z3|=x^-_%V z>`JtlK5CWD*!)y^_tLGa={@!nBT72%*%{0`_=ySL>bYgA+HOlOhDQ3|m2-|pgeVR6 z#(kc!Dqow5l|8V@DKCam_rRA$KBhlQSwd=Zyb$c=PNK7T|N{=il_U{I|1h@$wypQ_j!#AC-s z6tPlmm{x}1621!&3OHFZbP8*r^SrQ(m&9&MeG2PLvei~4tYuvoa@%Lp`LLs$Y%-tPt`qiK=9=Zb&@L3w{^C!e(deFB1P+8s ztYBMLzZ|g%7>InY^)9tJ>6^Y2MW@1(=5m)#c0E~2K_ZIsD(e%L>QG}sH94NaBfmbBEG!5MGlV1_~E>)Y=AJ ztTJU;kPEO)xVS@EI7#PoO!}%hr9sPf_UNegJp4?J-tP5>F+4tATF)0GUs|7sEQgRI z*AlBYiHZz@r;j|8x@7N`Kba0O$xJ4*)bWoI6wUW8p=M%9IrJ4p>=(9aMSk%@zu=6Y zS$6+))<1r-)A{qskWwETf*@x=!TKrQ{C+;71zm?T)JA{tQ>p~k%y%`X zXDcZ!-Q>5)O8=ttB_->}CM$c@CffCdu14FbH$p5M*3)l;fTy;Dpnnfq_V@bt%z^Z)Z)Mz#I~~4?z5!}qm9>~ko&}#d}$l+NO1?E z3f;kj$XjFe*2cbLI+>y5TH^@ z-5YM7Kh7avG*}>%X2co$3cF%HFEnz)S+SZAk;jUmM4>4S3Ya)3)kCf5NWB;=dECl7 ziLKK|pll3GAT~RXf`Z?`Ue<7d&g7tce&SxuM6g_ z3j+6)J7yJrO_sx`Di8Rn3$^SF@MEdj7Ua?#x*;1WKxJ-Sp{LD#9@Qd3ALpJ(ZRL+W|3oC#$>8}n&MipF zb6b#I|3bBZ6t9&S1||IZ`HXh+##kx%Yoi79j!w59NcxPkr*`8O^AxpO&gK(*Y{c9K zX8NS`y{pgF{#mGdoS{vOrjK-o4JHP*0C<;euP~)eBgVgWi4tZbD zx;6eV>H8V{pRk&B{?P5GyAJpaqwt>?uil{aJP@*jhsF?)#rbjryAkMl9K(!>dB(dW zw}-!U1_Rx3nb0fYegxt>;PvugJ`Wfy=k1$K*$$aY?uzON_HB2|=TRT+*;7E?(edE` zj!RQ16fp5F9JE0ZQEs6E_XPs<`E?c-zkL67_{9sbgPRKKH0^0DK8SCl=poYCI`*_$Cg4uJW^I|wD)6xC~=@p-E?)mebzV) zrYejdnH#ZIDx0Lr9XtJ{cxghH+*uN#k^tMAeANy51n2o(Yk)AYLv1-h)#AI7Ajjea z(85TcOp?KHT8AX!;J{Covz2WkOV&-Baa#1rE-dfU&A+xreP7e;^8tw~R@D|tJnL1( z`>5~$>CV73P%V5B%DYSv2rU0Nx0wbCXF}~6tJ~u+Ux%rMVInL~OOE4mE#C4|yPdOI z63slE5!QXPNf~kNlf6sjRX{URErPu2R)%^*GQG7ovODP?j<$F}5eTPzxgWD(jNwYK zz63Uj;TtrW7EAau;9+7=!FWO*Q1)@%B$}6|-n4-7<9M%Y8MgCrv~8rbSJe+;A1y!f z(FmB_PgFLmaMU~uk11PsC$;A4_NVB35?^D7R9rFVxXpnFf11gJn%wb*-66LX<0|h_ zmO{SkPu(6Sx5fI~2T^pE29x{D-jCK6)?4kky262<#y1b1+>oY*dUL75k8)xoE-08etoI zQA09vFc7~rE5;z*A<)_?lI!~pR4dk$C-%_*&`w%-Z6Nc??UFgkjTb>1cciJ7ecoE2 z<2ipPX!iJ3#eLs+&5}CQSUzKvMQbY~fq%}=zu?yGvUSYus#=|@TGfi{HH9?QLS|bC zLg3;xZ5V}Ze;})C$<=Hji#HI2TJfW-c;KXChZl_E1yk|CTgQ|$?C{`OZncsf@uu11 z!Z8j-Wo%2?TiGAo}TU)hVy{k*xR`!?J2g}&sH{l|0NRF67(*0OQ z_$;bFW*UNE>HHXNWaNm;1BzM*H! zeP8Bse52zQ(h&wDsbUQ2;~`alErk?mg*2=9Ha}C|jqlsxO1HxjtK3J8P!t2q36DzZE}*8U zt$WhUnbYEwWuzfQm5m3UcOxMs0hbd7(IL4JKS_^-)9^aAd0+Rb@q{tH1luiGl~_od zLe*jSgMrHNn&7JCXM6P~TBP;YCsJHKWz&7)2?8P0c#7O+}ooE2dM^}t_o$)xn!|)A>KcPzz6rfJMfZTT`{8URWET?@&RBY;V)bDv6Xuj} z-!gQiyvoC=qPZ;;dlNgDiI`*BE8tauYG1ymd2$Nb?zle)H{HFr(qS8FHQ1pS%AIZq zKinZ2`FiayD4@bdr3s?i*l$*DystN7ZX$r-qkmO5%q{ldFZ+pf&)8kmiw(Wb_^I=X z$tWNTKb$wtg0caX+!crC?qBo-5D@KuP!{O_i?T4Xv$JyS1W)I5TP`$_^tc?_B7*5c3`tMLmCkO-BH1QfmB1W<)Ed!hwG+EUSob!)Tg{Z z9=z<{6I3el@8UE9@erNWKj{Of^QMte&X5PA)1<&&eY*HZEHTb5H zYYc;k-WaBz7bshyv+Z948xfB1rPcNQ2l&8gc1IudJuau;Fbd=Udu;w&67qk^l-NYM z?+7ZSFpEHCF(gr>ksDl)#2*LH!B{C^!Md*<44Q>ymlT`oh+i}cWCXmP_x-PkF^+D; zk_{C4=H|PzybpFSpBKmIK=MWmU^u3xYe_~r;rRG&&?7b?8B6ClL+o4^OAOEn)*y*A z7HuM#ze>}rf7lbQmv>A5P8PhKHZ4=3NSJ27J_DuKPJxf2m&mYDC6G4;;daW*);oFUUR^t*LQjDw<72(oKOnB^_=% z6BPE(9GK%mw04&Erg|;bt^cs{J>QU&_Hren%l&j_T{@^c#bs03Av?5umYfYU0v}=~ zGnFhH{JV?s_eh~xc@GGrV88f49x5o#6Iy{^6GC961I7d_mD!4adQjI7?nvvY#u$$J z2@9JNY1GPO5u8bLn68?$hE${pMMWKd-EZ0pV1N~DkL(sFf)2i!-!fzP4pvrGqFdTP z%@F-1b`Gy?G4e$bN|2RQ`OVKOwQ8zTl`}3<3H3d zxhmW8-!ZpeVQFnC;4SyX=w?duUxP(K99XE})fq*RqZIm?mhRH&HWt}eOA!o42gyH3 z$QMNGd+zXk&<`_hLFK4392zZVxgK(FKCV8#{#-!@u+@k;k|KmXh$tcmW=>CA&-M5o^l^aj4Z)e9|a}H~SS71j^uNv7-!?OFxBKZ5j z@|H+UqpO6e%tQw3{ej=E3vj15P}NgXT4_^co71A8f6?15<=@|D=sv(Q}5p&0%o002tM zJBs{jB_yiqTsJLOI;)oQdg>#>+>{HOD<8FD<caVtghEp-8QCPFf z(14ee-EiL+;F~^Ut%msK)(6nasP{c7#Q%;uu2rXfZ_PgHhADdmBk%lxvSgtvg{bLp zn8I86bIb74n>B{zj_KG{cj>c0m3;b_305&CnlQ>?22d|lQ^+PY;RM1$XVM$O^9hnjq$2LV4eoFx6gAg7iV}+L2m({mBmq(0B);LJ%s?KT$1oX3 zV+1d=2Mp|-Ln^O%IA(K)IHjc!zN~c@N|gCg=T7Z#k;*Q-MIXu6TLdo(XEbo(0^pc5k3Zs*(E z+vhukL$FGuWD%(&$-LkFaZQ1@i4;-SgBTY%=INnV5vKMY9fKaDiWieJOH&Hx?{Dv1 zcjv&d$mocAw_}Zlxb8~_ddClQCm7iVUHY*OjD zF|>>xtLHyyRj^gZluT&kmRXge@J)|;y$GGQ?!(<++-!-l6sjSvh3~^&ARs!t?SsL~ zvwt^+0IPr-={oPr8`KTX0VDEVA}9&YuYUoC|9p?hxvucgf&u}3eZ$)S3JLr#NbTQV zePT9d{}{G^{IUNzaIwj6cHb)dF#!&{9x3-T8OwYFgzE%8khhsc z(U2R*9KAx{bwxR$RpW#5OL99tP2z*fs^vp{EkeA;s{u!p{$~BKprXLN%Vu2#CW(XY zCQAgdQpX3<_r|JjL*Ik=KaQ|Wc>)We+OX&4esO~H>)5G2NA?- z38A=PQC|-xE3aR*Jc5Fj3lTkM#ueR3XNFN5aKfR?W5QwO=R0U0rpsJcE&fGA{GcOu z?Z+E4v=S1O>#y0AV^FYOD?xk(I1c-nxNF5xsZ25sYTTn9Pnmy~Wi58KeE0W-TPV7G zTfAEfwoK%D@f3$|@Ruvzar_eXycxA^`!XS6dn!hS;>>HneYE1=@owrzvE zyIbS#9tiI4!D-yx-QC^YU4y&3yGtNQAV|>sKJVRs-#h33%bDF1XTHElEfkpaO9V}d+F7?&BH8Lw@K@BMuFNryW0hzAUc z;;FT#B`Emq>|?kq8E@OR~g}E{uPhz?CCAZKkKP6PyE?L zU{+ID2CG6N=p#Ubr}GbEQvC<3-jJsq5e{%x92QgBltLzsYY@bzS)jqLbI3SsT~Z=l zy?8HO{3O#Xoi!tE*(POTv1pS@MNzUrHREO?Xdmvve>AMOc*V8K{v_4DCMDgj*!eD@ z(+MH5CwUi%>`SiR8vMC^b8CRAJ?qji`s)hc`h|u#%+_|*mqH@Qs4H?M2NbfEfzRN2 zlVDGrDVjoc$CxgQcs3$X-j2z2+r<>UP#EpBPAKkA5#kHcr&ak5Dm zd;bWHO1`o**n(UsH^|(0{*x<}2BFy5I@p-HnEp=y`Tsc5AOG!0Mbgtw$Te%*!K1dK z)xJfj4AWSFlf8Yaxjma#xX8G&X~vY?btdpeMx9E^MU?K` zo{d3EkG%7?5?u68nksqQf?nmYz7j9`HJMNoXf<3)Z@+HY(WGh5pHVO@b=Rw1eW6m# z_8>a#&ip2-sESC1`1U(gK8!g6DgM>Scc4D4n2JmP;8TvZgL->rm9>EVe zR>T*DrQC}VjeZ6}#pFB}NH|0j$dcHi&oK*%z6Bm^G3DRO(?X;qY&*pqgNmLoB`v1Q z`T~0R#0|>Aq>$c^Ab?GrVwM#HJR^pD&Ousy-a)^|5>D7QAd7%&k%IBo9J7aH*bR}0 z#0T)ENv?Lfr8OT-uJW5pR#HQ*ck)@4XJuJll}XA1TS}S5QYO%g`KYf2U#4o>{K zlQj?*vYb+<7Iyf*fc(;jxq#Ol!0{feGPnOfRG3ih6{KLFK79ju+J8g-{nKMe+gX5! zivO3RWmOzvK@HslqXgB9Z4i|Vze`b3l}TaJq65@fq$0q+9jNJopvH4$-mMYeKKWrD z4$d_M~);(zD4$a1xy|JQd*_0RQVH?aQuQ$6a8RI;t$(&e6Ad^X071@&6C4LKz zgSWmbg$%l6Rla>sa9AW%?#yYxxhvWr(Ww)vNF!lT;+9EL6Q@&1)_f31YAcVeT(N-d z;Y^4t&+!)NV{Oh`3lLsU=z-HNYWtYQZYzB};Y#SF_+ToI6}()#gBs=$KEwHYqkgoA zec}yBdKDn)k^QF$Kmn9-y8X-5h9=A@fU}~8`xg&_@E3aUOq5Uvcao_UCDMjNBDCkD z%bOIWq%DzLxDQr%etr_bG)jZe&6+O(q4C>qnrZwPLGMSfBi9wT5bK~?eqqWt+g=ER zdr&-a9hfswrx~=(`dUx@R&4HN@q0$+ER>(0LcmRynrkx7xD~>2%k(*<_N-5H(03iL z;yj|~r%a(7Q~l@Ao?!>i6~m9Y((PxdPTN6IErpF}`pk-2h{<$zzU*kNtEb+jrw|7m zhIKB{kG1usU5DvRYK~y2SL9aM5Q@yP1hS0@x7q@_M%wbkVbufkK2ixJ*PL|zQ79(v zze@{yJ@=FbBq?gpl=&aCY!y=nQxMkVzX`EJ6K7sg$k$Ul zDqzLwF*z75F^5Ctj!NY+6=c|G?^kp|Y*Z;8M}x4?ogLfx&$F2avuA6sFaZdcyz7oi z?hW)xS+cna!tclTe&lCOrKNc7b}cbSZNi=vqY|3{saq7CMgFS^JG% zv-C+8xuSsU6tnCqN%ka-IF8(M<3L|#Rt@=c>5-`NOdf2W$-aFq#3WigS$iA*j5!Zr z=6+P-DLN3<3X1{PrCW0CM$iQc`Hr$TW)zqyFe`LpB|~z`Y&NXaderILcl7jfUHwPE za7&_&ZYxrlk>aHo4k}Gtwrv{|mByjw=bxw|VKmBXjc@e*2U@R{lNAnjEUmMi5YuQ} zjiFXLy~3zg>mSg67j-y6Ej>6$)R&;+Kbo})$S2wT&mPiPM!YfV!G+EdypN z>3TI#*yNKqG%NIoVMZ0UrPQh(4Hsa13;o(BEaqT!nqX2vSuEP@?>AgxY^j zjsKRRlD&Q2KhJ5G^$k#j`z!Wwpp7<6@vpiHs`b1Oy{}nT>CvCU#N!QD;fY06PTEsn3Aa3 z5aP;3fHsUNW5;sn2nqL?jb?F)z}5yi=vBN@vkJL-F*X{h+<;VWz(P3ofH>!rE3$Mi z7w*oiw{_7&4;NDP5LJgTKC^nTFc6J@wRk1dqh8!RUG1qoNF64~B?%xfgZa)Zg4srr?jJfrs5!jTqLy9rk4;}#*0 zZ_!OBTDy7ucLsHWCyBEXU5GUli7-V+_^$#`t;%gBW4VwMN81 z0!%^DIoV8MAK`uQfhSD3Z2-Zeb3APR;3Q^WY=D22g~|to2u=bnNk>qhxJHkd5mr0z zoT6wNUKH#i%=q)eigSqKA62F!V%ag@(S&7K;-nr-V-<>Sx_mNM4qlJAal9hG0x7?S zeHg286zm}b8h8bZ2EIi|1TSiifg(R>$CqYqo^4JTcv2X*Vq3CB{$#=U2MEdJ(5%ZUp>(lddf%A1pS>SFAoWAJ3APB>c(0Q!pH3dj z@$d=~Y{#tVK1*yQ*4NDBIPo?6t^EwCmBnWEk*?S?edai^wgoIpExQa~caNhz9&Ymq z9>54Li4F~*7)$WbnH!i|>i0iu&xfDnW#sadV91`K$O^IZ=|wC=-wc(wZ&4DaNcP$@ z%^v;f?!*f*N`aJShR;tL>ot7xFGSao|ptY^gt7ZvY!aQWjNCIegJd?pT z$50~(dRS-b4o7T_}mZ{<^+POu;)M8%}M`N?^d;NbphJD z+ez8mTRQ_-|D`%gTOikpDrmA)HfmwrgAgQzhGnVrQyQ&=23~zYX0QEx(Jr=&66c*M zAJmfh38XmyV_!7A_1s+cv+1k zO)tf;ODj;m;!inSAzzuEd-!6!XD_QuvPJG(`>i{l2(R27^Q!Vb7DiO}4P5Uwj<@ND zr%j}-;~Cz4N+`9e2=w*f!P*R5#vlg>JipyT=;2w1IRn=^w?-^j)=TJKqt3hq#4eRF zGp{o_t~T6w`A@WFei)SAC6Jp4g!}Y~=ARn({~d#Wjey1mhzbBxP(I8>Drgk8gZ>)L zaSuv-TX~qWW7t<}6ljZdG4g8jPi)$Mr z?bI);V93OZbZ`txvQBU=;e z)sGFbH1$!WuF(c|HEtQTC8)fWKMeTV;^+s>Zh`7D@eftvLG}uN=-OQ|N^jRj1}rOVz@|}nHr2?+SuP3WevZo>PaN+v zr$L550TGF!hDUlkA_ie3XSfoCw5o-NH9A7O#f!Mgitml9r?wsJH4wN-C!A>TfKQ$J zI zN7tptS%Ts(%QkESU9ecPKvxIkAA}#Rbb<1fe_Rkz@QN*i4Wm`QR_UXub4W~|zvx)h z)na!gF|fgn*uw1!J#RNUlmS11CNhGX1=P5IwP z$NuQD4pG~4sCNu~HfIi)XVo;WMg(ou_~2fJV#cho{EgMqv-Hi@^+r!njc^=hqm2b} zHV5WXwun04H#kzUmz{g$=rpBDN#r{wnYSP4em~NAz%im(3s8;wyO*|;&zMN)5q`YYJ!xudsTvfcf+1e$go$q=;!bT7f$KaL+Cz~|bswoMqsT%W+2ocnfKiFfG9#jJJy?r?RM?9L z*UXV>E_(|M=s#YtRrBL5t|E{2Z%PScnml2s(H4vui2vGFCN zaQ3sf1gm;}kl<(vLt!xF0h9KnQDoC}ObFrK=<+rQAi5fH`{$W`VHVE}KmzLlYbI(_fDKC&CQJgfHYBa#aMRIwh=gc7CkiH)50X&- zs08UP*c-~%074q*BG#Z6|=Yr((s)Nf46-Q#j5CqPL6Kp91K6`AY zOLkc{dC$YCUX8`azc?j02-yzSI8XPai^-6*$(u%f8$ZXyaTG{qriU=imuz?(eI)xpPb%&_K z$J502zQGSjO>snMmDiAmX6WU2$t8h&%CYQ}I!YsA@@by(Slbo{WNd#9KcU&;*&mqs z@E!eoQPbO61ccwl=x=r0Bn##;PuQwM!KpK%*T6pm^;tSK-R z(64{x&cv{!cR7i)Ss%i)BU&3xd&L=_T6OLz`3Q`tF= z*rCbdy<54RZT^Fkg*%lyTl_y*D@ajPUF@Aq|DheeN;5JdAZtCc-{zQEl#8%1ht?L$ zW+1C6NQhu~Dn{aR%q4I>lMs|cS&*?XYPq8H3e6*ZIi+5Ma!{;5sb z2~~7pPy~GhfQ{GGJD=2LTj+aUIdud9?KYTT=P}8xo5|%4f#$#S>fysn(8~^RD@`h! zMP;mS!!t&@kzoO5sYEUn?4i8`x$9mWXX&Tg@MfwC+Ko=P-s7cZbHBxD>eYFz_|`s) zPI>4M?t<*KkirV_`Hov=%A(SXvnwu<@5x#Wy!-^JlRmCQPxWocWhY9-fyLG+&FFlO z09PjY*|Q+#QZY>H3nuG}vN2g4V)&4aO*n?<*$Wh==K?M@*H)5M=TY0$^h# z-lPfzI@`F8s`uV{fr8wWyxJ;s#GA`HnLMKlO^g;rILnj~lkR5{t2=|g2lQure8s;& z^CdRSr%%LxH&VWQHvbFw!!=o6b4eI8>?S2`U5AFGTuK~Dtgu82a~K8Q!nU%l zrQwtEMkqR&mWrIp_ILfK&Yv*fM^g#5h6anj`bYd3jQ1`#sk}Nq&f({_zZSTe&Yg(g z8#4eiL|z3)4f=t33hn@52VFpLirFE4WUF#Y3!q_8(kf{XJ3yB2tQJ-Y^hWfu*{u_}$a=Kmbw|B|ZvHc{X_z=C8R`9;#jDLIf^eRlyb zTHLjTL}kHNTbnGjt!ZuYTHDh@(Gc}h>y(tPd&^;SklVOsxiCBq z?oN?Yo493Ex$evzhpZ*CDj}Qhgi_WiEtf(nLyz>vdh;ancoefV@9%aD1Lf*5C3%P;e|U_z!pt0v{0@Q=zB^Tj0>?p z;DOZ50)aLi^gtehq>Pl?{fXg#V8yMfk9S8W3fR6MC?~|w>SUjz^t|pv3i~~Iq+XR}ra{FbQ8r;gk z1&~kJjyJlFnvhIP4%&gL%j;@bojOJ&Kk59A8xp;=iAI|(JBtLmqJ)BBe&K!ge*8!8 zR>JSqS0d1)H4Hjv|NrKq3Tpatbr!P(h2MXb;+_9*`upuKqC4N@seudtKo?6ygtVX^ z3kw#`Q4JeYf>x@v4X1fveO&*nuOfj4R91#(wPq;zGAZNS<7;omL6UEO^C_;us5nv` z!5VuNP9r0tC;`fdp*wa_(BJZb((jjn#GT==w|!5H}6v`}i4T(hihAk9xn!0>EN z#k||1PCe~K=X+C!(l^A`tcjqfmiL-zQP0vCw_gUQh3BXJ1L#KHakC)<%s;3y*kTwt z=8sj|Hgqm$e)Lxvx7XoZY>tw98y_VSdgpv2L|Xjp0oCKMD7@EF(XWSy_?#VJib(%l zVO;C;k1%fH<4Gq0B-<{~LG*VSySmtm+Sogr{!dXwK8_V0)bJ(#XBbeuAky*^elued zBErI&Y~4Oh96hZjBi4fp0cF2%IFo9k|L579Kg+N89wAUog;oxeO~g3Ip24VPR~K&M z*7Q;^rPmI#?2@_H7uTDPh$7mT;O&cp9#2>8y()$V`M0G9Mv~#6xz}S|wN=Q$CIi=S z6>zd3%#k-3<3~9Dg_N(ighp>Lf1h0gVISV0KwN$FNS{7|_?7+_29t=ry^X1n-G3`b zXqu!mXj&cn^CL)Ctns|iorUrqUk0`(xU!Hgjs^THe3G2~ki!|`P~gE}CWko9={bX~(W5RVry`A2Y%lHMcjF<&>mRAaEJJd59As z%)Si)aaW_!x7y~qMIbsQ%XaG)DL;p71gsF&%9{srt_gu~5Ipb$LsZ9eul4ef+)W;p zbjvi7>jzQTk4!oW|BXEv-tkw7gLR2wQQrD?D1JBSjc5fR<>r=O%|es!QfsWr5&qbm zJI{wsHfx@`1?#0-b#4w-bC%re=@2INN!?adG*=+pPRCM@+n{@pYh0m3jqQ?yO2OW6 z9eww6!~s#^Ayi^bD%43~xM#OwXID)2Umy^Sr#=Wk6X<#W=>-QrSaH!E!hQrzmVr_2!*A?5~ysq;)#$ zm#Zmm{C4fEQUsA@BGQknFmpXgH&r-N4CSoMiV?11U53iPW2A+&U)qDyCi$`24eOeK zuNA45HPt2pI<7JOQbf(H;X>3uZyo5%;+7b2Lk9TpSu)54IKwU_%CEV!Gg%8<|VdUd7#z+-) z?FswE$FyG*M}{l&B;ngzvCt`-f$2W8P7*LnWmgfooQvx8O>sWmI=byBi!n?yoagG< zOq*1msAI&HPj0O|4DZiPu^K;O&ks9=$!17x)2Via3>mI#l8(*N7(A&Z6iG-37F0*X zQyK7k4oHeK6!0Mn;sFQXH#m#k0A*bHJ64s?*uItu@_{r|NkFU#a*i@5MN%hGVlpSi z3;7~7_LeFML6{^fEIV)tN~(HtuKI zB1P0{ZJCMCBdLBQZE0wYV;d^7_Z^v}ueqPsC-FDwEH1OXgFk<>d1Lj`4aV+@)w)NH zEMC+{sdN(GT!e6K6F$=QI*b6OEkO0ZD{_=^1@(H;KB1zWiizY@lPTyv3#ivJCG0W} zlSAoL3isgGk$IAA+TM4>5AX2J*}0;dVr8+Yc$SeR>C}tio@&u@~Z5^6&+ z&Zf8x=+&6>YVV(I?yO7djYwZPpRpF>3->NBrB;$#mmX7tUL~lXy}uJ8B6O!VuQUxi zmkKQmOhJw{v~9kbTLNYBEigER6)ys**qR;3iOyx<1t(-!9yK&z63$RlloG{cN)}X0 z=4HQ={qSv2aFYyqtV=idt-H(|XC4%*fDd}ICxzepF_~ye=cWhEh_F~*M`~;_9zh&Z z;bqQJOZ{9fvTzr*+HM4E%H)+zz&dVNQuo$lHNZLwx6-IT4Sz<`FW)WBE{ z3AL*w(GMqsh%$w?npI>o&AIaLm*9Fu?ivf(Ro{Qie?;j&8E|~djgWb)qx0^al&vuu zKY6*lMn*GHH)bGxv@A<-r=P63=pl45FZ(!_t9|sjQcy5N(ZMpL4IT8S$fM|?mcV(1 zun>ryv?R~=jp{|2kFWPevwGNYnPLE-q$fA-OIkBOPB{Lt|GVe7M_$*40mbDHpfvjL zYpNj6;qn(QpTqwP%aLvbu1$}evv@b-q zhhaeoQCv7-JZ>5}_kGBo`_OpuK-Z%z^kZ1zV$v7PXwqv0|4ZyblC~iwuLCH3pYeot zeBUq;*}QLv(L~G+@na;4J3qy8UN9@&jsqHk_V06{5pKt$aW8UF4wKiP#96k5lGx%7 zm2_QpJOFe0p@oPjxEdgaC1&IvLyv+BR+)PJjUq^X3L`ovHuw|sl@Jg&xG~{3HA>kp z4V*tVmt~l-gMZa^%u616OdGM{3i2YuTw5#VItl)e^M==wfI^sLpf^cd2+#`)rW#tE zp)k^VXD%?xk1ou%TV~TK{lmwP6!uN)!#TZHViomlrO%eK*;1c9c$%i|T*1**ydjWx zddX^D6S-Z9G+#m9Es1*%PKe|R%wT%}8LD4ENNSXeg;E8y;m;(NK5j6s_2mf~@qL(nGFbGQU z{#eqc>wK$>5DyKdDv;2qBV{6GB^!_xV;x;l!lwlh_GNT9A0YgOx6`dgK#vs&s6Y6M zTbzfTB1Pr=!JE#zm+ATHbq%pDtP+OfNOB6EP%w#_@Y85F912?cNJrE>A}1yLEy-No zF4qh}vn|i$=PA-u12^8VOWEW;ZQF$!9vwki?~-8s`4xmdJ1sh6JBOWy=a$2p(Yy(F z46nW1rqXzoEsGG|4omRb^#t2P0BuvH08;W2Ke0bd?%}T1XknVLil`$wFR+dN;gFFp z;0Ic<`<;GU!R1a6ZhzjdS;W%Og2mkO!+3`=tF)-}Miv6j(N!?>sqDktJ`GY+t-~a7 z7*7+qU>m8J<3@I)9{;08!d6kpWDUy9FH!#&7V>{}1^hK`{|X*8#haIfQ9q!+l6CxY z(A(b09ob>Lgob5+0|s~f^`oj3x=o{y^9)DW;aD7SJ<&kW1g5Vp(bZRPYxd~-c6)&o zpx}WyFv`Pa+3`_yK+wK5#em}Y$z;~gad8R6nNuD zwXR7(o{k}`h4d6#4j7(bHfK`{CmXNTV~HOH6*4;NJJcj%Lv2m<*K2@a^EA!Jud}&W zhGqLGYPFmWF4&X|7FR@CHQYuegSz&K@2hWI=#4NFaolHLJG-XI>cR%z^LnA$Dkbd~ zX};xD!n*i4;eSm8CehSB6KCbHT%S$Pv6!&3$Lt!7v2O?p?* zBRU^F)>vzw!PU{Pl!W=`V}zbzoC_x#^|(p)E&sppP5;d9>VgA&-0

oP`t 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

6DN;!AdaB*6o}CGiY~#?*3$Rf1Y!^ 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

f@WsbTK_%>$1 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%0DJa-_Y1Ie>~ioAZn*fNt>ALA2|QXTj=Q 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

X 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

P&+TT=f+fb=qmO?`aR-*5xI?8cv4AoEOR^$?>L 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

  • @Jd&b%~N?c{jr=i(2=&RX@1Tva` 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 |~3{-#nd#K~ZEJb8}bq1i5iZx*ob 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�nbl!1n|jRW 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

    0-`T1+t*Bupreuh&N0Qe^FLqBU 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 z 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 z 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%0DN;uU;Y-cp-_<+{U4n}I{U{DNM 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%0A5wO?(80u;{@89Y7esw0@ySRd_vn|F)<~a# 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

    8T11usQ}6_p%x+=kSSRLRx> zdpRI$&PB;My1jz_D|s5bw%&RO_^YqqS8Ik81P~ow;oN{3{fLGhyVH!(iX9B;7_hw_ z2-E1(J0kD?jNc_Byx$?hDO=(B6>7UM$8qOq9KULk%xc2SdCbVYeS&sxh~kTL`mQYO zw=vf-P`WW+s=!=C$HxHJpxRNyDadSd1t&FrCJ(3gW4{v0Plv{`{@N&9>U9-W~j zF~gsID-yC{wBjL7()DG1NiVilf1bgDmf!W?ieF$_$ypds3TJ_f^dDbb{!d@iE}|O& zL zW}bg*9Yn?Q$@e~Y6L&ShLW0gzrgBx0U}#~ek)lAT45z_X9Ws^bEVU%AxnD+i*_Fmp za=w7v!V0YwQbl8B`LXWv!@Tip&U=R!2({C~=pEz>>6#R-Eb@)a$R%m=$Kz*-f|x<> zu}foAM)dIe@{MVQ+*zD1b^QS?IYxtr;+Oe{!Q_zij75DaIpBr&-oxF@tWGdqw zrv=Q%$6dv-f|{-Kd@4`{vZ-vAP2c3&jt!jc#uHAQnq>2MP9W#8Nnfz;yXdWM+$DTs znBk?(6I;5qU^e>jDymM!k8-w*nY0A&3FWXLu>3x?QVibhGrSTy>z-&od)esr&AVj% z4Q~*>lu(LBrF2M3nX68a%3Ku)cNyy|*uM(p?HknT8sHu|04~CRyjTA6GRqguhYZGcl&%OvO>bnjVd$g&nJE_cEBPn6cHxN6+QMbgb|ENn|KS_25bERpAy#O%`TAtO?w=V$L6Ey;T{VFn>k&G=YdLPWKl z*uKUt*wNYS&jg}E;}#~10_!`X^M-sl{Ng~gymq&5l-$^BOx)|r+>^+OV~kq0Oj8!)@t4!n$C$P^5u;aQ4-|f5g?>+(UR11o9+;sK=f+^Q`vIw zx>&c9XMH2(NfUfQ;ylBaRQ3``xbXrHxm;1$&>al9&1bkGI_rnSk$L;jdm_hN`UFs7 zukHI_`?SIpc>IWZ$B4_iXP=;M6S4BwYBCZsElGlplprHA3u@QeW4 zFM~NGR^}?y;qob#f#6GP3$`jd{;`s}c!zL(=yW42Qx($j(<$irR{yna$i-T`P{r7L=e;)jm)1ZzuSCs-)D;ubh3 zryi|B@rpA0sotEKMzD^(Wx{llo2NDF5$pK5Db9mMEV?Ozs_vmzF@5z0gDV3Cr4dOA z2y2xE>B+{yb!ZKaU%sLLwRDA|Qq~dyolhSiEB{}fX6E0XW_5}802=&}9xgK43z>YS0w$*drAj3YYh5jlfzmKO`pPhR+XDoJ zZq0lK&x1^Fg&(I>U5yMD3@@M~BLL*a{goJWk6HrX^13Af|nYCi6 zV2X{?V~ZEN;l?W8YNgVdL-u(hcJRi#2IY!Wa#xP14|^x>Mv? zShL!Nbqe}rd&9{VczCzeHC(()6){3-WueLtMI57&j|wfY+fq)hD$Ub*HA184D><$z z?b4EUkc8sN`W2mV%~OL}0`oL>1@80J;FM=Z9E0x?;1d+wG>TgJbYu<=i>FOx7M<17 z?Lu9~i*`-ndn$^DHstpkgac-4#~qx>ZGz-|L*g^W8{ysxpvW;XCOn2MX6;$tjZkTK zk~cBCXH9&IHcCTNj;56@RPI?Fl)|JlbHpdboTXEFZI_WDZ+pyL{h?)d2RWD~P%uzz+v%qpmX*#9H!9o*|& zyY1n$L1U~~ZEV}NofX@58#HZf+qTu9v6IHOZ9Dl^_xqmno!#Gl&v~xv{s+cApLtJ> zF$v5xD$1`M0tB@0o`^kyja7Q83mDjb?I<_K)-y3NQE`;0)`@>W$7d80<*rkmz#qou zQX~3x?lPrqrs>kzVXGyZoeVTo=x_4aT2=z+39_NJDJ{-@^+8+$&R!elTWu+X-AE0Z`_c1wSp0(r%I`@J$@Qn*vSoFJhX^`5)`vwu}N4cnVR1eV@d79+@ zC79K$??Cmj_be;v9plM)uX%SU>dh|vFtaCUp8Y(TbRxd`B9%GRiZik3BIDtoJr;*Q z8j})P7Y8GsxW0d-Mw8&uJ0f{r>8Xac08(3gIt=!0*AwpkES|Uu2$@7LU8&cTrO!iuJJNr;ssP|MUL^F@` z<7&9t#wjLZmc`MEIhJj!%s_qcnP9pT^e=w@_1@VQT| z+I~!lz#|jF;vlZVYz##=+aFQRfO?S$$)Zp9}S z9Q27si*s|H&xo>nfj*)v-2S_mTY?t)>*sUB4ozJ&Bzk#s_SSu_EEo55b?5hAznvli z-gMhY&E>8?#vk+DT)m4wAVfbzdE8_SScehYr0mjGs- zVl`rJ{yTfz4(;ta{_Q63ZR{)bfhe454#vTe(yy=3G5(okrr+iow(=XG2UA&gCBcgY z`Q&j#Vlo-fdU)LJQhYl7sMqW1Be)DW73e96U$J$9YvlJk+G6Y!#H6u>u~8EV7L7~7 zFs@5Y=gm@t4AJq;Hc=Z*5kE`~rYcT^F+(%Pk!xHqcnR8gzPO|eUqI-NnW2e!xWSO1 z+|Xbnl-}L_F_q#(k7f4?s-dX;-~N^P-~Lrq-EK+&?Nu%TcP>tYfW;)T&Od-x)3gh= zF0M6kizB?V-q&aI-uT_tW$IcW%0-g+rkZd=8tm19q9~dMx{YLtjh*4Cf$dp z(p6iZsgV~N0F%~)t>Ge z+Vxh5PbpEat2If_8ykwBMK=oPQO@2+M|_^kg8YU^L9NY6OpEN4Eq z2rf{ho{MkIvZ??ZiL{tOM=fpN56{vZNrJxQ8hGOOk6Dm zlOaIkS&zW)+dNsqd&7E9KJjzO*q)e2ob_xyur8qlwJVQrP0Pzn(3W3=JDk=`QKq1e zz7-fU4#N(Y`IDL(@5F|^=(@^ zfUaGFl0Xy3XEo#+>9bDR3QX2@P=(o&maYyH{_!}g5}23y&ikhq{4h1vJ{G@gvQ(NFYwG6#cA6P+yJst^*mC7%i1reU^p2`N8nlPQP&iPkBqmgCa3?V2D+9>RVio9Jq|Bd2 zbNh~QpGt01df45}S7)yVGes5O=8`0fnY$Wbe zdeCp*zW$MG5(#DgQUQ5S3lJ%rP$OT59g@H=|rArCO}V}&Zo1c+b$OWK#u(EPcI^L-uXe6hX{~BK;n5t z9t_+Y&H8xc%W}8sH_6``rOLaI7^d(531Xc)L(oy%!<{9#(pqD94 z_{>nv>X#4M3rR>4mZL&ZI_OmD`}%}KWLlthm3uuB^4el-TC}tu8>i)D@1?@jQHGELi6qREivLKLTcN@QFhD|3YVmbc-;zKJ-k#XfZX*JObb-=8JT|pz zy~IX0lD@|m*l^MMRZkG=rB6vl#roU&GUUwEh12eM&QiGUYlKE4f0!+oYc&sfa#L`1 z9|0K1aP!kd^(gjB+#WXA01rIdMaL&;Fk=&Rsj#gZdpzcL1D!H7C^Meve%*^lnSK>R zBb%&fhRYRs=y;bq&l6aTov`CkoI8GsBeg=>pL=U(HLD4Qs<(xPw{m%GrEMo)F~Z?~ zs-L=gmQX}cu8%4xi$93{5;2INP?fA;=4dKes_+<185j=xIxUl}{R{g@R#5&Va&b3Q zhDD~w5W$Es;^oacGT`tx)90RenvfbCSe?(Jac*zhOWLVvp#R$Z5Q#`nEP*T-;jX&vs~(2l^R)$jTJE3g|5BBLpq z?1~TP>$l6OVx;bU0a<`4*O5th8y2f)wVw#Vj;i_w1x^mavOn{ z84Dyy8T7FtVkVpkMpH-SznfNLXqJ4y$0_`YH0{bQFYR;QxeOu9M=)Is`pyGzp50m>@y+d! znd=%g3_}4;l_W0`f)z)fB<13Pjcbg$qmKWEbRMq+yXlM77oz6^@558s&YH1hb{{`h zRH;KA1!+z0lmhof&#!m2DoYVQGH9LEOT-0UmC@2UU9xopkoCn?cVWidy1wT|Bjlh0 zvwB3TK38Gu%1|-Pey)sZ$?Emmo>W&u9|JhUhyH+O0m5y6(BOD-jEZqZmV*15^ z%Is$l#i&eS!Zl&)PLi(T*01zYK`P#ReZ&`2btsey^+`@~7V|YsiQ@-ub&v1ip~vXM zsN>k|%i(bP2Qam4`EIN-yzdlhFlDn@5M4N5%4Vvdk055P=D%T3)>*>aO;^F##8@S2 zYwFhud=R8mlR)=RDavuqEvg`U?yWh|p1ePJ|$H?Su8#aa%#Z<2KB z27c*?6&79jo$0r&Z7Ol-Z1595lz#kS<`$`kT)zMU`_8HlN-Ir-%x4bc15m>aKh=bk zb6#8F++jAH52_@wrc4%gN2M6exOl}XIwZiw*S7VZO~sl-i+tTCBWyQj2Lnkd)-IOJ)R>Qr>yeNa!DIV zH5uDng|j9NtLMmf&fb2Nh|VQ7-m0@M-rOFMlfE^Xj?76IfN+-SWWq;f41RgT3yUC= znPo&o;9{C5t4gnWerq8a&o}zudbr<5hu=~yqaPW;IdHh&sf*tVRAaBwYEZJ_oO25M znOMy`bAm}Q22)L?7 zxLme#3u5WOwRWFFEfktNps_{|O6Zw%Y};8&Z3=J?zs*CinjuPL!rbsd`#`68a3)!N z+Vzq@PV`AhgzNaEALk9tqwF_9KtA9dJctzu6V{uAlpU@2k^2h4@s|wx*Ft?Nt)Ao~ zGtM4o%S$qf;^k08;<%r1CTp^Of!So3h{TR7ku2e3VntxpA-4J?2)WU=2CyrA&c$$> z_Hwn!OnZC6&%ZjgXL}c}sP?c;R{Z@{gD~=0zknaM?ViWpPY+|I;PCUnj9Fy+#U*L_&nA``l7vQQMvbZ^5_G8}tCe86K!%S*uVohubbppPv1`4& zG5ksSe63l#UMtD7?Wy@$@99Nu+mj2b&;e@w?x#F@`=wmi*7KQg{s-i1WTSl)vT-As z!a|_H*ysApTz}oHaNV3#-3@|PF@EL5)pdy0UP|{s=Ihn7X{jQaJA;p7lJP6h?z>J` z(O``3h;Tq$pAHR@WaX-;8{zS`^BIyX&psI(Qsjj?KBm)Y7c2U8=2>#a~=wHE3x;o?(XurLeIteKR z^(o?~-W47Go8LJk@v2GwDkLBS`|KKo=w zlnIhRx?C1D2_R)IjhZBoHkW5s0!W=pGz-Bf#ZVqwr7Nat9aW_$=3)(NSmrmvWEq@K z%XFw;8fG(32l`o{7*+e|jxiE>eQYbkyyoe*zz{>~g$+-t{D=V&OmUx#%oDh1hdgL% zK96aXR9u;VwYH5D94u^_U@l1^W0$n&P%nIf#W>A7NSX1^7SQ#bfQR(xD|89~fU~9} z$@LUC7?IfI#*cS=7733~Ly%o=356`zz{ys}=Fm#7WSgn~JQd_?!*+5Y$Hj!EC!l%B z7i{hv-Mzp%X6747i63idSTAna2XE_)X33QP`T+lZfF|IPGbj4K&H~=#Md84p8YKZI znOP$J2#5Sm7i+_bmbM}l5HaC32`|J%4DaFdeH3&1$O&~8dU)M3 zEITw4$unoV`a7|>A>|Wy%navgp+4X)%5TT!H4uzs(B>P72NJ*E=`Im3({RwygL8sQ?17PA(!W!O8bLQj)v3F1AdVt#iMA`4WvrI&0dOX%04X8xLbxFz6{A*%r> z>=Z!vp8*A_2_>jyQCx%@c|OVRbQwH*BllucHjg?`jw-5nAMOTJGMQ%hnMaj4^< zof*w0qvD8!gQeR92*=7iJe$XjspRtJTnyk{_GH~(lN9>M?bB@3_)s?vDa^?1pYH0> zlJ6kH##ShL53Ob#vS2dJz0phw4J_Z+%1A@9JA`tbRAvR6KNk$yEE||#d}bb*?1wGv-{g6Zfa; zIbtQ6jIbYon46kZjL9lMCRKLAjN(LfkdP8vg^Q9S=J5V~;a$SW6(>@zzq9F4fv??p zQpo{{aeLpkvf1dtI3rq(2Nx&%*j>JW0Oiy&3!VhHaPm(m@F^Qqa%JWd=a>BM&jCse zz^=)h3aqC5#?C!b7GI=@BVSZSr7Rs?GR=a6wzv&#=~8=bjyWz8ztm^t!hD3zvkIX)$aJ%H0rgBbFez0uEG2ms^5eOcg=Gl|>w0V=hfXs*r#x^$y31?Pp|Hzar`KIZ7TFmpW&F zp*%7kCeWp| zSip(}TJ6Vu$&%}wFN85A00FxcjJ$llJXJmU(nuDJoNDEJ^pKB2q36laodZ5=e>{+C-qu>iZ}@4&{^Khk8ex_@W~Zh z1K%#TlVM0$qr*}}J~hQEeo`I>C=U)(Jy308=Z(jHHFg#--@%@y?9F1LxJIZaL5m;f z$@IK}^aqDjKBg9`z}fGs2*quQ*-$7Bgbx4WGr2_(W@76;5o=T6pSP702c1B&E69RD zsE#xkqN=7JFWtW=1YA<8#-p}w4KVGcqOYRLGx8!Ri?jfCYqtiN^_EanQRN#{Ba^5t zVp>6nH3OA(%2GBIOunPHMN(y#>?y_pau2;!S{@)~AU}tv>P87uNUWnmdjh0t28%kT z(PC1t{3lp$Yj!jsQ*C6(v}7a86S~!o_$*Pi@H^Gm(@*fKbqE?ldt7(e8>+GHa8p0) zIV^}Zl2^qY6*8pvxT}85`P!V@hWw~bPMD4$$24CX9M|?MLl&cOlq_iz08e6pQpbcK z`~|U7n58k&ew`4fzyYFUe52CRDbDHkGoHx+EfpaK3cZTALMuw~DhGZ8bEm7Ma%)TJ zqw~4SjExVrw^}Pq@hVHY5tT!cMTwidYO66ab1UrBcQHa$pg@h5g=+0EJ)Vb2LPxb( z3dhMHv+S7J68BzKzK%LO2Jmnza|j#VM5M>_;8=r`fk2o6Wql4Xn&?!YM;X*UP9O+o$1l^ zvs4zGkd=PjmC%zyUUFF*e>>l;DI7|+Yf;^$xZmZht3(m}FCbu%IDf~)6;slKHYYCj zbfD)iCZ{~`BG}RIbzf~cRDc?_CwN@5fDS9KZ}4K!xu~^{E%m-O5Gcpfe(-I)ktsQR zr)fxn|by-jp=ri1L5|VH^TF|4d5$7ta5l zs`vxr@c-sx1+|Yi@eV9O^pRTd928>QVQDr`A zTH0wJ{ffMgM_ye?1kCJba?<(eWJw`@MNQoqBxQ}|5R1_f21aZv$YIX61XosdQiGV~ zP;wMYlP+tzx`Z#-Voj7gG@3nEdop}#&l$o#-bRN+v6v+&)-RDKtZiV_=P+9)D}IWh zOxSvF_48sMFuc(WP}%TS=?W2f_!ONW$LQD%V!v?5vX5JZLh!6KEQ?2)Re@E7e5J;# zn_m25pvkVXTj)2_I~jETnd9;=P?b%rLF`yN$Nz{b{cb;q9Sdt{hW497 z+GF=$gH1TN7VgBDp=!a}m+~4H%;|szarHwrNVOJ%-;+RjogIyF~U ztdgYDJ0cHWOsSI)UlMdy+`(2bC8SNuDcnG^r;kt!k#dB`7}H&te>dG$7o)&wP>>!0 zLYeZPgLOMlS<>V;hhDbmpV@puFxlwhC)4a-U- zPFNUr@#e~3tj#G{lyXV3yNppJ}35x=!wm0Kl8qo6mQOwo(u{Zpi1)l>t|G|6yi z^Vs~yPU!olXG?H(in!4&1ngBOL{*9)P)Zi$rwH+}%}A1i_J@9cb+h7B0qyS zM@8B1esSWpaW6+!{%`{e1YRkKw};2Gsll{rn@a5iO`B?VO`U%`Q1Uu5x2{Iuz7QKb zpL|1r{8+*`my%eMk&u@eI~j`*cf6l%Uf55XQ!=I&4Ac=x{u&q~$nJ%=00eerP6OnX zkPj$WCcegGVbNSjLc=K>uif!1$|jSw{UWQ0UnS1_8U_GgDx?N>-(~~{Z>qr}tN6zd z3)Ea_WpKjk5{k!-$kU#!^l@3IAHMmyu#6kqRF`It&{L^jYHyQJ@LD;Ypl51lK>7#|q4@`BM2ieWx*-2YBNQ=kHZXHEu=(3uTE6OF!lVFN ztG@(}n9Z<~!TAReu{ksTum0ZId;3tlblOdqxjb!BQH1Y$ ziScwxR_*OtzYj%b>b1Y)@cjUirniPwXDIAZC9SY%%n*WQk83OzQ4Q9@v9(H?vls97 z2}lWOfe)^!@-Ji9X1*G`CT-P+E7a$iu}Rg^?X(INO4nMBitw0oN$?w7QMx4*_8ev8 z>`wV&aOFR07~6u-Y7uSv@)N{L6J9~LTvP7bQQlxY{?u)+n&>_}gSq!!G}u72MZAaM zCOW9g!YOq_pNtz_@^F#b_eZ|HwR|^kz>pmk9h@H(es^`nQD~RDP6{H!MbDk-JR6Ke zenXyCS6O{A#xT zlg;@gY`wfy65rqdK`!Jfuw#cy)HYo}LlyE1&#YRxsog}6Y!#K(@->M`>zA?*>Fy8G z>Jk-lXE@tG0$_LFzCYbGUwLoUb?iv@d-0h&K4gmV0y0Xt@#og({F~L-0!;Ul-b)zK z&RR5P_F+sH|$MXIx zg$`snoYJM)X_8JA>aC%9%H@)~m&2E9%@Uqivb-3$hk8sBD|+eu{>ZY7LfT=-nB)K} zgUu_{AZe7%OY`*EQKe6Gx8`#C*j^Szjt|5-Wzb0dq1k|Fbrj zml`Q{*WI9YR8p#QCv5Ze;8Uo=tPXI#p@x?Fg|wEjj?#i?Vfsi(1r}EK8zyN6GmNG} z55z97*=X9{&q2?(iyho=3A@0dqGx zwrk*8v|HVm|2@QvDwKnsedL*hXxKFa1NwWs?U|j^$q4}+`7qs>1JdLb4YW9lk!50= zU1$q$S=K@JcPk9{_a|?U#LIPuox(H1;fY)&J+CLG-d}N`ngp&gIqLS?5)Qt~F6(0n zXj0c#)OU_bkiuucd}kdJi^I;deS4qtcFr7z6o=g?ccd!8^$K0!2`_GIkbXNGG9^Mv zCZ0mI-x?eqbKoS`JpBf-^+K=h&%UD^eh~sr+Sf&BI0X+n~w8_D!TWx18Pznxf_QJ~oXz>nu;B`hUvHE~%2e0!%s<#fRPo6)9@-3I8 z_&Xw%>;gFi-Vt&iixk2 zAD-e(u_&;G6HaIF4P|eO8px|7S)T5&5;jhZf-Eka;FV_YtSvjM?gt<3levA}7f6i7 zIxF^fIae5a+`yz(X?^kZ7FmEz`N}c{N2x<>e3K;RbB(?FmV|S12dm}I;H4e`$y5&X zE4fbx_wD7gK^X>Wt|QFW!};b*yjiV$263)rvv^M#iaUtiDafH(%$`p9D05rg zh3`2h)2A|uqZik#%dOaJ$*~P-lp;dfwJ$B|TLwF|t3X*##%;hoJd z0S`K^y%{PlyonJlxqe02PZ1lz(wki9?Qzy~$PvM%WY_BE58j0$j^Tl6alD1Ls?LIQ zZd0yQK58u_bY+{I%{wu@f~iz8!+YEc8RX(3Ffkt9#V^p)?aktN9zb)qab95<_@mvc z@MULs9{L&_+*vDl@w$sGEp%rg!TC6ns=iViP}tbw7-+!h?^die3QHoCBVFeWJ&?hy zbbbIxN6PAXNVo5Ce(ynLI!+lMqfm}y``N+{=+^S6@cY$8|f zX;+V0s!K3AOCUqn?6~PAhl9l!S~P$fODtbVKQBMtSh5`3*mNt9QqC1?agkdJ-6N`1+!d;0hs%8Y7AuN35Gea|UQb4{m)XY4Nw8 zN7;suYaq_S{81PXH6>`-0HrP<3ID5Wd!C}8&1x*Xu5rhaB7C{7Iy1N`^I(*Z_SdT? z&#eXakT&J|B37Kcx8VUrLEz`}692+>aQOn}v9PzzY&dR?S;d42ny;uvYm8UKWFZAz znwFNN7a2DTV+Pru@N=J7LmwwQKK(uOL*FAIdk6Bfcc7q~;2(qT-+opG#BKhUlkHXQ zkNMrEF)}6zgD-m*TRqqSBR$G#lt4;D!wF4{@jWWcgnomY!m-W%J5>=8IvS_b-YBO1 zx)l1kSb~jDqWxwSGcWIo-RjY4{F+zO8*~R6UIan#4vv~gRIe1eERLFJR+dJ$C4yBm z!S{Mc4e~^crZV+v!md`;-ahDNqb8Agv`$m&=>Bq?hC#2E0DK%*ORRi@#4vW2krQUT{yIn~mJ{~HaIt<}`IWShuaMTAjC< zLbY;q3Rtm3qxpiECgqU10|S2ymP+|yfO(?RMOLyd-+UXfjOp^-sh_(w=4bKrFGDI?fp8tD54Bke6Qr3l%?SLTsh0^*L?cw^FfK zcUxG|cogr0#cC}p5t>QClv(71Zy8rbu(*5; zr^aVVH}psJ#Yy?1ShqN0Y;sCcG@Mw1xdU_jB(3jQ=bdjv5paMNfx;y=WP+wdb99y> z5a2|5!N*Un3#>WjH5C;97^q@@R|OPDAw_&uv#6U&8f?!Kz`T+erTe1Bjs5Fg`o?Y6 zV*)DBuq8qiNHgBPrHHYwXjJWf_mx@w`TM+&(u5AllIq9JYrU~t0eSv}Y-%-i>ep_k z_+9q<3Z;n}aHzBrTga(TlcsY99>Hw9GuO-$8toA>k8=dySBv$)ceE{SOdXhQe-oxqRmHoR=2NY_1m{JF9Tzg2PWL9j0LFBFRfpm=8K4FRBIjoq3N~P$8%35Z! z@l$^}y$2bfsF0|NV$u}x?osBw-ZlTWRbz0$v)(g#XG+>8$#OlrF7$y2Yre~9h6I_QQs(jKv*)pT_Zg~tN*p1 zr+aM4;%U~>NJ&Ew9wB4kf|K{m9dF#T0d!p3`W2I9Ke+RnCnj&uy#0r2?tSc|UQwww z-_`2R3#U{kd?s4_2(+_zR9)3yo$qzY?h;quO>!%^e{g8>?W}*d-A>C%*UM4u!!M^{ zU8u9wywzgxOMtT==SjU-)udR6rwBNy)Zf3Q)DAn`_D9}=yBN=j0?J!{%lEPVukQ1| zYwMso(H}+1cm-bR9s#s8w?w2c&aVE?=r>C1P{Qf1xO}4 zm9IPQ^5+*|XvQn@p=b{0MBJ(payp_|5to)UF+HcWrfM&mgd*c5%En7K zIE+nZp4K<;_Mp8Nx*n7Eia!zi|hPL?k!-8g<5g=OLM7w zmWLG#HZQepRzKEPTn67ZT0G#~@gK!W>DJZeQ4qEwAdG4L5o2)!XLA!rkkIG<7^D2x zbLA4%YWZFf*?%l)CN)V<0$qumBwR~lfs%^a$KT(7#s&Lk$WeXvXsuM^9*i%Jqs529 zk`aFIJpDU!%Zn*oR+yW=nLnn#y3p5TtbV_<_OBi}n2SHiZcDBDXCCYaBuSxPwfqdd z&@ZQx=SR_2q4nJM!%q6HNVWrlfgJ^|Msi{J`6@PLuy{@3+1Qx4 zX$mxeC~&^Uc?Y;8`=QIGq>T@txUD2}M6R~5GTFxJ%gT-fRhkvO@ zLSf)gbdoF-wcdw`wxxBLdZ;i^(VxY6GF^YEIlEEs(f>5t&$ zCN$R(4HN!M7lcN4wnSfc?p0I$`o>KqN$yl54qnwycdU_=&5_+>PY7wyG3yvE>>T#} zo~*J$0YlH>exfQ0I~qpnLh15x^d{-MJ!8CMhli;9ZAG8U>WQ?)V`rY|^r6b%&(mqv z{vjSYMZ+NVyA1qW&g_2$``@+6zXbmNAF%&hsk3nOX{v)LAK+ zB3n2)Zz!b{)QlK~rd>+`aoXYhM@?R~9&OHFllhTxz)e(K1&VBK{rytx>`1clDTv3e z1|`T64f8k;px8G5k~HhmWK*LwAa6u>>tY^qp8#SJyBs3aCsdEW{>mg{%lx<|?wE2> zdJ8k^KN2gEQIu0~_i35FS%;>B@Op1ac%FjZ++b7hoFVusm}TLU-$#%psytv;Q8?Yq zR|is-Pq8}DB^tHzoabmsKC2(#pn+@B7>ZHK4PNEvsxePlykqzGn6%8UH1>DT=eJY+ zXGO(-8}@%}`pAN`XOaE&b})?$4X4A`h179+-gU+kNvH%tu}>_x^%+i19wa1xyg*#- z!fgaV@P6AHw+dq28k4hEo;ka?aG9$7Bu@|KS~V?zy~2fY2qbY|_#ec{Xg*@gn3@^TyWyH(KQ8!j-C8=aY#n8I(C zsFT``X&(;B+>fi`{HerFRka8bTGJRNLxAeDFZ&gQAifHkn?}*|_%cD4&FH8BxTqdQ zr}qA?)l?gd%>v!}_5@=EX&o2to#jh1T44P`@2484kg!Hf17d+6r{n<+9dn-Ll578J z`ke6ke1y%TtW}F!G9R@5`YuVh1=$tW@)h;(FdI`ongad}^FO~`|NUnDZVszh*qGS4 z{6DQ>g_hq;`?Qg6j6Oob?*WKZSshY>kWzwRg9EUToiDwdl!0k21AN5yG*l!cMM^uV z3O$PiQY0x0=@ZAtmg+|!jo-rg8wK$>(Xn2{?AT$MV3q`pim)~$dKi$H5<>WB`8XSf z1!3y&&YmR;upKqcDL)<``7ltNF`JP^S<+lwYFLpmbHJL0jFNg~fCP`4Bkdt_zKS^> z^>M=YGun4GGKt?3eY=81<-ckS4R)?Kzm)AxqTL=+M#Bx8rK9}hRyGd)sb(_TnRyz^ zw9*g7BXm9{>!-`w3BGYs8R7*}_B}(n9T$i#?Jk2#;Jp27H~w2AX343pB+7fkLRn)$)38Bl^C0^Sn~ zWrdZpbZS*Z_?f#YKPv5ws=YUw{V*3Nb>`F^{l(BqCjsFpd19%yPA%1iurj9VUcuT4 zv(&CVSQ*&RNzoiKBqSRcLSG8r;=%mvB! z5AiIeOp3@rkX>bfL{Ulq@m-QNu`x7pbTYTF2T3>lyNatgD2K<0MuWtA!0=sw08RsX z1AxGphop!YBq{`*hXRf#;IzJbz!sKWEq-E~Ft+K}^BrkD7kQ?@f1c#Lb4R^G{p{i4 z@NpB+;r(o>55_Mf6L3#?ZmNr$P7e#uV#f8pvqmB+8>BBR{*Es~rKQUn|NT2n&EE4DnXL9q4CUz9W^qrilFEL_6%1 znL8$}s%n_b^EzTFF>L&$<17=$_>-X|-=v?FtDl`m;tb3}Y1HCBXsupel-%ZeooBV@ zk0HOGhAhzi%;RwpqLR{TUfWW+sja`P{L8{-6@e^CEWBN}LQr!G@7Z1KEyxG>=7i|b zCyYRN2W7d8Nuk}Nl@VYoinWdK{=1v86dsxSrbn0pBP>)8l5yWa9Q)S&{sk(Z$FmPi zq~37SqFvkW-5=7nIYmmW_n;eG2i+#cKi{N_wX=nhfz#i0&*BwZXY+N>W+S&X`8y7lF|mzC{I7J9YeJMQ$GI(9{3X9JgSydUWJ8GaE(}=E-2^m?~f{!D2!; zBJmiWU~Dr;v|uEdP^B##lNr<#l7zEyJHKQ~@E!^t-3|kLbynIJ?<7TK(;( zPgjza2mSP3r2>%rU>9(5AB)92n8+Fk8O2ah-9Frgmiud47T5=9>$ceTYys5^ z{peZt77&F$_AC-7RubW?=2ed>G^<%s%;=d_SI zfc=pv{udUnKREYwovwEWev`I^$<&>Y78#1!XQr~!UY2w`@$Q=I2wM&5$Itw{X}dRB zbd9l>j{YSo?#$Dh#w>v7ZQG%Vw4+*1@<}9?*hqxYnxyF1$2{TU12)-c5ybW@@DzZwZGpBhKy<@KImTlbKERv_iwfJ|J>78 z82%k%l#QbP7PrTwk4beO2w9gzF;ESn5ez!@s=;O>-U>S&4H4%TI2Y#GA^Cg`{tVSF zdaTo%8zt=m`WsfR`{$OpzkyrVDTr1E*OSe{tjH8d?MoCS*X+9gH5J8OMdsAiD6y|S zo5{B~7D-MYGS2Z=Q{TmdoM`$zsHrbk6o$9+12tJUIM_5Fb1}&XGLZQV-O9FrsY~}W z@u|OE+|AbS6#~CLEp#|ya<^?Nr4%y_E(p_{!G4u654XwayVOQ!e0lrjOSIGt(Ddsx z^nljd`G!Gu5vVyVvR{oV_sTgA8i@KzY=Fu--NcrpI=&qdk{>o)b`QCyx#k5qA|2X4 zPtogDhu!)KTy2~Zyd~f2<_{;L0i|H~J59+49p-=j4eV_HiwF1bU*SIo&VAt;xonz6 z;YC@Y{_%#jR3ZszVm~si1B{K+qE|F71bfKOAwlC&p9G}W#DBJ+NE7~-#{JgQ34RBm znr2bXQjZeqFa&>WF@P(pOgen9= zn`~N$JH}5gFYI{lhcF23?A<)v1wSju#M(CmE883@@HkH1DJh(IG0aF4UvQjAoM z_9^MSB$uNXg%Qx@-$$lIGD>qywm!MGo8K}7Vi?#J(E8oP%yotNX3RR$Tz9~bzd>8) z_)x7yRfXUj^57m*nO}y6q?cW#LHO@!fUs_j3+i8_=mxLTXr=rH={zLVo`>NL_IJ~^ ztY^#my-nbM#rnUPJpU)we3#NWw6ntvcELtX9@p3F@>!sSOuW*1k)4r zg#ILOaVkdR&$2hl>6ym8{NpT99qb8sp&BW~4kx0q!K8q>k9cnE&_c2BF`p8wSY!$La>3ea+?I z4hmcnRD-Z-jqxA5OsW;@T^6qHnFCt=nOr2F!BY!^d6Y$mANh}MCyqhuF$~N=VAuZ% zcGiCc`zsW0e9#yOY|y;l3kdAG;VwBz+Sfn8HiA4Z#Q=dF1v>v6+R52DYnV9y@9Qz> zf1`}C7(@i1{XLk5vV{bK*}2oP2D|289;DvRm=rjFBpmFfUR@*Mbeh)9ZWi$LaC3{e z4o3a4WS^~ix`!z{c2ETde~?9ab{T#Y+F8{6<}Y&wfXq48_{i~!*qe+cB2Mu%N#W!K zq))Xb2TBB~hyx#9fCY1gWt;~AY`cFYg54?7Dq{QoZkvh_VhaRvevC?Ho#V|~2XZ#H zWP9?}p7zhF!anRZUvP%uRJHY9kQS+%J%4o)TaV331L*~6f3bj8V-yNSru|-x0R>6} zo1v|WvPWw>D}2Z@i#~_BWW;8H(!iF=tVF=Y?=&zHqx20Nw11?gN?9rN4?le}#$o+C z4NL=_e@+Ach3|jbj1dl+y8>tYYwl`xcD97TN5W0BXTqO=%16at>Y#vYohe;+Q9{O; zjF|5m{kD|-2Kc>5MGtpwBkJ;Us?+^F;PUn15la6PH7nXgg<)}si4gS$kQ&u7&D^Z= z$qb^IgvEW7OjqL*RjlKK^WFMERqdl-5uR1)3ru!n6FNYOm)$_fDT@|qs)ey%-O@VG z0!f=hlhkpL-(+yiS!n*_a>)mD;E9iUL77P`gz%o-{9Rh!z}5CMGzX5Szc+J%Btr+pxUqD+i1U^8b?HoZ{QDoD!5EXwbNuy{{ z*!{^Om|&9FLZ7vVS3F#{z4H-=>1YiMWBiwYd79?)AA6RzBnlJ$_cD?^NZr=jz}_BI zLi(>}(4P+azn?=R!;goe5QDP3#*l-O7XWmC&&M1OG%~ANZ01qAmfFs>%fFsNTyKHj zPvLsLdr3ia^TFNN96Ok>HM@dXWyAZrnElgpR{~RV>(Rs}8Rz<6A=;L16a#0gXK7084U{wI!vv^sfzZ{JC z)Q5VdjG1Umnz(vvr8D>5U`2;Ao6p4v(s!4elG($1pcBBm-y^}wDaYeN< zM}~S!6`rTY39HFwXA2NEF_q(db;*hZ3^|H*AyO4dmBUbH)6owF!d8TCf?5wZ=b&vb zz!aZ)As#X5st216s6|ozLeP5GKYYeCo(q;M$ess4xzRsI)Cv~%CM3!hwttTb!=(?CdlcL4M>CfLZB68NB41qLaEf!seEuEr}l)BQ_q* zC!9mL(m$k-N~l4qf*$zPmSt!=bl-d&vW%n@Ot^@@pnw0v!0@Jtc!^yng*la81$z^r zve4Rru)YTLdKQIn3U>DjNDeS{&lYn8&fpMM_&rf!bbSfa zt}t2+^7^CJFUg_w^!x6{KzB#=kAcj;?#|A|(dh4qe0Yq!H0bvFGK)uOr)a33=pocn zCNj9NgM@T?T?})J@ep&!+R0$Fq^f14I5l*4{BX(stbz?v8EScG9tJ+qUg= zRIzQ_wrzE6JLy>6$(P=1t^J+#?sx4UXPg@Kqw*s)Mm@LYea(5zxwV=ke7|FGoaXWI zYs)O;<>mJ)n0>G{4j2=etMo#N4r_*ZTyECIDwn6ctz zwdPV`XMk{&vI@@CTflq?GYpHd+yU8|B+Nut94eqqMrrvwSN+{efkecMU=$&qLxrN2 z_FMwpH=3`=6ELfkKOv}io^)Yka2OAc7$^0o9^Drnfrl;$`sZb$xMYjDvO%s-($@_b zs<|=@=8psj5}ozPsF)k7utwAi-Ri!R4t`M-`rtX?Jy9;c1G2d2e1?2PJlby@9xzYx zysDM#kX8-`Q7rUqiH2o(onOJJqZ3af!?^y)RL8IYL<%P^M#{JJyI@=Ga*NWr#j&XV z^|S_|s4>j_96f^1+ZfJ&9KC-QBNV6TNIuQN;EJT0(hXAkQt=1wQ*EJ}>WNr!ktDz+ zB79uhb`?LJq|;a2k?8xtKFi{GlHM(voP*b0V=o=sZqse#$B$R9V7=UyCilB$m_0w& z!zIxDw58ip(O_7bR%@;S!=>swHHu~r?2}GO9naLyKcwLr#9a`JL~NYBBxbd$Y#=i| z>#INlVQqe_?FvYlWEfDJ8n?y?8+4+YuD!wwlyp@%^|>3-b3*|aBoLe(Oa;Pbm4g<~ z*l-9|EUr%#@Z3~GZv$@*wKaaR?SfZy6TGmf;FIkeG+g~s3PO7^X$kL;Z|Fs;1zK$dw|8C^k{ z3nzVMrD*S(fB!{AfKcA_u9dK-7fwIJ!B&%1=TMP zlWG3&B4+=YIpl1lR=q(96+mzTnf+}s`IhQ;sP0rS_)mF5%{*+KAmjKn!aGmC>@US9 z6f7v|P_zN4b-YNg1yMCMYplBFGuMzaO3R1lth&fp6Bz?3gU~XSvuK_03!}S9=(Q)V zM9U%HndkN@qjvSKCd3T#5kN8Y^8FxT7vX75D4G9QfJ@Wxu6LyZ8b`c}xAc7L* zG%us^%B2wHQ1yk>W$BZoKluLr$4BOtL;q>+`OhHq&yW9mVftqd9zBQx%FxVaPo3+f zCJKcxv6KOYvT%dADr*QE8EE<2s09U9g(e}JuyGO=JdJkYb)Adjt(PdCr zs+Z`JQr+cPmtQ}5Cfwm7?^z{h5p_rg@y@?HpZE}1_fSJ-Hb-DBJ}0e2%~fE%{Vb{% zPL5KJ_<<}b2x=^e{OOHI`{wXpy%9$F4e{=6DH@xeUwP2Ql^RupI?TgZ{k}}*>7e{6 zlmF%Z`oV?}@rQmC`FzTMAA_f4WZ?YSIQ94Z|HBCc(bpAgx!?sX`72stShSXqH{)>JLfd4~22D1gE)Z!ueM*MzMrf;$v zSgEPPT}CTFBwr+;Xo3hH9{)KRT$e@NiQIiXi@6?w9=2b&mDOBBdb0(r0Do zA$M8Q3i&8svX}r7R2huh6&`)Ok9!d~;~SDa&j@B#3Di00GvjMV-bK(~1NpSgcr)y8 zYY>CBG}S1aGGvaWrg3*$EjDZKmwhZ^O15+0AcK;XwOrA`ZXKOLf&+j!hz;6dO`#nE zSKo&&SXeqTu*!JaT53Na|9#!k?`~K@eF6!WPxlSVzderrL2mtdeE(J-j8f{e{Ug9y zD0G4Fk8e&y18PhR$O4LsWk*F75Gf1|{UXA1f3zaiUUehdAuId=MMvPU1N=-eSZNcS zU#LKry~=jCwVw6x{(g6d{@u)7TNDv~oMI;rc-j9rS61Df&M55y5vtlvoZ_lN9szBg z3C#{Xr$f;1z5|h1$_Dj$F0ZCY=UAVSBNyG@B)CmPopfn0Ks<-HK{y z%W0%YtiEF_Sfp%^ZEy1RR64V1OK#E9WN0+TD@yh$s88cyqNWEV-)?!h4{mqJIR+C2 zT2we_4Fz+(@Zw9@h#IW&FNsGm&CYOTd#ZiBK9`uzwCcIf?+;-4C{41>ZstHx)wc7d zk>-#G#tkiQ}rS^qsCy zKa|OjS_7EQ2|%<9RbA|WxIC{uq==PLXIOxX!feYhqFJ3cKFWEn*+FIm8eQ}%8`W)e zb^a0En9ONw%#&u6zBx!+yi7$Z5C!_)GU84}5(D z^Cz}R|MXlS`Clf~XG!zFNtdj|vFOja1o)7JaTNq2ym*5ft4;Nps0BeL0h!E&j2Hxc zV4s@Zv4D349}EUI)BR4q)9)|yo&Dz*Zj}6X8v%VJusEUdCZ9zemB*HAz3$I!cqx-s zb`4R)675X7IO`1oCmiWM%UDBQ)JWL!p0%hgdQVB`k(Vy0D~8cRr;;fc$A$62nu^;6U>TE*-zZu| zmUU!=kRSREq)E3o6-$DW|6=osG5q;IvS3Wuaq3=dDkH*z&Sm7-z~N zBJFT)k{a-HkD6H}Q$M~GKHH#NARyCDJx5Jz9+00rJlnH&!f<6fiYef*UWU4185kdy z&tbz8eYqdsY|TjxW>86n-#Yj%QK`?vs$7dMb9T6Gr`u;)=`dHl0~7$IYKSUyIkShV zEgZ5t=yyd`^(%7LX7L=#b3_*IbcoNjq;fDJXVN_uS(sZ!%a7UFg=kT_;-!aPdty~o zk0gZ`E20k0gyw5hMk7#pAwBMFN}MkCY)XPI{;b+gz$r6N4cip?o2HeXSXy)%js|P| z5c!xm9o8Gj;}XD{>9Fbsk#)h36uKA9x@o(^X2tdp?xN8V-BqhCBv+JmcJeSa>2sBX zZ-_Z)%ta^Wmu=`)YjYcAyx+%?_l29oE@`aEkzUJj$G?PN3llZf1QgM&o(+2C?ci zp_v70Li6Sv4#8Vj)WZ*x zLxd5g6Tp5e+wE)lG*<;apEl*=e^2Tzz4_#LD){<747i!4s4aq8$3BH1S6N;&UCeyG zes6F)9I95OJHD{+KWAyE>G0aj+sz@Rt18qFv4Ik%ma4xulz}VeZYk7lP;Nb$yt1B% z8PmBrV+eN$l*90nW_jzG07Ya4?oj+RD*A2D7ixrQ;wvZ0H0jblOp!IJu3xs=&R+d^ zD@2i?eah}MSIm;+;xRAjMb3~__$m%-Of~y%R!*Z(;A}UpuJtaTEpKe(UOcKY*qT{w zDR(&}pj&uxxZ3LXo4ZMLx0zdGT_23TAri-WooEs1>cptRGeRa2#)L&r%Nqx0oCvWr zC~jK4WobbKYg}y{#@V&hZ}G?Dj^Wyn5xkoH;s7!?sye%05RlUnCg@G}_9gyGJ**U? z_d+6djg9Z9jf)sDy825`SiPB3PRV_6%1wUGp#{QG0hep??oU!jDDPzEjRwAasyI1n zbLvZagq+qi{;2arQa?jLg&NrG^t`GAq>E_UfZGXU&KoLn4&zIlmc!9A{iK6Ss~x-d zSSmS!Y4MWofQzT?N<3Q_`tVO$8l;>ldu*xw$n{jh^fl^X z@bjcM{oI)U{(ADC^P`m46&Lt1-jkETER%rpzmE%`q@zKUx)WqgD~p=R7e-(1WHDQ` z1N)~s$IHWC?_s<9vn}5Ae+Hc6e8>nw^ROFOm#lAo{Pfv=|G4_cfe(9-fH5qIR3SfD zOJ=|mM!11I;KRrrTT8f`7bFG~)@gvL>ra@n%JBm$-4L@mAKyHANJh=!9H4kaw#>8c zak&CpFpR6RWfW?+`fZw_-bmg1>DecV3$@BJ-o$!j>6??B6HFakl*4teJ!Wz{Cd8(N zeTntC*v2|kB-MaC4~bDIO@#RcXA8zbBu*N|%SFNTdA5O8br~>J- zHifyt*wsf zSD-k1l;$Rr51VGx#vAZ?p_hv1@k}(LUa%PTm>jPY4mzDUJk4l1BM3aj%1+g8AgebtqT!!{ zgQbUN%_hF+Lv9-&L4;;HBaM<23qn%g)Bmb-eyy0ulchz<*=)K(h~tbgryjiE9X&)R1Zy zr*Ncj$toNMDw~iY;VkNA-?Y#=(;z@fh4o)r!?hB8MVHM-4)NvS^L?TJci5XNo@Dcf zp!y@D`+LoilDUhsv7MXkKSA$*(9y{bF#IX(*HHW}=$!}c1A!4HVDwk-j|nGA=67Xl z!Xh?O3j^*1m+KE2?1dw?>y!GzMrkN)$gzBU^4yWU&71Qnqcds>rUH|pVXG57F=JBs zOmCk`{H9i51eAr$+5IgId00g7xc>e1eeSm>1|VoSk7*niu{=WyG4E(SjN~53^9r4?A#;&+bKIw4dAB;|Lt_@5 zNO|-Ri6B?Pc?}5+1-Hx^Pi+Rf0KVz zr1FpatFGF}oz$hwhW>m**-8hQle6;A04(OJPqX}K7699C5WU}D^%}?JgOigvR9?Pz zYaOyZ?*w{weAU2Et=p(NJMDhD=V`IqTZk#4|5Dk%h%rovEd&>G;K&Z3!-<@ETMo^+l0mtm(Ok0gw)qc~SwO0`GH@M&)cxofJ zUcPBr?PiqUK?CNRMmVj*)v`7gAAY05P>W17>Y!w{V~3-ErtC2T>#V{E~zLpzm(_?y@A07;lf;q)PL|3^$o49SgE?KWXN(mPUOGd=i zYm;Zlyere*a;h1BLJrj_5cm2OPfdZ90LUfQ4zXj39EBR_Y+a@(Ke5OSf$cCvv99P5 z7l0W;#`OI8{Sra%$8o+MZ!m+8%uK1pe4zIkek*^T)w#}GrOy_l@ECDS%;Uilc$GCy zKrMNSl%4dkqs?68&pT3sHnprsB^pRTT$7WZ1ckt$8e1t~Kg^W3op0mOOQ+rh%C>9= zhum0(tZQ`!cfxg=*}OPDuBc3iOnVE@A)2#)=4olRV8+QozNk9fFjdiwGd;4>gjv*48sm^z+m6my#_=ZTux8v>(3|%DALA6J4aT$J|ydlUYzEkSydzl%*GT z&Qb&OqbE{pjIy;^4VX#0MV?N7*6M}8=NT~-pPcl8jmzS;6|rKrcx9hU1pJ0!2AWnI zjvl<+U3Re^fWz%LtVgPFuH?@&IMN%}5t0}|mB_K=S#5@S?q`-($cx`nvtyEm--u1C zIY)2aVTC1Z6&u?Au8kmk#UjiLk@?U9vIHa>D*bVtCwaKqP7>PQPYh-kH z8^PQXq+#bZGkvwT(%Ob!t%FIO_>9~}S!Yg*p|As)=4u_U#aB&Sb(a5rpkYp=XWbxj z1Vnm}q;@XB*y3v=`~(o_VT3I9oWKWvA=eAW#aI3k%*NrwdoWH1WM&Jtynue1$>N%g zsXpy`#H1n_P75ottizl~5L}a>tA%7rBgCTCV9-W@MUT8rgj$VHkzHyxbq>Ks$^~7) z-6(G4W(JK=N8m}fNW=t2^U0x*uw6k!P~AGlJIp`~58$22LvM@JOblT}-1FA`6@YS# z1XJ>WX_1rg&O@k+u!m}}g>?3f=L9x*7uVzG*NGbip8AYgZ}v0H0TA<11XzxZ7^SgCJJlPto%fpwdeVBB8M7yd zZYme&yRVhn^VDaO8w1j;j1s=s#E=iHn-v*)RTq_nQ<{@@{ngOoOT@I7<6#Be*wlI) z73r~B;tLe3;ag;5tk&@2uCunY`x5mH>Cdnv34Kwn&^Ih222bciBfBJ1%tKm|w>+-4(#W}|3?v#bQuT^h z77R^)9~B{~a~aLyRKC?Pmi0b{dn3Q5HC0t?XK6JxOd~rX=xqV^dx$ykDKZrgw|t>( zn)AEwiuk|&`_}!*`Ma1&eq#RrexZGSvNUitptrTKqc<`)u(dU@cA|H(xA@B$2p7g) z7W)YZQ$9Cl&j0v70)|e`js`}~e-#%cyH*RDdK-kh5DH>)65WJO zqPS`#2{bo9!`^~*+69_ahegMk-kf_x%1`ON;OE@1&X>Ip#$os3jv$pVNSk?PGt*Do z)h8Lbd9?*)>s5C?MYaN1SsA}F-k6nJd(s0z(QYJ9~^YOp!%AE4in{_4dK-AW z$5BFTyPSB5av%T>{QD34iy0(bQuG`w`G@f>7U#i_cX=y)^DpM4mC zvB~Tz8JU)TvlFwb`n9cS3TH3Ilr~D+p$ng2k{S-upc|8r#C{%U4`;DD(9U9ElXQvm zu;NQJO)T&PGT=~atoVqzNdSA#S`e(7a4b(=HDb2Pnw0oCZ37XH>wEqUSrX8lC-)IA1KLV3t4T*%$O@E|`Izu9xgX0Doh$ zj`@=7u4^BYWj)_6Z&-cOc1wn@>xcD1bX)_U76h;z1Kt)%$vjw(0EMW+#>U{eNFPUw z7=1oCb9Rhjb;uJ4Vt|eTPX8`M^iCcC`AbPt>Od_MqOGpaFJ;%a2otnHl(N%!3_YX0 z>9K@fWJ6xnDE9Ip63R?`2Cf|N0BZ^GnRr`8^r1?*$EN0 z9ER#obDVr&$w3We-Q=2suYm2L+g=L=5>)7=&2;I+)qCRPgoTG|!9XiJ>sW;Csxxa_$UJ_u>Na$iHD_(yf1s<>MYe55 zoU9%?g2YD2U@oN z85j#ctLX*S`1i`ZyCcq;0d7%tuP5bkrp-iYgl_LMDqiwnCB{)!$yRK^t@q=MV|c}` zae|$MhG-~5gD-j!J93c=@{7d=H}F()vl#hWLKGx5AiPO5h1vl{MV1gEXi4>U0??Zx z6wjrFrjf7iHsU`{^p#fwM$!6oF^bM~%_6@%k=2jJ7o4xf}L5sU#!`Ac);cojiX85U^Y&#)a} z3Z(@&9Ae$1YqluL1sO)QiNa@Wi!;2kM-k>5q>enK_|cu_3+)n2CaOy)y3oo->QY#K z^cte=he!$x^3`hY@V& zQj6yJb+1-5ryyDpnVx|+v`+%Ig45f`svF*F&XVJ!&a$#^jVMmx!YL_pek5GKwkHIv zx4h)MRz3jJO9<3{XO7RG&2T{0^0zv8Rr0B3H7YLNRI4*tkX=}IESK9dBAaq2Nah?WR-??ePvJKA_Cu33v>vEZ zwask^%zu$MSM(W+{BDjg%V8ru)Bzffvn5QksA=&pO=o?FqTFISqk=D;@>6 z1@fS1DqFdy3@&R9^_)%12vX`yUrDqzev6gn4X0tDp4n8hElr?-H_24KFiQn)hBv<% zHX*=D^NV7aVz4?{!M>~iPW!~ZY0bvb8BIkAn?j2Cs>YL~P7%JhgD4y36+&uCK^h87 zqUmbMvEZ70!8+_?y#1l_syv1qX^TddkA+htGtL&%xA?KS<9$NKSL>oBV+AY`M1Fl0 z?%iUATGGXo=!|n(%%{VUsEeXoZ{UeJOM-w>e<~a?Xx#ALUPWbWc3oC-{WO0DD%i|W z6V59Zd-N-`RIcF$){O1*d5hEYTjGw1UY?a9m<(A(Q;w@7sO=C@;Pcw8-rt`+NaWD+ zco+6{M~1zi)xFz7X)(?jRkY zXma54R5rPoz+kF*OZ*u@52ev(S^8~015OhoXjLezqNwPXe ziQ^t2a$_{mPgv|i&MQ%}7l4w{16mkOF7g&`ZI41l0%rPEdTMDJ zAyk)%(a)Ct?GZwZM-t{Glgw*yjC+mhqsMrJ=WMOqE8ng%{C)S6xA{FThPOAde5+a0M32il;^(L&+34XU>4qhUHuXxGVh(I`VfMJ#IYABstWe-Mi$~3a4 zvRrX0{9#6E(lf78oZh8>9ntx{)67xqdC@Qf$%q}K8Y5c+0(g&{Z>tr#+ zN5m*T|N8_(=|`l29qlrAL8;+!(tz5Np?^#BB(5&OTfGVR4!-c6Yz)S)H?20uFQAAY z)D*cUU=H>94=z>NGf7xBk!|dSNgTgu!yh`t#fd|>%T%kxw1{jn&9yAFEx2n0n<0m+ zTW-5B_Ogn6Ua6Ip3yVH2nVcvp@d|I%3@I~cfd|s%bxSRhy2LmD#RpDC`bOF+B3N+6z+qQ zpIB@L&3JW4_mMPKn?!m`)v3#fV0$T+$8d*dw^d~A#W6j$$S5X^f$2RZ#&l33S6Aa~ zNqmWD1s0^mzzSaZPRp+EdQG4^-LV5&3 zd%zqs!Vwu#D-iF#wg&R5V)TS|12lvvDzPwyXNO*CxRw1-vw(bEevt)q_;;`&t;iD&p$`p6&VsbRz*?amcF$6s}-G6l<_L#8Kf7^rR2PC!-D;eANoR+Js(sj_DUK zi#Hh%4|Iy#GJIP?XFB)$U6pcAaYpD5&|)$AA*@1#qFT9$m!N>bTk{_X{ zH%6-6a;XnFd!F9ICoh@tJ)=v!w^=2Mz2s9#%x8EbrIyak*b-i)V&A@%D`olzvWLsk zP_c)`!ZjCV+Ng3Ae8^bv;*Ok|BWfS=1vx*o9UR2=DfKI9;hODIKl(nJ&89+UwN9W( zUK0RORak0>jz8xApd|dJDUJMMrZ zO+ExqgUMHK{AC>lqo3@aPwuUYC-n@IzULv&pF3L6J@7M$6;Dl{t<8BD_4&7gqv{Bee zTQVW0fFOlekWZ)7VM(`w(Cd=$n^RTJ!MD7`Yf_D0z!~N0c*HZkQk~EWHCr-PCNp-x zJv3KEqa~JN$WK6fx}y{Bh~pxlXkkXrQdjDg2oVaz$vZ5FqJgD2YJ9Am2tQ7cXcE}I z106Wwr0O+FyvSf*v%N$Z2W$g*2R613YfbCEqoUz*1q}h)PI=??nUQ0~n=Mizdq#en z-*9N!y!i`LOwxdU1@>9=iTPxT|Gt^we`3A=Q>qcAIPod_LE%B>${uW$u^2CarKQbN z*i*$IZ2v+59Beq!g*MYKxfD``HL(y`sEFSocNP%^OKD^gK)=AYH^} zsw>-TCez9LGRLpm8?+VxfQ)Wqg83m0h0cB?bE3Y}I$Ad>&yC=}VW2;Q5$S?Ce$N`X zWbJ}+?==@aBky2x!nftO`mk>^2V2T?DVhzzNtC?GOMhk|M+Q@IRn3kdOF=wx9>#DV zI4JR0=v0zXSod?j8UIFf4&1S{IB-!@NQ+@N|fQ79IEj zE=|c#(0@Fga7FhGqkLfAl|EYcVMIgH5nFi8ItufQFN0;!)5+V9{X|tvFTZByG)2EP zV=5rqx!rPS}7dSXzoapdoDMqa%nw#@HN8hE76b(-s3h z7e8aPt^D%Q3%S{Dp%P_n4$qMJrSZA579qj&)Da^7it74elw*DQjod5XJzsIo82JIR ze83D6EmyH=JW%0rFmt2cU+(nr3GD?rBzk5^1=fbL#I6$N%S?vUB`b z@i0p9AH_pBtWzV_Z{$` zk~_x;(=ZdHy#vjslWmhvQ*N>|yQlA8zt=n?^bSNI?7L$cV%2zeJ~Hm_!y4pYROG*; z&7M_8z#>{DjacZJ(>4&%fl=v7htG#LYR9EXPi%M_O}Z7SwDG6nW3se}{!G5DCXsec zOzx@p2xF-r8e?Z#98-#`f-I=ygYo>F?V6^l4T)j-u@}u^owYB)E?|-=^Qo5dNLWH; zX|rAKO?HJRoC?V0B~C^n8{^DEt?_DPNqk8vKUzJ;$Rl%MbO_V2G6d@0p!QMpl$x>*oyf(0&$O>~eL8%dQ z?>%3*Q*saGytd|G-FreT253igay>q>nxi-Ms43@3;V>T@VCmS)9#@XI_y5GgLK}E7 z>-6Hjn_)ctIhgG={TJzFLc1|8?PvLTANoJFp8eg(|FfK?Di-snoR$Ea3S0cNMTjkV z()Cn-zvYnm6($jYsmI@grCC>P>`gxil)QN+izPL zH7jpt>w)B7igyHoy5`CaT!0uWEkx-*^SS8!SXFH^w2JqFm!SBVhx4or*U zZ8;oe2vg#=$cT-cN~|iZupZF{8h$u6V#32|zF!+P66}L#8-S6Lkyc<3`x}h)XtO60 z!$HHmN92Y78t!F)uVKB-qk{!!!TF&N*~n*P zL1aC^5v!ZQF}R>XTjdvJMnp|rc{;3KQNQG@o{fNUN6%19B_s;Ql?+``MdY<0AcwW8 zfd#kF;9Q^BGDquPtZi9_b)leTvX7!XVlRzmZqa&<+PgG|{yVi3%Cc=2-?-QrW{?0^ zh*4V14`w!YVYhcNZUhmRnL#52T=L!pgo42|O1mqb90`92gH@53VHulOpp2(@w>27> zy=)&v_ME){By-UL?if^*^(c%!&U0XVx0g>Xod0<34C&-i>1e~~EV)RBQ?ssl!^6a# zbmC&}08T{^*Vht-Y-{wkR;<1|Q^krEKei8uTxw$0f6bCJ7f&%ND9;&_wjL4VVM4X$ znvThf=@>7G(AU{0Y7cF@5&6Sf%OgkaSv;jq=dO0L+TCIqq9${;*Uv%lV#M3Srmu_>9tc{7SQLbfkEpy(?_us;e^coLa z!%k37B5jO)Ws9foJ3u9}?`b?mpcOOQpj05MMUA8feZp8Brhye(a&7c}Ys(Z|6C(~R zG16D(ZKgBQ5A$|O5W{YI$oyPp%ghjj)DikAn|-zC$p-nTtN>4;7*bJ(AvVsk+=cii zi!OuZX@OB=02BlW(>p1HCNp4)lT01ccsUUjxhdu{=j+&38MG_D;_uNYgtu6;Z=8$7 z;be%$-BlFrmK1Es2hk*XzFz$yE~ph+b3(x&V-n@Hu*Yi^BSONM)Y^v5^(b9HQE!UxnsfgomTD zuDxY}cN8*>rf*Pa?0}-`bC2un4Uo;`RHLFo%;qul;jIqO)4j*8Mw<)F9U)ECF3&CX z98uEkNI4nIzpT$n+DHPeXuir@=W(_pRfwTJ$#qrN<1wNzi&I->44ym(Fkd5v^E zRqn%g{u-eo-6tjmPCG18M>A=_th3ddlN)e^(o#TUEkj`wfNXO6CA^q(ZZy)6wA%{h zBdFEK4e;ap%eE_3J?ud93F0(_BJXJDYGG{RNb;`_ z;&#@5{$%{emRzK~Z8!fJo=s=;W6_o%e_Agz9BQBnp@BR_#28B^Rm(WPCdDzB>zww~ zM&eO#H-e7$`6SRUfiWAcSOJNsL1HGR=Ggc6yshi^m-iezj!jkI^VR3Xhxa~m z9(lHr_?Zl-AB8kac=6(V$}ky4x4)bl(_u02GA$1ssduJ3ba+GcHhQsyu7raoRA#o$ zaiGX^$BU9LDDi@Lqe|Fx7(^TG1@*wh9=qv7=23a(s<`~`e=Je{uu)QLI1KJ4&K@^c zgJLdcBl2C_CLed;p;fU{1M#V`$_vO0CQU`V5}V_61Y@OHQENKm~Wi1uztA)PpHo6UJ;kEZk_b2W{<3XUr z<~xnq1K>`9Hd&mHQ-M9zN-trd>w{|C(yXPA8Orbq_S znI2N3Q5P7|{0fgRDAk!v2@!ZCjW>@A1-ASMe_k7WPG8v?^r4GxBlC$5(j$o6Rit6R z!7cV*ERxOw(au)9(w1zWlSH2%`BjhQcq_wM)=*hcTWEAda8Xc z#ssuaAOQa<@DcrgFeCp35l&SX9bA)?FPtecYfc`p8X!Ut&PD}<0=OA}VNqf1PG&Z&Ee)oL(+DpeBrB4|R z?MM`0!d{lo6@VZsY7bSSV%*P;EP!T4%pP)wsLdZkfUcsg=)e&`QC-?vzLy?;j)>C_ zD_}d_XRv{E&>Y)JJbOJ&Hm7o5&VV93<8c+cXy!?-lcDUtbjeV=iSjIloVF^0WQR|2 zz)|F3>T17!&8f~0FPp1Drs}-)6qgyK^IKDjlNR&AxU`%N)pIrQI%~CSrCRFjR1T~~ zbm)h=2ZtHl18zG{fw*kYKo3s&fF>966wY-neXOrdiHM+96&Os_8f@%WXqnwc#DFw- zn&s0{)X(r@=8|mXG&o^#B?SsBK>6<%v77Yw{Qyb}QaljRu#Bd{kaBEaP%){Tf4H2-&1 zH5Ji=$~U@t>-6;bT0|i%0Aqe$Xb2V_;p|Tgxlx213sO}|cJBSrW|@mgTI4q=6RXZ} zRGRdBD)l>;)2XQ>#|8SgM5-Y`9}M?$^P$h|arRv$VMHGDDuU}Ua}(D7B%P3Js<01! z<+sKY@T1%S4i09F>pbke2V6==i%#U`h?Fh-hmosd?Jg`0Mx;(D`mS?p%2 z9AAU6(%0mQ$8+B$9LR$#pDeZ#Vsryh_9}Gm*9P(OrS-9Rt#FfHS-U=zx7p07u=xrO zX0&RQ(NH5Amv*zy@d;p+#5VC6C9|UCNg%a&*zBUhut`Y?iD+{7Jc7$x`b!k)yaGOi zFcTab}DuMj&B~Iwq)siXB{NctaNpmwF6R9&>nDBE~3Ax^I_J+hFc1{|tCDWbVcMWVSFxvV_$qdmD|Avos|tr&jtk1gGOOFHx8=_k|prlN!hh z>tNT*dIISm{P>mX?lQyMN|YOaW{t3kzUU-T|4E=pV@c6YFP1PNox>NQxC_;+yoIIZju8e)d zQ$2W`?G@NbLaYCzoV_ixz&#Zh_7DeaMpzOrOR>dj;_CWJcT#IySVR zO8aD498PrGFQ!M6r!Dw7-Ct4%^P}I~a}8*~l*B;bUG5FFM@+cq^Na*xW3&)P3IUX` z3s|NYYt4mTB#&+0S4ZZ?p*0+EDN-C0cda9{wq|WUtwScd?%DRZ09oQXUwvE+(`iSh zqiE_!C73x&_xQ&~s%gTeL_i&T9YMP?6LtgmA__K)-R{CdWmuvtBU|IAx$;5~=cp|~n zVO*_;WmO+HaZ`p8zjm?CTkKmNeV_?TfM!g;o+3g*pC;Ki9M=!}kn{`BHCoAx8VHpW zA#{|%)c(cTa3egq6AtCGE0wt$k!&@-cHeXFT=r@M!f01+m3dfF7m70a=!_FH47*m< zQ%vO*>nmLQbu)Eq4AaKumiw%?y;B8nRzbb>UpjSuKgCnHbB@ajj9dN4JZHtVS7h6x zEF0*96Cl%v^-G`nAsQS{jAP)0n&cja#Pgj%2T(OHiJ(NCt|?a{4%D1U_=ssYizWmN-kzHUHLTES{#%UKvF8N6zp*AN|kxlURE!s9p(^Ys=C)GUp2x2NF zp4{A5PLSlg4P5;UxIB*uxV9MIlq6PfZh+blLcereOn4}%TwWG|s=$2U397j|Ei(06 zusN-=fDqyEm#MP|U;cNR^3~^G+laA#q7l%zM;E z?zMU0_ejqaQHEWZ`0g^6>-y=1Kvm%v*M(z^ zSCn_wzF^ymgencM*z`dH~34#EhD=MS$3U%Fn@EaffISzPMzgmokB_|UH1 z4*(528e))m;SKCEfRv=dj<{zG16YoB3Sr?EG8uXsAd@?k)dS3zwl&BVGbqJYaaJzM z=vw|IP8m2*XzMP~QT>q!u?t!8xXz$jtcXf4DO$Y)}2uaen`T4>% zoyBwpGkpg0{qEO0ZM(iak9IEY#^yD{qvrZ_<@@@+hx#3^wIGk?2;HoKKhhc&x=uV8 z`4d4Yv|?%YEy$xs1iOEx_EG?Sh5kk}!~{E0C&)srQmI&{IfMm!Sf@I~iF&SLJ<9-t zEz(d10x)VYZ-y9DHE_-dzr?bHe8gQTGfV;U2|d^Jb^Y)=LnG+z5rXUNx)%SC`Gl8CIxj;pA^Z zhh_8Pzy)DFL+X)GjCqgD<3(o>=ewmHakATN6{U@pWAw5g#Su-aeIq@PX8zp#EGvr! z;sCn1K*M59_i$-{2r=;ONUDQ$BpA?U9#p4ZUb<41tM0bmG>{E7&Nk+ndn(+HKvxT# zfALa%yda*YO&`I6*h>{{HYpR#KKrzXL*M+%z6eCx1bY~rT3(f+G^LL)fqNbr+*4|^ z4OlgGX)pHWUm%xG792;~}nI>JI3%A~(n#E1Xhu-U+| z^&@6EdK2x`1Df$ZG8qe)v#7HF4TK7gA$)eBVL-hG$+O@DhUKuXv3j`;QP7_?_h?w$ zq^XM^6v?i$qloyM@{HFhV3uu?A-Kr)FsQm`@^+*ySKYv1MdohaSa2ab8I?xk_2KT! z%qqEV6BLcD=Ua<>ovH3nBscc$=r{Atc9+)znIo}vJyILg$lu4D&of*AaC6Wp;f@U1 zdUcEa&Z2G$*v27&($uP1#h+&<{~u%T09?zru6wVn*tTtF#kOtRwzFc}ww=t_wr$&3 zak9SbbMOA@p8we&W>wGbs_v?;IePZ!(a(6^-xDayiB%9E6LVU$pBE#D1%P)_=3mww;#{mnrax`z={$)0~eB3sU0 zeE>6k{{7}w^wNStQTEW1F=lfMKP2w%>u>ExT@&!kfldkbcxyt(KA-O|Rg_DpYeZfDma=-yuN0P$5~*zk3tDu7nbGVlW0 z-J-p?wMc`D&s4#%u2)?RBSRFl+5ku*I7W#I@T6`D5A~Gflu;FvzV0-;oOn9x&*;I-;ts=+I)NMH zie}Dg@cw!=LFcGXh>8ju?&mF6mIMMHs(<-YX{2fFZs-*%OjTX%h7l z$~m%dGB^sVfOLh(Dx47)jzSc_NR%-1^r>>}?a>wv?aNZaUy7vKva6>OF9mWT3D?_F{Trn-O;gY(p_9t`` zW32Rp0zCAnF>?#_7yu%BFOD+C*WM(KM4Stm z=w2cmsm@~*8JP<7QA8J_8I!_kCNeN%AvKth87ZwynM#bOq=x{Lm|vwvU{J=R zQ?JDke#ziHcuK``!+liZI8`iS=@h1D*C|++L$RS1qqt9!!v^^Lhcr>6qD&jSZRsE&9Z3WhV_)O$W@@}tI8;j!$}Ilj4gG8EX0~0l0CvYboO^6W#w_l`7G%* zEP<==$D;|44~Ixr!ixbPpCJEz$QSRPdx-x%UHLCK<$q36Rk3w6ak8^^H8B=2HvZmp z`X^>Cj!){Fx;nIz=7)j&4bW#TP&bdmK~s%DC=euBHCKen>>$)wyBxpLxwX=OL~9Pn z<*$463Uex5)mZIJe}1_$U0a#?<_m|a*B1O%1+7G_Ld?i9s-6rps?ElIl7n;>D0|NO z6W%Z;o}MH%@bo^hF*O30?_E_bD+>|4)rFY9>V$}l1#I)mlpW2{t!hLpVYMq*uA)fy zMNUJebOo8+SDjJWYl$ADWI~IL4`VaAoz5Y)MUk+SyA|r4I+_^+u|%CZOqhF7W&B_V zNc^*07e;09myZo%gTpo{8^p)Ry+E2Rr--?Ej6R5#CXc{Re3c)OG~L7jx@=T*O=XT$ zB4BcYrU_pFop!@Dv9WAjnP$9`?mhG-jh|%12=^ZKE|ClJ4ib*GI z{uTv5zuW#l*L?pQ!ulVOR2<((Dg>XxxtkdMZzL6fF*#XBn2?~TuI>wxF9X4sBywWu zzY>+n5$DYrCp$f$nQNa9Aoauj`Ni_6XNg&AB;qLh-J7A0L^3$TWG-?jsh@q4tBzUo z8{0h2vq0-*LEoaD9dg_)v4w+gdVSACD;TQf6s=HcBS`uIP>fFj6`sf99Mw z7-sbsjg9TmwP|y#%>Rj@4M8qH`xlfd@q78t z$fSS$e3SntDix3HccMV>&Y>DeXwVN>*n$B0!Gb&>VPt+uW5S}}ztxCLqQC(rM= zWX60RY3t)8mwYCUm8FM0{X2GFB9@qMoMe#v)>UZGIzu{RKC<})`m5piS#k!Jgr@+K zM0JAW9iPF}l#A#oc+0u&t17uKi`sI-*hi)^SGO_O0xPdq*vs^o(>Ll@BB2y9_hSF+ zICnA6{Gl!g&EO<=DyTYvWqkN+6eA`%o&D$~wU?EuY&>>Mb5TBZ4M9ynNmkh!Stn(X zzH{av2Ar=@jmectxE;c=ke z9qjtoR@aJGYFrAO@N0K>$L5ySU$5tDB)s>Frw$+*de+--sklEyB`XX;h(*% z27=N+<}$n{jhRXFuG|HKL+`8L>Uq}1H62rv>3QA4LK5E7^7)Ra`qmzR!)uzOV*Vvg z%uV~4JVYn!VS0@oyP13pjp1wij2zp+10pg<4+yW6rr4}7u9{72tpqYSHN=Z8LrCUU z8#2}FH&pPmW-mM3 zdV_RV76z_l67c&J@m5$VGh@%c+ufQTYc<4FEqu7}Y{|T&IP|Oe>fB;WkpD^&Chcc( z*Ia9xf~m0?bDM_y2}ZQ?Ga1p|D%zfLQtp+&FCH8j$QMsH$QwM{NHJs^oq@eW&GbG2 z<~4~0;=RL~pX264A}naQgjkTVP^VRj=hV<6h9vAV{b=TA7PN$AQLX*)<{8qtrF^(C zm+c1b&g(%u2{iTj!8jCS^iL?}4abIiFY;P)G^TLDMpk5@OvI+#UDG*;PAs@GgBImz zvSb5ABe={5LT3j4oC(^JH5nx0Yxe~Y)jT9*xUz5#FjUpkCCB1v_ObAgN#u<_h~!fs z@+{SnWKiKo3Xa{BcB6a84*WoF)2pc9S>+)}K-w z8O?7JkKZj5ha;{lSr|r?EXR<^oJ$giR6`MjoQ=RFf$d?~-D{h@xo!tzaIVSLLnmhr zPJ;;Sbygu5G#3 zi$BdQj8QGMxpoYdb=eW1)J(=%$w;|y~Yn(KUj_u|2FOl}o4)D4hMQA8__K_yI zumA1xMq#4WNhl|Y%yppEv8OWJi_Zq{mqDs2DR!x6H&|g4hnVZW4j-8^R-?(1Ob0PJ zfT4IVk0_clX3rL99s8rL^;Rf!XU{o+>GX}jY7-spG=x^8#JXSNjOH#7JzJy0c7(SqaBUi0jAu z@wI}WO=%2r?4(LO!`38^4uUIAQ>C;7`BS(u#tomftIs1yg|h;895@4;A>?o8`42eY zkS+pDo|-c(Hs-(MK68w(Y{E>0J9_&)7+15Z#NmdKybjCwP(l$2{}^i2XZh1QMDz;6 z?MyxpjceV5(&Pl2KDbjcb7qK_O!;>!j8mAp z7BPT4BY;S|_HThrn>xZJI;Cfc1y%7Sur?UU(@~}FQUR~*dFnW0v;whV8iLM=k}~9k z53S}Tx<85nx9kgW!mmh@%qtW37h-3e?G5r*%+sn?^(z_hmeV=FG(3*^kks}b8Gh_=!dKZGsi<#qhHAZQI%3%DZZDPD` zw4_4)7D*`dGwjmXK6WTvSbw&VyeT*vwk+AxC@yKE=Udk8si8~z$&@0hIh#n?e908u zdvjW%V5HKo>;urcq4xCia=N$-hW!DQ%L#;7wO|`eed@FW zbtIbMV8B(dM1pPTn-mEuPkFwJ{AV?1xP#XA@;7ez(Y9=n%&2afC*9gcx@W|tNLi_) zoMx$m-1UcU%@MGH`aXMW1{`ddjS$B) z48R{7;h9d~?l&g|RX#|YbGX))n%dmozQC~5iZ-B)k-lYy%mD^YXUG%VFiMRx%>ZsRnsi}*vf z086cN&#+wLE(>#Gv9EksW$_iU z`w2UIwF+lF_jS8wJv;4p`pvQ9>ub#!jI8Cc?}&DwB$iFZ{;}hzXQjcd*wu=%hHu^w zs!Fko+`QkK_T@#oJXKiKJP@1E=2#qip={`zYJLIE@1WEMl1-J`>jH*Gz;IFe>XpT< z=n;Cb;QeDbiG6PY$n$*=`sFaRqX*iEZHt%`zeg|N))ghWLY=nrhw7tdW%kk&S4yEH z>jIX1I{NloJj1$ZBBJveQ6z(2+sJZA>}ri_#s7mOrDAv%%=9;R7Svy9U|QM^hpr-_ znj1q=&@Hx*5ME~Gc|JtbD!#C7b9wRw$1Kt_YS})d3K>cl&Ijp>@}A2c4Y-j2Xn~#d zIb}z{iV#cNT~dQ~w+CZMAfpO@gh&go0zq2uq!)nFxu}DZF(2e;!l+C+rOvN`15^we zNm;F~2x-Vc8l+NwrI=!`SRKvHGfWq8p&l}^edm}6a!PDHEYT!seuV0mC;9;tV$Sm41!gGyl8}0>4wpY#m=e9ieF7IUIfE1YbT<34<&?JbLJK0{jIuRaO&9!b@zg|B6 zJ1ZjldqG*`S96y#-sE$0*uA0{BgXI~NpYX}KxO9faxb>dag>T=FZtTdNU|edn*2>U z3ZCD;%5>B`W;yUS%6f5)@VmBRrnZb9!Vwx;a-&sS2F2?c6)#Rcf$93oR1KXIu2#=k zMRohbKC#4{cqQ$Q@(x{CJZYmzE{(Gcp)c}PQ<`^a?RkQrEYbL|+dV;*O{6`ulHYV> z&noJR8j26|D?MS6CTb0uR|yrTCeTdk;hDQ>gX}I)B4;3f%$PbSAdzV!%H zTj~qA>(B%>BRvSfYbCa>3+B-4pXW=fpx7XgBkn!h6FzYEePu!3Zp z9||S4e(+YqL0kM$7q;r%&%m#=1bVc9Hbg$REBwV7Dv2%Vny&5tv}y8m*N}bGd8rda zO)xt0$DTC0t&Uyfk723)a&L9&r@w~_;BPQiK;gC8Ix5~5nF+YHkC&Ur1vVXx?g8K! zGucT^+eU5Ls*Jp(Qs)&bN$NvnEag2b+KIk!v@YaSjO`&?HMuS%%(=`v-aLU)KrAxI zk%KpRCSap9dag?lkJ(Pv3Emi1EAHlNT{BJXqQ8Irn}VhVj=SEj9-gx@-;Vo{LTFcO zvN-xddU<%KbgylS&(j5$&=r+ig__N=0s}m*cZ+Q68;+yI z0GP!f*tBEaiYa7z*uW7tsics?qQs%P7UUgHaBz;aP)WsHZuM`-qke!Ypanyo;Oc8( zSFXWGlV{@WT&Zf~iug@?5^c=T0v2kspQ&_J#&=W-81r2Abof1r| zFEXdK_(#a*bBON~Nmlt=N;=EhPbOrL#ELT~J2iiLa9zjoZ-;kSdr+^BDI#{_R?0sv zud1gHTE05=j6*sHleSpO^dDanX*76#b);ovlEOXsi=?llVLw2WL@?BHupK`{Sn68Y zPM)BdTxVcEaD4B~!G2i#UZrC{$bPS~v6(+}`%QH@+1`({qc^VXa}~0@y4oCK_jEJ8 zG%`E5M^Db#+eb_h<*y;qdVK&D{5~@{i)K9m;vCN#j_VfE$t@#sxo{bO%o3GVmFIy$ z(dG;QeSS@0UmZq5jW9NbBHQg)9|xz|GI6%R2m7&0a19Zl>$t1-R_(1e%5|R)@yV*( zbZR{QT-1~Is7h$&bbmu{~cM(h!1={XG&;M|&%*Jm9VSjrCxxaZF zB>!15P_noF)@2+Goc|51%vM>k{THy(sJ3fWm$PK31RcHi5zErNgv5Uq>D;tS7A@61`)DPB+-b&+=TBJ%`UxoDTRix_xX3U@v-f>u{+*P#yM+iQ1pvCdj~iG}qh zOMs83XmFZ(#&oiwHCgs3DWowYX|D_=C^hjkYNC}ei@~MONX^=>IlbYi8Ca_=0qAg8 z=-*yArzxV!J=MG^s4gjvbz(%fU2JNrNjNcmT&Z+MYE-fnZPiynzdXR;lg6R?fI>ae zuQdFnREI}hPp)9rSG}S;p~?;@f8<>rG~AYs+{d}rMD@!Kj%6c|D%nWAIOVa^ zQena~$?kGdC0tgxd@Rz*k_yse_xzbTLSZ#*e$vWTvPAW|MOsDT38>V5pz&%U_F-}w zY*r`J2b<1c;uoB>ra@|4;74j)Es=TK@B=*3%}{%Rl^BKir<)^=papCAUGw3Y3pTAt z7Ed=EINGh4OmtI}fk{7N)yeB;gw}cEID8omjhb?(VyK7y0b^3H7+{qb#`n5fdAvAP zGso;wJ9_#mIs^}F^P`2Qwy)QAIH$FITw5xvS+dhYKfJao_imrM(T~^i;}gx7@%++J zOw+8Rjxj?IX_&fDuU^8g4u$&Dqmgw0!+v$<9=Y(C^R zCC)p>x{0n& z(ru`o0r^L0(6|@^QipJgOkrtW;-(_HC7IAX>m28A`66B@-j7lX0A^EgV%LN|LPz#V zb+L@8ziqzgw$8P^h7gH;DO$p4P0C~zycW!6u{x8)Qc&o+OU;3z4TkF5ohZUXx z;TxRzpZi{>X|<})*>%|>+ncvKLkogz31hy!g96f?Z_vH_20!8nf4i(QLG>Pr{RN5Z zdjjLH>Elhp984njvxkFq+P=%3#uzx>ShLriQt(A49|A+{fz>%sBYMHf-*Jk&C;U0g zIuxz*^<+zP*W(GKo2fJ!LcBWepv8WV`|ruE{|N&7wwwGn5SXKri8KAb4~O{i$I(o( zoW8st_FEl~`CjP%)8YS;alh$bCXPaO#^1pL|Ck7ij+>Dj;Kvv|v3dYEvb55o4*<7o z4(JOcFHS9+MS9FT?v9Ss3CCWu9$fiX-V)UdQg_Fn zh&c+L?-u?_z4h9H#}jh^YF2y(~Ye5jtgwRTYH7w8nI9n0YOyCFf!OwO6kHw588%#{#35WY7lVh z*1=-H40*+kzRnR@1#<`2cPiVj#JDA^aUW;(fn1>FS)1QorcGb4|Gj0?uCYXczfEOE z5dRa&{9hO1UoHE6LH=zeD^@=H7f=7Igd+<}NJ^s3j)H^|;kxn&W)EghoZ@+pQ_4{M zQlASH4^;Oz-^Y(|M@gKXxH$Kp+aQGc%Z&LfuvA3xZf0(#-RZBcu6#azpJ=_T+DeS* zLR2C3rP!aVmHN36pX>za;KfPt^MoA6X8L$=6MJC+g;Xp!O7_|&Q;?t>s9hL}_KG6- z2Y05reUzZ3s9A*0m@569o3uXCa%wJ>S<}icD^qKp66``%t{Po=<+kpozjP3$(=5VL z1l;;)wAxqfLH78`JN8QYnXUi|bGT~m7A>|V%rdV4qu6vL8~THIi7>fdj$=r%XKPH$ zR-bphxPg?`6U1fdnLq?wR@#LPDG1U8;>($g4WPI!|^O z6rFi%m=qS8VSLC0k|kw|g}Q$-7OP=)QZtgOOrQ&_ntgIz*${Xp7VOC5wb>130o@e~ zj3KVUs~wG&e4%xt9MAgvb<`8+G z)rOC#|3j9*yZ!>mV6(*ud91wF_;1n;m>Zm%<6ieg_&WXuG)C!y6m#vsMxR^x_)o&b zv`elvJbr@bwivaS28>?bZ z8Q0M97hGWottrg4)&D&%9v4FrZ3vxQmu+iEp6;9Cgh?5WS2Y60x3eYCZSiGF9Ppw6 zy3RIvct;)f7hB7u=qTd^!fEB9bx2CtR?+4sc>IsVLtMx#Y9R2)q6eW#_rUE)dWQGx zB9aqko|m8{?WA1epspKx1vt-9kt}Xs4Xml384Lnp>V#9zhBu<862_N5 zZ~gfG;Trtxehi=ZcBa~Y50wf2pStFMbs$Xt%PAPG^uHb4v^pI$^6{Br@^yyvy{aH~ z%1HT z=XE-ZdB@l14Mrc&%`l9RSV&Y=6iO)@V+8P=8J{;EMnsOh+YqDysYWu%__){>zeu&| z>fF-n<`S~qWTSgh(Kpqg>1<<=f{sz(VF2Y8pU=0{nZ0csMx#aQc&&k4qFZ)ld-mkh zZSvxrG8`>q3vGvsL2N6+4l`b1asJfMhbvZkBp$eql7dB{n2K%Wn8Fftl_8O*+)f(B zPgp(9uoh)su@BK?pyi@4Z-Xym5V~>4*f+cKV^Q0ntg^<|Y2`i({A8HG4}tGPcW?WYMl=rS1`adMF_eNG`LzW z$@Ik@Dl|^wEc~^>X3Dy+37z~Uee9vgk|?u~V25xJ|>2IS9c%G%u9|P^SY@ zs<#!C#p7$~;OXY)3H*P5l0usWWi5T91vvk|o}|qGE@hBNod2ega)RvZJ8Oq1Y@#cR zir86tDo35BTQThY%v*S2B%qbPQvLM1~AaOs!d5OIt3GNu;3K=rC7i z7=^iLQFt+jOyr@_L~?N`IqAqw{2Jm~=b^R0bXClq!%6iT(~cZ|!pRqwT`*Kf#J5WS z#WNtSYCUq$l(3B8S;L0W>?Ht6bQ#vTI;e19yg3z7QxfCBJFS*4f-ruJOls$O)#>x5!TA6C;u; zr(}mz4nH9vEr1zD2({4GLU(~M?iCO9Z>lsgirKb_;Tzlv57N#JS~CgVN@mO+k93Y( zlvl{uMQ6$q&p`A1U!a&DC^f4xVke~(tW$b+91BdJ~u z3K{g$$Kv2n;%j8lskz>Cj*Yn!IUUwbHR7|B`hv@Kd;L~9iV!z1>nfpvdfwlDcB;;H zxi{}i2ShKc&QyiaD9Zg|R)zZFecTBJq4 zY`mgv2`2P}IVVgqHtou!?n{1Itwe2nxjbA1F;906c3x_A_-DND;%t(1+L;xqChT`QY9WNp-2;Kc;gaR(<8Wra=iN$ zK##b7hcymOLvckzzI~Gl{2myuFYFtT94>DEVNZc&naK^+P|C;KGc3<>2WAj5qAoHi z7y>U3KcUcO^Yl1EP86A=K(!Xy0u2qR3kO}S6eeDZm^@8DiE1BbF3K6|q==|e9zR z`ku1H+7OXw%Y2A`h@{9+#jnU9>L;4~9fsxphb&ClU9FBYc3JCVH+j=yK^rg6&@y&RDXM%O)c6aH4*khsMUN}hSsfhup za^vX52A)QSB6G^_C-Lis#w`3a1DS@(A~pt3E-f$+Y&VZV1|as(L1I^qCmKzGCo;8~ z$hAi~tN4t#j$H8%U69I0mZ(t7%AMl*U`W)`U9bWBi7uJgPq}%JV4%(<_Jvu6=EFde zS3X~2Zrmr?aV)qZjE`bT9QU8Y1a||)(3*RKG@8p+vA|v$&??FX+L!5E0Ty;w z;aa9-@%&JqklKTC1}iWrS1QKzML8PIH^L2{b2Tz;Xv}IlQ|9!&7-5(_YS7lEKQCMh zhbS2c7{pfm9{pWIS9KVOC!UC4)gAix*&&S**5T7NZ=GlB!a( z#b3AeGt0vV=B<30?GI6#Pwwe09*2)N)e3VC-tzBDY9`FrYq2r<=G?%#>7<{+D3V$JvAugJhVm!u`&aka+N z>{%}C5(>G+=&Da5^%kz+OI*25Ld!KYDhHJDX#ai*b6HaSQi$+mYBJm5JCTZ%Baob_ z>rRsUnr7@;hB||AcI6l;q9-^d7^soGj-65Y;}Mrdbi!V!^clA{Y+RTeKn+o;*>sG|mMhjviKjX74ON`~x29 zy*OIb{jDBIeBX}$gopnBxE23*m5ZW|6!y2gn>c9QpwlzIyzHyKQNnsAgr4uC2!%ui z6$uqVz-wa)j;mp2?27zIPZ_o!SU|x0UO31lp&SLp3H`j?=5@_uc0GBtbjID%q8Lmc3*B!XMY;M3bd;5NaqC`RhT z7A@iWLOCIlu+%IT9dWpzBks~SPK;?JBMRY5-t`^YnxV{*tR|}vV1tG|{Z!Iql%%f^ zpNV03GDb0puTLzP{Bh-dALTt$Yg8u$#e_kU*&@*#i8Q2({d>h-XuC=293>WUy{4Pl zST!b|N8tJ=4>)am2i-e~!D-4Zv`0r4@?q>Qj;sH3*%23Y;A1zDUO^eZ2%V1&llDLU z5VEewuL%f0e$;$x`*{B^?=Ao9$`@;b@>`jpd`)ld#yHF|_W!v2ZBtZ@5mrW_uWzu^ zqGQ0>+y>k6{o%URkgNaKM#rD5zq-vltSBzApP#vZxn6Ub-2$2KJ&cvM#A64qf_r1QS#pHDrr2W$INt<^`bMq6kondM%21^7anNQ zSKMYl_BM>3+oUIe(lHy4S}^FC$9iOY9}|(~5+n z6my>G(nQmbj|rJ5x|_6iX2Dd%8RBIh|0w|7IXk32NSB0v#pG4-DAQD3cHc`K(@f8j zi+Jq<{Gcr}Qs#6~T)bG^9kK+(p+I|CAZjiOMKY!WT0>KA=MwuvFh=#O5bKSMCvA6qG8g$)98_EWw%M`(rT7IW-IH~nf0Lv#19{?jE=NwMrPhk z&NK;;gMmr}@3Sb(*fh$_n1Z^bE;>9JK#16+^7=TSByn!pwu7fF<~b!~>Nadiwrrg$ z_7SYn70{o4=?vb-V{J;)@9h!EiYcLCT11b?YSh_a&A^Gn#%x5X+a!IblDz-}uBv77 ztAs&raJ>&F(gY_i2oyTq{@A^V%Qog-p&c_agN8KIUvMqy#-JEUC((-A@=qQ@?usr? zO8BrQIO@>Q3EmkEL8-jw)MSQ+%OVRJo#lE$p9?urN)}?Y7O+uaW7Q(raTP}F3+hN_ zdU@Gnwtx*eE= zXKmAHw}nY1MG9BoQ=4WQWC|&6<({jJky1{bC$sAKB*|cwDmCXE2eTE*-J4PPpsdl@ zRKamb+ks}p9S;vMXZ3JH1EfrQ8Z&t(i3Xo4`t&ay=1uw-Av@BFQV&d>3 zEAuNC4OMzAC)=NCKO>q3zO@&-nGZeih$<=%PAue@Y=`AzZ>P2GJjGDjsvIKbzhByd zJPWUxafeW)2iD}-bM7nyXshajmMv7*z1NfCNgQPmnRmk6;}I?&(}#VQ8~}zomHXR8 zh>~b=oJnlm73tVjB`G<~Y~EhlwN;ives#R?l0-%)H|z>T89QrOv4tuhho5Rj3n@z9 zaT`@lk_x7hMwSU%J@&w2SN23XjD-%SHTe#nprhg2txXr2s_gl6eM5gmb*2kcE@^r0 zFs&WX#&kwJ8@yn64A-LN@c_TvX4I`>uIhkmr{|QM7t0(kwjlcU&C(50h;|5QGIO^2 zRhf`w21Pm=O&!#!Js}3__7fQ*@K#x-cxkgpHN)!5X9G$}4<*eMiP8tn=cP3=NxlTs zy2ekZV65DNrWCHFOn!Csk53z!(qwmBJ5q*M8`JiseFi&8QzzCL$TqgAUEkQRN|vUY zTUkxGtQRk=uCg><5VX_^Jy~>=7i7oYz>Fk4KvVCpSfLt@VxOrtBoI8o1FdtVVMqm6 zHx)A8v6z*JG-I%%mSV2rZE}KyVy&WWoB`Setn^t!10K~ogTtGH7HHdWkT_j10c0-N z?my+Q0BCq-omaFISmORecvQXf*pV6ord3?2$i`Rmy+f-Dd3c%|y);3v!iTnxG6q@+ zZD;J-1v=)Pmc9LOVAVnwSXup5&u-Y9&YC-UyyxVTd|O0;VD?qA*cbr97y_CUP?j-i zHA{Ev#R#*8EPHWWjL0E02MAiC*JA%f`yl_qB6jTvVEa6Oo-`vIdShsjCJSz!bf{Hv zNAOcXya2XQvq0b^iEBS9r;XukiF-nmc;+YW$V44oq_#d-!D@VMH0~;crt%N{1@tA` z>9(Dc%&M)<0)HitQo9Ol>@cH6{+|-r%?##YtjPQum|+GQD>9+N>AB#w;UpsZiNl-o>Rz^=Y1)(Il+S?1)dP zO=pL$hh#R>YLrj~^BDzTs&`1t;U^!5XOlHN>22@O4;r$UuLW4ULWgTgDyU8-^;w8A z$CMXZlF-2v(4rBI4ax^FOUX{kW=Dry z{zz0eS#C7En*MhWBs9iH3+V@zyd& zSZdHSVcqm@1t!_RNzL*GU6OkiYiIn;%5FSc1N}4QT~TWt4WcH3^MC;ao66wuOGbE> zzhlt^f6+#HYNB-9W@u(oxvHdXcABx-BD$XFVghz{7wQE$Iuoi_<;{POb$GlP@=k4> z(dPmmz`UGK|7P@$$nTv>JCR+f_~U}U8^`}Cljhb0rnmCSfaR^F8#XUhuM{|=yv3vJ zb^)fBd0tc0{t4TC{IFZir^9K*@)EE%%>>(>+?ZXA<-K9T1n{YU^DksqZa$?|z*GQ@Xe!#|i$%f#Ep67AQ zc=!O#-E%8gTND_R!DiYoSmMg+y;9h4==u_>?cYb}W`FDX5`-zk$PAAUt%+Z}7>aeC zt6WS4kMyI$g#jDKtF`EnoBR=dPm?zXQWfFILu|R$NmpSst2i$>9Ryk+c^xlHD zcC9HkZuE@kluVgVuSLbSH*%UDNKY>gjXV1Jn|qu)3;XsBK+uh;i3+6NT9s5PKWc_M zqm4ZT_K{t646>{sag|+8AdXHHd}YFsb`!HR6On!MijKSY=+3tGKz!I!8SNrFO83Nb z2xs}NTi@?AW=VUZ!)g;2U4KtLy2I!w0aS9;7h9E1C+`u+p3yfh^XkY3D>vYpPSlO9 zumc=yD^lc?mu3Fbyaar9`19y2ze<3mzmPwebPQxz~>+|GdgTo-b$j zz-u_PH+OwFv?)e;>K~_!Pk%?&o^y?F3%DfdyMv^m?VfWtOR3TmEK`j}ss=OBq#bX1y?<29HZj-T z2*(XPIaQd3>7|~zh>_B}E-R+Bht7Z~Eeyv7`dOLJhtUq%r-d+Y4|c4QJxgouYVaWS z*ZZ0?{26K@fWm|ZnlUC=p_n#61R&xuVQ9XDmW$G$9!4wA0r`H*cyD3UZpPH!2;$*- zeR;Xb0e6p7g0Psi>PQ!P!JT!}t2Z7l{ve$fOsrT5g>R#@pU@oA`22Gldnh=j%Gd&mhgafnvP4O)Z$hA#(VoTJ+ zlOvos?fA?3D_42;52-Z0q&dKHqWh@*_HjYKhT>WH-_5#b@y1cDfV+yrVZY`E?lauh}2-G zqE&-cG?-AE1VA=N9d+Zsp^T>7w14O^k1*ya`(I4(--}OE}aWHK@(_GSwvdukX=ehDWZdQ zQh2Q$Z8~x=%DgAGq%b5#EUCQ2s{QSsFH2fMfh(0PJtm;Jp0Zo(cIoV=B_Z(JnlW1Da` z9a`Bs@o;YB{rcK$laspWNq=p2DCdM$5ur_-js7+}L zHg5Er%AEB9t5Ei$wLpirTfg#9Mn|e>yH)K0qjX;30*eQ5Q?T z0J9UkasLalj1RRH)y;+KZ<+Gx`D)QX{bLJNIG8#}QjNKyP4D14Cbsey_D`!d#p^+x zh_+yx?=F<>I-bD{cuU!=J^7xq9HPn>)SN#Vo1qH!FXr-(f%V@8HluZ{hU&mDRz@Me zUSjL6M}S52c}{yZmppPPpzXcaPRXpfc||r=bEqb)8!G<9MF1t=n@$oog$Rv9+= z3POR<3xvN@)vplfMMPMysW_QQ)DUY-i{($cupB$!0_R?+W83>H=k_l&E0ZeFQy&%P zQaWq<^Qz>OqH@;MMi#$RHF~6130lWx${J)*JwPOJfN;CRg>r(Nn~2&^`CD0P>Wxw7 zjzBA^Ii{#uA4RfHX|y!}S14Bn)nrDPD~ehkl8!+tUzj8#yWc|Tx|{;IQoW}@SP!Ip zA1?A`^r3BGbz(Cv8W1`gqLzbFp8_YsqigqERC@evT6Lp_x=}|Ks|o*ljC@VrEULKv z`A2?q4@Lwg5JhbnhUpEeJ{fLi1Uk@!O zfA0?Y+;+hAu@%lmp;b%wkT&DNz?W}lD+^;!xI9{=Mz-jxTn2)@v|Cq#-#61@UFbGv zTHtSQ3E<(|EZkRv#oT=tgGV;a2M_4D_xcmPACsWv9zI~;XYOxt;Abw}1x6xmQT9o3 z={p=4b@%pE*mMUjxI6nc*gV`LLtE0iRJ2xGtM&Ua%p4!_{&4Ts zMWcNn1bJkrWYb@p8^5CUc}GH-6NDW_X+(~0)zlzM9@!=TwfY7Xz7$!pwXvolzHqE|<LQN=nNX2$l=YU-~OpKo2sk`cA*c zT1O`OD&}{>&=NLN-v^;4l?Tqe=9+vPiMWxkbuGtwtrM95AM!ACtpa%gmCM@G#+9;jHDop$?&bkXnjp zBu_8Ba}4Pld_3A`4iCG6uKLJyQdK#IWW8h5Z((O#0D6pfzB;-^uMo7&bg?=&fs4*= zOr7N^k2l%y$%ps=A%WXcy0uX4lzpXDa9c%*`6cgTN}cHbCE!%UULS}Ne58bgPnG_N z+%vv1Lcjb4oJ@*pDKQ8q5nLzXY0c>jOe6Dds5rOx4KCk9Ll8Ei(u)=~v6EqaDhkAm zM9lJji>0{OoG8IaM)`am+o9@nDgP8HG_*Rl0&`MU4_j^7M$z8VtNFND_ONkive<5H zv2oVqa{bIqLet$Cxr;t81+rmxru0}Hp~QHH#FN}5&M%FfE~7y^#gF9^23iPvbW_(~CdpE+TQ9z}5Jzn;XQbC*gS6I+ z!%Cmq=<;AgcYi9r2HgbswtUaqZKg=krIt`PMkMZ3p)M5=(m`Sf^n_)}_TxNEu|O&~ z$|voimX%=i{5mZ^t)FOO4xrZjX+#!+nASgY9&%4W9MYtx1L!bqu8V^WJp?Cs-sbc~ zuK`a}PKOMJNX%pD^jjaFFebU>D~b z@79dggxUUZF*in zJBgq0oBiU?OjdyKf&yEuvh zl$;+@08!z{n;* z7f6)b9bwJe!B-jK4;`47E?4H;Sx)xDl?PhU$6t(fLxO?2PLFqHkTNO4)w#@)p^}az zYL(vzK4!#PcBA|Kx8T|3%-;f;4`1;ojGLx#5}0KmNfxu7-&&{D-gDx zA^lmO2|`T(5+_ZEXC=!xrk&)$Grwi+)U+hJr5w!D&(PD<#hg}1B|tSyhn;sSwi;?m zQ%h}I>dv{Vbl!U|*sYumq<9#TX<)$`6e7eUa#2k)0eoNz`A1}b9P~L~MRqe7Vu(k< z*QTKnVkkouK5io>B+w(MECA>PXm7P(8TaEbbL@LKgf(a$Kj3ZIZ8 zDiVKzphBa3**_J%g;P?N?33HK5po{`W-{R7oPT8Uu3bjABw!+TZnCLpO~Dg8Qct#< z?IornJ&BUi<8wOrLGPP@%n3cTHmoH}6#m`}eD@}m?>-WhPPjspOrV4*}XPzVV^ z*5Q}X8Jo}+(@NyYe0(k?Xiv2{_D|A%Ef}k8c7a=*^8p--SwL zI6&y-C>WwWjIc{Q zmuVrloOE<9Fw?s4l$DPXpVXatq&hM-B2i5yH%?@ONW(`gmA(;5CdkJhav}{vuJ+U4 z-@Da;t>~Js)G6nN?~>d#8Q+3xboIHc9R}&_He(*YDw)u=<>diY#!sq2ocD5JT178B z@nF$eoxL?Ot!qX^h1-dKH;LE)?88D=^d< zl}Z>c)y|`UfJqSH4s>w zKw9>(SKo+PTIq0Gvk*xl(aW}BHYh#e!#3Og2euM)Kf-8_E8ooy*8!|&LH(XZA;K9_ zm#E5NC{&>aA}Qa=p>&xIgILv^9SB=nnzP9+B}4#m3wye3F|;4+mq2JjK$<@MtL4UAd;%+)!H+WCs^zObNYL$8U?Bi*4d($o0!xC zIC0&I-SXhoigrls*Y? z;oU&o`xfmhK<+I^)&q6ICtvvPGp8ENIyE+xE7s*{0OD>y)G9*(Xn=xiz`R?4pp-A( zHFbi-ESB!mcaktmPc3jk;X1Cu`(mvIG&fQ-wG3~5lCJ67%CYvWw7gzX#pNm+6&(pa zvxz`qubQhZBh_6b2nXzZmMP0!sw)R`Vf)zljnvpTda+wk!eVny*FZjE5Jm)0X%k^! zZ6*?FK~+`)q4Wpiw~sA+Cq|yqbSQiJ3;YdY;_TN&`w; zCI1Jp#_ajZ#wy}<5sJrst{!gmQ(TtZ0WwTWYa$QS{wZ@K{f!P9%nhKTQ2>1pCu9@+?=_W>^?$0V3e`Y0F^mwud|Z+>!AJ-o!1ClNAprVY3!{*MgwP-o zLz?wjP0dAV^P8KTt~$OSzi)obUl5s(O&1Y(T(D2ebeqnri>J;fEu6Qr#c6S}= zX*kU!&c)(LwwSUz)tzhS|521ogKgckyZ*Lr&piZPbJ zGBHqO>ei2utg(&S>?&zB_1Okv`lP5?+}8Kcdh^2%Hc|+br-c9nknI)vi&gdq2j=vx z#hca0!le^W^^LMBb_WN0`A%WWjc4j3LZ^1k*s?Vv`Hb&M{I;*L=QJ{R7PsYySd=__ z$MVgs&6`UP8kky24S+0eRxzy?4~?;`7Y~fNv?`{CS+H{fDkkMt?$O#hg7dDhv%mn(A;v3o5UM3 z`4n(Q{q%e%+Z3WbYZ_CN^-_aTyykaJ7JzR(8+E?+;cpzFIBj8vaT^SJ+PW*J??4R) z^$Z9((K#`}TQEhqqaqC$miFPqJ=f(?yka9fVcVTC)(!;P`{{}=eth(SaXzS!)>p*j zqR=>I=|gEOtcFrE;ZLV5hhwG>8fUks%Zj?CsH=Q1A7o{HX;pHHJdF-cuu{u}%Djf) z-rIH=~ zXZa_E&bX49(L&ctfwJ1dT8ur54sEAwPF@^g8h`t78hLQ6wo+lR`HP6@gHO+>UVI@)@|U31wYs#(BVHm8V?7pM(51Z z1x*v72vHr1(If&?`2zPMo0ekCFmj|&E`FA)C{Iv+-s0~x-aixdG?iqG%%q~?heOdJ zk5g1XauCC57#R1ris{5&JI6Z!8^MOM-esw)ElBS0(~%hHo{dJZPni~Cl@&4gE-UCZ zAjUXZx6%6E2jllid4P=LX^b2onVLUiwr_Gg`TtK3RooY>GG%X|5`zPFrRfCBh z1TIG>zgs-9bf3n~G1Y@`AFD@}Lb^e0$!j3+!NIGucbAA^8&drCBUbKFX zu-sygceoQ`T`N|QQI{E%Eu4mD)6{}q2ykdyPQWr;4=}uC1)(pYw790pSD?Ddmxy(p z7szn)7V(KW|1KX8TsqaPJ*h#Yw?QCQl@?pmGRdffCIoFptf`x|S!^MQ-DJY)*9;MI zj1xUB8AE8^3JL~C3O}|;Z#Q<1Tts@EEwhAA1$85XVAHkSs)bAdztLV;>U&X7?z8sZ zlCo$U+~{tss2V9eHmxlHH6hm8ZgDoPE%qc!|6^V-BgX_$&nstN&RP3X_k+F&;8=gu zKF60lbM>q<{WWYREJwH&R89FchCWLK`o5c25Uo%b9taSyVi31~92T?HW}XD0gRMP;OaPH}YJO@Z?uutCrb&p9elDK#5pn-SPEG?@bWll;9BW!0 z0nwLdmAAZNKek^Qs#{ga9=QOaDqy%9`?&dXe7c@IAa*}s&~iBMH5fJ#OZ9yn3mG&F zMl)~|dUH14BitK((g#!xPaoBw6C%R8W;Dhy`aJA4!cQfJNyv!HAHtqFz9!d{FT?wW z0`!=K(DMU5mVE-lQu04#;GTsLB<6wyX$c``+Xn?1N2|yzR%)e2q3lXn$GdY`Bg%5p z=v!&yG+I^lL;6Hea23r*1RP2D5{D@>5 zUEPaGSr%1Jnx~ydjap%3&3fNEN?9CFl!Gk!*ft ze+baZ%N?x1>rF5tG{y3{_EUP+4t+F7n+N)4W0P!W>ZCR-H7@KY(%P#k(TQJK9!YJ$ zY$h{LAz=zrbxRIz8yXc<0$DDP^!pwZNj(C0aFkbVzC88YuI5dC!K-Z{l?XAB@utqu zVf~y5yVm2qT&jRi`p{Z~7~25j#b+(RF!}!07ucM9IE`6?I9dF#GV!(9J>UUmS`xS! zqRqG>By(BYv5bMe1ZGf)B9_p3UJ#Lxxt~%6nCxF1N^*`FAp6K-ftl81P#nEN4l#lY zbrkg+nq20a#*o4_KgaS#-PYrJi-!kL;&A=|XYZ5HjL2xmWpk!yds07HiaX6SB=mVO zXfBb=a2)Kyz&CuCz$JHL2@Dr~7_f|2R3gE5&n`<;q$$4zNzFu)Fa&y?sw4N=O5{bj z7GTzpsSLxFw;IGw)E@caXcDOLAhHTpR1%E;VDsIeDuy=5Pe@iX&I zYKDP+A3s5=PvQ(Cj2#K=?XD%+aFxR3dGrAdSW?=dsHcmq_YP7u*Ej8%VB^i3(Fo(8 zSmkvb;_WX+>DKBt@XA)dz0c&YMNOhzQo5!8F@554P-A}jx z96#{S%t?ja>HVtVIu(RrM(Qv{aU^=)PZO%B=RFF!PM&a8&!0s zBZ3Qj6lexYj;qxe&Zg;;&ua$^vtz5mC5=DU2`v|O8;_6WbStR*Ox%7(5Mm#7s%US0 zL@{^L%+FUDYPb_k*HkdEb#uyV3Zie}Ox}6i0VtW(B@(l#Y+R3$NB1z0N^3*1kAi)R zZM%@UbpDZq0;(@$C!4k+K?z~+NDve{NOoI4>^o>vc%pf{JWg%6lh@^8jHsSYdT)jn zsLhO!%Y@wO95<~JGp+Ld9XqWOKfN@rcpQ5Y*!iFnIC-R^43c~IC-e8AZv_7kJ@%s{ z=euN4-+N9SGzCDM2uX9I3O7QlKciG;=i8k;3ObpD%M5QwK1* zPRIh{rqhF?ZK3MxesOBkiGcX1` z2sqwpCRF`QD(&*gS*An{2+h0(BsvY^W=M+(-j%cEdY?vmg#KJxcxHkabv&tS^NJBE z(V%j2=_md%i~i;VlX6<-mBH^IiC8N@WJLs+$OyALEs^PcjaQdS!k7sl;Tg}T*)9pO z!ZQPfR-2_bFO0>SOjB^v``*o=EJ}yipy+1K7}g{#$1(XFrt|(D7aIg4 zNSA~xjdxr2gP+t?9LC_##i+roCxYoR01`ZOkP-5LIrwFbQFlL(1%ntLj7S zKDg=jDIQ1%FqD7xIys};h7;4jC^iaT-fy}e7acA%9HSgdA!YmRT7)zr@1c^H#H5uR zxUSfyNaDu;+}0wO>5*CvY-4Aq{3O^g*hbk%WhaF~?XkrZA?Y+)z#2x0M%HMDqz575 zB?q@Lk*A_e08ep9@g{xzhY4=5C2L#p9z3NDzGbz=(Zs^7s6tihZVvBU5HQAwoiAdg zl6AtBgoyF!sSyC(+BMf4UTJ#a;|a6&)i8t z_8uqV)-uv$hK04$s<_gRk0D+8@ zLAgn|I#fcXt@O%rDm~`rXzizzmIX-$ovrANiWJq6t?aGyOw;Acy?>PTcpvZ!lnII! zb!*haJLcKX|5OF~&$FrKRZ%(Bk&STi4&28Z;(W`n#NR_iI>pv+!Zp5O+;6&yD@(kf zCLt>o7AJH+kSN1BYFW7b+NV_%sOeLA7e>1`V@Aq+m?3+OFj^9@qiEZuJsCp5)i8G^ zOG+kNe6*P?s^44@mQra`NfLzgRPM@*?#o|0s*JU0XxHCUZPQj*a*M(!qgJCIcPcVY|&4+wI zoi88K&vM64TZo@7%ZjjCP^jkRg5Eg2InI61GTkV65MsnBaPvESn|_CVnBQ+JNIzZ= zIx0Yet{cY{NtR$xoc7t_kpYnnS<`OkB^ZM$?~P4XdXRTbkyH(ehk7bFKLu z#qFPb9L=ma$fkRdt%*Y;wRV6(b8=NX@<0sI8wsJ}j??G6ZM_r#1 zpPzgaMtO2elpa>_SSEEr`^|NG=s4y=U|V>~aRK6xzo%63qHu;s4C81bA}cpb(D_}} z2^RfI@AgSC5-d;MBT62@Fe1Rlm8wk;R%m-`U0bHY>4O`N$PalxvubPxhZ$FxwpJrC zb+MdS#n@%i1P5d-xFv3(a79-sMkXUX%@gL^HdKuAaKWfFuWC6wlm5P+l;337+Vm(V?~d&BV4Ahj=8l;qs}eoOum-PL*6+!S?eB;3ziqVt>qc5i&(he*+Q9K!#9PST{$D(uNLh}* z;Kp9@%b~R3;JyJNQ6M+5wg8HJX8bXJKY!sNO$<`H#;yoiU^Ih>_JtXD6gizhW^#lRy4Hq6V-T?}O;41j3?B)&l4Q!LnbA8gB6Ct`_Q)~hX5aTmLS5s85^Z7@>r>sN$Zu1*`~i$j2%>4ZQd0uF!$Y0mJ|A;5O`f$DDA zZ+esdPVBC`2uCyuTS_aduHRXASrA>?QJ3@%FiMl^JX)%}kp@W%H7OQM_LH+L|2~=8 zD>}!a_Wkb%e2;1W8_CGvA8ZF2fxj#uZ{*-)`Tubq0%Iq>kr{}AQ;cHybgSwOpY`G& z{_}wgffPb0LU^)TC5W2Rb3KB)KymX&vxzy|fX~po=^-w0)cr#2v<^pEY>%i$`^Pu8k!>4SS8HJO2q5s zHya04@(Uz;a4#4}>@_l+z|5Omu~%`d1S30|r=t_48Kum3k*#9MPA1e2Y0J5fOcpC; zmFiTRHaLJ9(@MnZK_}i^FzAzSj&m$$&fo?-zQf#P;+?ioi5Rw#AD(CmP~Fk!#^z;h zRGTfz=27B+lv=btK>oXF%1c4L4ZlrO{r_T`e@)QG{zWr^9qghr%QtIiFkfg~e1%bm zQ3jSl;zA7MeaMl&Zk9s92n8oBohl^Z>jAws>j#B3iO232u+?*UO#gUn>YE&TI^*~@ z4TdUxEZ+){-b#0vuM+>`@=eBZKn|0Jm*3_?aGdNhTUI+J50s%T0SL8;IM)`kwGL3! zYM_mP$ab;mYwwxX8>SW|vj8Ana&KWl2vW)R1+(*Yb|a1#eggIEGYt zqPa=kp?EYea!>o?kT2B~)`RO!vV{y@^Etzm^T+hfCAA^rZE%1(I!836xw#s_{C8io zWf6L7FSeajDl2*kLSx#=mhH6MSI1m^#nsW5!3ohy}MDZm?QZ02?B4lT2!V9bhF^$_(D+?Tko>t$ zH@*m0XY7%h?;trE+N820!h+!E-}v;bKm$1`--Bbp-|9%D|6>aKX8;N48JHUVb86^c zYIPf}wbV#wNZ}zN>g1~37>&PCfGX|f%22U`olI30t?Jr@-s!mC%0kr>1taOunKttV zeZCdzG=P61Bdj@^9BOvmW!BBP@MLoX+9JlI>$BqFnEgtRt;*LD7TR*Zw+PYY6@Va7 z%9xc6z6Z$|L__jNcg#?tBisl&*vXjBP>EHt^TpG*&BsM$j#}S#;8c2)q+lAAKnrTk zNNs9SaTXm*ws`Z)AGq)&xA4HH$ry)^B`}s>0?N*WW$1-##4CGjRFgylzHIK5_=Wrj z(uBX+Xlx8>I$2LE+bn(ahXCsg_ef4mVDwo1fa=R(y=~RCSvX-$Y+g^L*k#JCCK9=J zk7H?CPYybl#ab^~ee)RveAB}C)**)&P!K`0$fXDT%HwJb__vN8)H!lrm3pCsgv7F8 zYT*`T-=R`7!7n2#ZHj}&gTyWBkE+hEu3?jsDYx~M!ok-YMNLJz-f9-P^v27Ga|P4R z@LZ!`5~I0xeXvz)i*rJc0--)9!>dwY6D|t-nlwx z8ffat*EVYSQ&-_Xdc_`LN4>VF zsg1y9?uZcE`4KMeyW!iWf0Bk-;$>1#9eQ;m@v ziIKCXh_;G}{E0Mm*Z;y-daB9MJ(zS;;RdHn1 za(&~6erwz4J-9kiHk>|tz344__IxsTl9g`{4iH?~DXnUsJHJ~!I{vXn)HGu>{P+RQZY*WKT8aHC<*E8O>lHt2W%9RB|$y8jW^ zkt%8m2z;=g%%PT=%H6IM`mC`Z zufq!>oPp_gIZ?F>REs*6$7U1sMyin#IBL*<5o)3vKIoxIkE5F-{2@SUISX`Yp~qPB zbV;G>=H$?Z5TQ)Y_gL}v3Q)q^Rd)x-Xr$}<(6A>*S&MZ!1u|4*`)>Ur!r|SSOlO*@ z`F^1WSu+zdjm=WgWAv_REK*uP(ZB>Ti^lwfe`PFy8e4>FQ<5-tWI2wN75C0n9-5e7 zkTx}7#e}f2fvDJFOJ-QAXKdy~v^Liimi^gbcCy+aapoU+zDG$y$m`hSVvfj(RSV(unBxF%nBfk&qRd2Bq`BU%vhk`indrOIa{P_ zQ_?WkRG}r&SUB#?m9*jdz~f&Yh{Bg(65&jhx#&#%V5!?>KAC7nLP|9TkK7e1SHuiA z0t`-|N0UeO0_dBjj6W3;04It1nkM-sy`d>{$+!nul&4;+#DHKKF1BgTsRw7qad589 z@8cuo!e)nd0W`Cb&OOnHyfIf$SQk?WUOtc`)j*{1M%4Vl)Gsfln(LLRVBc%bIFUf6 zna-{t2rA;+5*a@HgDQ1w=QaUt9DA75C#Ptc?S71;2Df%RD!ue05;V^}EuKu-jL5qM ztra_&Frv`#^R1$2;)r$0x0F+IFISphsRniQ-p`cYLtos1+(7u@0DRL*$al|BSgr<> z!gV=MAE2mAb-0gnT%`tE58VHgJM2{wUksLQvD1ys$QF9qOkSfkG7yzOen8KQ6!k^BY#y@Fx}sh9o%)T7_Q@wo zJp$2|gd%0HK9WRr%4%;HOlOL~2F_WK^W|c`BVm5H3nVy`R)&2WiOsG~%pUw`v~@qJ z+h-NacXykB&_wa-4d~~C`b?hOMs3+y(X5l{{g+HKg|{!4_srDj-B=h+P=GJphIooQ zrHkME@AHU2x%-P$-j5C#uc{(laxc1~8x#O1Lm8TClNheL?ku6l^R9C?;785clg-%6 zy>!xje!O5?V6YZJ(ZH*qm|v6>APx)Q!qlA;0nKq0U~2DJ<1<8%e;QMXjMN_ ziC^klg6nnDjb)N83h})tb>l(A&7X|#` z3sKgTNP<{`nI9=p=jTb&2)0d<;1WAr2@YNNKhG6fm$45|2uTL*|5>(oOo^-O(WBHF zu$S)O`m0?f&M4xjWeae7qQIFdD?>mt-Fo&k<$kZUCNN(yluci3)Udf7U8^8042ZjsOL_{sTjF=h|G zB}pK9d5owGgyvwgvOtC6mT|&}vK#BE418?`>PZq3Z@Ls}*zR4GKj(=Xk0ytxUVm$H zRNP_}p!gW&2z4*AQ$trwJKIXYrVUc@nR37p(b6=;Q>k5_Ar4Im>#S%*oVUmRktOpH zRO-LLSirn_7G@D~e;H&H5%*k}_%mG&Xav`kUeeyHy2us9T?M#DhWDv*yylBOYp#>4 zlXW4R0M>|9KLPG4lljQ7aI0djumwpTpWy^I8#IC`=tv@eA$5Dr13SsE3D@;EBo?R~ z8DrY_roQ2OQ~y707yp73{#EDl{YT0Bk7XrLZtbs{D?`d6eQ-Hl{pty_!EXlihEGm# z7dUKz+%MV;s#P8#Wadg<5eS&4I~sm!1qcaIQrE=T!Pz*j-KV`BKy|RfS32S_rdJht zkNp;827ED|JuE_jT|8n=Z5*t?>u3~#bcrTYW5}H2v&9K9aF$00Y54r&oF%QX+wpxq z+4n%3b*BMEO``|x*NPr$K)N*{VD@31)LYKC^ue5%e&iutEYr!Dsa8(YD~H}?!0kxL zEu_7RFGT4 zQUkzUP@SS18hgn22-JaGY9)`JE9VhZGQq>wMpBrYyvQkEufE?Bf|(?XrxaQ|Go(GP zn3mI)4X-Z~&ZH-D0k^u5tR-xPO^(5UEo$iqrBBLcsX(g3@JBQ=X>RJ+l~?$tVz+gd zZQ$1>xwoSh-rg_sT8Xwka@T!?e=piTdx)x&zU|xnZQs8uv;9Z2y_lt?k%^w=KhcTO zdRG5MB}`6>hENWci%F+L7^BX4S?g_p+cHJ%Rm@Wu-#-8hCI!^SWp$zIem&`uqnGC9 zTbtx&8}wN&uhoQ>k8t)x!>LRrliTU+^79b68z|`RIq1sGkZw5;%3Jl>YzHM5bwn1t zi?~k|*xkb@mbW}0%RGmGpuQBmi>$6Nb@XI%VgxmJZ39J*aH7>zlz(g0mlZyWrvAt> zP1ejNDJES(J=Kl>Yxry`pNYQ+{oLN+Ds9%jW2I!wR$~4`klJ=7984)m@t}5_=Fe4qSWm4?EH9Y<#a&V{IQLfeyCs+*fwFi{{xq1N z$JU)Raaru~N$@`I3OIlF83nR4H44H=5AXG^&&hr zo}Jt0Dm1hR*#pW+$Mnb+L#SLJ5*5fMob{0Vq)I(glYV=&$;F84UTxgp0ex*3mo`f*NrkOr}J{(x?#BX!W^&jy)P z4|PGu!hQB5V}v%x2Tyu9^ZsfhDrk;$pPDmlDQmVNt0l)2f#m`f!|8JJZTuuXKW$;< zg_Gj)T&LJ-kV$#XLUUeM-`W|jA7@oQ0y`3eJR&tw_ycXEJJ_Y0L+DBtY#34*#ggTc zi8C&~m=01Lm1N0nI&#m9$>oN+G~XZrerka;r+VYyY*>yBi%;I02LSQNTf{^~)38&- zhAEN#*Wmp$hZYI6vs<2jWs3ibxkdW#N(%>Dv%htnok__0bAKlm!EY!l`Tz9FKQqg} za8duPO5(RmDMB-T zfpLLQqwa2oyEUOCPz=&4tic|=S7W#_Sz|FYN#>yMDQjGp&gVrWYf2yna~6=bRbndV zP_I-wT}PGJX17dJI~~MNh1^4E!f8 zD{PJZ*1b+#qEm=N8(>o8b>CMYl*dhi@2W>J%_ zEeSnA<(+@2%L5gEJZBMq)^tmYGlLB(_XVlcGOg#1omQh?`1MnAXq0MdYsV{3aZ+VT zw$qVgVYUzoU-g&GHiy2%>EdK0lKM;(@i}GIE*g_pfH#Y6;(7SY-09Hg8e2G9g^?Zb zRD+{{gc=nRs`6*?*!-GY`^KWLEn?p;(G<7wCM$Tt@!SumfV652@}y5TuE22jWx_61 zoPO-b68Bb?q}bdpULS>eg_<0`f;kaX-Flh~KdWRPT$RtDes6BJfE!?ia|A6SIw=cm zkV+e~4PkU9MA;!IGsfYZF3MnwT%_Zq5B?rPEq)e8==-$C0B9X-{D;&4!4Rpy85eu$ zRMcXLtX#qO!;cM%mCPAopeKno4_wTjMmD}fRg^4qQ8&HbXymiPh(@!~(4&jTe8oW| zAH*PFpL^5k<$`X-rbcUb@v8VwSmY@D2Ob(BiobTwXnZ|PWxz4a(9 ztIn8fUkg$GU<;L=2!AFY_vwR1hjVdX49ipnjq-xSN12y7a4v$<8UizFg7j66&Yvac zH;}&ZnH}$JnnT7$o^!1r;=mIzQNFo{^)(S9j?oAnI-aOZBeo{aLDYBoa+S~6t@E{ zJ#(QH@}0^skTh~^eLH>qz;snQMM^ngR<+V{)kFS6zqL|)52^G52hCyTA(T2_bi5K6Mtxe<`A%yX(_83{sm?Im^+o(GHYQmt)wlE~YODG(5@24MFFv;Ahk zA9iGi_T!f0n&a)dew~gIx~}|Xp@gV*)*nC5QQ&bJ_JQSn`rC^cXTN?ADiu@*nIM+N zuaM@5CfvN&&XVANp{|a@6m$v98uqA3!L=8c`aLzU^|(9?a<(Ms)sByI?T zXgL06XEM(VK%P*AOLxEdo5aEscv9N^_Y!OO?PU!AotG(DTj|-_>gih={pDx>0r>vg zI-4l3WikJ~&em;7?Wr%VE;u)|c@vj2Z7+?L<&+1C-WNLe44F9(M-{{qrG{+#+@L(? zrVgFbtBBHP5(CL|$?4|h1oOlEjo8h*aNyEs zfVdARp%%EPQIzK~Dp9TC%43We^xLT*Npy|BybO7!+5!hRbBmS9WPQkY$Ei3Dl|;q7 z;`-{wA|e>dzGj76T~TiHWS>wK;BWpT^nRO9QSA!11lHEqi0^y;A16V7_5n`M!*f1f05TmZ9{RI|>!I

  • KKIGc-g3VPPS55=q>}Yk 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