[K/N][KT-39120] Build platform libraries with -fmodules
Merge-request: KT-MR-8175 Merged-by: Vladimir Sukharev <Vladimir.Sukharev@jetbrains.com>
This commit is contained in:
committed by
Space Team
parent
d85b23ebb9
commit
45de88abae
+10
-8
@@ -318,18 +318,13 @@ public open class NativeIndexImpl(val library: NativeLibrary, val verbose: Boole
|
|||||||
if (clang_isCursorDefinition(definitionCursor) != 0) {
|
if (clang_isCursorDefinition(definitionCursor) != 0) {
|
||||||
return getEnumDefAt(definitionCursor)
|
return getEnumDefAt(definitionCursor)
|
||||||
} else {
|
} else {
|
||||||
TODO("support enum forward declarations: " +
|
// FIXME("enum declaration without constants might be not a typedef, but a forward declaration instead")
|
||||||
clang_getTypeSpelling(clang_getCursorType(cursor)).convertAndDispose())
|
return enumRegistry.getOrPut(cursor) { createEnumDefImpl(cursor) }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return enumRegistry.getOrPut(cursor) {
|
return enumRegistry.getOrPut(cursor) {
|
||||||
val cursorType = clang_getCursorType(cursor)
|
val enumDef = createEnumDefImpl(cursor)
|
||||||
val typeSpelling = clang_getTypeSpelling(cursorType).convertAndDispose()
|
|
||||||
|
|
||||||
val baseType = convertType(clang_getEnumDeclIntegerType(cursor))
|
|
||||||
|
|
||||||
val enumDef = EnumDefImpl(typeSpelling, baseType, getLocation(cursor))
|
|
||||||
|
|
||||||
visitChildren(cursor) { childCursor, _ ->
|
visitChildren(cursor) { childCursor, _ ->
|
||||||
if (clang_getCursorKind(childCursor) == CXCursorKind.CXCursor_EnumConstantDecl) {
|
if (clang_getCursorKind(childCursor) == CXCursorKind.CXCursor_EnumConstantDecl) {
|
||||||
@@ -347,6 +342,13 @@ public open class NativeIndexImpl(val library: NativeLibrary, val verbose: Boole
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private fun createEnumDefImpl(cursor: CValue<CXCursor>): EnumDefImpl {
|
||||||
|
val cursorType = clang_getCursorType(cursor)
|
||||||
|
val typeSpelling = clang_getTypeSpelling(cursorType).convertAndDispose()
|
||||||
|
val baseType = convertType(clang_getEnumDeclIntegerType(cursor))
|
||||||
|
return EnumDefImpl(typeSpelling, baseType, getLocation(cursor))
|
||||||
|
}
|
||||||
|
|
||||||
private fun getObjCCategoryClassCursor(cursor: CValue<CXCursor>): CValue<CXCursor> {
|
private fun getObjCCategoryClassCursor(cursor: CValue<CXCursor>): CValue<CXCursor> {
|
||||||
assert(cursor.kind == CXCursorKind.CXCursor_ObjCCategoryDecl)
|
assert(cursor.kind == CXCursorKind.CXCursor_ObjCCategoryDecl)
|
||||||
var classRef: CValue<CXCursor>? = null
|
var classRef: CValue<CXCursor>? = null
|
||||||
|
|||||||
+8
-6
@@ -4,7 +4,7 @@ import clang.*
|
|||||||
import kotlinx.cinterop.*
|
import kotlinx.cinterop.*
|
||||||
import java.nio.file.Files
|
import java.nio.file.Files
|
||||||
|
|
||||||
data class ModulesInfo(val topLevelHeaders: List<String>, val ownHeaders: Set<String>, val modules: List<String>)
|
data class ModulesInfo(val topLevelHeaders: List<IncludeInfo>, val ownHeaders: Set<String>, val modules: List<String>)
|
||||||
|
|
||||||
fun getModulesInfo(compilation: Compilation, modules: List<String>): ModulesInfo {
|
fun getModulesInfo(compilation: Compilation, modules: List<String>): ModulesInfo {
|
||||||
if (modules.isEmpty()) return ModulesInfo(emptyList(), emptySet(), emptyList())
|
if (modules.isEmpty()) return ModulesInfo(emptyList(), emptySet(), emptyList())
|
||||||
@@ -17,9 +17,11 @@ fun getModulesInfo(compilation: Compilation, modules: List<String>): ModulesInfo
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
data class IncludeInfo(val headerPath: String, val moduleName: String?)
|
||||||
|
|
||||||
private fun buildModulesInfo(index: CXIndex, modules: List<String>, modulesASTFiles: List<String>): ModulesInfo {
|
private fun buildModulesInfo(index: CXIndex, modules: List<String>, modulesASTFiles: List<String>): ModulesInfo {
|
||||||
val ownHeaders = mutableSetOf<String>()
|
val ownHeaders = mutableSetOf<String>()
|
||||||
val topLevelHeaders = linkedSetOf<String>()
|
val topLevelHeaders = linkedSetOf<IncludeInfo>()
|
||||||
modulesASTFiles.forEach {
|
modulesASTFiles.forEach {
|
||||||
val moduleTranslationUnit = clang_createTranslationUnit(index, it)!!
|
val moduleTranslationUnit = clang_createTranslationUnit(index, it)!!
|
||||||
try {
|
try {
|
||||||
@@ -89,7 +91,7 @@ private fun getModulesHeaders(
|
|||||||
index: CXIndex,
|
index: CXIndex,
|
||||||
translationUnit: CXTranslationUnit,
|
translationUnit: CXTranslationUnit,
|
||||||
modules: Set<String>,
|
modules: Set<String>,
|
||||||
topLevelHeaders: LinkedHashSet<String>
|
topLevelHeaders: LinkedHashSet<IncludeInfo>
|
||||||
): Set<CXFile> {
|
): Set<CXFile> {
|
||||||
val nonModularIncludes = mutableMapOf<CXFile, MutableSet<CXFile>>()
|
val nonModularIncludes = mutableMapOf<CXFile, MutableSet<CXFile>>()
|
||||||
val result = mutableSetOf<CXFile>()
|
val result = mutableSetOf<CXFile>()
|
||||||
@@ -99,13 +101,13 @@ private fun getModulesHeaders(
|
|||||||
val file = info.file!!
|
val file = info.file!!
|
||||||
val includer = clang_indexLoc_getCXSourceLocation(info.hashLoc.readValue()).getContainingFile()
|
val includer = clang_indexLoc_getCXSourceLocation(info.hashLoc.readValue()).getContainingFile()
|
||||||
|
|
||||||
|
val module = clang_getModuleForFile(translationUnit, file)
|
||||||
|
|
||||||
if (includer == null) {
|
if (includer == null) {
|
||||||
// i.e. the header is included by the module itself.
|
// i.e. the header is included by the module itself.
|
||||||
topLevelHeaders += file.path
|
topLevelHeaders += IncludeInfo(file.path, clang_Module_getFullName(module).convertAndDispose())
|
||||||
}
|
}
|
||||||
|
|
||||||
val module = clang_getModuleForFile(translationUnit, file)
|
|
||||||
|
|
||||||
if (module != null) {
|
if (module != null) {
|
||||||
val moduleWithParents = generateSequence(module, { clang_Module_getParent(it) }).map {
|
val moduleWithParents = generateSequence(module, { clang_Module_getParent(it) }).map {
|
||||||
clang_Module_getFullName(it).convertAndDispose()
|
clang_Module_getFullName(it).convertAndDispose()
|
||||||
|
|||||||
+3
-3
@@ -52,7 +52,7 @@ sealed class NativeLibraryHeaderFilter {
|
|||||||
}
|
}
|
||||||
|
|
||||||
interface Compilation {
|
interface Compilation {
|
||||||
val includes: List<String>
|
val includes: List<IncludeInfo>
|
||||||
val additionalPreambleLines: List<String>
|
val additionalPreambleLines: List<String>
|
||||||
val compilerArgs: List<String>
|
val compilerArgs: List<String>
|
||||||
val language: Language
|
val language: Language
|
||||||
@@ -93,7 +93,7 @@ data class CompilationWithPCH(
|
|||||||
constructor(compilerArgs: List<String>, precompiledHeader: String, language: Language)
|
constructor(compilerArgs: List<String>, precompiledHeader: String, language: Language)
|
||||||
: this(compilerArgs + listOf("-include-pch", precompiledHeader), language)
|
: this(compilerArgs + listOf("-include-pch", precompiledHeader), language)
|
||||||
|
|
||||||
override val includes: List<String>
|
override val includes: List<IncludeInfo>
|
||||||
get() = emptyList()
|
get() = emptyList()
|
||||||
|
|
||||||
override val additionalPreambleLines: List<String>
|
override val additionalPreambleLines: List<String>
|
||||||
@@ -102,7 +102,7 @@ data class CompilationWithPCH(
|
|||||||
|
|
||||||
// TODO: Compilation hierarchy seems to require some refactoring.
|
// TODO: Compilation hierarchy seems to require some refactoring.
|
||||||
|
|
||||||
data class NativeLibrary(override val includes: List<String>,
|
data class NativeLibrary(override val includes: List<IncludeInfo>,
|
||||||
override val additionalPreambleLines: List<String>,
|
override val additionalPreambleLines: List<String>,
|
||||||
override val compilerArgs: List<String>,
|
override val compilerArgs: List<String>,
|
||||||
val headerToIdMapper: HeaderToIdMapper,
|
val headerToIdMapper: HeaderToIdMapper,
|
||||||
|
|||||||
+9
-3
@@ -354,7 +354,13 @@ internal fun List<String>.toNativeStringArray(scope: AutofreeScope): CArrayPoint
|
|||||||
}
|
}
|
||||||
|
|
||||||
val Compilation.preambleLines: List<String>
|
val Compilation.preambleLines: List<String>
|
||||||
get() = this.includes.map { "#include <$it>" } + this.additionalPreambleLines
|
get() = this.includes.map {
|
||||||
|
if (it.moduleName != null && it.moduleName != "" && "-fmodules" in this.compilerArgs) {
|
||||||
|
"@import ${it.moduleName};"
|
||||||
|
} else {
|
||||||
|
"#include <${it.headerPath}>"
|
||||||
|
}
|
||||||
|
} + this.additionalPreambleLines
|
||||||
|
|
||||||
internal fun Appendable.appendPreamble(compilation: Compilation) = this.apply {
|
internal fun Appendable.appendPreamble(compilation: Compilation) = this.apply {
|
||||||
compilation.preambleLines.forEach {
|
compilation.preambleLines.forEach {
|
||||||
@@ -377,7 +383,7 @@ internal fun Compilation.createTempSource(): File {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fun Compilation.copy(
|
fun Compilation.copy(
|
||||||
includes: List<String> = this.includes,
|
includes: List<IncludeInfo> = this.includes,
|
||||||
additionalPreambleLines: List<String> = this.additionalPreambleLines,
|
additionalPreambleLines: List<String> = this.additionalPreambleLines,
|
||||||
compilerArgs: List<String> = this.compilerArgs,
|
compilerArgs: List<String> = this.compilerArgs,
|
||||||
language: Language = this.language
|
language: Language = this.language
|
||||||
@@ -394,7 +400,7 @@ fun Compilation.copyWithArgsForPCH(): Compilation =
|
|||||||
copy(compilerArgs = compilerArgs.filterNot { it.startsWith("-fmodule-map-file") })
|
copy(compilerArgs = compilerArgs.filterNot { it.startsWith("-fmodule-map-file") })
|
||||||
|
|
||||||
data class CompilationImpl(
|
data class CompilationImpl(
|
||||||
override val includes: List<String>,
|
override val includes: List<IncludeInfo>,
|
||||||
override val additionalPreambleLines: List<String>,
|
override val additionalPreambleLines: List<String>,
|
||||||
override val compilerArgs: List<String>,
|
override val compilerArgs: List<String>,
|
||||||
override val language: Language
|
override val language: Language
|
||||||
|
|||||||
+1
-1
@@ -153,7 +153,7 @@ class ModuleTests : IndexerTests() {
|
|||||||
assertContains(error.message.orEmpty(), "testModuleWithBadCode/Foo.h:1:1: error: unknown type name 'bad'")
|
assertContains(error.message.orEmpty(), "testModuleWithBadCode/Foo.h:1:1: error: unknown type name 'bad'")
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun List<String>.canonicalize(): List<String> = this.map { File(it).canonicalPath }
|
private fun List<IncludeInfo>.canonicalize(): List<String> = this.map { File(it.headerPath).canonicalPath }
|
||||||
|
|
||||||
private fun compilationIncluding(includeDirectory: File) = compilation("-I$includeDirectory")
|
private fun compilationIncluding(includeDirectory: File) = compilation("-I$includeDirectory")
|
||||||
|
|
||||||
|
|||||||
+5
-5
@@ -24,14 +24,14 @@ class StubIrContext(
|
|||||||
val plugin: Plugin
|
val plugin: Plugin
|
||||||
) {
|
) {
|
||||||
val libraryForCStubs = configuration.library.copy(
|
val libraryForCStubs = configuration.library.copy(
|
||||||
includes = mutableListOf<String>().apply {
|
includes = mutableListOf<IncludeInfo>().apply {
|
||||||
add("stdint.h")
|
add(IncludeInfo("stdint.h", null))
|
||||||
add("string.h")
|
add(IncludeInfo("string.h", null))
|
||||||
if (platform == KotlinPlatform.JVM) {
|
if (platform == KotlinPlatform.JVM) {
|
||||||
add("jni.h")
|
add(IncludeInfo("jni.h", null))
|
||||||
}
|
}
|
||||||
if (configuration.library.language == Language.CPP) {
|
if (configuration.library.language == Language.CPP) {
|
||||||
add("new")
|
add(IncludeInfo("new", null))
|
||||||
}
|
}
|
||||||
addAll(configuration.library.includes)
|
addAll(configuration.library.includes)
|
||||||
},
|
},
|
||||||
|
|||||||
+3
-3
@@ -532,14 +532,14 @@ internal fun buildNativeLibrary(
|
|||||||
}
|
}
|
||||||
|
|
||||||
val compilation = CompilationImpl(
|
val compilation = CompilationImpl(
|
||||||
includes = headerFiles,
|
includes = headerFiles.map { IncludeInfo(it, null) },
|
||||||
additionalPreambleLines = def.defHeaderLines + predefinedMacrosRedefinitions,
|
additionalPreambleLines = def.defHeaderLines + predefinedMacrosRedefinitions,
|
||||||
compilerArgs = defaultCompilerArgs(language) + compilerOpts + tool.platformCompilerOpts,
|
compilerArgs = defaultCompilerArgs(language) + compilerOpts + tool.platformCompilerOpts,
|
||||||
language = language
|
language = language
|
||||||
)
|
)
|
||||||
|
|
||||||
val headerFilter: NativeLibraryHeaderFilter
|
val headerFilter: NativeLibraryHeaderFilter
|
||||||
val includes: List<String>
|
val includes: List<IncludeInfo>
|
||||||
|
|
||||||
val modules = def.config.modules
|
val modules = def.config.modules
|
||||||
|
|
||||||
@@ -552,7 +552,7 @@ internal fun buildNativeLibrary(
|
|||||||
val headerInclusionPolicy = HeaderInclusionPolicyImpl(headerFilterGlobs, excludeFilterGlobs)
|
val headerInclusionPolicy = HeaderInclusionPolicyImpl(headerFilterGlobs, excludeFilterGlobs)
|
||||||
|
|
||||||
headerFilter = NativeLibraryHeaderFilter.NameBased(headerInclusionPolicy, excludeDependentModules)
|
headerFilter = NativeLibraryHeaderFilter.NameBased(headerInclusionPolicy, excludeDependentModules)
|
||||||
includes = headerFiles
|
includes = headerFiles.map { IncludeInfo(it, null) }
|
||||||
} else {
|
} else {
|
||||||
require(language == Language.OBJECTIVE_C) { "cinterop supports 'modules' only when 'language = Objective-C'" }
|
require(language == Language.OBJECTIVE_C) { "cinterop supports 'modules' only when 'language = Objective-C'" }
|
||||||
require(headerFiles.isEmpty()) { "cinterop doesn't support having headers and modules specified at the same time" }
|
require(headerFiles.isEmpty()) { "cinterop doesn't support having headers and modules specified at the same time" }
|
||||||
|
|||||||
@@ -1,10 +1,7 @@
|
|||||||
depends = Kernel darwin osx posix
|
depends = Kernel darwin osx posix
|
||||||
language = Objective-C
|
language = Objective-C
|
||||||
package = platform.Hypervisor
|
package = platform.Hypervisor
|
||||||
|
modules = Hypervisor
|
||||||
# Using headers instead of modules to workaround incorrect module definition in Xcode 12.2:
|
|
||||||
headers = Hypervisor/Hypervisor.h
|
|
||||||
headerFilter = Hypervisor/**
|
|
||||||
|
|
||||||
compilerOpts = -framework Hypervisor
|
compilerOpts = -framework Hypervisor
|
||||||
linkerOpts = -framework Hypervisor
|
linkerOpts = -framework Hypervisor
|
||||||
|
|||||||
Vendored
+1
@@ -0,0 +1 @@
|
|||||||
|
error: comparison of incompatible enums 'pod1.ForwardEnumPOD' and 'pod2.ForwardEnumPOD' is always unsuccessful
|
||||||
@@ -0,0 +1,9 @@
|
|||||||
|
import pod1.*
|
||||||
|
import pod2.*
|
||||||
|
|
||||||
|
fun box(): String {
|
||||||
|
if (pod1.varPOD != pod2.ForwardEnumPOD.Value2POD)
|
||||||
|
return "OK"
|
||||||
|
else
|
||||||
|
return "FAIL"
|
||||||
|
}
|
||||||
+6
@@ -0,0 +1,6 @@
|
|||||||
|
enum class ForwardEnumPOD private constructor(value: Int) : Enum<ForwardEnumPOD>, CEnum {
|
||||||
|
var value: ForwardEnumPOD
|
||||||
|
@Deprecated(level = DeprecationLevel.WARNING, message = "Will be removed.", replaceWith = ReplaceWith(imports = {})) fun byValue(value: Int): ForwardEnumPOD
|
||||||
|
var varPOD: ForwardEnumPOD
|
||||||
|
@CCall(id = "knifunptr_pod10_varPOD_getter") get
|
||||||
|
@CCall(id = "knifunptr_pod11_varPOD_setter") set
|
||||||
@@ -0,0 +1,2 @@
|
|||||||
|
language = Objective-C
|
||||||
|
modules = forwardEnum1
|
||||||
+5
@@ -0,0 +1,5 @@
|
|||||||
|
enum class ForwardEnumPOD private constructor(value: Int) : Enum<ForwardEnumPOD>, CEnum {
|
||||||
|
@ConstantValue.Int(value = 0) enum entry Value1POD
|
||||||
|
@ConstantValue.Int(value = 1) enum entry Value2POD
|
||||||
|
var value: ForwardEnumPOD
|
||||||
|
@Deprecated(level = DeprecationLevel.WARNING, message = "Will be removed.", replaceWith = ReplaceWith(imports = {})) fun byValue(value: Int): ForwardEnumPOD
|
||||||
@@ -0,0 +1,2 @@
|
|||||||
|
language = Objective-C
|
||||||
|
modules = forwardEnum2
|
||||||
Vendored
+5
@@ -0,0 +1,5 @@
|
|||||||
|
#include <Foundation/NSObjCRuntime.h>
|
||||||
|
|
||||||
|
typedef NS_ENUM (int, ForwardEnumPOD); // Actual definition of the enum follows in another module `forwardEnum2`
|
||||||
|
|
||||||
|
ForwardEnumPOD varPOD;
|
||||||
Vendored
+6
@@ -0,0 +1,6 @@
|
|||||||
|
framework module forwardEnum1 {
|
||||||
|
umbrella header "forwardEnum1.h"
|
||||||
|
|
||||||
|
export *
|
||||||
|
module * { export * }
|
||||||
|
}
|
||||||
Vendored
+6
@@ -0,0 +1,6 @@
|
|||||||
|
#include <Foundation/NSObjCRuntime.h>
|
||||||
|
|
||||||
|
typedef NS_ENUM (int, ForwardEnumPOD) { // There was forward definition of this enum in another module `forwardEnum1`
|
||||||
|
Value1POD,
|
||||||
|
Value2POD
|
||||||
|
};
|
||||||
Vendored
+6
@@ -0,0 +1,6 @@
|
|||||||
|
framework module forwardEnum2 {
|
||||||
|
umbrella header "forwardEnum2.h"
|
||||||
|
|
||||||
|
export *
|
||||||
|
module * { export * }
|
||||||
|
}
|
||||||
Vendored
+15
@@ -0,0 +1,15 @@
|
|||||||
|
#ifndef _IOKIT_IOHIDLIB_H
|
||||||
|
#define _IOKIT_IOHIDLIB_H
|
||||||
|
|
||||||
|
typedef struct IOGPoint {
|
||||||
|
int x;
|
||||||
|
} IOGPoint;
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
NX_OneButton,
|
||||||
|
} NXMouseButton;
|
||||||
|
|
||||||
|
extern int IOHIDPostEvent( IOGPoint location );
|
||||||
|
extern int IOHIDGetButtonEventNum( NXMouseButton button );
|
||||||
|
|
||||||
|
#endif /* ! _IOKIT_IOHIDLIB_H */
|
||||||
Vendored
+8
@@ -0,0 +1,8 @@
|
|||||||
|
framework module explicitpod1 {
|
||||||
|
export *
|
||||||
|
|
||||||
|
explicit module explicitSubmodule {
|
||||||
|
header "explicitSubmodule.h"
|
||||||
|
export *
|
||||||
|
}
|
||||||
|
}
|
||||||
native/native.tests/testData/CInterop/framework/forwardEnum.framework/Headers/forwardEnum-umbrella.h
Vendored
+8
@@ -0,0 +1,8 @@
|
|||||||
|
#import <forwardEnum/forwardEnum.h>
|
||||||
|
|
||||||
|
typedef NS_ENUM (long long, ForwardEnum) {
|
||||||
|
A,
|
||||||
|
B
|
||||||
|
};
|
||||||
|
|
||||||
|
ForwardEnum forwardEnumVar;
|
||||||
Vendored
+5
@@ -0,0 +1,5 @@
|
|||||||
|
#include <Foundation/NSObjCRuntime.h>
|
||||||
|
|
||||||
|
typedef NS_ENUM (long long, ForwardEnum);
|
||||||
|
typedef NS_ENUM (long long, EnumWithoutConstant);
|
||||||
|
EnumWithoutConstant enumWithoutConstantVar;
|
||||||
Vendored
+6
@@ -0,0 +1,6 @@
|
|||||||
|
framework module forwardEnum {
|
||||||
|
umbrella header "forwardEnum-umbrella.h"
|
||||||
|
|
||||||
|
export *
|
||||||
|
module * { export * }
|
||||||
|
}
|
||||||
Vendored
+32
@@ -0,0 +1,32 @@
|
|||||||
|
|
||||||
|
package pod1 {
|
||||||
|
|
||||||
|
@CStruct(spelling = "struct { int x; }") class IOGPoint constructor(rawPtr: NativePtr /* = NativePtr */) : CStructVar {
|
||||||
|
var x: Int
|
||||||
|
@CStruct.MemberAt(offset = 0.toLong()) get
|
||||||
|
@CStruct.MemberAt(offset = 0.toLong()) set
|
||||||
|
@CStruct.VarType(align = 4, size = 4.toLong()) @Deprecated(level = DeprecationLevel.WARNING, message = "Use sizeOf<T>() or alignOf<T>() instead.", replaceWith = ReplaceWith(imports = {})) companion object : CStructVar.Type
|
||||||
|
}
|
||||||
|
|
||||||
|
enum class NXMouseButton private constructor(value: UInt) : Enum<NXMouseButton>, CEnum {
|
||||||
|
@ConstantValue.UInt(value = 0.toUInt()) enum entry NX_OneButton
|
||||||
|
override val value: UInt
|
||||||
|
|
||||||
|
class Var constructor(rawPtr: NativePtr /* = NativePtr */) : CEnumVar {
|
||||||
|
var value: NXMouseButton
|
||||||
|
@CEnumVarTypeSize(size = 4) @Deprecated(level = DeprecationLevel.WARNING, message = "Use sizeOf<T>() or alignOf<T>() instead.", replaceWith = ReplaceWith(imports = {})) companion object : CPrimitiveVar.Type
|
||||||
|
}
|
||||||
|
|
||||||
|
companion object {
|
||||||
|
@Deprecated(level = DeprecationLevel.WARNING, message = "Will be removed.", replaceWith = ReplaceWith(imports = {})) fun byValue(value: UInt): NXMouseButton
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
package pod1 {
|
||||||
|
@CCall(id = "knifunptr_pod11_IOHIDGetButtonEventNum") external fun IOHIDGetButtonEventNum(button: NXMouseButton): Int
|
||||||
|
@CCall(id = "knifunptr_pod10_IOHIDPostEvent") external fun IOHIDPostEvent(location: CValue<IOGPoint>): Int
|
||||||
|
}
|
||||||
|
|
||||||
+2
@@ -0,0 +1,2 @@
|
|||||||
|
language = Objective-C
|
||||||
|
modules = explicitpod1
|
||||||
Vendored
+44
@@ -0,0 +1,44 @@
|
|||||||
|
|
||||||
|
package pod1 {
|
||||||
|
|
||||||
|
enum class EnumWithoutConstant private constructor(value: Long) : Enum<EnumWithoutConstant>, CEnum {
|
||||||
|
override val value: Long
|
||||||
|
|
||||||
|
class Var constructor(rawPtr: NativePtr /* = NativePtr */) : CEnumVar {
|
||||||
|
var value: EnumWithoutConstant
|
||||||
|
@CEnumVarTypeSize(size = 8) @Deprecated(level = DeprecationLevel.WARNING, message = "Use sizeOf<T>() or alignOf<T>() instead.", replaceWith = ReplaceWith(imports = {})) companion object : CPrimitiveVar.Type
|
||||||
|
}
|
||||||
|
|
||||||
|
companion object {
|
||||||
|
@Deprecated(level = DeprecationLevel.WARNING, message = "Will be removed.", replaceWith = ReplaceWith(imports = {})) fun byValue(value: Long): EnumWithoutConstant
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
enum class ForwardEnum private constructor(value: Long) : Enum<ForwardEnum>, CEnum {
|
||||||
|
@ConstantValue.Long(value = 0.toLong()) enum entry A
|
||||||
|
@ConstantValue.Long(value = 1.toLong()) enum entry B
|
||||||
|
override val value: Long
|
||||||
|
|
||||||
|
class Var constructor(rawPtr: NativePtr /* = NativePtr */) : CEnumVar {
|
||||||
|
var value: ForwardEnum
|
||||||
|
@CEnumVarTypeSize(size = 8) @Deprecated(level = DeprecationLevel.WARNING, message = "Use sizeOf<T>() or alignOf<T>() instead.", replaceWith = ReplaceWith(imports = {})) companion object : CPrimitiveVar.Type
|
||||||
|
}
|
||||||
|
|
||||||
|
companion object {
|
||||||
|
@Deprecated(level = DeprecationLevel.WARNING, message = "Will be removed.", replaceWith = ReplaceWith(imports = {})) fun byValue(value: Long): ForwardEnum
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
package pod1 {
|
||||||
|
var enumWithoutConstantVar: EnumWithoutConstant
|
||||||
|
@CCall(id = "knifunptr_pod10_enumWithoutConstantVar_getter") get
|
||||||
|
@CCall(id = "knifunptr_pod11_enumWithoutConstantVar_setter") set
|
||||||
|
var forwardEnumVar: ForwardEnum
|
||||||
|
@CCall(id = "knifunptr_pod12_forwardEnumVar_getter") get
|
||||||
|
@CCall(id = "knifunptr_pod13_forwardEnumVar_setter") set
|
||||||
|
}
|
||||||
|
|
||||||
+2
@@ -0,0 +1,2 @@
|
|||||||
|
language = Objective-C
|
||||||
|
modules = forwardEnum
|
||||||
+12
@@ -120,6 +120,12 @@ public class CInteropFModulesTestGenerated extends AbstractNativeCInteropFModule
|
|||||||
runTest("native/native.tests/testData/CInterop/framework/frameworkDefs/excludePod1Umbrella/");
|
runTest("native/native.tests/testData/CInterop/framework/frameworkDefs/excludePod1Umbrella/");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@TestMetadata("explicitSubmodule")
|
||||||
|
public void testExplicitSubmodule() throws Exception {
|
||||||
|
runTest("native/native.tests/testData/CInterop/framework/frameworkDefs/explicitSubmodule/");
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@TestMetadata("filterPod1")
|
@TestMetadata("filterPod1")
|
||||||
public void testFilterPod1() throws Exception {
|
public void testFilterPod1() throws Exception {
|
||||||
@@ -144,6 +150,12 @@ public class CInteropFModulesTestGenerated extends AbstractNativeCInteropFModule
|
|||||||
runTest("native/native.tests/testData/CInterop/framework/frameworkDefs/filterPod1UmbrellaPod1A/");
|
runTest("native/native.tests/testData/CInterop/framework/frameworkDefs/filterPod1UmbrellaPod1A/");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@TestMetadata("forwardEnum")
|
||||||
|
public void testForwardEnum() throws Exception {
|
||||||
|
runTest("native/native.tests/testData/CInterop/framework/frameworkDefs/forwardEnum/");
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@TestMetadata("full")
|
@TestMetadata("full")
|
||||||
public void testFull() throws Exception {
|
public void testFull() throws Exception {
|
||||||
|
|||||||
+6
@@ -24,6 +24,12 @@ public class CInteropKT39120TestGenerated extends AbstractNativeCInteropKT39120T
|
|||||||
KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("native/native.tests/testData/CInterop/KT-39120/defs"), Pattern.compile("^([^_](.+))$"), null, false);
|
KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("native/native.tests/testData/CInterop/KT-39120/defs"), Pattern.compile("^([^_](.+))$"), null, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@TestMetadata("ForwardEnum")
|
||||||
|
public void testForwardEnum() throws Exception {
|
||||||
|
runTest("native/native.tests/testData/CInterop/KT-39120/defs/ForwardEnum/");
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@TestMetadata("interModuleImport")
|
@TestMetadata("interModuleImport")
|
||||||
public void testInterModuleImport() throws Exception {
|
public void testInterModuleImport() throws Exception {
|
||||||
|
|||||||
+12
@@ -120,6 +120,12 @@ public class CInteropNoFModulesTestGenerated extends AbstractNativeCInteropNoFMo
|
|||||||
runTest("native/native.tests/testData/CInterop/framework/frameworkDefs/excludePod1Umbrella/");
|
runTest("native/native.tests/testData/CInterop/framework/frameworkDefs/excludePod1Umbrella/");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@TestMetadata("explicitSubmodule")
|
||||||
|
public void testExplicitSubmodule() throws Exception {
|
||||||
|
runTest("native/native.tests/testData/CInterop/framework/frameworkDefs/explicitSubmodule/");
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@TestMetadata("filterPod1")
|
@TestMetadata("filterPod1")
|
||||||
public void testFilterPod1() throws Exception {
|
public void testFilterPod1() throws Exception {
|
||||||
@@ -144,6 +150,12 @@ public class CInteropNoFModulesTestGenerated extends AbstractNativeCInteropNoFMo
|
|||||||
runTest("native/native.tests/testData/CInterop/framework/frameworkDefs/filterPod1UmbrellaPod1A/");
|
runTest("native/native.tests/testData/CInterop/framework/frameworkDefs/filterPod1UmbrellaPod1A/");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@TestMetadata("forwardEnum")
|
||||||
|
public void testForwardEnum() throws Exception {
|
||||||
|
runTest("native/native.tests/testData/CInterop/framework/frameworkDefs/forwardEnum/");
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@TestMetadata("full")
|
@TestMetadata("full")
|
||||||
public void testFull() throws Exception {
|
public void testFull() throws Exception {
|
||||||
|
|||||||
-1
@@ -13,7 +13,6 @@ import org.jetbrains.kotlin.konan.blackboxtest.support.settings.*
|
|||||||
import java.io.File
|
import java.io.File
|
||||||
|
|
||||||
abstract class AbstractNativeCInteropBaseTest : AbstractNativeSimpleTest() {
|
abstract class AbstractNativeCInteropBaseTest : AbstractNativeSimpleTest() {
|
||||||
private val buildDir: File get() = testRunSettings.get<SimpleTestDirectories>().testBuildDir
|
|
||||||
internal val targets: KotlinNativeTargets get() = testRunSettings.get<KotlinNativeTargets>()
|
internal val targets: KotlinNativeTargets get() = testRunSettings.get<KotlinNativeTargets>()
|
||||||
internal val kotlinNativeClassLoader: KotlinNativeClassLoader get() = testRunSettings.get<KotlinNativeClassLoader>()
|
internal val kotlinNativeClassLoader: KotlinNativeClassLoader get() = testRunSettings.get<KotlinNativeClassLoader>()
|
||||||
|
|
||||||
|
|||||||
+38
@@ -17,6 +17,7 @@ import org.junit.jupiter.api.Tag
|
|||||||
import org.jetbrains.kotlin.konan.blackboxtest.support.runner.*
|
import org.jetbrains.kotlin.konan.blackboxtest.support.runner.*
|
||||||
import org.jetbrains.kotlin.test.services.JUnit5Assertions.assertEquals
|
import org.jetbrains.kotlin.test.services.JUnit5Assertions.assertEquals
|
||||||
import org.junit.jupiter.api.Assumptions
|
import org.junit.jupiter.api.Assumptions
|
||||||
|
import kotlin.test.assertIs
|
||||||
|
|
||||||
@Tag("cinterop")
|
@Tag("cinterop")
|
||||||
abstract class AbstractNativeCInteropKT39120Test : AbstractNativeCInteropBaseTest() {
|
abstract class AbstractNativeCInteropKT39120Test : AbstractNativeCInteropBaseTest() {
|
||||||
@@ -51,10 +52,47 @@ abstract class AbstractNativeCInteropKT39120Test : AbstractNativeCInteropBaseTes
|
|||||||
val expectedFiltered2Output = golden2File.readText()
|
val expectedFiltered2Output = golden2File.readText()
|
||||||
val actualFiltered2Output = filterContentsOutput(contents2, " pod.Version|POD|class Pod")
|
val actualFiltered2Output = filterContentsOutput(contents2, " pod.Version|POD|class Pod")
|
||||||
assertEquals(StringUtilRt.convertLineSeparators(expectedFiltered2Output), StringUtilRt.convertLineSeparators(actualFiltered2Output))
|
assertEquals(StringUtilRt.convertLineSeparators(expectedFiltered2Output), StringUtilRt.convertLineSeparators(actualFiltered2Output))
|
||||||
|
|
||||||
|
val ktFile = testPathFull.resolve(DEFAULT_FILE_NAME)
|
||||||
|
if (ktFile.exists()) {
|
||||||
|
// Just compile "main.kt" with klib1 and klib2, without running resulting executable
|
||||||
|
val module = TestModule.Exclusive(DEFAULT_MODULE_NAME, emptySet(), emptySet()).apply {
|
||||||
|
files += TestFile.createCommitted(ktFile, this)
|
||||||
|
}
|
||||||
|
val compilationResult = compileToExecutable(
|
||||||
|
createTestCaseNoTestRun(module, TestCompilerArgs(listOf())),
|
||||||
|
klib1.asLibraryDependency(),
|
||||||
|
klib2.asLibraryDependency()
|
||||||
|
)
|
||||||
|
|
||||||
|
val expectedFailureTxtFile = testPathFull.resolve("expected.compilation.failure.txt")
|
||||||
|
if (expectedFailureTxtFile.exists()) {
|
||||||
|
assertIs<TestCompilationResult.CompilationToolFailure>(compilationResult)
|
||||||
|
val expectedFailureSubstring = expectedFailureTxtFile.readText()
|
||||||
|
val actualFailure = compilationResult.loggedData.toString()
|
||||||
|
assert(actualFailure.contains(expectedFailureSubstring)) {
|
||||||
|
"Expected failure substring:\n$expectedFailureSubstring\nActual failure logged data:\n$actualFailure"
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
compilationResult.assertSuccess()
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun filterContentsOutput(contents: String, pattern: String) =
|
private fun filterContentsOutput(contents: String, pattern: String) =
|
||||||
contents.split("\n").filter {
|
contents.split("\n").filter {
|
||||||
it.contains(Regex(pattern))
|
it.contains(Regex(pattern))
|
||||||
}.joinToString(separator = "\n")
|
}.joinToString(separator = "\n")
|
||||||
|
|
||||||
|
private fun createTestCaseNoTestRun(module: TestModule.Exclusive, compilerArgs: TestCompilerArgs) = TestCase(
|
||||||
|
id = TestCaseId.Named(module.name),
|
||||||
|
kind = TestKind.STANDALONE_NO_TR,
|
||||||
|
modules = setOf(module),
|
||||||
|
freeCompilerArgs = compilerArgs,
|
||||||
|
nominalPackageName = PackageName.EMPTY,
|
||||||
|
checks = TestRunChecks.Default(testRunSettings.get<Timeouts>().executionTimeout),
|
||||||
|
extras = TestCase.NoTestRunnerExtras(".${module.name}")
|
||||||
|
).apply {
|
||||||
|
initialize(null, null)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+2
-1
@@ -10,6 +10,7 @@ import org.jetbrains.kotlin.konan.blackboxtest.CachesAutoBuildTest.Companion.TES
|
|||||||
import org.jetbrains.kotlin.konan.blackboxtest.support.EnforcedHostTarget
|
import org.jetbrains.kotlin.konan.blackboxtest.support.EnforcedHostTarget
|
||||||
import org.jetbrains.kotlin.konan.blackboxtest.support.TestCompilerArgs
|
import org.jetbrains.kotlin.konan.blackboxtest.support.TestCompilerArgs
|
||||||
import org.jetbrains.kotlin.konan.blackboxtest.support.compilation.TestCompilationArtifact.KLIB
|
import org.jetbrains.kotlin.konan.blackboxtest.support.compilation.TestCompilationArtifact.KLIB
|
||||||
|
import org.jetbrains.kotlin.konan.blackboxtest.support.compilation.TestCompilationResult.Companion.assertSuccess
|
||||||
import org.jetbrains.kotlin.konan.blackboxtest.support.settings.CacheMode
|
import org.jetbrains.kotlin.konan.blackboxtest.support.settings.CacheMode
|
||||||
import org.jetbrains.kotlin.konan.blackboxtest.support.settings.KotlinNativeTargets
|
import org.jetbrains.kotlin.konan.blackboxtest.support.settings.KotlinNativeTargets
|
||||||
import org.jetbrains.kotlin.konan.blackboxtest.support.settings.OptimizationMode
|
import org.jetbrains.kotlin.konan.blackboxtest.support.settings.OptimizationMode
|
||||||
@@ -59,7 +60,7 @@ class CachesAutoBuildTest : AbstractNativeSimpleTest() {
|
|||||||
)
|
)
|
||||||
),
|
),
|
||||||
*dependencies
|
*dependencies
|
||||||
)
|
).assertSuccess().resultingArtifact
|
||||||
|
|
||||||
private val autoCacheDir: File get() = buildDir.resolve("__auto_cache__")
|
private val autoCacheDir: File get() = buildDir.resolve("__auto_cache__")
|
||||||
private val cacheFlavor: String
|
private val cacheFlavor: String
|
||||||
|
|||||||
+18
-18
@@ -13,6 +13,8 @@ import org.jetbrains.kotlin.konan.blackboxtest.support.EnforcedHostTarget
|
|||||||
import org.jetbrains.kotlin.konan.blackboxtest.support.TestCase
|
import org.jetbrains.kotlin.konan.blackboxtest.support.TestCase
|
||||||
import org.jetbrains.kotlin.konan.blackboxtest.support.compilation.TestCompilationArtifact.Executable
|
import org.jetbrains.kotlin.konan.blackboxtest.support.compilation.TestCompilationArtifact.Executable
|
||||||
import org.jetbrains.kotlin.konan.blackboxtest.support.compilation.TestCompilationArtifact.KLIB
|
import org.jetbrains.kotlin.konan.blackboxtest.support.compilation.TestCompilationArtifact.KLIB
|
||||||
|
import org.jetbrains.kotlin.konan.blackboxtest.support.compilation.TestCompilationResult
|
||||||
|
import org.jetbrains.kotlin.konan.blackboxtest.support.compilation.TestCompilationResult.Companion.assertSuccess
|
||||||
import org.jetbrains.kotlin.konan.blackboxtest.support.compilation.TestCompilationResult.Success
|
import org.jetbrains.kotlin.konan.blackboxtest.support.compilation.TestCompilationResult.Success
|
||||||
import org.jetbrains.kotlin.konan.blackboxtest.support.runner.TestExecutable
|
import org.jetbrains.kotlin.konan.blackboxtest.support.runner.TestExecutable
|
||||||
import org.jetbrains.kotlin.konan.blackboxtest.support.runner.TestRunners
|
import org.jetbrains.kotlin.konan.blackboxtest.support.runner.TestRunners
|
||||||
@@ -49,25 +51,23 @@ class InfrastructureDumpedTestListingTest : AbstractNativeSimpleTest() {
|
|||||||
|
|
||||||
val barTestCase: TestCase = generateTestCaseWithSingleModule(rootDir.resolve("bar"))
|
val barTestCase: TestCase = generateTestCaseWithSingleModule(rootDir.resolve("bar"))
|
||||||
|
|
||||||
val executableTestCase: TestCase
|
val (executableTestCase: TestCase, executableCompilationResult: TestCompilationResult<out Executable>) =
|
||||||
val executableCompilationResult: Success<out Executable>
|
if (fromSources) {
|
||||||
|
barTestCase to compileToExecutable(barTestCase, fooLibrary.asLibraryDependency())
|
||||||
|
} else {
|
||||||
|
val barCompilationResult: Success<out KLIB> = compileToLibrary(barTestCase, fooLibrary.asLibraryDependency())
|
||||||
|
val barLibrary: KLIB = barCompilationResult.resultingArtifact
|
||||||
|
|
||||||
if (fromSources) {
|
val executableTestCase = generateTestCaseWithSingleModule(moduleDir = null) // No sources.
|
||||||
executableTestCase = barTestCase
|
executableTestCase to compileToExecutable(
|
||||||
executableCompilationResult = compileToExecutable(barTestCase, fooLibrary.asLibraryDependency())
|
executableTestCase,
|
||||||
} else {
|
fooLibrary.asLibraryDependency(),
|
||||||
val barCompilationResult: Success<out KLIB> = compileToLibrary(barTestCase, fooLibrary.asLibraryDependency())
|
barLibrary.asIncludedLibraryDependency()
|
||||||
val barLibrary: KLIB = barCompilationResult.resultingArtifact
|
)
|
||||||
|
}
|
||||||
|
|
||||||
executableTestCase = generateTestCaseWithSingleModule(moduleDir = null) // No sources.
|
val executableCompilationSuccess = executableCompilationResult.assertSuccess()
|
||||||
executableCompilationResult = compileToExecutable(
|
val executable: Executable = executableCompilationSuccess.resultingArtifact
|
||||||
executableTestCase,
|
|
||||||
fooLibrary.asLibraryDependency(),
|
|
||||||
barLibrary.asIncludedLibraryDependency()
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
val executable: Executable = executableCompilationResult.resultingArtifact
|
|
||||||
|
|
||||||
// check that the test listing dumped during the compilation matches our expectations:
|
// check that the test listing dumped during the compilation matches our expectations:
|
||||||
val testDumpFile = executable.testDumpFile
|
val testDumpFile = executable.testDumpFile
|
||||||
@@ -78,7 +78,7 @@ class InfrastructureDumpedTestListingTest : AbstractNativeSimpleTest() {
|
|||||||
assertTrue(dumpedTestListing.isNotEmpty())
|
assertTrue(dumpedTestListing.isNotEmpty())
|
||||||
|
|
||||||
// parse test listing obtained from executable file with the help of --ktest_list_tests flag:
|
// parse test listing obtained from executable file with the help of --ktest_list_tests flag:
|
||||||
val testExecutable = TestExecutable.fromCompilationResult(executableTestCase, executableCompilationResult)
|
val testExecutable = TestExecutable.fromCompilationResult(executableTestCase, executableCompilationSuccess)
|
||||||
val extractedTestListing = TestRunners.extractTestNames(testExecutable, testRunSettings).toSet()
|
val extractedTestListing = TestRunners.extractTestNames(testExecutable, testRunSettings).toSet()
|
||||||
|
|
||||||
assertEquals(extractedTestListing, dumpedTestListing)
|
assertEquals(extractedTestListing, dumpedTestListing)
|
||||||
|
|||||||
+4
-5
@@ -58,10 +58,9 @@ internal fun AbstractNativeSimpleTest.compileToExecutable(
|
|||||||
sourcesDir: File,
|
sourcesDir: File,
|
||||||
freeCompilerArgs: TestCompilerArgs,
|
freeCompilerArgs: TestCompilerArgs,
|
||||||
vararg dependencies: TestCompilationArtifact.KLIB
|
vararg dependencies: TestCompilationArtifact.KLIB
|
||||||
): TestCompilationArtifact.Executable {
|
): TestCompilationResult<out TestCompilationArtifact.Executable> {
|
||||||
val testCase: TestCase = generateTestCaseWithSingleModule(sourcesDir, freeCompilerArgs)
|
val testCase: TestCase = generateTestCaseWithSingleModule(sourcesDir, freeCompilerArgs)
|
||||||
val compilationResult = compileToExecutable(testCase, dependencies.map { it.asLibraryDependency() })
|
return compileToExecutable(testCase, dependencies.map { it.asLibraryDependency() })
|
||||||
return compilationResult.resultingArtifact
|
|
||||||
}
|
}
|
||||||
|
|
||||||
internal fun AbstractNativeSimpleTest.compileToExecutable(testCase: TestCase, vararg dependencies: TestCompilationDependency<*>) =
|
internal fun AbstractNativeSimpleTest.compileToExecutable(testCase: TestCase, vararg dependencies: TestCompilationDependency<*>) =
|
||||||
@@ -109,7 +108,7 @@ private fun AbstractNativeSimpleTest.compileToLibrary(
|
|||||||
private fun AbstractNativeSimpleTest.compileToExecutable(
|
private fun AbstractNativeSimpleTest.compileToExecutable(
|
||||||
testCase: TestCase,
|
testCase: TestCase,
|
||||||
dependencies: List<TestCompilationDependency<*>>
|
dependencies: List<TestCompilationDependency<*>>
|
||||||
): TestCompilationResult.Success<out TestCompilationArtifact.Executable> {
|
): TestCompilationResult<out TestCompilationArtifact.Executable> {
|
||||||
val compilation = ExecutableCompilation(
|
val compilation = ExecutableCompilation(
|
||||||
settings = testRunSettings,
|
settings = testRunSettings,
|
||||||
freeCompilerArgs = testCase.freeCompilerArgs,
|
freeCompilerArgs = testCase.freeCompilerArgs,
|
||||||
@@ -118,7 +117,7 @@ private fun AbstractNativeSimpleTest.compileToExecutable(
|
|||||||
dependencies = dependencies,
|
dependencies = dependencies,
|
||||||
expectedArtifact = getExecutableArtifact()
|
expectedArtifact = getExecutableArtifact()
|
||||||
)
|
)
|
||||||
return compilation.result.assertSuccess()
|
return compilation.result
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun getLibraryArtifact(testCase: TestCase, dir: File) =
|
private fun getLibraryArtifact(testCase: TestCase, dir: File) =
|
||||||
|
|||||||
Reference in New Issue
Block a user