정적으로 입력 한 LUA 개발을위한 IDE.
Emmylua에서 파생되었습니다.

self 실제 유형입니다@shape 에 대한 지원이 추가되었습니다@not 유형 캐스트@type 주석 






최신 릴리스는 Intellij 또는 JetBrains 플러그인 웹 사이트에서 다운로드 할 수 있습니다.
Luanalysis는 Emmylua에서 파생되며 Emmylua가 제공하는 모든 기본 편집 및 리팩토링 기능을 지원합니다.
기본 LUA 편집 기능 외에도 Luanalysis는 정적으로 고급 코드베이스를 입력하는 데 필요한 상당한 양의 추가 기능을 지원합니다.
*참고*: 기능은 크게 중요한 순서로 구현 된 순서 대략 등록됩니다.
정적 타이핑 측면에서 가능한 것이 무엇인지 확인하는 가장 좋은 방법은 Luanalysis Demo 프로젝트를 체크 아웃하는 것입니다.

새 유형을 정의하는 것 외에도 @type 태그를 사용하여 LUA 표현식의 결과를 시전 할 수 있습니다.
이는 인라인 유형 캐스트를 쉽게 지정할 수 있으므로 emmydoc 블록 주석에 대한 새로 추가 된 지원에 가장 유용합니다.

https://github.com/benjamin-dobell/luanalysistypesdemo/blob/cfea19c9fd744078f50f61e74e620b7505b58c65/src/type_casts.lua
Emmylua는 전자가 후자의 "하위 유형"인지 확인하여 유형이 다른 유형에 할당 될 수 있는지 확인하려고하지만 복잡한 유형의 적절한 유형 분산은 구현되지 않습니다. 예를 들어, 함수는 매개 변수 및 반환 값 유형에 따라 다른 기능 유형의 공변량 또는 비결정 일 수 있습니다.

Emmylua는 위의 오류를보고하지 않습니다 .
또한, 노조 분산 탐지가 수정되었습니다.

위와 같이, Emmylua의 현재 방출은이 오류를 포착하지 않습니다.

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

https://github.com/benjamin-dobell/luanalysistypesdemo/blob/cfea19c9fd744078f50f61e74e620b7505b58c65/src/function_generics_scope.lua
IE 유형 확인은 이제 EMMYDOC 정의가있는 변수에 할당 된 "Lambdas"내부에서 작동합니다.

https://github.com/benjamin-dobell/luanalysistypesdemo/blob/cfea19c9fd744078f50f61e74e620b7505b58c65/src/lambda_params.lua
예를 들어 Emmydoc "Array"와 같은 다양한 개선 사항이 이제 호환 테이블 유형에 할당됩니다.

현재 Emmylua 릴리스는 사운드이지만 여기서 오류를보고합니다.
https://github.com/benjamin-dobell/luanalysistypesdemo/blob/cfea19c9fd744078f50f61e74e620b7505b58c65/src/tables.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#l26-l249
현재 Emmylua 릴리스는 여러 상황에서 제네릭을 올바르게 추론 할 수 없으므로 오류가없는 경우 유형 오류를보고하며 오류가 존재 해야하는 오류를 놓치고 있습니다.
https://github.com/benjamin-dobell/luanalysistypesdemo/blob/cfea19c9fd744078f50f61e74e620b7505b58c65/src/function_generics.lua#l154-l181
기본적으로 유형 안전 오류는 이제 경고 대신 오류로보고됩니다. 이것은 세 가지로 실현 가능합니다.
복잡한 유형을 지정하는 능력의 많은 개선
안전 버그 수정을 입력하십시오
주조
특히 캐스팅은 사용자가 무언가를 수행하는 경우 유형 시스템이 안전하지 않은 것으로 간주되지만 런타임시 괜찮을 것이라는 것을 알고 있으면 캐스트를 추가하여이를 의미하면 오류가 사라질 것입니다.

일반 매개 변수의 섀도 잉은 금지되어 있으며 오류 보고서는 다음과 같습니다.

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

https://github.com/benjamin-dobell/luanalysistypesdemo/blob/cfea19c9fd744078f50f61e74e620b7505b58c65/src/generic_class_fields.lua#l44-l45
self 실제 유형입니다 개선 된 유형 확인 self 검사, 예를 들어 self 모 메소드의 부모 유형과 일치하는 변수에 할당 할 수 있습니다. 그러나 클래스가 하위 클래스가 될 수 있으므로 해당 부모 유형은 self 으로 할당 할 수 없습니다 (이 경우 self 보다 구체적인 유형을 나타냅니다).

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

