Merge pull request #51982 from reduz/fix-doctool-merging-when-signatures-change

Fix doctool merges when method signatures don't match
This commit is contained in:
Juan Linietsky 2021-08-22 12:37:38 -03:00 committed by GitHub
commit e42628cd99
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23

View file

@ -64,35 +64,42 @@ void DocTools::merge_from(const DocTools &p_data) {
if (cf.methods[j].name != m.name) {
continue;
}
if (cf.methods[j].arguments.size() != m.arguments.size()) {
continue;
}
// since polymorphic functions are allowed we need to check the type of
// the arguments so we make sure they are different.
int arg_count = cf.methods[j].arguments.size();
Vector<bool> arg_used;
arg_used.resize(arg_count);
for (int l = 0; l < arg_count; ++l) {
arg_used.write[l] = false;
}
// also there is no guarantee that argument ordering will match, so we
// have to check one by one so we make sure we have an exact match
for (int k = 0; k < arg_count; ++k) {
const char *operator_prefix = "operator "; // Operators use a space at the end, making this prefix an invalid identifier (and differentiating from methods).
if (cf.methods[j].name == c.name || cf.methods[j].name.begins_with(operator_prefix)) {
// Since constructors and operators can repeat, we need to check the type of
// the arguments so we make sure they are different.
if (cf.methods[j].arguments.size() != m.arguments.size()) {
continue;
}
int arg_count = cf.methods[j].arguments.size();
Vector<bool> arg_used;
arg_used.resize(arg_count);
for (int l = 0; l < arg_count; ++l) {
if (cf.methods[j].arguments[k].type == m.arguments[l].type && !arg_used[l]) {
arg_used.write[l] = true;
break;
arg_used.write[l] = false;
}
// also there is no guarantee that argument ordering will match, so we
// have to check one by one so we make sure we have an exact match
for (int k = 0; k < arg_count; ++k) {
for (int l = 0; l < arg_count; ++l) {
if (cf.methods[j].arguments[k].type == m.arguments[l].type && !arg_used[l]) {
arg_used.write[l] = true;
break;
}
}
}
}
bool not_the_same = false;
for (int l = 0; l < arg_count; ++l) {
if (!arg_used[l]) { // at least one of the arguments was different
not_the_same = true;
bool not_the_same = false;
for (int l = 0; l < arg_count; ++l) {
if (!arg_used[l]) { // at least one of the arguments was different
not_the_same = true;
}
}
if (not_the_same) {
continue;
}
}
if (not_the_same) {
continue;
}
const DocData::MethodDoc &mf = cf.methods[j];