11import { BasicEvaluator , IRunnerPlugin } from "@sourceacademy/conductor/runner" ;
22import type { PyodideInterface } from "pyodide" ;
3+ import { parse } from "../parser/parser-adapter" ;
4+ import { analyze } from "../resolver/analysis" ;
5+ import { getNonTorchImportRoots , rewriteTorchImports } from "./importAnalyzer" ;
36import { loadPyodideGeneric } from "./loadPyodide" ;
47import { loadTorch } from "./loadTorch" ;
5- import { rewriteTorchImports , getNonTorchImportRoots } from "./importAnalyzer" ;
68
7- export default class PyodideEvaluator extends BasicEvaluator {
8- private pyodide : Promise < PyodideInterface > ;
9+ export default abstract class PyodideEvaluator extends BasicEvaluator {
10+ protected pyodide : Promise < PyodideInterface > ;
911 private torchLoaded = false ;
1012
1113 constructor ( conductor : IRunnerPlugin ) {
@@ -21,7 +23,11 @@ export default class PyodideEvaluator extends BasicEvaluator {
2123 } ) ;
2224 }
2325
26+ protected abstract validateChunk ( _chunk : string ) : void ;
27+
2428 async evaluateChunk ( chunk : string ) : Promise < void > {
29+ this . validateChunk ( chunk ) ;
30+
2531 const pyodide = await this . pyodide ;
2632
2733 // --- Use Python's ast module (via Pyodide) to detect and rewrite torch imports ---
@@ -57,3 +63,18 @@ if missing:
5763 this . conductor . sendOutput ( output ) ;
5864 }
5965}
66+
67+ export class ChapterPyodideEvaluator extends PyodideEvaluator {
68+ private chapter : number ;
69+
70+ constructor ( conductor : IRunnerPlugin , chapter : number ) {
71+ super ( conductor ) ;
72+ this . chapter = chapter ;
73+ }
74+
75+ protected validateChunk ( chunk : string ) : void {
76+ const script = chunk + "\n" ;
77+ const ast = parse ( script ) ;
78+ analyze ( ast , script , this . chapter ) ;
79+ }
80+ }
0 commit comments