123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153 |
- "use strict";
- const t = require("../../packages/babel-types");
- const utils = require("./utils");
- const NODE_PREFIX = "BabelNode";
- let code = `// NOTE: This file is autogenerated. Do not modify.
- // See scripts/generators/flow.js for script used.
- declare class ${NODE_PREFIX}Comment {
- value: string;
- start: number;
- end: number;
- loc: ${NODE_PREFIX}SourceLocation;
- }
- declare class ${NODE_PREFIX}BlockComment extends ${NODE_PREFIX}Comment {
- type: "BlockComment";
- }
- declare class ${NODE_PREFIX}LineComment extends ${NODE_PREFIX}Comment {
- type: "LineComment";
- }
- declare class ${NODE_PREFIX}SourceLocation {
- start: {
- line: number;
- column: number;
- };
- end: {
- line: number;
- column: number;
- };
- }
- declare class ${NODE_PREFIX} {
- leadingComments?: Array<${NODE_PREFIX}Comment>;
- innerComments?: Array<${NODE_PREFIX}Comment>;
- trailingComments?: Array<${NODE_PREFIX}Comment>;
- start: ?number;
- end: ?number;
- loc: ?${NODE_PREFIX}SourceLocation;
- }\n\n`;
- //
- const lines = [];
- for (const type in t.NODE_FIELDS) {
- const fields = t.NODE_FIELDS[type];
- const struct = ['type: "' + type + '";'];
- const args = [];
- Object.keys(t.NODE_FIELDS[type])
- .sort((fieldA, fieldB) => {
- const indexA = t.BUILDER_KEYS[type].indexOf(fieldA);
- const indexB = t.BUILDER_KEYS[type].indexOf(fieldB);
- if (indexA === indexB) return fieldA < fieldB ? -1 : 1;
- if (indexA === -1) return 1;
- if (indexB === -1) return -1;
- return indexA - indexB;
- })
- .forEach(fieldName => {
- const field = fields[fieldName];
- let suffix = "";
- if (field.optional || field.default != null) suffix += "?";
- let typeAnnotation = "any";
- const validate = field.validate;
- if (validate) {
- typeAnnotation = utils.stringifyValidator(validate, NODE_PREFIX);
- }
- if (typeAnnotation) {
- suffix += ": " + typeAnnotation;
- }
- args.push(t.toBindingIdentifierName(fieldName) + suffix);
- if (t.isValidIdentifier(fieldName)) {
- struct.push(fieldName + suffix + ";");
- }
- });
- code += `declare class ${NODE_PREFIX}${type} extends ${NODE_PREFIX} {
- ${struct.join("\n ").trim()}
- }\n\n`;
- // Flow chokes on super() and import() :/
- if (type !== "Super" && type !== "Import") {
- lines.push(
- `declare function ${utils.toFunctionName(type)}(${args.join(
- ", "
- )}): ${NODE_PREFIX}${type};`
- );
- }
- }
- for (let i = 0; i < t.TYPES.length; i++) {
- let decl = `declare function is${
- t.TYPES[i]
- }(node: Object, opts?: ?Object): boolean`;
- if (t.NODE_FIELDS[t.TYPES[i]]) {
- decl += ` %checks (node instanceof ${NODE_PREFIX}${t.TYPES[i]})`;
- }
- lines.push(decl);
- }
- lines.push(
- `declare function validate(n: BabelNode, key: string, value: mixed): void;`,
- `declare function clone<T>(n: T): T;`,
- `declare function cloneDeep<T>(n: T): T;`,
- `declare function removeProperties<T>(n: T, opts: ?{}): void;`,
- `declare function removePropertiesDeep<T>(n: T, opts: ?{}): T;`,
- `declare type TraversalAncestors = Array<{
- node: BabelNode,
- key: string,
- index?: number,
- }>;
- declare type TraversalHandler<T> = (BabelNode, TraversalAncestors, T) => void;
- declare type TraversalHandlers<T> = {
- enter?: TraversalHandler<T>,
- exit?: TraversalHandler<T>,
- };`.replace(/(^|\n) {2}/g, "$1"),
- // eslint-disable-next-line
- `declare function traverse<T>(n: BabelNode, TraversalHandler<T> | TraversalHandlers<T>, state?: T): void;`
- );
- for (const type in t.FLIPPED_ALIAS_KEYS) {
- const types = t.FLIPPED_ALIAS_KEYS[type];
- code += `type ${NODE_PREFIX}${type} = ${types
- .map(type => `${NODE_PREFIX}${type}`)
- .join(" | ")};\n`;
- }
- code += `\ndeclare module "@babel/types" {
- ${lines
- .join("\n")
- .replace(/\n/g, "\n ")
- .trim()}
- }\n`;
- //
- process.stdout.write(code);
|