Skip to content

Commit 99f266a

Browse files
author
Dart CI
committed
Version 2.19.0-319.0.dev
Merge c42ab25 into dev
2 parents f210249 + c42ab25 commit 99f266a

File tree

72 files changed

+1021
-587
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

72 files changed

+1021
-587
lines changed

CHANGELOG.md

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -108,6 +108,22 @@
108108
[`MirrorsUsed`]: https://api.dart.dev/stable/dart-mirrors/MirrorsUsed-class.html
109109
[`Comment`]: https://api.dart.dev/stable/dart-mirrors/Comment-class.html
110110

111+
### Other libraries
112+
113+
#### `package:js`
114+
115+
- **Breaking changes to the preview feature `@staticInterop`**:
116+
- Classes with this annotation are now disallowed from using `external`
117+
generative constructors. Use `external factory`s for these classes instead,
118+
and the behavior should be identical. See [#48730][] for more details.
119+
- Classes with this annotation's external extension members are now disallowed
120+
from using type parameters e.g. `external void method<T>(T t)`. Use a
121+
non-`external` extension method for type parameters instead. See [#49350][]
122+
for more details.
123+
124+
[#48730]: https://github.com/dart-lang/sdk/issues/48730
125+
[#49350]: https://github.com/dart-lang/sdk/issues/49350
126+
111127
### Tools
112128

113129
#### Analyzer

DEPS

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -149,7 +149,7 @@ vars = {
149149
"path_rev": "9955b27b9bb98d87591208e19eb01c51d29fd467",
150150
"ply_rev": "604b32590ffad5cbb82e4afef1d305512d06ae93",
151151
"pool_rev": "fa84ddd0e39f45bf3f09dcc5d6b9fbdda7820fef",
152-
"protobuf_rev": "1d175bef6043bc4bdef5970f6dbd6d3001124373",
152+
"protobuf_rev": "ba29983968de5b54196c6c2a5cff1afbdda24ae2",
153153
"pub_rev": "b9afe9270c24d040b8ae465b4b37ba4f7f4b4cc5", # manually rev'd
154154
"pub_semver_rev": "7671359982b4be9bdf87e621dd1bcdeac242b4b9",
155155
"root_certificates_rev": "692f6d6488af68e0121317a9c2c9eb393eb0ee50",

pkg/_fe_analyzer_shared/lib/src/messages/codes_generated.dart

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7121,6 +7121,32 @@ const MessageCode messageJsInteropOperatorsNotSupported = const MessageCode(
71217121
problemMessage: r"""JS interop classes do not support operator methods.""",
71227122
correctionMessage: r"""Try replacing this with a normal method.""");
71237123

7124+
// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
7125+
const Code<Null>
7126+
codeJsInteropStaticInteropExternalExtensionMembersWithTypeParameters =
7127+
messageJsInteropStaticInteropExternalExtensionMembersWithTypeParameters;
7128+
7129+
// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
7130+
const MessageCode
7131+
messageJsInteropStaticInteropExternalExtensionMembersWithTypeParameters =
7132+
const MessageCode(
7133+
"JsInteropStaticInteropExternalExtensionMembersWithTypeParameters",
7134+
problemMessage:
7135+
r"""`@staticInterop` classes cannot have external extension members with type parameters.""",
7136+
correctionMessage:
7137+
r"""Try using a Dart extension member if you need type parameters instead.""");
7138+
7139+
// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
7140+
const Code<Null> codeJsInteropStaticInteropGenerativeConstructor =
7141+
messageJsInteropStaticInteropGenerativeConstructor;
7142+
7143+
// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
7144+
const MessageCode messageJsInteropStaticInteropGenerativeConstructor =
7145+
const MessageCode("JsInteropStaticInteropGenerativeConstructor",
7146+
problemMessage:
7147+
r"""`@staticInterop` classes should not contain any generative constructors.""",
7148+
correctionMessage: r"""Use factory constructors instead.""");
7149+
71247150
// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
71257151
const Template<Message Function(String name, String string)>
71267152
templateJsInteropStaticInteropMockExternalExtensionMemberConflict =

pkg/_js_interop_checks/lib/js_interop_checks.dart

Lines changed: 60 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,8 @@ import 'package:_fe_analyzer_shared/src/messages/codes.dart'
1919
messageJsInteropNonExternalConstructor,
2020
messageJsInteropNonExternalMember,
2121
messageJsInteropOperatorsNotSupported,
22+
messageJsInteropStaticInteropExternalExtensionMembersWithTypeParameters,
23+
messageJsInteropStaticInteropGenerativeConstructor,
2224
templateJsInteropDartClassExtendsJSClass,
2325
templateJsInteropStaticInteropWithInstanceMembers,
2426
templateJsInteropStaticInteropWithNonStaticSupertype,
@@ -33,6 +35,7 @@ class JsInteropChecks extends RecursiveVisitor {
3335
final CoreTypes _coreTypes;
3436
final DiagnosticReporter<Message, LocatedMessage> _diagnosticsReporter;
3537
final Map<String, Class> _nativeClasses;
38+
final _TypeParameterVisitor _typeParameterVisitor = _TypeParameterVisitor();
3639
bool _classHasJSAnnotation = false;
3740
bool _classHasAnonymousAnnotation = false;
3841
bool _classHasStaticInteropAnnotation = false;
@@ -300,6 +303,26 @@ class JsInteropChecks extends RecursiveVisitor {
300303
procedure.name.text.length,
301304
procedure.fileUri);
302305
}
306+
307+
if (procedure.isExternal &&
308+
procedure.isExtensionMember &&
309+
_isStaticInteropExtensionMember(procedure)) {
310+
// If the extension has type parameters of its own, it copies those type
311+
// parameters to the procedure's type parameters (in the front) as well.
312+
// Ignore these for the analysis.
313+
var extensionTypeParams =
314+
_libraryExtensionsIndex![procedure.reference]!.typeParameters;
315+
var procedureTypeParams = List.from(procedure.function.typeParameters);
316+
procedureTypeParams.removeRange(0, extensionTypeParams.length);
317+
if (procedureTypeParams.isNotEmpty ||
318+
_typeParameterVisitor.usesTypeParameters(procedure)) {
319+
_diagnosticsReporter.report(
320+
messageJsInteropStaticInteropExternalExtensionMembersWithTypeParameters,
321+
procedure.fileOffset,
322+
procedure.name.text.length,
323+
procedure.fileUri);
324+
}
325+
}
303326
}
304327

305328
@override
@@ -318,15 +341,22 @@ class JsInteropChecks extends RecursiveVisitor {
318341
@override
319342
void visitConstructor(Constructor constructor) {
320343
_checkInstanceMemberJSAnnotation(constructor);
321-
if (_classHasJSAnnotation &&
322-
!constructor.isExternal &&
323-
!constructor.isSynthetic) {
324-
// Non-synthetic constructors must be annotated with `external`.
325-
_diagnosticsReporter.report(
326-
messageJsInteropNonExternalConstructor,
327-
constructor.fileOffset,
328-
constructor.name.text.length,
329-
constructor.fileUri);
344+
if (!constructor.isSynthetic) {
345+
if (_classHasJSAnnotation && !constructor.isExternal) {
346+
// Non-synthetic constructors must be annotated with `external`.
347+
_diagnosticsReporter.report(
348+
messageJsInteropNonExternalConstructor,
349+
constructor.fileOffset,
350+
constructor.name.text.length,
351+
constructor.fileUri);
352+
}
353+
if (_classHasStaticInteropAnnotation) {
354+
_diagnosticsReporter.report(
355+
messageJsInteropStaticInteropGenerativeConstructor,
356+
constructor.fileOffset,
357+
constructor.name.text.length,
358+
constructor.fileUri);
359+
}
330360
}
331361

332362
if (!_isJSInteropMember(constructor)) {
@@ -442,6 +472,12 @@ class JsInteropChecks extends RecursiveVisitor {
442472
return _checkExtensionMember(member, hasJSInteropAnnotation);
443473
}
444474

475+
/// Returns whether given extension [member] is in an extension that is on a
476+
/// `@staticInterop` class.
477+
bool _isStaticInteropExtensionMember(Member member) {
478+
return _checkExtensionMember(member, hasStaticInteropAnnotation);
479+
}
480+
445481
/// Returns whether given extension [member] is in an extension on a Native
446482
/// class.
447483
bool _isNativeExtensionMember(Member member) {
@@ -463,3 +499,18 @@ class JsInteropChecks extends RecursiveVisitor {
463499
return onType is InterfaceType && validateExtensionClass(onType.classNode);
464500
}
465501
}
502+
503+
class _TypeParameterVisitor extends RecursiveVisitor {
504+
bool _visitedTypeParameterType = false;
505+
506+
bool usesTypeParameters(Node node) {
507+
_visitedTypeParameterType = false;
508+
node.accept(this);
509+
return _visitedTypeParameterType;
510+
}
511+
512+
@override
513+
void visitTypeParameterType(TypeParameterType node) {
514+
_visitedTypeParameterType = true;
515+
}
516+
}

pkg/analysis_server/lib/src/handler/legacy/edit_get_available_refactorings.dart

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -59,16 +59,16 @@ class EditGetAvailableRefactoringsHandler extends LegacyHandler {
5959
var node = NodeLocator(offset).searchWithin(resolvedUnit.unit);
6060
var element = server.getElementOfNode(node);
6161
if (element != null) {
62+
final refactoringWorkspace = server.refactoringWorkspace;
6263
// try CONVERT_METHOD_TO_GETTER
6364
if (element is ExecutableElement) {
6465
if (ConvertMethodToGetterRefactoring(
65-
searchEngine, resolvedUnit.session, element)
66+
refactoringWorkspace, resolvedUnit.session, element)
6667
.isAvailable()) {
6768
kinds.add(RefactoringKind.CONVERT_METHOD_TO_GETTER);
6869
}
6970
}
7071
// try RENAME
71-
final refactoringWorkspace = server.refactoringWorkspace;
7272
var renameRefactoring = RenameRefactoring.create(
7373
refactoringWorkspace, resolvedUnit, element);
7474
if (renameRefactoring != null) {

pkg/analysis_server/lib/src/lsp/handlers/commands/abstract_refactor.dart

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -112,7 +112,7 @@ abstract class AbstractRefactorCommandHandler extends SimpleEditCommandHandler
112112
if (element != null) {
113113
if (element is PropertyAccessorElement) {
114114
final refactor = ConvertGetterToMethodRefactoring(
115-
server.searchEngine, result.session, element);
115+
server.refactoringWorkspace, result.session, element);
116116
return success(refactor);
117117
}
118118
}
@@ -125,7 +125,7 @@ abstract class AbstractRefactorCommandHandler extends SimpleEditCommandHandler
125125
if (element != null) {
126126
if (element is ExecutableElement) {
127127
final refactor = ConvertMethodToGetterRefactoring(
128-
server.searchEngine, result.session, element);
128+
server.refactoringWorkspace, result.session, element);
129129
return success(refactor);
130130
}
131131
}

pkg/analysis_server/lib/src/lsp/handlers/handler_code_actions.dart

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -629,7 +629,7 @@ class CodeActionHandler
629629
// Getter to Method
630630
if (element is PropertyAccessorElement &&
631631
ConvertGetterToMethodRefactoring(
632-
server.searchEngine, unit.session, element)
632+
server.refactoringWorkspace, unit.session, element)
633633
.isAvailable()) {
634634
refactorActions.add(createRefactor(
635635
CodeActionKind.RefactorRewrite,
@@ -640,7 +640,7 @@ class CodeActionHandler
640640
// Method to Getter
641641
if (element is ExecutableElement &&
642642
ConvertMethodToGetterRefactoring(
643-
server.searchEngine, unit.session, element)
643+
server.refactoringWorkspace, unit.session, element)
644644
.isAvailable()) {
645645
refactorActions.add(createRefactor(
646646
CodeActionKind.RefactorRewrite,

pkg/analysis_server/lib/src/services/refactoring/legacy/convert_getter_to_method.dart

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,14 +18,16 @@ import 'package:analyzer_plugin/utilities/range_factory.dart';
1818
/// [ConvertMethodToGetterRefactoring] implementation.
1919
class ConvertGetterToMethodRefactoringImpl extends RefactoringImpl
2020
implements ConvertGetterToMethodRefactoring {
21+
final RefactoringWorkspace workspace;
2122
final SearchEngine searchEngine;
2223
final AnalysisSession session;
2324
final PropertyAccessorElement element;
2425

2526
late SourceChange change;
2627

2728
ConvertGetterToMethodRefactoringImpl(
28-
this.searchEngine, this.session, this.element);
29+
this.workspace, this.session, this.element)
30+
: searchEngine = workspace.searchEngine;
2931

3032
@override
3133
String get refactoringName => 'Convert Getter To Method';
@@ -77,6 +79,11 @@ class ConvertGetterToMethodRefactoringImpl extends RefactoringImpl
7779

7880
/// Checks if [element] is valid to perform this refactor.
7981
RefactoringStatus _checkElement() {
82+
if (!workspace.containsElement(element)) {
83+
return RefactoringStatus.fatal(
84+
'Only getters in your workspace can be converted.');
85+
}
86+
8087
if (!element.isGetter || element.isSynthetic) {
8188
return RefactoringStatus.fatal(
8289
'Only explicit getters can be converted to methods.');

pkg/analysis_server/lib/src/services/refactoring/legacy/convert_method_to_getter.dart

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,15 +18,17 @@ import 'package:analyzer_plugin/utilities/range_factory.dart';
1818
/// [ConvertMethodToGetterRefactoring] implementation.
1919
class ConvertMethodToGetterRefactoringImpl extends RefactoringImpl
2020
implements ConvertMethodToGetterRefactoring {
21+
final RefactoringWorkspace workspace;
2122
final SearchEngine searchEngine;
2223
final AnalysisSessionHelper sessionHelper;
2324
final ExecutableElement element;
2425

2526
late SourceChange change;
2627

2728
ConvertMethodToGetterRefactoringImpl(
28-
this.searchEngine, AnalysisSession session, this.element)
29-
: sessionHelper = AnalysisSessionHelper(session);
29+
this.workspace, AnalysisSession session, this.element)
30+
: sessionHelper = AnalysisSessionHelper(session),
31+
searchEngine = workspace.searchEngine;
3032

3133
@override
3234
String get refactoringName => 'Convert Method To Getter';
@@ -70,6 +72,11 @@ class ConvertMethodToGetterRefactoringImpl extends RefactoringImpl
7072

7173
/// Checks if [element] is valid to perform this refactor.
7274
RefactoringStatus _checkElement() {
75+
if (!workspace.containsElement(element)) {
76+
return RefactoringStatus.fatal(
77+
'Only methods in your workspace can be converted.');
78+
}
79+
7380
// check Element type
7481
if (element is FunctionElement) {
7582
if (element.enclosingElement is! CompilationUnitElement) {

pkg/analysis_server/lib/src/services/refactoring/legacy/refactoring.dart

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -38,9 +38,9 @@ import 'package:analyzer_plugin/protocol/protocol_common.dart'
3838
abstract class ConvertGetterToMethodRefactoring implements Refactoring {
3939
/// Returns a new [ConvertMethodToGetterRefactoring] instance for converting
4040
/// [element] and all the corresponding hierarchy elements.
41-
factory ConvertGetterToMethodRefactoring(SearchEngine searchEngine,
41+
factory ConvertGetterToMethodRefactoring(RefactoringWorkspace workspace,
4242
AnalysisSession session, PropertyAccessorElement element) {
43-
return ConvertGetterToMethodRefactoringImpl(searchEngine, session, element);
43+
return ConvertGetterToMethodRefactoringImpl(workspace, session, element);
4444
}
4545

4646
/// Return `true` if refactoring is available, possibly without checking all
@@ -58,9 +58,9 @@ abstract class ConvertGetterToMethodRefactoring implements Refactoring {
5858
abstract class ConvertMethodToGetterRefactoring implements Refactoring {
5959
/// Returns a new [ConvertMethodToGetterRefactoring] instance for converting
6060
/// [element] and all the corresponding hierarchy elements.
61-
factory ConvertMethodToGetterRefactoring(SearchEngine searchEngine,
61+
factory ConvertMethodToGetterRefactoring(RefactoringWorkspace workspace,
6262
AnalysisSession session, ExecutableElement element) {
63-
return ConvertMethodToGetterRefactoringImpl(searchEngine, session, element);
63+
return ConvertMethodToGetterRefactoringImpl(workspace, session, element);
6464
}
6565

6666
/// Return `true` if refactoring is available, possibly without checking all

0 commit comments

Comments
 (0)