Skip to content

Commit 4e73234

Browse files
committed
Create GeneratorContext once, in the ExtendedPythonGenerator constructor.
Change mrcWorkspaceToCode to take a Module instead of GeneratorContext. Change mrcWorkspaceToCode to call context.setModule and this.init(workspace).
1 parent a02acd5 commit 4e73234

File tree

4 files changed

+20
-42
lines changed

4 files changed

+20
-42
lines changed

src/App.tsx

Lines changed: 4 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,6 @@ import ToolboxSettingsModal from './reactComponents/ToolboxSettings';
3333
import * as Tabs from './reactComponents/Tabs';
3434
import { TabType } from './types/TabType';
3535

36-
import { createGeneratorContext, GeneratorContext } from './editor/generator_context';
3736
import * as editor from './editor/editor';
3837
import { extendedPythonGenerator } from './editor/extended_python_generator';
3938

@@ -172,8 +171,6 @@ const AppContent: React.FC<AppContentProps> = ({ project, setProject }): React.J
172171
const [languageInitialized, setLanguageInitialized] = React.useState(false);
173172
const [themeInitialized, setThemeInitialized] = React.useState(false);
174173

175-
const generatorContext = React.useRef<GeneratorContext | null>(null);
176-
177174
/** modulePaths controls how BlocklyComponents are created. */
178175
const modulePaths = React.useRef<string[]>([]);
179176
const modulePathToBlocklyComponent = React.useRef<{[modulePath: string]: BlocklyComponentType}>({});
@@ -434,7 +431,6 @@ const AppContent: React.FC<AppContentProps> = ({ project, setProject }): React.J
434431
// Initialize blocks when app loads
435432
React.useEffect(() => {
436433
initializeBlocks();
437-
generatorContext.current = createGeneratorContext();
438434
}, []);
439435

