ข้ามไปยังเนื้อหา

การรองรับภาษาและความแม่นยำของ API

codeknit ดึงข้อมูลวากยสัมพันธ์โดยไม่ต้องรันคอมไพเลอร์ ประเมินมาโคร หรือโหลดการพึ่งพาของโปรเจ็กต์ เมทริกซ์ด้านล่างอธิบายโครงสร้างที่ผ่านการทดสอบ ไม่ใช่การปฏิบัติตามภาษาอย่างสมบูรณ์หรือการรับประกันการแก้ไขชื่อข้ามไฟล์

ทุกภาษามีการยืนยันพารามิเตอร์/ลายเซ็นการคืนค่าพื้นฐานที่แน่นอนใน internal/plugin/api_fidelity_test.go การครอบคลุมการประกาศยังถูกตรวจสอบใน internal/plugin/coverage_test.go และแพ็กเกจทดสอบภาษาแต่ละภาษา

ภาษา นามสกุลไฟล์ เกณฑ์ลายเซ็น การครอบคลุมการประกาศและคอนเทนเนอร์
C .c, .h พารามิเตอร์ที่มีชื่อและประเภทการคืนค่าในคำนิยามและโปรโตไทป์ สตรักต์ ยูเนียน เอนัม ไทป์เดฟ มาโคร; การประกาศภายในเฮดเดอร์การ์ด
C++ .cpp, .cc, .cxx, .hpp, .hxx, .h พารามิเตอร์ที่มีชื่อและประเภทการคืนค่าในฟังก์ชัน โปรโตไทป์ และการประกาศเมธอด คลาส สตรักต์ เมธอด เนมสเปซ เทมเพลต; เฮดเดอร์การ์ดและ wrapper extern "C"
C# .cs พารามิเตอร์ที่มีชื่อและประเภทที่ระบุ และประเภทการคืนค่าที่ชัดเจน คลาส สตรักต์ อินเตอร์เฟซ เมธอด ฟิลด์ เดлегаต เนมสเปซ
Go .go พารามิเตอร์แบบกลุ่ม ไม่มีชื่อ แบบ variadic แบบฟังก์ชัน และ generic; ผลลัพธ์ที่มีชื่อ/หลายผลลัพธ์; ผู้รับ generic ฟิลด์สตรักต์พร้อมประเภทและแท็ก ฟิลด์ที่ฝัง อินเตอร์เฟซลายเซ็นเมธอด พารามิเตอร์ประเภท แพ็กเกจ
Java .java พารามิเตอร์ที่มีชื่อและประเภทที่ระบุ และประเภทการคืนค่าที่ชัดเจน คลาส อินเตอร์เฟซ คอนสตรักเตอร์ เมธอด ฟิลด์ คลาสซ้อน เนมสเปซ
JavaScript .js, .jsx, .mjs, .cjs พารามิเตอร์ที่มีชื่อ; ไม่มีการอนุมานประเภทการคืนค่า ฟังก์ชัน ฟังก์ชันแบบลูกศร คลาส ฟิลด์ เมธอด การประกาศที่มี JSX
PHP .php พารามิเตอร์ที่มีชื่อและประเภทที่ระบุ และประเภทการคืนค่าที่ชัดเจน คลาส อินเตอร์เฟซ ทรেইท เอนัม เมธอด พร็อพเพอร์ตี เนมสเปซ
Python .py, .pyi การใส่คำอธิบายค่าเริ่มต้น *args, **kwargs, ตัวคั่นตำแหน่ง/คีย์เวิร์ด การใส่คำอธิบายการคืนค่า ฟังก์ชัน คลาส คลาสซ้อน เมธอดที่ตกแต่ง; ผู้รับที่ถูกผูกแบบเดิมถูกละเว้น
Ruby .rb พารามิเตอร์ที่มีชื่อ; ไม่มีการอนุมานประเภทการคืนค่า คลาส โมดูล เมธอดอินสแตนซ์/ซิงเกิลตัน ค่าคงที่
Rust .rs รูปแบบที่มีประเภท self/&self/&mut self การผูกที่เปลี่ยนแปลงได้ ประเภทการคืนค่าที่ชัดเจน โมดูลแบบอินไลน์และซ้อน ฟิลด์สตรักต์ที่มีชื่อ เมธอดทรেইทและเมธอดการนำไปใช้
Scala .scala, .sc พารามิเตอร์ที่มีชื่อและประเภทที่ระบุ และประเภทการคืนค่าที่ชัดเจน คลาส ทรেইท อ็อบเจ็กต์ เมธอด เอนัม เนมสเปซ
TypeScript .ts, .tsx, .mts, .cts พารามิเตอร์ที่มีชื่อและประเภทที่ระบุ และการใส่คำอธิบายการคืนค่า ฟังก์ชัน ฟังก์ชันแบบลูกศร อินเตอร์เฟซ คลาส ฟิลด์ เนมสเปซ; TSX ใช้ไวยากรณ์ของตนเอง

