IDE สำหรับการพัฒนา LUA ที่พิมพ์แบบคงที่
มาจาก Emmylua

self เป็นประเภทจริง@shape@not พิมพ์ casts@type คำอธิบายประกอบในคำสั่งส่งคืน 






รุ่นล่าสุดมีให้ดาวน์โหลดภายใน Intellij หรือจากเว็บไซต์ปลั๊กอิน Jetbrains
Luanalysis ได้มาจาก Emmylua และสนับสนุนฟังก์ชั่นการแก้ไขขั้นพื้นฐานและการปรับโครงสร้างทั้งหมดที่จัดทำโดย Emmylua
นอกเหนือจากความสามารถในการแก้ไขขั้นพื้นฐานของ Lua แล้ว Luanalysis สนับสนุนฟังก์ชั่นเพิ่มเติมจำนวนมากที่จำเป็นในการพิมพ์ codebases ขั้นสูงแบบคงที่
*หมายเหตุ*: คุณสมบัติมีการระบุไว้ในลำดับที่พวกเขาถูกนำไปใช้โดยไม่ได้มีลำดับความสำคัญ
วิธีที่ยอดเยี่ยมในการดูสิ่งที่เป็นไปได้ในแง่ของการพิมพ์แบบคงที่คือการชำระเงินโครงการสาธิต Luanalysis

นอกเหนือจากการกำหนดประเภทใหม่ตอนนี้แท็ก @type ยังสามารถใช้เพื่อส่งผลของการแสดงออกของ Lua
สิ่งนี้มีประโยชน์มากที่สุดกับการสนับสนุนที่เพิ่มขึ้นใหม่สำหรับความคิดเห็นบล็อก EmmyDoc เนื่องจากเราสามารถระบุประเภทอินไลน์ได้อย่างง่ายดาย:

https://github.com/benjamin-dobell/luanalysistypesdemo/blob/cfea19c9fd744078f50f61e74e620b7505b58c65/src/type_casts.lua
Emmylua พยายามที่จะตรวจสอบว่าประเภทสามารถกำหนดให้กับประเภทอื่นได้ง่ายๆโดยตรวจสอบว่าอดีตเป็น "ชนิดย่อย" ของหลังหรือไม่ แต่ความแปรปรวนประเภทที่เหมาะสมของประเภทที่ซับซ้อนไม่ได้ถูกนำมาใช้ ตัวอย่างเช่นฟังก์ชั่นอาจเป็น covariant หรือ contravariant ของประเภทฟังก์ชั่นอื่น ๆ ขึ้นอยู่กับพารามิเตอร์และประเภทค่าส่งคืน:

Emmylua ไม่ได้ รายงานข้อผิดพลาดข้างต้น
นอกจากนี้การตรวจจับความแปรปรวนของสหภาพได้รับการแก้ไขแล้ว:

ดังกล่าวข้างต้นการเปิดตัว Emmylua ในปัจจุบันไม่พบข้อผิดพลาดนี้

https://github.com/benjamin-dobell/luanalysistypesdemo/blob/cfea19c9fd744078f50f61e74e620b7505b58c65/src/string_literals.lua.lua

https://github.com/benjamin-dobell/luanalysistypesdemo/blob/cfea19c9fd744078f50f61e74e620b7505b58c65/src/function_generics_scope.lua.lua.lua.lua.lua.lua.lua.lua.lua.lua.lua
การตรวจสอบประเภทเช่นตอนนี้ใช้งานได้ภายในฟังก์ชั่น "แลมบ์ดา" ที่กำหนดให้กับตัวแปรที่มีคำจำกัดความของ EmmyDoc

https://github.com/benjamin-dobell/luanalysistypesdemo/blob/cfea19c9fd744078f50f61e74e620b7505b58c65/src/lambda_params.lua
การปรับปรุงที่หลากหลายเช่น EmmyDoc "อาร์เรย์" สามารถกำหนดให้กับประเภทตารางที่เข้ากันได้เช่น

การเปิดตัว Emmylua ปัจจุบันจะรายงานข้อผิดพลาดที่นี่แม้ว่านี่จะเป็นเสียงก็ตาม
https://github.com/benjamin-dobell/luanalysistypesdemo/blob/cfea19c9fd744078f50f61e74e620b7505b58c65/src/tables.lua.lua

https://github.com/benjamin-dobell/luanalysistypesdemo/blob/cfea19c9fd744078f50f61e74e620b7505b58c65/src/generic_class_fields.lua