440436
React.useEffect(() => {
@@ -443,9 +439,6 @@ const AppContent: React.FC<AppContentProps> = ({ project, setProject }): React.J
443439

444440
// Update generator context and load module blocks when current module changes
445441
React.useEffect(() => {
446-
if (generatorContext.current) {
447-
generatorContext.current.setModule(currentModule);
448-
}
449442
if (currentModule) {
450443
if (modulePaths.current.includes(currentModule.modulePath)) {
451444
activateEditor();
@@ -460,9 +453,6 @@ const AppContent: React.FC<AppContentProps> = ({ project, setProject }): React.J
460453
if (!project || !currentModule) {
461454
return;
462455
}
463-
if (generatorContext.current) {
464-
generatorContext.current.setModule(currentModule);
465-
}
466456
for (const modulePath in modulePathToBlocklyComponent.current) {
467457
const blocklyComponent = modulePathToBlocklyComponent.current[modulePath];
468458
const active = (modulePath === currentModule.modulePath);
@@ -485,7 +475,7 @@ const AppContent: React.FC<AppContentProps> = ({ project, setProject }): React.J
485475
};
486476

487477
const setupWorkspace = (modulePath: string, newWorkspace: Blockly.WorkspaceSvg) => {
488-
if (!project || !storage || !generatorContext.current) {
478+
if (!project || !storage) {
489479
return;
490480
}
491481
const module = storageProject.findModuleByModulePath(project, modulePath);
@@ -506,7 +496,7 @@ const AppContent: React.FC<AppContentProps> = ({ project, setProject }): React.J
506496
}
507497

508498
const newEditor = new editor.Editor(
509-
newWorkspace, module, project, generatorContext.current, storage, modulePathToContentText);
499+
newWorkspace, module, project, storage, modulePathToContentText);
510500
modulePathToEditor.current[modulePath] = newEditor;
511501
newEditor.loadModuleBlocks();
512502
newEditor.updateToolbox(shownPythonToolboxCategories);
@@ -519,11 +509,11 @@ const AppContent: React.FC<AppContentProps> = ({ project, setProject }): React.J
519509
// Generate code when module or regeneration trigger changes
520510
React.useEffect(() => {
521511
let generatedCode = '';
522-
if (currentModule && generatorContext.current) {
512+
if (currentModule) {
523513
if (currentModule.modulePath in modulePathToBlocklyComponent.current) {
524514
const blocklyComponent = modulePathToBlocklyComponent.current[currentModule.modulePath];
525515
generatedCode = extendedPythonGenerator.mrcWorkspaceToCode(
526-
blocklyComponent.getBlocklyWorkspace(), generatorContext.current);
516+
blocklyComponent.getBlocklyWorkspace(), currentModule);
527517
}
528518
}
529519
setGeneratedCode(generatedCode);

src/editor/editor.ts

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,6 @@
2222
import * as Blockly from 'blockly/core';
2323

2424
import { extendedPythonGenerator } from './extended_python_generator';
25-
import { GeneratorContext } from './generator_context';
2625
import * as commonStorage from '../storage/common_storage';
2726
import * as storageModule from '../storage/module';
2827
import * as storageModuleContent from '../storage/module_content';
@@ -46,7 +45,6 @@ export class Editor {
4645
private readonly blocklyWorkspace: Blockly.WorkspaceSvg;
4746
private readonly module: storageModule.Module;
4847
private readonly projectName: string;
49-
private readonly generatorContext: GeneratorContext;
5048
private readonly storage: commonStorage.Storage;
5149
private readonly modulePath: string;
5250
private readonly robotPath: string;
@@ -63,13 +61,11 @@ export class Editor {
6361
blocklyWorkspace: Blockly.WorkspaceSvg,
6462
module: storageModule.Module,
6563
project: storageProject.Project,
66-
generatorContext: GeneratorContext,
6764
storage: commonStorage.Storage,
6865
modulePathToContentText: {[modulePath: string]: string}) {
6966
this.blocklyWorkspace = blocklyWorkspace;
7067
this.module = module;
7168
this.projectName = project.projectName;
72-
this.generatorContext = generatorContext;
7369
this.storage = storage;
7470
this.modulePath = module.modulePath;
7571
this.robotPath = project.robot.modulePath;
@@ -228,9 +224,7 @@ export class Editor {
228224
}
229225

230226
// Generate python because some parts of components, events, and methods are affected.
231-
this.generatorContext.setModule(this.module);
232-
extendedPythonGenerator.init(this.blocklyWorkspace);
233-
extendedPythonGenerator.mrcWorkspaceToCode(this.blocklyWorkspace, this.generatorContext);
227+
extendedPythonGenerator.mrcWorkspaceToCode(this.blocklyWorkspace, this.module);
234228

235229
const blocks = Blockly.serialization.workspaces.save(this.blocklyWorkspace);
236230
const mechanisms: storageModuleContent.MechanismInRobot[] = this.getMechanismsFromWorkspace();

src/editor/extended_python_generator.ts

Lines changed: 13 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@
2121

2222
import * as Blockly from 'blockly/core';
2323
import { PythonGenerator } from 'blockly/python';
24-
import { GeneratorContext } from './generator_context';
24+
import { createGeneratorContext, GeneratorContext } from './generator_context';
2525
import * as mechanismContainerHolder from '../blocks/mrc_mechanism_component_holder';
2626
import * as eventHandler from '../blocks/mrc_event_handler';
2727
import {
@@ -69,7 +69,7 @@ export class OpModeDetails {
6969

7070
export class ExtendedPythonGenerator extends PythonGenerator {
7171
private workspace: Blockly.Workspace | null = null;
72-
private context: GeneratorContext | null = null;
72+
private readonly context: GeneratorContext;
7373

7474
// Fields related to generating the __init__ for a mechanism.
7575
private hasAnyComponents = false;
@@ -85,6 +85,7 @@ export class ExtendedPythonGenerator extends PythonGenerator {
8585

8686
constructor() {
8787
super('Python');
88+
this.context = createGeneratorContext();
8889
}
8990

9091
init(workspace: Blockly.Workspace){
@@ -128,22 +129,24 @@ export class ExtendedPythonGenerator extends PythonGenerator {
128129
return "self." + varName;
129130
}
130131

131-
mrcWorkspaceToCode(workspace: Blockly.Workspace, context: GeneratorContext): string {
132+
mrcWorkspaceToCode(workspace: Blockly.Workspace, module: storageModule.Module): string {
132133
this.workspace = workspace;
133-
this.context = context;
134+
135+
this.context.setModule(module);
136+
this.init(workspace);
134137

135138
this.hasAnyComponents = false;
136139
this.componentPorts = Object.create(null);
137140
if (this.getModuleType() === storageModule.ModuleType.MECHANISM) {
138-
this.hasAnyComponents = mechanismContainerHolder.hasAnyComponents(this.workspace);
139-
mechanismContainerHolder.getComponentPorts(this.workspace, this.componentPorts);
141+
this.hasAnyComponents = mechanismContainerHolder.hasAnyComponents(workspace);
142+
mechanismContainerHolder.getComponentPorts(workspace, this.componentPorts);
140143
}
141-
this.hasAnyEventHandlers = eventHandler.getHasAnyEnabledEventHandlers(this.workspace);
144+
this.hasAnyEventHandlers = eventHandler.getHasAnyEnabledEventHandlers(workspace);
142145

143146
const code = super.workspaceToCode(workspace);
144147

145-
this.workspace = workspace;
146-
this.context = null;
148+
this.context.setModule(null);
149+
this.workspace = null;
147150
return code;
148151
}
149152

@@ -192,7 +195,7 @@ export class ExtendedPythonGenerator extends PythonGenerator {
192195
}
193196

194197
finish(code: string): string {
195-
if (this.context && this.workspace) {
198+
if (this.workspace) {
196199
const className = this.context.getClassName();
197200
const baseClassName = this.context.getBaseClassName();
198201
const decorations = this.details?.decorations(className);

src/storage/create_python_files.ts

Lines changed: 2 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,6 @@ import { parseModuleContentText } from './module_content';
2929
import { Project } from './project';
3030
import { pascalCaseToSnakeCase } from './names';
3131
import JSZip from 'jszip';
32-
import { GeneratorContext } from '../editor/generator_context';
3332

3433
/** Result of Python code generation for a single module */
3534
interface ModulePythonResult {
@@ -66,18 +65,10 @@ async function generatePythonForModule(module: Module, storage: Storage): Promis
6665

6766
// Parse and load the JSON into the workspace
6867
const blocks = moduleContent.getBlocks();
69-
7068
Blockly.serialization.workspaces.load(blocks, workspace);
7169

72-
// Create and set up generator context like the editor does
73-
const generatorContext = new GeneratorContext();
74-
generatorContext.setModule(module);
75-
76-
// Initialize the generator
77-
extendedPythonGenerator.init(workspace);
78-
79-
// Generate Python code using the same method as the editor
80-
const pythonCode = extendedPythonGenerator.mrcWorkspaceToCode(workspace, generatorContext);
70+
// Generate Python code.
71+
const pythonCode = extendedPythonGenerator.mrcWorkspaceToCode(workspace, module);
8172

8273
// Clean up the workspace
8374
workspace.dispose();

0 commit comments

Comments
 (0)