การรองรับภาษาและความแม่นยำของ 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 เท่านั้น นามสกุลอื่น ๆ ยังคงใช้ตัวแยกวิเคราะห์ตามปกติ
codeknit parse ./src --header-language cppcodeknit fingerprint ./src --header-language ccodeknit graph analyze ./src --header-language cppค่าเริ่มต้นคือ c เพื่อรักษาการดึงมาโคร ไทป์เดฟ และยูเนียนของ C ใช้ cpp สำหรับเฮดเดอร์ C++ ที่ตั้งชื่อ .h; ไฟล์ที่ตั้งชื่อ .hpp และ .hxx ใช้ C++ อยู่แล้ว ตัวเลือกนี้ชัดเจนเพราะไวยากรณ์ทั้งสองสามารถยอมรับไวยากรณ์ของอีกภาษาหนึ่งได้โดยไม่ดึงโครงสร้างทั้งหมด
เฮดเดอร์การ์ดและเงื่อนไขแบบมีเงื่อนไขถูกตรวจสอบโดยไม่ประเมินเงื่อนไข ผลลัพธ์จึงอาจรวมการประกาศจากสาขาที่กันไม่ให้ใช้งาน การขยายมาโคร การแก้ไขอินคลูด และแฟล็กการสร้างไม่ถูกนำมาใช้ UI แสดงผลการเลือก C เริ่มต้นสำหรับไฟล์ .h
การรักษารูปแบบ API
หัวข้อที่มีชื่อว่า “การรักษารูปแบบ API”ตัวอย่างเช่น 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--> S5S10 --references[unresolved]--> string, boolS11 --calls[ambiguous]--> Helper [candidates=S12, S15]ปลายทางและผู้สมัครที่ทราบใช้ ShortID รวมถึงปลายทางของความสัมพันธ์ที่ไม่ได้รับการแก้ไข เป้าหมายที่ไม่แน่นอนแบบเปลือยที่ไม่มีสัญลักษณ์เป็นชื่อที่สัมพันธ์กับไฟล์ต้นทาง ชื่อตามตัวอักษรที่ดูเหมือน ShortID และตัวตนที่ซับซ้อนอื่น ๆ ใช้ ID เต็มที่มีเครื่องหมายคำพูดเพื่อหลีกเลี่ยงความคลุมเครือ เส้นเชื่อมที่มีแหล่งที่มา ประเภท การแก้ไข และชุดผู้สมัครเดียวกันใช้รายการเป้าหมายเดียวกัน ตัวอ่าน SKT ยังคงรักษาการแก้ไขและผู้สมัคร รวมถึงการอ้างอิงถึงสัญลักษณ์ในชิ้นเอาต์พุตในภายหลัง เอาต์พุตที่ย่อให้เล็กสุดเข้ารหัสประเภทความสัมพันธ์ในขณะที่ยังคงให้เครื่องหมายการแก้ไขอ่านได้
C/C++ รวมถึงมีสัญลักษณ์ meta/file และ meta/include อย่างชัดเจน การสะกดเฮดเดอร์ปรากฏครั้งเดียวในรายการสัญลักษณ์; เส้นเชื่อมใช้ ShortID ของพวกมัน:
[symbols]## src/main.cS1 meta/file L1-L4 main.cS2 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 สร้างเอาต์พุตโครงร่างที่มีอยู่ใหม่เมื่ออัปเกรดแทนที่จะผสมกับเอาต์พุตเก่า