style(compiler): reformat partial evaluator source tree (#36461)

PR Close #36461
This commit is contained in:
JoostK 2020-04-06 21:47:40 +02:00 committed by Kara Erickson
parent aecf9de738
commit f9f6e2e1b3
6 changed files with 56 additions and 37 deletions

View File

@ -12,7 +12,9 @@ import {DynamicValue} from './dynamic';
import {KnownFn, ResolvedValue, ResolvedValueArray} from './result'; import {KnownFn, ResolvedValue, ResolvedValueArray} from './result';
export class ArraySliceBuiltinFn extends KnownFn { export class ArraySliceBuiltinFn extends KnownFn {
constructor(private lhs: ResolvedValueArray) { super(); } constructor(private lhs: ResolvedValueArray) {
super();
}
evaluate(node: ts.CallExpression, args: ResolvedValueArray): ResolvedValue { evaluate(node: ts.CallExpression, args: ResolvedValueArray): ResolvedValue {
if (args.length === 0) { if (args.length === 0) {
@ -24,7 +26,9 @@ export class ArraySliceBuiltinFn extends KnownFn {
} }
export class ArrayConcatBuiltinFn extends KnownFn { export class ArrayConcatBuiltinFn extends KnownFn {
constructor(private lhs: ResolvedValueArray) { super(); } constructor(private lhs: ResolvedValueArray) {
super();
}
evaluate(node: ts.CallExpression, args: ResolvedValueArray): ResolvedValue { evaluate(node: ts.CallExpression, args: ResolvedValueArray): ResolvedValue {
const result: ResolvedValueArray = [...this.lhs]; const result: ResolvedValueArray = [...this.lhs];

View File

@ -31,7 +31,8 @@ export class PartialEvaluator {
originatingFile: sourceFile, originatingFile: sourceFile,
absoluteModuleName: null, absoluteModuleName: null,
resolutionContext: sourceFile.fileName, resolutionContext: sourceFile.fileName,
scope: new Map<ts.ParameterDeclaration, ResolvedValue>(), foreignFunctionResolver, scope: new Map<ts.ParameterDeclaration, ResolvedValue>(),
foreignFunctionResolver,
}); });
} }
} }

View File

@ -337,7 +337,8 @@ export class StaticInterpreter {
} }
const declContext = { const declContext = {
...context, ...joinModuleContext(context, node, decl), ...context,
...joinModuleContext(context, node, decl),
}; };
// Visit both concrete and inline declarations. // Visit both concrete and inline declarations.

View File

@ -59,7 +59,9 @@ export class ResolvedModule {
getExports(): ResolvedValueMap { getExports(): ResolvedValueMap {
const map = new Map<string, ResolvedValue>(); const map = new Map<string, ResolvedValue>();
this.exports.forEach((decl, name) => { map.set(name, this.evaluate(decl)); }); this.exports.forEach((decl, name) => {
map.set(name, this.evaluate(decl));
});
return map; return map;
} }
} }

View File

@ -42,11 +42,13 @@ runInEachFileSystem(() => {
expect(value).toEqual('test'); expect(value).toEqual('test');
}); });
it('map access works', it('map access works', () => {
() => { expect(evaluate('const obj = {a: "test"};', 'obj.a')).toEqual('test'); }); expect(evaluate('const obj = {a: "test"};', 'obj.a')).toEqual('test');
});
it('resolves undefined property access', it('resolves undefined property access', () => {
() => { expect(evaluate('const obj: any = {}', 'obj.bar')).toEqual(undefined); }); expect(evaluate('const obj: any = {}', 'obj.bar')).toEqual(undefined);
});
it('function calls work', () => { it('function calls work', () => {
expect(evaluate(`function foo(bar) { return bar; }`, 'foo("test")')).toEqual('test'); expect(evaluate(`function foo(bar) { return bar; }`, 'foo("test")')).toEqual('test');
@ -68,7 +70,9 @@ runInEachFileSystem(() => {
expect(evaluate(`const x = false; const y = x ? 'true' : 'false';`, 'y')).toEqual('false'); expect(evaluate(`const x = false; const y = x ? 'true' : 'false';`, 'y')).toEqual('false');
}); });
it('addition works', () => { expect(evaluate(`const x = 1 + 2;`, 'x')).toEqual(3); }); it('addition works', () => {
expect(evaluate(`const x = 1 + 2;`, 'x')).toEqual(3);
});
it('static property on class works', () => { it('static property on class works', () => {
expect(evaluate(`class Foo { static bar = 'test'; }`, 'Foo.bar')).toEqual('test'); expect(evaluate(`class Foo { static bar = 'test'; }`, 'Foo.bar')).toEqual('test');
@ -148,19 +152,22 @@ runInEachFileSystem(() => {
expect(evaluate('const a: any = 3, b = 3;', 'a !== b')).toEqual(false); expect(evaluate('const a: any = 3, b = 3;', 'a !== b')).toEqual(false);
}); });
it('parentheticals work', it('parentheticals work', () => {
() => { expect(evaluate(`const a = 3, b = 4;`, 'a * (a + b)')).toEqual(21); }); expect(evaluate(`const a = 3, b = 4;`, 'a * (a + b)')).toEqual(21);
});
it('array access works', it('array access works', () => {
() => { expect(evaluate(`const a = [1, 2, 3];`, 'a[1] + a[0]')).toEqual(3); }); expect(evaluate(`const a = [1, 2, 3];`, 'a[1] + a[0]')).toEqual(3);
});
it('array access out of bounds is `undefined`', () => { it('array access out of bounds is `undefined`', () => {
expect(evaluate(`const a = [1, 2, 3];`, 'a[-1]')).toEqual(undefined); expect(evaluate(`const a = [1, 2, 3];`, 'a[-1]')).toEqual(undefined);
expect(evaluate(`const a = [1, 2, 3];`, 'a[3]')).toEqual(undefined); expect(evaluate(`const a = [1, 2, 3];`, 'a[3]')).toEqual(undefined);
}); });
it('array `length` property access works', it('array `length` property access works', () => {
() => { expect(evaluate(`const a = [1, 2, 3];`, 'a[\'length\'] + 1')).toEqual(4); }); expect(evaluate(`const a = [1, 2, 3];`, 'a[\'length\'] + 1')).toEqual(4);
});
it('array `slice` function works', () => { it('array `slice` function works', () => {
expect(evaluate(`const a = [1, 2, 3];`, 'a[\'slice\']()')).toEqual([1, 2, 3]); expect(evaluate(`const a = [1, 2, 3];`, 'a[\'slice\']()')).toEqual([1, 2, 3]);
@ -185,10 +192,13 @@ runInEachFileSystem(() => {
expect(evaluate('const a = false;', 'a')).toEqual(false); expect(evaluate('const a = false;', 'a')).toEqual(false);
}); });
it('supports undefined', it('supports undefined', () => {
() => { expect(evaluate('const a = undefined;', 'a')).toEqual(undefined); }); expect(evaluate('const a = undefined;', 'a')).toEqual(undefined);
});
it('supports null', () => { expect(evaluate('const a = null;', 'a')).toEqual(null); }); it('supports null', () => {
expect(evaluate('const a = null;', 'a')).toEqual(null);
});
it('resolves unknown binary operators as dynamic value', () => { it('resolves unknown binary operators as dynamic value', () => {
const value = evaluate('declare const window: any;', '"location" in window'); const value = evaluate('declare const window: any;', '"location" in window');
@ -434,8 +444,9 @@ runInEachFileSystem(() => {
.toEqual('test'); .toEqual('test');
}); });
it('template expressions work', it('template expressions work', () => {
() => { expect(evaluate('const a = 2, b = 4;', '`1${a}3${b}5`')).toEqual('12345'); }); expect(evaluate('const a = 2, b = 4;', '`1${a}3${b}5`')).toEqual('12345');
});
it('enum resolution works', () => { it('enum resolution works', () => {
const result = evaluate( const result = evaluate(