Eine IDE für die statisch typisierte Lua -Entwicklung.
Abgeleitet von Emmylua.

self ist ein echter Typ@shape hinzugefügt@not Typ Casts@type Annotationen zu Rückgabeanweisungen 






Die neueste Version steht in Intellij oder auf der JetBrains Plugin -Website zum Download zur Verfügung.
Die Luanalyse stammt aus Emmylua und unterstützt alle von Emmylua bereitgestellten grundlegenden Bearbeitungs- und Refactoring -Funktionen.
Über die grundlegenden LUA -Bearbeitungsfunktionen hinaus unterstützt die Luanalyse eine erhebliche Menge an zusätzlichen Funktionen, die erforderlich sind, um erweiterte Codebasen statisch zu tippen.
*Hinweis*: Die Funktionen werden in ihrer implementierten Reihenfolge in etwa aufgelistet, und keineswegs von Bedeutung.
Eine gute Möglichkeit, um zu sehen, was in Bezug auf die statische Typisierung möglich ist, besteht darin, das Demo -Projekt der Luanalyse zu überprüfen.

Neben der Definition neuer Typen kann das @type -Tag jetzt auch verwendet werden, um das Ergebnis eines Lua -Ausdrucks zu werfen.
Dies ist am nützlichsten bei der neu hinzugefügten Unterstützung für EMMYDOC -Block -Kommentare, da wir problemlos Inline -Type angeben können:

https://github.com/benjamin-dobell/luanalysistypesdemo/blob/cfea19c9fd744078f50f61e74e620b7505b58c65/src/type_casts.lua
Emmylua versucht festzustellen, ob ein Typ einem anderen Typ einfach zugeordnet werden kann, indem er prüft, ob ersterer ein "Subtyp" der letzteren ist. Die ordnungsgemäße Typvarianz komplexer Typen ist jedoch nicht implementiert. Beispielsweise können Funktionen in Abhängigkeit von Parametern und Rückgabewerttypen kovariante oder kontravarianten andere Funktionstypen sein:

Emmylua meldet den obigen Fehler nicht .
Zusätzlich wurde die Erkennung der Gewerkschaftsvarianz festgelegt:

Wie oben fängt die aktuelle Freisetzung von Emmylua diesen Fehler nicht auf.

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 -Typ -Überprüfung funktioniert jetzt in der Funktion "lambdas", die einer Variablen mit einer Emmydoc -Definition zugeordnet ist.

https://github.com/benjamin-dobell/luanalysistypesdemo/blob/cfea19c9fd744078f50f61e74e620b7505b58c65/src/lambda_params.lua
Verschiedene Verbesserungen, beispielsweise Emmydoc "Arrays", sind jetzt kompatiblen Tabellentypen z.

Die aktuelle Emmylua -Veröffentlichung meldet hier einen Fehler, obwohl dies solide ist.
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#l226-l249
Die aktuelle Emmylua -Veröffentlichung kann Generikum in mehreren Situationen nicht korrekt abschließen und berichtet somit an, wenn Fehler vorliegen, wenn kein Fehler vorliegt, und auch Fehler verpasst, bei denen Fehler vorhanden sein sollten, z. B.
https://github.com/benjamin-dobell/luanalysistypesdemo/blob/cfea19c9fd744078f50f61e74e620b7505b58c65/src/function_generics.lua#l154-l181
Standardmäßig werden Typ -Sicherheitsfehler jetzt als Fehler anstelle von Warnungen gemeldet. Dies wird durch drei Dinge möglich gemacht:
Viele Verbesserungen in der Fähigkeit, komplexe Typen anzugeben
Geben Sie Sicherheitsfehler ein
Casting
Insbesondere das Casting bedeutet, dass ein Benutzer, der etwas tut, etwas tut, das das Typ -System für unsicher hält. Er weiß jedoch, dass er zur Laufzeit in Ordnung sein wird, er kann einfach eine Besetzung hinzufügen, um dies zu bezeichnen, und der Fehler wird verschwinden.

Das Schatten eines generischen Parameters ist verboten und ein Fehlerbericht:

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-l445
self ist ein echter Typ Verbesserte Typprüfung für self , z. B. kann self einer Variablen zugewiesen werden, die dem übergeordneten Typ einer Methode entspricht. Dieser übergeordnete Typ kann jedoch nicht self zugeordnet werden, da die Klasse möglicherweise subklassifiziert sein kann (in diesem Fall bezieht sich self auf einen spezifischeren Typ).

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

