| 291 | } |
| 292 | |
| 293 | function visitChildren(obj, fn) { |
| 294 | let properties = null; |
| 295 | switch (obj.type) { |
| 296 | case 'any': |
| 297 | case 'null': |
| 298 | case 'undefined': |
| 299 | case 'void': |
| 300 | case 'unknown': |
| 301 | case 'never': |
| 302 | case 'this': |
| 303 | case 'symbol': |
| 304 | case 'identifier': |
| 305 | case 'string': |
| 306 | case 'number': |
| 307 | case 'boolean': |
| 308 | case 'link': |
| 309 | case 'reference': |
| 310 | return obj; |
| 311 | case 'union': |
| 312 | return { |
| 313 | type: 'union', |
| 314 | elements: obj.elements.map(i => fn(i, 'elements')) |
| 315 | }; |
| 316 | case 'intersection': |
| 317 | return { |
| 318 | type: 'intersection', |
| 319 | types: obj.types.map(i => fn(i, 'types')) |
| 320 | }; |
| 321 | case 'application': |
| 322 | return { |
| 323 | type: 'application', |
| 324 | base: fn(obj.base, 'base'), |
| 325 | typeParameters: obj.typeParameters.map(i => fn(i, 'typeParameters')) |
| 326 | }; |
| 327 | case 'typeOperator': |
| 328 | return { |
| 329 | type: 'typeOperator', |
| 330 | operator: obj.operator, |
| 331 | value: fn(obj.value, 'value') |
| 332 | }; |
| 333 | case 'parameter': |
| 334 | return { |
| 335 | type: 'parameter', |
| 336 | name: obj.name, |
| 337 | value: fn(obj.value, 'value'), |
| 338 | optional: obj.optional, |
| 339 | rest: obj.rest, |
| 340 | description: obj.description |
| 341 | }; |
| 342 | case 'property': |
| 343 | return { |
| 344 | type: 'property', |
| 345 | name: obj.name, |
| 346 | indexType: obj.indexType ? fn(obj.indexType, 'indexType') : null, |
| 347 | value: fn(obj.value, 'value'), |
| 348 | optional: obj.optional, |
| 349 | description: obj.description, |
| 350 | access: obj.access, |