Fixed table fields all being treated as readonly
A recent update in the Lua extension makes it consider all fields that are defined as table entries annotated with @type to be readonly (providing a somewhat misleading warning saying that they don't exist). Defining them as @field annotations on the class makes it tread them normally. This affects ScriptActorProperties and ScriptPlayerProperties.
This commit is contained in:
committed by
Matthias Mailänder
parent
74df2d22da
commit
4e72026ff9
@@ -58,7 +58,6 @@ namespace OpenRA.Mods.Common.UtilityCommands
|
|||||||
Console.WriteLine();
|
Console.WriteLine();
|
||||||
var globalTables = utility.ModData.ObjectCreator.GetTypesImplementing<ScriptGlobal>().OrderBy(t => t.Name);
|
var globalTables = utility.ModData.ObjectCreator.GetTypesImplementing<ScriptGlobal>().OrderBy(t => t.Name);
|
||||||
WriteGlobals(globalTables);
|
WriteGlobals(globalTables);
|
||||||
Console.WriteLine();
|
|
||||||
|
|
||||||
var actorProperties = utility.ModData.ObjectCreator.GetTypesImplementing<ScriptActorProperties>();
|
var actorProperties = utility.ModData.ObjectCreator.GetTypesImplementing<ScriptActorProperties>();
|
||||||
WriteScriptProperties(typeof(Actor), actorProperties);
|
WriteScriptProperties(typeof(Actor), actorProperties);
|
||||||
@@ -245,43 +244,60 @@ namespace OpenRA.Mods.Common.UtilityCommands
|
|||||||
static void WriteScriptProperties(Type type, IEnumerable<Type> implementingTypes)
|
static void WriteScriptProperties(Type type, IEnumerable<Type> implementingTypes)
|
||||||
{
|
{
|
||||||
var className = type.Name.ToLowerInvariant();
|
var className = type.Name.ToLowerInvariant();
|
||||||
var tableName = $"__{type.Name.ToLowerInvariant()}";
|
var tableName = $"__{className}";
|
||||||
Console.WriteLine($"---@class {className}");
|
Console.WriteLine($"---@class {className}");
|
||||||
Console.WriteLine("local " + tableName + " = {");
|
|
||||||
|
|
||||||
var properties = implementingTypes.SelectMany(t =>
|
var members = implementingTypes.SelectMany(t =>
|
||||||
{
|
{
|
||||||
var requiredTraits = ScriptMemberWrapper.RequiredTraitNames(t);
|
var requiredTraits = ScriptMemberWrapper.RequiredTraitNames(t);
|
||||||
return ScriptMemberWrapper.WrappableMembers(t).Select(memberInfo => (memberInfo, requiredTraits));
|
return ScriptMemberWrapper.WrappableMembers(t).Select(memberInfo => (memberInfo, requiredTraits));
|
||||||
});
|
});
|
||||||
|
|
||||||
var duplicateProperties = properties
|
var duplicateMembers = members
|
||||||
.GroupBy(x => x.memberInfo.Name)
|
.GroupBy(x => x.memberInfo.Name)
|
||||||
.Where(x => x.Count() > 1)
|
.Where(x => x.Count() > 1)
|
||||||
.Select(x => x.Key)
|
.Select(x => x.Key)
|
||||||
.ToHashSet();
|
.ToHashSet();
|
||||||
|
|
||||||
foreach (var (memberInfo, requiredTraits) in properties)
|
foreach (var (memberInfo, requiredTraits) in members)
|
||||||
{
|
{
|
||||||
Console.WriteLine();
|
// Properties are supposed to be defined as @fields on the class.
|
||||||
|
// They can be defined as keys inside the tables, but then are treated as readonly by the Lua extension.
|
||||||
var isActivity = Utility.HasAttribute<ScriptActorPropertyActivityAttribute>(memberInfo);
|
if (memberInfo is PropertyInfo propertyInfo && propertyInfo.CanWrite)
|
||||||
|
|
||||||
if (Utility.HasAttribute<DescAttribute>(memberInfo))
|
|
||||||
{
|
{
|
||||||
var lines = Utility.GetCustomAttributes<DescAttribute>(memberInfo, true).First().Lines;
|
WriteMemberDescription(memberInfo, requiredTraits, 0);
|
||||||
foreach (var line in lines)
|
|
||||||
Console.WriteLine($" --- {line}");
|
if (duplicateMembers.Contains(memberInfo.Name))
|
||||||
|
Console.WriteLine(" ---@diagnostic disable-next-line: duplicate-index");
|
||||||
|
|
||||||
|
Console.WriteLine($"---@field {propertyInfo.Name} {propertyInfo.PropertyType.EmmyLuaString()}");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Console.WriteLine("local " + tableName + " = {");
|
||||||
|
|
||||||
|
foreach (var (memberInfo, requiredTraits) in members)
|
||||||
|
{
|
||||||
|
// Properties are supposed to be defined as @fields on the class,
|
||||||
|
// but if they are defined as keys inside the table, they are treated as readonly by the Lua extension.
|
||||||
|
if (memberInfo is PropertyInfo propertyInfo && !propertyInfo.CanWrite)
|
||||||
|
{
|
||||||
|
Console.WriteLine();
|
||||||
|
WriteMemberDescription(memberInfo, requiredTraits, 1);
|
||||||
|
|
||||||
|
if (duplicateMembers.Contains(memberInfo.Name))
|
||||||
|
Console.WriteLine(" ---@diagnostic disable-next-line: duplicate-index");
|
||||||
|
|
||||||
|
Console.WriteLine($" ---@type {propertyInfo.PropertyType.EmmyLuaString()}");
|
||||||
|
Console.WriteLine($" {propertyInfo.Name} = nil;");
|
||||||
}
|
}
|
||||||
|
|
||||||
if (isActivity)
|
// Functions are defined as keys inside the table.
|
||||||
Console.WriteLine(" --- *Queued Activity*");
|
|
||||||
|
|
||||||
if (requiredTraits.Length != 0)
|
|
||||||
Console.WriteLine($" --- **Requires {(requiredTraits.Length == 1 ? "Trait" : "Traits")}:** {requiredTraits.Select(GetDocumentationUrl).JoinWith(", ")}");
|
|
||||||
|
|
||||||
if (memberInfo is MethodInfo methodInfo)
|
if (memberInfo is MethodInfo methodInfo)
|
||||||
{
|
{
|
||||||
|
Console.WriteLine();
|
||||||
|
WriteMemberDescription(memberInfo, requiredTraits, 1);
|
||||||
|
|
||||||
var attributes = methodInfo.GetCustomAttributes(false);
|
var attributes = methodInfo.GetCustomAttributes(false);
|
||||||
foreach (var obsolete in attributes.OfType<ObsoleteAttribute>())
|
foreach (var obsolete in attributes.OfType<ObsoleteAttribute>())
|
||||||
Console.WriteLine($" ---@deprecated {obsolete.Message}");
|
Console.WriteLine($" ---@deprecated {obsolete.Message}");
|
||||||
@@ -296,25 +312,33 @@ namespace OpenRA.Mods.Common.UtilityCommands
|
|||||||
if (returnType != "Void")
|
if (returnType != "Void")
|
||||||
Console.WriteLine($" ---@return {returnType}");
|
Console.WriteLine($" ---@return {returnType}");
|
||||||
|
|
||||||
if (duplicateProperties.Contains(methodInfo.Name))
|
if (duplicateMembers.Contains(methodInfo.Name))
|
||||||
Console.WriteLine(" ---@diagnostic disable-next-line: duplicate-index");
|
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)
|
|
||||||
{
|
|
||||||
Console.WriteLine($" ---@type {propertyInfo.PropertyType.EmmyLuaString()}");
|
|
||||||
|
|
||||||
if (duplicateProperties.Contains(propertyInfo.Name))
|
|
||||||
Console.WriteLine(" ---@diagnostic disable-next-line: duplicate-index");
|
|
||||||
|
|
||||||
Console.WriteLine(" " + propertyInfo.Name + " = nil;");
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Console.WriteLine("}");
|
Console.WriteLine("}");
|
||||||
Console.WriteLine();
|
Console.WriteLine();
|
||||||
|
|
||||||
|
static void WriteMemberDescription(MemberInfo memberInfo, string[] requiredTraits, int indentation)
|
||||||
|
{
|
||||||
|
var isActivity = Utility.HasAttribute<ScriptActorPropertyActivityAttribute>(memberInfo);
|
||||||
|
|
||||||
|
if (Utility.HasAttribute<DescAttribute>(memberInfo))
|
||||||
|
{
|
||||||
|
var lines = Utility.GetCustomAttributes<DescAttribute>(memberInfo, true).First().Lines;
|
||||||
|
foreach (var line in lines)
|
||||||
|
Console.WriteLine($"{new string(' ', indentation * 4)}--- {line}");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (isActivity)
|
||||||
|
Console.WriteLine($"{new string(' ', indentation * 4)}--- *Queued Activity*");
|
||||||
|
|
||||||
|
if (requiredTraits.Length != 0)
|
||||||
|
Console.WriteLine($"{new string(' ', indentation * 4)}--- **Requires {(requiredTraits.Length == 1 ? "Trait" : "Traits")}:** {requiredTraits.Select(GetDocumentationUrl).JoinWith(", ")}");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static string GetDocumentationUrl(string trait)
|
static string GetDocumentationUrl(string trait)
|
||||||
|
|||||||
Reference in New Issue
Block a user