From 90baedc5b6a752d617b8f099d2642f2ceba5a29d Mon Sep 17 00:00:00 2001 From: Doug Gregor Date: Thu, 26 Sep 2024 12:31:21 -0700 Subject: [PATCH 1/2] Remove swiftDemangledMangledName; we'll use names derived from source code --- Sources/JExtractSwift/ImportedDecls.swift | 15 ++++++++++++--- .../Swift2JavaTranslator+Printing.swift | 3 +-- Sources/JExtractSwift/SwiftDylib.swift | 4 ---- 3 files changed, 13 insertions(+), 9 deletions(-) diff --git a/Sources/JExtractSwift/ImportedDecls.swift b/Sources/JExtractSwift/ImportedDecls.swift index 2d6cc2426..725061f5a 100644 --- a/Sources/JExtractSwift/ImportedDecls.swift +++ b/Sources/JExtractSwift/ImportedDecls.swift @@ -86,7 +86,6 @@ public struct ImportedTypeName: Hashable { public var swiftTypeName: String public var swiftMangledName: String = "" - public var swiftDemangledMangledName: String = "" public var javaType: JavaType @@ -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 { @@ -133,6 +133,16 @@ public struct ImportedFunc: ImportedDecl, CustomStringConvertible { return String(identifier[.. Date: Thu, 26 Sep 2024 13:35:52 -0700 Subject: [PATCH 2/2] Make ImportedFunc's "identifier" always a full name like `f(a:b:)`. This makes function names consistent with initializer names. Switch a number of callers over to baseIdentifier when they only want to deal with the base name. --- .../Swift2JavaTranslator+Printing.swift | 22 +++++++++---------- Sources/JExtractSwift/Swift2JavaVisitor.swift | 13 +++++++++-- Sources/JExtractSwift/SwiftDylib.swift | 2 +- .../JExtractSwiftTests/FuncImportTests.swift | 14 ++++++------ .../FunctionDescriptorImportTests.swift | 2 +- 5 files changed, 31 insertions(+), 22 deletions(-) diff --git a/Sources/JExtractSwift/Swift2JavaTranslator+Printing.swift b/Sources/JExtractSwift/Swift2JavaTranslator+Printing.swift index 9311e80e9..ba55d12f5 100644 --- a/Sources/JExtractSwift/Swift2JavaTranslator+Printing.swift +++ b/Sources/JExtractSwift/Swift2JavaTranslator+Printing.swift @@ -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) @@ -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; } """ ) @@ -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; } """ ) @@ -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; } """ ) @@ -542,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))); } """ ) @@ -557,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))); diff --git a/Sources/JExtractSwift/Swift2JavaVisitor.swift b/Sources/JExtractSwift/Swift2JavaVisitor.swift index ca287e037..65337b8a4 100644 --- a/Sources/JExtractSwift/Swift2JavaVisitor.swift +++ b/Sources/JExtractSwift/Swift2JavaVisitor.swift @@ -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 ) @@ -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 ) diff --git a/Sources/JExtractSwift/SwiftDylib.swift b/Sources/JExtractSwift/SwiftDylib.swift index 6290dacb7..8be8f6a79 100644 --- a/Sources/JExtractSwift/SwiftDylib.swift +++ b/Sources/JExtractSwift/SwiftDylib.swift @@ -59,7 +59,7 @@ 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 diff --git a/Tests/JExtractSwiftTests/FuncImportTests.swift b/Tests/JExtractSwiftTests/FuncImportTests.swift index 5a0dd66df..57f7e0ebc 100644 --- a/Tests/JExtractSwiftTests/FuncImportTests.swift +++ b/Tests/JExtractSwiftTests/FuncImportTests.swift @@ -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) @@ -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 @@ -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 @@ -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 @@ -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 @@ -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 @@ -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 diff --git a/Tests/JExtractSwiftTests/FunctionDescriptorImportTests.swift b/Tests/JExtractSwiftTests/FunctionDescriptorImportTests.swift index 8ca4c936d..345c3b9c8 100644 --- a/Tests/JExtractSwiftTests/FunctionDescriptorImportTests.swift +++ b/Tests/JExtractSwiftTests/FunctionDescriptorImportTests.swift @@ -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