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>