diff --git a/dist/localClient.js b/dist/localClient.js new file mode 100644 index 0000000..b3e1b10 --- /dev/null +++ b/dist/localClient.js @@ -0,0 +1,93 @@ +"use strict"; +var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + var desc = Object.getOwnPropertyDescriptor(m, k); + if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { + desc = { enumerable: true, get: function() { return m[k]; } }; + } + Object.defineProperty(o, k2, desc); +}) : (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; +})); +var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { + Object.defineProperty(o, "default", { enumerable: true, value: v }); +}) : function(o, v) { + o["default"] = v; +}); +var __importStar = (this && this.__importStar) || (function () { + var ownKeys = function(o) { + ownKeys = Object.getOwnPropertyNames || function (o) { + var ar = []; + for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k; + return ar; + }; + return ownKeys(o); + }; + return function (mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]); + __setModuleDefault(result, mod); + return result; + }; +})(); +Object.defineProperty(exports, "__esModule", { value: true }); +exports.sendFileToCppService = sendFileToCppService; +const http = __importStar(require("http")); +/** + * 构建JSON数据 + * @param filePath 文件路径 + * @param content 文件内容 + * @returns JSON字符串 + */ +function buildJsonData(filePath, content) { + const data = {}; + data[filePath] = content; + return JSON.stringify(data); +} +/** + * 发送文件内容到本地C++服务 + * @param filePath 文件路径 + * @param content 文件内容 + * @returns Promise 是否发送成功 + */ +async function sendFileToCppService(filePath, content) { + return new Promise((resolve) => { + const jsonData = buildJsonData(filePath, content); + const postData = jsonData; + const options = { + hostname: '127.0.0.1', + port: 26000, + path: '/send_data', + method: 'POST', + headers: { + 'Content-Type': 'application/json', + 'Content-Length': Buffer.byteLength(postData) + } + }; + const req = http.request(options, (res) => { + let data = ''; + res.on('data', (chunk) => { + data += chunk; + }); + res.on('end', () => { + console.log(`[Squirrel] 已发送文件到C++服务: ${filePath}, 状态码: ${res.statusCode}`); + if (res.statusCode === 200) { + resolve(true); + } + else { + console.error(`[Squirrel] 发送失败,状态码: ${res.statusCode}, 响应: ${data}`); + resolve(false); + } + }); + }); + req.on('error', (error) => { + console.error(`[Squirrel] 发送文件到C++服务失败: ${error.message}`); + resolve(false); + }); + req.write(postData); + req.end(); + }); +} +//# sourceMappingURL=localClient.js.map \ No newline at end of file diff --git a/dist/localClient.js.map b/dist/localClient.js.map new file mode 100644 index 0000000..52653db --- /dev/null +++ b/dist/localClient.js.map @@ -0,0 +1 @@ +{"version":3,"file":"localClient.js","sourceRoot":"","sources":["../src/localClient.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAsBA,oDA0CC;AAhED,2CAA6B;AAG7B;;;;;GAKG;AACH,SAAS,aAAa,CAAC,QAAgB,EAAE,OAAe;IACpD,MAAM,IAAI,GAA8B,EAAE,CAAC;IAC3C,IAAI,CAAC,QAAQ,CAAC,GAAG,OAAO,CAAC;IAEzB,OAAO,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;AAChC,CAAC;AAED;;;;;GAKG;AACI,KAAK,UAAU,oBAAoB,CAAC,QAAgB,EAAE,OAAe;IACxE,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC3B,MAAM,QAAQ,GAAG,aAAa,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QAClD,MAAM,QAAQ,GAAG,QAAQ,CAAC;QAE1B,MAAM,OAAO,GAAwB;YACjC,QAAQ,EAAE,WAAW;YACrB,IAAI,EAAE,KAAK;YACX,IAAI,EAAE,YAAY;YAClB,MAAM,EAAE,MAAM;YACd,OAAO,EAAE;gBACL,cAAc,EAAE,kBAAkB;gBAClC,gBAAgB,EAAE,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC;aAChD;SACJ,CAAC;QAEF,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE;YACtC,IAAI,IAAI,GAAG,EAAE,CAAC;YAEd,GAAG,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,EAAE;gBACrB,IAAI,IAAI,KAAK,CAAC;YAClB,CAAC,CAAC,CAAC;YAEH,GAAG,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE;gBACf,OAAO,CAAC,GAAG,CAAC,2BAA2B,QAAQ,UAAU,GAAG,CAAC,UAAU,EAAE,CAAC,CAAC;gBAC3E,IAAI,GAAG,CAAC,UAAU,KAAK,GAAG,EAAE,CAAC;oBACzB,OAAO,CAAC,IAAI,CAAC,CAAC;gBAClB,CAAC;qBAAM,CAAC;oBACJ,OAAO,CAAC,KAAK,CAAC,wBAAwB,GAAG,CAAC,UAAU,SAAS,IAAI,EAAE,CAAC,CAAC;oBACrE,OAAO,CAAC,KAAK,CAAC,CAAC;gBACnB,CAAC;YACL,CAAC,CAAC,CAAC;QACP,CAAC,CAAC,CAAC;QAEH,GAAG,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE;YACtB,OAAO,CAAC,KAAK,CAAC,4BAA4B,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;YAC3D,OAAO,CAAC,KAAK,CAAC,CAAC;QACnB,CAAC,CAAC,CAAC;QAEH,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QACpB,GAAG,CAAC,GAAG,EAAE,CAAC;IACd,CAAC,CAAC,CAAC;AACP,CAAC"} \ No newline at end of file diff --git a/src/extension.ts b/src/extension.ts index 800cc47..8939d62 100644 --- a/src/extension.ts +++ b/src/extension.ts @@ -12,6 +12,7 @@ import { OnTypeFormattingProvider } from './providers/onTypeFormattingProvider'; import { DocumentFormattingProvider } from './providers/documentFormattingProvider'; import { CodeErrorProvider } from './providers/codeErrorProvider'; import { ApiParser } from './providers/apiParser'; +import { sendFileToCppService } from './localClient'; export function activate(context: vscode.ExtensionContext) { console.log('Squirrel NUT Explorer 正在激活...'); @@ -140,7 +141,8 @@ export function activate(context: vscode.ExtensionContext) { const saveListener = vscode.workspace.onDidSaveTextDocument(async (doc) => { if (doc.uri.scheme === 'squirrel') { const filePath = doc.uri.path.substring(1); // 去掉开头的 '/' - const success = await model.saveFileContent(filePath, doc.getText()); + const fileContent = doc.getText(); + const success = await model.saveFileContent(filePath, fileContent); if (success) { output.appendLine(`[Squirrel] 文件 ${filePath} 保存成功`); @@ -148,6 +150,18 @@ export function activate(context: vscode.ExtensionContext) { // 更新函数缓存 await functionExtractor.updateFileCache(model, filePath); + + // 发送文件内容到本地C++服务 + try { + const sendSuccess = await sendFileToCppService(filePath, fileContent); + if (sendSuccess) { + output.appendLine(`[Squirrel] 文件 ${filePath} 已发送到C++服务`); + } else { + output.appendLine(`[Squirrel] 文件 ${filePath} 发送到C++服务失败`); + } + } catch (error) { + output.appendLine(`[Squirrel] 发送文件到C++服务时发生错误: ${error}`); + } } else { output.appendLine(`[Squirrel] 文件 ${filePath} 保存失败`); } diff --git a/src/localClient.ts b/src/localClient.ts new file mode 100644 index 0000000..23241a5 --- /dev/null +++ b/src/localClient.ts @@ -0,0 +1,65 @@ +import * as http from 'http'; +import * as vscode from 'vscode'; + +/** + * 构建JSON数据 + * @param filePath 文件路径 + * @param content 文件内容 + * @returns JSON字符串 + */ +function buildJsonData(filePath: string, content: string): string { + const data: { [key: string]: string } = {}; + data[filePath] = content; + + return JSON.stringify(data); +} + +/** + * 发送文件内容到本地C++服务 + * @param filePath 文件路径 + * @param content 文件内容 + * @returns Promise 是否发送成功 + */ +export async function sendFileToCppService(filePath: string, content: string): Promise { + return new Promise((resolve) => { + const jsonData = buildJsonData(filePath, content); + const postData = jsonData; + + const options: http.RequestOptions = { + hostname: '127.0.0.1', + port: 26000, + path: '/send_data', + method: 'POST', + headers: { + 'Content-Type': 'application/json', + 'Content-Length': Buffer.byteLength(postData) + } + }; + + const req = http.request(options, (res) => { + let data = ''; + + res.on('data', (chunk) => { + data += chunk; + }); + + res.on('end', () => { + console.log(`[Squirrel] 已发送文件到C++服务: ${filePath}, 状态码: ${res.statusCode}`); + if (res.statusCode === 200) { + resolve(true); + } else { + console.error(`[Squirrel] 发送失败,状态码: ${res.statusCode}, 响应: ${data}`); + resolve(false); + } + }); + }); + + req.on('error', (error) => { + console.error(`[Squirrel] 发送文件到C++服务失败: ${error.message}`); + resolve(false); + }); + + req.write(postData); + req.end(); + }); +} \ No newline at end of file