Index: base/android/jni_generator/jni_generator.py |
diff --git a/base/android/jni_generator/jni_generator.py b/base/android/jni_generator/jni_generator.py |
index 27335834953a3e006647d27d98b301deb5b1fbf2..9984c2a2866901f16fcfee565c18a625b94dfea2 100755 |
--- a/base/android/jni_generator/jni_generator.py |
+++ b/base/android/jni_generator/jni_generator.py |
@@ -580,8 +580,14 @@ class JNIFromJavaP(object): |
class JNIFromJavaSource(object): |
"""Uses the given java source file to generate the JNI header file.""" |
+ # Match single line comments, multiline comments, character literals, and |
+ # double-quoted strings. |
+ _comment_remover_regex = re.compile( |
+ r'//.*?$|/\*.*?\*/|\'(?:\\.|[^\\\'])*\'|"(?:\\.|[^\\"])*"', |
+ re.DOTALL | re.MULTILINE) |
+ |
def __init__(self, contents, fully_qualified_class, options): |
- contents = self._RemoveComments(contents, options) |
+ contents = self._RemoveComments(contents) |
JniParams.SetFullyQualifiedClass(fully_qualified_class) |
JniParams.ExtractImportsAndInnerClasses(contents) |
jni_namespace = ExtractJNINamespace(contents) or options.namespace |
@@ -595,23 +601,23 @@ class JNIFromJavaSource(object): |
[], options) |
self.content = inl_header_file_generator.GetContent() |
- def _RemoveComments(self, contents, options): |
+ @classmethod |
+ def _RemoveComments(cls, contents): |
# We need to support both inline and block comments, and we need to handle |
- # strings that contain '//' or '/*'. Rather than trying to do all that with |
- # regexps, we just pipe the contents through the C preprocessor. We tell cpp |
- # the file has already been preprocessed, so it just removes comments and |
- # doesn't try to parse #include, #pragma etc. |
- # |
- # TODO(husky): This is a bit hacky. It would be cleaner to use a real Java |
+ # strings that contain '//' or '/*'. |
+ # TODO(bulach): This is a bit hacky. It would be cleaner to use a real Java |
# parser. Maybe we could ditch JNIFromJavaSource and just always use |
# JNIFromJavaP; or maybe we could rewrite this script in Java and use APT. |
# http://code.google.com/p/chromium/issues/detail?id=138941 |
- p = subprocess.Popen(args=[options.cpp, '-fpreprocessed'], |
- stdin=subprocess.PIPE, |
- stdout=subprocess.PIPE, |
- stderr=subprocess.PIPE) |
- stdout, _ = p.communicate(contents) |
- return stdout |
+ def replacer(match): |
+ # Replace matches that are comments with nothing; return literals/strings |
+ # unchanged. |
+ s = match.group(0) |
+ if s.startswith('/'): |
+ return '' |
+ else: |
+ return s |
+ return cls._comment_remover_regex.sub(replacer, contents) |
def GetContent(self): |
return self.content |