Files
sdk/tests/lib/js/external_static_test.dart
T
Srujan Gaddam d1a949a8e5 Add static tests for external extension members on extension types
We have tests for whether external extension members are allowed
on certain classes, but not extension types.

Also rewords the error to be more accurate.

Change-Id: I61c1fa4c101971986b6c8e7cc778aca94908816a
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/358380
Reviewed-by: Sigmund Cherem <sigmund@google.com>
Commit-Queue: Srujan Gaddam <srujzs@google.com>
2024-03-26 15:43:19 +00:00

242 lines
6.5 KiB
Dart

// Copyright (c) 2021, 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.
// Checks for static errors using external without the @JS() annotation,
// in a library with a @JS() annotation
@JS()
library external_static_test;
import 'dart:html';
import 'package:js/js.dart';
// external top level members ok in @JS() library.
external var topLevelField;
external final topLevelFinalField;
external get topLevelGetter;
external set topLevelSetter(_);
external topLevelFunction();
class Constructors {
external Constructors();
// ^
// [web] Only JS interop members may be 'external'.
external Constructors.namedConstructor();
// ^
// [web] Only JS interop members may be 'external'.
external factory Constructors.namedFactory();
// ^
// [web] Only JS interop members may be 'external'.
}
class Members {
external var field;
// ^
// [web] Only JS interop members may be 'external'.
external final finalField;
// ^
// [web] Only JS interop members may be 'external'.
external get instanceGetter;
// ^
// [web] Only JS interop members may be 'external'.
external set instanceSetter(_);
// ^
// [web] Only JS interop members may be 'external'.
external instanceMethod();
// ^
// [web] Only JS interop members may be 'external'.
}
class StaticMembers {
external static var staticField;
// ^
// [web] Only JS interop members may be 'external'.
external static final staticFinalField;
// ^
// [web] Only JS interop members may be 'external'.
external static get staticGetter;
// ^
// [web] Only JS interop members may be 'external'.
external static set staticSetter(_);
// ^
// [web] Only JS interop members may be 'external'.
external static staticMethod();
// ^
// [web] Only JS interop members may be 'external'.
}
@anonymous
class AnonymousClass {
external var field;
// ^
// [web] Only JS interop members may be 'external'.
external factory AnonymousClass({var field});
// ^
// [web] Only JS interop members may be 'external'.
}
extension ExtensionNonJS on NonJSClass {
external var field;
// ^
// [web] JS interop type or @Native type from an SDK web library required for 'external' extension members.
external final finalField;
// ^
// [web] JS interop type or @Native type from an SDK web library required for 'external' extension members.
external static var staticField;
// ^
// [web] JS interop type or @Native type from an SDK web library required for 'external' extension members.
external static final staticFinalField;
// ^
// [web] JS interop type or @Native type from an SDK web library required for 'external' extension members.
external get getter;
// ^
// [web] JS interop type or @Native type from an SDK web library required for 'external' extension members.
external set setter(_);
// ^
// [web] JS interop type or @Native type from an SDK web library required for 'external' extension members.
external static get staticGetter;
// ^
// [web] JS interop type or @Native type from an SDK web library required for 'external' extension members.
external static set staticSetter(_);
// ^
// [web] JS interop type or @Native type from an SDK web library required for 'external' extension members.
external method();
// ^
// [web] JS interop type or @Native type from an SDK web library required for 'external' extension members.
external static staticMethod();
// ^
// [web] JS interop type or @Native type from an SDK web library required for 'external' extension members.
external optionalParameterMethod([int? a, int b = 0]);
// ^
// [web] JS interop type or @Native type from an SDK web library required for 'external' extension members.
external overriddenMethod();
// ^
// [web] JS interop type or @Native type from an SDK web library required for 'external' extension members.
@JS('fieldAnnotation')
external var annotatedField;
// ^
// [web] JS interop type or @Native type from an SDK web library required for 'external' extension members.
@JS('memberAnnotation')
external annotatedMethod();
// ^
// [web] JS interop type or @Native type from an SDK web library required for 'external' extension members.
nonExternalMethod() => 1;
static nonExternalStaticMethod() => 2;
}
class NonJSClass {
void overriddenMethod() => 5;
}
extension ExtensionGenericNonJS<T> on GenericNonJSClass<T> {
external T method();
// ^
// [web] JS interop type or @Native type from an SDK web library required for 'external' extension members.
}
class GenericNonJSClass<T> {}
extension ExtensionJS on JSClass {
external var field;
external final finalField;
external get getter;
external set setter(_);
external method();
external optionalParameterMethod([int? a, int b = 0]);
@JS('fieldAnnotation')
external var annotatedField;
@JS('memberAnnotation')
external annotatedMethod();
nonExternalMethod() => 1;
static nonExternalStaticMethod() => 2;
}
@JS()
class JSClass {}
extension ExtensionGenericJS<T> on GenericJSClass<T> {
external T method();
}
@JS()
class GenericJSClass<T> {}
extension ExtensionAnonymousJS on AnonymousJSClass {
external var field;
external get getter;
external set setter(_);
external method();
}
@JS()
@anonymous
class AnonymousJSClass {}
extension ExtensionAbstractJS on AbstractJSClass {
external var field;
external get getter;
external set setter(_);
external method();
}
@JS()
abstract class AbstractJSClass {}
extension ExtensionAnnotatedJS on AnnotatedJSClass {
external var field;
external get getter;
external set setter(_);
external method();
}
@JS('Annotation')
class AnnotatedJSClass {}
extension ExtensionPrivateJS on _privateJSClass {
external var field;
external get getter;
external set setter(_);
external method();
}
@JS()
class _privateJSClass {}
extension ExtensionNative on HtmlElement {
external var field;
external final finalField;
external get getter;
external set setter(_);
external method();
external optionalParameterMethod([int? a, int b = 0]);
nonExternalMethod() => 1;
static nonExternalStaticMethod() => 2;
}
main() {}