Skip to content

Commit 9afac5e

Browse files
s-kyboundRichDom2185martin-henz
authored
update frontend for scheme data visualisation (#2916)
* Switch Scheme languages fully to CSE Machine * Updated tests with windows machine * Ran tests on different windows machine * resolve all issues with scheme CSE machine * update tests * reenable csc machine for scheme * add prototype visualisations for scheme data types * update tests * simplify logic for checking prelude * Make cse refer to correct closure * Centralise logic for alternate languages * separate scheme as its own file * add scheme primitive representation to cse machine * update representation of control * Squashed commit of the following: commit 27f3fe4 Author: Martin Henz <henz@comp.nus.edu.sg> Date: Sun Apr 14 15:21:16 2024 +0800 bumping js-slang (#2934) commit 812393a Author: Richard Dominick <34370238+RichDom2185@users.noreply.github.com> Date: Sun Apr 14 13:28:11 2024 +0800 Migrate to TypeScript v5 (#2850) * Bump TypeScript to v5.4 Also updated tsconfig.json to remove a deprecated config. * Fix type error * Fix type error * Fix type error * Fix type error * Fix type error * Fix lint dependencies and config * Fix type errors * Fix type error * Fix format * Fix type errors Also standardized React hooks import style. * Fix type error * Fix type error * Fix format * Bump typescript to v5.4.3 * Fix type errors * Add some `as any` assertions FIXMEs were also incorporated for future refactoring. * Update lockfile post-merge * Bump dependencies * Update lockfile post-merge * Create type-safe object helpers * Fix type error * Fix type error * Fix type error * Create more type helpers * Fix type error * Fix type error Also removed unnecessary type annotation. * Fix type error * Fix type error * Fix type errors * Fix type error * Fix type error * Fix type errors * Fix type error * Fix type error * Refactor filter logic to fix type error * Fix types * Address comments commit 87e646d Author: CZX <CZX123@users.noreply.github.com> Date: Sat Apr 13 23:05:04 2024 +0800 CSE UI/UX: Animations & UI improvements (#2931) * display array indices * animate moving numbers from agenda to stash * add code to read from previous agenda * Add animation components and some abstraction * Change test cases * Fix bug Properly disable animations when control and stash option is not enabled * display array indices * animate moving numbers from agenda to stash * add code to read from previous agenda * Add animation components and some abstraction * Change test cases * Fix bug Properly disable animations when control and stash option is not enabled * Fix issues with names after rebase * Fix animation bugs and refactoring of animation classes and logic * Fix mistake in test snapshot * Revert "Merge branch 'cse-uiux' of https://github.com/source-academy/frontend into cse-uiux" This reverts commit 7ef87d8, reversing changes made to efa8c57. * Restructure animation classes * Add binary operator animation * Add unary operator animation * Begin work on block separation animation * Improve binary operation animation, and improve the versatility of the base animation components * Improve the unary operation and block animations * Update test cases and remove block animation conditions * Add pop animation (linear movement) * Improve pop animation, and cleanup code for pull request * Revert envVisualizer test snapshot changes * Add assignment animation * Work on binding lookup function * Improve assignment animation and touch up on other animations, added experimental Column component * Add lookup animation (Identifier) * Improve lookup animation * Hide arrows for lookup animation and show them when it's finished * Remove AnimationUtils.tsx file replaced with AnimationUtils.ts * Slow down assignment and lookup animations * Fix issues with merging * Add environment animation * Refactor setDestination and animate to new method animateTo * Improve env animation and rename a utility function * Added animated arrows and also modified GenericArrow and improve assignment animation * Update test snapshot and formatting changes * Add arrow animation to lookup animation, and fix animateTo function behavior * Add FrameCreationAnimation * Rewrote all animation components for greater flexibility and performance * Shorten duration and delay names, and add listener functionality * Move experimental file * Fix issues with `this` keyword * Rewrite AnimatedTextbox to make it easier for both Text and Rect within it to be individually animated * Improve FrameCreationAnimation and bunch of other fixes * Fix some issues with `undefined` inside the control and stash * Make compact components the new default and remove any mentions to the old components. Also removes the experimental button toggle. * Update test snapshots * Clean up testing code a little * Formatting changes * Fix issues after merge * Revert some incorrect merges * Add FunctionFrameCreationAnimation if possible, reusing AssignmentAnimation would make handling fade-in of values easier * Add getNodeDimensions and getNodeLocation * Add ArrowFunctionExpressionAnimation * Add BranchAnimation simple animation for replacing a branch item in the control with the correct code block * Sort instr types in alphabetical order * Add ArrayLiteralAnimation * Added cases for block splitting for/while loops and conditional expressions * Improve animations for arrow functions and branch instruction * Update function application animation * Special changes for js-slang branch: add new objectCount property and filter program bindings * Change dummy binding behavior to match js-slang update * Fix array references being lost in frames due to cloning property descriptors * Simplify code * Add ArrayAccessAnimation * Begin work on ArrayAssignmentAnimation todo: animate arrows for object assignment * Fix application animation for predeclared funcs * Changes to solve issue 2700 and some fixes regarding global frame * Re-add animations * Fix many issues regarding displaying objects on global frame * Formatting * Simplify merging of environment heaps and drawing of bindings * Fix infinite loop in `findObjects` * Disable animations if control is truncated Could allow such functionality in the future, but currently animations break with a truncated control. * Fix AssignmentAnimation previous use of binding.height() causes positioning issues with nested array assignment * Increase space between closure and frame * Change for/while instr to use BranchAnimation * Initial Commit * More fixes and added faded gc objects * Disable variadic function animation * Increase spacing for global closure between closure circles and global frame border * Add missing case 'FunctionExpression' animates the moving of a functionexpression to the stash as a closure * Fix variadic function checker * Improve FunctionApplicationAnimation for nullary functions, allow the closure stash item to fade away * Improve assignment animation * Run format * Simplify check frame creation * Fix params text and added SourceObject to display runes correctly * bumping js-slang * Revamp unreferenced behavior and update snapshots * Run format * Update snapshot * Bump js-slang * Fix issues after merge * Fix frames creeping to the left * Improve rune display, revamp color system and add color interpolation * UI & animation improvements * Big improvements for many animations * More improvements, better transitions between border colors * More improvements and update snapshot * Update types * Remove explicit fragment * Remove explicit fragment again * Update typings * Merge branch 'cse-uiux2' of https://github.com/source-academy/frontend into cse-uiux2 * Fix findObjects * Add docs * Re-add color dependencies for Java CSE * Re-add color dependencies for Java CSE * Fix format * Array access & asgn animation improvements, general polish * Cleanup and update java cse machine colors to use new functions * Move type helpers from animation utils to global type helpers file * Run format * Fix fn to frame arrow, and cleanup arrow code --------- Co-authored-by: notnotmax <156508404+notnotmax@users.noreply.github.com> Co-authored-by: Richard Dominick <34370238+RichDom2185@users.noreply.github.com> Co-authored-by: henz <henz@comp.nus.edu.sg> commit 4f6be6b Author: Richard Dominick <34370238+RichDom2185@users.noreply.github.com> Date: Sat Apr 13 21:05:41 2024 +0800 Refactor frontend part 7 (#2846) * Improve useRef type arguments for HTML elements * Use named imports for React hooks * Refactor MobileWorkspace * Replace if statements with optional invocation * Move constant `SideContentTab`s out of FC body * Simplify classnames call * Remove unnecessary braces around string attributes Only done for non-UI (non-message/label) strings as these UI strings will be pulled out for internationalization in the future. * Deduplicate dependencies * Create `useTokens` hook * Update default throw behavior for `useTokens` * Render SICP chatbot only when logged in * Fix overloaded types for `useTokens` Done following default behavior change. * Use `useTokens` where applicable * Refactor SICP chatbox * Use `useTokens` * Move API call to separate file * Update React import to default import * Refactor SICP chatbox further * Update imports * Create and use ChatMessage type alias * Reorganize SICP chatbot files * Refactor chat completion logic * Use dependency injection in prompt builder * Refactor prompt builder logic * Refactor prompt builder to separate file * Create type definitions * Move, type, rename SICP section summaries * Improve typing * Refactor SICP chat box component * Remove unnecessary template literal * Refactor constants out of component * Create type definitions * Create `CONTEXT_SIZE` constant to replace magic numbers * Refactor logic to use `CONTEXT_SIZE` constant * Remove unnecessary state variables * Refactor payload generation * Move fetching logic from event handler to effect callback instead * Rename `cleanMessage` to `resetChat` * Decouple rendering logic from chat completion logic * Only store string content in `ChatMessage` type * Move rendering function outside component to prevent unnecessary recreation * Update render function signature * Restore GPT-generated output warning for bot messages * Refactor render function logic * Fix React render warnings * Add TODOs for full Markdown/stories-like parsing Also uses non-greedy regex to match and split code blocks: * Only match JavaScript code blocks * Fix false matches * Supports multiple code blocks in a single message * Fix whitespace issue * Fix filename capitalization * Remove duplicated badge code * Fix double request * Block chat input when loading response commit c1abec1 Author: Richard Dominick <34370238+RichDom2185@users.noreply.github.com> Date: Sat Apr 13 20:35:47 2024 +0800 Bump Blueprint; remove obsolete hotfixes, deprecations (#2773) * Bump minimum Blueprint version Done to allow compatibility with new React 18 `createRoot`. * Migrate from deprecated `Tooltip2`, `Popover2` Done partially so far, with the full migration in a subsequent commit. * Migrate more components to fix deprecations * Update test snapshots * Migrate remaining components to fix deprecations * Remove deprecated package from `requireProvider` This would necessitate a corresponding change in modules to ensure they don't import the deprecated package, or simply just mark it as non-external. * Remove `@blueprintjs/popover2` package completely * Fix format * Fix format * Reformat files post-merge * Bump Blueprint version * Use BP `Classes` utility instead of raw strings Prevents regressions when the CSS namespace changes in the meantime while we still have yet to migrate away fully from the CSS API. * Fix lint * Migrate to new notifications API Removes the old hotfix now that Blueprint supports it. commit d2b322a Author: Josh Thoo Jen Sen <110712708+josh1248@users.noreply.github.com> Date: Sat Apr 13 20:03:17 2024 +0800 Implement isGradingPublished (plus related features) (#2856) * Dummy publish grading function * skeleton redux loop for publishGrading, update GradingOverview * New column filter for isPublished (WIP) * Implement anticipated backend format and route implementations for publish and unpublish buttons * Remove misleading devnote and simplify message contents * fix: Change gradingOverviews to use backend response * Readjust publish button from HTML icon button to Blueprintjs text button * Publish and unpublish buttons set up * set up frontend-only type submissionProgress derived from backend status and isPublished * Implement derived submissionProgress frontend field from status and isGradingPublished from backend * Improve type safety in Grading page * Implement business logic to disable unsubmission if published or not submitted * Use notPublished param in backend * minor type safety change * Update new actions post-merge conflicts * Update tests * Update jsdocs and field names from ungraded to unpublished * adjust field names in test from unpublishedFilter to publishedFilter * Updated showGrading to be based on published status * Update getAssessmentOverviews to compute submission progress * Fix tests * Scaffold function for comprehensive progress status (WIP) * Update RequestsSaga.ts * fix crash * Introduce soon-to-be comprehensive field into table * Shift conversion functions into utils * Update business logic using comprehensive state * Introduce progress status to assessment overviews * clean up display of progressStatus * remove derived submissionProgress field, add in status field from backend * remove direct gradingStatus use in grading page * remove gradingStatus from assessments * Remove more references to gradingStatus * Replace references to gradingStatus with progress * there is a lot of reference to gradingStatus. * Replace gradingStatus with progress in testing * Fully remove gradingStatus and replace with progress * Fix accidental import * Update to use new backend parameter names in backend * Remove isPublished field entirely from grading overviews to avoid confusion with publishing within assessment overviews * Update tests * Dummy publish all button in ground control * redux loop for publishall and unpublishall (part 1) * Remove re-autograde for published or non-submitted assessments * Add publishAll button * Replace deprecated ag-grid functions with current versions * Implement unpublish all button * Add unique key, avoid specialkey flag from react * Fix button layout * Fix button format * increase width for accessibility * autoPublish settings inserted into admin panel configs * cleanup of isAutoPublished field within assessment configs * update tests for assessmentConfiguration * remove un-needed import * remove debug-only submissionStatus in grading submissions table * Revert accidental removal of XP field * bp5-minimal tag to clean up bulk publishing buttons - thanks gabriel :) * Fix errors post-merge * Fix lint error * feat: Implement published and unpublished notifications and remove deprecated ones * chore: Remove commented code * Fix compile error * Remove unnecessary typecast * Remove unnecessary typecast * Remove unused import * update notification types to reflect backend * change notification types to reflect backend changes * remove git stash artifacts * remove git stash artefacts * add tooltips, update assessment fields * remove development artifacts * remove TODO comment as issue has been raised * Update GradingUtils.ts jsdocs * linting * readjust progress statuses and conversion functions * update colours and logos * expose backend isGradingPublished field and update tests * update assessment cards to show purely based on isGradingPublished status without further check for graded * remove hardcoded assessment status * linting * revert yarn lock change * Update yarn.lock * update mocks and tests * remove un-needed import * linting * Use enum values instead of strings for color keys * Use prop over BP CSS API * remove un-needed field calculation, fix typos * update student username to show nusnet id instead of duplicating student name (thanks gabriel :D) --------- Co-authored-by: GabrielCWT <77312579+GabrielCWT@users.noreply.github.com> Co-authored-by: Richard Dominick <34370238+RichDom2185@users.noreply.github.com> commit 4556d3f Author: Liew Xin Yi <e0550381@u.nus.edu> Date: Sat Apr 13 19:43:51 2024 +0800 Implement and Integrate `java-slang` CSEC Visualizer (#2926) * Update ControlBarChapterSelect with Java * Implement Java CSEC Visualizer * Integrate CSEC Visualizer * Linting errors for java-slang-csec * Fix frontend test: rename Object to Obj to avoid potential name clash? * Update snapshot * Update imports from java-slang * Fix lint * Update snapshot * Fix linting * Fix typo Co-authored-by: Richard Dominick <34370238+RichDom2185@users.noreply.github.com> * Add TODO for err source node location --------- Co-authored-by: joel chan <joelchanzhiyang@gmail.com> Co-authored-by: Richard Dominick <34370238+RichDom2185@users.noreply.github.com> commit 612f68b Author: Lai Mei Tin <77192251+1001mei@users.noreply.github.com> Date: Sat Apr 13 18:02:16 2024 +0800 Integrate Java type checker and compiler into frontend (#2925) * Integrate Java compiler into frontend * Add typechecker from java-slang * Add program terminated succesfully output to Java * Bump java-slang to 1.0.7 * Remove program terminated output from java in frontend * Change ProgramTerminatedSuccessfully to anonymous class in java * Bump java-slang to 1.0.8 * Bump java-slang to 1.0.9 * Add process/browser to craco polyfill * Add java-parser to jest transform ignore patterns * Bump java-slang to 1.0.13 * Add mocks for java-slang functions * Fix wrong error label in java helper * Increase max file size to cache to 20 --------- Co-authored-by: Bryan Loh <bryanlohxz@gmail.com> Co-authored-by: Martin Henz <henz@comp.nus.edu.sg> commit d1c0a45 Author: Richard Dominick <34370238+RichDom2185@users.noreply.github.com> Date: Sat Apr 13 14:53:02 2024 +0800 Migrate to Redux Toolkit part 5 (#2866) * Migrate remaining workspace reducers to RTK * Migrate remaining action creators to RTK * Remove `typesafe-actions` dependency Type safety is now achieved via Redux Toolkit. * Update testcase * Fix format * Fix compile error * Fix errors * Restore old NOTIFY_PROGRAM_EVALUATED reducer Done to optimize the diff and will be removed later. commit 0c45606 Author: Martin Henz <henz@comp.nus.edu.sg> Date: Fri Apr 12 12:34:11 2024 +0800 bumping js-slang (#2929) commit 02059bf Author: John Wong <johnwz123@gmail.com> Date: Fri Apr 12 01:59:37 2024 +0800 Modify mobile keyboard to be scrollable (#2915) * Modify mobile keyboard to be scrollable * Mobile Keyboard is now swipeable * Remove mobile-keyboard-row-toggle styles * Fix formatting * Remove console.log statements --------- Co-authored-by: Joven Soh <34702990+JovenSoh@users.noreply.github.com> commit 4cc0204 Author: John Wong <johnwz123@gmail.com> Date: Thu Apr 11 03:28:57 2024 +0800 Add full-screen button for Playground side content (#2911) * Added fullscreen button to playground side content * Refactor fullscreen button to use class as reference and Blueprint's Tooltip * updating snapshots * Remove unnecessary comments * Replace icon with button For more correct semantics. * Remove unnecessary styles Following the change from icon to button, `cursor: pointer` is no longer needed. Also lowered the z-index to a more reasonable value. * Fix format * Update test snapshots --------- Co-authored-by: henz <henz@comp.nus.edu.sg> Co-authored-by: Richard Dominick <34370238+RichDom2185@users.noreply.github.com> commit e2abe18 Author: John Wong <johnwz123@gmail.com> Date: Thu Apr 11 02:16:49 2024 +0800 Add a fullscreen button for the game div container (#2855) * Add a fullscreen button for the game div container * Modify code to use the useFullscreen hook from the @mantine/hooks package * Bump dependencies * Use `IconNames` instead of magic strings --------- Co-authored-by: Richard Dominick <34370238+RichDom2185@users.noreply.github.com> Co-authored-by: Martin Henz <henz@comp.nus.edu.sg> Co-authored-by: Lee Hyung Woon / 이형운 <leehyungwoonsamuel@gmail.com> commit f4d6e78 Author: Richard Dominick <34370238+RichDom2185@users.noreply.github.com> Date: Wed Apr 10 16:10:22 2024 +0800 Fix `xlsx` security vulnerability (#2914) * Bump and use recommended XLSX version from CDN * Deduplicate dependencies commit 571f8b7 Author: Martin Henz <henz@comp.nus.edu.sg> Date: Wed Apr 10 14:31:39 2024 +0800 bumping js-slang (#2922) commit c859f1b Author: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed Apr 10 14:14:57 2024 +0800 Bump tar from 6.1.15 to 6.2.1 (#2920) Bumps [tar](https://github.com/isaacs/node-tar) from 6.1.15 to 6.2.1. - [Release notes](https://github.com/isaacs/node-tar/releases) - [Changelog](https://github.com/isaacs/node-tar/blob/main/CHANGELOG.md) - [Commits](isaacs/node-tar@v6.1.15...v6.2.1) --- updated-dependencies: - dependency-name: tar dependency-type: indirect ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> commit bb790df Author: Martin Henz <henz@comp.nus.edu.sg> Date: Wed Apr 10 14:05:51 2024 +0800 bumping java-slang to 1.0.6 (#2924) commit 27e3181 Author: Martin Henz <henz@comp.nus.edu.sg> Date: Wed Apr 10 13:30:30 2024 +0800 bumping java-slang to 1.0.5 (#2923) commit 5dba6a5 Author: CZX <CZX123@users.noreply.github.com> Date: Wed Apr 10 07:58:53 2024 +0800 CSE Machine: Fixes for variadic function & global closures, added faded unreferenced objects (#2906) * Initial Commit * More fixes and added faded gc objects * Run format * Fix params text and added SourceObject to display runes correctly * bumping js-slang * Revamp unreferenced behavior and update snapshots * Run format * Update snapshot * Bump js-slang --------- Co-authored-by: henz <henz@comp.nus.edu.sg> * update tests --------- Co-authored-by: Richard Dominick <34370238+RichDom2185@users.noreply.github.com> Co-authored-by: Martin Henz <henz@comp.nus.edu.sg>
1 parent 27f3fe4 commit 9afac5e

File tree

12 files changed

+192
-23
lines changed

12 files changed

+192
-23
lines changed

src/commons/application/ApplicationTypes.ts

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -198,9 +198,23 @@ const schemeSubLanguages: Array<Pick<SALanguage, 'chapter' | 'variant' | 'displa
198198
];
199199

200200
export const schemeLanguages: SALanguage[] = schemeSubLanguages.map(sublang => {
201-
return { ...sublang, mainLanguage: SupportedLanguage.SCHEME, supports: { repl: true } };
201+
return {
202+
...sublang,
203+
mainLanguage: SupportedLanguage.SCHEME,
204+
supports: { repl: true, cseMachine: true }
205+
};
202206
});
203207

208+
export function isSchemeLanguage(chapter: Chapter): boolean {
209+
return [
210+
Chapter.SCHEME_1,
211+
Chapter.SCHEME_2,
212+
Chapter.SCHEME_3,
213+
Chapter.SCHEME_4,
214+
Chapter.FULL_SCHEME
215+
].includes(chapter);
216+
}
217+
204218
const pySubLanguages: Array<Pick<SALanguage, 'chapter' | 'variant' | 'displayName'>> = [
205219
{ chapter: Chapter.PYTHON_1, variant: Variant.DEFAULT, displayName: 'Python \xa71' }
206220
//{ chapter: Chapter.PYTHON_2, variant: Variant.DEFAULT, displayName: 'Python \xa72' },

src/commons/application/__tests__/__snapshots__/ApplicationTypes.ts.snap

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ Array [
2121
"displayName": "Scheme §1",
2222
"mainLanguage": "Scheme",
2323
"supports": Object {
24+
"cseMachine": true,
2425
"repl": true,
2526
},
2627
"variant": "explicit-control",
@@ -30,6 +31,7 @@ Array [
3031
"displayName": "Scheme §2",
3132
"mainLanguage": "Scheme",
3233
"supports": Object {
34+
"cseMachine": true,
3335
"repl": true,
3436
},
3537
"variant": "explicit-control",
@@ -39,6 +41,7 @@ Array [
3941
"displayName": "Scheme §3",
4042
"mainLanguage": "Scheme",
4143
"supports": Object {
44+
"cseMachine": true,
4245
"repl": true,
4346
},
4447
"variant": "explicit-control",
@@ -48,6 +51,7 @@ Array [
4851
"displayName": "Scheme §4",
4952
"mainLanguage": "Scheme",
5053
"supports": Object {
54+
"cseMachine": true,
5155
"repl": true,
5256
},
5357
"variant": "explicit-control",
@@ -57,6 +61,7 @@ Array [
5761
"displayName": "Full Scheme",
5862
"mainLanguage": "Scheme",
5963
"supports": Object {
64+
"cseMachine": true,
6065
"repl": true,
6166
},
6267
"variant": "explicit-control",

src/commons/sagas/PlaygroundSaga.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ import {
1313
updateShortURL
1414
} from '../../features/playground/PlaygroundActions';
1515
import { GENERATE_LZ_STRING, SHORTEN_URL } from '../../features/playground/PlaygroundTypes';
16-
import { isSourceLanguage, OverallState } from '../application/ApplicationTypes';
16+
import { isSchemeLanguage, isSourceLanguage, OverallState } from '../application/ApplicationTypes';
1717
import { ExternalLibraryName } from '../application/types/ExternalTypes';
1818
import { retrieveFilesInWorkspaceAsRecord } from '../fileSystem/utils';
1919
import { visitSideContent } from '../sideContent/SideContentActions';
@@ -122,6 +122,10 @@ export default function* PlaygroundSaga(): SagaIterator {
122122
yield put(toggleUsingCse(true, workspaceLocation));
123123
}
124124
}
125+
126+
if (isSchemeLanguage(playgroundSourceChapter) && newId === SideContentType.cseMachine) {
127+
yield put(toggleUsingCse(true, workspaceLocation));
128+
}
125129
}
126130
);
127131
}

src/commons/sagas/WorkspaceSaga/helpers/evalCode.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ import { notifyStoriesEvaluated } from 'src/features/stories/StoriesActions';
1414
import { EVAL_STORY } from 'src/features/stories/StoriesTypes';
1515

1616
import { EventType } from '../../../../features/achievement/AchievementTypes';
17-
import { OverallState } from '../../../application/ApplicationTypes';
17+
import { isSchemeLanguage, OverallState } from '../../../application/ApplicationTypes';
1818
import {
1919
BEGIN_DEBUG_PAUSE,
2020
BEGIN_INTERRUPT_EXECUTION,
@@ -95,7 +95,8 @@ export function* evalCode(
9595
.currentStep
9696
)
9797
: -1;
98-
const cseActiveAndCorrectChapter = context.chapter >= 3 && cseIsActive;
98+
const cseActiveAndCorrectChapter =
99+
(isSchemeLanguage(context.chapter) || context.chapter >= 3) && cseIsActive;
99100
if (cseActiveAndCorrectChapter) {
100101
context.executionMethod = 'cse-machine';
101102
}

src/features/cseMachine/CseMachine.tsx

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,8 @@ export default class CseMachine {
8484
Layout.setContext(
8585
context.runtime.environmentTree as EnvTree,
8686
context.runtime.control,
87-
context.runtime.stash
87+
context.runtime.stash,
88+
context.chapter
8889
);
8990
this.setVis(Layout.draw());
9091
this.setIsStepLimitExceeded(context.runtime.control.isEmpty());

src/features/cseMachine/CseMachineLayout.tsx

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import Heap from 'js-slang/dist/cse-machine/heap';
22
import { Control, Stash } from 'js-slang/dist/cse-machine/interpreter';
3-
import { Frame } from 'js-slang/dist/types';
3+
import { Chapter, Frame } from 'js-slang/dist/types';
44
import { KonvaEventObject } from 'konva/lib/Node';
55
import React, { RefObject } from 'react';
66
import { Layer, Rect, Stage } from 'react-konva';
@@ -137,7 +137,12 @@ export class Layout {
137137
}
138138

139139
/** processes the runtime context from JS Slang */
140-
static setContext(envTree: EnvTree, control: Control, stash: Stash): void {
140+
static setContext(
141+
envTree: EnvTree,
142+
control: Control,
143+
stash: Stash,
144+
chapter: Chapter = Chapter.SOURCE_4
145+
): void {
141146
Layout.currentLight = undefined;
142147
Layout.currentDark = undefined;
143148
Layout.currentStackDark = undefined;
@@ -160,7 +165,7 @@ export class Layout {
160165
// initialize levels and frames
161166
Layout.initializeGrid();
162167
// initialize control and stash
163-
Layout.initializeControlStash();
168+
Layout.initializeControlStash(chapter);
164169

165170
if (CseMachine.getControlStash()) {
166171
Layout.controlStashHeight = Math.max(
@@ -193,19 +198,19 @@ export class Layout {
193198
CseAnimation.updateAnimation();
194199
}
195200

196-
static initializeControlStash() {
201+
static initializeControlStash(chapter: Chapter) {
197202
Layout.previousControlComponent = Layout.controlComponent;
198203
Layout.previousStashComponent = Layout.stashComponent;
199-
this.controlComponent = new ControlStack(this.control);
200-
this.stashComponent = new StashStack(this.stash);
204+
this.controlComponent = new ControlStack(this.control, chapter);
205+
this.stashComponent = new StashStack(this.stash, chapter);
201206
}
202207

203208
/**
204209
* remove prelude environment containing predefined functions, by merging the prelude
205210
* objects into the global environment head and heap
206211
*/
207212
private static removePreludeEnv() {
208-
if (!Layout.globalEnvNode.children) return;
213+
if (!Layout.globalEnvNode.children || Layout.globalEnvNode.children.length === 0) return;
209214

210215
const preludeEnvNode = Layout.globalEnvNode.children[0];
211216
const preludeEnv = preludeEnvNode.environment;

src/features/cseMachine/CseMachineUtils.ts

Lines changed: 63 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
import { estreeDecode } from 'js-slang/dist/alt-langs/scheme/scm-slang/src/utils/encoder-visitor';
2+
import { unparse } from 'js-slang/dist/alt-langs/scheme/scm-slang/src/utils/reverse_parser';
13
import JsSlangClosure from 'js-slang/dist/cse-machine/closure';
24
import {
35
AppInstr,
@@ -10,13 +12,14 @@ import {
1012
InstrType,
1113
UnOpInstr
1214
} from 'js-slang/dist/cse-machine/types';
13-
import { Environment, Value as StashValue } from 'js-slang/dist/types';
15+
import { Chapter, Environment, Value as StashValue } from 'js-slang/dist/types';
1416
import { astToString } from 'js-slang/dist/utils/ast/astToString';
1517
import { Group } from 'konva/lib/Group';
1618
import { Node } from 'konva/lib/Node';
1719
import { Shape } from 'konva/lib/Shape';
1820
import { Text } from 'konva/lib/shapes/Text';
1921
import { cloneDeep, isObject } from 'lodash';
22+
import { isSchemeLanguage } from 'src/commons/application/ApplicationTypes';
2023
import classes from 'src/styles/Draggable.module.scss';
2124

2225
import { ArrayUnit } from './components/ArrayUnit';
@@ -49,7 +52,11 @@ import {
4952
StreamFn,
5053
Unassigned
5154
} from './CseMachineTypes';
52-
55+
import {
56+
getAlternateControlItemComponent,
57+
isCustomPrimitive,
58+
needsNewRepresentation
59+
} from './utils/altLangs';
5360
class AssertionError extends Error {
5461
constructor(msg?: string) {
5562
super(msg);
@@ -195,7 +202,8 @@ export function isPrimitiveData(data: Data): data is Primitive {
195202
isString(data) ||
196203
isNumber(data) ||
197204
isBoolean(data) ||
198-
isSourceObject(data)
205+
isSourceObject(data) ||
206+
isCustomPrimitive(data)
199207
);
200208
}
201209

@@ -568,12 +576,39 @@ export function getControlItemComponent(
568576
stackHeight: number,
569577
index: number,
570578
highlightOnHover: () => void,
571-
unhighlightOnHover: () => void
579+
unhighlightOnHover: () => void,
580+
chapter: Chapter
572581
): ControlItemComponent {
573582
const topItem = CseMachine.getStackTruncated()
574583
? index === Math.min(Layout.control.size() - 1, 9)
575584
: index === Layout.control.size() - 1;
576585
if (!isInstr(controlItem)) {
586+
// there's no reason to provide an alternate representation
587+
// for a instruction.
588+
if (needsNewRepresentation(chapter)) {
589+
return getAlternateControlItemComponent(
590+
controlItem,
591+
stackHeight,
592+
highlightOnHover,
593+
unhighlightOnHover,
594+
topItem,
595+
chapter
596+
);
597+
}
598+
599+
if (isSchemeLanguage(chapter)) {
600+
// use the js-slang decoder on the control item
601+
controlItem = estreeDecode(controlItem as any);
602+
const text = unparse(controlItem as any);
603+
return new ControlItemComponent(
604+
text,
605+
text,
606+
stackHeight,
607+
highlightOnHover,
608+
unhighlightOnHover,
609+
topItem
610+
);
611+
}
577612
switch (controlItem.type) {
578613
case 'Program':
579614
// If the control item is the whole program
@@ -792,6 +827,24 @@ export function getControlItemComponent(
792827
unhighlightOnHover,
793828
topItem
794829
);
830+
case InstrType.GENERATE_CONT:
831+
return new ControlItemComponent(
832+
'generate cont',
833+
'Generate continuation',
834+
stackHeight,
835+
highlightOnHover,
836+
unhighlightOnHover,
837+
topItem
838+
);
839+
case InstrType.RESUME_CONT:
840+
return new ControlItemComponent(
841+
'call cont',
842+
'call a continuation',
843+
stackHeight,
844+
highlightOnHover,
845+
unhighlightOnHover,
846+
topItem
847+
);
795848
default:
796849
return new ControlItemComponent(
797850
'INSTRUCTION',
@@ -805,7 +858,12 @@ export function getControlItemComponent(
805858
}
806859
}
807860

808-
export function getStashItemComponent(stashItem: StashValue, stackHeight: number, index: number) {
861+
export function getStashItemComponent(
862+
stashItem: StashValue,
863+
stackHeight: number,
864+
index: number,
865+
_chapter: Chapter
866+
): StashItemComponent {
809867
let arrowTo: ArrayValue | FnValue | GlobalFnValue | undefined;
810868
if (isFunction(stashItem) || isDataArray(stashItem)) {
811869
if (isClosure(stashItem) || isDataArray(stashItem)) {

src/features/cseMachine/components/ControlStack.tsx

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import { Control } from 'js-slang/dist/cse-machine/interpreter';
22
import { ControlItem, Instr } from 'js-slang/dist/cse-machine/types';
3+
import { Chapter, StatementSequence } from 'js-slang/dist/types';
34
import { Node } from 'js-slang/dist/types';
45
import { KonvaEventObject } from 'konva/lib/Node';
56
import React from 'react';
@@ -28,14 +29,16 @@ export class ControlStack extends Visible implements IHoverable {
2829

2930
constructor(
3031
/** the control object */
31-
readonly control: Control
32+
readonly control: Control,
33+
readonly chapter: Chapter
3234
) {
3335
super();
3436
this._x = ControlStashConfig.ControlPosX;
3537
this._y = ControlStashConfig.ControlPosY;
3638
this._width = ControlStashConfig.ControlItemWidth;
3739
this._height = ControlStashConfig.StashItemHeight + ControlStashConfig.StashItemTextPadding * 2;
3840
this.control = control;
41+
this.chapter = chapter;
3942

4043
// Function to convert the stack items to their components
4144
let i = 0;
@@ -57,7 +60,8 @@ export class ControlStack extends Visible implements IHoverable {
5760
this._height,
5861
i,
5962
highlightOnHover,
60-
unhighlightOnHover
63+
unhighlightOnHover,
64+
this.chapter
6165
);
6266
this._height += component.height();
6367
i += 1;
@@ -141,6 +145,6 @@ export const isInstr = (command: ControlItem): command is Instr => {
141145
* @param command A ControlItem
142146
* @returns true if the ControlItem is an esNode and false if it is an instruction.
143147
*/
144-
export const isNode = (command: ControlItem): command is Node => {
148+
export const isNode = (command: ControlItem): command is Node | StatementSequence => {
145149
return (command as Node).type !== undefined;
146150
};

src/features/cseMachine/components/StashStack.tsx

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { Stash } from 'js-slang/dist/cse-machine/interpreter';
2-
import { Value } from 'js-slang/dist/types';
2+
import { Chapter, Value } from 'js-slang/dist/types';
33
import React from 'react';
44

55
import CseMachine from '../CseMachine';
@@ -14,18 +14,20 @@ export class StashStack extends Visible {
1414

1515
constructor(
1616
/** the stash object */
17-
readonly stash: Stash
17+
readonly stash: Stash,
18+
readonly chapter: Chapter
1819
) {
1920
super();
2021
this._x = ControlStashConfig.StashPosX;
2122
this._y = ControlStashConfig.StashPosY;
2223
this._width = 0;
2324
this._height = 0;
25+
this.chapter = chapter;
2426

2527
// Function to convert the stack items to their components
2628
let i = 0;
2729
const stashItemToComponent = (stashItem: Value) => {
28-
const component = getStashItemComponent(stashItem, this._width, i);
30+
const component = getStashItemComponent(stashItem, this._width, i, this.chapter);
2931
this._width += component.width();
3032
this._height = Math.max(this._height, component.height());
3133
i += 1;

src/features/cseMachine/components/Text.tsx

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ import {
1515
setHoveredCursor,
1616
setUnhoveredCursor
1717
} from '../CseMachineUtils';
18+
import { isCustomPrimitive } from '../utils/altLangs';
1819
import { Visible } from './Visible';
1920

2021
export interface TextOptions {
@@ -64,6 +65,8 @@ export class Text extends Visible implements IHoverable {
6465

6566
this.fullStr = this.partialStr = isSourceObject(data)
6667
? data.toReplString()
68+
: isCustomPrimitive(data)
69+
? String(data)
6770
: isStringIdentifiable
6871
? JSON.stringify(data) || String(data)
6972
: String(data);

0 commit comments

Comments
 (0)