From 87dda4808356a226e2792762e77b9216145de739 Mon Sep 17 00:00:00 2001 From: Tony Garnock-Jones Date: Mon, 22 Mar 2021 12:29:27 +0100 Subject: [PATCH] Use $ instead of _ in tokens --- .../packages/schema/src/compiler/jskw.ts | 4 ++++ .../javascript/packages/schema/src/gen/schema.ts | 8 ++++---- .../javascript/packages/schema/src/meta.ts | 15 ++++++++------- .../javascript/packages/schema/src/reader.ts | 6 +++--- 4 files changed, 19 insertions(+), 14 deletions(-) diff --git a/implementations/javascript/packages/schema/src/compiler/jskw.ts b/implementations/javascript/packages/schema/src/compiler/jskw.ts index 4a4bc9c..2d1fb6c 100644 --- a/implementations/javascript/packages/schema/src/compiler/jskw.ts +++ b/implementations/javascript/packages/schema/src/compiler/jskw.ts @@ -1,3 +1,7 @@ +export function isJsKeyword(s: string): boolean { + return JS_KEYWORDS.has(s); +} + export const JS_KEYWORDS = new Set([ 'abstract', 'await', diff --git a/implementations/javascript/packages/schema/src/gen/schema.ts b/implementations/javascript/packages/schema/src/gen/schema.ts index 0dff790..a9c020f 100644 --- a/implementations/javascript/packages/schema/src/gen/schema.ts +++ b/implementations/javascript/packages/schema/src/gen/schema.ts @@ -23,7 +23,7 @@ export const $ref = Symbol.for("ref"); export const $schema = Symbol.for("schema"); export const $setof = Symbol.for("setof"); export const $tuple = Symbol.for("tuple"); -export const $tuple_STAR_ = Symbol.for("tuple*"); +export const $tuple$STAR$ = Symbol.for("tuple*"); export const $version = Symbol.for("version"); export const __lit5 = false; @@ -147,7 +147,7 @@ export namespace SimplePattern { export namespace CompoundPattern { export function rec(label: NamedPattern, fields: NamedPattern): CompoundPattern {return {"_variant": "rec", label, fields};}; export function tuple(patterns: Array): CompoundPattern {return {"_variant": "tuple", patterns};}; - export function tuple_STAR_(fixed: Array, variable: NamedSimplePattern): CompoundPattern {return {"_variant": "tuple*", fixed, variable};}; + export function tuple$STAR$(fixed: Array, variable: NamedSimplePattern): CompoundPattern {return {"_variant": "tuple*", fixed, variable};}; export function setof(pattern: SimplePattern): CompoundPattern {return {"_variant": "setof", pattern};}; export function dictof(key: SimplePattern, value: SimplePattern): CompoundPattern {return {"_variant": "dictof", key, value};}; export function dict(entries: DictionaryEntries): CompoundPattern {return {"_variant": "dict", entries};}; @@ -175,7 +175,7 @@ export namespace NamedPattern { export function anonymous(value: Pattern): NamedPattern {return {"_variant": "anonymous", value};}; } -export function NamedSimplePattern__(name: symbol, pattern: SimplePattern): NamedSimplePattern_ {return {name, pattern};} +export function NamedSimplePattern_(name: symbol, pattern: SimplePattern): NamedSimplePattern_ {return {name, pattern};} export function Ref(module: ModulePath, name: symbol): Ref {return {module, name};} @@ -490,7 +490,7 @@ export function toCompoundPattern(v: _val): undefined | CompoundPattern { if (result === void 0) { if (_.Record.isRecord<_val, _.Tuple<_val>, _ptr>(v)) { let _tmp8: (null) | undefined; - _tmp8 = _.is(v.label, $tuple_STAR_) ? null : void 0; + _tmp8 = _.is(v.label, $tuple$STAR$) ? null : void 0; if (_tmp8 !== void 0) { if (_.Array.isArray(v[0])) { let _tmp9: (Array<_val>) | undefined; diff --git a/implementations/javascript/packages/schema/src/meta.ts b/implementations/javascript/packages/schema/src/meta.ts index 59f9982..d160bda 100644 --- a/implementations/javascript/packages/schema/src/meta.ts +++ b/implementations/javascript/packages/schema/src/meta.ts @@ -2,7 +2,7 @@ import { Value, is, Position } from '@preserves/core'; import * as M from './gen/schema'; import { SchemaSyntaxError } from './error'; import type { AtomicType } from './compiler/type'; -import { JS_KEYWORDS } from './compiler/jskw'; +import { isJsKeyword } from './compiler/jskw'; export * from './gen/schema'; @@ -15,17 +15,18 @@ export function isValidToken(s: string): boolean { } export function isValidJsId(s: string): boolean { - return /^[$_a-zA-Z][$_a-zA-Z0-9]*$/.test(s) && !JS_KEYWORDS.has(s); + return /^[$_a-zA-Z][$_a-zA-Z0-9]*$/.test(s) && !isJsKeyword(s); } export function jsId(v: string, kf?: () => string): string { - const s = v - .replace('_', '__') - .replace('*', '_STAR_'); + return jsToken(v.replace('$', '$$').replace('*', '$STAR$'), kf); +} + +export function jsToken(s: string, kf?: () => string): string { if (isValidJsId(s)) return s; if (isValidJsId('$' + s)) return '$' + s; if (kf !== void 0) return kf(); - throw new Error(`Internal error: idForLiteral needs to be completed (${v})`); + throw new Error(`Internal error: jsToken needs to be completed (${s})`); } export const ANDSYM = Symbol.for('&'); @@ -110,7 +111,7 @@ export function addNameIfAbsent(p: M.NamedSimplePattern, k: M._val): M.NamedSimp } else { const s = namelike(k); if (s !== void 0) { - return M.NamedSimplePattern.named(M.NamedSimplePattern__(Symbol.for(s), p.value)); + return M.NamedSimplePattern.named(M.NamedSimplePattern_(Symbol.for(s), p.value)); } else { return p; } diff --git a/implementations/javascript/packages/schema/src/reader.ts b/implementations/javascript/packages/schema/src/reader.ts index 766d82a..9f948d1 100644 --- a/implementations/javascript/packages/schema/src/reader.ts +++ b/implementations/javascript/packages/schema/src/reader.ts @@ -164,7 +164,7 @@ function parseDefinition(name: symbol, body: Array): Definition { const n = findName(input) || findName(input[0]); if (n !== false) { if (p._variant !== 'SimplePattern') namedMustBeSimple(position(input[0])); - return M.NamedPattern.named(M.NamedSimplePattern__(n, p.value)); + return M.NamedPattern.named(M.NamedSimplePattern_(n, p.value)); } return M.NamedPattern.anonymous(p); } @@ -253,7 +253,7 @@ function parsePattern(name: symbol, body0: Array): Pattern { if (name === false) { return anonymous(recur(b)); } - return named(M.NamedSimplePattern__(name, parseSimple(b, p => p, () => + return named(M.NamedSimplePattern_(name, parseSimple(b, p => p, () => namedMustBeSimple(position(b))))); }; } @@ -281,7 +281,7 @@ function parsePattern(name: symbol, body0: Array): Pattern { } else if (Array.isArray(item)) { if (is(item[item.length - 1], M.DOTDOTDOT)) { if (item.length < 2) complain(); - return M.CompoundPattern.tuple_STAR_( + return M.CompoundPattern.tuple$STAR$( item.slice(0, item.length - 2).map(maybeNamed), maybeNamedSimple(item[item.length - 2])); } else {