summaryrefslogtreecommitdiffstats
path: root/base
diff options
context:
space:
mode:
authorhusky@chromium.org <husky@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-07-30 17:27:48 +0000
committerhusky@chromium.org <husky@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-07-30 17:27:48 +0000
commitdbedbda7fae6b278aebd8a94110fc19ee76c8c37 (patch)
tree039c0749110ffde39d7770ed9b97a4f476c1eeac /base
parent854e131abba37f4c5350888942c577614424f524 (diff)
downloadchromium_src-dbedbda7fae6b278aebd8a94110fc19ee76c8c37.zip
chromium_src-dbedbda7fae6b278aebd8a94110fc19ee76c8c37.tar.gz
chromium_src-dbedbda7fae6b278aebd8a94110fc19ee76c8c37.tar.bz2
Ignore block comments in JNI generator.
The JNI generator was being confused by the word 'native' appearing in a block comment in ChromeBrowserProvider.java. This patch ensures that all comments are stripped out correctly. BUG=138941 TEST=jni_generator_tests.py Review URL: https://chromiumcodereview.appspot.com/10830035 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@148967 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'base')
-rw-r--r--base/android/jni_generator/SampleForTests.java13
-rwxr-xr-xbase/android/jni_generator/jni_generator.py21
2 files changed, 29 insertions, 5 deletions
diff --git a/base/android/jni_generator/SampleForTests.java b/base/android/jni_generator/SampleForTests.java
index 3d354cb..6f8b1ca 100644
--- a/base/android/jni_generator/SampleForTests.java
+++ b/base/android/jni_generator/SampleForTests.java
@@ -78,6 +78,19 @@ class SampleForTests {
@CalledByNativeUnchecked
void methodThatThrowsException() throws Exception {}
+ // The generator is not confused by inline comments:
+ // @CalledByNative void thisShouldNotAppearInTheOutput();
+ // @CalledByNativeUnchecked public static void neitherShouldThis(int foo);
+
+ /**
+ * The generator is not confused by block comments:
+ * @CalledByNative void thisShouldNotAppearInTheOutputEither();
+ * @CalledByNativeUnchecked public static void andDefinitelyNotThis(int foo);
+ */
+
+ // String constants that look like comments don't confuse the generator:
+ private String arrgh = "*/*";
+
//------------------------------------------------------------------------------------------------
// Java fields which are accessed from C++ code only must be annotated with @AccessedByNative to
// prevent them being eliminated when unreferenced code is stripped.
diff --git a/base/android/jni_generator/jni_generator.py b/base/android/jni_generator/jni_generator.py
index 456f3de..02e2232 100755
--- a/base/android/jni_generator/jni_generator.py
+++ b/base/android/jni_generator/jni_generator.py
@@ -451,11 +451,22 @@ class JNIFromJavaSource(object):
self.content = inl_header_file_generator.GetContent()
def _RemoveComments(self, contents):
- ret = []
- for c in [c.strip() for c in contents.split('\n')]:
- if not c.startswith('//'):
- ret += [c]
- return '\n'.join(ret)
+ # 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
+ # 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=['cpp', '-fpreprocessed'],
+ stdin=subprocess.PIPE,
+ stdout=subprocess.PIPE,
+ stderr=subprocess.PIPE)
+ stdout, _ = p.communicate(contents)
+ return stdout
def GetContent(self):
return self.content