Skip to content

Commit

Permalink
feature: inject global context
Browse files Browse the repository at this point in the history
  • Loading branch information
mistlog committed Oct 23, 2021
1 parent 15776ac commit 6d50b4f
Show file tree
Hide file tree
Showing 5 changed files with 29 additions and 9 deletions.
19 changes: 19 additions & 0 deletions src/renderer/renderer.test.tsx
Expand Up @@ -70,4 +70,23 @@ test("renderer: tracer", () => {
const parser = ReactPeg.render(<TracerTest />, { tracer });
const ast = parser.parse("123");
expect(ast).toEqual("123");
})

test("renderer.context", () => {

function ContextTest() {
return (
<pattern action={({ digit, globalContext }) => {
return globalContext.transform(digit);
}}>
<Digit label="digit" />
</pattern>
);
}

const parser = ReactPeg.render(<ContextTest />);
const ast = parser.parse("1", {
transform: (digit: string) => `digit value is ${digit}`
});
expect(ast).toEqual("digit value is 1");
})
7 changes: 4 additions & 3 deletions src/renderer/renderer.ts
Expand Up @@ -23,11 +23,12 @@ class Renderer {
constructor(chunk: Chunk) {
this.initializer = `
{
const { actions } = options;
const { actions, context } = options;
const globalFunction = {
location,
text
};
const globalContext = context || {};
}
`;

Expand Down Expand Up @@ -80,9 +81,9 @@ class Parser {
this.parser = peg.generate(this.grammar, { trace: Boolean(renderer.tracer) });
}

parse(code: string) {
parse(code: string, context = {}) {
try {
const options: peg.ParserOptions = { actions: this.renderer.actions };
const options: peg.ParserOptions = { actions: this.renderer.actions, context };
if (this.renderer.tracer) {
/**
* Tracing with peg.js: https://gist.github.com/mistlog/3ac6fdf7de3e7af2da15b339b4bb5187
Expand Down
4 changes: 2 additions & 2 deletions src/translator/built-in/__snapshots__/built-in.test.tsx.snap
Expand Up @@ -2,8 +2,8 @@

exports[`translator.pattern 1`] = `
"((a: 'a' {
return actions.get(\\"action0\\")({a, globalFunction});
return actions.get(\\"action0\\")({a, globalFunction,globalContext});
}) / (b: 'b' {
return actions.get(\\"action1\\")({b, globalFunction});
return actions.get(\\"action1\\")({b, globalFunction,globalContext});
}))"
`;
4 changes: 2 additions & 2 deletions src/translator/built-in/pattern.ts
Expand Up @@ -11,14 +11,14 @@ export class PatternTranslator extends Translator {
}
}

function translateAction(action: Function, labels: Array<string>, actions: Map<string,Function>) {
function translateAction(action: Function, labels: Array<string>, actions: Map<string, Function>) {
const labels_param = labels.length === 0 ? "" : `${labels.join(", ")}, `;

const key = `action${actions.size}`;
actions.set(key, action);

const actionStr = `{
return actions.get("${key}")({${labels_param}globalFunction});
return actions.get("${key}")({${labels_param}${["globalFunction", "globalContext"].join(",")}});
}`;
return actionStr;
}
Expand Down
4 changes: 2 additions & 2 deletions src/translator/rule/__snapshots__/rule.test.tsx.snap
Expand Up @@ -8,12 +8,12 @@ exports[`translator.rule.pattern 1`] = `"Test \\"Test\\" = Foo"`;

exports[`translator.rule.props 1`] = `
"Char \\"Char\\" = ([A-Z] {
return actions.get(\\"action0\\")({globalFunction});
return actions.get(\\"action0\\")({globalFunction,globalContext});
})"
`;

exports[`translator.rule.props 2`] = `
"Char \\"Char\\" = ([a-z] {
return actions.get(\\"action0\\")({globalFunction});
return actions.get(\\"action0\\")({globalFunction,globalContext});
})"
`;

0 comments on commit 6d50b4f

Please sign in to comment.