attachParentName() infinitely recurses on templated structs #3

Open
opened 2023-04-27 16:42:13 +02:00 by 0xEAB · 5 comments
0xEAB commented 2023-04-27 16:42:13 +02:00 (Migrated from gitlab.com)

If a System is a template instantiation, attachParentName will be an infinite recursion.

../bubel-ecs/source/bubel/ecs/traits.d(88,10): Error: template instance `ecs.traits.attachParentName!(TemplateStruct!(ParamStruct), "TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct)")` recursive expansion exceeded allowed nesting limit

import bubel.ecs;

void main() {
    gEntityManager.initialize();
    scope (exit)
        gEntityManager.destroy();

   gEntityManager.registerSystem!(TemplateStruct!ParamStruct)(0);
}

struct ParamStruct {}

struct TemplateStruct(T) {
    mixin ECS.System;
    struct EntitiesData {}
}

Tested with v0.1.1 and 50fa2ce19c.

If a System is a template instantiation, `attachParentName` will be an infinite recursion. ``` ../bubel-ecs/source/bubel/ecs/traits.d(88,10): Error: template instance `ecs.traits.attachParentName!(TemplateStruct!(ParamStruct), "TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct)")` recursive expansion exceeded allowed nesting limit ``` ```d import bubel.ecs; void main() { gEntityManager.initialize(); scope (exit) gEntityManager.destroy(); gEntityManager.registerSystem!(TemplateStruct!ParamStruct)(0); } struct ParamStruct {} struct TemplateStruct(T) { mixin ECS.System; struct EntitiesData {} } ``` Tested with v0.1.1 and 50fa2ce19c96bf25678886f92de20ea48ac993a2.
0xEAB commented 2023-04-27 20:08:45 +02:00 (Migrated from gitlab.com)

This patch does the job for the latest compilers:

diff --git a/source/bubel/ecs/traits.d b/source/bubel/ecs/traits.d
index 79901db..b484fdd 100644
--- a/source/bubel/ecs/traits.d
+++ b/source/bubel/ecs/traits.d
@@ -92,5 +92,8 @@ static string attachParentName(alias T, string str)()
 
 static string fullName(T)()
 {
+       static if (__VERSION__ >= 2103)
+               return __traits(fullyQualifiedName, T);
+       else
        return attachParentName!(T, T.stringof);
 }

This patch does the job for the latest compilers: ```patch diff --git a/source/bubel/ecs/traits.d b/source/bubel/ecs/traits.d index 79901db..b484fdd 100644 --- a/source/bubel/ecs/traits.d +++ b/source/bubel/ecs/traits.d @@ -92,5 +92,8 @@ static string attachParentName(alias T, string str)() static string fullName(T)() { + static if (__VERSION__ >= 2103) + return __traits(fullyQualifiedName, T); + else return attachParentName!(T, T.stringof); } ```
Mergul commented 2023-04-27 22:07:52 +02:00 (Migrated from gitlab.com)

I used __traits(fullQualifiedName, T) in the past. But since it doesn't work in betterC mode I came up with my simplified version which works also in betterC.
In general, this is used to generate names for components and systems when registering. Fully qualified name is used te prevent overwriting components/systems with same name but from different modules.
For some reason my code works fine if template struct has any function (it can be even an empty function with random name).

I used __traits(fullQualifiedName, T) in the past. But since it doesn't work in betterC mode I came up with my simplified version which works also in betterC. In general, this is used to generate names for components and systems when registering. Fully qualified name is used te prevent overwriting components/systems with same name but from different modules. For some reason my code works fine if template struct has any function (it can be even an empty function with random name).
Mergul commented 2023-04-27 23:17:50 +02:00 (Migrated from gitlab.com)

I've looked into fullyQualifiedName implementation and came up with other simple implementation which should fix your issue. For my test cases it gives me same outputs as fullyQualifiedName.
It might still has some corner cases I haven't tested. I would have to test it with my projects before merging.
Can you check branch 3-template-system-compilation-fail?

I've looked into fullyQualifiedName implementation and came up with other simple implementation which should fix your issue. For my test cases it gives me same outputs as fullyQualifiedName. It might still has some corner cases I haven't tested. I would have to test it with my projects before merging. Can you check branch **3-template-system-compilation-fail**?
0xEAB commented 2023-04-29 16:23:14 +02:00 (Migrated from gitlab.com)

I used __traits(fullQualifiedName, T) in the past. But since it doesn't work in betterC mode

But that’s not true…

$ cat test.d
module app.fun;

import core.stdc.stdio;

extern(C) void main() {
	enum string fqn =__traits(fullyQualifiedName, C!bool);
	printf("%.*s\n", cast(int)fqn.length, fqn.ptr);
}

struct C(X) {
}
$ dmd -betterC test.d -of=test
$ ./test
app.fun.C!bool.C
> I used \__traits(fullQualifiedName, T) in the past. But since it doesn't work in betterC mode But that’s not true… ```sh $ cat test.d module app.fun; import core.stdc.stdio; extern(C) void main() { enum string fqn =__traits(fullyQualifiedName, C!bool); printf("%.*s\n", cast(int)fqn.length, fqn.ptr); } struct C(X) { } ``` ```sh $ dmd -betterC test.d -of=test $ ./test app.fun.C!bool.C ```
Mergul commented 2023-05-28 18:22:10 +02:00 (Migrated from gitlab.com)

Sorry for late response.

Ohh, yes, my mistake. I was thinking about std.traits.fullyQualifiedName. fullyQualifiedName seems to be missing from __traits documentation.

I checked methods from discrod. typeid isn't uniqe (and throws compilation error in betterC).
mangleof gives uniqe name, but it doesn't look nice as name compared to fullyQualifiedName (and I believe that D changed it's mangling rules at least once in the past).
__traits(fullyQualifiedName, T) gives different results than fullyQualifiedName!T, and it isn't really unique for Templates (as template parameters aren't fullyQualifiedNames, just symbol name).
fullyQualifiedName is best but doesn't work in betterC.
My implementation gives same results as fullyQualifiedName. I recently fixed some cases in my implementation.
My plans for library were to implement API where your can specify name by yourself if you want. I'm using names for components in a way where those have to be stable across different language versions (storing names when serializing entities allowing for scene saving and hot-reload in my other projects)

Sorry for late response. Ohh, yes, my mistake. I was thinking about std.traits.fullyQualifiedName. fullyQualifiedName seems to be missing from __traits documentation. I checked methods from discrod. typeid isn't uniqe (and throws compilation error in betterC). mangleof gives uniqe name, but it doesn't look nice as name compared to fullyQualifiedName (and I believe that D changed it's mangling rules at least once in the past). __traits(fullyQualifiedName, T) gives different results than fullyQualifiedName!T, and it isn't really unique for Templates (as template parameters aren't fullyQualifiedNames, just symbol name). fullyQualifiedName is best but doesn't work in betterC. My implementation gives same results as fullyQualifiedName. I recently fixed some cases in my implementation. My plans for library were to implement API where your can specify name by yourself if you want. I'm using names for components in a way where those have to be stable across different language versions (storing names when serializing entities allowing for scene saving and hot-reload in my other projects)
Sign in to join this conversation.
No labels
Feedback
Meson
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference: Bubel/bubel-ecs#3
No description provided.