Improve getPreferredQuote (#18366)

This commit is contained in:
fisker Cheung authored and GitHub committed 2025-12-01 08:37:51 +08:00
1 parent 95c4dd6f7e
commit 363a20e1c1
2 files changed
+60 -10

No files matched your search

+30
View File
@@ -0,0 +1,30 @@
import assert from "node:assert/strict";
// import * as prettierDevBundled from "../dist/prettier/index.mjs";
import * as prettierProduction from "../node_modules/prettier/index.mjs";
import * as prettierDevelopment from "../src/index.js";
import { runBenchmark } from "./utilities.js";
assert.notEqual(prettierProduction.version, prettierDevelopment.version);
for (const size of [1, 1e1, 1e2, 1e3, 1e4, 1e5]) {
const text = Array.from({ length: size }, () =>
Math.random() > 0.5 ? " " : Math.random() > 0.5 ? "'" : '"',
).join("");
const run = (prettier) => prettier.util.getPreferredQuote(text, "'");
const expected = run(prettierProduction);
await runBenchmark(
{
name: `getPreferredQuote (${size} characters)`,
assert: (result) => assert.deepEqual(result, expected),
},
[
{ name: "Development", prettier: prettierDevelopment },
// { name: "Development(Bundled)", prettier: prettierDevBundled },
{ name: "Production", prettier: prettierProduction },
].map(({ name, prettier }) => ({
name,
implementation: () => run(prettier),
})),
);
}
+30 -10
View File
@@ -5,31 +5,51 @@
const SINGLE_QUOTE = "'";
const DOUBLE_QUOTE = '"';
const SINGLE_QUOTE_DATA = Object.freeze({
character: SINGLE_QUOTE,
codePoint: 39,
});
const DOUBLE_QUOTE_DATA = Object.freeze({
character: DOUBLE_QUOTE,
codePoint: 34,
});
const SINGLE_QUOTE_SETTINGS = Object.freeze({
preferred: SINGLE_QUOTE_DATA,
alternate: DOUBLE_QUOTE_DATA,
});
const DOUBLE_QUOTE_SETTINGS = Object.freeze({
preferred: DOUBLE_QUOTE_DATA,
alternate: SINGLE_QUOTE_DATA,
});
/**
*
* @param {string} text
* @param {Quote | boolean} preferredQuoteOrPreferSingleQuote
* @returns {Quote}
*/
function getPreferredQuote(text, preferredQuoteOrPreferSingleQuote) {
const preferred =
const { preferred, alternate } =
preferredQuoteOrPreferSingleQuote === true ||
preferredQuoteOrPreferSingleQuote === SINGLE_QUOTE
? SINGLE_QUOTE
: DOUBLE_QUOTE;
const alternate = preferred === SINGLE_QUOTE ? DOUBLE_QUOTE : SINGLE_QUOTE;
? SINGLE_QUOTE_SETTINGS
: DOUBLE_QUOTE_SETTINGS;
const { length } = text;
let preferredQuoteCount = 0;
let alternateQuoteCount = 0;
for (const character of text) {
if (character === preferred) {
// `for..of` loop is known slower
for (let index = 0; index < length; index++) {
const codePoint = text.charCodeAt(index);
if (codePoint === preferred.codePoint) {
preferredQuoteCount++;
} else if (character === alternate) {
} else if (codePoint === alternate.codePoint) {
alternateQuoteCount++;
}
}
return preferredQuoteCount > alternateQuoteCount ? alternate : preferred;
return (preferredQuoteCount > alternateQuoteCount ? alternate : preferred)
.character;
}
export default getPreferredQuote;