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";
            }
        }
Пример #2
0
        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();
            }
        }