Remove lodash sortBy use (#13021)

This commit is contained in:
Justin Ridgewell 2021-03-25 13:56:18 -04:00 committed by GitHub
parent 73dcd06293
commit 327b4cec49
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -1,7 +1,5 @@
// @flow // @flow
import sortBy from "lodash/sortBy";
import loadConfig, { type Plugin } from "../config"; import loadConfig, { type Plugin } from "../config";
let LOADED_PLUGIN: Plugin | void; let LOADED_PLUGIN: Plugin | void;
@ -22,6 +20,42 @@ export default function loadBlockHoistPlugin(): Plugin {
return LOADED_PLUGIN; return LOADED_PLUGIN;
} }
function priority(bodyNode) {
const priority = bodyNode?._blockHoist;
if (priority == null) return 1;
if (priority === true) return 2;
return priority;
}
function stableSort(body) {
// By default, we use priorities of 0-4.
const buckets = Object.create(null);
// By collecting into buckets, we can guarantee a stable sort.
for (let i = 0; i < body.length; i++) {
const n = body[i];
const p = priority(n);
// In case some plugin is setting an unexpected priority.
const bucket = buckets[p] || (buckets[p] = []);
bucket.push(n);
}
// Sort our keys in descending order. Keys are unique, so we don't have to
// worry about stability.
const keys = Object.keys(buckets)
.map(k => +k)
.sort((a, b) => b - a);
let index = 0;
for (const key of keys) {
const bucket = buckets[key];
for (const n of bucket) {
body[index++] = n;
}
}
return body;
}
const blockHoistPlugin = { const blockHoistPlugin = {
/** /**
@ -41,24 +75,24 @@ const blockHoistPlugin = {
visitor: { visitor: {
Block: { Block: {
exit({ node }) { exit({ node }) {
const { body } = node;
// Largest SMI
let max = 2 ** 30 - 1;
let hasChange = false; let hasChange = false;
for (let i = 0; i < node.body.length; i++) { for (let i = 0; i < body.length; i++) {
const bodyNode = node.body[i]; const n = body[i];
if (bodyNode?._blockHoist != null) { const p = priority(n);
if (p > max) {
hasChange = true; hasChange = true;
break; break;
} }
max = p;
} }
if (!hasChange) return; if (!hasChange) return;
node.body = sortBy(node.body, function (bodyNode) { // My kingdom for a stable sort!
let priority = bodyNode?._blockHoist; node.body = stableSort(body.slice());
if (priority == null) priority = 1;
if (priority === true) priority = 2;
// Higher priorities should move toward the top.
return -1 * priority;
});
}, },
}, },
}, },