Add more stub generator tests for external dependencies

This commit is contained in:
Dmitry Petrov
2017-05-05 13:38:41 +03:00
parent dba9011563
commit 1dbd6453e0
17 changed files with 237 additions and 6 deletions
+10
View File
@@ -0,0 +1,10 @@
// !DUMP_DEPENDENCIES
// FILE: JEnum.java
public enum JEnum {
ONE, TWO, THREE;
}
// FILE: javaEnum.kt
val test = JEnum.ONE
+9
View File
@@ -0,0 +1,9 @@
FILE /javaEnum.kt
PROPERTY public val test: JEnum
FIELD PROPERTY_BACKING_FIELD public val test: JEnum
EXPRESSION_BODY
GET_ENUM 'ONE' type=JEnum
FUN DEFAULT_PROPERTY_ACCESSOR public fun <get-test>(): JEnum
BLOCK_BODY
RETURN type=kotlin.Nothing from='<get-test>(): JEnum'
GET_FIELD 'test: JEnum' type=JEnum origin=null
@@ -0,0 +1,23 @@
MODULE_FRAGMENT <test-module>
EXTERNAL_PACKAGE_FRAGMENT <root>
CLASS IR_EXTERNAL_DECLARATION_STUB ENUM_CLASS JEnum
CONSTRUCTOR IR_EXTERNAL_DECLARATION_STUB public constructor JEnum()
ENUM_ENTRY IR_EXTERNAL_DECLARATION_STUB enum entry ONE
ENUM_ENTRY IR_EXTERNAL_DECLARATION_STUB enum entry THREE
ENUM_ENTRY IR_EXTERNAL_DECLARATION_STUB enum entry TWO
FUN IR_EXTERNAL_DECLARATION_STUB protected final override fun clone(): kotlin.Any
FUN IR_EXTERNAL_DECLARATION_STUB protected/*protected and package*/ final override fun finalize(): kotlin.Unit
FUN IR_EXTERNAL_DECLARATION_STUB public final override fun getDeclaringClass(): java.lang.Class<JEnum!>!
FUN IR_EXTERNAL_DECLARATION_STUB public final override fun compareTo(other: JEnum!): kotlin.Int
VALUE_PARAMETER value-parameter other: JEnum!
FUN IR_EXTERNAL_DECLARATION_STUB public final override fun equals(other: kotlin.Any?): kotlin.Boolean
VALUE_PARAMETER value-parameter other: kotlin.Any?
FUN IR_EXTERNAL_DECLARATION_STUB public final override fun hashCode(): kotlin.Int
PROPERTY IR_EXTERNAL_DECLARATION_STUB public final override val name: kotlin.String
FUN IR_EXTERNAL_DECLARATION_STUB public final override fun <get-name>(): kotlin.String
PROPERTY IR_EXTERNAL_DECLARATION_STUB public final override val ordinal: kotlin.Int
FUN IR_EXTERNAL_DECLARATION_STUB public final override fun <get-ordinal>(): kotlin.Int
FUN IR_EXTERNAL_DECLARATION_STUB public open override fun toString(): kotlin.String
FUN IR_EXTERNAL_DECLARATION_STUB public final fun valueOf(value: kotlin.String): JEnum
VALUE_PARAMETER value-parameter value: kotlin.String
FUN IR_EXTERNAL_DECLARATION_STUB public final fun values(): kotlin.Array<JEnum>
+18
View File
@@ -0,0 +1,18 @@
// !DUMP_DEPENDENCIES
// FILE: J.java
public class J {
public class JInner {
public void foo() {}
public int z = 0;
}
public void bar() {}
public int x = 0;
}
// FILE: javaInnerClass.kt
class Test1 : J() {
val test = JInner()
}
+29
View File
@@ -0,0 +1,29 @@
FILE /javaInnerClass.kt
CLASS CLASS Test1
$this: VALUE_PARAMETER this@Test1: Test1
CONSTRUCTOR public constructor Test1()
BLOCK_BODY
DELEGATING_CONSTRUCTOR_CALL 'constructor J()'
INSTANCE_INITIALIZER_CALL classDescriptor='Test1'
PROPERTY public final val test: J.JInner
FIELD PROPERTY_BACKING_FIELD public final val test: J.JInner
EXPRESSION_BODY
CALL 'constructor JInner()' type=J.JInner origin=null
$this: GET_VAR 'this@Test1: Test1' type=Test1 origin=null
FUN DEFAULT_PROPERTY_ACCESSOR public final fun <get-test>(): J.JInner
$this: VALUE_PARAMETER this@Test1: Test1
BLOCK_BODY
RETURN type=kotlin.Nothing from='<get-test>(): J.JInner'
GET_FIELD 'test: J.JInner' type=J.JInner origin=null
receiver: GET_VAR 'this@Test1: Test1' type=Test1 origin=null
PROPERTY FAKE_OVERRIDE public final override var x: kotlin.Int
FIELD FAKE_OVERRIDE public final override var x: kotlin.Int
FUN FAKE_OVERRIDE public open override fun bar(): kotlin.Unit
$this: VALUE_PARAMETER this@J: J
FUN FAKE_OVERRIDE public open override fun equals(other: kotlin.Any?): kotlin.Boolean
$this: VALUE_PARAMETER this@Any: Any
VALUE_PARAMETER value-parameter other: kotlin.Any?
FUN FAKE_OVERRIDE public open override fun hashCode(): kotlin.Int
$this: VALUE_PARAMETER this@Any: Any
FUN FAKE_OVERRIDE public open override fun toString(): kotlin.String
$this: VALUE_PARAMETER this@Any: Any
@@ -0,0 +1,20 @@
MODULE_FRAGMENT <test-module>
EXTERNAL_PACKAGE_FRAGMENT <root>
CLASS IR_EXTERNAL_DECLARATION_STUB CLASS J
CONSTRUCTOR IR_EXTERNAL_DECLARATION_STUB public constructor J()
PROPERTY IR_EXTERNAL_DECLARATION_STUB public final var x: kotlin.Int
FIELD IR_EXTERNAL_DECLARATION_STUB public final var x: kotlin.Int
FUN IR_EXTERNAL_DECLARATION_STUB public open fun bar(): kotlin.Unit
CLASS IR_EXTERNAL_DECLARATION_STUB CLASS JInner
CONSTRUCTOR IR_EXTERNAL_DECLARATION_STUB public constructor JInner()
PROPERTY IR_EXTERNAL_DECLARATION_STUB public final var z: kotlin.Int
FIELD IR_EXTERNAL_DECLARATION_STUB public final var z: kotlin.Int
FUN IR_EXTERNAL_DECLARATION_STUB public open fun foo(): kotlin.Unit
FUN IR_EXTERNAL_DECLARATION_STUB public open override fun equals(other: kotlin.Any?): kotlin.Boolean
VALUE_PARAMETER value-parameter other: kotlin.Any?
FUN IR_EXTERNAL_DECLARATION_STUB public open override fun hashCode(): kotlin.Int
FUN IR_EXTERNAL_DECLARATION_STUB public open override fun toString(): kotlin.String
FUN IR_EXTERNAL_DECLARATION_STUB public open override fun equals(other: kotlin.Any?): kotlin.Boolean
VALUE_PARAMETER value-parameter other: kotlin.Any?
FUN IR_EXTERNAL_DECLARATION_STUB public open override fun hashCode(): kotlin.Int
FUN IR_EXTERNAL_DECLARATION_STUB public open override fun toString(): kotlin.String
+13
View File
@@ -0,0 +1,13 @@
// !DUMP_DEPENDENCIES
// FILE: J.java
public class J {
public static class JJ {
public void foo() {}
public static void bar() {}
}
}
// FILE: javaNestedClass.kt
fun test(jj: J.JJ) = jj.foo()
+7
View File
@@ -0,0 +1,7 @@
FILE /javaNestedClass.kt
FUN public fun test(jj: J.JJ): kotlin.Unit
VALUE_PARAMETER value-parameter jj: J.JJ
BLOCK_BODY
RETURN type=kotlin.Nothing from='test(J.JJ): Unit'
CALL 'foo(): Unit' type=kotlin.Unit origin=null
$this: GET_VAR 'value-parameter jj: J.JJ' type=J.JJ origin=null
@@ -0,0 +1,16 @@
MODULE_FRAGMENT <test-module>
EXTERNAL_PACKAGE_FRAGMENT <root>
CLASS IR_EXTERNAL_DECLARATION_STUB CLASS J
CONSTRUCTOR IR_EXTERNAL_DECLARATION_STUB public constructor J()
CLASS IR_EXTERNAL_DECLARATION_STUB CLASS JJ
CONSTRUCTOR IR_EXTERNAL_DECLARATION_STUB public constructor JJ()
FUN IR_EXTERNAL_DECLARATION_STUB public open fun foo(): kotlin.Unit
FUN IR_EXTERNAL_DECLARATION_STUB public open override fun equals(other: kotlin.Any?): kotlin.Boolean
VALUE_PARAMETER value-parameter other: kotlin.Any?
FUN IR_EXTERNAL_DECLARATION_STUB public open override fun hashCode(): kotlin.Int
FUN IR_EXTERNAL_DECLARATION_STUB public open override fun toString(): kotlin.String
FUN IR_EXTERNAL_DECLARATION_STUB public open fun bar(): kotlin.Unit
FUN IR_EXTERNAL_DECLARATION_STUB public open override fun equals(other: kotlin.Any?): kotlin.Boolean
VALUE_PARAMETER value-parameter other: kotlin.Any?
FUN IR_EXTERNAL_DECLARATION_STUB public open override fun hashCode(): kotlin.Int
FUN IR_EXTERNAL_DECLARATION_STUB public open override fun toString(): kotlin.String
+13
View File
@@ -0,0 +1,13 @@
// !DUMP_DEPENDENCIES
// FILE: external.kt
// EXTERNAL_FILE
class Outer {
inner class Inner {
fun foo() {}
}
fun bar() {}
}
// FILE: kotlinInnerClass.kt
fun test(inner: Outer.Inner) = inner.foo()
@@ -0,0 +1,7 @@
FILE /kotlinInnerClass.kt
FUN public fun test(inner: Outer.Inner): kotlin.Unit
VALUE_PARAMETER value-parameter inner: Outer.Inner
BLOCK_BODY
RETURN type=kotlin.Nothing from='test(Outer.Inner): Unit'
CALL 'foo(): Unit' type=kotlin.Unit origin=null
$this: GET_VAR 'value-parameter inner: Outer.Inner' type=Outer.Inner origin=null
@@ -0,0 +1,8 @@
MODULE_FRAGMENT <built-ins module>
EXTERNAL_PACKAGE_FRAGMENT kotlin
CLASS IR_EXTERNAL_DECLARATION_STUB CLASS Any
CONSTRUCTOR IR_EXTERNAL_DECLARATION_STUB public constructor Any()
FUN IR_EXTERNAL_DECLARATION_STUB public open fun hashCode(): kotlin.Int
FUN IR_EXTERNAL_DECLARATION_STUB public open fun toString(): kotlin.String
FUN IR_EXTERNAL_DECLARATION_STUB public open operator fun equals(other: kotlin.Any?): kotlin.Boolean
VALUE_PARAMETER value-parameter other: kotlin.Any?
@@ -0,0 +1,16 @@
MODULE_FRAGMENT <test-module>
EXTERNAL_PACKAGE_FRAGMENT <root>
CLASS IR_EXTERNAL_DECLARATION_STUB CLASS Outer
CONSTRUCTOR IR_EXTERNAL_DECLARATION_STUB public constructor Outer()
FUN IR_EXTERNAL_DECLARATION_STUB public final fun bar(): kotlin.Unit
CLASS IR_EXTERNAL_DECLARATION_STUB CLASS Inner
CONSTRUCTOR IR_EXTERNAL_DECLARATION_STUB public constructor Inner()
FUN IR_EXTERNAL_DECLARATION_STUB public final fun foo(): kotlin.Unit
FUN IR_EXTERNAL_DECLARATION_STUB public open override fun equals(other: kotlin.Any?): kotlin.Boolean
VALUE_PARAMETER value-parameter other: kotlin.Any?
FUN IR_EXTERNAL_DECLARATION_STUB public open override fun hashCode(): kotlin.Int
FUN IR_EXTERNAL_DECLARATION_STUB public open override fun toString(): kotlin.String
FUN IR_EXTERNAL_DECLARATION_STUB public open override fun equals(other: kotlin.Any?): kotlin.Boolean
VALUE_PARAMETER value-parameter other: kotlin.Any?
FUN IR_EXTERNAL_DECLARATION_STUB public open override fun hashCode(): kotlin.Int
FUN IR_EXTERNAL_DECLARATION_STUB public open override fun toString(): kotlin.String
@@ -66,7 +66,7 @@ abstract class AbstractIrGeneratorTestCase : CodegenTestCase() {
addReflect -> ConfigurationKind.ALL
addRuntime -> ConfigurationKind.NO_KOTLIN_REFLECT
else -> ConfigurationKind.JDK_ONLY
};
}
val configuration = createConfiguration(
configurationKind, jdkKind,
@@ -80,10 +80,10 @@ abstract class AbstractIrGeneratorTestCase : CodegenTestCase() {
protected abstract fun doTest(wholeFile: File, testFiles: List<TestFile>)
protected fun generateIrModule(ignoreErrors: Boolean = false): IrModuleFragment {
protected fun generateIrModule(ignoreErrors: Boolean = false, shouldGenerate: (KtFile) -> Boolean = { true }): IrModuleFragment {
assert(myFiles != null) { "myFiles not initialized" }
assert(myEnvironment != null) { "myEnvironment not initialized" }
return generateIrModule(myFiles.psiFiles, myEnvironment, Psi2IrTranslator(Psi2IrConfiguration(ignoreErrors)))
return generateIrModule(myFiles.psiFiles, myEnvironment, Psi2IrTranslator(Psi2IrConfiguration(ignoreErrors)), shouldGenerate)
}
protected fun generateIrFilesAsSingleModule(testFiles: List<TestFile>, ignoreErrors: Boolean = false): Map<TestFile, IrFile> {
@@ -109,13 +109,19 @@ abstract class AbstractIrGeneratorTestCase : CodegenTestCase() {
return textFile
}
fun generateIrModule(ktFiles: List<KtFile>, environment: KotlinCoreEnvironment, psi2ir: Psi2IrTranslator): IrModuleFragment {
val analysisResult = JvmResolveUtil.analyze(ktFiles, environment)
fun generateIrModule(
ktFilesToAnalyze: List<KtFile>,
environment: KotlinCoreEnvironment,
psi2ir: Psi2IrTranslator,
shouldGenerate: (KtFile) -> Boolean
): IrModuleFragment {
val analysisResult = JvmResolveUtil.analyze(ktFilesToAnalyze, environment)
if (!psi2ir.configuration.ignoreErrors) {
analysisResult.throwIfError()
AnalyzingUtils.throwExceptionOnErrors(analysisResult.bindingContext)
}
return generateIrModule(ktFiles, analysisResult.moduleDescriptor, analysisResult.bindingContext, psi2ir)
val fileToGenerate = ktFilesToAnalyze.filter { shouldGenerate(it) }
return generateIrModule(fileToGenerate, analysisResult.moduleDescriptor, analysisResult.bindingContext, psi2ir)
}
fun generateIrModule(ktFiles: List<KtFile>, moduleDescriptor: ModuleDescriptor, bindingContext: BindingContext, ignoreErrors: Boolean = false) =
@@ -29,6 +29,7 @@ import org.jetbrains.kotlin.ir.symbols.IrSymbol
import org.jetbrains.kotlin.ir.util.*
import org.jetbrains.kotlin.ir.visitors.IrElementVisitorVoid
import org.jetbrains.kotlin.ir.visitors.acceptChildrenVoid
import org.jetbrains.kotlin.psi.KtFile
import org.jetbrains.kotlin.test.KotlinTestUtils
import org.jetbrains.kotlin.utils.rethrow
import java.io.File
@@ -60,6 +61,8 @@ abstract class AbstractIrTextTestCase : AbstractIrGeneratorTestCase() {
}
protected fun doTestIrFileAgainstExpectations(dir: File, testFile: TestFile, irFile: IrFile) {
if (testFile.isExternalFile()) return
val expectations = parseExpectations(dir, testFile)
val irFileDump = irFile.dump()
@@ -234,9 +237,17 @@ abstract class AbstractIrTextTestCase : AbstractIrGeneratorTestCase() {
private val DUMP_DEPENDENCIES_PATTERN = Regex("""// !DUMP_DEPENDENCIES""")
private val EXTERNAL_FILE_PATTERN = Regex("""// EXTERNAL_FILE""")
internal fun shouldDumpDependencies(wholeFile: File): Boolean =
DUMP_DEPENDENCIES_PATTERN.containsMatchIn(wholeFile.readText())
internal fun TestFile.isExternalFile() =
EXTERNAL_FILE_PATTERN.containsMatchIn(content)
internal fun KtFile.isExternalFile() =
EXTERNAL_FILE_PATTERN.containsMatchIn(text)
internal fun parseExpectations(dir: File, testFile: TestFile): Expectations {
val regexps = ArrayList<RegexpInText>()
val treeFiles = ArrayList<IrTreeFileLabel>()
@@ -1103,6 +1103,30 @@ public class IrTextTestCaseGenerated extends AbstractIrTextTestCase {
KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("compiler/testData/ir/irText/stubs"), Pattern.compile("^(.+)\\.kt$"), TargetBackend.ANY, true);
}
@TestMetadata("javaEnum.kt")
public void testJavaEnum() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/ir/irText/stubs/javaEnum.kt");
doTest(fileName);
}
@TestMetadata("javaInnerClass.kt")
public void testJavaInnerClass() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/ir/irText/stubs/javaInnerClass.kt");
doTest(fileName);
}
@TestMetadata("javaNestedClass.kt")
public void testJavaNestedClass() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/ir/irText/stubs/javaNestedClass.kt");
doTest(fileName);
}
@TestMetadata("kotlinInnerClass.kt")
public void testKotlinInnerClass() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/ir/irText/stubs/kotlinInnerClass.kt");
doTest(fileName);
}
@TestMetadata("simple.kt")
public void testSimple() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/ir/irText/stubs/simple.kt");
@@ -53,4 +53,5 @@ public class SourceMapGenerationSmokeTestGenerated extends AbstractSourceMapGene
String fileName = KotlinTestUtils.navigationMetadata("js/js.translator/testData/sourcemap/methodCallInMethod.kt");
doTest(fileName);
}
}