Skip to content

生成 Dart 版的 Foundation #18

Open
@yulingtianxia

Description

@yulingtianxia

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

  1. 生成代码功能问题:
  • 枚举优化: NS_ERROR_ENUM, NS_CLOSED_ENUM
  • 区分泛型和协议,语法很相似,包含参数、返回值中的。('id' 和 NSArray<ObjectType> 分别转成 XXXProtocol List
  • 生成函数指针声明(FunctionPointer), 处理含有函数指针的内容,如
@property (readonly, copy) NSArray<void (^)(void)> *executionBlocks;
@property (nullable) NSUInteger (*hashFunction)(const void *item, NSUInteger (* _Nullable size)(const void *item));
  • 重构 typedef(现在写死成解析 Block,应区分其他情况,比如定义函数指针)
  • 解析 @property (readonly) const void *bytes NS_RETURNS_INNER_POINTER; 时误把 bytes 当做类型,原因跟 typeSpecifier 出现多次有关。
  • 生成 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 语法报错问题
  1. 解析报错问题:
  • NSBundle.h 报错 line 245:109 no viable alternative at input 'FOUNDATION_EXPORT NSNotificationName const NSBundleResourceRequestLowDiskSpaceNotification API_AVAILABLE(ios(9.0'
  • NSCompoundPredicate.h, NSData.h 报错 line 11:64 extraneous input '<' expecting {';', ','}
  • NSCompoundPredicate.h 报错 line 34:0 mismatched input '+' expecting '@end'
  • NSCompoundPredicate.h 报错 line 34:80 extraneous input ')' expecting {'BOOL', 'Class', 'bycopy', 'byref', 'id', 'IMP', 'in', 'inout', 'oneway', 'out', 'Protocol', 'SEL', 'self', 'super', 'atomic', 'nonatomic', 'retain', '__autoreleasing', '__block', '__bridge_retained', '__bridge_transfer', '__covariant', '__contravariant', '__deprecated', '__kindof', '__unused', NULL_UNSPECIFIED, NULLABLE, NONNULL, 'null_resettable', 'NS_INLINE', 'NS_ENUM', 'NS_OPTIONS', 'assign', 'copy', 'getter', 'setter', 'strong', 'readonly', 'readwrite', 'weak', 'unsafe_unretained', 'IBOutlet', 'IBOutletCollection', 'IBInspectable', 'IB_DESIGNABLE', IDENTIFIER, LP}
  • NSCompoundPredicate.h 报错 line 34:95 missing ';' at 'NS_SWIFT_NAME'
  • NSException.h 报错 line 79:39 mismatched input '(' expecting ';'
  1. 内存问题:
  • 目前针对单个大文件的 workaround 为提升老生代内存上限,多个文件开多线程并行可 fix
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)

Metadata

Metadata

Labels

enhancementNew feature or request

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions