@@ -172,45 +172,14 @@ public T ReadFragment<T>(JsonNode input, AsyncApiVersion version, out AsyncApiDi
172172 return ( T ) element ;
173173 }
174174
175- private void ResolveReferences ( AsyncApiDiagnostic diagnostic , AsyncApiDocument document )
175+ private void ResolveReferences ( AsyncApiDiagnostic diagnostic , IAsyncApiSerializable serializable )
176176 {
177- switch ( this . settings . ReferenceResolution )
177+ if ( this . settings . ReferenceResolution == ReferenceResolutionSetting . DoNotResolveReferences )
178178 {
179- case ReferenceResolutionSetting . ResolveAllReferences :
180- this . ResolveAllReferences ( diagnostic , document ) ;
181- break ;
182- case ReferenceResolutionSetting . ResolveInternalReferences :
183- this . ResolveInternalReferences ( diagnostic , document ) ;
184- break ;
185- case ReferenceResolutionSetting . DoNotResolveReferences :
186- break ;
187- }
188- }
189-
190- private void ResolveAllReferences ( AsyncApiDiagnostic diagnostic , AsyncApiDocument document )
191- {
192- this . ResolveInternalReferences ( diagnostic , document ) ;
193- this . ResolveExternalReferences ( diagnostic , document , document ) ;
194- }
195-
196- private void ResolveInternalReferences ( AsyncApiDiagnostic diagnostic , AsyncApiDocument document )
197- {
198- var reader = new AsyncApiStringReader ( this . settings ) ;
199-
200- var resolver = new AsyncApiReferenceHostDocumentResolver ( this . context . Workspace ) ;
201- var walker = new AsyncApiWalker ( resolver ) ;
202- walker . Walk ( document ) ;
203-
204- foreach ( var item in resolver . Errors )
205- {
206- diagnostic . Errors . Add ( item ) ;
179+ return ;
207180 }
208- }
209181
210- private void ResolveExternalReferences ( AsyncApiDiagnostic diagnostic , IAsyncApiSerializable serializable , AsyncApiDocument hostDocument )
211- {
212- var loader = this . settings . ExternalReferenceLoader ??= new DefaultStreamLoader ( this . settings ) ;
213- var collector = new AsyncApiRemoteReferenceCollector ( this . context . Workspace ) ;
182+ var collector = new AsyncApiReferenceCollector ( this . context . Workspace ) ;
214183 var walker = new AsyncApiWalker ( collector ) ;
215184 walker . Walk ( serializable ) ;
216185
@@ -221,33 +190,60 @@ private void ResolveExternalReferences(AsyncApiDiagnostic diagnostic, IAsyncApiS
221190 continue ;
222191 }
223192
224- try
193+ IAsyncApiSerializable component = null ;
194+ if ( reference . Reference . IsExternal )
225195 {
226- Stream stream ;
227- if ( this . context . Workspace . Contains ( reference . Reference . ExternalResource ) )
196+ if ( this . settings . ReferenceResolution != ReferenceResolutionSetting . ResolveAllReferences )
228197 {
229- stream = this . context . Workspace . ResolveReference < Stream > ( reference . Reference . ExternalResource ) ;
230- }
231- else
232- {
233- stream = loader . Load ( new Uri ( reference . Reference . ExternalResource , UriKind . RelativeOrAbsolute ) ) ;
234- this . context . Workspace . RegisterComponent ( reference . Reference . ExternalResource , stream ) ;
235- }
236-
237- var component = this . ResolveStreamReferences ( stream , reference , diagnostic ) ;
238- if ( component == null )
239- {
240- diagnostic . Errors . Add ( new AsyncApiError ( string . Empty , $ "Unable to deserialize reference '{ reference . Reference . Reference } '") ) ;
241198 continue ;
242199 }
243200
244- this . context . Workspace . RegisterComponent ( reference . Reference . Reference , component ) ;
245- this . ResolveExternalReferences ( diagnostic , component , hostDocument ) ;
201+ component = this . ResolveExternalReference ( diagnostic , reference ) ;
202+ }
203+ else
204+ {
205+ var stream = this . context . Workspace . ResolveReference < Stream > ( string . Empty ) ; // get whole document.
206+ component = this . ResolveStreamReference ( stream , reference , diagnostic ) ;
207+ }
208+
209+ if ( component == null )
210+ {
211+ diagnostic . Errors . Add ( new AsyncApiError ( string . Empty , $ "Unable to deserialize reference '{ reference . Reference . Reference } '") ) ;
212+ continue ;
213+ }
214+
215+ this . context . Workspace . RegisterComponent ( reference . Reference . Reference , component ) ;
216+ this . ResolveReferences ( diagnostic , component ) ;
217+ }
218+ }
219+
220+ private IAsyncApiSerializable ResolveExternalReference ( AsyncApiDiagnostic diagnostic , IAsyncApiReferenceable reference )
221+ {
222+ if ( reference is null )
223+ {
224+ throw new ArgumentNullException ( nameof ( reference ) ) ;
225+ }
226+
227+ var loader = this . settings . ExternalReferenceLoader ??= new DefaultStreamLoader ( this . settings ) ;
228+ try
229+ {
230+ Stream stream ;
231+ if ( this . context . Workspace . Contains ( reference . Reference . ExternalResource ) )
232+ {
233+ stream = this . context . Workspace . ResolveReference < Stream > ( reference . Reference . ExternalResource ) ;
246234 }
247- catch ( AsyncApiException ex )
235+ else
248236 {
249- diagnostic . Errors . Add ( new AsyncApiError ( ex ) ) ;
237+ stream = loader . Load ( new Uri ( reference . Reference . ExternalResource , UriKind . RelativeOrAbsolute ) ) ;
238+ this . context . Workspace . RegisterComponent ( reference . Reference . ExternalResource , stream ) ;
250239 }
240+
241+ return this . ResolveStreamReference ( stream , reference , diagnostic ) ;
242+ }
243+ catch ( AsyncApiException ex )
244+ {
245+ diagnostic . Errors . Add ( new AsyncApiError ( ex ) ) ;
246+ return null ;
251247 }
252248 }
253249
@@ -264,7 +260,7 @@ private JsonNode ReadToJson(Stream stream)
264260 return default ;
265261 }
266262
267- private IAsyncApiSerializable ResolveStreamReferences ( Stream stream , IAsyncApiReferenceable reference , AsyncApiDiagnostic diagnostic )
263+ private IAsyncApiSerializable ResolveStreamReference ( Stream stream , IAsyncApiReferenceable reference , AsyncApiDiagnostic diagnostic )
268264 {
269265 JsonNode json = null ;
270266 try
@@ -274,6 +270,7 @@ private IAsyncApiSerializable ResolveStreamReferences(Stream stream, IAsyncApiRe
274270 catch
275271 {
276272 diagnostic . Errors . Add ( new AsyncApiError ( string . Empty , $ "Unable to deserialize reference: '{ reference . Reference . Reference } '") ) ;
273+ return null ;
277274 }
278275
279276 if ( reference . Reference . IsFragment )
@@ -329,19 +326,19 @@ private IAsyncApiSerializable ResolveStreamReferences(Stream stream, IAsyncApiRe
329326 result = this . ReadFragment < AsyncApiOperationTrait > ( json , AsyncApiVersion . AsyncApi2_0 , out fragmentDiagnostic ) ;
330327 break ;
331328 case ReferenceType . MessageTrait :
332- result = this . ReadFragment < AsyncApiMessage > ( json , AsyncApiVersion . AsyncApi2_0 , out fragmentDiagnostic ) ;
329+ result = this . ReadFragment < AsyncApiMessageTrait > ( json , AsyncApiVersion . AsyncApi2_0 , out fragmentDiagnostic ) ;
333330 break ;
334331 case ReferenceType . ServerBindings :
335- result = this . ReadFragment < AsyncApiMessage > ( json , AsyncApiVersion . AsyncApi2_0 , out fragmentDiagnostic ) ;
332+ result = this . ReadFragment < AsyncApiBindings < IServerBinding > > ( json , AsyncApiVersion . AsyncApi2_0 , out fragmentDiagnostic ) ;
336333 break ;
337334 case ReferenceType . ChannelBindings :
338- result = this . ReadFragment < AsyncApiMessage > ( json , AsyncApiVersion . AsyncApi2_0 , out fragmentDiagnostic ) ;
335+ result = this . ReadFragment < AsyncApiBindings < IChannelBinding > > ( json , AsyncApiVersion . AsyncApi2_0 , out fragmentDiagnostic ) ;
339336 break ;
340337 case ReferenceType . OperationBindings :
341- result = this . ReadFragment < AsyncApiMessage > ( json , AsyncApiVersion . AsyncApi2_0 , out fragmentDiagnostic ) ;
338+ result = this . ReadFragment < AsyncApiBindings < IOperationBinding > > ( json , AsyncApiVersion . AsyncApi2_0 , out fragmentDiagnostic ) ;
342339 break ;
343340 case ReferenceType . MessageBindings :
344- result = this . ReadFragment < AsyncApiMessage > ( json , AsyncApiVersion . AsyncApi2_0 , out fragmentDiagnostic ) ;
341+ result = this . ReadFragment < AsyncApiBindings < IMessageBinding > > ( json , AsyncApiVersion . AsyncApi2_0 , out fragmentDiagnostic ) ;
345342 break ;
346343 default :
347344 diagnostic . Errors . Add ( new AsyncApiError ( reference . Reference . Reference , "Could not resolve reference." ) ) ;
0 commit comments