Skip to content

Commit 08489c4

Browse files
Merge pull request #5 from dart-native/feature/ayden_dev
Feature/ayden dev
2 parents fd50f6d + c13c0dc commit 08489c4

File tree

4 files changed

+114
-43
lines changed

4 files changed

+114
-43
lines changed

lib/objc/DNObjectiveCContext.js

Lines changed: 43 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
var DNObjectiveCTypeConverter = require('./DNObjectiveCTypeConverter').DNObjectiveCTypeConverter
12
class DNContext {
23
constructor(internal) {
34
this.internal = internal
@@ -66,6 +67,7 @@ class DNArgumentContext extends DNContext {
6667
super(internal)
6768
this.name = name
6869
this.type = type
70+
this.anonDef = null
6971
}
7072
}
7173

@@ -78,19 +80,32 @@ class DNMethodContext extends DNContext {
7880
this.returnType = null
7981
this.isClassMethod = false
8082
}
81-
8283
parse() {
8384
if(this.args.length == 0 && this.hasSameMethodDeclaration()){
8485
return ''
8586
}else if(this.args.length == 1 && this.hasSameMethodDeclaration()){
8687
return this.parseForOptionalSingleArg()
8788
}
88-
var result = ' ' + (this.isClassMethod ? 'static ' : '') + this.returnType + ' ' + this.methodDeclaration() + '(' + this.methodArgs() + ')' + ' {\n'
89-
result += ' ' + this.methodImpl()
89+
90+
var result = ' ' + (this.isClassMethod ? 'static ' : '') + this.convertMutableTypeIfNeed(this.returnType) + ' ' + this.methodDeclaration() + '(' + this.methodArgs() + ')' + ' {\n'
91+
result += this.preHandleMutableArgsIfNeed() + ' ' + this.methodImpl()
9092
result += ' }'
9193
return result
9294
}
9395

96+
preHandleMutableArgsIfNeed(){
97+
var result = ''
98+
this.args.forEach((element) => {
99+
var rawType = this.rawGenericType(element.type)
100+
if(DNObjectiveCTypeConverter.SupportMutableTypes.indexOf(rawType) > -1){
101+
var tmpArgName = '_' + element.name
102+
result += ' ' + rawType + ' ' + tmpArgName + ' = ' + rawType + '(' + element.name +')\n'
103+
element.name = tmpArgName
104+
}
105+
})
106+
return result
107+
}
108+
94109
hasSameMethodDeclaration(){
95110
var methods = this.parent.methods
96111
for(var i = 0 ; i < methods.length; i++){
@@ -119,17 +134,23 @@ class DNMethodContext extends DNContext {
119134
funcName = funcName ? funcName : this.methodName
120135
var callerPrefix = (this.isClassMethod ? ' Class(\'' + this.parent.name + '\').' : ' ')
121136
var args = noArg ? '' : ', args: [' + this.args.map(arg => arg.name) + ']'
122-
return (this.returnType == 'void' ? '' : 'return') + callerPrefix + 'perform(\'' + funcName + '\'.toSEL()' + args + ');\n'
137+
var impl = callerPrefix + 'perform(\'' + funcName + '\'.toSEL()' + args + ');\n'
138+
139+
var rawRetType = this.rawGenericType(this.returnType)
140+
if(DNObjectiveCTypeConverter.SupportMutableTypes.indexOf(rawRetType) > -1){
141+
// TO-DO:Need to consider duplicate names
142+
var newImpl = 'NSObject _result = ' + impl
143+
newImpl += ' return ' + rawRetType + '.fromPointer(_result.pointer).value;\n'
144+
return newImpl
145+
}
146+
return (this.returnType == 'void' ? '' : 'return') + impl
123147
}
124148

125149
methodArgs(){
126150
var argList = ''
127151
this.args.forEach((element, index) => {
128-
if(index == this.args.length - 1){
129-
argList += element.type + ' ' + element.name
130-
}else{
131-
argList += element.type + ' ' + element.name + ', '
132-
}
152+
var arg = element.anonDef ? element.anonDef : this.convertMutableTypeIfNeed(element.type) + ' ' + element.name
153+
argList += arg + (index == this.args.length - 1 ? '' : ', ')
133154
})
134155
return argList
135156
}
@@ -146,8 +167,20 @@ class DNMethodContext extends DNContext {
146167
result += ' }'
147168
return result
148169
}
149-
}
150170

171+
convertMutableTypeIfNeed(type){
172+
var rawType = this.rawGenericType(type)
173+
var dartType = DNObjectiveCTypeConverter.SupportMutableTypesMap[rawType]
174+
var ret = dartType ? type.replace(rawType,dartType) : type
175+
return ret
176+
}
177+
178+
rawGenericType(type){
179+
var isGeneric = type.indexOf('<') > -1 && type.indexOf('>') > -1
180+
var rawType = isGeneric ? type.substring(0,type.indexOf('<')) : type
181+
return rawType
182+
}
183+
}
151184
class DNMethodDeclarationContext extends DNMethodContext{
152185
constructor(internal) {
153186
super(internal)

lib/objc/DNObjectiveCParserListener.js

Lines changed: 35 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,6 @@ class DNObjectiveCParserListener extends ObjectiveCParserListener {
8888
}
8989
// Enter a parse tree produced by ObjectiveCParser#genericTypeSpecifier.
9090
enterGenericTypeSpecifier(ctx) {
91-
9291
}
9392
// Exit a parse tree produced by ObjectiveCParser#genericTypeSpecifier.
9493
exitGenericTypeSpecifier(ctx) {
@@ -312,6 +311,22 @@ class DNObjectiveCParserListener extends ObjectiveCParserListener {
312311
}
313312
// Enter a parse tree produced by ObjectiveCParser#blockType.
314313
enterBlockType(ctx) {
314+
if(this.currentContext instanceof DNArgumentContext){
315+
for(var i = 0 ; i < ctx.children.length; i++){
316+
var subChild = ctx.children[i]
317+
if(subChild instanceof ObjectiveCParser.BlockParametersContext){
318+
var blockArgs = ''
319+
subChild.children.forEach(element => {
320+
if(element instanceof ObjectiveCParser.TypeVariableDeclaratorOrNameContext){
321+
blockArgs += element.start.text + ' ' + element.stop.text + ', '
322+
}
323+
})
324+
blockArgs = '(' + blockArgs.substring(0,blockArgs.length - 2) + ')'
325+
this.currentContext.anonDef = this.currentContext.type + ' ' + this.currentContext.name + blockArgs
326+
break
327+
}
328+
}
329+
}
315330
}
316331
// Exit a parse tree produced by ObjectiveCParser#blockType.
317332
exitBlockType(ctx) {
@@ -324,6 +339,11 @@ class DNObjectiveCParserListener extends ObjectiveCParserListener {
324339
}
325340
// Enter a parse tree produced by ObjectiveCParser#typeSpecifierWithPrefixes.
326341
enterTypeSpecifierWithPrefixes(ctx) {
342+
if(this.currentContext instanceof DNMethodContext || this.currentContext instanceof DNBlockDefContext) {
343+
this.currentContext.returnType = this.currentContext.returnType + '<' + TC.convert(ctx.start.text) + '>'
344+
}else if(this.currentContext instanceof DNArgumentContext) {
345+
this.currentContext.type = this.currentContext.type + '<' + TC.convert(ctx.start.text) + '>'
346+
}
327347
}
328348
// Exit a parse tree produced by ObjectiveCParser#typeSpecifierWithPrefixes.
329349
exitTypeSpecifierWithPrefixes(ctx) {
@@ -367,10 +387,15 @@ class DNObjectiveCParserListener extends ObjectiveCParserListener {
367387
if(argument.type != 'void'){
368388
this.currentContext.args.push(argument)
369389
}
390+
this.currentContext.addChild(argument)
391+
this.currentContext = argument
370392
}
371393
}
372394
// Exit a parse tree produced by ObjectiveCParser#typeVariableDeclaratorOrName.
373395
exitTypeVariableDeclaratorOrName(ctx) {
396+
if (this.currentContext instanceof DNArgumentContext) {
397+
this.currentContext = this.currentContext.parent
398+
}
374399
}
375400
// Enter a parse tree produced by ObjectiveCParser#blockExpression.
376401
enterBlockExpression(ctx) {
@@ -536,11 +561,9 @@ class DNObjectiveCParserListener extends ObjectiveCParserListener {
536561
}
537562
// Enter a parse tree produced by ObjectiveCParser#enumDeclaration.
538563
enterEnumDeclaration(ctx) {
539-
if (this.currentContext instanceof DNRootContext) {
540-
var enumDef = new DNEnumDefContext(ctx)
541-
this.currentContext.addChild(enumDef)
542-
this.currentContext = enumDef
543-
}
564+
var enumDef = new DNEnumDefContext(ctx)
565+
this.currentContext.addChild(enumDef)
566+
this.currentContext = enumDef
544567
}
545568
// Exit a parse tree produced by ObjectiveCParser#enumDeclaration.
546569
exitEnumDeclaration(ctx) {
@@ -554,12 +577,10 @@ class DNObjectiveCParserListener extends ObjectiveCParserListener {
554577
}
555578
// Enter a parse tree produced by ObjectiveCParser#typedefDeclaration.
556579
enterTypedefDeclaration(ctx) {
557-
if (this.currentContext instanceof DNRootContext) {
558-
var blockDef = new DNBlockDefContext(ctx)
559-
blockDef.returnType = TC.convert(ctx.children[1].start.text)
560-
this.currentContext.addChild(blockDef)
561-
this.currentContext = blockDef
562-
}
580+
var blockDef = new DNBlockDefContext(ctx)
581+
blockDef.returnType = TC.convert(ctx.children[1].start.text)
582+
this.currentContext.addChild(blockDef)
583+
this.currentContext = blockDef
563584
}
564585
// Exit a parse tree produced by ObjectiveCParser#typedefDeclaration.
565586
exitTypedefDeclaration(ctx) {
@@ -782,9 +803,9 @@ class DNObjectiveCParserListener extends ObjectiveCParserListener {
782803
// Enter a parse tree produced by ObjectiveCParser#typeName.
783804
enterTypeName(ctx) {
784805
if (this.currentContext instanceof DNMethodContext) {
785-
this.currentContext.returnType = TC.convert(ctx.start.text == 'instancetype' ? this.currentContext.parent.name : ctx.start.text)
806+
this.currentContext.returnType = TC.convert(ctx.start.text == 'instancetype' ? this.currentContext.parent.name : ctx.start.text,true)
786807
} else if (this.currentContext instanceof DNArgumentContext) {
787-
this.currentContext.type = TC.convert(ctx.start.text)
808+
this.currentContext.type = TC.convert(ctx.start.text,true)
788809
}
789810
}
790811
// Exit a parse tree produced by ObjectiveCParser#typeName.
Lines changed: 31 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,22 @@
1+
class DNObjectiveCTypeConverter {
2+
DNObjectiveCTypeConverter() {
3+
if (!DNObjectiveCTypeConverter.instance) {
4+
DNObjectiveCTypeConverter.instance = this
5+
}
6+
return DNObjectiveCTypeConverter.instance
7+
}
8+
9+
convert(objcType,isMethodArg){
10+
var convertRet = DNObjectiveCTypeConverter.DNObjectiveCTypeMap[objcType]
11+
convertRet = (!convertRet && !isMethodArg) ? DNObjectiveCTypeConverter.SupportMutableTypesMap[objcType] : convertRet
12+
// convertRet = (!convertRet && !isMethodArg) ? '123123' : 'asd'
13+
return convertRet ? convertRet : objcType
14+
}
15+
}
16+
117
//Not yet confirmed what type need to convert
2-
const DNObjectiveCTypeMap = {
3-
// objc type || dart type
18+
DNObjectiveCTypeConverter.DNObjectiveCTypeMap = {
19+
// objc type || dart type
420
'int8_t' : 'int',
521
'int16_t' : 'int',
622
'int32_t' : 'int',
@@ -18,25 +34,22 @@ const DNObjectiveCTypeMap = {
1834
'NSString' : 'String',
1935
'NSMutableString' : 'String',
2036
'NSArray' : 'List',
21-
'NSMutableArray' : 'List',
2237
'NSDictionary' : 'Map',
23-
'NSMutableDictionary' : 'Map',
2438
'NSSet' : 'Set',
25-
'NSMutableSet' : 'Set',
2639
}
2740

28-
class DNObjectiveCTypeConverter {
29-
DNObjectiveCTypeConverter() {
30-
if (!DNObjectiveCTypeConverter.instance) {
31-
DNObjectiveCTypeConverter.instance = this
32-
}
33-
return DNObjectiveCTypeConverter.instance
34-
}
35-
36-
convert(objcType){
37-
var convertRet = DNObjectiveCTypeMap[objcType]
38-
return convertRet ? convertRet : objcType
39-
}
40-
}
41+
// dart-native support mutable types
42+
DNObjectiveCTypeConverter.SupportMutableTypes = [
43+
'NUMutableString',
44+
'NSMutableArray',
45+
'NSMutableSet',
46+
'NSMutableDictionary'
47+
]
4148

49+
DNObjectiveCTypeConverter.SupportMutableTypesMap = {
50+
'NSMutableString': 'String',
51+
'NSMutableArray' : 'List',
52+
'NSMutableSet' : 'Set',
53+
'NSMutableDictionary' : 'Map'
54+
}
4255
exports.DNObjectiveCTypeConverter = DNObjectiveCTypeConverter

test/objc/RuntimeStub.h

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,9 @@
99

1010
NS_ASSUME_NONNULL_BEGIN
1111

12-
typedef void (^RuntimeStubBlock)(BOOL a, NSString *b);
12+
typedef void (^RuntimeStubBlock)(BOOL a, NSString *b, NSMutableArray<NSArray *> *c);
1313
typedef NSString* (^RuntimeStubBlock2)(void);
14+
1415
typedef NS_ENUM(NSUInteger, RuntimeStubEnum) {
1516
RuntimeStub_One,
1617
RuntimeStub_Two,
@@ -25,11 +26,14 @@ typedef NS_ENUM(NSUInteger, RuntimeStubEnum) {
2526
- (BOOL)fooBOOL;
2627
- (BOOL)fooBOOL:(BOOL)a;
2728
- (BOOL)fooBOOL:(BOOL)a bar:(NSObject *)b;
29+
- (void)fooBOOLAnonFunc:(BOOL)a block:(int(^)(BOOL a, NSString *b))block;
30+
- (NSMutableSet<NSString *> *)fooMutable:(BOOL)a bar:(NSMutableArray<NSMutableArray *> *)b c:(NSMutableArray *)c;
2831
@end
2932

3033
@interface RuntimeStub(Foo)
3134
- (NSString *)fooString:(NSString *)a bar:(NSString *)b;
3235
+ (NSString *)stringFoo:(NSString *)a;
36+
+ (NSArray<NSString *> *)stringFooGeneric:(NSArray<NSString *> *)a;
3337
@end
3438

3539
@protocol RuntimeStubProtocol <NSObject>

0 commit comments

Comments
 (0)