คำสั่ง CLI ที่ประมวลผลซอร์สทั้งหมดยอมรับ --header-language c|cpp ตัวเลือกนี้ใช้กับไฟล์ .h เท่านั้น นามสกุลอื่น ๆ ยังคงใช้ตัวแยกวิเคราะห์ตามปกติ

Terminal window
codeknit parse ./src --header-language cpp
codeknit fingerprint ./src --header-language c
codeknit graph analyze ./src --header-language cpp

ค่าเริ่มต้นคือ c เพื่อรักษาการดึงมาโคร ไทป์เดฟ และยูเนียนของ C ใช้ cpp สำหรับเฮดเดอร์ C++ ที่ตั้งชื่อ .h; ไฟล์ที่ตั้งชื่อ .hpp และ .hxx ใช้ C++ อยู่แล้ว ตัวเลือกนี้ชัดเจนเพราะไวยากรณ์ทั้งสองสามารถยอมรับไวยากรณ์ของอีกภาษาหนึ่งได้โดยไม่ดึงโครงสร้างทั้งหมด

เฮดเดอร์การ์ดและเงื่อนไขแบบมีเงื่อนไขถูกตรวจสอบโดยไม่ประเมินเงื่อนไข ผลลัพธ์จึงอาจรวมการประกาศจากสาขาที่กันไม่ให้ใช้งาน การขยายมาโคร การแก้ไขอินคลูด และแฟล็กการสร้างไม่ถูกนำมาใช้ UI แสดงผลการเลือก C เริ่มต้นสำหรับไฟล์ .h

ตัวอย่างเช่น Go:

func Pair(a, b int, rest ...string) (string, error)

สร้างผลลัพธ์เป็น:

Pair(a: int, b: int, rest: ...string) -> (string, error)

เมธอดอินเตอร์เฟซของ Go และฟิลด์ที่มีชื่อของ Go/Rust ปรากฏเป็นสัญลักษณ์ในทั้งโหมดปกติและโหมด fingerprint เมธอดและฟิลด์ยังคงรักษาประเภทที่เป็นเจ้าของ โมดูล Rust ที่ซ้อนกันยังคงรักษาชื่อที่มีคุณสมบัติ เช่น service.storage.read รวมถึงเมื่อโมดูลอื่นประกาศฟังก์ชันที่มีชื่อเดียวกัน

Rust อนุญาตให้ฟิลด์และเมธอดมีชื่อเดียวกัน ชื่อที่มีขอบเขตของฟิลด์มีคำต่อท้าย #field ภายในเพื่อให้ ID และเส้นเชื่อมการบรรจุยังคงแตกต่างกัน ชื่อที่แสดงและลายเซ็นยังคงรักษาชื่อฟิลด์เดิม

ลายเซ็น Python ยังคงรักษาการใส่คำอธิบาย ค่าเริ่มต้น สแปลต และตัวคั่นการเรียกใช้ พารามิเตอร์ self หรือ cls แรกแบบเดิมถูกละเว้นจากเมธอดที่ถูกผูก แต่ยังคงรักษาไว้ในฟังก์ชันอิสระหรือเมธอดสแตติก

ลายเซ็นหลายบรรทัดยังคงรักษาการขึ้นบรรทัดใหม่ของซอร์สใน JSON SKT แปลงการขึ้นบรรทัดใหม่เป็น \n และ \r เพื่อให้แต่ละสัญลักษณ์อยู่ในบรรทัดเอาต์พุตเดียว

ความสัมพันธ์ยังคงรักษาการระบุผู้รับและการเป็นเจ้าของทางศัพท์ การนำเข้าแบบสัมพัทธ์และการนำเข้าที่เปลี่ยนชื่อของ JavaScript/TypeScript และ Python ให้บริบทเป้าหมาย การประกาศแพ็กเกจของ Go และ Java สามารถแก้ไขข้ามไฟล์ในไดเรกทอรีเดียวกัน การนำเข้าที่ไม่ตรงกันจะไม่กลับไปใช้การประกาศที่ไม่เกี่ยวข้อง และผู้สมัครที่แข่งขันกันยังคงคลุมเครือ

