/
objc_generator.py
executable file
·151 lines (119 loc) · 4.77 KB
/
objc_generator.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
#!/usr/bin/python
#
# Copyright 2011 Google Inc. All Rights Reserved.
"""ObjC library generator.
This module generates a an Objective-C client library for a Discovery based API.
"""
__author__ = 'aiuto@google.com (Tony Aiuto)'
from googleapis.codegen import api
from googleapis.codegen import data_types
from googleapis.codegen import generator
from googleapis.codegen import language_model
from googleapis.codegen import template_objects
from googleapis.codegen import utilities
class ObjCGenerator(generator.ApiLibraryGenerator):
"""The ObjC code generator."""
def __init__(self, discovery, options=dict()):
super(ObjCGenerator, self).__init__(ObjCApi,
discovery,
language='objc',
language_model=ObjCLanguageModel(),
options=options)
def AnnotateApi(self, the_api):
package_path = 'google/api/services/%s' % the_api.values['name']
self._package = template_objects.Package(package_path,
language_model=self.language_model)
the_api.SetTemplateValue('package', self._package)
self._model_package = self._package
def AnnotateSchema(self, unused_api, schema):
schema.SetTemplateValue('superClass', 'GTLObject')
def AnnotateProperty(self, unused_api, prop, schema):
"""Annotate a Property with ObjC specific elements."""
if isinstance(prop.data_type, data_types.ArrayDataType):
# Set my superclass correctly if I am an array
schema.SetTemplateValue('superClass', 'GTLCollectionObject')
class ObjCLanguageModel(language_model.LanguageModel):
"""A LanguageModel for Objective-C."""
_SCHEMA_TYPE_TO_OBJC_TYPE = {
'any': 'String',
'boolean': 'NSNumber',
'integer': 'NSNumber',
'long': 'NSNumber',
'number': 'NSNumber',
'string': 'NSString',
'object': 'GTLObject',
}
_OBJC_KEYWORDS = [
'any', 'boolean', 'bycopy', 'byref', 'char', 'const', 'double', 'float',
'id', 'in', 'inout', 'int', 'integer', 'long', 'number', 'object',
'oneway', 'out', 'self', 'short', 'signed', 'string', 'super', 'unsigned',
'void', 'volatile',
]
# We can not create classes which match a ObjC keyword or built in object
# type.
RESERVED_CLASS_NAMES = _OBJC_KEYWORDS + [
'float', 'integer', 'object', 'string', 'true', 'false',
]
# We can not create data members which are in GTLObject.
RESERVED_MEMBER_NAMES = _OBJC_KEYWORDS + [
'description', 'id'
]
def GetCodeTypeFromDictionary(self, def_dict):
"""Convert a json primitive type to a suitable ObjC type name.
Overrides the default.
Args:
def_dict: (dict) A dictionary describing Json schema for this Property.
Returns:
A name suitable for use as a class in the generator's target language.
"""
json_type = def_dict.get('type', 'string')
native_format = self._SCHEMA_TYPE_TO_OBJC_TYPE.get(json_type, json_type)
return native_format
def CodeTypeForArrayOf(self, unused_type_name):
"""Take a type name and return the syntax for an array of them.
Overrides the default.
Args:
unused_type_name: (str) A type name.
Returns:
A language specific string meaning "an array of type_name".
"""
return 'NSArray'
def CodeTypeForMapOf(self, type_name):
"""Take a type name and return the syntax for an array of them.
Overrides the default.
Args:
type_name: (str) A type name.
Returns:
A language specific string meaning "an array of type_name".
"""
return 'NSMap<%s>' % type_name
def ToMemberName(self, s, unused_api):
"""Convert a wire format name into a suitable ObjC variable name."""
camel_s = utilities.CamelCase(s)
ret = camel_s[0].lower() + camel_s[1:]
if s.lower() in ObjCLanguageModel.RESERVED_MEMBER_NAMES:
ret = '%sProperty' % ret
return ret
class ObjCApi(api.Api):
"""An Api with Objective-C annotations."""
def __init__(self, discovery_doc, **unused_kwargs):
super(ObjCApi, self).__init__(discovery_doc)
def ToClassName(self, s, element_type=None):
"""Convert a discovery name to a suitable ObjC class name.
Overrides the default.
Args:
s: (str) A rosy name of data element.
element_type: (str) The kind of element to name.
Returns:
A name suitable for use as a class in the generator's target language.
"""
if ((s.lower() in ObjCLanguageModel.RESERVED_CLASS_NAMES)
or (element_type == 'schema')):
# Prepend the service name
s = '%s%s' % (utilities.CamelCase(self.values['name']),
utilities.CamelCase(s))
else:
s = utilities.CamelCase(s)
if not s.startswith('GTL'):
return 'GTL' + s
return s