@markw65/monkeyc-optimizer 1.1.2 → 1.1.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -171,7 +171,7 @@ function isMCTreeNode(node) {
171
171
  * - if post returns false, the node it was called on is
172
172
  * removed.
173
173
  */
174
- function traverseAst(node, pre, post) {
174
+ function traverseAst(node, pre, post, parent) {
175
175
  const nodes = pre && pre(node);
176
176
  if (nodes === false)
177
177
  return;
@@ -186,7 +186,7 @@ function traverseAst(node, pre, post) {
186
186
  const values = value;
187
187
  const deletions = values.reduce((state, obj, i) => {
188
188
  if (isMCTreeNode(obj)) {
189
- const repl = traverseAst(obj, pre, post);
189
+ const repl = traverseAst(obj, pre, post, node);
190
190
  if (repl === false) {
191
191
  if (!state)
192
192
  state = {};
@@ -205,7 +205,7 @@ function traverseAst(node, pre, post) {
205
205
  }
206
206
  }
207
207
  else if (isMCTreeNode(value)) {
208
- let repl = traverseAst(value, pre, post);
208
+ let repl = traverseAst(value, pre, post, node);
209
209
  if (repl === false) {
210
210
  delete node[key];
211
211
  }
@@ -225,7 +225,7 @@ function traverseAst(node, pre, post) {
225
225
  }
226
226
  }
227
227
  }
228
- return post && post(node);
228
+ return post && post(node, parent);
229
229
  }
230
230
  function isStatement(node) {
231
231
  return hasProperty(mctreeTypeInfo[node.type], "stmt");
@@ -270,6 +270,9 @@ function withLoc(node, start, end) {
270
270
  }
271
271
  function withLocDeep(node, start, end, inplace) {
272
272
  node = withLoc(inplace ? node : { ...node }, start, end);
273
+ if (!inplace && node.origins) {
274
+ node.origins = [...node.origins];
275
+ }
273
276
  for (const key of mctreeTypeInfo[node.type].keys) {
274
277
  const value = node[key];
275
278
  if (!value)
@@ -1,7 +1,7 @@
1
1
  import { mctree } from "@markw65/prettier-plugin-monkeyc";
2
2
  import { hasProperty, traverseAst } from "./ast";
3
3
  import { JungleResourceMap } from "./jungles";
4
- import { ClassStateNode, FunctionInfo, FunctionStateNode, LookupDefinition, ModuleStateNode, ProgramState, ProgramStateAnalysis, ProgramStateLive, ProgramStateNode, ProgramStateStack, StateNode, StateNodeDecl, VariableStateNode } from "./optimizer-types";
4
+ import { ClassStateNode, Diagnostic, DiagnosticType, FunctionInfo, FunctionStateNode, LookupDefinition, ModuleStateNode, ProgramState, ProgramStateAnalysis, ProgramStateLive, ProgramStateNode, ProgramStateStack, StateNode, StateNodeDecl, VariableStateNode } from "./optimizer-types";
5
5
  import { visit_resources } from "./resources";
6
6
  import { xmlUtil } from "./sdk-util";
7
7
  export { visitorNode, visitReferences } from "./visitor";
@@ -9,10 +9,14 @@ export { traverseAst, hasProperty, visit_resources };
9
9
  export declare function parseSdkVersion(version: string | undefined): number;
10
10
  export declare function checkCompilerVersion(version: string, sdkVer: number): boolean | undefined;
11
11
  export declare function getApiMapping(state?: ProgramState, resourcesMap?: Record<string, JungleResourceMap>, manifestXML?: xmlUtil.Document): Promise<ProgramStateNode | null>;
12
- export declare function isStateNode(node: StateNodeDecl): node is StateNode;
12
+ export declare function isStateNode(node: {
13
+ type: string;
14
+ }): node is StateNode;
13
15
  export declare function variableDeclarationName(node: mctree.TypedIdentifier | mctree.InstanceofIdentifier): string;
16
+ declare type DeclKind = "decls" | "type_decls";
14
17
  export declare function sameLookupResult(a: LookupDefinition[], b: LookupDefinition[]): boolean;
15
18
  export declare function isLookupCandidate(node: mctree.MemberExpression): false | mctree.Identifier;
19
+ export declare function lookupNext(state: ProgramStateLive, results: LookupDefinition[], decls: DeclKind, property: mctree.Identifier): LookupDefinition[] | null;
16
20
  export declare function collectNamespaces(ast: mctree.Program, stateIn?: ProgramState): ProgramStateNode;
17
21
  export declare function formatAst(node: mctree.Node, monkeyCSource?: string | null, options?: Record<string, unknown> | null): string;
18
22
  export declare function findUsingForNode(state: ProgramStateLive, stack: ProgramStateStack, i: number, node: mctree.Identifier): ModuleStateNode | {
@@ -25,5 +29,5 @@ export declare function findUsingForNode(state: ProgramStateLive, stack: Program
25
29
  export declare function getApiFunctionInfo(state: ProgramState, func: FunctionStateNode): FunctionInfo | false;
26
30
  export declare function markInvokeClassMethod(state: ProgramStateAnalysis, func: FunctionStateNode): void;
27
31
  export declare function isLocal(v: VariableStateNode): boolean;
28
- export declare function diagnostic(state: ProgramState, loc: mctree.Node["loc"], message: string | null, type?: NonNullable<ProgramStateAnalysis["diagnostics"]>[string][number]["type"]): void;
29
- export declare function getSuperClasses(klass: ClassStateNode): Set<ClassStateNode> | null;
32
+ export declare function diagnostic(state: ProgramState, node: mctree.Node, message: string | null, type?: DiagnosticType, extra?: Diagnostic["extra"]): void;
33
+ export declare function getSuperClasses(klass: ClassStateNode): Set<StateNode> | null;
@@ -1,6 +1,6 @@
1
1
  import { mctree } from "@markw65/prettier-plugin-monkeyc";
2
2
  import type { xmlUtil } from "./sdk-util";
3
- export declare function traverseAst(node: mctree.Node, pre?: null | ((node: mctree.Node) => void | null | false | (keyof mctree.NodeAll)[]), post?: (node: mctree.Node) => void | null | false | mctree.Node | mctree.Node[]): false | void | null | mctree.Node | mctree.Node[];
3
+ export declare function traverseAst(node: mctree.Node, pre?: null | ((node: mctree.Node) => void | null | false | (keyof mctree.NodeAll)[]), post?: (node: mctree.Node, parent: mctree.Node | undefined) => void | null | false | mctree.Node | mctree.Node[], parent?: mctree.Node | undefined): false | void | null | mctree.Node | mctree.Node[];
4
4
  export declare function isStatement(node: mctree.Node): node is mctree.Statement;
5
5
  export declare function isExpression(node: mctree.Node): node is mctree.Expression;
6
6
  export declare function mayThrow(node: mctree.Node): boolean;
@@ -11,9 +11,10 @@ export declare type Block<T extends EventConstraint<T>> = {
11
11
  succs?: Block<T>[];
12
12
  expreds?: Block<T>[];
13
13
  exsucc?: Block<T>;
14
+ bogopred?: Block<T>;
14
15
  events?: T[];
15
16
  };
16
- export declare function buildReducedGraph<T extends EventConstraint<T>>(state: ProgramStateAnalysis, func: FunctionStateNode, notice: (node: mctree.Node, stmt: mctree.Node, mayThrow: boolean | 1) => T | null): Block<T>;
17
+ export declare function buildReducedGraph<T extends EventConstraint<T>>(state: ProgramStateAnalysis, func: FunctionStateNode, notice: (node: mctree.Node, stmt: mctree.Node, mayThrow: boolean | 1) => T | T[] | null): Block<T>;
17
18
  export declare function postOrderTraverse<T extends EventConstraint<T>>(head: Block<T>, visitor: (block: Block<T>) => void): void;
18
19
  export declare function preOrderTraverse<T extends EventConstraint<T>>(head: Block<T>, visitor: (block: Block<T>) => void): void;
19
20
  export declare function getPostOrder<T extends EventConstraint<T>>(head: Block<T>): Block<T>[];
@@ -2,16 +2,30 @@ import { mctree } from "@markw65/prettier-plugin-monkeyc";
2
2
  import { BaseEvent, Block } from "./control-flow";
3
3
  import { FunctionStateNode, ProgramStateAnalysis, StateNodeDecl } from "./optimizer-types";
4
4
  export declare type RefNode = mctree.Identifier | mctree.MemberExpression | mctree.Literal;
5
- export declare type EventDecl = StateNodeDecl | StateNodeDecl[] | mctree.Literal;
5
+ export declare type EventDecl = StateNodeDecl | StateNodeDecl[] | mctree.Literal | {
6
+ type: "MemberDecl";
7
+ node: mctree.MemberExpression;
8
+ base: StateNodeDecl | StateNodeDecl[];
9
+ path: mctree.MemberExpression[];
10
+ } | {
11
+ type: "Unknown";
12
+ node: mctree.MemberExpression | mctree.Identifier | mctree.ThisExpression;
13
+ };
6
14
  export interface RefEvent extends BaseEvent {
7
15
  type: "ref";
8
16
  node: RefNode;
9
17
  decl: EventDecl;
10
18
  }
19
+ export interface KillEvent extends BaseEvent {
20
+ type: "kil";
21
+ node: mctree.Node;
22
+ decl: StateNodeDecl | StateNodeDecl[];
23
+ }
11
24
  export interface DefEvent extends BaseEvent {
12
25
  type: "def";
13
26
  node: mctree.AssignmentExpression | mctree.UpdateExpression | mctree.VariableDeclarator;
14
27
  decl: EventDecl;
28
+ rhs?: EventDecl;
15
29
  }
16
30
  export interface ModEvent extends BaseEvent {
17
31
  type: "mod";
@@ -20,21 +34,70 @@ export interface ModEvent extends BaseEvent {
20
34
  before?: boolean;
21
35
  id?: RefNode;
22
36
  callees?: FunctionStateNode[] | null;
37
+ calleeDecl?: EventDecl | undefined;
38
+ calleeObj?: EventDecl | undefined;
39
+ }
40
+ export declare enum FlowKind {
41
+ LEFT_EQ_RIGHT_DECL = 0,
42
+ LEFT_NE_RIGHT_DECL = 1,
43
+ LEFT_EQ_RIGHT_NODE = 2,
44
+ LEFT_NE_RIGHT_NODE = 3,
45
+ LEFT_TRUTHY = 4,
46
+ LEFT_FALSEY = 5,
47
+ INSTANCEOF = 6,
48
+ NOTINSTANCE = 7
49
+ }
50
+ interface FlowEventDecl extends BaseEvent {
51
+ type: "flw";
52
+ node: mctree.BinaryExpression | mctree.UnaryExpression;
53
+ decl?: undefined;
54
+ kind: FlowKind.LEFT_EQ_RIGHT_DECL | FlowKind.LEFT_NE_RIGHT_DECL;
55
+ left: EventDecl;
56
+ right_decl: EventDecl;
57
+ right_node?: undefined;
58
+ }
59
+ interface FlowEventNode extends BaseEvent {
60
+ type: "flw";
61
+ node: mctree.BinaryExpression | mctree.UnaryExpression;
62
+ decl?: undefined;
63
+ kind: FlowKind.LEFT_EQ_RIGHT_NODE | FlowKind.LEFT_NE_RIGHT_NODE;
64
+ left: EventDecl;
65
+ right_decl?: undefined;
66
+ right_node: mctree.Expression;
67
+ }
68
+ interface FlowEventTruthy extends BaseEvent {
69
+ type: "flw";
70
+ node: mctree.Node;
71
+ decl?: undefined;
72
+ kind: FlowKind.LEFT_TRUTHY | FlowKind.LEFT_FALSEY;
73
+ left: EventDecl;
74
+ right_decl?: undefined;
75
+ right_node?: undefined;
76
+ }
77
+ interface FlowEventInstanceof extends BaseEvent {
78
+ type: "flw";
79
+ node: mctree.InstanceofExpression | mctree.UnaryExpression;
80
+ decl?: undefined;
81
+ kind: FlowKind.INSTANCEOF | FlowKind.NOTINSTANCE;
82
+ left: EventDecl;
83
+ right_decl: EventDecl;
84
+ right_node?: undefined;
23
85
  }
86
+ export declare type FlowEvent = FlowEventDecl | FlowEventNode | FlowEventTruthy | FlowEventInstanceof;
24
87
  export interface ExnEvent extends BaseEvent {
25
88
  type: "exn";
26
89
  node: mctree.Node;
27
90
  }
28
- export declare type Event = RefEvent | DefEvent | ModEvent | ExnEvent;
91
+ export declare type Event = RefEvent | KillEvent | DefEvent | ModEvent | FlowEvent | ExnEvent;
29
92
  export interface DataFlowBlock extends Block<Event> {
30
93
  order?: number;
31
94
  }
32
- export declare function declFullName(decl: EventDecl): string | undefined;
95
+ export declare function declFullName(decl: EventDecl): string;
33
96
  export declare function declName(decl: EventDecl): string | undefined;
34
97
  export declare function unhandledType(node: never): never;
35
98
  export declare function buildDataFlowGraph(state: ProgramStateAnalysis, func: FunctionStateNode, wantsLiteral: (literal: mctree.Literal) => boolean, trackInsertionPoints: boolean, wantsAllRefs: boolean): {
36
99
  identifiers: Set<string>;
37
- graph: Block<RefEvent | DefEvent | ModEvent | ExnEvent>;
100
+ graph: Block<RefEvent | KillEvent | DefEvent | ModEvent | FlowEventDecl | FlowEventNode | FlowEventTruthy | FlowEventInstanceof | ExnEvent>;
38
101
  };
39
102
  export declare class DataflowQueue {
40
103
  private enqueued;
@@ -43,3 +106,4 @@ export declare class DataflowQueue {
43
106
  dequeue(): DataFlowBlock;
44
107
  empty(): boolean;
45
108
  }
109
+ export {};
@@ -7,11 +7,4 @@ export declare function getFileASTs(fnMap: FilesToOptimizeMap): Promise<boolean>
7
7
  export declare function analyze(fnMap: FilesToOptimizeMap, resourcesMap: Record<string, JungleResourceMap>, manifestXML: xmlUtil.Document | undefined, config: BuildConfig): Promise<ProgramStateAnalysis>;
8
8
  export declare function reportMissingSymbols(state: ProgramStateAnalysis, config?: BuildConfig): void;
9
9
  export declare function getLiteralFromDecls(lookupDefns: LookupDefinition[]): mctree.Literal | mctree.AsExpression | null;
10
- export declare function optimizeMonkeyC(fnMap: FilesToOptimizeMap, resourcesMap: Record<string, JungleResourceMap>, manifestXML: xmlUtil.Document, config: BuildConfig): Promise<Record<string, {
11
- type: import("./optimizer-types").DiagnosticType;
12
- loc: {
13
- start: mctree.Position;
14
- end: mctree.Position;
15
- };
16
- message: string;
17
- }[]> | undefined>;
10
+ export declare function optimizeMonkeyC(fnMap: FilesToOptimizeMap, resourcesMap: Record<string, JungleResourceMap>, manifestXML: xmlUtil.Document, config: BuildConfig): Promise<Record<string, import("./optimizer-types").Diagnostic[]> | undefined>;
@@ -37,6 +37,7 @@ export declare type BuildConfig = {
37
37
  useLocalOptimizer?: boolean;
38
38
  propagateTypes?: boolean;
39
39
  trustDeclaredTypes?: boolean;
40
+ covarianceWarnings?: boolean;
40
41
  checkTypes?: DiagnosticType | "OFF";
41
42
  };
42
43
  export declare type StateNodeDecl = StateNode | mctree.EnumStringMember | mctree.TypedIdentifier;
@@ -85,7 +86,7 @@ export interface ClassStateNode extends BaseStateNode {
85
86
  fullName: string;
86
87
  superClass?: ClassStateNode[] | true;
87
88
  hasInvoke?: boolean;
88
- superClasses?: Set<ClassStateNode>;
89
+ superClasses?: Set<StateNode>;
89
90
  }
90
91
  export declare type FunctionInfo = {
91
92
  modifiedDecls: Set<VariableStateNode>;
@@ -135,6 +136,22 @@ export interface EnumStateNode extends BaseStateNode {
135
136
  name: string;
136
137
  fullName: string;
137
138
  stack: ProgramStateStack;
139
+ resolvedType?: ExactOrUnion;
140
+ }
141
+ interface DiagnosticBase {
142
+ loc: mctree.SourceLocation;
143
+ message: string;
144
+ }
145
+ export interface DiagnosticInfo extends DiagnosticBase {
146
+ loc: Finalized<mctree.SourceLocation, "source">;
147
+ }
148
+ export interface Diagnostic extends DiagnosticBase {
149
+ type: DiagnosticType;
150
+ related?: DiagnosticInfo[];
151
+ extra?: {
152
+ uri: string;
153
+ message: string;
154
+ };
138
155
  }
139
156
  export declare type StateNode = ProgramStateNode | FunctionStateNode | BlockStateNode | ClassStateNode | ModuleStateNode | TypedefStateNode | VariableStateNode | EnumStateNode;
140
157
  export declare type ProgramStateStack = StateNode[];
@@ -143,10 +160,12 @@ export declare type LookupDefinition = {
143
160
  results: StateNodeDecl[];
144
161
  };
145
162
  export declare type LookupResult = [string, LookupDefinition[]] | [null, null] | [false, false];
163
+ export declare type ByNameStateNodeDecls = ModuleStateNode | ClassStateNode | FunctionStateNode | ProgramStateNode;
146
164
  export declare type ProgramState = {
147
165
  allFunctions?: Record<string, FunctionStateNode[]>;
148
166
  allClasses?: ClassStateNode[];
149
167
  invokeInfo?: FunctionInfo;
168
+ allDeclarations?: Record<string, ByNameStateNodeDecls[]>;
150
169
  fnMap?: FilesToOptimizeMap;
151
170
  rezAst?: mctree.Program;
152
171
  manifestXML?: xmlUtil.Document;
@@ -189,21 +208,14 @@ export declare type ProgramState = {
189
208
  constants?: {
190
209
  [key: string]: mctree.Literal;
191
210
  };
192
- diagnostics?: Record<string, {
193
- type: DiagnosticType;
194
- loc: {
195
- start: mctree.Position;
196
- end: mctree.Position;
197
- };
198
- message: string;
199
- }[]>;
211
+ diagnostics?: Record<string, Diagnostic[]>;
200
212
  enumMap?: Map<EnumStringMember, EnumStateNode>;
201
213
  };
202
214
  export declare type Finalized<T, Keys extends keyof T> = T & {
203
215
  [key in Keys]-?: NonNullable<T[key]>;
204
216
  };
205
217
  export declare type ProgramStateLive = Finalized<ProgramState, "stack" | "lookup" | "lookupValue" | "lookupType" | "lookupNonlocal" | "stackClone" | "traverse" | "index" | "constants" | "removeNodeComments" | "inType" | "nextExposed" | "lookupRules">;
206
- export declare type ProgramStateAnalysis = Finalized<ProgramStateLive, "allClasses" | "allFunctions" | "fnMap" | "invokeInfo">;
218
+ export declare type ProgramStateAnalysis = Finalized<ProgramStateLive, "allClasses" | "allFunctions" | "fnMap" | "allDeclarations" | "invokeInfo">;
207
219
  export declare type ProgramStateOptimizer = Finalized<ProgramStateAnalysis, "localsStack" | "exposed" | "calledFunctions" | "usedByName">;
208
220
  export declare type ExcludeAnnotationsMap = {
209
221
  [key: string]: boolean;
@@ -43,14 +43,7 @@ export declare function buildOptimizedProject(product: string | null, options: B
43
43
  program: string;
44
44
  product: string | null;
45
45
  hasTests: boolean;
46
- diagnostics: Record<string, {
47
- type: import("./optimizer-types").DiagnosticType;
48
- loc: {
49
- start: mctree.Position;
50
- end: mctree.Position;
51
- };
52
- message: string;
53
- }[]> | undefined;
46
+ diagnostics: Record<string, import("./optimizer-types").Diagnostic[]> | undefined;
54
47
  }>;
55
48
  export declare function generateOptimizedProject(options: BuildConfig): Promise<{
56
49
  jungleFiles: string | undefined;
@@ -63,14 +56,7 @@ export declare function generateOptimizedProject(options: BuildConfig): Promise<
63
56
  xml: xmlUtil.Document;
64
57
  program: string;
65
58
  hasTests: boolean;
66
- diagnostics: Record<string, {
67
- type: import("./optimizer-types").DiagnosticType;
68
- loc: {
69
- start: mctree.Position;
70
- end: mctree.Position;
71
- };
72
- message: string;
73
- }[]>;
59
+ diagnostics: Record<string, import("./optimizer-types").Diagnostic[]>;
74
60
  }>;
75
61
  export declare type PreAnalysis = {
76
62
  fnMap: FilesToOptimizeMap;
@@ -16,7 +16,7 @@ export declare type RemoteProject = string | {
16
16
  test?: boolean;
17
17
  };
18
18
  export declare const githubProjects: RemoteProject[];
19
- export declare function fetchGitProjects(projects: RemoteProject[], testOnly: boolean): Promise<(string | {
19
+ export declare function fetchGitProjects(projects: RemoteProject[], testOnly: boolean, skipRemote: boolean): Promise<(string | {
20
20
  jungle: string;
21
21
  build: boolean | null;
22
22
  options: BuildConfig | null;
@@ -1,2 +1,3 @@
1
1
  import { ExactOrUnion } from "./types";
2
2
  export declare function couldBe(a: ExactOrUnion, b: ExactOrUnion): boolean;
3
+ export declare function couldBeWeak(a: ExactOrUnion, b: ExactOrUnion): boolean;
@@ -0,0 +1,5 @@
1
+ import { mctree } from "@markw65/prettier-plugin-monkeyc";
2
+ import { FunctionStateNode, ProgramStateAnalysis } from "../optimizer-types";
3
+ import { TypeFlowBlock } from "./type-flow-util";
4
+ export declare function findDeadStores(graph: TypeFlowBlock, logThisRun: boolean): Set<mctree.Node>;
5
+ export declare function eliminateDeadStores(state: ProgramStateAnalysis, func: FunctionStateNode, graph: TypeFlowBlock, logThisRun: boolean): boolean;
@@ -1,4 +1,16 @@
1
- import { ProgramStateAnalysis } from "../optimizer-types";
2
- import { ExactOrUnion } from "./types";
3
1
  import { mctree } from "@markw65/prettier-plugin-monkeyc";
4
- export declare function evaluateCall(state: ProgramStateAnalysis, node: mctree.CallExpression, callee: ExactOrUnion, _args: ExactOrUnion[]): ExactOrUnion;
2
+ import { FunctionStateNode } from "src/optimizer-types";
3
+ import { InterpStackElem, InterpState } from "./interp";
4
+ import { ExactOrUnion } from "./types";
5
+ export declare function evaluateCall(istate: InterpState, node: mctree.CallExpression, callee: ExactOrUnion, args: ExactOrUnion[]): InterpStackElem;
6
+ export declare function checkCallArgs(istate: InterpState, node: mctree.CallExpression, callees: FunctionStateNode | FunctionStateNode[], args: ExactOrUnion[]): InterpStackElem;
7
+ declare type SysCallHelperResult = {
8
+ calleeObj?: ExactOrUnion;
9
+ returnType?: ExactOrUnion;
10
+ argTypes?: ExactOrUnion[];
11
+ effectFree?: true;
12
+ argEffects?: true;
13
+ };
14
+ declare type SysCallHelper = (func: FunctionStateNode, calleeObj: ExactOrUnion, getArgs: () => Array<ExactOrUnion>) => SysCallHelperResult;
15
+ export declare function sysCallInfo(func: FunctionStateNode): SysCallHelper | null;
16
+ export {};
@@ -1,5 +1,5 @@
1
1
  import { mctree } from "@markw65/prettier-plugin-monkeyc";
2
- import { FunctionStateNode, ProgramStateAnalysis } from "../optimizer-types";
2
+ import { DiagnosticType, FunctionStateNode, ProgramStateAnalysis } from "../optimizer-types";
3
3
  import { ExactOrUnion } from "./types";
4
4
  export declare type TypeMap = Map<mctree.Node, ExactOrUnion>;
5
5
  export declare type InterpStackElem = {
@@ -14,10 +14,16 @@ export declare type InterpState = {
14
14
  func?: FunctionStateNode;
15
15
  pre?: (node: mctree.Node) => mctree.Node | false | null | void;
16
16
  post?: (node: mctree.Node) => mctree.Node | false | null | void;
17
+ typeChecker?: (a: ExactOrUnion, b: ExactOrUnion) => boolean;
18
+ checkTypes?: DiagnosticType;
17
19
  };
18
20
  export declare function popIstate(istate: InterpState, node: mctree.Node): InterpStackElem;
21
+ export declare function tryPop(istate: InterpState, node: InterpStackElem["node"]): InterpStackElem;
19
22
  export declare function evaluateExpr(state: ProgramStateAnalysis, expr: mctree.Expression, typeMap?: TypeMap): InterpStackElem;
23
+ export declare function preEvaluate(istate: InterpState, node: mctree.Node): null | (keyof mctree.NodeAll)[];
20
24
  export declare function evaluate(istate: InterpState, node: mctree.Expression): InterpStackElem;
21
25
  export declare function evaluate(istate: InterpState, node: mctree.Node): InterpStackElem | undefined;
26
+ export declare function deEnumerate(t: ExactOrUnion): ExactOrUnion;
22
27
  export declare function evaluateNode(istate: InterpState, node: mctree.Node): void;
23
28
  export declare function roundToFloat(value: number): number;
29
+ export declare function mustBeIdentical(a: ExactOrUnion, b: ExactOrUnion): boolean;
@@ -4,3 +4,4 @@ import { InterpState } from "./interp";
4
4
  export declare function optimizeFunction(state: ProgramStateAnalysis, func: FunctionStateNode): void;
5
5
  export declare function beforeEvaluate(istate: InterpState, node: mctree.Node): mctree.Node | null | false;
6
6
  export declare function afterEvaluate(istate: InterpState, node: mctree.Node): mctree.Node | null | false;
7
+ export declare function tryDeEnumerate(istate: InterpState, node: mctree.Expression, elem: number): mctree.Expression | null;
@@ -0,0 +1,16 @@
1
+ import { mctree } from "@markw65/prettier-plugin-monkeyc";
2
+ import { DataFlowBlock as TypeFlowBlock, Event, EventDecl } from "../data-flow";
3
+ import { VariableStateNode } from "../optimizer-types";
4
+ export { TypeFlowBlock };
5
+ export declare function isTypeStateKey(decl: EventDecl): decl is TypeStateKey;
6
+ export declare function declIsLocal(decl: EventDecl): decl is VariableStateNode | VariableStateNode[] | mctree.TypedIdentifier;
7
+ export declare function localDeclName(decl: EventDecl): string;
8
+ export declare type TypeStateKey = Exclude<EventDecl, {
9
+ type: "MemberDecl" | "Unknown";
10
+ }>;
11
+ export declare function tsKey(key: TypeStateKey): string;
12
+ export declare function sourceLocation(loc: mctree.SourceLocation | null | undefined): string;
13
+ export declare function printBlockHeader(block: TypeFlowBlock): void;
14
+ export declare function describeEvent(event: Event): string;
15
+ export declare function printBlockEvents(block: TypeFlowBlock, extra?: (event: Event) => string): void;
16
+ export declare function printBlockTrailer(block: TypeFlowBlock): void;
@@ -1,29 +1,6 @@
1
1
  import { mctree } from "@markw65/prettier-plugin-monkeyc";
2
- import { ClassStateNode, EnumStateNode, FunctionStateNode, ModuleStateNode, ProgramStateAnalysis, ProgramStateStack, StateNodeDecl, TypedefStateNode } from "../optimizer-types";
3
- /**
4
- * TypeBit gives the position of the 1 bit in TypeTag
5
- */
6
- export declare enum TypeBit {
7
- Null = 0,
8
- False = 1,
9
- True = 2,
10
- Number = 3,
11
- Long = 4,
12
- Float = 5,
13
- Double = 6,
14
- Char = 7,
15
- String = 8,
16
- Array = 9,
17
- Dictionary = 10,
18
- Module = 11,
19
- Function = 12,
20
- Class = 13,
21
- Object = 14,
22
- Enum = 15,
23
- Symbol = 16,
24
- Typedef = 17
25
- }
26
- export declare enum TypeTag {
2
+ import { ClassStateNode, EnumStateNode, FunctionStateNode, ModuleStateNode, ProgramStateAnalysis, ProgramStateStack, StateNode, StateNodeDecl, TypedefStateNode } from "../optimizer-types";
3
+ export declare const enum TypeTag {
27
4
  Never = 0,
28
5
  Null = 1,
29
6
  False = 2,
@@ -33,35 +10,43 @@ export declare enum TypeTag {
33
10
  Long = 16,
34
11
  Float = 32,
35
12
  Double = 64,
13
+ Decimal = 96,
36
14
  Numeric = 120,
37
15
  Char = 128,
38
16
  String = 256,
39
17
  Array = 512,
40
18
  Dictionary = 1024,
41
- Module = 2048,
42
- Function = 4096,
43
- Class = 8192,
44
- Object = 16384,
45
- Enum = 32768,
46
- Symbol = 65536,
47
- Typedef = 131072,
48
- Any = 262143
49
- }
19
+ Method = 2048,
20
+ Module = 4096,
21
+ Function = 8192,
22
+ Class = 16384,
23
+ Object = 32768,
24
+ Enum = 65536,
25
+ Symbol = 131072,
26
+ Typedef = 262144,
27
+ Any = 524287
28
+ }
29
+ export declare function typeTagName(tag: TypeTag): "Object" | "Number" | "Float" | "Double" | "Long" | "String" | "Char" | "Boolean" | "Null" | "Never" | "False" | "True" | "Decimal" | "Numeric" | "Array" | "Dictionary" | "Method" | "Module" | "Function" | "Class" | "Enum" | "Symbol" | "Typedef" | "Any";
30
+ export declare const LastTypeTag = TypeTag.Typedef;
50
31
  export declare const SingleTonTypeTagsConst: number;
51
32
  export declare const UnionDataTypeTagsConst: number;
52
33
  export declare const ValueTypeTagsConst: number;
53
34
  export declare const ObjectLikeTagsConst: number;
54
- declare type ExactTypeTags = TypeTag.Null | TypeTag.False | TypeTag.True | TypeTag.Number | TypeTag.Long | TypeTag.Float | TypeTag.Double | TypeTag.Char | TypeTag.String | TypeTag.Array | TypeTag.Dictionary | TypeTag.Module | TypeTag.Function | TypeTag.Class | TypeTag.Object | TypeTag.Enum | TypeTag.Symbol | TypeTag.Typedef;
35
+ export declare const EnumTagsConst: number;
36
+ declare type ExactTypeTags = TypeTag.Null | TypeTag.False | TypeTag.True | TypeTag.Number | TypeTag.Long | TypeTag.Float | TypeTag.Double | TypeTag.Char | TypeTag.String | TypeTag.Array | TypeTag.Dictionary | TypeTag.Method | TypeTag.Module | TypeTag.Function | TypeTag.Class | TypeTag.Object | TypeTag.Enum | TypeTag.Symbol | TypeTag.Typedef;
55
37
  export declare type EnumeratedTypeTags = ExactTypeTags | TypeTag.Never | TypeTag.Any;
56
38
  export declare type UnionTypeTags = number;
57
39
  interface AbstractValue {
58
40
  type: UnionTypeTags;
59
41
  value?: unknown;
60
42
  }
61
- export declare type ExactTypes = NullType | FalseType | TrueType | NumberType | LongType | FloatType | DoubleType | CharType | StringType | ArrayType | DictionaryType | ModuleType | FunctionType | ClassType | ObjectType | EnumType | SymbolType | TypedefType;
43
+ export declare type ExactTypes = NullType | FalseType | TrueType | NumberType | LongType | FloatType | DoubleType | CharType | StringType | ArrayType | DictionaryType | MethodType | ModuleType | FunctionType | ClassType | ObjectType | EnumType | SymbolType | TypedefType;
62
44
  declare type WithValue<T> = T extends ExactTypes ? T extends SingletonType ? T : T & {
63
45
  value: NonNullable<T["value"]>;
64
46
  } : never;
47
+ export declare type ExactData<T extends ExactTypeTags> = T extends SingletonType ? undefined : NonNullable<Extract<ExactTypes, {
48
+ type: T;
49
+ }>["value"]>;
65
50
  export declare type ValueTypes = WithValue<ExactTypes>;
66
51
  export declare type ExtendedTypes = ExactTypes | NeverType | AnyType;
67
52
  export interface NeverType extends AbstractValue {
@@ -115,6 +100,13 @@ export interface DictionaryType extends AbstractValue {
115
100
  value: ExactOrUnion;
116
101
  } | undefined;
117
102
  }
103
+ export interface MethodType extends AbstractValue {
104
+ type: TypeTag.Method;
105
+ value?: {
106
+ args: ExactOrUnion[];
107
+ result: ExactOrUnion;
108
+ } | undefined;
109
+ }
118
110
  export interface ModuleType extends AbstractValue {
119
111
  type: TypeTag.Module;
120
112
  value?: ModuleStateNode | ModuleStateNode[] | undefined;
@@ -143,6 +135,9 @@ export interface EnumType extends AbstractValue {
143
135
  value?: {
144
136
  enum: EnumStateNode;
145
137
  value?: ExactOrUnion | undefined;
138
+ } | {
139
+ enum?: undefined;
140
+ value: ExactOrUnion;
146
141
  } | undefined;
147
142
  }
148
143
  export interface SymbolType extends AbstractValue {
@@ -150,7 +145,7 @@ export interface SymbolType extends AbstractValue {
150
145
  value?: string | undefined;
151
146
  }
152
147
  export interface AnyType extends AbstractValue {
153
- type: -1;
148
+ type: TypeTag.Any;
154
149
  value?: undefined;
155
150
  }
156
151
  export declare type SingletonType = NullType | FalseType | TrueType;
@@ -158,6 +153,7 @@ export declare type UnionData = {
158
153
  mask: TypeTag;
159
154
  [TypeTag.Array]?: NonNullable<ArrayType["value"]>;
160
155
  [TypeTag.Dictionary]?: NonNullable<DictionaryType["value"]>;
156
+ [TypeTag.Method]?: NonNullable<MethodType["value"]>;
161
157
  [TypeTag.Module]?: NonNullable<ModuleType["value"]>;
162
158
  [TypeTag.Function]?: NonNullable<FunctionType["value"]>;
163
159
  [TypeTag.Class]?: NonNullable<ClassType["value"]>;
@@ -175,6 +171,7 @@ declare type TagValue<TAG> = Extract<ValueTypes, {
175
171
  }>["value"];
176
172
  export declare type ArrayValueType = TagValue<TypeTag.Array>;
177
173
  export declare type DictionaryValueType = TagValue<TypeTag.Dictionary>;
174
+ export declare type MethodValueType = TagValue<TypeTag.Method>;
178
175
  export declare type ObjectValueType = TagValue<TypeTag.Object>;
179
176
  export declare type EnumValueType = TagValue<TypeTag.Enum>;
180
177
  export declare type TypedefValueType = TagValue<TypeTag.Typedef>;
@@ -184,9 +181,11 @@ export declare function isUnion(v: AbstractValue): v is UnionType;
184
181
  export declare function isSingleton(v: AbstractValue): v is SingletonType;
185
182
  export declare function hasValue(v: AbstractValue): v is WithValue<ExactTypes>;
186
183
  export declare function hasNoData(v: AbstractValue, t: TypeTag): boolean;
184
+ export declare function lookupByFullName(state: ProgramStateAnalysis, fullName: string): StateNodeDecl[];
187
185
  export declare function cloneType<T extends ExactOrUnion>(t: T): T;
188
186
  export declare function typeFromTypeStateNode(state: ProgramStateAnalysis, sn: StateNodeDecl, classVsObj?: boolean): ExactOrUnion;
189
187
  export declare function typeFromTypeStateNodes(state: ProgramStateAnalysis, sns: StateNodeDecl[], classVsObj?: boolean): ExactOrUnion;
188
+ export declare function typeFromSingleTypeSpec(state: ProgramStateAnalysis, type: mctree.TypeSpecPart | mctree.ObjectExpression, stack?: ProgramStateStack | undefined): ExactOrUnion;
190
189
  export declare function typeFromTypespec(state: ProgramStateAnalysis, ts: mctree.TypeSpecList, stack?: ProgramStateStack | undefined): ExactOrUnion;
191
190
  export declare function typeFromLiteral(literal: mctree.Literal): ExactTypes;
192
191
  export declare function mcExprFromType(type: ValueTypes): mctree.Expression | null;
@@ -197,6 +196,8 @@ export declare function mustBeFalse(arg: ExactOrUnion): boolean;
197
196
  export declare function display(type: ExactOrUnion): string;
198
197
  export declare function hasUnionData(tag: TypeTag): boolean;
199
198
  export declare function getObjectValue(t: ExactOrUnion): ObjectType["value"] | null;
200
- export declare function forEachUnionComponent(v: ExactOrUnion, bits: TypeTag, fn: (tag: UnionDataKey, value: SingleValue | null | undefined) => boolean | void): void;
201
- export declare function getUnionComponent(v: ExactOrUnion, tag: TypeTag): SingleValue | null;
199
+ export declare function forEachUnionComponent(v: ExactOrUnion, bits: TypeTag, fn: (tag: ExactTypeTags, value: SingleValue | null | undefined) => boolean | void): void;
200
+ export declare function getUnionComponent<T extends ExactTypeTags>(v: ExactOrUnion, tag: T): ExactData<T> | null;
201
+ export declare function setUnionComponent<T extends ExactTypeTags>(v: ExactOrUnion, tag: T, c: ExactData<T>): void;
202
+ export declare function getStateNodeDeclsFromType(state: ProgramStateAnalysis, object: ExactOrUnion): StateNode[];
202
203
  export {};
@@ -1,3 +1,4 @@
1
1
  import { ExactOrUnion, TypeTag } from "./types";
2
2
  export declare function unionInto(to: ExactOrUnion, from: ExactOrUnion): boolean;
3
3
  export declare function clearValuesUnder(v: ExactOrUnion, tag: TypeTag, clearTag?: boolean): void;
4
+ export declare function widenType(t: ExactOrUnion): null;
@@ -1,3 +1,12 @@
1
- import { FunctionStateNode, ProgramStateAnalysis } from "./optimizer-types";
1
+ import { mctree } from "@markw65/prettier-plugin-monkeyc";
2
+ import { FunctionStateNode, ProgramStateAnalysis, StateNode } from "./optimizer-types";
2
3
  import { InterpState } from "./type-flow/interp";
3
- export declare function buildTypeInfo(state: ProgramStateAnalysis, func: FunctionStateNode): InterpState | undefined;
4
+ import { ExactOrUnion } from "./type-flow/types";
5
+ export declare const missingNullWorkaround = true;
6
+ export declare function buildTypeInfo(state: ProgramStateAnalysis, func: FunctionStateNode, optimizeEquivalencies: boolean): InterpState | undefined;
7
+ export declare function findObjectDeclsByProperty(istate: InterpState, object: ExactOrUnion, next: mctree.DottedMemberExpression): StateNode[] | null;
8
+ export declare function resolveDottedMember(istate: InterpState, object: ExactOrUnion, next: mctree.DottedMemberExpression): {
9
+ mayThrow: boolean;
10
+ object: ExactOrUnion;
11
+ property: import("./type-flow/types").UnionType | import("./type-flow/types").NumberType | import("./type-flow/types").LongType | import("./type-flow/types").FloatType | import("./type-flow/types").DoubleType | import("./type-flow/types").CharType | import("./type-flow/types").StringType | import("./type-flow/types").ArrayType | import("./type-flow/types").DictionaryType | import("./type-flow/types").MethodType | import("./type-flow/types").ModuleType | import("./type-flow/types").FunctionType | import("./type-flow/types").ClassType | import("./type-flow/types").ObjectType | import("./type-flow/types").EnumType | import("./type-flow/types").SymbolType | import("./type-flow/types").TypedefType;
12
+ } | null;
@@ -1,3 +1,3 @@
1
1
  import { mctree } from "@markw65/prettier-plugin-monkeyc";
2
2
  import { ProgramStateOptimizer } from "./optimizer-types";
3
- export declare function cleanupUnusedVars(state: ProgramStateOptimizer, node: mctree.BlockStatement | mctree.ForStatement): void;
3
+ export declare function cleanupUnusedVars(state: ProgramStateOptimizer, node: mctree.BlockStatement | mctree.ForStatement): boolean;
@@ -7,8 +7,8 @@ export declare function globSome(pattern: string, predicate: (path: string) => b
7
7
  }): Promise<boolean>;
8
8
  export declare function forEach<T>(val: T | T[] | null | undefined, fn: (v: T) => void): void;
9
9
  export declare function map<T, U>(val: T | T[] | null | undefined, fn: (v: T) => U): U[];
10
- export declare function every<T>(val: T | T[] | null | undefined, fn: (v: T) => void): boolean | void;
11
- export declare function some<T>(val: T | T[] | null | undefined, fn: (v: T) => void): boolean | void;
10
+ export declare function every<T>(val: T | T[] | null | undefined, fn: (v: T) => boolean): boolean;
11
+ export declare function some<T>(val: T | T[] | null | undefined, fn: (v: T) => boolean): boolean;
12
12
  export declare function reduce<T, U>(val: T | T[] | null | undefined, fn: (p: U, v: T) => U, init: U): U;
13
13
  export declare function last_modified(inputs: string[]): Promise<number>;
14
14
  export declare function first_modified(inputs: string[]): Promise<number>;
@@ -21,3 +21,4 @@ export declare function spawnByLine(command: string, args: string[], lineHandler
21
21
  export declare function readByLine(file: string, lineHandler: LineHandler): Promise<unknown>;
22
22
  export declare function promiseAll<T>(promiseFn: (i: number) => Promise<T> | null, parallelism: number): Promise<T[]>;
23
23
  export declare function copyRecursiveAsNeeded(source: string, target: string, filter?: (src: string, tgt: string) => boolean): Promise<void>;
24
+ export declare function popcount(x: number): number;