@@ -1346,7 +1346,6 @@ public struct BridgeJSLink {
13461346 }
13471347
13481348 public func link( sharedMemory: Bool = false ) throws -> ( outputJs: String , outputDts: String ) {
1349- try validateRenamedTypeExports ( )
13501349 intrinsicRegistry. reset ( )
13511350 importedModuleRegistry. configure ( skeletons: skeletons)
13521351 intrinsicRegistry. classNamespaces = skeletons. reduce ( into: [ : ] ) { result, unified in
@@ -1374,198 +1373,6 @@ public struct BridgeJSLink {
13741373 return ( outputJs, outputDts)
13751374 }
13761375
1377- private func validateRenamedTypeExports( ) throws {
1378- let exported = skeletons. compactMap ( \. exported)
1379- guard
1380- exported. contains ( where: { skeleton in
1381- skeleton. classes. contains { $0. resolvedJSName != $0. name }
1382- || skeleton. structs. contains { $0. resolvedJSName != $0. name }
1383- || skeleton. enums. contains { $0. resolvedJSName != $0. name }
1384- || skeleton. protocols. contains { $0. resolvedJSName != $0. name }
1385- } )
1386- else { return }
1387-
1388- var renamedNamespaces : [ [ String ] ] = [ ]
1389- for skeleton in exported {
1390- renamedNamespaces += skeleton. classes. filter { $0. resolvedJSName != $0. name } . map ( \. tsPathComponents)
1391- renamedNamespaces += skeleton. structs. filter { $0. resolvedJSName != $0. name } . map ( \. tsPathComponents)
1392- renamedNamespaces += skeleton. enums. filter { $0. resolvedJSName != $0. name } . map ( \. tsPathComponents)
1393- }
1394- func isRenamed( _ type: any NamespacedExportedType ) -> Bool {
1395- type. resolvedJSName != type. name
1396- || renamedNamespaces. contains { type. tsPathComponents. starts ( with: $0) }
1397- }
1398-
1399- struct Symbol {
1400- let owner : String
1401- let renamed : Bool
1402- let isNamespace : Bool
1403- let canContainNamespace : Bool
1404- }
1405- var symbols : [ [ String ] : [ Symbol ] ] = [ : ]
1406- let reservedBindingNames = JSGlueVariableScope . reservedVariables. union ( [
1407- " exports " , " js " , " _exports " , " bjs " , " swiftHeapObjectFinalizationRegistry " ,
1408- " Object " , " Array " , " Map " , " WeakMap " , " WeakRef " , " FinalizationRegistry " , " Promise " , " Symbol " ,
1409- " Math " , " Number " , " BigInt " , " Error " , " TypeError " , " RangeError " , " Uint8Array " , " ArrayBuffer " ,
1410- " DataView " , " globalThis " ,
1411- ] )
1412-
1413- func claim(
1414- _ path: [ String ] ,
1415- owner: String ,
1416- renamed: Bool ,
1417- isNamespace: Bool = false ,
1418- canContainNamespace: Bool = false
1419- ) throws {
1420- let symbol = Symbol (
1421- owner: owner,
1422- renamed: renamed,
1423- isNamespace: isNamespace,
1424- canContainNamespace: canContainNamespace
1425- )
1426- for existing in symbols [ path] ?? [ ] {
1427- guard existing. owner != owner, existing. renamed || renamed else { continue }
1428- if existing. isNamespace && isNamespace { continue }
1429- if existing. isNamespace && canContainNamespace && existing. owner. hasPrefix ( owner + " . " ) { continue }
1430- if isNamespace && existing. canContainNamespace && owner. hasPrefix ( existing. owner + " . " ) { continue }
1431- throw BridgeJSLinkError (
1432- message:
1433- " JavaScript export name ' \( path. joined ( separator: " . " ) ) ' for ' \( owner) ' collides with ' \( existing. owner) ' after renaming a type "
1434- )
1435- }
1436- symbols [ path, default: [ ] ] . append ( symbol)
1437- }
1438-
1439- func claimNamespaces( _ path: [ String ] , owner: String ) throws {
1440- for count in 1 ..< path. count {
1441- try claim ( Array ( path. prefix ( count) ) , owner: owner, renamed: false , isNamespace: true )
1442- }
1443- }
1444-
1445- func claimMembers(
1446- _ path: [ String ] ,
1447- owner: String ,
1448- renamed: Bool ,
1449- methods: [ ExportedFunction ] ,
1450- properties: [ ExportedProperty ]
1451- ) throws {
1452- for method in methods {
1453- try claim ( path + [ method. resolvedJSName] , owner: owner + " . " + method. name, renamed: renamed)
1454- }
1455- for property in properties {
1456- try claim ( path + [ property. resolvedJSName] , owner: owner + " . " + property. name, renamed: renamed)
1457- }
1458- }
1459-
1460- for unified in skeletons {
1461- guard let skeleton = unified. exported else { continue }
1462- for klass in skeleton. classes {
1463- let owner = unified. moduleName + " . " + klass. swiftCallName
1464- let renamed = isRenamed ( klass)
1465- if renamed && reservedBindingNames. contains ( klass. resolvedJSName) {
1466- throw BridgeJSLinkError (
1467- message: " JavaScript class name ' \( klass. resolvedJSName) ' conflicts with a generated binding "
1468- )
1469- }
1470- try claimNamespaces ( klass. tsPathComponents, owner: owner)
1471- try claim ( klass. tsPathComponents, owner: owner, renamed: renamed, canContainNamespace: true )
1472- try claim ( [ klass. resolvedJSName] , owner: owner, renamed: renamed, canContainNamespace: true )
1473- try claimMembers (
1474- klass. tsPathComponents,
1475- owner: owner,
1476- renamed: renamed,
1477- methods: klass. methods. filter ( \. effects. isStatic) ,
1478- properties: klass. properties. filter ( \. isStatic)
1479- )
1480- for name in [ " __construct " , " prototype " ]
1481- + ( shouldUseIdentityCache ( for: klass) ? [ " __identityCache " ] : [ ] )
1482- {
1483- try claim ( klass. tsPathComponents + [ name] , owner: owner + " . " + name, renamed: false )
1484- }
1485- }
1486- for structDef in skeleton. structs {
1487- let owner = unified. moduleName + " . " + structDef. swiftCallName
1488- try claimNamespaces ( structDef. tsPathComponents, owner: owner)
1489- try claim (
1490- structDef. tsPathComponents,
1491- owner: owner,
1492- renamed: isRenamed ( structDef) ,
1493- canContainNamespace: true
1494- )
1495- try claimMembers (
1496- structDef. tsPathComponents,
1497- owner: owner,
1498- renamed: isRenamed ( structDef) ,
1499- methods: structDef. methods. filter ( \. effects. isStatic) ,
1500- properties: structDef. properties. filter ( \. isStatic)
1501- )
1502- if structDef. constructor != nil {
1503- try claim ( structDef. tsPathComponents + [ " init " ] , owner: owner + " .init " , renamed: false )
1504- }
1505- }
1506- for enumDef in skeleton. enums {
1507- let owner = unified. moduleName + " . " + enumDef. swiftCallName
1508- let renamed = isRenamed ( enumDef)
1509- let namespace = enumDef. resolvedJSNamespace ?? [ ]
1510- try claimNamespaces ( enumDef. tsPathComponents, owner: owner)
1511- try claim (
1512- enumDef. tsPathComponents,
1513- owner: owner,
1514- renamed: renamed,
1515- isNamespace: enumDef. enumType == . namespace,
1516- canContainNamespace: true
1517- )
1518- if enumDef. enumType != . namespace {
1519- if renamed && reservedBindingNames. contains ( enumDef. valuesName) {
1520- throw BridgeJSLinkError (
1521- message:
1522- " JavaScript enum binding ' \( enumDef. valuesName) ' conflicts with a generated binding "
1523- )
1524- }
1525- try claim ( [ enumDef. valuesName] , owner: owner, renamed: renamed)
1526- try claim ( namespace + [ enumDef. valuesName] , owner: owner, renamed: renamed)
1527- if enumDef. emitStyle != . tsEnum {
1528- try claim ( namespace + [ enumDef. resolvedJSName + " Tag " ] , owner: owner, renamed: renamed)
1529- try claim ( [ enumDef. objectTypeName] , owner: owner, renamed: renamed)
1530- }
1531- }
1532- try claimMembers (
1533- enumDef. tsPathComponents,
1534- owner: owner,
1535- renamed: renamed,
1536- methods: enumDef. staticMethods,
1537- properties: enumDef. staticProperties
1538- )
1539- }
1540- for proto in skeleton. protocols {
1541- try claim (
1542- [ proto. resolvedJSName] ,
1543- owner: unified. moduleName + " . " + proto. name,
1544- renamed: proto. resolvedJSName != proto. name
1545- )
1546- }
1547- for function in skeleton. functions {
1548- let path = ( function. namespace ?? [ ] ) + [ function. resolvedJSName]
1549- let owner = unified. moduleName + " . " + function. abiName
1550- try claimNamespaces ( path, owner: owner)
1551- try claim ( path, owner: owner, renamed: false )
1552- }
1553- }
1554- for unified in skeletons {
1555- for imported in unified. imported? . children ?? [ ] {
1556- for type in imported. types {
1557- try claim ( [ type. name] , owner: unified. moduleName + " .import. " + type. name, renamed: false )
1558- }
1559- }
1560- }
1561- let reservedNames =
1562- [ " Exports " , " Imports " , " createInstantiator " ]
1563- + ( exported. contains { !$0. classes. isEmpty } ? [ " SwiftHeapObject " ] : [ ] )
1564- for name in reservedNames {
1565- try claim ( [ name] , owner: " BridgeJS. \( name) " , renamed: false )
1566- }
1567- }
1568-
15691376 private func collectTypeOwnerModules( ) -> [ String : String ] {
15701377 var result : [ String : String ] = [ : ]
15711378 func record( _ name: String , _ moduleName: String ) {
0 commit comments