private void GenerateTypesList() { foreach (var nmKVP in EnvironmentBuilder !.NamespaceBuilders) { var namespaceName = nmKVP.Key; var namespaceBuilder = nmKVP.Value; var namespaceData = namespaceBuilder.NamespaceData; using var newTypesList = new StructPooledList <Pointer <ES_TypeInfo> > (CL_ClearMode.Auto); newTypesList.EnsureCapacity( namespaceBuilder.ClassBuilders.Count + namespaceBuilder.StructBuilders.Count + namespaceBuilder.EnumBuilders.Count ); foreach (var classKVP in namespaceBuilder.ClassBuilders) { var classBuilder = classKVP.Value; newTypesList.Add(&classBuilder.ClassData->TypeInfo); } foreach (var structKVP in namespaceBuilder.StructBuilders) { var structBuilder = structKVP.Value; newTypesList.Add(&structBuilder.StructData->TypeInfo); } foreach (var enumKVP in namespaceBuilder.EnumBuilders) { var enumBuilder = enumKVP.Value; newTypesList.Add(&enumBuilder.EnumData->TypeInfo); } } }
private static ExpressionSyntax CompileCode_NewObject(ES_TypeInfo *type, ExpressionSyntax?assignValue) { var isReference = type->TypeTag == ES_TypeTag.Reference; // Get the roslyn type. var intPtrType = IdentifierName(nameof(IntPtr)); var roslynType = GetRoslynType(type); // Generate the member access. var accessExpr = MemberAccessExpression(SyntaxKind.SimpleMemberAccessExpression, IdentifierName(nameof(ES_GarbageCollector)), GenericName(Identifier(nameof(ES_GarbageCollector.AllocObject))).WithTypeArgumentList( TypeArgumentList(SingletonSeparatedList(!isReference ? roslynType : intPtrType)) ) ); // Construct the args list. using var argsList = new StructPooledList <SyntaxNodeOrToken> (CL_ClearMode.Auto); argsList.EnsureCapacity(3); // Generate the pointer type syntax for the type pointer. var pointerTypeSyntax = PointerType(IdentifierName(nameof(ES_TypeInfo))); // Add the type pointer. argsList.Add(Argument(PointerLiteral(type, pointerTypeSyntax))); // Add the "pinned" bool. argsList.Add(Token(SyntaxKind.CommaToken)); argsList.Add(Argument(BoolLiteral(false))); // Add the value to assign. if (assignValue is not null) { argsList.Add(Token(SyntaxKind.CommaToken)); if (isReference) { assignValue = CastExpression(intPtrType, assignValue); } argsList.Add(Argument(assignValue)); } // Generate the function call. ExpressionSyntax ret = InvocationExpression(accessExpr) .WithArgumentList(ArgumentList(SeparatedListSpan <ArgumentSyntax> (argsList.Span))); if (isReference) { ret = CastExpression(PointerType(roslynType), ret); } return(ret); }