OSDN Git Service

import Frederic's patch
authoryuuki arisawa <uk-ar@users.sourceforge.jp>
Mon, 15 Dec 2008 14:46:36 +0000 (23:46 +0900)
committeryuuki arisawa <uk-ar@users.sourceforge.jp>
Mon, 15 Dec 2008 14:46:36 +0000 (23:46 +0900)
  - 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>
org.ginkgo.gcov/META-INF/MANIFEST.MF
org.ginkgo.gcov/plugin.xml
org.ginkgo.gcov/src/org/ginkgo/gcov/builder/Builder.java
org.ginkgo.gcov/src/org/ginkgo/gcov/builder/CoverageLister.java
org.ginkgo.gcov/src/org/ginkgo/gcov/builder/CoverageSummaryBuilder.java
org.ginkgo.gcov/src/org/ginkgo/gcov/builder/LineCoverageBuilder.java
org.ginkgo.gcov/src/org/ginkgo/gcov/model/CoverageData.java
org.ginkgo.gcov/src/org/ginkgo/gcov/navigator/CoverageLabelProvider.java
org.ginkgo.gcov/src/org/ginkgo/gcov/navigator/Navigator.java
org.ginkgo.gcov/src/org/ginkgo/gcov/parser/CoverageSummaryParser.java
org.ginkgo.gcov/src/org/ginkgo/gcov/parser/LineCoverageParser.java

index 8a86148..71418e3 100644 (file)
@@ -1,6 +1,6 @@
 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
index 63e0e52..c4d0ae4 100644 (file)
@@ -4,7 +4,7 @@
    <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">
@@ -16,7 +16,7 @@
 
    <extension
          id="sampleBuilder"
-         name="サンプル・プロジェクト・ビルダー"
+         name="GCov Project View Builder"
          point="org.eclipse.core.resources.builders">
       <builder
             hasNature="true">
@@ -27,7 +27,7 @@
    </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"
index 01b674b..b436215 100644 (file)
@@ -13,6 +13,8 @@ import org.eclipse.core.resources.IResourceVisitor;
 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;
@@ -28,15 +30,34 @@ public abstract class Builder extends IncrementalProjectBuilder {
        }
        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();
@@ -129,6 +150,7 @@ public abstract class Builder extends IncrementalProjectBuilder {
         */
        protected IProject[] build(int kind, Map args, IProgressMonitor monitor)
                        throws CoreException {
+                       cleanBuild();
                                if (kind == FULL_BUILD) {
                                        fullBuild(monitor);
                                } else {
@@ -164,4 +186,5 @@ public abstract class Builder extends IncrementalProjectBuilder {
                getProject().accept(new SampleResourceCleanVisitor());
        }
 
+       abstract public void cleanBuild();
 }
\ No newline at end of file
index 6e4485c..abecaaf 100644 (file)
@@ -1,11 +1,37 @@
 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)
@@ -13,11 +39,79 @@ public class CoverageLister implements ICoverageListener {
        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);
+       }
 }
index b4f43c8..c03d9de 100644 (file)
@@ -23,7 +23,6 @@ public class CoverageSummaryBuilder extends Builder{
        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);
@@ -39,4 +38,9 @@ public class CoverageSummaryBuilder extends Builder{
        return gcovParser;
        }
        
+       
+
+       public void cleanBuild(){
+               CoverageSummaryParser.deleteSummary(this.getProject());
+       }
 }
index 9c5aa6e..6e1fd28 100644 (file)
@@ -14,6 +14,7 @@ import org.eclipse.core.resources.IResourceDeltaVisitor;
 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;
@@ -42,4 +43,8 @@ public class LineCoverageBuilder extends Builder {
        }
        return gcovParser;
        }
+       
+       public void cleanBuild(){
+               
+       }
 }
index 36d7957..fdc1a92 100644 (file)
@@ -3,10 +3,10 @@ package org.ginkgo.gcov.model;
 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;
index 7b894c8..970b320 100644 (file)
@@ -1,6 +1,8 @@
 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;
@@ -37,19 +39,50 @@ public class CoverageLabelProvider extends OwnerDrawLabelProvider {
        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;
index 7fded80..26cb29a 100644 (file)
@@ -71,7 +71,7 @@ public class Navigator extends CommonNavigator {
                ad.setColumnData(column2,new ColumnWeightData(50, 100));
                
                aViewer.getTree().setHeaderVisible(true);
-               OwnerDrawLabelProvider.setUpOwnerDraw(aViewer);
+               //OwnerDrawLabelProvider.setUpOwnerDraw(aViewer);
                return aViewer;
        }
        public Navigator() {
index da48837..18a4879 100644 (file)
@@ -15,6 +15,7 @@ import org.eclipse.core.resources.IFile;
 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;
@@ -58,8 +59,8 @@ public class CoverageSummaryParser implements IParser {
        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 (.+)$");
        }
 
@@ -170,6 +171,11 @@ public class CoverageSummaryParser implements IParser {
                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);
@@ -183,7 +189,11 @@ public class CoverageSummaryParser implements IParser {
                                        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);
@@ -199,13 +209,13 @@ public class CoverageSummaryParser implements IParser {
                                                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) {
@@ -278,4 +288,36 @@ public class CoverageSummaryParser implements IParser {
                }       
                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)
+               {
+               }
+               
+       }
 }
index cf4ccf2..026bb5b 100644 (file)
@@ -57,6 +57,7 @@ public class LineCoverageParser implements IParser {
                                return false;
                        }else{
 //                             System.out.println(resource);
+//                             System.out.println(resource.getType());
                                return true;
                        }
                }
@@ -104,7 +105,7 @@ public class LineCoverageParser implements IParser {
 //             }
                System.out.println(sourceFile);
                if(sourceFile==null){
-                       System.out.println("null!!");
+//                     System.out.println("null!!");
                        return;
                }
                deleteMarkers(sourceFile);