การผูกผู้รับในเครื่องมีความสำคัญเหนือการนำเข้าเนมสเปซ รวมถึงเมื่อพารามิเตอร์บดบังเนมสเปซที่นำเข้า การนำเข้าแพ็กเกจ Python พิจารณาการประกาศในโมดูล __init__ ของแพ็กเกจ ไม่ใช่โมดูลลูกหลานโดยพลการ การส่งออกซ้ำที่ไม่สามารถระบุได้จากโมดูลนั้นยังคงไม่ได้รับการแก้ไข

การดึงข้อมูลที่เรียกใช้ได้ของ Java, C++, C#, Scala และ TypeScript ยังคงรักษาช่วงไบต์การประกาศเพื่อให้ร่างกายที่โอเวอร์โหลดสามารถมีผู้เรียกและขอบเขตนามแฝงที่แตกต่างกัน รวมถึงการประกาศในบรรทัดเดียวกัน การเลือกเป้าหมายที่โอเวอร์โหลดยังคงเป็นไปอย่างระมัดระวัง ความสัมพันธ์การแทนที่อย่างชัดเจนใน Java, C++, C#, Scala และ TypeScript มองหาการประกาศที่สืบทอดที่ใกล้ที่สุด การขาดฐาน วนรอบ หรือผู้สมัครที่แข่งขันกันยังคงรักษาความไม่แน่นอนแทนที่จะสร้างการเชื่อมโยงตัวเอง

นี่คือการวิเคราะห์ตามวากยสัมพันธ์ ไม่ใช่คอมไพเลอร์หรือกราฟการเรียกใช้งานในระหว่างรันไทม์ ตัวระบุแพ็กเกจ JavaScript แบบเปลือย การส่งออกซ้ำของแพ็กเกจ การกำหนดค่าการสร้าง ประเภทผู้รับที่ซับซ้อน และการส่งต่อแบบไดนามิกอาจยังคงไม่ได้รับการแก้ไข ชื่อที่ไม่ซ้ำกันที่อื่นในที่เก็บไม่เพียงพอที่จะเป็นหลักฐานของการพึ่งพา

JSON ยังคงรักษาเส้นเชื่อมที่ไม่แน่นอนด้วย resolution: "unresolved" หรือ "ambiguous" และรวม ID ผู้สมัครเมื่อมีอยู่ เส้นเชื่อมเหล่านี้ไม่มี ShortID เป้าหมาย

SKT ใช้สัญกรณ์เส้นเชื่อมเดียวกันสำหรับความสัมพันธ์ทั้งหมด พร้อมเครื่องหมายการแก้ไขที่เป็นทางเลือก:

S8 --references--> S5
S10 --references[unresolved]--> string, bool
S11 --calls[ambiguous]--> Helper [candidates=S12, S15]

ปลายทางและผู้สมัครที่ทราบใช้ ShortID รวมถึงปลายทางของความสัมพันธ์ที่ไม่ได้รับการแก้ไข เป้าหมายที่ไม่แน่นอนแบบเปลือยที่ไม่มีสัญลักษณ์เป็นชื่อที่สัมพันธ์กับไฟล์ต้นทาง ชื่อตามตัวอักษรที่ดูเหมือน ShortID และตัวตนที่ซับซ้อนอื่น ๆ ใช้ ID เต็มที่มีเครื่องหมายคำพูดเพื่อหลีกเลี่ยงความคลุมเครือ เส้นเชื่อมที่มีแหล่งที่มา ประเภท การแก้ไข และชุดผู้สมัครเดียวกันใช้รายการเป้าหมายเดียวกัน ตัวอ่าน SKT ยังคงรักษาการแก้ไขและผู้สมัคร รวมถึงการอ้างอิงถึงสัญลักษณ์ในชิ้นเอาต์พุตในภายหลัง เอาต์พุตที่ย่อให้เล็กสุดเข้ารหัสประเภทความสัมพันธ์ในขณะที่ยังคงให้เครื่องหมายการแก้ไขอ่านได้

C/C++ รวมถึงมีสัญลักษณ์ meta/file และ meta/include อย่างชัดเจน การสะกดเฮดเดอร์ปรากฏครั้งเดียวในรายการสัญลักษณ์; เส้นเชื่อมใช้ ShortID ของพวกมัน:

[symbols]
## src/main.c
S1 meta/file L1-L4 main.c
S2 meta/include L1-L1 "config.h" {resolution=unresolved}
S3 meta/include L2-L2 "utils.h" {resolution=unresolved}
S4 meta/include L3-L3 <stdio.h> {resolution=unresolved}
[edges]
S1 --references[unresolved]--> S2, S3, S4

