logifix
v0.6.0
logifix是一種基於數據元的工具,用於自動在Java源代碼中固定靜態分析違規行為。 logifix可以用於修復靜態分析儀(例如Sonarqube,PMD或Spotbugs)的靜態分析違規行為,但也可以使舊版代碼現代化,甚至是自動執行特定於代碼庫的自定義規則。
為MACOS和基於GNU的Linux系統提供了預先構建和無依賴性二進製文件。
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 ,運行logifix --help以獲取幫助logifix是Java源代碼的分析引導的重寫系統。這意味著您定義(或使用預定義的)分析和轉換,這些分析和轉換都可以共同改進代碼。分析和轉換寫在高度聲明的基於邏輯的語言數據上,並由重寫引擎自動組合和鏈接。
logifix不僅僅是搜索和重複系統。它通過多個步驟執行重寫,可以通過在重寫圖中構建發音點來實現智能方程推理。
logifix在高性能數據方言中實現,該方言合成為多線程C ++代碼。即使在一個文件上工作時,它也是很大的平行,並且通常在幾秒鐘內在現代硬件上分析數千個文件的大型項目。如果您的項目緩慢地分析,則將其視為一個錯誤,您應該提交錯誤報告。
logifix設計為生產類似人類的貼片,這些貼片是通過設計即可合併的,而無需進行手動修改。
這是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());
} 請參閱文檔/預定義轉換。 md或源代碼SRC/規則。
是的!請參閱文檔/創建自己的轉換。
請參閱文檔/building.md。
如果您覺得這個項目很有趣,請務必查看這些項目: