Skip to content

Commit ed7a221

Browse files
committed
WORKAROUND: avoid emitting synthetic from @javaclass module imports
1 parent a434174 commit ed7a221

4 files changed

Lines changed: 44 additions & 7 deletions

File tree

Sources/JExtractSwiftLib/JavaSourceDependencies.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ extension SourceDependencies {
3838
.map { "@JavaClass public class \($0) {}" }
3939
.joined(separator: "\n")
4040
let stub = SwiftJavaInputFile(syntax: SwiftParser.Parser.parse(source: text), path: "<javaClassStubs>.swift")
41-
swiftModuleInputs["<javaClassStubs>"] = [stub]
41+
syntheticStubInputs["<javaClassStubs>"] = [stub]
4242
}
4343

4444
/// Load Swift sources from a dependency module described by `dependency` and

Sources/JExtractSwiftLib/SwiftKit+Printing.swift

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,13 @@ extension SwiftSymbolTable {
7373
continue
7474
}
7575

76+
// Synthetic stub modules (e.g. <javaClassStubs>) exist purely for
77+
// symbol-table resolution; they are not real Swift modules and must
78+
// not be emitted as `import` statements.
79+
guard !self.syntheticImportedModuleNames.contains(module) else {
80+
continue
81+
}
82+
7683
guard let alternativeModules = self.importedModules[module]?.alternativeModules else {
7784
printer.print("import \(module)")
7885
continue

Sources/SwiftExtract/SourceDependencies.swift

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -26,10 +26,23 @@ public struct SourceDependencies {
2626
/// Parsed Swift inputs from dependency modules, keyed by Swift module name.
2727
public var swiftModuleInputs: [SwiftModuleName: [SwiftJavaInputFile]] = [:]
2828

29+
/// Synthetic stub inputs keyed by a synthetic module name (e.g. for
30+
/// generated `@JavaClass` placeholders). These are needed for symbol-table
31+
/// resolution but must NOT be emitted as `import <module>` statements in
32+
/// generated Swift code, because their names are not real Swift modules.
33+
public var syntheticStubInputs: [SwiftModuleName: [SwiftJavaInputFile]] = [:]
34+
2935
public init() {}
3036

31-
/// Names of all dependency modules with associated Swift sources.
32-
public var swiftModuleNames: Dictionary<SwiftModuleName, [SwiftJavaInputFile]>.Keys {
33-
swiftModuleInputs.keys
37+
/// Names of all dependency modules (real + synthetic) with associated Swift
38+
/// sources. Used by callers that need to resolve types belonging to either.
39+
public var swiftModuleNames: Set<SwiftModuleName> {
40+
Set(swiftModuleInputs.keys).union(syntheticStubInputs.keys)
41+
}
42+
43+
/// Names of synthetic stub modules. These should be skipped at Swift import
44+
/// printing time.
45+
public var syntheticModuleNames: Set<SwiftModuleName> {
46+
Set(syntheticStubInputs.keys)
3447
}
3548
}

Sources/SwiftExtract/SwiftTypes/SwiftSymbolTable.swift

Lines changed: 20 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,11 @@ public class SwiftSymbolTable {
5959
public let importedModules: [String: SwiftModuleSymbolTable]
6060
public let parsedModule: SwiftModuleSymbolTable
6161

62+
/// Module names within `importedModules` that are synthetic — they exist
63+
/// purely to drive type resolution and must NOT be emitted as
64+
/// `import <module>` statements in generated Swift code.
65+
public let syntheticImportedModuleNames: Set<String>
66+
6267
private var knownTypeToNominal: [SwiftKnownTypeDeclKind: SwiftNominalTypeDeclaration] = [:]
6368
private var prioritySortedImportedModules: [SwiftModuleSymbolTable] {
6469
// Ordering with source of symbols preference:
@@ -72,9 +77,14 @@ public class SwiftSymbolTable {
7277
})
7378
}
7479

75-
public init(parsedModule: SwiftModuleSymbolTable, importedModules: [String: SwiftModuleSymbolTable]) {
80+
public init(
81+
parsedModule: SwiftModuleSymbolTable,
82+
importedModules: [String: SwiftModuleSymbolTable],
83+
syntheticImportedModuleNames: Set<String> = []
84+
) {
7685
self.parsedModule = parsedModule
7786
self.importedModules = importedModules
87+
self.syntheticImportedModuleNames = syntheticImportedModuleNames
7888
}
7989

8090
public func isModuleName(_ name: String) -> Bool {
@@ -123,7 +133,10 @@ extension SwiftSymbolTable {
123133
guard importedModules[dependencyModuleName] == nil else {
124134
continue
125135
}
126-
let dependencyInputs = sourceDependencies.swiftModuleInputs[dependencyModuleName] ?? []
136+
let dependencyInputs =
137+
sourceDependencies.swiftModuleInputs[dependencyModuleName]
138+
?? sourceDependencies.syntheticStubInputs[dependencyModuleName]
139+
?? []
127140
// TODO: build a `dependencyImportedModules` dict by scanning the dep's
128141
// own source files with `importingModules(sourceFile:)`, instead of
129142
// reusing the primary's `importedModules`. The current set is too broad
@@ -185,7 +198,11 @@ extension SwiftSymbolTable {
185198
builder.handle(sourceFile: sourceFile.syntax, sourceFilePath: sourceFile.path)
186199
}
187200
let parsedModule = builder.finalize()
188-
return SwiftSymbolTable(parsedModule: parsedModule, importedModules: importedModules)
201+
return SwiftSymbolTable(
202+
parsedModule: parsedModule,
203+
importedModules: importedModules,
204+
syntheticImportedModuleNames: sourceDependencies.syntheticModuleNames,
205+
)
189206
}
190207
}
191208

0 commit comments

Comments
 (0)