Ejemplo n.º 1
0
    public override void CodeGen(OutputContext output)
    {
        string GetName(AstSymbol symbol)
        {
            return(symbol.Thedef?.MangledName ?? symbol.Thedef?.Name ?? symbol.Name);
        }

        var allowShortHand = output.Options.Ecma >= 6;
        var keyString      = Key switch
        {
            AstString str => str.Value,
            AstNumber num => num.Value.ToString("R", CultureInfo.InvariantCulture),
            AstSymbolRef _ => null,
            AstSymbol key => GetName(key),
            _ => null
        };

        if (allowShortHand &&
            Value is AstSymbol value && keyString != null &&
            GetName(value) == keyString &&
            OutputContext.IsIdentifierString(keyString) &&
            OutputContext.IsIdentifier(keyString)
            )
        {
            output.PrintPropertyName(keyString);
        }
Ejemplo n.º 2
0
        void ProcessSymbolRefNode(AstSymbolRef astSymbolRef)
        {
            var name = astSymbolRef.Name;

            if (!_scopeVariableUsages.ContainsKey(name))
            {
                _scopeVariableUsages[name] = new ScopeVariableUsageInfo();
            }

            var scopeVariableInfo = SetCurrentState(_scopeVariableUsages[name]);

            switch (astSymbolRef.Usage)
            {
            case SymbolUsage.Read:
                scopeVariableInfo.ReadReferencesCount++;
                break;

            case SymbolUsage.Unknown:
                scopeVariableInfo.UnknownReferencesCount++;
                break;

            case SymbolUsage.ReadWrite:
                scopeVariableInfo.ReadReferencesCount++;
                scopeVariableInfo.WriteReferencesCount++;
                _variableWriteOrder.Add(name);
                break;

            case SymbolUsage.Write:
                scopeVariableInfo.WriteReferencesCount++;
                _variableWriteOrder.Add(name);
                if (scopeVariableInfo.CanMoveInitialization &&
                    scopeVariableInfo.FirstHoistableInitialization == null)
                {
                    AstNode?parentNode;
                    AstNode?initNode;
                    (parentNode, initNode) = GetInitAndParentNode <AstBlock?, AstSimpleStatement?>();

                    if (parentNode != null &&
                        initNode != null &&
                        ((AstBlock)parentNode).Body.IndexOf(initNode) != -1 &&
                        ((AstSimpleStatement)initNode).Body is AstAssign)
                    {
                        SetVariableInitialization(parentNode, initNode);
                        break;
                    }

                    (parentNode, initNode) = GetInitAndParentNode <AstBinary?, AstAssign?>();

                    if (parentNode != null && initNode != null)
                    {
                        SetVariableInitialization(parentNode, initNode);
                        break;
                    }

                    (parentNode, initNode) = GetInitAndParentNode <AstSequence?, AstAssign?>();

                    if (parentNode != null && initNode != null)
                    {
                        SetVariableInitialization(parentNode, initNode);
                        break;
                    }

                    (parentNode, initNode) = GetInitAndParentNode <AstReturn?, AstAssign?>();

                    if (parentNode != null && initNode != null)
                    {
                        SetVariableInitialization(parentNode, initNode);
                        break;
                    }

                    if (Parent() is AstSimpleStatement)
                    {
                        break;
                    }

                    throw new NotImplementedException();
                }

                break;
            }

            void SetVariableInitialization(AstNode parent, AstNode initialization)
            {
                var assign = initialization is AstSimpleStatement simpleStatement &&
                             simpleStatement.Body is AstAssign astAssign
                    ? astAssign
                    : initialization as AstAssign;

                if (assign == null)
                {
                    throw new InvalidOperationException();
                }

                if (_callNodeFinderTreeWalker.FindNodes(assign.Right).Count > 0)
                {
                    SetIsAfterCall();
                    return;
                }

                if (!IsValueHoistable(assign.Right))
                {
                    scopeVariableInfo !.FirstHoistableInitialization = NonHoistableVariableInitialization.Instance;
                    return;
                }

                scopeVariableInfo !.FirstHoistableInitialization = new VariableInitialization(parent, initialization);
                _canPerformMergeDefAndInit = true;
            }
        }
Ejemplo n.º 3
0
 static bool IsSameReference(AstSymbolRef symbolRefA, AstSymbolRef symbolRefB)
 {
     return(symbolRefA.Thedef == symbolRefB.Thedef);
 }