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