Fixed LOC metric to work with the new design. Note: currently it only returns the total physical LOC. Need to find a fix to return all missing loc like the previous version did.

git-svn-id: https://svn.cs.york.ac.uk/svn/ossmeter/Software/source@1117 1b171192-1bc4-4300-84b6-1b6fde2e8ce3

a.shahi@cwi.nl a.shahi@cwi.nl 2014-04-05

added metric-providers/org.ossmeter.metricprovider.rascal.LOC/META-INF/RASCAL.MF
removed metric-providers/org.ossmeter.metricprovider.rascal.LOC/src/org
removed metric-providers/org.ossmeter.metricprovider.rascal.LOC/src/org/ossmeter
removed metric-providers/org.ossmeter.metricprovider.rascal.LOC/src/org/ossmeter/metricprovider
removed metric-providers/org.ossmeter.metricprovider.rascal.LOC/src/org/ossmeter/metricprovider/rascal
removed metric-providers/org.ossmeter.metricprovider.rascal.LOC/src/org/ossmeter/metricprovider/rascal/metric
removed metric-providers/org.ossmeter.metricprovider.rascal.LOC/src/org/ossmeter/metricprovider/rascal/metric/trans
removed metric-providers/org.ossmeter.metricprovider.rascal.LOC/src/org/ossmeter/metricprovider/rascal/metric/trans/model
removed metric-providers/org.ossmeter.metricprovider.rascal.LOC/src/org/ossmeter/metricprovider/rascal/metric/trans/model/LOCs.emf
removed metric-providers/org.ossmeter.metricprovider.rascal.LOC/src/org/ossmeter/metricprovider/rascal/metric/trans/model/LinesOfCodeData.java
removed metric-providers/org.ossmeter.metricprovider.rascal.LOC/src/org/ossmeter/metricprovider/rascal/metric/trans/model/LinesOfCodeDataCollection.java
removed metric-providers/org.ossmeter.metricprovider.rascal.LOC/src/org/ossmeter/metricprovider/rascal/metric/trans/model/Loc.java
removed metric-providers/org.ossmeter.metricprovider.rascal.LOC/src/org/ossmeter/metricprovider/rascal/metric/trans/model/LocViz.java
removed metric-providers/org.ossmeter.metricprovider.rascal.LOC/src/org/ossmeter/metricprovider/rascal/metric/LinesOfCode.java
changed metric-providers/org.ossmeter.metricprovider.rascal.LOC/META-INF/MANIFEST.MF
changed metric-providers/org.ossmeter.metricprovider.rascal.LOC/plugin.xml
copied metric-providers/org.ossmeter.metricprovider.rascal.LOC/src/org/ossmeter/metricprovider/rascal/metric/trans/model/LOCs.ecore -> metric-providers/org.ossmeter.metricprovider.rascal.LOC/src/LOC.rsc
metric-providers/org.ossmeter.metricprovider.rascal.LOC/META-INF/RASCAL.MF Diff Switch to side-by-side view
Loading...
metric-providers/org.ossmeter.metricprovider.rascal.LOC/META-INF/MANIFEST.MF Diff Switch to side-by-side view
Loading...
metric-providers/org.ossmeter.metricprovider.rascal.LOC/plugin.xml Diff Switch to side-by-side view
Loading...
metric-providers/org.ossmeter.metricprovider.rascal.LOC/src/org/ossmeter/metricprovider/rascal/metric/trans/model/LOCs.ecore to metric-providers/org.ossmeter.metricprovider.rascal.LOC/src/LOC.rsc
--- a/metric-providers/org.ossmeter.metricprovider.rascal.LOC/src/org/ossmeter/metricprovider/rascal/metric/trans/model/LOCs.ecore
+++ b/metric-providers/org.ossmeter.metricprovider.rascal.LOC/src/LOC.rsc
@@ -1,34 +1,82 @@
-<?xml version="1.0" encoding="ASCII"?>
-<ecore:EPackage xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:ecore="http://www.eclipse.org/emf/2002/Ecore" name="org.ossmeter.metricprovider.rascal.metric.trans.model">
-  <eClassifiers xsi:type="ecore:EClass" name="Loc">
-    <eAnnotations source="db">
-      <details key="qualifiedCollectionNames" value="true"/>
-    </eAnnotations>
-    <eAnnotations source="customize"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="linesOfCode" upperBound="-1" eType="//LinesOfCodeData" containment="true"/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="LinesOfCodeData">
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="file">
-      <eAnnotations source="searchable"/>
-      <eType xsi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EString"/>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="totalLines">
-      <eType xsi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//ELong"/>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="commentedLines">
-      <eType xsi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//ELong"/>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="emptyLines">
-      <eType xsi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//ELong"/>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="sourceLines">
-      <eType xsi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//ELong"/>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="revisionNumber">
-      <eType xsi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EString"/>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="date">
-      <eType xsi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EString"/>
-    </eStructuralFeatures>
-  </eClassifiers>
-</ecore:EPackage>
+module LOC
+
+import lang::java::m3::Core;
+import analysis::graphs::Graph;
+import IO;
+import List;
+import String;
+import Set;
+import ValueIO;
+import org::ossmeter::metricprovider::Manager;
+import org::ossmeter::metricprovider::ProjectDelta;
+
+import analysis::statistics::Frequency;
+import analysis::statistics::Inference;
+
+alias locResult = tuple[int total, int comment, int empty, int source];
+
+@metric{loc}
+@doc{loc}
+@friendlyName{loc}
+map[str, int] countLoc(ProjectDelta delta, map[str, loc] workingCopyFolders, map[str, loc] scratchFolders) {
+  map[str file, int lines] result = ();
+  map[str, list[str]] changedItemsPerRepo = getChangedItemsPerRepository(delta);
+  
+  for (str repo <- changedItemsPerRepo) {
+    list[str] changedItems = changedItemsPerRepo[repo];
+    loc workingCopyFolder = workingCopyFolders[repo];
+    loc scratchFolder = scratchFolders[repo];
+    
+    for (str changedItem <- changedItems) {
+      if (exists(workingCopyFolder+changedItem)) {
+        loc scratchFile = scratchFolder+changedItem;
+        M3 itemM3 = readBinaryValueFile(#M3, scratchFile[extension = scratchFile.extension+".m3"]);
+        if ((unknownFileType(int i) := itemM3)) {
+          result[changedItem] = i;
+        } else {
+          result[changedItem] = itemM3.total;
+        }
+      }
+    }
+  }
+  
+  return result;
+}
+
+@metric{locoverfiles}
+@doc{locoverfiles}
+@friendlyName{locoverfiles}
+real giniLOCOverFiles(ProjectDelta delta, map[str, loc] workingCopyFolders, map[str, loc] scratchFolders) {
+  map[str, int] locMap = countLoc(delta, workingCopyFolders, scratchFolders);
+  
+  distLOCOverMethods = distribution(locMap);
+  
+  return gini([<0,0>]+[<x, distLOCOverMethods[x]> | x <- distLOCOverMethods]);
+}
+
+@metric{locoverclass}
+@doc{locoverclass}
+@friendlyName{locoverclass}
+real giniLOCOverClass(ProjectDelta delta, map[str, loc] workingCopyFolders, map[str, loc] scratchFolders) {
+  map[str class, int lines] result = ();
+  map[str, list[str]] changedItemsPerRepo = getChangedItemsPerRepository(delta);
+  
+  for (str repo <- changedItemsPerRepo) {
+    list[str] changedItems = changedItemsPerRepo[repo];
+    loc workingCopyFolder = workingCopyFolders[repo];
+    loc scratchFolder = scratchFolders[repo];
+    
+    for (str changedItem <- changedItems) {
+      if (exists(workingCopyFolder+changedItem)) {
+        loc scratchFile = scratchFolder+changedItem;
+        M3 itemM3 = readBinaryValueFile(#M3, scratchFile[extension = scratchFile.extension+".m3"]);
+        if (!(unknownFileType(_) := itemM3)) {
+          result += (lc.path : sc.end.line - sc.begin.line + 1 | <lc, sc> <- itemM3.model@declarations, isInterface(lc) || isClass(lc) || lc.scheme == "java+enum");
+        }
+      }
+    }
+  }
+  
+  distLOCOverClass = distribution(result);
+  return gini([<0,0>]+[<x, distLOCOverClass[x]> | x <- distLOCOverClass]);
+}