* Implements languageId support

* Implements typing of helper functions
* Shift+F1 opens a new debug visualizer window if none is opened yet
This commit is contained in:
Henning Dieterichs
2020-03-29 15:16:46 +02:00
parent 213f4cda8f
commit 42e58ce9cf
14 changed files with 158 additions and 50 deletions

View File

@@ -16,6 +16,11 @@ export interface Evaluator {
| { kind: "data"; result: DataExtractionResult }
| { kind: "error"; message: FormattedMessage }
>;
/**
* The language that expressions must be written in.
*/
readonly languageId: string | undefined;
}
export interface EvaluationArgs {

View File

@@ -22,6 +22,8 @@ export class GenericEvaluationEngine implements EvaluationEngine {
}
export class GenericEvaluator implements Evaluator {
public readonly languageId = "text";
constructor(private readonly session: VsCodeDebugSession) {}
public async evaluate({

View File

@@ -33,6 +33,8 @@ export class JsEvaluationEngine implements EvaluationEngine {
}
class JsEvaluator implements Evaluator {
public readonly languageId = "javascript";
constructor(private readonly session: VsCodeDebugSession) {}
public async evaluate({

View File

@@ -8,6 +8,13 @@ export interface EvaluationWatchService {
): EvaluationWatcher;
getCompletions(text: string, column: number): Promise<CompletionItem[]>;
/**
* The language the expressions must be written in.
* `undefined`, if unknown.
* This field is observable.
*/
readonly languageId: string | undefined;
}
export interface EvaluationWatcherOptions {

View File

@@ -18,7 +18,7 @@ export class EvaluationWatchServiceImpl implements EvaluationWatchService {
constructor(
private readonly vsCodeDebuggerView: VsCodeDebuggerView,
private readonly dataExtractionProviderFactory: EvaluationEngine
private readonly evaluationEngine: EvaluationEngine
) {
this.dispose.track({
dispose: autorun(() => {
@@ -48,6 +48,21 @@ export class EvaluationWatchServiceImpl implements EvaluationWatchService {
this.watchers.delete(w);
}
private lastLanguageId: string | undefined = undefined;
get languageId(): string | undefined {
const session = this.vsCodeDebuggerView.activeDebugSession;
if (!session) {
return this.lastLanguageId;
}
const evaluator = this.evaluationEngine.createEvaluator(session);
if (!evaluator) {
return this.lastLanguageId;
}
this.lastLanguageId = evaluator.languageId;
return evaluator.languageId;
}
public async refresh(w: ObservableEvaluationWatcher): Promise<void> {
const session = this.vsCodeDebuggerView.activeDebugSession;
if (!session) {
@@ -59,10 +74,8 @@ export class EvaluationWatchServiceImpl implements EvaluationWatchService {
w._state = { kind: "loading" };
const extractionProvider = this.dataExtractionProviderFactory.createEvaluator(
session
);
if (!extractionProvider) {
const evaluator = this.evaluationEngine.createEvaluator(session);
if (!evaluator) {
w._state = {
kind: "error",
message: `The debug adapter "${session.session.type}" is not supported.`,
@@ -70,7 +83,7 @@ export class EvaluationWatchServiceImpl implements EvaluationWatchService {
return;
}
const result = await extractionProvider.evaluate({
const result = await evaluator.evaluate({
expression: w.expression,
frameId,
preferredExtractorId: w.preferredDataExtractor,