Add ANDROID target
This commit is contained in:
+32
-9
@@ -17,7 +17,6 @@
|
||||
package org.jetbrains.kotlin.android.tests
|
||||
|
||||
import com.intellij.openapi.util.Ref
|
||||
import org.jetbrains.kotlin.codegen.CodegenTestCase
|
||||
import org.jetbrains.kotlin.load.kotlin.PackagePartClassUtils
|
||||
import org.jetbrains.kotlin.name.FqName
|
||||
import org.jetbrains.kotlin.name.Name
|
||||
@@ -47,18 +46,21 @@ internal fun patchFilesAndAddTest(
|
||||
|
||||
val newPackagePrefix = testFile.path.replace("\\\\|-|\\.|/".toRegex(), "_")
|
||||
val oldPackage = Ref<FqName>()
|
||||
val isJvmName = Ref<Boolean>(false)
|
||||
val isSingle = testFiles.size == 1
|
||||
val resultFiles = testFiles.map {
|
||||
val fileName = if (isSingle) it.name else testFile.name.substringBeforeLast(".kt") + "/" + it.name
|
||||
TestClassInfo(
|
||||
fileName,
|
||||
changePackage(newPackagePrefix, it.content, oldPackage),
|
||||
changePackage(newPackagePrefix, it.content, oldPackage, isJvmName),
|
||||
oldPackage.get(),
|
||||
isJvmName.get(),
|
||||
getGeneratedClassName(File(fileName), it.content, newPackagePrefix, oldPackage.get())
|
||||
)
|
||||
}
|
||||
val packages =
|
||||
resultFiles.map { OldPackageAndNew(it.oldPackage, it.newClassId.parent()) }.sortedByDescending { it.oldFqName.asString().length }
|
||||
resultFiles.map { OldPackageAndNew(it.oldPackage, it.newPackagePartClassId.parent()) }
|
||||
.sortedByDescending { it.oldFqName.asString().length }
|
||||
|
||||
//If files contain any val or var declaration with same name as any package name
|
||||
// then use old conservative renaming scheme, otherwise use aggressive one
|
||||
@@ -95,7 +97,7 @@ internal fun patchFilesAndAddTest(
|
||||
/*replace all Class.forName*/
|
||||
resultFiles.forEach { file ->
|
||||
file.content = resultFiles.fold(file.content) { r, param ->
|
||||
patchClassForName(param.newClassId, param.oldPackage, r, conservativeRenameScheme)
|
||||
patchClassForName(param.newPackagePartClassId, param.oldPackage, r, conservativeRenameScheme)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -104,6 +106,13 @@ internal fun patchFilesAndAddTest(
|
||||
file.content = file.content.patchSelfImports(file.newPackage)
|
||||
}
|
||||
|
||||
//patch root package parts usages in strings
|
||||
resultFiles.forEach { file ->
|
||||
file.content = resultFiles.fold(file.content) { r, param ->
|
||||
patchRootPartNamesInStrings(param.newPackagePartClassId, param.oldPackage, param.isJvmName, r)
|
||||
}
|
||||
}
|
||||
|
||||
val boxFiles = resultFiles.filter { hasBoxMethod(it.content) }
|
||||
if (boxFiles.size != 1) {
|
||||
println("Several box methods in $testFile")
|
||||
@@ -111,22 +120,22 @@ internal fun patchFilesAndAddTest(
|
||||
|
||||
filesHolder.addTest(
|
||||
resultFiles.filter { resultFile -> resultFile.name.endsWith(".kt") || resultFile.name.endsWith(".kts") },
|
||||
TestInfo("", boxFiles.last().newClassId, testFile)
|
||||
TestInfo("", boxFiles.last().newPackagePartClassId, testFile)
|
||||
)
|
||||
|
||||
return boxFiles.last().newClassId
|
||||
return boxFiles.last().newPackagePartClassId
|
||||
}
|
||||
|
||||
private fun hasBoxMethod(text: String): Boolean {
|
||||
return text.contains("fun box()")
|
||||
}
|
||||
|
||||
class TestClassInfo(val name: String, var content: String, val oldPackage: FqName, val newClassId: FqName) {
|
||||
val newPackage = newClassId.parent()
|
||||
class TestClassInfo(val name: String, var content: String, val oldPackage: FqName, val isJvmName: Boolean, val newPackagePartClassId: FqName) {
|
||||
val newPackage = newPackagePartClassId.parent()
|
||||
}
|
||||
|
||||
|
||||
private fun changePackage(newPackagePrefix: String, text: String, oldPackage: Ref<FqName>): String {
|
||||
private fun changePackage(newPackagePrefix: String, text: String, oldPackage: Ref<FqName>, isJvmName: Ref<Boolean>): String {
|
||||
val matcher = packagePattern.matcher(text)
|
||||
if (matcher.find()) {
|
||||
val oldPackageName = matcher.toMatchResult().group(1)
|
||||
@@ -138,6 +147,7 @@ private fun changePackage(newPackagePrefix: String, text: String, oldPackage: Re
|
||||
if (text.contains("@file:")) {
|
||||
val index = text.lastIndexOf("@file:")
|
||||
val packageDirectiveIndex = text.indexOf("\n", index)
|
||||
isJvmName.set(true)
|
||||
return text.substring(0, packageDirectiveIndex + 1) + packageDirective + text.substring(packageDirectiveIndex + 1)
|
||||
} else {
|
||||
return packageDirective + text
|
||||
@@ -170,6 +180,19 @@ private fun patchClassForName(className: FqName, oldPackage: FqName, text: Strin
|
||||
)
|
||||
}
|
||||
|
||||
private fun patchRootPartNamesInStrings(
|
||||
className: FqName,
|
||||
oldPackage: FqName,
|
||||
isJvmName: Boolean,
|
||||
text: String
|
||||
): String {
|
||||
if (!oldPackage.isRoot || isJvmName) return text
|
||||
return text.replace(
|
||||
("\"" + oldPackage.child(className.shortName()).asString()).toRegex(),
|
||||
"\"" + className.asString()
|
||||
)
|
||||
}
|
||||
|
||||
private fun patchPackages(newPackage: FqName, oldPackage: FqName, text: String): String {
|
||||
if (oldPackage.isRoot) return text
|
||||
|
||||
|
||||
+5
-14
@@ -246,9 +246,6 @@ class CodegenTestsOnAndroidGenerator private constructor(private val pathManager
|
||||
}
|
||||
|
||||
for (file in files) {
|
||||
if (SpecialFiles.getExcludedFiles().contains(file.name)) {
|
||||
continue
|
||||
}
|
||||
if (file.isDirectory) {
|
||||
val listFiles = file.listFiles()
|
||||
if (listFiles != null) {
|
||||
@@ -261,7 +258,9 @@ class CodegenTestsOnAndroidGenerator private constructor(private val pathManager
|
||||
continue
|
||||
}
|
||||
|
||||
if (!InTextDirectivesUtils.isPassingTarget(TargetBackend.JVM, file)) {
|
||||
if (!InTextDirectivesUtils.isPassingTarget(TargetBackend.JVM, file) ||
|
||||
InTextDirectivesUtils.isIgnoredTarget(TargetBackend.ANDROID, file)
|
||||
) {
|
||||
continue
|
||||
}
|
||||
|
||||
@@ -313,16 +312,7 @@ class CodegenTestsOnAndroidGenerator private constructor(private val pathManager
|
||||
}
|
||||
|
||||
private fun createTestFiles(file: File, expectedText: String): List<KotlinBaseTest.TestFile> =
|
||||
TestFiles.createTestFiles(
|
||||
file.name,
|
||||
expectedText,
|
||||
object : TestFiles.TestFileFactoryNoModules<KotlinBaseTest.TestFile>() {
|
||||
override fun create(fileName: String, text: String, directives: Directives): KotlinBaseTest.TestFile {
|
||||
return KotlinBaseTest.TestFile(fileName, text, directives)
|
||||
}
|
||||
}, false,
|
||||
"kotlin.coroutines"
|
||||
)
|
||||
CodegenTestCase.createTestFilesFromFile(file, expectedText, "kotlin.coroutines", false, TargetBackend.JVM)
|
||||
|
||||
companion object {
|
||||
const val GRADLE_VERSION = "5.6.4"
|
||||
@@ -359,6 +349,7 @@ class CodegenTestsOnAndroidGenerator private constructor(private val pathManager
|
||||
val rootFolder = File("")
|
||||
val pathManager = PathManager(rootFolder.absolutePath, tmpFolder.absolutePath)
|
||||
generate(pathManager, true)
|
||||
println("Android test project is generated into " + tmpFolder.absolutePath + " folder")
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,87 +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.android.tests;
|
||||
|
||||
import java.util.HashSet;
|
||||
import java.util.Set;
|
||||
|
||||
public class SpecialFiles {
|
||||
private static final Set<String> excludedFiles = new HashSet<>();
|
||||
|
||||
static {
|
||||
fillExcludedFiles();
|
||||
}
|
||||
|
||||
public static Set<String> getExcludedFiles() {
|
||||
return excludedFiles;
|
||||
}
|
||||
|
||||
private static void fillExcludedFiles() {
|
||||
// Reflection
|
||||
excludedFiles.add("enclosing");
|
||||
excludedFiles.add("kt10259.kt");
|
||||
excludedFiles.add("simpleClassLiteral.kt");
|
||||
|
||||
//UnsatisfiedLinkError
|
||||
excludedFiles.add("nativePropertyAccessors.kt");
|
||||
excludedFiles.add("topLevel.kt");
|
||||
|
||||
// "IOOBE: Invalid index 4, size is 4" for java.lang.reflect.ParameterizedType on Android
|
||||
excludedFiles.add("innerGenericTypeArgument.kt");
|
||||
|
||||
// Cannot change package name
|
||||
excludedFiles.add("kt6990.kt");
|
||||
excludedFiles.add("typeParameters.kt");
|
||||
excludedFiles.add("kt13133.kt");
|
||||
|
||||
// StackOverflow with StringBuilder (escape())
|
||||
excludedFiles.add("kt684.kt");
|
||||
|
||||
// Wrong enclosing info or signature after package renaming
|
||||
excludedFiles.add("enclosingInfo");
|
||||
excludedFiles.add("signature");
|
||||
|
||||
// Some classes are not visible on android
|
||||
excludedFiles.add("classpath.kt");
|
||||
|
||||
// Out of memory
|
||||
excludedFiles.add("manyNumbers.kt");
|
||||
|
||||
// Native methods
|
||||
excludedFiles.add("external");
|
||||
|
||||
// Additional nested class in 'Thread' class on Android
|
||||
excludedFiles.add("nestedClasses.kt");
|
||||
|
||||
// KT-8120
|
||||
excludedFiles.add("closureOfInnerLocalClass.kt");
|
||||
excludedFiles.add("closureWithSelfInstantiation.kt");
|
||||
excludedFiles.add("quotedClassName.kt");
|
||||
|
||||
//wrong function resolution after package renaming
|
||||
excludedFiles.add("apiVersionAtLeast1.kt");
|
||||
|
||||
//special symbols in names
|
||||
excludedFiles.add("nameWithWhitespace.kt");
|
||||
|
||||
//some classes are moved from stdlib to compatibility package
|
||||
excludedFiles.add("suspendFunction_1_2.kt");
|
||||
}
|
||||
|
||||
private SpecialFiles() {
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user