On se retrouve aujourd'hui pour la solution du précédent #KataOfTheWeek proposé par Julien en début de semaine !

On a là un classique problème de compilation, même si on le simplifie pour éviter que ce soit le bazar. Comme tout problème de compilation le mieux est de passer par une machine à état.

Un point très important est qu'il faut considérer que les lignes contiennent toutes des espaces avant et après.

Comme on peut le voir la solution n'est pas des plus sympathiques et est un joli cas de TDD. Pour les masochistes vous pouvez tenter le Kata complet (ci-dessus), il est super à découvrir !

private boolean isSingleLineComment(String line) {
   return line.startsWith("//");
}

private boolean isMultiLineCommandStart(String line) {
   return line.startsWith("/*");
}

private boolean isMultiLineCommandEnd(String line) {
   return line.endsWIth("*/");
}

// Le bufferedreader contient la méthode readLine(), très sympa.
public int countLines(BufferedReader br) {
   int res = 0;
   String line = br.readLine();

   // C'est notre marqueur d'état.
   bool isInComment = false;

   while (line != null) {

      // très important de virer les espaces !
      line = line.trim();

      // piège : on est dans un commentaire sur une ligne qui commence par //
      if (!isSingleLineComment(line) && !isInComment) {
         isInComment = isMultiLineCommandStart(line);
         // Là ça devient sioux : on ne compte la ligne que si on n'est pas dans un commentaire... et si la ligne n'est pas vide
         if (!isInComment && !line.isEmpty()) {
            res++;
         } 
      }
      // surtout pas de else ici, on peut avoir un commentaire qui se termine sur la même ligne que là où il a commencé.
      if (isInComment) {
         isInComment = !isMultiLineCommandEnd(line);
      }

      line = br.readLine();
   }

   return res;
}

A bientôt pour un nouveau #KataOfTheWeek !