Logifix est un outil basé sur des dats pour corriger automatiquement les violations d'analyse statique dans le code source Java. Logifix peut être utilisé pour corriger les violations d'analyse statique pour les analyseurs statiques tels que Sonarqube, PMD ou SpotBugs, mais aussi pour moderniser le code hérité ou même pour appliquer automatiquement des règles personnalisées spécifiques à votre base de code.
Des binaires prédéfinis et sans dépendance sont fournis pour les systèmes Linux à base de macOS et GNU.
curl -L https://github.com/lyxell/logifix/releases/latest/download/logifix-x86_64-linux-gnu.gz | gunzip -c - > /tmp/logifix
chmod +x /tmp/logifix
sudo mv /tmp/logifix /usr/local/bincurl -L https://github.com/lyxell/logifix/releases/latest/download/logifix-x86_64-macos.gz | gunzip -c - > /tmp/logifix
chmod +x /tmp/logifix
sudo mv /tmp/logifix /usr/local/binlogifix path/to/your/project dans votre terminal, exécutez logifix --help pour obtenir de l'aide Logifix est un système de réécriture guidé par l'analyse pour le code source Java. Cela signifie que vous définissez (ou utilisez des analyses et des transformations prédéfinies) qui fonctionnent tous ensemble pour améliorer votre code. Les analyses et les transformations sont écrites dans le désir de langue basé sur la logique hautement déclarative et sont combinées et enchaînées automatiquement par le moteur de réécriture.
Logifix est plus qu'un système de recherche et de repensation. Il effectue des réécritures en plusieurs étapes et peut réaliser un raisonnement équilibré intelligent en construisant des points d'articulation dans le graphique de réécriture.
Logifix est implémenté dans un dialecte de datalog haute performance qui est synthétisé en code C ++ multithread. Il est fortement parallélisé même lorsqu'il travaille sur un seul fichier et analyse généralement de grands projets de milliers de fichiers en quelques secondes sur le matériel moderne. Si votre projet est lent à analyser, il est considéré comme un bogue et vous devez déposer un rapport de bogue.
Logifix est conçu pour produire des correctifs de type humain qui sont prêts à l'emploi par conception sans nécessiter de modifications manuelles.
Voici quelques exemples de correctifs générés par Logifix.
public static void sign(String token, Map<String, String> params) {
List<String> list = new ArrayList();
String tokenClientSlat = "";
- for (String key : params.keySet()) {
+ for (Map.Entry<String, String> entry : params.entrySet()) {
+ String key = entry.getKey();
if (key.equals("token_client_salt")) {
- tokenClientSlat = params.get(key);
+ tokenClientSlat = entry.getValue();
}
- String paramString = key + "=" + params.get(key);
+ String paramString = key + "=" + entry.getValue();
list.add(paramString);
}
Collections.sort(list); continue;
}
- try {
- JarFile nextJarFile = new JarFile(absNextFile);
- try {
- Attributes attrs = getMainAttrs(nextJarFile);
- Set<Extension> newExtensions = getReferencedExtensions(attrs);
- result.addAll(newExtensions);
- filesToProcess.addAll(extensionsToFiles(newExtensions));
- } finally {
- nextJarFile.close();
- }
+ try (JarFile nextJarFile = new JarFile(absNextFile)) {
+ Attributes attrs = getMainAttrs(nextJarFile);
+ Set<Extension> newExtensions = getReferencedExtensions(attrs);
+ result.addAll(newExtensions);
+ filesToProcess.addAll(extensionsToFiles(newExtensions));
} catch (Exception e) {
invalidLibPaths.append(nextFile.getPath()).append(" ");
} private final Map<Class<?>, String> requestQueueNameCache = new ConcurrentHashMap<>();
public String getRequestQueueName(Class<?> remoteInterface) {
- String str = requestQueueNameCache.get(remoteInterface);
- if (str == null) {
- str = "{" + name + ":" + remoteInterface.getName() + "}";
- requestQueueNameCache.put(remoteInterface, str);
- }
- return str;
+ return requestQueueNameCache.computeIfAbsent(remoteInterface, k -> "{" + name + ":" + k.getName() + "}");
} @Override
public List<SpoonFile> getAllJavaFiles() {
- List<SpoonFile> result = new ArrayList<>();
-
- for (SpoonFile f : getAllFiles()) {
- if (f.isJava()) {
- result.add(f);
- }
- }
-
- return result;
+ return getAllFiles().stream().filter(SpoonFile::isJava).collect(Collectors.toList());
} Voir docs / prédéfini-transformations.md ou le code source src / règles.
Oui! Voir Docs / Création de votre propre transformation.md.
Voir Docs / Building.Md.
Si vous trouvez ce projet intéressant, assurez-vous de les consulter également: