@@ -79,22 +79,22 @@ interface VisitorError extends ParseError {
7979 startCharacter : number ;
8080}
8181
82- function assertVisit ( input : string , expected : VisitorCallback [ ] , expectedErrors : VisitorError [ ] = [ ] , disallowComments = false ) : void {
82+ function assertVisit ( input : string , expected : VisitorCallback [ ] , expectedErrors : VisitorError [ ] = [ ] , disallowComments = false , stopOffsets ?: number [ ] ) : void {
8383 let errors : VisitorError [ ] = [ ] ;
8484 let actuals : VisitorCallback [ ] = [ ] ;
85- let noArgHalder = ( id : keyof JSONVisitor ) => ( offset : number , length : number , startLine : number , startCharacter : number ) => actuals . push ( { id, text : input . substr ( offset , length ) , startLine, startCharacter } ) ;
86- let noArgHalderWithPath = ( id : keyof JSONVisitor ) => ( offset : number , length : number , startLine : number , startCharacter : number , pathSupplier : ( ) => JSONPath ) => actuals . push ( { id, text : input . substr ( offset , length ) , startLine, startCharacter, path : pathSupplier ( ) } ) ;
87- let oneArgHalder = ( id : keyof JSONVisitor ) => ( arg : any , offset : number , length : number , startLine : number , startCharacter : number ) => actuals . push ( { id, text : input . substr ( offset , length ) , startLine, startCharacter, arg } ) ;
88- let oneArgHalderWithPath = ( id : keyof JSONVisitor ) => ( arg : any , offset : number , length : number , startLine : number , startCharacter : number , pathSupplier : ( ) => JSONPath ) => actuals . push ( { id, text : input . substr ( offset , length ) , startLine, startCharacter, arg , path : pathSupplier ( ) } ) ;
85+ let noArgHandler = ( id : keyof JSONVisitor ) => ( offset : number , length : number , startLine : number , startCharacter : number ) => actuals . push ( { id, text : input . substr ( offset , length ) , startLine, startCharacter } ) ;
86+ let oneArgHandler = ( id : keyof JSONVisitor ) => ( arg : any , offset : number , length : number , startLine : number , startCharacter : number ) => actuals . push ( { id, text : input . substr ( offset , length ) , startLine, startCharacter, arg } ) ;
87+ let oneArgHandlerWithPath = ( id : keyof JSONVisitor ) => ( arg : any , offset : number , length : number , startLine : number , startCharacter : number , pathSupplier : ( ) => JSONPath ) => actuals . push ( { id, text : input . substr ( offset , length ) , startLine, startCharacter, arg, path : pathSupplier ( ) } ) ;
88+ let beginHandler = ( id : keyof JSONVisitor ) => ( offset : number , length : number , startLine : number , startCharacter : number , pathSupplier : ( ) => JSONPath ) => { actuals . push ( { id, text : input . substr ( offset , length ) , startLine, startCharacter, path : pathSupplier ( ) } ) ; return ! stopOffsets || ( stopOffsets . indexOf ( offset ) === - 1 ) ; } ;
8989 visit ( input , {
90- onObjectBegin : noArgHalderWithPath ( 'onObjectBegin' ) ,
91- onObjectProperty : oneArgHalderWithPath ( 'onObjectProperty' ) ,
92- onObjectEnd : noArgHalder ( 'onObjectEnd' ) ,
93- onArrayBegin : noArgHalderWithPath ( 'onArrayBegin' ) ,
94- onArrayEnd : noArgHalder ( 'onArrayEnd' ) ,
95- onLiteralValue : oneArgHalderWithPath ( 'onLiteralValue' ) ,
96- onSeparator : oneArgHalder ( 'onSeparator' ) ,
97- onComment : noArgHalder ( 'onComment' ) ,
90+ onObjectBegin : beginHandler ( 'onObjectBegin' ) ,
91+ onObjectProperty : oneArgHandlerWithPath ( 'onObjectProperty' ) ,
92+ onObjectEnd : noArgHandler ( 'onObjectEnd' ) ,
93+ onArrayBegin : beginHandler ( 'onArrayBegin' ) ,
94+ onArrayEnd : noArgHandler ( 'onArrayEnd' ) ,
95+ onLiteralValue : oneArgHandlerWithPath ( 'onLiteralValue' ) ,
96+ onSeparator : oneArgHandler ( 'onSeparator' ) ,
97+ onComment : noArgHandler ( 'onComment' ) ,
9898 onError : ( error : ParseErrorCode , offset : number , length : number , startLine : number , startCharacter : number ) => {
9999 errors . push ( { error, offset, length, startLine, startCharacter } ) ;
100100 }
@@ -458,6 +458,18 @@ suite('JSON', () => {
458458 { id : 'onObjectEnd' , text : '}' , startLine : 0 , startCharacter : 20 } ,
459459 { id : 'onObjectEnd' , text : '}' , startLine : 0 , startCharacter : 22 } ,
460460 ] ) ;
461+ assertVisit ( '{ "foo": "bar", "a": {"b": "c"} }' , [
462+ { id : 'onObjectBegin' , text : '{' , startLine : 0 , startCharacter : 0 , path : [ ] } ,
463+ { id : 'onObjectEnd' , text : '}' , startLine : 0 , startCharacter : 32 } ,
464+ ] , [ ] , false , [ 0 ] ) ;
465+ assertVisit ( '{ "a": { "b": "c", "d": { "e": "f" } } }' , [
466+ { id : 'onObjectBegin' , text : '{' , startLine : 0 , startCharacter : 0 , path : [ ] } ,
467+ { id : 'onObjectProperty' , text : '"a"' , startLine : 0 , startCharacter : 2 , arg : 'a' , path : [ ] } ,
468+ { id : 'onSeparator' , text : ':' , startLine : 0 , startCharacter : 5 , arg : ':' } ,
469+ { id : 'onObjectBegin' , text : '{' , startLine : 0 , startCharacter : 7 , path : [ 'a' ] } ,
470+ { id : 'onObjectEnd' , text : '}' , startLine : 0 , startCharacter : 37 } ,
471+ { id : 'onObjectEnd' , text : '}' , startLine : 0 , startCharacter : 39 }
472+ ] , [ ] , true , [ 7 ] ) ;
461473 } ) ;
462474
463475 test ( 'visit: array' , ( ) => {
@@ -514,6 +526,14 @@ suite('JSON', () => {
514526 { id : 'onObjectEnd' , text : '}' , startLine : 0 , startCharacter : 58 } ,
515527 { id : 'onArrayEnd' , text : ']' , startLine : 0 , startCharacter : 60 } ,
516528 ] ) ;
529+ assertVisit ( '{ "foo": [ { "a": "b", "c:": "d", "d": { "e": "f" } } ] }' , [
530+ { id : 'onObjectBegin' , text : '{' , startLine : 0 , startCharacter : 0 , path : [ ] } ,
531+ { id : 'onObjectProperty' , text : '"foo"' , startLine : 0 , startCharacter : 2 , arg : 'foo' , path : [ ] } ,
532+ { id : 'onSeparator' , text : ':' , startLine : 0 , startCharacter : 7 , arg : ':' } ,
533+ { id : 'onArrayBegin' , text : '[' , startLine : 0 , startCharacter : 9 , path : [ 'foo' ] } ,
534+ { id : 'onArrayEnd' , text : ']' , startLine : 0 , startCharacter : 54 } ,
535+ { id : 'onObjectEnd' , text : '}' , startLine : 0 , startCharacter : 56 }
536+ ] , [ ] , true , [ 9 ] ) ;
517537 } ) ;
518538
519539 test ( 'visit: comment' , ( ) => {
0 commit comments