Logifix es una herramienta basada en datos para corregir automáticamente las violaciones de análisis estático en el código fuente de Java. LOGIFIX se puede utilizar para corregir violaciones de análisis estáticos para analizadores estáticos como Sonarqube, PMD o Spotbugs, pero también para modernizar el código heredado o incluso para hacer cumplir automáticamente las reglas personalizadas específicas para su base de código.
Se proporcionan binarios previos y sin dependencia para los sistemas Linux basados en MacOS y Linux basados en 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 en su terminal, ejecute logifix --help para obtener ayuda Logifix es un sistema de reescritura guiada por análisis para el código fuente Java. Esto significa que define (o usa los análisis y transformaciones predefinidas) que todos trabajan juntos para mejorar su código. Los análisis y transformaciones se escriben en el altamente declarativo DataLog de lenguaje lógico y son combinados y encadenados automáticamente por el motor de reescritura.
Logifix es más que un sistema de búsqueda y reemplazo. Realiza reescrituras en múltiples pasos y puede lograr un razonamiento equitativo inteligente al construir puntos de articulación en el gráfico de reescritura.
LOGIFIX se implementa en un dialecto de datos de alto rendimiento que se sintetiza en un código C ++ multiproceso. Está muy paralelo incluso cuando se trabaja en un solo archivo y generalmente analiza grandes proyectos de miles de archivos en unos pocos segundos en el hardware moderno. Si su proyecto tarda en analizar, se considera un error y debe presentar un informe de error.
Logifix está diseñado para producir parches de forma humana que están listos para la fusión por diseño sin requerir modificaciones manuales.
Aquí hay algunos ejemplos de parches generados por 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());
} Consulte Docs/Transformaciones predefinidas.md o el código fuente SRC/Reglas.
¡Sí! Ver Docs/Creación de tu propia Trayformations.md.
Ver docs/edificio.md.
Si encuentra interesante este proyecto, asegúrese de verlos también: