Apple Swift 循环上下文的修改规则

Apple Swift mangling rules for recurring context

在装有 Swift 5.6 的 MacOS 上,并给定 mangling rules from here 和以下 Swift 代码:

class Car //AB
{
    class Foo //AD
    {
        func Foo() -> Void //AD
        {
               
        }
    }
}

Foo 的合成名称是 _$s4TEST3CarC3FooCADyyF(目标名称 TEST),我不明白为什么 Foo 的索引代码是 AD ,我希望 AC 被分配:

AA   AB  AC 
TEST.Car.Foo.Foo

在另一个例子中:

class TEST //AA
{
    class Car //AC
    {
        class Foo //AE
        {
            class Car //AC
            {
                func Foo() -> Void //AE
                {
                    
                }
            }
        }
    }
}

损坏的名称是 _$s4TESTAAC3CarC3FooCACCAEyyF,同样这些是我要分配的值:

AA        AB  AC
TEST.TEST.Car.Foo.Car.Foo

为什么在第一个长格式编码 3Foo 之后将 Foo 分配给 AE?为什么 ABAD 被跳过而不被使用?请注意,这仅针对字符串中的经常性项目,如果没有经常性项目,我可以愉快地进行编码。

在第一种情况下,替换索引分配如下:

AA TEST
AB Car
AC TEST.Car
AD Foo
AE TEST.Car.Foo

您可以使用 this question 中的分解代码获得这些结果。 Demangle 方法的损坏名称,只是没有 F 后缀 - 这是为了允许我们将我们选择的任何 A 替换添加到末尾。 (我还删除了 yy 以减少输出中的噪音)

print(swift_demangle("$s4TEST3CarC3FooCAdA")!)
print(swift_demangle("$s4TEST3CarC3FooCAdB")!)
print(swift_demangle("$s4TEST3CarC3FooCAdC")!)
print(swift_demangle("$s4TEST3CarC3FooCAdD")!)
print(swift_demangle("$s4TEST3CarC3FooCAdE")!)
/*
TEST.Car.FooFooTEST
TEST.Car.FooFooCar
TEST.Car.FooFooTEST.Car
TEST.Car.FooFooFoo
TEST.Car.FooFooTEST.Car.Foo
*/

所以事实证明,当处理算法处理 Car 时,它还“记住”了 TEST.Car 的替代(因为它可能是名义类型),而不仅仅是 Car 自己。无论以后是否使用替换都会发生这种情况,可能是为了更容易进行分解 (?)

当您将代码更改为:

时,您也可以看到它的效果
class Car
{
    class Foo
    {
        func Foo() -> Car
        {
            fatalError("")
        }
    }
}

现在方法 Foo 的损坏名称是 $s6output3CarC3FooCAdCyF,利用了 AC.

作为心智模型,您可以将其视为与错位名称中的字母 C 以及 <number><identifier> 部分相关联的替代索引,如下所示:

$s4TEST3CarC3FooCADyyF
   ^     ^ ^  ^ ^
   |     | |  | |
  AA     ABAC ADAE

第二种情况发生了类似的事情。 ABTEST.TESTADTEST.TEST.Car