Как заставить Google Closure Compiler постоянно сгибать следующее? - PullRequest
0 голосов
/ 08 июня 2019

Рассмотрим следующий код JavaScript, который предоставляет Python-подобную функцию форматирования 'format'.

/**
 * @param {string} pattern
 * @param {...string} var_args
 * @return {string} formatted string
 */
function format(pattern, var_args) {
  return pattern.replace(/{(\d+)}/g, (_, pos) => arguments[pos]);
}

console.log(format("{1}", "a"));

Компилятор Closure (скажем, v20190528) в расширенном режиме не может постоянно сгибать это и производит что-то вроде следующего. (-O РАСШИРЕННЫЙ --language_out ECMASCRIPT5_STRICT --use_types_for_optimization)

'use strict';console.log(function(a,d){var b=arguments;return a.replace(/{(\d+)}/g,function(e,c){return b[c]})}("{1}","a"));

Оказывается, компилятор замыкания полностью здесь, так как метод String.replace не аннотируется как @nosideeffects с note"Это может иметь побочные эффекты, если функция замены имеет побочные эффекты. ", что тоже совершенно верно. Однако, даже если этот extern-файл отредактирован так, чтобы иметь аннотацию @nosideeffects, свертывание не происходит. Что может помешать складыванию и есть ли способ обойти это?

...