diff --git a/web_generator/lib/src/interop_gen/parser.dart b/web_generator/lib/src/interop_gen/parser.dart index aaf1f86c..55bdb15d 100644 --- a/web_generator/lib/src/interop_gen/parser.dart +++ b/web_generator/lib/src/interop_gen/parser.dart @@ -4,19 +4,58 @@ import 'dart:js_interop'; +import '../js/filesystem_api.dart'; import '../js/node.dart'; import '../js/typescript.dart' as ts; +class PreProcessResult { + List modules; + List referenceLibs; + List referenceTypes; + + PreProcessResult( + {this.modules = const [], + this.referenceLibs = const [], + this.referenceTypes = const []}); +} + class ParserResult { ts.TSProgram program; Iterable files; + Map preprocessResult; - ParserResult({required this.program, required this.files}); + ParserResult( + {required this.program, + required this.files, + this.preprocessResult = const {}}); } /// Parses the given TypeScript declaration [files], provides any diagnostics, /// if any, and generates a [ts.TSProgram] for transformation ParserResult parseDeclarationFiles(Iterable files) { + // preprocess file + final preProcessResultMap = {}; + + for (final file in files) { + final contents = (fs.readFileSync( + file.toJS, JSReadFileOptions(encoding: 'utf8'.toJS)) as JSString) + .toDart; + final preProcessResult = ts.preProcessFile(contents); + + preProcessResultMap[file] = PreProcessResult( + modules: preProcessResult.ambientExternalModules?.toDart + .map((t) => t.toDart) + .toList() ?? + [], + referenceLibs: preProcessResult.libReferenceDirectives.toDart + .map((ref) => ref.fileName) + .toList(), + referenceTypes: preProcessResult.typeReferenceDirectives.toDart + .map((ref) => ref.fileName) + .toList(), + ); + } + final program = ts.createProgram(files.jsify() as JSArray, ts.TSCompilerOptions(declaration: true)); @@ -44,5 +83,6 @@ ParserResult parseDeclarationFiles(Iterable files) { exit(1); } - return ParserResult(program: program, files: files); + return ParserResult( + program: program, files: files, preprocessResult: preProcessResultMap); } diff --git a/web_generator/lib/src/js/typescript.dart b/web_generator/lib/src/js/typescript.dart index fd403b91..6644d1cc 100644 --- a/web_generator/lib/src/js/typescript.dart +++ b/web_generator/lib/src/js/typescript.dart @@ -40,6 +40,23 @@ external TSLineAndCharacter getLineAndCharacterOfPosition( external String flattenDiagnosticMessageText(JSAny? diag, String newLine, [int indent]); +@JS() +external TSPreProcessedFileInfo preProcessFile(String sourceText, + [bool readImportFiles, bool detectJavaScriptImports]); + +@JS('PreProcessedFileInfo') +extension type TSPreProcessedFileInfo._(JSObject _) implements JSObject { + external JSArray referencedFiles; + external JSArray typeReferenceDirectives; + external JSArray libReferenceDirectives; + external JSArray? ambientExternalModules; +} + +@JS('FileReference') +extension type TSFileReference._(JSObject _) implements JSObject { + external String fileName; +} + @JS('CompilerOptions') extension type TSCompilerOptions._(JSObject _) implements JSObject { external TSCompilerOptions({bool? allowJs, bool? declaration});