Updated ExtractEmmyLuaAPI command to fix issues

Issues:
 - The generated API file caused a ton of diagnostics warnings.
 - Perhaps due to EmmyLua moving forward since this was created, we were missing out on some features.

Changes:
 - Disabled diagnostics about missing return values for functions.
 - Added add operator definitions because by default CPos+CVec would be assumed to return a number and assignments would cause warnings about type mismatches.
 - Added explicit @enum annotations. This also fixed warnings in the generated API file about missing types.
 - Changed default type of properties from an empty table to nil. This fixed warnings in the generated API file about type mismatch.
 - Renamed local variable "required" -> "requiredTraits" for readability.
 - Disabled duplicate function/property  name warnings
 - Updated trait docs URL.
This commit is contained in:
penev92
2023-01-10 10:52:13 +02:00
committed by Matthias Mailänder
parent 9e081763ad
commit 9ce4ef0bff

View File

@@ -36,6 +36,10 @@ namespace OpenRA.Mods.Common.UtilityCommands
Console.WriteLine("-- https://wiki.openra.net/Utility was used with the --emmy-lua-api parameter."); Console.WriteLine("-- https://wiki.openra.net/Utility was used with the --emmy-lua-api parameter.");
Console.WriteLine("-- See https://docs.openra.net/en/latest/release/lua/ for human readable documentation."); Console.WriteLine("-- See https://docs.openra.net/en/latest/release/lua/ for human readable documentation.");
Console.WriteLine();
WriteDiagnosticsDisabling();
Console.WriteLine();
Console.WriteLine(); Console.WriteLine();
WriteManual(); WriteManual();
Console.WriteLine(); Console.WriteLine();
@@ -62,6 +66,13 @@ namespace OpenRA.Mods.Common.UtilityCommands
WriteScriptProperties(typeof(Player), playerProperties); WriteScriptProperties(typeof(Player), playerProperties);
} }
static void WriteDiagnosticsDisabling()
{
Console.WriteLine("--- This file only lists function \"signatures\", causing Lua Diagnostics errors: \"Annotations specify that a return value is required here.\"");
Console.WriteLine("--- Disable that specific error for the entire file.");
Console.WriteLine("---@diagnostic disable: missing-return");
}
static void WriteManual() static void WriteManual()
{ {
Console.WriteLine("--- This function is triggered once, after the map is loaded."); Console.WriteLine("--- This function is triggered once, after the map is loaded.");
@@ -75,14 +86,20 @@ namespace OpenRA.Mods.Common.UtilityCommands
Console.WriteLine("---@class cpos"); Console.WriteLine("---@class cpos");
Console.WriteLine("---@field X integer"); Console.WriteLine("---@field X integer");
Console.WriteLine("---@field Y integer"); Console.WriteLine("---@field Y integer");
Console.WriteLine("---@operator add(cvec): cpos");
Console.WriteLine("---@operator sub(cvec): cpos");
Console.WriteLine(); Console.WriteLine();
Console.WriteLine("---@class wpos"); Console.WriteLine("---@class wpos");
Console.WriteLine("---@field X integer"); Console.WriteLine("---@field X integer");
Console.WriteLine("---@field Y integer"); Console.WriteLine("---@field Y integer");
Console.WriteLine("---@field Z integer"); Console.WriteLine("---@field Z integer");
Console.WriteLine("---@operator add(wvec): wpos");
Console.WriteLine("---@operator sub(wvec): wpos");
Console.WriteLine(); Console.WriteLine();
Console.WriteLine("---@class wangle"); Console.WriteLine("---@class wangle");
Console.WriteLine("---@field Angle integer"); Console.WriteLine("---@field Angle integer");
Console.WriteLine("---@operator add(wangle): wangle");
Console.WriteLine("---@operator sub(wangle): wangle");
Console.WriteLine(); Console.WriteLine();
Console.WriteLine("---@class wdist"); Console.WriteLine("---@class wdist");
Console.WriteLine("---@field Length integer"); Console.WriteLine("---@field Length integer");
@@ -91,10 +108,14 @@ namespace OpenRA.Mods.Common.UtilityCommands
Console.WriteLine("---@field X integer"); Console.WriteLine("---@field X integer");
Console.WriteLine("---@field Y integer"); Console.WriteLine("---@field Y integer");
Console.WriteLine("---@field Z integer"); Console.WriteLine("---@field Z integer");
Console.WriteLine("---@operator add(wvec): wvec");
Console.WriteLine("---@operator sub(wvec): wvec");
Console.WriteLine(); Console.WriteLine();
Console.WriteLine("---@class cvec"); Console.WriteLine("---@class cvec");
Console.WriteLine("---@field X integer"); Console.WriteLine("---@field X integer");
Console.WriteLine("---@field Y integer"); Console.WriteLine("---@field Y integer");
Console.WriteLine("---@operator add(cvec): cvec");
Console.WriteLine("---@operator sub(cvec): cvec");
Console.WriteLine(); Console.WriteLine();
Console.WriteLine("---@class color"); Console.WriteLine("---@class color");
Console.WriteLine("local color = { };"); Console.WriteLine("local color = { };");
@@ -137,6 +158,7 @@ namespace OpenRA.Mods.Common.UtilityCommands
{ {
foreach (var enumType in enumTypes) foreach (var enumType in enumTypes)
{ {
Console.WriteLine($"---@enum {enumType.Name}");
Console.WriteLine(enumType.Name + " = {"); Console.WriteLine(enumType.Name + " = {");
foreach (var value in Enum.GetValues(enumType)) foreach (var value in Enum.GetValues(enumType))
@@ -183,7 +205,7 @@ namespace OpenRA.Mods.Common.UtilityCommands
Console.WriteLine($" ---@deprecated {obsolete.Message}"); Console.WriteLine($" ---@deprecated {obsolete.Message}");
Console.WriteLine($" ---@type {propertyInfo.PropertyType.EmmyLuaString()}"); Console.WriteLine($" ---@type {propertyInfo.PropertyType.EmmyLuaString()}");
body = propertyInfo.Name + " = { };"; body = propertyInfo.Name + " = nil;";
} }
if (member is MethodInfo methodInfo) if (member is MethodInfo methodInfo)
@@ -222,11 +244,17 @@ namespace OpenRA.Mods.Common.UtilityCommands
var properties = implementingTypes.SelectMany(t => var properties = implementingTypes.SelectMany(t =>
{ {
var required = ScriptMemberWrapper.RequiredTraitNames(t); var requiredTraits = ScriptMemberWrapper.RequiredTraitNames(t);
return ScriptMemberWrapper.WrappableMembers(t).Select(memberInfo => (memberInfo, required)); return ScriptMemberWrapper.WrappableMembers(t).Select(memberInfo => (memberInfo, requiredTraits));
}); });
foreach (var (memberInfo, required) in properties) var duplicateProperties = properties
.GroupBy(x => x.memberInfo.Name)
.Where(x => x.Count() > 1)
.Select(x => x.Key)
.ToHashSet();
foreach (var (memberInfo, requiredTraits) in properties)
{ {
Console.WriteLine(); Console.WriteLine();
@@ -242,8 +270,8 @@ namespace OpenRA.Mods.Common.UtilityCommands
if (isActivity) if (isActivity)
Console.WriteLine(" --- *Queued Activity*"); Console.WriteLine(" --- *Queued Activity*");
if (required.Any()) if (requiredTraits.Any())
Console.WriteLine($" --- **Requires {(required.Length == 1 ? "Trait" : "Traits")}:** {required.Select(GetDocumentationUrl).JoinWith(", ")}"); Console.WriteLine($" --- **Requires {(requiredTraits.Length == 1 ? "Trait" : "Traits")}:** {requiredTraits.Select(GetDocumentationUrl).JoinWith(", ")}");
if (memberInfo is MethodInfo methodInfo) if (memberInfo is MethodInfo methodInfo)
{ {
@@ -261,13 +289,20 @@ namespace OpenRA.Mods.Common.UtilityCommands
if (returnType != "Void") if (returnType != "Void")
Console.WriteLine($" ---@return {returnType}"); Console.WriteLine($" ---@return {returnType}");
if (duplicateProperties.Contains(methodInfo.Name))
Console.WriteLine(" ---@diagnostic disable-next-line: duplicate-index");
Console.WriteLine($" {methodInfo.Name} = function({parameterString}) end;"); Console.WriteLine($" {methodInfo.Name} = function({parameterString}) end;");
} }
if (memberInfo is PropertyInfo propertyInfo) if (memberInfo is PropertyInfo propertyInfo)
{ {
Console.WriteLine($" ---@type {propertyInfo.PropertyType.EmmyLuaString()}"); Console.WriteLine($" ---@type {propertyInfo.PropertyType.EmmyLuaString()}");
Console.WriteLine(" " + propertyInfo.Name + " = { };");
if (duplicateProperties.Contains(propertyInfo.Name))
Console.WriteLine(" ---@diagnostic disable-next-line: duplicate-index");
Console.WriteLine(" " + propertyInfo.Name + " = nil;");
} }
} }
@@ -277,7 +312,7 @@ namespace OpenRA.Mods.Common.UtilityCommands
static string GetDocumentationUrl(string trait) static string GetDocumentationUrl(string trait)
{ {
return $"[{trait}](https://docs.openra.net/en/latest/release/traits/#{trait.ToLowerInvariant()})"; return $"[{trait}](https://docs.openra.net/en/release/traits/#{trait.ToLowerInvariant()})";
} }
} }