2012-05-02 13 views

Respuesta

9

Por qué no utilizar algunos de utilidad de shell simples?

Respuestas en orden

wc -l *.fs 
ls -l *.fs | wc -l 
wc -c *.fs 
grep module *.fs | wc -l 
grep type *.fs | wc -l 
grep "^let\|member" *.fs | wc -l 

Actualización: Algunos ejemplos de carpetas recursivas - espero que el patrón es obvio

wc -l `find . -name "*.fs" ` 
find . -name "*.fs" | wc -l 
wc -c `find . -name "*.fs" ` 
grep module `find . -name "*.fs" ` | wc -l 
+0

¡Bonito! ¿Cómo lo ejecuto? Uso Windows 7 + VS 2010 –

+0

Estas son todas las herramientas de línea de comandos estándar de Unix. Todos están incluidos en cygwin en http://www.cygwin.com/. –

+0

Gracias. Una última pregunta. ¿Hay alguna manera de llamar de manera recursiva los comandos en todas las subcarpetas? –

4

Aquí es una versión # F, que cuenta con dos fs y fsx archivos de forma recursiva (suponiendo que tiene instalado F # runtime):

open System.IO 
open System.Text.RegularExpressions 

let rec allFiles dir = 
    seq { yield! Directory.GetFiles dir 
      yield! Seq.collect allFiles (Directory.GetDirectories dir) } 

let rgType = new Regex(@"type", RegexOptions.Compiled) 
let rgModule = new Regex(@"module", RegexOptions.Compiled) 
let rgFunction = new Regex(@"^let|member", RegexOptions.Compiled) 

let count (rg: Regex) s = 
    s |> rg.Matches |> fun x -> x.Count 

type Statistics = { 
     NumOfLines: int; NumOfFiles: int; 
     NumOfChars: int; NumOfTypes: int; 
     NumOfModules: int; NumOfFunctions: int; 
    } 

let getStats = 
    allFiles 
    >> Seq.filter (fun f -> f.EndsWith ".fs" || f.EndsWith ".fsx") 
    >> Seq.fold (fun acc f -> 
        let contents = f |> File.ReadLines 
        { NumOfLines = acc.NumOfLines + Seq.length contents; 
         NumOfFiles = acc.NumOfFiles + 1; 
         NumOfChars = acc.NumOfChars + Seq.sumBy String.length contents; 
         NumOfTypes = acc.NumOfTypes + Seq.sumBy (count rgType) contents; 
         NumOfModules = acc.NumOfModules + Seq.sumBy (count rgModule) contents; 
         NumOfFunctions = acc.NumOfFunctions + Seq.sumBy (count rgFunction) contents; } 
         ) { NumOfLines = 0; NumOfFiles = 0; 
          NumOfChars = 0; NumOfTypes = 0; 
          NumOfModules = 0; NumOfFunctions = 0 } 
+0

Creo que su 'let' regex no será correcta. Creo que es más correcto si lo ancla para que el 'let' debe estar al comienzo de una línea. –

+0

Gracias. La expresión regular no es exhaustiva, ya que no reconoce 'let estático' o diferencia entre funciones y valores. – pad

0

Debido F # compilar a código IL y Common Type System (CTS) y PDB files, F # asambleas pueden ser analizados por la herramienta NDepend y obtendrá 82 code metrics acerca de su código (+ todos los others features of the tool). Una versión de prueba gratuita está disponible here.

Descargo de responsabilidad, soy miembro del equipo NDepend.

+2

bueno, buena idea recurrir al análisis de código IL, pero debido a la forma en que el compilador F # produce código, la mayoría de las métricas de código basadas en IL no tendrán sentido. – citykid

Cuestiones relacionadas