コード例 #1
0
        public MethodMarshallingContext(VTableCreationState state, List <StructDeclarationSyntax> RegisteredWrappers)
        {
            WrapperSymbols.Capacity = RegisteredWrappers.Count;

            foreach (var decl in RegisteredWrappers)
            {
                var model = state.GetSemanticModel(decl.SyntaxTree);

                var symbol = model.GetDeclaredSymbol(decl) ?? throw new InvalidOperationException();

                //TODO: Verify Attribute

                var handleSymbol = symbol.GetMembers()
                                   .FirstOrDefault(member => ((member is IFieldSymbol field && field.Type.IsUnmanagedType) ||
                                                              (member is IPropertySymbol prop && prop.Type.IsUnmanagedType)) &&
                                                   member.Name == "Handle");

                if (handleSymbol is null)
                {
                    //TODO: Create Diagnostic for this situation
                    continue;
                }

                if (handleSymbol.DeclaredAccessibility != Accessibility.Public)
                {
                    //TODO: Create Diagnostic for this situation
                    continue;
                }

                WrapperSymbols.Add(symbol);
            }

            FmodBoolType = state.Compilation.GetTypeByMetadataName("FmodAudio.Base.FmodBool");
        }
コード例 #2
0
        public void Execute(GeneratorExecutionContext context)
        {
            if (!(context.SyntaxReceiver is VTableSyntaxReceiver reciever))
            {
                return;
            }

            var state = new VTableCreationState(context, reciever);

            if (context.CancellationToken.IsCancellationRequested)
            {
                return;
            }

            state.GenerateSources();
        }