C#: Reduce scope redundancies in type declarations
This commit is contained in:
@@ -557,15 +557,11 @@ namespace Il2CppInspector.Outputs
|
|||||||
|
|
||||||
sb.Append(prefix + type.GetModifierString());
|
sb.Append(prefix + type.GetModifierString());
|
||||||
|
|
||||||
// Inheriting from a base class or implementing an interface using a generic type which contains a nested type parameter
|
var @base = type.ImplementedInterfaces.Select(x => x.GetScopedCSharpName(scope, isPartOfTypeDeclaration: true)).ToList();
|
||||||
// inside the declared class must be referenced from outside the scope of the type being defined
|
|
||||||
var outerScope = new Scope {Current = scope.Current.DeclaringType, Namespaces = scope.Namespaces};
|
|
||||||
|
|
||||||
var @base = type.ImplementedInterfaces.Select(x => x.GetScopedCSharpName(outerScope)).ToList();
|
|
||||||
if (type.BaseType != null && type.BaseType.FullName != "System.Object" && type.BaseType.FullName != "System.ValueType" && !type.IsEnum)
|
if (type.BaseType != null && type.BaseType.FullName != "System.Object" && type.BaseType.FullName != "System.ValueType" && !type.IsEnum)
|
||||||
@base.Insert(0, type.BaseType.GetScopedCSharpName(outerScope));
|
@base.Insert(0, type.BaseType.GetScopedCSharpName(scope, isPartOfTypeDeclaration: true));
|
||||||
if (type.IsEnum && type.GetEnumUnderlyingType().FullName != "System.Int32") // enums derive from int by default
|
if (type.IsEnum && type.GetEnumUnderlyingType().FullName != "System.Int32") // enums derive from int by default
|
||||||
@base.Insert(0, type.GetEnumUnderlyingType().GetScopedCSharpName(outerScope));
|
@base.Insert(0, type.GetEnumUnderlyingType().GetScopedCSharpName(scope));
|
||||||
var baseText = @base.Count > 0 ? " : " + string.Join(", ", @base) : string.Empty;
|
var baseText = @base.Count > 0 ? " : " + string.Join(", ", @base) : string.Empty;
|
||||||
|
|
||||||
sb.Append($"{type.CSharpTypeDeclarationName}{baseText}");
|
sb.Append($"{type.CSharpTypeDeclarationName}{baseText}");
|
||||||
|
|||||||
@@ -289,7 +289,7 @@ namespace Il2CppInspector.Reflection {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// C#-friendly type name as it should be used in the scope of a given type
|
// C#-friendly type name as it should be used in the scope of a given type
|
||||||
public string GetScopedCSharpName(Scope usingScope = null, bool omitRef = false) {
|
public string GetScopedCSharpName(Scope usingScope = null, bool omitRef = false, bool isPartOfTypeDeclaration = false) {
|
||||||
// Unscoped name if no using scope specified
|
// Unscoped name if no using scope specified
|
||||||
if (usingScope == null)
|
if (usingScope == null)
|
||||||
return CSharpName;
|
return CSharpName;
|
||||||
@@ -309,7 +309,13 @@ namespace Il2CppInspector.Reflection {
|
|||||||
n = n?.Remove(n.IndexOf("`", StringComparison.Ordinal));
|
n = n?.Remove(n.IndexOf("`", StringComparison.Ordinal));
|
||||||
|
|
||||||
// Generic type parameters and type arguments
|
// Generic type parameters and type arguments
|
||||||
var g = string.Join(", ", getGenericTypeParameters(usingScope).Select(x => x.GetScopedCSharpName(usingScope)));
|
// Inheriting from a base class or implementing an interface use the type's declaring scope, not the type's scope itself
|
||||||
|
// for generic type parameters
|
||||||
|
var outerScope = usingScope;
|
||||||
|
if (isPartOfTypeDeclaration)
|
||||||
|
outerScope = new Scope {Current = usingScope.Current?.DeclaringType, Namespaces = usingScope.Namespaces};
|
||||||
|
|
||||||
|
var g = string.Join(", ", getGenericTypeParameters(usingScope).Select(x => x.GetScopedCSharpName(outerScope)));
|
||||||
if (!string.IsNullOrEmpty(g))
|
if (!string.IsNullOrEmpty(g))
|
||||||
n += "<" + g + ">";
|
n += "<" + g + ">";
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user