From cd9fc8e6677926e931bde1b6a5be8fbc027aefcb Mon Sep 17 00:00:00 2001 From: Ivan Goncharov Date: Tue, 13 Aug 2019 00:35:34 +0300 Subject: [PATCH] GraphQLSchema: Remove unneeded recursion during type collection (#2083) --- src/type/schema.js | 32 ++++++++++++++++---------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/src/type/schema.js b/src/type/schema.js index f9ca1e5631..cb7c992459 100644 --- a/src/type/schema.js +++ b/src/type/schema.js @@ -32,7 +32,7 @@ import { isInterfaceType, isUnionType, isInputObjectType, - isWrappingType, + getNamedType, } from './definition'; /** @@ -324,39 +324,39 @@ function typeMapReducer(map: TypeMap, type: ?GraphQLType): TypeMap { if (!type) { return map; } - if (isWrappingType(type)) { - return typeMapReducer(map, type.ofType); - } - if (map[type.name]) { - if (map[type.name] !== type) { + + const namedType = getNamedType(type); + const seenType = map[namedType.name]; + if (seenType) { + if (seenType !== namedType) { throw new Error( - `Schema must contain uniquely named types but contains multiple types named "${type.name}".`, + `Schema must contain uniquely named types but contains multiple types named "${namedType.name}".`, ); } return map; } - map[type.name] = type; + map[namedType.name] = namedType; let reducedMap = map; - if (isUnionType(type)) { - reducedMap = type.getTypes().reduce(typeMapReducer, reducedMap); + if (isUnionType(namedType)) { + reducedMap = namedType.getTypes().reduce(typeMapReducer, reducedMap); } - if (isObjectType(type)) { - reducedMap = type.getInterfaces().reduce(typeMapReducer, reducedMap); + if (isObjectType(namedType)) { + reducedMap = namedType.getInterfaces().reduce(typeMapReducer, reducedMap); } - if (isObjectType(type) || isInterfaceType(type)) { - for (const field of objectValues(type.getFields())) { + if (isObjectType(namedType) || isInterfaceType(namedType)) { + for (const field of objectValues(namedType.getFields())) { const fieldArgTypes = field.args.map(arg => arg.type); reducedMap = fieldArgTypes.reduce(typeMapReducer, reducedMap); reducedMap = typeMapReducer(reducedMap, field.type); } } - if (isInputObjectType(type)) { - for (const field of objectValues(type.getFields())) { + if (isInputObjectType(namedType)) { + for (const field of objectValues(namedType.getFields())) { reducedMap = typeMapReducer(reducedMap, field.type); } }