Skip to content

Commit

Permalink
Prepare a hotfix release of DWDS 22.1.0+1 (#2321)
Browse files Browse the repository at this point in the history
  • Loading branch information
elliette authored Dec 28, 2023
1 parent 50b8ae8 commit d33eaee
Show file tree
Hide file tree
Showing 18 changed files with 316 additions and 493 deletions.
562 changes: 92 additions & 470 deletions .github/workflows/dart.yml

Large diffs are not rendered by default.

5 changes: 5 additions & 0 deletions dwds/CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,4 +1,9 @@
## 22.1.0+1

- Fix a null cast error when debugging a `Class` from VS Code. - [#2303](https://github.com/dart-lang/webdev/pull/2303)

## 22.1.0

- Update `package:vm_service` constraint to `^13.0.0`. - [#2235](https://github.com/dart-lang/webdev/pull/2265)

## 22.0.0
Expand Down
10 changes: 6 additions & 4 deletions dwds/lib/src/debugging/classes.dart
Original file line number Diff line number Diff line change
Expand Up @@ -96,10 +96,9 @@ class ClassHelper extends Domain {
throw ChromeDebugException(e.json, evalContents: expression);
}

final classDescriptor = result.value as Map<String, dynamic>;
final classDescriptor = _mapify(result.value);
final methodRefs = <FuncRef>[];
final methodDescriptors =
classDescriptor['methods'] as Map<String, dynamic>;
final methodDescriptors = _mapify(classDescriptor['methods']);
methodDescriptors.forEach((name, descriptor) {
final methodId = 'methods|$classId|$name';
methodRefs.add(
Expand All @@ -118,7 +117,7 @@ class ClassHelper extends Domain {
});
final fieldRefs = <FieldRef>[];

final fieldDescriptors = classDescriptor['fields'] as Map<String, dynamic>;
final fieldDescriptors = _mapify(classDescriptor['fields']);
fieldDescriptors.forEach((name, descriptor) {
final classMetaData = ClassMetaData(
runtimeKind: RuntimeObjectKind.type,
Expand Down Expand Up @@ -168,4 +167,7 @@ class ClassHelper extends Domain {
superClass: superClassRef,
);
}

Map<String, dynamic> _mapify(dynamic map) =>
(map as Map<String, dynamic>?) ?? <String, dynamic>{};
}
2 changes: 1 addition & 1 deletion dwds/lib/src/debugging/location.dart
Original file line number Diff line number Diff line change
Expand Up @@ -78,7 +78,7 @@ class DartLocation {
int get hashCode => Object.hashAll([uri, line, column]);

@override
bool operator ==(Object? other) {
bool operator ==(Object other) {
if (other is! DartLocation) {
return false;
}
Expand Down
2 changes: 1 addition & 1 deletion dwds/lib/src/version.dart

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

5 changes: 0 additions & 5 deletions dwds/mono_pkg.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -15,23 +15,20 @@ stages:
- test: --tags=extension
sdk:
- dev
- main
os:
- linux
# Windows extension tests:
- group:
- test: --tags=extension
sdk:
- dev
- main
os:
- windows
# First test shard:
- group:
- test: --total-shards 3 --shard-index 0 --exclude-tags=extension
sdk:
- dev
- main
os:
- linux
- windows
Expand All @@ -40,7 +37,6 @@ stages:
- test: --total-shards 3 --shard-index 1 --exclude-tags=extension
sdk:
- dev
- main
os:
- linux
- windows
Expand All @@ -49,7 +45,6 @@ stages:
- test: --total-shards 3 --shard-index 2 --exclude-tags=extension
sdk:
- dev
- main
os:
- linux
- windows
Expand Down
2 changes: 1 addition & 1 deletion dwds/pubspec.yaml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
name: dwds
# Every time this changes you need to run `dart run build_runner build`.
version: 22.1.0
version: 22.1.0+1
description: >-
A service that proxies between the Chrome debug protocol and the Dart VM
service protocol.
Expand Down
5 changes: 5 additions & 0 deletions dwds/test/inspector_test.dart
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ import 'package:dwds/src/debugging/inspector.dart';
import 'package:dwds/src/utilities/conversions.dart';
import 'package:test/test.dart';
import 'package:test_common/test_sdk_configuration.dart';
import 'package:test_common/utilities.dart';
import 'package:vm_service/vm_service.dart';
import 'package:webkit_inspection_protocol/webkit_inspection_protocol.dart';

Expand Down Expand Up @@ -160,6 +161,10 @@ void main() {
final names =
properties.map((p) => p.name).where((x) => x != '__proto__').toList();
final expected = [
if (dartSdkIsAtLeast(
newDdcTypeSystemVersion,
))
'\$ti',
'_privateField',
'abstractField',
'closure',
Expand Down
124 changes: 124 additions & 0 deletions dwds/test/instances/class_inspection_test.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,124 @@
// Copyright (c) 2023, 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.

@Tags(['daily'])
@TestOn('vm')
@Timeout(Duration(minutes: 2))

import 'package:test/test.dart';
import 'package:test_common/logging.dart';
import 'package:test_common/test_sdk_configuration.dart';
import 'package:vm_service/vm_service.dart';

import '../fixtures/context.dart';
import '../fixtures/project.dart';
import 'common/test_inspector.dart';

void main() {
// Enable verbose logging for debugging.
final debug = false;

final provider = TestSdkConfigurationProvider(
verbose: debug,
);

final context =
TestContext(TestProject.testExperimentWithSoundNullSafety, provider);
final testInspector = TestInspector(context);

late VmService service;
late Stream<Event> stream;
late String isolateId;
late ScriptRef mainScript;

onBreakPoint(breakPointId, body) => testInspector.onBreakPoint(
stream,
isolateId,
mainScript,
breakPointId,
body,
);

getObject(instanceId) => service.getObject(isolateId, instanceId);

group('Class |', () {
tearDownAll(provider.dispose);

for (var compilationMode in CompilationMode.values) {
group('$compilationMode |', () {
setUpAll(() async {
setCurrentLogWriter(debug: debug);
await context.setUp(
compilationMode: compilationMode,
enableExpressionEvaluation: true,
verboseCompiler: debug,
);
service = context.debugConnection.vmService;

final vm = await service.getVM();
isolateId = vm.isolates!.first.id!;
final scripts = await service.getScripts(isolateId);

await service.streamListen('Debug');
stream = service.onEvent('Debug');

mainScript = scripts.scripts!
.firstWhere((each) => each.uri!.contains('main.dart'));
});

tearDownAll(() async {
await context.tearDown();
});

setUp(() => setCurrentLogWriter(debug: debug));
tearDown(() => service.resume(isolateId));

group('calling getObject for an existent class', () {
test('returns the correct class representation', () async {
await onBreakPoint('testClass1Case1', (event) async {
// classes|dart:core|Object_Diagnosticable
final result = await getObject(
'classes|org-dartlang-app:///web/main.dart|GreeterClass',
);
final clazz = result as Class?;
expect(clazz!.name, equals('GreeterClass'));
expect(
clazz.fields!.map((field) => field.name),
unorderedEquals([
'greeteeName',
'useFrench',
]),
);
expect(
clazz.functions!.map((fn) => fn.name),
containsAll([
'sayHello',
'greetInEnglish',
'greetInFrench',
]),
);
});
});
});

group('calling getObject for a non-existent class', () {
// TODO(https://github.com/dart-lang/webdev/issues/2297): Ideally we
// should throw an error in this case for the client to catch instead
// of returning an empty class.
test('returns an empty class representation', () async {
await onBreakPoint('testClass1Case1', (event) async {
final result = await getObject(
'classes|dart:core|Object_Diagnosticable',
);
final clazz = result as Class?;
expect(clazz!.name, equals('Object_Diagnosticable'));
expect(clazz.fields, isEmpty);
expect(clazz.functions, isEmpty);
});
});
});
});
}
});
}
8 changes: 7 additions & 1 deletion dwds/test/instances/common/instance_common.dart
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import 'package:dwds/src/debugging/inspector.dart';
import 'package:test/test.dart';
import 'package:test_common/logging.dart';
import 'package:test_common/test_sdk_configuration.dart';
import 'package:test_common/utilities.dart';
import 'package:vm_service/vm_service.dart';
import 'package:webkit_inspection_protocol/webkit_inspection_protocol.dart';

Expand Down Expand Up @@ -73,7 +74,12 @@ void runTypeSystemVerificationTests({
);
expect(
remoteObject.json['className'],
canaryFeatures ? 'dart_rti.Rti.new' : 'Function',
canaryFeatures ||
dartSdkIsAtLeast(
newDdcTypeSystemVersion,
)
? 'dart_rti.Rti.new'
: 'Function',
);
});
});
Expand Down
24 changes: 22 additions & 2 deletions dwds/test/variable_scope_test.dart
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ import 'package:dwds/src/services/chrome_proxy_service.dart';
import 'package:test/test.dart';
import 'package:test_common/logging.dart';
import 'package:test_common/test_sdk_configuration.dart';
import 'package:test_common/utilities.dart';
import 'package:vm_service/vm_service.dart';

import 'fixtures/context.dart';
Expand Down Expand Up @@ -203,7 +204,18 @@ void main() {
final variableNames = variables.keys.toList()..sort();
expect(
variableNames,
['closureLocalInsideMethod', 'local', 'parameter', 'this'],
[
// TODO(https://github.com/dart-lang/webdev/issues/2316): Make sure T
// doesn't show up here.
if (dartSdkIsAtLeast(
newDdcTypeSystemVersion,
))
'T',
'closureLocalInsideMethod',
'local',
'parameter',
'this',
],
);
});

Expand All @@ -213,7 +225,15 @@ void main() {
await expectDartVariables(variables);

final variableNames = variables.keys.toList()..sort();
expect(variableNames, ['this']);
expect(variableNames, [
// TODO(https://github.com/dart-lang/webdev/issues/2316): Make sure T
// doesn't show up here.
if (dartSdkIsAtLeast(
newDdcTypeSystemVersion,
))
'T',
'this',
]);
});

test('variables in extension method', () async {
Expand Down
29 changes: 29 additions & 0 deletions fixtures/_experimentSound/web/main.dart
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,8 @@ void main() {
testPattern([3.14, 'b']);
testPattern([0, 1]);
testPattern2();
print('Classes');
testClass();
});

document.body!.appendText('Program is running!');
Expand Down Expand Up @@ -55,6 +57,11 @@ void printNestedNamedLocalRecord() {
print(record); // Breakpoint: printNestedNamedLocalRecord
}

void testClass() {
final greeter = GreeterClass(greeteeName: 'Charlie Brown');
greeter.sayHello();
}

String testPattern(Object obj) {
switch (obj) {
case [var a, int n] || [int n, var a] when n == 1 && a is String:
Expand All @@ -73,3 +80,25 @@ String testPattern2() {
print(firstCat); // Breakpoint: testPattern2Case2
return '$dog, $firstCat, $secondCat';
}

class GreeterClass {
final String greeteeName;
final bool useFrench;

GreeterClass({
this.greeteeName = 'Snoopy',
this.useFrench = false,
});

void sayHello() {
useFrench ? greetInFrench() : greetInEnglish();
}

void greetInEnglish() {
print('Hello $greeteeName'); // Breakpoint: testClass1Case1
}

void greetInFrench() {
print('Bonjour $greeteeName');
}
}
6 changes: 4 additions & 2 deletions frontend_server_client/test/frontend_sever_client_test.dart
Original file line number Diff line number Diff line change
Expand Up @@ -111,7 +111,8 @@ String get message => p.join('hello', 'world');

expect(await stdoutLines.next, p.join('goodbye', 'world'));
expect(await process.exitCode, 0);
});
// TODO(https://github.com/dart-lang/webdev/issues/2315): Fix and re-enable.
}, skip: true);

test('can handle compile errors and reload fixes', () async {
var entrypoint = p.join(packageRoot, 'bin', 'main.dart');
Expand Down Expand Up @@ -174,7 +175,8 @@ String get message => p.join('hello', 'world');

expect(await stdoutLines.next, p.join('goodbye', 'world'));
expect(await process.exitCode, 0);
});
// TODO(https://github.com/dart-lang/webdev/issues/2315): Fix and re-enable.
}, skip: true);

test('can compile and recompile a dartdevc app', () async {
var entrypoint =
Expand Down
Loading

0 comments on commit d33eaee

Please sign in to comment.