@@ -1119,6 +1119,24 @@ metac_type_index_t MetaCSemantic_TypeSemantic(metac_sema_state_t* self,
11191119 decl_type_struct_t * agg = (decl_type_struct_t * ) type ;
11201120 metac_type_aggregate_t tmpSemaAggMem = {(metac_decl_kind_t )0 };
11211121 metac_type_aggregate_t * tmpSemaAgg = & tmpSemaAggMem ;
1122+ metac_scope_t tmpTemplateScope = {0 };
1123+
1124+ if (agg -> ParameterCount != 0 )
1125+ {
1126+ U32 (tmpTemplateScope .ScopeFlags ) |= scope_flag_temporary ;
1127+ MetaCSemantic_PushTemporaryScope (self , & tmpTemplateScope );
1128+ for (decl_parameter_t * param = agg -> Parameters ;
1129+ METAC_NODE (param -> Next ) != emptyNode ;
1130+ param = param -> Next )
1131+ {
1132+ metac_expr_t placeHolder ;
1133+
1134+ AllocNewSemaExpr (self , )
1135+ metac_node_t unsresolvedNode = (metac_node_t ) 0x2 ;
1136+ MetaCScope_RegisterIdentifier (& tmpTemplateScope , param -> Parameter -> VarIdentifier , unresolvedNode );
1137+ }
1138+ xprintf ("We have a template\n" );
1139+ }
11221140
11231141 if (type -> Kind == decl_type_struct )
11241142 typeKind = type_struct ;
@@ -1268,46 +1286,43 @@ metac_type_index_t MetaCSemantic_TypeSemantic(metac_sema_state_t* self,
12681286 MetaCPrinter_Init (& debugPrinter , self -> ParserIdentifierTable , self -> ParserStringTable , & self -> TempAlloc );
12691287#endif
12701288 ARENA_ARRAY_ENSURE_SIZE (semaArguments , tInst -> ArgumentCount );
1289+ // before calling semantic we need to mount the template instance scope.
1290+ metac_scope_t tmpScope = {(metac_decl_kind_t )0 };
1291+ U32 (tmpScope .ScopeFlags ) |= scope_flag_temporary ;
1292+ MetaCSemantic_PushTemporaryScope (self , & tmpScope );
12711293
1294+ for (metac_expr_t * * ep = & args -> Expr ; METAC_NODE (args ) != emptyNode ; args = args -> Next , ep = & args -> Expr )
1295+ {
1296+ metac_expr_t * e = * ep ;
1297+ ARENA_ARRAY_ADD (semaArguments , MetaCSemantic_doExprSemantic (self , e , 0 ));
1298+ }
12721299
1273- for (metac_expr_t * e = args -> Expr ; METAC_NODE (args ) != emptyNode ; args = args -> Next , e = args -> Expr )
12741300 {
1275- #if 0
1276- MetaCPrinter_PrintExpr (& debugPrinter , e );
1277- if (METAC_NODE (args -> Next ) != emptyNode )
1301+ metac_decl_t * symbol = NULL ;
1302+ metac_expr_t * arguments = cast (metac_expr_t * ) emptyNode ;
1303+ uint32_t hash = crc32c_nozero (~0 , & symbol -> Hash , sizeof (symbol -> Hash ));
1304+ uint32_t nArguments = 0 ;
1305+ for (uint32_t argIdx = 0 ; argIdx < nArguments ; argIdx ++ )
12781306 {
1279- MetaCPrinter_RemoveZeroTerminator (& debugPrinter );
1280- MetacPrinter_PrintStringLiteral (& debugPrinter , ", " );
1307+ hash = crc32c_nozero (hash , & arguments [argIdx ].Hash , sizeof (arguments [argIdx ].Hash ));
12811308 }
1282- #endif
1283- ARENA_ARRAY_ADD (semaArguments , MetaCSemantic_doExprSemantic (self , e , 0 ));
1284- }
1285- int k = 12 ;
1286- assert (!"I don't do template instances just yet" );
1287-
1288-
1289-
1290- /*
1291- metac_type_header_t Header;
1292- metac_type_index_t TypeIndex;
1293- metac_decl_t* Symbol;
1294- metac_expr_t* Arguments;
1295- uint32_t ArgumentCount;
1296- */
1297- uint32_t hash = ~0 ;
1298- metac_decl_t * symbol = NULL ;
1299- metac_expr_t * arguments = cast (metac_expr_t * ) emptyNode ;
1300- uint32_t nArguments = 0 ;
13011309 {
13021310 metac_type_header_t header = {decl_type_template_instance , 0 , hash , 0 };
1303- metac_type_template_t key = {
1304- header ,
1305- zeroIdx ,
1306- symbol ,
1307- arguments ,
1308- nArguments ,
1309- };
1310- }
1311+ metac_type_template_t key = {
1312+ header ,
1313+ zeroIdx ,
1314+ symbol ,
1315+ arguments ,
1316+ nArguments ,
1317+ };
1318+ result = MetaCTypeTable_GetOrEmptyTemplateType (& self -> TemplateTypeTable , & key );
1319+ if (result .v == 0 )
1320+ {
1321+ MetaCTypeTable_AddTemplateType (& self -> TemplateTypeTable , & key );
1322+ }
1323+ }
1324+
1325+ }
13111326
13121327 }
13131328 else if (type -> Kind == decl_type )
0 commit comments