création de tests pour les redirections I/O + amélioration du code

This commit is contained in:
2025-03-14 23:25:57 +01:00
parent 6478a042ee
commit 31e32c825c
4 changed files with 133 additions and 7 deletions

View File

@@ -205,6 +205,7 @@ public class BakefileParser {
public List<Rule> parse() {
List<Rule> rules = new ArrayList<>();
Set<String> phonyTargets = new HashSet<>();
List<String> allTargetNames = new ArrayList<>(); // Pour suivre l'ordre des cibles
if (!Files.exists(Paths.get(filename))) {
System.out.println("*** No targets specified and no bakefile found. Stop.");
@@ -217,6 +218,18 @@ public class BakefileParser {
List<String> dependencies = new ArrayList<>();
List<String> commands = new ArrayList<>();
// Première passe : collecter toutes les cibles PHONY
for (String line : lines) {
if (line.trim().isEmpty()) continue;
Matcher phonyMatcher = PHONY_PATTERN.matcher(line);
if (phonyMatcher.matches()) {
String[] phonies = phonyMatcher.group(1).trim().split("\\s+");
Collections.addAll(phonyTargets, phonies);
}
}
// Deuxième passe : analyser les règles en tenant compte des PHONY
for (int i = 0; i < lines.size(); i++) {
String line = lines.get(i);
@@ -247,8 +260,7 @@ public class BakefileParser {
Matcher phonyMatcher = PHONY_PATTERN.matcher(line);
if (phonyMatcher.matches()) {
String[] phonies = phonyMatcher.group(1).trim().split("\\s+");
Collections.addAll(phonyTargets, phonies);
// Déjà traité dans la première passe
continue;
}
@@ -271,9 +283,8 @@ public class BakefileParser {
phonyTargets.contains(resolvedTarget)
));
if (firstTarget == null && !phonyTargets.contains(resolvedTarget)) {
firstTarget = resolvedTarget;
}
// Enregistrer le nom de la cible pour suivre l'ordre
allTargetNames.add(resolvedTarget);
}
}
@@ -298,15 +309,32 @@ public class BakefileParser {
phonyTargets.contains(resolvedTarget)
));
if (firstTarget == null && !phonyTargets.contains(resolvedTarget)) {
firstTarget = resolvedTarget;
// Enregistrer le nom de la cible pour suivre l'ordre
allTargetNames.add(resolvedTarget);
}
}
// Définir la première cible (similaire à Make)
// Make prend la première cible non-PHONY, ou la première cible si toutes sont PHONY
if (!allTargetNames.isEmpty()) {
// Chercher d'abord une cible non-PHONY dans l'ordre d'apparition
for (String targetName : allTargetNames) {
if (!phonyTargets.contains(targetName)) {
firstTarget = targetName;
break;
}
}
// Si toutes les cibles sont PHONY, prendre simplement la première
if (firstTarget == null) {
firstTarget = allTargetNames.get(0);
}
}
} catch (IOException e) {
e.printStackTrace();
}
return rules;
}