현재 emmylua 릴리스는이 잘못된 할당을 허용합니다.
함수가 여러 값을 반환하면 현재 emmylua 릴리스가 값을 유추하여 캐시에 넣습니다. 일반 유형 분석이 할당 된 값에 따라 동일한 일반 매개 변수가 다르게 해결 될 수 있으므로이 상황에서는 캐시를 사용할 수 없으므로 이는 부정확합니다. 현재 이는 할당에 따라 오류가 누락 된 오류와 추가 부정확 한 오류가 발생합니다.
@shape 에 대한 지원이 추가되었습니다비결정은 상속 계층이 아닌 멤버의 호환성에 의해 결정된다는 점을 제외하고는 클래스와 유사하게 정의 될 수 있습니다.
이것은 OOP 클래스가 아닌 "구조"(예 : JSON)로 작업 할 때 가장 유용합니다.

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.lua
기능 유형은 이제 vararg T 의 대안 …: T 사용할 수 있습니다.

이제 변수 반환 값을 지원합니다.

내부적으로, TyTuple 구성이 고정 된 크기가 아니라는 사실을 반영하기 위해 TyMultipleResults 로 대체되었습니다. 또한 이제 여러 위치에서 여러 결과가 올바르게 처리됩니다.
LUA 내장 타이핑에 대한 다양한 개선 사항이 변동성 반환 값을 이용합니다.
이제 문자열 상수가 아닌 테이블의 모든 속성을 입력 할 수 있습니다. 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 키워드를 사용하여 수행되며 비슷하게 작동합니다. 즉, 많은 오버로드를 지정하고 유형 확인 및 완료는 예상대로 작동합니다.

튜플은 숫자 문자 인덱스가있는 모양으로 구현 될 수 있습니다.

또는 테이블 리터럴 유형의 별칭으로 :

위에서 볼 수 있듯이 튜플이 배열과 호환되면 배열에 할당 할 수 있지만 그 반대는 아닙니다.
@type 주석은 유형 목록을 지원합니다. 변수를 선언 할 때 사용할 수 있습니다.

또는 표현식 (예 : 함수 호출)에 의해 반환 된 여러 결과를 주조하기 위해 :

@not 유형 캐스트 @not 유형 캐스트는 유니언에서 유형을 제거합니다. 다양한 상황에서 유용하며, 가장 간단한 것은 nil 제거하는 것입니다.

@type 와 마찬가지로 함수의 여러 반환 값을 캐스팅하기위한 유형 목록도 지원하며 자체적으로 노조를 제거 할 수 있습니다.

단순히 노조에서 유형을 제거하려면 @type 캐스트가 본질적으로 모든 유형을 비활성화하기 때문에 @type 캐스트보다 @not 캐스트를 사용하는 것이 일반적으로 더 안전합니다. @not 캐스트는 특정 유형을 제외하는 모든 유형 확인을 비활성화합니다.
@type 주석리턴 명령문은 이제 익명 람다의 반환 값을 입력하는 유형 안전 방법 인 유형 주석을 수락합니다.

유형 캐스트와 달리 유형 안전합니다.

별명 유형은 이제 게으르게 해결되어 재귀 데이터 구조를 입력 할 수 있습니다. 예를 들어, JSON :

함수 API는 알 수없는 결과를 반환 할 수 있습니다. 그러나 이러한 기능을 호출 할 때, 당신은 당신이 얼마나 많은 결과를 기대하는지 아는 경향이 있습니다.
Variadic 리턴 값은 @not away nil 캐스팅하여 구체적인 유형 목록으로 캐스트 할 수 있습니다.

하나의 variadic 유형은 다른 유형으로 캐스트 될 수 있습니다.

우리는 이제 짧고 긴 형태의 기능 유형 정의에서 선택적 매개 변수를 지원합니다.

중요하게도, 선택 사항은 nil | type 에 짧지 않습니다 nil | type .

선택적 매개 변수 유형 자체가 유형 정의에서 Union의 일부로 nil 포함하지 않는 한 nil 제공 할 수 없습니다. 이는 구현이 [ select('#', …) ] (https://www.lua.org/manual/5.3/manual.html#pdf-select)을 사용하는 경우 LUA에서 기능을 구현할 때 정확성 목적으로 바람직합니다. 그러나 그 외에도 LUA는 정기적으로 스크립팅 언어로 사용되며, LUA 기능은 과부하 등을 지원하는 다른 언어의 구현에 대한 구현에 대한 구현을 바인딩합니다. 인수의 수와 유형이 중요한 경우.
잘못된 선택적 매개 변수 순서를 방지하는 검사도 구현되었습니다.
다음과 같이 플러그인을 작성하십시오.
./gradlew buildJetBrains Platform SDK에 대한 자세한 내용은 공식 문서를 참조하십시오.
결과 플러그인 .zip 은 디렉토리 ./build/distributions/ 에서 끝납니다.
구축 된 .zip 설치하려면 Intellij 's로 이동해야합니다.
환경 설정 -> 플러그인 -> 설정 코그 아이콘 -> 디스크에서 플러그인 설치 ...

.zip 을 선택한 다음 메시지를 표시하면 Intellij를 다시 시작하십시오.
Luanalysis by : Benjamin Dobell
emmylua by : @tangzx 阿唐
기고자
기고자의 전체 목록은 Github를 참조하십시오.
비안 분석의 지속적인 발전을 보장하는 Luanalysis의 후원자 및 지지자들에게 감사합니다.