diff options
Diffstat (limited to 'bin/flycheck-android-java.py')
| -rw-r--r-- | bin/flycheck-android-java.py | 106 |
1 files changed, 80 insertions, 26 deletions
diff --git a/bin/flycheck-android-java.py b/bin/flycheck-android-java.py index 3f0f4bf..6f14425 100644 --- a/bin/flycheck-android-java.py +++ b/bin/flycheck-android-java.py @@ -7,21 +7,43 @@ import sys import tempfile import time -def find_dominating_file(dir, file): - """Find directory containing file.""" - if os.path.exists(os.path.join(dir, file)): - return dir - return find_dominating_file(os.path.dirname(dir), file) +def get_gradle_command_and_project_mtime(dir): + """Find top-project gradlew or fallback to using gradle on sub-project dir. +While iterating the paths, also check mtime on build.gradle files""" + topdir = dir + build_gradle = None + gradlew = None + mtime = -1 + while True: + test = os.path.join(topdir, 'build.gradle') + if os.path.exists(test): + if not build_gradle: + build_gradle = test -def get_gradle_command(dir): - """Find top-project gradlew or fallback to using gradle on sub-project dir.""" - topdir = find_dominating_file(dir, 'gradlew') - if topdir: - return [os.path.join(topdir, 'gradlew'), '-p', topdir] - topdir = find_dominating_file(dir, 'build.gradle') - if topdir: - return ['gradle', '-p', topdir] - return ['gradle'] + try: + m = os.path.getmtime(test) + if m > mtime: + mtime = m + except OSError: + pass + + test = os.path.join(topdir, 'gradlew') + if os.path.exists(test): + gradlew = test + break + + test = os.path.dirname(topdir) + if test == topdir: + break + topdir = test + + if gradlew: + cmd = [gradlew, '-p', topdir] + elif build_gradle: + cmd = ['gradle', '-p', os.path.dirname(build_gradle)] + else: + cmd = ['gradle'] + return (cmd, mtime) def filter_source_files(files): """Remove any item not looking like a Java source file.""" @@ -61,11 +83,31 @@ Otherwise return None.""" return files[0:i] + files[i + 1:] return None -def figure_out_java_compilation(sourcefile, tempfile): +def figure_out_java_compilation(sessiondir, sourcefile, tempfile): """Get options for Java compilation from gradle project and run javac.""" - cmd = get_gradle_command(os.path.dirname(sourcefile)) - cmd.extend(['-q', 'flycheckAndroidJava']) - output = subprocess.check_output(cmd, universal_newlines=True).split('\n') + (cmd, mtime) = get_gradle_command_and_project_mtime( + os.path.dirname(sourcefile)) + output = None + if sessiondir != None: + cachefile = os.path.join(sessiondir, 'gradle_output') + try: + if os.path.getmtime(cachefile) >= mtime: + with open(cachefile, 'r') as f: + output = f.read() + except (OSError, IOError): + pass + + if not output: + cmd.extend(['-q', 'flycheckAndroidJava']) + output = subprocess.check_output(cmd, universal_newlines=True) + if sessiondir != None: + try: + with open(cachefile, 'w') as f: + f.write(output) + except IOError: + pass + + output = output.split('\n') data = None for line in output: if line == '***': @@ -102,11 +144,23 @@ def figure_out_java_compilation(sourcefile, tempfile): data['args'], tempfile) return 0 -if len(sys.argv) == 3: - sys.exit(figure_out_java_compilation(os.path.abspath(sys.argv[1]), - sys.argv[2])) -elif len(sys.argv) == 2: - sys.exit(figure_out_java_compilation(os.path.abspath(sys.argv[1]), - sys.argv[1])) -else: - sys.exit(-1) +def main(argv): + sessiondir = None + + if len(sys.argv) == 4: + sessiondir = sys.argv[1] + sourcefile = sys.argv[2] + tempfile = sys.argv[3] + elif len(sys.argv) == 3: + sourcefile = sys.argv[1] + tempfile = sys.argv[2] + elif len(sys.argv) == 2: + sourcefile = sys.argv[1] + tempfile = sourcefile + else: + return -1 + + sourcefile = os.path.abspath(sourcefile) + return figure_out_java_compilation(sessiondir, sourcefile, tempfile) + +sys.exit(main(sys.argv)) |
