Skip to content

refactor(generators): Introduce LuaGenerator class, Order enum - #7161

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

refactor(generators): Introduce LuaGenerator class, Order enum#7161
cpcallen merged 3 commits into
RaspberryPiFoundation:developfrom
cpcallen:refactor/7085/lua

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 LuaGenerator class to be the class of which luaGenerator 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 luaGenerator to Lua in generators/lua/*.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 LuaGenerator class and Order enum should be automatically generated by our JSDoc configs.

Additional Information

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

DEPRECATION: The .ORDER_* constants on luaGenerator 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 02:48
@cpcallen
cpcallen requested a review from maribethbJune 14, 2023 02:48
@github-actionsgithub-actionsBot added the PR: refactor Refactors code label Jun 14, 2023
@cpcallen
cpcallen enabled auto-merge (squash) June 14, 2023 02:52
@github-actionsgithub-actionsBot added PR: refactor Refactors code and removed PR: refactor Refactors code labels Jun 14, 2023

@maribethbmaribethb 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, but similar to the JavaScript change, and for the other generators, please tag the PR with deprecation and add info to the PR description about the changes to Order for developers to read.

@cpcallen
cpcallen merged commit a11419d 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/lua branch June 14, 2023 18:01
@cpcallen

Copy link
Copy Markdown
CollaboratorAuthor

…please tag the PR with deprecation and add info to the PR description about the changes to Order for developers to read.

I've added an "Additional Information" section with prominent DEPRECATION: notice to each of the five LangGenerator PRs.

@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
cpcallen added a commit to cpcallen/blockly that referenced this pull request Jun 15, 2023
cpcallen added a commit that referenced this pull request Jun 20, 2023
…ffects (#7173)
* refactor(generators): Move lang.js -> lang/lang_gernator.js
Move the LangGenerator definitions into their respective
subdirectories and add a _generator suffix to their filenames,
i.e. generators/javascript.js becomes
generators/javascript/javascript_generator.js.
This is to keep related code together and allow the `lang/all.js`
entrypoints to be moved to the top level generators/ directory.
No goog module IDs were changed, so playground and test code
that accesses this modules by filename does not need to be modified.
* refactor(generators) Move lang/all.js -> lang.js
- Move the entrypoints in generators/*/all.js to correspondingly-named
files in generators/ instead—i.e., generators/javascript/all.js
becomes generators/javascript.js.
- Update build_tasks.js accordingly.
* fix(generators): Add missing exports for LuaGenerator, PhpGenerator
These were inadvertently omitted from #7161 and #7162, respectively.
* refactor(generators): Make block generator modules side-effect free
- Move declaration of <lang>Generator instance from
generators/<lang>/<lang>_generator.js to generators/<lang>.js.
- Move .addReservedWords() calls from generators/<lang>/*.js to
generators/<lang>.js
- Modify generators/<lang>/*.js to export block generator functions
individually, rather than installing on <lang>Generator instance.
- Modify generators/<lang>.js to import and install block generator
functions on <lang>Generator instance.
* fix(tests): Fix tests broken by restructuring of generators
Where these tests needed block generator functions preinstalled
they should have been importing the Blockly.<Lang>.all module.
Where they do not need the provided block generator functions
they can now create their own empty <Lang>Generator instances.
* chore: Update renamings file
- Fix a malformation in previous entries that was not detected by
the renaming file validator test.
- Add entries describing the work done in this and related recent
PRs.
* fix: Correct minor errors in PR #7173
- Fix a search-and-replace error in renamings.json5
- Fix an incorrect-but-usable import in generator_test.js
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@maribethb