@@ -336,28 +336,27 @@ def parse
336336 VOCABULARY_KEYWORD_CLASS . new ( vocabulary , self , '$vocabulary' )
337337 end
338338
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 )
340343 ID_KEYWORD_CLASS . new ( base_uri , self , meta_schema . id_keyword )
341344 end
342345
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 )
361360 end
362361 end
363362
0 commit comments