blob: 4af38c114ebc4f3923c3b2161fefa783ba31f0ef [file] [log] [blame]
// Copyright (c) 2020, the Dart project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
/// Result of compilation of dart expression to JavaScript
class ExpressionCompilationResult {
final bool isError;
final String result;
/// Result of compilation from dart to JavaScript
///
/// [result] JavaScript expression as String, or error message
/// if compilation has failed
/// [isError] true if compilation has failed, false otherwise
ExpressionCompilationResult(this.result, this.isError);
@override
String toString() => 'result: $result, isError:$isError';
}
/// Interface to provide means of compiling expressions from dart to JavaScript
/// used to implement expression evaluation in any tools using dwds
abstract class ExpressionCompiler {
/// Compiles [expression] in [libraryUri] at [line]:[column] to JavaScript
/// in [moduleName].
///
/// Values listed in [jsFrameValues] are substituted for their names in the
/// [expression].
///
/// Ensures that all [jsModules] are loaded and accessible inside the
/// expression.
///
/// Returns [ExpressionCompilationResult]
/// Errors are reported using onDiagnostic function
/// [moduleName] is of the form '/packages/hello_world_main.dart'
/// [jsFrameValues] is a map from js variable name to its primitive value
/// or another variable name, for example
/// { 'x': '1', 'y': 'y', 'o': 'null' }
/// [jsModules] is a map from variable name to the module name, where
/// variable name is the name originally used in JavaScript to contain the
/// module object, for example:
/// { 'dart':'dart_sdk', 'main': '/packages/hello_world_main.dart' }
///
/// Should wait for the dependencies to update if called during a call to
/// [updateDependencies].
Future<ExpressionCompilationResult> compileExpressionToJs(
String isolateId,
String libraryUri,
int line,
int column,
Map<String, String> jsModules,
Map<String, String> jsFrameValues,
String moduleName,
String expression);
/// Trigger (re-)load of kernel files for modules.
///
/// (Re-)load summaries for changed modules and trigger reload
/// of full dill file for module on first expression evaluation
/// in the module.
///
/// [modules]: moduleName -> moduleInfo
///
/// [updateDependencies] is called during isolate creation.
Future<bool> updateDependencies(Map<String, ModuleInfo> modules);
/// Initializes the compiler with null safety mode and module format.
///
/// May be called multiple times and always before [updateDependencies].
Future<void> initialize({
required String moduleFormat,
bool soundNullSafety = false,
});
}
class ModuleInfo {
final String fullDillPath;
final String summaryPath;
ModuleInfo(this.fullDillPath, this.summaryPath);
@override
String toString() => '{ $fullDillPath, $summaryPath }';
}