@@ -13,48 +13,48 @@ import { JsonLexer } from "./json-lexer.js";
1313 * } from "./jsonast.d.ts"
1414 */
1515
16- /** @type (json: string, location ?: string) => JsonNode */
17- export const fromJson = ( json , location = "" ) => {
16+ /** @type (json: string, uri ?: string) => JsonNode */
17+ export const fromJson = ( json , uri = "" ) => {
1818 const lexer = new JsonLexer ( json ) ;
1919
2020 const token = lexer . nextToken ( ) ;
21- const jsonValue = parseValue ( token , lexer , undefined , ` ${ location } #` ) ;
21+ const jsonValue = parseValue ( token , lexer , undefined , uri , "" ) ;
2222
2323 lexer . done ( ) ;
2424
2525 return jsonValue ;
2626} ;
2727
28- /** @type (token: JsonToken, lexer: JsonLexer, key: string | undefined, location : string) => JsonNode */
29- const parseValue = ( token , lexer , _key , location ) => {
28+ /** @type (token: JsonToken, lexer: JsonLexer, key: string | undefined, uri: string, pointer : string) => JsonNode */
29+ const parseValue = ( token , lexer , _key , uri , pointer ) => {
3030 switch ( token . type ) {
3131 case "null" :
3232 case "boolean" :
3333 case "number" :
3434 case "string" :
35- return parseScalar ( token , location ) ;
35+ return parseScalar ( token , uri , pointer ) ;
3636 case "[" :
37- return parseArray ( token , lexer , location ) ;
37+ return parseArray ( token , lexer , uri , pointer ) ;
3838 case "{" :
39- return parseObject ( token , lexer , location ) ;
39+ return parseObject ( token , lexer , uri , pointer ) ;
4040 default :
4141 throw lexer . syntaxError ( "Expected a JSON value" , token ) ;
4242 }
4343} ;
4444
45- /** @type (token: JsonToken<"null" | "boolean" | "number" | "string">, location : string) => JsonNode */
46- const parseScalar = ( token , location ) => {
45+ /** @type (token: JsonToken<"null" | "boolean" | "number" | "string">, uri: string, pointer : string) => JsonNode */
46+ const parseScalar = ( token , uri , pointer ) => {
4747 return {
4848 type : "json" ,
4949 jsonType : token . type ,
5050 value : JSON . parse ( token . value ) , // eslint-disable-line @typescript-eslint/no-unsafe-assignment
51- location : location ,
51+ location : ` ${ uri } # ${ encodeURI ( pointer ) } ` ,
5252 position : tokenPosition ( token )
5353 } ;
5454} ;
5555
56- /** @type (token: JsonToken, lexer: JsonLexer, key: string, location : string) => JsonPropertyNode */
57- const parseProperty = ( token , lexer , _key , location ) => {
56+ /** @type (token: JsonToken, lexer: JsonLexer, key: string, uri: string, pointer : string) => JsonPropertyNode */
57+ const parseProperty = ( token , lexer , _key , uri , pointer ) => {
5858 if ( token . type !== "string" ) {
5959 throw lexer . syntaxError ( "Expected a propertry" , token ) ;
6060 }
@@ -71,7 +71,7 @@ const parseProperty = (token, lexer, _key, location) => {
7171 throw lexer . syntaxError ( "Expected :" , token ) ;
7272 }
7373
74- const valueNode = parseValue ( lexer . nextToken ( ) , lexer , keyNode . value , JsonPointer . append ( keyNode . value , location ) ) ;
74+ const valueNode = parseValue ( lexer . nextToken ( ) , lexer , keyNode . value , uri , JsonPointer . append ( keyNode . value , pointer ) ) ;
7575
7676 return {
7777 type : "json-property" ,
@@ -90,11 +90,11 @@ const parseProperty = (token, lexer, _key, location) => {
9090
9191/**
9292 * @type <P extends ParentNode<C>, C extends JsonNode | JsonPropertyNode>(
93- * parseChild: (token: JsonToken, lexer: JsonLexer, key: string, location : string) => C,
93+ * parseChild: (token: JsonToken, lexer: JsonLexer, key: string, uri: string, pointer : string) => C,
9494 * endToken: string
95- * ) => (lexer: JsonLexer, node: P, location : string) => P
95+ * ) => (lexer: JsonLexer, node: P, uri: string, pointer : string) => P
9696 */
97- const parseCommaSeparated = ( parseChild , endToken ) => ( lexer , node , location ) => {
97+ const parseCommaSeparated = ( parseChild , endToken ) => ( lexer , node , uri , pointer ) => {
9898 for ( let index = 0 ; true ; index ++ ) {
9999 let token = lexer . nextToken ( ) ;
100100
@@ -111,44 +111,44 @@ const parseCommaSeparated = (parseChild, endToken) => (lexer, node, location) =>
111111 }
112112 }
113113
114- const childNode = parseChild ( token , lexer , `${ index } ` , location ) ;
114+ const childNode = parseChild ( token , lexer , `${ index } ` , uri , pointer ) ;
115115 if ( childNode ) {
116116 node . children . push ( childNode ) ;
117117 }
118118 }
119119} ;
120120
121- /** @type (openToken: JsonToken, lexer: JsonLexer, location : string) => JsonArrayNode */
122- const parseArray = ( openToken , lexer , location ) => {
121+ /** @type (openToken: JsonToken, lexer: JsonLexer, uri: string, pointer : string) => JsonArrayNode */
122+ const parseArray = ( openToken , lexer , uri , pointer ) => {
123123 return parseItems ( lexer , {
124124 type : "json" ,
125125 jsonType : "array" ,
126126 children : [ ] ,
127- location : location ,
127+ location : ` ${ uri } # ${ encodeURI ( pointer ) } ` ,
128128 position : tokenPosition ( openToken )
129- } , location ) ;
129+ } , uri , pointer ) ;
130130} ;
131131
132- /** @type (token: JsonToken, lexer: JsonLexer, key: string, location : string) => JsonNode */
133- const parseItem = ( token , lexer , key , location ) => {
134- return parseValue ( token , lexer , key , JsonPointer . append ( key , location ) ) ;
132+ /** @type (token: JsonToken, lexer: JsonLexer, key: string, uri: string, pointer : string) => JsonNode */
133+ const parseItem = ( token , lexer , key , uri , pointer ) => {
134+ return parseValue ( token , lexer , key , uri , JsonPointer . append ( key , pointer ) ) ;
135135} ;
136136
137- /** @type (lexer: JsonLexer, node: { type: "json" } & JsonArrayNode, location : string) => JsonArrayNode */
137+ /** @type (lexer: JsonLexer, node: { type: "json" } & JsonArrayNode, uri: string, pointer : string) => JsonArrayNode */
138138const parseItems = parseCommaSeparated ( parseItem , "]" ) ;
139139
140- /** @type (openToken: JsonToken, lexer: JsonLexer, location : string) => JsonObjectNode */
141- const parseObject = ( openToken , lexer , location ) => {
140+ /** @type (openToken: JsonToken, lexer: JsonLexer, uri: string, pointer : string) => JsonObjectNode */
141+ const parseObject = ( openToken , lexer , uri , pointer ) => {
142142 return parseProperties ( lexer , {
143143 type : "json" ,
144144 jsonType : "object" ,
145145 children : [ ] ,
146- location : location ,
146+ location : ` ${ uri } # ${ encodeURI ( pointer ) } ` ,
147147 position : tokenPosition ( openToken )
148- } , location ) ;
148+ } , uri , pointer ) ;
149149} ;
150150
151- /** @type (lexer: JsonLexer, node: { type: "json" } & JsonObjectNode, location : string) => JsonObjectNode */
151+ /** @type (lexer: JsonLexer, node: { type: "json" } & JsonObjectNode, uri: string, pointer : string) => JsonObjectNode */
152152const parseProperties = parseCommaSeparated ( parseProperty , "}" ) ;
153153
154154/** @type (startToken: JsonToken, endToken?: JsonToken) => Position */
0 commit comments