@jetstart/core 1.6.0 → 2.0.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.
Files changed (40) hide show
  1. package/README.md +189 -74
  2. package/dist/build/dex-generator.d.ts +27 -0
  3. package/dist/build/dex-generator.js +202 -0
  4. package/dist/build/dsl-parser.d.ts +3 -30
  5. package/dist/build/dsl-parser.js +67 -240
  6. package/dist/build/dsl-types.d.ts +8 -0
  7. package/dist/build/gradle.d.ts +51 -0
  8. package/dist/build/gradle.js +233 -1
  9. package/dist/build/hot-reload-service.d.ts +36 -0
  10. package/dist/build/hot-reload-service.js +179 -0
  11. package/dist/build/js-compiler-service.d.ts +61 -0
  12. package/dist/build/js-compiler-service.js +421 -0
  13. package/dist/build/kotlin-compiler.d.ts +54 -0
  14. package/dist/build/kotlin-compiler.js +450 -0
  15. package/dist/build/kotlin-parser.d.ts +91 -0
  16. package/dist/build/kotlin-parser.js +1030 -0
  17. package/dist/build/override-generator.d.ts +54 -0
  18. package/dist/build/override-generator.js +430 -0
  19. package/dist/server/index.d.ts +16 -1
  20. package/dist/server/index.js +147 -42
  21. package/dist/websocket/handler.d.ts +20 -4
  22. package/dist/websocket/handler.js +73 -38
  23. package/dist/websocket/index.d.ts +8 -0
  24. package/dist/websocket/index.js +15 -11
  25. package/dist/websocket/manager.d.ts +2 -2
  26. package/dist/websocket/manager.js +1 -1
  27. package/package.json +3 -3
  28. package/src/build/dex-generator.ts +197 -0
  29. package/src/build/dsl-parser.ts +73 -272
  30. package/src/build/dsl-types.ts +9 -0
  31. package/src/build/gradle.ts +259 -1
  32. package/src/build/hot-reload-service.ts +178 -0
  33. package/src/build/js-compiler-service.ts +411 -0
  34. package/src/build/kotlin-compiler.ts +460 -0
  35. package/src/build/kotlin-parser.ts +1043 -0
  36. package/src/build/override-generator.ts +478 -0
  37. package/src/server/index.ts +162 -54
  38. package/src/websocket/handler.ts +94 -56
  39. package/src/websocket/index.ts +27 -14
  40. package/src/websocket/manager.ts +2 -2
