From 1b4eb36d2d428baf104f8ae720b562286f3b1c32 Mon Sep 17 00:00:00 2001 From: Michael Staib Date: Mon, 21 Sep 2020 14:06:05 +0200 Subject: [PATCH] Fixed issue where we normalized schema references incorrectly (#2363) --- .../src/Types/Configuration/TypeDiscoverer.cs | 7 ++++++- .../Core/src/Types/Configuration/TypeLookup.cs | 7 +++---- .../src/Types/Configuration/TypeRegistrar.cs | 10 ++++------ .../src/Types/Configuration/TypeRegistry.cs | 17 +++++++++++++++-- 4 files changed, 28 insertions(+), 13 deletions(-) diff --git a/src/HotChocolate/Core/src/Types/Configuration/TypeDiscoverer.cs b/src/HotChocolate/Core/src/Types/Configuration/TypeDiscoverer.cs index 8460cbe914c..9e909963c14 100644 --- a/src/HotChocolate/Core/src/Types/Configuration/TypeDiscoverer.cs +++ b/src/HotChocolate/Core/src/Types/Configuration/TypeDiscoverer.cs @@ -107,6 +107,11 @@ public IReadOnlyList DiscoverTypes() CollectErrors(); + if (_errors.Count == 0) + { + _typeRegistry.CompleteDiscovery(); + } + return _errors; } @@ -168,7 +173,7 @@ private void CollectErrors() foreach (ITypeReference unresolvedReference in _typeRegistrar.GetUnresolved()) { var types = _typeRegistry.Types.Where( - t => t.Dependencies.Select(t => t.TypeReference) + t => t.Dependencies.Select(d => d.TypeReference) .Any(r => r.Equals(unresolvedReference))).ToList(); ISchemaErrorBuilder builder = diff --git a/src/HotChocolate/Core/src/Types/Configuration/TypeLookup.cs b/src/HotChocolate/Core/src/Types/Configuration/TypeLookup.cs index 3d822e13b61..984ab8f016c 100644 --- a/src/HotChocolate/Core/src/Types/Configuration/TypeLookup.cs +++ b/src/HotChocolate/Core/src/Types/Configuration/TypeLookup.cs @@ -55,9 +55,8 @@ internal sealed class TypeLookup break; case SchemaTypeReference r: - namedTypeRef = _typeInspector.GetTypeRef( - r.Type.GetType(), r.Context, typeRef.Scope); - _refs[typeRef] = namedTypeRef; + _refs[typeRef] = r; + namedTypeRef = r; return true; case SyntaxTypeReference r: @@ -113,7 +112,7 @@ internal sealed class TypeLookup { throw new ArgumentNullException(nameof(typeRef)); } - + // if the typeRef refers to a schema type base class we skip since such a type is not // resolvable. if (typeRef.Type.Type.IsNonGenericSchemaType() || diff --git a/src/HotChocolate/Core/src/Types/Configuration/TypeRegistrar.cs b/src/HotChocolate/Core/src/Types/Configuration/TypeRegistrar.cs index 20fcbeb6395..8bb6736ae9e 100644 --- a/src/HotChocolate/Core/src/Types/Configuration/TypeRegistrar.cs +++ b/src/HotChocolate/Core/src/Types/Configuration/TypeRegistrar.cs @@ -59,7 +59,7 @@ internal sealed class TypeRegistrar if (typeSystemObject is IHasRuntimeType hasRuntimeType && hasRuntimeType.RuntimeType != typeof(object)) { - ExtendedTypeReference? runtimeTypeRef = + ExtendedTypeReference runtimeTypeRef = _context.TypeInspector.GetTypeRef( hasRuntimeType.RuntimeType, SchemaTypeReference.InferTypeContext(typeSystemObject), @@ -176,9 +176,7 @@ public IReadOnlyCollection GetUnhandled() if (!isInferred) { - references.Add(TypeReference.Create( - typeSystemObject, - scope: scope)); + references.Add(TypeReference.Create(typeSystemObject, scope)); } if (!ExtendedType.Tools.IsNonGenericBaseType(typeSystemObject.GetType())) @@ -186,7 +184,7 @@ public IReadOnlyCollection GetUnhandled() references.Add(_context.TypeInspector.GetTypeRef( typeSystemObject.GetType(), SchemaTypeReference.InferTypeContext(typeSystemObject), - scope: scope)); + scope)); } if (typeSystemObject is IHasTypeIdentity hasTypeIdentity && @@ -196,7 +194,7 @@ public IReadOnlyCollection GetUnhandled() _context.TypeInspector.GetTypeRef( hasTypeIdentity.TypeIdentity, SchemaTypeReference.InferTypeContext(typeSystemObject), - scope: scope); + scope); if (!references.Contains(reference)) { diff --git a/src/HotChocolate/Core/src/Types/Configuration/TypeRegistry.cs b/src/HotChocolate/Core/src/Types/Configuration/TypeRegistry.cs index 222e34ae598..9c55a310b32 100644 --- a/src/HotChocolate/Core/src/Types/Configuration/TypeRegistry.cs +++ b/src/HotChocolate/Core/src/Types/Configuration/TypeRegistry.cs @@ -18,7 +18,7 @@ internal sealed class TypeRegistry new ExtendedTypeReferenceEqualityComparer()); private readonly Dictionary _nameRefs = new Dictionary(); - private List _types = new List(); + private readonly List _types = new List(); public int Count => _typeRegister.Count; @@ -121,7 +121,7 @@ public void Register(RegisteredType registeredType) throw new ArgumentNullException(nameof(registeredType)); } - bool addToTypes = !_typeRegister.ContainsValue(registeredType); + var addToTypes = !_typeRegister.ContainsValue(registeredType); foreach (ITypeReference typeReference in registeredType.References) { @@ -177,5 +177,18 @@ public void Register(NameString typeName, RegisteredType registeredType) _nameRefs[typeName] = registeredType.References[0]; } + + public void CompleteDiscovery() + { + foreach (RegisteredType registeredType in _types) + { + _typeRegister[TypeReference.Create(registeredType.Type)] = registeredType; + + if (registeredType.Type.Scope is { } s) + { + _typeRegister[TypeReference.Create(registeredType.Type, s)] = registeredType; + } + } + } } }