Version 2.13.0-232.0.dev
Merge commit 'c1339411bb27a3538a1a28d62ba19f2ffce47d89' into 'dev'
diff --git a/pkg/analysis_server/lib/src/cider/completion.dart b/pkg/analysis_server/lib/src/cider/completion.dart
index 99eeec2..8591b99 100644
--- a/pkg/analysis_server/lib/src/cider/completion.dart
+++ b/pkg/analysis_server/lib/src/cider/completion.dart
@@ -2,8 +2,6 @@
// 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.
-// @dart = 2.9
-
import 'package:analysis_server/src/protocol_server.dart';
import 'package:analysis_server/src/services/completion/completion_core.dart';
import 'package:analysis_server/src/services/completion/completion_performance.dart';
@@ -35,7 +33,7 @@
final OperationPerformanceImpl _performanceRoot =
OperationPerformanceImpl('<root>');
- DartCompletionRequestImpl _dartCompletionRequest;
+ late DartCompletionRequestImpl _dartCompletionRequest;
/// Paths of imported libraries for which suggestions were (re)computed
/// during processing of this request. Does not include libraries that were
@@ -53,10 +51,10 @@
///
/// The [line] and [column] are zero based.
Future<CiderCompletionResult> compute({
- @required String path,
- @required int line,
- @required int column,
- @visibleForTesting void Function(ResolvedUnitResult) testResolvedUnit,
+ required String path,
+ required int line,
+ required int column,
+ @visibleForTesting void Function(ResolvedUnitResult)? testResolvedUnit,
}) async {
return _performanceRoot.runAsync('completion', (performance) async {
var resolvedUnit = performance.run('resolution', (performance) {
@@ -147,9 +145,9 @@
suggestions: suggestions,
performance: CiderCompletionPerformance._(
file: Duration.zero,
- imports: performance.getChild('imports').elapsed,
- resolution: performance.getChild('resolution').elapsed,
- suggestions: performance.getChild('suggestions').elapsed,
+ imports: performance.getChild('imports')!.elapsed,
+ resolution: performance.getChild('resolution')!.elapsed,
+ suggestions: performance.getChild('suggestions')!.elapsed,
operations: _performanceRoot.children.first,
),
prefixStart: CiderPosition(line, column - filter._pattern.length),
@@ -161,9 +159,9 @@
@Deprecated('Use compute')
Future<CiderCompletionResult> compute2({
- @required String path,
- @required int line,
- @required int column,
+ required String path,
+ required int line,
+ required int column,
}) async {
return compute(path: path, line: line, column: column);
}
@@ -184,8 +182,8 @@
/// TODO(scheglov) Implement show / hide combinators.
/// TODO(scheglov) Implement prefixes.
List<CompletionSuggestion> _importedLibrariesSuggestions({
- @required LibraryElement target,
- @required OperationPerformanceImpl performance,
+ required LibraryElement target,
+ required OperationPerformanceImpl performance,
}) {
var suggestions = <CompletionSuggestion>[];
for (var importedLibrary in target.importedLibraries) {
@@ -202,8 +200,8 @@
/// Return cached, or compute unprefixed suggestions for all elements
/// exported from the library.
List<CompletionSuggestion> _importedLibrarySuggestions({
- @required LibraryElement element,
- @required OperationPerformanceImpl performance,
+ required LibraryElement element,
+ required OperationPerformanceImpl performance,
}) {
performance.getDataInt('libraryCount').increment();
@@ -262,11 +260,11 @@
final OperationPerformance operations;
CiderCompletionPerformance._({
- @required this.file,
- @required this.imports,
- @required this.resolution,
- @required this.suggestions,
- @required this.operations,
+ required this.file,
+ required this.imports,
+ required this.resolution,
+ required this.suggestions,
+ required this.operations,
});
}
@@ -281,9 +279,9 @@
final CiderPosition prefixStart;
CiderCompletionResult._({
- @required this.suggestions,
- @required this.performance,
- @required this.prefixStart,
+ required this.suggestions,
+ required this.performance,
+ required this.prefixStart,
});
}
@@ -305,8 +303,8 @@
final DartCompletionRequestImpl _request;
final List<CompletionSuggestion> _suggestions;
- FuzzyMatcher _matcher;
- String _pattern;
+ late FuzzyMatcher _matcher;
+ late String _pattern;
_FilterSort(this._request, this._suggestions);
diff --git a/pkg/analysis_server/lib/src/domains/execution/completion.dart b/pkg/analysis_server/lib/src/domains/execution/completion.dart
index 26197cd..825dce0 100644
--- a/pkg/analysis_server/lib/src/domains/execution/completion.dart
+++ b/pkg/analysis_server/lib/src/domains/execution/completion.dart
@@ -2,18 +2,11 @@
// 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.
-// @dart = 2.9
-
import 'package:analysis_server/src/protocol_server.dart'
- show
- CompletionSuggestion,
- RuntimeCompletionExpression,
- RuntimeCompletionVariable,
- SourceEdit;
+ show CompletionSuggestion, RuntimeCompletionExpression, SourceEdit;
import 'package:analysis_server/src/services/completion/completion_core.dart';
import 'package:analysis_server/src/services/completion/completion_performance.dart';
import 'package:analysis_server/src/services/completion/dart/completion_manager.dart';
-import 'package:analyzer/dart/analysis/results.dart';
import 'package:analyzer/file_system/overlay_file_system.dart';
import 'package:analyzer/src/dart/analysis/driver.dart';
import 'package:analyzer_plugin/utilities/change_builder/change_builder_core.dart';
@@ -28,18 +21,8 @@
final String contextPath;
final int contextOffset;
- final List<RuntimeCompletionVariable> variables;
- final List<RuntimeCompletionExpression> expressions;
-
- RuntimeCompletionComputer(
- this.resourceProvider,
- this.analysisDriver,
- this.code,
- this.offset,
- this.contextPath,
- this.contextOffset,
- this.variables,
- this.expressions);
+ RuntimeCompletionComputer(this.resourceProvider, this.analysisDriver,
+ this.code, this.offset, this.contextPath, this.contextOffset);
Future<RuntimeCompletionResult> compute() async {
var contextResult = await analysisDriver.getResult(contextPath);
@@ -65,7 +48,7 @@
// Compute the patched context file content.
var targetCode = SourceEdit.applySequence(
- contextResult.content,
+ contextResult.content!,
changeBuilder.sourceChange.edits[0].edits,
);
@@ -75,9 +58,8 @@
// Update the context file content to include the code being completed.
// Then resolve it, and restore the file to its initial state.
- ResolvedUnitResult targetResult;
- await _withContextFileContent(targetCode, () async {
- targetResult = await analysisDriver.getResult(contextPath);
+ var targetResult = await _withContextFileContent(targetCode, () async {
+ return await analysisDriver.getResult(contextPath);
});
var contributor = DartCompletionManager(
@@ -106,8 +88,8 @@
return RuntimeCompletionResult(expressions, suggestions);
}
- Future<void> _withContextFileContent(
- String newContent, Future<void> Function() f) async {
+ Future<R> _withContextFileContent<R>(
+ String newContent, Future<R> Function() f) async {
if (resourceProvider.hasOverlay(contextPath)) {
var contextFile = resourceProvider.getFile(contextPath);
var prevOverlayContent = contextFile.readAsStringSync();
@@ -119,7 +101,7 @@
modificationStamp: 0,
);
analysisDriver.changeFile(contextPath);
- await f();
+ return await f();
} finally {
resourceProvider.setOverlay(
contextPath,
@@ -136,7 +118,7 @@
modificationStamp: 0,
);
analysisDriver.changeFile(contextPath);
- await f();
+ return await f();
} finally {
resourceProvider.removeOverlay(contextPath);
analysisDriver.changeFile(contextPath);
diff --git a/pkg/analysis_server/lib/src/services/completion/postfix/postfix_completion.dart b/pkg/analysis_server/lib/src/services/completion/postfix/postfix_completion.dart
index c88f85d..8aa88e2 100644
--- a/pkg/analysis_server/lib/src/services/completion/postfix/postfix_completion.dart
+++ b/pkg/analysis_server/lib/src/services/completion/postfix/postfix_completion.dart
@@ -2,8 +2,6 @@
// 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.
-// @dart = 2.9
-
import 'package:analysis_server/src/protocol_server.dart' hide Element;
import 'package:analysis_server/src/services/correction/util.dart';
import 'package:analyzer/dart/analysis/results.dart';
@@ -20,10 +18,12 @@
import 'package:analyzer/src/generated/source.dart';
import 'package:analyzer_plugin/utilities/change_builder/change_builder_core.dart';
import 'package:analyzer_plugin/utilities/range_factory.dart';
+import 'package:collection/collection.dart';
/// An enumeration of possible postfix completion kinds.
class DartPostfixCompletion {
- static const NO_TEMPLATE = PostfixCompletionKind('', 'no change', null, null);
+ static const NO_TEMPLATE =
+ PostfixCompletionKind('', 'no change', _false, _null);
static const List<PostfixCompletionKind> ALL_TEMPLATES = [
PostfixCompletionKind('assert', 'expr.assert -> assert(expr);',
@@ -67,20 +67,20 @@
'while', 'expr.while -> while (expr) {}', isBoolContext, expandWhile),
];
- static Future<PostfixCompletion> expandAssert(
+ static Future<PostfixCompletion?> expandAssert(
PostfixCompletionProcessor processor, PostfixCompletionKind kind) async {
return processor.expand(kind, processor.findAssertExpression, (expr) {
return 'assert(${processor.utils.getNodeText(expr)});';
}, withBraces: false);
}
- static Future<PostfixCompletion> expandElse(
+ static Future<PostfixCompletion?> expandElse(
PostfixCompletionProcessor processor, PostfixCompletionKind kind) async {
return processor.expand(kind, processor.findBoolExpression,
(expr) => 'if (${processor.makeNegatedBoolExpr(expr)})');
}
- static Future<PostfixCompletion> expandFor(
+ static Future<PostfixCompletion?> expandFor(
PostfixCompletionProcessor processor, PostfixCompletionKind kind) async {
return processor.expand(kind, processor.findIterableExpression, (expr) {
var value = processor.newVariable('value');
@@ -88,7 +88,7 @@
});
}
- static Future<PostfixCompletion> expandFori(
+ static Future<PostfixCompletion?> expandFori(
PostfixCompletionProcessor processor, PostfixCompletionKind kind) async {
return processor.expand(kind, processor.findIntExpression, (expr) {
var index = processor.newVariable('i');
@@ -96,20 +96,20 @@
});
}
- static Future<PostfixCompletion> expandIf(
+ static Future<PostfixCompletion?> expandIf(
PostfixCompletionProcessor processor, PostfixCompletionKind kind) async {
return processor.expand(kind, processor.findBoolExpression,
(expr) => 'if (${processor.utils.getNodeText(expr)})');
}
- static Future<PostfixCompletion> expandNegate(
+ static Future<PostfixCompletion?> expandNegate(
PostfixCompletionProcessor processor, PostfixCompletionKind kind) async {
return processor.expand(kind, processor.findBoolExpression,
(expr) => processor.makeNegatedBoolExpr(expr),
withBraces: false);
}
- static Future<PostfixCompletion> expandNotNull(
+ static Future<PostfixCompletion?> expandNotNull(
PostfixCompletionProcessor processor, PostfixCompletionKind kind) async {
return processor.expand(kind, processor.findObjectExpression, (expr) {
return expr is NullLiteral
@@ -118,7 +118,7 @@
});
}
- static Future<PostfixCompletion> expandNull(
+ static Future<PostfixCompletion?> expandNull(
PostfixCompletionProcessor processor, PostfixCompletionKind kind) async {
return processor.expand(kind, processor.findObjectExpression, (expr) {
return expr is NullLiteral
@@ -127,44 +127,44 @@
});
}
- static Future<PostfixCompletion> expandParen(
+ static Future<PostfixCompletion?> expandParen(
PostfixCompletionProcessor processor, PostfixCompletionKind kind) async {
return processor.expand(kind, processor.findObjectExpression,
(expr) => '(${processor.utils.getNodeText(expr)})',
withBraces: false);
}
- static Future<PostfixCompletion> expandReturn(
+ static Future<PostfixCompletion?> expandReturn(
PostfixCompletionProcessor processor, PostfixCompletionKind kind) async {
return processor.expand(kind, processor.findObjectExpression,
(expr) => 'return ${processor.utils.getNodeText(expr)};',
withBraces: false);
}
- static Future<PostfixCompletion> expandSwitch(
+ static Future<PostfixCompletion?> expandSwitch(
PostfixCompletionProcessor processor, PostfixCompletionKind kind) async {
return processor.expand(kind, processor.findObjectExpression,
(expr) => 'switch (${processor.utils.getNodeText(expr)})');
}
- static Future<PostfixCompletion> expandTry(
+ static Future<PostfixCompletion?> expandTry(
PostfixCompletionProcessor processor, PostfixCompletionKind kind) async {
return processor.expandTry(kind, processor.findStatement, withOn: false);
}
- static Future<PostfixCompletion> expandTryon(
+ static Future<PostfixCompletion?> expandTryon(
PostfixCompletionProcessor processor, PostfixCompletionKind kind) async {
return processor.expandTry(kind, processor.findStatement, withOn: true);
}
- static Future<PostfixCompletion> expandWhile(
+ static Future<PostfixCompletion?> expandWhile(
PostfixCompletionProcessor processor, PostfixCompletionKind kind) async {
return processor.expand(kind, processor.findBoolExpression,
(expr) => 'while (${processor.utils.getNodeText(expr)})');
}
- static PostfixCompletionKind forKey(String key) =>
- ALL_TEMPLATES.firstWhere((kind) => kind.key == key, orElse: () => null);
+ static PostfixCompletionKind? forKey(String key) =>
+ ALL_TEMPLATES.firstWhereOrNull((kind) => kind.key == key);
static bool isAssertContext(PostfixCompletionProcessor processor) {
return processor.findAssertExpression() != null;
@@ -193,6 +193,10 @@
static bool isSwitchContext(PostfixCompletionProcessor processor) {
return processor.findObjectExpression() != null;
}
+
+ static bool _false(_) => false;
+
+ static Future<PostfixCompletion?> _null(_, __) async => null;
}
/// A description of a postfix completion.
@@ -227,8 +231,9 @@
/// Clients may not extend, implement or mix-in this class.
class PostfixCompletionKind {
final String name, example;
- final Function selector;
- final Function computer;
+ final bool Function(PostfixCompletionProcessor) selector;
+ final Future<PostfixCompletion?> Function(
+ PostfixCompletionProcessor, PostfixCompletionKind) computer;
const PostfixCompletionKind(
this.name, this.example, this.selector, this.computer);
@@ -248,18 +253,18 @@
final PostfixCompletionContext completionContext;
final CorrectionUtils utils;
- AstNode node;
- PostfixCompletion completion;
+ AstNode? node;
+ PostfixCompletion? completion;
SourceChange change = SourceChange('postfix-completion');
final Map<String, LinkedEditGroup> linkedPositionGroups = {};
- Position exitPosition;
+ Position? exitPosition;
PostfixCompletionProcessor(this.completionContext)
: utils = CorrectionUtils(completionContext.resolveResult);
String get eol => utils.endOfLine;
- String get file => completionContext.resolveResult.path;
+ String get file => completionContext.resolveResult.path!;
String get key => completionContext.key;
@@ -279,13 +284,16 @@
return NO_COMPLETION;
}
var completer = DartPostfixCompletion.forKey(key);
- return completer?.computer(this, completer) ?? NO_COMPLETION;
+ if (completer == null) {
+ return NO_COMPLETION;
+ }
+ return await completer.computer(this, completer) ?? NO_COMPLETION;
}
- Future<PostfixCompletion> expand(
- PostfixCompletionKind kind, Function contexter, Function sourcer,
+ Future<PostfixCompletion?> expand(PostfixCompletionKind kind,
+ Expression? Function() contexter, String Function(Expression) sourcer,
{bool withBraces = true}) async {
- AstNode expr = contexter();
+ var expr = contexter();
if (expr == null) {
return null;
}
@@ -293,10 +301,7 @@
var changeBuilder = ChangeBuilder(session: session);
await changeBuilder.addDartFileEdit(file, (builder) {
builder.addReplacement(range.node(expr), (builder) {
- String newSrc = sourcer(expr);
- if (newSrc == null) {
- return null;
- }
+ var newSrc = sourcer(expr);
builder.write(newSrc);
if (withBraces) {
builder.write(' {');
@@ -317,10 +322,10 @@
return completion;
}
- Future<PostfixCompletion> expandTry(
- PostfixCompletionKind kind, Function contexter,
+ Future<PostfixCompletion?> expandTry(
+ PostfixCompletionKind kind, Statement? Function() contexter,
{bool withOn = false}) async {
- AstNode stmt = contexter();
+ var stmt = contexter();
if (stmt == null) {
return null;
}
@@ -329,8 +334,11 @@
// Embed the full line(s) of the statement in the try block.
var startLine = lineInfo.getLocation(stmt.offset).lineNumber - 1;
var endLine = lineInfo.getLocation(stmt.end).lineNumber - 1;
- if (stmt is ExpressionStatement && !stmt.semicolon.isSynthetic) {
- endLine += 1;
+ if (stmt is ExpressionStatement) {
+ var semicolon = stmt.semicolon;
+ if (semicolon != null && !semicolon.isSynthetic) {
+ endLine += 1;
+ }
}
var startOffset = lineInfo.getOffsetOfLine(startLine);
var endOffset = lineInfo.getOffsetOfLine(endLine);
@@ -365,22 +373,23 @@
return completion;
}
- Expression findAssertExpression() {
+ Expression? findAssertExpression() {
+ final node = this.node;
if (node is Expression) {
var boolExpr = _findOuterExpression(node, typeProvider.boolType);
if (boolExpr == null) {
return null;
}
- if (boolExpr.parent is ExpressionFunctionBody &&
- boolExpr.parent.parent is FunctionExpression) {
- FunctionExpression fnExpr = boolExpr.parent.parent;
- var type = fnExpr.staticType;
+ var parent = boolExpr.parent;
+ var grandParent = parent?.parent;
+ if (parent is ExpressionFunctionBody &&
+ grandParent is FunctionExpression) {
+ var type = grandParent.staticType;
if (type is! FunctionType) {
return boolExpr;
}
- FunctionType fnType = type;
- if (fnType.returnType == typeProvider.boolType) {
- return fnExpr;
+ if (type.returnType == typeProvider.boolType) {
+ return grandParent;
}
}
if (boolExpr.staticType == typeProvider.boolType) {
@@ -390,19 +399,19 @@
return null;
}
- Expression findBoolExpression() =>
+ Expression? findBoolExpression() =>
_findOuterExpression(node, typeProvider.boolType);
- Expression findIntExpression() =>
+ Expression? findIntExpression() =>
_findOuterExpression(node, typeProvider.intType);
- Expression findIterableExpression() =>
+ Expression? findIterableExpression() =>
_findOuterExpression(node, typeProvider.iterableDynamicType);
- Expression findObjectExpression() =>
+ Expression? findObjectExpression() =>
_findOuterExpression(node, typeProvider.objectType);
- AstNode findStatement() {
+ Statement? findStatement() {
var astNode = node;
while (astNode != null) {
if (astNode is Statement && astNode is! Block) {
@@ -428,7 +437,10 @@
return false;
}
var completer = DartPostfixCompletion.forKey(key);
- return completer?.selector(this);
+ if (completer == null) {
+ return false;
+ }
+ return completer.selector(this);
}
String makeNegatedBoolExpr(Expression expr) {
@@ -443,21 +455,24 @@
String nameOfExceptionThrownBy(AstNode astNode) {
if (astNode is ExpressionStatement) {
- astNode = (astNode as ExpressionStatement).expression;
+ astNode = astNode.expression;
}
if (astNode is ThrowExpression) {
var expr = astNode;
var type = expr.expression.staticType;
+ if (type is! TypeImpl) {
+ return 'Exception';
+ }
// Only print nullability for non-legacy types in non-legacy libraries.
var showNullability = type.nullabilitySuffix != NullabilitySuffix.star &&
(astNode.root as CompilationUnit)
- .declaredElement
+ .declaredElement!
.library
.isNonNullableByDefault;
// Can't catch nullable types, strip `?`s now that we've checked for `*`s.
- return (type as TypeImpl)
+ return type
.withNullability(NullabilitySuffix.none)
.getDisplayString(withNullability: showNullability);
}
@@ -474,12 +489,12 @@
return name;
}
- Expression _findOuterExpression(AstNode start, InterfaceType builtInType) {
+ Expression? _findOuterExpression(AstNode? start, InterfaceType builtInType) {
if (start is SimpleIdentifier && start.staticElement is PrefixElement) {
return null;
}
- AstNode parent;
+ AstNode? parent;
if (start is Expression) {
parent = start;
} else if (start is ArgumentList) {
@@ -495,26 +510,27 @@
parent = parent.parent;
}
- var expr = list.firstWhere((expr) {
+ var expr = list.firstWhereOrNull((expr) {
var type = expr.staticType;
if (type == null) return false;
return typeSystem.isSubtypeOf(type, builtInType);
- }, orElse: () => null);
- if (expr is SimpleIdentifier && expr.parent is PropertyAccess) {
- expr = expr.parent;
+ });
+ var exprParent = expr?.parent;
+ if (expr is SimpleIdentifier && exprParent is PropertyAccess) {
+ expr = exprParent;
}
- if (expr?.parent is CascadeExpression) {
- expr = expr.parent;
+ if (exprParent is CascadeExpression) {
+ expr = exprParent;
}
return expr;
}
- AstNode _selectedNode({int at}) => NodeLocator(at ?? selectionOffset)
+ AstNode? _selectedNode({int? at}) => NodeLocator(at ?? selectionOffset)
.searchWithin(completionContext.resolveResult.unit);
void _setCompletionFromBuilder(
ChangeBuilder builder, PostfixCompletionKind kind,
- [List args]) {
+ [List? args]) {
var change = builder.sourceChange;
if (change.edits.isEmpty) {
completion = null;
diff --git a/pkg/analysis_server/lib/src/services/correction/assist.dart b/pkg/analysis_server/lib/src/services/correction/assist.dart
index 2929cc2..b85a733 100644
--- a/pkg/analysis_server/lib/src/services/correction/assist.dart
+++ b/pkg/analysis_server/lib/src/services/correction/assist.dart
@@ -138,6 +138,8 @@
static const FLUTTER_WRAP_GENERIC =
AssistKind('dart.assist.flutter.wrap.generic', 31, 'Wrap with widget...');
+ static const FLUTTER_WRAP_BUILDER = AssistKind(
+ 'dart.assist.flutter.wrap.builder', 32, 'Wrap with Builder');
static const FLUTTER_WRAP_CENTER =
AssistKind('dart.assist.flutter.wrap.center', 32, 'Wrap with Center');
static const FLUTTER_WRAP_COLUMN =
diff --git a/pkg/analysis_server/lib/src/services/correction/assist_internal.dart b/pkg/analysis_server/lib/src/services/correction/assist_internal.dart
index ef6a1ef..68c3a9b 100644
--- a/pkg/analysis_server/lib/src/services/correction/assist_internal.dart
+++ b/pkg/analysis_server/lib/src/services/correction/assist_internal.dart
@@ -51,6 +51,7 @@
import 'package:analysis_server/src/services/correction/dart/flutter_swap_with_child.dart';
import 'package:analysis_server/src/services/correction/dart/flutter_swap_with_parent.dart';
import 'package:analysis_server/src/services/correction/dart/flutter_wrap.dart';
+import 'package:analysis_server/src/services/correction/dart/flutter_wrap_builder.dart';
import 'package:analysis_server/src/services/correction/dart/flutter_wrap_generic.dart';
import 'package:analysis_server/src/services/correction/dart/flutter_wrap_stream_builder.dart';
import 'package:analysis_server/src/services/correction/dart/import_add_show.dart';
@@ -128,6 +129,7 @@
FlutterRemoveWidget.newInstance,
FlutterSwapWithChild.newInstance,
FlutterSwapWithParent.newInstance,
+ FlutterWrapBuilder.newInstance,
FlutterWrapGeneric.newInstance,
FlutterWrapStreamBuilder.newInstance,
ImportAddShow.newInstance,
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/flutter_wrap_builder.dart b/pkg/analysis_server/lib/src/services/correction/dart/flutter_wrap_builder.dart
new file mode 100644
index 0000000..a2b9351
--- /dev/null
+++ b/pkg/analysis_server/lib/src/services/correction/dart/flutter_wrap_builder.dart
@@ -0,0 +1,68 @@
+// 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.
+
+// @dart = 2.9
+
+import 'package:analysis_server/src/services/correction/assist.dart';
+import 'package:analysis_server/src/services/correction/dart/abstract_producer.dart';
+import 'package:analyzer_plugin/utilities/assist/assist.dart';
+import 'package:analyzer_plugin/utilities/change_builder/change_builder_core.dart';
+import 'package:analyzer_plugin/utilities/range_factory.dart';
+
+class FlutterWrapBuilder extends CorrectionProducer {
+ @override
+ AssistKind get assistKind => DartAssistKind.FLUTTER_WRAP_BUILDER;
+
+ @override
+ Future<void> compute(ChangeBuilder builder) async {
+ var widgetExpr = flutter.identifyWidgetExpression(node);
+ if (widgetExpr == null) {
+ return;
+ }
+ if (flutter.isExactWidgetTypeBuilder(widgetExpr.staticType)) {
+ return;
+ }
+ var widgetSrc = utils.getNodeText(widgetExpr);
+
+ var builderElement = await sessionHelper.getClass(
+ flutter.widgetsUri,
+ 'Builder',
+ );
+ if (builderElement == null) {
+ return;
+ }
+
+ await builder.addDartFileEdit(file, (builder) {
+ builder.addReplacement(range.node(widgetExpr), (builder) {
+ builder.writeReference(builderElement);
+
+ builder.writeln('(');
+
+ var indentOld = utils.getLinePrefix(widgetExpr.offset);
+ var indentNew1 = indentOld + utils.getIndent(1);
+ var indentNew2 = indentOld + utils.getIndent(2);
+
+ builder.write(indentNew1);
+ builder.writeln('builder: (context) {');
+
+ widgetSrc = widgetSrc.replaceAll(
+ RegExp('^$indentOld', multiLine: true),
+ indentNew2,
+ );
+ builder.write(indentNew2);
+ builder.write('return $widgetSrc');
+ builder.writeln(';');
+
+ builder.write(indentNew1);
+ builder.writeln('}');
+
+ builder.write(indentOld);
+ builder.write(')');
+ });
+ });
+ }
+
+ /// Return an instance of this class. Used as a tear-off in `AssistProcessor`.
+ static FlutterWrapBuilder newInstance() => FlutterWrapBuilder();
+}
diff --git a/pkg/analysis_server/lib/src/services/flutter/widget_descriptions.dart b/pkg/analysis_server/lib/src/services/flutter/widget_descriptions.dart
index b33557d..f38a7cc 100644
--- a/pkg/analysis_server/lib/src/services/flutter/widget_descriptions.dart
+++ b/pkg/analysis_server/lib/src/services/flutter/widget_descriptions.dart
@@ -2,8 +2,6 @@
// 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.
-// @dart = 2.9
-
import 'package:analysis_server/src/protocol_server.dart' as protocol;
import 'package:analysis_server/src/services/flutter/class_description.dart';
import 'package:analysis_server/src/services/flutter/property.dart';
@@ -19,10 +17,10 @@
/// The result of [WidgetDescriptions.setPropertyValue] invocation.
class SetPropertyValueResult {
/// The error to report to the client, or `null` if OK.
- final protocol.RequestErrorCode errorCode;
+ final protocol.RequestErrorCode? errorCode;
/// The change to apply, or `null` if [errorCode] is not `null`.
- final protocol.SourceChange change;
+ final protocol.SourceChange? change;
SetPropertyValueResult._({this.errorCode, this.change});
}
@@ -42,7 +40,7 @@
/// Return the description of the widget with [InstanceCreationExpression] in
/// the [resolvedUnit] at the [offset], or `null` if the location does not
/// correspond to a widget.
- Future<protocol.FlutterGetWidgetDescriptionResult> getDescription(
+ Future<protocol.FlutterGetWidgetDescriptionResult?> getDescription(
ResolvedUnitResult resolvedUnit,
int offset,
) async {
@@ -65,7 +63,7 @@
Future<SetPropertyValueResult> setPropertyValue(
int id,
- protocol.FlutterWidgetPropertyValue value,
+ protocol.FlutterWidgetPropertyValue? value,
) async {
var property = _properties[id];
if (property == null) {
@@ -132,10 +130,10 @@
/// The offset of the widget expression.
final int widgetOffset;
- ClassElement _classAlignment;
- ClassElement _classAlignmentDirectional;
- ClassElement _classContainer;
- ClassElement _classEdgeInsets;
+ ClassElement? _classAlignment;
+ ClassElement? _classAlignmentDirectional;
+ ClassElement? _classContainer;
+ ClassElement? _classEdgeInsets;
_WidgetDescriptionComputer(
this.classRegistry,
@@ -145,8 +143,11 @@
Flutter get _flutter => Flutter.instance;
- Future<_WidgetDescription> compute() async {
+ Future<_WidgetDescription?> compute() async {
var node = NodeLocator2(widgetOffset).searchWithin(resolvedUnit.unit);
+ if (node == null) {
+ return null;
+ }
var instanceCreation = _flutter.identifyNewExpression(node);
if (instanceCreation == null) {
return null;
@@ -177,12 +178,12 @@
return;
}
- InstanceCreationExpression parentCreation;
+ InstanceCreationExpression? parentCreation;
var childArgument = widgetCreation.parent;
if (childArgument is NamedExpression &&
childArgument.name.label.name == 'child') {
var argumentList = childArgument.parent;
- var argumentListParent = argumentList.parent;
+ var argumentListParent = argumentList?.parent;
if (argumentList is ArgumentList &&
argumentListParent is InstanceCreationExpression) {
parentCreation = argumentListParent;
@@ -213,7 +214,11 @@
(property) => property.name == 'child',
);
} else {
- var containerDescription = classRegistry.get(_classContainer);
+ var classContainer = _classContainer;
+ if (classContainer == null) {
+ return;
+ }
+ var containerDescription = classRegistry.get(classContainer);
containerProperty = PropertyDescription(
resolvedUnit: resolvedUnit,
classDescription: containerDescription,
@@ -224,7 +229,7 @@
'Container',
),
virtualContainer: VirtualContainerProperty(
- _classContainer,
+ classContainer,
widgetCreation,
),
);
@@ -236,7 +241,8 @@
classDescription: containerDescription,
);
- if (_flutter.isExactlyAlignCreation(parentCreation) &&
+ if (parentCreation != null &&
+ _flutter.isExactlyAlignCreation(parentCreation) &&
_flutter.findNamedArgument(parentCreation, 'widthFactor') == null &&
_flutter.findNamedArgument(parentCreation, 'heightFactor') == null) {
_replaceNestedContainerProperty(
@@ -246,7 +252,8 @@
);
}
- if (_flutter.isExactlyPaddingCreation(parentCreation)) {
+ if (parentCreation != null &&
+ _flutter.isExactlyPaddingCreation(parentCreation)) {
_replaceNestedContainerProperty(
containerProperty,
parentCreation,
@@ -261,13 +268,13 @@
}
void _addProperties({
- List<PropertyDescription> properties,
- PropertyDescription parent,
- ClassDescription classDescription,
- InstanceCreationExpression instanceCreation,
- ConstructorElement constructorElement,
+ required List<PropertyDescription> properties,
+ PropertyDescription? parent,
+ ClassDescription? classDescription,
+ InstanceCreationExpression? instanceCreation,
+ ConstructorElement? constructorElement,
}) {
- constructorElement ??= instanceCreation?.constructorName?.staticElement;
+ constructorElement ??= instanceCreation?.constructorName.staticElement;
constructorElement ??= classDescription?.constructor;
if (constructorElement == null) return;
@@ -317,26 +324,26 @@
}
void _addProperty({
- List<PropertyDescription> properties,
- PropertyDescription parent,
- ParameterElement parameter,
- ClassDescription classDescription,
- InstanceCreationExpression instanceCreation,
- Expression argumentExpression,
- Expression valueExpression,
+ required List<PropertyDescription> properties,
+ PropertyDescription? parent,
+ required ParameterElement parameter,
+ ClassDescription? classDescription,
+ InstanceCreationExpression? instanceCreation,
+ Expression? argumentExpression,
+ Expression? valueExpression,
}) {
var documentation = getParameterDocumentation(parameter);
- String valueExpressionCode;
+ String? valueExpressionCode;
if (valueExpression != null) {
- valueExpressionCode = resolvedUnit.content.substring(
+ valueExpressionCode = resolvedUnit.content!.substring(
valueExpression.offset,
valueExpression.end,
);
}
var isSafeToUpdate = false;
- protocol.FlutterWidgetPropertyValue value;
+ protocol.FlutterWidgetPropertyValue? value;
if (valueExpression != null) {
value = _toValue(valueExpression);
isSafeToUpdate = value != null;
@@ -366,11 +373,13 @@
);
properties.add(propertyDescription);
- if (_flutter.isExactEdgeInsetsGeometryType(parameter.type)) {
- propertyDescription.addEdgeInsetsNestedProperties(_classEdgeInsets);
+ var classEdgeInsets = _classEdgeInsets;
+ if (classEdgeInsets != null &&
+ _flutter.isExactEdgeInsetsGeometryType(parameter.type)) {
+ propertyDescription.addEdgeInsetsNestedProperties(classEdgeInsets);
} else if (valueExpression is InstanceCreationExpression) {
var type = valueExpression.staticType;
- if (classRegistry.hasNestedProperties(type)) {
+ if (type != null && classRegistry.hasNestedProperties(type)) {
_addProperties(
properties: propertyDescription.children,
parent: propertyDescription,
@@ -431,7 +440,7 @@
);
}
- protocol.FlutterWidgetPropertyEditor _getEditor(DartType type) {
+ protocol.FlutterWidgetPropertyEditor? _getEditor(DartType type) {
if (type.isDartCoreBool) {
return protocol.FlutterWidgetPropertyEditor(
protocol.FlutterWidgetPropertyEditorKind.BOOL,
@@ -462,12 +471,14 @@
}
if (_flutter.isExactAlignmentGeometry(classElement)) {
var items = <protocol.FlutterWidgetPropertyValueEnumItem>[];
- items.addAll(
- _enumItemsForStaticFields(_classAlignment),
- );
- items.addAll(
- _enumItemsForStaticFields(_classAlignmentDirectional),
- );
+ var classAlignment = _classAlignment;
+ if (classAlignment != null) {
+ items.addAll(_enumItemsForStaticFields(classAlignment));
+ }
+ var classAlignmentDirectional = _classAlignmentDirectional;
+ if (classAlignmentDirectional != null) {
+ items.addAll(_enumItemsForStaticFields(classAlignmentDirectional));
+ }
return protocol.FlutterWidgetPropertyEditor(
protocol.FlutterWidgetPropertyEditorKind.ENUM_LIKE,
enumItems: items,
@@ -486,20 +497,21 @@
) {
var argument = _flutter.findNamedArgument(parentCreation, name);
if (argument != null) {
- var replacements = <PropertyDescription>[];
- _addProperty(
- properties: replacements,
- parent: containerProperty,
- parameter: argument.staticParameterElement,
- instanceCreation: parentCreation,
- argumentExpression: argument,
- valueExpression: argument.expression,
- );
+ var staticParameterElement = argument.staticParameterElement;
+ if (staticParameterElement != null) {
+ var replacements = <PropertyDescription>[];
+ _addProperty(
+ properties: replacements,
+ parent: containerProperty,
+ parameter: staticParameterElement,
+ instanceCreation: parentCreation,
+ argumentExpression: argument,
+ valueExpression: argument.expression,
+ );
- var replacement = replacements[0];
- if (replacement != null) {
+ var replacement = replacements[0];
containerProperty.replaceChild(name, replacement);
- containerProperty.virtualContainer.setParentCreation(
+ containerProperty.virtualContainer?.setParentCreation(
parentCreation,
argument,
);
@@ -520,7 +532,7 @@
);
}
- protocol.FlutterWidgetPropertyValue _toValue(Expression valueExpression) {
+ protocol.FlutterWidgetPropertyValue? _toValue(Expression valueExpression) {
if (valueExpression is BooleanLiteral) {
return protocol.FlutterWidgetPropertyValue(
boolValue: valueExpression.value,
diff --git a/pkg/analysis_server/lib/src/utilities/flutter.dart b/pkg/analysis_server/lib/src/utilities/flutter.dart
index 234b645..adaef36 100644
--- a/pkg/analysis_server/lib/src/utilities/flutter.dart
+++ b/pkg/analysis_server/lib/src/utilities/flutter.dart
@@ -13,6 +13,7 @@
static final Flutter instance = Flutter();
static const _nameAlign = 'Align';
+ static const _nameBuilder = 'Builder';
static const _nameCenter = 'Center';
static const _nameContainer = 'Container';
static const _namePadding = 'Padding';
@@ -403,8 +404,8 @@
}
/// Return `true` if the [node] is creation of `Align`.
- bool isExactlyAlignCreation(InstanceCreationExpression? node) {
- var type = node?.staticType;
+ bool isExactlyAlignCreation(InstanceCreationExpression node) {
+ var type = node.staticType;
return isExactWidgetTypeAlign(type);
}
@@ -415,8 +416,8 @@
}
/// Return `true` if the [node] is creation of `Padding`.
- bool isExactlyPaddingCreation(InstanceCreationExpression? node) {
- var type = node?.staticType;
+ bool isExactlyPaddingCreation(InstanceCreationExpression node) {
+ var type = node.staticType;
return isExactWidgetTypePadding(type);
}
@@ -443,6 +444,12 @@
_isExactWidget(type.element, _nameAlign, _uriBasic);
}
+ /// Return `true` if the given [type] is the Flutter class `StreamBuilder`.
+ bool isExactWidgetTypeBuilder(DartType type) {
+ return type is InterfaceType &&
+ _isExactWidget(type.element, _nameBuilder, _uriBasic);
+ }
+
/// Return `true` if the given [type] is the Flutter class `Center`.
bool isExactWidgetTypeCenter(DartType type) {
return type is InterfaceType &&
diff --git a/pkg/analysis_server/test/mock_packages/flutter/lib/src/widgets/basic.dart b/pkg/analysis_server/test/mock_packages/flutter/lib/src/widgets/basic.dart
index 68ecbc6..3a72bfd 100644
--- a/pkg/analysis_server/test/mock_packages/flutter/lib/src/widgets/basic.dart
+++ b/pkg/analysis_server/test/mock_packages/flutter/lib/src/widgets/basic.dart
@@ -157,3 +157,11 @@
Widget child,
});
}
+
+typedef WidgetBuilder = Widget Function(BuildContext context);
+
+class Builder {
+ final WidgetBuilder builder;
+ const Builder(
+ {Key key, @required this.builder});
+}
diff --git a/pkg/analysis_server/test/services/completion/postfix/postfix_completion_test.dart b/pkg/analysis_server/test/services/completion/postfix/postfix_completion_test.dart
index a88af5a..e4912a8 100644
--- a/pkg/analysis_server/test/services/completion/postfix/postfix_completion_test.dart
+++ b/pkg/analysis_server/test/services/completion/postfix/postfix_completion_test.dart
@@ -2,8 +2,6 @@
// 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.
-// @dart = 2.9
-
import 'package:analysis_server/src/protocol_server.dart';
import 'package:analysis_server/src/services/completion/postfix/postfix_completion.dart';
import 'package:test/test.dart';
@@ -28,10 +26,10 @@
}
class PostfixCompletionTest extends AbstractSingleUnitTest {
- PostfixCompletionProcessor processor;
- SourceChange change;
+ late PostfixCompletionProcessor processor;
+ late SourceChange change;
- void _assertHasChange(String message, String expectedCode, [Function cmp]) {
+ void _assertHasChange(String message, String expectedCode, [Function? cmp]) {
if (change.message == message) {
if (change.edits.isNotEmpty) {
var resultCode =
@@ -39,12 +37,12 @@
expect(resultCode, expectedCode.replaceAll('/*caret*/', ''));
if (cmp != null) {
int offset = cmp(resultCode);
- expect(change.selection.offset, offset);
+ expect(change.selection!.offset, offset);
}
} else {
if (cmp != null) {
int offset = cmp(testCode);
- expect(change.selection.offset, offset);
+ expect(change.selection!.offset, offset);
}
}
return;
diff --git a/pkg/analysis_server/test/services/completion/postfix/test_all.dart b/pkg/analysis_server/test/services/completion/postfix/test_all.dart
index 958d06b..36604fe 100644
--- a/pkg/analysis_server/test/services/completion/postfix/test_all.dart
+++ b/pkg/analysis_server/test/services/completion/postfix/test_all.dart
@@ -2,8 +2,6 @@
// 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.
-// @dart = 2.9
-
import 'package:test_reflective_loader/test_reflective_loader.dart';
import 'postfix_completion_test.dart' as postfix_completion_test;
diff --git a/pkg/analysis_server/test/services/completion/statement/test_all.dart b/pkg/analysis_server/test/services/completion/statement/test_all.dart
index 8edd7fe..6d4d86e 100644
--- a/pkg/analysis_server/test/services/completion/statement/test_all.dart
+++ b/pkg/analysis_server/test/services/completion/statement/test_all.dart
@@ -2,8 +2,6 @@
// 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.
-// @dart = 2.9
-
import 'package:test_reflective_loader/test_reflective_loader.dart';
import 'statement_completion_test.dart' as statement_completion_test;
diff --git a/pkg/analysis_server/test/src/cider/completion_test.dart b/pkg/analysis_server/test/src/cider/completion_test.dart
index b64e585..5e15e31 100644
--- a/pkg/analysis_server/test/src/cider/completion_test.dart
+++ b/pkg/analysis_server/test/src/cider/completion_test.dart
@@ -2,15 +2,12 @@
// 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.
-// @dart = 2.9
-
import 'package:analysis_server/src/cider/completion.dart';
import 'package:analyzer/dart/analysis/results.dart';
import 'package:analyzer/source/line_info.dart';
import 'package:analyzer/src/test_utilities/function_ast_visitor.dart';
import 'package:analyzer_plugin/protocol/protocol_common.dart'
show CompletionSuggestion, CompletionSuggestionKind, ElementKind;
-import 'package:meta/meta.dart';
import 'package:test/test.dart';
import 'package:test_reflective_loader/test_reflective_loader.dart';
@@ -26,11 +23,11 @@
class CiderCompletionComputerTest extends CiderServiceTest {
final CiderCompletionCache _completionCache = CiderCompletionCache();
- CiderCompletionComputer _computer;
- void Function(ResolvedUnitResult) _testResolvedUnit;
+ late CiderCompletionComputer _computer;
+ void Function(ResolvedUnitResult)? _testResolvedUnit;
- CiderCompletionResult _completionResult;
- List<CompletionSuggestion> _suggestions;
+ late CiderCompletionResult _completionResult;
+ late List<CompletionSuggestion> _suggestions;
Future<void> test_compute() async {
await _compute(r'''
@@ -642,7 +639,7 @@
);
}
- CompletionSuggestion _assertHasClass({@required String text}) {
+ CompletionSuggestion _assertHasClass({required String text}) {
var matching = _matchingCompletions(
text: text,
elementKind: ElementKind.CLASS,
@@ -651,12 +648,12 @@
return matching.single;
}
- void _assertHasCompletion({@required String text}) {
+ void _assertHasCompletion({required String text}) {
var matching = _matchingCompletions(text: text);
expect(matching, hasLength(1), reason: 'Expected exactly one completion');
}
- CompletionSuggestion _assertHasConstructor({@required String text}) {
+ CompletionSuggestion _assertHasConstructor({required String text}) {
var matching = _matchingCompletions(
text: text,
elementKind: ElementKind.CONSTRUCTOR,
@@ -665,7 +662,7 @@
return matching.single;
}
- CompletionSuggestion _assertHasEnumConstant({@required String text}) {
+ CompletionSuggestion _assertHasEnumConstant({required String text}) {
var matching = _matchingCompletions(
text: text,
elementKind: ElementKind.ENUM_CONSTANT,
@@ -674,7 +671,7 @@
return matching.single;
}
- CompletionSuggestion _assertHasFunction({@required String text}) {
+ CompletionSuggestion _assertHasFunction({required String text}) {
var matching = _matchingCompletions(
text: text,
elementKind: ElementKind.FUNCTION,
@@ -683,7 +680,7 @@
return matching.single;
}
- CompletionSuggestion _assertHasGetter({@required String text}) {
+ CompletionSuggestion _assertHasGetter({required String text}) {
var matching = _matchingCompletions(
text: text,
elementKind: ElementKind.GETTER,
@@ -692,13 +689,13 @@
return matching.single;
}
- CompletionSuggestion _assertHasKeyword({@required String text}) {
+ CompletionSuggestion _assertHasKeyword({required String text}) {
var matching = _matchingKeywordCompletions(text: text);
expect(matching, hasLength(1), reason: 'Expected exactly one completion');
return matching.single;
}
- CompletionSuggestion _assertHasLocalVariable({@required String text}) {
+ CompletionSuggestion _assertHasLocalVariable({required String text}) {
var matching = _matchingCompletions(
text: text,
elementKind: ElementKind.LOCAL_VARIABLE,
@@ -711,7 +708,7 @@
return matching.single;
}
- CompletionSuggestion _assertHasMethod({@required String text}) {
+ CompletionSuggestion _assertHasMethod({required String text}) {
var matching = _matchingCompletions(
text: text,
elementKind: ElementKind.METHOD,
@@ -720,7 +717,7 @@
return matching.single;
}
- CompletionSuggestion _assertHasNamedArgument({@required String name}) {
+ CompletionSuggestion _assertHasNamedArgument({required String name}) {
var matching = _matchingNamedArgumentSuggestions(name: name);
expect(matching, hasLength(1), reason: 'Expected exactly one completion');
return matching.single;
@@ -731,11 +728,11 @@
for (var name in path) {
var child = current.getChild(name);
expect(child, isNotNull, reason: "No '$name' in $current");
- current = child;
+ current = child!;
}
}
- CompletionSuggestion _assertHasParameter({@required String text}) {
+ CompletionSuggestion _assertHasParameter({required String text}) {
var matching = _matchingCompletions(
text: text,
elementKind: ElementKind.PARAMETER,
@@ -744,7 +741,7 @@
return matching.single;
}
- CompletionSuggestion _assertHasTopLevelVariable({@required String text}) {
+ CompletionSuggestion _assertHasTopLevelVariable({required String text}) {
var matching = _matchingCompletions(
text: text,
elementKind: ElementKind.TOP_LEVEL_VARIABLE,
@@ -757,7 +754,7 @@
return matching.single;
}
- CompletionSuggestion _assertHasTypeParameter({@required String text}) {
+ CompletionSuggestion _assertHasTypeParameter({required String text}) {
var matching = _matchingCompletions(
text: text,
elementKind: ElementKind.TYPE_PARAMETER,
@@ -766,7 +763,7 @@
return matching.single;
}
- void _assertNoClass({@required String text}) {
+ void _assertNoClass({required String text}) {
var matching = _matchingCompletions(
text: text,
elementKind: ElementKind.CLASS,
@@ -774,12 +771,12 @@
expect(matching, isEmpty, reason: 'Expected zero completions');
}
- void _assertNoKeyword({@required String text}) {
+ void _assertNoKeyword({required String text}) {
var matching = _matchingKeywordCompletions(text: text);
expect(matching, isEmpty, reason: 'Expected zero completions');
}
- void _assertNoNamedArgument({@required String name}) {
+ void _assertNoNamedArgument({required String name}) {
var matching = _matchingNamedArgumentSuggestions(name: name);
expect(matching, isEmpty, reason: 'Expected zero completions');
}
@@ -808,9 +805,9 @@
/// Configure the [CiderCompletionComputer] to check that when resolving
/// for completion we don't resolve unnecessary node.
- void _configureToCheckNotResolved({Set<String> identifiers}) {
+ void _configureToCheckNotResolved({required Set<String> identifiers}) {
_testResolvedUnit = (resolvedUnitResult) {
- var unit = resolvedUnitResult.unit;
+ var unit = resolvedUnitResult.unit!;
unit.accept(
FunctionAstVisitor(
simpleIdentifier: (node) {
@@ -829,15 +826,15 @@
}
List<CompletionSuggestion> _matchingCompletions({
- @required String text,
- ElementKind elementKind,
+ required String text,
+ ElementKind? elementKind,
}) {
return _suggestions.where((e) {
if (e.completion != text) {
return false;
}
- if (elementKind != null && e.element.kind != elementKind) {
+ if (elementKind != null && e.element!.kind != elementKind) {
return false;
}
@@ -846,7 +843,7 @@
}
List<CompletionSuggestion> _matchingKeywordCompletions({
- @required String text,
+ required String text,
}) {
return _suggestions.where((e) {
if (e.completion != text) {
@@ -857,7 +854,7 @@
}
List<CompletionSuggestion> _matchingNamedArgumentSuggestions({
- @required String name,
+ required String name,
}) {
return _suggestions.where((e) {
if (e.kind != CompletionSuggestionKind.NAMED_ARGUMENT) {
diff --git a/pkg/analysis_server/test/src/domains/execution/completion_test.dart b/pkg/analysis_server/test/src/domains/execution/completion_test.dart
index 92e3282..8553bad 100644
--- a/pkg/analysis_server/test/src/domains/execution/completion_test.dart
+++ b/pkg/analysis_server/test/src/domains/execution/completion_test.dart
@@ -2,8 +2,6 @@
// 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.
-// @dart = 2.9
-
import 'package:analysis_server/src/domains/execution/completion.dart';
import 'package:analysis_server/src/protocol_server.dart';
import 'package:analyzer/file_system/overlay_file_system.dart';
@@ -20,11 +18,11 @@
@reflectiveTest
class RuntimeCompletionComputerTest extends AbstractContextTest {
- OverlayResourceProvider overlayResourceProvider;
- String contextFile;
- int contextOffset;
+ late OverlayResourceProvider overlayResourceProvider;
+ late String contextFile;
+ late int contextOffset;
- RuntimeCompletionResult result;
+ late RuntimeCompletionResult result;
void addContextFile(String content) {
contextFile = convertPath('/home/test/lib/context.dart');
@@ -42,7 +40,7 @@
}
}
- void assertSuggested(String completion, {String returnType}) {
+ void assertSuggested(String completion, {String? returnType}) {
var suggestion = getSuggest(completion);
if (suggestion == null) {
failedCompletion('expected $completion');
@@ -52,41 +50,28 @@
}
}
- Future<void> computeCompletion(
- String code, {
- List<RuntimeCompletionVariable> variables,
- List<RuntimeCompletionExpression> expressions,
- }) async {
+ Future<void> computeCompletion(String code) async {
var codeOffset = code.indexOf('^');
expect(codeOffset, isNonNegative);
code = code.replaceAll('^', '');
- var computer = RuntimeCompletionComputer(
- overlayResourceProvider,
- driverFor(contextFile),
- code,
- codeOffset,
- contextFile,
- contextOffset,
- variables,
- expressions);
+ var computer = RuntimeCompletionComputer(overlayResourceProvider,
+ driverFor(contextFile), code, codeOffset, contextFile, contextOffset);
result = await computer.compute();
}
- void failedCompletion(String message) {
+ Never failedCompletion(String message) {
var sb = StringBuffer(message);
- if (result.suggestions != null) {
- sb.write('\n found');
- result.suggestions.toList()
- ..sort((a, b) => a.completion.compareTo(b.completion))
- ..forEach((suggestion) {
- sb.write('\n ${suggestion.completion} -> $suggestion');
- });
- }
+ sb.write('\n found');
+ result.suggestions.toList()
+ ..sort((a, b) => a.completion.compareTo(b.completion))
+ ..forEach((suggestion) {
+ sb.write('\n ${suggestion.completion} -> $suggestion');
+ });
fail(sb.toString());
}
- CompletionSuggestion getSuggest(String completion) {
+ CompletionSuggestion? getSuggest(String completion) {
expect(result.suggestions, isNotNull);
for (var suggestion in result.suggestions) {
if (suggestion.completion == completion) {
diff --git a/pkg/analysis_server/test/src/domains/execution/test_all.dart b/pkg/analysis_server/test/src/domains/execution/test_all.dart
index 88b3d88..1cbd9d3 100644
--- a/pkg/analysis_server/test/src/domains/execution/test_all.dart
+++ b/pkg/analysis_server/test/src/domains/execution/test_all.dart
@@ -2,8 +2,6 @@
// 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.
-// @dart = 2.9
-
import 'package:test_reflective_loader/test_reflective_loader.dart';
import 'completion_test.dart' as completion_test;
diff --git a/pkg/analysis_server/test/src/services/correction/assist/flutter_wrap_builder_test.dart b/pkg/analysis_server/test/src/services/correction/assist/flutter_wrap_builder_test.dart
new file mode 100644
index 0000000..1c8ecdc
--- /dev/null
+++ b/pkg/analysis_server/test/src/services/correction/assist/flutter_wrap_builder_test.dart
@@ -0,0 +1,140 @@
+// 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.
+
+// @dart = 2.9
+
+import 'package:analysis_server/src/services/correction/assist.dart';
+import 'package:analyzer_plugin/utilities/assist/assist.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import 'assist_processor.dart';
+
+void main() {
+ defineReflectiveSuite(() {
+ defineReflectiveTests(FlutterWrapBuilderTest);
+ });
+}
+
+@reflectiveTest
+class FlutterWrapBuilderTest extends AssistProcessorTest {
+ @override
+ AssistKind get kind => DartAssistKind.FLUTTER_WRAP_BUILDER;
+
+ @override
+ void setUp() {
+ super.setUp();
+ writeTestPackageConfig(
+ flutter: true,
+ );
+ }
+
+ Future<void> test_aroundBuilder() async {
+ await resolveTestCode('''
+import 'package:flutter/widgets.dart';
+
+main() {
+ /*caret*/Builder(
+ builder: (context) => null,
+ );
+}
+''');
+ await assertNoAssist();
+ }
+
+ Future<void> test_aroundNamedConstructor() async {
+ await resolveTestCode('''
+import 'package:flutter/widgets.dart';
+
+class MyWidget extends StatelessWidget {
+ MyWidget.named();
+
+ Widget build(BuildContext context) => null;
+}
+
+main() {
+ return MyWidget./*caret*/named();
+}
+''');
+ await assertHasAssist('''
+import 'package:flutter/widgets.dart';
+
+class MyWidget extends StatelessWidget {
+ MyWidget.named();
+
+ Widget build(BuildContext context) => null;
+}
+
+main() {
+ return Builder(
+ builder: (context) {
+ return MyWidget.named();
+ }
+ );
+}
+''');
+ }
+
+ Future<void> test_aroundText() async {
+ await resolveTestCode('''
+import 'package:flutter/widgets.dart';
+
+main() {
+ /*caret*/Text('a');
+}
+''');
+ await assertHasAssist('''
+import 'package:flutter/widgets.dart';
+
+main() {
+ Builder(
+ builder: (context) {
+ return Text('a');
+ }
+ );
+}
+''');
+ }
+
+ Future<void> test_assignment() async {
+ await resolveTestCode('''
+import 'package:flutter/widgets.dart';
+
+main() {
+ Widget w;
+ w = /*caret*/Container();
+}
+''');
+ await assertHasAssist('''
+import 'package:flutter/widgets.dart';
+
+main() {
+ Widget w;
+ w = Builder(
+ builder: (context) {
+ return Container();
+ }
+ );
+}
+''');
+ }
+
+ Future<void> test_expressionFunctionBody() async {
+ await resolveTestCode('''
+import 'package:flutter/widgets.dart';
+class FakeFlutter {
+ main() => /*caret*/Container();
+}
+''');
+ await assertHasAssist('''
+import 'package:flutter/widgets.dart';
+class FakeFlutter {
+ main() => Builder(
+ builder: (context) {
+ return Container();
+ }
+ );
+}
+''');
+ }
+}
diff --git a/pkg/analysis_server/test/src/services/correction/assist/test_all.dart b/pkg/analysis_server/test/src/services/correction/assist/test_all.dart
index fef565f5..f39e638 100644
--- a/pkg/analysis_server/test/src/services/correction/assist/test_all.dart
+++ b/pkg/analysis_server/test/src/services/correction/assist/test_all.dart
@@ -54,6 +54,7 @@
import 'flutter_surround_with_set_state_test.dart' as surround_with_set_state;
import 'flutter_swap_with_child_test.dart' as flutter_swap_with_child;
import 'flutter_swap_with_parent_test.dart' as flutter_swap_with_parent;
+import 'flutter_wrap_builder_test.dart' as flutter_wrap_builder;
import 'flutter_wrap_center_test.dart' as flutter_wrap_center;
import 'flutter_wrap_column_test.dart' as flutter_wrap_column;
import 'flutter_wrap_container_test.dart' as flutter_wrap_container;
@@ -139,6 +140,7 @@
flutter_wrap_padding.main();
flutter_wrap_row.main();
flutter_wrap_sized_box.main();
+ flutter_wrap_builder.main();
flutter_wrap_stream_builder.main();
import_add_show.main();
inline_invocation.main();
diff --git a/pkg/analysis_server/test/src/services/flutter/container_properties_test.dart b/pkg/analysis_server/test/src/services/flutter/container_properties_test.dart
index 28903bc..ed3ff69 100644
--- a/pkg/analysis_server/test/src/services/flutter/container_properties_test.dart
+++ b/pkg/analysis_server/test/src/services/flutter/container_properties_test.dart
@@ -2,8 +2,6 @@
// 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.
-// @dart = 2.9
-
import 'package:analysis_server/protocol/protocol_generated.dart' as protocol;
import 'package:test/test.dart';
import 'package:test_reflective_loader/test_reflective_loader.dart';
@@ -33,7 +31,7 @@
}
''');
var property = await getWidgetProperty('Text(', 'Container');
- var childrenNames = property.children.map((p) => p.name).toList();
+ var childrenNames = property.children!.map((p) => p.name).toList();
expect(
childrenNames,
@@ -63,7 +61,7 @@
}
''');
var property = await getWidgetProperty('Text(', 'Container');
- var childrenNames = property.children.map((p) => p.name).toList();
+ var childrenNames = property.children!.map((p) => p.name).toList();
expect(
childrenNames,
diff --git a/pkg/analysis_server/test/src/services/flutter/test_all.dart b/pkg/analysis_server/test/src/services/flutter/test_all.dart
index e45512e..c35d704 100644
--- a/pkg/analysis_server/test/src/services/flutter/test_all.dart
+++ b/pkg/analysis_server/test/src/services/flutter/test_all.dart
@@ -2,8 +2,6 @@
// 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.
-// @dart = 2.9
-
import 'package:test_reflective_loader/test_reflective_loader.dart';
import 'container_properties_test.dart' as container_properties;
diff --git a/pkg/analysis_server/test/src/services/flutter/widget_description.dart b/pkg/analysis_server/test/src/services/flutter/widget_description.dart
index c4042ef..8cdbfff 100644
--- a/pkg/analysis_server/test/src/services/flutter/widget_description.dart
+++ b/pkg/analysis_server/test/src/services/flutter/widget_description.dart
@@ -2,33 +2,29 @@
// 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.
-// @dart = 2.9
-
import 'dart:convert';
import 'package:analysis_server/protocol/protocol_generated.dart' as protocol;
import 'package:analysis_server/src/protocol_server.dart';
import 'package:analysis_server/src/services/flutter/widget_descriptions.dart';
import 'package:test/test.dart';
-import 'package:test_reflective_loader/test_reflective_loader.dart';
import '../../../abstract_single_unit.dart';
-@reflectiveTest
class WidgetDescriptionBase extends AbstractSingleUnitTest {
final descriptions = WidgetDescriptions();
void assertExpectedChange(SetPropertyValueResult result, String expected) {
expect(result.errorCode, isNull);
- var change = result.change;
+ var change = result.change!;
expect(change.edits, hasLength(1));
var fileEdit = change.edits[0];
expect(fileEdit.file, testAnalysisResult.path);
var actual = SourceEdit.applySequence(
- testAnalysisResult.content,
+ testAnalysisResult.content!,
fileEdit.edits,
);
expect(actual, expected);
@@ -52,9 +48,9 @@
expect(actual, expected);
}
- Future<protocol.FlutterGetWidgetDescriptionResult> getDescription(
+ Future<protocol.FlutterGetWidgetDescriptionResult?> getDescription(
String search) async {
- var content = testAnalysisResult.content;
+ var content = testAnalysisResult.content!;
var offset = content.indexOf(search);
if (offset == -1) {
@@ -70,7 +66,7 @@
protocol.FlutterWidgetProperty getNestedProperty(
protocol.FlutterWidgetProperty parentProperty, String name) {
- var nestedProperties = parentProperty.children;
+ var nestedProperties = parentProperty.children!;
return nestedProperties.singleWhere(
(property) => property.name == name,
);
@@ -78,8 +74,7 @@
Future<protocol.FlutterWidgetProperty> getWidgetProperty(
String widgetSearch, String name) async {
- var widgetDescription = await getDescription(widgetSearch);
- expect(widgetDescription, isNotNull);
+ var widgetDescription = (await getDescription(widgetSearch))!;
var properties = widgetDescription.properties;
return properties.singleWhere(
@@ -101,10 +96,10 @@
var id = json.remove('id') as int;
expect(id, isNotNull);
- Object editor = json['editor'];
+ var editor = json['editor'];
if (editor is Map<String, dynamic>) {
if (editor['kind'] == 'ENUM' || editor['kind'] == 'ENUM_LIKE') {
- Object items = editor['enumItems'];
+ var items = editor['enumItems'];
if (items is List<Map<String, dynamic>>) {
for (var item in items) {
item.remove('documentation');
@@ -113,15 +108,15 @@
}
}
- Object value = json['value'];
+ var value = json['value'];
if (value is Map<String, dynamic>) {
- Object enumItem = value['enumValue'];
+ var enumItem = value['enumValue'];
if (enumItem is Map<String, dynamic>) {
enumItem.remove('documentation');
}
}
- Object children = json['children'];
+ var children = json['children'];
if (children is List<Map<String, dynamic>>) {
children.forEach(_removeNotInterestingElements);
}
diff --git a/pkg/analysis_server/test/src/services/flutter/widget_descriptions_test.dart b/pkg/analysis_server/test/src/services/flutter/widget_descriptions_test.dart
index 0b80cad..4592d32 100644
--- a/pkg/analysis_server/test/src/services/flutter/widget_descriptions_test.dart
+++ b/pkg/analysis_server/test/src/services/flutter/widget_descriptions_test.dart
@@ -2,8 +2,6 @@
// 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.
-// @dart = 2.9
-
import 'package:analysis_server/protocol/protocol_generated.dart' as protocol;
import 'package:test/test.dart';
import 'package:test_reflective_loader/test_reflective_loader.dart';
diff --git a/pkg/analyzer/lib/src/dart/error/ffi_code.dart b/pkg/analyzer/lib/src/dart/error/ffi_code.dart
index dc8e106..c015c40 100644
--- a/pkg/analyzer/lib/src/dart/error/ffi_code.dart
+++ b/pkg/analyzer/lib/src/dart/error/ffi_code.dart
@@ -52,7 +52,8 @@
*/
static const FfiCode FIELD_IN_STRUCT_WITH_INITIALIZER = FfiCode(
name: 'FIELD_IN_STRUCT_WITH_INITIALIZER',
- message: "Fields in subclasses of 'Struct' can't have initializers.",
+ message:
+ "Fields in subclasses of 'Struct' and 'Union' can't have initializers.",
correction:
"Try removing the initializer and marking the field as external.");
@@ -61,7 +62,8 @@
*/
static const FfiCode FIELD_INITIALIZER_IN_STRUCT = FfiCode(
name: 'FIELD_INITIALIZER_IN_STRUCT',
- message: "Constructors in subclasses of 'Struct' can't have field "
+ message:
+ "Constructors in subclasses of 'Struct' and 'Union' can't have field "
"initializers.",
correction: "Try removing the field initializer and marking the field as"
" external.");
@@ -72,7 +74,8 @@
*/
static const FfiCode GENERIC_STRUCT_SUBCLASS = FfiCode(
name: 'GENERIC_STRUCT_SUBCLASS',
- message: "The class '{0}' can't extend 'Struct' because it is generic.",
+ message:
+ "The class '{0}' can't extend 'Struct' or 'Union' because it is generic.",
correction: "Try removing the type parameters from '{0}'.");
/**
@@ -95,10 +98,10 @@
message:
"Fields in struct classes can't have the type '{0}'. They can only "
"be declared as 'int', 'double', 'Array', 'Pointer', or subtype of "
- "'Struct'.",
+ "'Struct' or 'Union'.",
correction:
"Try using 'int', 'double', 'Array', 'Pointer', or subtype of "
- "'Struct'.");
+ "'Struct' or 'Union'.");
/**
* No parameters.
@@ -202,9 +205,9 @@
message:
"Type arguments to '{0}' can't have the type '{1}'. They can only "
"be declared as native integer, 'Float', 'Double', 'Pointer', or "
- "subtype of Struct'.",
+ "subtype of 'Struct' or 'Union'.",
correction: "Try using a native integer, 'Float', 'Double', 'Pointer', "
- "or subtype of 'Struct'.");
+ "or subtype of 'Struct' or 'Union'.");
/**
* No parameters.
@@ -252,7 +255,7 @@
static const FfiCode SUBTYPE_OF_FFI_CLASS_IN_EXTENDS = FfiCode(
name: 'SUBTYPE_OF_FFI_CLASS',
message: "The class '{0}' can't extend '{1}'.",
- correction: "Try extending 'Struct'.",
+ correction: "Try extending 'Struct' or 'Union'.",
uniqueName: 'SUBTYPE_OF_FFI_CLASS_IN_EXTENDS',
);
@@ -264,7 +267,7 @@
static const FfiCode SUBTYPE_OF_FFI_CLASS_IN_IMPLEMENTS = FfiCode(
name: 'SUBTYPE_OF_FFI_CLASS',
message: "The class '{0}' can't implement '{1}'.",
- correction: "Try extending 'Struct'.",
+ correction: "Try extending 'Struct' or 'Union'.",
uniqueName: 'SUBTYPE_OF_FFI_CLASS_IN_IMPLEMENTS',
);
@@ -276,7 +279,7 @@
static const FfiCode SUBTYPE_OF_FFI_CLASS_IN_WITH = FfiCode(
name: 'SUBTYPE_OF_FFI_CLASS',
message: "The class '{0}' can't mix in '{1}'.",
- correction: "Try extending 'Struct'.",
+ correction: "Try extending 'Struct' or 'Union'.",
uniqueName: 'SUBTYPE_OF_FFI_CLASS_IN_WITH',
);
@@ -288,8 +291,8 @@
static const FfiCode SUBTYPE_OF_STRUCT_CLASS_IN_EXTENDS = FfiCode(
name: 'SUBTYPE_OF_STRUCT_CLASS',
message: "The class '{0}' can't extend '{1}' because '{1}' is a subtype of "
- "'Struct'.",
- correction: "Try extending 'Struct' directly.",
+ "'Struct' or 'Union'.",
+ correction: "Try extending 'Struct' or 'Union' directly.",
uniqueName: 'SUBTYPE_OF_STRUCT_CLASS_IN_EXTENDS',
);
@@ -302,8 +305,8 @@
name: 'SUBTYPE_OF_STRUCT_CLASS',
message:
"The class '{0}' can't implement '{1}' because '{1}' is a subtype of "
- "'Struct'.",
- correction: "Try extending 'Struct' directly.",
+ "'Struct' or 'Union'.",
+ correction: "Try extending 'Struct' or 'Union' directly.",
uniqueName: 'SUBTYPE_OF_STRUCT_CLASS_IN_IMPLEMENTS',
);
@@ -315,8 +318,8 @@
static const FfiCode SUBTYPE_OF_STRUCT_CLASS_IN_WITH = FfiCode(
name: 'SUBTYPE_OF_STRUCT_CLASS',
message: "The class '{0}' can't mix in '{1}' because '{1}' is a subtype of "
- "'Struct'.",
- correction: "Try extending 'Struct' directly.",
+ "'Struct' or 'Union'.",
+ correction: "Try extending 'Struct' or 'Union' directly.",
uniqueName: 'SUBTYPE_OF_STRUCT_CLASS_IN_WITH',
);
diff --git a/pkg/analyzer/lib/src/generated/ffi_verifier.dart b/pkg/analyzer/lib/src/generated/ffi_verifier.dart
index 694d0ad..f330413 100644
--- a/pkg/analyzer/lib/src/generated/ffi_verifier.dart
+++ b/pkg/analyzer/lib/src/generated/ffi_verifier.dart
@@ -41,6 +41,8 @@
static const _structClassName = 'Struct';
+ static const _unionClassName = 'Union';
+
/// The type system used to check types.
final TypeSystemImpl typeSystem;
@@ -49,18 +51,18 @@
/// A flag indicating whether we are currently visiting inside a subclass of
/// `Struct`.
- bool inStruct = false;
+ bool inCompound = false;
- /// Subclass of `Struct` we are currently visiting, or `null`.
- ClassDeclaration? struct;
+ /// Subclass of `Struct` or `Union` we are currently visiting, or `null`.
+ ClassDeclaration? compound;
/// Initialize a newly created verifier.
FfiVerifier(this.typeSystem, this._errorReporter);
@override
void visitClassDeclaration(ClassDeclaration node) {
- inStruct = false;
- struct = null;
+ inCompound = false;
+ compound = null;
// Only the Allocator, Opaque and Struct class may be extended.
var extendsClause = node.extendsClause;
if (extendsClause != null) {
@@ -68,14 +70,16 @@
final ffiClass = superclass.ffiClass;
if (ffiClass != null) {
final className = ffiClass.name;
- if (className == _structClassName) {
- inStruct = true;
- struct = node;
+ if (className == _structClassName || className == _unionClassName) {
+ inCompound = true;
+ compound = node;
if (node.declaredElement!.isEmptyStruct) {
_errorReporter
.reportErrorForNode(FfiCode.EMPTY_STRUCT, node, [node.name]);
}
- _validatePackedAnnotation(node.metadata);
+ if (className == _structClassName) {
+ _validatePackedAnnotation(node.metadata);
+ }
} else if (className != _allocatorClassName &&
className != _opaqueClassName) {
_errorReporter.reportErrorForNode(
@@ -83,7 +87,7 @@
superclass.name,
[node.name.name, superclass.name.name]);
}
- } else if (superclass.isStructSubtype) {
+ } else if (superclass.isCompoundSubtype) {
_errorReporter.reportErrorForNode(
FfiCode.SUBTYPE_OF_STRUCT_CLASS_IN_EXTENDS,
superclass,
@@ -101,7 +105,7 @@
if (typename.ffiClass != null) {
_errorReporter.reportErrorForNode(
subtypeOfFfiCode, typename, [node.name, typename.name]);
- } else if (typename.isStructSubtype) {
+ } else if (typename.isCompoundSubtype) {
_errorReporter.reportErrorForNode(
subtypeOfStructCode, typename, [node.name, typename.name]);
}
@@ -122,7 +126,7 @@
}
}
- if (inStruct && node.declaredElement!.typeParameters.isNotEmpty) {
+ if (inCompound && node.declaredElement!.typeParameters.isNotEmpty) {
_errorReporter.reportErrorForNode(
FfiCode.GENERIC_STRUCT_SUBCLASS, node.name, [node.name]);
}
@@ -131,7 +135,7 @@
@override
void visitConstructorFieldInitializer(ConstructorFieldInitializer node) {
- if (inStruct) {
+ if (inCompound) {
_errorReporter.reportErrorForNode(
FfiCode.FIELD_INITIALIZER_IN_STRUCT, node);
}
@@ -140,8 +144,8 @@
@override
void visitFieldDeclaration(FieldDeclaration node) {
- if (inStruct) {
- _validateFieldsInStruct(node);
+ if (inCompound) {
+ _validateFieldsInCompound(node);
}
super.visitFieldDeclaration(node);
}
@@ -248,7 +252,7 @@
case _PrimitiveDartType.none:
break;
}
- if (nativeType.isStructSubtype) {
+ if (nativeType.isCompoundSubtype) {
return true;
}
if (nativeType.isPointer) {
@@ -311,10 +315,10 @@
final nativeArgumentType = nativeType.typeArguments.single;
return _isValidFfiNativeType(nativeArgumentType,
allowVoid: true, allowEmptyStruct: true, allowHandle: true) ||
- nativeArgumentType.isStructSubtype ||
+ nativeArgumentType.isCompoundSubtype ||
nativeArgumentType.isNativeType;
}
- if (nativeType.isStructSubtype) {
+ if (nativeType.isCompoundSubtype) {
if (!allowEmptyStruct) {
if (nativeType.element.isEmptyStruct) {
// TODO(dartbug.com/36780): This results in an error message not
@@ -548,8 +552,8 @@
}
/// Validate that the fields declared by the given [node] meet the
- /// requirements for fields within a struct class.
- void _validateFieldsInStruct(FieldDeclaration node) {
+ /// requirements for fields within a struct or union class.
+ void _validateFieldsInCompound(FieldDeclaration node) {
if (node.isStatic) {
return;
}
@@ -576,18 +580,18 @@
final arrayDimensions = declaredType.arrayDimensions;
_validateSizeOfAnnotation(fieldType, annotations, arrayDimensions);
final arrayElement = declaredType.arrayElementType;
- if (arrayElement.isStructSubtype) {
+ if (arrayElement.isCompoundSubtype) {
final elementClass = (arrayElement as InterfaceType).element;
- _validatePackingNesting(struct!.declaredElement!, elementClass,
+ _validatePackingNesting(compound!.declaredElement!, elementClass,
errorNode: fieldType);
}
- } else if (declaredType.isStructSubtype) {
+ } else if (declaredType.isCompoundSubtype) {
final clazz = (declaredType as InterfaceType).element;
if (clazz.isEmptyStruct) {
_errorReporter
.reportErrorForNode(FfiCode.EMPTY_STRUCT, node, [clazz.name]);
}
- _validatePackingNesting(struct!.declaredElement!, clazz,
+ _validatePackingNesting(compound!.declaredElement!, clazz,
errorNode: fieldType);
} else {
_errorReporter.reportErrorForNode(FfiCode.INVALID_FIELD_TYPE_IN_STRUCT,
@@ -632,7 +636,7 @@
if ((FT as FunctionType).returnType.isVoid ||
R.isPointer ||
R.isHandle ||
- R.isStructSubtype) {
+ R.isCompoundSubtype) {
if (argCount != 1) {
_errorReporter.reportErrorForNode(
FfiCode.INVALID_EXCEPTION_VALUE, node.argumentList.arguments[1]);
@@ -975,7 +979,7 @@
return false;
} else if (declaredType.isPointer) {
return false;
- } else if (declaredType.isStructSubtype) {
+ } else if (declaredType.isCompoundSubtype) {
return false;
} else if (declaredType.isArray) {
return false;
@@ -1087,22 +1091,25 @@
return false;
}
- bool get isStruct {
+ bool get isCompound {
final self = this;
if (self is InterfaceType) {
final element = self.element;
- return element.name == FfiVerifier._structClassName && element.isFfiClass;
+ final name = element.name;
+ return (name == FfiVerifier._structClassName ||
+ name == FfiVerifier._unionClassName) &&
+ element.isFfiClass;
}
return false;
}
/// Returns `true` if this is a struct type, i.e. a subtype of `Struct`.
- bool get isStructSubtype {
+ bool get isCompoundSubtype {
final self = this;
if (self is InterfaceType) {
final superType = self.element.supertype;
if (superType != null) {
- return superType.isStruct;
+ return superType.isCompound;
}
}
return false;
@@ -1115,17 +1122,17 @@
return name.staticElement.ffiClass;
}
- /// Return `true` if this represents a subtype of `Struct`.
- bool get isStructSubtype {
+ /// Return `true` if this represents a subtype of `Struct` or `Union`.
+ bool get isCompoundSubtype {
var element = name.staticElement;
if (element is ClassElement) {
- bool isStruct(InterfaceType? type) {
- return type != null && type.isStruct;
+ bool isCompound(InterfaceType? type) {
+ return type != null && type.isCompound;
}
- return isStruct(element.supertype) ||
- element.interfaces.any(isStruct) ||
- element.mixins.any(isStruct);
+ return isCompound(element.supertype) ||
+ element.interfaces.any(isCompound) ||
+ element.mixins.any(isCompound);
}
return false;
}
diff --git a/pkg/analyzer/lib/src/test_utilities/mock_sdk.dart b/pkg/analyzer/lib/src/test_utilities/mock_sdk.dart
index 8c3a9a5..d2def94 100644
--- a/pkg/analyzer/lib/src/test_utilities/mock_sdk.dart
+++ b/pkg/analyzer/lib/src/test_utilities/mock_sdk.dart
@@ -670,12 +670,18 @@
[Object exceptionalReturn]) {}
}
+final Pointer<Never> nullptr = Pointer.fromAddress(0);
+
extension NativeFunctionPointer<NF extends Function>
on Pointer<NativeFunction<NF>> {
external DF asFunction<DF extends Function>();
}
-class Struct extends NativeType {}
+class _Compound extends NativeType {}
+
+class Struct extends _Compound {}
+
+class Union extends _Compound {}
class Packed {
final int memberAlignment;
diff --git a/pkg/analyzer/test/src/diagnostics/field_in_struct_with_initializer_test.dart b/pkg/analyzer/test/src/diagnostics/field_in_struct_with_initializer_test.dart
index 5a32780..426ff14 100644
--- a/pkg/analyzer/test/src/diagnostics/field_in_struct_with_initializer_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/field_in_struct_with_initializer_test.dart
@@ -19,10 +19,21 @@
await assertErrorsInCode(r'''
import 'dart:ffi';
class C extends Struct {
- Pointer? p = null;
+ Pointer p = nullptr;
}
''', [
- error(FfiCode.FIELD_IN_STRUCT_WITH_INITIALIZER, 55, 1),
+ error(FfiCode.FIELD_IN_STRUCT_WITH_INITIALIZER, 54, 1),
+ ]);
+ }
+
+ test_instance_withInitializer2() async {
+ await assertErrorsInCode(r'''
+import 'dart:ffi';
+class C extends Union {
+ Pointer p = nullptr;
+}
+''', [
+ error(FfiCode.FIELD_IN_STRUCT_WITH_INITIALIZER, 53, 1),
]);
}
diff --git a/pkg/analyzer/test/src/diagnostics/field_initializer_in_struct_test.dart b/pkg/analyzer/test/src/diagnostics/field_initializer_in_struct_test.dart
index e687a98..dd2978f 100644
--- a/pkg/analyzer/test/src/diagnostics/field_initializer_in_struct_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/field_initializer_in_struct_test.dart
@@ -19,11 +19,23 @@
await assertErrorsInCode('''
import 'dart:ffi';
class C extends Struct {
- @Int32() int? f;
+ @Int32() int f;
C() : f = 0;
}
''', [
- error(FfiCode.FIELD_INITIALIZER_IN_STRUCT, 71, 5),
+ error(FfiCode.FIELD_INITIALIZER_IN_STRUCT, 70, 5),
+ ]);
+ }
+
+ test_fieldInitializer2() async {
+ await assertErrorsInCode('''
+import 'dart:ffi';
+class C extends Union {
+ @Int32() int f;
+ C() : f = 0;
+}
+''', [
+ error(FfiCode.FIELD_INITIALIZER_IN_STRUCT, 69, 5),
]);
}
diff --git a/pkg/analyzer/test/src/diagnostics/generic_struct_subclass_test.dart b/pkg/analyzer/test/src/diagnostics/generic_struct_subclass_test.dart
index 710a812..68e338d 100644
--- a/pkg/analyzer/test/src/diagnostics/generic_struct_subclass_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/generic_struct_subclass_test.dart
@@ -19,7 +19,18 @@
await assertErrorsInCode(r'''
import 'dart:ffi';
class S<T> extends Struct {
- Pointer notEmpty;
+ external Pointer notEmpty;
+}
+''', [
+ error(FfiCode.GENERIC_STRUCT_SUBCLASS, 25, 1),
+ ]);
+ }
+
+ test_genericUnion() async {
+ await assertErrorsInCode(r'''
+import 'dart:ffi';
+class S<T> extends Union {
+ external Pointer notEmpty;
}
''', [
error(FfiCode.GENERIC_STRUCT_SUBCLASS, 25, 1),
@@ -30,7 +41,7 @@
await assertNoErrorsInCode(r'''
import 'dart:ffi';
class S extends Struct {
- Pointer notEmpty;
+ external Pointer notEmpty;
}
''');
}
diff --git a/pkg/analyzer/test/src/diagnostics/invalid_field_type_in_struct_test.dart b/pkg/analyzer/test/src/diagnostics/invalid_field_type_in_struct_test.dart
index 4cdedd7..4343b90 100644
--- a/pkg/analyzer/test/src/diagnostics/invalid_field_type_in_struct_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/invalid_field_type_in_struct_test.dart
@@ -20,12 +20,26 @@
await assertErrorsInCode(r'''
import 'dart:ffi';
class C extends Struct {
- String? str;
+ external String str;
- Pointer? notEmpty;
+ external Pointer notEmpty;
}
''', [
- error(FfiCode.INVALID_FIELD_TYPE_IN_STRUCT, 46, 7),
+ error(FfiCode.INVALID_FIELD_TYPE_IN_STRUCT, 55, 6),
+ ]);
+ }
+
+ // TODO(https://dartbug.com/44677): Remove Pointer notEmpty field.
+ test_instance_invalid2() async {
+ await assertErrorsInCode(r'''
+import 'dart:ffi';
+class C extends Union {
+ external String str;
+
+ external Pointer notEmpty;
+}
+''', [
+ error(FfiCode.INVALID_FIELD_TYPE_IN_STRUCT, 54, 6),
]);
}
@@ -33,19 +47,18 @@
await assertNoErrorsInCode(r'''
import 'dart:ffi';
class C extends Struct {
- Pointer? p;
+ external Pointer p;
}
''');
}
- // TODO(https://dartbug.com/44677): Remove Pointer notEmpty field.
test_static() async {
await assertNoErrorsInCode(r'''
import 'dart:ffi';
class C extends Struct {
static String? str;
- Pointer? notEmpty;
+ external Pointer notEmpty;
}
''');
}
diff --git a/pkg/analyzer/test/src/diagnostics/non_sized_type_argument_test.dart b/pkg/analyzer/test/src/diagnostics/non_sized_type_argument_test.dart
index ec3f26d..c06084a 100644
--- a/pkg/analyzer/test/src/diagnostics/non_sized_type_argument_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/non_sized_type_argument_test.dart
@@ -15,27 +15,40 @@
@reflectiveTest
class NonSizedTypeArgument extends PubPackageResolutionTest {
- test_one() async {
- await assertNoErrorsInCode(r'''
-import 'dart:ffi';
-
-class C extends Struct {
- @Array(8)
- Array<Uint8> a0;
-}
-''');
- }
-
- test_two() async {
+ test_invalid_struct() async {
await assertErrorsInCode(r'''
import 'dart:ffi';
class C extends Struct {
@Array(8)
- Array<Void> a0;
+ external Array<Void> a0;
}
''', [
- error(FfiCode.NON_SIZED_TYPE_ARGUMENT, 59, 11),
+ error(FfiCode.NON_SIZED_TYPE_ARGUMENT, 68, 11),
]);
}
+
+ test_invalid_union() async {
+ await assertErrorsInCode(r'''
+import 'dart:ffi';
+
+class C extends Union {
+ @Array(8)
+ external Array<Void> a0;
+}
+''', [
+ error(FfiCode.NON_SIZED_TYPE_ARGUMENT, 67, 11),
+ ]);
+ }
+
+ test_valid() async {
+ await assertNoErrorsInCode(r'''
+import 'dart:ffi';
+
+class C extends Struct {
+ @Array(8)
+ external Array<Uint8> a0;
+}
+''');
+ }
}
diff --git a/pkg/analyzer/test/src/diagnostics/packed_annotation_test.dart b/pkg/analyzer/test/src/diagnostics/packed_annotation_test.dart
index 21a5454..88a67db 100644
--- a/pkg/analyzer/test/src/diagnostics/packed_annotation_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/packed_annotation_test.dart
@@ -16,7 +16,7 @@
@reflectiveTest
class PackedAnnotation extends PubPackageResolutionTest {
- test_error_1() async {
+ test_error_double() async {
await assertErrorsInCode(r'''
import 'dart:ffi';
@@ -31,7 +31,7 @@
}
/// Regress test for http://dartbug.com/45498.
- test_error_2() async {
+ test_error_missing() async {
await assertErrorsInCode(r'''
import 'dart:ffi';
@@ -45,7 +45,7 @@
]);
}
- test_no_error_1() async {
+ test_no_error_struct_no_annotation() async {
await assertNoErrorsInCode(r'''
import 'dart:ffi';
@@ -55,7 +55,7 @@
''');
}
- test_no_error_2() async {
+ test_no_error_struct_one_annotation() async {
await assertNoErrorsInCode(r'''
import 'dart:ffi';
@@ -65,4 +65,40 @@
}
''');
}
+
+ /// Doesn't do anything on Unions.
+ test_no_error_union_no_annotation() async {
+ await assertNoErrorsInCode(r'''
+import 'dart:ffi';
+
+class C extends Union {
+ external Pointer<Uint8> notEmpty;
+}
+''');
+ }
+
+ /// Doesn't do anything on Unions.
+ test_no_error_union_one_annotation() async {
+ await assertNoErrorsInCode(r'''
+import 'dart:ffi';
+
+@Packed(1)
+class C extends Union {
+ external Pointer<Uint8> notEmpty;
+}
+''');
+ }
+
+ /// Doesn't do anything on Unions.
+ test_no_error_union_two_annotations() async {
+ await assertNoErrorsInCode(r'''
+import 'dart:ffi';
+
+@Packed(1)
+@Packed(1)
+class C extends Union {
+ external Pointer<Uint8> notEmpty;
+}
+''');
+ }
}
diff --git a/pkg/analyzer/test/src/diagnostics/subtype_of_ffi_class_test.dart b/pkg/analyzer/test/src/diagnostics/subtype_of_ffi_class_test.dart
index 85129db..6e19801 100644
--- a/pkg/analyzer/test/src/diagnostics/subtype_of_ffi_class_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/subtype_of_ffi_class_test.dart
@@ -87,7 +87,7 @@
await assertNoErrorsInCode(r'''
import 'dart:ffi';
class C extends Struct {
- Pointer notEmpty;
+ external Pointer notEmpty;
}
''');
}
@@ -128,6 +128,15 @@
]);
}
+ test_Union() async {
+ await assertNoErrorsInCode(r'''
+import 'dart:ffi';
+class C extends Union {
+ external Pointer notEmpty;
+}
+''');
+ }
+
test_Void() async {
await assertErrorsInCode(r'''
import 'dart:ffi';
@@ -248,6 +257,15 @@
]);
}
+ test_Union() async {
+ await assertErrorsInCode(r'''
+import 'dart:ffi';
+class C implements Union {}
+''', [
+ error(FfiCode.SUBTYPE_OF_FFI_CLASS_IN_IMPLEMENTS, 38, 5),
+ ]);
+ }
+
test_Void() async {
await assertErrorsInCode(r'''
import 'dart:ffi';
@@ -390,6 +408,16 @@
]);
}
+ test_Union() async {
+ await assertErrorsInCode(r'''
+import 'dart:ffi';
+class C with Union {}
+''', [
+ error(CompileTimeErrorCode.MIXIN_INHERITS_FROM_NOT_OBJECT, 32, 5),
+ error(FfiCode.SUBTYPE_OF_FFI_CLASS_IN_WITH, 32, 5),
+ ]);
+ }
+
test_Void() async {
await assertErrorsInCode(r'''
import 'dart:ffi';
diff --git a/pkg/analyzer/test/src/diagnostics/subtype_of_struct_class_test.dart b/pkg/analyzer/test/src/diagnostics/subtype_of_struct_class_test.dart
index 00380d1..ab9e982 100644
--- a/pkg/analyzer/test/src/diagnostics/subtype_of_struct_class_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/subtype_of_struct_class_test.dart
@@ -18,22 +18,34 @@
@reflectiveTest
class SubtypeOfStructClassInExtendsTest extends PubPackageResolutionTest {
- test_extends() async {
+ test_extends_struct() async {
await assertErrorsInCode(r'''
import 'dart:ffi';
class S extends Struct {
- Pointer notEmpty;
+ external Pointer notEmpty;
}
class C extends S {}
''', [
- error(FfiCode.SUBTYPE_OF_STRUCT_CLASS_IN_EXTENDS, 82, 1),
+ error(FfiCode.SUBTYPE_OF_STRUCT_CLASS_IN_EXTENDS, 91, 1),
+ ]);
+ }
+
+ test_extends_union() async {
+ await assertErrorsInCode(r'''
+import 'dart:ffi';
+class S extends Union {
+ external Pointer notEmpty;
+}
+class C extends S {}
+''', [
+ error(FfiCode.SUBTYPE_OF_STRUCT_CLASS_IN_EXTENDS, 90, 1),
]);
}
}
@reflectiveTest
class SubtypeOfStructClassInImplementsTest extends PubPackageResolutionTest {
- test_implements() async {
+ test_implements_struct() async {
await assertErrorsInCode(r'''
import 'dart:ffi';
class S extends Struct {}
@@ -43,11 +55,22 @@
error(FfiCode.SUBTYPE_OF_STRUCT_CLASS_IN_IMPLEMENTS, 64, 1),
]);
}
+
+ test_implements_union() async {
+ await assertErrorsInCode(r'''
+import 'dart:ffi';
+class S extends Union {}
+class C implements S {}
+''', [
+ error(FfiCode.EMPTY_STRUCT, 19, 24),
+ error(FfiCode.SUBTYPE_OF_STRUCT_CLASS_IN_IMPLEMENTS, 63, 1),
+ ]);
+ }
}
@reflectiveTest
class SubtypeOfStructClassInWithTest extends PubPackageResolutionTest {
- test_with() async {
+ test_with_struct() async {
await assertErrorsInCode(r'''
import 'dart:ffi';
class S extends Struct {}
@@ -58,4 +81,16 @@
error(FfiCode.SUBTYPE_OF_STRUCT_CLASS_IN_WITH, 58, 1),
]);
}
+
+ test_with_union() async {
+ await assertErrorsInCode(r'''
+import 'dart:ffi';
+class S extends Union {}
+class C with S {}
+''', [
+ error(FfiCode.EMPTY_STRUCT, 19, 24),
+ error(CompileTimeErrorCode.MIXIN_INHERITS_FROM_NOT_OBJECT, 57, 1),
+ error(FfiCode.SUBTYPE_OF_STRUCT_CLASS_IN_WITH, 57, 1),
+ ]);
+ }
}
diff --git a/pkg/front_end/lib/src/fasta/builder/constructor_builder.dart b/pkg/front_end/lib/src/fasta/builder/constructor_builder.dart
index 1b544eb..76c675b 100644
--- a/pkg/front_end/lib/src/fasta/builder/constructor_builder.dart
+++ b/pkg/front_end/lib/src/fasta/builder/constructor_builder.dart
@@ -142,6 +142,7 @@
Member referenceFrom,
[String nativeMethodName])
: _constructor = new Constructor(null,
+ name: new Name(name, compilationUnit.library),
fileUri: compilationUnit.fileUri,
reference: referenceFrom?.reference)
..startFileOffset = startCharOffset
@@ -196,9 +197,11 @@
f(member, BuiltMemberKind.Constructor);
}
+ bool _hasBeenBuilt = false;
+
@override
Constructor build(SourceLibraryBuilder libraryBuilder) {
- if (_constructor.name == null) {
+ if (!_hasBeenBuilt) {
_constructor.function = buildFunction(libraryBuilder);
_constructor.function.parent = _constructor;
_constructor.function.fileOffset = charOpenParenOffset;
@@ -206,7 +209,8 @@
_constructor.function.typeParameters = const <TypeParameter>[];
_constructor.isConst = isConst;
_constructor.isExternal = isExternal;
- _constructor.name = new Name(name, libraryBuilder.library);
+ updatePrivateMemberName(_constructor, libraryBuilder);
+ _hasBeenBuilt = true;
}
if (formals != null) {
bool needsInference = false;
diff --git a/pkg/front_end/lib/src/fasta/builder/enum_builder.dart b/pkg/front_end/lib/src/fasta/builder/enum_builder.dart
index ce76627..4742d6f 100644
--- a/pkg/front_end/lib/src/fasta/builder/enum_builder.dart
+++ b/pkg/front_end/lib/src/fasta/builder/enum_builder.dart
@@ -172,6 +172,33 @@
/// static const List<E> values = const <E>[id0, ..., idn-1];
/// String toString() => _name;
/// }
+
+ FieldNameScheme instanceFieldNameScheme = new FieldNameScheme(
+ isInstanceMember: true,
+ className: name,
+ isExtensionMember: false,
+ extensionName: null,
+ libraryReference: referencesFrom != null
+ ? referencesFromIndexed.library.reference
+ : parent.library.reference);
+
+ FieldNameScheme staticFieldNameScheme = new FieldNameScheme(
+ isInstanceMember: false,
+ className: name,
+ isExtensionMember: false,
+ extensionName: null,
+ libraryReference: referencesFrom != null
+ ? referencesFromIndexed.library.reference
+ : parent.library.reference);
+
+ ProcedureNameScheme procedureNameScheme = new ProcedureNameScheme(
+ isStatic: false,
+ isExtensionMember: false,
+ extensionName: null,
+ libraryReference: referencesFrom != null
+ ? referencesFromIndexed.library.reference
+ : parent.library.reference);
+
Constructor constructorReference;
Reference toStringReference;
Reference indexGetterReference;
@@ -210,6 +237,8 @@
parent,
charOffset,
charOffset,
+ instanceFieldNameScheme,
+ isInstanceMember: true,
fieldGetterReference: indexGetterReference,
fieldSetterReference: indexSetterReference);
members["_name"] = new SourceFieldBuilder(
@@ -221,6 +250,8 @@
parent,
charOffset,
charOffset,
+ instanceFieldNameScheme,
+ isInstanceMember: true,
fieldGetterReference: _nameGetterReference,
fieldSetterReference: _nameSetterReference);
ConstructorBuilder constructorBuilder = new ConstructorBuilderImpl(
@@ -251,6 +282,8 @@
parent,
charOffset,
charOffset,
+ staticFieldNameScheme,
+ isInstanceMember: false,
fieldGetterReference: valuesGetterReference,
fieldSetterReference: valuesSetterReference);
members["values"] = valuesBuilder;
@@ -263,8 +296,8 @@
0,
stringType,
"toString",
- null,
- null,
+ /* typeVariables = */ null,
+ /* formals = */ null,
ProcedureKind.Method,
parent,
charOffset,
@@ -272,9 +305,11 @@
charOffset,
charEndOffset,
toStringReference,
- null,
+ /* tearOffReference = */ null,
AsyncMarker.Sync,
- /* isExtensionInstanceMember = */ false);
+ procedureNameScheme,
+ isExtensionMember: false,
+ isInstanceMember: true);
members["toString"] = toStringBuilder;
String className = name;
if (enumConstantInfos != null) {
@@ -329,6 +364,8 @@
parent,
enumConstantInfo.charOffset,
enumConstantInfo.charOffset,
+ staticFieldNameScheme,
+ isInstanceMember: false,
fieldGetterReference: getterReference,
fieldSetterReference: setterReference);
members[name] = fieldBuilder..next = existing;
diff --git a/pkg/front_end/lib/src/fasta/builder/field_builder.dart b/pkg/front_end/lib/src/fasta/builder/field_builder.dart
index fd05495..f5974fb 100644
--- a/pkg/front_end/lib/src/fasta/builder/field_builder.dart
+++ b/pkg/front_end/lib/src/fasta/builder/field_builder.dart
@@ -38,7 +38,6 @@
import '../util/helpers.dart' show DelayedActionPerformer;
import 'class_builder.dart';
-import 'extension_builder.dart';
import 'library_builder.dart';
import 'member_builder.dart';
import 'metadata_builder.dart';
@@ -121,25 +120,36 @@
SourceLibraryBuilder libraryBuilder,
int charOffset,
int charEndOffset,
- {Reference fieldGetterReference,
+ FieldNameScheme fieldNameScheme,
+ {bool isInstanceMember,
+ Reference fieldGetterReference,
Reference fieldSetterReference,
Reference lateIsSetGetterReference,
Reference lateIsSetSetterReference,
Reference lateGetterReference,
Reference lateSetterReference})
: super(libraryBuilder, charOffset) {
+ assert(isInstanceMember != null);
+
Uri fileUri = libraryBuilder?.fileUri;
// If in mixed mode, late lowerings cannot use `null` as a sentinel on
// non-nullable fields since they can be assigned from legacy code.
late_lowering.IsSetStrategy isSetStrategy =
late_lowering.computeIsSetStrategy(libraryBuilder);
+
if (isAbstract || isExternal) {
assert(lateIsSetGetterReference == null);
assert(lateIsSetSetterReference == null);
assert(lateGetterReference == null);
assert(lateSetterReference == null);
- _fieldEncoding = new AbstractOrExternalFieldEncoding(fileUri, charOffset,
- charEndOffset, fieldGetterReference, fieldSetterReference,
+ _fieldEncoding = new AbstractOrExternalFieldEncoding(
+ name,
+ fieldNameScheme,
+ fileUri,
+ charOffset,
+ charEndOffset,
+ fieldGetterReference,
+ fieldSetterReference,
isAbstract: isAbstract,
isExternal: isExternal,
isFinal: isFinal,
@@ -149,11 +159,12 @@
libraryBuilder.loader.target.backendTarget.isLateFieldLoweringEnabled(
hasInitializer: hasInitializer,
isFinal: isFinal,
- isStatic: (isStatic || isTopLevel))) {
+ isStatic: !isInstanceMember)) {
if (hasInitializer) {
if (isFinal) {
_fieldEncoding = new LateFinalFieldWithInitializerEncoding(
name,
+ fieldNameScheme,
fileUri,
charOffset,
charEndOffset,
@@ -168,6 +179,7 @@
} else {
_fieldEncoding = new LateFieldWithInitializerEncoding(
name,
+ fieldNameScheme,
fileUri,
charOffset,
charEndOffset,
@@ -184,6 +196,7 @@
if (isFinal) {
_fieldEncoding = new LateFinalFieldWithoutInitializerEncoding(
name,
+ fieldNameScheme,
fileUri,
charOffset,
charEndOffset,
@@ -198,6 +211,7 @@
} else {
_fieldEncoding = new LateFieldWithoutInitializerEncoding(
name,
+ fieldNameScheme,
fileUri,
charOffset,
charEndOffset,
@@ -213,12 +227,13 @@
}
} else if (libraryBuilder.isNonNullableByDefault &&
libraryBuilder.loader.target.backendTarget.useStaticFieldLowering &&
- (isStatic || isTopLevel) &&
+ !isInstanceMember &&
!isConst &&
hasInitializer) {
if (isFinal) {
_fieldEncoding = new LateFinalFieldWithInitializerEncoding(
name,
+ fieldNameScheme,
fileUri,
charOffset,
charEndOffset,
@@ -233,6 +248,7 @@
} else {
_fieldEncoding = new LateFieldWithInitializerEncoding(
name,
+ fieldNameScheme,
fileUri,
charOffset,
charEndOffset,
@@ -251,7 +267,7 @@
assert(lateGetterReference == null);
assert(lateSetterReference == null);
_fieldEncoding = new RegularFieldEncoding(
- fileUri, charOffset, charEndOffset,
+ name, fieldNameScheme, fileUri, charOffset, charEndOffset,
isFinal: isFinal,
isConst: isConst,
isLate: isLate,
@@ -551,6 +567,36 @@
enum FieldNameType { Field, Getter, Setter, IsSetField }
+class FieldNameScheme {
+ final bool isInstanceMember;
+ final String className;
+ final bool isExtensionMember;
+ final String extensionName;
+ final Reference libraryReference;
+
+ FieldNameScheme(
+ {this.isInstanceMember,
+ this.className,
+ this.isExtensionMember,
+ this.extensionName,
+ this.libraryReference})
+ : assert(isInstanceMember != null),
+ assert(isExtensionMember != null),
+ assert(!isExtensionMember || extensionName != null),
+ assert(libraryReference != null);
+
+ Name getName(FieldNameType type, String name, {bool isSynthesized}) {
+ assert(isSynthesized != null);
+ String text = SourceFieldBuilder.createFieldName(type, name,
+ isInstanceMember: isInstanceMember,
+ className: className,
+ isExtensionMethod: isExtensionMember,
+ extensionName: extensionName,
+ isSynthesized: isSynthesized);
+ return new Name.byReference(text, libraryReference);
+ }
+}
+
/// Strategy pattern for creating different encodings of a declared field.
///
/// This is used to provide lowerings for late fields using synthesized getters
@@ -621,7 +667,8 @@
class RegularFieldEncoding implements FieldEncoding {
Field _field;
- RegularFieldEncoding(Uri fileUri, int charOffset, int charEndOffset,
+ RegularFieldEncoding(String name, FieldNameScheme fieldNameScheme,
+ Uri fileUri, int charOffset, int charEndOffset,
{bool isFinal,
bool isConst,
bool isLate,
@@ -636,13 +683,17 @@
bool isImmutable =
isLate ? (isFinal && hasInitializer) : (isFinal || isConst);
_field = isImmutable
- ? new Field.immutable(null,
+ ? new Field.immutable(
+ fieldNameScheme.getName(FieldNameType.Field, name,
+ isSynthesized: false),
isFinal: isFinal,
isConst: isConst,
isLate: isLate,
fileUri: fileUri,
getterReference: getterReference)
- : new Field.mutable(null,
+ : new Field.mutable(
+ fieldNameScheme.getName(FieldNameType.Field, name,
+ isSynthesized: false),
isFinal: isFinal,
isLate: isLate,
fileUri: fileUri,
@@ -687,30 +738,19 @@
void build(
SourceLibraryBuilder libraryBuilder, SourceFieldBuilder fieldBuilder) {
_field..isCovariant = fieldBuilder.isCovariant;
- String fieldName;
if (fieldBuilder.isExtensionMember) {
- ExtensionBuilder extension = fieldBuilder.parent;
- fieldName = SourceFieldBuilder.createFieldName(
- FieldNameType.Field, fieldBuilder.name,
- isExtensionMethod: true, extensionName: extension.name);
_field
..isStatic = true
..isExtensionMember = true;
} else {
bool isInstanceMember =
!fieldBuilder.isStatic && !fieldBuilder.isTopLevel;
- String className =
- isInstanceMember ? fieldBuilder.classBuilder.name : null;
- fieldName = SourceFieldBuilder.createFieldName(
- FieldNameType.Field, fieldBuilder.name,
- isInstanceMember: isInstanceMember, className: className);
_field
..isStatic = !isInstanceMember
..isExtensionMember = false;
}
- // TODO(johnniwinther): How can the name already have been computed?
- _field.name ??= new Name(fieldName, libraryBuilder.library);
_field.isLate = fieldBuilder.isLate;
+ updatePrivateMemberName(_field, libraryBuilder);
}
@override
@@ -835,6 +875,7 @@
AbstractLateFieldEncoding(
this.name,
+ FieldNameScheme fieldNameScheme,
Uri fileUri,
int charOffset,
int charEndOffset,
@@ -851,7 +892,8 @@
_isSetStrategy = isSetStrategy,
_forceIncludeIsSetField =
isSetStrategy == late_lowering.IsSetStrategy.forceUseIsSetField {
- _field = new Field.mutable(null,
+ _field = new Field.mutable(
+ fieldNameScheme.getName(FieldNameType.Field, name, isSynthesized: true),
fileUri: fileUri,
getterReference: fieldGetterReference,
setterReference: fieldSetterReference)
@@ -866,7 +908,9 @@
break;
case late_lowering.IsSetStrategy.forceUseIsSetField:
case late_lowering.IsSetStrategy.useIsSetFieldOrNull:
- _lateIsSetField = new Field.mutable(null,
+ _lateIsSetField = new Field.mutable(
+ fieldNameScheme.getName(FieldNameType.IsSetField, name,
+ isSynthesized: true),
fileUri: fileUri,
getterReference: lateIsSetGetterReference,
setterReference: lateIsSetSetterReference)
@@ -877,7 +921,8 @@
break;
}
_lateGetter = new Procedure(
- null,
+ fieldNameScheme.getName(FieldNameType.Getter, name,
+ isSynthesized: true),
ProcedureKind.Getter,
new FunctionNode(null)
..fileOffset = charOffset
@@ -887,7 +932,12 @@
..fileOffset = charOffset
..fileEndOffset = charEndOffset
..isNonNullableByDefault = true;
- _lateSetter = _createSetter(name, fileUri, charOffset, lateSetterReference,
+ _lateSetter = _createSetter(
+ fieldNameScheme.getName(FieldNameType.Setter, name,
+ isSynthesized: true),
+ fileUri,
+ charOffset,
+ lateSetterReference,
isCovariant: isCovariant);
}
@@ -997,14 +1047,14 @@
Expression initializer, bool useNewMethodInvocationEncoding);
Procedure _createSetter(
- String name, Uri fileUri, int charOffset, Reference reference,
+ Name name, Uri fileUri, int charOffset, Reference reference,
{bool isCovariant}) {
assert(isCovariant != null);
VariableDeclaration parameter = new VariableDeclaration(null)
..isCovariant = isCovariant
..fileOffset = fileOffset;
return new Procedure(
- null,
+ name,
ProcedureKind.Setter,
new FunctionNode(null,
positionalParameters: [parameter], returnType: const VoidType())
@@ -1081,12 +1131,8 @@
void build(
SourceLibraryBuilder libraryBuilder, SourceFieldBuilder fieldBuilder) {
bool isInstanceMember;
- String className;
bool isExtensionMember = fieldBuilder.isExtensionMember;
- String extensionName;
if (isExtensionMember) {
- ExtensionBuilder extension = fieldBuilder.parent;
- extensionName = extension.name;
_field
..isStatic = true
..isExtensionMember = isExtensionMember;
@@ -1096,59 +1142,24 @@
_field
..isStatic = !isInstanceMember
..isExtensionMember = false;
- if (isInstanceMember) {
- className = fieldBuilder.classBuilder.name;
- }
}
- _field.name ??= new Name(
- SourceFieldBuilder.createFieldName(
- FieldNameType.Field, fieldBuilder.name,
- isInstanceMember: isInstanceMember,
- className: className,
- isExtensionMethod: isExtensionMember,
- extensionName: extensionName,
- isSynthesized: true),
- libraryBuilder.library);
+ updatePrivateMemberName(_field, libraryBuilder);
if (_lateIsSetField != null) {
_lateIsSetField
- ..name = new Name(
- SourceFieldBuilder.createFieldName(
- FieldNameType.IsSetField, fieldBuilder.name,
- isInstanceMember: isInstanceMember,
- className: className,
- isExtensionMethod: isExtensionMember,
- extensionName: extensionName,
- isSynthesized: true),
- libraryBuilder.library)
..isStatic = !isInstanceMember
..isStatic = _field.isStatic
..isExtensionMember = isExtensionMember;
+ updatePrivateMemberName(_lateIsSetField, libraryBuilder);
}
_lateGetter
- ..name = new Name(
- SourceFieldBuilder.createFieldName(
- FieldNameType.Getter, fieldBuilder.name,
- isInstanceMember: isInstanceMember,
- className: className,
- isExtensionMethod: isExtensionMember,
- extensionName: extensionName,
- isSynthesized: true),
- libraryBuilder.library)
..isStatic = !isInstanceMember
..isExtensionMember = isExtensionMember;
+ updatePrivateMemberName(_lateGetter, libraryBuilder);
if (_lateSetter != null) {
_lateSetter
- ..name = new Name(
- SourceFieldBuilder.createFieldName(
- FieldNameType.Setter, fieldBuilder.name,
- isInstanceMember: isInstanceMember,
- className: className,
- isExtensionMethod: isExtensionMember,
- extensionName: extensionName,
- isSynthesized: true),
- libraryBuilder.library)
..isStatic = !isInstanceMember
..isExtensionMember = isExtensionMember;
+ updatePrivateMemberName(_lateSetter, libraryBuilder);
}
}
@@ -1248,6 +1259,7 @@
with NonFinalLate, LateWithoutInitializer {
LateFieldWithoutInitializerEncoding(
String name,
+ FieldNameScheme fieldNameScheme,
Uri fileUri,
int charOffset,
int charEndOffset,
@@ -1261,6 +1273,7 @@
late_lowering.IsSetStrategy isSetStrategy)
: super(
name,
+ fieldNameScheme,
fileUri,
charOffset,
charEndOffset,
@@ -1278,6 +1291,7 @@
with NonFinalLate {
LateFieldWithInitializerEncoding(
String name,
+ FieldNameScheme fieldNameScheme,
Uri fileUri,
int charOffset,
int charEndOffset,
@@ -1291,6 +1305,7 @@
late_lowering.IsSetStrategy isSetStrategy)
: super(
name,
+ fieldNameScheme,
fileUri,
charOffset,
charEndOffset,
@@ -1323,6 +1338,7 @@
with LateWithoutInitializer {
LateFinalFieldWithoutInitializerEncoding(
String name,
+ FieldNameScheme fieldNameScheme,
Uri fileUri,
int charOffset,
int charEndOffset,
@@ -1336,6 +1352,7 @@
late_lowering.IsSetStrategy isSetStrategy)
: super(
name,
+ fieldNameScheme,
fileUri,
charOffset,
charEndOffset,
@@ -1369,6 +1386,7 @@
class LateFinalFieldWithInitializerEncoding extends AbstractLateFieldEncoding {
LateFinalFieldWithInitializerEncoding(
String name,
+ FieldNameScheme fieldNameScheme,
Uri fileUri,
int charOffset,
int charEndOffset,
@@ -1382,6 +1400,7 @@
late_lowering.IsSetStrategy isSetStrategy)
: super(
name,
+ fieldNameScheme,
fileUri,
charOffset,
charEndOffset,
@@ -1411,7 +1430,7 @@
@override
Procedure _createSetter(
- String name, Uri fileUri, int charOffset, Reference reference,
+ Name name, Uri fileUri, int charOffset, Reference reference,
{bool isCovariant}) =>
null;
@@ -1570,8 +1589,14 @@
Procedure _getter;
Procedure _setter;
- AbstractOrExternalFieldEncoding(Uri fileUri, int charOffset,
- int charEndOffset, Reference getterReference, Reference setterReference,
+ AbstractOrExternalFieldEncoding(
+ String name,
+ FieldNameScheme fieldNameScheme,
+ Uri fileUri,
+ int charOffset,
+ int charEndOffset,
+ Reference getterReference,
+ Reference setterReference,
{this.isAbstract,
this.isExternal,
bool isFinal,
@@ -1582,8 +1607,13 @@
assert(isFinal != null),
assert(isCovariant != null),
assert(isNonNullableByDefault != null) {
- _getter = new Procedure(null, ProcedureKind.Getter, new FunctionNode(null),
- fileUri: fileUri, reference: getterReference)
+ _getter = new Procedure(
+ fieldNameScheme.getName(FieldNameType.Getter, name,
+ isSynthesized: true),
+ ProcedureKind.Getter,
+ new FunctionNode(null),
+ fileUri: fileUri,
+ reference: getterReference)
..fileOffset = charOffset
..fileEndOffset = charEndOffset
..isNonNullableByDefault = isNonNullableByDefault;
@@ -1593,7 +1623,8 @@
..isCovariant = isCovariant
..fileOffset = charOffset;
_setter = new Procedure(
- null,
+ fieldNameScheme.getName(FieldNameType.Setter, name,
+ isSynthesized: true),
ProcedureKind.Setter,
new FunctionNode(null,
positionalParameters: [parameter], returnType: const VoidType())
@@ -1636,51 +1667,25 @@
@override
void build(
SourceLibraryBuilder libraryBuilder, SourceFieldBuilder fieldBuilder) {
- bool isExtensionMember = false;
- String extensionName;
- bool isInstanceMember = false;
- String className;
- if (fieldBuilder.isExtensionMember) {
- isExtensionMember = true;
- ExtensionBuilder extension = fieldBuilder.parent;
- extensionName = extension.name;
- } else {
- isInstanceMember = !fieldBuilder.isStatic && !fieldBuilder.isTopLevel;
- className = isInstanceMember ? fieldBuilder.classBuilder.name : null;
- }
+ bool isExtensionMember = fieldBuilder.isExtensionMember;
+ bool isInstanceMember = !fieldBuilder.isExtensionMember &&
+ !fieldBuilder.isStatic &&
+ !fieldBuilder.isTopLevel;
_getter..isConst = fieldBuilder.isConst;
- String getterName = SourceFieldBuilder.createFieldName(
- FieldNameType.Getter, fieldBuilder.name,
- isInstanceMember: isInstanceMember,
- className: className,
- isExtensionMethod: isExtensionMember,
- extensionName: extensionName,
- isSynthesized: true);
_getter
..isStatic = !isInstanceMember
..isExtensionMember = isExtensionMember
..isAbstract = isAbstract && !isExternal
..isExternal = isExternal;
- // TODO(johnniwinther): How can the name already have been computed?
- _getter.name ??= new Name(getterName, libraryBuilder.library);
+ updatePrivateMemberName(_getter, libraryBuilder);
if (_setter != null) {
- String setterName = SourceFieldBuilder.createFieldName(
- FieldNameType.Setter,
- fieldBuilder.name,
- isInstanceMember: isInstanceMember,
- className: className,
- isExtensionMethod: isExtensionMember,
- extensionName: extensionName,
- isSynthesized: true,
- );
_setter
..isStatic = !isInstanceMember
..isExtensionMember = isExtensionMember
..isAbstract = isAbstract && !isExternal
..isExternal = isExternal;
- // TODO(johnniwinther): How can the name already have been computed?
- _setter?.name ??= new Name(setterName, libraryBuilder.library);
+ updatePrivateMemberName(_setter, libraryBuilder);
}
}
diff --git a/pkg/front_end/lib/src/fasta/builder/member_builder.dart b/pkg/front_end/lib/src/fasta/builder/member_builder.dart
index 070d275..54f26f8 100644
--- a/pkg/front_end/lib/src/fasta/builder/member_builder.dart
+++ b/pkg/front_end/lib/src/fasta/builder/member_builder.dart
@@ -297,3 +297,13 @@
@override
String toString() => '$runtimeType($fullName,forSetter=${forSetter})';
}
+
+/// If the name of [member] is private, update it to use the library reference
+/// of [libraryBuilder].
+// TODO(johnniwinther): Avoid having to update private names by setting
+// the correct library reference when creating parts.
+void updatePrivateMemberName(Member member, LibraryBuilder libraryBuilder) {
+ if (member.name.isPrivate) {
+ member.name = new Name(member.name.text, libraryBuilder.library);
+ }
+}
diff --git a/pkg/front_end/lib/src/fasta/builder/procedure_builder.dart b/pkg/front_end/lib/src/fasta/builder/procedure_builder.dart
index ecc024e..498826b 100644
--- a/pkg/front_end/lib/src/fasta/builder/procedure_builder.dart
+++ b/pkg/front_end/lib/src/fasta/builder/procedure_builder.dart
@@ -65,7 +65,7 @@
abstract class ProcedureBuilderImpl extends FunctionBuilderImpl
implements ProcedureBuilder {
- final Procedure _procedure;
+ Procedure _procedure;
@override
final int charOpenParenOffset;
@@ -92,23 +92,29 @@
List<TypeVariableBuilder> typeVariables,
List<FormalParameterBuilder> formals,
this.kind,
- SourceLibraryBuilder compilationUnit,
+ SourceLibraryBuilder libraryBuilder,
int startCharOffset,
int charOffset,
this.charOpenParenOffset,
int charEndOffset,
Reference procedureReference,
- this.isExtensionInstanceMember,
- [String nativeMethodName])
- : _procedure = new Procedure(
- null, isExtensionInstanceMember ? ProcedureKind.Method : kind, null,
- fileUri: compilationUnit.fileUri, reference: procedureReference)
- ..startFileOffset = startCharOffset
- ..fileOffset = charOffset
- ..fileEndOffset = charEndOffset
- ..isNonNullableByDefault = compilationUnit.isNonNullableByDefault,
+ ProcedureNameScheme procedureNameScheme,
+ {bool isExtensionMember,
+ bool isInstanceMember,
+ String nativeMethodName})
+ : assert(isExtensionMember != null),
+ assert(isInstanceMember != null),
+ this.isExtensionInstanceMember = isInstanceMember && isExtensionMember,
super(metadata, modifiers, returnType, name, typeVariables, formals,
- compilationUnit, charOffset, nativeMethodName);
+ libraryBuilder, charOffset, nativeMethodName) {
+ _procedure = new Procedure(procedureNameScheme.getName(kind, name),
+ isExtensionInstanceMember ? ProcedureKind.Method : kind, null,
+ fileUri: libraryBuilder.fileUri, reference: procedureReference)
+ ..startFileOffset = startCharOffset
+ ..fileOffset = charOffset
+ ..fileEndOffset = charEndOffset
+ ..isNonNullableByDefault = libraryBuilder.isNonNullableByDefault;
+ }
@override
ProcedureBuilder get origin => actualOrigin ?? this;
@@ -225,7 +231,7 @@
List<TypeVariableBuilder> typeVariables,
List<FormalParameterBuilder> formals,
ProcedureKind kind,
- SourceLibraryBuilder compilationUnit,
+ SourceLibraryBuilder libraryBuilder,
int startCharOffset,
int charOffset,
int charOpenParenOffset,
@@ -233,8 +239,10 @@
Reference procedureReference,
this._tearOffReference,
AsyncMarker asyncModifier,
- bool isExtensionInstanceMember,
- [String nativeMethodName])
+ ProcedureNameScheme procedureNameScheme,
+ {bool isExtensionMember,
+ bool isInstanceMember,
+ String nativeMethodName})
: super(
metadata,
modifiers,
@@ -243,15 +251,27 @@
typeVariables,
formals,
kind,
- compilationUnit,
+ libraryBuilder,
startCharOffset,
charOffset,
charOpenParenOffset,
charEndOffset,
procedureReference,
- isExtensionInstanceMember,
- nativeMethodName) {
+ procedureNameScheme,
+ isExtensionMember: isExtensionMember,
+ isInstanceMember: isInstanceMember,
+ nativeMethodName: nativeMethodName) {
this.asyncModifier = asyncModifier;
+ if (isExtensionMember && isInstanceMember && kind == ProcedureKind.Method) {
+ _extensionTearOff ??= new Procedure(
+ procedureNameScheme.getName(ProcedureKind.Getter, name),
+ ProcedureKind.Method,
+ null,
+ isStatic: true,
+ isExtensionMember: true,
+ reference: _tearOffReference)
+ ..isNonNullableByDefault = library.isNonNullableByDefault;
+ }
}
bool _typeEnsured = false;
@@ -359,33 +379,26 @@
@override
Procedure build(SourceLibraryBuilder libraryBuilder) {
- // TODO(ahe): I think we may call this twice on parts. Investigate.
- if (_procedure.name == null) {
- _procedure.function = buildFunction(libraryBuilder);
- _procedure.function.parent = _procedure;
- _procedure.function.fileOffset = charOpenParenOffset;
- _procedure.function.fileEndOffset = _procedure.fileEndOffset;
- _procedure.isAbstract = isAbstract;
- _procedure.isExternal = isExternal;
- _procedure.isConst = isConst;
- if (isExtensionMethod) {
- ExtensionBuilder extensionBuilder = parent;
- _procedure.isExtensionMember = true;
- _procedure.isStatic = true;
- if (isExtensionInstanceMember) {
- assert(_procedure.kind == ProcedureKind.Method);
- }
- _procedure.name = new Name(
- createProcedureName(true, !isExtensionInstanceMember, kind,
- extensionBuilder.name, name),
- libraryBuilder.library);
- } else {
- _procedure.isStatic = isStatic;
- _procedure.name = new Name(name, libraryBuilder.library);
+ _procedure.function = buildFunction(libraryBuilder);
+ _procedure.function.parent = _procedure;
+ _procedure.function.fileOffset = charOpenParenOffset;
+ _procedure.function.fileEndOffset = _procedure.fileEndOffset;
+ _procedure.isAbstract = isAbstract;
+ _procedure.isExternal = isExternal;
+ _procedure.isConst = isConst;
+ updatePrivateMemberName(_procedure, libraryBuilder);
+ if (isExtensionMethod) {
+ _procedure.isExtensionMember = true;
+ _procedure.isStatic = true;
+ if (isExtensionInstanceMember) {
+ assert(_procedure.kind == ProcedureKind.Method);
}
- if (extensionTearOff != null) {
- _buildExtensionTearOff(libraryBuilder, parent);
- }
+ } else {
+ _procedure.isStatic = isStatic;
+ }
+ if (extensionTearOff != null) {
+ _buildExtensionTearOff(libraryBuilder, parent);
+ updatePrivateMemberName(extensionTearOff, libraryBuilder);
}
return _procedure;
}
@@ -442,7 +455,6 @@
SourceLibraryBuilder libraryBuilder, ExtensionBuilder extensionBuilder) {
assert(
_extensionTearOff != null, "No extension tear off created for $this.");
- if (_extensionTearOff.name != null) return;
_extensionTearOffParameterMap = {};
@@ -550,8 +562,6 @@
..fileOffset = fileOffset;
_extensionTearOff
- ..name = new Name(
- '${extensionBuilder.name}|get#${name}', libraryBuilder.library)
..function = (new FunctionNode(
new ReturnStatement(closure)..fileOffset = fileOffset,
typeParameters: tearOffTypeParameters,
@@ -566,14 +576,7 @@
_extensionTearOff.function.parent = _extensionTearOff;
}
- Procedure get extensionTearOff {
- if (isExtensionInstanceMember && kind == ProcedureKind.Method) {
- _extensionTearOff ??= new Procedure(null, ProcedureKind.Method, null,
- isStatic: true, isExtensionMember: true, reference: _tearOffReference)
- ..isNonNullableByDefault = library.isNonNullableByDefault;
- }
- return _extensionTearOff;
- }
+ Procedure get extensionTearOff => _extensionTearOff;
@override
VariableDeclaration getExtensionTearOffParameter(int index) {
@@ -663,6 +666,7 @@
int charOpenParenOffset,
int charEndOffset,
Reference reference,
+ ProcedureNameScheme procedureNameScheme,
[String nativeMethodName,
this.redirectionTarget])
: super(
@@ -679,8 +683,10 @@
charOpenParenOffset,
charEndOffset,
reference,
- /* isExtensionInstanceMember = */ false,
- nativeMethodName);
+ procedureNameScheme,
+ isExtensionMember: false,
+ isInstanceMember: false,
+ nativeMethodName: nativeMethodName);
@override
Member get readTarget => null;
@@ -741,18 +747,14 @@
@override
Procedure build(SourceLibraryBuilder libraryBuilder) {
- // TODO(ahe): I think we may call this twice on parts. Investigate.
- if (_procedure.name == null) {
- _procedure.function = buildFunction(libraryBuilder);
- _procedure.function.parent = _procedure;
- _procedure.function.fileOffset = charOpenParenOffset;
- _procedure.function.fileEndOffset = _procedure.fileEndOffset;
- _procedure.isAbstract = isAbstract;
- _procedure.isExternal = isExternal;
- _procedure.isConst = isConst;
- _procedure.isStatic = isStatic;
- _procedure.name = new Name(name, libraryBuilder.library);
- }
+ _procedure.function = buildFunction(libraryBuilder);
+ _procedure.function.parent = _procedure;
+ _procedure.function.fileOffset = charOpenParenOffset;
+ _procedure.function.fileEndOffset = _procedure.fileEndOffset;
+ _procedure.isAbstract = isAbstract;
+ _procedure.isExternal = isExternal;
+ _procedure.isConst = isConst;
+ _procedure.isStatic = isStatic;
_procedure.isRedirectingFactoryConstructor = true;
if (redirectionTarget.typeArguments != null) {
typeArguments = new List<DartType>.filled(
@@ -761,6 +763,7 @@
typeArguments[i] = redirectionTarget.typeArguments[i].build(library);
}
}
+ updatePrivateMemberName(_procedure, libraryBuilder);
return _procedure;
}
@@ -863,3 +866,28 @@
return 1;
}
}
+
+class ProcedureNameScheme {
+ final bool isExtensionMember;
+ final bool isStatic;
+ final String extensionName;
+ final Reference libraryReference;
+
+ ProcedureNameScheme(
+ {this.isExtensionMember,
+ this.isStatic,
+ this.extensionName,
+ this.libraryReference})
+ : assert(isExtensionMember != null),
+ assert(isStatic != null),
+ assert(!isExtensionMember || extensionName != null),
+ assert(libraryReference != null);
+
+ Name getName(ProcedureKind kind, String name) {
+ assert(kind != null);
+ return new Name.byReference(
+ SourceProcedureBuilder.createProcedureName(
+ isExtensionMember, isStatic, kind, extensionName, name),
+ libraryReference);
+ }
+}
diff --git a/pkg/front_end/lib/src/fasta/kernel/constant_evaluator.dart b/pkg/front_end/lib/src/fasta/kernel/constant_evaluator.dart
index daf190f..bd6b554 100644
--- a/pkg/front_end/lib/src/fasta/kernel/constant_evaluator.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/constant_evaluator.dart
@@ -3607,8 +3607,11 @@
@override
ExecutionStatus visitVariableDeclaration(VariableDeclaration node) {
- Constant value = evaluate(node.initializer);
- if (value is AbortConstant) return new AbortStatus(value);
+ Constant value;
+ if (node.initializer != null) {
+ value = evaluate(node.initializer);
+ if (value is AbortConstant) return new AbortStatus(value);
+ }
exprEvaluator.env.addVariableValue(node, value);
return const ProceedStatus();
}
diff --git a/pkg/front_end/lib/src/fasta/source/outline_builder.dart b/pkg/front_end/lib/src/fasta/source/outline_builder.dart
index da66b2a..96450ad 100644
--- a/pkg/front_end/lib/src/fasta/source/outline_builder.dart
+++ b/pkg/front_end/lib/src/fasta/source/outline_builder.dart
@@ -859,8 +859,8 @@
endToken.charOffset,
nativeMethodName,
asyncModifier,
- isTopLevel: true,
- isExtensionInstanceMember: false);
+ isInstanceMember: false,
+ isExtensionMember: false);
nativeMethodName = null;
}
@@ -1211,6 +1211,7 @@
}
final int startCharOffset =
metadata == null ? beginToken.charOffset : metadata.first.charOffset;
+ bool isExtensionMember = methodKind == _MethodKind.extensionMethod;
libraryBuilder.addProcedure(
metadata,
modifiers,
@@ -1225,9 +1226,8 @@
endToken.charOffset,
nativeMethodName,
asyncModifier,
- isTopLevel: false,
- isExtensionInstanceMember:
- methodKind == _MethodKind.extensionMethod && !isStatic);
+ isInstanceMember: !isStatic,
+ isExtensionMember: isExtensionMember);
}
nativeMethodName = null;
inConstructor = false;
diff --git a/pkg/front_end/lib/src/fasta/source/source_library_builder.dart b/pkg/front_end/lib/src/fasta/source/source_library_builder.dart
index 097bde3..94ed0ca 100644
--- a/pkg/front_end/lib/src/fasta/source/source_library_builder.dart
+++ b/pkg/front_end/lib/src/fasta/source/source_library_builder.dart
@@ -2152,17 +2152,17 @@
hasInitializer: hasInitializer,
isFinal: (modifiers & finalMask) != 0,
isStatic: isTopLevel || (modifiers & staticMask) != 0);
- final bool isInstanceMember = currentTypeParameterScopeBuilder.kind ==
- TypeParameterScopeKind.classDeclaration &&
+ final bool isInstanceMember = currentTypeParameterScopeBuilder.kind !=
+ TypeParameterScopeKind.library &&
(modifiers & staticMask) == 0;
String className;
if (isInstanceMember) {
className = currentTypeParameterScopeBuilder.name;
}
- final bool isExtension = currentTypeParameterScopeBuilder.kind ==
+ final bool isExtensionMember = currentTypeParameterScopeBuilder.kind ==
TypeParameterScopeKind.extensionDeclaration;
String extensionName;
- if (isExtension) {
+ if (isExtensionMember) {
extensionName = currentTypeParameterScopeBuilder.name;
}
@@ -2172,56 +2172,50 @@
Reference lateIsSetSetterReference;
Reference lateGetterReference;
Reference lateSetterReference;
+
+ FieldNameScheme fieldNameScheme = new FieldNameScheme(
+ isInstanceMember: isInstanceMember,
+ className: className,
+ isExtensionMember: isExtensionMember,
+ extensionName: extensionName,
+ libraryReference: referencesFrom?.reference ?? library.reference);
if (referencesFrom != null) {
- String nameToLookup = SourceFieldBuilder.createFieldName(
- FieldNameType.Field, name,
- isInstanceMember: isInstanceMember,
- className: className,
- isExtensionMethod: isExtension,
- extensionName: extensionName,
- isSynthesized: fieldIsLateWithLowering);
IndexedContainer indexedContainer =
_currentClassReferencesFromIndexed ?? referencesFromIndexed;
- Name nameToLookupName = new Name(nameToLookup, indexedContainer.library);
+ Name nameToLookupName = fieldNameScheme.getName(FieldNameType.Field, name,
+ isSynthesized: fieldIsLateWithLowering);
fieldGetterReference =
indexedContainer.lookupGetterReference(nameToLookupName);
fieldSetterReference =
indexedContainer.lookupSetterReference(nameToLookupName);
if (fieldIsLateWithLowering) {
- String lateIsSetName = SourceFieldBuilder.createFieldName(
+ Name lateIsSetNameName = fieldNameScheme.getName(
FieldNameType.IsSetField, name,
- isInstanceMember: isInstanceMember,
- className: className,
- isExtensionMethod: isExtension,
- extensionName: extensionName,
isSynthesized: fieldIsLateWithLowering);
- Name lateIsSetNameName =
- new Name(lateIsSetName, indexedContainer.library);
lateIsSetGetterReference =
indexedContainer.lookupGetterReference(lateIsSetNameName);
lateIsSetSetterReference =
indexedContainer.lookupSetterReference(lateIsSetNameName);
- lateGetterReference = indexedContainer.lookupGetterReference(new Name(
- SourceFieldBuilder.createFieldName(FieldNameType.Getter, name,
- isInstanceMember: isInstanceMember,
- className: className,
- isExtensionMethod: isExtension,
- extensionName: extensionName,
- isSynthesized: fieldIsLateWithLowering),
- indexedContainer.library));
- lateSetterReference = indexedContainer.lookupSetterReference(new Name(
- SourceFieldBuilder.createFieldName(FieldNameType.Setter, name,
- isInstanceMember: isInstanceMember,
- className: className,
- isExtensionMethod: isExtension,
- extensionName: extensionName,
- isSynthesized: fieldIsLateWithLowering),
- indexedContainer.library));
+ lateGetterReference = indexedContainer.lookupGetterReference(
+ fieldNameScheme.getName(FieldNameType.Getter, name,
+ isSynthesized: fieldIsLateWithLowering));
+ lateSetterReference = indexedContainer.lookupSetterReference(
+ fieldNameScheme.getName(FieldNameType.Setter, name,
+ isSynthesized: fieldIsLateWithLowering));
}
}
- SourceFieldBuilder fieldBuilder = new SourceFieldBuilder(metadata, type,
- name, modifiers, isTopLevel, this, charOffset, charEndOffset,
+ SourceFieldBuilder fieldBuilder = new SourceFieldBuilder(
+ metadata,
+ type,
+ name,
+ modifiers,
+ isTopLevel,
+ this,
+ charOffset,
+ charEndOffset,
+ fieldNameScheme,
+ isInstanceMember: isInstanceMember,
fieldGetterReference: fieldGetterReference,
fieldSetterReference: fieldSetterReference,
lateIsSetGetterReference: lateIsSetGetterReference,
@@ -2312,10 +2306,20 @@
int charEndOffset,
String nativeMethodName,
AsyncMarker asyncModifier,
- {bool isTopLevel,
- bool isExtensionInstanceMember}) {
- assert(isTopLevel != null);
- assert(isExtensionInstanceMember != null);
+ {bool isInstanceMember,
+ bool isExtensionMember}) {
+ assert(isInstanceMember != null);
+ assert(isExtensionMember != null);
+ assert(!isExtensionMember ||
+ currentTypeParameterScopeBuilder.kind ==
+ TypeParameterScopeKind.extensionDeclaration);
+ String extensionName =
+ isExtensionMember ? currentTypeParameterScopeBuilder.name : null;
+ ProcedureNameScheme procedureNameScheme = new ProcedureNameScheme(
+ isExtensionMember: isExtensionMember,
+ extensionName: extensionName,
+ isStatic: !isInstanceMember,
+ libraryReference: referencesFrom?.reference ?? library.reference);
if (returnType == null) {
if (kind == ProcedureKind.Operator &&
@@ -2328,52 +2332,28 @@
Reference procedureReference;
Reference tearOffReference;
if (referencesFrom != null) {
+ Name nameToLookup = procedureNameScheme.getName(kind, name);
if (_currentClassReferencesFromIndexed != null) {
if (kind == ProcedureKind.Setter) {
- procedureReference =
- _currentClassReferencesFromIndexed.lookupSetterReference(
- new Name(name, _currentClassReferencesFromIndexed.library));
+ procedureReference = _currentClassReferencesFromIndexed
+ .lookupSetterReference(nameToLookup);
} else {
- procedureReference =
- _currentClassReferencesFromIndexed.lookupGetterReference(
- new Name(name, _currentClassReferencesFromIndexed.library));
+ procedureReference = _currentClassReferencesFromIndexed
+ .lookupGetterReference(nameToLookup);
}
} else {
- if (currentTypeParameterScopeBuilder.kind ==
- TypeParameterScopeKind.extensionDeclaration) {
- bool extensionIsStatic = (modifiers & staticMask) != 0;
- String nameToLookup = SourceProcedureBuilder.createProcedureName(
- true,
- extensionIsStatic,
- kind,
- currentTypeParameterScopeBuilder.name,
- name);
- if (extensionIsStatic && kind == ProcedureKind.Setter) {
- procedureReference = referencesFromIndexed.lookupSetterReference(
- new Name(nameToLookup, referencesFromIndexed.library));
- } else {
- procedureReference = referencesFromIndexed.lookupGetterReference(
- new Name(nameToLookup, referencesFromIndexed.library));
- }
- if (kind == ProcedureKind.Method) {
- String tearOffNameToLookup =
- SourceProcedureBuilder.createProcedureName(
- true,
- false,
- ProcedureKind.Getter,
- currentTypeParameterScopeBuilder.name,
- name);
- tearOffReference = referencesFromIndexed.lookupGetterReference(
- new Name(tearOffNameToLookup, referencesFromIndexed.library));
- }
+ if (kind == ProcedureKind.Setter &&
+ // Extension instance setters are encoded as methods.
+ !(isExtensionMember && isInstanceMember)) {
+ procedureReference =
+ referencesFromIndexed.lookupSetterReference(nameToLookup);
} else {
- if (kind == ProcedureKind.Setter) {
- procedureReference = referencesFromIndexed.lookupSetterReference(
- new Name(name, referencesFromIndexed.library));
- } else {
- procedureReference = referencesFromIndexed.lookupGetterReference(
- new Name(name, referencesFromIndexed.library));
- }
+ procedureReference =
+ referencesFromIndexed.lookupGetterReference(nameToLookup);
+ }
+ if (isExtensionMember && kind == ProcedureKind.Method) {
+ tearOffReference = referencesFromIndexed.lookupGetterReference(
+ procedureNameScheme.getName(ProcedureKind.Getter, name));
}
}
}
@@ -2393,8 +2373,10 @@
procedureReference,
tearOffReference,
asyncModifier,
- isExtensionInstanceMember,
- nativeMethodName);
+ procedureNameScheme,
+ isExtensionMember: isExtensionMember,
+ isInstanceMember: isInstanceMember,
+ nativeMethodName: nativeMethodName);
checkTypeVariables(typeVariables, procedureBuilder);
addBuilder(name, procedureBuilder, charOffset,
getterReference: procedureReference);
@@ -2434,6 +2416,16 @@
procedureName = name;
}
+ ProcedureNameScheme procedureNameScheme = new ProcedureNameScheme(
+ isExtensionMember: false,
+ extensionName: null,
+ isStatic: true,
+ libraryReference: referencesFrom != null
+ ? (_currentClassReferencesFromIndexed ?? referencesFromIndexed)
+ .library
+ .reference
+ : library.reference);
+
Reference reference = _currentClassReferencesFromIndexed
?.lookupConstructor(
new Name(procedureName, _currentClassReferencesFromIndexed.library))
@@ -2457,6 +2449,7 @@
charOpenParenOffset,
charEndOffset,
reference,
+ procedureNameScheme,
nativeMethodName,
redirectionTarget);
} else {
@@ -2479,8 +2472,10 @@
reference,
null,
asyncModifier,
- /* isExtensionInstanceMember = */ false,
- nativeMethodName);
+ procedureNameScheme,
+ isExtensionMember: false,
+ isInstanceMember: false,
+ nativeMethodName: nativeMethodName);
}
TypeParameterScopeBuilder savedDeclaration =
diff --git a/pkg/front_end/lib/src/fasta/source/source_loader.dart b/pkg/front_end/lib/src/fasta/source/source_loader.dart
index 29a3626..675dee4 100644
--- a/pkg/front_end/lib/src/fasta/source/source_loader.dart
+++ b/pkg/front_end/lib/src/fasta/source/source_loader.dart
@@ -494,15 +494,15 @@
// TODO(johnniwinther,jensj): Handle expression in extensions?
Future<Expression> buildExpression(
- SourceLibraryBuilder library,
+ SourceLibraryBuilder libraryBuilder,
String enclosingClass,
bool isClassInstanceMember,
FunctionNode parameters) async {
- Token token = await tokenize(library, suppressLexicalErrors: false);
+ Token token = await tokenize(libraryBuilder, suppressLexicalErrors: false);
if (token == null) return null;
- DietListener dietListener = createDietListener(library);
+ DietListener dietListener = createDietListener(libraryBuilder);
- Builder parent = library;
+ Builder parent = libraryBuilder;
if (enclosingClass != null) {
Builder cls = dietListener.memberScope.lookup(enclosingClass, -1, null);
if (cls is ClassBuilder) {
@@ -522,7 +522,7 @@
null,
null,
ProcedureKind.Method,
- library,
+ libraryBuilder,
0,
0,
-1,
@@ -530,7 +530,12 @@
null,
null,
AsyncMarker.Sync,
- /* isExtensionInstanceMember = */ false)
+ new ProcedureNameScheme(
+ isExtensionMember: false,
+ isStatic: true,
+ libraryReference: libraryBuilder.library.reference),
+ isInstanceMember: false,
+ isExtensionMember: false)
..parent = parent;
BodyBuilder listener = dietListener.createListener(
builder, dietListener.memberScope,
diff --git a/pkg/front_end/test/member_covariance_test.dart b/pkg/front_end/test/member_covariance_test.dart
index 62d44a3..fee063f 100644
--- a/pkg/front_end/test/member_covariance_test.dart
+++ b/pkg/front_end/test/member_covariance_test.dart
@@ -91,8 +91,8 @@
'types:1)',
covariance.toString());
- Procedure noParameterProcedure =
- new Procedure(null, ProcedureKind.Method, new FunctionNode(null));
+ Procedure noParameterProcedure = new Procedure(
+ new Name('foo'), ProcedureKind.Method, new FunctionNode(null));
Covariance noParameterProcedureCovariance =
new Covariance.fromMember(noParameterProcedure, forSetter: false);
Expect.isTrue(noParameterProcedureCovariance.isEmpty);
@@ -103,7 +103,7 @@
Expect.isTrue(noParameterProcedureCovariance.isEmpty);
Procedure oneParameterProcedure = new Procedure(
- null,
+ new Name('foo'),
ProcedureKind.Method,
new FunctionNode(null,
positionalParameters: [new VariableDeclaration(null)]));
@@ -119,7 +119,7 @@
oneParameterProcedureCovariance);
Procedure positionalParametersProcedure = new Procedure(
- null,
+ new Name('foo'),
ProcedureKind.Method,
new FunctionNode(null, positionalParameters: [
new VariableDeclaration(null),
@@ -148,7 +148,7 @@
positionalParametersProcedureCovariance);
Procedure namedParametersProcedure = new Procedure(
- null,
+ new Name('foo'),
ProcedureKind.Method,
new FunctionNode(null, namedParameters: [
new VariableDeclaration('a'),
@@ -177,7 +177,7 @@
namedParametersProcedureCovariance);
Procedure typeParametersProcedure = new Procedure(
- null,
+ new Name('foo'),
ProcedureKind.Method,
new FunctionNode(null, typeParameters: [
new TypeParameter(null),
diff --git a/pkg/front_end/testcases/const_functions/const_functions_variable_declarations.dart b/pkg/front_end/testcases/const_functions/const_functions_variable_declarations.dart
index 7c1c573..20071a4 100644
--- a/pkg/front_end/testcases/const_functions/const_functions_variable_declarations.dart
+++ b/pkg/front_end/testcases/const_functions/const_functions_variable_declarations.dart
@@ -39,6 +39,29 @@
return constant;
}
+const var6 = function6();
+int function6() {
+ var a;
+ a = 2;
+ return a;
+}
+
+const var7 = function7();
+int function7() {
+ var a;
+ var b;
+ a = 2;
+ return a;
+}
+
+const var8 = function8();
+int function8() {
+ var a;
+ int? b;
+ a = 2;
+ return a;
+}
+
void main() {
Expect.equals(var1, 4);
Expect.equals(var1_1, 5);
@@ -46,4 +69,7 @@
Expect.equals(var3, 6);
Expect.equals(var4, 2);
Expect.equals(var5, -2);
+ Expect.equals(var6, 2);
+ Expect.equals(var7, 2);
+ Expect.equals(var8, 2);
}
diff --git a/pkg/front_end/testcases/const_functions/const_functions_variable_declarations.dart.strong.expect b/pkg/front_end/testcases/const_functions/const_functions_variable_declarations.dart.strong.expect
index 425972a..e424e71 100644
--- a/pkg/front_end/testcases/const_functions/const_functions_variable_declarations.dart.strong.expect
+++ b/pkg/front_end/testcases/const_functions/const_functions_variable_declarations.dart.strong.expect
@@ -11,6 +11,9 @@
static const field core::int var3 = #C4;
static const field core::int var4 = #C5;
static const field core::int var5 = #C6;
+static const field core::int var6 = #C5;
+static const field core::int var7 = #C5;
+static const field core::int var8 = #C5;
static method function1(core::int a, core::int b) → core::int {
core::int x = 1.{core::num::+}(a).{core::num::+}(b);
return x;
@@ -32,6 +35,23 @@
static method function5() → core::int {
return #C6;
}
+static method function6() → core::int {
+ dynamic a;
+ a = 2;
+ return a as{TypeError,ForDynamic,ForNonNullableByDefault} core::int;
+}
+static method function7() → core::int {
+ dynamic a;
+ dynamic b;
+ a = 2;
+ return a as{TypeError,ForDynamic,ForNonNullableByDefault} core::int;
+}
+static method function8() → core::int {
+ dynamic a;
+ core::int? b;
+ a = 2;
+ return a as{TypeError,ForDynamic,ForNonNullableByDefault} core::int;
+}
static method main() → void {
exp::Expect::equals(#C1, 4);
exp::Expect::equals(#C2, 5);
@@ -39,6 +59,9 @@
exp::Expect::equals(#C4, 6);
exp::Expect::equals(#C5, 2);
exp::Expect::equals(#C6, 2.{core::int::unary-}());
+ exp::Expect::equals(#C5, 2);
+ exp::Expect::equals(#C5, 2);
+ exp::Expect::equals(#C5, 2);
}
constants {
diff --git a/pkg/front_end/testcases/const_functions/const_functions_variable_declarations.dart.strong.transformed.expect b/pkg/front_end/testcases/const_functions/const_functions_variable_declarations.dart.strong.transformed.expect
index 9ea2e2a..611523b 100644
--- a/pkg/front_end/testcases/const_functions/const_functions_variable_declarations.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/const_functions/const_functions_variable_declarations.dart.strong.transformed.expect
@@ -11,6 +11,9 @@
static const field core::int var3 = #C4;
static const field core::int var4 = #C5;
static const field core::int var5 = #C6;
+static const field core::int var6 = #C5;
+static const field core::int var7 = #C5;
+static const field core::int var8 = #C5;
static method function1(core::int a, core::int b) → core::int {
core::int x = 1.{core::num::+}(a).{core::num::+}(b);
return x;
@@ -32,6 +35,23 @@
static method function5() → core::int {
return #C6;
}
+static method function6() → core::int {
+ dynamic a;
+ a = 2;
+ return a as{TypeError,ForDynamic,ForNonNullableByDefault} core::int;
+}
+static method function7() → core::int {
+ dynamic a;
+ dynamic b;
+ a = 2;
+ return a as{TypeError,ForDynamic,ForNonNullableByDefault} core::int;
+}
+static method function8() → core::int {
+ dynamic a;
+ core::int? b;
+ a = 2;
+ return a as{TypeError,ForDynamic,ForNonNullableByDefault} core::int;
+}
static method main() → void {
exp::Expect::equals(#C1, 4);
exp::Expect::equals(#C2, 5);
@@ -39,6 +59,9 @@
exp::Expect::equals(#C4, 6);
exp::Expect::equals(#C5, 2);
exp::Expect::equals(#C6, 2.{core::int::unary-}());
+ exp::Expect::equals(#C5, 2);
+ exp::Expect::equals(#C5, 2);
+ exp::Expect::equals(#C5, 2);
}
constants {
@@ -51,5 +74,5 @@
}
Extra constant evaluation status:
-Evaluated: MethodInvocation @ org-dartlang-testcase:///const_functions_variable_declarations.dart:48:23 -> IntConstant(-2)
-Extra constant evaluation: evaluated: 21, effectively constant: 1
+Evaluated: MethodInvocation @ org-dartlang-testcase:///const_functions_variable_declarations.dart:71:23 -> IntConstant(-2)
+Extra constant evaluation: evaluated: 33, effectively constant: 1
diff --git a/pkg/front_end/testcases/const_functions/const_functions_variable_declarations.dart.textual_outline.expect b/pkg/front_end/testcases/const_functions/const_functions_variable_declarations.dart.textual_outline.expect
index 1b140e3..1c817fd 100644
--- a/pkg/front_end/testcases/const_functions/const_functions_variable_declarations.dart.textual_outline.expect
+++ b/pkg/front_end/testcases/const_functions/const_functions_variable_declarations.dart.textual_outline.expect
@@ -11,4 +11,10 @@
int function4() {}
const var5 = function5();
int function5() {}
+const var6 = function6();
+int function6() {}
+const var7 = function7();
+int function7() {}
+const var8 = function8();
+int function8() {}
void main() {}
diff --git a/pkg/front_end/testcases/const_functions/const_functions_variable_declarations.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/const_functions/const_functions_variable_declarations.dart.textual_outline_modelled.expect
index 7dcb573..2d98733 100644
--- a/pkg/front_end/testcases/const_functions/const_functions_variable_declarations.dart.textual_outline_modelled.expect
+++ b/pkg/front_end/testcases/const_functions/const_functions_variable_declarations.dart.textual_outline_modelled.expect
@@ -7,8 +7,14 @@
const var3 = function3();
const var4 = function4();
const var5 = function5();
+const var6 = function6();
+const var7 = function7();
+const var8 = function8();
int function1(int a, int b) {}
int function3() {}
int function4() {}
int function5() {}
+int function6() {}
+int function7() {}
+int function8() {}
void main() {}
diff --git a/pkg/front_end/testcases/const_functions/const_functions_variable_declarations.dart.weak.expect b/pkg/front_end/testcases/const_functions/const_functions_variable_declarations.dart.weak.expect
index 425972a..e424e71 100644
--- a/pkg/front_end/testcases/const_functions/const_functions_variable_declarations.dart.weak.expect
+++ b/pkg/front_end/testcases/const_functions/const_functions_variable_declarations.dart.weak.expect
@@ -11,6 +11,9 @@
static const field core::int var3 = #C4;
static const field core::int var4 = #C5;
static const field core::int var5 = #C6;
+static const field core::int var6 = #C5;
+static const field core::int var7 = #C5;
+static const field core::int var8 = #C5;
static method function1(core::int a, core::int b) → core::int {
core::int x = 1.{core::num::+}(a).{core::num::+}(b);
return x;
@@ -32,6 +35,23 @@
static method function5() → core::int {
return #C6;
}
+static method function6() → core::int {
+ dynamic a;
+ a = 2;
+ return a as{TypeError,ForDynamic,ForNonNullableByDefault} core::int;
+}
+static method function7() → core::int {
+ dynamic a;
+ dynamic b;
+ a = 2;
+ return a as{TypeError,ForDynamic,ForNonNullableByDefault} core::int;
+}
+static method function8() → core::int {
+ dynamic a;
+ core::int? b;
+ a = 2;
+ return a as{TypeError,ForDynamic,ForNonNullableByDefault} core::int;
+}
static method main() → void {
exp::Expect::equals(#C1, 4);
exp::Expect::equals(#C2, 5);
@@ -39,6 +59,9 @@
exp::Expect::equals(#C4, 6);
exp::Expect::equals(#C5, 2);
exp::Expect::equals(#C6, 2.{core::int::unary-}());
+ exp::Expect::equals(#C5, 2);
+ exp::Expect::equals(#C5, 2);
+ exp::Expect::equals(#C5, 2);
}
constants {
diff --git a/pkg/front_end/testcases/const_functions/const_functions_variable_declarations.dart.weak.outline.expect b/pkg/front_end/testcases/const_functions/const_functions_variable_declarations.dart.weak.outline.expect
index f119780..50fbc0f 100644
--- a/pkg/front_end/testcases/const_functions/const_functions_variable_declarations.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/const_functions/const_functions_variable_declarations.dart.weak.outline.expect
@@ -10,6 +10,9 @@
static const field core::int var3 = self::function3();
static const field core::int var4 = self::function4();
static const field core::int var5 = self::function5();
+static const field core::int var6 = self::function6();
+static const field core::int var7 = self::function7();
+static const field core::int var8 = self::function8();
static method function1(core::int a, core::int b) → core::int
;
static method function2() → core::String
@@ -20,5 +23,11 @@
;
static method function5() → core::int
;
+static method function6() → core::int
+ ;
+static method function7() → core::int
+ ;
+static method function8() → core::int
+ ;
static method main() → void
;
diff --git a/pkg/front_end/testcases/const_functions/const_functions_variable_declarations.dart.weak.transformed.expect b/pkg/front_end/testcases/const_functions/const_functions_variable_declarations.dart.weak.transformed.expect
index 9ea2e2a..611523b 100644
--- a/pkg/front_end/testcases/const_functions/const_functions_variable_declarations.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/const_functions/const_functions_variable_declarations.dart.weak.transformed.expect
@@ -11,6 +11,9 @@
static const field core::int var3 = #C4;
static const field core::int var4 = #C5;
static const field core::int var5 = #C6;
+static const field core::int var6 = #C5;
+static const field core::int var7 = #C5;
+static const field core::int var8 = #C5;
static method function1(core::int a, core::int b) → core::int {
core::int x = 1.{core::num::+}(a).{core::num::+}(b);
return x;
@@ -32,6 +35,23 @@
static method function5() → core::int {
return #C6;
}
+static method function6() → core::int {
+ dynamic a;
+ a = 2;
+ return a as{TypeError,ForDynamic,ForNonNullableByDefault} core::int;
+}
+static method function7() → core::int {
+ dynamic a;
+ dynamic b;
+ a = 2;
+ return a as{TypeError,ForDynamic,ForNonNullableByDefault} core::int;
+}
+static method function8() → core::int {
+ dynamic a;
+ core::int? b;
+ a = 2;
+ return a as{TypeError,ForDynamic,ForNonNullableByDefault} core::int;
+}
static method main() → void {
exp::Expect::equals(#C1, 4);
exp::Expect::equals(#C2, 5);
@@ -39,6 +59,9 @@
exp::Expect::equals(#C4, 6);
exp::Expect::equals(#C5, 2);
exp::Expect::equals(#C6, 2.{core::int::unary-}());
+ exp::Expect::equals(#C5, 2);
+ exp::Expect::equals(#C5, 2);
+ exp::Expect::equals(#C5, 2);
}
constants {
@@ -51,5 +74,5 @@
}
Extra constant evaluation status:
-Evaluated: MethodInvocation @ org-dartlang-testcase:///const_functions_variable_declarations.dart:48:23 -> IntConstant(-2)
-Extra constant evaluation: evaluated: 21, effectively constant: 1
+Evaluated: MethodInvocation @ org-dartlang-testcase:///const_functions_variable_declarations.dart:71:23 -> IntConstant(-2)
+Extra constant evaluation: evaluated: 33, effectively constant: 1
diff --git a/pkg/front_end/testcases/general/private_members.dart b/pkg/front_end/testcases/general/private_members.dart
new file mode 100644
index 0000000..26b5c7d
--- /dev/null
+++ b/pkg/front_end/testcases/general/private_members.dart
@@ -0,0 +1,23 @@
+// 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.
+
+part 'private_members_part.dart';
+
+test(_AbstractClass c) {
+ c._privateAbstractField = c._privateAbstractField;
+}
+
+main() {
+ _Class c = new _Class._privateConstructor();
+ c = new _Class._privateRedirectingFactory();
+ c._privateMethod();
+ c._privateSetter = c._privateGetter;
+ c._privateField = c._privateField;
+ c._privateFinalField;
+ 0._privateMethod();
+ (0._privateMethod)();
+ 0._privateSetter = 0._privateGetter;
+ _Extension._privateField = _Extension._privateField;
+ _Extension._privateFinalField;
+}
diff --git a/pkg/front_end/testcases/general/private_members.dart.textual_outline.expect b/pkg/front_end/testcases/general/private_members.dart.textual_outline.expect
new file mode 100644
index 0000000..959cb66
--- /dev/null
+++ b/pkg/front_end/testcases/general/private_members.dart.textual_outline.expect
@@ -0,0 +1,4 @@
+part 'private_members_part.dart';
+
+test(_AbstractClass c) {}
+main() {}
diff --git a/pkg/front_end/testcases/general/private_members.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/general/private_members.dart.textual_outline_modelled.expect
new file mode 100644
index 0000000..8aeb6ed
--- /dev/null
+++ b/pkg/front_end/testcases/general/private_members.dart.textual_outline_modelled.expect
@@ -0,0 +1,4 @@
+part 'private_members_part.dart';
+
+main() {}
+test(_AbstractClass c) {}
diff --git a/pkg/front_end/testcases/general/private_members.dart.weak.expect b/pkg/front_end/testcases/general/private_members.dart.weak.expect
new file mode 100644
index 0000000..ce24406
--- /dev/null
+++ b/pkg/front_end/testcases/general/private_members.dart.weak.expect
@@ -0,0 +1,58 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+part private_members_part.dart;
+abstract class _AbstractClass extends core::Object { // from org-dartlang-testcase:///private_members_part.dart
+ synthetic constructor •() → self::_AbstractClass
+ : super core::Object::•()
+ ;
+ abstract get _privateAbstractField() → core::int;
+ abstract set _privateAbstractField(core::int #externalFieldValue) → void;
+}
+class _Class extends core::Object { // from org-dartlang-testcase:///private_members_part.dart
+ field core::int _privateField = 1;
+ field core::int _privateFinalField = 1;
+ static final field dynamic _redirecting# = <dynamic>[self::_Class::_privateRedirectingFactory]/*isLegacy*/;
+ constructor _privateConstructor() → self::_Class
+ : super core::Object::•()
+ ;
+ static factory _privateRedirectingFactory() → self::_Class
+ let dynamic #redirecting_factory = self::_Class::_privateConstructor in invalid-expression;
+ method _privateMethod() → void {}
+ get _privateGetter() → core::int
+ return 42;
+ set _privateSetter(core::int value) → void {}
+}
+extension _Extension on core::int { // from org-dartlang-testcase:///private_members_part.dart
+ method _privateMethod = self::_Extension|_privateMethod;
+ tearoff _privateMethod = self::_Extension|get#_privateMethod;
+ get _privateGetter = self::_Extension|get#_privateGetter;
+ static field _privateField = self::_Extension|_privateField;
+ static field _privateFinalField = self::_Extension|_privateFinalField;
+ set _privateSetter = self::_Extension|set#_privateSetter;
+}
+static field core::int _Extension|_privateField = 1 /* from org-dartlang-testcase:///private_members_part.dart */;
+static field core::int _Extension|_privateFinalField = 1 /* from org-dartlang-testcase:///private_members_part.dart */;
+static method test(self::_AbstractClass c) → dynamic {
+ c.{self::_AbstractClass::_privateAbstractField} = c.{self::_AbstractClass::_privateAbstractField};
+}
+static method main() → dynamic {
+ self::_Class c = new self::_Class::_privateConstructor();
+ c = new self::_Class::_privateConstructor();
+ c.{self::_Class::_privateMethod}();
+ c.{self::_Class::_privateSetter} = c.{self::_Class::_privateGetter};
+ c.{self::_Class::_privateField} = c.{self::_Class::_privateField};
+ c.{self::_Class::_privateFinalField};
+ self::_Extension|_privateMethod(0);
+ self::_Extension|get#_privateMethod(0).call();
+ self::_Extension|set#_privateSetter(0, self::_Extension|get#_privateGetter(0));
+ self::_Extension|_privateField = self::_Extension|_privateField;
+ self::_Extension|_privateFinalField;
+}
+static method /* from org-dartlang-testcase:///private_members_part.dart */ _Extension|_privateMethod(lowered final core::int #this) → void {}
+static method /* from org-dartlang-testcase:///private_members_part.dart */ _Extension|get#_privateMethod(lowered final core::int #this) → () → void
+ return () → void => self::_Extension|_privateMethod(#this);
+static method /* from org-dartlang-testcase:///private_members_part.dart */ _Extension|get#_privateGetter(lowered final core::int #this) → core::int
+ return 42;
+static method /* from org-dartlang-testcase:///private_members_part.dart */ _Extension|set#_privateSetter(lowered final core::int #this, core::int value) → void {}
diff --git a/pkg/front_end/testcases/general/private_members.dart.weak.outline.expect b/pkg/front_end/testcases/general/private_members.dart.weak.outline.expect
new file mode 100644
index 0000000..f9f6839
--- /dev/null
+++ b/pkg/front_end/testcases/general/private_members.dart.weak.outline.expect
@@ -0,0 +1,48 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+part private_members_part.dart;
+abstract class _AbstractClass extends core::Object { // from org-dartlang-testcase:///private_members_part.dart
+ synthetic constructor •() → self::_AbstractClass
+ ;
+ abstract get _privateAbstractField() → core::int;
+ abstract set _privateAbstractField(core::int #externalFieldValue) → void;
+}
+class _Class extends core::Object { // from org-dartlang-testcase:///private_members_part.dart
+ field core::int _privateField;
+ field core::int _privateFinalField;
+ static final field dynamic _redirecting# = <dynamic>[self::_Class::_privateRedirectingFactory]/*isLegacy*/;
+ constructor _privateConstructor() → self::_Class
+ ;
+ static factory _privateRedirectingFactory() → self::_Class
+ let dynamic #redirecting_factory = self::_Class::_privateConstructor in invalid-expression;
+ method _privateMethod() → void
+ ;
+ get _privateGetter() → core::int
+ ;
+ set _privateSetter(core::int value) → void
+ ;
+}
+extension _Extension on core::int { // from org-dartlang-testcase:///private_members_part.dart
+ method _privateMethod = self::_Extension|_privateMethod;
+ tearoff _privateMethod = self::_Extension|get#_privateMethod;
+ get _privateGetter = self::_Extension|get#_privateGetter;
+ static field _privateField = self::_Extension|_privateField;
+ static field _privateFinalField = self::_Extension|_privateFinalField;
+ set _privateSetter = self::_Extension|set#_privateSetter;
+}
+static field core::int _Extension|_privateField /* from org-dartlang-testcase:///private_members_part.dart */;
+static field core::int _Extension|_privateFinalField /* from org-dartlang-testcase:///private_members_part.dart */;
+static method test(self::_AbstractClass c) → dynamic
+ ;
+static method main() → dynamic
+ ;
+static method /* from org-dartlang-testcase:///private_members_part.dart */ _Extension|_privateMethod(lowered final core::int #this) → void
+ ;
+static method /* from org-dartlang-testcase:///private_members_part.dart */ _Extension|get#_privateMethod(lowered final core::int #this) → () → void
+ return () → void => self::_Extension|_privateMethod(#this);
+static method /* from org-dartlang-testcase:///private_members_part.dart */ _Extension|get#_privateGetter(lowered final core::int #this) → core::int
+ ;
+static method /* from org-dartlang-testcase:///private_members_part.dart */ _Extension|set#_privateSetter(lowered final core::int #this, core::int value) → void
+ ;
diff --git a/pkg/front_end/testcases/general/private_members.dart.weak.transformed.expect b/pkg/front_end/testcases/general/private_members.dart.weak.transformed.expect
new file mode 100644
index 0000000..920e92f
--- /dev/null
+++ b/pkg/front_end/testcases/general/private_members.dart.weak.transformed.expect
@@ -0,0 +1,58 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+part private_members_part.dart;
+abstract class _AbstractClass extends core::Object { // from org-dartlang-testcase:///private_members_part.dart
+ synthetic constructor •() → self::_AbstractClass
+ : super core::Object::•()
+ ;
+ abstract get _privateAbstractField() → core::int;
+ abstract set _privateAbstractField(core::int #externalFieldValue) → void;
+}
+class _Class extends core::Object { // from org-dartlang-testcase:///private_members_part.dart
+ field core::int _privateField = 1;
+ field core::int _privateFinalField = 1;
+ static final field dynamic _redirecting# = <dynamic>[self::_Class::_privateRedirectingFactory]/*isLegacy*/;
+ constructor _privateConstructor() → self::_Class
+ : super core::Object::•()
+ ;
+ static factory _privateRedirectingFactory() → self::_Class
+ let Never #redirecting_factory = self::_Class::_privateConstructor in invalid-expression;
+ method _privateMethod() → void {}
+ get _privateGetter() → core::int
+ return 42;
+ set _privateSetter(core::int value) → void {}
+}
+extension _Extension on core::int { // from org-dartlang-testcase:///private_members_part.dart
+ method _privateMethod = self::_Extension|_privateMethod;
+ tearoff _privateMethod = self::_Extension|get#_privateMethod;
+ get _privateGetter = self::_Extension|get#_privateGetter;
+ static field _privateField = self::_Extension|_privateField;
+ static field _privateFinalField = self::_Extension|_privateFinalField;
+ set _privateSetter = self::_Extension|set#_privateSetter;
+}
+static field core::int _Extension|_privateField = 1 /* from org-dartlang-testcase:///private_members_part.dart */;
+static field core::int _Extension|_privateFinalField = 1 /* from org-dartlang-testcase:///private_members_part.dart */;
+static method test(self::_AbstractClass c) → dynamic {
+ c.{self::_AbstractClass::_privateAbstractField} = c.{self::_AbstractClass::_privateAbstractField};
+}
+static method main() → dynamic {
+ self::_Class c = new self::_Class::_privateConstructor();
+ c = new self::_Class::_privateConstructor();
+ c.{self::_Class::_privateMethod}();
+ c.{self::_Class::_privateSetter} = c.{self::_Class::_privateGetter};
+ c.{self::_Class::_privateField} = c.{self::_Class::_privateField};
+ c.{self::_Class::_privateFinalField};
+ self::_Extension|_privateMethod(0);
+ self::_Extension|get#_privateMethod(0).call();
+ self::_Extension|set#_privateSetter(0, self::_Extension|get#_privateGetter(0));
+ self::_Extension|_privateField = self::_Extension|_privateField;
+ self::_Extension|_privateFinalField;
+}
+static method /* from org-dartlang-testcase:///private_members_part.dart */ _Extension|_privateMethod(lowered final core::int #this) → void {}
+static method /* from org-dartlang-testcase:///private_members_part.dart */ _Extension|get#_privateMethod(lowered final core::int #this) → () → void
+ return () → void => self::_Extension|_privateMethod(#this);
+static method /* from org-dartlang-testcase:///private_members_part.dart */ _Extension|get#_privateGetter(lowered final core::int #this) → core::int
+ return 42;
+static method /* from org-dartlang-testcase:///private_members_part.dart */ _Extension|set#_privateSetter(lowered final core::int #this, core::int value) → void {}
diff --git a/pkg/front_end/testcases/general/private_members_part.dart b/pkg/front_end/testcases/general/private_members_part.dart
new file mode 100644
index 0000000..0f172ed7
--- /dev/null
+++ b/pkg/front_end/testcases/general/private_members_part.dart
@@ -0,0 +1,37 @@
+// 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.
+
+part of 'private_members.dart';
+
+abstract class _AbstractClass {
+ abstract int _privateAbstractField;
+}
+
+class _Class {
+ _Class._privateConstructor();
+
+ factory _Class._privateRedirectingFactory() = _Class._privateConstructor;
+
+ void _privateMethod() {}
+
+ int get _privateGetter => 42;
+
+ void set _privateSetter(int value) {}
+
+ int _privateField = 1;
+
+ int _privateFinalField = 1;
+}
+
+extension _Extension on int {
+ void _privateMethod() {}
+
+ int get _privateGetter => 42;
+
+ void set _privateSetter(int value) {}
+
+ static int _privateField = 1;
+
+ static int _privateFinalField = 1;
+}
diff --git a/pkg/front_end/testcases/general/private_method_tearoff.dart b/pkg/front_end/testcases/general/private_method_tearoff.dart
index 2c953aa..4bf35bc 100644
--- a/pkg/front_end/testcases/general/private_method_tearoff.dart
+++ b/pkg/front_end/testcases/general/private_method_tearoff.dart
@@ -1,7 +1,9 @@
// Copyright (c) 2018, 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.
+
// @dart=2.9
+
import './private_method_tearoff_lib.dart';
// `Bar' contains a private method `_f'. The function `baz' is declared in the
diff --git a/pkg/front_end/testcases/late_lowering/private_members.dart b/pkg/front_end/testcases/late_lowering/private_members.dart
new file mode 100644
index 0000000..066ec0e
--- /dev/null
+++ b/pkg/front_end/testcases/late_lowering/private_members.dart
@@ -0,0 +1,17 @@
+// 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.
+
+part 'private_members_part.dart';
+
+main() {
+ _Class c = new _Class();
+ c._privateField1 = c._privateField1;
+ c._privateField2 = c._privateField2;
+ c._privateFinalField1;
+ c._privateFinalField2;
+ _Extension._privateField1 = _Extension._privateField1;
+ _Extension._privateField2 = _Extension._privateField2;
+ _Extension._privateFinalField1;
+ _Extension._privateFinalField2;
+}
diff --git a/pkg/front_end/testcases/late_lowering/private_members.dart.strong.expect b/pkg/front_end/testcases/late_lowering/private_members.dart.strong.expect
new file mode 100644
index 0000000..af828fe
--- /dev/null
+++ b/pkg/front_end/testcases/late_lowering/private_members.dart.strong.expect
@@ -0,0 +1,109 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+part private_members_part.dart;
+class _Class extends core::Object { // from org-dartlang-testcase:///private_members_part.dart
+ field core::int? _#_Class#_privateField1 = null;
+ field core::int? _#_Class#_privateField2 = null;
+ field core::bool _#_Class#_privateField2#isSet = false;
+ field core::int? _#_Class#_privateFinalField1 = null;
+ field core::int? _#_Class#_privateFinalField2 = null;
+ field core::bool _#_Class#_privateFinalField2#isSet = false;
+ synthetic constructor •() → self::_Class
+ : super core::Object::•()
+ ;
+ get _privateField1() → core::int
+ return let final core::int? #t1 = this.{self::_Class::_#_Class#_privateField1} in #t1.==(null) ?{core::int} this.{self::_Class::_#_Class#_privateField1} = 1 : #t1{core::int};
+ set _privateField1(core::int #t2) → void
+ this.{self::_Class::_#_Class#_privateField1} = #t2;
+ get _privateField2() → core::int? {
+ if(!this.{self::_Class::_#_Class#_privateField2#isSet}) {
+ this.{self::_Class::_#_Class#_privateField2} = 1;
+ this.{self::_Class::_#_Class#_privateField2#isSet} = true;
+ }
+ return this.{self::_Class::_#_Class#_privateField2};
+ }
+ set _privateField2(core::int? #t3) → void {
+ this.{self::_Class::_#_Class#_privateField2#isSet} = true;
+ this.{self::_Class::_#_Class#_privateField2} = #t3;
+ }
+ get _privateFinalField1() → core::int
+ return let final core::int? #t4 = this.{self::_Class::_#_Class#_privateFinalField1} in #t4.==(null) ?{core::int} this.{self::_Class::_#_Class#_privateFinalField1} = 1 : #t4{core::int};
+ set _privateFinalField1(core::int #t5) → void
+ this.{self::_Class::_#_Class#_privateFinalField1} = #t5;
+ get _privateFinalField2() → core::int? {
+ if(!this.{self::_Class::_#_Class#_privateFinalField2#isSet}) {
+ this.{self::_Class::_#_Class#_privateFinalField2} = 1;
+ this.{self::_Class::_#_Class#_privateFinalField2#isSet} = true;
+ }
+ return this.{self::_Class::_#_Class#_privateFinalField2};
+ }
+ set _privateFinalField2(core::int? #t6) → void {
+ this.{self::_Class::_#_Class#_privateFinalField2#isSet} = true;
+ this.{self::_Class::_#_Class#_privateFinalField2} = #t6;
+ }
+}
+extension _Extension on core::int { // from org-dartlang-testcase:///private_members_part.dart
+ static field _privateField1 = self::_#_Extension|_privateField1;
+ static get _privateField1 = get self::_Extension|_privateField1;
+ static set _privateField1 = set self::_Extension|_privateField1;
+ static field _privateField2 = self::_#_Extension|_privateField2;
+ static field _privateField2 = self::_#_Extension|_privateField2#isSet;
+ static get _privateField2 = get self::_Extension|_privateField2;
+ static set _privateField2 = set self::_Extension|_privateField2;
+ static field _privateFinalField1 = self::_#_Extension|_privateFinalField1;
+ static get _privateFinalField1 = get self::_Extension|_privateFinalField1;
+ static set _privateFinalField1 = set self::_Extension|_privateFinalField1;
+ static field _privateFinalField2 = self::_#_Extension|_privateFinalField2;
+ static field _privateFinalField2 = self::_#_Extension|_privateFinalField2#isSet;
+ static get _privateFinalField2 = get self::_Extension|_privateFinalField2;
+ static set _privateFinalField2 = set self::_Extension|_privateFinalField2;
+}
+static field core::int? _#_Extension|_privateField1 = null /* from org-dartlang-testcase:///private_members_part.dart */;
+static field core::int? _#_Extension|_privateField2 = null /* from org-dartlang-testcase:///private_members_part.dart */;
+static field core::bool _#_Extension|_privateField2#isSet = false /* from org-dartlang-testcase:///private_members_part.dart */;
+static field core::int? _#_Extension|_privateFinalField1 = null /* from org-dartlang-testcase:///private_members_part.dart */;
+static field core::int? _#_Extension|_privateFinalField2 = null /* from org-dartlang-testcase:///private_members_part.dart */;
+static field core::bool _#_Extension|_privateFinalField2#isSet = false /* from org-dartlang-testcase:///private_members_part.dart */;
+static method main() → dynamic {
+ self::_Class c = new self::_Class::•();
+ c.{self::_Class::_privateField1} = c.{self::_Class::_privateField1};
+ c.{self::_Class::_privateField2} = c.{self::_Class::_privateField2};
+ c.{self::_Class::_privateFinalField1};
+ c.{self::_Class::_privateFinalField2};
+ self::_Extension|_privateField1 = self::_Extension|_privateField1;
+ self::_Extension|_privateField2 = self::_Extension|_privateField2;
+ self::_Extension|_privateFinalField1;
+ self::_Extension|_privateFinalField2;
+}
+static get /* from org-dartlang-testcase:///private_members_part.dart */ _Extension|_privateField1() → core::int
+ return let final core::int? #t7 = self::_#_Extension|_privateField1 in #t7.==(null) ?{core::int} self::_#_Extension|_privateField1 = 1 : #t7{core::int};
+static set /* from org-dartlang-testcase:///private_members_part.dart */ _Extension|_privateField1(core::int #t8) → void
+ self::_#_Extension|_privateField1 = #t8;
+static get /* from org-dartlang-testcase:///private_members_part.dart */ _Extension|_privateField2() → core::int? {
+ if(!self::_#_Extension|_privateField2#isSet) {
+ self::_#_Extension|_privateField2 = 1;
+ self::_#_Extension|_privateField2#isSet = true;
+ }
+ return self::_#_Extension|_privateField2;
+}
+static set /* from org-dartlang-testcase:///private_members_part.dart */ _Extension|_privateField2(core::int? #t9) → void {
+ self::_#_Extension|_privateField2#isSet = true;
+ self::_#_Extension|_privateField2 = #t9;
+}
+static get /* from org-dartlang-testcase:///private_members_part.dart */ _Extension|_privateFinalField1() → core::int
+ return let final core::int? #t10 = self::_#_Extension|_privateFinalField1 in #t10.==(null) ?{core::int} self::_#_Extension|_privateFinalField1 = 1 : #t10{core::int};
+static set /* from org-dartlang-testcase:///private_members_part.dart */ _Extension|_privateFinalField1(core::int #t11) → void
+ self::_#_Extension|_privateFinalField1 = #t11;
+static get /* from org-dartlang-testcase:///private_members_part.dart */ _Extension|_privateFinalField2() → core::int? {
+ if(!self::_#_Extension|_privateFinalField2#isSet) {
+ self::_#_Extension|_privateFinalField2 = 1;
+ self::_#_Extension|_privateFinalField2#isSet = true;
+ }
+ return self::_#_Extension|_privateFinalField2;
+}
+static set /* from org-dartlang-testcase:///private_members_part.dart */ _Extension|_privateFinalField2(core::int? #t12) → void {
+ self::_#_Extension|_privateFinalField2#isSet = true;
+ self::_#_Extension|_privateFinalField2 = #t12;
+}
diff --git a/pkg/front_end/testcases/late_lowering/private_members.dart.strong.transformed.expect b/pkg/front_end/testcases/late_lowering/private_members.dart.strong.transformed.expect
new file mode 100644
index 0000000..af828fe
--- /dev/null
+++ b/pkg/front_end/testcases/late_lowering/private_members.dart.strong.transformed.expect
@@ -0,0 +1,109 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+part private_members_part.dart;
+class _Class extends core::Object { // from org-dartlang-testcase:///private_members_part.dart
+ field core::int? _#_Class#_privateField1 = null;
+ field core::int? _#_Class#_privateField2 = null;
+ field core::bool _#_Class#_privateField2#isSet = false;
+ field core::int? _#_Class#_privateFinalField1 = null;
+ field core::int? _#_Class#_privateFinalField2 = null;
+ field core::bool _#_Class#_privateFinalField2#isSet = false;
+ synthetic constructor •() → self::_Class
+ : super core::Object::•()
+ ;
+ get _privateField1() → core::int
+ return let final core::int? #t1 = this.{self::_Class::_#_Class#_privateField1} in #t1.==(null) ?{core::int} this.{self::_Class::_#_Class#_privateField1} = 1 : #t1{core::int};
+ set _privateField1(core::int #t2) → void
+ this.{self::_Class::_#_Class#_privateField1} = #t2;
+ get _privateField2() → core::int? {
+ if(!this.{self::_Class::_#_Class#_privateField2#isSet}) {
+ this.{self::_Class::_#_Class#_privateField2} = 1;
+ this.{self::_Class::_#_Class#_privateField2#isSet} = true;
+ }
+ return this.{self::_Class::_#_Class#_privateField2};
+ }
+ set _privateField2(core::int? #t3) → void {
+ this.{self::_Class::_#_Class#_privateField2#isSet} = true;
+ this.{self::_Class::_#_Class#_privateField2} = #t3;
+ }
+ get _privateFinalField1() → core::int
+ return let final core::int? #t4 = this.{self::_Class::_#_Class#_privateFinalField1} in #t4.==(null) ?{core::int} this.{self::_Class::_#_Class#_privateFinalField1} = 1 : #t4{core::int};
+ set _privateFinalField1(core::int #t5) → void
+ this.{self::_Class::_#_Class#_privateFinalField1} = #t5;
+ get _privateFinalField2() → core::int? {
+ if(!this.{self::_Class::_#_Class#_privateFinalField2#isSet}) {
+ this.{self::_Class::_#_Class#_privateFinalField2} = 1;
+ this.{self::_Class::_#_Class#_privateFinalField2#isSet} = true;
+ }
+ return this.{self::_Class::_#_Class#_privateFinalField2};
+ }
+ set _privateFinalField2(core::int? #t6) → void {
+ this.{self::_Class::_#_Class#_privateFinalField2#isSet} = true;
+ this.{self::_Class::_#_Class#_privateFinalField2} = #t6;
+ }
+}
+extension _Extension on core::int { // from org-dartlang-testcase:///private_members_part.dart
+ static field _privateField1 = self::_#_Extension|_privateField1;
+ static get _privateField1 = get self::_Extension|_privateField1;
+ static set _privateField1 = set self::_Extension|_privateField1;
+ static field _privateField2 = self::_#_Extension|_privateField2;
+ static field _privateField2 = self::_#_Extension|_privateField2#isSet;
+ static get _privateField2 = get self::_Extension|_privateField2;
+ static set _privateField2 = set self::_Extension|_privateField2;
+ static field _privateFinalField1 = self::_#_Extension|_privateFinalField1;
+ static get _privateFinalField1 = get self::_Extension|_privateFinalField1;
+ static set _privateFinalField1 = set self::_Extension|_privateFinalField1;
+ static field _privateFinalField2 = self::_#_Extension|_privateFinalField2;
+ static field _privateFinalField2 = self::_#_Extension|_privateFinalField2#isSet;
+ static get _privateFinalField2 = get self::_Extension|_privateFinalField2;
+ static set _privateFinalField2 = set self::_Extension|_privateFinalField2;
+}
+static field core::int? _#_Extension|_privateField1 = null /* from org-dartlang-testcase:///private_members_part.dart */;
+static field core::int? _#_Extension|_privateField2 = null /* from org-dartlang-testcase:///private_members_part.dart */;
+static field core::bool _#_Extension|_privateField2#isSet = false /* from org-dartlang-testcase:///private_members_part.dart */;
+static field core::int? _#_Extension|_privateFinalField1 = null /* from org-dartlang-testcase:///private_members_part.dart */;
+static field core::int? _#_Extension|_privateFinalField2 = null /* from org-dartlang-testcase:///private_members_part.dart */;
+static field core::bool _#_Extension|_privateFinalField2#isSet = false /* from org-dartlang-testcase:///private_members_part.dart */;
+static method main() → dynamic {
+ self::_Class c = new self::_Class::•();
+ c.{self::_Class::_privateField1} = c.{self::_Class::_privateField1};
+ c.{self::_Class::_privateField2} = c.{self::_Class::_privateField2};
+ c.{self::_Class::_privateFinalField1};
+ c.{self::_Class::_privateFinalField2};
+ self::_Extension|_privateField1 = self::_Extension|_privateField1;
+ self::_Extension|_privateField2 = self::_Extension|_privateField2;
+ self::_Extension|_privateFinalField1;
+ self::_Extension|_privateFinalField2;
+}
+static get /* from org-dartlang-testcase:///private_members_part.dart */ _Extension|_privateField1() → core::int
+ return let final core::int? #t7 = self::_#_Extension|_privateField1 in #t7.==(null) ?{core::int} self::_#_Extension|_privateField1 = 1 : #t7{core::int};
+static set /* from org-dartlang-testcase:///private_members_part.dart */ _Extension|_privateField1(core::int #t8) → void
+ self::_#_Extension|_privateField1 = #t8;
+static get /* from org-dartlang-testcase:///private_members_part.dart */ _Extension|_privateField2() → core::int? {
+ if(!self::_#_Extension|_privateField2#isSet) {
+ self::_#_Extension|_privateField2 = 1;
+ self::_#_Extension|_privateField2#isSet = true;
+ }
+ return self::_#_Extension|_privateField2;
+}
+static set /* from org-dartlang-testcase:///private_members_part.dart */ _Extension|_privateField2(core::int? #t9) → void {
+ self::_#_Extension|_privateField2#isSet = true;
+ self::_#_Extension|_privateField2 = #t9;
+}
+static get /* from org-dartlang-testcase:///private_members_part.dart */ _Extension|_privateFinalField1() → core::int
+ return let final core::int? #t10 = self::_#_Extension|_privateFinalField1 in #t10.==(null) ?{core::int} self::_#_Extension|_privateFinalField1 = 1 : #t10{core::int};
+static set /* from org-dartlang-testcase:///private_members_part.dart */ _Extension|_privateFinalField1(core::int #t11) → void
+ self::_#_Extension|_privateFinalField1 = #t11;
+static get /* from org-dartlang-testcase:///private_members_part.dart */ _Extension|_privateFinalField2() → core::int? {
+ if(!self::_#_Extension|_privateFinalField2#isSet) {
+ self::_#_Extension|_privateFinalField2 = 1;
+ self::_#_Extension|_privateFinalField2#isSet = true;
+ }
+ return self::_#_Extension|_privateFinalField2;
+}
+static set /* from org-dartlang-testcase:///private_members_part.dart */ _Extension|_privateFinalField2(core::int? #t12) → void {
+ self::_#_Extension|_privateFinalField2#isSet = true;
+ self::_#_Extension|_privateFinalField2 = #t12;
+}
diff --git a/pkg/front_end/testcases/late_lowering/private_members.dart.textual_outline.expect b/pkg/front_end/testcases/late_lowering/private_members.dart.textual_outline.expect
new file mode 100644
index 0000000..058437c
--- /dev/null
+++ b/pkg/front_end/testcases/late_lowering/private_members.dart.textual_outline.expect
@@ -0,0 +1,3 @@
+part 'private_members_part.dart';
+
+main() {}
diff --git a/pkg/front_end/testcases/late_lowering/private_members.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/late_lowering/private_members.dart.textual_outline_modelled.expect
new file mode 100644
index 0000000..058437c
--- /dev/null
+++ b/pkg/front_end/testcases/late_lowering/private_members.dart.textual_outline_modelled.expect
@@ -0,0 +1,3 @@
+part 'private_members_part.dart';
+
+main() {}
diff --git a/pkg/front_end/testcases/late_lowering/private_members.dart.weak.expect b/pkg/front_end/testcases/late_lowering/private_members.dart.weak.expect
new file mode 100644
index 0000000..91b12c0
--- /dev/null
+++ b/pkg/front_end/testcases/late_lowering/private_members.dart.weak.expect
@@ -0,0 +1,143 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+part private_members_part.dart;
+class _Class extends core::Object { // from org-dartlang-testcase:///private_members_part.dart
+ field core::int? _#_Class#_privateField1 = null;
+ field core::bool _#_Class#_privateField1#isSet = false;
+ field core::int? _#_Class#_privateField2 = null;
+ field core::bool _#_Class#_privateField2#isSet = false;
+ field core::int? _#_Class#_privateFinalField1 = null;
+ field core::bool _#_Class#_privateFinalField1#isSet = false;
+ field core::int? _#_Class#_privateFinalField2 = null;
+ field core::bool _#_Class#_privateFinalField2#isSet = false;
+ synthetic constructor •() → self::_Class
+ : super core::Object::•()
+ ;
+ get _privateField1() → core::int {
+ if(!this.{self::_Class::_#_Class#_privateField1#isSet}) {
+ this.{self::_Class::_#_Class#_privateField1} = 1;
+ this.{self::_Class::_#_Class#_privateField1#isSet} = true;
+ }
+ return let final core::int? #t1 = this.{self::_Class::_#_Class#_privateField1} in #t1{core::int};
+ }
+ set _privateField1(core::int #t2) → void {
+ this.{self::_Class::_#_Class#_privateField1#isSet} = true;
+ this.{self::_Class::_#_Class#_privateField1} = #t2;
+ }
+ get _privateField2() → core::int? {
+ if(!this.{self::_Class::_#_Class#_privateField2#isSet}) {
+ this.{self::_Class::_#_Class#_privateField2} = 1;
+ this.{self::_Class::_#_Class#_privateField2#isSet} = true;
+ }
+ return this.{self::_Class::_#_Class#_privateField2};
+ }
+ set _privateField2(core::int? #t3) → void {
+ this.{self::_Class::_#_Class#_privateField2#isSet} = true;
+ this.{self::_Class::_#_Class#_privateField2} = #t3;
+ }
+ get _privateFinalField1() → core::int {
+ if(!this.{self::_Class::_#_Class#_privateFinalField1#isSet}) {
+ this.{self::_Class::_#_Class#_privateFinalField1} = 1;
+ this.{self::_Class::_#_Class#_privateFinalField1#isSet} = true;
+ }
+ return let final core::int? #t4 = this.{self::_Class::_#_Class#_privateFinalField1} in #t4{core::int};
+ }
+ set _privateFinalField1(core::int #t5) → void {
+ this.{self::_Class::_#_Class#_privateFinalField1#isSet} = true;
+ this.{self::_Class::_#_Class#_privateFinalField1} = #t5;
+ }
+ get _privateFinalField2() → core::int? {
+ if(!this.{self::_Class::_#_Class#_privateFinalField2#isSet}) {
+ this.{self::_Class::_#_Class#_privateFinalField2} = 1;
+ this.{self::_Class::_#_Class#_privateFinalField2#isSet} = true;
+ }
+ return this.{self::_Class::_#_Class#_privateFinalField2};
+ }
+ set _privateFinalField2(core::int? #t6) → void {
+ this.{self::_Class::_#_Class#_privateFinalField2#isSet} = true;
+ this.{self::_Class::_#_Class#_privateFinalField2} = #t6;
+ }
+}
+extension _Extension on core::int { // from org-dartlang-testcase:///private_members_part.dart
+ static field _privateField1 = self::_#_Extension|_privateField1;
+ static field _privateField1 = self::_#_Extension|_privateField1#isSet;
+ static get _privateField1 = get self::_Extension|_privateField1;
+ static set _privateField1 = set self::_Extension|_privateField1;
+ static field _privateField2 = self::_#_Extension|_privateField2;
+ static field _privateField2 = self::_#_Extension|_privateField2#isSet;
+ static get _privateField2 = get self::_Extension|_privateField2;
+ static set _privateField2 = set self::_Extension|_privateField2;
+ static field _privateFinalField1 = self::_#_Extension|_privateFinalField1;
+ static field _privateFinalField1 = self::_#_Extension|_privateFinalField1#isSet;
+ static get _privateFinalField1 = get self::_Extension|_privateFinalField1;
+ static set _privateFinalField1 = set self::_Extension|_privateFinalField1;
+ static field _privateFinalField2 = self::_#_Extension|_privateFinalField2;
+ static field _privateFinalField2 = self::_#_Extension|_privateFinalField2#isSet;
+ static get _privateFinalField2 = get self::_Extension|_privateFinalField2;
+ static set _privateFinalField2 = set self::_Extension|_privateFinalField2;
+}
+static field core::int? _#_Extension|_privateField1 = null /* from org-dartlang-testcase:///private_members_part.dart */;
+static field core::bool _#_Extension|_privateField1#isSet = false /* from org-dartlang-testcase:///private_members_part.dart */;
+static field core::int? _#_Extension|_privateField2 = null /* from org-dartlang-testcase:///private_members_part.dart */;
+static field core::bool _#_Extension|_privateField2#isSet = false /* from org-dartlang-testcase:///private_members_part.dart */;
+static field core::int? _#_Extension|_privateFinalField1 = null /* from org-dartlang-testcase:///private_members_part.dart */;
+static field core::bool _#_Extension|_privateFinalField1#isSet = false /* from org-dartlang-testcase:///private_members_part.dart */;
+static field core::int? _#_Extension|_privateFinalField2 = null /* from org-dartlang-testcase:///private_members_part.dart */;
+static field core::bool _#_Extension|_privateFinalField2#isSet = false /* from org-dartlang-testcase:///private_members_part.dart */;
+static method main() → dynamic {
+ self::_Class c = new self::_Class::•();
+ c.{self::_Class::_privateField1} = c.{self::_Class::_privateField1};
+ c.{self::_Class::_privateField2} = c.{self::_Class::_privateField2};
+ c.{self::_Class::_privateFinalField1};
+ c.{self::_Class::_privateFinalField2};
+ self::_Extension|_privateField1 = self::_Extension|_privateField1;
+ self::_Extension|_privateField2 = self::_Extension|_privateField2;
+ self::_Extension|_privateFinalField1;
+ self::_Extension|_privateFinalField2;
+}
+static get /* from org-dartlang-testcase:///private_members_part.dart */ _Extension|_privateField1() → core::int {
+ if(!self::_#_Extension|_privateField1#isSet) {
+ self::_#_Extension|_privateField1 = 1;
+ self::_#_Extension|_privateField1#isSet = true;
+ }
+ return let final core::int? #t7 = self::_#_Extension|_privateField1 in #t7{core::int};
+}
+static set /* from org-dartlang-testcase:///private_members_part.dart */ _Extension|_privateField1(core::int #t8) → void {
+ self::_#_Extension|_privateField1#isSet = true;
+ self::_#_Extension|_privateField1 = #t8;
+}
+static get /* from org-dartlang-testcase:///private_members_part.dart */ _Extension|_privateField2() → core::int? {
+ if(!self::_#_Extension|_privateField2#isSet) {
+ self::_#_Extension|_privateField2 = 1;
+ self::_#_Extension|_privateField2#isSet = true;
+ }
+ return self::_#_Extension|_privateField2;
+}
+static set /* from org-dartlang-testcase:///private_members_part.dart */ _Extension|_privateField2(core::int? #t9) → void {
+ self::_#_Extension|_privateField2#isSet = true;
+ self::_#_Extension|_privateField2 = #t9;
+}
+static get /* from org-dartlang-testcase:///private_members_part.dart */ _Extension|_privateFinalField1() → core::int {
+ if(!self::_#_Extension|_privateFinalField1#isSet) {
+ self::_#_Extension|_privateFinalField1 = 1;
+ self::_#_Extension|_privateFinalField1#isSet = true;
+ }
+ return let final core::int? #t10 = self::_#_Extension|_privateFinalField1 in #t10{core::int};
+}
+static set /* from org-dartlang-testcase:///private_members_part.dart */ _Extension|_privateFinalField1(core::int #t11) → void {
+ self::_#_Extension|_privateFinalField1#isSet = true;
+ self::_#_Extension|_privateFinalField1 = #t11;
+}
+static get /* from org-dartlang-testcase:///private_members_part.dart */ _Extension|_privateFinalField2() → core::int? {
+ if(!self::_#_Extension|_privateFinalField2#isSet) {
+ self::_#_Extension|_privateFinalField2 = 1;
+ self::_#_Extension|_privateFinalField2#isSet = true;
+ }
+ return self::_#_Extension|_privateFinalField2;
+}
+static set /* from org-dartlang-testcase:///private_members_part.dart */ _Extension|_privateFinalField2(core::int? #t12) → void {
+ self::_#_Extension|_privateFinalField2#isSet = true;
+ self::_#_Extension|_privateFinalField2 = #t12;
+}
diff --git a/pkg/front_end/testcases/late_lowering/private_members.dart.weak.outline.expect b/pkg/front_end/testcases/late_lowering/private_members.dart.weak.outline.expect
new file mode 100644
index 0000000..88c4850ad
--- /dev/null
+++ b/pkg/front_end/testcases/late_lowering/private_members.dart.weak.outline.expect
@@ -0,0 +1,61 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+part private_members_part.dart;
+class _Class extends core::Object { // from org-dartlang-testcase:///private_members_part.dart
+ field core::int? _#_Class#_privateField1;
+ field core::bool _#_Class#_privateField1#isSet;
+ field core::int? _#_Class#_privateField2;
+ field core::bool _#_Class#_privateField2#isSet;
+ field core::int? _#_Class#_privateFinalField1;
+ field core::bool _#_Class#_privateFinalField1#isSet;
+ field core::int? _#_Class#_privateFinalField2;
+ field core::bool _#_Class#_privateFinalField2#isSet;
+ synthetic constructor •() → self::_Class
+ ;
+ get _privateField1() → core::int;
+ set _privateField1(core::int #t1) → void;
+ get _privateField2() → core::int?;
+ set _privateField2(core::int? #t2) → void;
+ get _privateFinalField1() → core::int;
+ set _privateFinalField1(core::int #t3) → void;
+ get _privateFinalField2() → core::int?;
+ set _privateFinalField2(core::int? #t4) → void;
+}
+extension _Extension on core::int { // from org-dartlang-testcase:///private_members_part.dart
+ static field _privateField1 = self::_#_Extension|_privateField1;
+ static field _privateField1 = self::_#_Extension|_privateField1#isSet;
+ static get _privateField1 = get self::_Extension|_privateField1;
+ static set _privateField1 = set self::_Extension|_privateField1;
+ static field _privateField2 = self::_#_Extension|_privateField2;
+ static field _privateField2 = self::_#_Extension|_privateField2#isSet;
+ static get _privateField2 = get self::_Extension|_privateField2;
+ static set _privateField2 = set self::_Extension|_privateField2;
+ static field _privateFinalField1 = self::_#_Extension|_privateFinalField1;
+ static field _privateFinalField1 = self::_#_Extension|_privateFinalField1#isSet;
+ static get _privateFinalField1 = get self::_Extension|_privateFinalField1;
+ static set _privateFinalField1 = set self::_Extension|_privateFinalField1;
+ static field _privateFinalField2 = self::_#_Extension|_privateFinalField2;
+ static field _privateFinalField2 = self::_#_Extension|_privateFinalField2#isSet;
+ static get _privateFinalField2 = get self::_Extension|_privateFinalField2;
+ static set _privateFinalField2 = set self::_Extension|_privateFinalField2;
+}
+static field core::int? _#_Extension|_privateField1 /* from org-dartlang-testcase:///private_members_part.dart */;
+static field core::bool _#_Extension|_privateField1#isSet /* from org-dartlang-testcase:///private_members_part.dart */;
+static field core::int? _#_Extension|_privateField2 /* from org-dartlang-testcase:///private_members_part.dart */;
+static field core::bool _#_Extension|_privateField2#isSet /* from org-dartlang-testcase:///private_members_part.dart */;
+static field core::int? _#_Extension|_privateFinalField1 /* from org-dartlang-testcase:///private_members_part.dart */;
+static field core::bool _#_Extension|_privateFinalField1#isSet /* from org-dartlang-testcase:///private_members_part.dart */;
+static field core::int? _#_Extension|_privateFinalField2 /* from org-dartlang-testcase:///private_members_part.dart */;
+static field core::bool _#_Extension|_privateFinalField2#isSet /* from org-dartlang-testcase:///private_members_part.dart */;
+static method main() → dynamic
+ ;
+static get /* from org-dartlang-testcase:///private_members_part.dart */ _Extension|_privateField1() → core::int;
+static set /* from org-dartlang-testcase:///private_members_part.dart */ _Extension|_privateField1(core::int #t5) → void;
+static get /* from org-dartlang-testcase:///private_members_part.dart */ _Extension|_privateField2() → core::int?;
+static set /* from org-dartlang-testcase:///private_members_part.dart */ _Extension|_privateField2(core::int? #t6) → void;
+static get /* from org-dartlang-testcase:///private_members_part.dart */ _Extension|_privateFinalField1() → core::int;
+static set /* from org-dartlang-testcase:///private_members_part.dart */ _Extension|_privateFinalField1(core::int #t7) → void;
+static get /* from org-dartlang-testcase:///private_members_part.dart */ _Extension|_privateFinalField2() → core::int?;
+static set /* from org-dartlang-testcase:///private_members_part.dart */ _Extension|_privateFinalField2(core::int? #t8) → void;
diff --git a/pkg/front_end/testcases/late_lowering/private_members.dart.weak.transformed.expect b/pkg/front_end/testcases/late_lowering/private_members.dart.weak.transformed.expect
new file mode 100644
index 0000000..91b12c0
--- /dev/null
+++ b/pkg/front_end/testcases/late_lowering/private_members.dart.weak.transformed.expect
@@ -0,0 +1,143 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+part private_members_part.dart;
+class _Class extends core::Object { // from org-dartlang-testcase:///private_members_part.dart
+ field core::int? _#_Class#_privateField1 = null;
+ field core::bool _#_Class#_privateField1#isSet = false;
+ field core::int? _#_Class#_privateField2 = null;
+ field core::bool _#_Class#_privateField2#isSet = false;
+ field core::int? _#_Class#_privateFinalField1 = null;
+ field core::bool _#_Class#_privateFinalField1#isSet = false;
+ field core::int? _#_Class#_privateFinalField2 = null;
+ field core::bool _#_Class#_privateFinalField2#isSet = false;
+ synthetic constructor •() → self::_Class
+ : super core::Object::•()
+ ;
+ get _privateField1() → core::int {
+ if(!this.{self::_Class::_#_Class#_privateField1#isSet}) {
+ this.{self::_Class::_#_Class#_privateField1} = 1;
+ this.{self::_Class::_#_Class#_privateField1#isSet} = true;
+ }
+ return let final core::int? #t1 = this.{self::_Class::_#_Class#_privateField1} in #t1{core::int};
+ }
+ set _privateField1(core::int #t2) → void {
+ this.{self::_Class::_#_Class#_privateField1#isSet} = true;
+ this.{self::_Class::_#_Class#_privateField1} = #t2;
+ }
+ get _privateField2() → core::int? {
+ if(!this.{self::_Class::_#_Class#_privateField2#isSet}) {
+ this.{self::_Class::_#_Class#_privateField2} = 1;
+ this.{self::_Class::_#_Class#_privateField2#isSet} = true;
+ }
+ return this.{self::_Class::_#_Class#_privateField2};
+ }
+ set _privateField2(core::int? #t3) → void {
+ this.{self::_Class::_#_Class#_privateField2#isSet} = true;
+ this.{self::_Class::_#_Class#_privateField2} = #t3;
+ }
+ get _privateFinalField1() → core::int {
+ if(!this.{self::_Class::_#_Class#_privateFinalField1#isSet}) {
+ this.{self::_Class::_#_Class#_privateFinalField1} = 1;
+ this.{self::_Class::_#_Class#_privateFinalField1#isSet} = true;
+ }
+ return let final core::int? #t4 = this.{self::_Class::_#_Class#_privateFinalField1} in #t4{core::int};
+ }
+ set _privateFinalField1(core::int #t5) → void {
+ this.{self::_Class::_#_Class#_privateFinalField1#isSet} = true;
+ this.{self::_Class::_#_Class#_privateFinalField1} = #t5;
+ }
+ get _privateFinalField2() → core::int? {
+ if(!this.{self::_Class::_#_Class#_privateFinalField2#isSet}) {
+ this.{self::_Class::_#_Class#_privateFinalField2} = 1;
+ this.{self::_Class::_#_Class#_privateFinalField2#isSet} = true;
+ }
+ return this.{self::_Class::_#_Class#_privateFinalField2};
+ }
+ set _privateFinalField2(core::int? #t6) → void {
+ this.{self::_Class::_#_Class#_privateFinalField2#isSet} = true;
+ this.{self::_Class::_#_Class#_privateFinalField2} = #t6;
+ }
+}
+extension _Extension on core::int { // from org-dartlang-testcase:///private_members_part.dart
+ static field _privateField1 = self::_#_Extension|_privateField1;
+ static field _privateField1 = self::_#_Extension|_privateField1#isSet;
+ static get _privateField1 = get self::_Extension|_privateField1;
+ static set _privateField1 = set self::_Extension|_privateField1;
+ static field _privateField2 = self::_#_Extension|_privateField2;
+ static field _privateField2 = self::_#_Extension|_privateField2#isSet;
+ static get _privateField2 = get self::_Extension|_privateField2;
+ static set _privateField2 = set self::_Extension|_privateField2;
+ static field _privateFinalField1 = self::_#_Extension|_privateFinalField1;
+ static field _privateFinalField1 = self::_#_Extension|_privateFinalField1#isSet;
+ static get _privateFinalField1 = get self::_Extension|_privateFinalField1;
+ static set _privateFinalField1 = set self::_Extension|_privateFinalField1;
+ static field _privateFinalField2 = self::_#_Extension|_privateFinalField2;
+ static field _privateFinalField2 = self::_#_Extension|_privateFinalField2#isSet;
+ static get _privateFinalField2 = get self::_Extension|_privateFinalField2;
+ static set _privateFinalField2 = set self::_Extension|_privateFinalField2;
+}
+static field core::int? _#_Extension|_privateField1 = null /* from org-dartlang-testcase:///private_members_part.dart */;
+static field core::bool _#_Extension|_privateField1#isSet = false /* from org-dartlang-testcase:///private_members_part.dart */;
+static field core::int? _#_Extension|_privateField2 = null /* from org-dartlang-testcase:///private_members_part.dart */;
+static field core::bool _#_Extension|_privateField2#isSet = false /* from org-dartlang-testcase:///private_members_part.dart */;
+static field core::int? _#_Extension|_privateFinalField1 = null /* from org-dartlang-testcase:///private_members_part.dart */;
+static field core::bool _#_Extension|_privateFinalField1#isSet = false /* from org-dartlang-testcase:///private_members_part.dart */;
+static field core::int? _#_Extension|_privateFinalField2 = null /* from org-dartlang-testcase:///private_members_part.dart */;
+static field core::bool _#_Extension|_privateFinalField2#isSet = false /* from org-dartlang-testcase:///private_members_part.dart */;
+static method main() → dynamic {
+ self::_Class c = new self::_Class::•();
+ c.{self::_Class::_privateField1} = c.{self::_Class::_privateField1};
+ c.{self::_Class::_privateField2} = c.{self::_Class::_privateField2};
+ c.{self::_Class::_privateFinalField1};
+ c.{self::_Class::_privateFinalField2};
+ self::_Extension|_privateField1 = self::_Extension|_privateField1;
+ self::_Extension|_privateField2 = self::_Extension|_privateField2;
+ self::_Extension|_privateFinalField1;
+ self::_Extension|_privateFinalField2;
+}
+static get /* from org-dartlang-testcase:///private_members_part.dart */ _Extension|_privateField1() → core::int {
+ if(!self::_#_Extension|_privateField1#isSet) {
+ self::_#_Extension|_privateField1 = 1;
+ self::_#_Extension|_privateField1#isSet = true;
+ }
+ return let final core::int? #t7 = self::_#_Extension|_privateField1 in #t7{core::int};
+}
+static set /* from org-dartlang-testcase:///private_members_part.dart */ _Extension|_privateField1(core::int #t8) → void {
+ self::_#_Extension|_privateField1#isSet = true;
+ self::_#_Extension|_privateField1 = #t8;
+}
+static get /* from org-dartlang-testcase:///private_members_part.dart */ _Extension|_privateField2() → core::int? {
+ if(!self::_#_Extension|_privateField2#isSet) {
+ self::_#_Extension|_privateField2 = 1;
+ self::_#_Extension|_privateField2#isSet = true;
+ }
+ return self::_#_Extension|_privateField2;
+}
+static set /* from org-dartlang-testcase:///private_members_part.dart */ _Extension|_privateField2(core::int? #t9) → void {
+ self::_#_Extension|_privateField2#isSet = true;
+ self::_#_Extension|_privateField2 = #t9;
+}
+static get /* from org-dartlang-testcase:///private_members_part.dart */ _Extension|_privateFinalField1() → core::int {
+ if(!self::_#_Extension|_privateFinalField1#isSet) {
+ self::_#_Extension|_privateFinalField1 = 1;
+ self::_#_Extension|_privateFinalField1#isSet = true;
+ }
+ return let final core::int? #t10 = self::_#_Extension|_privateFinalField1 in #t10{core::int};
+}
+static set /* from org-dartlang-testcase:///private_members_part.dart */ _Extension|_privateFinalField1(core::int #t11) → void {
+ self::_#_Extension|_privateFinalField1#isSet = true;
+ self::_#_Extension|_privateFinalField1 = #t11;
+}
+static get /* from org-dartlang-testcase:///private_members_part.dart */ _Extension|_privateFinalField2() → core::int? {
+ if(!self::_#_Extension|_privateFinalField2#isSet) {
+ self::_#_Extension|_privateFinalField2 = 1;
+ self::_#_Extension|_privateFinalField2#isSet = true;
+ }
+ return self::_#_Extension|_privateFinalField2;
+}
+static set /* from org-dartlang-testcase:///private_members_part.dart */ _Extension|_privateFinalField2(core::int? #t12) → void {
+ self::_#_Extension|_privateFinalField2#isSet = true;
+ self::_#_Extension|_privateFinalField2 = #t12;
+}
diff --git a/pkg/front_end/testcases/late_lowering/private_members_part.dart b/pkg/front_end/testcases/late_lowering/private_members_part.dart
new file mode 100644
index 0000000..d94c0e6
--- /dev/null
+++ b/pkg/front_end/testcases/late_lowering/private_members_part.dart
@@ -0,0 +1,25 @@
+// 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.
+
+part of 'private_members.dart';
+
+class _Class {
+ late int _privateField1 = 1;
+
+ late int? _privateField2 = 1;
+
+ late int _privateFinalField1 = 1;
+
+ late int? _privateFinalField2 = 1;
+}
+
+extension _Extension on int {
+ static late int _privateField1 = 1;
+
+ static late int? _privateField2 = 1;
+
+ static late int _privateFinalField1 = 1;
+
+ static late int? _privateFinalField2 = 1;
+}
diff --git a/pkg/kernel/lib/ast.dart b/pkg/kernel/lib/ast.dart
index fde2440..a81d28f 100644
--- a/pkg/kernel/lib/ast.dart
+++ b/pkg/kernel/lib/ast.dart
@@ -1617,8 +1617,7 @@
@override
List<Expression> annotations = const <Expression>[];
- // TODO(johnniwinther): Make this non-nullable.
- Name? name;
+ Name name;
/// The URI of the source file this member was loaded from.
@override
@@ -1641,7 +1640,10 @@
// TODO(asgerf): It might be worthwhile to put this on classes as well.
int transformerFlags = 0;
- Member(this.name, this.fileUri, Reference? reference) : super(reference);
+ Member(this.name, this.fileUri, Reference? reference)
+ // ignore: unnecessary_null_comparison
+ : assert(name != null),
+ super(reference);
Class? get enclosingClass => parent is Class ? parent as Class : null;
Library get enclosingLibrary =>
@@ -1751,7 +1753,7 @@
Reference get getterReference => super.reference;
- Field.mutable(Name? name,
+ Field.mutable(Name name,
{this.type: const DynamicType(),
this.initializer,
bool isCovariant: false,
@@ -1775,7 +1777,7 @@
this.transformerFlags = transformerFlags;
}
- Field.immutable(Name? name,
+ Field.immutable(Name name,
{this.type: const DynamicType(),
this.initializer,
bool isCovariant: false,
@@ -1925,7 +1927,7 @@
void visitChildren(Visitor v) {
visitList(annotations, v);
type.accept(v);
- name?.accept(v);
+ name.accept(v);
initializer?.accept(v);
}
@@ -1993,7 +1995,7 @@
List<Initializer> initializers;
Constructor(this.function,
- {Name? name,
+ {required Name name,
bool isConst: false,
bool isExternal: false,
bool isSynthetic: false,
@@ -2078,7 +2080,7 @@
@override
void visitChildren(Visitor v) {
visitList(annotations, v);
- name?.accept(v);
+ name.accept(v);
visitList(initializers, v);
function?.accept(v);
}
@@ -2166,7 +2168,7 @@
List<VariableDeclaration> namedParameters;
RedirectingFactoryConstructor(this.targetReference,
- {Name? name,
+ {required Name name,
bool isConst: false,
bool isExternal: false,
int transformerFlags: 0,
@@ -2263,7 +2265,7 @@
visitList(annotations, v);
target?.acceptReference(v);
visitList(typeArguments, v);
- name?.accept(v);
+ name.accept(v);
}
@override
@@ -2534,7 +2536,7 @@
ProcedureStubKind stubKind;
Reference? stubTargetReference;
- Procedure(Name? name, ProcedureKind kind, FunctionNode? function,
+ Procedure(Name name, ProcedureKind kind, FunctionNode? function,
{bool isAbstract: false,
bool isStatic: false,
bool isExternal: false,
@@ -2560,7 +2562,7 @@
stubTargetReference:
getMemberReferenceBasedOnProcedureKind(stubTarget, kind));
- Procedure._byReferenceRenamed(Name? name, this.kind, this.function,
+ Procedure._byReferenceRenamed(Name name, this.kind, this.function,
{bool isAbstract: false,
bool isStatic: false,
bool isExternal: false,
@@ -2750,7 +2752,7 @@
@override
void visitChildren(Visitor v) {
visitList(annotations, v);
- name?.accept(v);
+ name.accept(v);
function?.accept(v);
}
@@ -6088,7 +6090,7 @@
bool isConst;
@override
- Name get name => target.name!;
+ Name get name => target.name;
StaticInvocation(Procedure target, Arguments arguments, {bool isConst: false})
: this.byReference(
@@ -6175,7 +6177,7 @@
bool isConst;
@override
- Name get name => target.name!;
+ Name get name => target.name;
ConstructorInvocation(Constructor target, Arguments arguments,
{bool isConst: false})
@@ -6263,9 +6265,9 @@
}
printer.writeClassName(target.enclosingClass.reference);
printer.writeTypeArguments(arguments.types);
- if (target.name!.text.isNotEmpty) {
+ if (target.name.text.isNotEmpty) {
printer.write('.');
- printer.write(target.name!.text);
+ printer.write(target.name.text);
}
printer.writeArguments(arguments, includeTypeArguments: false);
}
@@ -13613,7 +13615,8 @@
/// This is used as the removal sentinel in [RemovingTransformer] and can be
/// used for instance as a dummy initial value for the `List.filled`
/// constructor.
-final Constructor dummyConstructor = new Constructor(dummyFunctionNode);
+final Constructor dummyConstructor =
+ new Constructor(dummyFunctionNode, name: dummyName);
/// Non-nullable [Extension] dummy value.
///
@@ -13649,7 +13652,7 @@
/// used for instance as a dummy initial value for the `List.filled`
/// constructor.
final RedirectingFactoryConstructor dummyRedirectingFactoryConstructor =
- new RedirectingFactoryConstructor(null);
+ new RedirectingFactoryConstructor(null, name: dummyName);
/// Non-nullable [Typedef] dummy value.
///
diff --git a/pkg/kernel/lib/binary/ast_from_binary.dart b/pkg/kernel/lib/binary/ast_from_binary.dart
index 2172314..7c1de52 100644
--- a/pkg/kernel/lib/binary/ast_from_binary.dart
+++ b/pkg/kernel/lib/binary/ast_from_binary.dart
@@ -1443,19 +1443,19 @@
if (alwaysCreateNewNamedNodes) {
node = null;
}
- if (node == null) {
- if (setterReference != null) {
- node = new Field.mutable(null,
- getterReference: getterReference, setterReference: setterReference);
- } else {
- node = new Field.immutable(null, getterReference: getterReference);
- }
- }
Uri? fileUri = readUriReference();
int fileOffset = readOffset();
int fileEndOffset = readOffset();
int flags = readUInt30();
Name name = readName();
+ if (node == null) {
+ if (setterReference != null) {
+ node = new Field.mutable(name,
+ getterReference: getterReference, setterReference: setterReference);
+ } else {
+ node = new Field.immutable(name, getterReference: getterReference);
+ }
+ }
List<Expression> annotations = readAnnotationList(node);
assert(() {
debugPath.add(name.text);
@@ -1487,15 +1487,15 @@
if (alwaysCreateNewNamedNodes) {
node = null;
}
- if (node == null) {
- node = new Constructor(null, reference: reference);
- }
Uri? fileUri = readUriReference();
int startFileOffset = readOffset();
int fileOffset = readOffset();
int fileEndOffset = readOffset();
int flags = readByte();
Name name = readName();
+ if (node == null) {
+ node = new Constructor(null, reference: reference, name: name);
+ }
List<Expression> annotations = readAnnotationList(node);
assert(() {
debugPath.add(name.text);
@@ -1536,13 +1536,13 @@
int kindIndex = readByte();
ProcedureKind kind = ProcedureKind.values[kindIndex];
ProcedureStubKind stubKind = ProcedureStubKind.values[readByte()];
+ int flags = readUInt30();
+ Name name = readName();
if (node == null) {
- node = new Procedure(null, kind, null, reference: reference);
+ node = new Procedure(name, kind, null, reference: reference);
} else {
assert(node.kind == kind);
}
- int flags = readUInt30();
- Name name = readName();
List<Expression> annotations = readAnnotationList(node);
assert(() {
debugPath.add(name.text);
@@ -1589,14 +1589,15 @@
if (alwaysCreateNewNamedNodes) {
node = null;
}
- if (node == null) {
- node = new RedirectingFactoryConstructor(null, reference: reference);
- }
Uri? fileUri = readUriReference();
int fileOffset = readOffset();
int fileEndOffset = readOffset();
int flags = readByte();
Name name = readName();
+ if (node == null) {
+ node = new RedirectingFactoryConstructor(null,
+ reference: reference, name: name);
+ }
List<Expression> annotations = readAnnotationList(node);
assert(() {
debugPath.add(name.text);
diff --git a/pkg/kernel/lib/binary/ast_to_binary.dart b/pkg/kernel/lib/binary/ast_to_binary.dart
index 33f0f3e..5652534 100644
--- a/pkg/kernel/lib/binary/ast_to_binary.dart
+++ b/pkg/kernel/lib/binary/ast_to_binary.dart
@@ -1192,8 +1192,6 @@
_currentlyInNonimplementation = false;
}
- static final Name _emptyName = new Name('');
-
@override
void visitConstructor(Constructor node) {
if (node.reference.canonicalName == null) {
@@ -1208,7 +1206,7 @@
writeOffset(node.fileEndOffset);
writeByte(node.flags);
- writeName(node.name ?? _emptyName);
+ writeName(node.name);
writeAnnotationList(node.annotations);
assert(node.function!.typeParameters.isEmpty);
@@ -1272,7 +1270,7 @@
writeByte(node.kind.index);
writeByte(node.stubKind.index);
writeUInt30(node.flags);
- writeName(node.name ?? _emptyName);
+ writeName(node.name);
writeAnnotationList(node.annotations);
writeNullAllowedReference(node.stubTargetReference);
writeOptionalFunctionNode(node.function);
@@ -1334,7 +1332,7 @@
writeOffset(node.fileOffset);
writeOffset(node.fileEndOffset);
writeUInt30(node.flags);
- writeName(node.name!);
+ writeName(node.name);
writeAnnotationList(node.annotations);
writeNode(node.type);
writeOptionalNode(node.initializer);
@@ -1356,7 +1354,7 @@
writeOffset(node.fileOffset);
writeOffset(node.fileEndOffset);
writeByte(node.flags);
- writeName(node.name!);
+ writeName(node.name);
writeAnnotationList(node.annotations);
writeNonNullReference(node.targetReference!);
diff --git a/pkg/kernel/lib/canonical_name.dart b/pkg/kernel/lib/canonical_name.dart
index 086aa2a..21eb6b3 100644
--- a/pkg/kernel/lib/canonical_name.dart
+++ b/pkg/kernel/lib/canonical_name.dart
@@ -133,26 +133,26 @@
CanonicalName getChildFromProcedure(Procedure procedure) {
return getChild(getProcedureQualifier(procedure))
- .getChildFromQualifiedName(procedure.name!);
+ .getChildFromQualifiedName(procedure.name);
}
CanonicalName getChildFromField(Field field) {
- return getChild('@getters').getChildFromQualifiedName(field.name!);
+ return getChild('@getters').getChildFromQualifiedName(field.name);
}
CanonicalName getChildFromFieldSetter(Field field) {
- return getChild('@setters').getChildFromQualifiedName(field.name!);
+ return getChild('@setters').getChildFromQualifiedName(field.name);
}
CanonicalName getChildFromConstructor(Constructor constructor) {
return getChild('@constructors')
- .getChildFromQualifiedName(constructor.name!);
+ .getChildFromQualifiedName(constructor.name);
}
CanonicalName getChildFromRedirectingFactoryConstructor(
RedirectingFactoryConstructor redirectingFactoryConstructor) {
return getChild('@factories')
- .getChildFromQualifiedName(redirectingFactoryConstructor.name!);
+ .getChildFromQualifiedName(redirectingFactoryConstructor.name);
}
CanonicalName getChildFromFieldWithName(Name name) {
diff --git a/pkg/kernel/lib/class_hierarchy.dart b/pkg/kernel/lib/class_hierarchy.dart
index 0c6e3f3..09d259d 100644
--- a/pkg/kernel/lib/class_hierarchy.dart
+++ b/pkg/kernel/lib/class_hierarchy.dart
@@ -282,7 +282,7 @@
/// [getDeclaredMembers] and [getInterfaceMembers].
static int compareMembers(Member first, Member second) {
if (first == second) return 0;
- return compareNames(first.name!, second.name!);
+ return compareNames(first.name, second.name);
}
/// Compares names, using the same sort order as [getDeclaredMembers] and
@@ -328,7 +328,7 @@
while (low <= high) {
int mid = low + ((high - low) >> 1);
Member pivot = members[mid];
- int comparison = compareNames(name, pivot.name!);
+ int comparison = compareNames(name, pivot.name);
if (comparison < 0) {
high = mid - 1;
} else if (comparison > 0) {
@@ -417,7 +417,7 @@
Member? getSingleTargetForInterfaceInvocation(Member interfaceTarget,
{bool setter: false}) {
if (invalidated) throw "This data structure has been invalidated";
- Name name = interfaceTarget.name!;
+ Name name = interfaceTarget.name;
Member? target = null;
ClassSet subtypes = getSubtypesOf(interfaceTarget.enclosingClass!);
for (Class c in subtypes) {
@@ -1218,7 +1218,7 @@
setters: setters)) {
if (mixinMember is! Procedure ||
(mixinMember is Procedure && !mixinMember.isSynthetic)) {
- memberMap[mixinMember.name!] = mixinMember;
+ memberMap[mixinMember.name] = mixinMember;
}
}
}
@@ -1227,21 +1227,21 @@
if (procedure.isStatic) continue;
if (procedure.kind == ProcedureKind.Setter) {
if (setters) {
- memberMap[procedure.name!] = procedure;
+ memberMap[procedure.name] = procedure;
}
} else {
if (!setters) {
- memberMap[procedure.name!] = procedure;
+ memberMap[procedure.name] = procedure;
}
}
}
for (Field field in classNode.fields) {
if (field.isStatic) continue;
if (!setters) {
- memberMap[field.name!] = field;
+ memberMap[field.name] = field;
}
if (setters && field.hasSetter) {
- memberMap[field.name!] = field;
+ memberMap[field.name] = field;
}
}
diff --git a/pkg/kernel/lib/library_index.dart b/pkg/kernel/lib/library_index.dart
index 99ea796..6ee654d 100644
--- a/pkg/kernel/lib/library_index.dart
+++ b/pkg/kernel/lib/library_index.dart
@@ -221,14 +221,14 @@
String getDisambiguatedName(Member member) {
if (member is Procedure) {
- if (member.isGetter) return LibraryIndex.getterPrefix + member.name!.text;
- if (member.isSetter) return LibraryIndex.setterPrefix + member.name!.text;
+ if (member.isGetter) return LibraryIndex.getterPrefix + member.name.text;
+ if (member.isSetter) return LibraryIndex.setterPrefix + member.name.text;
}
- return member.name!.text;
+ return member.name.text;
}
void _addMember(Member member) {
- if (member.name!.isPrivate && member.name!.library != library) {
+ if (member.name.isPrivate && member.name.library != library) {
// Members whose name is private to other libraries cannot currently
// be found with the LibraryIndex class.
return;
@@ -254,7 +254,7 @@
final NamedNode? replacement = extensionMember.member.node;
if (replacement is! Member) return;
Member member = replacement;
- if (member.name!.isPrivate && member.name!.library != library) {
+ if (member.name.isPrivate && member.name.library != library) {
// Members whose name is private to other libraries cannot currently
// be found with the LibraryIndex class.
return;
diff --git a/pkg/kernel/lib/reference_from_index.dart b/pkg/kernel/lib/reference_from_index.dart
index bf89186..202c28a 100644
--- a/pkg/kernel/lib/reference_from_index.dart
+++ b/pkg/kernel/lib/reference_from_index.dart
@@ -46,7 +46,7 @@
}
void _addProcedure(Procedure procedure) {
- Name name = procedure.name!;
+ Name name = procedure.name;
if (procedure.isSetter) {
assert(_setterReferences[name] == null);
_setterReferences[name] = procedure.reference;
@@ -62,7 +62,7 @@
void _addFields(List<Field> fields) {
for (int i = 0; i < fields.length; i++) {
Field field = fields[i];
- Name name = field.name!;
+ Name name = field.name;
assert(_getterReferences[name] == null);
_getterReferences[name] = field.getterReference;
if (field.hasSetter) {
@@ -116,12 +116,12 @@
IndexedClass._(Class c, this.library) {
for (int i = 0; i < c.constructors.length; i++) {
Constructor constructor = c.constructors[i];
- _constructors[constructor.name!] = constructor;
+ _constructors[constructor.name] = constructor;
}
for (int i = 0; i < c.procedures.length; i++) {
Procedure procedure = c.procedures[i];
if (procedure.isFactory) {
- _constructors[procedure.name!] = procedure;
+ _constructors[procedure.name] = procedure;
} else {
_addProcedure(procedure);
}
diff --git a/pkg/kernel/lib/src/text_util.dart b/pkg/kernel/lib/src/text_util.dart
index 3c0f523f..5871066 100644
--- a/pkg/kernel/lib/src/text_util.dart
+++ b/pkg/kernel/lib/src/text_util.dart
@@ -201,8 +201,7 @@
}
String memberNameToString(Member node) {
- return node.name?.text ??
- "null-named member ${node.runtimeType} ${node.hashCode}";
+ return node.name.text;
}
String qualifiedTypeParameterNameToString(TypeParameter node,
diff --git a/pkg/kernel/lib/text/ast_to_text.dart b/pkg/kernel/lib/text/ast_to_text.dart
index 0718f76..3565196 100644
--- a/pkg/kernel/lib/text/ast_to_text.dart
+++ b/pkg/kernel/lib/text/ast_to_text.dart
@@ -120,7 +120,7 @@
}
String debugMemberName(Member node) {
- return node.name?.text ?? globalDebuggingNames.nameMember(node);
+ return node.name.text;
}
String debugQualifiedMemberName(Member node) {
@@ -367,8 +367,9 @@
static final Name emptyName = new Name(emptyNameString);
Name getMemberName(Member node) {
- if (node.name?.text == '') return emptyName;
- if (node.name != null) return node.name!;
+ if (node.name.text == '') return emptyName;
+ // ignore: unnecessary_null_comparison
+ if (node.name != null) return node.name;
return new Name(syntheticNames.nameMember(node));
}
@@ -514,11 +515,11 @@
} else if (node is Field) {
Library nodeLibrary = node.enclosingLibrary;
String prefix = syntheticNames.nameLibraryPrefix(nodeLibrary);
- write(prefix + '::' + node.name!.text);
+ write(prefix + '::' + node.name.text);
} else if (node is Procedure) {
Library nodeLibrary = node.enclosingLibrary;
String prefix = syntheticNames.nameLibraryPrefix(nodeLibrary);
- write(prefix + '::' + node.name!.text);
+ write(prefix + '::' + node.name.text);
} else if (node is Typedef) {
Library nodeLibrary = node.enclosingLibrary;
String prefix = syntheticNames.nameLibraryPrefix(nodeLibrary);
@@ -1251,8 +1252,9 @@
writeModifier(node.isConst, 'const');
writeWord('redirecting_factory');
+ // ignore: unnecessary_null_comparison
if (node.name != null) {
- writeName(node.name!);
+ writeName(node.name);
}
writeTypeParameterList(node.typeParameters);
writeParameterList(node.positionalParameters, node.namedParameters,
@@ -1655,7 +1657,7 @@
if (!first) {
writeComma();
}
- writeWord('${fieldRef.asField.name!.text}');
+ writeWord('${fieldRef.asField.name.text}');
writeSymbol(':');
writeExpression(value);
first = false;
@@ -2635,7 +2637,7 @@
writeList(node.fieldValues.entries,
(core.MapEntry<Reference, Constant> entry) {
if (entry.key.node != null) {
- writeWord('${entry.key.asField.name!.text}');
+ writeWord('${entry.key.asField.name.text}');
} else {
writeWord('${entry.key.canonicalName!.name}');
}
diff --git a/pkg/kernel/lib/text/text_serializer.dart b/pkg/kernel/lib/text/text_serializer.dart
index 86e8127..0899fe8 100644
--- a/pkg/kernel/lib/text/text_serializer.dart
+++ b/pkg/kernel/lib/text/text_serializer.dart
@@ -1967,7 +1967,7 @@
TextSerializer<Field> mutableFieldSerializer =
Wrapped<Tuple4<Name, int, DartType, Expression?>, Field>(
- (w) => Tuple4(w.name!, w.flags, w.type, w.initializer),
+ (w) => Tuple4(w.name, w.flags, w.type, w.initializer),
(u) => Field.mutable(u.first, type: u.third, initializer: u.fourth)
..flags = u.second,
Tuple4Serializer(nameSerializer, fieldFlagsSerializer,
@@ -1975,7 +1975,7 @@
TextSerializer<Field> immutableFieldSerializer =
Wrapped<Tuple4<Name, int, DartType, Expression?>, Field>(
- (w) => Tuple4(w.name!, w.flags, w.type, w.initializer),
+ (w) => Tuple4(w.name, w.flags, w.type, w.initializer),
(u) => Field.immutable(u.first, type: u.third, initializer: u.fourth)
..flags = u.second,
Tuple4Serializer(nameSerializer, fieldFlagsSerializer,
@@ -1983,7 +1983,7 @@
TextSerializer<Procedure> methodSerializer =
Wrapped<Tuple3<Name, int, FunctionNode>, Procedure>(
- (w) => Tuple3(w.name!, w.flags, w.function!),
+ (w) => Tuple3(w.name, w.flags, w.function!),
(u) =>
Procedure(u.first, ProcedureKind.Method, u.third)..flags = u.second,
Tuple3Serializer(
@@ -1991,7 +1991,7 @@
TextSerializer<Procedure> getterSerializer =
Wrapped<Tuple3<Name, int, FunctionNode>, Procedure>(
- (w) => Tuple3(w.name!, w.flags, w.function!),
+ (w) => Tuple3(w.name, w.flags, w.function!),
(u) =>
Procedure(u.first, ProcedureKind.Getter, u.third)..flags = u.second,
Tuple3Serializer(
@@ -1999,7 +1999,7 @@
TextSerializer<Procedure> setterSerializer =
Wrapped<Tuple3<Name, int, FunctionNode>, Procedure>(
- (w) => Tuple3(w.name!, w.flags, w.function!),
+ (w) => Tuple3(w.name, w.flags, w.function!),
(u) =>
Procedure(u.first, ProcedureKind.Setter, u.third)..flags = u.second,
Tuple3Serializer(
@@ -2007,7 +2007,7 @@
TextSerializer<Procedure> operatorSerializer =
Wrapped<Tuple3<Name, int, FunctionNode>, Procedure>(
- (w) => Tuple3(w.name!, w.flags, w.function!),
+ (w) => Tuple3(w.name, w.flags, w.function!),
(u) => Procedure(u.first, ProcedureKind.Operator, u.third)
..flags = u.second,
Tuple3Serializer(
@@ -2015,7 +2015,7 @@
TextSerializer<Procedure> factorySerializer =
Wrapped<Tuple3<Name, int, FunctionNode>, Procedure>(
- (w) => Tuple3(w.name!, w.flags, w.function!),
+ (w) => Tuple3(w.name, w.flags, w.function!),
(u) => Procedure(u.first, ProcedureKind.Factory, u.third)
..flags = u.second,
Tuple3Serializer(
@@ -2024,7 +2024,7 @@
TextSerializer<Constructor> constructorSerializer = Wrapped<
Tuple3<Name, int, Tuple2<FunctionNode, List<Initializer>?>>,
Constructor>(
- (w) => Tuple3(w.name!, w.flags, Tuple2(w.function!, w.initializers)),
+ (w) => Tuple3(w.name, w.flags, Tuple2(w.function!, w.initializers)),
(u) =>
Constructor(u.third.first, name: u.first, initializers: u.third.second)
..flags = u.second,
@@ -2043,7 +2043,7 @@
List<VariableDeclaration>, List<DartType>>>>,
RedirectingFactoryConstructor>(
(w) => Tuple4(
- w.name!,
+ w.name,
w.flags,
w.targetReference!.canonicalName!,
Tuple2(
diff --git a/pkg/kernel/lib/transformations/mixin_full_resolution.dart b/pkg/kernel/lib/transformations/mixin_full_resolution.dart
index c808cf3..b1a72a8 100644
--- a/pkg/kernel/lib/transformations/mixin_full_resolution.dart
+++ b/pkg/kernel/lib/transformations/mixin_full_resolution.dart
@@ -113,17 +113,17 @@
var setters = <Name, Procedure>{};
for (var procedure in class_.procedures) {
if (procedure.isSetter) {
- setters[procedure.name!] = procedure;
+ setters[procedure.name] = procedure;
} else {
- nonSetters[procedure.name!] = procedure;
+ nonSetters[procedure.name] = procedure;
}
}
for (var field in class_.mixin.fields) {
Reference? getterReference =
- indexedClass?.lookupGetterReference(field.name!);
+ indexedClass?.lookupGetterReference(field.name);
Reference? setterReference =
- indexedClass?.lookupSetterReference(field.name!);
+ indexedClass?.lookupSetterReference(field.name);
if (getterReference == null) {
getterReference = nonSetters[field.name]?.reference;
getterReference?.canonicalName?.unbind();
@@ -134,7 +134,7 @@
}
Field clone =
cloner.cloneField(field, getterReference, setterReference);
- Procedure? setter = setters[field.name!];
+ Procedure? setter = setters[field.name];
if (setter != null) {
setters.remove(field.name);
VariableDeclaration parameter =
@@ -169,9 +169,9 @@
Reference? reference;
if (procedure.isSetter) {
- reference = indexedClass?.lookupSetterReference(procedure.name!);
+ reference = indexedClass?.lookupSetterReference(procedure.name);
} else {
- reference = indexedClass?.lookupGetterReference(procedure.name!);
+ reference = indexedClass?.lookupGetterReference(procedure.name);
}
// Linear search for a forwarding stub with the same name.
diff --git a/pkg/kernel/lib/transformations/track_widget_constructor_locations.dart b/pkg/kernel/lib/transformations/track_widget_constructor_locations.dart
index 2d301ed..7e81c8d 100644
--- a/pkg/kernel/lib/transformations/track_widget_constructor_locations.dart
+++ b/pkg/kernel/lib/transformations/track_widget_constructor_locations.dart
@@ -369,7 +369,7 @@
void _transformClassImplementingWidget(
Class clazz, ChangedStructureNotifier? changedStructureNotifier) {
if (clazz.fields
- .any((Field field) => field.name!.text == _locationFieldName)) {
+ .any((Field field) => field.name.text == _locationFieldName)) {
// This class has already been transformed. Skip
return;
}
diff --git a/pkg/kernel/lib/type_environment.dart b/pkg/kernel/lib/type_environment.dart
index c8789ae..f0b4795 100644
--- a/pkg/kernel/lib/type_environment.dart
+++ b/pkg/kernel/lib/type_environment.dart
@@ -152,7 +152,7 @@
if (class_ == coreTypes.intClass ||
class_ == coreTypes.numClass ||
class_ == coreTypes.doubleClass) {
- String name = member.name!.text;
+ String name = member.name.text;
return name == '+' ||
name == '-' ||
name == '*' ||
@@ -162,7 +162,7 @@
} else {
Class? class_ = member.enclosingClass;
if (class_ == coreTypes.intClass || class_ == coreTypes.numClass) {
- String name = member.name!.text;
+ String name = member.name.text;
return name == '+' ||
name == '-' ||
name == '*' ||
@@ -180,7 +180,7 @@
if (isNonNullableByDefault) {
Class? class_ = member.enclosingClass;
if (class_ == coreTypes.intClass || class_ == coreTypes.numClass) {
- String name = member.name!.text;
+ String name = member.name.text;
return name == 'clamp';
}
}
diff --git a/pkg/kernel/lib/verifier.dart b/pkg/kernel/lib/verifier.dart
index 4ecf6ce..a263a04 100644
--- a/pkg/kernel/lib/verifier.dart
+++ b/pkg/kernel/lib/verifier.dart
@@ -283,11 +283,11 @@
TreeNode? oldParent = enterParent(node);
bool isTopLevel = node.parent == currentLibrary;
if (isTopLevel && !node.isStatic) {
- problem(node, "The top-level field '${node.name!.text}' should be static",
+ problem(node, "The top-level field '${node.name.text}' should be static",
context: node);
}
if (node.isConst && !node.isStatic) {
- problem(node, "The const field '${node.name!.text}' should be static",
+ problem(node, "The const field '${node.name.text}' should be static",
context: node);
}
bool isImmutable = node.isLate
@@ -296,7 +296,7 @@
if (isImmutable == node.hasSetter) {
if (node.hasSetter) {
problem(node,
- "The immutable field '${node.name!.text}' has a setter reference",
+ "The immutable field '${node.name.text}' has a setter reference",
context: node);
} else {
if (isOutline && node.isLate) {
@@ -306,7 +306,7 @@
// whether it has an initializer or not.
} else {
problem(node,
- "The mutable field '${node.name!.text}' has no setter reference",
+ "The mutable field '${node.name.text}' has no setter reference",
context: node);
}
}
diff --git a/tests/co19/co19-co19.status b/tests/co19/co19-co19.status
index d66d5fd..1bd0386 100644
--- a/tests/co19/co19-co19.status
+++ b/tests/co19/co19-co19.status
@@ -2,5 +2,4 @@
# 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.
-LibTest/ffi/Array/PointerArray_A01_t01: Skip # https://github.com/dart-lang/co19/issues/1018
LibTest/io/RawDatagramSocket/*: Skip # https://github.com/dart-lang/co19/issues/195
diff --git a/tests/co19/co19-dart2js.status b/tests/co19/co19-dart2js.status
index cab4c50..0097562 100644
--- a/tests/co19/co19-dart2js.status
+++ b/tests/co19/co19-dart2js.status
@@ -8,7 +8,7 @@
Language/Expressions/Constants/literal_number_t01: SkipByDesign # uses integer literal not representable as JavaScript number
Language/Expressions/Constants/math_operators_t01: SkipByDesign # uses integer literal not representable as JavaScript number
Language/Expressions/Constants/math_operators_t06: SkipByDesign # uses integer literal not representable as JavaScript number
-Language/Expressions/Null/instance_of_class_null_t01: Skip # dart:mirrors not supported https://github.com/dart-lang/co19/issues/522.
+Language/Expressions/Null/instance_of_class_null_t01: SkipByDesign # dart:mirrors not supported https://github.com/dart-lang/co19/issues/522.
Language/Expressions/Numbers/integer_size_t03: SkipByDesign # uses integer literal not representable as JavaScript number
Language/Expressions/Numbers/static_type_of_int_t01: SkipByDesign # uses integer literal not representable as JavaScript number
Language/Expressions/Numbers/syntax_t06: SkipByDesign # uses integer literal not representable as JavaScript number
@@ -16,13 +16,13 @@
Language/Expressions/Object_Identity/object_t02: SkipByDesign # https://github.com/dart-lang/sdk/issues/42222#issuecomment-640431711
Language/Expressions/Shift/integer_t06: SkipByDesign # uses integer literal not representable as JavaScript number
Language/Expressions/Shift/integer_t07: SkipByDesign # uses integer literal not representable as JavaScript number
-Language/Expressions/Spawning_an_Isolate/new_isolate_t01: SkipByDesign
+Language/Expressions/Spawning_an_Isolate/new_isolate_t01: SkipByDesign # dart:isolate not supported.
Language/Functions/External_Functions/not_connected_to_a_body_t01: SkipByDesign # Non-JS-interop external members are not supported
Language/Libraries_and_Scripts/Scripts/main_optional_parameters_t01: SkipByDesign # https://github.com/dart-lang/co19/issues/952
Language/Libraries_and_Scripts/Scripts/main_optional_parameters_t03: SkipByDesign # https://github.com/dart-lang/co19/issues/952
Language/Libraries_and_Scripts/Scripts/top_level_syntax_t01: SkipByDesign # Non-JS-interop external members are not supported
Language/Libraries_and_Scripts/top_level_syntax_t01: SkipByDesign # Non-JS-interop external members are not supported
-Language/Metadata/before*: Skip # dart:mirrors not supported https://github.com/dart-lang/co19/issues/523.
+Language/Metadata/before*: SkipByDesign # dart:mirrors not supported https://github.com/dart-lang/co19/issues/523.
Language/Metadata/syntax_t10: SkipByDesign # dart:mirrors is not supported
Language/Reference/Operator_Precedence/precedence_15_unary_prefix_t08: SkipByDesign # binary '~' produces different results in JavaScript and Dart
LanguageFeatures/Abstract-external-fields/static_analysis_external_A01_t01: SkipByDesign # Non-JS-interop external members are not supported
@@ -51,7 +51,7 @@
LibTest/core/DateTime/to8601String_A01_t03: SkipByDesign # microseconds are not supported in JavaScript
LibTest/core/int/operator_remainder_A01_t03: SkipByDesign # Division by zero is not an error in JavaScript
LibTest/core/int/operator_truncating_division_A01_t02: SkipByDesign # Division by zero is not an error in JavaScript
-LibTest/core/int/parse_A01_t02: SkipByDesign # big integers cannot be represented in JavaScript
+LibTest/core/int/parse_A01_t02: SkipByDesign # uses integer literal not representable as JavaScript number
LibTest/core/int/remainder_A01_t03: SkipByDesign # Division by zero is not an error in JavaScript
LibTest/ffi/*: SkipByDesign # dart:ffi is not supported
LibTest/html/HttpRequest/responseText_A01_t02: Skip # https://github.com/dart-lang/co19/issues/932
@@ -60,21 +60,21 @@
LibTest/isolate/*: SkipByDesign # dart:isolate not supported.
LibTest/mirrors/*: SkipByDesign # dart:mirrors is not supported
LibTest/typed_data/ByteBuffer/*: SkipByDesign # not supported on the web
-LibTest/typed_data/ByteData/getInt64_A01_t01: Skip # Big integers cannot be represented in JS
-LibTest/typed_data/ByteData/getInt64_A02_t01: Skip # Int64 accessor not supported by dart2js
-LibTest/typed_data/ByteData/getInt64_A02_t02: Skip # Int64 accessor not supported by dart2js
-LibTest/typed_data/ByteData/getUint64_A01_t01: Skip # Big integers cannot be represented in JS
-LibTest/typed_data/ByteData/getUint64_A02_t01: Skip # Int64 accessor not supported by dart2js
-LibTest/typed_data/ByteData/getUint64_A02_t02: Skip # Int64 accessor not supported by dart2js
-LibTest/typed_data/ByteData/setInt64_A01_t01: Skip # Big integers cannot be represented in JS
-LibTest/typed_data/ByteData/setInt64_A02_t01: Skip # Int64 accessor not supported by dart2js
-LibTest/typed_data/ByteData/setInt64_A02_t02: Skip # Int64 accessor not supported by dart2js
-LibTest/typed_data/ByteData/setUint64_A01_t01: Skip # Big integers cannot be represented in JS
-LibTest/typed_data/ByteData/setUint64_A02_t01: Skip # Uint64 accessor not supported by dart2js
-LibTest/typed_data/ByteData/setUint64_A02_t02: Skip # Uint64 accessor not supported by dart2js
-LibTest/typed_data/Int32x4/operator_OR_A01_t01: Skip # Bitwise operations in JS are unsigned.
-LibTest/typed_data/Int32x4List/join_A01_t01: Skip # Differen string represrntation on VM and in JS
-LibTest/typed_data/Int32x4List/join_A01_t02: Skip # Differen string represrntation on VM and in JS
+LibTest/typed_data/ByteData/getInt64_A01_t01: SkipByDesign # uses integer literal not representable as JavaScript number
+LibTest/typed_data/ByteData/getInt64_A02_t01: SkipByDesign # Int64 accessor not supported by dart2js
+LibTest/typed_data/ByteData/getInt64_A02_t02: SkipByDesign # Int64 accessor not supported by dart2js
+LibTest/typed_data/ByteData/getUint64_A01_t01: SkipByDesign # uses integer literal not representable as JavaScript number
+LibTest/typed_data/ByteData/getUint64_A02_t01: SkipByDesign # Int64 accessor not supported by dart2js
+LibTest/typed_data/ByteData/getUint64_A02_t02: SkipByDesign # Int64 accessor not supported by dart2js
+LibTest/typed_data/ByteData/setInt64_A01_t01: SkipByDesign # uses integer literal not representable as JavaScript number
+LibTest/typed_data/ByteData/setInt64_A02_t01: SkipByDesign # Int64 accessor not supported by dart2js
+LibTest/typed_data/ByteData/setInt64_A02_t02: SkipByDesign # Int64 accessor not supported by dart2js
+LibTest/typed_data/ByteData/setUint64_A01_t01: SkipByDesign # uses integer literal not representable as JavaScript number
+LibTest/typed_data/ByteData/setUint64_A02_t01: SkipByDesign # Uint64 accessor not supported by dart2js
+LibTest/typed_data/ByteData/setUint64_A02_t02: SkipByDesign # Uint64 accessor not supported by dart2js
+LibTest/typed_data/Int32x4/operator_OR_A01_t01: SkipByDesign # Bitwise operations in JS are unsigned.
+LibTest/typed_data/Int32x4List/join_A01_t01: SkipByDesign # Different string represrntation on VM and in JS
+LibTest/typed_data/Int32x4List/join_A01_t02: SkipByDesign # Different string represrntation on VM and in JS
LibTest/typed_data/Int64List/*: SkipByDesign # Int64List not supported on the web
LibTest/typed_data/Uint64List/*: SkipByDesign # Uint64List not supported on the web
diff --git a/tests/co19/co19-dartdevc.status b/tests/co19/co19-dartdevc.status
index f326b5f..d97af6e 100644
--- a/tests/co19/co19-dartdevc.status
+++ b/tests/co19/co19-dartdevc.status
@@ -3,63 +3,63 @@
# BSD-style license that can be found in the LICENSE file.
[ $compiler == dartdevc || $compiler == dartdevk ]
-Language/Classes/Constructors/Generative_Constructors/formal_parameter_t07: Skip # Times out
-Language/Classes/Constructors/Generative_Constructors/fresh_instance_t01: Skip # Times out
-Language/Classes/Constructors/Generative_Constructors/implicit_superinitializer_t01: Skip # Times out
-Language/Classes/Constructors/Generative_Constructors/implicit_superinitializer_t02: Skip # Times out
-Language/Classes/Constructors/Generative_Constructors/initializers_t01: Skip # Times out
-Language/Classes/Constructors/Generative_Constructors/initializers_t15: Skip # Times out
-Language/Classes/Constructors/Generative_Constructors/initializing_formals_execution_t01: Skip # Times out
-Language/Classes/Constructors/Generative_Constructors/initializing_this_t01: Skip # Times out
-Language/Classes/Constructors/Generative_Constructors/redirection_t01: Skip # Times out
-Language/Classes/Constructors/Generative_Constructors/syntax_t01: Skip # Times out
-Language/Classes/Constructors/implicit_constructor_t01: Skip # Times out
-Language/Classes/Constructors/implicit_constructor_t02: Skip # Times out
-Language/Classes/Constructors/name_t01: Skip # Times out
-Language/Classes/Constructors/name_t02: Skip # Times out
-Language/Classes/Constructors/name_t03: Skip # Times out
-Language/Classes/Getters/instance_getter_t01: Skip # Times out
-Language/Classes/Getters/instance_getter_t02: Skip # Times out
-Language/Classes/Getters/instance_getter_t03: Skip # Times out
-Language/Classes/Getters/instance_getter_t04: Skip # Times out
-Language/Classes/Getters/instance_getter_t05: Skip # Times out
-Language/Classes/Getters/instance_getter_t06: Skip # Times out
-Language/Classes/Getters/override_t04: Skip # Times out
-Language/Classes/Getters/return_type_t01: Skip # Times out
-Language/Classes/Getters/static_t01/none: Skip # Times out
-Language/Classes/Getters/static_t02: Skip # Times out
-Language/Classes/Getters/syntax_t01: Skip # Times out
-Language/Classes/Getters/void_return_type_t01: Skip # Times out
-Language/Classes/Instance_Methods/Operators/allowed_names_t01: Skip # Times out
-Language/Classes/Instance_Methods/Operators/arity_0_or_1_t01: Skip # Times out
-Language/Classes/Instance_Methods/Operators/arity_0_t01: Skip # Times out
-Language/Classes/Instance_Methods/Operators/syntax_t01: Skip # Times out
-Language/Classes/Instance_Methods/Operators/syntax_t03: Skip # Times out
-Language/Classes/Instance_Methods/override_named_parameters_t03: Skip # Times out
-Language/Classes/Instance_Methods/override_named_parameters_t04: Skip # Times out
-Language/Classes/Instance_Methods/override_named_parameters_t06: Skip # Times out
-Language/Classes/Instance_Methods/override_subtype_t05: Skip # Times out
-Language/Classes/Instance_Methods/override_subtype_t06: Skip # Times out
-Language/Classes/Instance_Methods/same_name_static_member_in_superclass_t01: Skip # Times out
-Language/Classes/Instance_Methods/same_name_static_member_in_superclass_t02: Skip # Times out
-Language/Classes/Instance_Methods/same_name_static_member_in_superclass_t04: Skip # Times out
-Language/Classes/Instance_Methods/same_name_static_member_in_superclass_t05: Skip # Times out
-Language/Classes/Instance_Methods/same_name_static_member_in_superclass_t06: Skip # Times out
-Language/Classes/Instance_Methods/same_name_static_member_in_superclass_t07: Skip # Times out
-Language/Classes/Instance_Methods/same_name_static_member_in_superclass_t08: Skip # Times out
-Language/Classes/Instance_Methods/same_name_static_member_in_superclass_t09: Skip # Times out
-Language/Classes/Instance_Variables/definition_t01: Skip # Times out
-Language/Classes/Instance_Variables/definition_t02: Skip # Times out
-Language/Classes/Instance_Variables/definition_t04: Skip # Times out
-Language/Classes/Setters/instance_setter_t01: Skip # Times out
+Language/Classes/Constructors/Generative_Constructors/formal_parameter_t07: SkipSlow
+Language/Classes/Constructors/Generative_Constructors/fresh_instance_t01: SkipSlow
+Language/Classes/Constructors/Generative_Constructors/implicit_superinitializer_t01: SkipSlow
+Language/Classes/Constructors/Generative_Constructors/implicit_superinitializer_t02: SkipSlow
+Language/Classes/Constructors/Generative_Constructors/initializers_t01: SkipSlow
+Language/Classes/Constructors/Generative_Constructors/initializers_t15: SkipSlow
+Language/Classes/Constructors/Generative_Constructors/initializing_formals_execution_t01: SkipSlow
+Language/Classes/Constructors/Generative_Constructors/initializing_this_t01: SkipSlow
+Language/Classes/Constructors/Generative_Constructors/redirection_t01: SkipSlow
+Language/Classes/Constructors/Generative_Constructors/syntax_t01: SkipSlow
+Language/Classes/Constructors/implicit_constructor_t01: SkipSlow
+Language/Classes/Constructors/implicit_constructor_t02: SkipSlow
+Language/Classes/Constructors/name_t01: SkipSlow
+Language/Classes/Constructors/name_t02: SkipSlow
+Language/Classes/Constructors/name_t03: SkipSlow
+Language/Classes/Getters/instance_getter_t01: SkipSlow
+Language/Classes/Getters/instance_getter_t02: SkipSlow
+Language/Classes/Getters/instance_getter_t03: SkipSlow
+Language/Classes/Getters/instance_getter_t04: SkipSlow
+Language/Classes/Getters/instance_getter_t05: SkipSlow
+Language/Classes/Getters/instance_getter_t06: SkipSlow
+Language/Classes/Getters/override_t04: SkipSlow
+Language/Classes/Getters/return_type_t01: SkipSlow
+Language/Classes/Getters/static_t01/none: SkipSlow
+Language/Classes/Getters/static_t02: SkipSlow
+Language/Classes/Getters/syntax_t01: SkipSlow
+Language/Classes/Getters/void_return_type_t01: SkipSlow
+Language/Classes/Instance_Methods/Operators/allowed_names_t01: SkipSlow
+Language/Classes/Instance_Methods/Operators/arity_0_or_1_t01: SkipSlow
+Language/Classes/Instance_Methods/Operators/arity_0_t01: SkipSlow
+Language/Classes/Instance_Methods/Operators/syntax_t01: SkipSlow
+Language/Classes/Instance_Methods/Operators/syntax_t03: SkipSlow
+Language/Classes/Instance_Methods/override_named_parameters_t03: SkipSlow
+Language/Classes/Instance_Methods/override_named_parameters_t04: SkipSlow
+Language/Classes/Instance_Methods/override_named_parameters_t06: SkipSlow
+Language/Classes/Instance_Methods/override_subtype_t05: SkipSlow
+Language/Classes/Instance_Methods/override_subtype_t06: SkipSlow
+Language/Classes/Instance_Methods/same_name_static_member_in_superclass_t01: SkipSlow
+Language/Classes/Instance_Methods/same_name_static_member_in_superclass_t02: SkipSlow
+Language/Classes/Instance_Methods/same_name_static_member_in_superclass_t04: SkipSlow
+Language/Classes/Instance_Methods/same_name_static_member_in_superclass_t05: SkipSlow
+Language/Classes/Instance_Methods/same_name_static_member_in_superclass_t06: SkipSlow
+Language/Classes/Instance_Methods/same_name_static_member_in_superclass_t07: SkipSlow
+Language/Classes/Instance_Methods/same_name_static_member_in_superclass_t08: SkipSlow
+Language/Classes/Instance_Methods/same_name_static_member_in_superclass_t09: SkipSlow
+Language/Classes/Instance_Variables/definition_t01: SkipSlow
+Language/Classes/Instance_Variables/definition_t02: SkipSlow
+Language/Classes/Instance_Variables/definition_t04: SkipSlow
+Language/Classes/Setters/instance_setter_t01: SkipSlow
Language/Expressions/Constants/integer_size_t03: SkipByDesign # uses integer literal not representable as JavaScript number
Language/Expressions/Constants/integer_size_t04: SkipByDesign # uses integer literal not representable as JavaScript number
Language/Expressions/Constants/literal_number_t01: SkipByDesign # uses integer literal not representable as JavaScript number
Language/Expressions/Constants/math_operators_t01: SkipByDesign # uses integer literal not representable as JavaScript number
Language/Expressions/Constants/math_operators_t06: SkipByDesign # uses integer literal not representable as JavaScript number
-Language/Expressions/Function_Invocation/async_generator_invokation_t08: Skip # Times out
-Language/Expressions/Function_Invocation/async_generator_invokation_t10: Skip # Times out
-Language/Expressions/Null/instance_of_class_null_t01: Skip # dart:mirrors not supported https://github.com/dart-lang/co19/issues/522.
+Language/Expressions/Function_Invocation/async_generator_invokation_t08: SkipSlow
+Language/Expressions/Function_Invocation/async_generator_invokation_t10: SkipSlow
+Language/Expressions/Null/instance_of_class_null_t01: SkipByDesign # dart:mirrors not supported https://github.com/dart-lang/co19/issues/522
Language/Expressions/Numbers/integer_size_t03: SkipByDesign # uses integer literal not representable as JavaScript number
Language/Expressions/Numbers/static_type_of_int_t01: SkipByDesign # uses integer literal not representable as JavaScript number
Language/Expressions/Numbers/syntax_t06: SkipByDesign # uses integer literal not representable as JavaScript number
@@ -71,11 +71,11 @@
Language/Functions/External_Functions/not_connected_to_a_body_t01: SkipByDesign # External variables are not supported
Language/Libraries_and_Scripts/Scripts/top_level_syntax_t01: SkipByDesign # External variables are not supported
Language/Libraries_and_Scripts/top_level_syntax_t01: SkipByDesign # External variables are not supported
-Language/Metadata/before*: Skip # dart:mirrors not supported https://github.com/dart-lang/co19/issues/523.
+Language/Metadata/before*: SkipByDesign # dart:mirrors not supported https://github.com/dart-lang/co19/issues/523
Language/Metadata/syntax_t10: SkipByDesign # dart:mirrors is not supported
Language/Reference/Operator_Precedence/precedence_15_unary_prefix_t08: SkipByDesign # binary '~' produces different results in JavaScript and Dart
-Language/Types/Interface_Types/subtype_t27: Skip # Times out
-Language/Types/Interface_Types/subtype_t28: Skip # Times out
+Language/Types/Interface_Types/subtype_t27: SkipSlow
+Language/Types/Interface_Types/subtype_t28: SkipSlow
LanguageFeatures/Abstract-external-fields/static_analysis_external_A01_t01: SkipByDesign # External variables are not supported
LanguageFeatures/Abstract-external-fields/static_analysis_external_A01_t02: SkipByDesign # External variables are not supported
LanguageFeatures/Abstract-external-fields/static_analysis_external_A01_t03: SkipByDesign # External variables are not supported
@@ -105,30 +105,30 @@
LibTest/core/int/parse_A01_t02: SkipByDesign # big integers cannot be represented in JavaScript
LibTest/core/int/remainder_A01_t03: SkipByDesign # Division by zero is not an error in JavaScript
LibTest/ffi/*: SkipByDesign # dart:ffi is not supported
-LibTest/html/Element/blur_A01_t01: Skip # Times out
-LibTest/html/Element/focus_A01_t01: Skip # Times out
+LibTest/html/Element/blur_A01_t01: SkipSlow
+LibTest/html/Element/focus_A01_t01: SkipSlow
LibTest/html/HttpRequest/responseText_A01_t02: Skip # https://github.com/dart-lang/co19/issues/932
LibTest/html/HttpRequestUpload/*: Skip # https://github.com/dart-lang/co19/issues/932
-LibTest/html/IFrameElement/blur_A01_t01: Skip # Times out
-LibTest/html/IFrameElement/focus_A01_t01: Skip # Times out
+LibTest/html/IFrameElement/blur_A01_t01: SkipSlow
+LibTest/html/IFrameElement/focus_A01_t01: SkipSlow
LibTest/io/*: SkipByDesign # dart:io not supported.
LibTest/isolate/*: SkipByDesign # dart:isolate not supported.
LibTest/mirrors/*: SkipByDesign # dart:mirrors is not supported
LibTest/typed_data/ByteBuffer/*: SkipByDesign # not supported on the web
-LibTest/typed_data/ByteData/getInt64_A01_t01: Skip # Big integers cannot be represented in JS
-LibTest/typed_data/ByteData/getInt64_A02_t01: Skip # Int64 accessor not supported by dart2js
-LibTest/typed_data/ByteData/getInt64_A02_t02: Skip # Int64 accessor not supported by dart2js
-LibTest/typed_data/ByteData/getUint64_A01_t01: Skip # Big integers cannot be represented in JS
-LibTest/typed_data/ByteData/getUint64_A02_t01: Skip # Int64 accessor not supported by dart2js
-LibTest/typed_data/ByteData/getUint64_A02_t02: Skip # Int64 accessor not supported by dart2js
-LibTest/typed_data/ByteData/setInt64_A01_t01: Skip # Big integers cannot be represented in JS
-LibTest/typed_data/ByteData/setInt64_A02_t01: Skip # Int64 accessor not supported by dart2js
-LibTest/typed_data/ByteData/setInt64_A02_t02: Skip # Int64 accessor not supported by dart2js
-LibTest/typed_data/ByteData/setUint64_A01_t01: Skip # Big integers cannot be represented in JS
-LibTest/typed_data/ByteData/setUint64_A02_t01: Skip # Uint64 accessor not supported by dart2js
-LibTest/typed_data/ByteData/setUint64_A02_t02: Skip # Uint64 accessor not supported by dart2js
-LibTest/typed_data/Int32x4/operator_OR_A01_t01: Skip # Bitwise operations in JS are unsigned.
-LibTest/typed_data/Int32x4List/join_A01_t01: Skip # Differen string represrntation on VM and in JS
-LibTest/typed_data/Int32x4List/join_A01_t02: Skip # Differen string represrntation on VM and in JS
+LibTest/typed_data/ByteData/getInt64_A01_t01: SkipByDesign # uses integer literal not representable as JavaScript number
+LibTest/typed_data/ByteData/getInt64_A02_t01: SkipByDesign # Int64 accessor not supported by dart2js
+LibTest/typed_data/ByteData/getInt64_A02_t02: SkipByDesign # Int64 accessor not supported by dart2js
+LibTest/typed_data/ByteData/getUint64_A01_t01: SkipByDesign # uses integer literal not representable as JavaScript number
+LibTest/typed_data/ByteData/getUint64_A02_t01: SkipByDesign # Int64 accessor not supported by dart2js
+LibTest/typed_data/ByteData/getUint64_A02_t02: SkipByDesign # Int64 accessor not supported by dart2js
+LibTest/typed_data/ByteData/setInt64_A01_t01: SkipByDesign # Buses integer literal not representable as JavaScript number
+LibTest/typed_data/ByteData/setInt64_A02_t01: SkipByDesign # Int64 accessor not supported by dart2js
+LibTest/typed_data/ByteData/setInt64_A02_t02: SkipByDesign # Int64 accessor not supported by dart2js
+LibTest/typed_data/ByteData/setUint64_A01_t01: SkipByDesign # uses integer literal not representable as JavaScript number
+LibTest/typed_data/ByteData/setUint64_A02_t01: SkipByDesign # Uint64 accessor not supported by dart2js
+LibTest/typed_data/ByteData/setUint64_A02_t02: SkipByDesign # Uint64 accessor not supported by dart2js
+LibTest/typed_data/Int32x4/operator_OR_A01_t01: SkipByDesign # Bitwise operations in JS are unsigned.
+LibTest/typed_data/Int32x4List/join_A01_t01: SkipByDesign # Different string represrntation on VM and in JS
+LibTest/typed_data/Int32x4List/join_A01_t02: SkipByDesign # Different string represrntation on VM and in JS
LibTest/typed_data/Int64List/*: SkipByDesign # Int64List not supported on the web
LibTest/typed_data/Uint64List/*: SkipByDesign # Uint64List not supported on the web
diff --git a/tests/co19/co19-kernel.status b/tests/co19/co19-kernel.status
index 21682f1..088865a 100644
--- a/tests/co19/co19-kernel.status
+++ b/tests/co19/co19-kernel.status
@@ -28,7 +28,7 @@
LibTest/collection/ListBase/ListBase_class_A01_t02: Slow, Pass # Does many calls
LibTest/collection/ListMixin/ListMixin_class_A01_t02: Slow, Pass # Does many calls
LibTest/core/List/List_class_A01_t02: Slow, Pass # Does many calls
-LibTest/io/RawDatagramSocket/*: Skip # RawDatagramSocket are flacky. Skip them all until rewritten
+LibTest/io/RawDatagramSocket/*: Skip # RawDatagramSocket are flaky. https://github.com/dart-lang/co19/issues/195
[ $compiler == dartk && $runtime == vm && $system == linux ]
LibTest/isolate/Isolate/spawn_A06_t03: Crash
@@ -45,8 +45,8 @@
Language/Classes/Constructors/Constant_Constructors/potentially_constant_expression_t01: Crash
[ $runtime == dart_precompiled && ($arch == simarm64 || $arch == simarm64c) ]
-LibTest/collection/ListBase/ListBase_class_A01_t01: Skip # Issue 43036
-LibTest/collection/ListMixin/ListMixin_class_A01_t01: Skip # Issue 43036
+LibTest/collection/ListBase/ListBase_class_A01_t01: SkipSlow # Issue 43036
+LibTest/collection/ListMixin/ListMixin_class_A01_t01: SkipSlow # Issue 43036
# It makes no sense to run any test that uses spawnURI under the simulator
# as that would involve running CFE (the front end) in simulator mode
diff --git a/tests/co19_2/co19_2-dart2js.status b/tests/co19_2/co19_2-dart2js.status
index 63158f2..5ba60fe 100644
--- a/tests/co19_2/co19_2-dart2js.status
+++ b/tests/co19_2/co19_2-dart2js.status
@@ -3,14 +3,14 @@
# BSD-style license that can be found in the LICENSE file.
[ $compiler == dart2js ]
-Language/Expressions/Null/instance_of_class_null_t01: Skip # dart:mirrors not supported https://github.com/dart-lang/co19/issues/522.
+Language/Expressions/Null/instance_of_class_null_t01: SkipByDesign # dart:mirrors not supported https://github.com/dart-lang/co19/issues/522.
Language/Expressions/Numbers/syntax_t06: SkipByDesign # uses integer literal not representable as JavaScript number
Language/Expressions/Numbers/syntax_t09: SkipByDesign # uses integer literal not representable as JavaScript number
Language/Expressions/Spawning_an_Isolate/new_isolate_t01: SkipByDesign
Language/Functions/External_Functions/not_connected_to_a_body_t01: SkipByDesign # Non-JS-interop external members are not supported
Language/Libraries_and_Scripts/Scripts/top_level_syntax_t01: SkipByDesign # Non-JS-interop external members are not supported
Language/Libraries_and_Scripts/top_level_syntax_t01: SkipByDesign # Non-JS-interop external members are not supported
-Language/Metadata/before*: Skip # dart:mirrors not supported https://github.com/dart-lang/co19/issues/523.
+Language/Metadata/before*: SkipByDesign # dart:mirrors not supported https://github.com/dart-lang/co19/issues/523.
LibTest/io/*: SkipByDesign # dart:io not supported.
LibTest/isolate/*: SkipByDesign # dart:isolate not supported.
diff --git a/tests/co19_2/co19_2-dartdevc.status b/tests/co19_2/co19_2-dartdevc.status
index 4ce31b8..9e86a17 100644
--- a/tests/co19_2/co19_2-dartdevc.status
+++ b/tests/co19_2/co19_2-dartdevc.status
@@ -3,86 +3,86 @@
# BSD-style license that can be found in the LICENSE file.
[ $compiler == dartdevc || $compiler == dartdevk ]
-Language/Classes/Constructors/Generative_Constructors/formal_parameter_t07: Skip # Times out
-Language/Classes/Constructors/Generative_Constructors/fresh_instance_t01: Skip # Times out
-Language/Classes/Constructors/Generative_Constructors/implicit_superinitializer_t01: Skip # Times out
-Language/Classes/Constructors/Generative_Constructors/implicit_superinitializer_t02: Skip # Times out
-Language/Classes/Constructors/Generative_Constructors/initializers_t01: Skip # Times out
-Language/Classes/Constructors/Generative_Constructors/initializers_t15: Skip # Times out
-Language/Classes/Constructors/Generative_Constructors/initializing_formals_execution_t01: Skip # Times out
-Language/Classes/Constructors/Generative_Constructors/initializing_this_t01: Skip # Times out
-Language/Classes/Constructors/Generative_Constructors/redirection_t01: Skip # Times out
-Language/Classes/Constructors/Generative_Constructors/syntax_t01: Skip # Times out
-Language/Classes/Constructors/implicit_constructor_t01: Skip # Times out
-Language/Classes/Constructors/implicit_constructor_t02: Skip # Times out
-Language/Classes/Constructors/name_t01: Skip # Times out
-Language/Classes/Constructors/name_t02: Skip # Times out
-Language/Classes/Constructors/name_t03: Skip # Times out
-Language/Classes/Getters/instance_getter_t01: Skip # Times out
-Language/Classes/Getters/instance_getter_t02: Skip # Times out
-Language/Classes/Getters/instance_getter_t03: Skip # Times out
-Language/Classes/Getters/instance_getter_t04: Skip # Times out
-Language/Classes/Getters/instance_getter_t05: Skip # Times out
-Language/Classes/Getters/instance_getter_t06: Skip # Times out
-Language/Classes/Getters/override_t04: Skip # Times out
-Language/Classes/Getters/return_type_t01: Skip # Times out
-Language/Classes/Getters/static_t01/none: Skip # Times out
-Language/Classes/Getters/static_t02: Skip # Times out
-Language/Classes/Getters/syntax_t01: Skip # Times out
-Language/Classes/Getters/void_return_type_t01: Skip # Times out
-Language/Classes/Instance_Methods/Operators/allowed_names_t01: Skip # Times out
-Language/Classes/Instance_Methods/Operators/arity_0_or_1_t01: Skip # Times out
-Language/Classes/Instance_Methods/Operators/arity_0_t01: Skip # Times out
-Language/Classes/Instance_Methods/Operators/syntax_t01: Skip # Times out
-Language/Classes/Instance_Methods/Operators/syntax_t03: Skip # Times out
-Language/Classes/Instance_Methods/override_named_parameters_t03: Skip # Times out
-Language/Classes/Instance_Methods/override_named_parameters_t04: Skip # Times out
-Language/Classes/Instance_Methods/override_named_parameters_t06: Skip # Times out
-Language/Classes/Instance_Methods/override_subtype_t05: Skip # Times out
-Language/Classes/Instance_Methods/override_subtype_t06: Skip # Times out
-Language/Classes/Instance_Methods/same_name_static_member_in_superclass_t01: Skip # Times out
-Language/Classes/Instance_Methods/same_name_static_member_in_superclass_t02: Skip # Times out
-Language/Classes/Instance_Methods/same_name_static_member_in_superclass_t04: Skip # Times out
-Language/Classes/Instance_Methods/same_name_static_member_in_superclass_t05: Skip # Times out
-Language/Classes/Instance_Methods/same_name_static_member_in_superclass_t06: Skip # Times out
-Language/Classes/Instance_Methods/same_name_static_member_in_superclass_t07: Skip # Times out
-Language/Classes/Instance_Methods/same_name_static_member_in_superclass_t08: Skip # Times out
-Language/Classes/Instance_Methods/same_name_static_member_in_superclass_t09: Skip # Times out
-Language/Classes/Instance_Variables/definition_t01: Skip # Times out
-Language/Classes/Instance_Variables/definition_t02: Skip # Times out
-Language/Classes/Instance_Variables/definition_t04: Skip # Times out
-Language/Classes/Setters/instance_setter_t01: Skip # Times out
-Language/Expressions/Function_Invocation/async_generator_invokation_t08: Skip # Times out
-Language/Expressions/Function_Invocation/async_generator_invokation_t10: Skip # Times out
-Language/Expressions/Null/instance_of_class_null_t01: Skip # dart:mirrors not supported https://github.com/dart-lang/co19/issues/522.
+Language/Classes/Constructors/Generative_Constructors/formal_parameter_t07: SkipSlow
+Language/Classes/Constructors/Generative_Constructors/fresh_instance_t01: SkipSlow
+Language/Classes/Constructors/Generative_Constructors/implicit_superinitializer_t01: SkipSlow
+Language/Classes/Constructors/Generative_Constructors/implicit_superinitializer_t02: SkipSlow
+Language/Classes/Constructors/Generative_Constructors/initializers_t01: SkipSlow
+Language/Classes/Constructors/Generative_Constructors/initializers_t15: SkipSlow
+Language/Classes/Constructors/Generative_Constructors/initializing_formals_execution_t01: SkipSlow
+Language/Classes/Constructors/Generative_Constructors/initializing_this_t01: SkipSlow
+Language/Classes/Constructors/Generative_Constructors/redirection_t01: SkipSlow
+Language/Classes/Constructors/Generative_Constructors/syntax_t01: SkipSlow
+Language/Classes/Constructors/implicit_constructor_t01: SkipSlow
+Language/Classes/Constructors/implicit_constructor_t02: SkipSlow
+Language/Classes/Constructors/name_t01: SkipSlow
+Language/Classes/Constructors/name_t02: SkipSlow
+Language/Classes/Constructors/name_t03: SkipSlow
+Language/Classes/Getters/instance_getter_t01: SkipSlow
+Language/Classes/Getters/instance_getter_t02: SkipSlow
+Language/Classes/Getters/instance_getter_t03: SkipSlow
+Language/Classes/Getters/instance_getter_t04: SkipSlow
+Language/Classes/Getters/instance_getter_t05: SkipSlow
+Language/Classes/Getters/instance_getter_t06: SkipSlow
+Language/Classes/Getters/override_t04: SkipSlow
+Language/Classes/Getters/return_type_t01: SkipSlow
+Language/Classes/Getters/static_t01/none: SkipSlow
+Language/Classes/Getters/static_t02: SkipSlow
+Language/Classes/Getters/syntax_t01: SkipSlow
+Language/Classes/Getters/void_return_type_t01: SkipSlow
+Language/Classes/Instance_Methods/Operators/allowed_names_t01: SkipSlow
+Language/Classes/Instance_Methods/Operators/arity_0_or_1_t01: SkipSlow
+Language/Classes/Instance_Methods/Operators/arity_0_t01: SkipSlow
+Language/Classes/Instance_Methods/Operators/syntax_t01: SkipSlow
+Language/Classes/Instance_Methods/Operators/syntax_t03: SkipSlow
+Language/Classes/Instance_Methods/override_named_parameters_t03: SkipSlow
+Language/Classes/Instance_Methods/override_named_parameters_t04: SkipSlow
+Language/Classes/Instance_Methods/override_named_parameters_t06: SkipSlow
+Language/Classes/Instance_Methods/override_subtype_t05: SkipSlow
+Language/Classes/Instance_Methods/override_subtype_t06: SkipSlow
+Language/Classes/Instance_Methods/same_name_static_member_in_superclass_t01: SkipSlow
+Language/Classes/Instance_Methods/same_name_static_member_in_superclass_t02: SkipSlow
+Language/Classes/Instance_Methods/same_name_static_member_in_superclass_t04: SkipSlow
+Language/Classes/Instance_Methods/same_name_static_member_in_superclass_t05: SkipSlow
+Language/Classes/Instance_Methods/same_name_static_member_in_superclass_t06: SkipSlow
+Language/Classes/Instance_Methods/same_name_static_member_in_superclass_t07: SkipSlow
+Language/Classes/Instance_Methods/same_name_static_member_in_superclass_t08: SkipSlow
+Language/Classes/Instance_Methods/same_name_static_member_in_superclass_t09: SkipSlow
+Language/Classes/Instance_Variables/definition_t01: SkipSlow
+Language/Classes/Instance_Variables/definition_t02: SkipSlow
+Language/Classes/Instance_Variables/definition_t04: SkipSlow
+Language/Classes/Setters/instance_setter_t01: SkipSlow
+Language/Expressions/Function_Invocation/async_generator_invokation_t08: SkipSlow
+Language/Expressions/Function_Invocation/async_generator_invokation_t10: SkipSlow
+Language/Expressions/Null/instance_of_class_null_t01: SkipByDesign # dart:mirrors not supported https://github.com/dart-lang/co19/issues/522.
Language/Expressions/Numbers/syntax_t06: SkipByDesign # uses integer literal not representable as JavaScript number
Language/Expressions/Numbers/syntax_t09: SkipByDesign # uses integer literal not representable as JavaScript number
Language/Expressions/Spawning_an_Isolate/new_isolate_t01: SkipByDesign # dart:isolate not supported.
Language/Functions/External_Functions/not_connected_to_a_body_t01: SkipByDesign # External variables are not supported
Language/Libraries_and_Scripts/Scripts/top_level_syntax_t01: SkipByDesign # External variables are not supported
Language/Libraries_and_Scripts/top_level_syntax_t01: SkipByDesign # External variables are not supported
-Language/Metadata/before*: Skip # dart:mirrors not supported https://github.com/dart-lang/co19/issues/523.
-Language/Types/Interface_Types/subtype_t27: Skip # Times out
-Language/Types/Interface_Types/subtype_t28: Skip # Times out
-LibTest/html/CanvasRenderingContext2D/addEventListener_A01_t03: Skip # Times out
-LibTest/html/Element/blur_A01_t01: Skip # Times out
-LibTest/html/Element/focus_A01_t01: Skip # Times out
-LibTest/html/Element/loadEvent_A01_t01: Skip # Times out
-LibTest/html/Element/mouseWheelEvent_A01_t01: Skip # Times out
-LibTest/html/Element/onLoad_A01_t01: Skip # Times out
-LibTest/html/Element/onMouseWheel_A01_t01: Skip # Times out
-LibTest/html/Element/onTransitionEnd_A01_t01: Skip # Times out
-LibTest/html/Element/transitionEndEvent_A01_t01: Skip # Times out
-LibTest/html/HttpRequest/onError_A01_t02: Skip # Times out
-LibTest/html/HttpRequest/responseText_A01_t02: Skip # Times out
-LibTest/html/HttpRequestUpload/onError_A01_t02: Skip # Times out
-LibTest/html/HttpRequestUpload/onLoadEnd_A01_t01: Skip # Times out
-LibTest/html/HttpRequestUpload/onLoadStart_A01_t01: Skip # Times out
-LibTest/html/HttpRequestUpload/onLoad_A01_t01: Skip # Times out
-LibTest/html/IFrameElement/blur_A01_t01: Skip # Times out
-LibTest/html/IFrameElement/enteredView_A01_t01: Skip # Times out
-LibTest/html/IFrameElement/focus_A01_t01: Skip # Times out
-LibTest/html/IFrameElement/onMouseWheel_A01_t01: Skip # Times out
-LibTest/html/IFrameElement/onTransitionEnd_A01_t01: Skip # Times out
+Language/Metadata/before*: SkipByDesign # dart:mirrors not supported https://github.com/dart-lang/co19/issues/523.
+Language/Types/Interface_Types/subtype_t27: SkipSlow
+Language/Types/Interface_Types/subtype_t28: SkipSlow
+LibTest/html/CanvasRenderingContext2D/addEventListener_A01_t03: SkipSlow
+LibTest/html/Element/blur_A01_t01: SkipSlow
+LibTest/html/Element/focus_A01_t01: SkipSlow
+LibTest/html/Element/loadEvent_A01_t01: SkipSlow
+LibTest/html/Element/mouseWheelEvent_A01_t01: SkipSlow
+LibTest/html/Element/onLoad_A01_t01: SkipSlow
+LibTest/html/Element/onMouseWheel_A01_t01: SkipSlow
+LibTest/html/Element/onTransitionEnd_A01_t01: SkipSlow
+LibTest/html/Element/transitionEndEvent_A01_t01: SkipSlow
+LibTest/html/HttpRequest/onError_A01_t02: SkipSlow
+LibTest/html/HttpRequest/responseText_A01_t02: SkipSlow
+LibTest/html/HttpRequestUpload/onError_A01_t02: SkipSlow
+LibTest/html/HttpRequestUpload/onLoadEnd_A01_t01: SkipSlow
+LibTest/html/HttpRequestUpload/onLoadStart_A01_t01: SkipSlow
+LibTest/html/HttpRequestUpload/onLoad_A01_t01: SkipSlow
+LibTest/html/IFrameElement/blur_A01_t01: SkipSlow
+LibTest/html/IFrameElement/enteredView_A01_t01: SkipSlow
+LibTest/html/IFrameElement/focus_A01_t01: SkipSlow
+LibTest/html/IFrameElement/onMouseWheel_A01_t01: SkipSlow
+LibTest/html/IFrameElement/onTransitionEnd_A01_t01: SkipSlow
LibTest/io/*: SkipByDesign # dart:io not supported.
LibTest/isolate/*: SkipByDesign # dart:isolate not supported.
diff --git a/tests/language/const_functions/const_functions_variable_declarations_error_test.dart b/tests/language/const_functions/const_functions_variable_declarations_error_test.dart
new file mode 100644
index 0000000..56cf083
--- /dev/null
+++ b/tests/language/const_functions/const_functions_variable_declarations_error_test.dart
@@ -0,0 +1,18 @@
+// 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.
+
+// Tests erroneous variable declaration usage within const functions.
+
+// SharedOptions=--enable-experiment=const-functions
+
+import "package:expect/expect.dart";
+
+const var1 = fn1();
+// ^^^^^
+// [analyzer] COMPILE_TIME_ERROR.CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE
+// [cfe] Constant evaluation error:
+int fn1() {
+ var a;
+ return a;
+}
diff --git a/tests/language/const_functions/const_functions_variable_declarations_test.dart b/tests/language/const_functions/const_functions_variable_declarations_test.dart
index 492a8cc..ec6a8ec 100644
--- a/tests/language/const_functions/const_functions_variable_declarations_test.dart
+++ b/tests/language/const_functions/const_functions_variable_declarations_test.dart
@@ -53,6 +53,35 @@
return constant;
}
+const var6 = function6();
+// ^^^^^^^^^^^
+// [analyzer] COMPILE_TIME_ERROR.CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE
+int function6() {
+ var a;
+ a = 2;
+ return a;
+}
+
+const var7 = function7();
+// ^^^^^^^^^^^
+// [analyzer] COMPILE_TIME_ERROR.CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE
+int function7() {
+ var a;
+ var b;
+ a = 2;
+ return a;
+}
+
+const var8 = function8();
+// ^^^^^^^^^^^
+// [analyzer] COMPILE_TIME_ERROR.CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE
+int function8() {
+ var a;
+ int? b;
+ a = 2;
+ return a;
+}
+
void main() {
Expect.equals(var1, 4);
Expect.equals(var1_1, 5);
@@ -60,4 +89,7 @@
Expect.equals(var3, 6);
Expect.equals(var4, 2);
Expect.equals(var5, -2);
+ Expect.equals(var6, 2);
+ Expect.equals(var7, 2);
+ Expect.equals(var8, 2);
}
diff --git a/tools/VERSION b/tools/VERSION
index d3375eb..c7caf78 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
MAJOR 2
MINOR 13
PATCH 0
-PRERELEASE 231
+PRERELEASE 232
PRERELEASE_PATCH 0
\ No newline at end of file