Skip to content

Commit 9085107

Browse files
committed
remote debug
1 parent 5b85f1d commit 9085107

File tree

8 files changed

+174
-14
lines changed

8 files changed

+174
-14
lines changed

package.json

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -169,6 +169,65 @@
169169
"languages": [
170170
"lua"
171171
]
172+
},
173+
{
174+
"type": "emmylua_remote",
175+
"label": "EmmyLua Remote Debug",
176+
"program": "./out/debugger/MobDebugAdapter.js",
177+
"runtime": "node",
178+
"configurationAttributes": {
179+
"launch": {
180+
"required": [
181+
"program",
182+
"workingDir",
183+
"arguments"
184+
],
185+
"properties": {
186+
"program": {
187+
"type": "string",
188+
"description": "启动程序",
189+
"default": "lua.exe"
190+
},
191+
"workingDir": {
192+
"type": "string",
193+
"description": "工作目录",
194+
"default": "${workspaceRoot}"
195+
},
196+
"arguments": {
197+
"type": "array",
198+
"description": "运行参数",
199+
"default": []
200+
}
201+
}
202+
}
203+
},
204+
"initialConfigurations": [
205+
{
206+
"type": "emmylua_remote",
207+
"request": "launch",
208+
"name": "EmmyLua Remote",
209+
"program": "lua.exe",
210+
"workingDir": "${workspaceRoot}",
211+
"arguments": []
212+
}
213+
],
214+
"configurationSnippets": [
215+
{
216+
"label": "%debug.launch.label%",
217+
"description": "%debug.launch.desc%",
218+
"body": {
219+
"type": "emmylua_remote",
220+
"request": "launch",
221+
"name": "EmmyLua Remote",
222+
"program": "lua.exe",
223+
"workingDir": "${workspaceRoot}",
224+
"arguments": []
225+
}
226+
}
227+
],
228+
"languages": [
229+
"lua"
230+
]
172231
}
173232
],
174233
"configuration": {

src/debugger/AttachDebuggerProvider.ts

Lines changed: 1 addition & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -5,23 +5,14 @@ import { WorkspaceFolder, DebugConfiguration, CancellationToken, ProviderResult
55
import { savedContext } from '../extension';
66
import * as cp from "child_process";
77
import { basename, normalize } from 'path';
8+
import { AttachDebugConfiguration } from './types';
89

910
var parseString = require('xml2js').parseString;
1011

1112
interface ProcessInfoItem extends vscode.QuickPickItem {
1213
pid: number;
1314
}
1415

15-
interface AttachDebugConfiguration extends DebugConfiguration {
16-
pid: number;
17-
extensionPath: string;
18-
sourcePaths: string[];
19-
20-
program?: string;
21-
arguments?: string[];
22-
workingDir?: string;
23-
}
24-
2516
export class AttachDebuggerProvider implements vscode.DebugConfigurationProvider {
2617
private isNullOrEmpty(s?: string): boolean {
2718
return !s || s.trim().length === 0;

src/debugger/EmmyDebugAdapter.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
import { MobDebugSession } from "./MobDebugSession";
2+
3+
MobDebugSession.run(MobDebugSession);

src/debugger/EmmyDebugSession.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
import { LoggingDebugSession } from "vscode-debugadapter";
2+
3+
export abstract class EmmyDebugSession extends LoggingDebugSession {
4+
constructor() {
5+
super("emmy.debug.txt");
6+
}
7+
}

src/debugger/MobDebugSession.ts

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
import { EmmyDebugSession } from "./EmmyDebugSession";
2+
import { DebugProtocol } from "vscode-debugprotocol";
3+
import { InitializedEvent } from "vscode-debugadapter";
4+
import * as cp from "child_process";
5+
import * as net from "net";
6+
7+
interface MobLaunchArguments extends DebugProtocol.LaunchRequestArguments {
8+
extensionPath: string;
9+
sourcePaths: string[];
10+
program: string;
11+
arguments: string[];
12+
workingDir: string;
13+
port: number;
14+
}
15+
16+
export class MobDebugSession extends EmmyDebugSession {
17+
private server?: net.Server;
18+
private client?: MobClient;
19+
20+
protected launchRequest(response: DebugProtocol.LaunchResponse, args: MobLaunchArguments): void {
21+
this.launchServer(args.port).then(() => {
22+
const argList = [args.program].concat(args.arguments);
23+
cp.exec(argList.join(" "), { cwd: args.workingDir });
24+
this.sendResponse(response);
25+
});
26+
}
27+
28+
private launchServer(port: number): Thenable<net.Server> {
29+
return new Promise(resolve => {
30+
const socket = net.createServer(skt => {
31+
this.client = new MobClient(skt);
32+
this.sendEvent(new InitializedEvent());
33+
}).on("listening", () => {
34+
resolve(socket);
35+
}).listen(port);
36+
this.server = socket;
37+
});
38+
}
39+
40+
shutdown(): void {
41+
42+
}
43+
}
44+
45+
class MobClient {
46+
socket: net.Socket;
47+
constructor(socket: net.Socket) {
48+
this.socket = socket;
49+
this.init();
50+
}
51+
52+
private init() {
53+
54+
}
55+
56+
close() {
57+
58+
}
59+
}
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
'use strict';
2+
3+
import * as vscode from 'vscode';
4+
import { WorkspaceFolder, DebugConfiguration, CancellationToken, ProviderResult } from 'vscode';
5+
import { MobDebugConfiguration } from './types';
6+
7+
export class MobDebuggerProvider implements vscode.DebugConfigurationProvider {
8+
resolveDebugConfiguration(folder: WorkspaceFolder | undefined, debugConfiguration: MobDebugConfiguration, token?: CancellationToken): ProviderResult<DebugConfiguration> {
9+
return debugConfiguration;
10+
}
11+
12+
dispose() {
13+
14+
}
15+
}

src/debugger/types.ts

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
2+
import { DebugConfiguration } from 'vscode';
3+
4+
interface EmmyDebugConfiguration extends DebugConfiguration {
5+
extensionPath: string;
6+
sourcePaths: string[];
7+
}
8+
9+
export interface AttachDebugConfiguration extends EmmyDebugConfiguration {
10+
pid: number;
11+
12+
program?: string;
13+
arguments?: string[];
14+
workingDir?: string;
15+
}
16+
17+
export interface MobDebugConfiguration extends EmmyDebugConfiguration {
18+
program?: string;
19+
arguments?: string[];
20+
workingDir?: string;
21+
}

src/extension.ts

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import findJava from "./findJava";
99
import { LanguageClient, LanguageClientOptions, ServerOptions, StreamInfo } from "vscode-languageclient";
1010
import { Proposed } from 'vscode-languageserver-protocol';
1111
import { AttachDebuggerProvider } from './debugger/AttachDebuggerProvider';
12+
import { MobDebuggerProvider } from './debugger/MobDebuggerProvider';
1213

1314
const LANGUAGE_ID = 'lua'; //EmmyLua
1415
export let savedContext: vscode.ExtensionContext;
@@ -31,10 +32,14 @@ export function activate(context: vscode.ExtensionContext) {
3132
vscode.commands.registerCommand("emmy.restartServer", restartServer);
3233
vscode.commands.registerCommand("emmy.showReferences", showReferences);
3334

34-
const provder = new AttachDebuggerProvider();
35-
savedContext.subscriptions.push(vscode.debug.registerDebugConfigurationProvider("emmylua_attach", provder));
36-
savedContext.subscriptions.push(vscode.debug.registerDebugConfigurationProvider("emmylua_launch", provder));
37-
savedContext.subscriptions.push(provder);
35+
const attProvider = new AttachDebuggerProvider();
36+
savedContext.subscriptions.push(vscode.debug.registerDebugConfigurationProvider("emmylua_attach", attProvider));
37+
savedContext.subscriptions.push(vscode.debug.registerDebugConfigurationProvider("emmylua_launch", attProvider));
38+
savedContext.subscriptions.push(attProvider);
39+
const mobProvider = new MobDebuggerProvider();
40+
savedContext.subscriptions.push(vscode.debug.registerDebugConfigurationProvider("emmylua_remote", mobProvider));
41+
savedContext.subscriptions.push(vscode.debug.registerDebugConfigurationProvider("emmylua_remote_launch", mobProvider));
42+
savedContext.subscriptions.push(mobProvider);
3843
vscode.debug.onDidReceiveDebugSessionCustomEvent(e => {
3944
console.log(e.body);
4045
});

0 commit comments

Comments
 (0)