@@ -336,28 +336,27 @@ def parse
336
336
VOCABULARY_KEYWORD_CLASS . new ( vocabulary , self , '$vocabulary' )
337
337
end
338
338
339
- if root == self && ( !value . is_a? ( Hash ) || !value . key? ( meta_schema . id_keyword ) )
339
+ keywords = meta_schema . keywords
340
+ exclusive_ref = value . is_a? ( Hash ) && value . key? ( '$ref' ) && keywords . fetch ( '$ref' ) . exclusive?
341
+
342
+ if root == self && ( !value . is_a? ( Hash ) || !value . key? ( meta_schema . id_keyword ) || exclusive_ref )
340
343
ID_KEYWORD_CLASS . new ( base_uri , self , meta_schema . id_keyword )
341
344
end
342
345
343
- if value . is_a? ( Hash )
344
- keywords = meta_schema . keywords
345
-
346
- if value . key? ( '$ref' ) && keywords . fetch ( '$ref' ) . exclusive?
347
- @parsed [ '$ref' ] = keywords . fetch ( '$ref' ) . new ( value . fetch ( '$ref' ) , self , '$ref' )
348
- defs_keyword = meta_schema . defs_keyword
349
- if value . key? ( defs_keyword ) && keywords . key? ( defs_keyword )
350
- @parsed [ defs_keyword ] = keywords . fetch ( defs_keyword ) . new ( value . fetch ( defs_keyword ) , self , defs_keyword )
351
- end
352
- else
353
- keyword_order = meta_schema . keyword_order
354
- last = keywords . size
355
-
356
- value . sort do |( keyword_a , _value_a ) , ( keyword_b , _value_b ) |
357
- keyword_order . fetch ( keyword_a , last ) <=> keyword_order . fetch ( keyword_b , last )
358
- end . each do |keyword , value |
359
- @parsed [ keyword ] ||= keywords . fetch ( keyword , UNKNOWN_KEYWORD_CLASS ) . new ( value , self , keyword )
360
- end
346
+ if exclusive_ref
347
+ @parsed [ '$ref' ] = keywords . fetch ( '$ref' ) . new ( value . fetch ( '$ref' ) , self , '$ref' )
348
+ defs_keyword = meta_schema . defs_keyword
349
+ if value . key? ( defs_keyword ) && keywords . key? ( defs_keyword )
350
+ @parsed [ defs_keyword ] = keywords . fetch ( defs_keyword ) . new ( value . fetch ( defs_keyword ) , self , defs_keyword )
351
+ end
352
+ elsif value . is_a? ( Hash )
353
+ keyword_order = meta_schema . keyword_order
354
+ last = keywords . size
355
+
356
+ value . sort do |( keyword_a , _value_a ) , ( keyword_b , _value_b ) |
357
+ keyword_order . fetch ( keyword_a , last ) <=> keyword_order . fetch ( keyword_b , last )
358
+ end . each do |keyword , value |
359
+ @parsed [ keyword ] ||= keywords . fetch ( keyword , UNKNOWN_KEYWORD_CLASS ) . new ( value , self , keyword )
361
360
end
362
361
end
363
362
0 commit comments