Version 2.13.0-224.0.dev
Merge commit '7367c980a7225d223154f6d3f323ed0727acfa7b' into 'dev'
diff --git a/CHANGELOG.md b/CHANGELOG.md
index d9b7267..d627fa9 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -96,8 +96,6 @@
#### dart format
-* Flatten indentation on nested chains of conditional (`?:`) operators.
-
* Correct constructor initializer indentation after `required` named
parameters.
diff --git a/DEPS b/DEPS
index b63cd01..6327f7e 100644
--- a/DEPS
+++ b/DEPS
@@ -98,7 +98,7 @@
# and land the review.
#
# For more details, see https://github.com/dart-lang/sdk/issues/30164
- "dart_style_rev": "0067cfcc5bfa64cf59888c3fed34c71d1272555a",
+ "dart_style_rev": "f17c23e0eea9a870601c19d904e2a9c1a7c81470",
"chromedriver_tag": "83.0.4103.39",
"browser_launcher_rev": "12ab9f351a44ac803de9bc17bb2180bb312a9dd7",
diff --git a/pkg/analysis_server/lib/src/services/completion/dart/completion_manager.dart b/pkg/analysis_server/lib/src/services/completion/dart/completion_manager.dart
index 578501a..7c20027 100644
--- a/pkg/analysis_server/lib/src/services/completion/dart/completion_manager.dart
+++ b/pkg/analysis_server/lib/src/services/completion/dart/completion_manager.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/provisional/completion/completion_core.dart';
import 'package:analysis_server/src/provisional/completion/dart/completion_dart.dart';
@@ -50,27 +48,27 @@
/// and forwards those requests to all [DartCompletionContributor]s.
class DartCompletionManager {
/// The object used to resolve macros in Dartdoc comments.
- final DartdocDirectiveInfo dartdocDirectiveInfo;
+ final DartdocDirectiveInfo? dartdocDirectiveInfo;
/// If not `null`, then instead of using [ImportedReferenceContributor],
/// fill this set with kinds of elements that are applicable at the
/// completion location, so should be suggested from available suggestion
/// sets.
- final Set<protocol.ElementKind> includedElementKinds;
+ final Set<protocol.ElementKind>? includedElementKinds;
/// If [includedElementKinds] is not null, must be also not `null`, and
/// will be filled with names of all top-level declarations from all
/// included suggestion sets.
- final Set<String> includedElementNames;
+ final Set<String>? includedElementNames;
/// If [includedElementKinds] is not null, must be also not `null`, and
/// will be filled with tags for suggestions that should be given higher
/// relevance than other included suggestions.
- final List<IncludedSuggestionRelevanceTag> includedSuggestionRelevanceTags;
+ final List<IncludedSuggestionRelevanceTag>? includedSuggestionRelevanceTags;
/// The listener to be notified at certain points in the process of building
/// suggestions, or `null` if no notification should occur.
- final SuggestionListener listener;
+ final SuggestionListener? listener;
/// Initialize a newly created completion manager. The parameters
/// [includedElementKinds], [includedElementNames], and
@@ -94,11 +92,11 @@
CompletionRequest request, {
bool enableOverrideContributor = true,
bool enableUriContributor = true,
- CompletionPreference completionPreference,
+ CompletionPreference? completionPreference,
}) async {
request.checkAborted();
var pathContext = request.resourceProvider.pathContext;
- if (!file_paths.isDart(pathContext, request.result.path)) {
+ if (!file_paths.isDart(pathContext, request.result.path!)) {
return const <CompletionSuggestion>[];
}
@@ -201,6 +199,7 @@
}
void _addIncludedSuggestionRelevanceTags(DartCompletionRequestImpl request) {
+ var includedSuggestionRelevanceTags = this.includedSuggestionRelevanceTags!;
var location = request.opType.completionLocation;
if (location != null) {
var locationTable = elementKindRelevance[location];
@@ -266,15 +265,15 @@
final int offset;
@override
- Expression dotTarget;
+ Expression? dotTarget;
@override
final Source librarySource;
@override
- CompletionTarget target;
+ late CompletionTarget target;
- OpType _opType;
+ OpType? _opType;
@override
final FeatureComputer featureComputer;
@@ -286,13 +285,13 @@
bool _hasComputedContextType = false;
/// The context type associated with the target's `containingNode`.
- DartType _contextType;
+ DartType? _contextType;
final CompletionRequest _originalRequest;
final CompletionPerformance performance;
- SourceRange _replacementRange;
+ SourceRange? _replacementRange;
@override
final CompletionPreference completionPreference;
@@ -308,7 +307,7 @@
this.dartdocDirectiveInfo,
this._originalRequest,
this.performance,
- {CompletionPreference completionPreference})
+ {CompletionPreference? completionPreference})
: featureComputer =
FeatureComputer(result.typeSystem, result.typeProvider),
completionPreference =
@@ -317,7 +316,7 @@
}
@override
- DartType get contextType {
+ DartType? get contextType {
if (!_hasComputedContextType) {
_contextType = featureComputer.computeContextType(
target.containingNode, target.offset);
@@ -345,24 +344,22 @@
@override
OpType get opType {
- _opType ??= OpType.forCompletion(target, offset);
- return _opType;
+ return _opType ??= OpType.forCompletion(target, offset);
}
/// The source range that represents the region of text that should be
/// replaced when a suggestion is selected.
@override
SourceRange get replacementRange {
- _replacementRange ??= target.computeReplacementRange(offset);
- return _replacementRange;
+ return _replacementRange ??= target.computeReplacementRange(offset);
}
@override
- String get sourceContents => result.content;
+ String? get sourceContents => result.content;
@override
SourceFactory get sourceFactory {
- DriverBasedAnalysisContext context = result.session.analysisContext;
+ var context = result.session.analysisContext as DriverBasedAnalysisContext;
return context.driver.sourceFactory;
}
@@ -371,8 +368,8 @@
var entity = target.entity;
if (entity is Token) {
- var prev = entity.previous;
- if (prev?.end == offset && prev.isKeywordOrIdentifier) {
+ var prev = entity.previous!;
+ if (prev.end == offset && prev.isKeywordOrIdentifier) {
return prev.lexeme;
}
}
@@ -386,7 +383,7 @@
return identifier;
}
}
- var children = (entity as AstNode).childEntities;
+ var children = entity.childEntities;
entity = children.isEmpty ? null : children.first;
}
return '';
@@ -407,7 +404,8 @@
if (node is MethodInvocation) {
if (identical(node.methodName, target.entity)) {
dotTarget = node.realTarget;
- } else if (node.isCascaded && node.operator.offset + 1 == target.offset) {
+ } else if (node.isCascaded &&
+ node.operator!.offset + 1 == target.offset) {
dotTarget = node.realTarget;
}
}
@@ -428,18 +426,18 @@
/// Return a [Future] that completes with a newly created completion request
/// based on the given [request]. This method will throw [AbortCompletion]
/// if the completion request has been aborted.
- static Future<DartCompletionRequest> from(
+ static Future<DartCompletionRequestImpl> from(
OperationPerformanceImpl performance,
CompletionRequest request,
- DartdocDirectiveInfo dartdocDirectiveInfo,
- {CompletionPreference completionPreference}) async {
+ DartdocDirectiveInfo? dartdocDirectiveInfo,
+ {CompletionPreference? completionPreference}) async {
request.checkAborted();
return performance.run(
'build DartCompletionRequest',
(_) {
- var unit = request.result.unit;
- var libSource = unit.declaredElement.library.source;
+ var unit = request.result.unit!;
+ var libSource = unit.declaredElement!.library.source;
var objectType = request.result.typeProvider.objectType;
return DartCompletionRequestImpl._(
@@ -450,7 +448,7 @@
request.source,
request.offset,
unit,
- dartdocDirectiveInfo,
+ dartdocDirectiveInfo ?? DartdocDirectiveInfo(),
request,
(request as CompletionRequestImpl).performance,
completionPreference: completionPreference,
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 4b48766..dafe115 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
@@ -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/provisional/completion/dart/completion_dart.dart';
import 'package:analysis_server/src/services/completion/dart/completion_manager.dart';
import 'package:analysis_server/src/services/completion/dart/suggestion_builder.dart';
@@ -45,11 +43,11 @@
final SuggestionBuilder builder;
- final Object entity;
+ final SyntacticEntity? entity;
_KeywordVisitor(this.request, this.builder) : entity = request.target.entity;
- Token get droppedToken => request.target.droppedToken;
+ Token? get droppedToken => request.target.droppedToken;
@override
void visitArgumentList(ArgumentList node) {
@@ -58,6 +56,7 @@
return;
}
}
+ var entity = this.entity;
if (entity == node.rightParenthesis) {
_addExpressionKeywords(node);
var previous = node.findPrevious(entity as Token);
@@ -75,10 +74,11 @@
var index = node.arguments.indexOf(entity);
if (index > 0) {
var previousArgument = node.arguments[index - 1];
- var endToken = previousArgument?.endToken;
- if (endToken?.lexeme == ')' &&
- endToken.next?.lexeme == ',' &&
- endToken.next.isSynthetic) {
+ var endToken = previousArgument.endToken;
+ var tokenAfterEnd = endToken.next!;
+ if (endToken.lexeme == ')' &&
+ tokenAfterEnd.lexeme == ',' &&
+ tokenAfterEnd.isSynthetic) {
_addSuggestion(Keyword.ASYNC);
_addSuggestion2(ASYNC_STAR);
_addSuggestion2(SYNC_STAR);
@@ -121,9 +121,9 @@
if (previous != null && previous.isSynthetic) {
previous = node.findPrevious(previous);
}
- var next = token.next;
+ var next = token.next!;
if (next.isSynthetic) {
- next = next.next;
+ next = next.next!;
}
if (previous != null &&
previous.type == TokenType.CLOSE_PAREN &&
@@ -142,6 +142,7 @@
@override
void visitClassDeclaration(ClassDeclaration node) {
+ var entity = this.entity;
// Don't suggest class name
if (entity == node.name) {
return;
@@ -164,7 +165,7 @@
@override
void visitCompilationUnit(CompilationUnit node) {
- SyntacticEntity previousMember;
+ SyntacticEntity? previousMember;
for (var member in node.childEntities) {
if (entity == member) {
break;
@@ -172,8 +173,7 @@
previousMember = member;
}
if (previousMember is ClassDeclaration) {
- if (previousMember.leftBracket == null ||
- previousMember.leftBracket.isSynthetic) {
+ if (previousMember.leftBracket.isSynthetic) {
// If the prior member is an unfinished class declaration
// then the user is probably finishing that.
_addClassDeclarationKeywords(previousMember);
@@ -181,8 +181,7 @@
}
}
if (previousMember is ExtensionDeclaration) {
- if (previousMember.leftBracket == null ||
- previousMember.leftBracket.isSynthetic) {
+ if (previousMember.leftBracket.isSynthetic) {
// If the prior member is an unfinished extension declaration then the
// user is probably finishing that.
_addExtensionDeclarationKeywords(previousMember);
@@ -190,8 +189,7 @@
}
}
if (previousMember is MixinDeclaration) {
- if (previousMember.leftBracket == null ||
- previousMember.leftBracket.isSynthetic) {
+ if (previousMember.leftBracket.isSynthetic) {
// If the prior member is an unfinished mixin declaration
// then the user is probably finishing that.
_addMixinDeclarationKeywords(previousMember);
@@ -199,8 +197,7 @@
}
}
if (previousMember is ImportDirective) {
- if (previousMember.semicolon == null ||
- previousMember.semicolon.isSynthetic) {
+ if (previousMember.semicolon.isSynthetic) {
// If the prior member is an unfinished import directive
// then the user is probably finishing that
_addImportDirectiveKeywords(previousMember);
@@ -246,7 +243,7 @@
var separator = node.separator;
if (separator != null) {
var offset = request.offset;
- if (separator.end <= offset && offset <= separator.next.offset) {
+ if (separator.end <= offset && offset <= separator.next!.offset) {
_addSuggestion(Keyword.ASSERT);
_addSuggestion(Keyword.SUPER);
_addSuggestion(Keyword.THIS);
@@ -362,7 +359,7 @@
}
} else if (entity is FormalParameter) {
var beginToken = (entity as FormalParameter).beginToken;
- if (beginToken != null && request.target.offset == beginToken.end) {
+ if (request.target.offset == beginToken.end) {
_addSuggestion(Keyword.COVARIANT);
_addSuggestion(Keyword.DYNAMIC);
_addSuggestion(Keyword.VOID);
@@ -387,8 +384,7 @@
// Handle the degenerate case while typing - for (int x i^)
if (node.condition == entity &&
entity is SimpleIdentifier &&
- node is ForPartsWithDeclarations &&
- node.variables != null) {
+ node is ForPartsWithDeclarations) {
if (_isPreviousTokenSynthetic(entity, TokenType.SEMICOLON)) {
_addSuggestion(Keyword.IN);
}
@@ -425,9 +421,10 @@
_addSuggestion2(SYNC_STAR);
}
}
+ var grandParent = node.parent;
if (body is EmptyFunctionBody &&
- node.parent is FunctionDeclaration &&
- node.parent.parent is CompilationUnit) {
+ grandParent is FunctionDeclaration &&
+ grandParent.parent is CompilationUnit) {
_addCompilationUnitKeywords();
}
}
@@ -471,9 +468,7 @@
}
// Handle degenerate case where import statement does not have a semicolon
// and the cursor is in the uri string
- if ((entity == node.semicolon &&
- node.uri != null &&
- node.uri.offset + 1 != request.offset) ||
+ if ((entity == node.semicolon && node.uri.offset + 1 != request.offset) ||
node.combinators.contains(entity)) {
_addImportDirectiveKeywords(node);
}
@@ -549,6 +544,7 @@
@override
void visitMixinDeclaration(MixinDeclaration node) {
+ var entity = this.entity;
// Don't suggest mixin name
if (entity == node.name) {
return;
@@ -699,7 +695,7 @@
(obj is KeywordToken && obj.value() == Keyword.FINALLY)) {
_addSuggestion(Keyword.ON);
_addSuggestion(Keyword.CATCH);
- return null;
+ return;
}
return visitStatement(node);
}
@@ -813,7 +809,7 @@
}
void _addExtensionDeclarationKeywords(ExtensionDeclaration node) {
- if (node.onKeyword == null || node.onKeyword.isSynthetic) {
+ if (node.onKeyword.isSynthetic) {
_addSuggestion(Keyword.ON);
}
}
@@ -895,7 +891,7 @@
_addSuggestion2(keyword.lexeme);
}
- void _addSuggestion2(String keyword, {int offset}) {
+ void _addSuggestion2(String keyword, {int? offset}) {
builder.suggestKeyword(keyword, offset: offset);
}
@@ -906,7 +902,7 @@
}
bool _isEntityAfterIfWithoutElse(AstNode node) {
- var block = node?.thisOrAncestorOfType<Block>();
+ var block = node.thisOrAncestorOfType<Block>();
if (block == null) {
return false;
}
@@ -929,7 +925,7 @@
return false;
}
- static bool _isPreviousTokenSynthetic(Object entity, TokenType type) {
+ static bool _isPreviousTokenSynthetic(Object? entity, TokenType type) {
if (entity is AstNode) {
var token = entity.beginToken;
var previousToken = entity.findPrevious(token);
diff --git a/pkg/analysis_server/lib/src/services/completion/dart/label_contributor.dart b/pkg/analysis_server/lib/src/services/completion/dart/label_contributor.dart
index e333940..9434271 100644
--- a/pkg/analysis_server/lib/src/services/completion/dart/label_contributor.dart
+++ b/pkg/analysis_server/lib/src/services/completion/dart/label_contributor.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/provisional/completion/dart/completion_dart.dart';
import 'package:analysis_server/src/services/completion/dart/completion_manager.dart'
show DartCompletionRequestImpl;
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/add_missing_required_argument.dart b/pkg/analysis_server/lib/src/services/correction/dart/add_missing_required_argument.dart
index d95722a..6da748e 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/add_missing_required_argument.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/add_missing_required_argument.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:_fe_analyzer_shared/src/scanner/token.dart';
import 'package:analysis_server/src/services/completion/dart/utilities.dart';
import 'package:analysis_server/src/services/correction/dart/abstract_producer.dart';
@@ -12,10 +10,11 @@
import 'package:analyzer/dart/element/element.dart';
import 'package:analyzer_plugin/utilities/change_builder/change_builder_core.dart';
import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
+import 'package:collection/collection.dart';
class AddMissingRequiredArgument extends CorrectionProducer {
/// The name of the parameter that was missing.
- String _missingParameterName;
+ String _missingParameterName = '';
@override
List<Object> get fixArguments => [_missingParameterName];
@@ -25,9 +24,9 @@
@override
Future<void> compute(ChangeBuilder builder) async {
- InstanceCreationExpression creation;
- Element targetElement;
- ArgumentList argumentList;
+ InstanceCreationExpression? creation;
+ Element? targetElement;
+ ArgumentList? argumentList;
if (node is SimpleIdentifier || node is ConstructorName) {
var invocation = node.parent;
@@ -35,8 +34,7 @@
targetElement = invocation.methodName.staticElement;
argumentList = invocation.argumentList;
} else {
- creation =
- invocation.thisOrAncestorOfType<InstanceCreationExpression>();
+ creation = invocation?.thisOrAncestorOfType();
if (creation != null) {
targetElement = creation.constructorName.staticElement;
argumentList = creation.argumentList;
@@ -44,7 +42,12 @@
}
}
- if (targetElement is ExecutableElement) {
+ var diagnostic = this.diagnostic;
+ if (diagnostic == null) {
+ return;
+ }
+
+ if (targetElement is ExecutableElement && argumentList != null) {
// Format: "Missing required argument 'foo'."
var messageParts = diagnostic.problemMessage.message.split("'");
if (messageParts.length < 2) {
@@ -52,9 +55,9 @@
}
_missingParameterName = messageParts[1];
- var missingParameter = targetElement.parameters.firstWhere(
- (p) => p.name == _missingParameterName,
- orElse: () => null);
+ var missingParameter = targetElement.parameters.firstWhereOrNull(
+ (p) => p.name == _missingParameterName,
+ );
if (missingParameter == null) {
return;
}
@@ -68,7 +71,7 @@
} else {
var lastArgument = arguments.last;
offset = lastArgument.end;
- hasTrailingComma = lastArgument.endToken.next.type == TokenType.COMMA;
+ hasTrailingComma = lastArgument.endToken.next!.type == TokenType.COMMA;
if (lastArgument is NamedExpression &&
flutter.isWidgetExpression(creation)) {
@@ -80,9 +83,10 @@
}
}
}
+
var defaultValue = getDefaultStringParameterValue(missingParameter,
withNullability: libraryElement.isNonNullableByDefault &&
- missingParameter.library.isNonNullableByDefault);
+ (missingParameter.library?.isNonNullableByDefault ?? false));
await builder.addDartFileEdit(file, (builder) {
builder.addInsertion(offset, (builder) {
@@ -93,14 +97,17 @@
builder.write('$_missingParameterName: ');
// Use defaultValue.cursorPosition if it's not null.
- if (defaultValue?.cursorPosition != null) {
- builder.write(
- defaultValue.text.substring(0, defaultValue.cursorPosition));
- builder.selectHere();
- builder.write(
- defaultValue.text.substring(defaultValue.cursorPosition));
+ if (defaultValue != null) {
+ var cursorPosition = defaultValue.cursorPosition;
+ if (cursorPosition != null) {
+ builder.write(defaultValue.text.substring(0, cursorPosition));
+ builder.selectHere();
+ builder.write(defaultValue.text.substring(cursorPosition));
+ } else {
+ builder.addSimpleLinkedEdit('VALUE', defaultValue.text);
+ }
} else {
- builder.addSimpleLinkedEdit('VALUE', defaultValue?.text);
+ builder.addSimpleLinkedEdit('VALUE', 'null');
}
if (flutter.isWidgetExpression(creation)) {
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/convert_to_on_type.dart b/pkg/analysis_server/lib/src/services/correction/dart/convert_to_on_type.dart
index ead067d..a47567a 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/convert_to_on_type.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/convert_to_on_type.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/services/correction/dart/abstract_producer.dart';
import 'package:analysis_server/src/services/correction/fix.dart';
import 'package:analyzer/dart/ast/ast.dart';
@@ -23,30 +21,30 @@
var exceptionParameter = node;
if (exceptionParameter is SimpleIdentifier) {
var catchClause = exceptionParameter.parent;
- if (catchClause is CatchClause &&
- catchClause.exceptionType == null &&
- catchClause.exceptionParameter == exceptionParameter) {
- var exceptionTypeName = exceptionParameter.name;
- fixArguments.add(exceptionTypeName);
- await builder.addDartFileEdit(file, (builder) {
- if (catchClause.stackTraceParameter != null) {
- builder.addSimpleReplacement(
- range.startStart(
- catchClause.catchKeyword,
- catchClause.stackTraceParameter,
- ),
- 'on $exceptionTypeName catch (_, ',
- );
- } else {
- builder.addSimpleReplacement(
- range.startEnd(
- catchClause.catchKeyword,
- catchClause.rightParenthesis,
- ),
- 'on $exceptionTypeName',
- );
- }
- });
+ if (catchClause is CatchClause) {
+ var catchKeyword = catchClause.catchKeyword;
+ var rightParenthesis = catchClause.rightParenthesis;
+ if (catchKeyword != null &&
+ catchClause.exceptionType == null &&
+ catchClause.exceptionParameter == exceptionParameter &&
+ rightParenthesis != null) {
+ var exceptionTypeName = exceptionParameter.name;
+ fixArguments.add(exceptionTypeName);
+ await builder.addDartFileEdit(file, (builder) {
+ var stackTraceParameter = catchClause.stackTraceParameter;
+ if (stackTraceParameter != null) {
+ builder.addSimpleReplacement(
+ range.startStart(catchKeyword, stackTraceParameter),
+ 'on $exceptionTypeName catch (_, ',
+ );
+ } else {
+ builder.addSimpleReplacement(
+ range.startEnd(catchKeyword, rightParenthesis),
+ 'on $exceptionTypeName',
+ );
+ }
+ });
+ }
}
}
}
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/create_constructor_for_final_fields.dart b/pkg/analysis_server/lib/src/services/correction/dart/create_constructor_for_final_fields.dart
index 62a920e..f8788d4 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/create_constructor_for_final_fields.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/create_constructor_for_final_fields.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/services/correction/dart/abstract_producer.dart';
import 'package:analysis_server/src/services/correction/fix.dart';
import 'package:analyzer/dart/analysis/features.dart';
@@ -28,8 +26,12 @@
if (classDeclaration == null) {
return;
}
+
var className = classDeclaration.name.name;
- var superType = classDeclaration.declaredElement.supertype;
+ var superType = classDeclaration.declaredElement?.supertype;
+ if (superType == null) {
+ return;
+ }
// prepare names of uninitialized final fields
var fieldNames = <String>[];
@@ -45,11 +47,17 @@
}
// prepare location for a new constructor
var targetLocation = utils.prepareNewConstructorLocation(classDeclaration);
+ if (targetLocation == null) {
+ return;
+ }
if (flutter.isExactlyStatelessWidgetType(superType) ||
flutter.isExactlyStatefulWidgetType(superType)) {
// Specialize for Flutter widgets.
var keyClass = await sessionHelper.getClass(flutter.widgetsUri, 'Key');
+ if (keyClass == null) {
+ return;
+ }
await builder.addDartFileEdit(file, (builder) {
builder.addInsertion(targetLocation.offset, (builder) {
builder.write(targetLocation.prefix);
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/create_constructor_super.dart b/pkg/analysis_server/lib/src/services/correction/dart/create_constructor_super.dart
index 212261b..e4acc52 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/create_constructor_super.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/create_constructor_super.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/services/correction/dart/abstract_producer.dart';
import 'package:analysis_server/src/services/correction/fix.dart';
import 'package:analysis_server/src/services/correction/util.dart';
@@ -16,16 +14,26 @@
@override
Iterable<CorrectionProducer> get producers sync* {
var targetClassNode = node.thisOrAncestorOfType<ClassDeclaration>();
- var targetClassElement = targetClassNode.declaredElement;
+ if (targetClassNode == null) {
+ return;
+ }
+
+ var targetClassElement = targetClassNode.declaredElement!;
var superType = targetClassElement.supertype;
+ if (superType == null) {
+ return;
+ }
+
// add proposals for all super constructors
for (var constructor in superType.constructors) {
// Only propose public constructors.
if (!Identifier.isPrivateName(constructor.name)) {
var targetLocation =
utils.prepareNewConstructorLocation(targetClassNode);
- yield _CreateConstructor(
- constructor, targetLocation, targetClassElement.name);
+ if (targetLocation != null) {
+ yield _CreateConstructor(
+ constructor, targetLocation, targetClassElement.name);
+ }
}
}
}
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/create_field.dart b/pkg/analysis_server/lib/src/services/correction/dart/create_field.dart
index fa00de2..ec42942 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/create_field.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/create_field.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/services/correction/dart/abstract_producer.dart';
import 'package:analysis_server/src/services/correction/fix.dart';
import 'package:analysis_server/src/services/correction/util.dart';
@@ -14,7 +12,7 @@
class CreateField extends CorrectionProducer {
/// The name of the field to be created.
- String _fieldName;
+ String _fieldName = '';
@override
List<Object> get fixArguments => [_fieldName];
@@ -38,9 +36,15 @@
if (targetClassNode == null) {
return;
}
+
var nameNode = parameter.identifier;
_fieldName = nameNode.name;
+
var targetLocation = utils.prepareNewFieldLocation(targetClassNode);
+ if (targetLocation == null) {
+ return;
+ }
+
//
// Add proposal.
//
@@ -56,13 +60,13 @@
}
Future<void> _proposeFromIdentifier(ChangeBuilder builder) async {
- if (node is! SimpleIdentifier) {
+ var nameNode = node;
+ if (nameNode is! SimpleIdentifier) {
return;
}
- SimpleIdentifier nameNode = node;
_fieldName = nameNode.name;
// prepare target Expression
- Expression target;
+ Expression? target;
{
var nameParent = nameNode.parent;
if (nameParent is PrefixedIdentifier) {
@@ -73,7 +77,7 @@
}
// prepare target ClassElement
var staticModifier = false;
- ClassElement targetClassElement;
+ ClassElement? targetClassElement;
if (target != null) {
targetClassElement = getTargetClassElement(target);
// maybe static
@@ -102,13 +106,20 @@
if (targetDeclarationResult == null) {
return;
}
- if (targetDeclarationResult.node is! ClassOrMixinDeclaration) {
+ var targetNode = targetDeclarationResult.node;
+ if (targetNode is! ClassOrMixinDeclaration) {
return;
}
- ClassOrMixinDeclaration targetNode = targetDeclarationResult.node;
// prepare location
- var targetLocation = CorrectionUtils(targetDeclarationResult.resolvedUnit)
- .prepareNewFieldLocation(targetNode);
+ var targetUnit = targetDeclarationResult.resolvedUnit;
+ if (targetUnit == null) {
+ return;
+ }
+ var targetLocation =
+ CorrectionUtils(targetUnit).prepareNewFieldLocation(targetNode);
+ if (targetLocation == null) {
+ return;
+ }
// build field source
var targetSource = targetClassElement.source;
var targetFile = targetSource.fullName;
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/create_file.dart b/pkg/analysis_server/lib/src/services/correction/dart/create_file.dart
index 6dd55bf..455c0c8 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/create_file.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/create_file.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/services/correction/dart/abstract_producer.dart';
import 'package:analysis_server/src/services/correction/fix.dart';
import 'package:analyzer/dart/ast/ast.dart';
@@ -12,7 +10,7 @@
import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
class CreateFile extends CorrectionProducer {
- String _fileName;
+ String _fileName = '';
@override
List<Object> get fixArguments => [_fileName];
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/create_function.dart b/pkg/analysis_server/lib/src/services/correction/dart/create_function.dart
index 2351d57..1a8aaf4 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/create_function.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/create_function.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/services/correction/dart/abstract_producer.dart';
import 'package:analysis_server/src/services/correction/fix.dart';
import 'package:analyzer/dart/ast/ast.dart';
@@ -12,7 +10,7 @@
import 'package:analyzer_plugin/utilities/range_factory.dart';
class CreateFunction extends CorrectionProducer {
- String _functionName;
+ String _functionName = '';
@override
List<Object> get fixArguments => [_functionName];
@@ -37,8 +35,10 @@
// prepare environment
int insertOffset;
String sourcePrefix;
- AstNode enclosingMember =
- node.thisOrAncestorOfType<CompilationUnitMember>();
+ var enclosingMember = node.thisOrAncestorOfType<CompilationUnitMember>();
+ if (enclosingMember == null) {
+ return;
+ }
insertOffset = enclosingMember.end;
sourcePrefix = '$eol$eol';
utils.targetClassElement = null;
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/create_getter.dart b/pkg/analysis_server/lib/src/services/correction/dart/create_getter.dart
index 3ca2941..3c9c661 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/create_getter.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/create_getter.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/services/correction/dart/abstract_producer.dart';
import 'package:analysis_server/src/services/correction/fix.dart';
import 'package:analysis_server/src/services/correction/util.dart';
@@ -14,7 +12,7 @@
import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
class CreateGetter extends CorrectionProducer {
- String _getterName;
+ String _getterName = '';
@override
List<Object> get fixArguments => [_getterName];
@@ -24,16 +22,16 @@
@override
Future<void> compute(ChangeBuilder builder) async {
- if (node is! SimpleIdentifier) {
+ var nameNode = node;
+ if (nameNode is! SimpleIdentifier) {
return;
}
- SimpleIdentifier nameNode = node;
_getterName = nameNode.name;
if (!nameNode.inGetterContext()) {
return;
}
// prepare target
- Expression target;
+ Expression? target;
{
var nameParent = nameNode.parent;
if (nameParent is PrefixedIdentifier) {
@@ -44,7 +42,7 @@
}
// prepare target element
var staticModifier = false;
- Element targetElement;
+ Element? targetElement;
if (target is ExtensionOverride) {
targetElement = target.staticElement;
} else if (target is Identifier &&
@@ -72,7 +70,11 @@
}
staticModifier = inStaticContext;
}
- if (targetElement.librarySource.isInSystemLibrary) {
+ if (targetElement == null) {
+ return;
+ }
+ var targetSource = targetElement.source;
+ if (targetSource == null || targetSource.isInSystemLibrary) {
return;
}
// prepare target declaration
@@ -81,16 +83,26 @@
if (targetDeclarationResult == null) {
return;
}
- if (targetDeclarationResult.node is! ClassOrMixinDeclaration &&
- targetDeclarationResult.node is! ExtensionDeclaration) {
+ var targetNode = targetDeclarationResult.node;
+ if (targetNode is CompilationUnitMember) {
+ if (targetDeclarationResult.node is! ClassOrMixinDeclaration &&
+ targetDeclarationResult.node is! ExtensionDeclaration) {
+ return;
+ }
+ } else {
return;
}
- CompilationUnitMember targetNode = targetDeclarationResult.node;
// prepare location
- var targetLocation = CorrectionUtils(targetDeclarationResult.resolvedUnit)
- .prepareNewGetterLocation(targetNode);
+ var resolvedUnit = targetDeclarationResult.resolvedUnit;
+ if (resolvedUnit == null) {
+ return;
+ }
+ var targetLocation =
+ CorrectionUtils(resolvedUnit).prepareNewGetterLocation(targetNode);
+ if (targetLocation == null) {
+ return;
+ }
// build method source
- var targetSource = targetElement.source;
var targetFile = targetSource.fullName;
await builder.addDartFileEdit(targetFile, (builder) {
builder.addInsertion(targetLocation.offset, (builder) {
@@ -100,7 +112,7 @@
builder.writeGetterDeclaration(_getterName,
isStatic: staticModifier,
nameGroupName: 'NAME',
- returnType: fieldType,
+ returnType: fieldType ?? typeProvider.dynamicType,
returnTypeGroupName: 'TYPE');
builder.write(targetLocation.suffix);
});
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/create_local_variable.dart b/pkg/analysis_server/lib/src/services/correction/dart/create_local_variable.dart
index 42ba1d7..22b464e 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/create_local_variable.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/create_local_variable.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:_fe_analyzer_shared/src/scanner/token.dart';
import 'package:analysis_server/src/services/correction/dart/abstract_producer.dart';
import 'package:analysis_server/src/services/correction/fix.dart';
@@ -14,7 +12,7 @@
import 'package:analyzer_plugin/utilities/range_factory.dart';
class CreateLocalVariable extends CorrectionProducer {
- String _variableName;
+ String _variableName = '';
@override
List<Object> get fixArguments => [_variableName];
@@ -24,14 +22,14 @@
@override
Future<void> compute(ChangeBuilder builder) async {
- if (node is! SimpleIdentifier) {
+ var nameNode = node;
+ if (nameNode is! SimpleIdentifier) {
return;
}
- SimpleIdentifier nameNode = node;
_variableName = nameNode.name;
// if variable is assigned, convert assignment into declaration
- if (node.parent is AssignmentExpression) {
- AssignmentExpression assignment = node.parent;
+ var assignment = node.parent;
+ if (assignment is AssignmentExpression) {
if (assignment.leftHandSide == node &&
assignment.operator.type == TokenType.EQ &&
assignment.parent is ExpressionStatement) {
@@ -48,7 +46,7 @@
}
var prefix = utils.getNodePrefix(target);
// compute type
- var type = inferUndefinedExpressionType(node);
+ var type = inferUndefinedExpressionType(nameNode);
if (!(type == null || type is InterfaceType || type is FunctionType)) {
return;
}
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 66397fc..a697fff 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
@@ -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/services/correction/dart/abstract_producer.dart';
import 'package:analysis_server/src/services/correction/fix.dart';
import 'package:analysis_server/src/services/correction/util.dart';
@@ -18,7 +16,7 @@
/// The kind of method to be created.
final _MethodKind _kind;
- String _memberName;
+ String _memberName = '';
CreateMethod(this._kind);
@@ -47,11 +45,11 @@
}
final classDecl = memberDecl.thisOrAncestorOfType<ClassDeclaration>();
if (classDecl != null) {
- final classElement = classDecl.declaredElement;
+ final classElement = classDecl.declaredElement!;
var missingEquals = memberDecl is FieldDeclaration ||
(memberDecl as MethodDeclaration).name.name == 'hashCode';
- ExecutableElement element;
+ ExecutableElement? element;
if (missingEquals) {
_memberName = '==';
element = classElement.lookUpInheritedMethod(
@@ -61,14 +59,21 @@
element = classElement.lookUpInheritedConcreteGetter(
_memberName, classElement.library);
}
+ if (element == null) {
+ return;
+ }
final location =
utils.prepareNewClassMemberLocation(classDecl, (_) => true);
+ if (location == null) {
+ return;
+ }
+ final element_final = element;
await builder.addDartFileEdit(file, (fileBuilder) {
fileBuilder.addInsertion(location.offset, (builder) {
builder.write(location.prefix);
- builder.writeOverride(element, invokeSuper: true);
+ builder.writeOverride(element_final, invokeSuper: true);
builder.write(location.suffix);
});
});
@@ -84,24 +89,28 @@
_memberName = (node as SimpleIdentifier).name;
var invocation = node.parent as MethodInvocation;
// prepare environment
- Element targetElement;
+ Element? targetElement;
var staticModifier = false;
- CompilationUnitMember targetNode;
+ CompilationUnitMember? targetNode;
var target = invocation.realTarget;
var utils = this.utils;
if (target is ExtensionOverride) {
targetElement = target.staticElement;
- targetNode = await getExtensionDeclaration(targetElement);
- if (targetNode == null) {
- return;
+ if (targetElement is ExtensionElement) {
+ targetNode = await getExtensionDeclaration(targetElement);
+ if (targetNode == null) {
+ return;
+ }
}
} else if (target is Identifier &&
target.staticElement is ExtensionElement) {
targetElement = target.staticElement;
- targetNode = await getExtensionDeclaration(targetElement);
- if (targetNode == null) {
- return;
+ if (targetElement is ExtensionElement) {
+ targetNode = await getExtensionDeclaration(targetElement);
+ if (targetNode == null) {
+ return;
+ }
}
staticModifier = true;
} else if (target == null) {
@@ -112,8 +121,11 @@
// doesn't make sense to create a method.
return;
}
- targetNode = enclosingMember.parent;
- staticModifier = inStaticContext;
+ var enclosingMemberParent = enclosingMember.parent;
+ if (enclosingMemberParent is CompilationUnitMember) {
+ targetNode = enclosingMemberParent;
+ staticModifier = inStaticContext;
+ }
} else {
var targetClassElement = getTargetClassElement(target);
if (targetClassElement == null) {
@@ -130,7 +142,7 @@
}
// maybe static
if (target is Identifier) {
- staticModifier = target.staticElement.kind == ElementKind.CLASS;
+ staticModifier = target.staticElement?.kind == ElementKind.CLASS;
}
// use different utils
var targetPath = targetClassElement.source.fullName;
@@ -138,8 +150,18 @@
await resolvedResult.session.getResolvedUnit(targetPath);
utils = CorrectionUtils(targetResolveResult);
}
+ if (targetElement == null || targetNode == null) {
+ return;
+ }
var targetLocation = utils.prepareNewMethodLocation(targetNode);
- var targetFile = targetElement.source.fullName;
+ if (targetLocation == null) {
+ return;
+ }
+ var targetSource = targetElement.source;
+ if (targetSource == null) {
+ return;
+ }
+ var targetFile = targetSource.fullName;
// build method source
await builder.addDartFileEdit(targetFile, (builder) {
builder.addInsertion(targetLocation.offset, (builder) {
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/create_method_or_function.dart b/pkg/analysis_server/lib/src/services/correction/dart/create_method_or_function.dart
index c831928..3695dfa 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/create_method_or_function.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/create_method_or_function.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/services/correction/dart/abstract_producer.dart';
import 'package:analysis_server/src/services/correction/fix.dart';
import 'package:analysis_server/src/services/correction/util.dart';
@@ -17,9 +15,9 @@
import 'package:analyzer_plugin/utilities/range_factory.dart';
class CreateMethodOrFunction extends CorrectionProducer {
- FixKind _fixKind;
+ FixKind _fixKind = DartFixKind.CREATE_METHOD;
- String _functionName;
+ String _functionName = '';
@override
List<Object> get fixArguments => [_functionName];
@@ -29,10 +27,10 @@
@override
Future<void> compute(ChangeBuilder builder) async {
- if (node is SimpleIdentifier) {
- var nameNode = node as SimpleIdentifier;
+ var nameNode = node;
+ if (nameNode is SimpleIdentifier) {
// prepare argument expression (to get parameter)
- ClassElement targetElement;
+ ClassElement? targetElement;
Expression argument;
{
var target = getQualifiedPropertyTarget(node);
@@ -70,12 +68,11 @@
if (parameterType is! FunctionType) {
return;
}
- var functionType = parameterType as FunctionType;
// add proposal
if (targetElement != null) {
- await _createMethod(builder, targetElement, functionType);
+ await _createMethod(builder, targetElement, parameterType);
} else {
- await _createFunction(builder, functionType);
+ await _createFunction(builder, parameterType);
}
}
}
@@ -135,7 +132,7 @@
var sourcePrefix = '$eol';
var sourceSuffix = eol;
await _createExecutable(builder, functionType, name, file, insertOffset,
- false, prefix, sourcePrefix, sourceSuffix, unit.declaredElement);
+ false, prefix, sourcePrefix, sourceSuffix, unit.declaredElement!);
_fixKind = DartFixKind.CREATE_FUNCTION;
_functionName = name;
}
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/create_missing_overrides.dart b/pkg/analysis_server/lib/src/services/correction/dart/create_missing_overrides.dart
index a1e5881..e6e0c70 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/create_missing_overrides.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/create_missing_overrides.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/services/correction/dart/abstract_producer.dart';
import 'package:analysis_server/src/services/correction/fix.dart';
import 'package:analysis_server/src/utilities/strings.dart';
@@ -15,7 +13,7 @@
import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
class CreateMissingOverrides extends CorrectionProducer {
- int _numElements;
+ int _numElements = 0;
@override
List<Object> get fixArguments => [_numElements];
@@ -48,6 +46,9 @@
var location =
utils.prepareNewClassMemberLocation(targetClass, (_) => true);
+ if (location == null) {
+ return;
+ }
var prefix = utils.getIndent(1);
await builder.addDartFileEdit(file, (builder) {
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/create_mixin.dart b/pkg/analysis_server/lib/src/services/correction/dart/create_mixin.dart
index 6f783b2..14c4598 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/create_mixin.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/create_mixin.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/services/correction/dart/abstract_producer.dart';
import 'package:analysis_server/src/services/correction/fix.dart';
import 'package:analyzer/dart/ast/ast.dart';
@@ -14,7 +12,7 @@
import 'package:analyzer_plugin/utilities/range_factory.dart';
class CreateMixin extends CorrectionProducer {
- String _mixinName;
+ String _mixinName = '';
@override
List<Object> get fixArguments => [_mixinName];
@@ -24,13 +22,15 @@
@override
Future<void> compute(ChangeBuilder builder) async {
- Element prefixElement;
+ Element? prefixElement;
SimpleIdentifier nameNode;
+ var node = this.node;
if (node is SimpleIdentifier) {
var parent = node.parent;
+ var grandParent = parent?.parent;
if (parent is TypeName &&
- parent.parent is ConstructorName &&
- parent.parent.parent is InstanceCreationExpression) {
+ grandParent is ConstructorName &&
+ grandParent.parent is InstanceCreationExpression) {
return;
} else {
nameNode = node;
@@ -40,13 +40,12 @@
if (node.parent is InstanceCreationExpression) {
return;
}
- PrefixedIdentifier prefixedIdentifier = node;
- prefixElement = prefixedIdentifier.prefix.staticElement;
+ prefixElement = node.prefix.staticElement;
if (prefixElement == null) {
return;
}
- nameNode = prefixedIdentifier.identifier;
- _mixinName = prefixedIdentifier.identifier.name;
+ nameNode = node.identifier;
+ _mixinName = node.identifier.name;
} else {
return;
}
@@ -58,9 +57,9 @@
var prefix = '';
var suffix = '';
var offset = -1;
- String filePath;
+ String? filePath;
if (prefixElement == null) {
- targetUnit = unit.declaredElement;
+ targetUnit = unit.declaredElement!;
var enclosingMember = node.thisOrAncestorMatching((node) =>
node is CompilationUnitMember && node.parent is CompilationUnit);
if (enclosingMember == null) {
@@ -77,8 +76,10 @@
targetUnit = library.definingCompilationUnit;
var targetSource = targetUnit.source;
try {
- offset = targetSource.contents.data.length;
- filePath = targetSource.fullName;
+ if (targetSource != null) {
+ offset = targetSource.contents.data.length;
+ filePath = targetSource.fullName;
+ }
prefix = '$eol';
suffix = '$eol';
} on FileSystemException {
@@ -90,7 +91,7 @@
}
}
}
- if (offset < 0) {
+ if (filePath == null || offset < 0) {
return;
}
await builder.addDartFileEdit(filePath, (builder) {
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/create_no_such_method.dart b/pkg/analysis_server/lib/src/services/correction/dart/create_no_such_method.dart
index 92af6ca..aa62503 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/create_no_such_method.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/create_no_such_method.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/services/correction/dart/abstract_producer.dart';
import 'package:analysis_server/src/services/correction/fix.dart';
import 'package:analyzer/dart/ast/ast.dart';
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/create_setter.dart b/pkg/analysis_server/lib/src/services/correction/dart/create_setter.dart
index c6c7fc5..8958731 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/create_setter.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/create_setter.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/services/correction/dart/abstract_producer.dart';
import 'package:analysis_server/src/services/correction/fix.dart';
import 'package:analysis_server/src/services/correction/util.dart';
@@ -14,7 +12,7 @@
import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
class CreateSetter extends CorrectionProducer {
- String _setterName;
+ String _setterName = '';
@override
List<Object> get fixArguments => [_setterName];
@@ -24,15 +22,15 @@
@override
Future<void> compute(ChangeBuilder builder) async {
- if (node is! SimpleIdentifier) {
+ var nameNode = node;
+ if (nameNode is! SimpleIdentifier) {
return;
}
- SimpleIdentifier nameNode = node;
if (!nameNode.inSetterContext()) {
return;
}
// prepare target
- Expression target;
+ Expression? target;
{
var nameParent = nameNode.parent;
if (nameParent is PrefixedIdentifier) {
@@ -43,7 +41,7 @@
}
// prepare target element
var staticModifier = false;
- Element targetElement;
+ Element? targetElement;
if (target is ExtensionOverride) {
targetElement = target.staticElement;
} else if (target is Identifier &&
@@ -71,7 +69,11 @@
}
staticModifier = inStaticContext;
}
- if (targetElement.librarySource.isInSystemLibrary) {
+ if (targetElement == null) {
+ return;
+ }
+ var targetSource = targetElement.source;
+ if (targetSource == null || targetSource.isInSystemLibrary) {
return;
}
// prepare target declaration
@@ -80,16 +82,26 @@
if (targetDeclarationResult == null) {
return;
}
- if (targetDeclarationResult.node is! ClassOrMixinDeclaration &&
- targetDeclarationResult.node is! ExtensionDeclaration) {
+ var targetNode = targetDeclarationResult.node;
+ if (targetNode is CompilationUnitMember) {
+ if (targetDeclarationResult.node is! ClassOrMixinDeclaration &&
+ targetDeclarationResult.node is! ExtensionDeclaration) {
+ return;
+ }
+ } else {
return;
}
- CompilationUnitMember targetNode = targetDeclarationResult.node;
// prepare location
- var targetLocation = CorrectionUtils(targetDeclarationResult.resolvedUnit)
+ var targetUnit = targetDeclarationResult.resolvedUnit;
+ if (targetUnit == null) {
+ return;
+ }
+ var targetLocation = CorrectionUtils(targetUnit)
.prepareNewGetterLocation(targetNode); // Rename to "AccessorLocation"
+ if (targetLocation == null) {
+ return;
+ }
// build method source
- var targetSource = targetElement.source;
var targetFile = targetSource.fullName;
_setterName = nameNode.name;
await builder.addDartFileEdit(targetFile, (builder) {
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/encapsulate_field.dart b/pkg/analysis_server/lib/src/services/correction/dart/encapsulate_field.dart
index d5aa8b9..9bbf4d8 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/encapsulate_field.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/encapsulate_field.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/services/correction/assist.dart';
import 'package:analysis_server/src/services/correction/dart/abstract_producer.dart';
import 'package:analyzer/dart/ast/ast.dart';
@@ -43,7 +41,7 @@
}
var field = fields.first;
var nameNode = field.name;
- FieldElement fieldElement = nameNode.staticElement;
+ var fieldElement = field.declaredElement as FieldElement;
// should have a public name
var name = nameNode.name;
if (Identifier.isPrivateName(name)) {
@@ -67,10 +65,11 @@
for (var member in classDeclaration.members) {
if (member is ConstructorDeclaration) {
for (var parameter in member.parameters.parameters) {
+ var identifier = parameter.identifier;
var parameterElement = parameter.declaredElement;
- if (parameterElement is FieldFormalParameterElement &&
+ if (identifier != null &&
+ parameterElement is FieldFormalParameterElement &&
parameterElement.field == fieldElement) {
- var identifier = parameter.identifier;
builder.addSimpleReplacement(range.node(identifier), '_$name');
}
}
@@ -79,14 +78,16 @@
// Write getter and setter.
builder.addInsertion(fieldDeclaration.end, (builder) {
- String docCode;
- if (fieldDeclaration.documentationComment != null) {
- docCode = utils.getNodeText(fieldDeclaration.documentationComment);
+ String? docCode;
+ var documentationComment = fieldDeclaration.documentationComment;
+ if (documentationComment != null) {
+ docCode = utils.getNodeText(documentationComment);
}
var typeCode = '';
- if (variableList.type != null) {
- typeCode = utils.getNodeText(variableList.type) + ' ';
+ var typeAnnotation = variableList.type;
+ if (typeAnnotation != null) {
+ typeCode = utils.getNodeText(typeAnnotation) + ' ';
}
// Write getter.
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/exchange_operands.dart b/pkg/analysis_server/lib/src/services/correction/dart/exchange_operands.dart
index bb6b9de..9d1f05d 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/exchange_operands.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/exchange_operands.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/services/correction/assist.dart';
import 'package:analysis_server/src/services/correction/dart/abstract_producer.dart';
import 'package:analyzer/dart/ast/ast.dart';
@@ -44,7 +42,7 @@
// maybe replace the operator
var operator = binaryExpression.operator;
// prepare a new operator
- String newOperator;
+ String? newOperator;
var operatorType = operator.type;
if (operatorType == TokenType.LT) {
newOperator = '>';
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/extend_class_for_mixin.dart b/pkg/analysis_server/lib/src/services/correction/dart/extend_class_for_mixin.dart
index e9eab92..10dbaad 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/extend_class_for_mixin.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/extend_class_for_mixin.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/services/correction/dart/abstract_producer.dart';
import 'package:analysis_server/src/services/correction/fix.dart';
import 'package:analyzer/dart/ast/ast.dart';
@@ -11,7 +9,7 @@
import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
class ExtendClassForMixin extends CorrectionProducer {
- String _typeName;
+ String _typeName = '';
@override
List<Object> get fixArguments => [_typeName];
@@ -21,6 +19,11 @@
@override
Future<void> compute(ChangeBuilder builder) async {
+ var diagnostic = this.diagnostic;
+ if (diagnostic == null) {
+ return;
+ }
+
var declaration = node.thisOrAncestorOfType<ClassDeclaration>();
if (declaration != null && declaration.extendsClause == null) {
// TODO(brianwilkerson) Find a way to pass in the name of the class
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/flutter_convert_to_children.dart b/pkg/analysis_server/lib/src/services/correction/dart/flutter_convert_to_children.dart
index 01cc86a..1c0f0ca 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/flutter_convert_to_children.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/flutter_convert_to_children.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/services/correction/assist.dart';
import 'package:analysis_server/src/services/correction/dart/abstract_producer.dart';
import 'package:analyzer/dart/ast/ast.dart';
@@ -21,7 +19,7 @@
NamedExpression namedExp;
{
var node = this.node;
- var parent = node?.parent;
+ var parent = node.parent;
var parent2 = parent?.parent;
if (node is SimpleIdentifier &&
parent is Label &&
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/flutter_convert_to_stateful_widget.dart b/pkg/analysis_server/lib/src/services/correction/dart/flutter_convert_to_stateful_widget.dart
index 48cf327..a386080 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/flutter_convert_to_stateful_widget.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/flutter_convert_to_stateful_widget.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:_fe_analyzer_shared/src/scanner/token.dart';
import 'package:analysis_server/src/services/correction/assist.dart';
import 'package:analysis_server/src/services/correction/dart/abstract_producer.dart';
@@ -37,14 +35,14 @@
}
// Find the build() method.
- MethodDeclaration buildMethod;
+ MethodDeclaration? buildMethod;
for (var member in widgetClass.members) {
- if (member is MethodDeclaration &&
- member.name.name == 'build' &&
- member.parameters != null &&
- member.parameters.parameters.length == 1) {
- buildMethod = member;
- break;
+ if (member is MethodDeclaration && member.name.name == 'build') {
+ var parameters = member.parameters;
+ if (parameters != null && parameters.parameters.length == 1) {
+ buildMethod = member;
+ break;
+ }
}
}
if (buildMethod == null) {
@@ -52,8 +50,9 @@
}
// Must be a StatelessWidget subclasses.
- var widgetClassElement = widgetClass.declaredElement;
- if (!flutter.isExactlyStatelessWidgetType(widgetClassElement.supertype)) {
+ var widgetClassElement = widgetClass.declaredElement!;
+ var superType = widgetClassElement.supertype;
+ if (superType == null || !flutter.isExactlyStatelessWidgetType(superType)) {
return;
}
@@ -75,20 +74,26 @@
for (var member in widgetClass.members) {
if (member is FieldDeclaration && !member.isStatic) {
for (var fieldNode in member.fields.variables) {
- FieldElement fieldElement = fieldNode.declaredElement;
+ var fieldElement = fieldNode.declaredElement as FieldElement;
if (!fieldsAssignedInConstructors.contains(fieldElement)) {
nodesToMove.add(member);
elementsToMove.add(fieldElement);
- elementsToMove.add(fieldElement.getter);
- if (fieldElement.setter != null) {
- elementsToMove.add(fieldElement.setter);
+
+ var getter = fieldElement.getter;
+ if (getter != null) {
+ elementsToMove.add(getter);
+ }
+
+ var setter = fieldElement.setter;
+ if (setter != null) {
+ elementsToMove.add(setter);
}
}
}
}
if (member is MethodDeclaration && !member.isStatic) {
nodesToMove.add(member);
- elementsToMove.add(member.declaredElement);
+ elementsToMove.add(member.declaredElement!);
}
}
@@ -128,8 +133,9 @@
var hasBuildMethod = false;
var typeParams = '';
- if (widgetClass.typeParameters != null) {
- typeParams = utils.getNodeText(widgetClass.typeParameters);
+ var typeParameters = widgetClass.typeParameters;
+ if (typeParameters != null) {
+ typeParams = utils.getNodeText(typeParameters);
}
/// Replace code between [replaceOffset] and [replaceEnd] with
@@ -206,10 +212,10 @@
// Write just param names (and not bounds, metadata and docs).
builder.write('<${widgetClass.name}');
- if (widgetClass.typeParameters != null) {
+ if (typeParameters != null) {
builder.write('<');
var first = true;
- for (var param in widgetClass.typeParameters.typeParameters) {
+ for (var param in typeParameters.typeParameters) {
if (!first) {
builder.write(', ');
first = false;
@@ -250,7 +256,10 @@
if (node.parent is FieldFormalParameter) {
var element = node.staticElement;
if (element is FieldFormalParameterElement) {
- fieldsAssignedInConstructors.add(element.field);
+ var field = element.field;
+ if (field != null) {
+ fieldsAssignedInConstructors.add(field);
+ }
}
}
if (node.parent is ConstructorFieldInitializer) {
@@ -290,7 +299,7 @@
}
var element = node.staticElement;
if (element is ExecutableElement &&
- element?.enclosingElement == widgetClassElement &&
+ element.enclosingElement == widgetClassElement &&
!elementsToMove.contains(element)) {
var offset = node.offset - linesRange.offset;
var qualifier =
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/flutter_move_down.dart b/pkg/analysis_server/lib/src/services/correction/dart/flutter_move_down.dart
index 740afed..1e2fa0f 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/flutter_move_down.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/flutter_move_down.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/services/correction/assist.dart';
import 'package:analysis_server/src/services/correction/dart/abstract_producer.dart';
import 'package:analyzer/dart/ast/ast.dart';
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/flutter_move_up.dart b/pkg/analysis_server/lib/src/services/correction/dart/flutter_move_up.dart
index ec29164..8513af7 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/flutter_move_up.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/flutter_move_up.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/services/correction/assist.dart';
import 'package:analysis_server/src/services/correction/dart/abstract_producer.dart';
import 'package:analyzer/dart/ast/ast.dart';
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/flutter_remove_widget.dart b/pkg/analysis_server/lib/src/services/correction/dart/flutter_remove_widget.dart
index 0158fbc..9818245 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/flutter_remove_widget.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/flutter_remove_widget.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/services/correction/assist.dart';
import 'package:analysis_server/src/services/correction/dart/abstract_producer.dart';
import 'package:analyzer/dart/ast/ast.dart';
@@ -25,7 +23,7 @@
// Prepare the list of our children.
var childrenArgument = flutter.findChildrenArgument(widgetCreation);
if (childrenArgument != null) {
- var childrenExpression = childrenArgument?.expression;
+ var childrenExpression = childrenArgument.expression;
if (childrenExpression is ListLiteral &&
childrenExpression.elements.isNotEmpty) {
await _removeChildren(
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/flutter_swap_with_child.dart b/pkg/analysis_server/lib/src/services/correction/dart/flutter_swap_with_child.dart
index c1c46e5..c254da0 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/flutter_swap_with_child.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/flutter_swap_with_child.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/services/correction/assist.dart';
import 'package:analysis_server/src/services/correction/dart/abstract_producer.dart';
import 'package:analyzer/dart/ast/ast.dart';
@@ -17,7 +15,8 @@
InstanceCreationExpression parent,
InstanceCreationExpression child) async {
// The child must have its own child.
- if (flutter.findChildArgument(child) == null) {
+ var stableChild = flutter.findChildArgument(child);
+ if (stableChild == null) {
return;
}
@@ -38,11 +37,8 @@
// Write all the arguments of the parent.
// Don't write the "child".
- Expression stableChild;
for (var argument in childArgs.arguments) {
- if (flutter.isChildArgument(argument)) {
- stableChild = argument;
- } else {
+ if (argument != stableChild) {
var text = utils.getNodeText(argument);
text = replaceSourceIndent(text, childIndent, parentIndent);
builder.write(parentIndent);
@@ -100,16 +96,16 @@
@override
Future<void> compute(ChangeBuilder builder) async {
var parent = flutter.identifyNewExpression(node);
- if (!flutter.isWidgetCreation(parent)) {
+ if (parent == null || !flutter.isWidgetCreation(parent)) {
return;
}
var childArgument = flutter.findChildArgument(parent);
- if (childArgument?.expression is! InstanceCreationExpression ||
- !flutter.isWidgetCreation(childArgument.expression)) {
+ var child = childArgument?.expression;
+ if (child is! InstanceCreationExpression ||
+ !flutter.isWidgetCreation(child)) {
return;
}
- InstanceCreationExpression child = childArgument.expression;
await swapParentAndChild(builder, parent, child);
}
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/flutter_swap_with_parent.dart b/pkg/analysis_server/lib/src/services/correction/dart/flutter_swap_with_parent.dart
index a8b9f8b..701c73e 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/flutter_swap_with_parent.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/flutter_swap_with_parent.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/services/correction/assist.dart';
import 'package:analysis_server/src/services/correction/dart/flutter_swap_with_child.dart';
import 'package:analyzer/dart/ast/ast.dart';
@@ -17,7 +15,7 @@
@override
Future<void> compute(ChangeBuilder builder) async {
var child = flutter.identifyNewExpression(node);
- if (!flutter.isWidgetCreation(child)) {
+ if (child == null || !flutter.isWidgetCreation(child)) {
return;
}
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/flutter_wrap_generic.dart b/pkg/analysis_server/lib/src/services/correction/dart/flutter_wrap_generic.dart
index 4938af4..5fcd235 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/flutter_wrap_generic.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/flutter_wrap_generic.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/services/correction/assist.dart';
import 'package:analysis_server/src/services/correction/dart/abstract_producer.dart';
import 'package:analyzer/dart/ast/ast.dart';
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/flutter_wrap_stream_builder.dart b/pkg/analysis_server/lib/src/services/correction/dart/flutter_wrap_stream_builder.dart
index 50f11bb..ce2f849 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/flutter_wrap_stream_builder.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/flutter_wrap_stream_builder.dart
@@ -2,10 +2,9 @@
// 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/src/dart/ast/extensions.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';
@@ -20,7 +19,7 @@
if (widgetExpr == null) {
return;
}
- if (flutter.isExactWidgetTypeStreamBuilder(widgetExpr.staticType)) {
+ if (flutter.isExactWidgetTypeStreamBuilder(widgetExpr.typeOrThrow)) {
return;
}
var widgetSrc = utils.getNodeText(widgetExpr);
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/import_add_show.dart b/pkg/analysis_server/lib/src/services/correction/dart/import_add_show.dart
index 19ee675..4b923a3 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/import_add_show.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/import_add_show.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 'dart:collection';
import 'package:analysis_server/src/services/correction/assist.dart';
@@ -39,7 +37,7 @@
var namespace = getImportNamespace(importElement);
// prepare names of referenced elements (from this import)
var visitor = _ReferenceFinder(namespace);
- resolvedResult.unit.accept(visitor);
+ unit.accept(visitor);
var referencedNames = visitor.referencedNames;
// ignore if unused
if (referencedNames.isEmpty) {
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/import_library.dart b/pkg/analysis_server/lib/src/services/correction/dart/import_library.dart
index 872fd34..2274c6e 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/import_library.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/import_library.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 'dart:collection';
import 'package:analysis_server/src/services/correction/dart/abstract_producer.dart';
@@ -56,10 +54,9 @@
} else if (_importKind == _ImportKind.forTopLevelVariable) {
var node = this.node;
if (node is Annotation) {
- Annotation annotation = node;
- var name = annotation.name;
- if (name != null && name.staticElement == null) {
- if (annotation.arguments != null) {
+ var name = node.name;
+ if (name.staticElement == null) {
+ if (node.arguments != null) {
return;
}
node = name;
@@ -75,10 +72,9 @@
} else if (_importKind == _ImportKind.forType) {
var node = this.node;
if (node is Annotation) {
- Annotation annotation = node;
- var name = annotation.name;
- if (name != null && name.staticElement == null) {
- if (annotation.arguments == null) {
+ var name = node.name;
+ if (name.staticElement == null) {
+ if (node.arguments == null) {
return;
}
node = name;
@@ -116,11 +112,8 @@
/// Return the relative uri from the passed [library] to the given [path].
/// If the [path] is not in the LibraryElement, `null` is returned.
- String _getRelativeURIFromLibrary(LibraryElement library, String path) {
- var librarySource = library?.librarySource;
- if (librarySource == null) {
- return null;
- }
+ String? _getRelativeURIFromLibrary(LibraryElement library, String path) {
+ var librarySource = library.librarySource;
var pathCtx = resourceProvider.pathContext;
var libraryDirectory = pathCtx.dirname(librarySource.fullName);
var sourceDirectory = pathCtx.dirname(path);
@@ -133,7 +126,7 @@
}
Iterable<CorrectionProducer> _importLibrary(FixKind fixKind, Uri library,
- [String relativeURI]) sync* {
+ [String? relativeURI]) sync* {
yield _ImportAbsoluteLibrary(fixKind, library);
if (relativeURI != null && relativeURI.isNotEmpty) {
yield _ImportRelativeLibrary(fixKind, relativeURI);
@@ -154,12 +147,15 @@
for (var imp in libraryElement.imports) {
// prepare element
var libraryElement = imp.importedLibrary;
+ if (libraryElement == null) {
+ continue;
+ }
var element = getExportedElement(libraryElement, name);
if (element == null) {
continue;
}
if (element is PropertyAccessorElement) {
- element = (element as PropertyAccessorElement).variable;
+ element = element.variable;
}
if (!elementKinds.contains(element.kind)) {
continue;
@@ -167,7 +163,7 @@
// may be apply prefix
var prefix = imp.prefix;
if (prefix != null) {
- yield _ImportLibraryPrefix(imp);
+ yield _ImportLibraryPrefix(libraryElement, prefix);
continue;
}
// may be update "show" directive
@@ -265,7 +261,7 @@
final Uri _library;
- String _uriText;
+ String _uriText = '';
_ImportAbsoluteLibrary(this._fixKind, this._library);
@@ -294,13 +290,14 @@
/// A correction processor that can make one of the possible change computed by
/// the [ImportLibrary] producer.
class _ImportLibraryPrefix extends CorrectionProducer {
- final ImportElement _importElement;
+ final LibraryElement _importedLibrary;
+ final PrefixElement _importPrefix;
- String _libraryName;
+ String _libraryName = '';
- String _prefixName;
+ String _prefixName = '';
- _ImportLibraryPrefix(this._importElement);
+ _ImportLibraryPrefix(this._importedLibrary, this._importPrefix);
@override
List<Object> get fixArguments => [_libraryName, _prefixName];
@@ -310,10 +307,8 @@
@override
Future<void> compute(ChangeBuilder builder) async {
- var libraryElement = _importElement.importedLibrary;
- var prefix = _importElement.prefix;
- _libraryName = libraryElement.displayName;
- _prefixName = prefix.displayName;
+ _libraryName = _importedLibrary.displayName;
+ _prefixName = _importPrefix.displayName;
await builder.addDartFileEdit(file, (builder) {
builder.addSimpleReplacement(range.startLength(node, 0), '$_prefixName.');
});
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/inline_invocation.dart b/pkg/analysis_server/lib/src/services/correction/dart/inline_invocation.dart
index eb35756..c2e0711 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/inline_invocation.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/inline_invocation.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/services/correction/assist.dart';
import 'package:analysis_server/src/services/correction/dart/abstract_producer.dart';
import 'package:analysis_server/src/services/correction/fix.dart';
@@ -32,35 +30,42 @@
@override
Future<void> compute(ChangeBuilder builder) async {
var node = this.node;
- if (node is! SimpleIdentifier || node.parent is! MethodInvocation) {
+ if (node is! SimpleIdentifier || node.name != 'add') {
return;
}
- SimpleIdentifier name = node;
- MethodInvocation invocation = node.parent;
- if (name != invocation.methodName ||
- name.name != 'add' ||
+
+ var invocation = node.parent;
+ if (invocation is! MethodInvocation) {
+ return;
+ }
+
+ if (node != invocation.methodName ||
!invocation.isCascaded ||
invocation.argumentList.arguments.length != 1) {
return;
}
- var cascade = invocation.thisOrAncestorOfType<CascadeExpression>();
+
+ var cascade = invocation.parent;
+ if (cascade is! CascadeExpression) {
+ return;
+ }
+
var sections = cascade.cascadeSections;
var target = cascade.target;
if (target is! ListLiteral || sections[0] != invocation) {
// TODO(brianwilkerson) Consider extending this to handle set literals.
return;
}
- ListLiteral list = target;
var argument = invocation.argumentList.arguments[0];
var elementText = utils.getNodeText(argument);
await builder.addDartFileEdit(file, (builder) {
- if (list.elements.isNotEmpty) {
+ if (target.elements.isNotEmpty) {
// ['a']..add(e);
- builder.addSimpleInsertion(list.elements.last.end, ', $elementText');
+ builder.addSimpleInsertion(target.elements.last.end, ', $elementText');
} else {
// []..add(e);
- builder.addSimpleInsertion(list.leftBracket.end, elementText);
+ builder.addSimpleInsertion(target.leftBracket.end, elementText);
}
builder.addDeletion(range.node(invocation));
});
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/inline_typedef.dart b/pkg/analysis_server/lib/src/services/correction/dart/inline_typedef.dart
index 6790500..6272326 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/inline_typedef.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/inline_typedef.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:_fe_analyzer_shared/src/scanner/token.dart';
import 'package:analysis_server/src/services/correction/dart/abstract_producer.dart';
import 'package:analysis_server/src/services/correction/fix.dart';
@@ -14,7 +12,7 @@
import 'package:analyzer_plugin/utilities/range_factory.dart';
class InlineTypedef extends CorrectionProducer {
- String _name;
+ String _name = '';
@override
List<Object> get fixArguments => [_name];
@@ -27,13 +25,17 @@
@override
Future<void> compute(ChangeBuilder builder) async {
+ var parent = node.parent;
+ if (parent == null) {
+ return;
+ }
+
//
// Extract the information needed to build the edit.
//
- TypeAnnotation returnType;
- TypeParameterList typeParameters;
+ TypeAnnotation? returnType;
+ TypeParameterList? typeParameters;
List<FormalParameter> parameters;
- var parent = node.parent;
if (parent is FunctionTypeAlias) {
returnType = parent.returnType;
_name = parent.name.name;
@@ -44,6 +46,9 @@
return;
}
var functionType = parent.functionType;
+ if (functionType == null) {
+ return;
+ }
returnType = functionType.returnType;
_name = parent.name.name;
typeParameters = functionType.typeParameters;
@@ -53,8 +58,9 @@
}
// TODO(brianwilkerson) Handle parts.
var finder = _ReferenceFinder(_name);
- resolvedResult.unit.accept(finder);
- if (finder.count != 1) {
+ unit.accept(finder);
+ var reference = finder.reference;
+ if (reference == null || finder.count != 1) {
return;
}
//
@@ -62,7 +68,7 @@
//
await builder.addDartFileEdit(file, (builder) {
builder.addDeletion(utils.getLinesRange(range.node(parent)));
- builder.addReplacement(range.node(finder.reference), (builder) {
+ builder.addReplacement(range.node(reference), (builder) {
if (returnType != null) {
builder.write(utils.getNodeText(returnType));
builder.write(' ');
@@ -71,7 +77,7 @@
if (typeParameters != null) {
builder.write(utils.getNodeText(typeParameters));
}
- String groupEnd;
+ String? groupEnd;
builder.write('(');
for (var i = 0; i < parameters.length; i++) {
var parameter = parameters[i];
@@ -90,7 +96,7 @@
builder.write('[');
}
}
- parameter = (parameter as DefaultFormalParameter).parameter;
+ parameter = parameter.parameter;
}
if (parameter is FunctionTypedFormalParameter) {
builder.write(utils.getNodeText(parameter));
@@ -109,14 +115,18 @@
if (keyword != null && keyword.type != Keyword.VAR) {
builder.write(keyword.lexeme);
}
- if (parameter.type == null) {
+ var typeAnnotation = parameter.type;
+ if (typeAnnotation == null) {
builder.write('dynamic');
} else {
- builder.write(utils.getNodeText(parameter.type));
+ builder.write(utils.getNodeText(typeAnnotation));
}
if (parameter.isNamed) {
- builder.write(' ');
- builder.write(parameter.identifier.name);
+ var identifier = parameter.identifier;
+ if (identifier != null) {
+ builder.write(' ');
+ builder.write(identifier.name);
+ }
}
}
}
@@ -135,7 +145,7 @@
class _ReferenceFinder extends RecursiveAstVisitor {
final String typeName;
- TypeName reference;
+ TypeName? reference;
int count = 0;
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/insert_semicolon.dart b/pkg/analysis_server/lib/src/services/correction/dart/insert_semicolon.dart
index 8c837c1..60ad47b 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/insert_semicolon.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/insert_semicolon.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/services/correction/dart/abstract_producer.dart';
import 'package:analysis_server/src/services/correction/fix.dart';
import 'package:analyzer/dart/ast/ast.dart';
@@ -16,6 +14,11 @@
@override
Future<void> compute(ChangeBuilder builder) async {
+ var diagnostic = this.diagnostic;
+ if (diagnostic == null) {
+ return;
+ }
+
var message = diagnostic.problemMessage;
if (message.message.contains("';'")) {
if (_isAwaitNode()) {
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/introduce_local_cast_type.dart b/pkg/analysis_server/lib/src/services/correction/dart/introduce_local_cast_type.dart
index c696b43..e3c3b29 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/introduce_local_cast_type.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/introduce_local_cast_type.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/services/correction/assist.dart';
import 'package:analysis_server/src/services/correction/dart/abstract_producer.dart';
import 'package:analysis_server/src/services/correction/name_suggestion.dart';
@@ -19,42 +17,25 @@
@override
Future<void> compute(ChangeBuilder builder) async {
- var node = this.node;
- if (node is IfStatement) {
- node = (node as IfStatement).condition;
- } else if (node is WhileStatement) {
- node = (node as WhileStatement).condition;
- }
- // prepare IsExpression
- if (node is! IsExpression) {
+ var isExpression = _getCondition(node);
+ if (isExpression is! IsExpression) {
return;
}
- IsExpression isExpression = node;
var castType = isExpression.type.type;
var castTypeCode = utils.getNodeText(isExpression.type);
// prepare environment
- var indent = utils.getIndent(1);
- String prefix;
- Block targetBlock;
- {
- var statement = node.thisOrAncestorOfType<Statement>();
- if (statement is IfStatement && statement.thenStatement is Block) {
- targetBlock = statement.thenStatement;
- } else if (statement is WhileStatement && statement.body is Block) {
- targetBlock = statement.body;
- } else {
- return;
- }
- prefix = utils.getNodePrefix(statement);
+ var enclosingStatement = _enclosingStatement(isExpression);
+ if (enclosingStatement == null) {
+ return;
}
// prepare location
int offset;
String statementPrefix;
if (isExpression.notOperator == null) {
- offset = targetBlock.leftBracket.end;
- statementPrefix = indent;
+ offset = enclosingStatement.block.leftBracket.end;
+ statementPrefix = utils.getIndent(1);
} else {
- offset = targetBlock.rightBracket.end;
+ offset = enclosingStatement.block.rightBracket.end;
statementPrefix = '';
}
// prepare excluded names
@@ -69,7 +50,7 @@
if (suggestions.isNotEmpty) {
await builder.addDartFileEdit(file, (builder) {
builder.addInsertion(offset, (builder) {
- builder.write(eol + prefix + statementPrefix);
+ builder.write(eol + enclosingStatement.prefix + statementPrefix);
builder.write(castTypeCode);
builder.write(' ');
builder.addSimpleLinkedEdit('NAME', suggestions[0],
@@ -84,6 +65,54 @@
}
}
+ _EnclosingStatement? _enclosingStatement(IsExpression condition) {
+ var statement = condition.thisOrAncestorOfType<Statement>();
+ if (statement is IfStatement) {
+ var thenStatement = statement.thenStatement;
+ if (thenStatement is Block) {
+ return _EnclosingStatement(
+ utils.getNodePrefix(statement),
+ thenStatement,
+ );
+ }
+ } else if (statement is WhileStatement) {
+ var body = statement.body;
+ if (body is Block) {
+ return _EnclosingStatement(
+ utils.getNodePrefix(statement),
+ body,
+ );
+ }
+ }
+ return null;
+ }
+
/// Return an instance of this class. Used as a tear-off in `AssistProcessor`.
static IntroduceLocalCastType newInstance() => IntroduceLocalCastType();
+
+ static Expression? _getCondition(AstNode node) {
+ if (node is IfStatement) {
+ return node.condition;
+ } else if (node is WhileStatement) {
+ return node.condition;
+ }
+
+ if (node is Expression) {
+ var parent = node.parent;
+ if (parent is IfStatement && parent.condition == node) {
+ return node;
+ } else if (parent is WhileStatement && parent.condition == node) {
+ return node;
+ }
+ }
+
+ return null;
+ }
+}
+
+class _EnclosingStatement {
+ final String prefix;
+ final Block block;
+
+ _EnclosingStatement(this.prefix, this.block);
}
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/invert_if_statement.dart b/pkg/analysis_server/lib/src/services/correction/dart/invert_if_statement.dart
index 2fa703ac..20e22c9 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/invert_if_statement.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/invert_if_statement.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/services/correction/assist.dart';
import 'package:analysis_server/src/services/correction/dart/abstract_producer.dart';
import 'package:analyzer/dart/ast/ast.dart';
@@ -17,15 +15,15 @@
@override
Future<void> compute(ChangeBuilder builder) async {
- if (node is! IfStatement) {
+ var ifStatement = node;
+ if (ifStatement is! IfStatement) {
return;
}
- var ifStatement = node as IfStatement;
var condition = ifStatement.condition;
// should have both "then" and "else"
var thenStatement = ifStatement.thenStatement;
var elseStatement = ifStatement.elseStatement;
- if (thenStatement == null || elseStatement == null) {
+ if (elseStatement == null) {
return;
}
// prepare source
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/join_if_with_inner.dart b/pkg/analysis_server/lib/src/services/correction/dart/join_if_with_inner.dart
index 00337c6..9b123a07 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/join_if_with_inner.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/join_if_with_inner.dart
@@ -2,11 +2,10 @@
// 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:analysis_server/src/services/correction/util.dart';
+import 'package:analysis_server/src/utilities/extensions/ast.dart';
import 'package:analyzer/dart/ast/ast.dart';
import 'package:analyzer_plugin/utilities/assist/assist.dart';
import 'package:analyzer_plugin/utilities/change_builder/change_builder_core.dart';
@@ -19,25 +18,20 @@
@override
Future<void> compute(ChangeBuilder builder) async {
// climb up condition to the (supposedly) "if" statement
- var node = this.node;
- while (node is Expression) {
- node = node.parent;
- }
+ var targetIfStatement = node.enclosingIfStatement;
// prepare target "if" statement
- if (node is! IfStatement) {
+ if (targetIfStatement == null) {
return;
}
- var targetIfStatement = node as IfStatement;
if (targetIfStatement.elseStatement != null) {
return;
}
// prepare inner "if" statement
var targetThenStatement = targetIfStatement.thenStatement;
- var innerStatement = getSingleStatement(targetThenStatement);
- if (innerStatement is! IfStatement) {
+ var innerIfStatement = getSingleStatement(targetThenStatement);
+ if (innerIfStatement is! IfStatement) {
return;
}
- var innerIfStatement = innerStatement as IfStatement;
if (innerIfStatement.elseStatement != null) {
return;
}
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/join_if_with_outer.dart b/pkg/analysis_server/lib/src/services/correction/dart/join_if_with_outer.dart
index 22761fe..5d17b46 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/join_if_with_outer.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/join_if_with_outer.dart
@@ -2,11 +2,10 @@
// 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:analysis_server/src/services/correction/util.dart';
+import 'package:analysis_server/src/utilities/extensions/ast.dart';
import 'package:analyzer/dart/ast/ast.dart';
import 'package:analyzer_plugin/utilities/assist/assist.dart';
import 'package:analyzer_plugin/utilities/change_builder/change_builder_core.dart';
@@ -19,22 +18,18 @@
@override
Future<void> compute(ChangeBuilder builder) async {
// climb up condition to the (supposedly) "if" statement
- var node = this.node;
- while (node is Expression) {
- node = node.parent;
- }
+ var targetIfStatement = node.enclosingIfStatement;
// prepare target "if" statement
- if (node is! IfStatement) {
+ if (targetIfStatement == null) {
return;
}
- var targetIfStatement = node as IfStatement;
if (targetIfStatement.elseStatement != null) {
return;
}
// prepare outer "if" statement
var parent = targetIfStatement.parent;
if (parent is Block) {
- if ((parent as Block).statements.length != 1) {
+ if (parent.statements.length != 1) {
return;
}
parent = parent.parent;
@@ -42,7 +37,7 @@
if (parent is! IfStatement) {
return;
}
- var outerIfStatement = parent as IfStatement;
+ var outerIfStatement = parent;
if (outerIfStatement.elseStatement != null) {
return;
}
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/join_variable_declaration.dart b/pkg/analysis_server/lib/src/services/correction/dart/join_variable_declaration.dart
index c7713a2..015acb8 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/join_variable_declaration.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/join_variable_declaration.dart
@@ -2,13 +2,10 @@
// 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:_fe_analyzer_shared/src/scanner/token.dart';
import 'package:analysis_server/src/services/correction/assist.dart';
import 'package:analysis_server/src/services/correction/dart/abstract_producer.dart';
import 'package:analyzer/dart/ast/ast.dart';
-import 'package:analyzer/src/dart/ast/utilities.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';
@@ -19,12 +16,13 @@
@override
Future<void> compute(ChangeBuilder builder) async {
+ var node = this.node;
if (node is SimpleIdentifier) {
var parent = node.parent;
if (parent is AssignmentExpression &&
parent.leftHandSide == node &&
parent.parent is ExpressionStatement) {
- await _joinOnAssignment(builder, parent);
+ await _joinOnAssignment(builder, node, parent);
return;
}
}
@@ -36,58 +34,57 @@
/// Join the declaration when the variable is on the left-hand side of an
/// assignment.
- Future<void> _joinOnAssignment(
- ChangeBuilder builder, AssignmentExpression assignExpression) async {
+ Future<void> _joinOnAssignment(ChangeBuilder builder, SimpleIdentifier left,
+ AssignmentExpression assignment) async {
// Check that assignment is not a compound assignment.
- if (assignExpression.operator.type != TokenType.EQ) {
+ if (assignment.operator.type != TokenType.EQ) {
return;
}
- // prepare "declaration" statement
- var element = (node as SimpleIdentifier).staticElement;
- if (element == null) {
+
+ // The assignment must be a separate statement.
+ var assignmentStatement = assignment.parent;
+ if (assignmentStatement is! ExpressionStatement) {
return;
}
- var declOffset = element.nameOffset;
- var unit = resolvedResult.unit;
- var declNode = NodeLocator(declOffset).searchWithin(unit);
- if (declNode != null &&
- declNode.parent is VariableDeclaration &&
- (declNode.parent as VariableDeclaration).name == declNode &&
- declNode.parent.parent is VariableDeclarationList &&
- declNode.parent.parent.parent is VariableDeclarationStatement) {
- } else {
+
+ // ...in a Block.
+ var block = assignmentStatement.parent;
+ if (block is! Block) {
return;
}
- var decl = declNode.parent as VariableDeclaration;
- var declStatement = decl.parent.parent as VariableDeclarationStatement;
- // may be has initializer
- if (decl.initializer != null) {
+
+ // Prepare the index in the enclosing Block.
+ var statements = block.statements;
+ var assignmentStatementIndex = statements.indexOf(assignmentStatement);
+ if (assignmentStatementIndex < 1) {
return;
}
- // check that "declaration" statement declared only one variable
- if (declStatement.variables.variables.length != 1) {
+
+ // The immediately previous statement must be a declaration.
+ var declarationStatement = statements[assignmentStatementIndex - 1];
+ if (declarationStatement is! VariableDeclarationStatement) {
return;
}
- // check that the "declaration" and "assignment" statements are
- // parts of the same Block
- var assignStatement = node.parent.parent as ExpressionStatement;
- if (assignStatement.parent is Block &&
- assignStatement.parent == declStatement.parent) {
- } else {
+
+ // Only one variable must be declared.
+ var declaredVariables = declarationStatement.variables.variables;
+ if (declaredVariables.length != 1) {
return;
}
- var block = assignStatement.parent as Block;
- // check that "declaration" and "assignment" statements are adjacent
- List<Statement> statements = block.statements;
- if (statements.indexOf(assignStatement) ==
- statements.indexOf(declStatement) + 1) {
- } else {
+
+ // The declared variable must be the one that is assigned.
+ // There must be no initializer.
+ var declaredVariable = declaredVariables.single;
+ if (declaredVariable.declaredElement != left.staticElement ||
+ declaredVariable.initializer != null) {
return;
}
await builder.addDartFileEdit(file, (builder) {
builder.addSimpleReplacement(
- range.endStart(declNode, assignExpression.operator), ' ');
+ range.endStart(declaredVariable, assignment.operator),
+ ' ',
+ );
});
}
@@ -95,50 +92,65 @@
/// assignment.
Future<void> _joinOnDeclaration(
ChangeBuilder builder, VariableDeclarationList declList) async {
- // prepare enclosing VariableDeclarationList
- var decl = declList.variables[0];
- // already initialized
- if (decl.initializer != null) {
+ // Only one variable must be declared.
+ var declaredVariables = declList.variables;
+ if (declaredVariables.length != 1) {
return;
}
- // prepare VariableDeclarationStatement in Block
- if (declList.parent is VariableDeclarationStatement &&
- declList.parent.parent is Block) {
- } else {
+
+ // The declared variable must not be initialized.
+ var declaredVariable = declaredVariables.single;
+ if (declaredVariable.initializer != null) {
return;
}
- var declStatement = declList.parent as VariableDeclarationStatement;
- var block = declStatement.parent as Block;
- List<Statement> statements = block.statements;
- // prepare assignment
- // declaration should not be last Statement
- var declIndex = statements.indexOf(declStatement);
- if (declIndex < statements.length - 1) {
- } else {
+
+ // The declaration must be a separate statement.
+ var declarationStatement = declList.parent;
+ if (declarationStatement is! VariableDeclarationStatement) {
return;
}
- // next Statement should be assignment
- var assignStatement = statements[declIndex + 1];
- if (assignStatement is ExpressionStatement) {
- } else {
+
+ // ...in a Block.
+ var block = declarationStatement.parent;
+ if (block is! Block) {
return;
}
- var expressionStatement = assignStatement as ExpressionStatement;
- // expression should be assignment
- if (expressionStatement.expression is AssignmentExpression) {
- } else {
+
+ // The declaration statement must not be the last in the block.
+ var statements = block.statements;
+ var declarationStatementIndex = statements.indexOf(declarationStatement);
+ if (declarationStatementIndex < 0 ||
+ declarationStatementIndex >= statements.length - 1) {
return;
}
- var assignExpression =
- expressionStatement.expression as AssignmentExpression;
- // check that pure assignment
- if (assignExpression.operator.type != TokenType.EQ) {
+
+ // The immediately following statement must be an assignment statement.
+ var assignmentStatement = statements[declarationStatementIndex + 1];
+ if (assignmentStatement is! ExpressionStatement) {
+ return;
+ }
+
+ // Really an assignment.
+ var assignment = assignmentStatement.expression;
+ if (assignment is! AssignmentExpression) {
+ return;
+ }
+
+ // The assignment should write into the declared variable.
+ if (assignment.writeElement != declaredVariable.declaredElement) {
+ return;
+ }
+
+ // The assignment must be pure.
+ if (assignment.operator.type != TokenType.EQ) {
return;
}
await builder.addDartFileEdit(file, (builder) {
builder.addSimpleReplacement(
- range.endStart(decl.name, assignExpression.operator), ' ');
+ range.endStart(declaredVariable.name, assignment.operator),
+ ' ',
+ );
});
}
diff --git a/pkg/analysis_server/lib/src/services/correction/util.dart b/pkg/analysis_server/lib/src/services/correction/util.dart
index 7480d17..c61a3fd 100644
--- a/pkg/analysis_server/lib/src/services/correction/util.dart
+++ b/pkg/analysis_server/lib/src/services/correction/util.dart
@@ -482,14 +482,9 @@
/// If the given [expression] is the `expression` property of a
/// [NamedExpression] then returns this [NamedExpression], otherwise returns
/// [expression].
-Expression? stepUpNamedExpression(Expression? expression) {
- if (expression != null) {
- var parent = expression.parent;
- if (parent is NamedExpression && parent.expression == expression) {
- return parent;
- }
- }
- return expression;
+Expression stepUpNamedExpression(Expression expression) {
+ var parent = expression.parent;
+ return parent is NamedExpression ? parent : expression;
}
/// Return `true` if the given [lists] are identical at the given [position].
diff --git a/pkg/analysis_server/lib/src/utilities/extensions/ast.dart b/pkg/analysis_server/lib/src/utilities/extensions/ast.dart
index 3448861..92403c0 100644
--- a/pkg/analysis_server/lib/src/utilities/extensions/ast.dart
+++ b/pkg/analysis_server/lib/src/utilities/extensions/ast.dart
@@ -62,6 +62,17 @@
bool get inWhileLoop => thisOrAncestorOfType<WhileStatement>() != null;
+ /// Return the [IfStatement] associated with `this`.
+ IfStatement? get enclosingIfStatement {
+ for (var node in withParents) {
+ if (node is IfStatement) {
+ return node;
+ } else if (node is! Expression) {
+ return null;
+ }
+ }
+ }
+
/// Return this node and all its parents.
Iterable<AstNode> get withParents sync* {
var current = this;
diff --git a/pkg/analysis_server/test/services/completion/dart/arglist_contributor_test.dart b/pkg/analysis_server/test/services/completion/dart/arglist_contributor_test.dart
index dc5be49..a9f5b6a 100644
--- a/pkg/analysis_server/test/services/completion/dart/arglist_contributor_test.dart
+++ b/pkg/analysis_server/test/services/completion/dart/arglist_contributor_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/provisional/completion/dart/completion_dart.dart';
import 'package:analysis_server/src/services/completion/dart/arglist_contributor.dart';
import 'package:analyzer/src/dart/analysis/experiments.dart';
@@ -34,7 +32,9 @@
/// Assert that there is a suggestion with the given parameter [name] that has
/// the given [completion], [selectionOffset] and [selectionLength].
void assertSuggestArgumentAndCompletion(String name,
- {String completion, int selectionOffset, int selectionLength = 0}) {
+ {required String completion,
+ required int selectionOffset,
+ int selectionLength = 0}) {
var suggestion = suggestions.firstWhere((s) => s.parameterName == name);
expect(suggestion, isNotNull);
expect(suggestion.completion, completion);
@@ -45,8 +45,8 @@
void assertSuggestArgumentList_params(
List<String> expectedNames,
List<String> expectedTypes,
- List<String> actualNames,
- List<String> actualTypes) {
+ List<String>? actualNames,
+ List<String>? actualTypes) {
if (actualNames != null &&
actualNames.length == expectedNames.length &&
actualTypes != null &&
@@ -75,7 +75,7 @@
/// Assert that the specified named argument suggestions with their types are
/// the only suggestions.
void assertSuggestArgumentsAndTypes(
- {Map<String, String> namedArgumentsWithTypes,
+ {required Map<String, String> namedArgumentsWithTypes,
List<int> requiredParamIndices = const <int>[],
bool includeColon = true,
bool includeComma = false}) {
@@ -797,11 +797,10 @@
expect(suggestion.docSummary, 'aaa');
expect(suggestion.docComplete, 'aaa\n\nbbb\nccc');
- var element = suggestion.element;
- expect(element, isNotNull);
+ var element = suggestion.element!;
expect(element.kind, ElementKind.PARAMETER);
expect(element.name, 'fff');
- expect(element.location.offset, content.indexOf('fff})'));
+ expect(element.location!.offset, content.indexOf('fff})'));
}
Future<void>
@@ -823,11 +822,10 @@
expect(suggestion.docSummary, isNull);
expect(suggestion.docComplete, isNull);
- var element = suggestion.element;
- expect(element, isNotNull);
+ var element = suggestion.element!;
expect(element.kind, ElementKind.PARAMETER);
expect(element.name, 'fff');
- expect(element.location.offset, content.indexOf('fff})'));
+ expect(element.location!.offset, content.indexOf('fff})'));
}
Future<void> test_ArgumentList_local_constructor_named_param() async {
diff --git a/pkg/analysis_server/test/services/completion/dart/combinator_contributor_test.dart b/pkg/analysis_server/test/services/completion/dart/combinator_contributor_test.dart
index 952c66a..ea96470 100644
--- a/pkg/analysis_server/test/services/completion/dart/combinator_contributor_test.dart
+++ b/pkg/analysis_server/test/services/completion/dart/combinator_contributor_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/provisional/completion/dart/completion_dart.dart';
import 'package:analysis_server/src/services/completion/dart/combinator_contributor.dart';
import 'package:analyzer_plugin/protocol/protocol_common.dart';
diff --git a/pkg/analysis_server/test/services/completion/dart/completion_contributor_util.dart b/pkg/analysis_server/test/services/completion/dart/completion_contributor_util.dart
index d0bb800..d0cff3d 100644
--- a/pkg/analysis_server/test/services/completion/dart/completion_contributor_util.dart
+++ b/pkg/analysis_server/test/services/completion/dart/completion_contributor_util.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 'dart:async';
import 'package:analysis_server/src/provisional/completion/dart/completion_dart.dart';
@@ -16,15 +14,16 @@
import 'package:analyzer/dart/analysis/results.dart';
import 'package:analyzer/src/dartdoc/dartdoc_directive_info.dart';
import 'package:analyzer_plugin/protocol/protocol_common.dart';
+import 'package:collection/collection.dart';
import 'package:meta/meta.dart';
import 'package:test/test.dart';
import '../../../abstract_context.dart';
SuggestionMatcher suggestionHas(
- {@required String completion,
- ElementKind element,
- CompletionSuggestionKind kind}) =>
+ {required String completion,
+ ElementKind? element,
+ CompletionSuggestionKind? kind}) =>
(CompletionSuggestion s) {
if (s.completion == completion) {
if (element != null && s.element?.kind != element) {
@@ -44,7 +43,7 @@
/// suggestions.
abstract class DartCompletionContributorTest
extends _BaseDartCompletionContributorTest {
- DartCompletionContributor contributor;
+ late DartCompletionContributor contributor;
@nonVirtual
@override
@@ -67,19 +66,19 @@
abstract class _BaseDartCompletionContributorTest extends AbstractContextTest
with WithNonFunctionTypeAliasesMixin {
static const String _UNCHECKED = '__UNCHECKED__';
- String testFile;
- int completionOffset;
- int replacementOffset;
- int replacementLength;
+ late String testFile;
+ int? completionOffset;
+ late int replacementOffset;
+ late int replacementLength;
- ResolvedUnitResult result;
+ late ResolvedUnitResult result;
/// The Dartdoc information passed to requests.
final DartdocDirectiveInfo dartdocInfo = DartdocDirectiveInfo();
- DartCompletionRequest request;
+ late DartCompletionRequest request;
- List<CompletionSuggestion> suggestions;
+ late List<CompletionSuggestion> suggestions;
/// If `true` and `null` is specified as the suggestion's expected returnType
/// then the actual suggestion is expected to have a `dynamic` returnType.
@@ -95,11 +94,11 @@
void addTestSource(String content) {
expect(completionOffset, isNull, reason: 'Call addTestUnit exactly once');
completionOffset = content.indexOf('^');
- expect(completionOffset, isNot(equals(-1)), reason: 'missing ^');
- var nextOffset = content.indexOf('^', completionOffset + 1);
+ expect(completionOffset, greaterThanOrEqualTo(0), reason: 'missing ^');
+ var nextOffset = content.indexOf('^', completionOffset! + 1);
expect(nextOffset, equals(-1), reason: 'too many ^');
content = content.substring(0, completionOffset) +
- content.substring(completionOffset + 1);
+ content.substring(completionOffset! + 1);
addSource(testFile, content);
}
@@ -138,37 +137,36 @@
}
void assertHasParameterInfo(CompletionSuggestion suggestion) {
- expect(suggestion.parameterNames, isNotNull);
- expect(suggestion.parameterTypes, isNotNull);
- expect(suggestion.parameterNames.length, suggestion.parameterTypes.length);
+ var parameterNames = suggestion.parameterNames!;
+ var parameterTypes = suggestion.parameterTypes!;
+ expect(parameterNames.length, parameterTypes.length);
expect(suggestion.requiredParameterCount,
- lessThanOrEqualTo(suggestion.parameterNames.length));
+ lessThanOrEqualTo(parameterNames.length));
expect(suggestion.hasNamedParameters, isNotNull);
}
- void assertNoSuggestions({CompletionSuggestionKind kind}) {
+ void assertNoSuggestions({CompletionSuggestionKind? kind}) {
if (kind == null) {
if (suggestions.isNotEmpty) {
failedCompletion('Expected no suggestions', suggestions);
}
return;
}
- var suggestion = suggestions.firstWhere(
- (CompletionSuggestion cs) => cs.kind == kind,
- orElse: () => null);
+ var suggestion = suggestions
+ .firstWhereOrNull((CompletionSuggestion cs) => cs.kind == kind);
if (suggestion != null) {
failedCompletion('did not expect completion: $completion\n $suggestion');
}
}
- void assertNotSuggested(String completion, {ElementKind elemKind}) {
- var suggestion = suggestions.firstWhere((CompletionSuggestion cs) {
+ void assertNotSuggested(String completion, {ElementKind? elemKind}) {
+ var suggestion = suggestions.firstWhereOrNull((CompletionSuggestion cs) {
if (elemKind == null) {
return cs.completion == completion;
} else {
- return cs.completion == completion && cs.element.kind == elemKind;
+ return cs.completion == completion && cs.element!.kind == elemKind;
}
- }, orElse: () => null);
+ });
if (suggestion != null) {
failedCompletion('did not expect completion: $completion\n $suggestion');
}
@@ -176,16 +174,16 @@
CompletionSuggestion assertSuggest(String completion,
{CompletionSuggestionKind csKind = CompletionSuggestionKind.INVOCATION,
- ElementKind elemKind,
+ ElementKind? elemKind,
bool isDeprecated = false,
bool isPotential = false,
- String elemFile,
- int elemOffset,
- int selectionOffset,
- String paramName,
- String paramType,
- String defaultArgListString = _UNCHECKED,
- List<int> defaultArgumentListTextRanges,
+ String? elemFile,
+ int? elemOffset,
+ int? selectionOffset,
+ String? paramName,
+ String? paramType,
+ String? defaultArgListString = _UNCHECKED,
+ List<int>? defaultArgumentListTextRanges,
bool isSynthetic = false,
bool skipLocationCheck = false}) {
var cs =
@@ -198,19 +196,20 @@
expect(cs.selectionLength, equals(0));
expect(cs.isDeprecated, equals(isDeprecated));
expect(cs.isPotential, equals(isPotential));
- if (!isSynthetic && cs.element != null && !skipLocationCheck) {
- expect(cs.element.location, isNotNull);
- expect(cs.element.location.file, isNotNull);
- expect(cs.element.location.offset, isNotNull);
- expect(cs.element.location.length, isNotNull);
- expect(cs.element.location.startColumn, isNotNull);
- expect(cs.element.location.startLine, isNotNull);
+ var element = cs.element;
+ if (!isSynthetic && element != null && !skipLocationCheck) {
+ var location = element.location!;
+ expect(location.file, isNotNull);
+ expect(location.offset, isNotNull);
+ expect(location.length, isNotNull);
+ expect(location.startColumn, isNotNull);
+ expect(location.startLine, isNotNull);
}
if (elemFile != null) {
- expect(cs.element.location.file, convertPath(elemFile));
+ expect(element!.location!.file, convertPath(elemFile));
}
if (elemOffset != null) {
- expect(cs.element.location.offset, elemOffset);
+ expect(element!.location!.offset, elemOffset);
}
if (paramName != null) {
expect(cs.parameterName, paramName);
@@ -230,17 +229,16 @@
CompletionSuggestion assertSuggestClass(String name,
{CompletionSuggestionKind kind = CompletionSuggestionKind.INVOCATION,
bool isDeprecated = false,
- String elemFile,
- String elemName,
- int elemOffset}) {
+ String? elemFile,
+ String? elemName,
+ int? elemOffset}) {
var cs = assertSuggest(name,
csKind: kind,
isDeprecated: isDeprecated,
elemFile: elemFile,
elemKind: ElementKind.CLASS,
elemOffset: elemOffset);
- var element = cs.element;
- expect(element, isNotNull);
+ var element = cs.element!;
expect(element.kind, equals(ElementKind.CLASS));
expect(element.name, equals(elemName ?? name));
expect(element.parameters, isNull);
@@ -252,8 +250,7 @@
CompletionSuggestion assertSuggestClassTypeAlias(String name,
{CompletionSuggestionKind kind = CompletionSuggestionKind.INVOCATION}) {
var cs = assertSuggest(name, csKind: kind);
- var element = cs.element;
- expect(element, isNotNull);
+ var element = cs.element!;
expect(element.kind, equals(ElementKind.CLASS_TYPE_ALIAS));
expect(element.name, equals(name));
expect(element.parameters, isNull);
@@ -263,17 +260,16 @@
}
CompletionSuggestion assertSuggestConstructor(String name,
- {String elementName,
- int elemOffset,
+ {String? elementName,
+ int? elemOffset,
String defaultArgListString = _UNCHECKED,
- List<int> defaultArgumentListTextRanges}) {
+ List<int>? defaultArgumentListTextRanges}) {
var cs = assertSuggest(name,
elemKind: ElementKind.CONSTRUCTOR,
elemOffset: elemOffset,
defaultArgListString: defaultArgListString,
defaultArgumentListTextRanges: defaultArgumentListTextRanges);
- var element = cs.element;
- expect(element, isNotNull);
+ var element = cs.element!;
expect(element.kind, equals(ElementKind.CONSTRUCTOR));
var index = name.indexOf('.');
elementName ??= index >= 0 ? name.substring(index + 1) : '';
@@ -285,7 +281,7 @@
{bool isDeprecated = false}) {
var suggestion = assertSuggest(completion, isDeprecated: isDeprecated);
expect(suggestion.isDeprecated, isDeprecated);
- expect(suggestion.element.kind, ElementKind.ENUM);
+ expect(suggestion.element!.kind, ElementKind.ENUM);
return suggestion;
}
@@ -294,19 +290,18 @@
var suggestion = assertSuggest(completion, isDeprecated: isDeprecated);
expect(suggestion.completion, completion);
expect(suggestion.isDeprecated, isDeprecated);
- expect(suggestion.element.kind, ElementKind.ENUM_CONSTANT);
+ expect(suggestion.element!.kind, ElementKind.ENUM_CONSTANT);
return suggestion;
}
- CompletionSuggestion assertSuggestField(String name, String type,
+ CompletionSuggestion assertSuggestField(String name, String? type,
{CompletionSuggestionKind kind = CompletionSuggestionKind.INVOCATION,
bool isDeprecated = false}) {
var cs = assertSuggest(name,
csKind: kind, elemKind: ElementKind.FIELD, isDeprecated: isDeprecated);
// The returnType represents the type of a field
expect(cs.returnType, type ?? 'dynamic');
- var element = cs.element;
- expect(element, isNotNull);
+ var element = cs.element!;
expect(element.kind, equals(ElementKind.FIELD));
expect(element.name, equals(name));
expect(element.parameters, isNull);
@@ -316,11 +311,11 @@
return cs;
}
- CompletionSuggestion assertSuggestFunction(String name, String returnType,
+ CompletionSuggestion assertSuggestFunction(String name, String? returnType,
{CompletionSuggestionKind kind = CompletionSuggestionKind.INVOCATION,
bool isDeprecated = false,
- String defaultArgListString = _UNCHECKED,
- List<int> defaultArgumentListTextRanges}) {
+ String? defaultArgListString = _UNCHECKED,
+ List<int>? defaultArgumentListTextRanges}) {
var cs = assertSuggest(name,
csKind: kind,
isDeprecated: isDeprecated,
@@ -331,13 +326,11 @@
} else if (isNullExpectedReturnTypeConsideredDynamic) {
expect(cs.returnType, 'dynamic');
}
- var element = cs.element;
- expect(element, isNotNull);
+ var element = cs.element!;
expect(element.kind, equals(ElementKind.FUNCTION));
expect(element.name, equals(name));
expect(element.isDeprecated, equals(isDeprecated));
- var param = element.parameters;
- expect(param, isNotNull);
+ var param = element.parameters!;
expect(param[0], equals('('));
expect(param[param.length - 1], equals(')'));
if (returnType != null) {
@@ -349,14 +342,13 @@
return cs;
}
- CompletionSuggestion assertSuggestGetter(String name, String returnType,
+ CompletionSuggestion assertSuggestGetter(String name, String? returnType,
{CompletionSuggestionKind kind = CompletionSuggestionKind.INVOCATION,
bool isDeprecated = false}) {
var cs = assertSuggest(name,
csKind: kind, elemKind: ElementKind.GETTER, isDeprecated: isDeprecated);
expect(cs.returnType, returnType ?? 'dynamic');
- var element = cs.element;
- expect(element, isNotNull);
+ var element = cs.element!;
expect(element.kind, equals(ElementKind.GETTER));
expect(element.name, equals(name));
expect(element.parameters, isNull);
@@ -366,12 +358,11 @@
}
CompletionSuggestion assertSuggestLocalVariable(
- String name, String returnType) {
+ String name, String? returnType) {
// Local variables should only be suggested by LocalReferenceContributor
var cs = assertSuggest(name, csKind: CompletionSuggestionKind.INVOCATION);
expect(cs.returnType, returnType ?? 'dynamic');
- var element = cs.element;
- expect(element, isNotNull);
+ var element = cs.element!;
expect(element.kind, equals(ElementKind.LOCAL_VARIABLE));
expect(element.name, equals(name));
expect(element.parameters, isNull);
@@ -381,11 +372,11 @@
}
CompletionSuggestion assertSuggestMethod(
- String name, String declaringType, String returnType,
+ String name, String? declaringType, String? returnType,
{CompletionSuggestionKind kind = CompletionSuggestionKind.INVOCATION,
bool isDeprecated = false,
- String defaultArgListString = _UNCHECKED,
- List<int> defaultArgumentListTextRanges,
+ String? defaultArgListString = _UNCHECKED,
+ List<int>? defaultArgumentListTextRanges,
bool skipLocationCheck = false}) {
var cs = assertSuggest(name,
csKind: kind,
@@ -395,12 +386,10 @@
skipLocationCheck: skipLocationCheck);
expect(cs.declaringType, equals(declaringType));
expect(cs.returnType, returnType ?? 'dynamic');
- var element = cs.element;
- expect(element, isNotNull);
+ var element = cs.element!;
expect(element.kind, equals(ElementKind.METHOD));
expect(element.name, equals(name));
- var param = element.parameters;
- expect(param, isNotNull);
+ var param = element.parameters!;
expect(param[0], equals('('));
expect(param[param.length - 1], equals(')'));
expect(element.returnType, returnType ?? 'dynamic');
@@ -411,17 +400,16 @@
CompletionSuggestion assertSuggestMixin(String name,
{CompletionSuggestionKind kind = CompletionSuggestionKind.INVOCATION,
bool isDeprecated = false,
- String elemFile,
- String elemName,
- int elemOffset}) {
+ String? elemFile,
+ String? elemName,
+ int? elemOffset}) {
var cs = assertSuggest(name,
csKind: kind,
isDeprecated: isDeprecated,
elemFile: elemFile,
elemKind: ElementKind.MIXIN,
elemOffset: elemOffset);
- var element = cs.element;
- expect(element, isNotNull);
+ var element = cs.element!;
expect(element.kind, equals(ElementKind.MIXIN));
expect(element.name, equals(elemName ?? name));
expect(element.parameters, isNull);
@@ -440,11 +428,10 @@
return cs;
}
- CompletionSuggestion assertSuggestParameter(String name, String returnType) {
+ CompletionSuggestion assertSuggestParameter(String name, String? returnType) {
var cs = assertSuggest(name, csKind: CompletionSuggestionKind.INVOCATION);
expect(cs.returnType, returnType ?? 'dynamic');
- var element = cs.element;
- expect(element, isNotNull);
+ var element = cs.element!;
expect(element.kind, equals(ElementKind.PARAMETER));
expect(element.name, equals(name));
expect(element.parameters, isNull);
@@ -455,8 +442,7 @@
CompletionSuggestion assertSuggestSetter(String name,
{CompletionSuggestionKind kind = CompletionSuggestionKind.INVOCATION}) {
var cs = assertSuggest(name, csKind: kind, elemKind: ElementKind.SETTER);
- var element = cs.element;
- expect(element, isNotNull);
+ var element = cs.element!;
expect(element.kind, equals(ElementKind.SETTER));
expect(element.name, equals(name));
// TODO (danrubel) assert setter param
@@ -471,7 +457,7 @@
CompletionSuggestion assertSuggestTopLevelVar(
String name,
- String returnType, {
+ String? returnType, {
CompletionSuggestionKind kind = CompletionSuggestionKind.INVOCATION,
}) {
var cs = assertSuggest(name, csKind: kind);
@@ -480,8 +466,7 @@
} else if (isNullExpectedReturnTypeConsideredDynamic) {
expect(cs.returnType, 'dynamic');
}
- var element = cs.element;
- expect(element, isNotNull);
+ var element = cs.element!;
expect(element.kind, equals(ElementKind.TOP_LEVEL_VARIABLE));
expect(element.name, equals(name));
expect(element.parameters, isNull);
@@ -496,8 +481,8 @@
CompletionSuggestion assertSuggestTypeAlias(
String name, {
- String aliasedType,
- String returnType,
+ String? aliasedType,
+ String? returnType,
bool isDeprecated = false,
CompletionSuggestionKind kind = CompletionSuggestionKind.INVOCATION,
}) {
@@ -511,8 +496,7 @@
} else {
expect(cs.returnType, isNull);
}
- var element = cs.element;
- expect(element, isNotNull);
+ var element = cs.element!;
expect(element.kind, equals(ElementKind.TYPE_ALIAS));
expect(element.name, equals(name));
expect(element.isDeprecated, equals(isDeprecated));
@@ -531,8 +515,7 @@
CompletionSuggestion assertSuggestTypeParameter(String name) {
var cs = assertSuggest(name, csKind: CompletionSuggestionKind.IDENTIFIER);
expect(cs.returnType, isNull);
- var element = cs.element;
- expect(element, isNotNull);
+ var element = cs.element!;
expect(element.kind, equals(ElementKind.TYPE_PARAMETER));
expect(element.name, equals(name));
expect(element.parameters, isNull);
@@ -546,7 +529,7 @@
Future computeSuggestions({int times = 200}) async {
result = await session.getResolvedUnit(testFile);
var baseRequest = CompletionRequestImpl(
- result, completionOffset, CompletionPerformance());
+ result, completionOffset!, CompletionPerformance());
return await baseRequest.performance.runRequestOperation(
(performance) async {
@@ -565,8 +548,8 @@
);
}
- void failedCompletion(String message,
- [Iterable<CompletionSuggestion> completions]) {
+ Never failedCompletion(String message,
+ [Iterable<CompletionSuggestion>? completions]) {
var sb = StringBuffer(message);
if (completions != null) {
sb.write('\n found');
@@ -579,33 +562,31 @@
fail(sb.toString());
}
- CompletionSuggestion getSuggest(
- {String completion,
- CompletionSuggestionKind csKind,
- ElementKind elemKind}) {
- CompletionSuggestion cs;
- if (suggestions != null) {
- suggestions.forEach((CompletionSuggestion s) {
- if (completion != null && completion != s.completion) {
+ CompletionSuggestion? getSuggest(
+ {String? completion,
+ CompletionSuggestionKind? csKind,
+ ElementKind? elemKind}) {
+ CompletionSuggestion? cs;
+ suggestions.forEach((CompletionSuggestion s) {
+ if (completion != null && completion != s.completion) {
+ return;
+ }
+ if (csKind != null && csKind != s.kind) {
+ return;
+ }
+ if (elemKind != null) {
+ var element = s.element;
+ if (element == null || elemKind != element.kind) {
return;
}
- if (csKind != null && csKind != s.kind) {
- return;
- }
- if (elemKind != null) {
- var element = s.element;
- if (element == null || elemKind != element.kind) {
- return;
- }
- }
- if (cs == null) {
- cs = s;
- } else {
- failedCompletion('expected exactly one $cs',
- suggestions.where((s) => s.completion == completion));
- }
- });
- }
+ }
+ if (cs == null) {
+ cs = s;
+ } else {
+ failedCompletion('expected exactly one $cs',
+ suggestions.where((s) => s.completion == completion));
+ }
+ });
return cs;
}
@@ -634,9 +615,9 @@
}
CompletionSuggestion suggestionWith(
- {@required String completion,
- ElementKind element,
- CompletionSuggestionKind kind}) {
+ {required String completion,
+ ElementKind? element,
+ CompletionSuggestionKind? kind}) {
final matches = suggestions.where(
suggestionHas(completion: completion, element: element, kind: kind));
expect(matches, hasLength(1));
diff --git a/pkg/analysis_server/test/services/completion/dart/completion_manager_test.dart b/pkg/analysis_server/test/services/completion/dart/completion_manager_test.dart
index ab89e1b..5a236f2 100644
--- a/pkg/analysis_server/test/services/completion/dart/completion_manager_test.dart
+++ b/pkg/analysis_server/test/services/completion/dart/completion_manager_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 'dart:async';
import 'package:analysis_server/src/provisional/completion/dart/completion_dart.dart';
@@ -52,7 +50,7 @@
// Build the request
var baseRequest = CompletionRequestImpl(
await session.getResolvedUnit(testFile),
- completionOffset,
+ completionOffset!,
CompletionPerformance());
await baseRequest.performance.runRequestOperation((performance) async {
var requestCompleter = Completer<DartCompletionRequest>();
@@ -66,13 +64,13 @@
var directives = request.target.unit.directives;
- var imports = request.libraryElement.imports;
+ var imports = request.libraryElement!.imports;
expect(imports, hasLength(directives.length + 1));
ImportElement importNamed(String expectedUri) {
var uriList = <String>[];
for (var importElement in imports) {
- var uri = importElement.importedLibrary.source.uri.toString();
+ var uri = importElement.importedLibrary!.source.uri.toString();
uriList.add(uri);
if (uri.endsWith(expectedUri)) {
return importElement;
@@ -83,7 +81,7 @@
void assertImportedLib(String expectedUri) {
var importElem = importNamed(expectedUri);
- expect(importElem.importedLibrary.exportNamespace, isNotNull);
+ expect(importElem.importedLibrary!.exportNamespace, isNotNull);
}
// Assert that the new imports each have an export namespace
diff --git a/pkg/analysis_server/test/services/completion/dart/extension_member_contributor_test.dart b/pkg/analysis_server/test/services/completion/dart/extension_member_contributor_test.dart
index 2d51dba..12a2cad 100644
--- a/pkg/analysis_server/test/services/completion/dart/extension_member_contributor_test.dart
+++ b/pkg/analysis_server/test/services/completion/dart/extension_member_contributor_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/provisional/completion/dart/completion_dart.dart';
import 'package:analysis_server/src/services/completion/dart/extension_member_contributor.dart';
import 'package:test_reflective_loader/test_reflective_loader.dart';
diff --git a/pkg/analysis_server/test/services/completion/dart/field_formal_contributor_test.dart b/pkg/analysis_server/test/services/completion/dart/field_formal_contributor_test.dart
index 58ed66b..fcc96d2 100644
--- a/pkg/analysis_server/test/services/completion/dart/field_formal_contributor_test.dart
+++ b/pkg/analysis_server/test/services/completion/dart/field_formal_contributor_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/provisional/completion/dart/completion_dart.dart';
import 'package:analysis_server/src/services/completion/dart/field_formal_contributor.dart';
import 'package:test/test.dart';
@@ -86,7 +84,7 @@
m(X x) {} I _n(X x) {}}
class X{}''');
await computeSuggestions();
- expect(replacementOffset, completionOffset - 1);
+ expect(replacementOffset, completionOffset! - 1);
expect(replacementLength, 1);
assertSuggestField('b', null);
assertSuggestField('_c', 'X');
diff --git a/pkg/analysis_server/test/services/completion/dart/imported_reference_contributor_test.dart b/pkg/analysis_server/test/services/completion/dart/imported_reference_contributor_test.dart
index c1e03c4..f56d0b2 100644
--- a/pkg/analysis_server/test/services/completion/dart/imported_reference_contributor_test.dart
+++ b/pkg/analysis_server/test/services/completion/dart/imported_reference_contributor_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/provisional/completion/dart/completion_dart.dart';
import 'package:analysis_server/src/services/completion/dart/imported_reference_contributor.dart';
@@ -475,7 +473,7 @@
int^ b = 1;}''');
await computeSuggestions();
- expect(replacementOffset, completionOffset - 3);
+ expect(replacementOffset, completionOffset! - 3);
expect(replacementLength, 3);
assertNotSuggested('A');
assertSuggestClass('int');
@@ -499,7 +497,7 @@
b = 1;}''');
await computeSuggestions();
- expect(replacementOffset, completionOffset - 1);
+ expect(replacementOffset, completionOffset! - 1);
expect(replacementLength, 1);
assertNotSuggested('A');
assertSuggestClass('int');
@@ -1046,7 +1044,7 @@
class X {a() {var f; {var x;} D^ var r;} void b() { }}
class Z { }''');
await computeSuggestions();
- expect(replacementOffset, completionOffset - 1);
+ expect(replacementOffset, completionOffset! - 1);
expect(replacementLength, 1);
assertNotSuggested('X');
@@ -1188,7 +1186,7 @@
class Z { }''');
await computeSuggestions();
- expect(replacementOffset, completionOffset - 1);
+ expect(replacementOffset, completionOffset! - 1);
expect(replacementLength, 1);
assertNotSuggested('partT8');
@@ -1328,7 +1326,7 @@
main() {A a; a^..b}''');
await computeSuggestions();
- expect(replacementOffset, completionOffset - 1);
+ expect(replacementOffset, completionOffset! - 1);
expect(replacementLength, 1);
assertNotSuggested('b');
assertNotSuggested('_c');
@@ -1407,10 +1405,10 @@
expect(replacementLength, 0);
assertNotSuggested('A');
assertNotSuggested('_B');
- var suggestionO = assertSuggestClass('Object');
+ var suggestionO = assertSuggestClass('Object').element;
if (suggestionO != null) {
- expect(suggestionO.element.isDeprecated, isFalse);
- expect(suggestionO.element.isPrivate, isFalse);
+ expect(suggestionO.isDeprecated, isFalse);
+ expect(suggestionO.isPrivate, isFalse);
}
assertNotSuggested('T');
// Suggested by LibraryPrefixContributor
@@ -1470,7 +1468,7 @@
A Sew;''');
await computeSuggestions();
- expect(replacementOffset, completionOffset - 1);
+ expect(replacementOffset, completionOffset! - 1);
expect(replacementLength, 1);
assertNotSuggested('A');
assertNotSuggested('_B');
@@ -1747,7 +1745,7 @@
main() {new String.fr^omCharCodes([]);}''');
await computeSuggestions();
- expect(replacementOffset, completionOffset - 2);
+ expect(replacementOffset, completionOffset! - 2);
expect(replacementLength, 13);
// Suggested by NamedConstructorContributor
assertNotSuggested('fromCharCodes');
@@ -2185,7 +2183,7 @@
addTestSource('main(args) {for (S^ foo in args) {}}');
await computeSuggestions();
- expect(replacementOffset, completionOffset - 1);
+ expect(replacementOffset, completionOffset! - 1);
expect(replacementLength, 1);
assertNotSuggested('args');
assertNotSuggested('foo');
@@ -2226,7 +2224,7 @@
addTestSource('main() {for (int index = 0; i^)}');
await computeSuggestions();
- expect(replacementOffset, completionOffset - 1);
+ expect(replacementOffset, completionOffset! - 1);
expect(replacementLength, 1);
assertNotSuggested('index');
}
@@ -2266,7 +2264,7 @@
addTestSource('main() {for (int index = 0; index < 10; i^)}');
await computeSuggestions();
- expect(replacementOffset, completionOffset - 1);
+ expect(replacementOffset, completionOffset! - 1);
expect(replacementLength, 1);
assertNotSuggested('index');
}
@@ -2278,7 +2276,7 @@
main() {for (int index = 0; index < 10; ++i^)}''');
await computeSuggestions();
- expect(replacementOffset, completionOffset - 1);
+ expect(replacementOffset, completionOffset! - 1);
expect(replacementLength, 1);
assertNotSuggested('index');
assertNotSuggested('main');
@@ -2297,11 +2295,13 @@
''');
await computeSuggestions();
var suggestion = assertSuggestFunction('m', 'int');
- expect(suggestion.parameterNames, hasLength(2));
- expect(suggestion.parameterNames[0], 'x');
- expect(suggestion.parameterTypes[0], 'dynamic');
- expect(suggestion.parameterNames[1], 'y');
- expect(suggestion.parameterTypes[1], 'int');
+ var parameterNames = suggestion.parameterNames!;
+ var parameterTypes = suggestion.parameterTypes!;
+ expect(parameterNames, hasLength(2));
+ expect(parameterNames[0], 'x');
+ expect(parameterTypes[0], 'dynamic');
+ expect(parameterNames[1], 'y');
+ expect(parameterTypes[1], 'int');
expect(suggestion.requiredParameterCount, 1);
expect(suggestion.hasNamedParameters, true);
}
@@ -2318,11 +2318,13 @@
''');
await computeSuggestions();
var suggestion = assertSuggestFunction('m', 'void');
- expect(suggestion.parameterNames, hasLength(2));
- expect(suggestion.parameterNames[0], 'x');
- expect(suggestion.parameterTypes[0], 'dynamic');
- expect(suggestion.parameterNames[1], 'y');
- expect(suggestion.parameterTypes[1], 'int');
+ var parameterNames = suggestion.parameterNames!;
+ var parameterTypes = suggestion.parameterTypes!;
+ expect(parameterNames, hasLength(2));
+ expect(parameterNames[0], 'x');
+ expect(parameterTypes[0], 'dynamic');
+ expect(parameterNames[1], 'y');
+ expect(parameterTypes[1], 'int');
expect(suggestion.requiredParameterCount, 1);
expect(suggestion.hasNamedParameters, false);
}
@@ -2339,11 +2341,13 @@
''');
await computeSuggestions();
var suggestion = assertSuggestFunction('m', 'void');
- expect(suggestion.parameterNames, hasLength(2));
- expect(suggestion.parameterNames[0], 'x');
- expect(suggestion.parameterTypes[0], 'dynamic');
- expect(suggestion.parameterNames[1], 'y');
- expect(suggestion.parameterTypes[1], 'int');
+ var parameterNames = suggestion.parameterNames!;
+ var parameterTypes = suggestion.parameterTypes!;
+ expect(parameterNames, hasLength(2));
+ expect(parameterNames[0], 'x');
+ expect(parameterTypes[0], 'dynamic');
+ expect(parameterNames[1], 'y');
+ expect(parameterTypes[1], 'int');
expect(suggestion.requiredParameterCount, 0);
expect(suggestion.hasNamedParameters, true);
}
@@ -2379,11 +2383,13 @@
''');
await computeSuggestions();
var suggestion = assertSuggestFunction('m', 'void');
- expect(suggestion.parameterNames, hasLength(2));
- expect(suggestion.parameterNames[0], 'x');
- expect(suggestion.parameterTypes[0], 'dynamic');
- expect(suggestion.parameterNames[1], 'y');
- expect(suggestion.parameterTypes[1], 'int');
+ var parameterNames = suggestion.parameterNames!;
+ var parameterTypes = suggestion.parameterTypes!;
+ expect(parameterNames, hasLength(2));
+ expect(parameterNames[0], 'x');
+ expect(parameterTypes[0], 'dynamic');
+ expect(parameterNames[1], 'y');
+ expect(parameterTypes[1], 'int');
expect(suggestion.requiredParameterCount, 0);
expect(suggestion.hasNamedParameters, false);
}
@@ -2400,11 +2406,13 @@
''');
await computeSuggestions();
var suggestion = assertSuggestFunction('m', 'void');
- expect(suggestion.parameterNames, hasLength(2));
- expect(suggestion.parameterNames[0], 'x');
- expect(suggestion.parameterTypes[0], 'dynamic');
- expect(suggestion.parameterNames[1], 'y');
- expect(suggestion.parameterTypes[1], 'int');
+ var parameterNames = suggestion.parameterNames!;
+ var parameterTypes = suggestion.parameterTypes!;
+ expect(parameterNames, hasLength(2));
+ expect(parameterNames[0], 'x');
+ expect(parameterTypes[0], 'dynamic');
+ expect(parameterNames[1], 'y');
+ expect(parameterTypes[1], 'int');
expect(suggestion.requiredParameterCount, 2);
expect(suggestion.hasNamedParameters, false);
}
@@ -2729,34 +2737,39 @@
CompletionSuggestion suggestion;
suggestion = assertSuggestConstructor('Object');
- expect(suggestion.element.parameters, '()');
+ expect(suggestion.element!.parameters, '()');
expect(suggestion.parameterNames, hasLength(0));
expect(suggestion.requiredParameterCount, 0);
expect(suggestion.hasNamedParameters, false);
suggestion = assertSuggestConstructor('A');
- expect(suggestion.element.parameters, '()');
+ expect(suggestion.element!.parameters, '()');
expect(suggestion.parameterNames, hasLength(0));
expect(suggestion.requiredParameterCount, 0);
expect(suggestion.hasNamedParameters, false);
suggestion = assertSuggestConstructor('B');
- expect(suggestion.element.parameters, '(int x, [String boo])');
- expect(suggestion.parameterNames, hasLength(2));
- expect(suggestion.parameterNames[0], 'x');
- expect(suggestion.parameterTypes[0], 'int');
- expect(suggestion.parameterNames[1], 'boo');
- expect(suggestion.parameterTypes[1], 'String');
+ var parameterNames = suggestion.parameterNames!;
+ var parameterTypes = suggestion.parameterTypes!;
+ expect(suggestion.element!.parameters, '(int x, [String boo])');
+ expect(parameterNames, hasLength(2));
+ expect(parameterNames[0], 'x');
+ expect(parameterTypes[0], 'int');
+ expect(parameterNames[1], 'boo');
+ expect(parameterTypes[1], 'String');
expect(suggestion.requiredParameterCount, 1);
expect(suggestion.hasNamedParameters, false);
suggestion = assertSuggestConstructor('C.bar');
- expect(suggestion.element.parameters, "({dynamic boo = 'hoo', int z = 0})");
- expect(suggestion.parameterNames, hasLength(2));
- expect(suggestion.parameterNames[0], 'boo');
- expect(suggestion.parameterTypes[0], 'dynamic');
- expect(suggestion.parameterNames[1], 'z');
- expect(suggestion.parameterTypes[1], 'int');
+ parameterNames = suggestion.parameterNames!;
+ parameterTypes = suggestion.parameterTypes!;
+ expect(
+ suggestion.element!.parameters, "({dynamic boo = 'hoo', int z = 0})");
+ expect(parameterNames, hasLength(2));
+ expect(parameterNames[0], 'boo');
+ expect(parameterTypes[0], 'dynamic');
+ expect(parameterNames[1], 'z');
+ expect(parameterTypes[1], 'int');
expect(suggestion.requiredParameterCount, 0);
expect(suggestion.hasNamedParameters, true);
@@ -2874,7 +2887,7 @@
addTestSource('class A {foo(){new C^}}');
await computeSuggestions();
- expect(replacementOffset, completionOffset - 1);
+ expect(replacementOffset, completionOffset! - 1);
expect(replacementLength, 1);
// Not imported, so not suggested
assertNotSuggested('Completer');
@@ -3063,7 +3076,7 @@
main(){var a; if (a is Obj^)}''');
await computeSuggestions();
- expect(replacementOffset, completionOffset - 3);
+ expect(replacementOffset, completionOffset! - 3);
expect(replacementLength, 3);
assertNotSuggested('a');
assertNotSuggested('main');
@@ -3139,7 +3152,7 @@
main() {new^ X.c();}''');
await computeSuggestions();
- expect(replacementOffset, completionOffset - 3);
+ expect(replacementOffset, completionOffset! - 3);
expect(replacementLength, 3);
assertNotSuggested('c');
assertNotSuggested('_d');
@@ -3239,7 +3252,7 @@
foo = {T^''');
await computeSuggestions();
- expect(replacementOffset, completionOffset - 1);
+ expect(replacementOffset, completionOffset! - 1);
expect(replacementLength, 1);
// Simulate unresolved imported library,
// in which case suggestions will have null return types (unresolved)
@@ -3266,7 +3279,7 @@
foo = {7:T^};''');
await computeSuggestions();
- expect(replacementOffset, completionOffset - 1);
+ expect(replacementOffset, completionOffset! - 1);
expect(replacementLength, 1);
assertSuggestTopLevelVar('T1', 'int');
assertNotSuggested('T2');
@@ -3284,11 +3297,13 @@
''');
await computeSuggestions();
var suggestion = assertSuggestFunction('m', 'void');
- expect(suggestion.parameterNames, hasLength(2));
- expect(suggestion.parameterNames[0], 'x');
- expect(suggestion.parameterTypes[0], 'dynamic');
- expect(suggestion.parameterNames[1], 'y');
- expect(suggestion.parameterTypes[1], 'int');
+ var parameterNames = suggestion.parameterNames!;
+ var parameterTypes = suggestion.parameterTypes!;
+ expect(parameterNames, hasLength(2));
+ expect(parameterNames[0], 'x');
+ expect(parameterTypes[0], 'dynamic');
+ expect(parameterNames[1], 'y');
+ expect(parameterTypes[1], 'int');
expect(suggestion.requiredParameterCount, 1);
expect(suggestion.hasNamedParameters, true);
}
@@ -3305,11 +3320,13 @@
''');
await computeSuggestions();
var suggestion = assertSuggestFunction('m', 'void');
- expect(suggestion.parameterNames, hasLength(2));
- expect(suggestion.parameterNames[0], 'x');
- expect(suggestion.parameterTypes[0], 'dynamic');
- expect(suggestion.parameterNames[1], 'y');
- expect(suggestion.parameterTypes[1], 'int');
+ var parameterNames = suggestion.parameterNames!;
+ var parameterTypes = suggestion.parameterTypes!;
+ expect(parameterNames, hasLength(2));
+ expect(parameterNames[0], 'x');
+ expect(parameterTypes[0], 'dynamic');
+ expect(parameterNames[1], 'y');
+ expect(parameterTypes[1], 'int');
expect(suggestion.requiredParameterCount, 1);
expect(suggestion.hasNamedParameters, false);
}
@@ -3326,11 +3343,13 @@
''');
await computeSuggestions();
var suggestion = assertSuggestFunction('m', 'void');
- expect(suggestion.parameterNames, hasLength(2));
- expect(suggestion.parameterNames[0], 'x');
- expect(suggestion.parameterTypes[0], 'dynamic');
- expect(suggestion.parameterNames[1], 'y');
- expect(suggestion.parameterTypes[1], 'int');
+ var parameterNames = suggestion.parameterNames!;
+ var parameterTypes = suggestion.parameterTypes!;
+ expect(parameterNames, hasLength(2));
+ expect(parameterNames[0], 'x');
+ expect(parameterTypes[0], 'dynamic');
+ expect(parameterNames[1], 'y');
+ expect(parameterTypes[1], 'int');
expect(suggestion.requiredParameterCount, 0);
expect(suggestion.hasNamedParameters, true);
}
@@ -3366,11 +3385,13 @@
''');
await computeSuggestions();
var suggestion = assertSuggestFunction('m', 'void');
- expect(suggestion.parameterNames, hasLength(2));
- expect(suggestion.parameterNames[0], 'x');
- expect(suggestion.parameterTypes[0], 'dynamic');
- expect(suggestion.parameterNames[1], 'y');
- expect(suggestion.parameterTypes[1], 'int');
+ var parameterNames = suggestion.parameterNames!;
+ var parameterTypes = suggestion.parameterTypes!;
+ expect(parameterNames, hasLength(2));
+ expect(parameterNames[0], 'x');
+ expect(parameterTypes[0], 'dynamic');
+ expect(parameterNames[1], 'y');
+ expect(parameterTypes[1], 'int');
expect(suggestion.requiredParameterCount, 0);
expect(suggestion.hasNamedParameters, false);
}
@@ -3387,11 +3408,13 @@
''');
await computeSuggestions();
var suggestion = assertSuggestFunction('m', 'void');
- expect(suggestion.parameterNames, hasLength(2));
- expect(suggestion.parameterNames[0], 'x');
- expect(suggestion.parameterTypes[0], 'dynamic');
- expect(suggestion.parameterNames[1], 'y');
- expect(suggestion.parameterTypes[1], 'int');
+ var parameterNames = suggestion.parameterNames!;
+ var parameterTypes = suggestion.parameterTypes!;
+ expect(parameterNames, hasLength(2));
+ expect(parameterNames[0], 'x');
+ expect(parameterTypes[0], 'dynamic');
+ expect(parameterNames[1], 'y');
+ expect(parameterTypes[1], 'int');
expect(suggestion.requiredParameterCount, 2);
expect(suggestion.hasNamedParameters, false);
}
@@ -4084,7 +4107,7 @@
class X {foo(){A^.bar}}''');
await computeSuggestions();
- expect(replacementOffset, completionOffset - 1);
+ expect(replacementOffset, completionOffset! - 1);
expect(replacementLength, 1);
assertSuggestClass('A');
if (suggestConstructorsWithoutNew) {
@@ -4211,7 +4234,7 @@
addTestSource('class A {a() {"hello".to^String().length}}');
await computeSuggestions();
- expect(replacementOffset, completionOffset - 2);
+ expect(replacementOffset, completionOffset! - 2);
expect(replacementLength, 8);
assertNotSuggested('length');
assertNotSuggested('A');
@@ -4405,7 +4428,7 @@
class X{}''');
await computeSuggestions();
- expect(replacementOffset, completionOffset - 1);
+ expect(replacementOffset, completionOffset! - 1);
expect(replacementLength, 1);
// Contributed by FieldFormalConstructorContributor
assertNotSuggested('b');
@@ -4675,7 +4698,7 @@
main() { C<C^> c; }''');
await computeSuggestions();
- expect(replacementOffset, completionOffset - 1);
+ expect(replacementOffset, completionOffset! - 1);
expect(replacementLength, 1);
assertSuggestClass('C1');
assertNotSuggested('C2');
@@ -4824,11 +4847,13 @@
''');
await computeSuggestions();
var suggestion = assertSuggestFunction('m', 'void');
- expect(suggestion.parameterNames, hasLength(2));
- expect(suggestion.parameterNames[0], 'nullable');
- expect(suggestion.parameterTypes[0], 'int?');
- expect(suggestion.parameterNames[1], 'nonNullable');
- expect(suggestion.parameterTypes[1], 'int');
+ var parameterNames = suggestion.parameterNames!;
+ var parameterTypes = suggestion.parameterTypes!;
+ expect(parameterNames, hasLength(2));
+ expect(parameterNames[0], 'nullable');
+ expect(parameterTypes[0], 'int?');
+ expect(parameterNames[1], 'nonNullable');
+ expect(parameterTypes[1], 'int');
expect(suggestion.requiredParameterCount, 2);
expect(suggestion.hasNamedParameters, false);
}
@@ -4846,11 +4871,13 @@
''');
await computeSuggestions();
var suggestion = assertSuggestFunction('m', 'void');
- expect(suggestion.parameterNames, hasLength(2));
- expect(suggestion.parameterNames[0], 'nullable');
- expect(suggestion.parameterTypes[0], 'int');
- expect(suggestion.parameterNames[1], 'nonNullable');
- expect(suggestion.parameterTypes[1], 'int');
+ var parameterNames = suggestion.parameterNames!;
+ var parameterTypes = suggestion.parameterTypes!;
+ expect(parameterNames, hasLength(2));
+ expect(parameterNames[0], 'nullable');
+ expect(parameterTypes[0], 'int');
+ expect(parameterNames[1], 'nonNullable');
+ expect(parameterTypes[1], 'int');
expect(suggestion.requiredParameterCount, 2);
expect(suggestion.hasNamedParameters, false);
}
@@ -4868,9 +4895,11 @@
''');
await computeSuggestions();
var suggestion = assertSuggestFunction('m', 'void');
- expect(suggestion.parameterNames, hasLength(1));
- expect(suggestion.parameterNames[0], 'param');
- expect(suggestion.parameterTypes[0], 'int*');
+ var parameterNames = suggestion.parameterNames!;
+ var parameterTypes = suggestion.parameterTypes!;
+ expect(parameterNames, hasLength(1));
+ expect(parameterNames[0], 'param');
+ expect(parameterTypes[0], 'int*');
expect(suggestion.requiredParameterCount, 1);
expect(suggestion.hasNamedParameters, false);
}
diff --git a/pkg/analysis_server/test/services/completion/dart/keyword_contributor_test.dart b/pkg/analysis_server/test/services/completion/dart/keyword_contributor_test.dart
index 4abe258..84b0ba8 100644
--- a/pkg/analysis_server/test/services/completion/dart/keyword_contributor_test.dart
+++ b/pkg/analysis_server/test/services/completion/dart/keyword_contributor_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/provisional/completion/dart/completion_dart.dart';
import 'package:analysis_server/src/services/completion/dart/keyword_contributor.dart';
import 'package:analyzer/dart/analysis/features.dart';
diff --git a/pkg/analysis_server/test/services/completion/dart/label_contributor_test.dart b/pkg/analysis_server/test/services/completion/dart/label_contributor_test.dart
index b4223ba..9204f6d 100644
--- a/pkg/analysis_server/test/services/completion/dart/label_contributor_test.dart
+++ b/pkg/analysis_server/test/services/completion/dart/label_contributor_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/provisional/completion/dart/completion_dart.dart';
import 'package:analysis_server/src/services/completion/dart/label_contributor.dart';
@@ -24,8 +22,7 @@
{CompletionSuggestionKind kind = CompletionSuggestionKind.IDENTIFIER}) {
var cs = assertSuggest(name, csKind: kind);
expect(cs.returnType, isNull);
- var element = cs.element;
- expect(element, isNotNull);
+ var element = cs.element!;
expect(element.flags, 0);
expect(element.kind, equals(ElementKind.LABEL));
expect(element.name, equals(name));
diff --git a/pkg/analysis_server/test/services/completion/dart/library_member_contributor_test.dart b/pkg/analysis_server/test/services/completion/dart/library_member_contributor_test.dart
index 3ed1036..023cef5 100644
--- a/pkg/analysis_server/test/services/completion/dart/library_member_contributor_test.dart
+++ b/pkg/analysis_server/test/services/completion/dart/library_member_contributor_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/provisional/completion/dart/completion_dart.dart';
import 'package:analysis_server/src/services/completion/dart/library_member_contributor.dart';
import 'package:test/test.dart';
diff --git a/pkg/analysis_server/test/services/completion/dart/library_prefix_contributor_test.dart b/pkg/analysis_server/test/services/completion/dart/library_prefix_contributor_test.dart
index e717c1d..64d0df1 100644
--- a/pkg/analysis_server/test/services/completion/dart/library_prefix_contributor_test.dart
+++ b/pkg/analysis_server/test/services/completion/dart/library_prefix_contributor_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/provisional/completion/dart/completion_dart.dart';
import 'package:analysis_server/src/services/completion/dart/library_prefix_contributor.dart';
@@ -24,8 +22,7 @@
for (var prefix in expectedPrefixes) {
var cs =
assertSuggest(prefix, csKind: CompletionSuggestionKind.IDENTIFIER);
- var element = cs.element;
- expect(element, isNotNull);
+ var element = cs.element!;
expect(element.kind, equals(ElementKind.LIBRARY));
expect(element.parameters, isNull);
expect(element.returnType, isNull);
@@ -237,7 +234,7 @@
class _B {}
A Sew;''');
await computeSuggestions();
- expect(replacementOffset, completionOffset - 1);
+ expect(replacementOffset, completionOffset! - 1);
expect(replacementLength, 1);
assertSuggestLibraryPrefixes(['Soo']);
}
diff --git a/pkg/analysis_server/test/services/completion/dart/local_library_contributor_test.dart b/pkg/analysis_server/test/services/completion/dart/local_library_contributor_test.dart
index 3cabd97..6417557 100644
--- a/pkg/analysis_server/test/services/completion/dart/local_library_contributor_test.dart
+++ b/pkg/analysis_server/test/services/completion/dart/local_library_contributor_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/provisional/completion/dart/completion_dart.dart';
import 'package:analysis_server/src/services/completion/dart/local_library_contributor.dart';
import 'package:test/test.dart';
diff --git a/pkg/analysis_server/test/services/completion/dart/local_reference_contributor_test.dart b/pkg/analysis_server/test/services/completion/dart/local_reference_contributor_test.dart
index 4f97ee4..16d784d 100644
--- a/pkg/analysis_server/test/services/completion/dart/local_reference_contributor_test.dart
+++ b/pkg/analysis_server/test/services/completion/dart/local_reference_contributor_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/provisional/completion/dart/completion_dart.dart';
import 'package:analysis_server/src/services/completion/dart/local_reference_contributor.dart';
@@ -682,7 +680,7 @@
}''');
await computeSuggestions();
- expect(replacementOffset, completionOffset - 3);
+ expect(replacementOffset, completionOffset! - 3);
expect(replacementLength, 3);
assertSuggestClass('A');
assertNotSuggested('int');
@@ -707,7 +705,7 @@
}''');
await computeSuggestions();
- expect(replacementOffset, completionOffset - 1);
+ expect(replacementOffset, completionOffset! - 1);
expect(replacementLength, 1);
assertSuggestClass('A');
assertNotSuggested('int');
@@ -1244,7 +1242,7 @@
class Z { }''');
await computeSuggestions();
- expect(replacementOffset, completionOffset - 1);
+ expect(replacementOffset, completionOffset! - 1);
expect(replacementLength, 1);
assertSuggestClass('X');
@@ -1487,7 +1485,7 @@
class Z { }''');
await computeSuggestions();
- expect(replacementOffset, completionOffset - 1);
+ expect(replacementOffset, completionOffset! - 1);
expect(replacementLength, 1);
assertNotSuggested('partT8');
@@ -1601,7 +1599,7 @@
main() {A a; a^..b}''');
await computeSuggestions();
- expect(replacementOffset, completionOffset - 1);
+ expect(replacementOffset, completionOffset! - 1);
expect(replacementLength, 1);
assertNotSuggested('b');
assertNotSuggested('_c');
@@ -1689,15 +1687,15 @@
expect(replacementOffset, completionOffset);
expect(replacementLength, 0);
- var suggestionA = assertSuggestClass('A', isDeprecated: true);
+ var suggestionA = assertSuggestClass('A', isDeprecated: true).element;
if (suggestionA != null) {
- expect(suggestionA.element.isDeprecated, isTrue);
- expect(suggestionA.element.isPrivate, isFalse);
+ expect(suggestionA.isDeprecated, isTrue);
+ expect(suggestionA.isPrivate, isFalse);
}
- var suggestionB = assertSuggestClass('_B');
+ var suggestionB = assertSuggestClass('_B').element;
if (suggestionB != null) {
- expect(suggestionB.element.isDeprecated, isFalse);
- expect(suggestionB.element.isPrivate, isTrue);
+ expect(suggestionB.isDeprecated, isFalse);
+ expect(suggestionB.isPrivate, isTrue);
}
assertNotSuggested('Object');
assertNotSuggested('T');
@@ -1758,7 +1756,7 @@
A Sew;''');
await computeSuggestions();
- expect(replacementOffset, completionOffset - 1);
+ expect(replacementOffset, completionOffset! - 1);
expect(replacementLength, 1);
assertSuggestClass('A');
assertSuggestClass('_B');
@@ -2120,7 +2118,7 @@
main() {new String.fr^omCharCodes([]);}''');
await computeSuggestions();
- expect(replacementOffset, completionOffset - 2);
+ expect(replacementOffset, completionOffset! - 2);
expect(replacementLength, 13);
// Suggested by NamedConstructorContributor
assertNotSuggested('fromCharCodes');
@@ -2679,10 +2677,10 @@
expect(replacementOffset, completionOffset);
expect(replacementLength, 0);
- var suggestionB = assertSuggestClass('_B');
+ var suggestionB = assertSuggestClass('_B').element;
if (suggestionB != null) {
- expect(suggestionB.element.isDeprecated, isFalse);
- expect(suggestionB.element.isPrivate, isTrue);
+ expect(suggestionB.isDeprecated, isFalse);
+ expect(suggestionB.isPrivate, isTrue);
}
assertNotSuggested('Object');
assertNotSuggested('T');
@@ -2865,7 +2863,7 @@
addTestSource('main() {List<int> values; for (int index in i^)}');
await computeSuggestions();
- expect(replacementOffset, completionOffset - 1);
+ expect(replacementOffset, completionOffset! - 1);
expect(replacementLength, 1);
assertSuggestLocalVariable('values', 'List<int>');
assertNotSuggested('index');
@@ -2876,7 +2874,7 @@
addTestSource('main() {List<int> values; for (int index in (i^))}');
await computeSuggestions();
- expect(replacementOffset, completionOffset - 1);
+ expect(replacementOffset, completionOffset! - 1);
expect(replacementLength, 1);
assertSuggestLocalVariable('values', 'List<int>');
assertNotSuggested('index');
@@ -2945,7 +2943,7 @@
addTestSource('main(args) {for (S^ foo in args) {}}');
await computeSuggestions();
- expect(replacementOffset, completionOffset - 1);
+ expect(replacementOffset, completionOffset! - 1);
expect(replacementLength, 1);
assertNotSuggested('args');
assertNotSuggested('foo');
@@ -2992,7 +2990,7 @@
addTestSource('var x = [for (int index = 0; i^)];');
await computeSuggestions();
- expect(replacementOffset, completionOffset - 1);
+ expect(replacementOffset, completionOffset! - 1);
expect(replacementLength, 1);
assertSuggestLocalVariable('index', 'int');
}
@@ -3011,7 +3009,7 @@
addTestSource('var x = [for (int index = 0; index < 10; i^)];');
await computeSuggestions();
- expect(replacementOffset, completionOffset - 1);
+ expect(replacementOffset, completionOffset! - 1);
expect(replacementLength, 1);
assertSuggestLocalVariable('index', 'int');
}
@@ -3022,7 +3020,7 @@
''');
await computeSuggestions();
- expect(replacementOffset, completionOffset - 1);
+ expect(replacementOffset, completionOffset! - 1);
expect(replacementLength, 1);
assertSuggestLocalVariable('index', 'int');
}
@@ -3061,7 +3059,7 @@
addTestSource('main() {for (int index = 0; i^)}');
await computeSuggestions();
- expect(replacementOffset, completionOffset - 1);
+ expect(replacementOffset, completionOffset! - 1);
expect(replacementLength, 1);
assertSuggestLocalVariable('index', 'int');
}
@@ -3083,7 +3081,7 @@
addTestSource('main() {for (int index = 0; index < 10; i^)}');
await computeSuggestions();
- expect(replacementOffset, completionOffset - 1);
+ expect(replacementOffset, completionOffset! - 1);
expect(replacementLength, 1);
assertSuggestLocalVariable('index', 'int');
}
@@ -3095,7 +3093,7 @@
main() {for (int index = 0; index < 10; ++i^)}''');
await computeSuggestions();
- expect(replacementOffset, completionOffset - 1);
+ expect(replacementOffset, completionOffset! - 1);
expect(replacementLength, 1);
assertSuggestLocalVariable('index', 'int');
assertSuggestFunction('main', null);
@@ -3111,11 +3109,13 @@
''');
await computeSuggestions();
var suggestion = assertSuggestFunction('m', 'void');
- expect(suggestion.parameterNames, hasLength(2));
- expect(suggestion.parameterNames[0], 'x');
- expect(suggestion.parameterTypes[0], 'dynamic');
- expect(suggestion.parameterNames[1], 'y');
- expect(suggestion.parameterTypes[1], 'int');
+ var parameterNames = suggestion.parameterNames!;
+ var parameterTypes = suggestion.parameterTypes!;
+ expect(parameterNames, hasLength(2));
+ expect(parameterNames[0], 'x');
+ expect(parameterTypes[0], 'dynamic');
+ expect(parameterNames[1], 'y');
+ expect(parameterTypes[1], 'int');
expect(suggestion.requiredParameterCount, 1);
expect(suggestion.hasNamedParameters, true);
}
@@ -3129,11 +3129,13 @@
''');
await computeSuggestions();
var suggestion = assertSuggestFunction('m', 'void');
- expect(suggestion.parameterNames, hasLength(2));
- expect(suggestion.parameterNames[0], 'x');
- expect(suggestion.parameterTypes[0], 'dynamic');
- expect(suggestion.parameterNames[1], 'y');
- expect(suggestion.parameterTypes[1], 'int');
+ var parameterNames = suggestion.parameterNames!;
+ var parameterTypes = suggestion.parameterTypes!;
+ expect(parameterNames, hasLength(2));
+ expect(parameterNames[0], 'x');
+ expect(parameterTypes[0], 'dynamic');
+ expect(parameterNames[1], 'y');
+ expect(parameterTypes[1], 'int');
expect(suggestion.requiredParameterCount, 1);
expect(suggestion.hasNamedParameters, false);
}
@@ -3147,11 +3149,13 @@
''');
await computeSuggestions();
var suggestion = assertSuggestFunction('m', 'void');
- expect(suggestion.parameterNames, hasLength(2));
- expect(suggestion.parameterNames[0], 'x');
- expect(suggestion.parameterTypes[0], 'dynamic');
- expect(suggestion.parameterNames[1], 'y');
- expect(suggestion.parameterTypes[1], 'int');
+ var parameterNames = suggestion.parameterNames!;
+ var parameterTypes = suggestion.parameterTypes!;
+ expect(parameterNames, hasLength(2));
+ expect(parameterNames[0], 'x');
+ expect(parameterTypes[0], 'dynamic');
+ expect(parameterNames[1], 'y');
+ expect(parameterTypes[1], 'int');
expect(suggestion.requiredParameterCount, 0);
expect(suggestion.hasNamedParameters, true);
}
@@ -3180,11 +3184,13 @@
''');
await computeSuggestions();
var suggestion = assertSuggestFunction('m', 'void');
- expect(suggestion.parameterNames, hasLength(2));
- expect(suggestion.parameterNames[0], 'x');
- expect(suggestion.parameterTypes[0], 'dynamic');
- expect(suggestion.parameterNames[1], 'y');
- expect(suggestion.parameterTypes[1], 'int');
+ var parameterNames = suggestion.parameterNames!;
+ var parameterTypes = suggestion.parameterTypes!;
+ expect(parameterNames, hasLength(2));
+ expect(parameterNames[0], 'x');
+ expect(parameterTypes[0], 'dynamic');
+ expect(parameterNames[1], 'y');
+ expect(parameterTypes[1], 'int');
expect(suggestion.requiredParameterCount, 0);
expect(suggestion.hasNamedParameters, false);
}
@@ -3198,11 +3204,13 @@
''');
await computeSuggestions();
var suggestion = assertSuggestFunction('m', 'void');
- expect(suggestion.parameterNames, hasLength(2));
- expect(suggestion.parameterNames[0], 'x');
- expect(suggestion.parameterTypes[0], 'dynamic');
- expect(suggestion.parameterNames[1], 'y');
- expect(suggestion.parameterTypes[1], 'int');
+ var parameterNames = suggestion.parameterNames!;
+ var parameterTypes = suggestion.parameterTypes!;
+ expect(parameterNames, hasLength(2));
+ expect(parameterNames[0], 'x');
+ expect(parameterTypes[0], 'dynamic');
+ expect(parameterNames[1], 'y');
+ expect(parameterTypes[1], 'int');
expect(suggestion.requiredParameterCount, 2);
expect(suggestion.hasNamedParameters, false);
}
@@ -3351,9 +3359,9 @@
expect(replacementOffset, completionOffset);
expect(replacementLength, 0);
- var f = assertSuggestFunction('foo', 'String', isDeprecated: false);
+ var f = assertSuggestFunction('foo', 'String', isDeprecated: false).element;
if (f != null) {
- expect(f.element.isPrivate, isFalse);
+ expect(f.isPrivate, isFalse);
}
assertSuggestFunction('bar', 'void');
assertSuggestParameter('args', 'List<dynamic>');
@@ -3479,7 +3487,7 @@
''');
await computeSuggestions();
- expect(replacementOffset, completionOffset - 1);
+ expect(replacementOffset, completionOffset! - 1);
expect(replacementLength, 1);
assertSuggestField('b', null);
assertSuggestField('_c', 'X');
@@ -3651,35 +3659,39 @@
CompletionSuggestion suggestion;
suggestion = assertSuggestConstructor('A', elemOffset: -1);
- expect(suggestion.element.parameters, '()');
- expect(suggestion.element.returnType, 'A');
+ expect(suggestion.element!.parameters, '()');
+ expect(suggestion.element!.returnType, 'A');
expect(suggestion.declaringType, 'A');
expect(suggestion.parameterNames, hasLength(0));
expect(suggestion.requiredParameterCount, 0);
expect(suggestion.hasNamedParameters, false);
suggestion = assertSuggestConstructor('B');
- expect(suggestion.element.parameters, '(int x, [String boo])');
- expect(suggestion.element.returnType, 'B');
+ var parameterNames = suggestion.parameterNames!;
+ var parameterTypes = suggestion.parameterTypes!;
+ expect(suggestion.element!.parameters, '(int x, [String boo])');
+ expect(suggestion.element!.returnType, 'B');
expect(suggestion.declaringType, 'B');
- expect(suggestion.parameterNames, hasLength(2));
- expect(suggestion.parameterNames[0], 'x');
- expect(suggestion.parameterTypes[0], 'int');
- expect(suggestion.parameterNames[1], 'boo');
- expect(suggestion.parameterTypes[1], 'String');
+ expect(parameterNames, hasLength(2));
+ expect(parameterNames[0], 'x');
+ expect(parameterTypes[0], 'int');
+ expect(parameterNames[1], 'boo');
+ expect(parameterTypes[1], 'String');
expect(suggestion.requiredParameterCount, 1);
expect(suggestion.hasNamedParameters, false);
suggestion = assertSuggestConstructor('C.bar');
expect(
- suggestion.element.parameters, '({dynamic boo = \'hoo\', int z = 0})');
- expect(suggestion.element.returnType, 'C');
+ suggestion.element!.parameters, '({dynamic boo = \'hoo\', int z = 0})');
+ parameterNames = suggestion.parameterNames!;
+ parameterTypes = suggestion.parameterTypes!;
+ expect(suggestion.element!.returnType, 'C');
expect(suggestion.declaringType, 'C');
- expect(suggestion.parameterNames, hasLength(2));
- expect(suggestion.parameterNames[0], 'boo');
- expect(suggestion.parameterTypes[0], 'dynamic');
- expect(suggestion.parameterNames[1], 'z');
- expect(suggestion.parameterTypes[1], 'int');
+ expect(parameterNames, hasLength(2));
+ expect(parameterNames[0], 'boo');
+ expect(parameterTypes[0], 'dynamic');
+ expect(parameterNames[1], 'z');
+ expect(parameterTypes[1], 'int');
expect(suggestion.requiredParameterCount, 0);
expect(suggestion.hasNamedParameters, true);
}
@@ -3813,7 +3825,7 @@
addTestSource('class C {foo(){new F^}}');
await computeSuggestions();
- expect(replacementOffset, completionOffset - 1);
+ expect(replacementOffset, completionOffset! - 1);
expect(replacementLength, 1);
assertNotSuggested('Future');
assertNotSuggested('Foo');
@@ -4038,7 +4050,7 @@
main(){var a; if (a is Obj^)}''');
await computeSuggestions();
- expect(replacementOffset, completionOffset - 3);
+ expect(replacementOffset, completionOffset! - 3);
expect(replacementLength, 3);
assertNotSuggested('a');
assertNotSuggested('main');
@@ -4060,7 +4072,7 @@
main() {new^ X.c();}''');
await computeSuggestions();
- expect(replacementOffset, completionOffset - 3);
+ expect(replacementOffset, completionOffset! - 3);
expect(replacementLength, 3);
assertNotSuggested('c');
assertNotSuggested('_d');
@@ -4244,7 +4256,7 @@
foo = {T^''');
await computeSuggestions();
- expect(replacementOffset, completionOffset - 1);
+ expect(replacementOffset, completionOffset! - 1);
expect(replacementLength, 1);
assertNotSuggested('T1');
assertSuggestTopLevelVar('T2', 'int');
@@ -4266,7 +4278,7 @@
foo = {7:T^};''');
await computeSuggestions();
- expect(replacementOffset, completionOffset - 1);
+ expect(replacementOffset, completionOffset! - 1);
expect(replacementLength, 1);
assertNotSuggested('T1');
assertSuggestTopLevelVar('T2', 'int');
@@ -4321,11 +4333,13 @@
''');
await computeSuggestions();
var suggestion = assertSuggestMethod('m', 'A', 'void');
- expect(suggestion.parameterNames, hasLength(2));
- expect(suggestion.parameterNames[0], 'x');
- expect(suggestion.parameterTypes[0], 'dynamic');
- expect(suggestion.parameterNames[1], 'y');
- expect(suggestion.parameterTypes[1], 'int');
+ var parameterNames = suggestion.parameterNames!;
+ var parameterTypes = suggestion.parameterTypes!;
+ expect(parameterNames, hasLength(2));
+ expect(parameterNames[0], 'x');
+ expect(parameterTypes[0], 'dynamic');
+ expect(parameterNames[1], 'y');
+ expect(parameterTypes[1], 'int');
expect(suggestion.requiredParameterCount, 1);
expect(suggestion.hasNamedParameters, true);
}
@@ -4341,11 +4355,13 @@
''');
await computeSuggestions();
var suggestion = assertSuggestMethod('m', 'A', 'void');
- expect(suggestion.parameterNames, hasLength(2));
- expect(suggestion.parameterNames[0], 'x');
- expect(suggestion.parameterTypes[0], 'dynamic');
- expect(suggestion.parameterNames[1], 'y');
- expect(suggestion.parameterTypes[1], 'int');
+ var parameterNames = suggestion.parameterNames!;
+ var parameterTypes = suggestion.parameterTypes!;
+ expect(parameterNames, hasLength(2));
+ expect(parameterNames[0], 'x');
+ expect(parameterTypes[0], 'dynamic');
+ expect(parameterNames[1], 'y');
+ expect(parameterTypes[1], 'int');
expect(suggestion.requiredParameterCount, 1);
expect(suggestion.hasNamedParameters, true);
}
@@ -4364,11 +4380,13 @@
''');
await computeSuggestions();
var suggestion = assertSuggestMethod('m', 'A', 'void');
- expect(suggestion.parameterNames, hasLength(2));
- expect(suggestion.parameterNames[0], 'x');
- expect(suggestion.parameterTypes[0], 'dynamic');
- expect(suggestion.parameterNames[1], 'y');
- expect(suggestion.parameterTypes[1], 'int');
+ var parameterNames = suggestion.parameterNames!;
+ var parameterTypes = suggestion.parameterTypes!;
+ expect(parameterNames, hasLength(2));
+ expect(parameterNames[0], 'x');
+ expect(parameterTypes[0], 'dynamic');
+ expect(parameterNames[1], 'y');
+ expect(parameterTypes[1], 'int');
expect(suggestion.requiredParameterCount, 1);
expect(suggestion.hasNamedParameters, false);
}
@@ -4385,11 +4403,13 @@
''');
await computeSuggestions();
var suggestion = assertSuggestMethod('m', 'A', 'void');
- expect(suggestion.parameterNames, hasLength(2));
- expect(suggestion.parameterNames[0], 'x');
- expect(suggestion.parameterTypes[0], 'dynamic');
- expect(suggestion.parameterNames[1], 'y');
- expect(suggestion.parameterTypes[1], 'int');
+ var parameterNames = suggestion.parameterNames!;
+ var parameterTypes = suggestion.parameterTypes!;
+ expect(parameterNames, hasLength(2));
+ expect(parameterNames[0], 'x');
+ expect(parameterTypes[0], 'dynamic');
+ expect(parameterNames[1], 'y');
+ expect(parameterTypes[1], 'int');
expect(suggestion.requiredParameterCount, 1);
expect(suggestion.hasNamedParameters, false);
}
@@ -4408,11 +4428,13 @@
''');
await computeSuggestions();
var suggestion = assertSuggestMethod('m', 'A', 'void');
- expect(suggestion.parameterNames, hasLength(2));
- expect(suggestion.parameterNames[0], 'x');
- expect(suggestion.parameterTypes[0], 'dynamic');
- expect(suggestion.parameterNames[1], 'y');
- expect(suggestion.parameterTypes[1], 'int');
+ var parameterNames = suggestion.parameterNames!;
+ var parameterTypes = suggestion.parameterTypes!;
+ expect(parameterNames, hasLength(2));
+ expect(parameterNames[0], 'x');
+ expect(parameterTypes[0], 'dynamic');
+ expect(parameterNames[1], 'y');
+ expect(parameterTypes[1], 'int');
expect(suggestion.requiredParameterCount, 0);
expect(suggestion.hasNamedParameters, true);
}
@@ -4428,11 +4450,13 @@
''');
await computeSuggestions();
var suggestion = assertSuggestMethod('m', 'A', 'void');
- expect(suggestion.parameterNames, hasLength(2));
- expect(suggestion.parameterNames[0], 'x');
- expect(suggestion.parameterTypes[0], 'dynamic');
- expect(suggestion.parameterNames[1], 'y');
- expect(suggestion.parameterTypes[1], 'int');
+ var parameterNames = suggestion.parameterNames!;
+ var parameterTypes = suggestion.parameterTypes!;
+ expect(parameterNames, hasLength(2));
+ expect(parameterNames[0], 'x');
+ expect(parameterTypes[0], 'dynamic');
+ expect(parameterNames[1], 'y');
+ expect(parameterTypes[1], 'int');
expect(suggestion.requiredParameterCount, 0);
expect(suggestion.hasNamedParameters, true);
}
@@ -4488,11 +4512,13 @@
''');
await computeSuggestions();
var suggestion = assertSuggestMethod('m', 'A', 'void');
- expect(suggestion.parameterNames, hasLength(2));
- expect(suggestion.parameterNames[0], 'x');
- expect(suggestion.parameterTypes[0], 'dynamic');
- expect(suggestion.parameterNames[1], 'y');
- expect(suggestion.parameterTypes[1], 'int');
+ var parameterNames = suggestion.parameterNames!;
+ var parameterTypes = suggestion.parameterTypes!;
+ expect(parameterNames, hasLength(2));
+ expect(parameterNames[0], 'x');
+ expect(parameterTypes[0], 'dynamic');
+ expect(parameterNames[1], 'y');
+ expect(parameterTypes[1], 'int');
expect(suggestion.requiredParameterCount, 0);
expect(suggestion.hasNamedParameters, false);
}
@@ -4508,11 +4534,13 @@
''');
await computeSuggestions();
var suggestion = assertSuggestMethod('m', 'A', 'void');
- expect(suggestion.parameterNames, hasLength(2));
- expect(suggestion.parameterNames[0], 'x');
- expect(suggestion.parameterTypes[0], 'dynamic');
- expect(suggestion.parameterNames[1], 'y');
- expect(suggestion.parameterTypes[1], 'int');
+ var parameterNames = suggestion.parameterNames!;
+ var parameterTypes = suggestion.parameterTypes!;
+ expect(parameterNames, hasLength(2));
+ expect(parameterNames[0], 'x');
+ expect(parameterTypes[0], 'dynamic');
+ expect(parameterNames[1], 'y');
+ expect(parameterTypes[1], 'int');
expect(suggestion.requiredParameterCount, 0);
expect(suggestion.hasNamedParameters, false);
}
@@ -4531,11 +4559,13 @@
''');
await computeSuggestions();
var suggestion = assertSuggestMethod('m', 'A', 'void');
- expect(suggestion.parameterNames, hasLength(2));
- expect(suggestion.parameterNames[0], 'x');
- expect(suggestion.parameterTypes[0], 'dynamic');
- expect(suggestion.parameterNames[1], 'y');
- expect(suggestion.parameterTypes[1], 'int');
+ var parameterNames = suggestion.parameterNames!;
+ var parameterTypes = suggestion.parameterTypes!;
+ expect(parameterNames, hasLength(2));
+ expect(parameterNames[0], 'x');
+ expect(parameterTypes[0], 'dynamic');
+ expect(parameterNames[1], 'y');
+ expect(parameterTypes[1], 'int');
expect(suggestion.requiredParameterCount, 2);
expect(suggestion.hasNamedParameters, false);
}
@@ -4556,20 +4586,20 @@
expect(replacementOffset, completionOffset);
expect(replacementLength, 0);
- var methodA = assertSuggestMethod('a', 'A', 'Z');
+ var methodA = assertSuggestMethod('a', 'A', 'Z').element;
if (methodA != null) {
- expect(methodA.element.isDeprecated, isFalse);
- expect(methodA.element.isPrivate, isFalse);
+ expect(methodA.isDeprecated, isFalse);
+ expect(methodA.isPrivate, isFalse);
}
- var getterF = assertSuggestGetter('f', 'X', isDeprecated: true);
+ var getterF = assertSuggestGetter('f', 'X', isDeprecated: true).element;
if (getterF != null) {
- expect(getterF.element.isDeprecated, isTrue);
- expect(getterF.element.isPrivate, isFalse);
+ expect(getterF.isDeprecated, isTrue);
+ expect(getterF.isPrivate, isFalse);
}
- var getterG = assertSuggestGetter('_g', null);
+ var getterG = assertSuggestGetter('_g', null).element;
if (getterG != null) {
- expect(getterG.element.isDeprecated, isFalse);
- expect(getterG.element.isPrivate, isTrue);
+ expect(getterG.isDeprecated, isFalse);
+ expect(getterG.isPrivate, isTrue);
}
}
@@ -4625,23 +4655,23 @@
expect(replacementOffset, completionOffset);
expect(replacementLength, 0);
- var methodA = assertSuggestMethod('_a', 'A', 'Z');
+ var methodA = assertSuggestMethod('_a', 'A', 'Z').element;
if (methodA != null) {
- expect(methodA.element.isDeprecated, isFalse);
- expect(methodA.element.isPrivate, isTrue);
+ expect(methodA.isDeprecated, isFalse);
+ expect(methodA.isPrivate, isTrue);
}
- var getterF = assertSuggestField('f', 'X', isDeprecated: true);
+ var getterF = assertSuggestField('f', 'X', isDeprecated: true).element;
if (getterF != null) {
- expect(getterF.element.isDeprecated, isTrue);
- expect(getterF.element.isPrivate, isFalse);
- expect(getterF.element.parameters, isNull);
+ expect(getterF.isDeprecated, isTrue);
+ expect(getterF.isPrivate, isFalse);
+ expect(getterF.parameters, isNull);
}
// If user did not type '_' then relevance of private members is not raised
- var getterG = assertSuggestField('_g', null);
+ var getterG = assertSuggestField('_g', null).element;
if (getterG != null) {
- expect(getterG.element.isDeprecated, isFalse);
- expect(getterG.element.isPrivate, isTrue);
- expect(getterF.element.parameters, isNull);
+ expect(getterG.isDeprecated, isFalse);
+ expect(getterG.isPrivate, isTrue);
+ expect(getterG.parameters, isNull);
}
assertNotSuggested('bool');
}
@@ -4660,26 +4690,26 @@
''');
await computeSuggestions();
- expect(replacementOffset, completionOffset - 1);
+ expect(replacementOffset, completionOffset! - 1);
expect(replacementLength, 1);
- var methodA = assertSuggestMethod('_a', 'A', 'Z');
+ var methodA = assertSuggestMethod('_a', 'A', 'Z').element;
if (methodA != null) {
- expect(methodA.element.isDeprecated, isFalse);
- expect(methodA.element.isPrivate, isTrue);
+ expect(methodA.isDeprecated, isFalse);
+ expect(methodA.isPrivate, isTrue);
}
- var getterF = assertSuggestField('f', 'X', isDeprecated: true);
+ var getterF = assertSuggestField('f', 'X', isDeprecated: true).element;
if (getterF != null) {
- expect(getterF.element.isDeprecated, isTrue);
- expect(getterF.element.isPrivate, isFalse);
- expect(getterF.element.parameters, isNull);
+ expect(getterF.isDeprecated, isTrue);
+ expect(getterF.isPrivate, isFalse);
+ expect(getterF.parameters, isNull);
}
// If user prefixed completion with '_' then suggestion of private members
// should be the same as public members
- var getterG = assertSuggestField('_g', null);
+ var getterG = assertSuggestField('_g', null).element;
if (getterG != null) {
- expect(getterG.element.isDeprecated, isFalse);
- expect(getterG.element.isPrivate, isTrue);
- expect(getterF.element.parameters, isNull);
+ expect(getterG.isDeprecated, isFalse);
+ expect(getterG.isPrivate, isTrue);
+ expect(getterG.parameters, isNull);
}
assertNotSuggested('bool');
}
@@ -4714,10 +4744,11 @@
expect(replacementOffset, completionOffset);
expect(replacementLength, 0);
- var methodA = assertSuggestMethod('a', 'A', 'Z', isDeprecated: true);
+ var methodA =
+ assertSuggestMethod('a', 'A', 'Z', isDeprecated: true).element;
if (methodA != null) {
- expect(methodA.element.isDeprecated, isTrue);
- expect(methodA.element.isPrivate, isFalse);
+ expect(methodA.isDeprecated, isTrue);
+ expect(methodA.isPrivate, isFalse);
}
assertSuggestParameter('x', 'X');
assertSuggestParameter('y', null);
@@ -5009,15 +5040,15 @@
expect(replacementOffset, completionOffset);
expect(replacementLength, 0);
- var suggestionM = assertSuggestMixin('M');
+ var suggestionM = assertSuggestMixin('M').element;
if (suggestionM != null) {
- expect(suggestionM.element.isDeprecated, isFalse);
- expect(suggestionM.element.isPrivate, isFalse);
+ expect(suggestionM.isDeprecated, isFalse);
+ expect(suggestionM.isPrivate, isFalse);
}
- var suggestionB = assertSuggestClass('_B');
+ var suggestionB = assertSuggestClass('_B').element;
if (suggestionB != null) {
- expect(suggestionB.element.isDeprecated, isFalse);
- expect(suggestionB.element.isPrivate, isTrue);
+ expect(suggestionB.isDeprecated, isFalse);
+ expect(suggestionB.isPrivate, isTrue);
}
assertNotSuggested('Object');
assertNotSuggested('T');
@@ -5454,7 +5485,7 @@
class X {foo(){A^.bar}}''');
await computeSuggestions();
- expect(replacementOffset, completionOffset - 1);
+ expect(replacementOffset, completionOffset! - 1);
expect(replacementLength, 1);
assertNotSuggested('A');
assertSuggestClass('X');
@@ -5599,7 +5630,7 @@
addTestSource('class A {a() {"hello".to^String().length}}');
await computeSuggestions();
- expect(replacementOffset, completionOffset - 2);
+ expect(replacementOffset, completionOffset! - 2);
expect(replacementLength, 8);
assertNotSuggested('length');
assertNotSuggested('A');
@@ -5908,7 +5939,7 @@
class X{}''');
await computeSuggestions();
- expect(replacementOffset, completionOffset - 1);
+ expect(replacementOffset, completionOffset! - 1);
expect(replacementLength, 1);
// Contributed by FieldFormalContributor
assertNotSuggested('b');
@@ -6114,7 +6145,7 @@
main() { C<C^> c; }''');
await computeSuggestions();
- expect(replacementOffset, completionOffset - 1);
+ expect(replacementOffset, completionOffset! - 1);
expect(replacementLength, 1);
assertNotSuggested('C1');
assertSuggestClass('C2');
diff --git a/pkg/analysis_server/test/services/completion/dart/named_constructor_contributor_test.dart b/pkg/analysis_server/test/services/completion/dart/named_constructor_contributor_test.dart
index c058de6..9fcdd82 100644
--- a/pkg/analysis_server/test/services/completion/dart/named_constructor_contributor_test.dart
+++ b/pkg/analysis_server/test/services/completion/dart/named_constructor_contributor_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/provisional/completion/dart/completion_dart.dart';
import 'package:analysis_server/src/services/completion/dart/named_constructor_contributor.dart';
import 'package:analyzer_plugin/protocol/protocol_common.dart';
@@ -24,12 +22,10 @@
String name, String returnType,
[CompletionSuggestionKind kind = CompletionSuggestionKind.INVOCATION]) {
var cs = assertSuggest(name, csKind: kind);
- var element = cs.element;
- expect(element, isNotNull);
+ var element = cs.element!;
expect(element.kind, equals(ElementKind.CONSTRUCTOR));
expect(element.name, equals(name));
- var param = element.parameters;
- expect(param, isNotNull);
+ var param = element.parameters!;
expect(param[0], equals('('));
expect(param[param.length - 1], equals(')'));
expect(element.returnType, equals(returnType));
@@ -121,7 +117,7 @@
addTestSource('''
main() {new String.fr^omCharCodes([]);}''');
await computeSuggestions();
- expect(replacementOffset, completionOffset - 2);
+ expect(replacementOffset, completionOffset! - 2);
expect(replacementLength, 13);
assertSuggestNamedConstructor('fromCharCodes', 'String');
assertNotSuggested('isEmpty');
diff --git a/pkg/analysis_server/test/services/completion/dart/override_contributor_test.dart b/pkg/analysis_server/test/services/completion/dart/override_contributor_test.dart
index 55cad3f..7b27e88 100644
--- a/pkg/analysis_server/test/services/completion/dart/override_contributor_test.dart
+++ b/pkg/analysis_server/test/services/completion/dart/override_contributor_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/provisional/completion/dart/completion_dart.dart';
import 'package:analysis_server/src/services/completion/dart/override_contributor.dart';
import 'package:analyzer_plugin/protocol/protocol_common.dart';
@@ -519,7 +517,7 @@
}
CompletionSuggestion _assertOverride(String completion,
- {String displayText, int selectionOffset, int selectionLength}) {
+ {String? displayText, int? selectionOffset, int? selectionLength}) {
var cs = getSuggest(
completion: completion,
csKind: CompletionSuggestionKind.OVERRIDE,
diff --git a/pkg/analysis_server/test/services/completion/dart/static_member_contributor_test.dart b/pkg/analysis_server/test/services/completion/dart/static_member_contributor_test.dart
index 72f6bb8..7253f49 100644
--- a/pkg/analysis_server/test/services/completion/dart/static_member_contributor_test.dart
+++ b/pkg/analysis_server/test/services/completion/dart/static_member_contributor_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/provisional/completion/dart/completion_dart.dart';
import 'package:analysis_server/src/services/completion/dart/static_member_contributor.dart';
import 'package:test/test.dart';
diff --git a/pkg/analysis_server/test/services/completion/dart/type_member_contributor_test.dart b/pkg/analysis_server/test/services/completion/dart/type_member_contributor_test.dart
index 9ff66d1..0cc4eba 100644
--- a/pkg/analysis_server/test/services/completion/dart/type_member_contributor_test.dart
+++ b/pkg/analysis_server/test/services/completion/dart/type_member_contributor_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/provisional/completion/dart/completion_dart.dart';
import 'package:analysis_server/src/services/completion/dart/type_member_contributor.dart';
import 'package:analyzer_plugin/protocol/protocol_common.dart';
@@ -420,7 +418,7 @@
int a;
int^ b = 1;}''');
await computeSuggestions();
- expect(replacementOffset, completionOffset - 3);
+ expect(replacementOffset, completionOffset! - 3);
expect(replacementLength, 3);
assertNotSuggested('A');
assertNotSuggested('int');
@@ -443,7 +441,7 @@
i^
b = 1;}''');
await computeSuggestions();
- expect(replacementOffset, completionOffset - 1);
+ expect(replacementOffset, completionOffset! - 1);
expect(replacementLength, 1);
assertNotSuggested('A');
assertNotSuggested('int');
@@ -926,7 +924,7 @@
class Z { }''');
await computeSuggestions();
- expect(replacementOffset, completionOffset - 1);
+ expect(replacementOffset, completionOffset! - 1);
expect(replacementLength, 1);
assertNotSuggested('X');
@@ -1067,7 +1065,7 @@
void b() { }}
class Z { }''');
await computeSuggestions();
- expect(replacementOffset, completionOffset - 1);
+ expect(replacementOffset, completionOffset! - 1);
expect(replacementLength, 1);
assertNotSuggested('partT8');
assertNotSuggested('partBoo');
@@ -1187,7 +1185,7 @@
class X{}
main() {A a; a^..b}''');
await computeSuggestions();
- expect(replacementOffset, completionOffset - 1);
+ expect(replacementOffset, completionOffset! - 1);
expect(replacementLength, 1);
assertNotSuggested('b');
assertNotSuggested('_c');
@@ -1314,7 +1312,7 @@
class _B {}
A Sew;''');
await computeSuggestions();
- expect(replacementOffset, completionOffset - 1);
+ expect(replacementOffset, completionOffset! - 1);
expect(replacementLength, 1);
assertNotSuggested('A');
assertNotSuggested('_B');
@@ -1570,7 +1568,7 @@
addTestSource('''
main() {new String.fr^omCharCodes([]);}''');
await computeSuggestions();
- expect(replacementOffset, completionOffset - 2);
+ expect(replacementOffset, completionOffset! - 2);
expect(replacementLength, 13);
// Suggested by NamedConstructorContributor
assertNotSuggested('fromCharCodes');
@@ -1841,7 +1839,7 @@
// DeclaredIdentifier ForEachStatement Block
addTestSource('main(args) {for (S^ foo in args) {}}');
await computeSuggestions();
- expect(replacementOffset, completionOffset - 1);
+ expect(replacementOffset, completionOffset! - 1);
expect(replacementLength, 1);
assertNotSuggested('args');
assertNotSuggested('foo');
@@ -1879,7 +1877,7 @@
// SimpleIdentifier ForStatement
addTestSource('main() {for (int index = 0; i^)}');
await computeSuggestions();
- expect(replacementOffset, completionOffset - 1);
+ expect(replacementOffset, completionOffset! - 1);
expect(replacementLength, 1);
assertNotSuggested('index');
}
@@ -1899,7 +1897,7 @@
// SimpleIdentifier ForStatement
addTestSource('main() {for (int index = 0; index < 10; i^)}');
await computeSuggestions();
- expect(replacementOffset, completionOffset - 1);
+ expect(replacementOffset, completionOffset! - 1);
expect(replacementLength, 1);
assertNotSuggested('index');
}
@@ -1910,7 +1908,7 @@
void bar() { }
main() {for (int index = 0; index < 10; ++i^)}''');
await computeSuggestions();
- expect(replacementOffset, completionOffset - 1);
+ expect(replacementOffset, completionOffset! - 1);
expect(replacementLength, 1);
assertNotSuggested('index');
assertNotSuggested('main');
@@ -2075,9 +2073,9 @@
''');
await computeSuggestions();
var suggestion = assertSuggestMethod('m', 'C', 'int');
- expect(suggestion.parameterTypes[0], 'int');
- expect(suggestion.element.returnType, 'int');
- expect(suggestion.element.parameters, '(int t)');
+ expect(suggestion.parameterTypes![0], 'int');
+ expect(suggestion.element!.returnType, 'int');
+ expect(suggestion.element!.parameters, '(int t)');
}
Future<void> test_generic_setter() async {
@@ -2094,7 +2092,7 @@
// as a parmeter to it, and it will check the appropriate field in
// the suggestion object.
var suggestion = assertSuggestSetter('t');
- expect(suggestion.element.parameters, '(int value)');
+ expect(suggestion.element!.parameters, '(int value)');
}
Future<void> test_genericTypeAlias_noFunctionType() async {
@@ -2248,7 +2246,7 @@
addSource('/testAB.dart', 'class Foo { }');
addTestSource('class C {foo(){new F^}}');
await computeSuggestions();
- expect(replacementOffset, completionOffset - 1);
+ expect(replacementOffset, completionOffset! - 1);
expect(replacementLength, 1);
assertNotSuggested('Future');
assertNotSuggested('Foo');
@@ -2452,7 +2450,7 @@
class A {int x; int y() => 0;}
main(){var a; if (a is Obj^)}''');
await computeSuggestions();
- expect(replacementOffset, completionOffset - 3);
+ expect(replacementOffset, completionOffset! - 3);
expect(replacementLength, 3);
assertNotSuggested('a');
assertNotSuggested('main');
@@ -2480,7 +2478,7 @@
var m;
main() {new^ X.c();}''');
await computeSuggestions();
- expect(replacementOffset, completionOffset - 3);
+ expect(replacementOffset, completionOffset! - 3);
expect(replacementLength, 3);
assertNotSuggested('c');
assertNotSuggested('_d');
@@ -2627,7 +2625,7 @@
class C2 { }
foo = {T^''');
await computeSuggestions();
- expect(replacementOffset, completionOffset - 1);
+ expect(replacementOffset, completionOffset! - 1);
expect(replacementLength, 1);
assertNotSuggested('T2');
}
@@ -2647,7 +2645,7 @@
class C2 { }
foo = {7:T^};''');
await computeSuggestions();
- expect(replacementOffset, completionOffset - 1);
+ expect(replacementOffset, completionOffset! - 1);
expect(replacementLength, 1);
assertNotSuggested('T2');
}
@@ -2740,11 +2738,13 @@
void main() {new C().^}''');
await computeSuggestions();
var suggestion = assertSuggestMethod('m', 'C', 'void');
- expect(suggestion.parameterNames, hasLength(2));
- expect(suggestion.parameterNames[0], 'x');
- expect(suggestion.parameterTypes[0], 'dynamic');
- expect(suggestion.parameterNames[1], 'y');
- expect(suggestion.parameterTypes[1], 'int');
+ var parameterNames = suggestion.parameterNames!;
+ var parameterTypes = suggestion.parameterTypes!;
+ expect(parameterNames, hasLength(2));
+ expect(parameterNames[0], 'x');
+ expect(parameterTypes[0], 'dynamic');
+ expect(parameterNames[1], 'y');
+ expect(parameterTypes[1], 'int');
expect(suggestion.requiredParameterCount, 1);
expect(suggestion.hasNamedParameters, true);
}
@@ -2757,11 +2757,13 @@
void main() {new C().^}''');
await computeSuggestions();
var suggestion = assertSuggestMethod('m', 'C', 'void');
- expect(suggestion.parameterNames, hasLength(2));
- expect(suggestion.parameterNames[0], 'x');
- expect(suggestion.parameterTypes[0], 'dynamic');
- expect(suggestion.parameterNames[1], 'y');
- expect(suggestion.parameterTypes[1], 'int');
+ var parameterNames = suggestion.parameterNames!;
+ var parameterTypes = suggestion.parameterTypes!;
+ expect(parameterNames, hasLength(2));
+ expect(parameterNames[0], 'x');
+ expect(parameterTypes[0], 'dynamic');
+ expect(parameterNames[1], 'y');
+ expect(parameterTypes[1], 'int');
expect(suggestion.requiredParameterCount, 1);
expect(suggestion.hasNamedParameters, false);
}
@@ -2774,11 +2776,13 @@
void main() {new C().^}''');
await computeSuggestions();
var suggestion = assertSuggestMethod('m', 'C', 'void');
- expect(suggestion.parameterNames, hasLength(2));
- expect(suggestion.parameterNames[0], 'x');
- expect(suggestion.parameterTypes[0], 'dynamic');
- expect(suggestion.parameterNames[1], 'y');
- expect(suggestion.parameterTypes[1], 'int');
+ var parameterNames = suggestion.parameterNames!;
+ var parameterTypes = suggestion.parameterTypes!;
+ expect(parameterNames, hasLength(2));
+ expect(parameterNames[0], 'x');
+ expect(parameterTypes[0], 'dynamic');
+ expect(parameterNames[1], 'y');
+ expect(parameterTypes[1], 'int');
expect(suggestion.requiredParameterCount, 0);
expect(suggestion.hasNamedParameters, true);
}
@@ -2805,11 +2809,13 @@
void main() {new C().^}''');
await computeSuggestions();
var suggestion = assertSuggestMethod('m', 'C', 'void');
- expect(suggestion.parameterNames, hasLength(2));
- expect(suggestion.parameterNames[0], 'x');
- expect(suggestion.parameterTypes[0], 'dynamic');
- expect(suggestion.parameterNames[1], 'y');
- expect(suggestion.parameterTypes[1], 'int');
+ var parameterNames = suggestion.parameterNames!;
+ var parameterTypes = suggestion.parameterTypes!;
+ expect(parameterNames, hasLength(2));
+ expect(parameterNames[0], 'x');
+ expect(parameterTypes[0], 'dynamic');
+ expect(parameterNames[1], 'y');
+ expect(parameterTypes[1], 'int');
expect(suggestion.requiredParameterCount, 0);
expect(suggestion.hasNamedParameters, false);
}
@@ -2822,11 +2828,13 @@
void main() {new C().^}''');
await computeSuggestions();
var suggestion = assertSuggestMethod('m', 'C', 'void');
- expect(suggestion.parameterNames, hasLength(2));
- expect(suggestion.parameterNames[0], 'x');
- expect(suggestion.parameterTypes[0], 'dynamic');
- expect(suggestion.parameterNames[1], 'y');
- expect(suggestion.parameterTypes[1], 'int');
+ var parameterNames = suggestion.parameterNames!;
+ var parameterTypes = suggestion.parameterTypes!;
+ expect(parameterNames, hasLength(2));
+ expect(parameterNames[0], 'x');
+ expect(parameterTypes[0], 'dynamic');
+ expect(parameterNames[1], 'y');
+ expect(parameterTypes[1], 'int');
expect(suggestion.requiredParameterCount, 2);
expect(suggestion.hasNamedParameters, false);
}
@@ -3543,7 +3551,7 @@
import "a.dart";
class X {foo(){A^.bar}}''');
await computeSuggestions();
- expect(replacementOffset, completionOffset - 1);
+ expect(replacementOffset, completionOffset! - 1);
expect(replacementLength, 1);
assertNotSuggested('A');
assertNotSuggested('X');
@@ -3661,7 +3669,7 @@
// SimpleIdentifier MethodInvocation PropertyAccess ExpressionStatement
addTestSource('class A {a() {"hello".to^String().length}}');
await computeSuggestions();
- expect(replacementOffset, completionOffset - 2);
+ expect(replacementOffset, completionOffset! - 2);
expect(replacementLength, 8);
assertSuggestGetter('length', 'int');
assertNotSuggested('A');
@@ -4024,7 +4032,7 @@
m(X x) {} I _n(X x) {}}
class X{}''');
await computeSuggestions();
- expect(replacementOffset, completionOffset - 1);
+ expect(replacementOffset, completionOffset! - 1);
expect(replacementLength, 1);
// Contributed by FieldFormalConstructorContributor
assertNotSuggested('b');
@@ -4172,7 +4180,7 @@
class C<E> {}
main() { C<C^> c; }''');
await computeSuggestions();
- expect(replacementOffset, completionOffset - 1);
+ expect(replacementOffset, completionOffset! - 1);
expect(replacementLength, 1);
assertNotSuggested('C1');
assertNotSuggested('C2');
diff --git a/pkg/analysis_server/test/services/completion/dart/uri_contributor_test.dart b/pkg/analysis_server/test/services/completion/dart/uri_contributor_test.dart
index ab0b151..513eb6d 100644
--- a/pkg/analysis_server/test/services/completion/dart/uri_contributor_test.dart
+++ b/pkg/analysis_server/test/services/completion/dart/uri_contributor_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/provisional/completion/dart/completion_dart.dart';
import 'package:analysis_server/src/services/completion/dart/uri_contributor.dart';
import 'package:analyzer/file_system/memory_file_system.dart';
@@ -120,7 +118,7 @@
Future<void> test_import_dart() async {
addTestSource('import "d^" import');
await computeSuggestions();
- expect(replacementOffset, completionOffset - 1);
+ expect(replacementOffset, completionOffset! - 1);
expect(replacementLength, 1);
assertSuggest('dart:', csKind: CompletionSuggestionKind.IMPORT);
assertSuggest('dart:core', csKind: CompletionSuggestionKind.IMPORT);
@@ -132,7 +130,7 @@
Future<void> test_import_dart2() async {
addTestSource('import "dart:async"; import "d^"');
await computeSuggestions();
- expect(replacementOffset, completionOffset - 1);
+ expect(replacementOffset, completionOffset! - 1);
expect(replacementLength, 1);
assertSuggest('dart:', csKind: CompletionSuggestionKind.IMPORT);
assertSuggest('dart:core', csKind: CompletionSuggestionKind.IMPORT);
@@ -167,7 +165,7 @@
addTestSource('import "..^" import');
await computeSuggestions();
- expect(replacementOffset, completionOffset - 2);
+ expect(replacementOffset, completionOffset! - 2);
expect(replacementLength, 2);
assertNotSuggested('completion.dart');
assertSuggest('other.dart', csKind: CompletionSuggestionKind.IMPORT);
@@ -185,7 +183,7 @@
addTestSource('import "foo/^" import');
await computeSuggestions();
- expect(replacementOffset, completionOffset - 4);
+ expect(replacementOffset, completionOffset! - 4);
expect(replacementLength, 4);
assertNotSuggested('completion.dart');
assertNotSuggested('other.dart');
@@ -203,7 +201,7 @@
addTestSource('import "../^" import');
await computeSuggestions();
- expect(replacementOffset, completionOffset - 3);
+ expect(replacementOffset, completionOffset! - 3);
expect(replacementLength, 3);
assertNotSuggested('completion.dart');
assertNotSuggested('other.dart');
@@ -224,7 +222,7 @@
addTestSource('import "../^" import');
await computeSuggestions();
- expect(replacementOffset, completionOffset - 3);
+ expect(replacementOffset, completionOffset! - 3);
expect(replacementLength, 3);
assertNotSuggested('completion.dart');
assertNotSuggested('other.dart');
@@ -243,7 +241,7 @@
addTestSource('import "../b^" import');
await computeSuggestions();
- expect(replacementOffset, completionOffset - 4);
+ expect(replacementOffset, completionOffset! - 4);
expect(replacementLength, 4);
assertNotSuggested('completion.dart');
assertNotSuggested('other.dart');
@@ -287,7 +285,7 @@
addTestSource('import "p^" import');
await computeSuggestions();
- expect(replacementOffset, completionOffset - 1);
+ expect(replacementOffset, completionOffset! - 1);
expect(replacementLength, 1);
assertSuggest('package:', csKind: CompletionSuggestionKind.IMPORT);
assertSuggest('package:foo/', csKind: CompletionSuggestionKind.IMPORT);
@@ -355,7 +353,7 @@
await computeSuggestions();
assertSuggest('package:foo/baz/too.dart',
csKind: CompletionSuggestionKind.IMPORT);
- expect(replacementOffset, completionOffset - 16);
+ expect(replacementOffset, completionOffset! - 16);
expect(replacementLength, 5 + 16);
}
@@ -368,7 +366,7 @@
addTestSource('import "p^" class');
await computeSuggestions();
- expect(replacementOffset, completionOffset - 1);
+ expect(replacementOffset, completionOffset! - 1);
expect(replacementLength, 1);
assertSuggest('package:', csKind: CompletionSuggestionKind.IMPORT);
assertSuggest('package:bar/', csKind: CompletionSuggestionKind.IMPORT);
@@ -390,7 +388,7 @@
addTestSource('import r"p^" import');
await computeSuggestions();
- expect(replacementOffset, completionOffset - 1);
+ expect(replacementOffset, completionOffset! - 1);
expect(replacementLength, 1);
assertSuggest('package:', csKind: CompletionSuggestionKind.IMPORT);
assertSuggest('package:foo/', csKind: CompletionSuggestionKind.IMPORT);
@@ -449,7 +447,7 @@
Future<void> test_import_without_closing_quote_eof3() async {
addTestSource('import "d^');
await computeSuggestions();
- expect(replacementOffset, completionOffset - 1);
+ expect(replacementOffset, completionOffset! - 1);
expect(replacementLength, 1);
assertSuggest('dart:', csKind: CompletionSuggestionKind.IMPORT);
assertSuggest('package:', csKind: CompletionSuggestionKind.IMPORT);
@@ -458,7 +456,7 @@
Future<void> test_import_without_closing_quote_eof4() async {
addTestSource('import "d^"');
await computeSuggestions();
- expect(replacementOffset, completionOffset - 1);
+ expect(replacementOffset, completionOffset! - 1);
expect(replacementLength, 1);
assertSuggest('dart:', csKind: CompletionSuggestionKind.IMPORT);
assertSuggest('package:', csKind: CompletionSuggestionKind.IMPORT);
@@ -502,7 +500,7 @@
addTestSource('library x; part "..^" import');
await computeSuggestions();
- expect(replacementOffset, completionOffset - 2);
+ expect(replacementOffset, completionOffset! - 2);
expect(replacementLength, 2);
assertNotSuggested('completion.dart');
assertSuggest('other.dart', csKind: CompletionSuggestionKind.IMPORT);
@@ -520,7 +518,7 @@
addTestSource('library x; part "foo/^" import');
await computeSuggestions();
- expect(replacementOffset, completionOffset - 4);
+ expect(replacementOffset, completionOffset! - 4);
expect(replacementLength, 4);
assertNotSuggested('completion.dart');
assertNotSuggested('other.dart');
@@ -538,7 +536,7 @@
addTestSource('library x; part "../^" import');
await computeSuggestions();
- expect(replacementOffset, completionOffset - 3);
+ expect(replacementOffset, completionOffset! - 3);
expect(replacementLength, 3);
assertNotSuggested('completion.dart');
assertNotSuggested('other.dart');
@@ -587,7 +585,7 @@
addTestSource('import "..^" import');
await computeSuggestions();
- expect(replacementOffset, completionOffset - 2);
+ expect(replacementOffset, completionOffset! - 2);
expect(replacementLength, 2);
assertNotSuggested('completion.dart');
assertSuggest('other.dart', csKind: CompletionSuggestionKind.IMPORT);
@@ -605,7 +603,7 @@
addTestSource('import "foo/^" import');
await computeSuggestions();
- expect(replacementOffset, completionOffset - 4);
+ expect(replacementOffset, completionOffset! - 4);
expect(replacementLength, 4);
assertNotSuggested('completion.dart');
assertNotSuggested('other.dart');
@@ -623,7 +621,7 @@
addTestSource('import "../^" import');
await computeSuggestions();
- expect(replacementOffset, completionOffset - 3);
+ expect(replacementOffset, completionOffset! - 3);
expect(replacementLength, 3);
assertNotSuggested('completion.dart');
assertNotSuggested('other.dart');
@@ -641,7 +639,7 @@
addTestSource('import "../b^" import');
await computeSuggestions();
- expect(replacementOffset, completionOffset - 4);
+ expect(replacementOffset, completionOffset! - 4);
expect(replacementLength, 4);
assertNotSuggested('completion.dart');
assertNotSuggested('other.dart');
@@ -677,7 +675,7 @@
addTestSource('library x; part "..^" import');
await computeSuggestions();
- expect(replacementOffset, completionOffset - 2);
+ expect(replacementOffset, completionOffset! - 2);
expect(replacementLength, 2);
assertNotSuggested('completion.dart');
assertSuggest('other.dart', csKind: CompletionSuggestionKind.IMPORT);
@@ -695,7 +693,7 @@
addTestSource('library x; part "foo/^" import');
await computeSuggestions();
- expect(replacementOffset, completionOffset - 4);
+ expect(replacementOffset, completionOffset! - 4);
expect(replacementLength, 4);
assertNotSuggested('completion.dart');
assertNotSuggested('other.dart');
@@ -713,7 +711,7 @@
addTestSource('library x; part "../^" import');
await computeSuggestions();
- expect(replacementOffset, completionOffset - 3);
+ expect(replacementOffset, completionOffset! - 3);
expect(replacementLength, 3);
assertNotSuggested('completion.dart');
assertNotSuggested('other.dart');
diff --git a/pkg/analysis_server/test/services/completion/dart/variable_name_contributor_test.dart b/pkg/analysis_server/test/services/completion/dart/variable_name_contributor_test.dart
index 5f252da..09ab271 100644
--- a/pkg/analysis_server/test/services/completion/dart/variable_name_contributor_test.dart
+++ b/pkg/analysis_server/test/services/completion/dart/variable_name_contributor_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/provisional/completion/dart/completion_dart.dart';
import 'package:analysis_server/src/services/completion/dart/variable_name_contributor.dart';
import 'package:test/test.dart';
@@ -215,7 +213,7 @@
f() { for(AbstractCrazyNonsenseClassName a^) {} }
''');
await computeSuggestions();
- expect(replacementOffset, completionOffset - 1);
+ expect(replacementOffset, completionOffset! - 1);
expect(replacementLength, 1);
assertSuggestName('abstractCrazyNonsenseClassName');
assertSuggestName('crazyNonsenseClassName');
@@ -236,7 +234,7 @@
f() { for(prefix.AbstractCrazyNonsenseClassName ^) {} }
''');
await computeSuggestions();
- expect(replacementOffset, completionOffset - 1);
+ expect(replacementOffset, completionOffset! - 1);
expect(replacementLength, 1);
assertSuggestName('abstractCrazyNonsenseClassName');
assertSuggestName('crazyNonsenseClassName');
@@ -256,7 +254,7 @@
f() { for(prefix.AbstractCrazyNonsenseClassName a^) {} }
''');
await computeSuggestions();
- expect(replacementOffset, completionOffset - 1);
+ expect(replacementOffset, completionOffset! - 1);
expect(replacementLength, 1);
assertSuggestName('abstractCrazyNonsenseClassName');
assertSuggestName('crazyNonsenseClassName');
@@ -365,7 +363,7 @@
AbstractCrazyNonsenseClassName abs^
''');
await computeSuggestions();
- expect(replacementOffset, completionOffset - 3);
+ expect(replacementOffset, completionOffset! - 3);
expect(replacementLength, 3);
assertSuggestName('abstractCrazyNonsenseClassName');
assertSuggestName('crazyNonsenseClassName');
@@ -385,7 +383,7 @@
AbstractCrazyNonsenseClassName abs^
''');
await computeSuggestions();
- expect(replacementOffset, completionOffset - 3);
+ expect(replacementOffset, completionOffset! - 3);
expect(replacementLength, 3);
assertSuggestName('abstractCrazyNonsenseClassName');
assertSuggestName('crazyNonsenseClassName');
diff --git a/pkg/analysis_server/test/stress/completion/completion.dart b/pkg/analysis_server/test/stress/completion/completion.dart
index 2f5fee0..41fc4ef 100644
--- a/pkg/analysis_server/test/stress/completion/completion.dart
+++ b/pkg/analysis_server/test/stress/completion/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 'dart:io';
import 'package:args/args.dart';
@@ -63,7 +61,7 @@
}
/// Print usage information for this tool.
-void printUsage(ArgParser parser, {String error}) {
+void printUsage(ArgParser parser, {String? error}) {
if (error != null) {
print(error);
print('');
diff --git a/pkg/analysis_server/test/stress/completion/completion_runner.dart b/pkg/analysis_server/test/stress/completion/completion_runner.dart
index 0de5088..4a5cf3b 100644
--- a/pkg/analysis_server/test/stress/completion/completion_runner.dart
+++ b/pkg/analysis_server/test/stress/completion/completion_runner.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/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';
@@ -13,7 +11,6 @@
import 'package:analyzer/dart/ast/visitor.dart';
import 'package:analyzer/file_system/overlay_file_system.dart';
import 'package:analyzer/file_system/physical_file_system.dart';
-import 'package:analyzer/source/line_info.dart';
import 'package:analyzer_plugin/protocol/protocol_common.dart';
/// A runner that can request code completion at the location of each identifier
@@ -41,11 +38,11 @@
/// Initialize a newly created completion runner.
CompletionRunner(
- {StringSink output,
- bool printMissing,
- bool printQuality,
- bool timing,
- bool verbose})
+ {StringSink? output,
+ bool? printMissing,
+ bool? printQuality,
+ bool? timing,
+ bool? verbose})
: output = output ?? NullStringSink(),
printMissing = printMissing ?? false,
printQuality = printQuality ?? false,
@@ -83,9 +80,9 @@
fileCount++;
output.write('.');
var result = await context.currentSession.getResolvedUnit(path);
- var content = result.content;
+ var content = result.content!;
var lineInfo = result.lineInfo;
- var identifiers = _identifiersIn(result.unit);
+ var identifiers = _identifiersIn(result.unit!);
for (var identifier in identifiers) {
identifierCount++;
@@ -118,7 +115,7 @@
if (index < 0) {
missingCount++;
if (printMissing) {
- CharacterLocation location = lineInfo.getLocation(offset);
+ var location = lineInfo.getLocation(offset);
output.writeln('Missing suggestion of "${identifier.name}" at '
'$path:${location.lineNumber}:${location.columnNumber}');
if (verbose) {
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 1a2a02f..daf190f 100644
--- a/pkg/front_end/lib/src/fasta/kernel/constant_evaluator.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/constant_evaluator.dart
@@ -1050,6 +1050,27 @@
'No valid constant returned from the execution of $statement.');
}
+ /// Returns [null] on success and an error-"constant" on failure, as such the
+ /// return value should be checked.
+ AbortConstant executeConstructorBody(Constructor constructor) {
+ final Statement body = constructor.function.body;
+ StatementConstantEvaluator statementEvaluator =
+ new StatementConstantEvaluator(this);
+ ExecutionStatus status = body.accept(statementEvaluator);
+ if (status is AbortStatus) {
+ return status.error;
+ } else if (status is ReturnStatus) {
+ if (status.value == null) return null;
+ // Should not be reachable.
+ return createInvalidExpressionConstant(
+ constructor, "Constructors can't have a return value.");
+ } else if (status is! ProceedStatus) {
+ return createInvalidExpressionConstant(
+ constructor, "Invalid execution status of constructor body.");
+ }
+ return null;
+ }
+
/// Create an error-constant indicating that an error has been detected during
/// constant evaluation.
AbortConstant createErrorConstant(TreeNode node, Message message,
@@ -1508,7 +1529,8 @@
node, 'Non-const constructor invocation.');
}
if (constructor.function.body != null &&
- constructor.function.body is! EmptyStatement) {
+ constructor.function.body is! EmptyStatement &&
+ !enableConstFunctions) {
// Probably unreachable.
return createInvalidExpressionConstant(
node,
@@ -1822,6 +1844,12 @@
for (UnevaluatedConstant constant in env.unevaluatedUnreadConstants) {
instanceBuilder.unusedArguments.add(extract(constant));
}
+
+ if (enableConstFunctions && constructor.function != null) {
+ AbortConstant error = executeConstructorBody(constructor);
+ if (error != null) return error;
+ }
+
return null;
});
}
@@ -3442,6 +3470,10 @@
}
@override
+ ExecutionStatus visitEmptyStatement(EmptyStatement node) =>
+ const ProceedStatus();
+
+ @override
ExecutionStatus visitFunctionDeclaration(FunctionDeclaration node) {
final EvaluationEnvironment newEnv =
new EvaluationEnvironment.withParent(exprEvaluator.env);
@@ -3514,8 +3546,13 @@
}
@override
- ExecutionStatus visitReturnStatement(ReturnStatement node) =>
- new ReturnStatus(evaluate(node.expression));
+ ExecutionStatus visitReturnStatement(ReturnStatement node) {
+ Constant result;
+ if (node.expression != null) {
+ result = evaluate(node.expression);
+ }
+ return new ReturnStatus(result);
+ }
@override
ExecutionStatus visitSwitchStatement(SwitchStatement node) {
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 6e7b86a..da66b2a 100644
--- a/pkg/front_end/lib/src/fasta/source/outline_builder.dart
+++ b/pkg/front_end/lib/src/fasta/source/outline_builder.dart
@@ -1176,7 +1176,9 @@
declarationBuilder.resolveTypes(typeVariables, libraryBuilder);
if (constructorName != null) {
- if (isConst && bodyKind != MethodBody.Abstract) {
+ if (isConst &&
+ bodyKind != MethodBody.Abstract &&
+ !libraryBuilder.enableConstFunctionsInLibrary) {
addProblem(messageConstConstructorWithBody, varFinalOrConstOffset, 5);
modifiers &= ~constMask;
}
diff --git a/pkg/front_end/testcases/const_functions/const_functions_const_ctor.dart b/pkg/front_end/testcases/const_functions/const_functions_const_ctor.dart
new file mode 100644
index 0000000..775b623
--- /dev/null
+++ b/pkg/front_end/testcases/const_functions/const_functions_const_ctor.dart
@@ -0,0 +1,28 @@
+// 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 const constructors with a body which are enabled with const functions.
+
+import "package:expect/expect.dart";
+
+const printString = "print";
+const var1 = Simple(printString);
+class Simple {
+ final String name;
+
+ const Simple(this.name) {
+ assert(this.name == printString);
+ }
+}
+
+const var2 = A();
+class A {
+ const A() {
+ return;
+ }
+}
+
+void main() {
+ Expect.equals(var1.name, printString);
+}
diff --git a/pkg/front_end/testcases/const_functions/const_functions_const_ctor.dart.strong.expect b/pkg/front_end/testcases/const_functions/const_functions_const_ctor.dart.strong.expect
new file mode 100644
index 0000000..3ad815a
--- /dev/null
+++ b/pkg/front_end/testcases/const_functions/const_functions_const_ctor.dart.strong.expect
@@ -0,0 +1,39 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+import "package:expect/expect.dart" as exp;
+
+import "package:expect/expect.dart";
+
+class Simple extends core::Object /*hasConstConstructor*/ {
+ final field core::String name;
+ const constructor •(core::String name) → self::Simple
+ : self::Simple::name = name, super core::Object::•() {
+ assert(this.{self::Simple::name}.{core::String::==}(#C1));
+ }
+}
+class A extends core::Object /*hasConstConstructor*/ {
+ const constructor •() → self::A
+ : super core::Object::•() {
+ return;
+ }
+}
+static const field core::String printString = #C1;
+static const field self::Simple var1 = #C2;
+static const field self::A var2 = #C3;
+static method main() → void {
+ exp::Expect::equals((#C2).{self::Simple::name}, #C1);
+}
+
+constants {
+ #C1 = "print"
+ #C2 = self::Simple {name:#C1}
+ #C3 = self::A {}
+}
+
+
+Constructor coverage from constants:
+org-dartlang-testcase:///const_functions_const_ctor.dart:
+- Simple. (from org-dartlang-testcase:///const_functions_const_ctor.dart:14:9)
+- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
+- A. (from org-dartlang-testcase:///const_functions_const_ctor.dart:21:9)
diff --git a/pkg/front_end/testcases/const_functions/const_functions_const_ctor.dart.strong.transformed.expect b/pkg/front_end/testcases/const_functions/const_functions_const_ctor.dart.strong.transformed.expect
new file mode 100644
index 0000000..3ad815a
--- /dev/null
+++ b/pkg/front_end/testcases/const_functions/const_functions_const_ctor.dart.strong.transformed.expect
@@ -0,0 +1,39 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+import "package:expect/expect.dart" as exp;
+
+import "package:expect/expect.dart";
+
+class Simple extends core::Object /*hasConstConstructor*/ {
+ final field core::String name;
+ const constructor •(core::String name) → self::Simple
+ : self::Simple::name = name, super core::Object::•() {
+ assert(this.{self::Simple::name}.{core::String::==}(#C1));
+ }
+}
+class A extends core::Object /*hasConstConstructor*/ {
+ const constructor •() → self::A
+ : super core::Object::•() {
+ return;
+ }
+}
+static const field core::String printString = #C1;
+static const field self::Simple var1 = #C2;
+static const field self::A var2 = #C3;
+static method main() → void {
+ exp::Expect::equals((#C2).{self::Simple::name}, #C1);
+}
+
+constants {
+ #C1 = "print"
+ #C2 = self::Simple {name:#C1}
+ #C3 = self::A {}
+}
+
+
+Constructor coverage from constants:
+org-dartlang-testcase:///const_functions_const_ctor.dart:
+- Simple. (from org-dartlang-testcase:///const_functions_const_ctor.dart:14:9)
+- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
+- A. (from org-dartlang-testcase:///const_functions_const_ctor.dart:21:9)
diff --git a/pkg/front_end/testcases/const_functions/const_functions_const_ctor.dart.textual_outline.expect b/pkg/front_end/testcases/const_functions/const_functions_const_ctor.dart.textual_outline.expect
new file mode 100644
index 0000000..bbb2129
--- /dev/null
+++ b/pkg/front_end/testcases/const_functions/const_functions_const_ctor.dart.textual_outline.expect
@@ -0,0 +1,12 @@
+import "package:expect/expect.dart";
+const printString = "print";
+const var1 = Simple(printString);
+class Simple {
+ final String name;
+ const Simple(this.name) {}
+}
+const var2 = A();
+class A {
+ const A() {}
+}
+void main() {}
diff --git a/pkg/front_end/testcases/const_functions/const_functions_const_ctor.dart.weak.expect b/pkg/front_end/testcases/const_functions/const_functions_const_ctor.dart.weak.expect
new file mode 100644
index 0000000..3ad815a
--- /dev/null
+++ b/pkg/front_end/testcases/const_functions/const_functions_const_ctor.dart.weak.expect
@@ -0,0 +1,39 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+import "package:expect/expect.dart" as exp;
+
+import "package:expect/expect.dart";
+
+class Simple extends core::Object /*hasConstConstructor*/ {
+ final field core::String name;
+ const constructor •(core::String name) → self::Simple
+ : self::Simple::name = name, super core::Object::•() {
+ assert(this.{self::Simple::name}.{core::String::==}(#C1));
+ }
+}
+class A extends core::Object /*hasConstConstructor*/ {
+ const constructor •() → self::A
+ : super core::Object::•() {
+ return;
+ }
+}
+static const field core::String printString = #C1;
+static const field self::Simple var1 = #C2;
+static const field self::A var2 = #C3;
+static method main() → void {
+ exp::Expect::equals((#C2).{self::Simple::name}, #C1);
+}
+
+constants {
+ #C1 = "print"
+ #C2 = self::Simple {name:#C1}
+ #C3 = self::A {}
+}
+
+
+Constructor coverage from constants:
+org-dartlang-testcase:///const_functions_const_ctor.dart:
+- Simple. (from org-dartlang-testcase:///const_functions_const_ctor.dart:14:9)
+- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
+- A. (from org-dartlang-testcase:///const_functions_const_ctor.dart:21:9)
diff --git a/pkg/front_end/testcases/const_functions/const_functions_const_ctor.dart.weak.outline.expect b/pkg/front_end/testcases/const_functions/const_functions_const_ctor.dart.weak.outline.expect
new file mode 100644
index 0000000..7c13957
--- /dev/null
+++ b/pkg/front_end/testcases/const_functions/const_functions_const_ctor.dart.weak.outline.expect
@@ -0,0 +1,28 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+import "package:expect/expect.dart";
+
+class Simple extends core::Object /*hasConstConstructor*/ {
+ final field core::String name;
+ const constructor •(core::String name) → self::Simple
+ : self::Simple::name = name, super core::Object::•()
+ ;
+}
+class A extends core::Object /*hasConstConstructor*/ {
+ const constructor •() → self::A
+ : super core::Object::•()
+ ;
+}
+static const field core::String printString = "print";
+static const field self::Simple var1 = const self::Simple::•(self::printString);
+static const field self::A var2 = const self::A::•();
+static method main() → void
+ ;
+
+
+Extra constant evaluation status:
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///const_functions_const_ctor.dart:10:14 -> InstanceConstant(const Simple{Simple.name: "print"})
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///const_functions_const_ctor.dart:19:14 -> InstanceConstant(const A{})
+Extra constant evaluation: evaluated: 3, effectively constant: 2
diff --git a/pkg/front_end/testcases/const_functions/const_functions_const_ctor.dart.weak.transformed.expect b/pkg/front_end/testcases/const_functions/const_functions_const_ctor.dart.weak.transformed.expect
new file mode 100644
index 0000000..3ad815a
--- /dev/null
+++ b/pkg/front_end/testcases/const_functions/const_functions_const_ctor.dart.weak.transformed.expect
@@ -0,0 +1,39 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+import "package:expect/expect.dart" as exp;
+
+import "package:expect/expect.dart";
+
+class Simple extends core::Object /*hasConstConstructor*/ {
+ final field core::String name;
+ const constructor •(core::String name) → self::Simple
+ : self::Simple::name = name, super core::Object::•() {
+ assert(this.{self::Simple::name}.{core::String::==}(#C1));
+ }
+}
+class A extends core::Object /*hasConstConstructor*/ {
+ const constructor •() → self::A
+ : super core::Object::•() {
+ return;
+ }
+}
+static const field core::String printString = #C1;
+static const field self::Simple var1 = #C2;
+static const field self::A var2 = #C3;
+static method main() → void {
+ exp::Expect::equals((#C2).{self::Simple::name}, #C1);
+}
+
+constants {
+ #C1 = "print"
+ #C2 = self::Simple {name:#C1}
+ #C3 = self::A {}
+}
+
+
+Constructor coverage from constants:
+org-dartlang-testcase:///const_functions_const_ctor.dart:
+- Simple. (from org-dartlang-testcase:///const_functions_const_ctor.dart:14:9)
+- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
+- A. (from org-dartlang-testcase:///const_functions_const_ctor.dart:21:9)
diff --git a/pkg/front_end/testcases/const_functions/const_functions_const_ctor_error.dart b/pkg/front_end/testcases/const_functions/const_functions_const_ctor_error.dart
new file mode 100644
index 0000000..642c066
--- /dev/null
+++ b/pkg/front_end/testcases/const_functions/const_functions_const_ctor_error.dart
@@ -0,0 +1,41 @@
+// 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 const constructors with a body which are enabled with const
+// functions.
+
+import "package:expect/expect.dart";
+
+const printString = "print";
+
+const var1 = Simple(printString);
+class Simple {
+ final String name;
+
+ const Simple(this.name) {
+ assert(this.name != printString);
+ }
+}
+
+const var2 = Simple2(printString);
+class Simple2 {
+ final String name;
+
+ const Simple2(this.name) {
+ return Simple2(this.name);
+ }
+}
+
+const var3 = B();
+class A {
+ const A() {
+ assert(1 == 2);
+ }
+}
+
+class B extends A {
+ const B() : super();
+}
+
+void main() {}
diff --git a/pkg/front_end/testcases/const_functions/const_functions_const_ctor_error.dart.strong.expect b/pkg/front_end/testcases/const_functions/const_functions_const_ctor_error.dart.strong.expect
new file mode 100644
index 0000000..fde5c0dd
--- /dev/null
+++ b/pkg/front_end/testcases/const_functions/const_functions_const_ctor_error.dart.strong.expect
@@ -0,0 +1,83 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/const_functions/const_functions_const_ctor_error.dart:26:5: Error: Constructors can't have a return type.
+// Try removing the return type.
+// return Simple2(this.name);
+// ^
+//
+// pkg/front_end/testcases/const_functions/const_functions_const_ctor_error.dart:12:14: Error: Constant evaluation error:
+// const var1 = Simple(printString);
+// ^
+// pkg/front_end/testcases/const_functions/const_functions_const_ctor_error.dart:17:22: Context: This assertion failed.
+// assert(this.name != printString);
+// ^
+// pkg/front_end/testcases/const_functions/const_functions_const_ctor_error.dart:12:7: Context: While analyzing:
+// const var1 = Simple(printString);
+// ^
+//
+// pkg/front_end/testcases/const_functions/const_functions_const_ctor_error.dart:30:14: Error: Constant evaluation error:
+// const var3 = B();
+// ^
+// pkg/front_end/testcases/const_functions/const_functions_const_ctor_error.dart:33:14: Context: This assertion failed.
+// assert(1 == 2);
+// ^
+// pkg/front_end/testcases/const_functions/const_functions_const_ctor_error.dart:30:7: Context: While analyzing:
+// const var3 = B();
+// ^
+//
+import self as self;
+import "dart:core" as core;
+
+import "package:expect/expect.dart";
+
+class Simple extends core::Object /*hasConstConstructor*/ {
+ final field core::String name;
+ const constructor •(core::String name) → self::Simple
+ : self::Simple::name = name, super core::Object::•() {
+ assert(!this.{self::Simple::name}.{core::String::==}(#C1));
+ }
+}
+class Simple2 extends core::Object /*hasConstConstructor*/ {
+ final field core::String name;
+ const constructor •(core::String name) → self::Simple2
+ : self::Simple2::name = name, super core::Object::•() {
+ invalid-expression "pkg/front_end/testcases/const_functions/const_functions_const_ctor_error.dart:26:5: Error: Constructors can't have a return type.
+Try removing the return type.
+ return Simple2(this.name);
+ ^";
+ }
+}
+class A extends core::Object /*hasConstConstructor*/ {
+ const constructor •() → self::A
+ : super core::Object::•() {
+ assert(1.{core::num::==}(2));
+ }
+}
+class B extends self::A /*hasConstConstructor*/ {
+ const constructor •() → self::B
+ : super self::A::•()
+ ;
+}
+static const field core::String printString = #C1;
+static const field self::Simple var1 = invalid-expression "This assertion failed.";
+static const field self::Simple2 var2 = invalid-expression "pkg/front_end/testcases/const_functions/const_functions_const_ctor_error.dart:26:5: Error: Constructors can't have a return type.
+Try removing the return type.
+ return Simple2(this.name);
+ ^";
+static const field self::B var3 = invalid-expression "This assertion failed.";
+static method main() → void {}
+
+constants {
+ #C1 = "print"
+}
+
+
+Constructor coverage from constants:
+org-dartlang-testcase:///const_functions_const_ctor_error.dart:
+- Simple. (from org-dartlang-testcase:///const_functions_const_ctor_error.dart:16:9)
+- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
+- Simple2. (from org-dartlang-testcase:///const_functions_const_ctor_error.dart:25:9)
+- B. (from org-dartlang-testcase:///const_functions_const_ctor_error.dart:38:9)
+- A. (from org-dartlang-testcase:///const_functions_const_ctor_error.dart:32:9)
diff --git a/pkg/front_end/testcases/const_functions/const_functions_const_ctor_error.dart.strong.transformed.expect b/pkg/front_end/testcases/const_functions/const_functions_const_ctor_error.dart.strong.transformed.expect
new file mode 100644
index 0000000..aac0f05
--- /dev/null
+++ b/pkg/front_end/testcases/const_functions/const_functions_const_ctor_error.dart.strong.transformed.expect
@@ -0,0 +1,87 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/const_functions/const_functions_const_ctor_error.dart:26:5: Error: Constructors can't have a return type.
+// Try removing the return type.
+// return Simple2(this.name);
+// ^
+//
+// pkg/front_end/testcases/const_functions/const_functions_const_ctor_error.dart:12:14: Error: Constant evaluation error:
+// const var1 = Simple(printString);
+// ^
+// pkg/front_end/testcases/const_functions/const_functions_const_ctor_error.dart:17:22: Context: This assertion failed.
+// assert(this.name != printString);
+// ^
+// pkg/front_end/testcases/const_functions/const_functions_const_ctor_error.dart:12:7: Context: While analyzing:
+// const var1 = Simple(printString);
+// ^
+//
+// pkg/front_end/testcases/const_functions/const_functions_const_ctor_error.dart:30:14: Error: Constant evaluation error:
+// const var3 = B();
+// ^
+// pkg/front_end/testcases/const_functions/const_functions_const_ctor_error.dart:33:14: Context: This assertion failed.
+// assert(1 == 2);
+// ^
+// pkg/front_end/testcases/const_functions/const_functions_const_ctor_error.dart:30:7: Context: While analyzing:
+// const var3 = B();
+// ^
+//
+import self as self;
+import "dart:core" as core;
+
+import "package:expect/expect.dart";
+
+class Simple extends core::Object /*hasConstConstructor*/ {
+ final field core::String name;
+ const constructor •(core::String name) → self::Simple
+ : self::Simple::name = name, super core::Object::•() {
+ assert(!this.{self::Simple::name}.{core::String::==}(#C1));
+ }
+}
+class Simple2 extends core::Object /*hasConstConstructor*/ {
+ final field core::String name;
+ const constructor •(core::String name) → self::Simple2
+ : self::Simple2::name = name, super core::Object::•() {
+ invalid-expression "pkg/front_end/testcases/const_functions/const_functions_const_ctor_error.dart:26:5: Error: Constructors can't have a return type.
+Try removing the return type.
+ return Simple2(this.name);
+ ^";
+ }
+}
+class A extends core::Object /*hasConstConstructor*/ {
+ const constructor •() → self::A
+ : super core::Object::•() {
+ assert(1.{core::num::==}(2));
+ }
+}
+class B extends self::A /*hasConstConstructor*/ {
+ const constructor •() → self::B
+ : super self::A::•()
+ ;
+}
+static const field core::String printString = #C1;
+static const field self::Simple var1 = invalid-expression "This assertion failed.";
+static const field self::Simple2 var2 = invalid-expression "pkg/front_end/testcases/const_functions/const_functions_const_ctor_error.dart:26:5: Error: Constructors can't have a return type.
+Try removing the return type.
+ return Simple2(this.name);
+ ^";
+static const field self::B var3 = invalid-expression "This assertion failed.";
+static method main() → void {}
+
+constants {
+ #C1 = "print"
+}
+
+Extra constant evaluation status:
+Evaluated: MethodInvocation @ org-dartlang-testcase:///const_functions_const_ctor_error.dart:33:14 -> BoolConstant(false)
+Extra constant evaluation: evaluated: 7, effectively constant: 1
+
+
+Constructor coverage from constants:
+org-dartlang-testcase:///const_functions_const_ctor_error.dart:
+- Simple. (from org-dartlang-testcase:///const_functions_const_ctor_error.dart:16:9)
+- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
+- Simple2. (from org-dartlang-testcase:///const_functions_const_ctor_error.dart:25:9)
+- B. (from org-dartlang-testcase:///const_functions_const_ctor_error.dart:38:9)
+- A. (from org-dartlang-testcase:///const_functions_const_ctor_error.dart:32:9)
diff --git a/pkg/front_end/testcases/const_functions/const_functions_const_ctor_error.dart.textual_outline.expect b/pkg/front_end/testcases/const_functions/const_functions_const_ctor_error.dart.textual_outline.expect
new file mode 100644
index 0000000..86a66c8
--- /dev/null
+++ b/pkg/front_end/testcases/const_functions/const_functions_const_ctor_error.dart.textual_outline.expect
@@ -0,0 +1,20 @@
+import "package:expect/expect.dart";
+const printString = "print";
+const var1 = Simple(printString);
+class Simple {
+ final String name;
+ const Simple(this.name) {}
+}
+const var2 = Simple2(printString);
+class Simple2 {
+ final String name;
+ const Simple2(this.name) {}
+}
+const var3 = B();
+class A {
+ const A() {}
+}
+class B extends A {
+ const B() : super();
+}
+void main() {}
diff --git a/pkg/front_end/testcases/const_functions/const_functions_const_ctor_error.dart.weak.expect b/pkg/front_end/testcases/const_functions/const_functions_const_ctor_error.dart.weak.expect
new file mode 100644
index 0000000..fde5c0dd
--- /dev/null
+++ b/pkg/front_end/testcases/const_functions/const_functions_const_ctor_error.dart.weak.expect
@@ -0,0 +1,83 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/const_functions/const_functions_const_ctor_error.dart:26:5: Error: Constructors can't have a return type.
+// Try removing the return type.
+// return Simple2(this.name);
+// ^
+//
+// pkg/front_end/testcases/const_functions/const_functions_const_ctor_error.dart:12:14: Error: Constant evaluation error:
+// const var1 = Simple(printString);
+// ^
+// pkg/front_end/testcases/const_functions/const_functions_const_ctor_error.dart:17:22: Context: This assertion failed.
+// assert(this.name != printString);
+// ^
+// pkg/front_end/testcases/const_functions/const_functions_const_ctor_error.dart:12:7: Context: While analyzing:
+// const var1 = Simple(printString);
+// ^
+//
+// pkg/front_end/testcases/const_functions/const_functions_const_ctor_error.dart:30:14: Error: Constant evaluation error:
+// const var3 = B();
+// ^
+// pkg/front_end/testcases/const_functions/const_functions_const_ctor_error.dart:33:14: Context: This assertion failed.
+// assert(1 == 2);
+// ^
+// pkg/front_end/testcases/const_functions/const_functions_const_ctor_error.dart:30:7: Context: While analyzing:
+// const var3 = B();
+// ^
+//
+import self as self;
+import "dart:core" as core;
+
+import "package:expect/expect.dart";
+
+class Simple extends core::Object /*hasConstConstructor*/ {
+ final field core::String name;
+ const constructor •(core::String name) → self::Simple
+ : self::Simple::name = name, super core::Object::•() {
+ assert(!this.{self::Simple::name}.{core::String::==}(#C1));
+ }
+}
+class Simple2 extends core::Object /*hasConstConstructor*/ {
+ final field core::String name;
+ const constructor •(core::String name) → self::Simple2
+ : self::Simple2::name = name, super core::Object::•() {
+ invalid-expression "pkg/front_end/testcases/const_functions/const_functions_const_ctor_error.dart:26:5: Error: Constructors can't have a return type.
+Try removing the return type.
+ return Simple2(this.name);
+ ^";
+ }
+}
+class A extends core::Object /*hasConstConstructor*/ {
+ const constructor •() → self::A
+ : super core::Object::•() {
+ assert(1.{core::num::==}(2));
+ }
+}
+class B extends self::A /*hasConstConstructor*/ {
+ const constructor •() → self::B
+ : super self::A::•()
+ ;
+}
+static const field core::String printString = #C1;
+static const field self::Simple var1 = invalid-expression "This assertion failed.";
+static const field self::Simple2 var2 = invalid-expression "pkg/front_end/testcases/const_functions/const_functions_const_ctor_error.dart:26:5: Error: Constructors can't have a return type.
+Try removing the return type.
+ return Simple2(this.name);
+ ^";
+static const field self::B var3 = invalid-expression "This assertion failed.";
+static method main() → void {}
+
+constants {
+ #C1 = "print"
+}
+
+
+Constructor coverage from constants:
+org-dartlang-testcase:///const_functions_const_ctor_error.dart:
+- Simple. (from org-dartlang-testcase:///const_functions_const_ctor_error.dart:16:9)
+- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
+- Simple2. (from org-dartlang-testcase:///const_functions_const_ctor_error.dart:25:9)
+- B. (from org-dartlang-testcase:///const_functions_const_ctor_error.dart:38:9)
+- A. (from org-dartlang-testcase:///const_functions_const_ctor_error.dart:32:9)
diff --git a/pkg/front_end/testcases/const_functions/const_functions_const_ctor_error.dart.weak.outline.expect b/pkg/front_end/testcases/const_functions/const_functions_const_ctor_error.dart.weak.outline.expect
new file mode 100644
index 0000000..2c363dd
--- /dev/null
+++ b/pkg/front_end/testcases/const_functions/const_functions_const_ctor_error.dart.weak.outline.expect
@@ -0,0 +1,41 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+import "package:expect/expect.dart";
+
+class Simple extends core::Object /*hasConstConstructor*/ {
+ final field core::String name;
+ const constructor •(core::String name) → self::Simple
+ : self::Simple::name = name, super core::Object::•()
+ ;
+}
+class Simple2 extends core::Object /*hasConstConstructor*/ {
+ final field core::String name;
+ const constructor •(core::String name) → self::Simple2
+ : self::Simple2::name = name, super core::Object::•()
+ ;
+}
+class A extends core::Object /*hasConstConstructor*/ {
+ const constructor •() → self::A
+ : super core::Object::•()
+ ;
+}
+class B extends self::A /*hasConstConstructor*/ {
+ const constructor •() → self::B
+ : super self::A::•()
+ ;
+}
+static const field core::String printString = "print";
+static const field self::Simple var1 = const self::Simple::•(self::printString);
+static const field self::Simple2 var2 = const self::Simple2::•(self::printString);
+static const field self::B var3 = const self::B::•();
+static method main() → void
+ ;
+
+
+Extra constant evaluation status:
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///const_functions_const_ctor_error.dart:12:14 -> InstanceConstant(const Simple{Simple.name: "print"})
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///const_functions_const_ctor_error.dart:21:14 -> InstanceConstant(const Simple2{Simple2.name: "print"})
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///const_functions_const_ctor_error.dart:30:14 -> InstanceConstant(const B{})
+Extra constant evaluation: evaluated: 5, effectively constant: 3
diff --git a/pkg/front_end/testcases/const_functions/const_functions_const_ctor_error.dart.weak.transformed.expect b/pkg/front_end/testcases/const_functions/const_functions_const_ctor_error.dart.weak.transformed.expect
new file mode 100644
index 0000000..aac0f05
--- /dev/null
+++ b/pkg/front_end/testcases/const_functions/const_functions_const_ctor_error.dart.weak.transformed.expect
@@ -0,0 +1,87 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/const_functions/const_functions_const_ctor_error.dart:26:5: Error: Constructors can't have a return type.
+// Try removing the return type.
+// return Simple2(this.name);
+// ^
+//
+// pkg/front_end/testcases/const_functions/const_functions_const_ctor_error.dart:12:14: Error: Constant evaluation error:
+// const var1 = Simple(printString);
+// ^
+// pkg/front_end/testcases/const_functions/const_functions_const_ctor_error.dart:17:22: Context: This assertion failed.
+// assert(this.name != printString);
+// ^
+// pkg/front_end/testcases/const_functions/const_functions_const_ctor_error.dart:12:7: Context: While analyzing:
+// const var1 = Simple(printString);
+// ^
+//
+// pkg/front_end/testcases/const_functions/const_functions_const_ctor_error.dart:30:14: Error: Constant evaluation error:
+// const var3 = B();
+// ^
+// pkg/front_end/testcases/const_functions/const_functions_const_ctor_error.dart:33:14: Context: This assertion failed.
+// assert(1 == 2);
+// ^
+// pkg/front_end/testcases/const_functions/const_functions_const_ctor_error.dart:30:7: Context: While analyzing:
+// const var3 = B();
+// ^
+//
+import self as self;
+import "dart:core" as core;
+
+import "package:expect/expect.dart";
+
+class Simple extends core::Object /*hasConstConstructor*/ {
+ final field core::String name;
+ const constructor •(core::String name) → self::Simple
+ : self::Simple::name = name, super core::Object::•() {
+ assert(!this.{self::Simple::name}.{core::String::==}(#C1));
+ }
+}
+class Simple2 extends core::Object /*hasConstConstructor*/ {
+ final field core::String name;
+ const constructor •(core::String name) → self::Simple2
+ : self::Simple2::name = name, super core::Object::•() {
+ invalid-expression "pkg/front_end/testcases/const_functions/const_functions_const_ctor_error.dart:26:5: Error: Constructors can't have a return type.
+Try removing the return type.
+ return Simple2(this.name);
+ ^";
+ }
+}
+class A extends core::Object /*hasConstConstructor*/ {
+ const constructor •() → self::A
+ : super core::Object::•() {
+ assert(1.{core::num::==}(2));
+ }
+}
+class B extends self::A /*hasConstConstructor*/ {
+ const constructor •() → self::B
+ : super self::A::•()
+ ;
+}
+static const field core::String printString = #C1;
+static const field self::Simple var1 = invalid-expression "This assertion failed.";
+static const field self::Simple2 var2 = invalid-expression "pkg/front_end/testcases/const_functions/const_functions_const_ctor_error.dart:26:5: Error: Constructors can't have a return type.
+Try removing the return type.
+ return Simple2(this.name);
+ ^";
+static const field self::B var3 = invalid-expression "This assertion failed.";
+static method main() → void {}
+
+constants {
+ #C1 = "print"
+}
+
+Extra constant evaluation status:
+Evaluated: MethodInvocation @ org-dartlang-testcase:///const_functions_const_ctor_error.dart:33:14 -> BoolConstant(false)
+Extra constant evaluation: evaluated: 7, effectively constant: 1
+
+
+Constructor coverage from constants:
+org-dartlang-testcase:///const_functions_const_ctor_error.dart:
+- Simple. (from org-dartlang-testcase:///const_functions_const_ctor_error.dart:16:9)
+- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
+- Simple2. (from org-dartlang-testcase:///const_functions_const_ctor_error.dart:25:9)
+- B. (from org-dartlang-testcase:///const_functions_const_ctor_error.dart:38:9)
+- A. (from org-dartlang-testcase:///const_functions_const_ctor_error.dart:32:9)
diff --git a/pkg/front_end/testcases/textual_outline.status b/pkg/front_end/testcases/textual_outline.status
index 7a46a53..12e2725 100644
--- a/pkg/front_end/testcases/textual_outline.status
+++ b/pkg/front_end/testcases/textual_outline.status
@@ -20,9 +20,11 @@
regress/issue_39091_2: EmptyOutput
regress/utf_16_le_content.crash: EmptyOutput
+const_functions/const_functions_const_ctor: FormatterCrash
+const_functions/const_functions_const_ctor_error: FormatterCrash
+const_functions/const_functions_const_factory: FormatterCrash
dart2js/late_fields: FormatterCrash
dart2js/late_statics: FormatterCrash
-const_functions/const_functions_const_factory: FormatterCrash
extensions/extension_constructor: FormatterCrash
extensions/extension_field_with_type_parameter_usage: FormatterCrash
extensions/issue38600: FormatterCrash
diff --git a/runtime/vm/thread.h b/runtime/vm/thread.h
index 87b76c0..9b4dfe3 100644
--- a/runtime/vm/thread.h
+++ b/runtime/vm/thread.h
@@ -1159,8 +1159,7 @@
class NoReloadScope : public ThreadStackResource {
public:
- explicit NoReloadScope(Thread* thread)
- : ThreadStackResource(thread), thread_(thread) {
+ explicit NoReloadScope(Thread* thread) : ThreadStackResource(thread) {
#if !defined(PRODUCT) && !defined(DART_PRECOMPILED_RUNTIME)
thread->no_reload_scope_depth_++;
ASSERT(thread->no_reload_scope_depth_ >= 0);
@@ -1169,20 +1168,18 @@
~NoReloadScope() {
#if !defined(PRODUCT) && !defined(DART_PRECOMPILED_RUNTIME)
- thread_->no_reload_scope_depth_ -= 1;
- ASSERT(thread_->no_reload_scope_depth_ >= 0);
+ thread()->no_reload_scope_depth_ -= 1;
+ ASSERT(thread()->no_reload_scope_depth_ >= 0);
#endif // !defined(PRODUCT) && !defined(DART_PRECOMPILED_RUNTIME)
}
private:
- Thread* thread_;
DISALLOW_COPY_AND_ASSIGN(NoReloadScope);
};
class StoppedMutatorsScope : public ThreadStackResource {
public:
- explicit StoppedMutatorsScope(Thread* thread)
- : ThreadStackResource(thread), thread_(thread) {
+ explicit StoppedMutatorsScope(Thread* thread) : ThreadStackResource(thread) {
#if !defined(PRODUCT) && !defined(DART_PRECOMPILED_RUNTIME)
thread->stopped_mutators_scope_depth_++;
ASSERT(thread->stopped_mutators_scope_depth_ >= 0);
@@ -1191,13 +1188,12 @@
~StoppedMutatorsScope() {
#if !defined(PRODUCT) && !defined(DART_PRECOMPILED_RUNTIME)
- thread_->stopped_mutators_scope_depth_ -= 1;
- ASSERT(thread_->stopped_mutators_scope_depth_ >= 0);
+ thread()->stopped_mutators_scope_depth_ -= 1;
+ ASSERT(thread()->stopped_mutators_scope_depth_ >= 0);
#endif // !defined(PRODUCT) && !defined(DART_PRECOMPILED_RUNTIME)
}
private:
- Thread* thread_;
DISALLOW_COPY_AND_ASSIGN(StoppedMutatorsScope);
};
diff --git a/sdk/lib/_internal/js_dev_runtime/private/ddc_runtime/errors.dart b/sdk/lib/_internal/js_dev_runtime/private/ddc_runtime/errors.dart
index 36ebdf8..b798adf 100644
--- a/sdk/lib/_internal/js_dev_runtime/private/ddc_runtime/errors.dart
+++ b/sdk/lib/_internal/js_dev_runtime/private/ddc_runtime/errors.dart
@@ -102,8 +102,23 @@
// }
// }
// }
- return "Expected a value of type '${typeName(to)}', "
- "but got one of type '${typeName(from)}'";
+ var fromName = "'${typeName(from)}'";
+ var toName = "'${typeName(to)}'";
+
+ var toType = to;
+ if (_jsInstanceOf(to, NullableType) || _jsInstanceOf(to, LegacyType)) {
+ toType = to.type;
+ }
+ var fromType = from;
+ if (_jsInstanceOf(from, NullableType) || _jsInstanceOf(from, LegacyType)) {
+ fromType = from.type;
+ }
+
+ if (typeName(fromType) == typeName(toType)) {
+ fromName += ' (in ${getLibraryUri(fromType)})';
+ toName += ' (in ${getLibraryUri(toType)})';
+ }
+ return 'Expected a value of type $toName, but got one of type $fromName';
}
/// The symbol that references the thrown Dart Object (typically but not
diff --git a/sdk/lib/html/dart2js/html_dart2js.dart b/sdk/lib/html/dart2js/html_dart2js.dart
index bc7bdfb..977a16c 100644
--- a/sdk/lib/html/dart2js/html_dart2js.dart
+++ b/sdk/lib/html/dart2js/html_dart2js.dart
@@ -2185,7 +2185,7 @@
*/
@SupportedBrowser(SupportedBrowser.CHROME)
@SupportedBrowser(SupportedBrowser.FIREFOX)
- gl.RenderingContext getContext3d(
+ gl.RenderingContext? getContext3d(
{alpha: true,
depth: true,
stencil: false,
@@ -2204,7 +2204,7 @@
if (context == null) {
context = getContext('experimental-webgl', options);
}
- return context as gl.RenderingContext;
+ return context as gl.RenderingContext?;
}
/**
diff --git a/tests/dartdevc/cast_error/lib_a.dart b/tests/dartdevc/cast_error/lib_a.dart
new file mode 100644
index 0000000..5c6dedf
--- /dev/null
+++ b/tests/dartdevc/cast_error/lib_a.dart
@@ -0,0 +1,5 @@
+// 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.
+
+class Animal {}
diff --git a/tests/dartdevc/cast_error/lib_b.dart b/tests/dartdevc/cast_error/lib_b.dart
new file mode 100644
index 0000000..5c6dedf
--- /dev/null
+++ b/tests/dartdevc/cast_error/lib_b.dart
@@ -0,0 +1,5 @@
+// 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.
+
+class Animal {}
diff --git a/tests/dartdevc/cast_error/library_uri_in_message_test.dart b/tests/dartdevc/cast_error/library_uri_in_message_test.dart
new file mode 100644
index 0000000..42d7b85
--- /dev/null
+++ b/tests/dartdevc/cast_error/library_uri_in_message_test.dart
@@ -0,0 +1,66 @@
+// 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.
+
+import "../utils.dart";
+import "lib_a.dart" as libA;
+import "lib_b.dart" as libB;
+
+void main() {
+ // When the name of the class is the same the error message should include
+ // library URIs for the two classes.
+ var a = libA.Animal();
+ try {
+ a as libB.Animal;
+ } on TypeError catch (error) {
+ var message = error.toString();
+ expectStringContains(
+ "Expected a value of type 'Animal' "
+ "(in org-dartlang-app:/tests/dartdevc/cast_error/lib_b.dart)",
+ message);
+ expectStringContains(
+ "but got one of type 'Animal' "
+ "(in org-dartlang-app:/tests/dartdevc/cast_error/lib_a.dart)",
+ message);
+ }
+ // Verify the libraries are properly ordered.
+ var b = libB.Animal();
+ try {
+ b as libA.Animal;
+ } on TypeError catch (error) {
+ var message = error.toString();
+ expectStringContains(
+ "Expected a value of type 'Animal' "
+ "(in org-dartlang-app:/tests/dartdevc/cast_error/lib_a.dart)",
+ message);
+ expectStringContains(
+ "but got one of type 'Animal' "
+ "(in org-dartlang-app:/tests/dartdevc/cast_error/lib_b.dart)",
+ message);
+ }
+
+ // Shows library URIs when one of the types is nullable.
+ try {
+ b as libA.Animal?;
+ } on TypeError catch (error) {
+ var message = error.toString();
+ expectStringContains(
+ "Expected a value of type 'Animal?' "
+ "(in org-dartlang-app:/tests/dartdevc/cast_error/lib_a.dart)",
+ message);
+ expectStringContains(
+ "but got one of type 'Animal' "
+ "(in org-dartlang-app:/tests/dartdevc/cast_error/lib_b.dart)",
+ message);
+ }
+
+ // URIs are not displayed when the class names are different.
+ try {
+ a as String;
+ } on TypeError catch (error) {
+ var message = error.toString();
+ expectStringContains(
+ "Expected a value of type 'String', but got one of type 'Animal'",
+ message);
+ }
+}
diff --git a/tests/dartdevc_2/cast_error/lib_a.dart b/tests/dartdevc_2/cast_error/lib_a.dart
new file mode 100644
index 0000000..5c6dedf
--- /dev/null
+++ b/tests/dartdevc_2/cast_error/lib_a.dart
@@ -0,0 +1,5 @@
+// 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.
+
+class Animal {}
diff --git a/tests/dartdevc_2/cast_error/lib_b.dart b/tests/dartdevc_2/cast_error/lib_b.dart
new file mode 100644
index 0000000..5c6dedf
--- /dev/null
+++ b/tests/dartdevc_2/cast_error/lib_b.dart
@@ -0,0 +1,5 @@
+// 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.
+
+class Animal {}
diff --git a/tests/dartdevc_2/cast_error/library_uri_in_message_test.dart b/tests/dartdevc_2/cast_error/library_uri_in_message_test.dart
new file mode 100644
index 0000000..c278d15
--- /dev/null
+++ b/tests/dartdevc_2/cast_error/library_uri_in_message_test.dart
@@ -0,0 +1,53 @@
+// 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 "../utils.dart";
+import "lib_a.dart" as libA;
+import "lib_b.dart" as libB;
+
+void main() {
+ // When the name of the class is the same the error message should include
+ // library URIs for the two classes.
+ var a = libA.Animal();
+ try {
+ a as libB.Animal;
+ } on TypeError catch (error) {
+ var message = error.toString();
+ expectStringContains(
+ "Expected a value of type 'Animal' "
+ "(in org-dartlang-app:/tests/dartdevc_2/cast_error/lib_b.dart)",
+ message);
+ expectStringContains(
+ "but got one of type 'Animal' "
+ "(in org-dartlang-app:/tests/dartdevc_2/cast_error/lib_a.dart)",
+ message);
+ }
+ // Verify the libraries are properly ordered.
+ var b = libB.Animal();
+ try {
+ b as libA.Animal;
+ } on TypeError catch (error) {
+ var message = error.toString();
+ expectStringContains(
+ "Expected a value of type 'Animal' "
+ "(in org-dartlang-app:/tests/dartdevc_2/cast_error/lib_a.dart)",
+ message);
+ expectStringContains(
+ "but got one of type 'Animal' "
+ "(in org-dartlang-app:/tests/dartdevc_2/cast_error/lib_b.dart)",
+ message);
+ }
+
+ // URIs are not displayed when the class names are different.
+ try {
+ a as String;
+ } on TypeError catch (error) {
+ var message = error.toString();
+ expectStringContains(
+ "Expected a value of type 'String', but got one of type 'Animal'",
+ message);
+ }
+}
diff --git a/tests/language/const_functions/const_functions_const_ctor_disabled_test.dart b/tests/language/const_functions/const_functions_const_ctor_disabled_test.dart
new file mode 100644
index 0000000..e30f991
--- /dev/null
+++ b/tests/language/const_functions/const_functions_const_ctor_disabled_test.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.
+
+// Tests const constructors with a body are disabled without const functions.
+
+import "package:expect/expect.dart";
+
+const printString = "print";
+const var1 = Simple(printString);
+// ^
+// [cfe] Cannot invoke a non-'const' constructor where a const expression is expected.
+class Simple {
+ final String name;
+
+ const Simple(this.name) {
+//^
+// [cfe] A const constructor can't have a body.
+ // ^
+ // [analyzer] SYNTACTIC_ERROR.CONST_CONSTRUCTOR_WITH_BODY
+ assert(this.name == printString);
+ }
+}
diff --git a/tests/language/const_functions/const_functions_const_ctor_error_test.dart b/tests/language/const_functions/const_functions_const_ctor_error_test.dart
new file mode 100644
index 0000000..69fbe69
--- /dev/null
+++ b/tests/language/const_functions/const_functions_const_ctor_error_test.dart
@@ -0,0 +1,55 @@
+// 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 const constructors with a body which are enabled with const
+// functions.
+
+// SharedOptions=--enable-experiment=const-functions
+
+import "package:expect/expect.dart";
+
+const printString = "print";
+
+const var1 = Simple(printString);
+// ^
+// [cfe] Constant evaluation error:
+class Simple {
+ final String name;
+
+ const Simple(this.name) {
+// ^
+// [analyzer] SYNTACTIC_ERROR.CONST_CONSTRUCTOR_WITH_BODY
+ assert(this.name != printString);
+ }
+}
+
+const var2 = Simple2(printString);
+class Simple2 {
+ final String name;
+
+ const Simple2(this.name) {
+// ^
+// [analyzer] SYNTACTIC_ERROR.CONST_CONSTRUCTOR_WITH_BODY
+ return Simple2(this.name);
+// ^
+// [cfe] Constructors can't have a return type.
+// ^^^^^^^^^^^^^^^^^^
+// [analyzer] COMPILE_TIME_ERROR.RETURN_IN_GENERATIVE_CONSTRUCTOR
+ }
+}
+
+const var3 = B();
+// ^
+// [cfe] Constant evaluation error:
+class A {
+ const A() {
+ // ^
+ // [analyzer] SYNTACTIC_ERROR.CONST_CONSTRUCTOR_WITH_BODY
+ assert(1 == 2);
+ }
+}
+
+class B extends A {
+ const B() : super();
+}
diff --git a/tests/language/const_functions/const_functions_const_ctor_test.dart b/tests/language/const_functions/const_functions_const_ctor_test.dart
new file mode 100644
index 0000000..0430cce
--- /dev/null
+++ b/tests/language/const_functions/const_functions_const_ctor_test.dart
@@ -0,0 +1,34 @@
+// 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 const constructors with a body which are enabled with const functions.
+
+// SharedOptions=--enable-experiment=const-functions
+
+import "package:expect/expect.dart";
+
+const printString = "print";
+const var1 = Simple(printString);
+class Simple {
+ final String name;
+
+ const Simple(this.name) {
+// ^
+// [analyzer] SYNTACTIC_ERROR.CONST_CONSTRUCTOR_WITH_BODY
+ assert(this.name == printString);
+ }
+}
+
+const var2 = A();
+class A {
+ const A() {
+ // ^
+ // [analyzer] SYNTACTIC_ERROR.CONST_CONSTRUCTOR_WITH_BODY
+ return;
+ }
+}
+
+void main() {
+ Expect.equals(var1.name, printString);
+}
diff --git a/tests/lib/html/webgl_1_test.dart b/tests/lib/html/webgl_1_test.dart
index 9c3b420..3c72c3b 100644
--- a/tests/lib/html/webgl_1_test.dart
+++ b/tests/lib/html/webgl_1_test.dart
@@ -37,8 +37,9 @@
test('simple', () {
var canvas = new CanvasElement();
var context =
- canvas.getContext('experimental-webgl') as gl.RenderingContext;
- var shader = context.createShader(gl.WebGL.VERTEX_SHADER);
+ canvas.getContext('experimental-webgl') as gl.RenderingContext?;
+ expect(context, isNotNull);
+ var shader = context!.createShader(gl.WebGL.VERTEX_SHADER);
context.shaderSource(shader, 'void main() { }');
context.compileShader(shader);
var success =
@@ -59,7 +60,7 @@
test('texImage2D', () {
var canvas = new CanvasElement();
- gl.RenderingContext context = canvas.getContext3d();
+ var context = canvas.getContext3d()!;
var pixels = new Uint8List.fromList([0, 0, 3, 255, 0, 0, 0, 0, 0, 0]);
context.texImage2D(1, 1, 1, 1, 10, 10, 1, 1, pixels);
@@ -77,7 +78,7 @@
test('texSubImage2D', () {
var canvas = new CanvasElement();
- gl.RenderingContext context = canvas.getContext3d();
+ var context = canvas.getContext3d()!;
var pixels = new Uint8List.fromList([0, 0, 3, 255, 0, 0, 0, 0, 0, 0]);
context.texSubImage2D(1, 1, 1, 1, 1, 10, 10, 1, pixels);
@@ -95,7 +96,7 @@
test('getContextAttributes', () {
var canvas = new CanvasElement();
- var context = canvas.getContext3d();
+ var context = canvas.getContext3d()!;
var attributes = context.getContextAttributes();
expect(attributes, isNotNull);
diff --git a/tests/lib/html/webgl_extensions_test.dart b/tests/lib/html/webgl_extensions_test.dart
index 133cc7f..fb3aab9 100644
--- a/tests/lib/html/webgl_extensions_test.dart
+++ b/tests/lib/html/webgl_extensions_test.dart
@@ -75,7 +75,8 @@
expect(name, anyOf(allExtensions), reason: 'unknown extension');
var canvas = new CanvasElement();
var context = canvas.getContext3d();
- var supportedExtensions = context.getSupportedExtensions()!;
+ expect(context, isNotNull);
+ var supportedExtensions = context!.getSupportedExtensions()!;
if (supportedExtensions.contains(name)) {
var extension = context.getExtension(name);
expect(extension, isNotNull);
diff --git a/tests/lib_2/html/webgl_1_test.dart b/tests/lib_2/html/webgl_1_test.dart
index f156e2f..679d647 100644
--- a/tests/lib_2/html/webgl_1_test.dart
+++ b/tests/lib_2/html/webgl_1_test.dart
@@ -38,6 +38,7 @@
var canvas = new CanvasElement();
var context =
canvas.getContext('experimental-webgl') as gl.RenderingContext;
+ expect(context, isNotNull);
var shader = context.createShader(gl.WebGL.VERTEX_SHADER);
context.shaderSource(shader, 'void main() { }');
context.compileShader(shader);
@@ -59,7 +60,7 @@
test('texImage2D', () {
var canvas = new CanvasElement();
- gl.RenderingContext context = canvas.getContext3d();
+ var context = canvas.getContext3d();
var pixels = new Uint8List.fromList([0, 0, 3, 255, 0, 0, 0, 0, 0, 0]);
context.texImage2D(1, 1, 1, 1, 10, 10, 1, 1, pixels);
@@ -76,7 +77,7 @@
test('texSubImage2D', () {
var canvas = new CanvasElement();
- gl.RenderingContext context = canvas.getContext3d();
+ var context = canvas.getContext3d();
var pixels = new Uint8List.fromList([0, 0, 3, 255, 0, 0, 0, 0, 0, 0]);
context.texSubImage2D(1, 1, 1, 1, 1, 10, 10, 1, pixels);
diff --git a/tests/lib_2/html/webgl_extensions_test.dart b/tests/lib_2/html/webgl_extensions_test.dart
index 86e9a86..cd7d39c 100644
--- a/tests/lib_2/html/webgl_extensions_test.dart
+++ b/tests/lib_2/html/webgl_extensions_test.dart
@@ -75,6 +75,7 @@
expect(name, anyOf(allExtensions), reason: 'unknown extension');
var canvas = new CanvasElement();
var context = canvas.getContext3d();
+ expect(context, isNotNull);
var supportedExtensions = context.getSupportedExtensions();
if (supportedExtensions.contains(name)) {
var extension = context.getExtension(name);
diff --git a/tools/VERSION b/tools/VERSION
index 4df21bf..6bd9737 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
MAJOR 2
MINOR 13
PATCH 0
-PRERELEASE 223
+PRERELEASE 224
PRERELEASE_PATCH 0
\ No newline at end of file
diff --git a/tools/dom/templates/html/impl/impl_HTMLCanvasElement.darttemplate b/tools/dom/templates/html/impl/impl_HTMLCanvasElement.darttemplate
index 2f89be1..a3c87f0 100644
--- a/tools/dom/templates/html/impl/impl_HTMLCanvasElement.darttemplate
+++ b/tools/dom/templates/html/impl/impl_HTMLCanvasElement.darttemplate
@@ -21,7 +21,7 @@
*/
@SupportedBrowser(SupportedBrowser.CHROME)
@SupportedBrowser(SupportedBrowser.FIREFOX)
- gl.RenderingContext getContext3d({alpha: true, depth: true, stencil: false,
+ gl.RenderingContext$NULLABLE getContext3d({alpha: true, depth: true, stencil: false,
antialias: true, premultipliedAlpha: true, preserveDrawingBuffer: false}) {
var options = {
@@ -36,7 +36,7 @@
if (context == null) {
context = getContext('experimental-webgl', options);
}
- return context $#NULLSAFECAST(as gl.RenderingContext);
+ return context $#NULLSAFECAST(as gl.RenderingContext$NULLABLE);
}
/**