https://github.com/benjamin-dobell/luanalysistypesdemo/blob/cfea19c9fd744078f50f61e74e620b7505b58c65/src/function_generics.lua#l226-l24
การเปิดตัว Emmylua ปัจจุบันไม่สามารถอนุมานทั่วไปได้อย่างถูกต้องในหลาย ๆ สถานการณ์และรายงานข้อผิดพลาดพิมพ์ที่ไม่มีข้อผิดพลาดและพลาดข้อผิดพลาดที่ควรมีข้อผิดพลาดเช่น
https://github.com/benjamin-dobell/luanalysistypesdemo/blob/cfea19c9fd744078f50f61e74e620b7505b58c65/src/function_generics.lua#l154-L184-L184-L184-L184-L18
โดยค่าเริ่มต้นข้อผิดพลาดด้านความปลอดภัยประเภทจะถูกรายงานว่าเป็นข้อผิดพลาดแทนคำเตือน สิ่งนี้เกิดขึ้นได้สามสิ่ง:
การปรับปรุงมากมายในความสามารถในการระบุประเภทที่ซับซ้อน
พิมพ์ข้อบกพร่องด้านความปลอดภัย
การหล่อ
โดยเฉพาะอย่างยิ่งการคัดเลือกนักแสดงหมายความว่าหากผู้ใช้กำลังทำอะไรบางอย่างที่ระบบประเภทเห็นว่าไม่ปลอดภัย แต่พวกเขารู้ว่าเมื่อเวลาผ่านไปรันไทม์จะดีพวกเขาสามารถเพิ่มนักแสดงเพื่อแสดงถึงสิ่งนี้และข้อผิดพลาดจะหายไป

การเรียกใช้พารามิเตอร์ทั่วไปเป็นสิ่งต้องห้ามและรายงานข้อผิดพลาด:

https://github.com/benjamin-dobell/luanalysistypesdemo/blob/cfea19c9fd744078f50f61e74e620b7505b58c65/src/generic_class_scope.lua.lua

https://github.com/benjamin-dobell/luanalysistypesdemo/blob/cfea19c9fd744078f50f61e74e620b7505b58c65/src/generic_class_fields.lua#l4
self เป็นประเภทจริง การตรวจสอบประเภทที่ดีขึ้นสำหรับ self ตัวอย่างเช่น self สามารถกำหนดให้กับตัวแปรที่ตรงกับประเภทหลักของวิธีการ อย่างไรก็ตามประเภทหลักนั้นไม่สามารถกำหนดให้กับ self ได้เนื่องจากคลาสอาจเป็นคลาสย่อย (ซึ่งในกรณีนี้ self หมายถึงประเภทที่เฉพาะเจาะจงมากขึ้น)

https://github.com/benjamin-dobell/luanalysistypesdemo/blob/cfea19c9fd744078f50f61e74e620b7505b58c65/src/self.lua

การเปิดตัว Emmylua ปัจจุบันจะอนุญาตให้มีการมอบหมายที่ไม่ถูกต้องนี้
เมื่อฟังก์ชั่นส่งคืนค่าหลายค่าการปล่อย Emmylua ปัจจุบันจะอนุมานค่าและใส่ไว้ในแคช สิ่งนี้ไม่ถูกต้องเนื่องจากการวิเคราะห์ประเภททั่วไปอาจส่งผลให้พารามิเตอร์ทั่วไปเดียวกันได้รับการแก้ไขแตกต่างกันไปตามค่าที่ได้รับมอบหมายดังนั้นแคชไม่สามารถใช้ในสถานการณ์นี้ ปัจจุบันส่งผลให้เกิดข้อผิดพลาดที่ขาดหายไปและข้อผิดพลาดที่ไม่ถูกต้องเพิ่มเติมขึ้นอยู่กับการมอบหมาย
@shapeรูปร่างสามารถกำหนดได้คล้ายกับชั้นเรียนยกเว้นว่า contravariance จะถูกกำหนดโดยความเข้ากันได้ของสมาชิก ไม่ใช่ ลำดับชั้นมรดก
สิ่งนี้มีประโยชน์มากที่สุดเมื่อทำงานกับ "โครงสร้าง" (เช่น JSON) มากกว่าคลาส OOP

