SF #3024486: Report Ant task issues a warning if source files are provided but class files do not contain debug information to collect line numbers.
diff --git a/org.jacoco.ant.test/src/org/jacoco/ant/RemoveDebugInfos.java b/org.jacoco.ant.test/src/org/jacoco/ant/RemoveDebugInfos.java
new file mode 100644
index 0000000..4fa59ed
--- /dev/null
+++ b/org.jacoco.ant.test/src/org/jacoco/ant/RemoveDebugInfos.java
@@ -0,0 +1,44 @@
+/*******************************************************************************
+ * Copyright (c) 2009, 2010 Mountainminds GmbH & Co. KG and Contributors
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Marc R. Hoffmann - initial API and implementation
+ *
+ * $Id: $
+ *******************************************************************************/
+package org.jacoco.ant;
+
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.InputStream;
+import java.io.OutputStream;
+
+import org.objectweb.asm.ClassReader;
+import org.objectweb.asm.ClassWriter;
+
+/**
+ * Test utility to remove debug information from class files.
+ *
+ * @author Marc R. Hoffmann
+ * @version $Revision: $
+ */
+public class RemoveDebugInfos {
+
+ public static void main(String[] args) throws Exception {
+ final InputStream in = new FileInputStream(args[0]);
+ final ClassReader reader = new ClassReader(in);
+ in.close();
+
+ final ClassWriter writer = new ClassWriter(0);
+ reader.accept(writer, ClassReader.SKIP_DEBUG);
+
+ final OutputStream out = new FileOutputStream(args[1]);
+ out.write(writer.toByteArray());
+ out.close();
+ }
+
+}
diff --git a/org.jacoco.ant.test/src/org/jacoco/ant/ReportTaskTest.xml b/org.jacoco.ant.test/src/org/jacoco/ant/ReportTaskTest.xml
index 123f843..e1efd89 100644
--- a/org.jacoco.ant.test/src/org/jacoco/ant/ReportTaskTest.xml
+++ b/org.jacoco.ant.test/src/org/jacoco/ant/ReportTaskTest.xml
@@ -60,6 +60,24 @@
</au:expectfailure>
</target>
+ <target name="testReportWithSourceButNoDebug">
+ <java classname="org.jacoco.ant.RemoveDebugInfos" classpath="${java.class.path}" failonerror="true">
+ <arg value="${org.jacoco.ant.reportTaskTest.classes.dir}/org/jacoco/ant/TestTarget.class" />
+ <arg value="${temp.dir}/TestTarget.class" />
+ </java>
+ <jacoco:report>
+ <structure name="root">
+ <classfiles>
+ <fileset dir="${temp.dir}" id="*.class" />
+ </classfiles>
+ <sourcefiles>
+ <fileset dir="." id="*.java" />
+ </sourcefiles>
+ </structure>
+ </jacoco:report>
+ <au:assertLogContains level="warn" text="To enable source code annotation class files for bundle 'root' have to be compiled with debug information."/>
+ </target>
+
<!-- HTML Output -->
<target name="testReportHtmlNoDestdirOrDestfile">
diff --git a/org.jacoco.ant/src/org/jacoco/ant/ReportTask.java b/org.jacoco.ant/src/org/jacoco/ant/ReportTask.java
index 52c6bf1..d707065 100644
--- a/org.jacoco.ant/src/org/jacoco/ant/ReportTask.java
+++ b/org.jacoco.ant/src/org/jacoco/ant/ReportTask.java
@@ -12,6 +12,8 @@
*******************************************************************************/
package org.jacoco.ant;
+import static java.lang.String.format;
+
import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileOutputStream;
@@ -28,6 +30,7 @@
import java.util.zip.ZipOutputStream;
import org.apache.tools.ant.BuildException;
+import org.apache.tools.ant.Project;
import org.apache.tools.ant.Task;
import org.apache.tools.ant.types.Resource;
import org.apache.tools.ant.types.resources.FileResource;
@@ -38,8 +41,8 @@
import org.jacoco.core.analysis.CoverageBuilder;
import org.jacoco.core.analysis.CoverageNodeImpl;
import org.jacoco.core.analysis.ICoverageNode;
-import org.jacoco.core.analysis.PackageCoverage;
import org.jacoco.core.analysis.ICoverageNode.ElementType;
+import org.jacoco.core.analysis.PackageCoverage;
import org.jacoco.core.data.ExecutionDataReader;
import org.jacoco.core.data.ExecutionDataStore;
import org.jacoco.core.data.SessionInfoStore;
@@ -523,16 +526,32 @@
return new InputStreamReader(r.getInputStream(), encoding);
}
}
+
+ public boolean isEmpty() {
+ return resources.isEmpty();
+ }
}
- private static void visitBundle(final IReportVisitor visitor,
+ private void visitBundle(final IReportVisitor visitor,
final BundleCoverage bundledata,
- final ISourceFileLocator sourceFileLocator) throws IOException {
+ final SourceFileCollection sourceFileLocator) throws IOException {
+ if (!sourceFileLocator.isEmpty()) {
+ checkForMissingDebugInformation(bundledata);
+ }
for (final PackageCoverage p : bundledata.getPackages()) {
visitPackage(visitor.visitChild(p), p, sourceFileLocator);
}
}
+ private void checkForMissingDebugInformation(final ICoverageNode node) {
+ if (node.getClassCounter().getTotalCount() > 0
+ && node.getLineCounter().getTotalCount() == 0) {
+ log(format(
+ "To enable source code annotation class files for bundle '%s' have to be compiled with debug information.",
+ node.getName()), Project.MSG_WARN);
+ }
+ }
+
private static void visitPackage(final IReportVisitor visitor,
final PackageCoverage packagedata,
final ISourceFileLocator sourceFileLocator) throws IOException {
diff --git a/org.jacoco.doc/docroot/doc/changes.html b/org.jacoco.doc/docroot/doc/changes.html
index 3eead4f..dc53f5e 100644
--- a/org.jacoco.doc/docroot/doc/changes.html
+++ b/org.jacoco.doc/docroot/doc/changes.html
@@ -20,6 +20,13 @@
<h2>Trunk Build @qualified.bundle.version@ (@build.date@)</h2>
+<h3>New Features</h3>
+<ul>
+ <li>Report Ant task issues a warning if source files are provided but class
+ files do not contain debug information to collect line numbers
+ (SF #3024486).</li>
+</ul>
+
<h3>Non-functional Changes</h3>
<ul>
<li>Reduce memory footprint for coverage data by 30% (Track #106).</li>