Skip to content

Commit

Permalink
Generate interop extension types instead of @staticInterop classes (d…
Browse files Browse the repository at this point in the history
…art-lang#146)

- Refactors code around generating the JS type hierarchy
- Updates constraints on code_builder and dart_style
- Refactors code around generating @js annotations
- Handles incompatible SVGElement.className member via extension members

Change-Id: I272eb330f3e0b675ab470ccdae8b49a5c3bf3b78
  • Loading branch information
srujzs authored Jan 25, 2024
1 parent d17fdd2 commit c0fdc17
Show file tree
Hide file tree
Showing 278 changed files with 2,500 additions and 11,679 deletions.
6 changes: 4 additions & 2 deletions .github/workflows/build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,8 @@ jobs:
strategy:
fail-fast: false
matrix:
sdk: [stable]
# TODO(srujzs): Replace with stable when 3.3 is out.
sdk: [beta]
steps:
- uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11
- uses: dart-lang/setup-dart@b64355ae6ca0b5d484f0106a033dd1388965d06d
Expand All @@ -45,7 +46,8 @@ jobs:
fail-fast: false
matrix:
os: [ubuntu-latest]
sdk: [dev, beta, stable]
# TODO(srujzs): Add back stable when 3.3 is out.
sdk: [dev, beta]
steps:
- uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11
- uses: dart-lang/setup-dart@b64355ae6ca0b5d484f0106a033dd1388965d06d
Expand Down
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
`package:web` classes.
- Contribute a markdown file for the renamed classes from `dart:html` to
`package:web` (see [renames.md](tool/renames.md)).
- Migrate classes to use interop extension types that implement `JSObject`.

## 0.4.2

Expand Down
49 changes: 11 additions & 38 deletions lib/src/dom/accelerometer.dart
Original file line number Diff line number Diff line change
Expand Up @@ -9,75 +9,48 @@ import 'dart:js_interop';
import 'generic_sensor.dart';

typedef AccelerometerLocalCoordinateSystem = String;

@JS('Accelerometer')
@staticInterop
class Accelerometer implements Sensor {
extension type Accelerometer._(JSObject _) implements Sensor, JSObject {
external factory Accelerometer([AccelerometerSensorOptions options]);
}

extension AccelerometerExtension on Accelerometer {
external num? get x;
external num? get y;
external num? get z;
}

@JS()
@staticInterop
@anonymous
class AccelerometerSensorOptions implements SensorOptions {
extension type AccelerometerSensorOptions._(JSObject _)
implements SensorOptions, JSObject {
external factory AccelerometerSensorOptions(
{AccelerometerLocalCoordinateSystem referenceFrame});
}

extension AccelerometerSensorOptionsExtension on AccelerometerSensorOptions {
external set referenceFrame(AccelerometerLocalCoordinateSystem value);
external AccelerometerLocalCoordinateSystem get referenceFrame;
}

@JS('LinearAccelerationSensor')
@staticInterop
class LinearAccelerationSensor implements Accelerometer {
extension type LinearAccelerationSensor._(JSObject _)
implements Accelerometer, JSObject {
external factory LinearAccelerationSensor(
[AccelerometerSensorOptions options]);
}

@JS('GravitySensor')
@staticInterop
class GravitySensor implements Accelerometer {
extension type GravitySensor._(JSObject _) implements Accelerometer, JSObject {
external factory GravitySensor([AccelerometerSensorOptions options]);
}

@JS()
@staticInterop
@anonymous
class AccelerometerReadingValues {
extension type AccelerometerReadingValues._(JSObject _) implements JSObject {
external factory AccelerometerReadingValues({
required num? x,
required num? y,
required num? z,
});
}

extension AccelerometerReadingValuesExtension on AccelerometerReadingValues {
external set x(num? value);
external num? get x;
external set y(num? value);
external num? get y;
external set z(num? value);
external num? get z;
}

@JS()
@staticInterop
@anonymous
class LinearAccelerationReadingValues implements AccelerometerReadingValues {
extension type LinearAccelerationReadingValues._(JSObject _)
implements AccelerometerReadingValues, JSObject {
external factory LinearAccelerationReadingValues();
}

@JS()
@staticInterop
@anonymous
class GravityReadingValues implements AccelerometerReadingValues {
extension type GravityReadingValues._(JSObject _)
implements AccelerometerReadingValues, JSObject {
external factory GravityReadingValues();
}
14 changes: 2 additions & 12 deletions lib/src/dom/ambient_light.dart
Original file line number Diff line number Diff line change
Expand Up @@ -8,24 +8,14 @@ import 'dart:js_interop';

import 'generic_sensor.dart';

@JS('AmbientLightSensor')
@staticInterop
class AmbientLightSensor implements Sensor {
extension type AmbientLightSensor._(JSObject _) implements Sensor, JSObject {
external factory AmbientLightSensor([SensorOptions sensorOptions]);
}

extension AmbientLightSensorExtension on AmbientLightSensor {
external num? get illuminance;
}

@JS()
@staticInterop
@anonymous
class AmbientLightReadingValues {
extension type AmbientLightReadingValues._(JSObject _) implements JSObject {
external factory AmbientLightReadingValues({required num? illuminance});
}

extension AmbientLightReadingValuesExtension on AmbientLightReadingValues {
external set illuminance(num? value);
external num? get illuminance;
}
13 changes: 2 additions & 11 deletions lib/src/dom/anchors.dart
Original file line number Diff line number Diff line change
Expand Up @@ -8,18 +8,9 @@ import 'dart:js_interop';

import 'webxr.dart';

@JS('XRAnchor')
@staticInterop
class XRAnchor {}

extension XRAnchorExtension on XRAnchor {
extension type XRAnchor._(JSObject _) implements JSObject {
external JSPromise requestPersistentHandle();
external void delete();
external XRSpace get anchorSpace;
}

@JS('XRAnchorSet')
@staticInterop
class XRAnchorSet {}

extension XRAnchorSetExtension on XRAnchorSet {}
extension type XRAnchorSet._(JSObject _) implements JSObject {}
7 changes: 1 addition & 6 deletions lib/src/dom/angle_instanced_arrays.dart
Original file line number Diff line number Diff line change
Expand Up @@ -8,13 +8,8 @@ import 'dart:js_interop';

import 'webgl1.dart';

@JS('ANGLE_instanced_arrays')
@staticInterop
class ANGLE_instanced_arrays {
extension type ANGLE_instanced_arrays._(JSObject _) implements JSObject {
external static GLenum get VERTEX_ATTRIB_ARRAY_DIVISOR_ANGLE;
}

extension ANGLEInstancedArraysExtension on ANGLE_instanced_arrays {
external void drawArraysInstancedANGLE(
GLenum mode,
GLint first,
Expand Down
9 changes: 2 additions & 7 deletions lib/src/dom/attribution_reporting_api.dart
Original file line number Diff line number Diff line change
Expand Up @@ -6,18 +6,13 @@

import 'dart:js_interop';

@JS()
@staticInterop
@anonymous
class AttributionReportingRequestOptions {
extension type AttributionReportingRequestOptions._(JSObject _)
implements JSObject {
external factory AttributionReportingRequestOptions({
required bool eventSourceEligible,
required bool triggerEligible,
});
}

extension AttributionReportingRequestOptionsExtension
on AttributionReportingRequestOptions {
external set eventSourceEligible(bool value);
external bool get eventSourceEligible;
external set triggerEligible(bool value);
Expand Down
7 changes: 1 addition & 6 deletions lib/src/dom/audio_output.dart
Original file line number Diff line number Diff line change
Expand Up @@ -6,14 +6,9 @@

import 'dart:js_interop';

@JS()
@staticInterop
@anonymous
class AudioOutputOptions {
extension type AudioOutputOptions._(JSObject _) implements JSObject {
external factory AudioOutputOptions({String deviceId});
}

extension AudioOutputOptionsExtension on AudioOutputOptions {
external set deviceId(String value);
external String get deviceId;
}
7 changes: 1 addition & 6 deletions lib/src/dom/audio_session.dart
Original file line number Diff line number Diff line change
Expand Up @@ -11,12 +11,7 @@ import 'html.dart';

typedef AudioSessionState = String;
typedef AudioSessionType = String;

@JS('AudioSession')
@staticInterop
class AudioSession implements EventTarget {}

extension AudioSessionExtension on AudioSession {
extension type AudioSession._(JSObject _) implements EventTarget, JSObject {
external set type(AudioSessionType value);
external AudioSessionType get type;
external AudioSessionState get state;
Expand Down
65 changes: 13 additions & 52 deletions lib/src/dom/background_fetch.dart
Original file line number Diff line number Diff line change
Expand Up @@ -13,12 +13,7 @@ import 'service_workers.dart';

typedef BackgroundFetchResult = String;
typedef BackgroundFetchFailureReason = String;

@JS('BackgroundFetchManager')
@staticInterop
class BackgroundFetchManager {}

extension BackgroundFetchManagerExtension on BackgroundFetchManager {
extension type BackgroundFetchManager._(JSObject _) implements JSObject {
external JSPromise fetch(
String id,
JSAny requests, [
Expand All @@ -27,41 +22,26 @@ extension BackgroundFetchManagerExtension on BackgroundFetchManager {
external JSPromise get(String id);
external JSPromise getIds();
}

@JS()
@staticInterop
@anonymous
class BackgroundFetchUIOptions {
extension type BackgroundFetchUIOptions._(JSObject _) implements JSObject {
external factory BackgroundFetchUIOptions({
JSArray icons,
String title,
});
}

extension BackgroundFetchUIOptionsExtension on BackgroundFetchUIOptions {
external set icons(JSArray value);
external JSArray get icons;
external set title(String value);
external String get title;
}

@JS()
@staticInterop
@anonymous
class BackgroundFetchOptions implements BackgroundFetchUIOptions {
extension type BackgroundFetchOptions._(JSObject _)
implements BackgroundFetchUIOptions, JSObject {
external factory BackgroundFetchOptions({int downloadTotal});
}

extension BackgroundFetchOptionsExtension on BackgroundFetchOptions {
external set downloadTotal(int value);
external int get downloadTotal;
}

@JS('BackgroundFetchRegistration')
@staticInterop
class BackgroundFetchRegistration implements EventTarget {}

extension BackgroundFetchRegistrationExtension on BackgroundFetchRegistration {
extension type BackgroundFetchRegistration._(JSObject _)
implements EventTarget, JSObject {
external JSPromise abort();
external JSPromise match(
RequestInfo request, [
Expand All @@ -82,52 +62,33 @@ extension BackgroundFetchRegistrationExtension on BackgroundFetchRegistration {
external set onprogress(EventHandler value);
external EventHandler get onprogress;
}

@JS('BackgroundFetchRecord')
@staticInterop
class BackgroundFetchRecord {}

extension BackgroundFetchRecordExtension on BackgroundFetchRecord {
extension type BackgroundFetchRecord._(JSObject _) implements JSObject {
external Request get request;
external JSPromise get responseReady;
}

@JS('BackgroundFetchEvent')
@staticInterop
class BackgroundFetchEvent implements ExtendableEvent {
extension type BackgroundFetchEvent._(JSObject _)
implements ExtendableEvent, JSObject {
external factory BackgroundFetchEvent(
String type,
BackgroundFetchEventInit init,
);
}

extension BackgroundFetchEventExtension on BackgroundFetchEvent {
external BackgroundFetchRegistration get registration;
}

@JS()
@staticInterop
@anonymous
class BackgroundFetchEventInit implements ExtendableEventInit {
extension type BackgroundFetchEventInit._(JSObject _)
implements ExtendableEventInit, JSObject {
external factory BackgroundFetchEventInit(
{required BackgroundFetchRegistration registration});
}

extension BackgroundFetchEventInitExtension on BackgroundFetchEventInit {
external set registration(BackgroundFetchRegistration value);
external BackgroundFetchRegistration get registration;
}

@JS('BackgroundFetchUpdateUIEvent')
@staticInterop
class BackgroundFetchUpdateUIEvent implements BackgroundFetchEvent {
extension type BackgroundFetchUpdateUIEvent._(JSObject _)
implements BackgroundFetchEvent, JSObject {
external factory BackgroundFetchUpdateUIEvent(
String type,
BackgroundFetchEventInit init,
);
}

extension BackgroundFetchUpdateUIEventExtension
on BackgroundFetchUpdateUIEvent {
external JSPromise updateUI([BackgroundFetchUIOptions options]);
}
22 changes: 4 additions & 18 deletions lib/src/dom/background_sync.dart
Original file line number Diff line number Diff line change
Expand Up @@ -8,40 +8,26 @@ import 'dart:js_interop';

import 'service_workers.dart';

@JS('SyncManager')
@staticInterop
class SyncManager {}

extension SyncManagerExtension on SyncManager {
extension type SyncManager._(JSObject _) implements JSObject {
external JSPromise register(String tag);
external JSPromise getTags();
}

@JS('SyncEvent')
@staticInterop
class SyncEvent implements ExtendableEvent {
extension type SyncEvent._(JSObject _) implements ExtendableEvent, JSObject {
external factory SyncEvent(
String type,
SyncEventInit init,
);
}

extension SyncEventExtension on SyncEvent {
external String get tag;
external bool get lastChance;
}

@JS()
@staticInterop
@anonymous
class SyncEventInit implements ExtendableEventInit {
extension type SyncEventInit._(JSObject _)
implements ExtendableEventInit, JSObject {
external factory SyncEventInit({
required String tag,
bool lastChance,
});
}

extension SyncEventInitExtension on SyncEventInit {
external set tag(String value);
external String get tag;
external set lastChance(bool value);
Expand Down
Loading

0 comments on commit c0fdc17

Please sign in to comment.