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); }
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)) )))); }
/// <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(); }