Skip to content

Send over script uri #2304

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Draft
wants to merge 1 commit into
base: main
Choose a base branch
from
Draft
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
22 changes: 21 additions & 1 deletion dwds/lib/src/debugging/modules.dart
Original file line number Diff line number Diff line change
@@ -17,6 +17,10 @@ class Modules {

// The Dart server path to library import uri
final _sourceToLibrary = <String, Uri>{};

// The Dart server path to resolved uri aka "file uri".
final _sourceToResolvedUri = <String, Uri>{};

var _moduleMemoizer = AsyncMemoizer<void>();

final Map<String, String> _libraryToModule = {};
@@ -34,6 +38,7 @@ class Modules {
// across hot reloads.
_sourceToModule.clear();
_sourceToLibrary.clear();
_sourceToResolvedUri.clear();
_libraryToModule.clear();
_moduleMemoizer = AsyncMemoizer();
_entrypoint = entrypoint;
@@ -51,6 +56,12 @@ class Modules {
return _sourceToLibrary[serverPath];
}

/// Returns the resolived uri (or file uri) for the provided Dart server path.
Future<Uri?> resolvedUriForSource(String serverPath) async {
await _moduleMemoizer.runOnce(_initializeMapping);
return _sourceToResolvedUri[serverPath];
}

Future<String?> moduleForLibrary(String libraryUri) async {
await _moduleMemoizer.runOnce(_initializeMapping);
return _libraryToModule[libraryUri];
@@ -62,7 +73,8 @@ class Modules {
return _sourceToModule;
}

/// Initializes [_sourceToModule] and [_sourceToLibrary].
/// Initializes [_sourceToModule], [_sourceToLibrary] and
/// [_sourceToResolvedUri].
Future<void> _initializeMapping() async {
final provider =
globalToolConfiguration.loadStrategy.metadataProviderFor(_entrypoint);
@@ -81,15 +93,23 @@ class Modules {

_sourceToModule[libraryServerPath] = module;
_sourceToLibrary[libraryServerPath] = Uri.parse(library);
final resolvedUri = DartUri.uriToResolvedUri[library];
if (resolvedUri != null) {
_sourceToResolvedUri[libraryServerPath] = Uri.parse(resolvedUri);
}
_libraryToModule[library] = module;

for (var script in scripts) {
final scriptServerPath = script.startsWith('dart:')
? script
: DartUri(script, _root).serverPath;
final resolvedUri = DartUri.uriToResolvedUri[script];

_sourceToModule[scriptServerPath] = module;
_sourceToLibrary[scriptServerPath] = Uri.parse(library);
if (resolvedUri != null) {
_sourceToResolvedUri[scriptServerPath] = Uri.parse(resolvedUri);
}
}
} else {
_logger.warning('No module found for library $library');
15 changes: 13 additions & 2 deletions dwds/lib/src/services/batched_expression_evaluator.dart
Original file line number Diff line number Diff line change
@@ -19,11 +19,18 @@ import 'package:webkit_inspection_protocol/webkit_inspection_protocol.dart';
class EvaluateRequest {
final String isolateId;
final String? libraryUri;
final String? scriptUri;
final String expression;
final Map<String, String>? scope;
final completer = Completer<RemoteObject>();

EvaluateRequest(this.isolateId, this.libraryUri, this.expression, this.scope);
EvaluateRequest(
this.isolateId,
this.libraryUri,
this.scriptUri,
this.expression,
this.scope,
);
}

class BatchedExpressionEvaluator extends ExpressionEvaluator {
@@ -56,6 +63,7 @@ class BatchedExpressionEvaluator extends ExpressionEvaluator {
Future<RemoteObject> evaluateExpression(
String isolateId,
String? libraryUri,
String? scriptUri,
String expression,
Map<String, String>? scope,
) async {
@@ -65,7 +73,8 @@ class BatchedExpressionEvaluator extends ExpressionEvaluator {
'Batched expression evaluator closed',
);
}
final request = EvaluateRequest(isolateId, libraryUri, expression, scope);
final request =
EvaluateRequest(isolateId, libraryUri, scriptUri, expression, scope);
_requestController.sink.add(request);
return request.completer.future;
}
@@ -116,6 +125,7 @@ class BatchedExpressionEvaluator extends ExpressionEvaluator {
.evaluateExpression(
first.isolateId,
first.libraryUri,
first.scriptUri,
first.expression,
first.scope,
)
@@ -130,6 +140,7 @@ class BatchedExpressionEvaluator extends ExpressionEvaluator {
final RemoteObject list = await super.evaluateExpression(
first.isolateId,
first.libraryUri,
first.scriptUri,
batchedExpression,
first.scope,
);
2 changes: 2 additions & 0 deletions dwds/lib/src/services/chrome_proxy_service.dart
Original file line number Diff line number Diff line change
@@ -624,6 +624,8 @@ ${globalToolConfiguration.loadStrategy.loadModuleSnippet}("dart_sdk").developer.
() => evaluator.evaluateExpression(
isolateId,
library?.uri,
// TODO: Get correct script uri.
library?.uri,
expression,
scope,
),
1 change: 1 addition & 0 deletions dwds/lib/src/services/expression_compiler.dart
Original file line number Diff line number Diff line change
@@ -61,6 +61,7 @@ abstract class ExpressionCompiler {
Future<ExpressionCompilationResult> compileExpressionToJs(
String isolateId,
String libraryUri,
String scriptUri,
int line,
int column,
Map<String, String> jsModules,
3 changes: 3 additions & 0 deletions dwds/lib/src/services/expression_compiler_service.dart
Original file line number Diff line number Diff line change
@@ -160,6 +160,7 @@ class _Compiler {

Future<ExpressionCompilationResult> compileExpressionToJs(
String libraryUri,
String scriptUri,
int line,
int column,
Map<String, String> jsModules,
@@ -256,6 +257,7 @@ class ExpressionCompilerService implements ExpressionCompiler {
Future<ExpressionCompilationResult> compileExpressionToJs(
String isolateId,
String libraryUri,
String scriptUri,
int line,
int column,
Map<String, String> jsModules,
@@ -265,6 +267,7 @@ class ExpressionCompilerService implements ExpressionCompiler {
) async =>
(await _compiler.future).compileExpressionToJs(
libraryUri,
scriptUri,
line,
column,
jsModules,
15 changes: 15 additions & 0 deletions dwds/lib/src/services/expression_evaluator.dart
Original file line number Diff line number Diff line change
@@ -84,10 +84,12 @@ class ExpressionEvaluator {
///
/// [isolateId] current isolate ID.
/// [libraryUri] dart library to evaluate the expression in.
/// [scriptUri] dart script or file to evaluate the expression in.
/// [expression] dart expression to evaluate.
Future<RemoteObject> evaluateExpression(
String isolateId,
String? libraryUri,
String? scriptUri,
String expression,
Map<String, String>? scope,
) async {
@@ -114,6 +116,13 @@ class ExpressionEvaluator {
);
}

if (scriptUri == null) {
return createError(
EvaluationErrorKind.invalidInput,
'no script uri',
);
}

final module = await _modules.moduleForLibrary(libraryUri);
if (module == null) {
return createError(
@@ -131,6 +140,7 @@ class ExpressionEvaluator {
final compilationResult = await _compiler.compileExpressionToJs(
isolateId,
libraryUri.toString(),
libraryUri.toString(),
0,
0,
{},
@@ -283,7 +293,11 @@ class ExpressionEvaluator {

final dartLocation = locationMap.dartLocation;
final dartSourcePath = dartLocation.uri.serverPath;
print("dartSourcePath = $dartSourcePath");
final libraryUri = await _modules.libraryForSource(dartSourcePath);
print("libraryUri = $libraryUri");
final resolvedUri = await _modules.resolvedUriForSource(dartSourcePath);
print("resolvedUri = $resolvedUri");
if (libraryUri == null) {
return createError(
EvaluationErrorKind.internal,
@@ -319,6 +333,7 @@ class ExpressionEvaluator {
final compilationResult = await _compiler.compileExpressionToJs(
isolateId,
libraryUri.toString(),
(resolvedUri ?? libraryUri).toString(),
dartLocation.line,
dartLocation.column,
{},
4 changes: 4 additions & 0 deletions dwds/lib/src/utilities/dart_uri.dart
Original file line number Diff line number Diff line change
@@ -132,6 +132,8 @@ class DartUri {
/// file:///.pub-cache/hosted/pub.dev/path-1.8.0/lib/src/path_set.dart,
static final Map<String, String> _uriToResolvedUri = {};

static Map<String, String> get uriToResolvedUri => _uriToResolvedUri;

/// All of the known libraries, indexed by their absolute file URL.
static final Map<String, String> _resolvedUriToUri = {};

@@ -140,6 +142,8 @@ class DartUri {
/// This map is empty if not a google3 app.
static final Map<String, String> _g3RelativeUriToResolvedUri = {};

static Map<String, String> get resolvedUriToUri => _resolvedUriToUri;

/// Returns package, app, or dart uri for a resolved path.
static String? toPackageUri(String uri) {
final packageUri = _resolvedUriToUri[uri];
5 changes: 5 additions & 0 deletions dwds/test/expression_compiler_service_test.dart
Original file line number Diff line number Diff line change
@@ -199,6 +199,7 @@ void main() async {
final compilationResult = await service.compileExpressionToJs(
'0',
'org-dartlang-app:/try.dart',
'org-dartlang-app:/try.dart',
2,
1,
{},
@@ -247,6 +248,7 @@ void main() async {
final compilationResult1 = await service.compileExpressionToJs(
'0',
'org-dartlang-app:/try.dart',
'org-dartlang-app:/try.dart',
2,
1,
{},
@@ -257,6 +259,7 @@ void main() async {
final compilationResult2 = await service.compileExpressionToJs(
'0',
'org-dartlang-app:/try.dart',
'org-dartlang-app:/try.dart',
2,
1,
{},
@@ -312,6 +315,7 @@ void main() async {
final compilationResult1 = service.compileExpressionToJs(
'0',
'org-dartlang-app:/try.dart',
'org-dartlang-app:/try.dart',
2,
1,
{},
@@ -322,6 +326,7 @@ void main() async {
final compilationResult2 = service.compileExpressionToJs(
'0',
'org-dartlang-app:/try.dart',
'org-dartlang-app:/try.dart',
2,
1,
{},
16 changes: 8 additions & 8 deletions dwds/test/expression_evaluator_test.dart
Original file line number Diff line number Diff line change
@@ -96,8 +96,8 @@ void main() async {
});

test('can evaluate expression', () async {
final result =
await evaluator.evaluateExpression('1', 'main.dart', 'true', {});
final result = await evaluator
.evaluateExpression('1', 'main.dart', 'main.dart', 'true', {});
expect(
result,
const TypeMatcher<RemoteObject>()
@@ -162,8 +162,8 @@ void main() async {

test('returns error if closed', () async {
evaluator.close();
final result =
await evaluator.evaluateExpression('1', 'main.dart', 'true', {});
final result = await evaluator
.evaluateExpression('1', 'main.dart', 'main.dart', 'true', {});
expect(
result,
const TypeMatcher<RemoteObject>()
@@ -181,8 +181,8 @@ void main() async {
});

test('can evaluate expression', () async {
final result =
await evaluator.evaluateExpression('1', 'main.dart', 'true', {});
final result = await evaluator
.evaluateExpression('1', 'main.dart', 'main.dart', 'true', {});
expect(
result,
const TypeMatcher<RemoteObject>()
@@ -192,8 +192,8 @@ void main() async {

test('returns error if closed', () async {
evaluator.close();
final result =
await evaluator.evaluateExpression('1', 'main.dart', 'true', {});
final result = await evaluator
.evaluateExpression('1', 'main.dart', 'main.dart', 'true', {});
expect(
result,
const TypeMatcher<RemoteObject>()
5 changes: 5 additions & 0 deletions dwds/test/fixtures/fakes.dart
Original file line number Diff line number Diff line change
@@ -161,6 +161,10 @@ class FakeModules implements Modules {
@override
Future<Uri> libraryForSource(String serverPath) async => Uri(path: _library);

@override
Future<Uri> resolvedUriForSource(String serverPath) async =>
Uri(path: _library);

@override
Future<String> moduleForSource(String serverPath) async => _module;

@@ -438,6 +442,7 @@ class FakeExpressionCompiler implements ExpressionCompiler {
Future<ExpressionCompilationResult> compileExpressionToJs(
String isolateId,
String libraryUri,
String scriptUri,
int line,
int column,
Map<String, String> jsModules,
28 changes: 24 additions & 4 deletions frontend_server_common/lib/src/frontend_server_client.dart
Original file line number Diff line number Diff line change
@@ -213,6 +213,7 @@ class _CompileExpressionToJsRequest extends _CompilationRequest {
_CompileExpressionToJsRequest(
Completer<CompilerOutput?> completer,
this.libraryUri,
this.scriptUri,
this.line,
this.column,
this.jsModules,
@@ -222,6 +223,7 @@ class _CompileExpressionToJsRequest extends _CompilationRequest {
: super(completer);

String libraryUri;
String scriptUri;
int line;
int column;
Map<String, String> jsModules;
@@ -478,6 +480,7 @@ class ResidentCompiler {
/// Compiles dart expression to JavaScript.
Future<CompilerOutput?> compileExpressionToJs(
String libraryUri,
String scriptUri,
int line,
int column,
Map<String, String> jsModules,
@@ -489,8 +492,16 @@ class ResidentCompiler {
}

var completer = Completer<CompilerOutput?>();
_controller.add(_CompileExpressionToJsRequest(completer, libraryUri, line,
column, jsModules, jsFrameValues, moduleName, expression));
_controller.add(_CompileExpressionToJsRequest(
completer,
libraryUri,
scriptUri,
line,
column,
jsModules,
jsFrameValues,
moduleName,
expression));
return completer.future;
}

@@ -509,6 +520,7 @@ class ResidentCompiler {
var inputKey = Uuid().generateV4();
server.stdin.writeln('compile-expression-to-js $inputKey');
server.stdin.writeln(request.libraryUri);
server.stdin.writeln(request.scriptUri);
server.stdin.writeln(request.line);
server.stdin.writeln(request.column);
request.jsModules.forEach((k, v) {
@@ -611,14 +623,22 @@ class TestExpressionCompiler implements ExpressionCompiler {
Future<ExpressionCompilationResult> compileExpressionToJs(
String isolateId,
String libraryUri,
String scriptUri,
int line,
int column,
Map<String, String> jsModules,
Map<String, String> jsFrameValues,
String moduleName,
String expression) async {
var compilerOutput = await _generator.compileExpressionToJs(libraryUri,
line, column, jsModules, jsFrameValues, moduleName, expression);
var compilerOutput = await _generator.compileExpressionToJs(
libraryUri,
scriptUri,
line,
column,
jsModules,
jsFrameValues,
moduleName,
expression);

if (compilerOutput != null) {
var content = utf8.decode(localFileSystem