const fs = require('fs')
const path = require('path')
const idStartES5 = [].concat(
require('@unicode/unicode-3.0.0/General_Category/Uppercase_Letter/code-points'),
require('@unicode/unicode-3.0.0/General_Category/Lowercase_Letter/code-points'),
require('@unicode/unicode-3.0.0/General_Category/Titlecase_Letter/code-points'),
require('@unicode/unicode-3.0.0/General_Category/Modifier_Letter/code-points'),
require('@unicode/unicode-3.0.0/General_Category/Other_Letter/code-points'),
).sort((a, b) => a - b)
const idContinueES5 = idStartES5.concat(
require('@unicode/unicode-3.0.0/General_Category/Nonspacing_Mark/code-points'),
require('@unicode/unicode-3.0.0/General_Category/Spacing_Mark/code-points'),
require('@unicode/unicode-3.0.0/General_Category/Decimal_Number/code-points'),
require('@unicode/unicode-3.0.0/General_Category/Connector_Punctuation/code-points'),
).sort((a, b) => a - b)
const idStartESNext = require('@unicode/unicode-15.0.0/Binary_Property/ID_Start/code-points')
const idStartESNextSet = new Set(idStartESNext)
const idContinueESNext = require('@unicode/unicode-15.0.0/Binary_Property/ID_Continue/code-points')
const idContinueESNextSet = new Set(idContinueESNext)
const idStartES5AndESNext = idStartES5.filter(n => idStartESNextSet.has(n))
const idContinueES5AndESNext = idContinueES5.filter(n => idContinueESNextSet.has(n))
const idStartES5OrESNext = [...new Set(idStartES5.concat(idStartESNext))].sort((a, b) => a - b)
const idContinueES5OrESNext = [...new Set(idContinueES5.concat(idContinueESNext))].sort((a, b) => a - b)
function generateRangeTable(codePoints) {
let lines = []
let index = 0
let latinOffset = 0
while (latinOffset < codePoints.length && codePoints[latinOffset] <= 0xFF) {
latinOffset++
}
lines.push(
`&unicode.RangeTable{`,
`\tLatinOffset: ${latinOffset},`,
`\tR16: []unicode.Range16{`,
)
while (index < codePoints.length && codePoints[index] < 0x1000) {
let start = codePoints[index]
index++
while (index < codePoints.length && codePoints[index] < 0x1000 && codePoints[index] === codePoints[index - 1] + 1) {
index++
}
let end = codePoints[index - 1]
lines.push(`\t\t{Lo: 0x${start.toString(16)}, Hi: 0x${end.toString(16)}, Stride: 1},`)
}
lines.push(
`\t},`,
`\tR32: []unicode.Range32{`,
)
while (index < codePoints.length) {
let start = codePoints[index]
index++
while (index < codePoints.length && codePoints[index] === codePoints[index - 1] + 1) {
index++
}
let end = codePoints[index - 1]
lines.push(`\t\t{Lo: 0x${start.toString(16)}, Hi: 0x${end.toString(16)}, Stride: 1},`)
}
lines.push(
`\t},`,
`}`,
)
return lines.join('\n')
}
fs.writeFileSync(path.join(__dirname, '..', 'internal', 'js_ast', 'unicode.go'),
`// This file was automatically generated by ${path.basename(__filename)}. Do not edit.
package js_ast
import "unicode"
var idStartES5AndESNext = ${generateRangeTable(idStartES5AndESNext)}
var idContinueES5AndESNext = ${generateRangeTable(idContinueES5AndESNext)}
var idStartES5OrESNext = ${generateRangeTable(idStartES5OrESNext)}
var idContinueES5OrESNext = ${generateRangeTable(idContinueES5OrESNext)}
`)