Skip to content

refactor(generators): Introduce JavascriptGenerator class, Order enum #7153

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 4 commits into from
Jun 13, 2023

Conversation

cpcallen
Copy link
Contributor

@cpcallen cpcallen commented Jun 13, 2023

The basics

  • I branched from develop
  • My pull request is against develop
  • My code follows the style guide
  • I ran npm run format and npm run lint

The details

Resolves

First part of #7085.

Proposed Changes

  • Introduce a JavascriptGenerator class to be the class of which javascriptGenerator is an instance (without any additional properties making it a singleton).
  • Introduce an Order enum (for now Closure-style) for the operator precedence table.
  • Don't rename javascriptGenerator to JavaScript in generators/javascript/*.js.

Behaviour Before/After Change

There should be no changes in behaviour.

Reason for Changes

See #7085.

Test Coverage

Passes npm test; no changes to manual testing anticipated.

Documentation

Documentation for the JavascriptGenerator class and Order enum should be automatically generated by our JSDoc configs (though if this is not currently the case then we should fix that).

Additional Information

It is now possible to create multiple JavascriptGenerator objects, which can share (or not share) block generator implementations. Note that new instances do not by default come with any generator functions pre-installed.

import {javascriptGenerator, JavascriptGenerator} from 'blockly/javascript';

const customJSGenerator = new JavascriptGenerator();

// Optionally copy standard generator functions to new instance:
Object.assign(customJSGenerator.forBlock, javascriptGenerator.forBlock);

// Optionally add/replace some/all generator functions:
customJSGenerator.forBlock('block_type') = function(block) {/* new implementation */};

// Optionally change settings:
customJSGenerator.INDENT = '\t';  // Use tabs to indent generated code.

We now provide an enum of the operator precedence values (order of operations) constants as a separate export:

import {javascriptGenerator, Order} from 'blockly/javascript';

// Old:
javascriptGenerator.forBlock('answer_expression_block') = function(block) {
  const code = '42';
  return [code, javascriptGenerator.ORDER_ATOMIC]
}

// New:
javascriptGenerator.forBlock('answer_expression_block') = function(block) {
  const code = '42';
  return [code, Order.ATOMIC]
}

DEPRECATION: The .ORDER_* constants on javascriptGenerator are deprecated; they still exist but are no longer part of the documented API and will be removed in a future version of Blockly. We recommend that you update your custom generator code to use the Order enum at your earliest convenience.

@cpcallen cpcallen merged commit 306eb80 into google:develop Jun 13, 2023
@cpcallen cpcallen deleted the refactor/7085/javascript branch June 13, 2023 20:30
@cpcallen
Copy link
Contributor Author

Oh, bother: I merged before pushing commit with comment update. Drat.

cpcallen added a commit to cpcallen/blockly that referenced this pull request Jun 13, 2023
cpcallen added a commit to cpcallen/blockly that referenced this pull request Jun 13, 2023
@cpcallen cpcallen added the deprecation This PR deprecates an API. label Jun 14, 2023
@github-actions github-actions bot added PR: refactor and removed PR: refactor deprecation This PR deprecates an API. labels Jun 14, 2023
cpcallen added a commit to cpcallen/blockly that referenced this pull request Jun 14, 2023
Addresses various nits that escaped previous PRs:

* Add TSDoc for `BlockGenerator` in `core/generator.ts` for PR google#7150.
* Fix bad formating in `generators/javascript.js` from PR google#7153.
* Add missing `@enum` tag that should have been included in PR google#7160.
* Delete obsolete comment from `generators/python.js` for PR google#7163.
@cpcallen cpcallen mentioned this pull request Jun 14, 2023
4 tasks
cpcallen added a commit that referenced this pull request Jun 14, 2023
Addresses various nits that escaped previous PRs:

* Add TSDoc for `BlockGenerator` in `core/generator.ts` for PR #7150.
* Fix bad formating in `generators/javascript.js` from PR #7153.
* Add missing `@enum` tag that should have been included in PR #7160.
* Delete obsolete comment from `generators/python.js` for PR #7163.
@cpcallen cpcallen added the deprecation This PR deprecates an API. label Jun 15, 2023
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants