private static void GenerateBaseInitializerExpression(ScriptGenerator generator, MemberSymbol symbol,
                                                              BaseInitializerExpression expression)
        {
            ScriptTextWriter writer = generator.Writer;

            Debug.Assert(symbol.Parent is ClassSymbol);

            ClassSymbol baseClass = ((ClassSymbol)symbol.Parent).BaseClass;

            Debug.Assert(baseClass != null);

            if (baseClass.GenericArguments?.Any() ?? false)
            {
                writer.Write(DSharpStringResources.ScriptExportMember("getGenericConstructor"));
                writer.Write("(");
                writer.Write(baseClass.FullGeneratedName);
                writer.Write(", ");
                generator.WriteGenericTypeArgumentsMap(baseClass.GenericArguments, baseClass.GenericParameters);
                writer.Write(")");
            }
            else
            {
                writer.Write(baseClass.FullGeneratedName);
            }

            writer.Write(".call(this");

            if (expression.Parameters != null)
            {
                writer.Write(", ");
                GenerateExpressionList(generator, symbol, expression.Parameters);
            }

            writer.Write(")");
        }
Exemple #2
0
        private static void GenerateBaseInitializerExpression(ScriptGenerator generator, MemberSymbol symbol,
                                                              BaseInitializerExpression expression)
        {
            ScriptTextWriter writer = generator.Writer;

            Debug.Assert(symbol.Parent is ClassSymbol);

            ClassSymbol baseClass = ((ClassSymbol)symbol.Parent).BaseClass;

            Debug.Assert(baseClass != null);

            writer.Write(baseClass.FullGeneratedName);
            writer.Write(".call(this");

            if (expression.Parameters != null)
            {
                writer.Write(", ");
                GenerateExpressionList(generator, symbol, expression.Parameters);
            }

            writer.Write(")");
        }
Exemple #3
0
        private SymbolImplementation BuildImplementation(ISymbolTable symbolTable, CodeMemberSymbol symbolContext,
                                                         BlockStatementNode implementationNode, bool addAllParameters)
        {
            rootScope    = new SymbolScope(symbolTable);
            currentScope = rootScope;

            List <Statement> statements       = new List <Statement>();
            StatementBuilder statementBuilder = new StatementBuilder(this, symbolContext, errorHandler, options);

            if (symbolContext.Parameters != null)
            {
                int parameterCount = symbolContext.Parameters.Count;

                if (addAllParameters == false)
                {
                    // For property getters (including indexers), we don't add the last parameter,
                    // which happens to be the "value" parameter, which only makes sense
                    // for the setter.

                    parameterCount--;
                }

                for (int paramIndex = 0; paramIndex < parameterCount; paramIndex++)
                {
                    currentScope.AddSymbol(symbolContext.Parameters[paramIndex]);
                }
            }

            if (symbolContext.Type == SymbolType.Constructor &&
                (((ConstructorSymbol)symbolContext).Visibility & MemberVisibility.Static) == 0)
            {
                Debug.Assert(symbolContext.Parent is ClassSymbol);

                if (((ClassSymbol)symbolContext.Parent).BaseClass != null)
                {
                    BaseInitializerExpression baseExpr = new BaseInitializerExpression();

                    ConstructorDeclarationNode ctorNode = (ConstructorDeclarationNode)symbolContext.ParseContext;

                    if (ctorNode.BaseArguments != null)
                    {
                        ExpressionBuilder expressionBuilder =
                            new ExpressionBuilder(this, symbolContext, errorHandler, options);

                        Debug.Assert(ctorNode.BaseArguments is ExpressionListNode);
                        ICollection <Expression> args =
                            expressionBuilder.BuildExpressionList((ExpressionListNode)ctorNode.BaseArguments);

                        foreach (Expression paramExpr in args)
                        {
                            baseExpr.AddParameterValue(paramExpr);
                        }
                    }

                    statements.Add(new ExpressionStatement(baseExpr));
                }
            }

            foreach (StatementNode statementNode in implementationNode.Statements)
            {
                Statement statement = statementBuilder.BuildStatement(statementNode);

                if (statement != null)
                {
                    statements.Add(statement);
                }
            }

            string thisIdentifier = "this";

            if (symbolContext.Type == SymbolType.AnonymousMethod)
            {
                thisIdentifier = "$this";
            }

            return(new SymbolImplementation(statements, rootScope, thisIdentifier));
        }