protected virtual void _visit( JsBlock node )
 {
     throw new NotImplementedException( "JsBlock" );
 }
        JsFunction getInjectionPointsFunction(DefaultResolvedTypeDefinition arg1)
        {
            IList<IMethod> constructors = IEntityUtils.getClassConstructors(arg1);
            IList<IField> fields = IEntityUtils.getFieldsByAttribute( arg1, RandoriClassNames.metadataInject );
            IList<IProperty> properties = IEntityUtils.getPropertiesByAttribute( arg1, RandoriClassNames.metadataInject );
            IList<IField> views = IEntityUtils.getFieldsByAttribute( arg1, RandoriClassNames.metadataView );
            IList<IMethod> methods = IEntityUtils.getClassMethodsByAttribute( arg1, RandoriClassNames.metadataInject );

            JsFunction result = new JsFunction();
            result.Parameters = new List<string>();
            result.Parameters.Add(InjectionPointVariableConstants.INJECTION_POINT_PARAMETER_NAME);

            // function contents
            JsBlock resultsBlock = new JsBlock();
            resultsBlock.Statements = new List<JsStatement>();

            // add the block
            result.Block = resultsBlock;

            // Determine what the super class is in the event we need to call the super class's injectionPoints method
            string superClassPath = null;
            foreach (IType type in arg1.DirectBaseTypes)
            {
                // Careful, type.FullName could be all sorts of stuff, like interfaces
                if (type.Kind == TypeKind.Class)
                {
                    bool initArray = GuiceUtils.shouldExcludeBasedOnNamespace(type.Namespace);
                    if (!initArray)
                    {
                        superClassPath = type.FullName;
                    }
                }
            }

            JsSwitchStatement injectionPoints = getInjectionSwitchStatement( InjectionPointVariableConstants.INJECTION_POINT_PARAMETER_NAME, constructors, fields, methods, views, properties, superClassPath );
            if (injectionPoints != null)
            {
                resultsBlock.Statements.Add( AstUtils.getJsVariableDeclarationStatement( InjectionPointVariableConstants.SWITCH_RETURN_VARIABLE_NAME ) );
                resultsBlock.Statements.Add(injectionPoints);
                // return the result variable
                resultsBlock.Statements.Add( AstUtils.getJsReturnStatement( InjectionPointVariableConstants.SWITCH_RETURN_VARIABLE_NAME ) );
            }
            else
            {
                JsInvocationExpression initer = AstUtils.getEmptyArrayInvocationExpression();
                resultsBlock.Statements.Add(AstUtils.getJsReturnStatement(initer));
            }

            return result;
        }