@@ -0,0 +1,450 @@
1
+ "use strict";
2
+ /**
3
+ * Kotlin Compiler Service
4
+ * Compiles Kotlin files to .class files for hot reload
5
+ */
6
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
7
+ if (k2 === undefined) k2 = k;
8
+ var desc = Object.getOwnPropertyDescriptor(m, k);
9
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
10
+ desc = { enumerable: true, get: function() { return m[k]; } };
11
+ }
12
+ Object.defineProperty(o, k2, desc);
13
+ }) : (function(o, m, k, k2) {
14
+ if (k2 === undefined) k2 = k;
15
+ o[k2] = m[k];
16
+ }));
17
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
18
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
19
+ }) : function(o, v) {
20
+ o["default"] = v;
21
+ });
22
+ var __importStar = (this && this.__importStar) || (function () {
23
+ var ownKeys = function(o) {
24
+ ownKeys = Object.getOwnPropertyNames || function (o) {
25
+ var ar = [];
26
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
27
+ return ar;
28
+ };
29
+ return ownKeys(o);
30
+ };
31
+ return function (mod) {
32
+ if (mod && mod.__esModule) return mod;
33
+ var result = {};
34
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
35
+ __setModuleDefault(result, mod);
36
+ return result;
37
+ };
38
+ })();
39
+ Object.defineProperty(exports, "__esModule", { value: true });
40
+ exports.KotlinCompiler = void 0;
41
+ const fs = __importStar(require("fs"));
42
+ const path = __importStar(require("path"));
43
+ const os = __importStar(require("os"));
44
+ const child_process_1 = require("child_process");
45
+ const logger_1 = require("../utils/logger");
46
+ class KotlinCompiler {
47
+ projectPath;
48
+ static TAG = 'KotlinCompiler';
49
+ kotlincPath = null;
50
+ composeCompilerPath = null;
51
+ staticClasspath = []; // SDK + deps cached; project classes always fresh
52
+ constructor(projectPath) {
53
+ this.projectPath = projectPath;
54
+ }
55
+ /**
56
+ * Find Compose compiler plugin JAR
57
+ * For Kotlin 2.0+, the Compose compiler is bundled with kotlinc
58
+ */
59
+ async findComposeCompiler() {
60
+ if (this.composeCompilerPath)
61
+ return this.composeCompilerPath;
62
+ // First check if kotlinc has a bundled Compose compiler (Kotlin 2.0+)
63
+ const kotlincPath = await this.findKotlinc();
64
+ if (kotlincPath) {
65
+ const kotlincDir = path.dirname(path.dirname(kotlincPath)); // Go up from bin/kotlinc
66
+ const bundledComposePlugin = path.join(kotlincDir, 'lib', 'compose-compiler-plugin.jar');
67
+ if (fs.existsSync(bundledComposePlugin)) {
68
+ this.composeCompilerPath = bundledComposePlugin;
69
+ (0, logger_1.log)(`Found bundled Compose compiler (Kotlin 2.0+)`);
70
+ return this.composeCompilerPath;
71
+ }
72
+ }
73
+ // Fallback to Gradle cache for older Kotlin versions
74
+ const gradleCache = path.join(os.homedir(), '.gradle', 'caches', 'modules-2', 'files-2.1');
75
+ const composeCompilerDir = path.join(gradleCache, 'androidx.compose.compiler', 'compiler');
76
+ if (!fs.existsSync(composeCompilerDir)) {
77
+ (0, logger_1.log)('Compose compiler not found');
78
+ return null;
79
+ }
80
+ // Find latest version
81
+ const versions = fs.readdirSync(composeCompilerDir)
82
+ .filter(v => fs.statSync(path.join(composeCompilerDir, v)).isDirectory())
83
+ .sort().reverse();
84
+ for (const version of versions) {
85
+ const versionDir = path.join(composeCompilerDir, version);
86
+ const hashes = fs.readdirSync(versionDir);
87
+ for (const hash of hashes) {
88
+ const hashDir = path.join(versionDir, hash);
89
+ if (!fs.statSync(hashDir).isDirectory())
90
+ continue;
91
+ const files = fs.readdirSync(hashDir);
92
+ for (const file of files) {
93
+ if (file.endsWith('.jar') && !file.endsWith('-sources.jar')) {
94
+ this.composeCompilerPath = path.join(hashDir, file);
95
+ (0, logger_1.log)(`Found Compose compiler: ${version}`);
96
+ return this.composeCompilerPath;
97
+ }
98
+ }
99
+ }
100
+ }
101
+ return null;
102
+ }
103
+ /**
104
+ * Find kotlinc executable
105
+ */
106
+ async findKotlinc() {
107
+ if (this.kotlincPath)
108
+ return this.kotlincPath;
109
+ // Check common locations
110
+ const locations = [
111
+ // From environment variable
112
+ process.env.KOTLIN_HOME ? path.join(process.env.KOTLIN_HOME, 'bin', 'kotlinc') : null,
113
+ // From Android Studio
114
+ process.env.ANDROID_STUDIO_HOME ? path.join(process.env.ANDROID_STUDIO_HOME, 'plugins', 'Kotlin', 'kotlinc', 'bin', 'kotlinc') : null,
115
+ // System-wide installation (Windows)
116
+ 'C:\\Program Files\\kotlinc\\bin\\kotlinc.bat',
117
+ 'C:\\kotlinc\\bin\\kotlinc.bat',
118
+ // System-wide installation (Unix)
119
+ '/usr/local/bin/kotlinc',
120
+ '/usr/bin/kotlinc',
121
+ // Homebrew (macOS)
122
+ '/opt/homebrew/bin/kotlinc',
123
+ ].filter(Boolean);
124
+ for (const loc of locations) {
125
+ const execPath = os.platform() === 'win32' && !loc.endsWith('.bat') ? `${loc}.bat` : loc;
126
+ if (fs.existsSync(execPath)) {
127
+ this.kotlincPath = execPath;
128
+ (0, logger_1.log)(`Found kotlinc at: ${execPath}`);
129
+ return execPath;
130
+ }
131
+ }
132
+ // Try to find via 'where' (Windows) or 'which' (Unix)
133
+ try {
134
+ const cmd = os.platform() === 'win32' ? 'where' : 'which';
135
+ const result = await this.runCommand(cmd, ['kotlinc']);
136
+ if (result.success && result.stdout.trim()) {
137
+ this.kotlincPath = result.stdout.trim().split('\n')[0];
138
+ (0, logger_1.log)(`Found kotlinc via ${cmd}: ${this.kotlincPath}`);
139
+ return this.kotlincPath;
140
+ }
141
+ }
142
+ catch (e) {
143
+ // Ignore
144
+ }
145
+ (0, logger_1.error)('kotlinc not found. Please install Kotlin or set KOTLIN_HOME');
146
+ return null;
147
+ }
148
+ /**
149
+ * Build the classpath for compilation
150
+ * This needs to include Android SDK, Compose, and project dependencies
151
+ */
152
+ async buildClasspath() {
153
+ if (this.staticClasspath.length > 0) {
154
+ return [...this.staticClasspath, ...this.getProjectClasspathEntries()];
155
+ }
156
+ const classpath = [];
157
+ // Check multiple locations for Android SDK
158
+ let androidHome = process.env.ANDROID_HOME || process.env.ANDROID_SDK_ROOT;
159
+ // Fallback to common Windows locations
160
+ if (!androidHome) {
161
+ const commonLocations = [
162
+ 'C:\\Android',
163
+ path.join(os.homedir(), 'AppData', 'Local', 'Android', 'Sdk'),
164
+ 'C:\\Users\\Public\\Android\\Sdk',
165
+ ];
166
+ for (const loc of commonLocations) {
167
+ if (fs.existsSync(path.join(loc, 'platforms'))) {
168
+ androidHome = loc;
169
+ (0, logger_1.log)(`Found Android SDK at: ${loc}`);
170
+ break;
171
+ }
172
+ }
173
+ }
174
+ if (!androidHome) {
175
+ (0, logger_1.error)('ANDROID_HOME or ANDROID_SDK_ROOT not set');
176
+ return classpath;
177
+ }
178
+ // Find android.jar
179
+ const platformsDir = path.join(androidHome, 'platforms');
180
+ if (fs.existsSync(platformsDir)) {
181
+ const platforms = fs.readdirSync(platformsDir)
182
+ .filter(d => d.startsWith('android-'))
183
+ .sort((a, b) => {
184
+ const aNum = parseInt(a.replace('android-', ''));
185
+ const bNum = parseInt(b.replace('android-', ''));
186
+ return bNum - aNum;
187
+ });
188
+ if (platforms.length > 0) {
189
+ const androidJar = path.join(platformsDir, platforms[0], 'android.jar');
190
+ if (fs.existsSync(androidJar)) {
191
+ classpath.push(androidJar);
192
+ (0, logger_1.log)(`Using Android SDK: ${platforms[0]}`);
193
+ }
194
+ }
195
+ }
196
+ // Add ALL Gradle cached dependencies (Compose, AndroidX, Kotlin, etc.)
197
+ const gradleCache = path.join(os.homedir(), '.gradle', 'caches', 'modules-2', 'files-2.1');
198
+ if (fs.existsSync(gradleCache)) {
199
+ // Scan for all required dependency groups
200
+ const requiredGroups = [
201
+ 'androidx.compose.runtime',
202
+ 'androidx.compose.ui',
203
+ 'androidx.compose.foundation',
204
+ 'androidx.compose.material3',
205
+ 'androidx.compose.material',
206
+ 'androidx.compose.animation',
207
+ 'androidx.annotation',
208
+ 'androidx.core',
209
+ 'androidx.activity',
210
+ 'androidx.lifecycle',
211
+ 'androidx.savedstate',
212
+ 'androidx.collection',
213
+ 'org.jetbrains.kotlin',
214
+ 'org.jetbrains.kotlinx',
215
+ 'org.jetbrains.annotations',
216
+ ];
217
+ for (const group of requiredGroups) {
218
+ const groupDir = path.join(gradleCache, group);
219
+ if (fs.existsSync(groupDir)) {
220
+ // Get all artifacts in this group
221
+ const artifacts = fs.readdirSync(groupDir);
222
+ for (const artifact of artifacts) {
223
+ const artifactDir = path.join(groupDir, artifact);
224
+ if (!fs.statSync(artifactDir).isDirectory())
225
+ continue;
226
+ // Find latest version
227
+ const versions = fs.readdirSync(artifactDir)
228
+ .filter(v => fs.statSync(path.join(artifactDir, v)).isDirectory())
229
+ .sort().reverse();
230
+ if (versions.length > 0) {
231
+ const versionDir = path.join(artifactDir, versions[0]);
232
+ const hashes = fs.readdirSync(versionDir);
233
+ for (const hash of hashes) {
234
+ const hashDir = path.join(versionDir, hash);
235
+ if (!fs.statSync(hashDir).isDirectory())
236
+ continue;
237
+ const files = fs.readdirSync(hashDir);
238
+ // Add all JARs (not sources or javadoc)
239
+ for (const file of files) {
240
+ if (file.endsWith('.jar') &&
241
+ !file.endsWith('-sources.jar') &&
242
+ !file.endsWith('-javadoc.jar')) {
243
+ classpath.push(path.join(hashDir, file));
244
+ }
245
+ }
246
+ }
247
+ }
248
+ }
249
+ }
250
+ }
251
+ }
252
+ // Scan transforms-3 cache - grab ALL classes.jar (Compose, Material3, Room, DivKit, etc.)
253
+ const transformsCache = path.join(os.homedir(), '.gradle', 'caches', 'transforms-3');
254
+ if (fs.existsSync(transformsCache)) {
255
+ try {
256
+ for (const hash of fs.readdirSync(transformsCache)) {
257
+ const transformedDir = path.join(transformsCache, hash, 'transformed');
258
+ if (!fs.existsSync(transformedDir))
259
+ continue;
260
+ try {
261
+ for (const pkg of fs.readdirSync(transformedDir)) {
262
+ const classesJar = path.join(transformedDir, pkg, 'jars', 'classes.jar');
263
+ if (fs.existsSync(classesJar) && !classpath.includes(classesJar)) {
264
+ classpath.push(classesJar);
265
+ }
266
+ }
267
+ }
268
+ catch (e) { /* ignore */ }
269
+ }
270
+ (0, logger_1.log)(`Added ${classpath.length} transforms-3 JARs to classpath`);
271
+ }
272
+ catch (e) { /* ignore */ }
273
+ }
274
+ // Cache static entries; project build outputs always fetched fresh
275
+ this.staticClasspath = [...classpath];
276
+ const projectEntries = this.getProjectClasspathEntries();
277
+ (0, logger_1.log)(`Built static classpath with ${classpath.length} entries + ${projectEntries.length} project entries`);
278
+ return [...classpath, ...projectEntries];
279
+ }
280
+ /**
281
+ * Get project build output classpath entries.
282
+ * Always called fresh ΓÇö never cached ΓÇö so new class files from Gradle builds are always visible.
283
+ */
284
+ getProjectClasspathEntries() {
285
+ const entries = [];
286
+ const candidates = [
287
+ path.join(this.projectPath, 'app', 'build', 'tmp', 'kotlin-classes', 'debug'),
288
+ path.join(this.projectPath, 'app', 'build', 'intermediates', 'javac', 'debug', 'classes'),
289
+ path.join(this.projectPath, 'app', 'build', 'intermediates', 'compile_and_runtime_not_namespaced_r_class_jar', 'debug', 'R.jar'),
290
+ path.join(this.projectPath, 'app', 'build', 'intermediates', 'classes', 'debug', 'transformDebugClassesWithAsm', 'jars', '0.jar'),
291
+ ];
292
+ for (const c of candidates) {
293
+ if (fs.existsSync(c))
294
+ entries.push(c);
295
+ }
296
+ return entries;
297
+ }
298
+ /**
299
+ * Recursively find JAR files in a directory up to maxDepth
300
+ */
301
+ findJarsRecursive(dir, classpath, maxDepth, currentDepth = 0) {
302
+ if (currentDepth > maxDepth || !fs.existsSync(dir))
303
+ return;
304
+ try {
305
+ const entries = fs.readdirSync(dir, { withFileTypes: true });
306
+ for (const entry of entries) {
307
+ const fullPath = path.join(dir, entry.name);
308
+ if (entry.isDirectory()) {
309
+ this.findJarsRecursive(fullPath, classpath, maxDepth, currentDepth + 1);
310
+ }
311
+ else if (entry.name.endsWith('.jar') && !classpath.includes(fullPath)) {
312
+ classpath.push(fullPath);
313
+ }
314
+ }
315
+ }
316
+ catch (e) {
317
+ // Ignore permission errors
318
+ }
319
+ }
320
+ /**
321
+ * Compile a single Kotlin file
322
+ */
323
+ async compileFile(filePath) {
324
+ const kotlinc = await this.findKotlinc();
325
+ if (!kotlinc) {
326
+ return {
327
+ success: false,
328
+ classFiles: [],
329
+ errors: ['kotlinc not found'],
330
+ outputDir: ''
331
+ };
332
+ }
333
+ const classpath = await this.buildClasspath();
334
+ if (classpath.length === 0) {
335
+ return {
336
+ success: false,
337
+ classFiles: [],
338
+ errors: ['Failed to build classpath - Android SDK not found'],
339
+ outputDir: ''
340
+ };
341
+ }
342
+ // Create temp output directory
343
+ const outputDir = path.join(os.tmpdir(), 'jetstart-compile', Date.now().toString());
344
+ fs.mkdirSync(outputDir, { recursive: true });
345
+ (0, logger_1.log)(`Compiling ${path.basename(filePath)}...`);
346
+ // Find Compose compiler plugin for @Composable support
347
+ const composeCompiler = await this.findComposeCompiler();
348
+ // On Windows, command line can be too long with many classpath entries
349
+ // Use an argument file (@argfile) to avoid this limitation
350
+ const classpathStr = classpath.join(os.platform() === 'win32' ? ';' : ':');
351
+ const argLines = [
352
+ `-d`,
353
+ outputDir,
354
+ `-classpath`,
355
+ classpathStr,
356
+ `-jvm-target`,
357
+ `17`,
358
+ `-Xskip-prerelease-check`,
359
+ `-Xno-call-assertions`,
360
+ `-Xno-param-assertions`,
361
+ ];
362
+ // Add Compose compiler plugin if found
363
+ if (composeCompiler) {
364
+ argLines.push(`-Xplugin=${composeCompiler}`);
365
+ (0, logger_1.log)(`Using Compose compiler plugin`);
366
+ }
367
+ argLines.push(filePath);
368
+ const argFileContent = argLines.join('\n');
369
+ const argFilePath = path.join(outputDir, 'kotlinc-args.txt');
370
+ fs.writeFileSync(argFilePath, argFileContent);
371
+ (0, logger_1.log)(`Using argument file: ${argFilePath}`);
372
+ // Build kotlinc arguments using @argfile
373
+ const args = [`@${argFilePath}`];
374
+ const result = await this.runCommand(kotlinc, args);
375
+ if (!result.success) {
376
+ return {
377
+ success: false,
378
+ classFiles: [],
379
+ errors: [result.stderr || 'Compilation failed'],
380
+ outputDir
381
+ };
382
+ }
383
+ // Find generated class files
384
+ const classFiles = this.findClassFiles(outputDir);
385
+ (0, logger_1.log)(`Compiled ${classFiles.length} class files`);
386
+ return {
387
+ success: true,
388
+ classFiles,
389
+ errors: [],
390
+ outputDir
391
+ };
392
+ }
393
+ /**
394
+ * Find all .class files in a directory
395
+ */
396
+ findClassFiles(dir) {
397
+ const files = [];
398
+ const walk = (d) => {
399
+ if (!fs.existsSync(d))
400
+ return;
401
+ const entries = fs.readdirSync(d, { withFileTypes: true });
402
+ for (const entry of entries) {
403
+ const fullPath = path.join(d, entry.name);
404
+ if (entry.isDirectory()) {
405
+ walk(fullPath);
406
+ }
407
+ else if (entry.name.endsWith('.class')) {
408
+ files.push(fullPath);
409
+ }
410
+ }
411
+ };
412
+ walk(dir);
413
+ return files;
414
+ }
415
+ /**
416
+ * Run a command and return result
417
+ */
418
+ runCommand(cmd, args) {
419
+ return new Promise((resolve) => {
420
+ const proc = (0, child_process_1.spawn)(cmd, args, {
421
+ shell: os.platform() === 'win32',
422
+ env: process.env
423
+ });
424
+ let stdout = '';
425
+ let stderr = '';
426
+ proc.stdout?.on('data', (data) => {
427
+ stdout += data.toString();
428
+ });
429
+ proc.stderr?.on('data', (data) => {
430
+ stderr += data.toString();
431
+ });
432
+ proc.on('close', (code) => {
433
+ resolve({
434
+ success: code === 0,
435
+ stdout,
436
+ stderr
437
+ });
438
+ });
439
+ proc.on('error', (err) => {
440
+ resolve({
441
+ success: false,
442
+ stdout: '',
443
+ stderr: err.message
444
+ });
445
+ });
446
+ });
447
+ }
448
+ }
449
+ exports.KotlinCompiler = KotlinCompiler;
450
+ //# sourceMappingURL=kotlin-compiler.js.map
@@ -0,0 +1,91 @@
1
+ export declare enum TokenType {
2
+ Identifier = 0,
3
+ StringLiteral = 1,
4
+ NumberLiteral = 2,
5
+ ParenOpen = 3,
6
+ ParenClose = 4,
7
+ BraceOpen = 5,
8
+ BraceClose = 6,
9
+ Equals = 7,
10
+ Comma = 8,
11
+ Dot = 9,
12
+ Colon = 10,
13
+ Keyword = 11,
14
+ Operator = 12,
15
+ EOF = 13
16
+ }
17
+ export interface Token {
18
+ type: TokenType;
19
+ value: string;
20
+ line: number;
21
+ column: number;
22
+ }
23
+ export declare class Tokenizer {
24
+ private content;
25
+ private position;
26
+ private line;
27
+ private column;
28
+ constructor(content: string);
29
+ tokenize(): Token[];
30
+ private advance;
31
+ private peek;
32
+ private createToken;
33
+ private skipLineComment;
34
+ private skipBlockComment;
35
+ private readIdentifier;
36
+ private readNumber;
37
+ private readString;
38
+ }
39
+ export declare class KotlinParser {
40
+ private tokens;
41
+ private position;
42
+ private library;
43
+ constructor(tokens: Token[], library?: Map<string, string>);
44
+ parse(): any;
45
+ private mapToDivKit;
46
+ private mapModifiersToPaddings;
47
+ private mapModifiersToSize;
48
+ private mapStyleToSize;
49
+ private parseBlockContent;
50
+ private parseStatement;
51
+ /**
52
+ * Consume parentheses content (after opening paren has been consumed)
53
+ */
54
+ private consumeParenthesesContent;
55
+ private parseFunctionCall;
56
+ private parseArguments;
57
+ private parseValue;
58
+ private parseValueOLD;
59
+ private consumeParentheses;
60
+ private continueParsingModifier;
61
+ /**
62
+ * Parse padding arguments: padding(16.dp) or padding(start = 16.dp, top = 8.dp, horizontal = 16.dp)
63
+ */
64
+ private parseModifierPaddingArgs;
65
+ private skipDeclaration;
66
+ /**
67
+ * Skip an assignment statement: identifier = expression
68
+ * Handles: showAddDialog = true, x = foo.bar(), etc.
69
+ */
70
+ private skipAssignment;
71
+ /**
72
+ * Consume an expression, handling nested parentheses, braces, and brackets.
73
+ * Stops at: comma, closing paren/brace (unmatched), keywords that start statements, or EOF.
74
+ */
75
+ private consumeExpression;
76
+ /**
77
+ * Skip lambda parameters at the start of a block: { padding -> ... } or { a, b -> ... }
78
+ * Returns true if parameters were skipped.
79
+ */
80
+ private skipLambdaParameters;
81
+ private match;
82
+ private check;
83
+ private advance;
84
+ private isAtEnd;
85
+ private peekCurrent;
86
+ private peek;
87
+ private previous;
88
+ private consume;
89
+ private consumeUntil;
90
+ }
91
+ //# sourceMappingURL=kotlin-parser.d.ts.map