Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 12 additions & 3 deletions Sources/JExtractSwift/ImportedDecls.swift
Original file line number Diff line number Diff line change
Expand Up @@ -86,7 +86,6 @@ public struct ImportedTypeName: Hashable {
public var swiftTypeName: String

public var swiftMangledName: String = ""
public var swiftDemangledMangledName: String = ""

public var javaType: JavaType

Expand Down Expand Up @@ -124,7 +123,8 @@ public struct ImportedFunc: ImportedDecl, CustomStringConvertible {
public var parentName: ImportedTypeName?
public var hasParent: Bool { parentName != nil }

public var identifier: String // FIXME: this is init(cap:name:) complete swift identifier; change that to be base
/// This is a full name such as init(cap:name:).
public var identifier: String

public var baseIdentifier: String {
guard let idx = identifier.firstIndex(of: "(") else {
Expand All @@ -133,6 +133,16 @@ public struct ImportedFunc: ImportedDecl, CustomStringConvertible {
return String(identifier[..<idx])
}

/// A display name to use to refer to the Swift declaration with its
/// enclosing type.
public var displayName: String {
if let parentName {
return "\(parentName.swiftTypeName).\(identifier)"
}

return identifier
}

public var returnType: ImportedTypeName
public var parameters: [ImportedParam]

Expand Down Expand Up @@ -173,7 +183,6 @@ public struct ImportedFunc: ImportedDecl, CustomStringConvertible {
}

public var swiftMangledName: String = ""
public var swiftDemangledMangledName: String = ""

public var swiftDeclRaw: String? = nil

Expand Down
25 changes: 12 additions & 13 deletions Sources/JExtractSwift/Swift2JavaTranslator+Printing.swift
Original file line number Diff line number Diff line change
Expand Up @@ -441,7 +441,7 @@ extension Swift2JavaTranslator {
public func printDowncallMethods(_ printer: inout CodePrinter, _ decl: ImportedFunc) {
printer.printSeparator(decl.identifier)

printer.printTypeDecl("private static class \(decl.identifier)") { printer in
printer.printTypeDecl("private static class \(decl.baseIdentifier)") { printer in
printFunctionDescriptorValue(&printer, decl);
printFindMemorySegmentAddrByMangledName(&printer, decl)
printMethodDowncallHandleForAddrDesc(&printer)
Expand All @@ -455,8 +455,8 @@ extension Swift2JavaTranslator {
* \(/*TODO: make a printSnippet func*/decl.swiftDeclRaw ?? "")
* }
*/
public static FunctionDescriptor \(decl.identifier)$descriptor() {
return \(decl.identifier).DESC;
public static FunctionDescriptor \(decl.baseIdentifier)$descriptor() {
return \(decl.baseIdentifier).DESC;
}
"""
)
Expand All @@ -469,8 +469,8 @@ extension Swift2JavaTranslator {
* \(/*TODO: make a printSnippet func*/decl.swiftDeclRaw ?? "")
* }
*/
public static MethodHandle \(decl.identifier)$handle() {
return \(decl.identifier).HANDLE;
public static MethodHandle \(decl.baseIdentifier)$handle() {
return \(decl.baseIdentifier).HANDLE;
}
"""
)
Expand All @@ -483,8 +483,8 @@ extension Swift2JavaTranslator {
* \(/*TODO: make a printSnippet func*/decl.swiftDeclRaw ?? "")
* }
*/
public static MemorySegment \(decl.identifier)$address() {
return \(decl.identifier).ADDR;
public static MemorySegment \(decl.baseIdentifier)$address() {
return \(decl.baseIdentifier).ADDR;
}
"""
)
Expand All @@ -502,9 +502,8 @@ extension Swift2JavaTranslator {
printer.print(
"""
/**
* Demangled representation:
* {@snippet lang = Swift:
* \(decl.swiftDemangledMangledName)
* \(decl.displayName)
* }
*/
public static final MemorySegment ADDR = \(swiftModuleName).findOrThrow("\(decl.swiftMangledName)");
Expand Down Expand Up @@ -543,8 +542,8 @@ extension Swift2JavaTranslator {
* \(/*TODO: make a printSnippet func*/decl.swiftDeclRaw ?? "")
* }
*/
public static \(returnTy) \(decl.identifier)(\(renderJavaParamDecls(decl, selfVariant: .wrapper))) {
\(maybeReturnCast) \(decl.identifier)(\(renderForwardParams(decl, selfVariant: .memorySegment)));
public static \(returnTy) \(decl.baseIdentifier)(\(renderJavaParamDecls(decl, selfVariant: .wrapper))) {
\(maybeReturnCast) \(decl.baseIdentifier)(\(renderForwardParams(decl, selfVariant: .memorySegment)));
}
"""
)
Expand All @@ -558,8 +557,8 @@ extension Swift2JavaTranslator {
* \(/*TODO: make a printSnippet func*/decl.swiftDeclRaw ?? "")
* }
*/
public static \(returnTy) \(decl.identifier)(\(renderJavaParamDecls(decl, selfVariant: selfVariant))) {
var mh$ = \(decl.identifier).HANDLE;
public static \(returnTy) \(decl.baseIdentifier)(\(renderJavaParamDecls(decl, selfVariant: selfVariant))) {
var mh$ = \(decl.baseIdentifier).HANDLE;
try {
if (TRACE_DOWNCALLS) {
traceDowncall(\(renderForwardParams(decl, selfVariant: .memorySegment)));
Expand Down
13 changes: 11 additions & 2 deletions Sources/JExtractSwift/Swift2JavaVisitor.swift
Original file line number Diff line number Diff line change
Expand Up @@ -103,9 +103,18 @@ final class Swift2JavaVisitor: SyntaxVisitor {
return .skipChildren
}

let argumentLabels = node.signature.parameterClause.parameters.map { param in
param.firstName.identifier?.name ?? "_"
}
let argumentLabelsStr = String(argumentLabels.flatMap { label in
label + ":"
})

let fullName = "\(node.name.text)(\(argumentLabelsStr))"

var funcDecl = ImportedFunc(
parentName: currentTypeDecl?.name,
identifier: node.name.text,
identifier: fullName,
returnType: javaResultType,
parameters: params
)
Expand Down Expand Up @@ -156,7 +165,7 @@ final class Swift2JavaVisitor: SyntaxVisitor {

var funcDecl = ImportedFunc(
parentName: currentTypeDecl.name,
identifier: initIdentifier, // FIXME: what is the name of the inits?
identifier: initIdentifier,
returnType: currentTypeDecl.name,
parameters: params
)
Expand Down
6 changes: 1 addition & 5 deletions Sources/JExtractSwift/SwiftDylib.swift
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,6 @@ package struct SwiftDylib { // FIXME: remove this entire utility; replace with
if let name = names.first {
log.trace("Selected mangled name for '\(decl.name.javaType.description)': \(name)")
decl.name.swiftMangledName = name.mangledName
decl.name.swiftDemangledMangledName = name.descriptiveName
}

return decl
Expand All @@ -60,11 +59,10 @@ package struct SwiftDylib { // FIXME: remove this entire utility; replace with
}

var decl = decl
let names = try await nmSymbolNames(grepDemangled: [decl.identifier])
let names = try await nmSymbolNames(grepDemangled: [decl.baseIdentifier])
if let name = names.first {
log.trace("Selected mangled name for '\(decl.identifier)': \(name)")
decl.swiftMangledName = name.mangledName
decl.swiftDemangledMangledName = name.descriptiveName
}

return decl
Expand All @@ -85,7 +83,6 @@ package struct SwiftDylib { // FIXME: remove this entire utility; replace with
if let name = names.first {
log.trace("Selected mangled name for '\(decl.identifier)': \(name)")
decl.swiftMangledName = name.mangledName
decl.swiftDemangledMangledName = name.descriptiveName
}

return decl
Expand All @@ -103,7 +100,6 @@ package struct SwiftDylib { // FIXME: remove this entire utility; replace with
if let name = names.first {
log.trace("Selected mangled name: \(name)")
decl.swiftMangledName = name.mangledName
decl.swiftDemangledMangledName = name.descriptiveName
}

return decl
Expand Down
14 changes: 7 additions & 7 deletions Tests/JExtractSwiftTests/FuncImportTests.swift
Original file line number Diff line number Diff line change
Expand Up @@ -60,7 +60,7 @@ final class MethodImportTests: XCTestCase {

try await st.analyze(swiftInterfacePath: "/fake/Fake.swiftinterface", text: class_interfaceFile)

let funcDecl = st.importedGlobalFuncs.first { $0.identifier == "helloWorld" }!
let funcDecl = st.importedGlobalFuncs.first { $0.baseIdentifier == "helloWorld" }!

let output = CodePrinter.toString { printer in
st.printFuncDowncallMethod(&printer, decl: funcDecl, selfVariant: nil)
Expand Down Expand Up @@ -100,7 +100,7 @@ final class MethodImportTests: XCTestCase {
try await st.analyze(swiftInterfacePath: "/fake/__FakeModule/SwiftFile.swiftinterface", text: class_interfaceFile)

let funcDecl = st.importedGlobalFuncs.first {
$0.identifier == "globalTakeInt"
$0.baseIdentifier == "globalTakeInt"
}!

let output = CodePrinter.toString { printer in
Expand Down Expand Up @@ -141,7 +141,7 @@ final class MethodImportTests: XCTestCase {
try await st.analyze(swiftInterfacePath: "/fake/__FakeModule/SwiftFile.swiftinterface", text: class_interfaceFile)

let funcDecl = st.importedGlobalFuncs.first {
$0.identifier == "globalTakeIntLongString"
$0.baseIdentifier == "globalTakeIntLongString"
}!

let output = CodePrinter.toString { printer in
Expand Down Expand Up @@ -184,7 +184,7 @@ final class MethodImportTests: XCTestCase {
let funcDecl: ImportedFunc = st.importedTypes.first {
$0.name.javaClassName == "MySwiftClass"
}!.methods.first {
$0.identifier == "helloMemberFunction"
$0.baseIdentifier == "helloMemberFunction"
}!

let output = CodePrinter.toString { printer in
Expand Down Expand Up @@ -227,7 +227,7 @@ final class MethodImportTests: XCTestCase {
let funcDecl: ImportedFunc = st.importedTypes.first {
$0.name.javaClassName == "MySwiftClass"
}!.methods.first {
$0.identifier == "helloMemberFunction"
$0.baseIdentifier == "helloMemberFunction"
}!

let output = CodePrinter.toString { printer in
Expand Down Expand Up @@ -270,7 +270,7 @@ final class MethodImportTests: XCTestCase {
let funcDecl: ImportedFunc = st.importedTypes.first {
$0.name.javaClassName == "MySwiftClass"
}!.methods.first {
$0.identifier == "helloMemberFunction"
$0.baseIdentifier == "helloMemberFunction"
}!

let output = CodePrinter.toString { printer in
Expand Down Expand Up @@ -305,7 +305,7 @@ final class MethodImportTests: XCTestCase {
let funcDecl: ImportedFunc = st.importedTypes.first {
$0.name.javaClassName == "MySwiftClass"
}!.methods.first {
$0.identifier == "makeInt"
$0.baseIdentifier == "makeInt"
}!

let output = CodePrinter.toString { printer in
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,7 @@ final class FunctionDescriptorTests: XCTestCase {
try await st.analyze(swiftInterfacePath: "/fake/Sample.swiftinterface", text: interfaceFile)

let funcDecl = st.importedGlobalFuncs.first {
$0.identifier == methodIdentifier
$0.baseIdentifier == methodIdentifier
}!

let output = CodePrinter.toString { printer in
Expand Down