Skip to content

Commit 9d14621

Browse files
committed
Interface validation fixes
1 parent 673a649 commit 9d14621

File tree

2 files changed

+31
-54
lines changed

2 files changed

+31
-54
lines changed

include/SchemaLoader.h

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -294,8 +294,10 @@ class SchemaLoader
294294
void fixupInputFieldList(InputFieldList& fields);
295295
void reorderInputTypeDependencies();
296296
void validateImplementedInterfaces() const;
297-
void validateInterfaceFields(std::string_view typeName, const OutputFieldList& typeFields,
298-
std::string_view interfaceName) const;
297+
const InterfaceType& findInterfaceType(
298+
std::string_view typeName, std::string_view interfaceName) const;
299+
void validateInterfaceFields(std::string_view typeName,
300+
std::string_view interfaceName, const OutputFieldList& typeFields) const;
299301
void validateTransitiveInterfaces(
300302
std::string_view typeName, const std::vector<std::string_view>& interfaces) const;
301303

src/SchemaLoader.cpp

Lines changed: 27 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -421,7 +421,7 @@ void SchemaLoader::validateImplementedInterfaces() const
421421

422422
for (auto interfaceName : interfaceType.interfaces)
423423
{
424-
validateInterfaceFields(interfaceType.type, interfaceType.fields, interfaceName);
424+
validateInterfaceFields(interfaceType.type, interfaceName, interfaceType.fields);
425425
}
426426
}
427427

@@ -431,7 +431,7 @@ void SchemaLoader::validateImplementedInterfaces() const
431431

432432
for (auto interfaceName : objectType.interfaces)
433433
{
434-
validateInterfaceFields(objectType.type, objectType.fields, interfaceName);
434+
validateInterfaceFields(objectType.type, interfaceName, objectType.fields);
435435
}
436436
}
437437
}
@@ -1151,8 +1151,8 @@ void SchemaLoader::blockReservedName(
11511151
}
11521152
}
11531153

1154-
void SchemaLoader::validateInterfaceFields(std::string_view typeName,
1155-
const OutputFieldList& typeFields, std::string_view interfaceName) const
1154+
const InterfaceType& SchemaLoader::findInterfaceType(
1155+
std::string_view typeName, std::string_view interfaceName) const
11561156
{
11571157
const auto itrType = _interfaceNames.find(interfaceName);
11581158

@@ -1172,7 +1172,13 @@ void SchemaLoader::validateInterfaceFields(std::string_view typeName,
11721172
throw std::runtime_error(error.str());
11731173
}
11741174

1175-
const auto& interfaceType = _interfaceTypes[itrType->second];
1175+
return _interfaceTypes[itrType->second];
1176+
}
1177+
1178+
void SchemaLoader::validateInterfaceFields(std::string_view typeName,
1179+
std::string_view interfaceName, const OutputFieldList& typeFields) const
1180+
{
1181+
const auto& interfaceType = findInterfaceType(typeName, interfaceName);
11761182
std::set<std::string_view> unimplemented;
11771183

11781184
for (const auto& entry : interfaceType.fields)
@@ -1215,61 +1221,30 @@ void SchemaLoader::validateTransitiveInterfaces(
12151221

12161222
for (auto entry : interfaces)
12171223
{
1218-
const auto itrType = _interfaceNames.find(entry);
1219-
1220-
if (itrType == _interfaceNames.cend())
1221-
{
1222-
std::ostringstream error;
1223-
const auto itrPosition = _typePositions.find(typeName);
1224-
1225-
error << "Unknown interface: " << entry << " implemented by: " << typeName;
1226-
1227-
if (itrPosition != _typePositions.cend())
1228-
{
1229-
error << " line: " << itrPosition->second.line
1230-
<< " column: " << itrPosition->second.column;
1231-
}
1224+
const auto& interfaceType = findInterfaceType(typeName, entry);
12321225

1233-
throw std::runtime_error(error.str());
1234-
}
1235-
1236-
if (typeName == entry || !unimplemented.insert(entry).second)
1237-
{
1238-
std::ostringstream error;
1239-
const auto itrPosition = _typePositions.find(typeName);
1240-
1241-
error << "Interface cycle interface: " << entry << " implemented by: " << typeName;
1242-
1243-
if (itrPosition != _typePositions.cend())
1244-
{
1245-
error << " line: " << itrPosition->second.line
1246-
<< " column: " << itrPosition->second.column;
1247-
}
1248-
1249-
throw std::runtime_error(error.str());
1250-
}
1251-
1252-
const auto& interfaceType = _interfaceTypes[itrType->second];
1226+
unimplemented.insert(entry);
12531227

12541228
for (auto interfaceName : interfaceType.interfaces)
12551229
{
1256-
if (!unimplemented.insert(interfaceName).second)
1257-
{
1258-
std::ostringstream error;
1259-
const auto itrPosition = _typePositions.find(typeName);
1230+
unimplemented.insert(interfaceName);
1231+
}
1232+
}
12601233

1261-
error << "Interface cycle interface: " << interfaceName
1262-
<< " implemented by: " << typeName;
1234+
if (unimplemented.find(typeName) != unimplemented.cend())
1235+
{
1236+
std::ostringstream error;
1237+
const auto itrPosition = _typePositions.find(typeName);
12631238

1264-
if (itrPosition != _typePositions.cend())
1265-
{
1266-
error << " line: " << itrPosition->second.line
1267-
<< " column: " << itrPosition->second.column;
1268-
}
1239+
error << "Interface cycle interface: " << typeName;
12691240

1270-
throw std::runtime_error(error.str());
1271-
}
1241+
if (itrPosition != _typePositions.cend())
1242+
{
1243+
error << " line: " << itrPosition->second.line
1244+
<< " column: " << itrPosition->second.column;
12721245
}
1246+
1247+
throw std::runtime_error(error.str());
12731248
}
12741249

12751250
for (auto entry : interfaces)

0 commit comments

Comments
 (0)