https://github.com/benjamin-dobell/luanalysistypesdemo/blob/cfea19c9fd744078f50f61e74e620b7505b58c65/src/shape.lua
สิ่งที่ทำให้รูปร่างมีประโยชน์อย่างยิ่งคือการสนับสนุนทั่วไปและการสืบทอด (ในเวลานิยามไม่ใช่การมอบหมาย) เช่นเดียวกับคลาส:
https://github.com/benjamin-dobell/luanalysistypesdemo/blob/cfea19c9fd744078f50f61e74e620b7505b58c65/src/shape.lua#l36-l74
ยิ่งไปกว่านั้น การตรวจสอบประเภทไม่เพียง แต่รายงานเกี่ยวกับ `ตารางที่เข้ากันไม่ได้ทั้งหมด แต่การตรวจสอบรู้วิธีการสำรวจ ตารางตาราง และให้คำอธิบายประกอบรายละเอียดของความเข้ากันไม่ได้ระหว่างสองรูปร่างเช่น

นามแฝงสามารถใช้พารามิเตอร์ทั่วไปเช่นเดียวกับชั้นเรียนหรือรูปร่าง

https://github.com/benjamin-dobell/luanalysistypesdemo/blob/cfea19c9fd744078f50f61e74e620b7505b58c65/src/generic_alias.luas
ประเภทฟังก์ชั่นสามารถใช้ได้ …: T เป็นทางเลือกแทน vararg T :

ตอนนี้เราสนับสนุนค่าการส่งคืนแบบแปรปรวน:

ภายใน TyTuple ถูกแทนที่ด้วย TyMultipleResults เพื่อสะท้อนความจริงที่ว่าโครงสร้างนี้ไม่ได้มีขนาดคงที่ นอกจากนี้ผลลัพธ์หลายอย่างได้รับการจัดการอย่างเหมาะสมในสถานที่อื่น ๆ
การปรับปรุงที่หลากหลายเกี่ยวกับการพิมพ์ของ Lua built-ins ที่ใช้ประโยชน์จากค่าผลตอบแทนที่หลากหลาย ฯลฯ
ตอนนี้เราสามารถพิมพ์คุณสมบัติทั้งหมดของตารางไม่ใช่แค่ค่าคงที่สตริง เนื่องจาก Luanalysis ยังเพิ่มการสนับสนุนสำหรับประเภทตัวอักษรดั้งเดิมเราสามารถใช้วิธีนี้ได้หลายวิธีเช่น

ที่นี่เรามีฟิลด์ตัวระบุสตริงปกติ, เขตข้อมูลตามตัวอักษรจำนวน [1] , [2] และ [3] และ ฟิลด์ [boolean] อันสุดท้ายนั้นมีพลังจริงๆเพราะมัน ไม่ คงที่มันเป็นประเภทจริง
เราสามารถพิมพ์โครงสร้างข้อมูลที่กำหนดเองได้เช่น
--- @class Dictionary < K , V >
--- @field [ K] V สิ่งนี้จะทำงานได้อย่างถูกต้องสำหรับ K ใด ๆ และทุกอย่างจะถูกตรวจสอบแบบคงที่ตามที่คุณคาดหวัง
นอกจากนี้ยังมีไวยากรณ์สำหรับประเภทตารางมันใช้งานได้สำหรับชั้นเรียนตาราง และ คลาสที่ไม่ระบุชื่อ (เช่นตารางที่ไม่ได้พิมพ์อย่างชัดเจน):

ตอนนี้เราสนับสนุนประเภท fun ด้วยรายการพารามิเตอร์เสริมและค่าส่งคืนที่เป็นตัวเลือกเช่น fun: boolean และ fun(arg: boolean) fun (โดยไม่ได้ระบุ) ยังใช้งานได้กับลูกหลาน แต่มีหน้าที่เทียบเท่ากับประเภท function ที่มีอยู่
ฟังก์ชั่นที่พิมพ์บางส่วนมีประโยชน์อย่างยิ่งสำหรับการใช้รูปแบบการโทรกลับและตัวจัดการ ตัวอย่างเช่นเป็นเรื่องธรรมดาที่จะมีระบบเหตุการณ์ที่ขยายได้ซึ่งแต่ละเหตุการณ์มีอาร์กิวเมนต์ที่ไม่ซ้ำกัน แต่ตัวจัดการจะต้องกลับมา true เพื่อระบุเหตุการณ์ที่ได้รับการจัดการ:

นี่เป็นอีกหนึ่งคุณสมบัติที่มีประโยชน์ จริงๆ ตอนนี้เราสามารถระบุได้อย่างถูกต้องว่าวัตถุนั้นสามารถเรียกได้ (เช่น table ที่มีเมตาทัลมีวิธี __call )

สิ่งนี้ทำได้โดยใช้คำหลัก @overload EmmyDoc ที่มีอยู่และใช้งานได้เช่นเดียวกับเราสามารถระบุการตรวจสอบมากเกินไปและการตรวจสอบและเสร็จสิ้นและเสร็จสิ้นจะทำงานตามที่คุณคาดหวัง:

Tuples สามารถนำไปใช้เป็นรูปร่างที่มีดัชนีตัวอักษรจำนวน:

หรือเป็นนามแฝงของประเภทตัวอักษรตาราง:

ดังที่เห็นด้านบนเมื่อ tuple เข้ากันได้กับอาร์เรย์มันสามารถกำหนดให้กับหนึ่ง แต่ไม่ใช่ในทางกลับกัน
คำอธิบายประกอบ @type รองรับรายการประเภท สามารถใช้งานได้เมื่อประกาศตัวแปร:

หรือสำหรับการหล่อหลายผลลัพธ์ที่ส่งคืนโดยนิพจน์ (เช่นการเรียกใช้ฟังก์ชัน):

@not พิมพ์ casts นักแสดงประเภท @not กำจัดประเภทจากสหภาพ มันมีประโยชน์ในสถานการณ์ที่หลากหลายซึ่งตรงไปตรงมามากที่สุดคือการกำจัด nil :

เช่น @type ยังรองรับรายการประเภทสำหรับการหล่อค่าคืนหลายค่าของฟังก์ชันและสามารถกำจัดสหภาพ:

เมื่อคุณต้องการกำจัดประเภทจากสหภาพโดยทั่วไปจะปลอดภัยกว่าที่จะใช้ @not CAST มากกว่า @type Cast เพราะนักแสดง @type จะปิดการใช้งานการตรวจสอบทุกประเภทสำหรับการมอบหมายโดยที่ @not Cast เพียงไม่รวมบางประเภท
@type คำอธิบายประกอบในคำสั่งส่งคืนตอนนี้คำสั่งส่งคืนยอมรับคำอธิบายประกอบประเภทซึ่งเป็นวิธี ที่ปลอดภัย ในการพิมพ์ค่าส่งคืนของแลมบ์ดาที่ไม่ระบุชื่อ

แตกต่างจากประเภทการคัดเลือก

ประเภทนามแฝงได้รับการแก้ไขอย่างเกียจคร้านซึ่งช่วยให้เราสามารถพิมพ์โครงสร้างข้อมูลแบบเรียกซ้ำได้ ตัวอย่างเช่น JSON:

ฟังก์ชั่น API อาจส่งคืนจำนวนผลลัพธ์ที่ไม่รู้จัก อย่างไรก็ตามเมื่อโทรหาฟังก์ชั่นเหล่านี้คุณมักจะรู้ว่าคุณคาดหวังผลลัพธ์จำนวนเท่าใด
ค่าส่งคืนแบบแปรปรวนสามารถส่งไปยังรายการประเภทคอนกรีตโดย @not casting away nil :

ประเภทหนึ่งอาจถูกคัดเลือกให้เลือกอื่น:

ตอนนี้เรารองรับพารามิเตอร์ทางเลือกทั้งในคำจำกัดความประเภทฟังก์ชันระยะสั้นและแบบยาวเช่น

ที่สำคัญตัวเลือก ไม่ได้ เป็นมือสั้นสำหรับ nil | type .

คุณไม่สามารถให้ nil ได้เว้นแต่ว่าประเภทพารามิเตอร์ทางเลือกนั้นจะมี nil เป็นส่วนหนึ่งของสหภาพในคำจำกัดความของประเภท สิ่งนี้เป็นที่ต้องการเพื่อวัตถุประสงค์ที่ถูกต้องเมื่อใช้ฟังก์ชั่นใน Lua ให้พูดเช่นหากการใช้งานใช้ประโยชน์จาก [ select('#', …) ] (https://www.lua.org/manual/5.3/Manual.html#pdf- select) อย่างไรก็ตามนอกเหนือจากนั้น Lua จะถูกใช้เป็นภาษาสคริปต์เป็นประจำการเชื่อมโยงฟังก์ชั่น LUA เรียกใช้การใช้งานในภาษาอื่น ๆ ที่มีการสนับสนุนการโอเวอร์โหลด ฯลฯ ซึ่งจำนวนและประเภทของอาร์กิวเมนต์มีความสำคัญ
การตรวจสอบที่ป้องกันการสั่งซื้อพารามิเตอร์ทางเลือกที่ไม่ถูกต้องได้ถูกนำไปใช้เช่นกัน:
สร้างปลั๊กอินด้วย:
./gradlew buildสำหรับรายละเอียดเพิ่มเติมเกี่ยวกับแพลตฟอร์ม Jetbrains SDK โปรดดูเอกสารอย่างเป็นทางการ
ปลั๊กอินผลลัพธ์ .zip จะจบลงในไดเรกทอรี ./build/distributions/ distributions/
ในการติดตั้ง .zip ที่คุณสร้างขึ้นคุณจะต้องไปที่ Intellij's ...
การตั้งค่า -> ปลั๊กอิน -> ไอคอน COG การตั้งค่า -> ติดตั้งปลั๊กอินจากดิสก์ ...

เลือก .zip แล้วเมื่อได้รับแจ้งให้รีสตาร์ท Intellij
Luanalysis โดย: Benjamin Dobell
Emmylua โดย: @tangzx 阿唐
ผู้มีส่วนร่วม
โปรดดูที่ GitHub สำหรับรายชื่อผู้มีส่วนร่วมที่สมบูรณ์
ขอขอบคุณผู้สนับสนุนและผู้สนับสนุนของ Luanalysis ที่ช่วยให้มั่นใจว่าการพัฒนาอย่างต่อเนื่องของ Luanalysis