Logifix هي أداة تعتمد على DataLog لتثبيت انتهاكات التحليل الثابت تلقائيًا في كود مصدر Java. يمكن استخدام Logifix لإصلاح انتهاكات التحليل الثابت للمحللين الثابتة مثل Sonarqube أو PMD أو Spotbugs ، ولكن أيضًا لتحديث التعليمات البرمجية القديمة أو حتى لفرض قواعد مخصصة تلقائيًا على قاعدة التعليمات البرمجية الخاصة بك.
يتم توفير الثنائيات المسبقة للاعتماد على أنظمة Linux المستندة إلى MACOS وأنظمة Linux المستندة إلى 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 في المحطة الخاصة بك ، قم بتشغيل logifix --help للحصول على مساعدة Logifix هو نظام إعادة كتابة موجه تحليلًا لرمز مصدر Java. هذا يعني أنك تحدد (أو تستخدم محددًا مسبقًا) التحليلات والتحولات التي تعمل جميعًا معًا لتحسين التعليمات البرمجية الخاصة بك. تتم كتابة التحليلات والتحولات في DataLog اللغوية القائمة على المنطق للغاية ويتم دمجها وتوصيلها تلقائيًا بواسطة محرك إعادة كتابة.
Logifix هو أكثر من نظام البحث والاستبدال. إنه يؤدي إعادة كتابة في خطوات متعددة ويمكنه تحقيق التفكير المعادن الذكي من خلال بناء نقاط التعبير في الرسم البياني لإعادة كتابة.
يتم تنفيذ Logifix في لهجة Datalog عالية الأداء يتم تصنيعها في رمز 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/القواعد.
نعم! انظر المستندات/إنشاء التحويلات الخاصة بك.
انظر المستندات/البناء.
إذا وجدت هذا المشروع مثيرًا للاهتمام ، فتأكد من مراجعة هذه المشروع أيضًا: