mirror of
https://github.com/github/codeql-action.git
synced 2025-12-28 02:00:12 +08:00
Co-authored-by: Andrew Eisenberg <aeisenberg@github.com> Co-authored-by: Henry Mercer <henrymercer@github.com>
78 lines
2.6 KiB
JavaScript
78 lines
2.6 KiB
JavaScript
"use strict";
|
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
exports.reflectionEquals = void 0;
|
|
const reflection_info_1 = require("./reflection-info");
|
|
/**
|
|
* Determines whether two message of the same type have the same field values.
|
|
* Checks for deep equality, traversing repeated fields, oneof groups, maps
|
|
* and messages recursively.
|
|
* Will also return true if both messages are `undefined`.
|
|
*/
|
|
function reflectionEquals(info, a, b) {
|
|
if (a === b)
|
|
return true;
|
|
if (!a || !b)
|
|
return false;
|
|
for (let field of info.fields) {
|
|
let localName = field.localName;
|
|
let val_a = field.oneof ? a[field.oneof][localName] : a[localName];
|
|
let val_b = field.oneof ? b[field.oneof][localName] : b[localName];
|
|
switch (field.kind) {
|
|
case "enum":
|
|
case "scalar":
|
|
let t = field.kind == "enum" ? reflection_info_1.ScalarType.INT32 : field.T;
|
|
if (!(field.repeat
|
|
? repeatedPrimitiveEq(t, val_a, val_b)
|
|
: primitiveEq(t, val_a, val_b)))
|
|
return false;
|
|
break;
|
|
case "map":
|
|
if (!(field.V.kind == "message"
|
|
? repeatedMsgEq(field.V.T(), objectValues(val_a), objectValues(val_b))
|
|
: repeatedPrimitiveEq(field.V.kind == "enum" ? reflection_info_1.ScalarType.INT32 : field.V.T, objectValues(val_a), objectValues(val_b))))
|
|
return false;
|
|
break;
|
|
case "message":
|
|
let T = field.T();
|
|
if (!(field.repeat
|
|
? repeatedMsgEq(T, val_a, val_b)
|
|
: T.equals(val_a, val_b)))
|
|
return false;
|
|
break;
|
|
}
|
|
}
|
|
return true;
|
|
}
|
|
exports.reflectionEquals = reflectionEquals;
|
|
const objectValues = Object.values;
|
|
function primitiveEq(type, a, b) {
|
|
if (a === b)
|
|
return true;
|
|
if (type !== reflection_info_1.ScalarType.BYTES)
|
|
return false;
|
|
let ba = a;
|
|
let bb = b;
|
|
if (ba.length !== bb.length)
|
|
return false;
|
|
for (let i = 0; i < ba.length; i++)
|
|
if (ba[i] != bb[i])
|
|
return false;
|
|
return true;
|
|
}
|
|
function repeatedPrimitiveEq(type, a, b) {
|
|
if (a.length !== b.length)
|
|
return false;
|
|
for (let i = 0; i < a.length; i++)
|
|
if (!primitiveEq(type, a[i], b[i]))
|
|
return false;
|
|
return true;
|
|
}
|
|
function repeatedMsgEq(type, a, b) {
|
|
if (a.length !== b.length)
|
|
return false;
|
|
for (let i = 0; i < a.length; i++)
|
|
if (!type.equals(a[i], b[i]))
|
|
return false;
|
|
return true;
|
|
}
|