This commit is contained in:
Henning Dieterichs
2020-08-23 18:38:32 +02:00
parent 2b6dbf52e9
commit dc9b07a4b6
10 changed files with 93 additions and 34 deletions

View File

@@ -24,7 +24,7 @@ export class GridExtractor implements DataExtractor {
extractData: () =>
expect<GridVisualizationData>({
kind: { grid: true },
rows: [{ columns: data.map(d => ({ tag: d })) }],
rows: [{ columns: data.map(d => ({ tag: "" + d })) }],
}),
});
}

View File

@@ -0,0 +1,38 @@
import { isAssertionExpression } from "typescript";
import { DataExtractor, ExtractionCollector, DataExtractorContext } from "..";
import { TableVisualizationData } from "../../../CommonDataTypes";
import { expect } from "../../../util";
function assert<T>(value: unknown): asserts value {}
export class TableDataExtractor implements DataExtractor {
readonly id = "table";
getExtractions(
data: unknown,
collector: ExtractionCollector,
context: DataExtractorContext
): void {
if (!Array.isArray(data)) {
return;
}
if (!data.every(d => typeof d === "object" && d)) {
return;
}
assert<object[]>(data);
collector.addExtraction({
id: "table",
name: "Table",
priority: 1000,
extractData() {
return expect<TableVisualizationData>({
kind: {
table: true,
},
rows: data,
});
},
});
}
}

View File

@@ -107,6 +107,7 @@ export class TypeScriptAstDataExtractor implements DataExtractor {
root: helper.toTreeNode(
rootNode || finalRootSourceFile,
"root",
"",
marked,
fn
),
@@ -121,19 +122,24 @@ export class TypeScriptAstDataExtractor implements DataExtractor {
class Helper {
constructor(private readonly tsApi: typeof ts) {}
findKey(value: any, object: any): string | null {
for (var key in object) {
if (key.startsWith("_")) continue;
getPropertyNameInParent(value: any, parent: any): string | undefined {
for (const propertyName in parent) {
if (propertyName.startsWith("_")) continue;
var member = object[key];
if (member === value) return key;
const member = parent[propertyName];
if (member === value) {
return propertyName;
}
if (Array.isArray(member) && member.indexOf(value) !== -1) {
return key;
if (Array.isArray(member)) {
const index = member.indexOf(value);
if (index !== -1) {
return `${propertyName}[${index}]`;
}
}
}
return null;
return undefined;
}
getChildren(node: ts.Node): ts.Node[] {
@@ -147,30 +153,38 @@ class Helper {
toTreeNode(
node: ts.Node,
memberName: string,
segmentName: string,
marked: Set<ts.Node>,
emphasizedValueFn: (node: ts.Node) => string | undefined
): AstTreeNode {
const name = this.tsApi.SyntaxKind[node.kind];
const children = this.getChildren(node)
.map((childNode, idx) => {
let parentPropertyName = this.findKey(childNode, node) || "";
let parentPropertyName =
this.getPropertyNameInParent(childNode, node) || "";
if (childNode.kind == this.tsApi.SyntaxKind.SyntaxList) {
const children = this.getChildren(childNode);
children.some(c => {
parentPropertyName = this.findKey(c, node) || "";
return !!parentPropertyName;
});
if (children.length === 0) return null!;
for (const c of children) {
const name =
this.getPropertyNameInParent(c, node) || "";
if (name) {
parentPropertyName = name;
break;
}
}
}
let segmentName = "." + parentPropertyName;
if (node.kind == this.tsApi.SyntaxKind.SyntaxList) {
parentPropertyName = "" + idx;
segmentName = `[${idx}]`;
}
return this.toTreeNode(
childNode,
parentPropertyName,
segmentName,
marked,
emphasizedValueFn
);
@@ -201,6 +215,7 @@ class Helper {
return {
items,
children: children,
segment: segmentName,
span: {
length: node.end - node.pos,
start: node.pos,

View File

@@ -7,6 +7,7 @@ import { PlotlyDataExtractor } from "./PlotlyDataExtractor";
import { ObjectGraphExtractor } from "./ObjectGraphExtractor";
import { getDataExtractorApi } from "../injection";
import { GridExtractor } from "./GridExtractor";
import { TableDataExtractor } from "./TableExtractor";
/**
* The default data extractors should be registered by VS Code automatically.
@@ -23,6 +24,7 @@ export function registerDefaultExtractors(
new PlotlyDataExtractor(),
new ObjectGraphExtractor(),
new GridExtractor(),
new TableDataExtractor(),
]) {
api.registerExtractor(item);
}