Ejemplo n.º 3
0
        protected JsBlock ExportConstructorBody(IMethod ctor)
        {
            var ctorNode = (ConstructorDeclaration)ctor.GetDeclaration();
            BlockStatement ccc = null;
            if (ctorNode != null)
                ccc = ctorNode.Body;
            //var ccc = ctor.GetDefinition();//.decl as CsConstructor;
            //var ccc = ctor.GetDefinition();
            var block2 = (JsBlock)AstNodeConverter.Visit(ccc);
            if (block2 == null)
                block2 = new JsBlock { Statements = new List<JsStatement>() };
            var ce = ctor.GetDeclaringTypeDefinition();
            var isClr = Sk.IsClrType(ce);
            var isPrototype = Sk.IsNativeType(ce);
            var statements = new List<JsStatement>();
            //instance fields initializations
            if (!Sk.InlineFields(ce))
            {
                var isGlobal = Sk.IsGlobalType(ce);
                var fields = GetExportedDeclaredAndGeneratedFields(ce, ctor.IsStatic);
                //var fields = ctor.GetDeclaringTypeDefinition().GetFields(null, GetMemberOptions.IgnoreInheritedMembers).Where(t => t.IsStatic() == ctor.IsStatic).ToList();
                //fields = fields.Where(ShouldExportField).ToList();
                //fields.AddRange(GeneratePropertyFields(ctor.DeclaringTypeDefinition, ctor.IsStatic));

                //var props = ctor.GetDeclaringTypeDefinition().GetProperties(null, GetMemberOptions.IgnoreInheritedMembers).Where(t => t.IsStatic() == ctor.IsStatic).ToList();
                //props = props.Where(t=>Sk.IsNativeField(t)).ToList();
                //props = props.Where(t => Sk.IsJsExported(t)).ToList();
                //var fieldsAndProperties = fields.Cast<IEntity>().Concat(props.Cast<IEntity>());
                var initializers = fields.Select(fe => ExportInitializer(fe, null, isGlobal, false)).Cast<JsStatement>().ToList();
                if (initializers.Contains(null))
                    Log.Warn("Some field initializers were not exported");
                statements.AddRange(initializers.Where(t => t != null));
            }

            if (!ctor.IsStatic)
            {
                //base/this ctor invocation
                var invocation = GetConstructorBaseOrThisInvocation2(ctor);
                if (invocation != null)
                {
                    var baseThisCe = invocation.Member.DeclaringType;
                    var isBaseClr = Sk.IsClrType(baseThisCe.GetDefinition());
                    var isBasePrototype = Sk.IsNativeType(baseThisCe.GetDefinition()) && !Sk.IsJsonMode(baseThisCe.GetDefinition()) && !Sk.IsGlobalType(baseThisCe.GetDefinition());//happens when prototype inherits from json
                    if (isBaseClr == isClr && isBasePrototype == isPrototype) //base and derived are both prototype, or both are clr
                    {
                        var newObjExp2 = AstNodeConverter.VisitExpression(invocation);
                        JsInvocationExpression invocation2;
                        if (newObjExp2 is JsNewObjectExpression)
                        {
                            var newObjExp = (JsNewObjectExpression)newObjExp2;
                            invocation2 = newObjExp.Invocation;
                        }
                        else if (newObjExp2 is JsInvocationExpression)
                        {
                            invocation2 = (JsInvocationExpression)newObjExp2;
                        }
                        else
                        {
                            throw new Exception("Unexpected node: " + newObjExp2);
                        }
                        if (Sk.IsExtJsType(ce))
                        {
                            var invocation3 = Js.This().Member("callParent").Invoke();
                            if (invocation2.Arguments.IsNotNullOrEmpty())
                                invocation3.Arguments = new List<JsExpression> { Js.NewJsonArray(invocation2.Arguments.NotNull().ToArray()) };
                            statements.Add(invocation3.Statement());
                        }
                        else
                        {
                            JsRefactorer.ToCallWithContext(invocation2, new JsThis());
                            statements.Add(invocation2.Statement());
                        }
                    }
                }
            }
            if (block2.Statements == null)
                block2.Statements = new List<JsStatement>();
            block2.Statements.InsertRange(0, statements);

            return block2;
        }
        protected JsFunction getCachedHtmlFileFunction(string arrayName)
        {
            JsFunction result = null;
            JsBlock resultsBlock = null;

            if ( arrayName != null )
            {
                JsIfStatement ifArrayNotNull = new JsIfStatement();
                string arrayKeyStr = arrayName + "[ " + FILE_NAME_PARAMETER + " ]";
                ifArrayNotNull.Condition = AstUtils.getJsBinaryExpression(AstUtils.getNewMemberExpression(arrayKeyStr), "!=", new JsNullExpression());

                JsBlock ifBlock = new JsBlock();
                ifBlock.Statements = new List<JsStatement>();
                ifArrayNotNull.IfStatement = ifBlock;
                ifBlock.Statements.Add(AstUtils.getJsReturnStatement(arrayKeyStr));

                // function contents
                resultsBlock = new JsBlock();
                resultsBlock.Statements = new List<JsStatement>();
                resultsBlock.Statements.Add(ifArrayNotNull);
                resultsBlock.Statements.Add(new JsReturnStatement());
            }

            if (resultsBlock != null)
            {
                result = new JsFunction();
                result.Parameters = new List<string>();
                result.Parameters.Add(FILE_NAME_PARAMETER);
                result.Block = resultsBlock;
            }

            return result;
        }
        protected JsFunction getHtmlFileListFunction(List<string> fileList)
        {
            JsFunction result = null;
            JsBlock resultsBlock = null;

            if (fileList != null && fileList.Count > 0)
            {
                // function contents
                resultsBlock = new JsBlock();
                resultsBlock.Statements = new List<JsStatement>();
                resultsBlock.Statements.Add(AstUtils.getJsVariableDeclarationStatement(InjectionPointVariableConstants.SWITCH_RETURN_VARIABLE_NAME,
                                                                                       AstUtils.getEmptyArrayInvocationExpression()));

                foreach (string fileName in fileList)
                {
                    string fileNameStr = "{n:\'" + fileName + "\'}";
                    resultsBlock.Statements.Add( AstUtils.getArrayInsertStatement( InjectionPointVariableConstants.SWITCH_RETURN_VARIABLE_NAME, fileNameStr ) );
                }

                resultsBlock.Statements.Add( AstUtils.getJsReturnStatement( InjectionPointVariableConstants.SWITCH_RETURN_VARIABLE_NAME) );
            }

            if (resultsBlock != null)
            {
                result = new JsFunction();
                result.Block = resultsBlock;
            }

            return result;
        }
 protected override void _visit(JsBlock node)
 {
     if (node != null)
     {
         foreach (JsStatement statement in node.Statements)
         {
             visit(statement);
         }
     }
 }
        /***************************************************************************************************************************/
        /************************************************ For Getters and Setters **************************************************/
        /***************************************************************************************************************************/
        public static JsExpressionStatement getGetterSetterExpression(string propertyName, string returnName)
        {
            if(propertyName == null)
            {
                return null;
            }

            JsMemberExpression leftExp = getNewMemberExpression(propertyName);

            //
            JsBlock rightBlock = new JsBlock();
            rightBlock.Statements = new List<JsStatement>();
            rightBlock.Statements.Add(getJsReturnStatement(returnName));

            //
            JsFunction rightExp = new JsFunction();
            rightExp.Block = rightBlock;

            JsExpressionStatement results = new JsExpressionStatement();
            results.Expression = getJsAssignmentStatement(leftExp, null, rightExp);

            return results;
        }
        public JsFunction getClassDependencyFunction(JsUnit jsNode)
        {
            // function contents
            JsBlock resultsBlock = new JsBlock();
            resultsBlock.Statements = new List<JsStatement>();

            // Check to see if we need to call super.
            string superClassPath = null;

            // bschmidtke: 12/04/1012 - We do not want to call super at the moment, commenting out to value remains null.
            // Clean up later once this is confirmed after testing.
            // Leaving the code using superClassPath intact until we decide what route to go with this.

            //bool initArray = true;
            //foreach (IType type in cSharpDef.DirectBaseTypes)
            //{
            //    // careful, type.FullName could be all sorts of stuff, like interfaces
            //    if (type.Kind == TypeKind.Class)
            //    {
            //        initArray = GuiceUtils.shouldExcludeBasedOnNamespace(type.Namespace);
            //        if (!initArray)
            //        {
            //            superClassPath = type.FullName;
            //        }
            //    }
            //}

            JsBinaryExpression pExpression = null;
            JsInvocationExpression initializer = null;

            // If we have to call super...do it
            // in the case of properties methods and views, we will call super if a superClassPath is defined.
            if (superClassPath != null)
            {
                // define return variable and call super
                initializer = AstUtils.getStaticMethodCallInvocationExpression(OutputNameConstants.FUNCTION_GET_CLASS_DEPENDENCIES, superClassPath, null);

                // initalized the result array, by calling super
                pExpression = AstUtils.getJsBinaryExpression(
                                                                AstUtils.getNewMemberExpression(InjectionPointVariableConstants.SWITCH_RETURN_VARIABLE_NAME),
                                                                "=",
                                                                initializer
                                                                );
            }
            else
            {
                // initalized empty result array
                pExpression = AstUtils.getJsBinaryExpression( AstUtils.getNewMemberExpression( InjectionPointVariableConstants.SWITCH_RETURN_VARIABLE_NAME ),
                                                                                "=",
                                                                                AstUtils.getEmptyArrayInvocationExpression());
            }

            JsExpressionStatement pStatement = AstUtils.getJsExpressionStatement(pExpression);

            // define return variable.
            resultsBlock.Statements.Add( AstUtils.getJsVariableDeclarationStatement( InjectionPointVariableConstants.SWITCH_RETURN_VARIABLE_NAME ) );

            ClassDependencyVisitor visitor = new ClassDependencyVisitor( cSharpDef, jsEntity );
            List<string> dependencyList = visitor.dependencyList;

            if (dependencyList.Count > 0)
            {
                resultsBlock.Statements.Add( pStatement );

                List<string> dups = new List<string>();
                foreach ( string dependency in dependencyList )
                {
                    if ( !dups.Contains( dependency ) && dependency.Length > 1 )
                    {
                        dups.Add( dependency );

                        string value = "\'" + dependency + "\'";

                        JsExpressionStatement insert = AstUtils.getArrayInsertStatement( InjectionPointVariableConstants.SWITCH_RETURN_VARIABLE_NAME, value );
                        resultsBlock.Statements.Add( insert );
                    }
                }

                resultsBlock.Statements.Add( AstUtils.getJsReturnStatement( InjectionPointVariableConstants.SWITCH_RETURN_VARIABLE_NAME ) );
            }
            else
            {
                if( initializer != null )
                {
                    // if the super class path was defined, we have to no matter what make sure we call super.
                    resultsBlock.Statements.Add(pStatement);
                    resultsBlock.Statements.Add( AstUtils.getJsReturnStatement( InjectionPointVariableConstants.SWITCH_RETURN_VARIABLE_NAME ) );
                }
                else
                {
                    JsInvocationExpression initer = AstUtils.getEmptyArrayInvocationExpression();
                    resultsBlock.Statements.Add(AstUtils.getJsReturnStatement(initer));
                }
            }

            // define function
            JsFunction result = new JsFunction();
            // add the function block
            result.Block = resultsBlock;
            return result;
        }