mirror of
https://github.com/dart-lang/sdk
synced 2024-09-16 01:13:04 +00:00
Reland "[ VM / Service ] Add abstract flag to Function"
This reverts commit 6c542eca22
.
Switched vm_service from a minor version bump to a major one.
See: https://buganizer.corp.google.com/issues/236964692#comment4
Bug: https://github.com/dart-lang/coverage/issues/398
Change-Id: I85f88d4a1cdcb878cbf77da283041458381e2a2b
TEST=Added to get_object_rpc_test.dart
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/250772
Commit-Queue: Liam Appelbe <liama@google.com>
Reviewed-by: Siva Annamalai <asiva@google.com>
This commit is contained in:
parent
317e3463a6
commit
aa2e19827f
|
@ -1,5 +1,9 @@
|
||||||
# Changelog
|
# Changelog
|
||||||
|
|
||||||
|
## 10.0.0
|
||||||
|
- Update to version `3.59` of the spec.
|
||||||
|
- Add `abstract` flag to `FuncRef`.
|
||||||
|
|
||||||
## 9.0.0
|
## 9.0.0
|
||||||
- Update to version `3.58` of the spec.
|
- Update to version `3.58` of the spec.
|
||||||
- Added optional `local` parameter to `lookupResolvedPackageUris` RPC.
|
- Added optional `local` parameter to `lookupResolvedPackageUris` RPC.
|
||||||
|
|
|
@ -1 +1 @@
|
||||||
version=3.58
|
version=3.59
|
||||||
|
|
|
@ -26,7 +26,7 @@ export 'snapshot_graph.dart'
|
||||||
HeapSnapshotObjectNoData,
|
HeapSnapshotObjectNoData,
|
||||||
HeapSnapshotObjectNullData;
|
HeapSnapshotObjectNullData;
|
||||||
|
|
||||||
const String vmServiceVersion = '3.58.0';
|
const String vmServiceVersion = '3.59.0';
|
||||||
|
|
||||||
/// @optional
|
/// @optional
|
||||||
const String optional = 'optional';
|
const String optional = 'optional';
|
||||||
|
@ -4675,6 +4675,9 @@ class FuncRef extends ObjRef {
|
||||||
/// Is this function implicitly defined (e.g., implicit getter/setter)?
|
/// Is this function implicitly defined (e.g., implicit getter/setter)?
|
||||||
bool? implicit;
|
bool? implicit;
|
||||||
|
|
||||||
|
/// Is this function an abstract method?
|
||||||
|
bool? isAbstract;
|
||||||
|
|
||||||
/// The location of this function in the source code.
|
/// The location of this function in the source code.
|
||||||
///
|
///
|
||||||
/// Note: this may not agree with the location of `owner` if this is a
|
/// Note: this may not agree with the location of `owner` if this is a
|
||||||
|
@ -4689,6 +4692,7 @@ class FuncRef extends ObjRef {
|
||||||
required this.isStatic,
|
required this.isStatic,
|
||||||
required this.isConst,
|
required this.isConst,
|
||||||
required this.implicit,
|
required this.implicit,
|
||||||
|
required this.isAbstract,
|
||||||
required String id,
|
required String id,
|
||||||
this.location,
|
this.location,
|
||||||
}) : super(
|
}) : super(
|
||||||
|
@ -4702,6 +4706,7 @@ class FuncRef extends ObjRef {
|
||||||
isStatic = json['static'] ?? false;
|
isStatic = json['static'] ?? false;
|
||||||
isConst = json['const'] ?? false;
|
isConst = json['const'] ?? false;
|
||||||
implicit = json['implicit'] ?? false;
|
implicit = json['implicit'] ?? false;
|
||||||
|
isAbstract = json['abstract'] ?? false;
|
||||||
location = createServiceObject(json['location'], const ['SourceLocation'])
|
location = createServiceObject(json['location'], const ['SourceLocation'])
|
||||||
as SourceLocation?;
|
as SourceLocation?;
|
||||||
}
|
}
|
||||||
|
@ -4719,6 +4724,7 @@ class FuncRef extends ObjRef {
|
||||||
'static': isStatic,
|
'static': isStatic,
|
||||||
'const': isConst,
|
'const': isConst,
|
||||||
'implicit': implicit,
|
'implicit': implicit,
|
||||||
|
'abstract': isAbstract,
|
||||||
});
|
});
|
||||||
_setIfNotNull(json, 'location', location?.toJson());
|
_setIfNotNull(json, 'location', location?.toJson());
|
||||||
return json;
|
return json;
|
||||||
|
@ -4730,7 +4736,7 @@ class FuncRef extends ObjRef {
|
||||||
|
|
||||||
String toString() => '[FuncRef ' //
|
String toString() => '[FuncRef ' //
|
||||||
'id: ${id}, name: ${name}, owner: ${owner}, isStatic: ${isStatic}, ' //
|
'id: ${id}, name: ${name}, owner: ${owner}, isStatic: ${isStatic}, ' //
|
||||||
'isConst: ${isConst}, implicit: ${implicit}]';
|
'isConst: ${isConst}, implicit: ${implicit}, isAbstract: ${isAbstract}]';
|
||||||
}
|
}
|
||||||
|
|
||||||
/// A `Func` represents a Dart language function.
|
/// A `Func` represents a Dart language function.
|
||||||
|
@ -4759,6 +4765,9 @@ class Func extends Obj implements FuncRef {
|
||||||
/// Is this function implicitly defined (e.g., implicit getter/setter)?
|
/// Is this function implicitly defined (e.g., implicit getter/setter)?
|
||||||
bool? implicit;
|
bool? implicit;
|
||||||
|
|
||||||
|
/// Is this function an abstract method?
|
||||||
|
bool? isAbstract;
|
||||||
|
|
||||||
/// The location of this function in the source code.
|
/// The location of this function in the source code.
|
||||||
///
|
///
|
||||||
/// Note: this may not agree with the location of `owner` if this is a
|
/// Note: this may not agree with the location of `owner` if this is a
|
||||||
|
@ -4780,6 +4789,7 @@ class Func extends Obj implements FuncRef {
|
||||||
required this.isStatic,
|
required this.isStatic,
|
||||||
required this.isConst,
|
required this.isConst,
|
||||||
required this.implicit,
|
required this.implicit,
|
||||||
|
required this.isAbstract,
|
||||||
required this.signature,
|
required this.signature,
|
||||||
required String id,
|
required String id,
|
||||||
this.location,
|
this.location,
|
||||||
|
@ -4795,6 +4805,7 @@ class Func extends Obj implements FuncRef {
|
||||||
isStatic = json['static'] ?? false;
|
isStatic = json['static'] ?? false;
|
||||||
isConst = json['const'] ?? false;
|
isConst = json['const'] ?? false;
|
||||||
implicit = json['implicit'] ?? false;
|
implicit = json['implicit'] ?? false;
|
||||||
|
isAbstract = json['abstract'] ?? false;
|
||||||
location = createServiceObject(json['location'], const ['SourceLocation'])
|
location = createServiceObject(json['location'], const ['SourceLocation'])
|
||||||
as SourceLocation?;
|
as SourceLocation?;
|
||||||
signature = createServiceObject(json['signature'], const ['InstanceRef'])
|
signature = createServiceObject(json['signature'], const ['InstanceRef'])
|
||||||
|
@ -4815,6 +4826,7 @@ class Func extends Obj implements FuncRef {
|
||||||
'static': isStatic,
|
'static': isStatic,
|
||||||
'const': isConst,
|
'const': isConst,
|
||||||
'implicit': implicit,
|
'implicit': implicit,
|
||||||
|
'abstract': isAbstract,
|
||||||
'signature': signature?.toJson(),
|
'signature': signature?.toJson(),
|
||||||
});
|
});
|
||||||
_setIfNotNull(json, 'location', location?.toJson());
|
_setIfNotNull(json, 'location', location?.toJson());
|
||||||
|
@ -4828,7 +4840,7 @@ class Func extends Obj implements FuncRef {
|
||||||
|
|
||||||
String toString() => '[Func ' //
|
String toString() => '[Func ' //
|
||||||
'id: ${id}, name: ${name}, owner: ${owner}, isStatic: ${isStatic}, ' //
|
'id: ${id}, name: ${name}, owner: ${owner}, isStatic: ${isStatic}, ' //
|
||||||
'isConst: ${isConst}, implicit: ${implicit}, signature: ${signature}]';
|
'isConst: ${isConst}, implicit: ${implicit}, isAbstract: ${isAbstract}, signature: ${signature}]';
|
||||||
}
|
}
|
||||||
|
|
||||||
/// `InstanceRef` is a reference to an `Instance`.
|
/// `InstanceRef` is a reference to an `Instance`.
|
||||||
|
@ -6322,7 +6334,9 @@ class LogRecord extends Response {
|
||||||
return json;
|
return json;
|
||||||
}
|
}
|
||||||
|
|
||||||
String toString() => '[LogRecord]';
|
String toString() => '[LogRecord ' //
|
||||||
|
'message: ${message}, time: ${time}, level: ${level}, sequenceNumber: ${sequenceNumber}, ' //
|
||||||
|
'loggerName: ${loggerName}, zone: ${zone}, error: ${error}, stackTrace: ${stackTrace}]';
|
||||||
}
|
}
|
||||||
|
|
||||||
class MapAssociation {
|
class MapAssociation {
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
name: vm_service
|
name: vm_service
|
||||||
version: 9.0.0
|
version: 10.0.0
|
||||||
description: >-
|
description: >-
|
||||||
A library to communicate with a service implementing the Dart VM
|
A library to communicate with a service implementing the Dart VM
|
||||||
service protocol.
|
service protocol.
|
||||||
|
|
|
@ -1611,7 +1611,8 @@ Map<String, dynamic> toJson() {
|
||||||
// toString()
|
// toString()
|
||||||
Iterable<TypeField> toStringFields =
|
Iterable<TypeField> toStringFields =
|
||||||
getAllFields().where((f) => !f.optional);
|
getAllFields().where((f) => !f.optional);
|
||||||
if (toStringFields.length <= 7) {
|
const maxFieldsShownInToString = 8;
|
||||||
|
if (toStringFields.length <= maxFieldsShownInToString) {
|
||||||
String properties = toStringFields
|
String properties = toStringFields
|
||||||
.map(
|
.map(
|
||||||
(TypeField f) => "${f.generatableName}: \${${f.generatableName}}")
|
(TypeField f) => "${f.generatableName}: \${${f.generatableName}}")
|
||||||
|
|
|
@ -11,12 +11,17 @@ import 'package:test/test.dart';
|
||||||
import 'service_test_common.dart';
|
import 'service_test_common.dart';
|
||||||
import 'test_helper.dart';
|
import 'test_helper.dart';
|
||||||
|
|
||||||
class _DummyClass {
|
abstract class _DummyAbstractBaseClass {
|
||||||
|
void dummyFunction(int a, [bool b = false]);
|
||||||
|
}
|
||||||
|
|
||||||
|
class _DummyClass extends _DummyAbstractBaseClass {
|
||||||
static var dummyVar = 11;
|
static var dummyVar = 11;
|
||||||
final List<String> dummyList = new List<String>.filled(20, '');
|
final List<String> dummyList = new List<String>.filled(20, '');
|
||||||
static var dummyVarWithInit = foo();
|
static var dummyVarWithInit = foo();
|
||||||
late String dummyLateVarWithInit = 'bar';
|
late String dummyLateVarWithInit = 'bar';
|
||||||
late String dummyLateVar;
|
late String dummyLateVar;
|
||||||
|
@override
|
||||||
void dummyFunction(int a, [bool b = false]) {}
|
void dummyFunction(int a, [bool b = false]) {}
|
||||||
void dummyGenericFunction<K, V>(K a, {required V param}) {}
|
void dummyGenericFunction<K, V>(K a, {required V param}) {}
|
||||||
static List foo() => List<String>.filled(20, '');
|
static List foo() => List<String>.filled(20, '');
|
||||||
|
@ -889,6 +894,7 @@ var tests = <IsolateTest>[
|
||||||
expect(result['static'], equals(false));
|
expect(result['static'], equals(false));
|
||||||
expect(result['const'], equals(false));
|
expect(result['const'], equals(false));
|
||||||
expect(result['implicit'], equals(false));
|
expect(result['implicit'], equals(false));
|
||||||
|
expect(result['abstract'], equals(false));
|
||||||
expect(result['signature']['typeParameters'], isNull);
|
expect(result['signature']['typeParameters'], isNull);
|
||||||
expect(result['signature']['returnType'], isNotNull);
|
expect(result['signature']['returnType'], isNotNull);
|
||||||
expect(result['signature']['parameters'].length, 3);
|
expect(result['signature']['parameters'].length, 3);
|
||||||
|
@ -923,6 +929,7 @@ var tests = <IsolateTest>[
|
||||||
expect(result['static'], equals(false));
|
expect(result['static'], equals(false));
|
||||||
expect(result['const'], equals(false));
|
expect(result['const'], equals(false));
|
||||||
expect(result['implicit'], equals(false));
|
expect(result['implicit'], equals(false));
|
||||||
|
expect(result['abstract'], equals(false));
|
||||||
expect(result['signature']['typeParameters'].length, 2);
|
expect(result['signature']['typeParameters'].length, 2);
|
||||||
expect(result['signature']['returnType'], isNotNull);
|
expect(result['signature']['returnType'], isNotNull);
|
||||||
expect(result['signature']['parameters'].length, 3);
|
expect(result['signature']['parameters'].length, 3);
|
||||||
|
@ -943,6 +950,60 @@ var tests = <IsolateTest>[
|
||||||
expect(result['_deoptimizations'], isZero);
|
expect(result['_deoptimizations'], isZero);
|
||||||
},
|
},
|
||||||
|
|
||||||
|
// abstract function.
|
||||||
|
(Isolate isolate) async {
|
||||||
|
// Call eval to get a class id.
|
||||||
|
var evalResult = await invoke(isolate, 'getDummyClass');
|
||||||
|
var result = await isolate.invokeRpcNoUpgrade('getObject', {
|
||||||
|
'objectId': evalResult['class']['id'],
|
||||||
|
});
|
||||||
|
expect(result['type'], equals('Class'));
|
||||||
|
expect(result['id'], startsWith('classes/'));
|
||||||
|
expect(result['name'], equals('_DummyClass'));
|
||||||
|
expect(result['abstract'], equals(false));
|
||||||
|
|
||||||
|
// Get the super class.
|
||||||
|
var superClass = await isolate.invokeRpcNoUpgrade('getObject', {
|
||||||
|
'objectId': result['super']['id'],
|
||||||
|
});
|
||||||
|
expect(superClass['type'], equals('Class'));
|
||||||
|
expect(superClass['id'], startsWith('classes/'));
|
||||||
|
expect(superClass['name'], equals('_DummyAbstractBaseClass'));
|
||||||
|
expect(superClass['abstract'], equals(true));
|
||||||
|
|
||||||
|
// Find the abstract dummyFunction on the super class.
|
||||||
|
var funcId = superClass['functions']
|
||||||
|
.firstWhere((f) => f['name'] == 'dummyFunction')['id'];
|
||||||
|
var funcResult = await isolate.invokeRpcNoUpgrade('getObject', {
|
||||||
|
'objectId': funcId,
|
||||||
|
});
|
||||||
|
|
||||||
|
expect(funcResult['type'], equals('Function'));
|
||||||
|
expect(funcResult['id'], equals(funcId));
|
||||||
|
expect(funcResult['name'], equals('dummyFunction'));
|
||||||
|
expect(funcResult['_kind'], equals('RegularFunction'));
|
||||||
|
expect(funcResult['static'], equals(false));
|
||||||
|
expect(funcResult['const'], equals(false));
|
||||||
|
expect(funcResult['implicit'], equals(false));
|
||||||
|
expect(funcResult['abstract'], equals(true));
|
||||||
|
expect(funcResult['signature']['typeParameters'], isNull);
|
||||||
|
expect(funcResult['signature']['returnType'], isNotNull);
|
||||||
|
expect(funcResult['signature']['parameters'].length, 3);
|
||||||
|
expect(funcResult['signature']['parameters'][1]['parameterType']['name'],
|
||||||
|
equals('int'));
|
||||||
|
expect(funcResult['signature']['parameters'][1]['fixed'], isTrue);
|
||||||
|
expect(funcResult['signature']['parameters'][2]['parameterType']['name'],
|
||||||
|
equals('bool'));
|
||||||
|
expect(funcResult['signature']['parameters'][2]['fixed'], isFalse);
|
||||||
|
expect(funcResult['location']['type'], equals('SourceLocation'));
|
||||||
|
expect(funcResult['code']['type'], equals('@Code'));
|
||||||
|
expect(funcResult['_optimizable'], equals(true));
|
||||||
|
expect(funcResult['_inlinable'], equals(true));
|
||||||
|
expect(funcResult['_usageCounter'], isZero);
|
||||||
|
expect(funcResult['_optimizedCallSiteCount'], isZero);
|
||||||
|
expect(funcResult['_deoptimizations'], isZero);
|
||||||
|
},
|
||||||
|
|
||||||
// invalid function.
|
// invalid function.
|
||||||
(Isolate isolate) async {
|
(Isolate isolate) async {
|
||||||
// Call eval to get a class id.
|
// Call eval to get a class id.
|
||||||
|
@ -1002,6 +1063,7 @@ var tests = <IsolateTest>[
|
||||||
expect(result['static'], equals(true));
|
expect(result['static'], equals(true));
|
||||||
expect(result['const'], equals(false));
|
expect(result['const'], equals(false));
|
||||||
expect(result['implicit'], equals(false));
|
expect(result['implicit'], equals(false));
|
||||||
|
expect(result['abstract'], equals(false));
|
||||||
expect(result['signature']['typeParameters'], isNull);
|
expect(result['signature']['typeParameters'], isNull);
|
||||||
expect(result['signature']['returnType'], isNotNull);
|
expect(result['signature']['returnType'], isNotNull);
|
||||||
expect(result['signature']['parameters'].length, 0);
|
expect(result['signature']['parameters'].length, 0);
|
||||||
|
@ -1030,6 +1092,7 @@ var tests = <IsolateTest>[
|
||||||
expect(result['static'], equals(false));
|
expect(result['static'], equals(false));
|
||||||
expect(result['const'], equals(false));
|
expect(result['const'], equals(false));
|
||||||
expect(result['implicit'], equals(false));
|
expect(result['implicit'], equals(false));
|
||||||
|
expect(result['abstract'], equals(false));
|
||||||
expect(result['signature']['typeParameters'], isNull);
|
expect(result['signature']['typeParameters'], isNull);
|
||||||
expect(result['signature']['returnType'], isNotNull);
|
expect(result['signature']['returnType'], isNotNull);
|
||||||
expect(result['signature']['parameters'].length, 1);
|
expect(result['signature']['parameters'].length, 1);
|
||||||
|
|
|
@ -12,7 +12,7 @@ var tests = <VMTest>[
|
||||||
final result = await vm.invokeRpcNoUpgrade('getVersion', {});
|
final result = await vm.invokeRpcNoUpgrade('getVersion', {});
|
||||||
expect(result['type'], 'Version');
|
expect(result['type'], 'Version');
|
||||||
expect(result['major'], 3);
|
expect(result['major'], 3);
|
||||||
expect(result['minor'], 57);
|
expect(result['minor'], 59);
|
||||||
expect(result['_privateMajor'], 0);
|
expect(result['_privateMajor'], 0);
|
||||||
expect(result['_privateMinor'], 0);
|
expect(result['_privateMinor'], 0);
|
||||||
},
|
},
|
||||||
|
|
|
@ -11,10 +11,15 @@ import 'package:test/test.dart';
|
||||||
import 'service_test_common.dart';
|
import 'service_test_common.dart';
|
||||||
import 'test_helper.dart';
|
import 'test_helper.dart';
|
||||||
|
|
||||||
class _DummyClass {
|
abstract class _DummyAbstractBaseClass {
|
||||||
|
void dummyFunction(int a, [bool b = false]);
|
||||||
|
}
|
||||||
|
|
||||||
|
class _DummyClass extends _DummyAbstractBaseClass {
|
||||||
static var dummyVar = 11;
|
static var dummyVar = 11;
|
||||||
final List<String> dummyList = new List<String>.filled(20, null);
|
final List<String> dummyList = new List<String>.filled(20, null);
|
||||||
static var dummyVarWithInit = foo();
|
static var dummyVarWithInit = foo();
|
||||||
|
@override
|
||||||
void dummyFunction(int a, [bool b = false]) {}
|
void dummyFunction(int a, [bool b = false]) {}
|
||||||
void dummyGenericFunction<K, V>(K a, {V param}) {}
|
void dummyGenericFunction<K, V>(K a, {V param}) {}
|
||||||
static List foo() => List<String>.filled(20, '');
|
static List foo() => List<String>.filled(20, '');
|
||||||
|
@ -886,6 +891,7 @@ var tests = <IsolateTest>[
|
||||||
expect(result['static'], equals(false));
|
expect(result['static'], equals(false));
|
||||||
expect(result['const'], equals(false));
|
expect(result['const'], equals(false));
|
||||||
expect(result['implicit'], equals(false));
|
expect(result['implicit'], equals(false));
|
||||||
|
expect(result['abstract'], equals(false));
|
||||||
expect(result['signature']['typeParameters'], isNull);
|
expect(result['signature']['typeParameters'], isNull);
|
||||||
expect(result['signature']['returnType'], isNotNull);
|
expect(result['signature']['returnType'], isNotNull);
|
||||||
expect(result['signature']['parameters'].length, 3);
|
expect(result['signature']['parameters'].length, 3);
|
||||||
|
@ -920,6 +926,7 @@ var tests = <IsolateTest>[
|
||||||
expect(result['static'], equals(false));
|
expect(result['static'], equals(false));
|
||||||
expect(result['const'], equals(false));
|
expect(result['const'], equals(false));
|
||||||
expect(result['implicit'], equals(false));
|
expect(result['implicit'], equals(false));
|
||||||
|
expect(result['abstract'], equals(false));
|
||||||
expect(result['signature']['typeParameters'].length, 2);
|
expect(result['signature']['typeParameters'].length, 2);
|
||||||
expect(result['signature']['returnType'], isNotNull);
|
expect(result['signature']['returnType'], isNotNull);
|
||||||
expect(result['signature']['parameters'].length, 3);
|
expect(result['signature']['parameters'].length, 3);
|
||||||
|
@ -940,6 +947,60 @@ var tests = <IsolateTest>[
|
||||||
expect(result['_deoptimizations'], isZero);
|
expect(result['_deoptimizations'], isZero);
|
||||||
},
|
},
|
||||||
|
|
||||||
|
// abstract function.
|
||||||
|
(Isolate isolate) async {
|
||||||
|
// Call eval to get a class id.
|
||||||
|
var evalResult = await invoke(isolate, 'getDummyClass');
|
||||||
|
var result = await isolate.invokeRpcNoUpgrade('getObject', {
|
||||||
|
'objectId': evalResult['class']['id'],
|
||||||
|
});
|
||||||
|
expect(result['type'], equals('Class'));
|
||||||
|
expect(result['id'], startsWith('classes/'));
|
||||||
|
expect(result['name'], equals('_DummyClass'));
|
||||||
|
expect(result['abstract'], equals(false));
|
||||||
|
|
||||||
|
// Get the super class.
|
||||||
|
var superClass = await isolate.invokeRpcNoUpgrade('getObject', {
|
||||||
|
'objectId': result['super']['id'],
|
||||||
|
});
|
||||||
|
expect(superClass['type'], equals('Class'));
|
||||||
|
expect(superClass['id'], startsWith('classes/'));
|
||||||
|
expect(superClass['name'], equals('_DummyAbstractBaseClass'));
|
||||||
|
expect(superClass['abstract'], equals(true));
|
||||||
|
|
||||||
|
// Find the abstract dummyFunction on the super class.
|
||||||
|
var funcId = superClass['functions']
|
||||||
|
.firstWhere((f) => f['name'] == 'dummyFunction')['id'];
|
||||||
|
var funcResult = await isolate.invokeRpcNoUpgrade('getObject', {
|
||||||
|
'objectId': funcId,
|
||||||
|
});
|
||||||
|
|
||||||
|
expect(funcResult['type'], equals('Function'));
|
||||||
|
expect(funcResult['id'], equals(funcId));
|
||||||
|
expect(funcResult['name'], equals('dummyFunction'));
|
||||||
|
expect(funcResult['_kind'], equals('RegularFunction'));
|
||||||
|
expect(funcResult['static'], equals(false));
|
||||||
|
expect(funcResult['const'], equals(false));
|
||||||
|
expect(funcResult['implicit'], equals(false));
|
||||||
|
expect(funcResult['abstract'], equals(true));
|
||||||
|
expect(funcResult['signature']['typeParameters'], isNull);
|
||||||
|
expect(funcResult['signature']['returnType'], isNotNull);
|
||||||
|
expect(funcResult['signature']['parameters'].length, 3);
|
||||||
|
expect(funcResult['signature']['parameters'][1]['parameterType']['name'],
|
||||||
|
equals('int'));
|
||||||
|
expect(funcResult['signature']['parameters'][1]['fixed'], isTrue);
|
||||||
|
expect(funcResult['signature']['parameters'][2]['parameterType']['name'],
|
||||||
|
equals('bool'));
|
||||||
|
expect(funcResult['signature']['parameters'][2]['fixed'], isFalse);
|
||||||
|
expect(funcResult['location']['type'], equals('SourceLocation'));
|
||||||
|
expect(funcResult['code']['type'], equals('@Code'));
|
||||||
|
expect(funcResult['_optimizable'], equals(true));
|
||||||
|
expect(funcResult['_inlinable'], equals(true));
|
||||||
|
expect(funcResult['_usageCounter'], isZero);
|
||||||
|
expect(funcResult['_optimizedCallSiteCount'], isZero);
|
||||||
|
expect(funcResult['_deoptimizations'], isZero);
|
||||||
|
},
|
||||||
|
|
||||||
// invalid function.
|
// invalid function.
|
||||||
(Isolate isolate) async {
|
(Isolate isolate) async {
|
||||||
// Call eval to get a class id.
|
// Call eval to get a class id.
|
||||||
|
@ -1032,6 +1093,7 @@ var tests = <IsolateTest>[
|
||||||
expect(result['static'], equals(true));
|
expect(result['static'], equals(true));
|
||||||
expect(result['const'], equals(false));
|
expect(result['const'], equals(false));
|
||||||
expect(result['implicit'], equals(false));
|
expect(result['implicit'], equals(false));
|
||||||
|
expect(result['abstract'], equals(false));
|
||||||
expect(result['signature']['typeParameters'], isNull);
|
expect(result['signature']['typeParameters'], isNull);
|
||||||
expect(result['signature']['returnType'], isNotNull);
|
expect(result['signature']['returnType'], isNotNull);
|
||||||
expect(result['signature']['parameters'].length, 0);
|
expect(result['signature']['parameters'].length, 0);
|
||||||
|
|
|
@ -12,7 +12,7 @@ var tests = <VMTest>[
|
||||||
final result = await vm.invokeRpcNoUpgrade('getVersion', {});
|
final result = await vm.invokeRpcNoUpgrade('getVersion', {});
|
||||||
expect(result['type'], equals('Version'));
|
expect(result['type'], equals('Version'));
|
||||||
expect(result['major'], equals(3));
|
expect(result['major'], equals(3));
|
||||||
expect(result['minor'], equals(57));
|
expect(result['minor'], equals(59));
|
||||||
expect(result['_privateMajor'], equals(0));
|
expect(result['_privateMajor'], equals(0));
|
||||||
expect(result['_privateMinor'], equals(0));
|
expect(result['_privateMinor'], equals(0));
|
||||||
},
|
},
|
||||||
|
|
|
@ -341,6 +341,7 @@ void Function::PrintJSONImpl(JSONStream* stream, bool ref) const {
|
||||||
jsobj.AddProperty("static", is_static());
|
jsobj.AddProperty("static", is_static());
|
||||||
jsobj.AddProperty("const", is_const());
|
jsobj.AddProperty("const", is_const());
|
||||||
jsobj.AddProperty("implicit", IsImplicitGetterOrSetter());
|
jsobj.AddProperty("implicit", IsImplicitGetterOrSetter());
|
||||||
|
jsobj.AddProperty("abstract", is_abstract());
|
||||||
jsobj.AddProperty("_intrinsic", is_intrinsic());
|
jsobj.AddProperty("_intrinsic", is_intrinsic());
|
||||||
jsobj.AddProperty("_native", is_native());
|
jsobj.AddProperty("_native", is_native());
|
||||||
|
|
||||||
|
|
|
@ -5890,7 +5890,7 @@ ISOLATE_UNIT_TEST_CASE(PrintJSONPrimitives) {
|
||||||
"\"library\":{\"type\":\"@Library\",\"fixedId\":true,\"id\":\"\","
|
"\"library\":{\"type\":\"@Library\",\"fixedId\":true,\"id\":\"\","
|
||||||
"\"name\":\"dart.core\",\"uri\":\"dart:core\"}},"
|
"\"name\":\"dart.core\",\"uri\":\"dart:core\"}},"
|
||||||
"\"_kind\":\"RegularFunction\",\"static\":false,\"const\":false,"
|
"\"_kind\":\"RegularFunction\",\"static\":false,\"const\":false,"
|
||||||
"\"implicit\":false,"
|
"\"implicit\":false,\"abstract\":false,"
|
||||||
"\"_intrinsic\":false,\"_native\":false,"
|
"\"_intrinsic\":false,\"_native\":false,"
|
||||||
"\"location\":{\"type\":\"SourceLocation\","
|
"\"location\":{\"type\":\"SourceLocation\","
|
||||||
"\"script\":{\"type\":\"@Script\",\"fixedId\":true,\"id\":\"\","
|
"\"script\":{\"type\":\"@Script\",\"fixedId\":true,\"id\":\"\","
|
||||||
|
|
|
@ -17,7 +17,7 @@
|
||||||
namespace dart {
|
namespace dart {
|
||||||
|
|
||||||
#define SERVICE_PROTOCOL_MAJOR_VERSION 3
|
#define SERVICE_PROTOCOL_MAJOR_VERSION 3
|
||||||
#define SERVICE_PROTOCOL_MINOR_VERSION 57
|
#define SERVICE_PROTOCOL_MINOR_VERSION 59
|
||||||
|
|
||||||
class Array;
|
class Array;
|
||||||
class EmbedderServiceHandler;
|
class EmbedderServiceHandler;
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
# Dart VM Service Protocol 3.58
|
# Dart VM Service Protocol 3.59
|
||||||
|
|
||||||
> Please post feedback to the [observatory-discuss group][discuss-list]
|
> Please post feedback to the [observatory-discuss group][discuss-list]
|
||||||
|
|
||||||
|
@ -2596,6 +2596,9 @@ class @Function extends @Object {
|
||||||
// Is this function implicitly defined (e.g., implicit getter/setter)?
|
// Is this function implicitly defined (e.g., implicit getter/setter)?
|
||||||
bool implicit;
|
bool implicit;
|
||||||
|
|
||||||
|
// Is this function an abstract method?
|
||||||
|
bool abstract;
|
||||||
|
|
||||||
// The location of this function in the source code.
|
// The location of this function in the source code.
|
||||||
//
|
//
|
||||||
// Note: this may not agree with the location of `owner` if this is a function
|
// Note: this may not agree with the location of `owner` if this is a function
|
||||||
|
@ -2628,6 +2631,9 @@ class Function extends Object {
|
||||||
// Is this function implicitly defined (e.g., implicit getter/setter)?
|
// Is this function implicitly defined (e.g., implicit getter/setter)?
|
||||||
bool implicit;
|
bool implicit;
|
||||||
|
|
||||||
|
// Is this function an abstract method?
|
||||||
|
bool abstract;
|
||||||
|
|
||||||
// The location of this function in the source code.
|
// The location of this function in the source code.
|
||||||
//
|
//
|
||||||
// Note: this may not agree with the location of `owner` if this is a function
|
// Note: this may not agree with the location of `owner` if this is a function
|
||||||
|
@ -4372,5 +4378,6 @@ version | comments
|
||||||
3.56 | Added optional `line` and `column` properties to `SourceLocation`. Added a new `SourceReportKind`, `BranchCoverage`, which reports branch level coverage information.
|
3.56 | Added optional `line` and `column` properties to `SourceLocation`. Added a new `SourceReportKind`, `BranchCoverage`, which reports branch level coverage information.
|
||||||
3.57 | Added optional `libraryFilters` parameter to `getSourceReport` RPC.
|
3.57 | Added optional `libraryFilters` parameter to `getSourceReport` RPC.
|
||||||
3.58 | Added optional `local` parameter to `lookupResolvedPackageUris` RPC.
|
3.58 | Added optional `local` parameter to `lookupResolvedPackageUris` RPC.
|
||||||
|
3.59 | Added `abstract` property to `@Function` and `Function`.
|
||||||
|
|
||||||
[discuss-list]: https://groups.google.com/a/dartlang.org/forum/#!forum/observatory-discuss
|
[discuss-list]: https://groups.google.com/a/dartlang.org/forum/#!forum/observatory-discuss
|
||||||
|
|
|
@ -603,7 +603,7 @@ ISOLATE_UNIT_TEST_CASE(SourceReport_CallSites_SimpleCall) {
|
||||||
"\"name\":\"helper0\",\"owner\":{\"type\":\"@Library\",\"fixedId\":true,"
|
"\"name\":\"helper0\",\"owner\":{\"type\":\"@Library\",\"fixedId\":true,"
|
||||||
"\"id\":\"\",\"name\":\"\",\"uri\":\"file:\\/\\/\\/test-lib\"},"
|
"\"id\":\"\",\"name\":\"\",\"uri\":\"file:\\/\\/\\/test-lib\"},"
|
||||||
"\"_kind\":\"RegularFunction\",\"static\":true,\"const\":false,"
|
"\"_kind\":\"RegularFunction\",\"static\":true,\"const\":false,"
|
||||||
"\"implicit\":false,"
|
"\"implicit\":false,\"abstract\":false,"
|
||||||
"\"_intrinsic\":false,\"_native\":false,\"location\":{\"type\":"
|
"\"_intrinsic\":false,\"_native\":false,\"location\":{\"type\":"
|
||||||
"\"SourceLocation\",\"script\":{\"type\":\"@Script\",\"fixedId\":true,"
|
"\"SourceLocation\",\"script\":{\"type\":\"@Script\",\"fixedId\":true,"
|
||||||
"\"id\":\"\",\"uri\":\"file:\\/\\/\\/test-lib\",\"_kind\":\"kernel\"},"
|
"\"id\":\"\",\"uri\":\"file:\\/\\/\\/test-lib\",\"_kind\":\"kernel\"},"
|
||||||
|
@ -687,8 +687,8 @@ ISOLATE_UNIT_TEST_CASE(SourceReport_CallSites_PolymorphicCall) {
|
||||||
"\"library\":{\"type\":\"@Library\",\"fixedId\":true,"
|
"\"library\":{\"type\":\"@Library\",\"fixedId\":true,"
|
||||||
"\"id\":\"\",\"name\":\"\",\"uri\":\"file:\\/\\/\\/test-lib\"}"
|
"\"id\":\"\",\"name\":\"\",\"uri\":\"file:\\/\\/\\/test-lib\"}"
|
||||||
"},\"_kind\":\"RegularFunction\","
|
"},\"_kind\":\"RegularFunction\","
|
||||||
"\"static\":false,\"const\":false,\"implicit\":false,\"_intrinsic\":"
|
"\"static\":false,\"const\":false,\"implicit\":false,\"abstract\":"
|
||||||
"false,"
|
"false,\"_intrinsic\":false,"
|
||||||
"\"_native\":false,"
|
"\"_native\":false,"
|
||||||
"\"location\":{\"type\":\"SourceLocation\","
|
"\"location\":{\"type\":\"SourceLocation\","
|
||||||
"\"script\":{\"type\":\"@Script\",\"fixedId\":true,"
|
"\"script\":{\"type\":\"@Script\",\"fixedId\":true,"
|
||||||
|
@ -723,8 +723,8 @@ ISOLATE_UNIT_TEST_CASE(SourceReport_CallSites_PolymorphicCall) {
|
||||||
"\"library\":{\"type\":\"@Library\",\"fixedId\":true,"
|
"\"library\":{\"type\":\"@Library\",\"fixedId\":true,"
|
||||||
"\"id\":\"\",\"name\":\"\",\"uri\":\"file:\\/\\/\\/test-lib\"}"
|
"\"id\":\"\",\"name\":\"\",\"uri\":\"file:\\/\\/\\/test-lib\"}"
|
||||||
"},\"_kind\":\"RegularFunction\","
|
"},\"_kind\":\"RegularFunction\","
|
||||||
"\"static\":false,\"const\":false,\"implicit\":false,\"_intrinsic\":"
|
"\"static\":false,\"const\":false,\"implicit\":false,\"abstract\":"
|
||||||
"false,"
|
"false,\"_intrinsic\":false,"
|
||||||
"\"_native\":false,"
|
"\"_native\":false,"
|
||||||
"\"location\":{\"type\":\"SourceLocation\","
|
"\"location\":{\"type\":\"SourceLocation\","
|
||||||
"\"script\":{\"type\":\"@Script\",\"fixedId\":true,"
|
"\"script\":{\"type\":\"@Script\",\"fixedId\":true,"
|
||||||
|
@ -782,7 +782,7 @@ ISOLATE_UNIT_TEST_CASE(SourceReport_MultipleReports) {
|
||||||
"\"name\":\"helper0\",\"owner\":{\"type\":\"@Library\",\"fixedId\":true,"
|
"\"name\":\"helper0\",\"owner\":{\"type\":\"@Library\",\"fixedId\":true,"
|
||||||
"\"id\":\"\",\"name\":\"\",\"uri\":\"file:\\/\\/\\/test-lib\"},\"_"
|
"\"id\":\"\",\"name\":\"\",\"uri\":\"file:\\/\\/\\/test-lib\"},\"_"
|
||||||
"kind\":\"RegularFunction\",\"static\":true,\"const\":false,\"implicit\":"
|
"kind\":\"RegularFunction\",\"static\":true,\"const\":false,\"implicit\":"
|
||||||
"false,\"_"
|
"false,\"abstract\":false,\"_"
|
||||||
"intrinsic\":false,\"_native\":false,\"location\":{\"type\":"
|
"intrinsic\":false,\"_native\":false,\"location\":{\"type\":"
|
||||||
"\"SourceLocation\",\"script\":{\"type\":\"@Script\",\"fixedId\":true,"
|
"\"SourceLocation\",\"script\":{\"type\":\"@Script\",\"fixedId\":true,"
|
||||||
"\"id\":\"\",\"uri\":\"file:\\/\\/\\/test-lib\",\"_kind\":\"kernel\"},"
|
"\"id\":\"\",\"uri\":\"file:\\/\\/\\/test-lib\",\"_kind\":\"kernel\"},"
|
||||||
|
|
Loading…
Reference in a new issue