Die aktuelle Emmylua -Release ermöglicht diese ungültige Zuordnung.
Wenn eine Funktion mehrere Werte zurückgibt, schließt die aktuelle Emmylua -Freisetzung Werte ab und stellt sie in den Cache ein. Dies ist ungenau, da die Analyse der generischen Typen dazu führen kann, dass derselbe generische Parameter auf der Grundlage des zugewiesenen Werts unterschiedlich aufgelöst wird. Daher kann der Cache unter diesen Umständen nicht verwendet werden. Derzeit führt dies je nach Zuordnung sowohl zu fehlenden Fehlern als auch zu zusätzlichen ungenauen Fehlern.
@shape hinzugefügtEine Form kann ähnlich wie eine Klasse definiert werden, außer dass eine Kontravarianz durch die Kompatibilität der Mitglieder bestimmt wird, nicht durch die Erbschafthierarchie.
Dies ist am nützlichsten bei der Arbeit mit "Strukturen" (z. B. JSON) als mit OOP -Klassen.

https://github.com/benjamin-dobell/luanalysistypesdemo/blob/cfea19c9fd744078f50f61e74e620b7505b58c65/src/shape.lua
Was die Formen besonders nützlich macht, ist, dass sie Generika und Vererbung (zu Definitionszeiten, nicht zu Aufgabe) unterstützen, genau wie Klassen:
https://github.com/benjamin-dobell/luanalysistypesdemo/blob/cfea19c9fd744078f50f61e74e620b7505b58c65/src/shape.lua#l36-l74
Noch besser ist , dass Typinspektionen nicht nur über inkompatible "Tabellen als Ganzes" berichtet werden, sondern die Inspektionen wissen, wie man Tabellenliterale durchquert und detaillierte Annotationen von Inkompatibilitäten zwischen zwei Formen anbietet, z.

Aliase können jetzt generische Parameter annehmen, genau wie eine Klasse oder Form.

https://github.com/benjamin-dobell/luanalysistypesdemo/blob/cfea19c9fd744078f50f61e74e620b7505b58c65/src/generic_aliass.lua
Funktionstypen können jetzt verwenden …: T als Alternative zu vararg T :

Wir unterstützen nun variadische Rückgaberückwerte:

Intern wurde TyTuple durch TyMultipleResults ersetzt, um die Tatsache widerzuspiegeln, dass dieses Konstrukt keine feste Größe hat. Darüber hinaus werden jetzt mehrere Ergebnisse an mehr Orten ordnungsgemäß behandelt.
Verschiedene Verbesserungen an Typierungen von LuA-integrierten Ins, die die variadischen Rückgaberwerte usw. nutzen usw.
Wir können jetzt alle Eigenschaften von Tabellen eingeben, nicht nur Stringkonstanten. Angesichts der Tatsache, dass die Luanalyse auch primitive Wörteltypen unterstützt, können wir dies auf viele verschiedene Arten nutzen, z.

Hier haben wir regelmäßige Felder für String -Identifier, Zahlenliteralfelder [1] , [2] und [3] und ein [boolean] Feld. Das letzte ist wirklich mächtig, weil es keine Konstante ist, es ist ein echter Typ.
Wir können benutzerdefinierte Datenstrukturen eingeben, z.
--- @class Dictionary < K , V >
--- @field [ K] V Dies funktioniert für jedes K korrekt und alles wird statisch überprüft, wie Sie es erwarten würden.
Es gibt auch Syntax für Tabellentypen, es funktioniert für Tabellenliterale und anonyme Klassen (dh Tabellen, die nicht explizit eingegeben werden):

Wir unterstützen jetzt fun Typen mit optionalen Parameterlisten und optionalen Rückgabewerten, dh fun: boolean und fun(arg: boolean) . fun (mit keinem angegeben) funktioniert auch für die Nachwelt, entspricht jedoch funktional dem vorhandenen function .
Teilweise typisierte Funktionen sind äußerst nützlich für die Implementierung von Rückruf- und Handlermustern. Zum Beispiel ist es ziemlich üblich, ein erweiterbares Ereignissystem zu haben, in dem jedes Ereignis einzigartige Argumente hat, aber der Handler muss true zurückkehren, um anzuzeigen, dass das Ereignis behandelt wurde:

