diff --git a/generators/src/org/jetbrains/kotlin/generators/tests/GenerateTests.kt b/generators/src/org/jetbrains/kotlin/generators/tests/GenerateTests.kt index fc9b14dc088..c469c628063 100644 --- a/generators/src/org/jetbrains/kotlin/generators/tests/GenerateTests.kt +++ b/generators/src/org/jetbrains/kotlin/generators/tests/GenerateTests.kt @@ -73,6 +73,7 @@ import org.jetbrains.kotlin.idea.highlighter.AbstractHighlightingTest import org.jetbrains.kotlin.idea.imports.AbstractOptimizeImportsTest import org.jetbrains.kotlin.idea.intentions.AbstractIntentionTest import org.jetbrains.kotlin.idea.intentions.declarations.AbstractJoinLinesTest +import org.jetbrains.kotlin.idea.internal.AbstractBytecodeToolWindowTest import org.jetbrains.kotlin.idea.kdoc.AbstractKDocHighlightingTest import org.jetbrains.kotlin.idea.kdoc.AbstractKDocTypingTest import org.jetbrains.kotlin.idea.navigation.AbstractGotoSuperTest @@ -628,6 +629,10 @@ fun main(args: Array) { model("coverage/outputFiles") } + testClass(javaClass()) { + model("internal/toolWindow", recursive = false, extension = null) + } + testClass(javaClass(), "org.jetbrains.kotlin.idea.kdoc.KdocResolveTestGenerated") { model("kdoc/resolve") } diff --git a/idea/src/org/jetbrains/kotlin/idea/internal/KotlinBytecodeToolWindow.java b/idea/src/org/jetbrains/kotlin/idea/internal/KotlinBytecodeToolWindow.java index 83ffe283560..632a8419f02 100644 --- a/idea/src/org/jetbrains/kotlin/idea/internal/KotlinBytecodeToolWindow.java +++ b/idea/src/org/jetbrains/kotlin/idea/internal/KotlinBytecodeToolWindow.java @@ -194,8 +194,9 @@ public class KotlinBytecodeToolWindow extends JPanel implements Disposable { setText(DEFAULT_TEXT); } + // public for tests @NotNull - private static String getBytecodeForFile( + public static String getBytecodeForFile( final JetFile jetFile, boolean enableInline, boolean enableAssertions, diff --git a/idea/testData/internal/toolWindow/inlineFunctionBodyResolve/inlineFun1.kt b/idea/testData/internal/toolWindow/inlineFunctionBodyResolve/inlineFun1.kt new file mode 100644 index 00000000000..19cac1d024b --- /dev/null +++ b/idea/testData/internal/toolWindow/inlineFunctionBodyResolve/inlineFun1.kt @@ -0,0 +1,10 @@ +package inlineFun1 + +class A { + fun test() = 1 + + inline fun myFun1(f: () -> T): T { + test() + return f() + } +} \ No newline at end of file diff --git a/idea/testData/internal/toolWindow/inlineFunctionBodyResolve/inlineFunctionBodyResolve.kt b/idea/testData/internal/toolWindow/inlineFunctionBodyResolve/inlineFunctionBodyResolve.kt new file mode 100644 index 00000000000..755247f5e7a --- /dev/null +++ b/idea/testData/internal/toolWindow/inlineFunctionBodyResolve/inlineFunctionBodyResolve.kt @@ -0,0 +1,7 @@ +package foo + +import inlineFun1.* + +fun test() { + A().myFun1 { 1 } +} \ No newline at end of file diff --git a/idea/testData/internal/toolWindow/inlineFunctionDeep1/inlineFun1.kt b/idea/testData/internal/toolWindow/inlineFunctionDeep1/inlineFun1.kt new file mode 100644 index 00000000000..339b1e3d280 --- /dev/null +++ b/idea/testData/internal/toolWindow/inlineFunctionDeep1/inlineFun1.kt @@ -0,0 +1,3 @@ +package inlineFun1 + +inline fun myFun1(f: () -> Int): Int = f() \ No newline at end of file diff --git a/idea/testData/internal/toolWindow/inlineFunctionDeep1/inlineFunctionDeep1.kt b/idea/testData/internal/toolWindow/inlineFunctionDeep1/inlineFunctionDeep1.kt new file mode 100644 index 00000000000..91290540b9f --- /dev/null +++ b/idea/testData/internal/toolWindow/inlineFunctionDeep1/inlineFunctionDeep1.kt @@ -0,0 +1,7 @@ +package foo + +import inlineFun1.* + +fun test() { + myFun1 { 1 } +} \ No newline at end of file diff --git a/idea/testData/internal/toolWindow/inlineFunctionDeep2/inlineFun1.kt b/idea/testData/internal/toolWindow/inlineFunctionDeep2/inlineFun1.kt new file mode 100644 index 00000000000..523d669e90d --- /dev/null +++ b/idea/testData/internal/toolWindow/inlineFunctionDeep2/inlineFun1.kt @@ -0,0 +1,5 @@ +package inlineFun1 + +import inlineFun2.* + +inline fun myFun1(f: () -> Int): Int = myFun2 { f() } \ No newline at end of file diff --git a/idea/testData/internal/toolWindow/inlineFunctionDeep2/inlineFun2.kt b/idea/testData/internal/toolWindow/inlineFunctionDeep2/inlineFun2.kt new file mode 100644 index 00000000000..1ce01f20afb --- /dev/null +++ b/idea/testData/internal/toolWindow/inlineFunctionDeep2/inlineFun2.kt @@ -0,0 +1,3 @@ +package inlineFun2 + +inline fun myFun2(f: () -> Int): Int = f() \ No newline at end of file diff --git a/idea/testData/internal/toolWindow/inlineFunctionDeep2/inlineFunctionDeep2.kt b/idea/testData/internal/toolWindow/inlineFunctionDeep2/inlineFunctionDeep2.kt new file mode 100644 index 00000000000..91290540b9f --- /dev/null +++ b/idea/testData/internal/toolWindow/inlineFunctionDeep2/inlineFunctionDeep2.kt @@ -0,0 +1,7 @@ +package foo + +import inlineFun1.* + +fun test() { + myFun1 { 1 } +} \ No newline at end of file diff --git a/idea/testData/internal/toolWindow/inlineFunctionInfixCall/inlineFun1.kt b/idea/testData/internal/toolWindow/inlineFunctionInfixCall/inlineFun1.kt new file mode 100644 index 00000000000..8011a0932b9 --- /dev/null +++ b/idea/testData/internal/toolWindow/inlineFunctionInfixCall/inlineFun1.kt @@ -0,0 +1,3 @@ +package inlineFun1 + +inline fun Int.myFun1(f: () -> Int): Int = f() \ No newline at end of file diff --git a/idea/testData/internal/toolWindow/inlineFunctionInfixCall/inlineFunctionInfixCall.kt b/idea/testData/internal/toolWindow/inlineFunctionInfixCall/inlineFunctionInfixCall.kt new file mode 100644 index 00000000000..9555c70090d --- /dev/null +++ b/idea/testData/internal/toolWindow/inlineFunctionInfixCall/inlineFunctionInfixCall.kt @@ -0,0 +1,7 @@ +package foo + +import inlineFun1.* + +fun test() { + 1 myFun1 { 1 } +} \ No newline at end of file diff --git a/idea/testData/internal/toolWindow/inlineFunctionReifiedParam/inlineFun1.kt b/idea/testData/internal/toolWindow/inlineFunctionReifiedParam/inlineFun1.kt new file mode 100644 index 00000000000..080df046181 --- /dev/null +++ b/idea/testData/internal/toolWindow/inlineFunctionReifiedParam/inlineFun1.kt @@ -0,0 +1,3 @@ +package inlineFun1 + +inline fun myFun1(f: () -> T): T = f() \ No newline at end of file diff --git a/idea/testData/internal/toolWindow/inlineFunctionReifiedParam/inlineFunctionReifiedParam.kt b/idea/testData/internal/toolWindow/inlineFunctionReifiedParam/inlineFunctionReifiedParam.kt new file mode 100644 index 00000000000..3498476f678 --- /dev/null +++ b/idea/testData/internal/toolWindow/inlineFunctionReifiedParam/inlineFunctionReifiedParam.kt @@ -0,0 +1,9 @@ +package foo + +import inlineFun1.* + +fun test() { + myFun1 { 1 } +} + +// INLINE: false \ No newline at end of file diff --git a/idea/testData/internal/toolWindow/multipleInlineFunctionCalls/inlineFun1.kt b/idea/testData/internal/toolWindow/multipleInlineFunctionCalls/inlineFun1.kt new file mode 100644 index 00000000000..13e10274754 --- /dev/null +++ b/idea/testData/internal/toolWindow/multipleInlineFunctionCalls/inlineFun1.kt @@ -0,0 +1,8 @@ +package inlineFun1 + +import inlineFun2.* +import inlineFun3.* + +inline fun myFun1(f: () -> Int): Int { + return myFun3 { f() } + myFun2 { f() } +} \ No newline at end of file diff --git a/idea/testData/internal/toolWindow/multipleInlineFunctionCalls/inlineFun2.kt b/idea/testData/internal/toolWindow/multipleInlineFunctionCalls/inlineFun2.kt new file mode 100644 index 00000000000..da5ad828ebf --- /dev/null +++ b/idea/testData/internal/toolWindow/multipleInlineFunctionCalls/inlineFun2.kt @@ -0,0 +1,5 @@ +package inlineFun2 + +import inlineFun3.* + +inline fun myFun2(f: () -> Int): Int = myFun3 { f() } \ No newline at end of file diff --git a/idea/testData/internal/toolWindow/multipleInlineFunctionCalls/inlineFun3.kt b/idea/testData/internal/toolWindow/multipleInlineFunctionCalls/inlineFun3.kt new file mode 100644 index 00000000000..bbbc856486f --- /dev/null +++ b/idea/testData/internal/toolWindow/multipleInlineFunctionCalls/inlineFun3.kt @@ -0,0 +1,3 @@ +package inlineFun3 + +inline fun myFun3(f: () -> Int): Int = f() \ No newline at end of file diff --git a/idea/testData/internal/toolWindow/multipleInlineFunctionCalls/multipleInlineFunctionCalls.kt b/idea/testData/internal/toolWindow/multipleInlineFunctionCalls/multipleInlineFunctionCalls.kt new file mode 100644 index 00000000000..91290540b9f --- /dev/null +++ b/idea/testData/internal/toolWindow/multipleInlineFunctionCalls/multipleInlineFunctionCalls.kt @@ -0,0 +1,7 @@ +package foo + +import inlineFun1.* + +fun test() { + myFun1 { 1 } +} \ No newline at end of file diff --git a/idea/testData/internal/toolWindow/objectInInlineFun/inlineFun.kt b/idea/testData/internal/toolWindow/objectInInlineFun/inlineFun.kt new file mode 100644 index 00000000000..c4b280d970e --- /dev/null +++ b/idea/testData/internal/toolWindow/objectInInlineFun/inlineFun.kt @@ -0,0 +1,26 @@ +package inlineFun1 + +inline fun myFun(inlineOptions(InlineOption.ONLY_LOCAL_RETURN) f: () -> Int): Int { + val o = object { + fun test() = 1 + } + o.test() + + val lambda = { 1 } + lambda() + + val o2 = object { + fun test() = f() + } + o2.test() + + val lambda2 = { f() } + lambda2() + + val ref = ::reference + ref.invoke() + + return f() +} + +fun reference() = 1 \ No newline at end of file diff --git a/idea/testData/internal/toolWindow/objectInInlineFun/objectInInlineFun.kt b/idea/testData/internal/toolWindow/objectInInlineFun/objectInInlineFun.kt new file mode 100644 index 00000000000..6400e94296b --- /dev/null +++ b/idea/testData/internal/toolWindow/objectInInlineFun/objectInInlineFun.kt @@ -0,0 +1,7 @@ +package foo + +import inlineFun1.* + +fun test() { + myFun { 1 } +} \ No newline at end of file diff --git a/idea/tests/org/jetbrains/kotlin/idea/internal/AbstractBytecodeToolWindowTest.kt b/idea/tests/org/jetbrains/kotlin/idea/internal/AbstractBytecodeToolWindowTest.kt new file mode 100644 index 00000000000..2d20f259477 --- /dev/null +++ b/idea/tests/org/jetbrains/kotlin/idea/internal/AbstractBytecodeToolWindowTest.kt @@ -0,0 +1,48 @@ +/* + * Copyright 2010-2015 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.jetbrains.kotlin.idea.internal + +import org.jetbrains.kotlin.idea.JetFileType +import org.jetbrains.kotlin.idea.test.JetLightCodeInsightFixtureTestCase +import org.jetbrains.kotlin.idea.test.JetWithJdkAndRuntimeLightProjectDescriptor +import org.jetbrains.kotlin.psi.JetFile +import org.jetbrains.kotlin.test.InTextDirectivesUtils +import org.jetbrains.kotlin.test.JetTestUtils +import java.io.File + +public abstract class AbstractBytecodeToolWindowTest: JetLightCodeInsightFixtureTestCase() { + override fun getTestDataPath() = JetTestUtils.getHomeDirectory() + override fun getProjectDescriptor() = JetWithJdkAndRuntimeLightProjectDescriptor.INSTANCE + + public fun doTest(testPath: String) { + val mainDir = File(testPath) + val mainFileName = mainDir.getName() + ".kt" + mainDir.listFiles { file, name -> name != mainFileName }.forEach { myFixture.configureByFile(testPath + "/" + it.getName()) } + + val mainFileText = File("$testPath/$mainFileName").readText() + myFixture.configureByText(JetFileType.INSTANCE, mainFileText) + + val file = myFixture.getFile() as JetFile + + val enableInline = InTextDirectivesUtils.getPrefixedBoolean(mainFileText, "// INLINE:") ?: true + val bytecodes = KotlinBytecodeToolWindow.getBytecodeForFile(file, enableInline, true, true) + assert(bytecodes.contains("// ================")) { + "The header \"// ================\" is missing.\n This means that there is an exception failed during compilation:\n$bytecodes" + } + } +} + diff --git a/idea/tests/org/jetbrains/kotlin/idea/internal/BytecodeToolWindowTestGenerated.java b/idea/tests/org/jetbrains/kotlin/idea/internal/BytecodeToolWindowTestGenerated.java new file mode 100644 index 00000000000..4d034f91758 --- /dev/null +++ b/idea/tests/org/jetbrains/kotlin/idea/internal/BytecodeToolWindowTestGenerated.java @@ -0,0 +1,79 @@ +/* + * Copyright 2010-2015 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.jetbrains.kotlin.idea.internal; + +import com.intellij.testFramework.TestDataPath; +import org.jetbrains.kotlin.test.JUnit3RunnerWithInners; +import org.jetbrains.kotlin.test.JetTestUtils; +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("idea/testData/internal/toolWindow") +@TestDataPath("$PROJECT_ROOT") +@RunWith(JUnit3RunnerWithInners.class) +public class BytecodeToolWindowTestGenerated extends AbstractBytecodeToolWindowTest { + public void testAllFilesPresentInToolWindow() throws Exception { + JetTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("idea/testData/internal/toolWindow"), Pattern.compile("^([^\\.]+)$"), false); + } + + @TestMetadata("inlineFunctionBodyResolve") + public void testInlineFunctionBodyResolve() throws Exception { + String fileName = JetTestUtils.navigationMetadata("idea/testData/internal/toolWindow/inlineFunctionBodyResolve/"); + doTest(fileName); + } + + @TestMetadata("inlineFunctionDeep1") + public void testInlineFunctionDeep1() throws Exception { + String fileName = JetTestUtils.navigationMetadata("idea/testData/internal/toolWindow/inlineFunctionDeep1/"); + doTest(fileName); + } + + @TestMetadata("inlineFunctionDeep2") + public void testInlineFunctionDeep2() throws Exception { + String fileName = JetTestUtils.navigationMetadata("idea/testData/internal/toolWindow/inlineFunctionDeep2/"); + doTest(fileName); + } + + @TestMetadata("inlineFunctionInfixCall") + public void testInlineFunctionInfixCall() throws Exception { + String fileName = JetTestUtils.navigationMetadata("idea/testData/internal/toolWindow/inlineFunctionInfixCall/"); + doTest(fileName); + } + + @TestMetadata("inlineFunctionReifiedParam") + public void testInlineFunctionReifiedParam() throws Exception { + String fileName = JetTestUtils.navigationMetadata("idea/testData/internal/toolWindow/inlineFunctionReifiedParam/"); + doTest(fileName); + } + + @TestMetadata("multipleInlineFunctionCalls") + public void testMultipleInlineFunctionCalls() throws Exception { + String fileName = JetTestUtils.navigationMetadata("idea/testData/internal/toolWindow/multipleInlineFunctionCalls/"); + doTest(fileName); + } + + @TestMetadata("objectInInlineFun") + public void testObjectInInlineFun() throws Exception { + String fileName = JetTestUtils.navigationMetadata("idea/testData/internal/toolWindow/objectInInlineFun/"); + doTest(fileName); + } +}