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); }
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; } }
static bool IsSameReference(AstSymbolRef symbolRefA, AstSymbolRef symbolRefB) { return(symbolRefA.Thedef == symbolRefB.Thedef); }