diff --git a/compiler/server/build_pipe_server.js b/compiler/server/build_pipe_server.js index 4d3e8a63b3f583f1c8cb61fd67b0a9394851295e..fbc9c398c5870a3aa21b5dbf8fed18d47c0f385d 100644 --- a/compiler/server/build_pipe_server.js +++ b/compiler/server/build_pipe_server.js @@ -22,6 +22,12 @@ const WebSocketServer = WebSocket.Server; let pluginSocket = ''; +let supplement = { + isAcceleratePreview: false, + line: 0, + column: 0 +} + const pluginCommandChannelMessageHandlers = { 'compileComponent': handlePluginCompileComponent, 'default': () => {} @@ -50,14 +56,35 @@ function handlePluginCommand(jsonData) { function handlePluginCompileComponent(jsonData) { const receivedMsg = jsonData; - const sourceNode = ts.createSourceFile - ('preview.ts', receivedMsg.data.script, ts.ScriptTarget.Latest, true, ts.ScriptKind.TS); + const sourceNode = ts.createSourceFile('preview.ts', receivedMsg.data.script, + ts.ScriptTarget.Latest, true, ts.ScriptKind.TS); const previewStatements = []; - processComponentChild(sourceNode, previewStatements, []); + const log = []; + supplement = { + isAcceleratePreview: true, + line: parseInt(JSON.parse(receivedMsg.data.offset).line), + column: parseInt(JSON.parse(receivedMsg.data.offset).column) + } + processComponentChild(sourceNode, previewStatements, log, supplement); + supplement.isAcceleratePreview = false; const newSource = ts.factory.updateSourceFile(sourceNode, previewStatements); const printer = ts.createPrinter({ newLine: ts.NewLineKind.LineFeed }); const result = printer.printNode(ts.EmitHint.Unspecified, newSource, newSource); receivedMsg.data.script = ts.transpileModule(result, {}).outputText; + if (receivedMsg.data.offset) { + for (let i = 0; i < log.length; i++) { + let line = parseInt(newSource.getLineAndCharacterOfPosition(log[i].pos).line); + let column = parseInt(newSource.getLineAndCharacterOfPosition(log[i].pos).character); + if (line === 0) { + log[i].line = parseInt(JSON.parse(receivedMsg.data.offset).line); + log[i].column = parseInt(JSON.parse(receivedMsg.data.offset).column) + column; + } else { + log[i].line = parseInt(JSON.parse(receivedMsg.data.offset).line) + line; + log[i].column = column; + } + } + } + receivedMsg.data.log = log; if (pluginSocket.readyState === WebSocket.OPEN){ responseToPlugin(receivedMsg); } diff --git a/compiler/src/process_component_build.ts b/compiler/src/process_component_build.ts index d8db918fd416a9323798ec6d057af6ac9af0115c..b3b85d504aab9ec1fa191fe96a88695fa232edcb 100644 --- a/compiler/src/process_component_build.ts +++ b/compiler/src/process_component_build.ts @@ -162,8 +162,23 @@ function validateRootNode(node: ts.MethodDeclaration, log: LogInfo[]): boolean { return isValid; } +interface supplementType { + isAcceleratePreview: boolean, + line: number, + column: number +} + +let newsupplement: supplementType = { + isAcceleratePreview: false, + line: 0, + column: 0 +} + export function processComponentChild(node: ts.Block | ts.SourceFile, newStatements: ts.Statement[], - log: LogInfo[]): void { + log: LogInfo[], supplement: supplementType = {isAcceleratePreview: false, line: 0, column: 0}): void { + if (supplement.isAcceleratePreview) { + newsupplement = supplement; + } if (node.statements.length) { node.statements.forEach((item, index, array) => { if (ts.isExpressionStatement(item)) { @@ -256,9 +271,22 @@ function processInnerComponent(node: ts.ExpressionStatement, index: number, arr: transformLog.sourceFile.getLineAndCharacterOfPosition(getRealNodePos(node)); const projectPath: string = projectConfig.projectPath; const curFileName: string = transformLog.sourceFile.fileName.replace(/.ts$/, ''); + let line: number = 1; + let col: number = 1; + if (newsupplement.isAcceleratePreview) { + if (posOfNode.line === 0) { + col = newsupplement.column; + } + line = newsupplement.line; + } + newsupplement = { + isAcceleratePreview: false, + line: 0, + column: 0 + } const debugInfo: string = `${path.relative(projectPath, curFileName).replace(/\\+/g, '/')}` + - `(${posOfNode.line + 1}:${posOfNode.character + 1})`; + `(${posOfNode.line + line}:${posOfNode.character + col})`; const debugNode: ts.ExpressionStatement = ts.factory.createExpressionStatement( createFunction(ts.factory.createIdentifier(getName(node)), ts.factory.createIdentifier(COMPONENT_DEBUGLINE_FUNCTION),