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。
如果您觉得这个项目很有趣,请务必查看这些项目: