From ccc2543b15298bae4ad1ddcaad7701b08b2ce0da Mon Sep 17 00:00:00 2001 From: jrosen081 Date: Wed, 27 Nov 2024 22:34:03 -0500 Subject: [PATCH 1/6] Update Class Layout to use Runtime Metadata --- .../Swift2JavaTranslator+Printing.swift | 13 ++-- .../ClassPrintingTests.swift | 68 +++++++++++++++++++ 2 files changed, 74 insertions(+), 7 deletions(-) create mode 100644 Tests/JExtractSwiftTests/ClassPrintingTests.swift diff --git a/Sources/JExtractSwift/Swift2JavaTranslator+Printing.swift b/Sources/JExtractSwift/Swift2JavaTranslator+Printing.swift index 5a367840..8953b4d5 100644 --- a/Sources/JExtractSwift/Swift2JavaTranslator+Printing.swift +++ b/Sources/JExtractSwift/Swift2JavaTranslator+Printing.swift @@ -205,6 +205,11 @@ extension Swift2JavaTranslator { ) printer.print("") + // Layout of the class + printClassMemoryLayout(&printer, decl) + + printer.printParts("") + // Initializers for initDecl in decl.initializers { printClassConstructors(&printer, initDecl) @@ -264,9 +269,6 @@ extension Swift2JavaTranslator { printClassConstants(printer: &printer) printTypeMappingDecls(&printer) - // Layout of the class - printClassMemoryLayout(&printer, decl) - body(&printer) } } @@ -384,12 +386,9 @@ extension Swift2JavaTranslator { } private func printClassMemoryLayout(_ printer: inout CodePrinter, _ decl: ImportedNominalType) { - // TODO: make use of the swift runtime to get the layout printer.print( """ - private static final GroupLayout $LAYOUT = MemoryLayout.structLayout( - SWIFT_POINTER - ).withName("\(decl.swiftTypeName)"); + private static final GroupLayout $LAYOUT = (GroupLayout)SwiftValueWitnessTable.layoutOfSwiftType(TYPE_METADATA.$memorySegment()); public final GroupLayout $layout() { return $LAYOUT; diff --git a/Tests/JExtractSwiftTests/ClassPrintingTests.swift b/Tests/JExtractSwiftTests/ClassPrintingTests.swift new file mode 100644 index 00000000..7aa63b95 --- /dev/null +++ b/Tests/JExtractSwiftTests/ClassPrintingTests.swift @@ -0,0 +1,68 @@ +//===----------------------------------------------------------------------===// +// +// This source file is part of the Swift.org open source project +// +// Copyright (c) 2024 Apple Inc. and the Swift.org project authors +// Licensed under Apache License v2.0 +// +// See LICENSE.txt for license information +// See CONTRIBUTORS.txt for the list of Swift.org project authors +// +// SPDX-License-Identifier: Apache-2.0 +// +//===----------------------------------------------------------------------===// + +import JExtractSwift +import Testing + +struct ClassPrintingTests { + let class_interfaceFile = + """ + // swift-interface-format-version: 1.0 + // swift-compiler-version: Apple Swift version 6.0 effective-5.10 (swiftlang-6.0.0.7.6 clang-1600.0.24.1) + // swift-module-flags: -target arm64-apple-macosx15.0 -enable-objc-interop -enable-library-evolution -module-name MySwiftLibrary + import Darwin.C + import Darwin + import Swift + import _Concurrency + import _StringProcessing + import _SwiftConcurrencyShims + + // MANGLED NAME: $s14MySwiftLibrary0aB5ClassCMa + public class MySwiftClass { + // MANGLED NAME: $s14MySwiftLibrary0aB5ClassC3len3capACSi_SitcfC + public init(len: Swift.Int, cap: Swift.Int) + + // MANGLED NAME: $s14MySwiftLibrary0aB5ClassC19helloMemberFunctionyyF + public func helloMemberFunction() + + public func makeInt() -> Int + + @objc deinit + } + """ + + @Test("Import: class layout") + func class_layout() throws { + let st = Swift2JavaTranslator( + javaPackage: "com.example.swift", + swiftModuleName: "__FakeModule" + ) + + try assertOutput(st, input: class_interfaceFile, .java, expectedChunks: [ + """ + public static final SwiftAnyType TYPE_METADATA = + new SwiftAnyType(SwiftKit.swiftjava.getType("__FakeModule", "MySwiftClass")); + public final SwiftAnyType $swiftType() { + return TYPE_METADATA; + } + + + private static final GroupLayout $LAYOUT = (GroupLayout)SwiftValueWitnessTable.layoutOfSwiftType(TYPE_METADATA.$memorySegment()); + public final GroupLayout $layout() { + return $LAYOUT; + } + """ + ]) + } +} From f1af9bd0d5e4d7a6c6fb70087c9e14bc15dceb34 Mon Sep 17 00:00:00 2001 From: Jack Rosen Date: Thu, 28 Nov 2024 08:49:54 -0500 Subject: [PATCH 2/6] print instead of printParts Co-authored-by: Konrad `ktoso` Malawski --- Sources/JExtractSwift/Swift2JavaTranslator+Printing.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Sources/JExtractSwift/Swift2JavaTranslator+Printing.swift b/Sources/JExtractSwift/Swift2JavaTranslator+Printing.swift index 8953b4d5..21b558a2 100644 --- a/Sources/JExtractSwift/Swift2JavaTranslator+Printing.swift +++ b/Sources/JExtractSwift/Swift2JavaTranslator+Printing.swift @@ -208,7 +208,7 @@ extension Swift2JavaTranslator { // Layout of the class printClassMemoryLayout(&printer, decl) - printer.printParts("") + printer.print("") // Initializers for initDecl in decl.initializers { From 96b177073d8b45a557c2b697f8ec679fe1a73b27 Mon Sep 17 00:00:00 2001 From: Jack Rosen Date: Thu, 28 Nov 2024 08:50:13 -0500 Subject: [PATCH 3/6] add space Co-authored-by: Konrad `ktoso` Malawski --- Sources/JExtractSwift/Swift2JavaTranslator+Printing.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Sources/JExtractSwift/Swift2JavaTranslator+Printing.swift b/Sources/JExtractSwift/Swift2JavaTranslator+Printing.swift index 21b558a2..76721e46 100644 --- a/Sources/JExtractSwift/Swift2JavaTranslator+Printing.swift +++ b/Sources/JExtractSwift/Swift2JavaTranslator+Printing.swift @@ -388,7 +388,7 @@ extension Swift2JavaTranslator { private func printClassMemoryLayout(_ printer: inout CodePrinter, _ decl: ImportedNominalType) { printer.print( """ - private static final GroupLayout $LAYOUT = (GroupLayout)SwiftValueWitnessTable.layoutOfSwiftType(TYPE_METADATA.$memorySegment()); + private static final GroupLayout $LAYOUT = (GroupLayout) SwiftValueWitnessTable.layoutOfSwiftType(TYPE_METADATA.$memorySegment()); public final GroupLayout $layout() { return $LAYOUT; From 2973e4bb9089adc9f0c17ba4b7b0b8c07c09fb26 Mon Sep 17 00:00:00 2001 From: Jack Rosen Date: Thu, 28 Nov 2024 08:50:52 -0500 Subject: [PATCH 4/6] Remove mangled name --- Tests/JExtractSwiftTests/ClassPrintingTests.swift | 1 - 1 file changed, 1 deletion(-) diff --git a/Tests/JExtractSwiftTests/ClassPrintingTests.swift b/Tests/JExtractSwiftTests/ClassPrintingTests.swift index 7aa63b95..9a6bda96 100644 --- a/Tests/JExtractSwiftTests/ClassPrintingTests.swift +++ b/Tests/JExtractSwiftTests/ClassPrintingTests.swift @@ -28,7 +28,6 @@ struct ClassPrintingTests { import _StringProcessing import _SwiftConcurrencyShims - // MANGLED NAME: $s14MySwiftLibrary0aB5ClassCMa public class MySwiftClass { // MANGLED NAME: $s14MySwiftLibrary0aB5ClassC3len3capACSi_SitcfC public init(len: Swift.Int, cap: Swift.Int) From 1e8985eeeaaa12a6e3135ac20dc7cd4bd0563ef7 Mon Sep 17 00:00:00 2001 From: Jack Rosen Date: Thu, 28 Nov 2024 09:36:07 -0500 Subject: [PATCH 5/6] Space --- Tests/JExtractSwiftTests/ClassPrintingTests.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Tests/JExtractSwiftTests/ClassPrintingTests.swift b/Tests/JExtractSwiftTests/ClassPrintingTests.swift index 9a6bda96..097656d6 100644 --- a/Tests/JExtractSwiftTests/ClassPrintingTests.swift +++ b/Tests/JExtractSwiftTests/ClassPrintingTests.swift @@ -57,7 +57,7 @@ struct ClassPrintingTests { } - private static final GroupLayout $LAYOUT = (GroupLayout)SwiftValueWitnessTable.layoutOfSwiftType(TYPE_METADATA.$memorySegment()); + private static final GroupLayout $LAYOUT = (GroupLayout) SwiftValueWitnessTable.layoutOfSwiftType(TYPE_METADATA.$memorySegment()); public final GroupLayout $layout() { return $LAYOUT; } From f5cb33998f2d4c0044b32b1d601dc3234624d2c5 Mon Sep 17 00:00:00 2001 From: jrosen081 Date: Thu, 28 Nov 2024 12:17:53 -0500 Subject: [PATCH 6/6] Remove all mangled name --- Tests/JExtractSwiftTests/ClassPrintingTests.swift | 2 -- 1 file changed, 2 deletions(-) diff --git a/Tests/JExtractSwiftTests/ClassPrintingTests.swift b/Tests/JExtractSwiftTests/ClassPrintingTests.swift index 097656d6..57c06f7e 100644 --- a/Tests/JExtractSwiftTests/ClassPrintingTests.swift +++ b/Tests/JExtractSwiftTests/ClassPrintingTests.swift @@ -29,10 +29,8 @@ struct ClassPrintingTests { import _SwiftConcurrencyShims public class MySwiftClass { - // MANGLED NAME: $s14MySwiftLibrary0aB5ClassC3len3capACSi_SitcfC public init(len: Swift.Int, cap: Swift.Int) - // MANGLED NAME: $s14MySwiftLibrary0aB5ClassC19helloMemberFunctionyyF public func helloMemberFunction() public func makeInt() -> Int