internal void Procesar(List <string> lineas) { // Empieza una clase this.Firma = lineas[0]; // Limpiar extends de la firma var indexExtends = this.Firma.IndexOf(" extends "); var firmaSinExtends = indexExtends < 0 ? this.Firma : this.Firma.Substring(0, indexExtends); // Obtener nombre de la clase this.Nombre = firmaSinExtends.Substring(firmaSinExtends.LastIndexOf(" ") + 1); string linea; int contadorLlaves = 0; do { // Borrar primer linea lineas.RemoveAt(0); linea = lineas[0]; switch (linea) { case "{": contadorLlaves++; break; case "}": contadorLlaves--; break; default: // procesar linea de la clase if (linea.EndsWith(")") || linea.Replace(" ", "").EndsWith(")throwsException")) { // Metodo var metodo = new Metodo(this); metodo.Procesar(lineas); this.Metodos.Add(metodo); } break; } } while (contadorLlaves != 0); }
private void button1_Click(object sender, EventArgs e) { Clase clase = (Clase)this.listBox2.SelectedItem; Metodo metodo = (Metodo)this.listBox1.SelectedItem; if (clase != null && metodo != null) { string fileName = "informe.html"; string textToAdd = "<html>" + "<head>" + "<style>" + // "body {background-color: #8cb8ff;}" + "h1 {font-weight: bold; text-decoration: underline;}" + "h3 {font-weight: bold;}" + // "p {color: white;}" + "</style>" + "</head>" + "<body>" + "<h1>Archivo: " + clase.Nombre + "</h1>" + "<h1>Metodo: " + metodo.ToString() + "</h1>" + "<h3>Lineas con comentarios:</h3> <p>" + this.lblComentarios.Text + "</p>" + "<h3>Complejidad ciclomatica:</h3> <p>" + this.lblCiclomatica.Text + "</p>" + "<h3>Fan In:</h3> <p>" + this.lblFanIn.Text + "</p>" + "<h3>Fan Out:</h3> <p>" + this.lblFanOut.Text + "</p>" + "<h3>Longitud:</h3> <p>" + this.lblLongitud.Text + "</p>" + "<h3>Volumen:</h3> <p>" + this.lblVolumen.Text + "</p>" + "<h3>Operadores:</h3> <p>" + this.lblOperadores.Text + "</p>" + "</body>" + "</html>"; using (StreamWriter writer = new StreamWriter(fileName, false)) { writer.Write(textToAdd); } System.Diagnostics.Process.Start(fileName); // MessageBox.Show("Informe generado correctamente", "Informe"); } else { MessageBox.Show("Eliga una clase y método primero", "Error"); } }
private void cambioMetodoSeleccionado(object sender, EventArgs e) { Metodo metodo = (Metodo)listBox1.SelectedItem; List <Metodo> metodosTotales = new List <Metodo>(); foreach (Metodo item in listBox1.Items) { metodosTotales.Add(item); } //richTextBox1.Clear(); this.txtCodigo.ResetText(); if (metodo != null) { /*for (int i = 0; i < metodo.obtenerCantidadLineas(); i++) * richTextBox1.AppendText(metodo.obtenerLinea(i) + "\n");*/ //richTextBox1.AppendText(metodo.ToString()); this.txtCodigo.Text = metodo.getCodigoToPrint(); } if (metodo != null) { // Calcular complejidad ciclomática. lblCiclomatica.Text = calcularComplejidadCiclomatica(metodo.getLineasMetodo()).ToString(); // Calcular cantidad de comentarios. int lineasDeCodigo = getCantidadDeLineasNoComentadas(metodo.getLineasMetodo()); int cantidadComentarios = calcularComentarios(metodo.getLineasMetodo()); lblComentarios.Text = cantidadComentarios.ToString() + "/" + lineasDeCodigo.ToString() + //metodo.obtenerCantidadLineas().ToString() + " ( " + (((float)cantidadComentarios / lineasDeCodigo) * 100).ToString() + "% )"; // Calcular Fan In. lblFanIn.Text = calcularFanIn(metodo, metodosTotales).ToString(); // Calcular Fan Out. lblFanOut.Text = calcularFanOut(metodo.getLineasMetodo()).ToString(); // Calcular medidas Halstead. MetricaHalstead medidasHalstead = calcularLongitudVolumen(metodo.getLineasMetodo()); lblLongitud.Text = medidasHalstead.getLongitud().ToString() + " ( Operadores: " + medidasHalstead.getCantidadOperadores().ToString() + " - Operandos: " + medidasHalstead.getCantidadOperandos() + " )"; lblVolumen.Text = medidasHalstead.getVolumen().ToString(); string operadores = ""; foreach (string operador in medidasHalstead.getOperadores()) { if (operador == "&&") { operadores += "&&&&"; } else { operadores += operador.ToString(); } operadores += " , "; } lblOperadores.Text = operadores; } }
public int calcularFanIn(Metodo metodoActual, List <Metodo> metodosTotales) { int fanIn = 0; Console.WriteLine("entro fanin"); bool enComentarioMultilinea = false; foreach (Metodo metodo in metodosTotales) { Console.WriteLine("leo metodo" + metodo.ToString()); foreach (String linea in metodo.getLineasMetodo()) { bool lineaContada = false; bool enComillas = false; for (int i = 0; i < linea.Length - 1; i++) { if (tieneComillas(linea, i)) { enComillas = !enComillas; } if (enComillas) { continue; } if (!lineaContada && !enComillas && tieneComentario(linea, i)) { lineaContada = true; continue; } if (!enComentarioMultilinea && arrancaComentarioMultilinea(linea, i)) { enComentarioMultilinea = true; } if (enComentarioMultilinea && !lineaContada) { lineaContada = true; } if (terminaComentarioMultilinea(linea, i)) { enComentarioMultilinea = false; } } //matchDeclaracion = patronDeclaracion.matcher(linea); //matchPalabraReservada = patronesPalabraReservada.matcher(linea); if (!enComentarioMultilinea && !enComillas) { String[] datos1 = linea.Split(metodoActual.ToString().ToArray()); if (linea.Contains(metodoActual.ToString()) && metodo.ToString() != metodoActual.ToString()) { fanIn++; } } } } return(fanIn); }
private List <Metodo> obtenerMetodos(String[] lineasArchivo) { //string regexp = "^\\s*(public|private|protected|public static){1}\\s+(void|int|double|boolean|float|char|([A-Z]{1}[a-z]*)*){1}\\s+([a-z]*([A-Z]{1}[a-z]*)*)\\s*\\({1}.*"; string regexp = "((public|private|protected|static|final|native|synchronized|abstract|transient)+\\s)+[\\$_\\w\\<\\>\\[\\]]*\\s+[\\$_\\w]+\\([^\\)]*\\)?\\s*\\{?[^\\}]*\\}?"; string ctorRegExp = "(public|protected|private|static|\\s)\\s+(\\w+) *\\([^\\)]*\\) *(\\{?|[^;])"; Regex p = new Regex(regexp, RegexOptions.IgnoreCase); Match m; Regex p2 = new Regex(ctorRegExp, RegexOptions.IgnoreCase); Match m2; List <Metodo> metodos = new List <Metodo>(); bool enComentarioMultilinea = false; bool enMetodo = false; int cantidadLlaves = 0; int indiceDelUltimoComentario = 1; int indiceComienzoMetodo = 0; /*String linea : lineasArchivo*/ for (int j = 0; j < lineasArchivo.Length; j++) { bool lineaContada = false; bool enComillas = false; m = p.Match(lineasArchivo[j]); m2 = p2.Match(lineasArchivo[j]); if (m.Success && !enMetodo && !enComentarioMultilinea && !enComillas) { enMetodo = true; Console.WriteLine("Metodo Encontrado" + lineasArchivo[j]); indiceComienzoMetodo = j; } /*else if (m2.Success && !enMetodo && * !enComentarioMultilinea && * !enComillas) * { * enMetodo = true; * Console.WriteLine("Metodo Encontrado" + lineasArchivo[j]); * indiceComienzoMetodo = j; * }*/ if (enMetodo) { for (int i = 0; i < lineasArchivo[j].Length; i++) { if (abreLlave(lineasArchivo[j], i)) { cantidadLlaves++; } if (cierraLlave(lineasArchivo[j], i) && cantidadLlaves > 0) { cantidadLlaves--; Console.WriteLine("cuento linea que cierra"); if (cantidadLlaves == 0) { String nombreDelMetodo = ""; String[] datos = lineasArchivo[indiceComienzoMetodo].Split(' '); foreach (string dato in datos) { if (dato.Contains('(') && nombreDelMetodo == "") { nombreDelMetodo = dato.Split('(')[0]; } } if (indiceDelUltimoComentario != 0) { if (hayJavaDoc(indiceDelUltimoComentario, indiceComienzoMetodo, lineasArchivo)) { List <String> lineasMetodo = new List <String>(); for (int z = indiceDelUltimoComentario; z <= j + 1; z++) { lineasMetodo.Add(lineasArchivo[z]); } Metodo aux = new Metodo(lineasMetodo.ToArray(), nombreDelMetodo); metodos.Add(aux); Console.WriteLine("Creo Metodo " + nombreDelMetodo); enMetodo = false; cantidadLlaves = 0; } else { List <String> lineasMetodo = new List <String>(); for (int z = indiceComienzoMetodo; z <= j + 1; z++) { lineasMetodo.Add(lineasArchivo[z]); } Metodo aux = new Metodo(lineasMetodo.ToArray(), nombreDelMetodo); metodos.Add(aux); Console.WriteLine("Creo Metodo " + nombreDelMetodo); enMetodo = false; cantidadLlaves = 0; } } } } } } else { for (int i = 0; i < lineasArchivo[j].Length - 1; i++) { if (tieneComillas(lineasArchivo[j], i)) { enComillas = !enComillas; } if (enComillas) { continue; } if (!lineaContada && !enComillas && tieneComentario(lineasArchivo[j], i)) { indiceDelUltimoComentario = j; lineaContada = true; continue; } if (!enComentarioMultilinea && arrancaComentarioMultilinea(lineasArchivo[j], i)) { enComentarioMultilinea = true; indiceDelUltimoComentario = j; } if (enComentarioMultilinea && !lineaContada) { lineaContada = true; } if (terminaComentarioMultilinea(lineasArchivo[j], i)) { enComentarioMultilinea = false; } } } } return(metodos); }