feat: add isMatchAST API

This commit is contained in:
sanmaopep 2025-02-25 19:16:11 +08:00
parent ff13f70261
commit eba0d4b635
3 changed files with 25 additions and 8 deletions

View File

@ -1,6 +1,13 @@
import { vi, describe, test, expect } from 'vitest'; import { vi, describe, test, expect } from 'vitest';
import { ASTKind, ObjectType, VariableEngine, VariableDeclaration } from '../../src'; import {
ASTKind,
ObjectType,
NumberType,
VariableEngine,
VariableDeclaration,
isMatchAST,
} from '../../src';
import { simpleVariableList } from '../../__mocks__/variables'; import { simpleVariableList } from '../../__mocks__/variables';
import { getContainer } from '../../__mocks__/container'; import { getContainer } from '../../__mocks__/container';
@ -26,7 +33,7 @@ describe('test Basic Variable Declaration', () => {
}); });
test('test globalVariableTable variables', () => { test('test globalVariableTable variables', () => {
expect(globalVariableTable.variables.map(_v => _v.key)).toMatchSnapshot(); expect(globalVariableTable.variables.map((_v) => _v.key)).toMatchSnapshot();
}); });
test('test get variable by key path', () => { test('test get variable by key path', () => {
@ -47,7 +54,7 @@ describe('test Basic Variable Declaration', () => {
expect(globalVariableTable.getByKeyPath(_case)?.type.kind).toEqual(_resType); expect(globalVariableTable.getByKeyPath(_case)?.type.kind).toEqual(_resType);
}); });
undefinedCases.forEach(_case => { undefinedCases.forEach((_case) => {
expect(globalVariableTable.getByKeyPath(_case)).toBeUndefined(); expect(globalVariableTable.getByKeyPath(_case)).toBeUndefined();
}); });
}); });
@ -95,9 +102,9 @@ describe('test Basic Variable Declaration', () => {
expect(previousVariable3.disposed).toBe(false); expect(previousVariable3.disposed).toBe(false);
expect(previousVariable3.version).toBe(1); // 更新次数为一次 expect(previousVariable3.version).toBe(1); // 更新次数为一次
expect(testScope.ast.version).toBe(2); // 调用了两次 fromJSON因此更新了两次 expect(testScope.ast.version).toBe(2); // 调用了两次 fromJSON因此更新了两次
expect(globalVariableTable.variables.map(_v => _v.key)).toMatchSnapshot(); expect(globalVariableTable.variables.map((_v) => _v.key)).toMatchSnapshot();
expect(globalVariableTable.version).toBe(2); // 调用了两次 fromJSON因此 version 是 2 expect(globalVariableTable.version).toBe(2); // 调用了两次 fromJSON因此 version 是 2
expect(testScope.available.variables.map(_v => _v.key)).toMatchSnapshot(); expect(testScope.available.variables.map((_v) => _v.key)).toMatchSnapshot();
}); });
test('remove variables', () => { test('remove variables', () => {
@ -141,7 +148,7 @@ describe('test Basic Variable Declaration', () => {
declaration.subscribe(() => { declaration.subscribe(() => {
declarationChangeTimes++; declarationChangeTimes++;
}); });
declaration.onTypeChange(type => { declaration.onTypeChange((type) => {
expect(type?.toJSON()).toMatchSnapshot(); expect(type?.toJSON()).toMatchSnapshot();
typeChangeTimes++; typeChangeTimes++;
}); });
@ -160,6 +167,7 @@ describe('test Basic Variable Declaration', () => {
type: ASTKind.Number, type: ASTKind.Number,
meta: { label: 'test Label' }, meta: { label: 'test Label' },
}); });
expect(isMatchAST(declaration.type, NumberType)).toBeTruthy();
expect(declarationChangeTimes).toBe(2); expect(declarationChangeTimes).toBe(2);
expect(anyVariableChangeTimes).toBe(2); expect(anyVariableChangeTimes).toBe(2);
expect(typeChangeTimes).toBe(1); expect(typeChangeTimes).toBe(1);
@ -178,6 +186,7 @@ describe('test Basic Variable Declaration', () => {
}, },
meta: { label: 'test Label' }, meta: { label: 'test Label' },
}); });
expect(isMatchAST(declaration.type, ObjectType)).toBeTruthy();
expect(declarationChangeTimes).toBe(3); expect(declarationChangeTimes).toBe(3);
expect(anyVariableChangeTimes).toBe(3); expect(anyVariableChangeTimes).toBe(3);
expect(typeChangeTimes).toBe(2); expect(typeChangeTimes).toBe(2);

View File

@ -17,3 +17,4 @@ export * from './expression';
export { ASTFactory } from './factory'; export { ASTFactory } from './factory';
export { injectToAST, postConstructAST } from './utils/inversify'; export { injectToAST, postConstructAST } from './utils/inversify';
export { isMatchAST } from './utils/helpers';

View File

@ -13,7 +13,7 @@ export function updateChildNodeHelper(
updateChildNode: (nextNode: ASTNode) => void; updateChildNode: (nextNode: ASTNode) => void;
removeChildNode: () => void; removeChildNode: () => void;
nextJSON?: ASTNodeJSON; nextJSON?: ASTNodeJSON;
}, }
): ASTNode | undefined { ): ASTNode | undefined {
const currNode: ASTNode | undefined = getChildNode(); const currNode: ASTNode | undefined = getChildNode();
@ -50,5 +50,12 @@ export function parseTypeJsonOrKind(typeJSONOrKind?: ASTNodeJSONOrKind): ASTNode
// 获取所有的 children // 获取所有的 children
export function getAllChildren(ast: ASTNode): ASTNode[] { export function getAllChildren(ast: ASTNode): ASTNode[] {
return [...ast.children, ...ast.children.map(_child => getAllChildren(_child)).flat()]; return [...ast.children, ...ast.children.map((_child) => getAllChildren(_child)).flat()];
}
export function isMatchAST<TargetASTNode extends ASTNode>(
node?: ASTNode,
targetType?: { kind: string; new (...args: any[]): TargetASTNode }
): node is TargetASTNode {
return node?.kind === targetType?.kind;
} }