public virtual void AddLocals(IEnumerable <ParameterDeclaration> declarations, AstNode statement) { var visitor = new ReferenceArgumentVisitor(Emitter); statement.AcceptVisitor(visitor); declarations.ToList().ForEach(item => { var rr = item.Parent != null ? (LocalResolveResult)Emitter.Resolver.ResolveNode(item) : null; var name = Emitter.GetParameterName(item); var vName = AddLocal(item.Name, item, item.Type, name); if (item.Parent == null && item.Name == "value" && visitor.DirectionExpression.Any(expr => expr is IdentifierExpression && ((IdentifierExpression)expr).Identifier == "value")) { return; } if (item.ParameterModifier == ParameterModifier.Out || item.ParameterModifier == ParameterModifier.Ref) { Emitter.LocalsMap[rr != null ? rr.Variable : new DefaultVariable(ReflectionHelper.FindType(Emitter.Resolver.Compilation, TypeCode.Object), name)] = vName + ".v"; } else { Emitter.LocalsMap[rr != null ? rr.Variable : new DefaultVariable(ReflectionHelper.FindType(Emitter.Resolver.Compilation, TypeCode.Object), name)] = vName; } }); foreach (var expr in visitor.DirectionExpression) { var rr = Emitter.Resolver.ResolveNode(expr); if (rr is LocalResolveResult lrr && (expr is IdentifierExpression identifierExpression)) { var name = identifierExpression.Identifier; if (Helpers.IsReservedWord(Emitter, name)) { name = Helpers.ChangeReservedWord(name); } Emitter.LocalsMap[lrr.Variable] = name + ".v"; } } foreach (var variable in visitor.DirectionVariables) { var name = variable.Name; if (Helpers.IsReservedWord(Emitter, name)) { name = Helpers.ChangeReservedWord(name); } Emitter.LocalsMap[variable] = name + ".v"; } }
protected virtual void EmitMethodParameters(IEnumerable <ParameterDeclaration> declarations, IEnumerable <TypeParameterDeclaration> typeParamsdeclarations, AstNode context, bool skipCloseParentheses = false) { WriteOpenParentheses(); bool needComma = false; if (typeParamsdeclarations != null && typeParamsdeclarations.Any()) { EmitTypeParameters(typeParamsdeclarations, context); if (declarations.Any()) { EnsureComma(false); } } foreach (var p in declarations) { var name = Emitter.GetParameterName(p); name = name.Replace(JS.Vars.FIX_ARGUMENT_NAME, ""); if (Emitter.LocalsNamesMap != null && Emitter.LocalsNamesMap.ContainsKey(name)) { name = Emitter.LocalsNamesMap[name]; } if (needComma) { WriteComma(); } needComma = true; WriteSourceMapName(p.Name); WriteSequencePoint(p.Region); Write(name); } if (!skipCloseParentheses) { WriteCloseParentheses(); } }