diff mx/commands.py @ 5762:b30cced39597

generalized functionality for finding classes based on searching for patterns in source code and moved it from commands.py to mx.py used above functionality to find classes manually excluded from JaCoCo processing
author Doug Simon <doug.simon@oracle.com>
date Wed, 04 Jul 2012 21:56:48 +0200
parents dab877fe7c31
children 66ec0bc36a37
line wrap: on
line diff
--- a/mx/commands.py	Wed Jul 04 16:41:08 2012 +0200
+++ b/mx/commands.py	Wed Jul 04 21:56:48 2012 +0200
@@ -587,7 +587,9 @@
         # Exclude all compiler tests and snippets
         excludes = ['com.oracle.graal.compiler.tests.*']
         for p in mx.projects():
-            _find_classes_with_annotations(excludes, p, None, ['@Snippet', '@ClassSubstitution'], includeInnerClasses=True)
+            excludes += _find_classes_with_annotations(p, None, ['@Snippet', '@ClassSubstitution'], includeInnerClasses=True)
+            excludes += p.find_classes_with_matching_source_line(None, lambda line: 'JaCoCo Exclude' in line, includeInnerClasses=True)
+            
         agentOptions = {
                         'append' : 'true' if _jacoco == 'append' else 'false',
                         'bootclasspath' : 'true',
@@ -598,47 +600,15 @@
     exe = join(jdk, 'bin', mx.exe_suffix('java'))
     return mx.run([exe, '-' + vm] + args, nonZeroIsFatal=nonZeroIsFatal, out=out, err=err, cwd=cwd, timeout=timeout)
 
-def _find_classes_with_annotations(classes, p, pkgRoot, annotations, includeInnerClasses=False):
+def _find_classes_with_annotations(p, pkgRoot, annotations, includeInnerClasses=False):
     """
     Scan the sources of project 'p' for Java source files containing a line starting with 'annotation'
-    (ignoring preceding whitespace) and add the fully qualified class name
-    to 'classes' for each Java source file matched.
+    (ignoring preceding whitespace) and return the fully qualified class name for each Java
+    source file matched in a list.
     """
-    for a in annotations:
-        assert a.startswith('@')
-    pkgDecl = re.compile(r"^package\s+([a-zA-Z_][\w\.]*)\s*;$")
-    for srcDir in p.source_dirs():
-        outputDir = p.output_dir()
-        for root, _, files in os.walk(srcDir):
-            for name in files:
-                if name.endswith('.java') and name != 'package-info.java':
-                    annotationFound = False
-                    with open(join(root, name)) as f:
-                        pkg = None
-                        for line in f:
-                            if line.startswith("package "):
-                                match = pkgDecl.match(line)
-                                if match:
-                                    pkg = match.group(1)
-                            else:
-                                stripped = line.strip()
-                                for a in annotations:
-                                    if stripped == a or stripped.startswith(a + '('):
-                                        annotationFound = True
-                                        break
-                                if annotationFound:
-                                    break
-                    if annotationFound:
-                        basename = name[:-len('.java')]
-                        assert pkg is not None
-                        if pkgRoot is None or pkg.startswith(pkgRoot):
-                            pkgOutputDir = join(outputDir, pkg.replace('.', os.path.sep))
-                            for e in os.listdir(pkgOutputDir):
-                                if includeInnerClasses:
-                                    if e.endswith('.class') and (e.startswith(basename) or e.startswith(basename + '$')):
-                                        classes.append(pkg + '.' + e[:-len('.class')])
-                                elif e == basename + '.class':
-                                    classes.append(pkg + '.' + basename)
+    
+    matches = lambda line : len([a for a in annotations if line == a or line.startswith(a + '(')]) != 0
+    return p.find_classes_with_matching_source_line(pkgRoot, matches, includeInnerClasses)
 
 def _run_tests(args, harnessName, harness):
     pos = [a for a in args if a[0] != '-' and a[0] != '@' ]
@@ -653,8 +623,7 @@
 
     for p in mx.projects():
         if getattr(p, 'testHarness', None) == harnessName:
-            classes = []
-            _find_classes_with_annotations(classes, p, None, ['@Test'])
+            classes = _find_classes_with_annotations(p, None, ['@Test'])
 
             if len(pos) != 0:
                 classes = [c for c in classes if containsAny(c, pos)]