Skip to content

refactor(generators): Introduce PythonGenerator class, Order enum - #7163

Merged
cpcallen merged 3 commits into
RaspberryPiFoundation:developfrom
cpcallen:refactor/7085/python
Jun 14, 2023
Merged

refactor(generators): Introduce PythonGenerator class, Order enum#7163
cpcallen merged 3 commits into
RaspberryPiFoundation:developfrom
cpcallen:refactor/7085/python

Conversation

@cpcallen

@cpcallencpcallen commented Jun 14, 2023

Copy link
Copy Markdown
Collaborator

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

Part of #7085.

Proposed Changes

Introduce a PythonGenerator class to be the class of which pythonGenerator 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 pythonGenerator to Python in generators/python/*.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 PythonGenerator class and Order enum should be automatically generated by our JSDoc configs.

Additional Information

It is now possible to create multiple pythonGenerator 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{pythonGenerator,PythonGenerator}from'blockly/python';constcustomJSGenerator=newPythonGenerator();// Optionally copy standard generator functions to new instance:Object.assign(customPythonGenerator.forBlock,pythonGenerator.forBlock);// Optionally add/replace some/all generator functions:customPythonGenerator.forBlock('block_type')=function(block){/* new implementation */};// Optionally change settings:customPythonGenerator.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{pythonGenerator,Order}from'blockly/python';// Old:pythonGenerator.forBlock('answer_expression_block')=function(block){constcode='42';return[code,pythonGenerator.ORDER_ATOMIC]}// New:pythonGenerator.forBlock('answer_expression_block')=function(block){constcode='42';return[code,Order.ATOMIC]}

DEPRECATION: The .ORDER_* constants on pythonGenerator 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 requested a review from a team as a code ownerJune 14, 2023 04:17
@cpcallen
cpcallen requested a review from BeksOmegaJune 14, 2023 04:17
@github-actionsgithub-actionsBot added PR: refactor Refactors code and removed PR: refactor Refactors code labels Jun 14, 2023
@cpcallen
cpcallen enabled auto-merge (squash) June 14, 2023 04:18

@BeksOmegaBeksOmega left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM!

Comment threadgenerators/python.js
* @protected
*/
quote_(string) {
// Can't use goog.string.quote since % must also be escaped.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

nit: remove reference to goog?

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Sure. I deleted the comment completely, because we don't use the closure library any more and there didn't appear to be any code that handles % specially (and indeed after checking the python docs I'm not sure why there would be).

@cpcallen
cpcallen merged commit 2f89c0d into RaspberryPiFoundation:developJun 14, 2023
@cpcallencpcallen added the deprecation This PR deprecates an API. label Jun 14, 2023
@github-actionsgithub-actionsBot added PR: refactor Refactors code and removed PR: refactor Refactors code deprecation This PR deprecates an API. labels Jun 14, 2023
@cpcallen
cpcallen deleted the refactor/7085/python branch June 14, 2023 18:01
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 RaspberryPiFoundation#7150.
* Fix bad formating in `generators/javascript.js` from PR RaspberryPiFoundation#7153.
* Add missing `@enum` tag that should have been included in PR RaspberryPiFoundation#7160.
* Delete obsolete comment from `generators/python.js` for PR RaspberryPiFoundation#7163.
@cpcallencpcallen 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.
@cpcallencpcallen linked an issue Jun 14, 2023 that may be closed by this pull request
@cpcallencpcallen added the deprecation This PR deprecates an API. label Jun 15, 2023
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

deprecationThis PR deprecates an API.PR: refactorRefactors code

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Proposal: Per-language subclasses of CodeGenerator in generators/

2 participants

@cpcallen@BeksOmega