Dies ist eine weitere wirklich nützliche Funktion. Wir können jetzt ordnungsgemäß angeben, dass ein Objekt abrufbar ist (dh eine table , deren Akutbilität eine __call -Methode hat).

Dies erfolgt mit dem vorhandenen @overload emmyDOC -Schlüsselwort und funktioniert ähnlich, dh wir können viele Überladungen angeben, und die Überprüfung und Fertigstellung funktionieren wie erwartet:

Tupel können als Formen mit zahlreichen buchstäblichen Indizes implementiert werden:

oder als Aliase von Tabellenliteralarten:

Wie oben zu sehen ist, kann ein Tupel mit einem Array kompatibel ist, es kann einem zugeordnet werden, aber nicht umgekehrt.
Die @type -Annotation unterstützt eine Liste von Typen. Dies kann bei der Erklärung von Variablen verwendet werden:

oder zum Gießen mehrere Ergebnisse, die durch einen Ausdruck zurückgegeben wurden (z. B. Funktionsaufruf):

@not Typ Casts Ein @not -Typ beseitigt Typen aus einer Gewerkschaft. Es ist unter verschiedenen Umständen nützlich, von denen das unkomplizierte nil eliminiert:

Wie @type unterstützt auch Typ -Listen für das Gießen mehrerer Rückgaberichte einer Funktion und kann selbst Gewerkschaften beseitigen:

Wenn Sie einfach nur Typen aus einer Gewerkschaft beseitigen möchten, ist es im Allgemeinen sicherer, @not cast zu verwenden als eine @type -Besetzung, da ein @type -Besetzung im Wesentlichen alle Typen überprüft, um die Zuordnung zu überprüfen, wobei @not Cast nur bestimmte Typen ausschließt.
@type Annotationen zu RückgabeanweisungenRückgabeanweisungen akzeptieren nun Typ -Anmerkungen, bei denen der Rückgabewert von anonymen Lambdas Typen ist.

Im Gegensatz zu einem Typ-Guss sind diese Typ-Safe:

Alias -Typen sind jetzt träge aufgelöst, wodurch wir rekursive Datenstrukturen typern können. Zum Beispiel JSON:

Eine Funktions -API kann eine unbekannte Anzahl von Ergebnissen zurückgeben. Wenn Sie diese Funktionen jedoch aufrufen, wissen Sie jedoch, wie viele Ergebnisse Sie wieder erwarten.
Ein variadischer Rückgabewert kann von @not Casting nil auf eine konkrete Liste gegossen werden:

Ein variadischer Typ kann auch an einen anderen gegossen werden:

Wir unterstützen jetzt optionale Parameter sowohl in der Definitionen "Kurzform als auch in der Langform-Funktionstyp-Definitionen z.

Wichtig ist, dass optional für nil | type nicht kurzhandel ist nil | type .

Sie können nil nur zur Verfügung stellen, es sei denn, der optionale Parametertyp selbst enthält nil als Teil einer Vereinigung in ihrer Typdefinition. Dies ist für die Korrektheit von Gründen bei der Implementierung von Funktionen in Lua wünschenswert, beispielsweise wenn die Implementierung [ select('#', …) ] (https://www.lua.org/Manual/5.3/Manual.html#pdf-Select) verwendet. Darüber hinaus wird Lua regelmäßig als Skriptsprache verwendet, wobei die LUA -Funktionsaufrufe an Implementierungen in anderen Sprachen verbinden, die überlastet usw., bei denen die Anzahl und Art der Argumente wichtig sind.
Es wurden auch Inspektionen implementiert, die eine falsche optionale Parameterreihenfolge verhindern:
Bauen Sie das Plugin mit:
./gradlew buildWeitere Informationen zur Jetbrains -Plattform SDK finden Sie in der offiziellen Dokumentation.
Das resultierende Plugin .zip landet im Verzeichnis ./build/distributions/ .
Um den von Ihnen gebauten .zip zu installieren, müssen Sie zu Intellij's gehen ...
Einstellungen -> Plugins -> Einstellungen COG -Symbol -> Plugin von der Festplatte installieren ...

Wählen Sie den .zip aus und starten Sie dann intellij neu.
Luanalyse von: Benjamin Dobell
Emmylua von: @tangzx 阿唐
Mitwirkende
Eine vollständige Liste von Mitwirkenden finden Sie in GitHub.
Vielen Dank an die Sponsoren und Unterstützer der Luanalyse, die dazu beitragen, die fortgesetzte Entwicklung der Luanalyse zu gewährleisten.