@@ -13,48 +13,48 @@ import { JsonLexer } from "./json-lexer.js";
13
13
* } from "./jsonast.d.ts"
14
14
*/
15
15
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 = "" ) => {
18
18
const lexer = new JsonLexer ( json ) ;
19
19
20
20
const token = lexer . nextToken ( ) ;
21
- const jsonValue = parseValue ( token , lexer , undefined , ` ${ location } #` ) ;
21
+ const jsonValue = parseValue ( token , lexer , undefined , uri , "" ) ;
22
22
23
23
lexer . done ( ) ;
24
24
25
25
return jsonValue ;
26
26
} ;
27
27
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 ) => {
30
30
switch ( token . type ) {
31
31
case "null" :
32
32
case "boolean" :
33
33
case "number" :
34
34
case "string" :
35
- return parseScalar ( token , location ) ;
35
+ return parseScalar ( token , uri , pointer ) ;
36
36
case "[" :
37
- return parseArray ( token , lexer , location ) ;
37
+ return parseArray ( token , lexer , uri , pointer ) ;
38
38
case "{" :
39
- return parseObject ( token , lexer , location ) ;
39
+ return parseObject ( token , lexer , uri , pointer ) ;
40
40
default :
41
41
throw lexer . syntaxError ( "Expected a JSON value" , token ) ;
42
42
}
43
43
} ;
44
44
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 ) => {
47
47
return {
48
48
type : "json" ,
49
49
jsonType : token . type ,
50
50
value : JSON . parse ( token . value ) , // eslint-disable-line @typescript-eslint/no-unsafe-assignment
51
- location : location ,
51
+ location : ` ${ uri } # ${ encodeURI ( pointer ) } ` ,
52
52
position : tokenPosition ( token )
53
53
} ;
54
54
} ;
55
55
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 ) => {
58
58
if ( token . type !== "string" ) {
59
59
throw lexer . syntaxError ( "Expected a propertry" , token ) ;
60
60
}
@@ -71,7 +71,7 @@ const parseProperty = (token, lexer, _key, location) => {
71
71
throw lexer . syntaxError ( "Expected :" , token ) ;
72
72
}
73
73
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 ) ) ;
75
75
76
76
return {
77
77
type : "json-property" ,
@@ -90,11 +90,11 @@ const parseProperty = (token, lexer, _key, location) => {
90
90
91
91
/**
92
92
* @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,
94
94
* endToken: string
95
- * ) => (lexer: JsonLexer, node: P, location : string) => P
95
+ * ) => (lexer: JsonLexer, node: P, uri: string, pointer : string) => P
96
96
*/
97
- const parseCommaSeparated = ( parseChild , endToken ) => ( lexer , node , location ) => {
97
+ const parseCommaSeparated = ( parseChild , endToken ) => ( lexer , node , uri , pointer ) => {
98
98
for ( let index = 0 ; true ; index ++ ) {
99
99
let token = lexer . nextToken ( ) ;
100
100
@@ -111,44 +111,44 @@ const parseCommaSeparated = (parseChild, endToken) => (lexer, node, location) =>
111
111
}
112
112
}
113
113
114
- const childNode = parseChild ( token , lexer , `${ index } ` , location ) ;
114
+ const childNode = parseChild ( token , lexer , `${ index } ` , uri , pointer ) ;
115
115
if ( childNode ) {
116
116
node . children . push ( childNode ) ;
117
117
}
118
118
}
119
119
} ;
120
120
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 ) => {
123
123
return parseItems ( lexer , {
124
124
type : "json" ,
125
125
jsonType : "array" ,
126
126
children : [ ] ,
127
- location : location ,
127
+ location : ` ${ uri } # ${ encodeURI ( pointer ) } ` ,
128
128
position : tokenPosition ( openToken )
129
- } , location ) ;
129
+ } , uri , pointer ) ;
130
130
} ;
131
131
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 ) ) ;
135
135
} ;
136
136
137
- /** @type (lexer: JsonLexer, node: { type: "json" } & JsonArrayNode, location : string) => JsonArrayNode */
137
+ /** @type (lexer: JsonLexer, node: { type: "json" } & JsonArrayNode, uri: string, pointer : string) => JsonArrayNode */
138
138
const parseItems = parseCommaSeparated ( parseItem , "]" ) ;
139
139
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 ) => {
142
142
return parseProperties ( lexer , {
143
143
type : "json" ,
144
144
jsonType : "object" ,
145
145
children : [ ] ,
146
- location : location ,
146
+ location : ` ${ uri } # ${ encodeURI ( pointer ) } ` ,
147
147
position : tokenPosition ( openToken )
148
- } , location ) ;
148
+ } , uri , pointer ) ;
149
149
} ;
150
150
151
- /** @type (lexer: JsonLexer, node: { type: "json" } & JsonObjectNode, location : string) => JsonObjectNode */
151
+ /** @type (lexer: JsonLexer, node: { type: "json" } & JsonObjectNode, uri: string, pointer : string) => JsonObjectNode */
152
152
const parseProperties = parseCommaSeparated ( parseProperty , "}" ) ;
153
153
154
154
/** @type (startToken: JsonToken, endToken?: JsonToken) => Position */
0 commit comments