Skip to content

Commit 48fa421

Browse files
committed
chore: update vendored nitrogen codegen to fix/cyclic-struct-references (PR #1232)
Replace vendored codegen with upstream nitrogen from mrousavy/nitro#1232, adding support for cyclic/self-referential struct types and preventing exponential type re-traversal.
1 parent e985fe2 commit 48fa421

662 files changed

Lines changed: 6648 additions & 7445 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

codegen/Logger.d.ts

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
export type LogLevel = 'debug' | 'info' | 'warning' | 'error';
2+
export declare function isValidLogLevel(level: unknown): level is LogLevel;
3+
export declare function setLogLevel(level: LogLevel): void;
4+
export declare const Logger: {
5+
withIndented(callback: () => void): void;
6+
debug(message: string, ...extra: unknown[]): void;
7+
info(message: string, ...extra: unknown[]): void;
8+
warn(message: string, ...extra: unknown[]): void;
9+
error(message: string, ...extra: unknown[]): void;
10+
};
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
import type { Platform } from '../getPlatformSpecs.js';
2+
import type { SourceFile } from '../syntax/SourceFile.js';
3+
type AutolinkingFile = Omit<SourceFile, 'language'>;
4+
export interface Autolinking {
5+
platform: Platform;
6+
sourceFiles: AutolinkingFile[];
7+
}
8+
export {};
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
import type { SourceFile } from '../../syntax/SourceFile.js';
2+
export interface CMakeFile extends Omit<SourceFile, 'language'> {
3+
language: 'cmake';
4+
}
5+
export declare function getBuildingWithGeneratedCmakeDefinition(): string;
6+
export declare function createCMakeExtension(files: SourceFile[]): CMakeFile;
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
import type { SourceFile } from '../../syntax/SourceFile.js';
2+
export interface GradleFile extends Omit<SourceFile, 'language'> {
3+
language: 'gradle';
4+
}
5+
export declare function createGradleExtension(): GradleFile;
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
import type { SourceFile } from '../../syntax/SourceFile.js';
2+
export declare function createHybridObjectIntializer(): SourceFile[];

codegen/autolinking/android/createHybridObjectInitializer.js

Lines changed: 23 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -49,21 +49,30 @@ export function createHybridObjectIntializer() {
4949
${createFileMetadataString(`${autolinkingClassName}.hpp`)}
5050
5151
#include <jni.h>
52+
#include <functional>
5253
#include <NitroModules/NitroDefines.hpp>
5354
5455
namespace ${cxxNamespace} {
5556
57+
[[deprecated("Use registerNatives() instead.")]]
58+
int initialize(JavaVM* vm);
59+
5660
/**
57-
* Initializes the native (C++) part of ${cppLibName}, and autolinks all Hybrid Objects.
58-
* Call this in your \`JNI_OnLoad\` function (probably inside \`cpp-adapter.cpp\`).
61+
* Register the native (C++) part of ${cppLibName}, and autolinks all Hybrid Objects.
62+
* Call this in your \`JNI_OnLoad\` function (probably inside \`cpp-adapter.cpp\`),
63+
* inside a \`facebook::jni::initialize(vm, ...)\` call.
5964
* Example:
6065
* \`\`\`cpp (cpp-adapter.cpp)
6166
* JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM* vm, void*) {
62-
* return ${cxxNamespace}::initialize(vm);
67+
* return facebook::jni::initialize(vm, []() {
68+
* // register all ${cppLibName} HybridObjects
69+
* ${cxxNamespace}::registerNatives();
70+
* // any other custom registrations go here.
71+
* });
6372
* }
6473
* \`\`\`
6574
*/
66-
int initialize(JavaVM* vm);
75+
void registerAllNatives();
6776
6877
} // namespace ${cxxNamespace}
6978
@@ -86,17 +95,20 @@ ${includes}
8695
namespace ${cxxNamespace} {
8796
8897
int initialize(JavaVM* vm) {
98+
return facebook::jni::initialize(vm, []() {
99+
::${cxxNamespace}::registerAllNatives();
100+
});
101+
}
102+
103+
void registerAllNatives() {
89104
using namespace margelo::nitro;
90105
using namespace ${cxxNamespace};
91-
using namespace facebook;
92106
93-
return facebook::jni::initialize(vm, [] {
94-
// Register native JNI methods
95-
${indent(jniRegistrations.join('\n'), ' ')}
107+
// Register native JNI methods
108+
${indent(jniRegistrations.join('\n'), ' ')}
96109
97-
// Register Nitro Hybrid Objects
98-
${indent(cppRegistrations.join('\n'), ' ')}
99-
});
110+
// Register Nitro Hybrid Objects
111+
${indent(cppRegistrations.join('\n'), ' ')}
100112
}
101113
102114
} // namespace ${cxxNamespace}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
import type { SourceFile, SourceImport } from '../syntax/SourceFile.js';
2+
import type { Autolinking } from './Autolinking.js';
3+
interface JNIHybridRegistration {
4+
sourceImport: SourceImport;
5+
registrationCode: string;
6+
}
7+
interface AndroidAutolinking extends Autolinking {
8+
jniHybridRegistrations: JNIHybridRegistration[];
9+
}
10+
export declare function createAndroidAutolinking(allFiles: SourceFile[]): AndroidAutolinking;
11+
export {};
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
import type { Autolinking } from './Autolinking.js';
2+
interface IOSAutolinking extends Autolinking {
3+
}
4+
export declare function createIOSAutolinking(): IOSAutolinking;
5+
export {};
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
import type { SourceFile } from '../../syntax/SourceFile.js';
2+
type ObjcFile = Omit<SourceFile, 'language'> & {
3+
language: 'objective-c++';
4+
};
5+
type SwiftFile = Omit<SourceFile, 'language'> & {
6+
language: 'swift';
7+
};
8+
export declare function createHybridObjectIntializer(): [ObjcFile, SwiftFile] | [];
9+
export {};

codegen/autolinking/ios/createHybridObjectInitializer.js

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ export function createHybridObjectIntializer() {
1010
const umbrellaHeaderName = getUmbrellaHeaderName();
1111
const bridgeNamespace = NitroConfig.current.getSwiftBridgeNamespace('swift');
1212
const autolinkedHybridObjects = NitroConfig.current.getAutolinkedHybridObjects();
13-
const swiftFunctions = [];
13+
const swiftRegistrations = [];
1414
const cppRegistrations = [];
1515
const cppImports = [];
1616
let containsSwiftObjects = false;
@@ -28,13 +28,13 @@ export function createHybridObjectIntializer() {
2828
if (config?.swift != null) {
2929
// Autolink a Swift HybridObject!
3030
containsSwiftObjects = true;
31-
const { cppCode, requiredImports, swiftFunction } = createSwiftHybridObjectRegistration({
31+
const { cppCode, requiredImports, swiftRegistrationMethods } = createSwiftHybridObjectRegistration({
3232
hybridObjectName: hybridObjectName,
3333
swiftClassName: config.swift,
3434
});
3535
cppImports.push(...requiredImports);
3636
cppRegistrations.push(cppCode);
37-
swiftFunctions.push(swiftFunction);
37+
swiftRegistrations.push(swiftRegistrationMethods);
3838
}
3939
}
4040
if (cppRegistrations.length === 0) {
@@ -72,10 +72,14 @@ ${imports}
7272
const swiftCode = `
7373
${createFileMetadataString(`${autolinkingClassName}.swift`)}
7474
75+
import NitroModules
76+
77+
// TODO: Use empty enums once Swift supports exporting them as namespaces
78+
// See: https://github.com/swiftlang/swift/pull/83616
7579
public final class ${autolinkingClassName} {
7680
public typealias bridge = ${bridgeNamespace}
7781
78-
${indent(swiftFunctions.join('\n\n'), ' ')}
82+
${indent(swiftRegistrations.join('\n\n'), ' ')}
7983
}
8084
`.trim();
8185
return [

0 commit comments

Comments
 (0)