From 82a952f14aefc1320a3110d44ac4eb02a8017aaa Mon Sep 17 00:00:00 2001 From: Jake Macdonald Date: Wed, 20 May 2026 08:28:31 -0700 Subject: [PATCH] Fix casting of List parameters in VM service generator. Also updates special cased handling of the `scope` parameter to instead work for any Map typed parameter. Simplified things in general here by casting values to the correct collection type and then relying on `.cast()` to fill in the proper generic types instead of explicitly filling them in. Change-Id: I7fef91105ca73ee9726780abd76e92817a9e46c0 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/504780 Commit-Queue: Jake Macdonald Auto-Submit: Jake Macdonald Reviewed-by: Ben Konyi --- .../test/get_source_report_test.dart | 13 ++++++++++++ .../tool/dart/generate_dart_common.dart | 2 ++ .../tool/dart/generate_dart_interface.dart | 11 ++++++---- pkg/vm_service_interface/CHANGELOG.md | 3 +++ .../lib/src/vm_service_interface.dart | 21 ++++++++++--------- pkg/vm_service_interface/pubspec.yaml | 2 +- 6 files changed, 37 insertions(+), 15 deletions(-) diff --git a/pkg/vm_service/test/get_source_report_test.dart b/pkg/vm_service/test/get_source_report_test.dart index d3a155a6a23..737da2d6087 100644 --- a/pkg/vm_service/test/get_source_report_test.dart +++ b/pkg/vm_service/test/get_source_report_test.dart @@ -144,6 +144,19 @@ final tests = [ expect(scripts.length, 1); expect(scripts[0].uri!, endsWith('get_source_report_test.dart')); + // With `libraryFilters` and `librariesAlreadyCompiled` + coverage = await service.getSourceReport( + isolateId, + [SourceReportKind.kCoverage], + scriptId: scriptId, + tokenPos: func.location!.tokenPos!, + endTokenPos: func.location!.endTokenPos!, + libraryFilters: [scripts[0].uri!], + librariesAlreadyCompiled: [scripts[0].uri!], + ); + scripts = coverage.scripts!; + expect(scripts[0].uri!, endsWith('get_source_report_test.dart')); + // Full isolate coverage = await service.getSourceReport( isolateId, diff --git a/pkg/vm_service/tool/dart/generate_dart_common.dart b/pkg/vm_service/tool/dart/generate_dart_common.dart index ac55690af55..f6ce62321c0 100644 --- a/pkg/vm_service/tool/dart/generate_dart_common.dart +++ b/pkg/vm_service/tool/dart/generate_dart_common.dart @@ -455,6 +455,8 @@ class TypeRef { bool get isArray => arrayDepth > 0; + bool get isMap => name == 'Map'; + bool get isSimple => arrayDepth == 0 && (name == 'int' || diff --git a/pkg/vm_service/tool/dart/generate_dart_interface.dart b/pkg/vm_service/tool/dart/generate_dart_interface.dart index 1defc343247..ac17576e306 100644 --- a/pkg/vm_service/tool/dart/generate_dart_interface.dart +++ b/pkg/vm_service/tool/dart/generate_dart_interface.dart @@ -45,7 +45,7 @@ abstract interface class VmServiceInterface { /// Invoked by the Dart Development Service (DDS) immediately after it /// connects. - /// + /// /// [uri] is a HTTP URI pointing to the connected DDS instance. /// /// When invoked, the VM service implementation should enter single-client @@ -180,7 +180,7 @@ class VmServerConnection { m.args.where((arg) => !arg.optional).forEach((MethodArg arg) { if (arg.type.isArray) { gen.write( - "${arg.type.listCreationRef}.from(params${nullCheck()}['${arg.name}'] ?? []), "); + "(params${nullCheck()}['${arg.name}'] as List? ?? []).cast(), "); } else { gen.write("params${nullCheck()}['${arg.name}'], "); } @@ -189,9 +189,12 @@ class VmServerConnection { var namedArgs = m.args.where((arg) => arg.optional); if (namedArgs.isNotEmpty) { for (var arg in namedArgs) { - if (arg.name == 'scope') { + if (arg.type.isMap) { gen.writeln( - "${arg.name}: params${nullCheck()}['${arg.name}']?.cast(), "); + "${arg.name}: (params${nullCheck()}['${arg.name}'] as Map?)?.cast(), "); + } else if (arg.type.isArray) { + gen.writeln( + "${arg.name}: (params${nullCheck()}['${arg.name}'] as List?)?.cast(), "); } else { gen.writeln( "${arg.name}: params${nullCheck()}['${arg.name}'], "); diff --git a/pkg/vm_service_interface/CHANGELOG.md b/pkg/vm_service_interface/CHANGELOG.md index 71de00da34f..d053e0d7a48 100644 --- a/pkg/vm_service_interface/CHANGELOG.md +++ b/pkg/vm_service_interface/CHANGELOG.md @@ -1,3 +1,6 @@ +## 2.0.2-wip +- Bug fix for `List` parameters to do proper deep casting. + ## 2.0.1 - Update `package:vm_service` constraint to `>=14.3.0 <16.0.0`. diff --git a/pkg/vm_service_interface/lib/src/vm_service_interface.dart b/pkg/vm_service_interface/lib/src/vm_service_interface.dart index f634c012750..4daa87cd763 100644 --- a/pkg/vm_service_interface/lib/src/vm_service_interface.dart +++ b/pkg/vm_service_interface/lib/src/vm_service_interface.dart @@ -1477,7 +1477,7 @@ class VmServerConnection { params!['isolateId'], params['targetId'], params['selector'], - List.from(params['argumentIds'] ?? []), + (params['argumentIds'] as List? ?? []).cast(), disableBreakpoints: params['disableBreakpoints'], idZoneId: params['idZoneId'], ); @@ -1487,7 +1487,7 @@ class VmServerConnection { params!['isolateId'], params['targetId'], params['expression'], - scope: params['scope']?.cast(), + scope: (params['scope'] as Map?)?.cast(), disableBreakpoints: params['disableBreakpoints'], idZoneId: params['idZoneId'], ); @@ -1497,7 +1497,7 @@ class VmServerConnection { params!['isolateId'], params['frameIndex'], params['expression'], - scope: params['scope']?.cast(), + scope: (params['scope'] as Map?)?.cast(), disableBreakpoints: params['disableBreakpoints'], idZoneId: params['idZoneId'], ); @@ -1645,14 +1645,15 @@ class VmServerConnection { case 'getSourceReport': response = await _serviceImplementation.getSourceReport( params!['isolateId'], - List.from(params['reports'] ?? []), + (params['reports'] as List? ?? []).cast(), scriptId: params['scriptId'], tokenPos: params['tokenPos'], endTokenPos: params['endTokenPos'], forceCompile: params['forceCompile'], reportLines: params['reportLines'], - libraryFilters: params['libraryFilters'], - librariesAlreadyCompiled: params['librariesAlreadyCompiled'], + libraryFilters: (params['libraryFilters'] as List?)?.cast(), + librariesAlreadyCompiled: + (params['librariesAlreadyCompiled'] as List?)?.cast(), ); break; case 'getVersion': @@ -1686,14 +1687,14 @@ class VmServerConnection { case 'lookupResolvedPackageUris': response = await _serviceImplementation.lookupResolvedPackageUris( params!['isolateId'], - List.from(params['uris'] ?? []), + (params['uris'] as List? ?? []).cast(), local: params['local'], ); break; case 'lookupPackageUris': response = await _serviceImplementation.lookupPackageUris( params!['isolateId'], - List.from(params['uris'] ?? []), + (params['uris'] as List? ?? []).cast(), ); break; case 'reloadSources': @@ -1777,7 +1778,7 @@ class VmServerConnection { break; case 'setVMTimelineFlags': response = await _serviceImplementation.setVMTimelineFlags( - List.from(params!['recordedStreams'] ?? []), + (params!['recordedStreams'] as List? ?? []).cast(), ); break; case 'streamCancel': @@ -1797,7 +1798,7 @@ class VmServerConnection { case 'streamCpuSamplesWithUserTag': // ignore: deprecated_member_use_from_same_package response = await _serviceImplementation.streamCpuSamplesWithUserTag( - List.from(params!['userTags'] ?? []), + (params!['userTags'] as List? ?? []).cast(), ); break; case 'streamListen': diff --git a/pkg/vm_service_interface/pubspec.yaml b/pkg/vm_service_interface/pubspec.yaml index 1b1de825fe1..ebcc4a03697 100644 --- a/pkg/vm_service_interface/pubspec.yaml +++ b/pkg/vm_service_interface/pubspec.yaml @@ -1,6 +1,6 @@ name: vm_service_interface -version: 2.0.1 +version: 2.0.2-wip description: >- A library providing an interface to implement the Dart VM service protocol.