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

Unified Diff: base/android/jni_generator/jni_generator.py

Issue 227303003: android: Don't use cpp to strip comments in jni_generator. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: address nits Created 6 years, 8 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698