Exemplo n.º 1
0
        private bool TryExtractInitializer(IMethodSymbol method, [NotNullWhen(returnValue: true)] out ReactInitializer?initializer)
        {
            initializer = null;
            if (TryFindAttribute(method, ReactTypes.ReactInitializerAttribute, out _))
            {
                if (!IsAccessible(method))
                {
                    m_diagnostics.Add(
                        Diagnostic.Create(DiagnosticDescriptors.InitializersMustBePublicOrInternal,
                                          method.GetLocation(),
                                          method.ReturnType.ToDisplayString(SymbolDisplayFormat.CSharpErrorMessageFormat),
                                          method.Name,
                                          method.ContainingSymbol.ToDisplayString(SymbolDisplayFormat.CSharpErrorMessageFormat),
                                          method.DeclaredAccessibility
                                          ));
                    return(false);
                }

                if (!method.ReturnsVoid)
                {
                    m_diagnostics.Add(
                        Diagnostic.Create(DiagnosticDescriptors.InitializersMustReturnVoid,
                                          method.GetLocation(),
                                          method.ReturnType.ToDisplayString(SymbolDisplayFormat.CSharpErrorMessageFormat),
                                          method.Name,
                                          method.ContainingSymbol.ToDisplayString(SymbolDisplayFormat.CSharpErrorMessageFormat)
                                          ));
                    return(false);
                }

                if (method.Parameters.Length != 1 || !method.Parameters[0].Type.Equals(ReactTypes.ReactContext, SymbolEqualityComparer.Default))
                {
                    m_diagnostics.Add(
                        Diagnostic.Create(DiagnosticDescriptors.InitializersMustHaveOneParameterOfTypeReactContext,
                                          method.GetLocation(),
                                          ReactTypes.ReactContext.ToDisplayParts(SymbolDisplayFormat.FullyQualifiedFormat),
                                          method.Parameters.Length.ToString(CultureInfo.InvariantCulture),
                                          method.Name,
                                          method.ContainingSymbol.ToDisplayString(SymbolDisplayFormat.CSharpErrorMessageFormat)
                                          ));
                    return(false);
                }

                initializer = new ReactInitializer(method);
                return(true);
            }

            return(false);
        }
Exemplo n.º 2
0
 internal StatementSyntax AddInitializer(ReactInitializer initializer)
 {
     // generates:
     //    moduleBuilder.AddInitializer((IReactContext reactContext) => module.initializerMethod(new ReactContext(reactContext)));
     return(InvocationStatement(
                MemberAccessExpression(ReactNativeNames.ModuleBuilder, ReactNativeNames.AddInitializer),
                ParenthesizedLambdaExpression(
                    parameterList: ParameterList(
                        Parameter(ReactNativeNames.ReactContextLocalName).WithType(ReactTypes.IReactContext.ToTypeSyntax())),
                    block: null,
                    expressionBody: InvocationExpression(
                        MemberAccessExpression(ReactNativeNames.Module, Identifier(initializer.Method.Name)),
                        ObjectCreationExpression(ReactTypes.ReactContext, IdentifierName(ReactNativeNames.ReactContextLocalName))
                        ))));
 }
Exemplo n.º 3
0
        /// <summary>
        /// creates a new <see cref="ScriptCompiler"/>
        /// </summary>
        /// <param name="logger">access to logging</param>
        /// <param name="parser">parser used to parse scripts</param>
        /// <param name="cache">access to object cache</param>
        /// <param name="methodprovider">provides managed method hosts to scripts</param>
        /// <param name="scriptservice">used to load scripts if not found in cache</param>
        /// <param name="archive">archive used to load revisions</param>
        /// <param name="importservice">access to javascript imports</param>
        /// <param name="pythonservice">access to python script logic</param>
        /// <param name="luaservice">used to execute lua code</param>
        public ScriptCompiler(ILogger <ScriptCompiler> logger, IScriptParser parser, ICacheService cache, IMethodProviderService methodprovider, IScriptService scriptservice, IArchiveService archive, IScriptImportService importservice, IPythonService pythonservice, ILuaService luaservice)
        {
            this.parser        = parser;
            this.cache         = cache;
            this.scriptservice = scriptservice;
            this.archive       = archive;
            this.importservice = importservice;
            this.pythonservice = pythonservice;
            this.luaservice    = luaservice;
            this.logger        = logger;

            if (parser != null)
            {
                parser.Extensions.AddExtensions(typeof(Math));
                parser.Extensions.AddExtensions <ScriptEnumerations>();
                parser.ImportProvider = methodprovider;
            }

            ReactInitializer.Initialize();
        }