ormbridge 0.2.0 → 0.3.0
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.
- package/README.md +119 -68
- package/dist/cliRunner.js +21 -1
- package/dist/cliRunner.js.map +1 -1
- package/dist/config.d.ts +4 -0
- package/dist/config.js +17 -1
- package/dist/config.js.map +1 -1
- package/dist/emitters/gorm.d.ts +38 -0
- package/dist/emitters/gorm.js +1507 -0
- package/dist/emitters/gorm.js.map +1 -0
- package/dist/emitters/typeorm.js +7 -2
- package/dist/emitters/typeorm.js.map +1 -1
- package/dist/formats.d.ts +2 -0
- package/dist/formats.js +26 -0
- package/dist/formats.js.map +1 -1
- package/dist/index.d.ts +4 -0
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/io.js +16 -1
- package/dist/io.js.map +1 -1
- package/dist/parsers/doctrine.js +203 -1
- package/dist/parsers/doctrine.js.map +1 -1
- package/dist/parsers/goSyntax.d.ts +105 -0
- package/dist/parsers/goSyntax.js +435 -0
- package/dist/parsers/goSyntax.js.map +1 -0
- package/dist/parsers/gorm.d.ts +16 -0
- package/dist/parsers/gorm.js +1857 -0
- package/dist/parsers/gorm.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
import Parser from 'web-tree-sitter';
|
|
2
|
+
import { type Result } from '../result.js';
|
|
3
|
+
export type SyntaxNode = Parser.SyntaxNode;
|
|
4
|
+
/** A Go type expression, reduced to the shapes that matter for column and association mapping. */
|
|
5
|
+
export type GoType =
|
|
6
|
+
/** `string`, `Post`, `uuid.UUID`, `sql.Null[string]`. `args` holds generic type arguments. */
|
|
7
|
+
{
|
|
8
|
+
kind: 'name';
|
|
9
|
+
name: string;
|
|
10
|
+
/** Package qualifier exactly as written (`uuid` in `uuid.UUID`). */
|
|
11
|
+
qualifier?: string;
|
|
12
|
+
/** Import path the qualifier resolves to in the declaring file, when it could be found. */
|
|
13
|
+
importPath?: string;
|
|
14
|
+
args: GoType[];
|
|
15
|
+
} | {
|
|
16
|
+
kind: 'pointer';
|
|
17
|
+
elem: GoType;
|
|
18
|
+
} | {
|
|
19
|
+
kind: 'slice';
|
|
20
|
+
elem: GoType;
|
|
21
|
+
} | {
|
|
22
|
+
kind: 'array';
|
|
23
|
+
elem: GoType;
|
|
24
|
+
} | {
|
|
25
|
+
kind: 'map';
|
|
26
|
+
key: GoType;
|
|
27
|
+
value: GoType;
|
|
28
|
+
} | {
|
|
29
|
+
kind: 'struct';
|
|
30
|
+
} | {
|
|
31
|
+
kind: 'other';
|
|
32
|
+
text: string;
|
|
33
|
+
};
|
|
34
|
+
/** One field of a struct. An embedded (anonymous) field has no `name`. */
|
|
35
|
+
export interface GoField {
|
|
36
|
+
name?: string;
|
|
37
|
+
type: GoType;
|
|
38
|
+
/** The struct tag with its quoting removed, for example `gorm:"size:20" json:"name"`. */
|
|
39
|
+
tag?: string;
|
|
40
|
+
}
|
|
41
|
+
export interface GoStruct {
|
|
42
|
+
name: string;
|
|
43
|
+
fields: GoField[];
|
|
44
|
+
/** Path of the file that declares the struct, for messages. */
|
|
45
|
+
path: string;
|
|
46
|
+
}
|
|
47
|
+
/** `type Status string` or `type Money int64`: a named type with a non-struct underlying type. */
|
|
48
|
+
export interface GoNamedType {
|
|
49
|
+
name: string;
|
|
50
|
+
underlying: GoType;
|
|
51
|
+
}
|
|
52
|
+
/** Statically evaluated constant value. */
|
|
53
|
+
export type GoConstValue = {
|
|
54
|
+
kind: 'string';
|
|
55
|
+
value: string;
|
|
56
|
+
} | {
|
|
57
|
+
kind: 'int';
|
|
58
|
+
value: number;
|
|
59
|
+
};
|
|
60
|
+
export interface GoConst {
|
|
61
|
+
name: string;
|
|
62
|
+
/** Declared (or, for implicit repetition, inherited) type name, when it is a plain identifier. */
|
|
63
|
+
typeName?: string;
|
|
64
|
+
/** Absent when the initializer cannot be evaluated statically. */
|
|
65
|
+
value?: GoConstValue;
|
|
66
|
+
}
|
|
67
|
+
/** What a method with a single `return` of a string literal or constant name returns. */
|
|
68
|
+
export type GoStringReturn = {
|
|
69
|
+
kind: 'string';
|
|
70
|
+
value: string;
|
|
71
|
+
} | {
|
|
72
|
+
kind: 'identifier';
|
|
73
|
+
name: string;
|
|
74
|
+
};
|
|
75
|
+
export interface GoMethod {
|
|
76
|
+
/** Receiver type name without the pointer, for example "User". */
|
|
77
|
+
receiver: string;
|
|
78
|
+
name: string;
|
|
79
|
+
/** Set when the body is exactly `return <string literal or identifier>`. */
|
|
80
|
+
returns?: GoStringReturn;
|
|
81
|
+
}
|
|
82
|
+
export interface GoFile {
|
|
83
|
+
path: string;
|
|
84
|
+
structs: GoStruct[];
|
|
85
|
+
namedTypes: GoNamedType[];
|
|
86
|
+
consts: GoConst[];
|
|
87
|
+
methods: GoMethod[];
|
|
88
|
+
/** True when the grammar reported syntax errors in the file. */
|
|
89
|
+
hasErrors: boolean;
|
|
90
|
+
}
|
|
91
|
+
/** Lazily loads the tree-sitter Go grammar (WebAssembly, no native build step). */
|
|
92
|
+
export declare function getGoParser(): Promise<Result<Parser>>;
|
|
93
|
+
/** Decodes a Go string literal (raw or interpreted) into its value. */
|
|
94
|
+
export declare function unquoteGoString(literalText: string): string;
|
|
95
|
+
/**
|
|
96
|
+
* Reads the value of one key from a struct tag the way `reflect.StructTag.Lookup`
|
|
97
|
+
* does: the tag is a space-separated list of `key:"quoted value"` pairs.
|
|
98
|
+
*/
|
|
99
|
+
export declare function lookupStructTag(tag: string, key: string): string | undefined;
|
|
100
|
+
/** The name a Go import gets when it has no alias: the last path element, minus version markers. */
|
|
101
|
+
export declare function defaultImportName(importPath: string): string;
|
|
102
|
+
/** The type as written in source, for messages. */
|
|
103
|
+
export declare function describeGoType(type: GoType): string;
|
|
104
|
+
/** Reads the declarations of one Go file that are relevant to GORM: structs, named types, constants and methods. */
|
|
105
|
+
export declare function readGoFile(root: SyntaxNode, path: string): GoFile;
|
|
@@ -0,0 +1,435 @@
|
|
|
1
|
+
import { createRequire } from 'node:module';
|
|
2
|
+
import Parser from 'web-tree-sitter';
|
|
3
|
+
import { describeThrown, err, ok } from '../result.js';
|
|
4
|
+
let cachedParser;
|
|
5
|
+
/** Lazily loads the tree-sitter Go grammar (WebAssembly, no native build step). */
|
|
6
|
+
export async function getGoParser() {
|
|
7
|
+
if (cachedParser !== undefined) {
|
|
8
|
+
return ok(cachedParser);
|
|
9
|
+
}
|
|
10
|
+
try {
|
|
11
|
+
const requireFromHere = createRequire(import.meta.url);
|
|
12
|
+
const wasmPath = requireFromHere.resolve('tree-sitter-wasms/out/tree-sitter-go.wasm');
|
|
13
|
+
await Parser.init();
|
|
14
|
+
const goLanguage = await Parser.Language.load(wasmPath);
|
|
15
|
+
const parser = new Parser();
|
|
16
|
+
parser.setLanguage(goLanguage);
|
|
17
|
+
cachedParser = parser;
|
|
18
|
+
return ok(parser);
|
|
19
|
+
}
|
|
20
|
+
catch (thrown) {
|
|
21
|
+
return err('PARSER_INIT_FAILED', `Failed to initialize the tree-sitter Go grammar. Check that the "web-tree-sitter" (0.22.x) and ` +
|
|
22
|
+
`"tree-sitter-wasms" packages are installed. Underlying error: ${describeThrown(thrown)}`);
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
// ---------------------------------------------------------------------------
|
|
26
|
+
// Literals and struct tags
|
|
27
|
+
// ---------------------------------------------------------------------------
|
|
28
|
+
/** Decodes a Go string literal (raw or interpreted) into its value. */
|
|
29
|
+
export function unquoteGoString(literalText) {
|
|
30
|
+
if (literalText.startsWith('`')) {
|
|
31
|
+
return literalText.slice(1, -1);
|
|
32
|
+
}
|
|
33
|
+
return literalText
|
|
34
|
+
.slice(1, -1)
|
|
35
|
+
.replace(/\\(n|t|r|\\|"|')/g, (_whole, escaped) => {
|
|
36
|
+
switch (escaped) {
|
|
37
|
+
case 'n':
|
|
38
|
+
return '\n';
|
|
39
|
+
case 't':
|
|
40
|
+
return '\t';
|
|
41
|
+
case 'r':
|
|
42
|
+
return '\r';
|
|
43
|
+
default:
|
|
44
|
+
return escaped;
|
|
45
|
+
}
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Reads the value of one key from a struct tag the way `reflect.StructTag.Lookup`
|
|
50
|
+
* does: the tag is a space-separated list of `key:"quoted value"` pairs.
|
|
51
|
+
*/
|
|
52
|
+
export function lookupStructTag(tag, key) {
|
|
53
|
+
let rest = tag;
|
|
54
|
+
for (;;) {
|
|
55
|
+
rest = rest.replace(/^\s+/, '');
|
|
56
|
+
if (rest === '') {
|
|
57
|
+
return undefined;
|
|
58
|
+
}
|
|
59
|
+
const keyMatch = rest.match(/^([^\s:"]+):"/);
|
|
60
|
+
if (keyMatch === null) {
|
|
61
|
+
return undefined;
|
|
62
|
+
}
|
|
63
|
+
const name = keyMatch[1] ?? '';
|
|
64
|
+
// Find the closing quote, skipping escaped characters.
|
|
65
|
+
let index = keyMatch[0].length;
|
|
66
|
+
while (index < rest.length && rest.charAt(index) !== '"') {
|
|
67
|
+
index += rest.charAt(index) === '\\' ? 2 : 1;
|
|
68
|
+
}
|
|
69
|
+
if (index >= rest.length) {
|
|
70
|
+
return undefined;
|
|
71
|
+
}
|
|
72
|
+
const quoted = rest.slice(name.length + 1, index + 1);
|
|
73
|
+
if (name === key) {
|
|
74
|
+
return unquoteGoString(quoted);
|
|
75
|
+
}
|
|
76
|
+
rest = rest.slice(index + 1);
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
// ---------------------------------------------------------------------------
|
|
80
|
+
// Types
|
|
81
|
+
// ---------------------------------------------------------------------------
|
|
82
|
+
/** The name a Go import gets when it has no alias: the last path element, minus version markers. */
|
|
83
|
+
export function defaultImportName(importPath) {
|
|
84
|
+
const segments = importPath.split('/');
|
|
85
|
+
let last = segments[segments.length - 1] ?? importPath;
|
|
86
|
+
if (/^v\d+$/.test(last) && segments.length > 1) {
|
|
87
|
+
last = segments[segments.length - 2] ?? last;
|
|
88
|
+
}
|
|
89
|
+
return last.replace(/\.v\d+$/, '').replace(/^go[.-]/, '');
|
|
90
|
+
}
|
|
91
|
+
function readImports(root) {
|
|
92
|
+
const imports = new Map();
|
|
93
|
+
for (const spec of root.descendantsOfType('import_spec')) {
|
|
94
|
+
const pathNode = spec.childForFieldName('path');
|
|
95
|
+
if (pathNode === null) {
|
|
96
|
+
continue;
|
|
97
|
+
}
|
|
98
|
+
const importPath = unquoteGoString(pathNode.text);
|
|
99
|
+
const aliasNode = spec.childForFieldName('name');
|
|
100
|
+
const alias = aliasNode === null ? defaultImportName(importPath) : aliasNode.text;
|
|
101
|
+
if (alias !== '.' && alias !== '_') {
|
|
102
|
+
imports.set(alias, importPath);
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
return imports;
|
|
106
|
+
}
|
|
107
|
+
function readType(node, imports) {
|
|
108
|
+
switch (node.type) {
|
|
109
|
+
case 'type_identifier':
|
|
110
|
+
return { kind: 'name', name: node.text, args: [] };
|
|
111
|
+
case 'qualified_type': {
|
|
112
|
+
const qualifier = node.childForFieldName('package')?.text ?? '';
|
|
113
|
+
const importPath = imports.get(qualifier);
|
|
114
|
+
return {
|
|
115
|
+
kind: 'name',
|
|
116
|
+
name: node.childForFieldName('name')?.text ?? node.text,
|
|
117
|
+
qualifier,
|
|
118
|
+
...(importPath === undefined ? {} : { importPath }),
|
|
119
|
+
args: [],
|
|
120
|
+
};
|
|
121
|
+
}
|
|
122
|
+
case 'generic_type': {
|
|
123
|
+
const base = node.childForFieldName('type');
|
|
124
|
+
const argumentsNode = node.childForFieldName('type_arguments');
|
|
125
|
+
if (base === null) {
|
|
126
|
+
return { kind: 'other', text: node.text };
|
|
127
|
+
}
|
|
128
|
+
const baseType = readType(base, imports);
|
|
129
|
+
if (baseType.kind !== 'name') {
|
|
130
|
+
return { kind: 'other', text: node.text };
|
|
131
|
+
}
|
|
132
|
+
const args = argumentsNode === null
|
|
133
|
+
? []
|
|
134
|
+
: argumentsNode.namedChildren.map((argument) => readType(argument, imports));
|
|
135
|
+
return { ...baseType, args };
|
|
136
|
+
}
|
|
137
|
+
case 'type_elem': {
|
|
138
|
+
const inner = node.namedChildren[0];
|
|
139
|
+
return inner === undefined
|
|
140
|
+
? { kind: 'other', text: node.text }
|
|
141
|
+
: readType(inner, imports);
|
|
142
|
+
}
|
|
143
|
+
case 'pointer_type': {
|
|
144
|
+
const inner = node.namedChildren[0];
|
|
145
|
+
return inner === undefined
|
|
146
|
+
? { kind: 'other', text: node.text }
|
|
147
|
+
: { kind: 'pointer', elem: readType(inner, imports) };
|
|
148
|
+
}
|
|
149
|
+
case 'parenthesized_type': {
|
|
150
|
+
const inner = node.namedChildren[0];
|
|
151
|
+
return inner === undefined
|
|
152
|
+
? { kind: 'other', text: node.text }
|
|
153
|
+
: readType(inner, imports);
|
|
154
|
+
}
|
|
155
|
+
case 'slice_type':
|
|
156
|
+
case 'array_type':
|
|
157
|
+
case 'implicit_length_array_type': {
|
|
158
|
+
const element = node.childForFieldName('element');
|
|
159
|
+
return element === null
|
|
160
|
+
? { kind: 'other', text: node.text }
|
|
161
|
+
: {
|
|
162
|
+
kind: node.type === 'slice_type' ? 'slice' : 'array',
|
|
163
|
+
elem: readType(element, imports),
|
|
164
|
+
};
|
|
165
|
+
}
|
|
166
|
+
case 'map_type': {
|
|
167
|
+
const key = node.childForFieldName('key');
|
|
168
|
+
const value = node.childForFieldName('value');
|
|
169
|
+
return key === null || value === null
|
|
170
|
+
? { kind: 'other', text: node.text }
|
|
171
|
+
: {
|
|
172
|
+
kind: 'map',
|
|
173
|
+
key: readType(key, imports),
|
|
174
|
+
value: readType(value, imports),
|
|
175
|
+
};
|
|
176
|
+
}
|
|
177
|
+
case 'struct_type':
|
|
178
|
+
return { kind: 'struct' };
|
|
179
|
+
default:
|
|
180
|
+
return { kind: 'other', text: node.text };
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
/** The type as written in source, for messages. */
|
|
184
|
+
export function describeGoType(type) {
|
|
185
|
+
switch (type.kind) {
|
|
186
|
+
case 'name': {
|
|
187
|
+
const qualified = type.qualifier === undefined || type.qualifier === ''
|
|
188
|
+
? type.name
|
|
189
|
+
: `${type.qualifier}.${type.name}`;
|
|
190
|
+
return type.args.length === 0
|
|
191
|
+
? qualified
|
|
192
|
+
: `${qualified}[${type.args.map(describeGoType).join(', ')}]`;
|
|
193
|
+
}
|
|
194
|
+
case 'pointer':
|
|
195
|
+
return `*${describeGoType(type.elem)}`;
|
|
196
|
+
case 'slice':
|
|
197
|
+
return `[]${describeGoType(type.elem)}`;
|
|
198
|
+
case 'array':
|
|
199
|
+
return `[...]${describeGoType(type.elem)}`;
|
|
200
|
+
case 'map':
|
|
201
|
+
return `map[${describeGoType(type.key)}]${describeGoType(type.value)}`;
|
|
202
|
+
case 'struct':
|
|
203
|
+
return 'struct{...}';
|
|
204
|
+
default:
|
|
205
|
+
return type.text;
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
// ---------------------------------------------------------------------------
|
|
209
|
+
// Declarations
|
|
210
|
+
// ---------------------------------------------------------------------------
|
|
211
|
+
function readStructFields(body, imports) {
|
|
212
|
+
const fields = [];
|
|
213
|
+
const list = body.namedChildren.find((child) => child.type === 'field_declaration_list');
|
|
214
|
+
for (const declaration of list?.namedChildren ?? []) {
|
|
215
|
+
if (declaration.type !== 'field_declaration') {
|
|
216
|
+
continue;
|
|
217
|
+
}
|
|
218
|
+
const typeNode = declaration.childForFieldName('type');
|
|
219
|
+
if (typeNode === null) {
|
|
220
|
+
continue;
|
|
221
|
+
}
|
|
222
|
+
let type = readType(typeNode, imports);
|
|
223
|
+
const tagNode = declaration.childForFieldName('tag');
|
|
224
|
+
const tag = tagNode === null ? undefined : unquoteGoString(tagNode.text);
|
|
225
|
+
const names = declaration.childrenForFieldName('name');
|
|
226
|
+
if (names.length === 0) {
|
|
227
|
+
// Embedded field: `Base`, `*Base` or `gorm.Model`. The pointer is a token, not part of the type node.
|
|
228
|
+
if (declaration.children[0]?.type === '*') {
|
|
229
|
+
type = { kind: 'pointer', elem: type };
|
|
230
|
+
}
|
|
231
|
+
fields.push({ type, ...(tag === undefined ? {} : { tag }) });
|
|
232
|
+
continue;
|
|
233
|
+
}
|
|
234
|
+
for (const name of names) {
|
|
235
|
+
fields.push({
|
|
236
|
+
name: name.text,
|
|
237
|
+
type,
|
|
238
|
+
...(tag === undefined ? {} : { tag }),
|
|
239
|
+
});
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
return fields;
|
|
243
|
+
}
|
|
244
|
+
/** The type name of a method receiver: `u *User` and `User` both give "User". */
|
|
245
|
+
function receiverName(method, imports) {
|
|
246
|
+
const receiver = method.childForFieldName('receiver');
|
|
247
|
+
const typeNode = receiver?.namedChildren[0]?.childForFieldName('type');
|
|
248
|
+
if (typeNode === null || typeNode === undefined) {
|
|
249
|
+
return undefined;
|
|
250
|
+
}
|
|
251
|
+
let type = readType(typeNode, imports);
|
|
252
|
+
if (type.kind === 'pointer') {
|
|
253
|
+
type = type.elem;
|
|
254
|
+
}
|
|
255
|
+
return type.kind === 'name' ? type.name : undefined;
|
|
256
|
+
}
|
|
257
|
+
function readMethod(node, imports) {
|
|
258
|
+
const name = node.childForFieldName('name')?.text;
|
|
259
|
+
const receiver = receiverName(node, imports);
|
|
260
|
+
if (name === undefined || receiver === undefined) {
|
|
261
|
+
return undefined;
|
|
262
|
+
}
|
|
263
|
+
const method = { receiver, name };
|
|
264
|
+
const statements = node.childForFieldName('body')?.namedChildren ?? [];
|
|
265
|
+
const only = statements[0];
|
|
266
|
+
if (statements.length === 1 && only?.type === 'return_statement') {
|
|
267
|
+
const values = only.namedChildren[0]?.namedChildren ?? [];
|
|
268
|
+
const value = values[0];
|
|
269
|
+
if (values.length === 1 && value !== undefined) {
|
|
270
|
+
if (value.type === 'interpreted_string_literal' ||
|
|
271
|
+
value.type === 'raw_string_literal') {
|
|
272
|
+
method.returns = { kind: 'string', value: unquoteGoString(value.text) };
|
|
273
|
+
}
|
|
274
|
+
else if (value.type === 'identifier') {
|
|
275
|
+
method.returns = { kind: 'identifier', name: value.text };
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
return method;
|
|
280
|
+
}
|
|
281
|
+
/** Evaluates the small subset of constant expressions that enum definitions use. */
|
|
282
|
+
function evaluateConst(node, iota) {
|
|
283
|
+
switch (node.type) {
|
|
284
|
+
case 'interpreted_string_literal':
|
|
285
|
+
case 'raw_string_literal':
|
|
286
|
+
return { kind: 'string', value: unquoteGoString(node.text) };
|
|
287
|
+
case 'int_literal': {
|
|
288
|
+
const text = node.text.replace(/_/g, '');
|
|
289
|
+
const parsed = /^0[0-7]+$/.test(text)
|
|
290
|
+
? parseInt(text, 8)
|
|
291
|
+
: Number(text);
|
|
292
|
+
return Number.isNaN(parsed) ? undefined : { kind: 'int', value: parsed };
|
|
293
|
+
}
|
|
294
|
+
case 'iota':
|
|
295
|
+
return { kind: 'int', value: iota };
|
|
296
|
+
case 'parenthesized_expression': {
|
|
297
|
+
const inner = node.namedChildren[0];
|
|
298
|
+
return inner === undefined ? undefined : evaluateConst(inner, iota);
|
|
299
|
+
}
|
|
300
|
+
case 'unary_expression': {
|
|
301
|
+
const operand = node.childForFieldName('operand');
|
|
302
|
+
const value = operand === null ? undefined : evaluateConst(operand, iota);
|
|
303
|
+
if (value?.kind !== 'int') {
|
|
304
|
+
return value;
|
|
305
|
+
}
|
|
306
|
+
return node.text.startsWith('-')
|
|
307
|
+
? { kind: 'int', value: -value.value }
|
|
308
|
+
: value;
|
|
309
|
+
}
|
|
310
|
+
case 'call_expression': {
|
|
311
|
+
// A conversion such as `Status("draft")`: the value is the argument.
|
|
312
|
+
const argument = node.childForFieldName('arguments')?.namedChildren[0];
|
|
313
|
+
return argument === undefined ? undefined : evaluateConst(argument, iota);
|
|
314
|
+
}
|
|
315
|
+
case 'binary_expression': {
|
|
316
|
+
const left = node.childForFieldName('left');
|
|
317
|
+
const right = node.childForFieldName('right');
|
|
318
|
+
const operator = node.childForFieldName('operator')?.text;
|
|
319
|
+
const leftValue = left === null ? undefined : evaluateConst(left, iota);
|
|
320
|
+
const rightValue = right === null ? undefined : evaluateConst(right, iota);
|
|
321
|
+
if (leftValue?.kind === 'int' && rightValue?.kind === 'int') {
|
|
322
|
+
const a = leftValue.value;
|
|
323
|
+
const b = rightValue.value;
|
|
324
|
+
switch (operator) {
|
|
325
|
+
case '+':
|
|
326
|
+
return { kind: 'int', value: a + b };
|
|
327
|
+
case '-':
|
|
328
|
+
return { kind: 'int', value: a - b };
|
|
329
|
+
case '*':
|
|
330
|
+
return { kind: 'int', value: a * b };
|
|
331
|
+
case '<<':
|
|
332
|
+
return { kind: 'int', value: a * 2 ** b };
|
|
333
|
+
case '>>':
|
|
334
|
+
return { kind: 'int', value: Math.floor(a / 2 ** b) };
|
|
335
|
+
default:
|
|
336
|
+
return undefined;
|
|
337
|
+
}
|
|
338
|
+
}
|
|
339
|
+
if (operator === '+' &&
|
|
340
|
+
leftValue?.kind === 'string' &&
|
|
341
|
+
rightValue?.kind === 'string') {
|
|
342
|
+
return { kind: 'string', value: leftValue.value + rightValue.value };
|
|
343
|
+
}
|
|
344
|
+
return undefined;
|
|
345
|
+
}
|
|
346
|
+
default:
|
|
347
|
+
return undefined;
|
|
348
|
+
}
|
|
349
|
+
}
|
|
350
|
+
/** Reads one `const (...)` block, repeating the previous initializer and type for bare names like Go does. */
|
|
351
|
+
function readConstDeclaration(node) {
|
|
352
|
+
const consts = [];
|
|
353
|
+
let inheritedType;
|
|
354
|
+
let inheritedValues = [];
|
|
355
|
+
let iota = 0;
|
|
356
|
+
for (const spec of node.namedChildren) {
|
|
357
|
+
if (spec.type !== 'const_spec') {
|
|
358
|
+
continue;
|
|
359
|
+
}
|
|
360
|
+
const names = spec.childrenForFieldName('name');
|
|
361
|
+
const typeNode = spec.childForFieldName('type');
|
|
362
|
+
const valueList = spec.childForFieldName('value');
|
|
363
|
+
if (valueList !== null) {
|
|
364
|
+
inheritedValues = valueList.namedChildren;
|
|
365
|
+
inheritedType = typeNode?.text;
|
|
366
|
+
}
|
|
367
|
+
else if (typeNode !== null) {
|
|
368
|
+
inheritedType = typeNode.text;
|
|
369
|
+
}
|
|
370
|
+
names.forEach((nameNode, index) => {
|
|
371
|
+
const valueNode = inheritedValues[index];
|
|
372
|
+
const value = valueNode === undefined ? undefined : evaluateConst(valueNode, iota);
|
|
373
|
+
consts.push({
|
|
374
|
+
name: nameNode.text,
|
|
375
|
+
...(inheritedType === undefined ? {} : { typeName: inheritedType }),
|
|
376
|
+
...(value === undefined ? {} : { value }),
|
|
377
|
+
});
|
|
378
|
+
});
|
|
379
|
+
iota += 1;
|
|
380
|
+
}
|
|
381
|
+
return consts;
|
|
382
|
+
}
|
|
383
|
+
/** Reads the declarations of one Go file that are relevant to GORM: structs, named types, constants and methods. */
|
|
384
|
+
export function readGoFile(root, path) {
|
|
385
|
+
const imports = readImports(root);
|
|
386
|
+
const file = {
|
|
387
|
+
path,
|
|
388
|
+
structs: [],
|
|
389
|
+
namedTypes: [],
|
|
390
|
+
consts: [],
|
|
391
|
+
methods: [],
|
|
392
|
+
hasErrors: root.hasError,
|
|
393
|
+
};
|
|
394
|
+
for (const node of root.namedChildren) {
|
|
395
|
+
if (node.type === 'type_declaration') {
|
|
396
|
+
for (const spec of node.namedChildren) {
|
|
397
|
+
if (spec.type !== 'type_spec' && spec.type !== 'type_alias') {
|
|
398
|
+
continue;
|
|
399
|
+
}
|
|
400
|
+
const name = spec.childForFieldName('name')?.text;
|
|
401
|
+
const typeNode = spec.childForFieldName('type');
|
|
402
|
+
// Generic type declarations cannot be mapped to a single table.
|
|
403
|
+
if (name === undefined ||
|
|
404
|
+
typeNode === null ||
|
|
405
|
+
spec.childForFieldName('type_parameters') !== null) {
|
|
406
|
+
continue;
|
|
407
|
+
}
|
|
408
|
+
if (typeNode.type === 'struct_type') {
|
|
409
|
+
file.structs.push({
|
|
410
|
+
name,
|
|
411
|
+
fields: readStructFields(typeNode, imports),
|
|
412
|
+
path,
|
|
413
|
+
});
|
|
414
|
+
}
|
|
415
|
+
else {
|
|
416
|
+
file.namedTypes.push({
|
|
417
|
+
name,
|
|
418
|
+
underlying: readType(typeNode, imports),
|
|
419
|
+
});
|
|
420
|
+
}
|
|
421
|
+
}
|
|
422
|
+
}
|
|
423
|
+
else if (node.type === 'const_declaration') {
|
|
424
|
+
file.consts.push(...readConstDeclaration(node));
|
|
425
|
+
}
|
|
426
|
+
else if (node.type === 'method_declaration') {
|
|
427
|
+
const method = readMethod(node, imports);
|
|
428
|
+
if (method !== undefined) {
|
|
429
|
+
file.methods.push(method);
|
|
430
|
+
}
|
|
431
|
+
}
|
|
432
|
+
}
|
|
433
|
+
return file;
|
|
434
|
+
}
|
|
435
|
+
//# sourceMappingURL=goSyntax.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"goSyntax.js","sourceRoot":"","sources":["../../src/parsers/goSyntax.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { IrSchema } from '../ir.js';
|
|
2
|
+
import { type Result } from '../result.js';
|
|
3
|
+
export interface GormSourceFile {
|
|
4
|
+
path: string;
|
|
5
|
+
text: string;
|
|
6
|
+
}
|
|
7
|
+
export interface GormParseOptions {
|
|
8
|
+
/** App label stored on each model (GORM itself has no equivalent). */
|
|
9
|
+
appLabel: string;
|
|
10
|
+
}
|
|
11
|
+
/** GORM's default column name for a Go field name: `PublicID` becomes `public_id`. */
|
|
12
|
+
export declare function gormColumnName(goName: string): string;
|
|
13
|
+
/** GORM's default table name for a struct: `PostTag` becomes `post_tags`. */
|
|
14
|
+
export declare function gormTableName(structName: string): string;
|
|
15
|
+
/** Parses GORM model structs (Go source with `gorm:"..."` tags) into the shared IR using tree-sitter. */
|
|
16
|
+
export declare function parseGorm(sources: GormSourceFile[], options: GormParseOptions): Promise<Result<IrSchema>>;
|