From d9122c956fa66080ce7e210d667d81f33a93f0de Mon Sep 17 00:00:00 2001 From: Fernando Dodino Date: Fri, 24 Nov 2023 08:22:44 -0300 Subject: [PATCH] customizing diagram for #43 --- src/commands/run.ts | 24 +++++++++++++++++++----- src/services/diagram-generator.ts | 13 +++++++------ 2 files changed, 26 insertions(+), 11 deletions(-) diff --git a/src/commands/run.ts b/src/commands/run.ts index 9052509..089719c 100644 --- a/src/commands/run.ts +++ b/src/commands/run.ts @@ -6,7 +6,7 @@ import http from 'http' import logger from 'loglevel' import { join, relative } from 'path' import { Server, Socket } from 'socket.io' -import { Environment, link, Name, parse, RuntimeObject, WollokException } from 'wollok-ts' +import { Environment, link, Name, Package, parse, RuntimeObject, WollokException } from 'wollok-ts' import interpret, { Interpreter } from 'wollok-ts/dist/interpreter/interpreter' import natives from 'wollok-ts/dist/wre/wre.natives' import { ENTER, buildEnvironmentForProject, failureDescription, handleError, isImageFile, publicPath, readPackageProperties, serverError, successDescription, validateEnvironment, valueDescription } from '../utils' @@ -32,7 +32,6 @@ const DEFAULT_PORT = '4200' export default async function (programFQN: Name, options: Options): Promise { const { project, game } = options try { - // TODO: validate port if game if set logger.info(`Running ${valueDescription(programFQN)} ${runner(game)} on ${valueDescription(project)}`) options.assets = game ? getAssetsFolder(options) : '' if (game) { @@ -46,7 +45,8 @@ export default async function (programFQN: Name, options: Options): Promise(programFQN).parent as Package + await initializeDynamicDiagram(programPackage, options, interpreter) interpreter.run(programFQN) eventsFor(ioGame!, interpreter, options) @@ -128,7 +128,8 @@ export const initializeGameClient = ({ project, assets, port, game }: Options): return io } -export async function initializeDynamicDiagram(options: Options, interpreter: Interpreter): Promise { +// TODO: change to an object with a reload function +export async function initializeDynamicDiagram(programPackage: Package, options: Options, interpreter: Interpreter): Promise { if (!options.startDiagram) return const app = express() @@ -144,7 +145,7 @@ export async function initializeDynamicDiagram(options: Options, interpreter: In }) const connectionListener = (interpreter: Interpreter) => (socket: Socket) => { socket.emit('initDiagram', options) - socket.emit('updateDiagram', getDataDiagram(interpreter)) + socket.emit('updateDiagram', getDataDiagram(interpreter, programPackage)) } const currentConnectionListener = connectionListener(interpreter) io.on('connection', currentConnectionListener) @@ -158,6 +159,19 @@ export async function initializeDynamicDiagram(options: Options, interpreter: In server.addListener('listening', () => { logger.info(successDescription('Dynamic diagram available at: ' + bold(`http://localhost:${currentPort}`))) }) + + // return { + // onReload: (interpreter: Interpreter) => { + // io.off('connection', currentConnectionListener) + // currentConnectionListener = connectionListener(interpreter) + // io.on('connection', currentConnectionListener) + + // io.emit('updateDiagram', getDataDiagram(interpreter)) + // }, + // enabled: true, + // app, + // server, + // } } diff --git a/src/services/diagram-generator.ts b/src/services/diagram-generator.ts index 6a0ea40..e4e1d40 100644 --- a/src/services/diagram-generator.ts +++ b/src/services/diagram-generator.ts @@ -12,11 +12,12 @@ const WOLLOK_BASE_MODULES = 'wollok.' const SELF = 'self' -function getImportedDefinitionsFromConsole(interpreter: Interpreter): Entity[] { - const replPackage = replNode(interpreter.evaluation.environment) +function getImportedDefinitions(interpreter: Interpreter, rootFQN?: Package): Entity[] { + const environment = interpreter.evaluation.environment + const importedPackage = rootFQN ?? replNode(environment) return [ - ...replPackage.members, - ...replPackage.imports.flatMap(resolveImport), + ...importedPackage.members, + ...importedPackage.imports.flatMap(resolveImport), ] } @@ -27,8 +28,8 @@ function resolveImport(imp: Import): Entity[] { : [importedEntity] } -export function getDataDiagram(interpreter: Interpreter): ElementDefinition[] { - const importedFromConsole = getImportedDefinitionsFromConsole(interpreter) +export function getDataDiagram(interpreter: Interpreter, rootFQN?: Package): ElementDefinition[] { + const importedFromConsole = getImportedDefinitions(interpreter, rootFQN) const currentFrame = interpreter.evaluation.currentFrame const objects = new Map(Array.from(currentFrame.locals.keys()).map((name) => [name, currentFrame.get(name)]))