Cycle Finder الأداة

الاستخدام

فيما يلي مثال بسيط بدورة بين فئتين، هما Foo وBar.

cat Foo.java
package mypkg;
public class Foo {
  Bar myBar;
}

cat Bar.java
package mypkg;
public class Bar {
  Foo myFoo;
}

cycle_finder Foo.java Bar.java
acceptAST: mypkg/Bar.java
acceptAST: mypkg/Foo.java

***** Found reference cycle *****
Bar -> (field myFoo with type Foo)
Foo -> (field myBar with type Bar)
----- Full Types -----
Lmypkg/Bar;
Lmypkg/Foo;

1 CYCLES FOUND.

في الإخراج، سترى أولاً acceptAST لكل ملف JavaScript يتم تحليله. هذا مجرد تسجيل لمعلومات.

لكل دورة، ستكون هناك طباعة قائمتين. تحتوي القائمة الأولى على وصف للدورة. يدرج كل سطر حافة في الرسم البياني المرجعي. سيعرض وصف الحافة نوع الأصل متبوعًا بوصف لكيفية إشارة نوع المصدر إلى النوع المستهدف.

تعرض القائمة الثانية، ضمن Full Types، مفاتيح النوع الفريد لكل نوع في الدورة. هذا مفيد لأنه يوفر الحزمة الكاملة من كل نوع.

إيقاف القوائم

لن تتطلب بعض الدورات التي تم اكتشافها أي إجراء تصحيحي. قد يرجع ذلك إلى أنّ الدورة تحتوي على عناصر طويلة الأمد لا تحتاج إلى تحديد موقعها. أو قد تكتشف الأداة دورة نظرية استنادًا إلى أنواع بعض الحقول التي يكون من الممكن أن تثبت فيها أن الكائنات المعنية لن تشكل دورة مطلقًا. وفي هذه الحالات، يمكننا استخدام ملفات قوائم الإيقاف لعدم الإبلاغ عن هذه الدورات.

تقبل الأداة ملفات قوائم الإيقاف باستخدام الخيار --suppress-list. ملفات قوائم المنع هي ملفات نصية عادية تحتوي على إدخالات من سطر واحد. قد يتخذ إدخال القائمة القمعية أحد الأشكال الأربعة الموضحة في المثال أدناه. عند إضافة إدخالات قائمة الإيقاف، ننصحك بأن تكون محددًا قدر الإمكان لتجنُّب إيقاف دورة مشروعة. يمكن إضافة التعليقات باستخدام الحرف "#".

# Specifies that "fieldA" in ClassA will not refer to any object that is a subtype of ClassB.
FIELD my.pkg.ClassA.fieldA my.pkg.ClassB

# Suppresses all cycles containing "fieldA" in ClassA.
FIELD my.pkg.ClassA.fieldA

# Suppresses all cycles containing any field of ClassA.
TYPE my.pkg.ClassA

# Suppress all cycles containing the Inner's outer reference to ClassA.
OUTER my.pkg.ClassA.Inner

# Suppress all cycles containing the outer reference from an anonymous class declared in myMethod.
OUTER my.pkg.ClassA.myMethod.$

# Suppresses all cycles containing any type in package "my.pkg".
NAMESPACE my.pkg