Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(126)

Side by Side Diff: base/android/jni_generator/jni_generator.py

Issue 298973005: Updating JNIAdditionalImport to allow more than one import. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 6 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « base/android/java/src/org/chromium/base/JNIAdditionalImport.java ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 #!/usr/bin/env python 1 #!/usr/bin/env python
2 # Copyright (c) 2012 The Chromium Authors. All rights reserved. 2 # Copyright (c) 2012 The Chromium Authors. All rights reserved.
3 # Use of this source code is governed by a BSD-style license that can be 3 # Use of this source code is governed by a BSD-style license that can be
4 # found in the LICENSE file. 4 # found in the LICENSE file.
5 5
6 """Extracts native methods from a Java file and generates the JNI bindings. 6 """Extracts native methods from a Java file and generates the JNI bindings.
7 If you change this, please run and update the tests.""" 7 If you change this, please run and update the tests."""
8 8
9 import collections 9 import collections
10 import errno 10 import errno
(...skipping 144 matching lines...) Expand 10 before | Expand all | Expand 10 after
155 _inner_classes = [] 155 _inner_classes = []
156 _remappings = [] 156 _remappings = []
157 _implicit_imports = [] 157 _implicit_imports = []
158 158
159 @staticmethod 159 @staticmethod
160 def SetFullyQualifiedClass(fully_qualified_class): 160 def SetFullyQualifiedClass(fully_qualified_class):
161 JniParams._fully_qualified_class = 'L' + fully_qualified_class 161 JniParams._fully_qualified_class = 'L' + fully_qualified_class
162 JniParams._package = '/'.join(fully_qualified_class.split('/')[:-1]) 162 JniParams._package = '/'.join(fully_qualified_class.split('/')[:-1])
163 163
164 @staticmethod 164 @staticmethod
165 def AddAdditionalImport(class_name):
166 if '.' in class_name:
167 raise SyntaxError('*.class cannot be used in @JNIAdditionalImport. '
168 'Only import unqualified outer classes.' % class_name)
169 new_import = 'L%s/%s' % (JniParams._package, class_name)
170 if new_import in JniParams._imports:
171 raise SyntaxError('Do not use JNIAdditionalImport on an already '
172 'imported class: %s' % (new_import.replace('/', '.')))
173 print 'Adding ' + new_import
bulach 2014/05/22 16:40:00 nit: remove
qsr 2014/05/22 16:47:55 Done.
174 JniParams._imports += [new_import]
175
176 @staticmethod
165 def ExtractImportsAndInnerClasses(contents): 177 def ExtractImportsAndInnerClasses(contents):
166 if not JniParams._package: 178 if not JniParams._package:
167 raise RuntimeError('SetFullyQualifiedClass must be called before ' 179 raise RuntimeError('SetFullyQualifiedClass must be called before '
168 'ExtractImportsAndInnerClasses') 180 'ExtractImportsAndInnerClasses')
169 contents = contents.replace('\n', '') 181 contents = contents.replace('\n', '')
170 re_import = re.compile(r'import.*?(?P<class>\S*?);') 182 re_import = re.compile(r'import.*?(?P<class>\S*?);')
171 for match in re.finditer(re_import, contents): 183 for match in re.finditer(re_import, contents):
172 JniParams._imports += ['L' + match.group('class').replace('.', '/')] 184 JniParams._imports += ['L' + match.group('class').replace('.', '/')]
173 185
174 re_inner = re.compile(r'(class|interface)\s+?(?P<name>\w+?)\W') 186 re_inner = re.compile(r'(class|interface)\s+?(?P<name>\w+?)\W')
175 for match in re.finditer(re_inner, contents): 187 for match in re.finditer(re_inner, contents):
176 inner = match.group('name') 188 inner = match.group('name')
177 if not JniParams._fully_qualified_class.endswith(inner): 189 if not JniParams._fully_qualified_class.endswith(inner):
178 JniParams._inner_classes += [JniParams._fully_qualified_class + '$' + 190 JniParams._inner_classes += [JniParams._fully_qualified_class + '$' +
179 inner] 191 inner]
180 192
193 re_additional_import = re.compile(
194 r'@JNIAdditionalImport\((?P<class_name>\w+?)\.class\)')
195 for match in re.finditer(re_additional_import, contents):
196 JniParams.AddAdditionalImport(match.group('class_name'))
197
181 re_additional_imports = re.compile( 198 re_additional_imports = re.compile(
182 r'@JNIAdditionalImport\((?P<class_name>\w+?)\.class\)') 199 r'@JNIAdditionalImport\({(?P<class_names>.*?)}\)')
bulach 2014/05/22 16:40:00 shouldn't this be sufficient, i.e., remove 193-197
qsr 2014/05/22 16:47:55 Not necessarly, you can use @JNIAdditionalImport(S
183 for match in re.finditer(re_additional_imports, contents): 200 for match in re.finditer(re_additional_imports, contents):
184 class_name = match.group('class_name') 201 for class_name in match.group('class_names').split(','):
185 if '.' in class_name: 202 JniParams.AddAdditionalImport(class_name.strip()[:-6])
bulach 2014/05/22 16:40:00 hmm, the -6 seems out of place here. how about jus
qsr 2014/05/22 16:47:55 Done.
186 raise SyntaxError('*.class cannot be used in @JNIAdditionalImport. '
187 'Only import unqualified outer classes.' % class_name)
188 new_import = 'L%s/%s' % (JniParams._package, class_name)
189 if new_import in JniParams._imports:
190 raise SyntaxError('Do not use JNIAdditionalImport on an already '
191 'imported class: %s' % (new_import.replace('/', '.')))
192 JniParams._imports += [new_import]
193 203
194 @staticmethod 204 @staticmethod
195 def ParseJavaPSignature(signature_line): 205 def ParseJavaPSignature(signature_line):
196 prefix = 'Signature: ' 206 prefix = 'Signature: '
197 return '"%s"' % signature_line[signature_line.index(prefix) + len(prefix):] 207 return '"%s"' % signature_line[signature_line.index(prefix) + len(prefix):]
198 208
199 @staticmethod 209 @staticmethod
200 def JavaToJni(param): 210 def JavaToJni(param):
201 """Converts a java param into a JNI signature type.""" 211 """Converts a java param into a JNI signature type."""
202 pod_param_map = { 212 pod_param_map = {
(...skipping 1199 matching lines...) Expand 10 before | Expand all | Expand 10 after
1402 root_name = os.path.splitext(os.path.basename(input_file))[0] 1412 root_name = os.path.splitext(os.path.basename(input_file))[0]
1403 output_file = os.path.join(options.output_dir, root_name) + '_jni.h' 1413 output_file = os.path.join(options.output_dir, root_name) + '_jni.h'
1404 if options.jarjar: 1414 if options.jarjar:
1405 with open(options.jarjar) as f: 1415 with open(options.jarjar) as f:
1406 JniParams.SetJarJarMappings(f.read()) 1416 JniParams.SetJarJarMappings(f.read())
1407 GenerateJNIHeader(input_file, output_file, options) 1417 GenerateJNIHeader(input_file, output_file, options)
1408 1418
1409 1419
1410 if __name__ == '__main__': 1420 if __name__ == '__main__':
1411 sys.exit(main(sys.argv)) 1421 sys.exit(main(sys.argv))
OLDNEW
« no previous file with comments | « base/android/java/src/org/chromium/base/JNIAdditionalImport.java ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698