dart-native / codegen

Generator for dart_native bindings. Codegen can transform native SDK to Flutter plugin.
BSD 3-Clause "New" or "Revised" License
79 stars 3 forks source link

生成 Dart 版的 Foundation #18

Open yulingtianxia opened 4 years ago

yulingtianxia commented 4 years ago

先用 Foundation 试水,遇到的问题列在这个 Issue 里,逐个解决:

  1. 生成代码功能问题:

    • [x] 枚举优化: NS_ERROR_ENUM, NS_CLOSED_ENUM
    • [ ] 区分泛型和协议,语法很相似,包含参数、返回值中的。('id' 和 NSArray<ObjectType> 分别转成 XXXProtocolList
    • [ ] 生成函数指针声明(FunctionPointer), 处理含有函数指针的内容,如
      @property (readonly, copy) NSArray<void (^)(void)> *executionBlocks;
      @property (nullable) NSUInteger (*hashFunction)(const void *item, NSUInteger (* _Nullable size)(const void *item));
    • [ ] 重构 typedef(现在写死成解析 Block,应区分其他情况,比如定义函数指针)
    • [x] 解析 @property (readonly) const void *bytes NS_RETURNS_INNER_POINTER; 时误把 bytes 当做类型,原因跟 typeSpecifier 出现多次有关。
    • [x] 生成 API_DEPRECATED_WITH_REPLACEMENT 等 ~- [ ] 生成常量声明,如:FOUNDATION_EXPORT double const foo;~ ~- [ ] 生成函数声明,如 FOUNDATION_EXPORT NSObject * _Nullable NXReadNSObjectFromCoder(NSCoder *decoder) API_DEPRECATED("Not supported", macos(10.0,10.5), ios(2.0,2.0), watchos(2.0,2.0), tvos(9.0,9.0));~
    • [ ] (可能包含上面的问题)解决 flutter format 后的所有 Dart 语法报错问题
  2. 解析报错问题:

  1. 内存问题:
FATAL ERROR: CALL_AND_RETRY_LAST Allocation failed - JavaScript heap out of memory
 1: 0x101018fd1 node::Abort() (.cold.1) [/usr/local/bin/node]
 2: 0x10008632b node::FatalError(char const*, char const*) [/usr/local/bin/node]
 3: 0x10008646c node::OnFatalError(char const*, char const*) [/usr/local/bin/node]
 4: 0x100187727 v8::Utils::ReportOOMFailure(v8::internal::Isolate*, char const*, bool) [/usr/local/bin/node]
 5: 0x1001876c7 v8::internal::V8::FatalProcessOutOfMemory(v8::internal::Isolate*, char const*, bool) [/usr/local/bin/node]
 6: 0x100312e75 v8::internal::Heap::FatalProcessOutOfMemory(char const*) [/usr/local/bin/node]
 7: 0x10031ae5c v8::internal::Heap::AllocateRawWithRetryOrFail(int, v8::internal::AllocationType, v8::internal::AllocationOrigin, v8::internal::AllocationAlignment) [/usr/local/bin/node]
 8: 0x1002f0907 v8::internal::Handle<v8::internal::TransitionArray> v8::internal::Factory::NewWeakFixedArrayWithMap<v8::internal::TransitionArray>(v8::internal::RootIndex, int, v8::internal::AllocationType) [/usr/local/bin/node]
 9: 0x1002f07f9 v8::internal::Factory::NewTransitionArray(int, int) [/usr/local/bin/node]
10: 0x10055a618 v8::internal::TransitionsAccessor::Insert(v8::internal::Handle<v8::internal::Name>, v8::internal::Handle<v8::internal::Map>, v8::internal::SimpleTransitionFlag) [/usr/local/bin/node]
11: 0x10050695a v8::internal::Map::ConnectTransition(v8::internal::Isolate*, v8::internal::Handle<v8::internal::Map>, v8::internal::Handle<v8::internal::Map>, v8::internal::Handle<v8::internal::Name>, v8::internal::SimpleTransitionFlag) [/usr/local/bin/node]
12: 0x100506d08 v8::internal::Map::CopyReplaceDescriptors(v8::internal::Isolate*, v8::internal::Handle<v8::internal::Map>, v8::internal::Handle<v8::internal::DescriptorArray>, v8::internal::Handle<v8::internal::LayoutDescriptor>, v8::internal::TransitionFlag, v8::internal::MaybeHandle<v8::internal::Name>, char const*, v8::internal::SimpleTransitionFlag) [/usr/local/bin/node]
13: 0x100501ce4 v8::internal::Map::CopyAddDescriptor(v8::internal::Isolate*, v8::internal::Handle<v8::internal::Map>, v8::internal::Descriptor*, v8::internal::TransitionFlag) [/usr/local/bin/node]
14: 0x100501a16 v8::internal::Map::CopyWithField(v8::internal::Isolate*, v8::internal::Handle<v8::internal::Map>, v8::internal::Handle<v8::internal::Name>, v8::internal::Handle<v8::internal::FieldType>, v8::internal::PropertyAttributes, v8::internal::PropertyConstness, v8::internal::Representation, v8::internal::TransitionFlag) [/usr/local/bin/node]
15: 0x1005082b7 v8::internal::Map::TransitionToDataProperty(v8::internal::Isolate*, v8::internal::Handle<v8::internal::Map>, v8::internal::Handle<v8::internal::Name>, v8::internal::Handle<v8::internal::Object>, v8::internal::PropertyAttributes, v8::internal::PropertyConstness, v8::internal::StoreOrigin) [/usr/local/bin/node]
16: 0x1004fb1d9 v8::internal::LookupIterator::PrepareTransitionToDataProperty(v8::internal::Handle<v8::internal::JSReceiver>, v8::internal::Handle<v8::internal::Object>, v8::internal::PropertyAttributes, v8::internal::StoreOrigin) [/usr/local/bin/node]
17: 0x100527a03 v8::internal::Object::AddDataProperty(v8::internal::LookupIterator*, v8::internal::Handle<v8::internal::Object>, v8::internal::PropertyAttributes, v8::Maybe<v8::internal::ShouldThrow>, v8::internal::StoreOrigin) [/usr/local/bin/node]
18: 0x10064933c v8::internal::Runtime::SetObjectProperty(v8::internal::Isolate*, v8::internal::Handle<v8::internal::Object>, v8::internal::Handle<v8::internal::Object>, v8::internal::Handle<v8::internal::Object>, v8::internal::StoreOrigin, v8::Maybe<v8::internal::ShouldThrow>) [/usr/local/bin/node]
19: 0x10064c7f5 v8::internal::Runtime_SetKeyedProperty(int, unsigned long*, v8::internal::Isolate*) [/usr/local/bin/node]
20: 0x100972e59 Builtins_CEntry_Return1_DontSaveFPRegs_ArgvOnStack_NoBuiltinExit [/usr/local/bin/node]
21: 0xa8066bde5ca 
fish: 'codegen /Applications/Xcode.app…' terminated by signal SIGABRT (Abort)
yulingtianxia commented 4 years ago

Foundation 头文件路径:/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/System/Library/Frameworks/Foundation.framework/Headers

yulingtianxia commented 4 years ago

已经可以 Run 起来的 Header(运行不挂掉,但生成的内容未经过 check):