- translate Builder Labels in English (thank to an automatic translator).
- Correct a bug in Navigator builder: Now Navigator view show the coverage status
- Add Global coverage status in Coverage Navigator (it shows a global coverage status + a coverage for each directories)
- Add Clean-up of Coverage Navigator when project is cleaned
Signed-off-by: yuuki arisawa <uk-ar@users.sourceforge.jp>
Manifest-Version: 1.0
Bundle-ManifestVersion: 2
-Bundle-Name: Gcov プラグイン
+Bundle-Name: Gcov Plug-in
Bundle-SymbolicName: org.ginkgo.gcov; singleton:=true
Bundle-Version: 0.2.2
Bundle-Activator: org.ginkgo.gcov.GcovPlugin
<extension-point id="listeners" name="Test listeners" schema="schema/listeners.exsd"/>
<extension
id="markerBuilder"
- name="マーカ・ビルダー"
+ name="GCov Code Marker Builder"
point="org.eclipse.core.resources.builders">
<builder
hasNature="true">
<extension
id="sampleBuilder"
- name="サンプル・プロジェクト・ビルダー"
+ name="GCov Project View Builder"
point="org.eclipse.core.resources.builders">
<builder
hasNature="true">
</extension>
<extension
id="sampleNature"
- name="サンプル・プロジェクト・ネーチャー"
+ name="Nature sample project"
point="org.eclipse.core.resources.natures">
<runtime>
<run
point="org.eclipse.ui.actionSets">
<actionSet
id="sampleAction.actionSet"
- label="サンプルのアクション・セット"
+ label="A sample set of actions"
visible="true">
<action
class="org.ginkgo.gcov.action.ToggleCoveredLineAction"
import org.eclipse.core.resources.IncrementalProjectBuilder;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.QualifiedName;
+import org.ginkgo.gcov.parser.CoverageSummaryParser;
import org.ginkgo.gcov.parser.LineCoverageParser;
import org.ginkgo.gcov.parser.IParser;
import org.xml.sax.SAXException;
}
class SampleResourceCleanVisitor implements IResourceVisitor {
public boolean visit(IResource resource) {
+
+ System.out.println(resource + " " + resource.getName());
+
+ IProject project = resource.getProject();
+ try
+ {
+ //String n = resource.getName();
+ String n = resource.getFullPath().toOSString();
+ project.setPersistentProperty(new QualifiedName(n,"persent"), null);
+ project.setPersistentProperty(new QualifiedName(n,"totalLine"), null);
+ }
+ catch(CoreException e)
+ {
+
+ }
+
if (resource instanceof IFile ) {
+
String name = resource.getName();
if(name.endsWith(".c")||name.endsWith(".cpp")){
-// IFile file = (IFile) resource;
- deleteMarkers((IFile) resource);
+ // IFile file = (IFile) resource;
+ deleteMarkers((IFile) resource);
+
+
}else if(name.endsWith(".gcda")||name.endsWith(".gcno")||name.endsWith(".gcov")){
try {
resource.delete(IResource.FORCE, null);
-// resource.delete(true, null);
+ // resource.delete(true, null);
} catch (CoreException e) {
// TODO \8e©\93®\90¶\90¬\82³\82ê\82½ catch \83u\83\8d\83b\83N
e.printStackTrace();
*/
protected IProject[] build(int kind, Map args, IProgressMonitor monitor)
throws CoreException {
+ cleanBuild();
if (kind == FULL_BUILD) {
fullBuild(monitor);
} else {
getProject().accept(new SampleResourceCleanVisitor());
}
+ abstract public void cleanBuild();
}
\ No newline at end of file
package org.ginkgo.gcov.builder;
+import org.eclipse.cdt.core.model.ICElement;
+import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.resources.IResourceVisitor;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.QualifiedName;
+import org.eclipse.swt.graphics.GC;
import org.ginkgo.gcov.model.CoverageData;
public class CoverageLister implements ICoverageListener {
+ IResource sourceFile = null;
+
+ private class CoverageListerResourceVisitor implements IResourceVisitor{
+ private String sourceFileName;
+
+ private CoverageListerResourceVisitor(String FileName){
+ sourceFileName = FileName;
+ }
+ public boolean visit(IResource resource) throws CoreException {
+ if(resource instanceof IFile)
+ {
+ if(resource.getName().equals(sourceFileName)){
+ sourceFile = resource;
+ return false;
+ }
+ }
+ return true;
+ }
+ }
+
+
/* (\94ñ Javadoc)
* coverageSummaryListener
* @see org.ginkgo.gcov.builder.ICoverageListener#addData(org.eclipse.core.resources.IProject, org.ginkgo.gcov.builder.CoverageData)
public void addCoverageData(IProject project, CoverageData cov)
throws CoreException {
if(cov.getElementType().equals("File")){
- project.setPersistentProperty(new QualifiedName(cov.getElementName(),"persent"), cov.getPersent());//(elementName + "persent", persent);
- project.setPersistentProperty(new QualifiedName(cov.getElementName(),"totalLine"), cov.getTotalLine());
+
+ sourceFile = null;
+
+ try
+ {
+ project.accept(new CoverageListerResourceVisitor(cov.getElementName()));
+ }
+ catch (CoreException ce)
+ {
+ }
+
+
+ if(sourceFile != null)
+ {
+ setCoverage(project, sourceFile.getFullPath().toOSString(), cov.getPersent(), cov.getTotalLine());
+ }
}else if(cov.getElementType().equals("Function")){
project.setPersistentProperty(new QualifiedName(cov.getElementName(),"persent"), cov.getPersent());//(elementName + "persent", persent);
project.setPersistentProperty(new QualifiedName(cov.getElementName(),"totalLine"), cov.getTotalLine());
}
}
+
+ private void setCoverage(IProject project, String sPath, String sPersent, String sTotalLine) throws CoreException
+ {
+
+
+ float fileCoverage = 0;
+ int fileTotalLine = 0;
+
+ int dirTotalLine = 0;
+ float dirCoverage = 0;
+
+
+
+ project.setPersistentProperty(new QualifiedName(sPath,"persent"), sPersent);
+ project.setPersistentProperty(new QualifiedName(sPath,"totalLine"), sTotalLine);
+
+ try{
+ fileTotalLine = Integer.parseInt(project.getPersistentProperty(new QualifiedName(sPath,"totalLine")));
+ fileCoverage = Float.parseFloat(project.getPersistentProperty(new QualifiedName(sPath,"persent")));
+ }
+ catch (NumberFormatException e){
+ }
+
+
+ sPath = sPath.substring(0, sPath.lastIndexOf('/') );
+
+ /* Update the percent for sub directories. */
+ while (!sPath.equals(""))
+ {
+ try{
+ dirTotalLine = Integer.parseInt(project.getPersistentProperty(new QualifiedName(sPath,"totalLine")));
+ dirCoverage = Float.parseFloat(project.getPersistentProperty(new QualifiedName(sPath,"persent")));
+
+ dirCoverage = ((dirTotalLine * dirCoverage) + (fileTotalLine * fileCoverage)) / (dirTotalLine + fileTotalLine);
+
+
+ project.setPersistentProperty(new QualifiedName(sPath,"persent"), Float.toString(dirCoverage));
+ project.setPersistentProperty(new QualifiedName(sPath,"totalLine"), Integer.toString(dirTotalLine + fileTotalLine));
+ }
+ catch (NumberFormatException e){
+ project.setPersistentProperty(new QualifiedName(sPath,"persent"), sPersent);
+ project.setPersistentProperty(new QualifiedName(sPath,"totalLine"), sTotalLine);
+ }
+
+
+
+ sPath = sPath.substring(0, sPath.lastIndexOf('/'));
+ }
+
+
+// totalLine = Integer.parseInt(p.getPersistentProperty(new QualifiedName(n,"totalLine")));
+// coverage = Float.parseFloat(p.getPersistentProperty(new QualifiedName(n,"persent")));
+// coverLine = (int) (totalLine * coverage /100);
+ }
}
public void checkXML(IResource resource) {
if (resource instanceof IFile && resource.getName().endsWith(".gcda")) {
IFile file = (IFile) resource;
- LineCoverageParser.deleteMarkers(file);
// XMLErrorHandler reporter = new XMLErrorHandler(file);
try {
getParser().parse(file);
return gcovParser;
}
+
+
+ public void cleanBuild(){
+ CoverageSummaryParser.deleteSummary(this.getProject());
+ }
}
import org.eclipse.core.resources.IncrementalProjectBuilder;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
+import org.ginkgo.gcov.parser.CoverageSummaryParser;
import org.ginkgo.gcov.parser.IParser;
import org.ginkgo.gcov.parser.LineCoverageParser;
import org.xml.sax.SAXException;
}
return gcovParser;
}
+
+ public void cleanBuild(){
+
+ }
}
import java.sql.Timestamp;
public class CoverageData {
- String elementType = null;
- String elementName = null;
- String persent = null;
- String totalLine = null;
+ String elementType = "";
+ String elementName = "";
+ String persent = "";
+ String totalLine = "";
Timestamp timeStamp = null;
public String getElementType() {
return elementType;
package org.ginkgo.gcov.navigator;
import org.eclipse.cdt.core.model.ICElement;
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IFolder;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.QualifiedName;
protected void paint(Event event, Object element) {
// TODO \8e©\93®\90¶\90¬\82³\82ê\82½\83\81\83\\83b\83h\81E\83X\83^\83u
int totalLine = 133;
- //int coverage = (coverLine*100)/totalLine;
int coverLine = 20;
int offset = 2;
float coverage = 0;
GC gc = event.gc;
- if (element instanceof ICElement) {
+
+ if (element instanceof IProject) {
+ try {
+ IProject p = (IProject) element;
+// String n = a.getElementName();
+ if (p.isOpen())
+ {
+ String n = p.getFullPath().toOSString();
+ totalLine = Integer.parseInt(p.getPersistentProperty(new QualifiedName(n,"totalLine")));
+ coverage = Float.parseFloat(p.getPersistentProperty(new QualifiedName(n,"persent")));
+ coverLine = (int) (totalLine * coverage /100);
+ }
+ else
+ {
+ return;
+ }
+ }
+ catch (NumberFormatException e){
+ coverLine = 0;
+ return;
+ } catch (CoreException e) {
+ }
+ }
+ else if (element instanceof ICElement) {
ICElement a = (ICElement) element;
try {
IProject p = a.getCProject().getProject();
- String n = a.getElementName();
- totalLine = Integer.parseInt(p.getPersistentProperty(new QualifiedName(n,"totalLine")));
- coverage = Float.parseFloat(p.getPersistentProperty(new QualifiedName(n,"persent")));
- coverLine = (int) (totalLine * coverage /100);
+ String n = a.getPath().toOSString();
+// String n = a.getElementName();
+ if(a.getResource() instanceof IFile || (a.getResource() instanceof IFolder))
+ {
+ totalLine = Integer.parseInt(p.getPersistentProperty(new QualifiedName(n,"totalLine")));
+ coverage = Float.parseFloat(p.getPersistentProperty(new QualifiedName(n,"persent")));
+ coverLine = (int) (totalLine * coverage /100);
+ }
+ else
+ {
+ return;
+ }
+
}
catch (NumberFormatException e){
coverLine = 0;
ad.setColumnData(column2,new ColumnWeightData(50, 100));
aViewer.getTree().setHeaderVisible(true);
- OwnerDrawLabelProvider.setUpOwnerDraw(aViewer);
+ //OwnerDrawLabelProvider.setUpOwnerDraw(aViewer);
return aViewer;
}
public Navigator() {
import org.eclipse.core.resources.IMarker;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
+import org.eclipse.core.resources.IResourceVisitor;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IConfigurationElement;
import org.eclipse.core.runtime.IExtension;
ArrayList<ICoverageListener> listeners = null;
public CoverageSummaryParser() {
- funcPattern = Pattern.compile("Function `(.+)'");
- filePattern = Pattern.compile("File `(.+)'");
+ funcPattern = Pattern.compile("Function '(.+)'");
+ filePattern = Pattern.compile("File '(.+)'");
coveragePattern = Pattern.compile("Lines executed:(.+)% of (.+)$");
}
String line = null;
CoverageData cov = new CoverageData();
cov.setTimeStamp(new Timestamp(timeStamp));
+
+
+
+ //System.out.println(project.getResourceAttributes().getFullPath().toOSString());
+
try {
while((line = in.readLine())!=null){
Matcher matcher = funcPattern.matcher(line);
cov.setElementType("File");
String[] ps = matcher.group(1).split("/");
String a = ps[ps.length-1];
+
+ System.out.println(matcher.group(1));
+
cov.setElementName(ps[ps.length-1]);
+
continue;
}
matcher = coveragePattern.matcher(line);
a.get(i).addCoverageData(project, cov);
}
}
-// System.out.println("print fin");
}
} catch (IOException e) {
e.printStackTrace();
} catch (CoreException e) {
e.printStackTrace();
}
+
try {
project.refreshLocal(IResource.DEPTH_INFINITE, null);
}catch (CoreException e) {
}
return buf.toString();
}
+
+
+ public static void deleteSummary(IProject project)
+ {
+ try
+ {
+ project.accept(new IResourceVisitor()
+ {
+ @Override
+ public boolean visit(IResource resource) throws CoreException {
+ IProject project = resource.getProject();
+ try
+ {
+ //String n = resource.getName();
+ String n = resource.getFullPath().toOSString();
+ project.setPersistentProperty(new QualifiedName(n,"persent"), null);
+ project.setPersistentProperty(new QualifiedName(n,"totalLine"), null);
+ }
+ catch(CoreException e)
+ {
+
+ }
+
+ return true;
+ }
+ });
+ }
+ catch (CoreException ce)
+ {
+ }
+
+ }
}
return false;
}else{
// System.out.println(resource);
+// System.out.println(resource.getType());
return true;
}
}
// }
System.out.println(sourceFile);
if(sourceFile==null){
- System.out.println("null!!");
+// System.out.println("null!!");
return;
}
deleteMarkers(sourceFile);