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

Side by Side Diff: build/android/gyp/java_cpp_enum.py

Issue 659493003: Final step of the java_cpp_template -> java_cpp_enum migration. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: mmenke+yfriedman feedback + more aosp fixes + don't run tests as part of the build Created 6 years, 2 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
« no previous file with comments | « base/memory/memory_pressure_listener.h ('k') | build/android/gyp/java_cpp_enum_tests.py » ('j') | 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 # 2 #
3 # Copyright 2014 The Chromium Authors. All rights reserved. 3 # Copyright 2014 The Chromium Authors. All rights reserved.
4 # Use of this source code is governed by a BSD-style license that can be 4 # Use of this source code is governed by a BSD-style license that can be
5 # found in the LICENSE file. 5 # found in the LICENSE file.
6 6
7 import collections 7 import collections
8 import re 8 import re
9 import optparse 9 import optparse
10 import os 10 import os
11 from string import Template 11 from string import Template
12 import sys 12 import sys
13 13
14 from util import build_utils 14 from util import build_utils
15 15
16 class EnumDefinition(object): 16 class EnumDefinition(object):
17 def __init__(self, class_name=None, class_package=None, entries=None): 17 def __init__(self, original_enum_name=None, override_class_name=None,
18 self.class_name = class_name 18 class_package=None, entries=None):
19 self.original_enum_name = original_enum_name
20 self.override_class_name = override_class_name
19 self.class_package = class_package 21 self.class_package = class_package
20 self.entries = collections.OrderedDict(entries or []) 22 self.entries = collections.OrderedDict(entries or [])
21 self.prefix_to_strip = '' 23 self.prefix_to_strip = None
22 24
23 def AppendEntry(self, key, value): 25 def AppendEntry(self, key, value):
24 if key in self.entries: 26 if key in self.entries:
25 raise Exception('Multiple definitions of key %s found.' % key) 27 raise Exception('Multiple definitions of key %s found.' % key)
26 self.entries[key] = value 28 self.entries[key] = value
27 29
30 @property
31 def class_name(self):
32 return self.override_class_name or self.original_enum_name
33
28 def Finalize(self): 34 def Finalize(self):
29 self._Validate() 35 self._Validate()
30 self._AssignEntryIndices() 36 self._AssignEntryIndices()
31 self._StripPrefix() 37 self._StripPrefix()
32 38
33 def _Validate(self): 39 def _Validate(self):
34 assert self.class_name 40 assert self.class_name
35 assert self.class_package 41 assert self.class_package
36 assert self.entries 42 assert self.entries
37 43
38 def _AssignEntryIndices(self): 44 def _AssignEntryIndices(self):
39 # Enums, if given no value, are given the value of the previous enum + 1. 45 # Enums, if given no value, are given the value of the previous enum + 1.
40 if not all(self.entries.values()): 46 if not all(self.entries.values()):
41 prev_enum_value = -1 47 prev_enum_value = -1
42 for key, value in self.entries.iteritems(): 48 for key, value in self.entries.iteritems():
43 if not value: 49 if not value:
44 self.entries[key] = prev_enum_value + 1 50 self.entries[key] = prev_enum_value + 1
45 elif value in self.entries: 51 elif value in self.entries:
46 self.entries[key] = self.entries[value] 52 self.entries[key] = self.entries[value]
47 else: 53 else:
48 try: 54 try:
49 self.entries[key] = int(value) 55 self.entries[key] = int(value)
50 except ValueError: 56 except ValueError:
51 raise Exception('Could not interpret integer from enum value "%s" ' 57 raise Exception('Could not interpret integer from enum value "%s" '
52 'for key %s.' % (value, key)) 58 'for key %s.' % (value, key))
53 prev_enum_value = self.entries[key] 59 prev_enum_value = self.entries[key]
54 60
55 61
56 def _StripPrefix(self): 62 def _StripPrefix(self):
57 if not self.prefix_to_strip: 63 prefix_to_strip = self.prefix_to_strip
58 prefix_to_strip = re.sub('(?!^)([A-Z]+)', r'_\1', self.class_name).upper() 64 if not prefix_to_strip:
65 prefix_to_strip = self.original_enum_name
66 prefix_to_strip = re.sub('(?!^)([A-Z]+)', r'_\1', prefix_to_strip).upper()
59 prefix_to_strip += '_' 67 prefix_to_strip += '_'
60 if not all([w.startswith(prefix_to_strip) for w in self.entries.keys()]): 68 if not all([w.startswith(prefix_to_strip) for w in self.entries.keys()]):
61 prefix_to_strip = '' 69 prefix_to_strip = ''
62 else: 70
63 prefix_to_strip = self.prefix_to_strip 71 entries = collections.OrderedDict()
64 entries = ((k.replace(prefix_to_strip, '', 1), v) for (k, v) in 72 for (k, v) in self.entries.iteritems():
65 self.entries.iteritems()) 73 stripped_key = k.replace(prefix_to_strip, '', 1)
66 self.entries = collections.OrderedDict(entries) 74 if isinstance(v, basestring):
75 stripped_value = v.replace(prefix_to_strip, '', 1)
76 else:
77 stripped_value = v
78 entries[stripped_key] = stripped_value
79
80 self.entries = entries
67 81
68 class HeaderParser(object): 82 class HeaderParser(object):
69 single_line_comment_re = re.compile(r'\s*//') 83 single_line_comment_re = re.compile(r'\s*//')
70 multi_line_comment_start_re = re.compile(r'\s*/\*') 84 multi_line_comment_start_re = re.compile(r'\s*/\*')
71 enum_start_re = re.compile(r'^\s*enum\s+(\w+)\s+{\s*$') 85 enum_start_re = re.compile(r'^\s*enum\s+(\w+)\s+{\s*$')
72 enum_line_re = re.compile(r'^\s*(\w+)(\s*\=\s*([^,\n]+))?,?') 86 enum_line_re = re.compile(r'^\s*(\w+)(\s*\=\s*([^,\n]+))?,?')
73 enum_end_re = re.compile(r'^\s*}\s*;\s*$') 87 enum_end_re = re.compile(r'^\s*}\s*;\.*$')
74 generator_directive_re = re.compile( 88 generator_directive_re = re.compile(
75 r'^\s*//\s+GENERATED_JAVA_(\w+)\s*:\s*([\.\w]+)$') 89 r'^\s*//\s+GENERATED_JAVA_(\w+)\s*:\s*([\.\w]+)$')
76 90
77 def __init__(self, lines): 91 def __init__(self, lines):
78 self._lines = lines 92 self._lines = lines
79 self._enum_definitions = [] 93 self._enum_definitions = []
80 self._in_enum = False 94 self._in_enum = False
81 self._current_definition = None 95 self._current_definition = None
82 self._generator_directives = {} 96 self._generator_directives = {}
83 97
(...skipping 18 matching lines...) Expand all
102 if enum_end: 116 if enum_end:
103 self._ApplyGeneratorDirectives() 117 self._ApplyGeneratorDirectives()
104 self._current_definition.Finalize() 118 self._current_definition.Finalize()
105 self._enum_definitions.append(self._current_definition) 119 self._enum_definitions.append(self._current_definition)
106 self._in_enum = False 120 self._in_enum = False
107 elif enum_entry: 121 elif enum_entry:
108 enum_key = enum_entry.groups()[0] 122 enum_key = enum_entry.groups()[0]
109 enum_value = enum_entry.groups()[2] 123 enum_value = enum_entry.groups()[2]
110 self._current_definition.AppendEntry(enum_key, enum_value) 124 self._current_definition.AppendEntry(enum_key, enum_value)
111 125
126 def _GetCurrentEnumClassNameOverride(self):
127 return self._generator_directives.get('CLASS_NAME_OVERRIDE')
128
112 def _GetCurrentEnumPackageName(self): 129 def _GetCurrentEnumPackageName(self):
113 return self._generator_directives.get('ENUM_PACKAGE') 130 return self._generator_directives.get('ENUM_PACKAGE')
114 131
115 def _GetCurrentEnumPrefixToStrip(self): 132 def _GetCurrentEnumPrefixToStrip(self):
116 return self._generator_directives.get('PREFIX_TO_STRIP', '') 133 return self._generator_directives.get('PREFIX_TO_STRIP', '')
117 134
118 def _ApplyGeneratorDirectives(self): 135 def _ApplyGeneratorDirectives(self):
119 current_definition = self._current_definition 136 current_definition = self._current_definition
120 current_definition.class_package = self._GetCurrentEnumPackageName() 137 current_definition.class_package = self._GetCurrentEnumPackageName()
121 current_definition.prefix_to_strip = self._GetCurrentEnumPrefixToStrip() 138 current_definition.prefix_to_strip = self._GetCurrentEnumPrefixToStrip()
cjhopman 2014/10/16 16:54:51 We should probably have this check that you aren't
mkosiba (inactive) 2014/10/20 15:09:05 Done.
122 self._generator_directives = {} 139 self._generator_directives = {}
123 140
124 def _ParseRegularLine(self, line): 141 def _ParseRegularLine(self, line):
125 enum_start = HeaderParser.enum_start_re.match(line) 142 enum_start = HeaderParser.enum_start_re.match(line)
126 generator_directive = HeaderParser.generator_directive_re.match(line) 143 generator_directive = HeaderParser.generator_directive_re.match(line)
127 if enum_start: 144 if enum_start:
128 if not self._GetCurrentEnumPackageName(): 145 if not self._GetCurrentEnumPackageName():
129 return 146 return
130 self._current_definition = EnumDefinition() 147 self._current_definition = EnumDefinition(
131 self._current_definition.class_name = enum_start.groups()[0] 148 original_enum_name=enum_start.groups()[0],
149 override_class_name=self._GetCurrentEnumClassNameOverride())
132 self._in_enum = True 150 self._in_enum = True
133 elif generator_directive: 151 elif generator_directive:
134 directive_name = generator_directive.groups()[0] 152 directive_name = generator_directive.groups()[0]
135 directive_value = generator_directive.groups()[1] 153 directive_value = generator_directive.groups()[1]
136 self._generator_directives[directive_name] = directive_value 154 self._generator_directives[directive_name] = directive_value
137 155
138 156
139 def GetScriptName(): 157 def GetScriptName():
140 script_components = os.path.abspath(sys.argv[0]).split(os.path.sep) 158 script_components = os.path.abspath(sys.argv[0]).split(os.path.sep)
141 build_index = script_components.index('build') 159 build_index = script_components.index('build')
(...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after
228 246
229 output_paths = DoGenerate(options, args) 247 output_paths = DoGenerate(options, args)
230 248
231 if options.assert_files_list: 249 if options.assert_files_list:
232 AssertFilesList(output_paths, options.assert_files_list) 250 AssertFilesList(output_paths, options.assert_files_list)
233 251
234 return " ".join(output_paths) 252 return " ".join(output_paths)
235 253
236 if __name__ == '__main__': 254 if __name__ == '__main__':
237 DoMain(sys.argv[1:]) 255 DoMain(sys.argv[1:])
OLDNEW
« no previous file with comments | « base/memory/memory_pressure_listener.h ('k') | build/android/gyp/java_cpp_enum_tests.py » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698