Version 2.11.0-203.0.dev
Merge commit '057ac51f12cbf007cb07f62ade9b0e1931ffb2fe' into 'dev'
diff --git a/DEPS b/DEPS
index b5cc604..eaa25b8 100644
--- a/DEPS
+++ b/DEPS
@@ -144,7 +144,7 @@
"source_maps_rev": "53eb92ccfe6e64924054f83038a534b959b12b3e",
"source_span_rev": "cc7c4288a83f71ecef3414199947b52a8c112c65",
"sse_tag": "e5cf68975e8e87171a3dc297577aa073454a91dc",
- "stack_trace_tag": "a958966148516dfa64e2b54c14492175da5cc8e1",
+ "stack_trace_tag": "45319bfd2a6da228d8c32b06e1da02ad199373c7",
"stagehand_tag": "v3.3.9",
"stream_channel_tag": "c446774fd077c9bdbd6235a7aadc661ef60a9727",
"string_scanner_rev": "1b63e6e5db5933d7be0a45da6e1129fe00262734",
diff --git a/build/config/BUILDCONFIG.gn b/build/config/BUILDCONFIG.gn
index 336445e..ee58748 100644
--- a/build/config/BUILDCONFIG.gn
+++ b/build/config/BUILDCONFIG.gn
@@ -425,9 +425,6 @@
configs = [] # Prevent list overwriting warning.
configs = invoker.configs
- # See above call.
- set_sources_assignment_filter([])
-
if (defined(invoker.all_dependent_configs)) {
all_dependent_configs = invoker.all_dependent_configs
}
diff --git a/build/config/mac/rules.gni b/build/config/mac/rules.gni
index df8080e..85f7b92 100644
--- a/build/config/mac/rules.gni
+++ b/build/config/mac/rules.gni
@@ -72,7 +72,6 @@
_resources = invoker.resources
copy(target_name) {
- set_sources_assignment_filter([])
sources = _resources
outputs = [ "$root_build_dir/$_app_name.app/$_bundle_directory/Contents/Resources/{{source_file_part}}" ]
diff --git a/build/config/templates/templates.gni b/build/config/templates/templates.gni
index cd310ce..a8815f8 100644
--- a/build/config/templates/templates.gni
+++ b/build/config/templates/templates.gni
@@ -17,8 +17,6 @@
# variables = "app_name=chrome_shell app_version=1"
# }
template("file_template") {
- set_sources_assignment_filter([])
-
if (defined(invoker.testonly)) {
testonly = invoker.testonly
}
diff --git a/pkg/_fe_analyzer_shared/lib/src/flow_analysis/flow_analysis.dart b/pkg/_fe_analyzer_shared/lib/src/flow_analysis/flow_analysis.dart
index 03877e4..f809b87 100644
--- a/pkg/_fe_analyzer_shared/lib/src/flow_analysis/flow_analysis.dart
+++ b/pkg/_fe_analyzer_shared/lib/src/flow_analysis/flow_analysis.dart
@@ -607,6 +607,10 @@
/// Call this method just after visiting the initializer of a late variable.
void lateInitializer_end();
+ /// Call this method before visiting the LHS of a logical binary operation
+ /// ("||" or "&&").
+ void logicalBinaryOp_begin();
+
/// Call this method after visiting the RHS of a logical binary operation
/// ("||" or "&&").
/// [wholeExpression] should be the whole logical binary expression.
@@ -1099,6 +1103,11 @@
}
@override
+ void logicalBinaryOp_begin() {
+ _wrap('logicalBinaryOp_begin()', () => _wrapped.logicalBinaryOp_begin());
+ }
+
+ @override
void logicalBinaryOp_end(Expression wholeExpression, Expression rightOperand,
{@required bool isAnd}) {
_wrap(
@@ -2720,6 +2729,7 @@
@override
void assert_begin() {
+ _current = _current.split();
_stack.add(new _AssertContext<Variable, Type>(_current));
}
@@ -2727,7 +2737,7 @@
void assert_end() {
_AssertContext<Variable, Type> context =
_stack.removeLast() as _AssertContext<Variable, Type>;
- _current = _join(context._previous, context._conditionInfo.ifTrue);
+ _current = _merge(context._previous, context._conditionInfo.ifTrue);
}
@override
@@ -2984,7 +2994,7 @@
// common base class. See https://github.com/dart-lang/sdk/issues/43725.
_SimpleContext<Variable, Type> context =
_stack.removeLast() as _SimpleContext<Variable, Type>;
- _current = _join(_current, context._previous);
+ _current = _merge(_current, context._previous);
}
@override
@@ -2992,6 +3002,7 @@
Expression leftHandSide, Type leftHandSideType) {
ExpressionInfo<Variable, Type> lhsInfo = _getExpressionInfo(leftHandSide);
FlowModel<Variable, Type> promoted;
+ _current = _current.split();
if (lhsInfo is _VariableReadInfo<Variable, Type>) {
ExpressionInfo<Variable, Type> promotionInfo =
_current.tryMarkNonNullable(typeOperations, lhsInfo._variable);
@@ -3070,6 +3081,7 @@
@override
void labeledStatement_begin(Node node) {
+ _current = _current.split();
_BranchTargetContext<Variable, Type> context =
new _BranchTargetContext<Variable, Type>(_current.reachable.parent);
_stack.add(context);
@@ -3080,7 +3092,7 @@
void labeledStatement_end() {
_BranchTargetContext<Variable, Type> context =
_stack.removeLast() as _BranchTargetContext<Variable, Type>;
- _current = _join(_current, context._breakModel);
+ _current = _merge(_current, context._breakModel);
}
@override
@@ -3104,6 +3116,11 @@
}
@override
+ void logicalBinaryOp_begin() {
+ _current = _current.split();
+ }
+
+ @override
void logicalBinaryOp_end(Expression wholeExpression, Expression rightOperand,
{@required bool isAnd}) {
_BranchContext<Variable, Type> context =
@@ -3121,8 +3138,8 @@
}
_storeExpressionInfo(
wholeExpression,
- new ExpressionInfo(
- _join(trueResult, falseResult), trueResult, falseResult));
+ new ExpressionInfo(_merge(trueResult, falseResult),
+ trueResult.unsplit(), falseResult.unsplit()));
}
@override
@@ -3156,12 +3173,13 @@
// common base class. See https://github.com/dart-lang/sdk/issues/43725.
_SimpleContext<Variable, Type> context =
_stack.removeLast() as _SimpleContext<Variable, Type>;
- _current = _join(_current, context._previous);
+ _current = _merge(_current, context._previous);
}
@override
bool nullAwareAccess_rightBegin(Expression target, Type targetType) {
assert(targetType != null);
+ _current = _current.split();
_stack.add(new _NullAwareAccessContext<Variable, Type>(_current));
if (target != null) {
ExpressionInfo<Variable, Type> targetInfo = _getExpressionInfo(target);
@@ -3223,11 +3241,12 @@
// And, if there is an implicit fall-through default, join it to any breaks.
if (!isExhaustive) breakState = _join(breakState, context._previous);
- _current = breakState;
+ _current = breakState.unsplit();
}
@override
void switchStatement_expressionEnd(Statement switchStatement) {
+ _current = _current.split();
_SimpleStatementContext<Variable, Type> context =
new _SimpleStatementContext<Variable, Type>(
_current.reachable.parent, _current);
@@ -3237,6 +3256,7 @@
@override
void tryCatchStatement_bodyBegin() {
+ _current = _current.split();
_stack.add(new _TryContext<Variable, Type>(_current));
}
@@ -3283,7 +3303,7 @@
void tryCatchStatement_end() {
_TryContext<Variable, Type> context =
_stack.removeLast() as _TryContext<Variable, Type>;
- _current = context._afterBodyAndCatches;
+ _current = context._afterBodyAndCatches.unsplit();
}
@override
@@ -3331,6 +3351,7 @@
@override
void whileStatement_conditionBegin(Node node) {
+ _current = _current.split();
AssignedVariablesNodeInfo<Variable> info =
_assignedVariables._getInfoForNode(node);
_current = _current.conservativeJoin(info._written, info._captured);
@@ -3340,7 +3361,7 @@
void whileStatement_end() {
_WhileContext<Variable, Type> context =
_stack.removeLast() as _WhileContext<Variable, Type>;
- _current = _join(context._conditionInfo.ifFalse, context._breakModel)
+ _current = _merge(context._conditionInfo.ifFalse, context._breakModel)
.inheritTested(typeOperations, _current);
}
diff --git a/pkg/_fe_analyzer_shared/test/flow_analysis/flow_analysis_test.dart b/pkg/_fe_analyzer_shared/test/flow_analysis/flow_analysis_test.dart
index 979be2e..8b5ee79 100644
--- a/pkg/_fe_analyzer_shared/test/flow_analysis/flow_analysis_test.dart
+++ b/pkg/_fe_analyzer_shared/test/flow_analysis/flow_analysis_test.dart
@@ -1421,6 +1421,7 @@
var x = h.addVar('x', 'int?');
h.run((flow) {
h.declare(x, initialized: true);
+ flow.logicalBinaryOp_begin();
flow.logicalBinaryOp_rightBegin(h.notNull(x, _Type('int?'))(),
isAnd: true);
expect(flow.promotedType(x).type, 'int');
@@ -1434,6 +1435,7 @@
h.run((flow) {
h.declare(x, initialized: true);
flow.ifStatement_conditionBegin();
+ flow.logicalBinaryOp_begin();
flow.logicalBinaryOp_rightBegin(_Expression(), isAnd: true);
var wholeExpr = _Expression();
flow.logicalBinaryOp_end(wholeExpr, h.notNull(x, _Type('int?'))(),
@@ -1451,6 +1453,7 @@
h.run((flow) {
h.declare(x, initialized: true);
flow.ifStatement_conditionBegin();
+ flow.logicalBinaryOp_begin();
flow.logicalBinaryOp_rightBegin(_Expression(), isAnd: false);
var wholeExpr = _Expression();
flow.logicalBinaryOp_end(wholeExpr, h.eqNull(x, _Type('int?'))(),
@@ -1467,6 +1470,7 @@
var x = h.addVar('x', 'int?');
h.run((flow) {
h.declare(x, initialized: true);
+ flow.logicalBinaryOp_begin();
flow.logicalBinaryOp_rightBegin(h.eqNull(x, _Type('int?'))(),
isAnd: false);
expect(flow.promotedType(x).type, 'int');
@@ -4146,6 +4150,7 @@
LazyExpression and(LazyExpression lhs, LazyExpression rhs) {
return () {
var expr = _Expression();
+ _flow.logicalBinaryOp_begin();
_flow.logicalBinaryOp_rightBegin(lhs(), isAnd: true);
_flow.logicalBinaryOp_end(expr, rhs(), isAnd: true);
return expr;
@@ -4322,6 +4327,7 @@
LazyExpression or(LazyExpression lhs, LazyExpression rhs) {
return () {
var expr = _Expression();
+ _flow.logicalBinaryOp_begin();
_flow.logicalBinaryOp_rightBegin(lhs(), isAnd: false);
_flow.logicalBinaryOp_end(expr, rhs(), isAnd: false);
return expr;
diff --git a/pkg/_fe_analyzer_shared/test/flow_analysis/type_promotion/data/promotion_in_dead_code.dart b/pkg/_fe_analyzer_shared/test/flow_analysis/type_promotion/data/promotion_in_dead_code.dart
index e8dfacd..21f9263 100644
--- a/pkg/_fe_analyzer_shared/test/flow_analysis/type_promotion/data/promotion_in_dead_code.dart
+++ b/pkg/_fe_analyzer_shared/test/flow_analysis/type_promotion/data/promotion_in_dead_code.dart
@@ -6,6 +6,98 @@
// promotion continue to function properly even when used inside unreachable
// code.
+abstract class C {
+ void f(Object x, Object y);
+}
+
+andExpression_alwaysFalse(Object o) {
+ return;
+ o is! int && (throw 'x');
+ /*int*/ o;
+}
+
+andExpression_alwaysTrue(Object o) {
+ return;
+ true && (o is int || (throw 'x'));
+ /*int*/ o;
+}
+
+andExpression_lhsAlwaysTrue(Object o) {
+ return;
+ if (true && o is! int) {
+ o;
+ } else {
+ /*int*/ o;
+ }
+}
+
+andExpression_rhsAlwaysTrue(Object o) {
+ return;
+ if (o is! int && true) {
+ o;
+ } else {
+ /*int*/ o;
+ }
+}
+
+assertAlwaysThrows(Object o, Object p, bool Function(Object, Object) f) {
+ if (o is! int) return;
+ return;
+ assert(f(o = p, throw 'x'));
+ /*int*/ o;
+}
+
+class AssertAlwaysThrows_Constructor {
+ Object a;
+ Object b;
+
+ AssertAlwaysThrows_Constructor(
+ Object o, Object p, bool Function(Object, Object) f)
+ : a = o is int ? true : throw 'x',
+ b = throw 'x',
+ assert(f(o = p, throw 'x')) {
+ /*int*/ o;
+ }
+}
+
+assertFailsButMessageRepromotes(Object? o) {
+ if (o is! int) return;
+ return;
+ assert((o = null) != null, o is int ? 'ok' : throw 'x');
+ /*int*/ o;
+}
+
+class AssertFailsButMessageRepromotes_Constructor {
+ Object a;
+ Object b;
+
+ AssertFailsButMessageRepromotes_Constructor(Object? o)
+ : a = o is int ? true : throw 'x',
+ b = throw 'x',
+ assert((o = null) != null, o is int ? 'ok' : throw 'x') {
+ /*int*/ o;
+ }
+}
+
+assertMessageDepromotesButAlwaysThrows(Object o, Object p, bool b) {
+ if (o is! int) return;
+ return;
+ assert(b, throw (o = p));
+ /*int*/ o;
+}
+
+class AssertMessageDepromotesButAlwaysThrows {
+ Object a;
+ Object b;
+
+ AssertMessageDepromotesButAlwaysThrows(Object o, Object p, bool b)
+ : a = o is int ? true : throw 'x',
+ b = throw 'x',
+ assert(b, throw (o = p)) {
+ /*int*/ o;
+ }
+}
+
conditionalIs(Object o) {
return;
o is int ? null : throw 'bad';
@@ -92,3 +184,106 @@
({if (o is! int) 0: throw 'x'});
/*int*/ o;
}
+
+ifNull(Object o, Object? p, Object q, void Function(Object, Object) f) {
+ return;
+ (o is int ? p : throw 'x') ?? f(o = q, throw 'x');
+ /*int*/ o;
+}
+
+labeledStatement(Object o) {
+ return;
+ label:
+ {
+ if (o is int) break label;
+ return;
+ }
+ /*int*/ o;
+}
+
+nullAwareAccess(Object o, C? p, Object q) {
+ return;
+ (o is int ? p : throw 'x')?.f(o = q, throw 'x');
+ /*int*/ o;
+}
+
+orExpression_alwaysFalse(Object o) {
+ return;
+ false || (o is! int && (throw 'x'));
+ /*int*/ o;
+}
+
+orExpression_alwaysTrue(Object o) {
+ return;
+ o is int || (throw 'x');
+ /*int*/ o;
+}
+
+orExpression_lhsAlwaysFalse(Object o) {
+ return;
+ if (false || o is int) {
+ /*int*/ o;
+ } else {
+ o;
+ }
+}
+
+orExpression_rhsAlwaysFalse(Object o) {
+ return;
+ if (o is int || false) {
+ /*int*/ o;
+ } else {
+ o;
+ }
+}
+
+switchPromoteInCase(Object o, int i) {
+ return;
+ switch (i) {
+ case 0:
+ if (o is! int) return;
+ break;
+ default:
+ return;
+ }
+ /*int*/ o;
+}
+
+switchPromoteInImplicitDefault(Object o, int i, Object p) {
+ return;
+ if (o is! int) return;
+ switch (i) {
+ case 0:
+ o = p;
+ return;
+ }
+ /*int*/ o;
+}
+
+tryCatchPromoteInTry(Object o) {
+ return;
+ try {
+ if (o is! int) return;
+ } catch (_) {
+ return;
+ }
+ /*int*/ o;
+}
+
+tryCatchPromoteInCatch(Object o) {
+ return;
+ try {
+ return;
+ } catch (_) {
+ if (o is! int) return;
+ }
+ /*int*/ o;
+}
+
+whileBreak(Object o) {
+ return;
+ while (true) {
+ if (o is int) break;
+ }
+ /*int*/ o;
+}
diff --git a/pkg/analysis_server/analysis_options.yaml b/pkg/analysis_server/analysis_options.yaml
index 31a937b..254951f 100644
--- a/pkg/analysis_server/analysis_options.yaml
+++ b/pkg/analysis_server/analysis_options.yaml
@@ -21,6 +21,7 @@
- iterable_contains_unrelated_type
- list_remove_unrelated_type
- prefer_initializing_formals
+ - prefer_typing_uninitialized_variables
- unnecessary_brace_in_string_interps
- unnecessary_overrides
- void_checks
diff --git a/pkg/analysis_server/benchmark/integration/input_converter.dart b/pkg/analysis_server/benchmark/integration/input_converter.dart
index 5c04dd7..7f7ca06 100644
--- a/pkg/analysis_server/benchmark/integration/input_converter.dart
+++ b/pkg/analysis_server/benchmark/integration/input_converter.dart
@@ -334,7 +334,7 @@
class _InputSink extends ChunkedConversionSink<String> {
final Converter<String, Operation> converter;
- final outSink;
+ final Sink<Operation> outSink;
_InputSink(this.converter, this.outSink);
diff --git a/pkg/analysis_server/lib/src/context_manager.dart b/pkg/analysis_server/lib/src/context_manager.dart
index c16084d..1d527b0 100644
--- a/pkg/analysis_server/lib/src/context_manager.dart
+++ b/pkg/analysis_server/lib/src/context_manager.dart
@@ -818,26 +818,29 @@
}
}
}
- if (visitors.isNotEmpty) {
- var sourceUri = resourceProvider.pathContext.toUri(path);
- var pubspecAst = Pubspec.parse(content,
- sourceUrl: sourceUri, resourceProvider: resourceProvider);
- var listener = RecordingErrorListener();
- var reporter = ErrorReporter(listener,
- resourceProvider.getFile(path).createSource(sourceUri),
- isNonNullableByDefault: false);
- for (var entry in visitors.entries) {
- entry.key.reporter = reporter;
- pubspecAst.accept(entry.value);
- }
- if (listener.errors.isNotEmpty) {
- convertedErrors ??= <protocol.AnalysisError>[];
- convertedErrors.addAll(converter.convertAnalysisErrors(
- listener.errors,
- lineInfo: lineInfo,
- options: driver.analysisOptions));
- }
- }
+ // todo (pq): re-enable once `sort_pub_dependencies` is fixed
+ // see: https://github.com/dart-lang/linter/issues/2271
+ // see: See: https://github.com/dart-lang/sdk/issues/43529
+ // if (visitors.isNotEmpty) {
+ // var sourceUri = resourceProvider.pathContext.toUri(path);
+ // var pubspecAst = Pubspec.parse(content,
+ // sourceUrl: sourceUri, resourceProvider: resourceProvider);
+ // var listener = RecordingErrorListener();
+ // var reporter = ErrorReporter(listener,
+ // resourceProvider.getFile(path).createSource(sourceUri),
+ // isNonNullableByDefault: false);
+ // for (var entry in visitors.entries) {
+ // entry.key.reporter = reporter;
+ // pubspecAst.accept(entry.value);
+ // }
+ // if (listener.errors.isNotEmpty) {
+ // convertedErrors ??= <protocol.AnalysisError>[];
+ // convertedErrors.addAll(converter.convertAnalysisErrors(
+ // listener.errors,
+ // lineInfo: lineInfo,
+ // options: driver.analysisOptions));
+ // }
+ // }
}
}
} catch (exception) {
diff --git a/pkg/analysis_server/lib/src/services/completion/dart/keyword_contributor.dart b/pkg/analysis_server/lib/src/services/completion/dart/keyword_contributor.dart
index 979b63f..3d8234d 100644
--- a/pkg/analysis_server/lib/src/services/completion/dart/keyword_contributor.dart
+++ b/pkg/analysis_server/lib/src/services/completion/dart/keyword_contributor.dart
@@ -8,6 +8,7 @@
import 'package:analysis_server/src/utilities/extensions/ast.dart';
import 'package:analyzer/dart/analysis/features.dart';
import 'package:analyzer/dart/ast/ast.dart';
+import 'package:analyzer/dart/ast/syntactic_entity.dart';
import 'package:analyzer/dart/ast/token.dart';
import 'package:analyzer/dart/ast/visitor.dart';
import 'package:analyzer/src/dart/ast/token.dart';
@@ -169,7 +170,7 @@
@override
void visitCompilationUnit(CompilationUnit node) {
- var previousMember;
+ SyntacticEntity previousMember;
for (var member in node.childEntities) {
if (entity == member) {
break;
diff --git a/pkg/analysis_server/lib/src/services/completion/dart/local_reference_contributor.dart b/pkg/analysis_server/lib/src/services/completion/dart/local_reference_contributor.dart
index df843b8..f638e9a 100644
--- a/pkg/analysis_server/lib/src/services/completion/dart/local_reference_contributor.dart
+++ b/pkg/analysis_server/lib/src/services/completion/dart/local_reference_contributor.dart
@@ -44,8 +44,6 @@
var suggestLocalFields = node is ConstructorDeclaration &&
node.initializers.contains(request.target.entity);
- var localVisitor;
-
// Collect suggestions from the specific child [AstNode] that contains the
// completion offset and all of its parents recursively.
if (!opType.isPrefixed) {
@@ -67,10 +65,10 @@
node = node.parent.parent;
}
- localVisitor = _LocalVisitor(request, builder, visibilityTracker,
- suggestLocalFields: suggestLocalFields);
try {
builder.laterReplacesEarlier = false;
+ var localVisitor = _LocalVisitor(request, builder, visibilityTracker,
+ suggestLocalFields: suggestLocalFields);
localVisitor.visit(node);
} finally {
builder.laterReplacesEarlier = true;
diff --git a/pkg/analysis_server/lib/src/services/completion/dart/suggestion_builder.dart b/pkg/analysis_server/lib/src/services/completion/dart/suggestion_builder.dart
index d05d23a..ae57075 100644
--- a/pkg/analysis_server/lib/src/services/completion/dart/suggestion_builder.dart
+++ b/pkg/analysis_server/lib/src/services/completion/dart/suggestion_builder.dart
@@ -937,7 +937,7 @@
/// Add a suggestion for a [prefix] associated with a [library].
void suggestPrefix(LibraryElement library, String prefix) {
- var relevance;
+ int relevance;
if (request.useNewRelevance) {
var elementKind = _computeElementKind(library);
// TODO(brianwilkerson) If we are in a constant context it would be nice
diff --git a/pkg/analysis_server/lib/src/services/completion/dart/utilities.dart b/pkg/analysis_server/lib/src/services/completion/dart/utilities.dart
index 0568dba..e829ce1 100644
--- a/pkg/analysis_server/lib/src/services/completion/dart/utilities.dart
+++ b/pkg/analysis_server/lib/src/services/completion/dart/utilities.dart
@@ -56,7 +56,7 @@
FunctionType type = param.type;
var rangeStart = offset;
- var rangeLength;
+ int rangeLength;
// todo (pq): consider adding ranges for params
// pending: https://github.com/dart-lang/sdk/issues/40207
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/add_diagnostic_property_reference.dart b/pkg/analysis_server/lib/src/services/correction/dart/add_diagnostic_property_reference.dart
index 30ae5ef..af47d5d 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/add_diagnostic_property_reference.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/add_diagnostic_property_reference.dart
@@ -42,8 +42,8 @@
return;
}
- var constructorId;
- var typeArgs;
+ String constructorId;
+ List<DartType> typeArgs;
var constructorName = '';
if (type.element is FunctionTypedElement) {
@@ -133,8 +133,8 @@
if (body is BlockFunctionBody) {
var functionBody = body;
- var offset;
- var prefix;
+ int offset;
+ String prefix;
if (functionBody.block.statements.isEmpty) {
offset = functionBody.block.leftBracket.offset;
prefix = utils.getLinePrefix(offset) + utils.getIndent(1);
@@ -144,7 +144,7 @@
}
var parameters = debugFillProperties.parameters.parameters;
- var propertiesBuilderName;
+ String propertiesBuilderName;
for (var parameter in parameters) {
if (parameter is SimpleFormalParameter) {
final type = parameter.type;
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/add_not_null_assert.dart b/pkg/analysis_server/lib/src/services/correction/dart/add_not_null_assert.dart
index 7ce7207..20b8972 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/add_not_null_assert.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/add_not_null_assert.dart
@@ -22,7 +22,7 @@
if (identifier.parent is FormalParameter) {
final exp = identifier.parent.thisOrAncestorMatching(
(node) => node is FunctionExpression || node is MethodDeclaration);
- var body;
+ FunctionBody body;
if (exp is FunctionExpression) {
body = exp.body;
} else if (exp is MethodDeclaration) {
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/create_method.dart b/pkg/analysis_server/lib/src/services/correction/dart/create_method.dart
index 4cf4b5c..17509ff 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/create_method.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/create_method.dart
@@ -41,7 +41,7 @@
if (methodDecl != null && classDecl != null) {
final classElement = classDecl.declaredElement;
- var element;
+ ExecutableElement element;
if (methodDecl.name.name == 'hashCode') {
_memberName = '==';
element = classElement.lookUpInheritedMethod(
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/remove_unused.dart b/pkg/analysis_server/lib/src/services/correction/dart/remove_unused.dart
index d90106e..790b766 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/remove_unused.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/remove_unused.dart
@@ -33,7 +33,7 @@
final references = _findAllReferences(unit, element);
// todo (pq): consider filtering for references that are limited to within the class.
if (references.length == 1) {
- var sourceRange;
+ SourceRange sourceRange;
if (referencedNode is VariableDeclaration) {
VariableDeclarationList parent = referencedNode.parent;
if (parent.variables.length == 1) {
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/replace_null_with_closure.dart b/pkg/analysis_server/lib/src/services/correction/dart/replace_null_with_closure.dart
index 7adfbe7..2bafcfb 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/replace_null_with_closure.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/replace_null_with_closure.dart
@@ -17,7 +17,7 @@
@override
Future<void> compute(ChangeBuilder builder) async {
- var nodeToFix;
+ AstNode nodeToFix;
var parameters = const <ParameterElement>[];
if (coveredNode is NamedExpression) {
NamedExpression namedExpression = coveredNode;
diff --git a/pkg/analysis_server/lib/src/services/kythe/kythe_visitors.dart b/pkg/analysis_server/lib/src/services/kythe/kythe_visitors.dart
index 99e8dd2..f2f430f 100644
--- a/pkg/analysis_server/lib/src/services/kythe/kythe_visitors.dart
+++ b/pkg/analysis_server/lib/src/services/kythe/kythe_visitors.dart
@@ -1225,7 +1225,7 @@
addNodeAndFacts(schema.TAPP_KIND, element: functionElement);
addEdge(funcTypeVName, schema.PARAM_EDGE, fnBuiltin, ordinalIntValue: i++);
- var returnTypeVName;
+ KytheVName returnTypeVName;
if (returnNode is TypeName) {
// MethodDeclaration and FunctionDeclaration both return a TypeName from
// returnType
diff --git a/pkg/analysis_server/lib/src/utilities/mocks.dart b/pkg/analysis_server/lib/src/utilities/mocks.dart
index 786162f..97d5420 100644
--- a/pkg/analysis_server/lib/src/utilities/mocks.dart
+++ b/pkg/analysis_server/lib/src/utilities/mocks.dart
@@ -128,7 +128,7 @@
}
class ServerError implements Exception {
- final message;
+ final String message;
ServerError(this.message);
diff --git a/pkg/analysis_server/test/analysis/notification_errors_test.dart b/pkg/analysis_server/test/analysis/notification_errors_test.dart
index aa6c33b..3e49eab 100644
--- a/pkg/analysis_server/test/analysis/notification_errors_test.dart
+++ b/pkg/analysis_server/test/analysis/notification_errors_test.dart
@@ -482,6 +482,10 @@
expect(errors, hasLength(0));
}
+ /// Re-enable once `sort_pub_dependencies` is fixed
+ /// See: https://github.com/dart-lang/sdk/issues/43529
+ /// See: https://github.com/dart-lang/linter/issues/2271
+ @failingTest
Future<void> test_pubspecFile_lint() async {
var optionsPath = join(projectPath, 'analysis_options.yaml');
newFile(optionsPath, content: '''
diff --git a/pkg/analysis_server/test/domain_completion_util.dart b/pkg/analysis_server/test/domain_completion_util.dart
index 81f936f..7d42cf0 100644
--- a/pkg/analysis_server/test/domain_completion_util.dart
+++ b/pkg/analysis_server/test/domain_completion_util.dart
@@ -46,7 +46,7 @@
bool isPotential = false,
int selectionOffset,
ElementKind elementKind}) {
- var cs;
+ CompletionSuggestion cs;
suggestions.forEach((s) {
if (elementKind != null && s.element?.kind != elementKind) {
return;
diff --git a/pkg/analysis_server/test/integration/support/integration_tests.dart b/pkg/analysis_server/test/integration/support/integration_tests.dart
index f58ca4d..8f34d32 100644
--- a/pkg/analysis_server/test/integration/support/integration_tests.dart
+++ b/pkg/analysis_server/test/integration/support/integration_tests.dart
@@ -479,7 +479,7 @@
}
_recordStdio('<== $trimmedLine');
- var message;
+ Map message;
try {
message = json.decoder.convert(trimmedLine);
} catch (exception) {
@@ -487,9 +487,8 @@
return;
}
outOfTestExpect(message, isMap);
- Map messageAsMap = message;
- if (messageAsMap.containsKey('id')) {
- outOfTestExpect(messageAsMap['id'], isString);
+ if (message.containsKey('id')) {
+ outOfTestExpect(message['id'], isString);
String id = message['id'];
var completer = _pendingCommands[id];
if (completer == null) {
@@ -497,10 +496,10 @@
} else {
_pendingCommands.remove(id);
}
- if (messageAsMap.containsKey('error')) {
- completer.completeError(ServerErrorMessage(messageAsMap));
+ if (message.containsKey('error')) {
+ completer.completeError(ServerErrorMessage(message));
} else {
- completer.complete(messageAsMap['result']);
+ completer.complete(message['result']);
}
// Check that the message is well-formed. We do this after calling
// completer.complete() or completer.completeError() so that we don't
@@ -509,9 +508,9 @@
} else {
// Message is a notification. It should have an event and possibly
// params.
- outOfTestExpect(messageAsMap, contains('event'));
- outOfTestExpect(messageAsMap['event'], isString);
- notificationProcessor(messageAsMap['event'], messageAsMap['params']);
+ outOfTestExpect(message, contains('event'));
+ outOfTestExpect(message['event'], isString);
+ notificationProcessor(message['event'], message['params']);
// Check that the message is well-formed. We do this after calling
// notificationController.add() so that we don't stall the test in the
// event of an error.
diff --git a/pkg/analysis_server/test/stress/replay/replay.dart b/pkg/analysis_server/test/stress/replay/replay.dart
index 64c5ea0..cc487bb 100644
--- a/pkg/analysis_server/test/stress/replay/replay.dart
+++ b/pkg/analysis_server/test/stress/replay/replay.dart
@@ -512,7 +512,7 @@
/// Return a list of operations to be sent to the server.
List<ServerOperation> getOperations() {
var operations = <ServerOperation>[];
- void addUpdateContent(var overlay) {
+ void addUpdateContent(Object overlay) {
operations.add(Analysis_UpdateContent(filePath, overlay));
}
@@ -522,7 +522,7 @@
addUpdateContent(AddContentOverlay(content));
for (var editList in editLists.reversed) {
for (var edit in editList.reversed) {
- var overlay;
+ Object overlay;
if (overlayStyle == OverlayStyle.change) {
overlay = ChangeContentOverlay([edit]);
} else if (overlayStyle == OverlayStyle.multipleAdd) {
diff --git a/pkg/analysis_server/tool/completion_metrics/completion_metrics.dart b/pkg/analysis_server/tool/completion_metrics/completion_metrics.dart
index 309d8a1..13f27be 100644
--- a/pkg/analysis_server/tool/completion_metrics/completion_metrics.dart
+++ b/pkg/analysis_server/tool/completion_metrics/completion_metrics.dart
@@ -506,15 +506,11 @@
bool doPrintMissedCompletions) {
assert(suggestions != null);
- var rank;
-
var place = placementInSuggestionList(suggestions, expectedCompletion);
metrics.mrrComputer.addRank(place.rank);
if (place.denominator != 0) {
- rank = place.rank;
-
metrics.completionCounter.count('successful');
metrics.recordCompletionResult(CompletionResult(place, request, listener,
@@ -527,9 +523,9 @@
_computeCharsBeforeTop(expectedCompletion, suggestions, minRank: 5));
metrics.insertionLengthTheoretical
.addValue(expectedCompletion.completion.length - charsBeforeTop);
- } else {
- rank = -1;
+ return place.rank;
+ } else {
metrics.completionCounter.count('unsuccessful');
metrics.completionMissedTokenCounter.count(expectedCompletion.completion);
@@ -538,7 +534,7 @@
.count(expectedCompletion.elementKind.toString());
if (doPrintMissedCompletions) {
- var closeMatchSuggestion;
+ protocol.CompletionSuggestion closeMatchSuggestion;
for (var suggestion in suggestions) {
if (suggestion.completion == expectedCompletion.completion) {
closeMatchSuggestion = suggestion;
@@ -553,8 +549,9 @@
}
print('');
}
+
+ return -1;
}
- return rank;
}
void printMetrics(CompletionMetrics metrics) {
@@ -713,7 +710,7 @@
[DeclarationsTracker declarationsTracker,
protocol.CompletionAvailableSuggestionsParams
availableSuggestionsParams]) async {
- var suggestions;
+ List<protocol.CompletionSuggestion> suggestions;
if (declarationsTracker == null) {
// available suggestions == false
@@ -801,8 +798,8 @@
// Set the DeclarationsTracker, only call doWork to build up the available
// suggestions if doComputeCompletionsFromAnalysisServer is true.
- var declarationsTracker;
- var availableSuggestionsParams;
+ DeclarationsTracker declarationsTracker;
+ protocol.CompletionAvailableSuggestionsParams availableSuggestionsParams;
if (availableSuggestions) {
declarationsTracker = DeclarationsTracker(
MemoryByteStore(), PhysicalResourceProvider.INSTANCE);
@@ -912,7 +909,7 @@
// First we compute the completions useNewRelevance set to
// false:
- var oldRank;
+ int oldRank;
if (!skipOldRelevance) {
oldRank = await handleExpectedCompletion(
metrics: metricsOldMode,
diff --git a/pkg/analysis_server/tool/completion_metrics/corpus.dart b/pkg/analysis_server/tool/completion_metrics/corpus.dart
index c79b368..71e09fb 100644
--- a/pkg/analysis_server/tool/completion_metrics/corpus.dart
+++ b/pkg/analysis_server/tool/completion_metrics/corpus.dart
@@ -74,7 +74,7 @@
final name =
_trimName(repo.split('https://github.com/').last.replaceAll('/', '_'));
final cloneDir = path.join(_appDir, name);
- var result;
+ ProcessResult result;
if (Directory(cloneDir).existsSync()) {
if (!updateExistingClones) {
return CloneResult(0, cloneDir);
diff --git a/pkg/analysis_server/tool/completion_metrics/visitors.dart b/pkg/analysis_server/tool/completion_metrics/visitors.dart
index b234a9b..0b130f7 100644
--- a/pkg/analysis_server/tool/completion_metrics/visitors.dart
+++ b/pkg/analysis_server/tool/completion_metrics/visitors.dart
@@ -571,7 +571,7 @@
@override
void visitSimpleIdentifier(SimpleIdentifier node) {
if (_doIncludeSimpleIdentifier(node)) {
- var elementKind;
+ protocol.ElementKind elementKind;
if (node.staticElement?.kind != null) {
elementKind = protocol.convertElementKind(node.staticElement.kind);
diff --git a/pkg/analyzer/lib/error/error.dart b/pkg/analyzer/lib/error/error.dart
index ea02226..ab4089c 100644
--- a/pkg/analyzer/lib/error/error.dart
+++ b/pkg/analyzer/lib/error/error.dart
@@ -260,6 +260,7 @@
CompileTimeErrorCode.LATE_FINAL_FIELD_WITH_CONST_CONSTRUCTOR,
CompileTimeErrorCode.LATE_FINAL_LOCAL_ALREADY_ASSIGNED,
CompileTimeErrorCode.LIST_ELEMENT_TYPE_NOT_ASSIGNABLE,
+ CompileTimeErrorCode.MAIN_FIRST_POSITIONAL_PARAMETER_TYPE,
CompileTimeErrorCode.MAIN_HAS_REQUIRED_NAMED_PARAMETERS,
CompileTimeErrorCode.MAIN_HAS_TOO_MANY_REQUIRED_POSITIONAL_PARAMETERS,
CompileTimeErrorCode.MAIN_IS_NOT_FUNCTION,
diff --git a/pkg/analyzer/lib/src/dart/ast/extensions.dart b/pkg/analyzer/lib/src/dart/ast/extensions.dart
index fd66ae4..0c42457 100644
--- a/pkg/analyzer/lib/src/dart/ast/extensions.dart
+++ b/pkg/analyzer/lib/src/dart/ast/extensions.dart
@@ -5,6 +5,24 @@
import 'package:analyzer/dart/ast/ast.dart';
import 'package:analyzer/src/dart/ast/ast.dart';
+extension FormalParameterExtension on FormalParameter {
+ FormalParameter get notDefault {
+ var self = this;
+ if (self is DefaultFormalParameter) {
+ return self.parameter;
+ }
+ return self;
+ }
+
+ AstNode get typeOrSelf {
+ var self = this;
+ if (self is SimpleFormalParameter) {
+ return self.type;
+ }
+ return self;
+ }
+}
+
extension ListOfFormalParameterExtension on List<FormalParameter> {
Iterable<FormalParameterImpl> get asImpl {
return cast<FormalParameterImpl>();
diff --git a/pkg/analyzer/lib/src/dart/resolver/binary_expression_resolver.dart b/pkg/analyzer/lib/src/dart/resolver/binary_expression_resolver.dart
index 2564ef7..7572eeb 100644
--- a/pkg/analyzer/lib/src/dart/resolver/binary_expression_resolver.dart
+++ b/pkg/analyzer/lib/src/dart/resolver/binary_expression_resolver.dart
@@ -176,6 +176,7 @@
InferenceContext.setType(left, _typeProvider.boolType);
InferenceContext.setType(right, _typeProvider.boolType);
+ flow?.logicalBinaryOp_begin();
left.accept(_resolver);
left = node.leftOperand;
@@ -213,6 +214,7 @@
InferenceContext.setType(left, _typeProvider.boolType);
InferenceContext.setType(right, _typeProvider.boolType);
+ flow?.logicalBinaryOp_begin();
left.accept(_resolver);
left = node.leftOperand;
diff --git a/pkg/analyzer/lib/src/error/codes.dart b/pkg/analyzer/lib/src/error/codes.dart
index 3197fa7..6ffb26a 100644
--- a/pkg/analyzer/lib/src/error/codes.dart
+++ b/pkg/analyzer/lib/src/error/codes.dart
@@ -5460,12 +5460,12 @@
"The element type '{0}' can't be assigned to the list type '{1}'.",
hasPublishedDocs: true);
- static const CompileTimeErrorCode
- MAIN_HAS_TOO_MANY_REQUIRED_POSITIONAL_PARAMETERS = CompileTimeErrorCode(
- 'MAIN_HAS_TOO_MANY_REQUIRED_POSITIONAL_PARAMETERS',
- "The function 'main' can't have more than two required positional parameters.",
- correction: "Try using a different name for the function, "
- "or removing extra parameters.",
+ static const CompileTimeErrorCode MAIN_FIRST_POSITIONAL_PARAMETER_TYPE =
+ CompileTimeErrorCode(
+ 'MAIN_FIRST_POSITIONAL_PARAMETER_TYPE',
+ "The type of the first positional parameter of the 'main' function "
+ "must be a supertype of List<String>.",
+ correction: "Try changing the type of the parameter.",
);
static const CompileTimeErrorCode MAIN_HAS_REQUIRED_NAMED_PARAMETERS =
@@ -5476,6 +5476,14 @@
"or removing the 'required' modifier.",
);
+ static const CompileTimeErrorCode
+ MAIN_HAS_TOO_MANY_REQUIRED_POSITIONAL_PARAMETERS = CompileTimeErrorCode(
+ 'MAIN_HAS_TOO_MANY_REQUIRED_POSITIONAL_PARAMETERS',
+ "The function 'main' can't have more than two required positional parameters.",
+ correction: "Try using a different name for the function, "
+ "or removing extra parameters.",
+ );
+
static const CompileTimeErrorCode MAIN_IS_NOT_FUNCTION = CompileTimeErrorCode(
'MAIN_IS_NOT_FUNCTION',
"The declaration named 'main' must be a function.",
diff --git a/pkg/analyzer/lib/src/generated/error_verifier.dart b/pkg/analyzer/lib/src/generated/error_verifier.dart
index 5ad8d00..dfc4756 100644
--- a/pkg/analyzer/lib/src/generated/error_verifier.dart
+++ b/pkg/analyzer/lib/src/generated/error_verifier.dart
@@ -17,6 +17,7 @@
import 'package:analyzer/error/listener.dart';
import 'package:analyzer/src/dart/analysis/session.dart';
import 'package:analyzer/src/dart/ast/ast.dart';
+import 'package:analyzer/src/dart/ast/extensions.dart';
import 'package:analyzer/src/dart/element/class_hierarchy.dart';
import 'package:analyzer/src/dart/element/element.dart';
import 'package:analyzer/src/dart/element/inheritance_manager3.dart';
@@ -3128,7 +3129,10 @@
return;
}
- var parameters = (element as FunctionElement).parameters;
+ var functionDeclaration = nameNode.parent as FunctionDeclaration;
+ var functionExpression = functionDeclaration.functionExpression;
+ var parameters = functionExpression.parameters.parameters;
+ var positional = parameters.where((e) => e.isPositional).toList();
var requiredPositional =
parameters.where((e) => e.isRequiredPositional).toList();
@@ -3145,6 +3149,18 @@
nameNode,
);
}
+
+ if (positional.isNotEmpty) {
+ var first = positional.first;
+ var type = first.declaredElement.type;
+ var listOfString = _typeProvider.listType2(_typeProvider.stringType);
+ if (!_typeSystem.isSubtypeOf2(listOfString, type)) {
+ _errorReporter.reportErrorForNode(
+ CompileTimeErrorCode.MAIN_FIRST_POSITIONAL_PARAMETER_TYPE,
+ first.notDefault.typeOrSelf,
+ );
+ }
+ }
}
void _checkForMapTypeNotAssignable(SetOrMapLiteral literal) {
diff --git a/pkg/analyzer/test/src/dart/resolution/assignment_test.dart b/pkg/analyzer/test/src/dart/resolution/assignment_test.dart
index 1af5544..3c5983e 100644
--- a/pkg/analyzer/test/src/dart/resolution/assignment_test.dart
+++ b/pkg/analyzer/test/src/dart/resolution/assignment_test.dart
@@ -1812,7 +1812,7 @@
test_simpleIdentifier_parameter_compound_refineType_int_int() async {
await assertNoErrorsInCode(r'''
-main(int x) {
+void f(int x) {
x += 1;
x -= 1;
x *= 1;
diff --git a/pkg/analyzer/test/src/dart/resolution/binary_expression_test.dart b/pkg/analyzer/test/src/dart/resolution/binary_expression_test.dart
index d35a83b..b484064 100644
--- a/pkg/analyzer/test/src/dart/resolution/binary_expression_test.dart
+++ b/pkg/analyzer/test/src/dart/resolution/binary_expression_test.dart
@@ -735,7 +735,7 @@
test_ifNull_nullableInt_int() async {
await assertNoErrorsInCode(r'''
-main(int? x, int y) {
+void f(int? x, int y) {
x ?? y;
}
''');
@@ -749,7 +749,7 @@
test_ifNull_nullableInt_nullableDouble() async {
await assertNoErrorsInCode(r'''
-main(int? x, double? y) {
+void f(int? x, double? y) {
x ?? y;
}
''');
@@ -763,7 +763,7 @@
test_ifNull_nullableInt_nullableInt() async {
await assertNoErrorsInCode(r'''
-main(int? x) {
+void f(int? x) {
x ?? x;
}
''');
diff --git a/pkg/analyzer/test/src/dart/resolution/function_expression_invocation_test.dart b/pkg/analyzer/test/src/dart/resolution/function_expression_invocation_test.dart
index 6d80f3d..a1bfdde 100644
--- a/pkg/analyzer/test/src/dart/resolution/function_expression_invocation_test.dart
+++ b/pkg/analyzer/test/src/dart/resolution/function_expression_invocation_test.dart
@@ -58,7 +58,7 @@
void call<T>(T t) {}
}
-main(A a) {
+void f(A a) {
a(0);
}
''');
@@ -102,7 +102,7 @@
}
}
-main(A a, int context) {
+void f(A a, int context) {
context = a();
}
''');
@@ -124,7 +124,7 @@
}
}
-main(A a) {
+void f(A a) {
a<int>();
}
''');
@@ -140,11 +140,11 @@
test_never() async {
await assertErrorsInCode(r'''
-main(Never x) {
+void f(Never x) {
x<int>(1 + 2);
}
''', [
- error(HintCode.RECEIVER_OF_TYPE_NEVER, 18, 1),
+ error(HintCode.RECEIVER_OF_TYPE_NEVER, 20, 1),
]);
assertFunctionExpressionInvocation(
@@ -160,11 +160,11 @@
test_neverQ() async {
await assertErrorsInCode(r'''
-main(Never? x) {
+void f(Never? x) {
x<int>(1 + 2);
}
''', [
- error(CompileTimeErrorCode.UNCHECKED_USE_OF_NULLABLE_VALUE, 19, 1),
+ error(CompileTimeErrorCode.UNCHECKED_USE_OF_NULLABLE_VALUE, 21, 1),
]);
assertFunctionExpressionInvocation(
diff --git a/pkg/analyzer/test/src/dart/resolution/if_element_test.dart b/pkg/analyzer/test/src/dart/resolution/if_element_test.dart
index 785f95a..7b76cf5 100644
--- a/pkg/analyzer/test/src/dart/resolution/if_element_test.dart
+++ b/pkg/analyzer/test/src/dart/resolution/if_element_test.dart
@@ -17,7 +17,7 @@
class IfElementTest extends PubPackageResolutionTest {
test_condition_rewrite() async {
await assertNoErrorsInCode(r'''
-main(bool Function() b) {
+void f(bool Function() b) {
<int>[if ( b() ) 0];
}
''');
diff --git a/pkg/analyzer/test/src/dart/resolution/index_expression_test.dart b/pkg/analyzer/test/src/dart/resolution/index_expression_test.dart
index a297211..77238af 100644
--- a/pkg/analyzer/test/src/dart/resolution/index_expression_test.dart
+++ b/pkg/analyzer/test/src/dart/resolution/index_expression_test.dart
@@ -22,7 +22,7 @@
bool operator[](int index) => false;
}
-main(A a) {
+void f(A a) {
a[0];
}
''');
@@ -48,7 +48,7 @@
T operator[](int index) => throw 42;
}
-main(A<double> a) {
+void f(A<double> a) {
a[0];
}
''');
@@ -78,7 +78,7 @@
void operator[]=(int index, num value) {}
}
-main(A a) {
+void f(A a) {
a[0] += 1.2;
}
''');
@@ -125,7 +125,7 @@
void operator[]=(int index, T value) {}
}
-main(A<double> a) {
+void f(A<double> a) {
a[0] += 1.2;
}
''');
@@ -183,7 +183,7 @@
void operator[]=(int index, num value) {}
}
-main(A a) {
+void f(A a) {
a[0] = 1.2;
}
''');
@@ -221,7 +221,7 @@
void operator[]=(int index, T value) {}
}
-main(A<double> a) {
+void f(A<double> a) {
a[0] = 1.2;
}
''');
@@ -269,7 +269,7 @@
bool operator[](int index) => false;
}
-main(A? a) {
+void f(A? a) {
a?..[0]..[1];
}
''');
@@ -299,7 +299,7 @@
bool operator[](int index) => false;
}
-main(A? a) {
+void f(A? a) {
a?[0];
}
''');
@@ -322,7 +322,7 @@
void operator[]=(int index, num value) {}
}
-main(A? a) {
+void f(A? a) {
a?[0] += 1.2;
}
''');
@@ -365,7 +365,7 @@
void operator[]=(int index, A a) {}
}
-main(A? a) {
+void f(A? a) {
a?..[0] = a..[1] = a;
}
''');
@@ -395,7 +395,7 @@
void operator[]=(int index, num value) {}
}
-main(A? a) {
+void f(A? a) {
a?[0] = 1.2;
}
''');
diff --git a/pkg/analyzer/test/src/dart/resolution/method_invocation_test.dart b/pkg/analyzer/test/src/dart/resolution/method_invocation_test.dart
index 93ca075..18dc935 100644
--- a/pkg/analyzer/test/src/dart/resolution/method_invocation_test.dart
+++ b/pkg/analyzer/test/src/dart/resolution/method_invocation_test.dart
@@ -465,11 +465,11 @@
static void foo(int _) {}
}
-main(A a) {
+void f(A a) {
a.foo(0);
}
''', [
- error(CompileTimeErrorCode.INSTANCE_ACCESS_TO_STATIC_MEMBER, 57, 3),
+ error(CompileTimeErrorCode.INSTANCE_ACCESS_TO_STATIC_MEMBER, 59, 3),
]);
assertMethodInvocation2(
findNode.methodInvocation('a.foo(0)'),
@@ -486,11 +486,11 @@
void Function() call = throw Error();
}
-main(C c) {
+void f(C c) {
c();
}
''', [
- error(CompileTimeErrorCode.INVOCATION_OF_NON_FUNCTION_EXPRESSION, 67, 1),
+ error(CompileTimeErrorCode.INVOCATION_OF_NON_FUNCTION_EXPRESSION, 69, 1),
]);
var invocation = findNode.functionExpressionInvocation('c();');
@@ -509,7 +509,7 @@
var foo;
}
-main(C c) {
+void f(C c) {
c.foo();
}
''');
@@ -1090,13 +1090,13 @@
C(this.foo);
}
-main(C<void> c) {
+void f(C<void> c) {
c.foo();
}
''', [
if (typeToStringWithNullability)
- error(CompileTimeErrorCode.UNCHECKED_USE_OF_NULLABLE_VALUE, 59, 5),
- error(CompileTimeErrorCode.USE_OF_VOID_RESULT, 59, 5),
+ error(CompileTimeErrorCode.UNCHECKED_USE_OF_NULLABLE_VALUE, 61, 5),
+ error(CompileTimeErrorCode.USE_OF_VOID_RESULT, 61, 5),
]);
var invocation = findNode.functionExpressionInvocation('foo();');
@@ -1448,7 +1448,7 @@
test_hasReceiver_instance_Function_call_localVariable() async {
await assertNoErrorsInCode(r'''
-void main(Function getFunction()) {
+void f(Function getFunction()) {
Function foo = getFunction();
foo.call(0);
@@ -1474,7 +1474,7 @@
double Function(int) get foo => throw Error();
}
-main(C c) {
+void f(C c) {
c.foo(0);
}
''');
@@ -1496,7 +1496,7 @@
void foo(int _) {}
}
-main(C c) {
+void f(C c) {
c.foo(0);
}
''');
@@ -1519,7 +1519,7 @@
}
}
-main(C c) {
+void f(C c) {
c.foo(0);
}
''');
@@ -1551,7 +1551,7 @@
void foo(Object o) {}
}
-void main(C c) {
+void f(C c) {
c.foo('hi');
}
''');
@@ -1797,7 +1797,7 @@
void call(int _) {}
}
-main(C c) {
+void f(C c) {
c(0);
}
''');
@@ -1874,7 +1874,7 @@
test_noReceiver_parameter() async {
await assertNoErrorsInCode(r'''
-main(void Function(int) foo) {
+void f(void Function(int) foo) {
foo(0);
}
''');
@@ -2332,7 +2332,7 @@
test_hasReceiver_interfaceQ_Function_call_checked() async {
await assertNoErrorsInCode(r'''
-void main(Function? foo) {
+void f(Function? foo) {
foo?.call();
}
''');
@@ -2348,11 +2348,11 @@
test_hasReceiver_interfaceQ_Function_call_unchecked() async {
await assertErrorsInCode(r'''
-void main(Function? foo) {
+void f(Function? foo) {
foo.call();
}
''', [
- error(CompileTimeErrorCode.UNCHECKED_USE_OF_NULLABLE_VALUE, 29, 3),
+ error(CompileTimeErrorCode.UNCHECKED_USE_OF_NULLABLE_VALUE, 26, 3),
]);
assertMethodInvocation2(
@@ -2399,11 +2399,11 @@
void foo() {}
}
-main(A? a) {
+void f(A? a) {
a.foo();
}
''', [
- error(CompileTimeErrorCode.UNCHECKED_USE_OF_NULLABLE_VALUE, 44, 1),
+ error(CompileTimeErrorCode.UNCHECKED_USE_OF_NULLABLE_VALUE, 46, 1),
]);
assertMethodInvocation2(
@@ -2425,11 +2425,11 @@
void foo() {}
}
-main(A? a) {
+void f(A? a) {
a.foo();
}
''', [
- error(CompileTimeErrorCode.UNCHECKED_USE_OF_NULLABLE_VALUE, 82, 1),
+ error(CompileTimeErrorCode.UNCHECKED_USE_OF_NULLABLE_VALUE, 84, 1),
]);
assertMethodInvocation2(
@@ -2451,7 +2451,7 @@
void foo() {}
}
-main(A? a) {
+void f(A? a) {
a.foo();
}
''');
@@ -2471,7 +2471,7 @@
T foo() => throw 0;
}
-main(int? a) {
+void f(int? a) {
a.foo();
}
''');
@@ -2492,11 +2492,11 @@
await assertErrorsInCode(r'''
class A {}
-main(A? a) {
+void f(A? a) {
a.foo();
}
''', [
- error(CompileTimeErrorCode.UNCHECKED_USE_OF_NULLABLE_VALUE, 27, 1),
+ error(CompileTimeErrorCode.UNCHECKED_USE_OF_NULLABLE_VALUE, 29, 1),
]);
assertMethodInvocation2(
@@ -2516,11 +2516,11 @@
void foo() {}
}
-main(A? a) {
+void f(A? a) {
a.foo();
}
''', [
- error(CompileTimeErrorCode.UNCHECKED_USE_OF_NULLABLE_VALUE, 65, 1),
+ error(CompileTimeErrorCode.UNCHECKED_USE_OF_NULLABLE_VALUE, 67, 1),
]);
assertMethodInvocation2(
@@ -2540,7 +2540,7 @@
void foo() {}
}
-main(A? a) {
+void f(A? a) {
a.foo();
}
''');
@@ -2579,7 +2579,7 @@
int bar() => 0;
}
-main(A? a) {
+void f(A? a) {
a?..foo()..bar();
}
''');
@@ -2610,7 +2610,7 @@
int bar() => 0;
}
-main(A? a) {
+void f(A? a) {
a?..foo..bar();
}
''');
diff --git a/pkg/analyzer/test/src/dart/resolution/non_nullable_test.dart b/pkg/analyzer/test/src/dart/resolution/non_nullable_test.dart
index bbedc1c..c705570 100644
--- a/pkg/analyzer/test/src/dart/resolution/non_nullable_test.dart
+++ b/pkg/analyzer/test/src/dart/resolution/non_nullable_test.dart
@@ -164,13 +164,13 @@
test_local_typeParameter() async {
await assertErrorsInCode('''
-main<T>(T a) {
+void f<T>(T a) {
T x = a;
T? y;
}
''', [
- error(HintCode.UNUSED_LOCAL_VARIABLE, 19, 1),
- error(HintCode.UNUSED_LOCAL_VARIABLE, 31, 1),
+ error(HintCode.UNUSED_LOCAL_VARIABLE, 21, 1),
+ error(HintCode.UNUSED_LOCAL_VARIABLE, 33, 1),
]);
assertType(findNode.typeName('T x'), 'T');
@@ -290,7 +290,7 @@
test_parameter_genericFunctionType() async {
await assertNoErrorsInCode('''
-main(int? Function(bool, String?)? a) {
+void f(int? Function(bool, String?)? a) {
}
''');
@@ -302,8 +302,8 @@
test_parameter_getterNullAwareAccess_interfaceType() async {
await assertNoErrorsInCode(r'''
-main(int? x) {
- return x?.isEven;
+void f(int? x) {
+ x?.isEven;
}
''');
@@ -312,7 +312,7 @@
test_parameter_interfaceType() async {
await assertNoErrorsInCode('''
-main(int? a, int b) {
+void f(int? a, int b) {
}
''');
@@ -338,8 +338,8 @@
bool x() => true;
}
-main(C? c) {
- return c?.x();
+void f(C? c) {
+ c?.x();
}
''');
@@ -348,7 +348,7 @@
test_parameter_nullCoalesceAssign_nullableInt_int() async {
await assertNoErrorsInCode(r'''
-main(int? x, int y) {
+void f(int? x, int y) {
x ??= y;
}
''');
@@ -357,7 +357,7 @@
test_parameter_nullCoalesceAssign_nullableInt_nullableInt() async {
await assertNoErrorsInCode(r'''
-main(int? x) {
+void f(int? x) {
x ??= x;
}
''');
@@ -366,7 +366,7 @@
test_parameter_typeParameter() async {
await assertNoErrorsInCode('''
-main<T>(T a, T? b) {
+void f<T>(T a, T? b) {
}
''');
@@ -409,7 +409,7 @@
await assertNoErrorsInCode('''
typedef F<T> = int Function(T)?;
-main(F<int> a, F<double>? b) {}
+void f(F<int> a, F<double>? b) {}
''');
assertType(findNode.typeName('F<int>'), 'int Function(int)?');
diff --git a/pkg/analyzer/test/src/dart/resolution/property_access_test.dart b/pkg/analyzer/test/src/dart/resolution/property_access_test.dart
index 9f951dc..2d0516f 100644
--- a/pkg/analyzer/test/src/dart/resolution/property_access_test.dart
+++ b/pkg/analyzer/test/src/dart/resolution/property_access_test.dart
@@ -545,7 +545,7 @@
int get bar => 0;
}
-main(A? a) {
+void f(A? a) {
a?..foo..bar;
}
''');
diff --git a/pkg/analyzer/test/src/dart/resolution/type_inference/conditional_expression_test.dart b/pkg/analyzer/test/src/dart/resolution/type_inference/conditional_expression_test.dart
index ac8f412..d52a86d 100644
--- a/pkg/analyzer/test/src/dart/resolution/type_inference/conditional_expression_test.dart
+++ b/pkg/analyzer/test/src/dart/resolution/type_inference/conditional_expression_test.dart
@@ -43,8 +43,8 @@
test_type() async {
await assertNoErrorsInCode('''
-main(bool b) {
- return b ? 42 : null;
+void f(bool b) {
+ b ? 42 : null;
}
''');
assertType(findNode.conditionalExpression('b ?'), 'int?');
diff --git a/pkg/analyzer/test/src/dart/resolution/type_inference/extension_methods_test.dart b/pkg/analyzer/test/src/dart/resolution/type_inference/extension_methods_test.dart
index d9581ac..43c92f8 100644
--- a/pkg/analyzer/test/src/dart/resolution/type_inference/extension_methods_test.dart
+++ b/pkg/analyzer/test/src/dart/resolution/type_inference/extension_methods_test.dart
@@ -94,7 +94,7 @@
Map<T, U> foo<U>(U value) => <T, U>{};
}
-main(String a) {
+void f(String a) {
a.foo(0);
}
''');
diff --git a/pkg/analyzer/test/src/dart/resolution/type_inference/list_literal_test.dart b/pkg/analyzer/test/src/dart/resolution/type_inference/list_literal_test.dart
index 53cb664..6e1258e 100644
--- a/pkg/analyzer/test/src/dart/resolution/type_inference/list_literal_test.dart
+++ b/pkg/analyzer/test/src/dart/resolution/type_inference/list_literal_test.dart
@@ -273,7 +273,7 @@
await assertNoErrorsInCode(r'''
mixin L on List<int> {}
-main(L l1) {
+void f(L l1) {
// ignore:unused_local_variable
var l2 = [...l1];
}
diff --git a/pkg/analyzer/test/src/dart/resolution/type_inference/map_literal_test.dart b/pkg/analyzer/test/src/dart/resolution/type_inference/map_literal_test.dart
index 594ad86..eb7d745 100644
--- a/pkg/analyzer/test/src/dart/resolution/type_inference/map_literal_test.dart
+++ b/pkg/analyzer/test/src/dart/resolution/type_inference/map_literal_test.dart
@@ -292,7 +292,7 @@
await assertNoErrorsInCode(r'''
mixin M on Map<String, int> {}
-main(M m1) {
+void f(M m1) {
// ignore:unused_local_variable
var m2 = {...m1};
}
diff --git a/pkg/analyzer/test/src/diagnostics/argument_type_not_assignable_test.dart b/pkg/analyzer/test/src/diagnostics/argument_type_not_assignable_test.dart
index eacdbcd..d62e2fa 100644
--- a/pkg/analyzer/test/src/diagnostics/argument_type_not_assignable_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/argument_type_not_assignable_test.dart
@@ -448,15 +448,15 @@
bool operator==(covariant A other) => false;
}
-main(A a, A? aq) {
+void f(A a, A? aq) {
a == 0;
aq == 1;
aq == aq;
aq == null;
}
''', [
- error(CompileTimeErrorCode.ARGUMENT_TYPE_NOT_ASSIGNABLE, 86, 1),
- error(CompileTimeErrorCode.ARGUMENT_TYPE_NOT_ASSIGNABLE, 97, 1),
+ error(CompileTimeErrorCode.ARGUMENT_TYPE_NOT_ASSIGNABLE, 88, 1),
+ error(CompileTimeErrorCode.ARGUMENT_TYPE_NOT_ASSIGNABLE, 99, 1),
]);
}
diff --git a/pkg/analyzer/test/src/diagnostics/dead_code_test.dart b/pkg/analyzer/test/src/diagnostics/dead_code_test.dart
index b261479..effa025 100644
--- a/pkg/analyzer/test/src/diagnostics/dead_code_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/dead_code_test.dart
@@ -404,7 +404,7 @@
test_flowEnd_ifStatement() async {
await assertErrorsInCode(r'''
-main(bool a) {
+void f(bool a) {
if (a) {
return;
1;
@@ -412,7 +412,7 @@
2;
}
''', [
- error(HintCode.DEAD_CODE, 42, 2),
+ error(HintCode.DEAD_CODE, 44, 2),
]);
}
diff --git a/pkg/analyzer/test/src/diagnostics/main_first_positional_parameter_type_test.dart b/pkg/analyzer/test/src/diagnostics/main_first_positional_parameter_type_test.dart
new file mode 100644
index 0000000..43b7fa9
--- /dev/null
+++ b/pkg/analyzer/test/src/diagnostics/main_first_positional_parameter_type_test.dart
@@ -0,0 +1,95 @@
+// Copyright (c) 2020, 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.
+
+import 'package:analyzer/src/error/codes.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import '../dart/resolution/context_collection_resolution.dart';
+
+main() {
+ defineReflectiveSuite(() {
+ defineReflectiveTests(MainFirstPositionalParameterTest);
+ defineReflectiveTests(MainFirstPositionalParameterWithNullSafetyTest);
+ });
+}
+
+@reflectiveTest
+class MainFirstPositionalParameterTest extends PubPackageResolutionTest
+ with MainFirstPositionalParameterTestCases {}
+
+mixin MainFirstPositionalParameterTestCases on PubPackageResolutionTest {
+ test_positionalOptional_listOfInt() async {
+ await resolveTestCode('''
+void main([List<int> args = const []]) {}
+''');
+ assertErrorsInResult(expectedErrorsByNullability(nullable: [
+ error(CompileTimeErrorCode.MAIN_FIRST_POSITIONAL_PARAMETER_TYPE, 11, 9),
+ ], legacy: []));
+ }
+
+ test_positionalRequired_dynamic() async {
+ await assertNoErrorsInCode('''
+void main(dynamic args) {}
+''');
+ }
+
+ test_positionalRequired_functionTypedFormal() async {
+ await resolveTestCode('''
+void main(void args()) {}
+''');
+ assertErrorsInResult(expectedErrorsByNullability(nullable: [
+ error(CompileTimeErrorCode.MAIN_FIRST_POSITIONAL_PARAMETER_TYPE, 10, 11),
+ ], legacy: []));
+ }
+
+ test_positionalRequired_iterableOfString() async {
+ await assertNoErrorsInCode('''
+void main(Iterable<String> args) {}
+''');
+ }
+
+ test_positionalRequired_listOfInt() async {
+ await resolveTestCode('''
+void main(List<int> args) {}
+''');
+ assertErrorsInResult(expectedErrorsByNullability(nullable: [
+ error(CompileTimeErrorCode.MAIN_FIRST_POSITIONAL_PARAMETER_TYPE, 10, 9),
+ ], legacy: []));
+ }
+
+ test_positionalRequired_listOfString() async {
+ await assertNoErrorsInCode('''
+void main(List<String> args) {}
+''');
+ }
+
+ test_positionalRequired_object() async {
+ await assertNoErrorsInCode('''
+void main(Object args) {}
+''');
+ }
+}
+
+@reflectiveTest
+class MainFirstPositionalParameterWithNullSafetyTest
+ extends PubPackageResolutionTest
+ with WithNullSafetyMixin, MainFirstPositionalParameterTestCases {
+ test_positionalRequired_listOfStringQuestion() async {
+ await assertNoErrorsInCode('''
+void main(List<String?> args) {}
+''');
+ }
+
+ test_positionalRequired_listQuestionOfString() async {
+ await assertNoErrorsInCode('''
+void main(List<String>? args) {}
+''');
+ }
+
+ test_positionalRequired_objectQuestion() async {
+ await assertNoErrorsInCode('''
+void main(Object? args) {}
+''');
+ }
+}
diff --git a/pkg/analyzer/test/src/diagnostics/main_has_too_many_required_positional_parameters_test.dart b/pkg/analyzer/test/src/diagnostics/main_has_too_many_required_positional_parameters_test.dart
index f965d4c..6457de5 100644
--- a/pkg/analyzer/test/src/diagnostics/main_has_too_many_required_positional_parameters_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/main_has_too_many_required_positional_parameters_test.dart
@@ -32,7 +32,7 @@
test_positionalOptional_1() async {
await resolveTestCode('''
-void main([int a = 0]) {}
+void f([int a = 0]) {}
''');
assertNoErrorsInResult();
}
diff --git a/pkg/analyzer/test/src/diagnostics/not_assigned_potentially_non_nullable_local_variable_test.dart b/pkg/analyzer/test/src/diagnostics/not_assigned_potentially_non_nullable_local_variable_test.dart
index 16a01ee..3154db5 100644
--- a/pkg/analyzer/test/src/diagnostics/not_assigned_potentially_non_nullable_local_variable_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/not_assigned_potentially_non_nullable_local_variable_test.dart
@@ -138,7 +138,7 @@
test_binaryExpression_logicalAnd_left() async {
await assertNoErrorsInCode(r'''
-main(bool c) {
+void f(bool c) {
int v;
((v = 0) >= 0) && c;
v;
@@ -148,19 +148,19 @@
test_binaryExpression_logicalAnd_right() async {
await assertErrorsInCode(r'''
-main(bool c) {
+void f(bool c) {
int v;
c && ((v = 0) >= 0);
v;
}
''', [
- _notAssignedError(49, 1),
+ _notAssignedError(51, 1),
]);
}
test_binaryExpression_logicalOr_left() async {
await assertNoErrorsInCode(r'''
-main(bool c) {
+void f(bool c) {
int v;
((v = 0) >= 0) || c;
v;
@@ -170,13 +170,13 @@
test_binaryExpression_logicalOr_right() async {
await assertErrorsInCode(r'''
-main(bool c) {
+void f(bool c) {
int v;
c || ((v = 0) >= 0);
v;
}
''', [
- _notAssignedError(49, 1),
+ _notAssignedError(51, 1),
]);
}
@@ -834,7 +834,7 @@
test_if_then() async {
await assertErrorsInCode(r'''
-main(bool c) {
+void f(bool c) {
int v;
if (c) {
v = 0;
@@ -842,13 +842,13 @@
v;
}
''', [
- _notAssignedError(52, 1),
+ _notAssignedError(54, 1),
]);
}
test_if_thenElse_all() async {
await assertNoErrorsInCode(r'''
-main(bool c) {
+void f(bool c) {
int v;
if (c) {
v = 0;
@@ -864,7 +864,7 @@
test_if_thenElse_else() async {
await assertErrorsInCode(r'''
-main(bool c) {
+void f(bool c) {
int v;
if (c) {
// not assigned
@@ -874,13 +874,13 @@
v;
}
''', [
- _notAssignedError(83, 1),
+ _notAssignedError(85, 1),
]);
}
test_if_thenElse_then() async {
await assertErrorsInCode(r'''
-main(bool c) {
+void f(bool c) {
int v;
if (c) {
v = 0;
@@ -890,7 +890,7 @@
v;
}
''', [
- _notAssignedError(83, 1),
+ _notAssignedError(85, 1),
]);
}
diff --git a/pkg/analyzer/test/src/diagnostics/receiver_of_type_never_test.dart b/pkg/analyzer/test/src/diagnostics/receiver_of_type_never_test.dart
index 36645a4..3574235 100644
--- a/pkg/analyzer/test/src/diagnostics/receiver_of_type_never_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/receiver_of_type_never_test.dart
@@ -19,12 +19,12 @@
with WithNullSafetyMixin {
test_binaryExpression_never_eqEq() async {
await assertErrorsInCode(r'''
-void main(Never x) {
+void f(Never x) {
x == 1 + 2;
}
''', [
- error(HintCode.RECEIVER_OF_TYPE_NEVER, 23, 1),
- error(HintCode.DEAD_CODE, 28, 6),
+ error(HintCode.RECEIVER_OF_TYPE_NEVER, 20, 1),
+ error(HintCode.DEAD_CODE, 25, 6),
]);
assertBinaryExpression(
@@ -38,12 +38,12 @@
test_binaryExpression_never_plus() async {
await assertErrorsInCode(r'''
-void main(Never x) {
+void f(Never x) {
x + (1 + 2);
}
''', [
- error(HintCode.RECEIVER_OF_TYPE_NEVER, 23, 1),
- error(HintCode.DEAD_CODE, 27, 8),
+ error(HintCode.RECEIVER_OF_TYPE_NEVER, 20, 1),
+ error(HintCode.DEAD_CODE, 24, 8),
]);
assertBinaryExpression(
@@ -57,7 +57,7 @@
test_binaryExpression_neverQ_eqEq() async {
await assertNoErrorsInCode(r'''
-void main(Never? x) {
+void f(Never? x) {
x == 1 + 2;
}
''');
@@ -73,11 +73,11 @@
test_binaryExpression_neverQ_plus() async {
await assertErrorsInCode(r'''
-void main(Never? x) {
+void f(Never? x) {
x + (1 + 2);
}
''', [
- error(CompileTimeErrorCode.UNCHECKED_USE_OF_NULLABLE_VALUE, 24, 1),
+ error(CompileTimeErrorCode.UNCHECKED_USE_OF_NULLABLE_VALUE, 21, 1),
]);
assertBinaryExpression(
@@ -91,7 +91,7 @@
test_conditionalExpression_falseBranch() async {
await assertNoErrorsInCode(r'''
-void main(bool c, Never x) {
+void f(bool c, Never x) {
c ? 0 : x;
}
''');
@@ -99,7 +99,7 @@
test_conditionalExpression_trueBranch() async {
await assertNoErrorsInCode(r'''
-void main(bool c, Never x) {
+void f(bool c, Never x) {
c ? x : 0;
}
''');
@@ -107,32 +107,32 @@
test_functionExpressionInvocation_never() async {
await assertErrorsInCode(r'''
-void main(Never x) {
+void f(Never x) {
x();
}
''', [
- error(HintCode.RECEIVER_OF_TYPE_NEVER, 23, 1),
+ error(HintCode.RECEIVER_OF_TYPE_NEVER, 20, 1),
]);
}
test_functionExpressionInvocation_neverQ() async {
await assertErrorsInCode(r'''
-void main(Never? x) {
+void f(Never? x) {
x();
}
''', [
- error(CompileTimeErrorCode.UNCHECKED_USE_OF_NULLABLE_VALUE, 24, 1),
+ error(CompileTimeErrorCode.UNCHECKED_USE_OF_NULLABLE_VALUE, 21, 1),
]);
}
test_indexExpression_never_read() async {
await assertErrorsInCode(r'''
-void main(Never x) {
+void f(Never x) {
x[0];
}
''', [
- error(HintCode.RECEIVER_OF_TYPE_NEVER, 23, 1),
- error(HintCode.DEAD_CODE, 25, 3),
+ error(HintCode.RECEIVER_OF_TYPE_NEVER, 20, 1),
+ error(HintCode.DEAD_CODE, 22, 3),
]);
assertIndexExpression(
@@ -145,12 +145,12 @@
test_indexExpression_never_readWrite() async {
await assertErrorsInCode(r'''
-void main(Never x) {
+void f(Never x) {
x[0] += 1 + 2;
}
''', [
- error(HintCode.RECEIVER_OF_TYPE_NEVER, 23, 1),
- error(HintCode.DEAD_CODE, 25, 12),
+ error(HintCode.RECEIVER_OF_TYPE_NEVER, 20, 1),
+ error(HintCode.DEAD_CODE, 22, 12),
]);
assertIndexExpression(
@@ -165,12 +165,12 @@
test_indexExpression_never_write() async {
await assertErrorsInCode(r'''
-void main(Never x) {
+void f(Never x) {
x[0] = 1 + 2;
}
''', [
- error(HintCode.RECEIVER_OF_TYPE_NEVER, 23, 1),
- error(HintCode.DEAD_CODE, 25, 11),
+ error(HintCode.RECEIVER_OF_TYPE_NEVER, 20, 1),
+ error(HintCode.DEAD_CODE, 22, 11),
]);
assertIndexExpression(
@@ -185,11 +185,11 @@
test_indexExpression_neverQ_read() async {
await assertErrorsInCode(r'''
-void main(Never? x) {
+void f(Never? x) {
x[0];
}
''', [
- error(CompileTimeErrorCode.UNCHECKED_USE_OF_NULLABLE_VALUE, 24, 1),
+ error(CompileTimeErrorCode.UNCHECKED_USE_OF_NULLABLE_VALUE, 21, 1),
]);
assertIndexExpression(
@@ -202,11 +202,11 @@
test_indexExpression_neverQ_readWrite() async {
await assertErrorsInCode(r'''
-void main(Never? x) {
+void f(Never? x) {
x[0] += 1 + 2;
}
''', [
- error(CompileTimeErrorCode.UNCHECKED_USE_OF_NULLABLE_VALUE, 24, 1),
+ error(CompileTimeErrorCode.UNCHECKED_USE_OF_NULLABLE_VALUE, 21, 1),
]);
assertIndexExpression(
@@ -221,11 +221,11 @@
test_indexExpression_neverQ_write() async {
await assertErrorsInCode(r'''
-void main(Never? x) {
+void f(Never? x) {
x[0] = 1 + 2;
}
''', [
- error(CompileTimeErrorCode.UNCHECKED_USE_OF_NULLABLE_VALUE, 24, 1),
+ error(CompileTimeErrorCode.UNCHECKED_USE_OF_NULLABLE_VALUE, 21, 1),
]);
assertIndexExpression(
@@ -240,20 +240,20 @@
test_invocationArgument() async {
await assertNoErrorsInCode(r'''
-void main(f, Never x) {
- f(x);
+void f(g, Never x) {
+ g(x);
}
''');
}
test_methodInvocation_never() async {
await assertErrorsInCode(r'''
-void main(Never x) {
+void f(Never x) {
x.foo(1 + 2);
}
''', [
- error(HintCode.RECEIVER_OF_TYPE_NEVER, 23, 1),
- error(HintCode.DEAD_CODE, 28, 8),
+ error(HintCode.RECEIVER_OF_TYPE_NEVER, 20, 1),
+ error(HintCode.DEAD_CODE, 25, 8),
]);
assertMethodInvocation(
@@ -269,12 +269,12 @@
test_methodInvocation_never_toString() async {
await assertErrorsInCode(r'''
-void main(Never x) {
+void f(Never x) {
x.toString(1 + 2);
}
''', [
- error(HintCode.RECEIVER_OF_TYPE_NEVER, 23, 1),
- error(HintCode.DEAD_CODE, 33, 8),
+ error(HintCode.RECEIVER_OF_TYPE_NEVER, 20, 1),
+ error(HintCode.DEAD_CODE, 30, 8),
]);
assertMethodInvocation(
@@ -290,11 +290,11 @@
test_methodInvocation_neverQ_toString() async {
await assertErrorsInCode(r'''
-void main(Never? x) {
+void f(Never? x) {
x.toString(1 + 2);
}
''', [
- error(CompileTimeErrorCode.EXTRA_POSITIONAL_ARGUMENTS, 34, 7),
+ error(CompileTimeErrorCode.EXTRA_POSITIONAL_ARGUMENTS, 31, 7),
]);
assertMethodInvocation(
@@ -310,11 +310,11 @@
test_postfixExpression_never_plusPlus() async {
await assertErrorsInCode(r'''
-void main(Never x) {
+void f(Never x) {
x++;
}
''', [
- error(HintCode.RECEIVER_OF_TYPE_NEVER, 23, 1),
+ error(HintCode.RECEIVER_OF_TYPE_NEVER, 20, 1),
]);
assertPostfixExpression(
@@ -330,11 +330,11 @@
test_postfixExpression_neverQ_plusPlus() async {
await assertErrorsInCode(r'''
-void main(Never? x) {
+void f(Never? x) {
x++;
}
''', [
- error(CompileTimeErrorCode.UNCHECKED_USE_OF_NULLABLE_VALUE, 24, 1),
+ error(CompileTimeErrorCode.UNCHECKED_USE_OF_NULLABLE_VALUE, 21, 1),
]);
assertPostfixExpression(
@@ -351,11 +351,11 @@
test_prefixExpression_never_plusPlus() async {
// Reports 'undefined operator'
await assertErrorsInCode(r'''
-void main(Never x) {
+void f(Never x) {
++x;
}
''', [
- error(HintCode.RECEIVER_OF_TYPE_NEVER, 25, 1),
+ error(HintCode.RECEIVER_OF_TYPE_NEVER, 22, 1),
]);
assertPrefixExpression(
@@ -371,11 +371,11 @@
test_prefixExpression_neverQ_plusPlus() async {
await assertErrorsInCode(r'''
-void main(Never? x) {
+void f(Never? x) {
++x;
}
''', [
- error(CompileTimeErrorCode.UNCHECKED_USE_OF_NULLABLE_VALUE, 26, 1),
+ error(CompileTimeErrorCode.UNCHECKED_USE_OF_NULLABLE_VALUE, 23, 1),
]);
assertPrefixExpression(
@@ -391,7 +391,7 @@
test_propertyAccess_never_read() async {
await assertNoErrorsInCode(r'''
-void main(Never x) {
+void f(Never x) {
x.foo;
}
''');
@@ -406,7 +406,7 @@
test_propertyAccess_never_read_hashCode() async {
await assertNoErrorsInCode(r'''
-void main(Never x) {
+void f(Never x) {
x.hashCode;
}
''');
@@ -421,11 +421,11 @@
test_propertyAccess_never_readWrite() async {
await assertErrorsInCode(r'''
-void main(Never x) {
+void f(Never x) {
x.foo += 0;
}
''', [
- error(HintCode.DEAD_CODE, 32, 2),
+ error(HintCode.DEAD_CODE, 29, 2),
]);
assertSimpleIdentifier(
@@ -448,7 +448,7 @@
test_propertyAccess_never_tearOff_toString() async {
await assertNoErrorsInCode(r'''
-void main(Never x) {
+void f(Never x) {
x.toString;
}
''');
@@ -463,11 +463,11 @@
test_propertyAccess_never_write() async {
await assertErrorsInCode(r'''
-void main(Never x) {
+void f(Never x) {
x.foo = 0;
}
''', [
- error(HintCode.DEAD_CODE, 31, 2),
+ error(HintCode.DEAD_CODE, 28, 2),
]);
assertSimpleIdentifier(
@@ -490,11 +490,11 @@
test_propertyAccess_neverQ_read() async {
await assertErrorsInCode(r'''
-void main(Never? x) {
+void f(Never? x) {
x.foo;
}
''', [
- error(CompileTimeErrorCode.UNCHECKED_USE_OF_NULLABLE_VALUE, 24, 1),
+ error(CompileTimeErrorCode.UNCHECKED_USE_OF_NULLABLE_VALUE, 21, 1),
]);
assertSimpleIdentifier(
@@ -507,7 +507,7 @@
test_propertyAccess_neverQ_read_hashCode() async {
await assertNoErrorsInCode(r'''
-void main(Never? x) {
+void f(Never? x) {
x.hashCode;
}
''');
@@ -522,7 +522,7 @@
test_propertyAccess_neverQ_tearOff_toString() async {
await assertNoErrorsInCode(r'''
-void main(Never? x) {
+void f(Never? x) {
x.toString;
}
''');
@@ -540,7 +540,7 @@
class InvalidUseOfNeverTest_Legacy extends PubPackageResolutionTest {
test_binaryExpression_eqEq() async {
await assertNoErrorsInCode(r'''
-void main() {
+void f() {
(throw '') == 1 + 2;
}
''');
@@ -559,7 +559,7 @@
test_binaryExpression_plus() async {
await assertNoErrorsInCode(r'''
-void main() {
+void f() {
(throw '') + (1 + 2);
}
''');
@@ -575,7 +575,7 @@
test_methodInvocation_toString() async {
await assertNoErrorsInCode(r'''
-void main() {
+void f() {
(throw '').toString();
}
''');
@@ -590,7 +590,7 @@
test_propertyAccess_toString() async {
await assertNoErrorsInCode(r'''
-void main() {
+void f() {
(throw '').toString;
}
''');
@@ -608,7 +608,7 @@
test_throw_getter_hashCode() async {
await assertNoErrorsInCode(r'''
-void main() {
+void f() {
(throw '').hashCode;
}
''');
diff --git a/pkg/analyzer/test/src/diagnostics/test_all.dart b/pkg/analyzer/test/src/diagnostics/test_all.dart
index 086f256..6d57dca 100644
--- a/pkg/analyzer/test/src/diagnostics/test_all.dart
+++ b/pkg/analyzer/test/src/diagnostics/test_all.dart
@@ -344,6 +344,8 @@
as late_final_local_already_assigned;
import 'list_element_type_not_assignable_test.dart'
as list_element_type_not_assignable;
+import 'main_first_positional_parameter_type_test.dart'
+ as main_first_positional_parameter_type;
import 'main_has_required_named_parameters_test.dart'
as main_has_required_named_parameters;
import 'main_has_too_many_required_positional_parameters_test.dart'
@@ -877,6 +879,7 @@
late_final_field_with_const_constructor.main();
late_final_local_already_assigned.main();
list_element_type_not_assignable.main();
+ main_first_positional_parameter_type.main();
main_has_required_named_parameters.main();
main_has_too_many_required_positional_parameters.main();
main_is_not_function.main();
diff --git a/pkg/analyzer/test/src/diagnostics/undefined_identifier_test.dart b/pkg/analyzer/test/src/diagnostics/undefined_identifier_test.dart
index ef3ec65..6195779 100644
--- a/pkg/analyzer/test/src/diagnostics/undefined_identifier_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/undefined_identifier_test.dart
@@ -221,13 +221,13 @@
test_synthetic_whenMethodName_defined() async {
await assertErrorsInCode(r'''
print(x) {}
-main(int p) {
+void f(int p) {
p.();
}
''', [
- error(ParserErrorCode.MISSING_IDENTIFIER, 30, 1),
- error(CompileTimeErrorCode.UNDEFINED_GETTER, 30, 1),
- error(ParserErrorCode.MISSING_IDENTIFIER, 31, 1),
+ error(ParserErrorCode.MISSING_IDENTIFIER, 32, 1),
+ error(CompileTimeErrorCode.UNDEFINED_GETTER, 32, 1),
+ error(ParserErrorCode.MISSING_IDENTIFIER, 33, 1),
]);
}
}
diff --git a/pkg/front_end/lib/src/fasta/kernel/inference_visitor.dart b/pkg/front_end/lib/src/fasta/kernel/inference_visitor.dart
index e380a35..f06a7d0 100644
--- a/pkg/front_end/lib/src/fasta/kernel/inference_visitor.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/inference_visitor.dart
@@ -1719,6 +1719,7 @@
LogicalExpression node, DartType typeContext) {
InterfaceType boolType =
inferrer.coreTypes.boolRawType(inferrer.library.nonNullable);
+ inferrer.flowAnalysis.logicalBinaryOp_begin();
ExpressionInferenceResult leftResult = inferrer.inferExpression(
node.left, boolType, !inferrer.isTopLevel,
isVoidAllowed: false);
diff --git a/pkg/nnbd_migration/lib/src/edge_builder.dart b/pkg/nnbd_migration/lib/src/edge_builder.dart
index 3f22a7d..44f256d 100644
--- a/pkg/nnbd_migration/lib/src/edge_builder.dart
+++ b/pkg/nnbd_migration/lib/src/edge_builder.dart
@@ -447,6 +447,7 @@
} else if (operatorType == TokenType.AMPERSAND_AMPERSAND ||
operatorType == TokenType.BAR_BAR) {
bool isAnd = operatorType == TokenType.AMPERSAND_AMPERSAND;
+ _flowAnalysis.logicalBinaryOp_begin();
_checkExpressionNotNull(leftOperand);
_flowAnalysis.logicalBinaryOp_rightBegin(node.leftOperand, isAnd: isAnd);
_postDominatedLocals.doScoped(
diff --git a/runtime/bin/BUILD.gn b/runtime/bin/BUILD.gn
index a42626d..88e037b 100644
--- a/runtime/bin/BUILD.gn
+++ b/runtime/bin/BUILD.gn
@@ -51,10 +51,6 @@
}
}
include_dirs = [ ".." ]
- set_sources_assignment_filter([
- "*_test.cc",
- "*_test.h",
- ])
sources = builtin_impl_sources
}
}
@@ -325,19 +321,6 @@
deps = [ "//third_party/zlib" ]
- custom_sources_filter = [
- "*_test.cc",
- "*_test.h",
- ]
- if (!is_mac && !is_ios) {
- # Dart tree uses *_macos.* instead of *_mac.*
- custom_sources_filter += [
- "*_macos.h",
- "*_macos.cc",
- ]
- }
- set_sources_assignment_filter(custom_sources_filter)
-
defines = [ "DART_IO_SECURE_SOCKET_DISABLED" ]
sources = io_impl_sources + cli_impl_sources
@@ -414,19 +397,6 @@
"..:dart_os_config",
] + extra_configs
public_configs = [ "..:dart_public_config" ]
- custom_sources_filter = [
- "*_test.cc",
- "*_test.h",
- "builtin_gen_snapshot.cc",
- ]
- if (!is_mac && !is_ios) {
- # Dart tree uses *_macos.* instead of *_mac.*
- custom_sources_filter += [
- "*_macos.h",
- "*_macos.cc",
- ]
- }
- set_sources_assignment_filter(custom_sources_filter)
defines = []
deps = [ "//third_party/zlib" ] + extra_deps
@@ -1033,10 +1003,7 @@
shared_library("test_extension") {
deps = [ ":dart" ]
- sources = [
- "test_extension.c",
- "test_extension_dllmain_win.cc",
- ]
+ sources = [ "test_extension.c" ]
include_dirs = [ ".." ]
defines = [
# The only effect of DART_SHARED_LIB is to export the Dart API.
@@ -1046,6 +1013,7 @@
cflags = [ "-fPIC" ]
}
if (is_win) {
+ sources += [ "test_extension_dllmain_win.cc" ]
libs = [ "dart.lib" ]
abs_root_out_dir = rebase_path(root_out_dir)
ldflags = [ "/LIBPATH:$abs_root_out_dir" ]
@@ -1054,10 +1022,7 @@
shared_library("entrypoints_verification_test_extension") {
deps = [ ":dart" ]
- sources = [
- "entrypoints_verification_test_extension.cc",
- "entrypoints_verification_test_extension_dllmain_win.cc",
- ]
+ sources = [ "entrypoints_verification_test_extension.cc" ]
include_dirs = [ ".." ]
defines = [
# The only effect of DART_SHARED_LIB is to export the Dart API.
@@ -1067,6 +1032,7 @@
cflags = [ "-fPIC" ]
}
if (is_win) {
+ sources += [ "entrypoints_verification_test_extension_dllmain_win.cc" ]
libs = [ "dart.lib" ]
abs_root_out_dir = rebase_path(root_out_dir)
ldflags = [ "/LIBPATH:$abs_root_out_dir" ]
@@ -1129,10 +1095,7 @@
shared_library("sample_extension") {
deps = [ ":dart" ]
- sources = [
- "../../samples/sample_extension/sample_extension.cc",
- "../../samples/sample_extension/sample_extension_dllmain_win.cc",
- ]
+ sources = [ "../../samples/sample_extension/sample_extension.cc" ]
include_dirs = [ ".." ]
defines = [
# The only effect of DART_SHARED_LIB is to export the Dart API.
@@ -1142,6 +1105,8 @@
cflags = [ "-fPIC" ]
}
if (is_win) {
+ sources +=
+ [ "../../samples/sample_extension/sample_extension_dllmain_win.cc" ]
libs = [ "dart.lib" ]
abs_root_out_dir = rebase_path(root_out_dir)
ldflags = [ "/LIBPATH:$abs_root_out_dir" ]
diff --git a/runtime/bin/gen_snapshot.cc b/runtime/bin/gen_snapshot.cc
index 187cf92..eba26b5 100644
--- a/runtime/bin/gen_snapshot.cc
+++ b/runtime/bin/gen_snapshot.cc
@@ -446,7 +446,8 @@
// First create a snapshot.
result = Dart_CreateSnapshot(&vm_snapshot_data_buffer, &vm_snapshot_data_size,
&isolate_snapshot_data_buffer,
- &isolate_snapshot_data_size);
+ &isolate_snapshot_data_size,
+ /*is_core=*/true);
CHECK_RESULT(result);
// Now write the vm isolate and isolate snapshots out to the
@@ -539,7 +540,7 @@
intptr_t isolate_snapshot_data_size = 0;
result = Dart_CreateSnapshot(NULL, NULL, &isolate_snapshot_data_buffer,
- &isolate_snapshot_data_size);
+ &isolate_snapshot_data_size, /*is_core=*/false);
CHECK_RESULT(result);
WriteFile(isolate_snapshot_data_filename, isolate_snapshot_data_buffer,
diff --git a/runtime/bin/snapshot_utils.cc b/runtime/bin/snapshot_utils.cc
index d31be2d..4a19ba2 100644
--- a/runtime/bin/snapshot_utils.cc
+++ b/runtime/bin/snapshot_utils.cc
@@ -489,8 +489,8 @@
uint8_t* isolate_buffer = NULL;
intptr_t isolate_size = 0;
- Dart_Handle result =
- Dart_CreateSnapshot(NULL, NULL, &isolate_buffer, &isolate_size);
+ Dart_Handle result = Dart_CreateSnapshot(NULL, NULL, &isolate_buffer,
+ &isolate_size, /*is_core=*/false);
if (Dart_IsError(result)) {
ErrorExit(kErrorExitCode, "%s\n", Dart_GetError(result));
}
diff --git a/runtime/include/dart_api.h b/runtime/include/dart_api.h
index 5268f5d..5d7d117 100644
--- a/runtime/include/dart_api.h
+++ b/runtime/include/dart_api.h
@@ -1242,6 +1242,8 @@
* snapshot. This buffer is scope allocated and is only valid
* until the next call to Dart_ExitScope.
* \param size Returns the size of the buffer.
+ * \param is_core Create a snapshot containing core libraries.
+ * Such snapshot should be agnostic to null safety mode.
*
* \return A valid handle if no error occurs during the operation.
*/
@@ -1249,7 +1251,8 @@
Dart_CreateSnapshot(uint8_t** vm_snapshot_data_buffer,
intptr_t* vm_snapshot_data_size,
uint8_t** isolate_snapshot_data_buffer,
- intptr_t* isolate_snapshot_data_size);
+ intptr_t* isolate_snapshot_data_size,
+ bool is_core);
/**
* Returns whether the buffer contains a kernel file.
diff --git a/runtime/vm/BUILD.gn b/runtime/vm/BUILD.gn
index c7a33f1..8acf95e 100644
--- a/runtime/vm/BUILD.gn
+++ b/runtime/vm/BUILD.gn
@@ -109,10 +109,6 @@
}
}
public_configs = [ ":libdart_vm_config" ]
- set_sources_assignment_filter([
- "*_test.cc",
- "*_test.h",
- ])
sources = vm_sources + rebase_path(compiler_api_sources, ".", "./compiler/") +
rebase_path(disassembler_sources, ".", "./compiler/") +
rebase_path(heap_sources, ".", "./heap/")
@@ -122,10 +118,6 @@
library_for_all_configs_with_compiler("libdart_compiler") {
target_type = "source_set"
public_configs = [ ":libdart_vm_config" ]
- set_sources_assignment_filter([
- "*_test.cc",
- "*_test.h",
- ])
sources = rebase_path(compiler_sources, ".", "./compiler/")
include_dirs = [ ".." ]
if (is_fuchsia) {
diff --git a/runtime/vm/benchmark_test.cc b/runtime/vm/benchmark_test.cc
index 2215c7d..f7b1266 100644
--- a/runtime/vm/benchmark_test.cc
+++ b/runtime/vm/benchmark_test.cc
@@ -528,12 +528,12 @@
MallocWriteStream vm_snapshot_data(FullSnapshotWriter::kInitialSize);
MallocWriteStream isolate_snapshot_data(FullSnapshotWriter::kInitialSize);
FullSnapshotWriter writer(
- Snapshot::kFull, &vm_snapshot_data, &isolate_snapshot_data,
+ Snapshot::kFullCore, &vm_snapshot_data, &isolate_snapshot_data,
/*vm_image_writer=*/nullptr, /*iso_image_writer=*/nullptr);
writer.WriteFullSnapshot();
const Snapshot* snapshot =
Snapshot::SetupFromBuffer(isolate_snapshot_data.buffer());
- ASSERT(snapshot->kind() == Snapshot::kFull);
+ ASSERT(snapshot->kind() == Snapshot::kFullCore);
benchmark->set_score(snapshot->length());
}
@@ -566,12 +566,12 @@
MallocWriteStream vm_snapshot_data(FullSnapshotWriter::kInitialSize);
MallocWriteStream isolate_snapshot_data(FullSnapshotWriter::kInitialSize);
FullSnapshotWriter writer(
- Snapshot::kFull, &vm_snapshot_data, &isolate_snapshot_data,
+ Snapshot::kFullCore, &vm_snapshot_data, &isolate_snapshot_data,
/*vm_image_writer=*/nullptr, /*iso_image_writer=*/nullptr);
writer.WriteFullSnapshot();
const Snapshot* snapshot =
Snapshot::SetupFromBuffer(isolate_snapshot_data.buffer());
- ASSERT(snapshot->kind() == Snapshot::kFull);
+ ASSERT(snapshot->kind() == Snapshot::kFullCore);
benchmark->set_score(snapshot->length());
}
diff --git a/runtime/vm/clustered_snapshot.cc b/runtime/vm/clustered_snapshot.cc
index 7fb5eca..27d263a 100644
--- a/runtime/vm/clustered_snapshot.cc
+++ b/runtime/vm/clustered_snapshot.cc
@@ -245,7 +245,8 @@
s->UnexpectedObject(cls, "Class with illegal cid");
}
s->WriteCid(class_id);
- if (s->kind() == Snapshot::kFull && RequireLegacyErasureOfConstants(cls)) {
+ if (s->kind() == Snapshot::kFullCore &&
+ RequireLegacyErasureOfConstants(cls)) {
s->UnexpectedObject(cls, "Class with non mode agnostic constants");
}
if (s->kind() != Snapshot::kFullAOT) {
@@ -596,7 +597,7 @@
objects_.Add(func);
PushFromTo(func);
- if (kind == Snapshot::kFull) {
+ if ((kind == Snapshot::kFull) || (kind == Snapshot::kFullCore)) {
NOT_IN_PRECOMPILED(s->Push(func->ptr()->bytecode_));
} else if (kind == Snapshot::kFullAOT) {
s->Push(func->ptr()->code_);
@@ -625,7 +626,7 @@
FunctionPtr func = objects_[i];
AutoTraceObjectName(func, MakeDisambiguatedFunctionName(s, func));
WriteFromTo(func);
- if (kind == Snapshot::kFull) {
+ if ((kind == Snapshot::kFull) || (kind == Snapshot::kFullCore)) {
NOT_IN_PRECOMPILED(WriteField(func, bytecode_));
} else if (kind == Snapshot::kFullAOT) {
WriteField(func, code_);
@@ -692,7 +693,7 @@
Function::InstanceSize());
ReadFromTo(func);
- if (kind == Snapshot::kFull) {
+ if ((kind == Snapshot::kFull) || (kind == Snapshot::kFullCore)) {
NOT_IN_PRECOMPILED(func->ptr()->bytecode_ =
static_cast<BytecodePtr>(d->ReadRef()));
} else if (kind == Snapshot::kFullAOT) {
diff --git a/runtime/vm/dart.cc b/runtime/vm/dart.cc
index f271e57..dac8c18 100644
--- a/runtime/vm/dart.cc
+++ b/runtime/vm/dart.cc
@@ -782,12 +782,12 @@
// when generating the snapshot.
ASSERT(FLAG_sound_null_safety == kNullSafetyOptionUnspecified);
- // If snapshot is an appJIT/AOT snapshot we will figure out the mode by
+ // If snapshot is not a core snapshot we will figure out the mode by
// sniffing the feature string in the snapshot.
if (snapshot_data != nullptr) {
// Read the snapshot and check for null safety option.
const Snapshot* snapshot = Snapshot::SetupFromBuffer(snapshot_data);
- if (Snapshot::IncludesCode(snapshot->kind())) {
+ if (!Snapshot::IsAgnosticToNullSafety(snapshot->kind())) {
return SnapshotHeaderReader::NullSafetyFromSnapshot(snapshot);
}
}
@@ -1034,7 +1034,9 @@
#else
#error What architecture?
#endif
+ }
+ if (!Snapshot::IsAgnosticToNullSafety(kind)) {
if (isolate != NULL) {
if (isolate->null_safety()) {
buffer.AddString(" null-safety");
diff --git a/runtime/vm/dart_api_impl.cc b/runtime/vm/dart_api_impl.cc
index 291f8f7..6fdb197 100644
--- a/runtime/vm/dart_api_impl.cc
+++ b/runtime/vm/dart_api_impl.cc
@@ -1934,7 +1934,8 @@
Dart_CreateSnapshot(uint8_t** vm_snapshot_data_buffer,
intptr_t* vm_snapshot_data_size,
uint8_t** isolate_snapshot_data_buffer,
- intptr_t* isolate_snapshot_data_size) {
+ intptr_t* isolate_snapshot_data_size,
+ bool is_core) {
#if defined(DART_PRECOMPILED_RUNTIME)
return Api::NewError("Cannot create snapshots on an AOT runtime.");
#else
@@ -1966,8 +1967,10 @@
FullSnapshotWriter::kInitialSize);
ZoneWriteStream isolate_snapshot_data(Api::TopScope(T)->zone(),
FullSnapshotWriter::kInitialSize);
+ const Snapshot::Kind snapshot_kind =
+ is_core ? Snapshot::kFullCore : Snapshot::kFull;
FullSnapshotWriter writer(
- Snapshot::kFull, &vm_snapshot_data, &isolate_snapshot_data,
+ snapshot_kind, &vm_snapshot_data, &isolate_snapshot_data,
nullptr /* vm_image_writer */, nullptr /* isolate_image_writer */);
writer.WriteFullSnapshot();
if (vm_snapshot_data_buffer != nullptr) {
diff --git a/runtime/vm/object_store.h b/runtime/vm/object_store.h
index 05f290c..fa649a5 100644
--- a/runtime/vm/object_store.h
+++ b/runtime/vm/object_store.h
@@ -479,6 +479,7 @@
ObjectPtr* to_snapshot(Snapshot::Kind kind) {
switch (kind) {
case Snapshot::kFull:
+ case Snapshot::kFullCore:
return reinterpret_cast<ObjectPtr*>(&global_object_pool_);
case Snapshot::kFullJIT:
case Snapshot::kFullAOT:
diff --git a/runtime/vm/raw_object.h b/runtime/vm/raw_object.h
index 9dd7f8f..5f03f71 100644
--- a/runtime/vm/raw_object.h
+++ b/runtime/vm/raw_object.h
@@ -762,6 +762,7 @@
case Snapshot::kFullAOT:
return reinterpret_cast<ObjectPtr*>(&allocation_stub_);
case Snapshot::kFull:
+ case Snapshot::kFullCore:
return reinterpret_cast<ObjectPtr*>(&direct_subclasses_);
case Snapshot::kFullJIT:
return reinterpret_cast<ObjectPtr*>(&dependent_code_);
@@ -836,6 +837,7 @@
case Snapshot::kFullAOT:
return reinterpret_cast<ObjectPtr*>(&script_);
case Snapshot::kFull:
+ case Snapshot::kFullCore:
case Snapshot::kFullJIT:
return reinterpret_cast<ObjectPtr*>(&library_kernel_data_);
case Snapshot::kMessage:
@@ -1026,6 +1028,7 @@
switch (kind) {
case Snapshot::kFullAOT:
case Snapshot::kFull:
+ case Snapshot::kFullCore:
case Snapshot::kFullJIT:
return reinterpret_cast<ObjectPtr*>(&data_);
case Snapshot::kMessage:
@@ -1194,6 +1197,7 @@
ObjectPtr* to_snapshot(Snapshot::Kind kind) {
switch (kind) {
case Snapshot::kFull:
+ case Snapshot::kFullCore:
case Snapshot::kFullJIT:
case Snapshot::kFullAOT:
return reinterpret_cast<ObjectPtr*>(&initializer_function_);
@@ -1270,6 +1274,7 @@
case Snapshot::kFullAOT:
return reinterpret_cast<ObjectPtr*>(&url_);
case Snapshot::kFull:
+ case Snapshot::kFullCore:
case Snapshot::kFullJIT:
return reinterpret_cast<ObjectPtr*>(&kernel_program_info_);
case Snapshot::kMessage:
@@ -1343,6 +1348,7 @@
case Snapshot::kFullAOT:
return reinterpret_cast<ObjectPtr*>(&exports_);
case Snapshot::kFull:
+ case Snapshot::kFullCore:
case Snapshot::kFullJIT:
return reinterpret_cast<ObjectPtr*>(&kernel_data_);
case Snapshot::kMessage:
@@ -2067,6 +2073,7 @@
case Snapshot::kFullAOT:
return reinterpret_cast<ObjectPtr*>(&entries_);
case Snapshot::kFull:
+ case Snapshot::kFullCore:
case Snapshot::kFullJIT:
return to();
case Snapshot::kMessage:
@@ -2174,6 +2181,7 @@
case Snapshot::kFullAOT:
return reinterpret_cast<ObjectPtr*>(&imports_);
case Snapshot::kFull:
+ case Snapshot::kFullCore:
case Snapshot::kFullJIT:
return reinterpret_cast<ObjectPtr*>(&importer_);
case Snapshot::kMessage:
diff --git a/runtime/vm/snapshot.cc b/runtime/vm/snapshot.cc
index 9403472..5c0d911 100644
--- a/runtime/vm/snapshot.cc
+++ b/runtime/vm/snapshot.cc
@@ -229,6 +229,8 @@
switch (kind) {
case kFull:
return "full";
+ case kFullCore:
+ return "full-core";
case kFullJIT:
return "full-jit";
case kFullAOT:
diff --git a/runtime/vm/snapshot.h b/runtime/vm/snapshot.h
index d685fb2..94aa3e7 100644
--- a/runtime/vm/snapshot.h
+++ b/runtime/vm/snapshot.h
@@ -91,11 +91,12 @@
class Snapshot {
public:
enum Kind {
- kFull, // Full snapshot of core libraries or an application.
- kFullJIT, // Full + JIT code
- kFullAOT, // Full + AOT code
- kMessage, // A partial snapshot used only for isolate messaging.
- kNone, // gen_snapshot
+ kFull, // Full snapshot of an application.
+ kFullCore, // Full snapshot of core libraries. Agnostic to null safety.
+ kFullJIT, // Full + JIT code
+ kFullAOT, // Full + AOT code
+ kMessage, // A partial snapshot used only for isolate messaging.
+ kNone, // gen_snapshot
kInvalid
};
static const char* KindToCString(Kind kind);
@@ -130,13 +131,15 @@
void set_kind(Kind value) { return Write<int64_t>(kKindOffset, value); }
static bool IsFull(Kind kind) {
- return (kind == kFull) || (kind == kFullJIT) || (kind == kFullAOT);
+ return (kind == kFull) || (kind == kFullCore) || (kind == kFullJIT) ||
+ (kind == kFullAOT);
}
+ static bool IsAgnosticToNullSafety(Kind kind) { return (kind == kFullCore); }
static bool IncludesCode(Kind kind) {
return (kind == kFullJIT) || (kind == kFullAOT);
}
static bool IncludesBytecode(Kind kind) {
- return (kind == kFull) || (kind == kFullJIT);
+ return (kind == kFull) || (kind == kFullCore) || (kind == kFullJIT);
}
const uint8_t* Addr() const { return reinterpret_cast<const uint8_t*>(this); }
@@ -171,7 +174,8 @@
inline static bool IsSnapshotCompatible(Snapshot::Kind vm_kind,
Snapshot::Kind isolate_kind) {
if (vm_kind == isolate_kind) return true;
- if (vm_kind == Snapshot::kFull && isolate_kind == Snapshot::kFullJIT)
+ if (((vm_kind == Snapshot::kFull) || (vm_kind == Snapshot::kFullCore)) &&
+ isolate_kind == Snapshot::kFullJIT)
return true;
return Snapshot::IsFull(isolate_kind);
}
diff --git a/runtime/vm/snapshot_test.cc b/runtime/vm/snapshot_test.cc
index 4ff7ccf..ed0383c 100644
--- a/runtime/vm/snapshot_test.cc
+++ b/runtime/vm/snapshot_test.cc
@@ -2073,7 +2073,8 @@
// Write snapshot with object content.
MallocWriteStream isolate_snapshot_data(FullSnapshotWriter::kInitialSize);
FullSnapshotWriter writer(
- Snapshot::kFull, /*vm_snapshot_data=*/nullptr, &isolate_snapshot_data,
+ Snapshot::kFullCore, /*vm_snapshot_data=*/nullptr,
+ &isolate_snapshot_data,
/*vm_image_writer=*/nullptr, /*iso_image_writer=*/nullptr);
writer.WriteFullSnapshot();
}
diff --git a/third_party/tcmalloc/BUILD.gn b/third_party/tcmalloc/BUILD.gn
index a2a925a..7238772 100644
--- a/third_party/tcmalloc/BUILD.gn
+++ b/third_party/tcmalloc/BUILD.gn
@@ -119,22 +119,20 @@
cflags += [ "-Wno-format" ]
}
- set_sources_assignment_filter([
- # No debug allocator.
- "gperftools/src/debugallocation.cc",
+ sources = tcmalloc_sources - [
+ # No debug allocator.
+ "gperftools/src/debugallocation.cc",
- # Not needed when using emergency malloc.
- "gperftools/src/fake_stacktrace_scope.cc",
+ # Not needed when using emergency malloc.
+ "gperftools/src/fake_stacktrace_scope.cc",
- # Not using the cpuprofiler
- "gperftools/src/base/thread_lister.c",
- "gperftools/src/base/thread_lister.h",
- "gperftools/src/profile-handler.cc",
- "gperftools/src/profile-handler.h",
- "gperftools/src/profiledata.cc",
- "gperftools/src/profiledata.h",
- "gperftools/src/profiler.cc",
- ])
-
- sources = tcmalloc_sources
+ # Not using the cpuprofiler
+ "gperftools/src/base/thread_lister.c",
+ "gperftools/src/base/thread_lister.h",
+ "gperftools/src/profile-handler.cc",
+ "gperftools/src/profile-handler.h",
+ "gperftools/src/profiledata.cc",
+ "gperftools/src/profiledata.h",
+ "gperftools/src/profiler.cc",
+ ]
}
diff --git a/tools/VERSION b/tools/VERSION
index b4ac9ab..3888401 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
MAJOR 2
MINOR 11
PATCH 0
-PRERELEASE 202
+PRERELEASE 203
PRERELEASE_PATCH 0
\ No newline at end of file