สัญลักษณ์อินคลูดอธิบายคำสั่งที่เขียน ไม่ใช่การประกาศเฮดเดอร์ที่ได้รับการแก้ไข การอินคลูดซ้ำภายในไฟล์ใช้ปลายทางเดียวกัน ข้อมูลเมตาไฟล์/อินคลูดถูกยกเว้นจากการจัดอันดับการพึ่งพาและการค้นหาโค้ดที่ตายแล้ว การเพิ่ม ID ไม่ได้หมายความว่าเฮดเดอร์ถูกพบผ่านการกำหนดค่าการค้นหาอินคลูดของคอมไพเลอร์

เมตริกการพึ่งพาและลิงก์กราฟ HTML ใช้เฉพาะเส้นเชื่อมที่ได้รับการแก้ไข รายงานแสดงจำนวนความสัมพันธ์ที่ถูกยกเว้น และกราฟ HTML แสดงจำนวนความไม่แน่นอน fan-in และ fan-out นับเพื่อนบ้านที่แตกต่างกัน การวิเคราะห์การสืบทอดพิจารณาฐานและอินเตอร์เฟซทั้งหมด; การสืบทอดแบบวนรอบไม่มีความลึกที่รายงาน การเข้าถึงเริ่มต้นจาก callable ที่มีชื่อ main, Main หรือ init และตามเส้นเชื่อมการพึ่งพา การเข้าถึงสมาชิกทำให้คอนเทนเนอร์ของมันเกี่ยวข้องโดยไม่ทำให้พี่น้องทุกคนสามารถเข้าถึงได้ หากไม่มีจุดเข้าที่รู้จัก การค้นหาการเข้าถึงจะถูกละเว้น

อาร์กิวเมนต์ callback และ callable ที่ถูกส่งกลับเป็นการอ้างอิง ไม่ใช่หลักฐานการเรียกใช้ การแก้ไขนามแฝงยังคงรักษาไฟล์ ฟังก์ชัน และตัวตนของอ็อบเจ็กต์ การกำหนดที่ขัดแย้งกันยังคงไม่แน่นอน ผลการวิเคราะห์กราฟเป็นผู้สมัครในการตรวจสอบ: ผู้เรียกภายนอกและพฤติกรรมแบบไดนามิกสามารถเปลี่ยนผลลัพธ์ได้ กฎเลเยอร์ตามไดเรกทอรีและน้ำหนักการแพร่กระจายการเปลี่ยนแปลงเป็นฮิวริสติกส์ ไม่ใช่ความน่าจะเป็นที่วัดได้

  • ตัวประกาศตัวชี้ การอ้างอิง อาร์เรย์ และฟังก์ชันพอยน์เตอร์ของ C/C++ ที่ซับซ้อนอาจยังคงมีลายเซ็นที่ไม่สมบูรณ์ การประกาศที่สร้างจากมาโครไม่ถูกขยาย
  • การจัดการคอนสตรักเตอร์ของ TypeScript/JavaScript และรูปแบบพารามิเตอร์บางรูปแบบที่เป็นตัวเลือก พัก หรือทำลายโครงสร้างยังไม่สมบูรณ์
  • ข้อจำกัด generic ขั้นสูงและรูปแบบประเภทนอกกรณีที่ทดสอบแล้วแตกต่างกันไปตามภาษา ประเภทการคืนค่าไม่ถูกอนุมาน
  • มาโครของ Rust ไม่ถูกขยาย การประกาศโมดูลนอกบรรทัดถูกบันทึก; ไฟล์ของพวกมันต้องถูกรวมไว้ในการสแกน ฟิลด์ทูเพิล รายละเอียดตัวแปร enum และรายการที่เกี่ยวข้องมีการครอบคลุมบางส่วน
  • การดึงข้อมูลวากยสัมพันธ์ไม่ได้แก้ไขการส่งต่อแบบไดนามิก โอเวอร์โหลด การนำเข้าการพึ่งพา หรือความหมายการกำหนดค่าการสร้างด้วยความแม่นยำของคอมไพเลอร์
  • ข้อผิดพลาดทางวากยสัมพันธ์บางส่วนอาจยังคงละเว้นการประกาศ ตรวจสอบคำเตือนที่รายงานและตรวจสอบซอร์สก่อนใช้การปรับโครงสร้างใหม่

การดึงข้อมูลที่สมบูรณ์ยิ่งขึ้นเปลี่ยนจำนวนสัญลักษณ์และ ShortID สร้างเอาต์พุตโครงร่างที่มีอยู่ใหม่เมื่ออัปเกรดแทนที่จะผสมกับเอาต์พุตเก่า