Beispiel #1
0
        public void TwoModuleWithSingleConstant()
        {
            TestMultipleCodeGen <INamedTypeSymbol>(@"
        public class MyModule1
        {
          public int MyConstant1 => 10;
        }

        public class MyModule2
        {
          public int MyConstant2 => 10;
        }
        ",
                                                   (codeGen, symbols) =>
            {
                var modules = symbols.Select(symbol =>
                {
                    var constant = symbol.GetMembers().OfType <IPropertySymbol>().First();
                    var module   = new ReactModule(symbol, symbol.Name, "EventEmitter");
                    module.Constants.Add(new ReactConstant(constant, constant.Name));
                    return(module);
                });

                return(codeGen.CreateModules(modules));
            }
                                                   );
        }
Beispiel #2
0
        public void SingleModuleWithSingleConstant()
        {
            TestCodeGen <INamedTypeSymbol>(@"
        public class MyModule
        {
          public int MyConstant => 10;
        }
        ",
                                           (codeGen, symbol) =>
            {
                var constant = symbol.GetMembers().OfType <IPropertySymbol>().First();
                var module   = new ReactModule(symbol, "MyMod", "EventEmitter");
                module.Constants.Add(new ReactConstant(constant, "MyConst"));

                return(codeGen.CreateModules(new[] { module }));
            }
                                           );
        }
        internal bool TryExtractModule(INamedTypeSymbol type, [NotNullWhen(returnValue: true)] out ReactModule?module)
        {
            if (TryFindAttribute(type, ReactTypes.ReactModuleAttribute, out var attr))
            {
                string?moduleName       = null;
                string?eventEmitterName = null;

                if (attr.ConstructorArguments.Length > 0)
                {
                    moduleName = attr.ConstructorArguments[0].Value as string;
                }

                foreach (var namedArgument in attr.NamedArguments)
                {
                    switch (namedArgument.Key)
                    {
                    case nameof(ReactModuleAttribute.ModuleName):
                        moduleName = namedArgument.Value.Value as string;
                        break;

                    case nameof(ReactModuleAttribute.EventEmitterName):
                        eventEmitterName = namedArgument.Value.Value as string;
                        break;

                    default:
                        var location = attr.ApplicationSyntaxReference?.SyntaxTree.GetLocation(attr.ApplicationSyntaxReference.Span);
                        m_diagnostics.Add(Diagnostic.Create(DiagnosticDescriptors.UnexpectedPropertyInAttribute, location ?? Location.None, namedArgument.Key, attr.AttributeClass?.Name));
                        module = null;
                        return(false);
                    }
                }

                moduleName ??= type.Name;
                eventEmitterName ??= ReactNativeNames.DefaultEventEmitterName;

                module = new ReactModule(type, moduleName, eventEmitterName);

                foreach (var member in type.GetMembers())
                {
                    if (member is IMethodSymbol method)
                    {
                        if (TryExtractMethod(method, out var asyncMethod))
                        {
                            module.Methods.Add(asyncMethod);
                        }
                        else if (TryExtractSyncMethod(method, out var syncMethod))
                        {
                            module.Methods.Add(syncMethod);
                        }
                        else if (TryExtractInitializer(method, out var initializer))
                        {
                            module.Initializers.Add(initializer);
                        }
                        else if (TryExtractConstantProvider(method, out var constantProvider))
                        {
                            module.ConstantProviders.Add(constantProvider);
                        }
                    }
                    else if (member is IPropertySymbol || member is IFieldSymbol)
                    {
                        if (TryExtractConstant(member, out var constant))
                        {
                            module.Constants.Add(constant);
                        }
                        else if (TryExtractEvent(member, eventEmitterName, out var evnt))
                        {
                            module.Events.Add(evnt);
                        }
                        else if (TryExtractFunction(member, moduleName, out var function))
                        {
                            module.Functions.Add(function);
                        }
                    }
                }

                return(true);
            }

            module = null;
            return(false);
        }