@@ -11,8 +11,15 @@ import (
11
11
"go/types"
12
12
"math"
13
13
"strings"
14
+ "unicode"
15
+ "unicode/utf8"
14
16
)
15
17
18
+ // TODO(hyangah): handle method name conflicts.
19
+ // - struct with SetF method and exported F field.
20
+ // - method names conflicting with NSObject methods. e.g. Init
21
+ // - interface type with InitWithRef.
22
+
16
23
// TODO(hyangah): error code/domain propagation
17
24
18
25
type objcGen struct {
@@ -132,10 +139,11 @@ func (g *objcGen) genH() error {
132
139
g .Printf ("@interface %s : NSObject \n " , g .namePrefix )
133
140
for _ , obj := range g .vars {
134
141
objcType := g .objcType (obj .Type ())
135
- g .Printf ("+ (%s) %s;\n " , objcType , obj .Name ())
142
+ g .Printf ("+ (%s) %s;\n " , objcType , lowerFirst ( obj .Name () ))
136
143
g .Printf ("+ (void) set%s:(%s)v;\n " , obj .Name (), objcType )
144
+ g .Printf ("\n " )
137
145
}
138
- g .Printf ("@end\n " )
146
+ g .Printf ("@end\n \n " )
139
147
}
140
148
141
149
// static functions.
@@ -173,7 +181,7 @@ func (g *objcGen) genM() error {
173
181
g .Printf ("\n " )
174
182
175
183
g .Printf ("@protocol goSeqRefInterface\n " )
176
- g .Printf ("-(GoSeqRef*) ref ;\n " )
184
+ g .Printf ("-(GoSeqRef*) _ref ;\n " )
177
185
g .Printf ("@end\n " )
178
186
g .Printf ("\n " )
179
187
@@ -257,7 +265,7 @@ func (g *objcGen) genVarM(o *types.Var) {
257
265
258
266
// getter
259
267
s2 := & funcSummary {
260
- name : o .Name (),
268
+ name : lowerFirst ( o .Name () ),
261
269
ret : objcType ,
262
270
retParams : []paramInfo {{typ : o .Type (), name : "ret" }},
263
271
}
@@ -418,7 +426,7 @@ func (s *funcSummary) asMethod(g *objcGen) string {
418
426
params = append (params , fmt .Sprintf ("%s:(%s)%s" , key , g .objcType (p .typ )+ "*" , p .name ))
419
427
}
420
428
}
421
- return fmt .Sprintf ("(%s)%s%s" , s .ret , s .name , strings .Join (params , " " ))
429
+ return fmt .Sprintf ("(%s)%s%s" , s .ret , lowerFirst ( s .name ) , strings .Join (params , " " ))
422
430
}
423
431
424
432
func (s * funcSummary ) callMethod (g * objcGen ) string {
@@ -439,7 +447,7 @@ func (s *funcSummary) callMethod(g *objcGen) string {
439
447
params = append (params , fmt .Sprintf ("%s:&%s" , key , p .name ))
440
448
}
441
449
}
442
- return fmt .Sprintf ("%s%s" , s .name , strings .Join (params , " " ))
450
+ return fmt .Sprintf ("%s%s" , lowerFirst ( s .name ) , strings .Join (params , " " ))
443
451
}
444
452
445
453
func (s * funcSummary ) returnsVal () bool {
@@ -479,7 +487,7 @@ func (g *objcGen) genGetter(desc string, f *types.Var) {
479
487
t = types .Typ [types .String ]
480
488
}
481
489
s := & funcSummary {
482
- name : f .Name (),
490
+ name : lowerFirst ( f .Name () ),
483
491
ret : g .objcType (t ),
484
492
retParams : []paramInfo {{typ : t , name : "ret_" }},
485
493
}
@@ -513,15 +521,15 @@ func (g *objcGen) genFunc(pkgDesc, callDesc string, s *funcSummary, isMethod boo
513
521
g .Printf ("GoSeq in_ = {};\n " )
514
522
g .Printf ("GoSeq out_ = {};\n " )
515
523
if isMethod {
516
- g .Printf ("go_seq_writeRef(&in_, self.ref );\n " )
524
+ g .Printf ("go_seq_writeRef(&in_, self._ref );\n " )
517
525
}
518
526
for _ , p := range s .params {
519
527
st := g .seqType (p .typ )
520
528
if st == "Ref" {
521
529
g .Printf ("if ([(id<NSObject>)(%s) isKindOfClass:[%s class]]) {\n " , p .name , g .refTypeBase (p .typ ))
522
530
g .Indent ()
523
531
g .Printf ("id<goSeqRefInterface> %[1]s_proxy = (id<goSeqRefInterface>)(%[1]s);\n " , p .name )
524
- g .Printf ("go_seq_writeRef(&in_, %s_proxy.ref );\n " , p .name )
532
+ g .Printf ("go_seq_writeRef(&in_, %s_proxy._ref );\n " , p .name )
525
533
g .Outdent ()
526
534
g .Printf ("} else {\n " )
527
535
g .Indent ()
@@ -600,7 +608,7 @@ func (g *objcGen) genInterfaceInterface(obj *types.TypeName, summary ifaceSummar
600
608
g .Printf (" <%[1]s%[2]s>" , g .namePrefix , obj .Name ())
601
609
}
602
610
g .Printf (" {\n }\n " )
603
- g .Printf ("@property(strong, readonly) id ref ;\n " )
611
+ g .Printf ("@property(strong, readonly) id _ref ;\n " )
604
612
g .Printf ("\n " )
605
613
g .Printf ("- (id)initWithRef:(id)ref;\n " )
606
614
for _ , m := range summary .callable {
@@ -647,7 +655,7 @@ func (g *objcGen) genInterfaceM(obj *types.TypeName, t *types.Interface) bool {
647
655
g .Printf ("- (id)initWithRef:(id)ref {\n " )
648
656
g .Indent ()
649
657
g .Printf ("self = [super init];\n " )
650
- g .Printf ("if (self) { _ref = ref; }\n " )
658
+ g .Printf ("if (self) { __ref = ref; }\n " )
651
659
g .Printf ("return self;\n " )
652
660
g .Outdent ()
653
661
g .Printf ("}\n " )
@@ -734,7 +742,7 @@ func (g *objcGen) genInterfaceMethodProxy(obj *types.TypeName, s *funcSummary) {
734
742
g .Printf ("if ([(id<NSObject>)(returnVal) isKindOfClass:[%s class]]) {\n " , g .refTypeBase (p .typ ))
735
743
g .Indent ()
736
744
g .Printf ("id<goSeqRefInterface>retVal_proxy = (id<goSeqRefInterface>)(returnVal);\n " )
737
- g .Printf ("go_seq_writeRef(out, retVal_proxy.ref );\n " )
745
+ g .Printf ("go_seq_writeRef(out, retVal_proxy._ref );\n " )
738
746
g .Outdent ()
739
747
g .Printf ("} else {\n " )
740
748
g .Indent ()
@@ -772,7 +780,7 @@ func (g *objcGen) genInterfaceMethodProxy(obj *types.TypeName, s *funcSummary) {
772
780
g .Printf ("if ([(id<NSObject>)(%s) isKindOfClass:[%s class]]) {\n " , p .name , g .refTypeBase (p .typ ))
773
781
g .Indent ()
774
782
g .Printf ("id<goSeqRefInterface>%[1]s_proxy = (id<goSeqRefInterface>)(%[1]s);\n " , p .name )
775
- g .Printf ("go_seq_writeRef(out, %s_proxy.ref );\n " , p .name )
783
+ g .Printf ("go_seq_writeRef(out, %s_proxy._ref );\n " , p .name )
776
784
g .Outdent ()
777
785
g .Printf ("} else {\n " )
778
786
g .Indent ()
@@ -788,21 +796,21 @@ func (g *objcGen) genInterfaceMethodProxy(obj *types.TypeName, s *funcSummary) {
788
796
func (g * objcGen ) genStructH (obj * types.TypeName , t * types.Struct ) {
789
797
g .Printf ("@interface %s%s : NSObject {\n " , g .namePrefix , obj .Name ())
790
798
g .Printf ("}\n " )
791
- g .Printf ("@property(strong, readonly) id ref ;\n " )
799
+ g .Printf ("@property(strong, readonly) id _ref ;\n " )
792
800
g .Printf ("\n " )
793
801
g .Printf ("- (id)initWithRef:(id)ref;\n " )
794
802
795
803
// accessors to exported fields.
796
804
for _ , f := range exportedFields (t ) {
797
805
name , typ := f .Name (), g .objcFieldType (f .Type ())
798
- g .Printf ("- (%s)%s;\n " , typ , name )
806
+ g .Printf ("- (%s)%s;\n " , typ , lowerFirst ( name ) )
799
807
g .Printf ("- (void)set%s:(%s)v;\n " , name , typ )
800
808
}
801
809
802
810
// exported methods
803
811
for _ , m := range exportedMethodSet (types .NewPointer (obj .Type ())) {
804
812
s := g .funcSummary (m )
805
- g .Printf ("- %s;\n " , s .asMethod (g ))
813
+ g .Printf ("- %s;\n " , lowerFirst ( s .asMethod (g ) ))
806
814
}
807
815
g .Printf ("@end\n " )
808
816
}
@@ -827,7 +835,7 @@ func (g *objcGen) genStructM(obj *types.TypeName, t *types.Struct) {
827
835
g .Printf ("- (id)initWithRef:(id)ref {\n " )
828
836
g .Indent ()
829
837
g .Printf ("self = [super init];\n " )
830
- g .Printf ("if (self) { _ref = ref; }\n " )
838
+ g .Printf ("if (self) { __ref = ref; }\n " )
831
839
g .Printf ("return self;\n " )
832
840
g .Outdent ()
833
841
g .Printf ("}\n \n " )
@@ -958,3 +966,11 @@ func (g *objcGen) objcType(typ types.Type) string {
958
966
return "TODO"
959
967
}
960
968
}
969
+
970
+ func lowerFirst (s string ) string {
971
+ if s == "" {
972
+ return ""
973
+ }
974
+ r , n := utf8 .DecodeRuneInString (s )
975
+ return string (unicode .ToLower (r )) + s [n :]
976
+ }
0 commit comments