[js_interop_checks] Update SDK constraint to support Dart 3

The package already uses 3.0 features after 3b294fdab2, but the usage wasn't caught due to https://github.com/dart-lang/sdk/issues/54764.

Since all packages that depend on this all require Dart 3 or greater now, we can increase the constraint and start to take advantage of its features. Also avoids a few checks and lookups :)

Change-Id: Iba539b86dc2f0117406b96e60ed8e92ea9ecf220
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/349161
Reviewed-by: Sigmund Cherem <sigmund@google.com>
Commit-Queue: Sigmund Cherem <sigmund@google.com>
Reviewed-by: Srujan Gaddam <srujzs@google.com>
This commit is contained in:
Parker Lougheed 2024-01-31 01:54:18 +00:00 committed by Commit Queue
parent 853ace7778
commit 4725b282f9
7 changed files with 29 additions and 46 deletions

View file

@ -379,7 +379,7 @@ class JsInteropChecks extends RecursiveVisitor {
(hasDartJSInteropAnnotation(node) ||
_libraryHasDartJSInteropAnnotation)) {
_checkNoParamInitializersForStaticInterop(node.function);
late Annotatable? annotatable;
final Annotatable? annotatable;
if (node.isExtensionTypeMember) {
annotatable = extensionIndex.getExtensionType(node);
} else if (node.isExtensionMember) {
@ -683,7 +683,7 @@ class JsInteropChecks extends RecursiveVisitor {
// TODO(srujzs): Delete the check for patched member once
// https://github.com/dart-lang/sdk/issues/53367 is resolved.
if (member.isExternal && !JsInteropChecks.isPatchedMember(member)) {
var memberKind = '';
final String memberKind;
var memberName = '';
if (member.isExtensionTypeMember) {
// Extension type interop members can not be torn off.
@ -946,7 +946,7 @@ class JsInteropChecks extends RecursiveVisitor {
} else if (type is ExtensionType) {
// Extension types that wrap other allowed types are also okay. Interop
// extension types are handled above, so this is essentially for extension
// types on primtives.
// types on primitives.
return _isAllowedExternalType(type.extensionTypeErasure);
}
return false;

View file

@ -21,13 +21,6 @@ enum ExportStatus {
nonExportable,
}
class GetSet {
Member? getter;
Member? setter;
GetSet(this.getter, this.setter);
}
class ExportChecker {
final JsInteropDiagnosticReporter _diagnosticReporter;
final Map<Reference, Map<String, Set<Member>>> exportClassToMemberMap = {};
@ -45,7 +38,7 @@ class ExportChecker {
///
/// [exports] should be a set of members from the [exportClassToMemberMap]. If
/// missing a getter and/or setter, the corresponding field will be `null`.
GetSet getGetterSetter(Set<Member> exports) {
({Member? getter, Member? setter}) getGetterSetter(Set<Member> exports) {
assert(exports.isNotEmpty && exports.length <= 2);
Member? getter;
Member? setter;
@ -71,7 +64,7 @@ class ExportChecker {
}
}
return GetSet(getter, setter);
return (getter: getter, setter: setter);
}
/// Calculates the overrides, including inheritance, for [cls].
@ -84,7 +77,7 @@ class ExportChecker {
var superclass = cls.superclass;
if (superclass != null && superclass != _objectClass) {
_collectOverrides(superclass);
memberMap = Map.from(_overrideMap[superclass.reference]!);
memberMap = Map.of(_overrideMap[superclass.reference]!);
} else {
memberMap = {};
}
@ -156,8 +149,8 @@ class ExportChecker {
// Walk through the export map and determine if there are any unresolvable
// conflicts.
for (var exportName in exports.keys) {
var existingMembers = exports[exportName]!;
for (var MapEntry(key: exportName, value: existingMembers)
in exports.entries) {
if (existingMembers.length == 1) continue;
if (existingMembers.length == 2) {
// There are two instances where you can resolve collisions:

View file

@ -66,7 +66,7 @@ class JsUtilOptimizer extends Transformer {
final CoreTypes _coreTypes;
final StatefulStaticTypeContext _staticTypeContext;
late final ExtensionIndex _extensionIndex;
final ExtensionIndex _extensionIndex;
JsUtilOptimizer(
this._coreTypes, ClassHierarchy hierarchy, this._extensionIndex)
@ -112,7 +112,7 @@ class JsUtilOptimizer extends Transformer {
TypeEnvironment(_coreTypes, hierarchy));
@override
visitLibrary(Library node) {
TreeNode visitLibrary(Library node) {
_staticTypeContext.enterLibrary(node);
node.transformChildren(this);
_staticTypeContext.leaveLibrary(node);
@ -120,7 +120,7 @@ class JsUtilOptimizer extends Transformer {
}
@override
defaultMember(Member node) {
TreeNode defaultMember(Member node) {
_staticTypeContext.enterMember(node);
node.transformChildren(this);
_staticTypeContext.leaveMember(node);
@ -382,19 +382,13 @@ class JsUtilOptimizer extends Transformer {
// TODO(srujzs): Support more operators for overloading using some
// combination of Dart-defineable operators and @JS renaming for the ones
// that are not renameable.
late Procedure target;
switch (operator) {
case '[]':
target =
shouldTrustType ? _getPropertyTrustTypeTarget : _getPropertyTarget;
break;
case '[]=':
target = _setPropertyTarget;
break;
default:
throw UnimplementedError(
'External operator $operator is unsupported for static interop. ');
}
final target = switch (operator) {
'[]' =>
shouldTrustType ? _getPropertyTrustTypeTarget : _getPropertyTarget,
'[]=' => _setPropertyTarget,
_ => throw UnimplementedError(
'External operator $operator is unsupported for static interop. ')
};
return (Arguments arguments, Expression invocation) {
return StaticInvocation(

View file

@ -276,8 +276,7 @@ class SharedInteropTransformer extends Transformer {
..fileOffset = invocation.fileOffset;
block.add(jsExporter);
for (var exportName in exportMap.keys) {
var exports = exportMap[exportName]!;
for (var MapEntry(key: exportName, value: exports) in exportMap.entries) {
ExpressionStatement setProperty(
VariableGet jsObject, String propertyName, StaticInvocation jsValue) {
// `jsObject[propertyName] = jsValue`
@ -338,9 +337,7 @@ class SharedInteropTransformer extends Transformer {
isSynthesized: true)
..fileOffset = invocation.fileOffset;
block.add(getSetMap);
var getSet = _exportChecker.getGetterSetter(exports);
var getter = getSet.getter;
var setter = getSet.setter;
var (:getter, :setter) = _exportChecker.getGetterSetter(exports);
if (getter != null) {
final resultType = _staticInteropMockValidator.typeParameterResolver
.resolve(getter.getterType);

View file

@ -47,7 +47,7 @@ class StaticInteropClassEraser extends Transformer {
// Visiting core libraries that don't contain `@staticInterop` adds overhead.
// To avoid this, we use an allowlist that contains libraries that we know use
// `@staticInterop`.
late final Set<String> _erasableCoreLibraries = {
final Set<String> _erasableCoreLibraries = {
'js_interop_unsafe',
'ui',
'ui_web',

View file

@ -104,9 +104,8 @@ class StaticInteropMockValidator {
_computeImplementableExtensionMembers(staticInteropClass);
var exportMap = _exportChecker.exportClassToMemberMap[dartClass.reference]!;
for (var exportName in exportNameToDescriptors.keys) {
var descriptors = exportNameToDescriptors[exportName]!;
for (var MapEntry(key: exportName, value: descriptors)
in exportNameToDescriptors.entries) {
String getAsErrorString(Iterable<ExtensionMemberDescriptor> descriptors) {
var withExtensionNameAndType = descriptors.map((descriptor) {
var extension = _descriptorToExtensionName[descriptor]!;
@ -139,7 +138,7 @@ class StaticInteropMockValidator {
hasImplementation = descriptors
.any((descriptor) => _implements(firstMember, descriptor));
} else {
var getSet = _exportChecker.getGetterSetter(dartMembers);
var (:getter, :setter) = _exportChecker.getGetterSetter(dartMembers);
var getters = <ExtensionMemberDescriptor>{};
var setters = <ExtensionMemberDescriptor>{};
@ -148,10 +147,10 @@ class StaticInteropMockValidator {
var implementsSetter = false;
for (var descriptor in descriptors) {
if (descriptor.isGetter) {
implementsGetter |= _implements(getSet.getter, descriptor);
implementsGetter |= _implements(getter, descriptor);
getters.add(descriptor);
} else if (descriptor.isSetter) {
implementsSetter |= _implements(getSet.setter, descriptor);
implementsSetter |= _implements(setter, descriptor);
setters.add(descriptor);
}
}
@ -288,8 +287,8 @@ class StaticInteropMockValidator {
// Process the stored libraries, and create a mapping between @staticInterop
// classes and their extensions.
var staticInteropClassesWithExtensions = <Reference, Set<Extension>>{};
for (var library in ExportChecker.libraryExtensionMap.keys) {
for (var extension in ExportChecker.libraryExtensionMap[library]!) {
for (var extensions in ExportChecker.libraryExtensionMap.values) {
for (var extension in extensions) {
var onType = extension.onType as InterfaceType;
staticInteropClassesWithExtensions
.putIfAbsent(onType.classReference, () => {})

View file

@ -3,7 +3,7 @@ name: _js_interop_checks
publish_to: none
environment:
sdk: '>=2.12.0 <3.0.0'
sdk: ^3.0.0
# Use 'any' constraints here; we get our versions from the DEPS file.
dependencies: