Version 2.17.0-168.0.dev
Merge commit '005ebcc761702223b6189ce1aa872564d1b6aa24' into 'dev'
diff --git a/pkg/analysis_server/lib/src/lsp/handlers/commands/simple_edit_handler.dart b/pkg/analysis_server/lib/src/lsp/handlers/commands/simple_edit_handler.dart
index 879ac92..ee853d6 100644
--- a/pkg/analysis_server/lib/src/lsp/handlers/commands/simple_edit_handler.dart
+++ b/pkg/analysis_server/lib/src/lsp/handlers/commands/simple_edit_handler.dart
@@ -45,11 +45,6 @@
}
final lineInfo = unit.lineInfo;
- if (lineInfo == null) {
- return error(ErrorCodes.InternalError,
- 'Unable to produce edits for $docIdentifier as no LineInfo was found');
- }
-
final workspaceEdit = toWorkspaceEdit(
clientCapabilities,
[FileEditInformation(docIdentifier, lineInfo, edits)],
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/ignore_diagnostic.dart b/pkg/analysis_server/lib/src/services/correction/dart/ignore_diagnostic.dart
index 7b1fbde..a876fd0 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/ignore_diagnostic.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/ignore_diagnostic.dart
@@ -25,9 +25,6 @@
String ignoreCommentType,
) async {
final lineInfo = unit.lineInfo;
- if (lineInfo == null) {
- return;
- }
await builder.addDartFileEdit(file, (builder) {
final offset = insertDesc.offset;
diff --git a/pkg/analysis_server/lib/src/services/correction/organize_imports.dart b/pkg/analysis_server/lib/src/services/correction/organize_imports.dart
index e4438f2..f3abafa 100644
--- a/pkg/analysis_server/lib/src/services/correction/organize_imports.dart
+++ b/pkg/analysis_server/lib/src/services/correction/organize_imports.dart
@@ -69,7 +69,7 @@
/// Organize all [Directive]s.
void _organizeDirectives() {
- var lineInfo = unit.lineInfo ?? LineInfo.fromContent(code);
+ var lineInfo = unit.lineInfo;
var hasLibraryDirective = false;
var directives = <_DirectiveInfo>[];
// Track the end offset of any library-level comment/annotations that should
diff --git a/pkg/analysis_server/lib/src/services/correction/util.dart b/pkg/analysis_server/lib/src/services/correction/util.dart
index d5e5c71..0fac6a9 100644
--- a/pkg/analysis_server/lib/src/services/correction/util.dart
+++ b/pkg/analysis_server/lib/src/services/correction/util.dart
@@ -792,7 +792,7 @@
// end
var endOffset = sourceRange.end;
var afterEndLineOffset = endOffset;
- var lineInfo = unit.lineInfo!;
+ var lineInfo = unit.lineInfo;
var lineStart = lineInfo
.getOffsetOfLine(lineInfo.getLocation(startLineOffset).lineNumber - 1);
if (lineStart == startLineOffset) {
diff --git a/pkg/analysis_server/test/src/utilities/extensions/range_factory_test.dart b/pkg/analysis_server/test/src/utilities/extensions/range_factory_test.dart
index e8d35e3..c25bdcd 100644
--- a/pkg/analysis_server/test/src/utilities/extensions/range_factory_test.dart
+++ b/pkg/analysis_server/test/src/utilities/extensions/range_factory_test.dart
@@ -29,7 +29,7 @@
void _assertArgumentRange(int index, SourceRange expectedRange) {
var list = _argumentList;
- expect(range.nodeInListWithComments(testUnit.lineInfo!, list, list[index]),
+ expect(range.nodeInListWithComments(testUnit.lineInfo, list, list[index]),
expectedRange);
}
@@ -37,7 +37,7 @@
var class_ = findNode.classDeclaration('class');
var list = class_.members;
for (var entry in expectedRanges.entries) {
- expect(range.nodeWithComments(testUnit.lineInfo!, list[entry.key]),
+ expect(range.nodeWithComments(testUnit.lineInfo, list[entry.key]),
entry.value);
}
}
@@ -45,7 +45,7 @@
void _assertUnitRanges(Map<int, SourceRange> expectedRanges) {
var list = testUnit.declarations;
for (var entry in expectedRanges.entries) {
- expect(range.nodeWithComments(testUnit.lineInfo!, list[entry.key]),
+ expect(range.nodeWithComments(testUnit.lineInfo, list[entry.key]),
entry.value);
}
}
diff --git a/pkg/analyzer/lib/dart/analysis/utilities.dart b/pkg/analyzer/lib/dart/analysis/utilities.dart
index 8cee120..64dfab7 100644
--- a/pkg/analyzer/lib/dart/analysis/utilities.dart
+++ b/pkg/analyzer/lib/dart/analysis/utilities.dart
@@ -82,14 +82,14 @@
featureSet: featureSet,
);
var token = scanner.tokenize();
+ var lineInfo = LineInfo(scanner.lineStarts);
var parser = Parser(
source,
errorCollector,
featureSet: scanner.featureSet,
+ lineInfo: lineInfo,
);
var unit = parser.parseCompilationUnit(token);
- var lineInfo = LineInfo(scanner.lineStarts);
- unit.lineInfo = lineInfo;
ParseStringResult result =
ParseStringResultImpl(content, unit, errorCollector.errors);
if (throwIfDiagnostics && result.errors.isNotEmpty) {
diff --git a/pkg/analyzer/lib/dart/ast/ast.dart b/pkg/analyzer/lib/dart/ast/ast.dart
index 105600d..d49cca3 100644
--- a/pkg/analyzer/lib/dart/ast/ast.dart
+++ b/pkg/analyzer/lib/dart/ast/ast.dart
@@ -1063,7 +1063,7 @@
LanguageVersionToken? get languageVersionToken;
/// Return the line information for this compilation unit.
- LineInfo? get lineInfo;
+ LineInfo get lineInfo;
/// Return the script tag at the beginning of the compilation unit, or `null`
/// if there is no script tag in this compilation unit.
diff --git a/pkg/analyzer/lib/dart/ast/ast_factory.dart b/pkg/analyzer/lib/dart/ast/ast_factory.dart
index 26bbeac..682228e 100644
--- a/pkg/analyzer/lib/dart/ast/ast_factory.dart
+++ b/pkg/analyzer/lib/dart/ast/ast_factory.dart
@@ -7,6 +7,7 @@
import 'package:analyzer/dart/ast/ast.dart';
import 'package:analyzer/dart/element/element.dart';
import 'package:analyzer/dart/element/type.dart';
+import 'package:analyzer/source/line_info.dart';
import 'package:analyzer/src/generated/utilities_dart.dart';
/// A collection of factory methods which may be used to create concrete
@@ -175,13 +176,15 @@
/// `null` (or omitted) if there are no directives in the compilation unit.
/// The list of `declarations` can be `null` (or omitted) if there are no
/// declarations in the compilation unit.
- CompilationUnit compilationUnit(
- {required Token beginToken,
- ScriptTag? scriptTag,
- List<Directive>? directives,
- List<CompilationUnitMember>? declarations,
- required Token endToken,
- required FeatureSet featureSet});
+ CompilationUnit compilationUnit({
+ required Token beginToken,
+ ScriptTag? scriptTag,
+ List<Directive>? directives,
+ List<CompilationUnitMember>? declarations,
+ required Token endToken,
+ required FeatureSet featureSet,
+ LineInfo? lineInfo,
+ });
/// Returns a newly created conditional expression.
ConditionalExpression conditionalExpression(
diff --git a/pkg/analyzer/lib/src/dart/analysis/file_state.dart b/pkg/analyzer/lib/src/dart/analysis/file_state.dart
index 2c3364c..c1f7133 100644
--- a/pkg/analyzer/lib/src/dart/analysis/file_state.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/file_state.dart
@@ -550,11 +550,11 @@
source,
errorListener,
featureSet: scanner.featureSet,
+ lineInfo: lineInfo,
);
parser.enableOptionalNewAndConst = true;
var unit = parser.parseCompilationUnit(token);
- unit.lineInfo = lineInfo;
unit.languageVersion = LibraryLanguageVersion(
package: packageLanguageVersion,
override: scanner.overrideVersion,
@@ -636,7 +636,7 @@
hasPartOfDirective: hasPartOfDirective,
imports: imports,
informativeBytes: writeUnitInformative(unit),
- lineStarts: Uint32List.fromList(unit.lineInfo!.lineStarts),
+ lineStarts: Uint32List.fromList(unit.lineInfo.lineStarts),
partOfName: null,
partOfUri: null,
parts: parts,
diff --git a/pkg/analyzer/lib/src/dart/analysis/library_analyzer.dart b/pkg/analyzer/lib/src/dart/analysis/library_analyzer.dart
index 62a49f0..f4e2995 100644
--- a/pkg/analyzer/lib/src/dart/analysis/library_analyzer.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/library_analyzer.dart
@@ -565,7 +565,7 @@
String content = file.content;
var unit = file.parse(errorListener);
- _fileToLineInfo[file] = unit.lineInfo!;
+ _fileToLineInfo[file] = unit.lineInfo;
_fileToIgnoreInfo[file] = IgnoreInfo.forDart(unit, content);
return unit;
diff --git a/pkg/analyzer/lib/src/dart/analysis/results.dart b/pkg/analyzer/lib/src/dart/analysis/results.dart
index e799e6d..d43672d 100644
--- a/pkg/analyzer/lib/src/dart/analysis/results.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/results.dart
@@ -136,7 +136,7 @@
ParseStringResultImpl(this.content, this.unit, this.errors);
@override
- LineInfo get lineInfo => unit.lineInfo!;
+ LineInfo get lineInfo => unit.lineInfo;
}
class ResolvedForCompletionResultImpl {
diff --git a/pkg/analyzer/lib/src/dart/ast/ast.dart b/pkg/analyzer/lib/src/dart/ast/ast.dart
index cae43cb..506e0d0 100644
--- a/pkg/analyzer/lib/src/dart/ast/ast.dart
+++ b/pkg/analyzer/lib/src/dart/ast/ast.dart
@@ -2115,7 +2115,7 @@
/// The line information for this compilation unit.
@override
- LineInfo? lineInfo;
+ final LineInfo lineInfo;
/// The language version information.
LibraryLanguageVersion? languageVersion;
@@ -2134,7 +2134,8 @@
List<Directive>? directives,
List<CompilationUnitMember>? declarations,
this.endToken,
- this.featureSet) {
+ this.featureSet,
+ this.lineInfo) {
_becomeParentOf(_scriptTag);
_directives._initialize(this, directives);
_declarations._initialize(this, declarations);
diff --git a/pkg/analyzer/lib/src/dart/ast/ast_factory.dart b/pkg/analyzer/lib/src/dart/ast/ast_factory.dart
index 05438c0..e427e92 100644
--- a/pkg/analyzer/lib/src/dart/ast/ast_factory.dart
+++ b/pkg/analyzer/lib/src/dart/ast/ast_factory.dart
@@ -8,6 +8,7 @@
import 'package:analyzer/dart/ast/ast_factory.dart';
import 'package:analyzer/dart/element/element.dart';
import 'package:analyzer/dart/element/type.dart';
+import 'package:analyzer/source/line_info.dart';
import 'package:analyzer/src/dart/ast/ast.dart';
import 'package:analyzer/src/generated/utilities_dart.dart';
@@ -225,9 +226,14 @@
List<Directive>? directives,
List<CompilationUnitMember>? declarations,
required Token endToken,
- required FeatureSet featureSet}) =>
+ required FeatureSet featureSet,
+ // TODO(dantup): LineInfo should be made required and non-nullable
+ // when breaking API changes can be made. Callers that do not
+ // provide lineInfos may have offsets incorrectly mapped to line/col
+ // for LSP.
+ LineInfo? lineInfo}) =>
CompilationUnitImpl(beginToken, scriptTag as ScriptTagImpl?, directives,
- declarations, endToken, featureSet);
+ declarations, endToken, featureSet, lineInfo ?? LineInfo([0]));
@override
ConditionalExpressionImpl conditionalExpression(
diff --git a/pkg/analyzer/lib/src/dart/micro/library_analyzer.dart b/pkg/analyzer/lib/src/dart/micro/library_analyzer.dart
index 0652729..6e65351 100644
--- a/pkg/analyzer/lib/src/dart/micro/library_analyzer.dart
+++ b/pkg/analyzer/lib/src/dart/micro/library_analyzer.dart
@@ -495,7 +495,7 @@
AnalysisErrorListener errorListener = _getErrorListener(file);
var unit = file.parse(errorListener, content);
- LineInfo lineInfo = unit.lineInfo!;
+ LineInfo lineInfo = unit.lineInfo;
_fileToLineInfo[file] = lineInfo;
_fileToIgnoreInfo[file] = IgnoreInfo.forDart(unit, content);
diff --git a/pkg/analyzer/lib/src/dart/micro/library_graph.dart b/pkg/analyzer/lib/src/dart/micro/library_graph.dart
index 6476871..9597bff 100644
--- a/pkg/analyzer/lib/src/dart/micro/library_graph.dart
+++ b/pkg/analyzer/lib/src/dart/micro/library_graph.dart
@@ -870,10 +870,10 @@
location.source,
errorListener,
featureSet: scanner.featureSet,
+ lineInfo: lineInfo,
);
parser.enableOptionalNewAndConst = true;
var unit = parser.parseCompilationUnit(token);
- unit.lineInfo = lineInfo;
// StringToken uses a static instance of StringCanonicalizer, so we need
// to clear it explicitly once we are done using it for this file.
@@ -961,7 +961,7 @@
hasPartOfDirective: hasPartOfDirective,
imports: imports,
informativeBytes: writeUnitInformative(unit),
- lineStarts: Uint32List.fromList(unit.lineInfo!.lineStarts),
+ lineStarts: Uint32List.fromList(unit.lineInfo.lineStarts),
partOfName: partOfName,
partOfUri: partOfUriStr,
parts: parts,
diff --git a/pkg/analyzer/lib/src/dart/micro/resolve_file.dart b/pkg/analyzer/lib/src/dart/micro/resolve_file.dart
index ac5a4809..73c6f51 100644
--- a/pkg/analyzer/lib/src/dart/micro/resolve_file.dart
+++ b/pkg/analyzer/lib/src/dart/micro/resolve_file.dart
@@ -204,7 +204,7 @@
references.add(CiderSearchMatch(
path,
offsets
- .map((offset) => lineInfo?.getLocation(offset))
+ .map((offset) => lineInfo.getLocation(offset))
.toList()));
}
});
diff --git a/pkg/analyzer/lib/src/error/todo_finder.dart b/pkg/analyzer/lib/src/error/todo_finder.dart
index e6a4df3..b3d3b24 100644
--- a/pkg/analyzer/lib/src/error/todo_finder.dart
+++ b/pkg/analyzer/lib/src/error/todo_finder.dart
@@ -34,7 +34,7 @@
///
/// @param unit the compilation unit containing the to-do comments
void findIn(CompilationUnit unit) {
- _gatherTodoComments(unit.beginToken, unit.lineInfo!);
+ _gatherTodoComments(unit.beginToken, unit.lineInfo);
}
/// Search the comment tokens reachable from the given token and create errors
diff --git a/pkg/analyzer/lib/src/fasta/ast_builder.dart b/pkg/analyzer/lib/src/fasta/ast_builder.dart
index b81a0d2..9526d94 100644
--- a/pkg/analyzer/lib/src/fasta/ast_builder.dart
+++ b/pkg/analyzer/lib/src/fasta/ast_builder.dart
@@ -58,6 +58,7 @@
import 'package:analyzer/dart/ast/ast.dart';
import 'package:analyzer/dart/ast/token.dart' show Token, TokenType;
import 'package:analyzer/error/listener.dart';
+import 'package:analyzer/source/line_info.dart';
import 'package:analyzer/src/dart/analysis/experiments.dart';
import 'package:analyzer/src/dart/ast/ast.dart'
show
@@ -172,8 +173,10 @@
final FeatureSet _featureSet;
+ final LineInfo _lineInfo;
+
AstBuilder(ErrorReporter? errorReporter, this.fileUri, this.isFullAst,
- this._featureSet,
+ this._featureSet, this._lineInfo,
[Uri? uri])
: errorReporter = FastaErrorReporter(errorReporter),
enableNonNullable = _featureSet.isEnabled(Feature.non_nullable),
@@ -1129,7 +1132,8 @@
directives: directives,
declarations: declarations,
endToken: endToken,
- featureSet: _featureSet);
+ featureSet: _featureSet,
+ lineInfo: _lineInfo);
push(unit);
}
diff --git a/pkg/analyzer/lib/src/generated/parser.dart b/pkg/analyzer/lib/src/generated/parser.dart
index 9ffdfb3..1d7b7a3 100644
--- a/pkg/analyzer/lib/src/generated/parser.dart
+++ b/pkg/analyzer/lib/src/generated/parser.dart
@@ -30,17 +30,20 @@
final AstBuilder astBuilder;
Parser(Source source, AnalysisErrorListener errorListener,
- {required FeatureSet featureSet, bool allowNativeClause = true})
+ {required FeatureSet featureSet,
+ bool allowNativeClause = true,
+ required LineInfo lineInfo})
: astBuilder = AstBuilder(
- ErrorReporter(
- errorListener,
- source,
- isNonNullableByDefault:
- featureSet.isEnabled(Feature.non_nullable),
- ),
- source.uri,
- true,
- featureSet) {
+ ErrorReporter(
+ errorListener,
+ source,
+ isNonNullableByDefault: featureSet.isEnabled(Feature.non_nullable),
+ ),
+ source.uri,
+ true,
+ featureSet,
+ lineInfo,
+ ) {
fastaParser = fasta.Parser(astBuilder);
astBuilder.parser = fastaParser;
astBuilder.allowNativeClause = allowNativeClause;
diff --git a/pkg/analyzer/lib/src/generated/testing/ast_test_factory.dart b/pkg/analyzer/lib/src/generated/testing/ast_test_factory.dart
index 7b109c5..34986e6 100644
--- a/pkg/analyzer/lib/src/generated/testing/ast_test_factory.dart
+++ b/pkg/analyzer/lib/src/generated/testing/ast_test_factory.dart
@@ -7,6 +7,7 @@
import 'package:analyzer/dart/ast/token.dart';
import 'package:analyzer/dart/element/element.dart';
import 'package:analyzer/dart/element/nullability_suffix.dart';
+import 'package:analyzer/source/line_info.dart';
import 'package:analyzer/src/dart/ast/ast.dart';
import 'package:analyzer/src/dart/ast/ast_factory.dart';
import 'package:analyzer/src/dart/element/type.dart';
@@ -323,7 +324,8 @@
directives: directives,
declarations: declarations,
endToken: TokenFactory.tokenFromType(TokenType.EOF),
- featureSet: FeatureSet.latestLanguageVersion());
+ featureSet: FeatureSet.latestLanguageVersion(),
+ lineInfo: LineInfo.fromContent(''));
static CompilationUnitImpl compilationUnit9(
{String? scriptTag,
@@ -337,7 +339,8 @@
directives: directives,
declarations: declarations,
endToken: TokenFactory.tokenFromType(TokenType.EOF),
- featureSet: featureSet);
+ featureSet: featureSet,
+ lineInfo: LineInfo.fromContent(''));
static ConditionalExpressionImpl conditionalExpression(Expression condition,
Expression thenExpression, Expression elseExpression) =>
diff --git a/pkg/analyzer/lib/src/ignore_comments/ignore_info.dart b/pkg/analyzer/lib/src/ignore_comments/ignore_info.dart
index 4b37ce5..d2f6b13 100644
--- a/pkg/analyzer/lib/src/ignore_comments/ignore_info.dart
+++ b/pkg/analyzer/lib/src/ignore_comments/ignore_info.dart
@@ -77,7 +77,7 @@
/// Initialize a newly created instance of this class to represent the ignore
/// comments in the given compilation [unit].
IgnoreInfo.forDart(CompilationUnit unit, String content) {
- var lineInfo = unit.lineInfo!;
+ var lineInfo = unit.lineInfo;
for (var comment in unit.ignoreComments) {
var lexeme = comment.lexeme;
if (lexeme.contains('ignore:')) {
diff --git a/pkg/analyzer/lib/src/services/available_declarations.dart b/pkg/analyzer/lib/src/services/available_declarations.dart
index b5a3097..e39cd99 100644
--- a/pkg/analyzer/lib/src/services/available_declarations.dart
+++ b/pkg/analyzer/lib/src/services/available_declarations.dart
@@ -1317,7 +1317,7 @@
}
void _buildFileDeclarations(CompilationUnit unit) {
- lineInfo = unit.lineInfo!;
+ lineInfo = unit.lineInfo;
lineStarts = lineInfo.lineStarts;
isLibrary = true;
diff --git a/pkg/analyzer/lib/src/summary2/informative_data.dart b/pkg/analyzer/lib/src/summary2/informative_data.dart
index 58891f8..e2bf8ca 100644
--- a/pkg/analyzer/lib/src/summary2/informative_data.dart
+++ b/pkg/analyzer/lib/src/summary2/informative_data.dart
@@ -1051,7 +1051,7 @@
sink.writeUInt30(unit.offset);
sink.writeUInt30(unit.length);
- sink.writeUint30List(unit.lineInfo?.lineStarts ?? [0]);
+ sink.writeUint30List(unit.lineInfo.lineStarts);
_writeLibraryName(unit);
diff --git a/pkg/analyzer/test/generated/non_error_resolver_test.dart b/pkg/analyzer/test/generated/non_error_resolver_test.dart
index 66c764c..456f594 100644
--- a/pkg/analyzer/test/generated/non_error_resolver_test.dart
+++ b/pkg/analyzer/test/generated/non_error_resolver_test.dart
@@ -4,6 +4,7 @@
import 'package:analyzer/dart/ast/ast.dart';
import 'package:analyzer/dart/element/element.dart';
+import 'package:analyzer/src/dart/element/member.dart';
import 'package:analyzer/src/error/codes.dart';
import 'package:analyzer/src/generated/parser.dart' show ParserErrorCode;
import 'package:test/test.dart';
@@ -62,6 +63,20 @@
''');
}
+ test_generic_staticParameterElement_annotation() async {
+ await assertNoErrorsInCode('''
+class C<T> {
+ const C.named({arg});
+}
+@C<bool>.named(arg: true)
+test() {}
+''');
+ var x = findNode.namedExpression('arg: true');
+ var y = x.staticParameterElement!;
+ expect(y, TypeMatcher<ParameterMember>());
+ expect(y.declaration, findElement.parameter('arg'));
+ }
+
test_inconsistentMethodInheritance_accessors_typeParameters1() async {
await assertNoErrorsInCode(r'''
abstract class A<E> {
@@ -1367,6 +1382,107 @@
''');
}
+ test_generic_staticParameterElement_annotation_implicitTypeArg() async {
+ var required = isNullSafetyEnabled ? 'required' : '';
+ await assertNoErrorsInCode('''
+class C<T> {
+ const C.named({$required T arg});
+}
+@C.named(arg: true)
+test() {}
+''');
+ var x = findNode.namedExpression('arg: true');
+ var y = x.staticParameterElement!;
+ expect(y, TypeMatcher<ParameterMember>());
+ expect(y.declaration, findElement.parameter('arg'));
+ }
+
+ test_generic_staticParameterElement_instanceCreation_explicitNew() async {
+ await assertNoErrorsInCode('''
+class C<T> {
+ C.named({arg});
+}
+test() => new C<bool>.named(arg: true);
+''');
+ var x = findNode.namedExpression('arg: true');
+ var y = x.staticParameterElement!;
+ expect(y, TypeMatcher<ParameterMember>());
+ expect(y.declaration, findElement.parameter('arg'));
+ }
+
+ test_generic_staticParameterElement_instanceCreation_explicitNew_implicitTypeArg() async {
+ await assertNoErrorsInCode('''
+class C<T> {
+ C.named({arg});
+}
+C<bool> test() => new C.named(arg: true);
+''');
+ var x = findNode.namedExpression('arg: true');
+ var y = x.staticParameterElement!;
+ // Note: the staticParameterElement is synthetic; see
+ // https://github.com/dart-lang/sdk/issues/48500
+ expect(y, isNot(TypeMatcher<ParameterMember>()));
+ expect(y.enclosingElement, isNull);
+ }
+
+ test_generic_staticParameterElement_instanceCreation_implicitNew() async {
+ await assertNoErrorsInCode('''
+class C<T> {
+ C.named({arg});
+}
+test() => C<bool>.named(arg: true);
+''');
+ var x = findNode.namedExpression('arg: true');
+ var y = x.staticParameterElement!;
+ expect(y, TypeMatcher<ParameterMember>());
+ expect(y.declaration, findElement.parameter('arg'));
+ }
+
+ test_generic_staticParameterElement_instanceCreation_implicitNew_implicitTypeArg() async {
+ await assertNoErrorsInCode('''
+class C<T> {
+ C.named({arg});
+}
+C<bool> test() => C.named(arg: true);
+''');
+ var x = findNode.namedExpression('arg: true');
+ var y = x.staticParameterElement!;
+ // Note: the staticParameterElement is synthetic; see
+ // https://github.com/dart-lang/sdk/issues/48500
+ expect(y, isNot(TypeMatcher<ParameterMember>()));
+ expect(y.enclosingElement, isNull);
+ }
+
+ test_generic_staticParameterElement_methodCall() async {
+ await assertNoErrorsInCode('''
+abstract class C {
+ T method<T>({arg});
+}
+test(C c) => c.method<bool>(arg: true);
+''');
+ var x = findNode.namedExpression('arg: true');
+ var y = x.staticParameterElement!;
+ // Note: the staticParameterElement is synthetic; see
+ // https://github.com/dart-lang/sdk/issues/48500
+ expect(y, isNot(TypeMatcher<ParameterMember>()));
+ expect(y.enclosingElement, isNull);
+ }
+
+ test_generic_staticParameterElement_methodCall_implicitTypeArg() async {
+ await assertNoErrorsInCode('''
+abstract class C {
+ T method<T>({arg});
+}
+bool test(C c) => c.method<bool>(arg: true);
+''');
+ var x = findNode.namedExpression('arg: true');
+ var y = x.staticParameterElement!;
+ // Note: the staticParameterElement is synthetic; see
+ // https://github.com/dart-lang/sdk/issues/48500
+ expect(y, isNot(TypeMatcher<ParameterMember>()));
+ expect(y.enclosingElement, isNull);
+ }
+
test_genericTypeAlias_castsAndTypeChecks_hasTypeParameters() async {
await assertNoErrorsInCode('''
// @dart = 2.9
diff --git a/pkg/analyzer/test/generated/parser_test_base.dart b/pkg/analyzer/test/generated/parser_test_base.dart
index a0251ce..e565e23 100644
--- a/pkg/analyzer/test/generated/parser_test_base.dart
+++ b/pkg/analyzer/test/generated/parser_test_base.dart
@@ -279,10 +279,12 @@
? ScannerConfiguration.nonNullable
: ScannerConfiguration.classic,
includeComments: true);
+ var lineInfo = LineInfo(result.lineStarts);
_fastaTokens = result.tokens;
parserProxy = ParserProxy(_fastaTokens, featureSet,
allowNativeClause: allowNativeClause,
- expectedEndOffset: expectedEndOffset);
+ expectedEndOffset: expectedEndOffset,
+ lineInfo: lineInfo);
}
@override
@@ -416,8 +418,8 @@
source,
isNonNullableByDefault: false,
);
- AstBuilder astBuilder =
- AstBuilder(errorReporter, source.uri, true, featureSet!);
+ AstBuilder astBuilder = AstBuilder(errorReporter, source.uri, true,
+ featureSet!, LineInfo.fromContent(content));
fasta.Parser parser = fasta.Parser(astBuilder);
astBuilder.parser = parser;
astBuilder.allowNativeClause = allowNativeClause;
@@ -743,19 +745,26 @@
/// Creates a [ParserProxy] which is prepared to begin parsing at the given
/// Fasta token.
factory ParserProxy(Token firstToken, FeatureSet featureSet,
- {bool allowNativeClause = false, int? expectedEndOffset}) {
+ {bool allowNativeClause = false,
+ int? expectedEndOffset,
+ required LineInfo lineInfo}) {
TestSource source = TestSource();
var errorListener = GatheringErrorListener(checkRanges: true);
return ParserProxy._(firstToken, source, errorListener, featureSet,
allowNativeClause: allowNativeClause,
- expectedEndOffset: expectedEndOffset);
+ expectedEndOffset: expectedEndOffset,
+ lineInfo: lineInfo);
}
ParserProxy._(Token firstToken, Source source, this.errorListener,
FeatureSet featureSet,
- {bool allowNativeClause = false, this.expectedEndOffset})
+ {bool allowNativeClause = false,
+ this.expectedEndOffset,
+ required LineInfo lineInfo})
: super(source, errorListener,
- featureSet: featureSet, allowNativeClause: allowNativeClause) {
+ featureSet: featureSet,
+ allowNativeClause: allowNativeClause,
+ lineInfo: lineInfo) {
_eventListener = ForwardingTestListener(astBuilder);
fastaParser.listener = _eventListener;
currentToken = firstToken;
@@ -1029,12 +1038,14 @@
fasta.ScannerResult result =
fasta.scanString(content, includeComments: true);
- listener.setLineInfo(source, result.lineStarts);
+ LineInfo lineInfo = LineInfo(result.lineStarts);
+ listener.setLineInfo(source, lineInfo);
parser = analyzer.Parser(
source,
listener,
featureSet: featureSet,
+ lineInfo: lineInfo,
);
parser.allowNativeClause = allowNativeClause;
parser.parseFunctionBodies = parseFunctionBodies;
@@ -1147,12 +1158,14 @@
fasta.ScannerResult result =
fasta.scanString(content, includeComments: true);
- listener.setLineInfo(source, result.lineStarts);
+ LineInfo lineInfo = LineInfo(result.lineStarts);
+ listener.setLineInfo(source, lineInfo);
analyzer.Parser parser = analyzer.Parser(
source,
listener,
featureSet: FeatureSets.latestWithExperiments,
+ lineInfo: lineInfo,
);
parser.enableOptionalNewAndConst = enableOptionalNewAndConst;
CompilationUnit unit = parser.parseCompilationUnit(result.tokens);
@@ -1175,15 +1188,16 @@
fasta.ScannerResult result =
fasta.scanString(content, includeComments: true);
+ LineInfo lineInfo = LineInfo(result.lineStarts);
analyzer.Parser parser = analyzer.Parser(
source,
listener,
featureSet: FeatureSet.latestLanguageVersion(),
+ lineInfo: lineInfo,
);
parser.enableOptionalNewAndConst = enableOptionalNewAndConst;
var unit = parser.parseCompilationUnit(result.tokens);
- unit.lineInfo = LineInfo(result.lineStarts);
return unit;
}
@@ -1452,12 +1466,14 @@
fasta.ScannerResult result =
fasta.scanString(content, includeComments: true);
- listener.setLineInfo(source, result.lineStarts);
+ LineInfo lineInfo = LineInfo(result.lineStarts);
+ listener.setLineInfo(source, lineInfo);
analyzer.Parser parser = analyzer.Parser(
source,
listener,
featureSet: FeatureSet.latestLanguageVersion(),
+ lineInfo: lineInfo,
);
parser.enableOptionalNewAndConst = enableOptionalNewAndConst;
Statement statement = parser.parseStatement(result.tokens);
diff --git a/pkg/analyzer/test/generated/scanner_test.dart b/pkg/analyzer/test/generated/scanner_test.dart
index 08cf6ac..8dff3c5 100644
--- a/pkg/analyzer/test/generated/scanner_test.dart
+++ b/pkg/analyzer/test/generated/scanner_test.dart
@@ -193,7 +193,8 @@
featureSet: featureSet,
);
Token result = scanner.tokenize();
- listener.setLineInfo(TestSource(), scanner.lineStarts);
+ LineInfo lineInfo = LineInfo(scanner.lineStarts);
+ listener.setLineInfo(TestSource(), lineInfo);
return result;
}
}
diff --git a/pkg/analyzer/test/generated/test_support.dart b/pkg/analyzer/test/generated/test_support.dart
index c170e15..b34ef50 100644
--- a/pkg/analyzer/test/generated/test_support.dart
+++ b/pkg/analyzer/test/generated/test_support.dart
@@ -398,10 +398,9 @@
_errors.add(error);
}
- /// Set the line information associated with the given [source] to the given
- /// list of [lineStarts].
- void setLineInfo(Source source, List<int> lineStarts) {
- _lineInfoMap[source] = LineInfo(lineStarts);
+ /// Set the line information associated with the given [source] to [lineInfo].
+ void setLineInfo(Source source, LineInfo lineInfo) {
+ _lineInfoMap[source] = lineInfo;
}
}
diff --git a/pkg/analyzer/test/src/dart/ast/parse_base.dart b/pkg/analyzer/test/src/dart/ast/parse_base.dart
index a088dc9..e8e2609 100644
--- a/pkg/analyzer/test/src/dart/ast/parse_base.dart
+++ b/pkg/analyzer/test/src/dart/ast/parse_base.dart
@@ -33,22 +33,23 @@
);
var token = scanner.tokenize();
+ var lineInfo = LineInfo(scanner.lineStarts);
featureSet = scanner.featureSet;
var parser = Parser(
source,
errorListener,
featureSet: featureSet,
+ lineInfo: lineInfo,
);
parser.enableOptionalNewAndConst = true;
var unit = parser.parseCompilationUnit(token);
- unit.lineInfo = LineInfo(scanner.lineStarts);
return ParseResult(
path,
content,
- unit.lineInfo!,
+ unit.lineInfo,
unit,
errorListener.errors,
);
diff --git a/pkg/analyzer/test/src/summary/test_strategies.dart b/pkg/analyzer/test/src/summary/test_strategies.dart
index 8d21be1..b8a9282 100644
--- a/pkg/analyzer/test/src/summary/test_strategies.dart
+++ b/pkg/analyzer/test/src/summary/test_strategies.dart
@@ -25,6 +25,7 @@
featureSet: featureSet,
);
Token token = scanner.tokenize();
+ LineInfo lineInfo = LineInfo(scanner.lineStarts);
// Pass the feature set from the scanner to the parser
// because the scanner may have detected a language version comment
// and downgraded the feature set it holds.
@@ -32,10 +33,9 @@
source,
AnalysisErrorListener.NULL_LISTENER,
featureSet: scanner.featureSet,
+ lineInfo: lineInfo,
);
var unit = parser.parseCompilationUnit(token);
- unit.lineInfo = LineInfo(scanner.lineStarts);
-
unit.languageVersion = LibraryLanguageVersion(
package: ExperimentStatus.currentVersion,
override: null,
diff --git a/pkg/analyzer/test/util/id_testing_helper.dart b/pkg/analyzer/test/util/id_testing_helper.dart
index d39b7db..69780494 100644
--- a/pkg/analyzer/test/util/id_testing_helper.dart
+++ b/pkg/analyzer/test/util/id_testing_helper.dart
@@ -196,7 +196,7 @@
});
} else {
String _formatError(AnalysisError e) {
- var locationInfo = result.unit.lineInfo!.getLocation(e.offset);
+ var locationInfo = result.unit.lineInfo.getLocation(e.offset);
return '$locationInfo: ${e.errorCode}: ${e.message}';
}
diff --git a/pkg/analyzer_cli/tool/perf.dart b/pkg/analyzer_cli/tool/perf.dart
index 2ad2424..09aa60a 100644
--- a/pkg/analyzer_cli/tool/perf.dart
+++ b/pkg/analyzer_cli/tool/perf.dart
@@ -79,13 +79,15 @@
/// Uses the diet-parser to parse only directives in [source].
CompilationUnit parseDirectives(Source source) {
- var token = tokenize(source);
+ var result = tokenize(source);
+ var lineInfo = LineInfo(result.lineStarts);
var parser = Parser(
source,
AnalysisErrorListener.NULL_LISTENER,
featureSet: FeatureSet.latestLanguageVersion(),
+ lineInfo: lineInfo,
);
- return parser.parseDirectives(token);
+ return parser.parseDirectives(result.tokens);
}
/// Parses every file in [files] and reports the time spent doing so.
@@ -113,13 +115,15 @@
/// Parse the full body of [source] and return it's compilation unit.
CompilationUnit parseFull(Source source) {
- var token = tokenize(source);
+ var result = tokenize(source);
+ var lineInfo = LineInfo(result.lineStarts);
var parser = Parser(
source,
AnalysisErrorListener.NULL_LISTENER,
featureSet: FeatureSet.latestLanguageVersion(),
+ lineInfo: lineInfo,
);
- return parser.parseCompilationUnit(token);
+ return parser.parseCompilationUnit(result.tokens);
}
/// Report that metric [name] took [time] micro-seconds to process
@@ -207,7 +211,7 @@
}
/// Scan [source] and return the first token produced by the scanner.
-Token tokenize(Source source) {
+ScannerResult tokenize(Source source) {
scanTimer.start();
var contents = source.contents.data;
scanTotalChars += contents.length;
@@ -224,5 +228,12 @@
..preserveComments = false;
var token = scanner.tokenize();
scanTimer.stop();
- return token;
+ return ScannerResult(token, scanner.lineStarts);
+}
+
+class ScannerResult {
+ final Token tokens;
+ final List<int> lineStarts;
+
+ ScannerResult(this.tokens, this.lineStarts);
}
diff --git a/pkg/front_end/lib/src/fasta/kernel/body_builder.dart b/pkg/front_end/lib/src/fasta/kernel/body_builder.dart
index 142fef3..6ac5cec 100644
--- a/pkg/front_end/lib/src/fasta/kernel/body_builder.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/body_builder.dart
@@ -1875,7 +1875,12 @@
if (initializers.last is SuperInitializer) {
SuperInitializer superInitializer =
initializers.last as SuperInitializer;
- if (libraryBuilder.enableSuperParametersInLibrary) {
+ if (builder.classBuilder.isEnum) {
+ initializers[initializers.length - 1] = buildInvalidInitializer(
+ buildProblem(fasta.messageEnumConstructorSuperInitializer,
+ superInitializer.fileOffset, noLength))
+ ..parent = constructor;
+ } else if (libraryBuilder.enableSuperParametersInLibrary) {
Arguments arguments = superInitializer.arguments;
if (positionalSuperParametersAsArguments != null) {
@@ -1901,11 +1906,6 @@
arguments.named.addAll(namedSuperParametersAsArguments);
setParents(namedSuperParametersAsArguments, arguments);
}
- } else if (libraryBuilder.enableEnhancedEnumsInLibrary) {
- initializers[initializers.length - 1] = buildInvalidInitializer(
- buildProblem(fasta.messageEnumConstructorSuperInitializer,
- superInitializer.fileOffset, noLength))
- ..parent = constructor;
}
} else if (initializers.last is RedirectingInitializer) {
RedirectingInitializer redirectingInitializer =
diff --git a/pkg/front_end/lib/src/fasta/source/source_enum_builder.dart b/pkg/front_end/lib/src/fasta/source/source_enum_builder.dart
index 5376f21..7248daf 100644
--- a/pkg/front_end/lib/src/fasta/source/source_enum_builder.dart
+++ b/pkg/front_end/lib/src/fasta/source/source_enum_builder.dart
@@ -704,7 +704,8 @@
arguments = new ArgumentsImpl(enumSyntheticArguments);
setParents(enumSyntheticArguments, arguments);
if (constructorBuilder == null ||
- constructorBuilder is! SourceConstructorBuilder) {
+ constructorBuilder is! SourceConstructorBuilder ||
+ !constructorBuilder.isConst) {
// This can only occur if there enhanced enum features are used
// when they are not enabled.
assert(libraryBuilder.loader.hasSeenError);
diff --git a/pkg/front_end/testcases/enhanced_enums/super_constructor.dart b/pkg/front_end/testcases/enhanced_enums/super_constructor.dart
new file mode 100644
index 0000000..c21d902
--- /dev/null
+++ b/pkg/front_end/testcases/enhanced_enums/super_constructor.dart
@@ -0,0 +1,17 @@
+// Copyright (c) 2022, 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 A {
+ int field;
+
+ A(this.field);
+}
+
+class B extends A {
+ B(int field) : super(field);
+}
+
+main() {
+ new B(2);
+}
diff --git a/pkg/front_end/testcases/enhanced_enums/super_constructor.dart.strong.expect b/pkg/front_end/testcases/enhanced_enums/super_constructor.dart.strong.expect
new file mode 100644
index 0000000..779bfc3
--- /dev/null
+++ b/pkg/front_end/testcases/enhanced_enums/super_constructor.dart.strong.expect
@@ -0,0 +1,18 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+ field core::int field;
+ constructor •(core::int field) → self::A
+ : self::A::field = field, super core::Object::•()
+ ;
+}
+class B extends self::A {
+ constructor •(core::int field) → self::B
+ : super self::A::•(field)
+ ;
+}
+static method main() → dynamic {
+ new self::B::•(2);
+}
diff --git a/pkg/front_end/testcases/enhanced_enums/super_constructor.dart.strong.transformed.expect b/pkg/front_end/testcases/enhanced_enums/super_constructor.dart.strong.transformed.expect
new file mode 100644
index 0000000..779bfc3
--- /dev/null
+++ b/pkg/front_end/testcases/enhanced_enums/super_constructor.dart.strong.transformed.expect
@@ -0,0 +1,18 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+ field core::int field;
+ constructor •(core::int field) → self::A
+ : self::A::field = field, super core::Object::•()
+ ;
+}
+class B extends self::A {
+ constructor •(core::int field) → self::B
+ : super self::A::•(field)
+ ;
+}
+static method main() → dynamic {
+ new self::B::•(2);
+}
diff --git a/pkg/front_end/testcases/enhanced_enums/super_constructor.dart.textual_outline.expect b/pkg/front_end/testcases/enhanced_enums/super_constructor.dart.textual_outline.expect
new file mode 100644
index 0000000..c38913d
--- /dev/null
+++ b/pkg/front_end/testcases/enhanced_enums/super_constructor.dart.textual_outline.expect
@@ -0,0 +1,10 @@
+class A {
+ int field;
+ A(this.field);
+}
+
+class B extends A {
+ B(int field) : super(field);
+}
+
+main() {}
diff --git a/pkg/front_end/testcases/enhanced_enums/super_constructor.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/enhanced_enums/super_constructor.dart.textual_outline_modelled.expect
new file mode 100644
index 0000000..e85d57e
--- /dev/null
+++ b/pkg/front_end/testcases/enhanced_enums/super_constructor.dart.textual_outline_modelled.expect
@@ -0,0 +1,10 @@
+class A {
+ A(this.field);
+ int field;
+}
+
+class B extends A {
+ B(int field) : super(field);
+}
+
+main() {}
diff --git a/pkg/front_end/testcases/enhanced_enums/super_constructor.dart.weak.expect b/pkg/front_end/testcases/enhanced_enums/super_constructor.dart.weak.expect
new file mode 100644
index 0000000..779bfc3
--- /dev/null
+++ b/pkg/front_end/testcases/enhanced_enums/super_constructor.dart.weak.expect
@@ -0,0 +1,18 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+ field core::int field;
+ constructor •(core::int field) → self::A
+ : self::A::field = field, super core::Object::•()
+ ;
+}
+class B extends self::A {
+ constructor •(core::int field) → self::B
+ : super self::A::•(field)
+ ;
+}
+static method main() → dynamic {
+ new self::B::•(2);
+}
diff --git a/pkg/front_end/testcases/enhanced_enums/super_constructor.dart.weak.modular.expect b/pkg/front_end/testcases/enhanced_enums/super_constructor.dart.weak.modular.expect
new file mode 100644
index 0000000..779bfc3
--- /dev/null
+++ b/pkg/front_end/testcases/enhanced_enums/super_constructor.dart.weak.modular.expect
@@ -0,0 +1,18 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+ field core::int field;
+ constructor •(core::int field) → self::A
+ : self::A::field = field, super core::Object::•()
+ ;
+}
+class B extends self::A {
+ constructor •(core::int field) → self::B
+ : super self::A::•(field)
+ ;
+}
+static method main() → dynamic {
+ new self::B::•(2);
+}
diff --git a/pkg/front_end/testcases/enhanced_enums/super_constructor.dart.weak.outline.expect b/pkg/front_end/testcases/enhanced_enums/super_constructor.dart.weak.outline.expect
new file mode 100644
index 0000000..03c7d16
--- /dev/null
+++ b/pkg/front_end/testcases/enhanced_enums/super_constructor.dart.weak.outline.expect
@@ -0,0 +1,15 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+ field core::int field;
+ constructor •(core::int field) → self::A
+ ;
+}
+class B extends self::A {
+ constructor •(core::int field) → self::B
+ ;
+}
+static method main() → dynamic
+ ;
diff --git a/pkg/front_end/testcases/enhanced_enums/super_constructor.dart.weak.transformed.expect b/pkg/front_end/testcases/enhanced_enums/super_constructor.dart.weak.transformed.expect
new file mode 100644
index 0000000..779bfc3
--- /dev/null
+++ b/pkg/front_end/testcases/enhanced_enums/super_constructor.dart.weak.transformed.expect
@@ -0,0 +1,18 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+ field core::int field;
+ constructor •(core::int field) → self::A
+ : self::A::field = field, super core::Object::•()
+ ;
+}
+class B extends self::A {
+ constructor •(core::int field) → self::B
+ : super self::A::•(field)
+ ;
+}
+static method main() → dynamic {
+ new self::B::•(2);
+}
diff --git a/pkg/front_end/testcases/enhanced_enums/super_parameters/folder.options b/pkg/front_end/testcases/enhanced_enums/super_parameters/folder.options
new file mode 100644
index 0000000..3bea431
--- /dev/null
+++ b/pkg/front_end/testcases/enhanced_enums/super_parameters/folder.options
@@ -0,0 +1 @@
+--enable-experiment=enhanced-enums,super-parameters
\ No newline at end of file
diff --git a/pkg/front_end/testcases/enhanced_enums/super_parameters/malformed_constructors.dart b/pkg/front_end/testcases/enhanced_enums/super_parameters/malformed_constructors.dart
new file mode 100644
index 0000000..7869a49
--- /dev/null
+++ b/pkg/front_end/testcases/enhanced_enums/super_parameters/malformed_constructors.dart
@@ -0,0 +1,20 @@
+// 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.
+
+enum E1 {
+ element;
+
+ E1(); // Error.
+ E1.named(); // Error.
+}
+
+enum E2 {
+ one.named1(),
+ two.named2();
+
+ const E2.named1() : super(); // Error.
+ const E2.named2() : super(42, "42"); // Error.
+}
+
+main() {}
diff --git a/pkg/front_end/testcases/enhanced_enums/super_parameters/malformed_constructors.dart.strong.expect b/pkg/front_end/testcases/enhanced_enums/super_parameters/malformed_constructors.dart.strong.expect
new file mode 100644
index 0000000..d03a931
--- /dev/null
+++ b/pkg/front_end/testcases/enhanced_enums/super_parameters/malformed_constructors.dart.strong.expect
@@ -0,0 +1,77 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/enhanced_enums/super_parameters/malformed_constructors.dart:8:3: Error: Generative enum constructors must be marked as 'const'.
+// E1(); // Error.
+// ^
+//
+// pkg/front_end/testcases/enhanced_enums/super_parameters/malformed_constructors.dart:9:3: Error: Generative enum constructors must be marked as 'const'.
+// E1.named(); // Error.
+// ^
+//
+// pkg/front_end/testcases/enhanced_enums/super_parameters/malformed_constructors.dart:6:3: Error: Cannot invoke a non-'const' constructor where a const expression is expected.
+// Try using a constructor or factory that is 'const'.
+// element;
+// ^
+//
+// pkg/front_end/testcases/enhanced_enums/super_parameters/malformed_constructors.dart:16:23: Error: Enum constructors can't contain super-initializers.
+// const E2.named1() : super(); // Error.
+// ^
+//
+// pkg/front_end/testcases/enhanced_enums/super_parameters/malformed_constructors.dart:17:23: Error: Enum constructors can't contain super-initializers.
+// const E2.named2() : super(42, "42"); // Error.
+// ^
+//
+import self as self;
+import "dart:core" as core;
+
+class E1 extends core::_Enum /*isEnum*/ {
+ static const field core::List<self::E1> values = invalid-expression "pkg/front_end/testcases/enhanced_enums/super_parameters/malformed_constructors.dart:6:3: Error: Cannot invoke a non-'const' constructor where a const expression is expected.
+Try using a constructor or factory that is 'const'.
+ element;
+ ^";
+ static const field invalid-type element = invalid-expression "pkg/front_end/testcases/enhanced_enums/super_parameters/malformed_constructors.dart:6:3: Error: Cannot invoke a non-'const' constructor where a const expression is expected.
+Try using a constructor or factory that is 'const'.
+ element;
+ ^";
+ constructor •(core::int index, core::String name) → self::E1
+ : super core::_Enum::•(index, name)
+ ;
+ constructor named(core::int index, core::String name) → self::E1
+ : super core::_Enum::•(index, name)
+ ;
+ method toString() → core::String
+ return "E1.${this.{core::_Enum::_name}{core::String}}";
+}
+class E2 extends core::_Enum /*isEnum*/ {
+ static const field core::List<self::E2> values = invalid-expression "pkg/front_end/testcases/enhanced_enums/super_parameters/malformed_constructors.dart:16:23: Error: Enum constructors can't contain super-initializers.
+ const E2.named1() : super(); // Error.
+ ^";
+ static const field self::E2 one = invalid-expression "pkg/front_end/testcases/enhanced_enums/super_parameters/malformed_constructors.dart:16:23: Error: Enum constructors can't contain super-initializers.
+ const E2.named1() : super(); // Error.
+ ^";
+ static const field self::E2 two = invalid-expression "pkg/front_end/testcases/enhanced_enums/super_parameters/malformed_constructors.dart:17:23: Error: Enum constructors can't contain super-initializers.
+ const E2.named2() : super(42, \"42\"); // Error.
+ ^";
+ const constructor named1(core::int index, core::String name) → self::E2
+ : final dynamic #t1 = invalid-expression "pkg/front_end/testcases/enhanced_enums/super_parameters/malformed_constructors.dart:16:23: Error: Enum constructors can't contain super-initializers.
+ const E2.named1() : super(); // Error.
+ ^"
+ ;
+ const constructor named2(core::int index, core::String name) → self::E2
+ : final dynamic #t2 = invalid-expression "pkg/front_end/testcases/enhanced_enums/super_parameters/malformed_constructors.dart:17:23: Error: Enum constructors can't contain super-initializers.
+ const E2.named2() : super(42, \"42\"); // Error.
+ ^"
+ ;
+ method toString() → core::String
+ return "E2.${this.{core::_Enum::_name}{core::String}}";
+}
+static method main() → dynamic {}
+
+
+
+Constructor coverage from constants:
+org-dartlang-testcase:///malformed_constructors.dart:
+- E2.named1 (from org-dartlang-testcase:///malformed_constructors.dart:16:9)
+- E2.named2 (from org-dartlang-testcase:///malformed_constructors.dart:17:9)
diff --git a/pkg/front_end/testcases/enhanced_enums/super_parameters/malformed_constructors.dart.strong.transformed.expect b/pkg/front_end/testcases/enhanced_enums/super_parameters/malformed_constructors.dart.strong.transformed.expect
new file mode 100644
index 0000000..d03a931
--- /dev/null
+++ b/pkg/front_end/testcases/enhanced_enums/super_parameters/malformed_constructors.dart.strong.transformed.expect
@@ -0,0 +1,77 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/enhanced_enums/super_parameters/malformed_constructors.dart:8:3: Error: Generative enum constructors must be marked as 'const'.
+// E1(); // Error.
+// ^
+//
+// pkg/front_end/testcases/enhanced_enums/super_parameters/malformed_constructors.dart:9:3: Error: Generative enum constructors must be marked as 'const'.
+// E1.named(); // Error.
+// ^
+//
+// pkg/front_end/testcases/enhanced_enums/super_parameters/malformed_constructors.dart:6:3: Error: Cannot invoke a non-'const' constructor where a const expression is expected.
+// Try using a constructor or factory that is 'const'.
+// element;
+// ^
+//
+// pkg/front_end/testcases/enhanced_enums/super_parameters/malformed_constructors.dart:16:23: Error: Enum constructors can't contain super-initializers.
+// const E2.named1() : super(); // Error.
+// ^
+//
+// pkg/front_end/testcases/enhanced_enums/super_parameters/malformed_constructors.dart:17:23: Error: Enum constructors can't contain super-initializers.
+// const E2.named2() : super(42, "42"); // Error.
+// ^
+//
+import self as self;
+import "dart:core" as core;
+
+class E1 extends core::_Enum /*isEnum*/ {
+ static const field core::List<self::E1> values = invalid-expression "pkg/front_end/testcases/enhanced_enums/super_parameters/malformed_constructors.dart:6:3: Error: Cannot invoke a non-'const' constructor where a const expression is expected.
+Try using a constructor or factory that is 'const'.
+ element;
+ ^";
+ static const field invalid-type element = invalid-expression "pkg/front_end/testcases/enhanced_enums/super_parameters/malformed_constructors.dart:6:3: Error: Cannot invoke a non-'const' constructor where a const expression is expected.
+Try using a constructor or factory that is 'const'.
+ element;
+ ^";
+ constructor •(core::int index, core::String name) → self::E1
+ : super core::_Enum::•(index, name)
+ ;
+ constructor named(core::int index, core::String name) → self::E1
+ : super core::_Enum::•(index, name)
+ ;
+ method toString() → core::String
+ return "E1.${this.{core::_Enum::_name}{core::String}}";
+}
+class E2 extends core::_Enum /*isEnum*/ {
+ static const field core::List<self::E2> values = invalid-expression "pkg/front_end/testcases/enhanced_enums/super_parameters/malformed_constructors.dart:16:23: Error: Enum constructors can't contain super-initializers.
+ const E2.named1() : super(); // Error.
+ ^";
+ static const field self::E2 one = invalid-expression "pkg/front_end/testcases/enhanced_enums/super_parameters/malformed_constructors.dart:16:23: Error: Enum constructors can't contain super-initializers.
+ const E2.named1() : super(); // Error.
+ ^";
+ static const field self::E2 two = invalid-expression "pkg/front_end/testcases/enhanced_enums/super_parameters/malformed_constructors.dart:17:23: Error: Enum constructors can't contain super-initializers.
+ const E2.named2() : super(42, \"42\"); // Error.
+ ^";
+ const constructor named1(core::int index, core::String name) → self::E2
+ : final dynamic #t1 = invalid-expression "pkg/front_end/testcases/enhanced_enums/super_parameters/malformed_constructors.dart:16:23: Error: Enum constructors can't contain super-initializers.
+ const E2.named1() : super(); // Error.
+ ^"
+ ;
+ const constructor named2(core::int index, core::String name) → self::E2
+ : final dynamic #t2 = invalid-expression "pkg/front_end/testcases/enhanced_enums/super_parameters/malformed_constructors.dart:17:23: Error: Enum constructors can't contain super-initializers.
+ const E2.named2() : super(42, \"42\"); // Error.
+ ^"
+ ;
+ method toString() → core::String
+ return "E2.${this.{core::_Enum::_name}{core::String}}";
+}
+static method main() → dynamic {}
+
+
+
+Constructor coverage from constants:
+org-dartlang-testcase:///malformed_constructors.dart:
+- E2.named1 (from org-dartlang-testcase:///malformed_constructors.dart:16:9)
+- E2.named2 (from org-dartlang-testcase:///malformed_constructors.dart:17:9)
diff --git a/pkg/front_end/testcases/enhanced_enums/super_parameters/malformed_constructors.dart.textual_outline.expect b/pkg/front_end/testcases/enhanced_enums/super_parameters/malformed_constructors.dart.textual_outline.expect
new file mode 100644
index 0000000..4aac745
--- /dev/null
+++ b/pkg/front_end/testcases/enhanced_enums/super_parameters/malformed_constructors.dart.textual_outline.expect
@@ -0,0 +1,3 @@
+enum E1 { element; E1(); E1.named(); }
+enum E2 { one.named1(), two.named2(); const E2.named1() : super(); const E2.named2() : super(42, "42"); }
+main() {}
diff --git a/pkg/front_end/testcases/enhanced_enums/super_parameters/malformed_constructors.dart.weak.expect b/pkg/front_end/testcases/enhanced_enums/super_parameters/malformed_constructors.dart.weak.expect
new file mode 100644
index 0000000..d03a931
--- /dev/null
+++ b/pkg/front_end/testcases/enhanced_enums/super_parameters/malformed_constructors.dart.weak.expect
@@ -0,0 +1,77 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/enhanced_enums/super_parameters/malformed_constructors.dart:8:3: Error: Generative enum constructors must be marked as 'const'.
+// E1(); // Error.
+// ^
+//
+// pkg/front_end/testcases/enhanced_enums/super_parameters/malformed_constructors.dart:9:3: Error: Generative enum constructors must be marked as 'const'.
+// E1.named(); // Error.
+// ^
+//
+// pkg/front_end/testcases/enhanced_enums/super_parameters/malformed_constructors.dart:6:3: Error: Cannot invoke a non-'const' constructor where a const expression is expected.
+// Try using a constructor or factory that is 'const'.
+// element;
+// ^
+//
+// pkg/front_end/testcases/enhanced_enums/super_parameters/malformed_constructors.dart:16:23: Error: Enum constructors can't contain super-initializers.
+// const E2.named1() : super(); // Error.
+// ^
+//
+// pkg/front_end/testcases/enhanced_enums/super_parameters/malformed_constructors.dart:17:23: Error: Enum constructors can't contain super-initializers.
+// const E2.named2() : super(42, "42"); // Error.
+// ^
+//
+import self as self;
+import "dart:core" as core;
+
+class E1 extends core::_Enum /*isEnum*/ {
+ static const field core::List<self::E1> values = invalid-expression "pkg/front_end/testcases/enhanced_enums/super_parameters/malformed_constructors.dart:6:3: Error: Cannot invoke a non-'const' constructor where a const expression is expected.
+Try using a constructor or factory that is 'const'.
+ element;
+ ^";
+ static const field invalid-type element = invalid-expression "pkg/front_end/testcases/enhanced_enums/super_parameters/malformed_constructors.dart:6:3: Error: Cannot invoke a non-'const' constructor where a const expression is expected.
+Try using a constructor or factory that is 'const'.
+ element;
+ ^";
+ constructor •(core::int index, core::String name) → self::E1
+ : super core::_Enum::•(index, name)
+ ;
+ constructor named(core::int index, core::String name) → self::E1
+ : super core::_Enum::•(index, name)
+ ;
+ method toString() → core::String
+ return "E1.${this.{core::_Enum::_name}{core::String}}";
+}
+class E2 extends core::_Enum /*isEnum*/ {
+ static const field core::List<self::E2> values = invalid-expression "pkg/front_end/testcases/enhanced_enums/super_parameters/malformed_constructors.dart:16:23: Error: Enum constructors can't contain super-initializers.
+ const E2.named1() : super(); // Error.
+ ^";
+ static const field self::E2 one = invalid-expression "pkg/front_end/testcases/enhanced_enums/super_parameters/malformed_constructors.dart:16:23: Error: Enum constructors can't contain super-initializers.
+ const E2.named1() : super(); // Error.
+ ^";
+ static const field self::E2 two = invalid-expression "pkg/front_end/testcases/enhanced_enums/super_parameters/malformed_constructors.dart:17:23: Error: Enum constructors can't contain super-initializers.
+ const E2.named2() : super(42, \"42\"); // Error.
+ ^";
+ const constructor named1(core::int index, core::String name) → self::E2
+ : final dynamic #t1 = invalid-expression "pkg/front_end/testcases/enhanced_enums/super_parameters/malformed_constructors.dart:16:23: Error: Enum constructors can't contain super-initializers.
+ const E2.named1() : super(); // Error.
+ ^"
+ ;
+ const constructor named2(core::int index, core::String name) → self::E2
+ : final dynamic #t2 = invalid-expression "pkg/front_end/testcases/enhanced_enums/super_parameters/malformed_constructors.dart:17:23: Error: Enum constructors can't contain super-initializers.
+ const E2.named2() : super(42, \"42\"); // Error.
+ ^"
+ ;
+ method toString() → core::String
+ return "E2.${this.{core::_Enum::_name}{core::String}}";
+}
+static method main() → dynamic {}
+
+
+
+Constructor coverage from constants:
+org-dartlang-testcase:///malformed_constructors.dart:
+- E2.named1 (from org-dartlang-testcase:///malformed_constructors.dart:16:9)
+- E2.named2 (from org-dartlang-testcase:///malformed_constructors.dart:17:9)
diff --git a/pkg/front_end/testcases/enhanced_enums/super_parameters/malformed_constructors.dart.weak.modular.expect b/pkg/front_end/testcases/enhanced_enums/super_parameters/malformed_constructors.dart.weak.modular.expect
new file mode 100644
index 0000000..d03a931
--- /dev/null
+++ b/pkg/front_end/testcases/enhanced_enums/super_parameters/malformed_constructors.dart.weak.modular.expect
@@ -0,0 +1,77 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/enhanced_enums/super_parameters/malformed_constructors.dart:8:3: Error: Generative enum constructors must be marked as 'const'.
+// E1(); // Error.
+// ^
+//
+// pkg/front_end/testcases/enhanced_enums/super_parameters/malformed_constructors.dart:9:3: Error: Generative enum constructors must be marked as 'const'.
+// E1.named(); // Error.
+// ^
+//
+// pkg/front_end/testcases/enhanced_enums/super_parameters/malformed_constructors.dart:6:3: Error: Cannot invoke a non-'const' constructor where a const expression is expected.
+// Try using a constructor or factory that is 'const'.
+// element;
+// ^
+//
+// pkg/front_end/testcases/enhanced_enums/super_parameters/malformed_constructors.dart:16:23: Error: Enum constructors can't contain super-initializers.
+// const E2.named1() : super(); // Error.
+// ^
+//
+// pkg/front_end/testcases/enhanced_enums/super_parameters/malformed_constructors.dart:17:23: Error: Enum constructors can't contain super-initializers.
+// const E2.named2() : super(42, "42"); // Error.
+// ^
+//
+import self as self;
+import "dart:core" as core;
+
+class E1 extends core::_Enum /*isEnum*/ {
+ static const field core::List<self::E1> values = invalid-expression "pkg/front_end/testcases/enhanced_enums/super_parameters/malformed_constructors.dart:6:3: Error: Cannot invoke a non-'const' constructor where a const expression is expected.
+Try using a constructor or factory that is 'const'.
+ element;
+ ^";
+ static const field invalid-type element = invalid-expression "pkg/front_end/testcases/enhanced_enums/super_parameters/malformed_constructors.dart:6:3: Error: Cannot invoke a non-'const' constructor where a const expression is expected.
+Try using a constructor or factory that is 'const'.
+ element;
+ ^";
+ constructor •(core::int index, core::String name) → self::E1
+ : super core::_Enum::•(index, name)
+ ;
+ constructor named(core::int index, core::String name) → self::E1
+ : super core::_Enum::•(index, name)
+ ;
+ method toString() → core::String
+ return "E1.${this.{core::_Enum::_name}{core::String}}";
+}
+class E2 extends core::_Enum /*isEnum*/ {
+ static const field core::List<self::E2> values = invalid-expression "pkg/front_end/testcases/enhanced_enums/super_parameters/malformed_constructors.dart:16:23: Error: Enum constructors can't contain super-initializers.
+ const E2.named1() : super(); // Error.
+ ^";
+ static const field self::E2 one = invalid-expression "pkg/front_end/testcases/enhanced_enums/super_parameters/malformed_constructors.dart:16:23: Error: Enum constructors can't contain super-initializers.
+ const E2.named1() : super(); // Error.
+ ^";
+ static const field self::E2 two = invalid-expression "pkg/front_end/testcases/enhanced_enums/super_parameters/malformed_constructors.dart:17:23: Error: Enum constructors can't contain super-initializers.
+ const E2.named2() : super(42, \"42\"); // Error.
+ ^";
+ const constructor named1(core::int index, core::String name) → self::E2
+ : final dynamic #t1 = invalid-expression "pkg/front_end/testcases/enhanced_enums/super_parameters/malformed_constructors.dart:16:23: Error: Enum constructors can't contain super-initializers.
+ const E2.named1() : super(); // Error.
+ ^"
+ ;
+ const constructor named2(core::int index, core::String name) → self::E2
+ : final dynamic #t2 = invalid-expression "pkg/front_end/testcases/enhanced_enums/super_parameters/malformed_constructors.dart:17:23: Error: Enum constructors can't contain super-initializers.
+ const E2.named2() : super(42, \"42\"); // Error.
+ ^"
+ ;
+ method toString() → core::String
+ return "E2.${this.{core::_Enum::_name}{core::String}}";
+}
+static method main() → dynamic {}
+
+
+
+Constructor coverage from constants:
+org-dartlang-testcase:///malformed_constructors.dart:
+- E2.named1 (from org-dartlang-testcase:///malformed_constructors.dart:16:9)
+- E2.named2 (from org-dartlang-testcase:///malformed_constructors.dart:17:9)
diff --git a/pkg/front_end/testcases/enhanced_enums/super_parameters/malformed_constructors.dart.weak.outline.expect b/pkg/front_end/testcases/enhanced_enums/super_parameters/malformed_constructors.dart.weak.outline.expect
new file mode 100644
index 0000000..35667795
--- /dev/null
+++ b/pkg/front_end/testcases/enhanced_enums/super_parameters/malformed_constructors.dart.weak.outline.expect
@@ -0,0 +1,60 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/enhanced_enums/super_parameters/malformed_constructors.dart:8:3: Error: Generative enum constructors must be marked as 'const'.
+// E1(); // Error.
+// ^
+//
+// pkg/front_end/testcases/enhanced_enums/super_parameters/malformed_constructors.dart:9:3: Error: Generative enum constructors must be marked as 'const'.
+// E1.named(); // Error.
+// ^
+//
+// pkg/front_end/testcases/enhanced_enums/super_parameters/malformed_constructors.dart:6:3: Error: Cannot invoke a non-'const' constructor where a const expression is expected.
+// Try using a constructor or factory that is 'const'.
+// element;
+// ^
+//
+// pkg/front_end/testcases/enhanced_enums/super_parameters/malformed_constructors.dart:16:23: Error: Enum constructors can't contain super-initializers.
+// const E2.named1() : super(); // Error.
+// ^
+//
+// pkg/front_end/testcases/enhanced_enums/super_parameters/malformed_constructors.dart:17:23: Error: Enum constructors can't contain super-initializers.
+// const E2.named2() : super(42, "42"); // Error.
+// ^
+//
+import self as self;
+import "dart:core" as core;
+
+class E1 extends core::_Enum /*isEnum*/ {
+ static const field core::List<self::E1> values = const <self::E1>[self::E1::element];
+ static const field invalid-type element = invalid-expression "pkg/front_end/testcases/enhanced_enums/super_parameters/malformed_constructors.dart:6:3: Error: Cannot invoke a non-'const' constructor where a const expression is expected.
+Try using a constructor or factory that is 'const'.
+ element;
+ ^";
+ constructor •(core::int index, core::String name) → self::E1
+ ;
+ constructor named(core::int index, core::String name) → self::E1
+ ;
+ method toString() → core::String
+ return "E1.${this.{core::_Enum::_name}{core::String}}";
+}
+class E2 extends core::_Enum /*isEnum*/ {
+ static const field core::List<self::E2> values = const <self::E2>[self::E2::one, self::E2::two];
+ static const field self::E2 one = const self::E2::named1(0, "one");
+ static const field self::E2 two = const self::E2::named2(1, "two");
+ const constructor named1(core::int index, core::String name) → self::E2
+ : final dynamic #t1 = invalid-expression "pkg/front_end/testcases/enhanced_enums/super_parameters/malformed_constructors.dart:16:23: Error: Enum constructors can't contain super-initializers.
+ const E2.named1() : super(); // Error.
+ ^"
+ ;
+ const constructor named2(core::int index, core::String name) → self::E2
+ : final dynamic #t2 = invalid-expression "pkg/front_end/testcases/enhanced_enums/super_parameters/malformed_constructors.dart:17:23: Error: Enum constructors can't contain super-initializers.
+ const E2.named2() : super(42, \"42\"); // Error.
+ ^"
+ ;
+ method toString() → core::String
+ return "E2.${this.{core::_Enum::_name}{core::String}}";
+}
+static method main() → dynamic
+ ;
diff --git a/pkg/front_end/testcases/enhanced_enums/super_parameters/malformed_constructors.dart.weak.transformed.expect b/pkg/front_end/testcases/enhanced_enums/super_parameters/malformed_constructors.dart.weak.transformed.expect
new file mode 100644
index 0000000..d03a931
--- /dev/null
+++ b/pkg/front_end/testcases/enhanced_enums/super_parameters/malformed_constructors.dart.weak.transformed.expect
@@ -0,0 +1,77 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/enhanced_enums/super_parameters/malformed_constructors.dart:8:3: Error: Generative enum constructors must be marked as 'const'.
+// E1(); // Error.
+// ^
+//
+// pkg/front_end/testcases/enhanced_enums/super_parameters/malformed_constructors.dart:9:3: Error: Generative enum constructors must be marked as 'const'.
+// E1.named(); // Error.
+// ^
+//
+// pkg/front_end/testcases/enhanced_enums/super_parameters/malformed_constructors.dart:6:3: Error: Cannot invoke a non-'const' constructor where a const expression is expected.
+// Try using a constructor or factory that is 'const'.
+// element;
+// ^
+//
+// pkg/front_end/testcases/enhanced_enums/super_parameters/malformed_constructors.dart:16:23: Error: Enum constructors can't contain super-initializers.
+// const E2.named1() : super(); // Error.
+// ^
+//
+// pkg/front_end/testcases/enhanced_enums/super_parameters/malformed_constructors.dart:17:23: Error: Enum constructors can't contain super-initializers.
+// const E2.named2() : super(42, "42"); // Error.
+// ^
+//
+import self as self;
+import "dart:core" as core;
+
+class E1 extends core::_Enum /*isEnum*/ {
+ static const field core::List<self::E1> values = invalid-expression "pkg/front_end/testcases/enhanced_enums/super_parameters/malformed_constructors.dart:6:3: Error: Cannot invoke a non-'const' constructor where a const expression is expected.
+Try using a constructor or factory that is 'const'.
+ element;
+ ^";
+ static const field invalid-type element = invalid-expression "pkg/front_end/testcases/enhanced_enums/super_parameters/malformed_constructors.dart:6:3: Error: Cannot invoke a non-'const' constructor where a const expression is expected.
+Try using a constructor or factory that is 'const'.
+ element;
+ ^";
+ constructor •(core::int index, core::String name) → self::E1
+ : super core::_Enum::•(index, name)
+ ;
+ constructor named(core::int index, core::String name) → self::E1
+ : super core::_Enum::•(index, name)
+ ;
+ method toString() → core::String
+ return "E1.${this.{core::_Enum::_name}{core::String}}";
+}
+class E2 extends core::_Enum /*isEnum*/ {
+ static const field core::List<self::E2> values = invalid-expression "pkg/front_end/testcases/enhanced_enums/super_parameters/malformed_constructors.dart:16:23: Error: Enum constructors can't contain super-initializers.
+ const E2.named1() : super(); // Error.
+ ^";
+ static const field self::E2 one = invalid-expression "pkg/front_end/testcases/enhanced_enums/super_parameters/malformed_constructors.dart:16:23: Error: Enum constructors can't contain super-initializers.
+ const E2.named1() : super(); // Error.
+ ^";
+ static const field self::E2 two = invalid-expression "pkg/front_end/testcases/enhanced_enums/super_parameters/malformed_constructors.dart:17:23: Error: Enum constructors can't contain super-initializers.
+ const E2.named2() : super(42, \"42\"); // Error.
+ ^";
+ const constructor named1(core::int index, core::String name) → self::E2
+ : final dynamic #t1 = invalid-expression "pkg/front_end/testcases/enhanced_enums/super_parameters/malformed_constructors.dart:16:23: Error: Enum constructors can't contain super-initializers.
+ const E2.named1() : super(); // Error.
+ ^"
+ ;
+ const constructor named2(core::int index, core::String name) → self::E2
+ : final dynamic #t2 = invalid-expression "pkg/front_end/testcases/enhanced_enums/super_parameters/malformed_constructors.dart:17:23: Error: Enum constructors can't contain super-initializers.
+ const E2.named2() : super(42, \"42\"); // Error.
+ ^"
+ ;
+ method toString() → core::String
+ return "E2.${this.{core::_Enum::_name}{core::String}}";
+}
+static method main() → dynamic {}
+
+
+
+Constructor coverage from constants:
+org-dartlang-testcase:///malformed_constructors.dart:
+- E2.named1 (from org-dartlang-testcase:///malformed_constructors.dart:16:9)
+- E2.named2 (from org-dartlang-testcase:///malformed_constructors.dart:17:9)
diff --git a/pkg/front_end/testcases/enhanced_enums/super_parameters/super_constructor.dart b/pkg/front_end/testcases/enhanced_enums/super_parameters/super_constructor.dart
new file mode 100644
index 0000000..c21d902
--- /dev/null
+++ b/pkg/front_end/testcases/enhanced_enums/super_parameters/super_constructor.dart
@@ -0,0 +1,17 @@
+// Copyright (c) 2022, 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 A {
+ int field;
+
+ A(this.field);
+}
+
+class B extends A {
+ B(int field) : super(field);
+}
+
+main() {
+ new B(2);
+}
diff --git a/pkg/front_end/testcases/enhanced_enums/super_parameters/super_constructor.dart.strong.expect b/pkg/front_end/testcases/enhanced_enums/super_parameters/super_constructor.dart.strong.expect
new file mode 100644
index 0000000..779bfc3
--- /dev/null
+++ b/pkg/front_end/testcases/enhanced_enums/super_parameters/super_constructor.dart.strong.expect
@@ -0,0 +1,18 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+ field core::int field;
+ constructor •(core::int field) → self::A
+ : self::A::field = field, super core::Object::•()
+ ;
+}
+class B extends self::A {
+ constructor •(core::int field) → self::B
+ : super self::A::•(field)
+ ;
+}
+static method main() → dynamic {
+ new self::B::•(2);
+}
diff --git a/pkg/front_end/testcases/enhanced_enums/super_parameters/super_constructor.dart.strong.transformed.expect b/pkg/front_end/testcases/enhanced_enums/super_parameters/super_constructor.dart.strong.transformed.expect
new file mode 100644
index 0000000..779bfc3
--- /dev/null
+++ b/pkg/front_end/testcases/enhanced_enums/super_parameters/super_constructor.dart.strong.transformed.expect
@@ -0,0 +1,18 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+ field core::int field;
+ constructor •(core::int field) → self::A
+ : self::A::field = field, super core::Object::•()
+ ;
+}
+class B extends self::A {
+ constructor •(core::int field) → self::B
+ : super self::A::•(field)
+ ;
+}
+static method main() → dynamic {
+ new self::B::•(2);
+}
diff --git a/pkg/front_end/testcases/enhanced_enums/super_parameters/super_constructor.dart.textual_outline.expect b/pkg/front_end/testcases/enhanced_enums/super_parameters/super_constructor.dart.textual_outline.expect
new file mode 100644
index 0000000..c38913d
--- /dev/null
+++ b/pkg/front_end/testcases/enhanced_enums/super_parameters/super_constructor.dart.textual_outline.expect
@@ -0,0 +1,10 @@
+class A {
+ int field;
+ A(this.field);
+}
+
+class B extends A {
+ B(int field) : super(field);
+}
+
+main() {}
diff --git a/pkg/front_end/testcases/enhanced_enums/super_parameters/super_constructor.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/enhanced_enums/super_parameters/super_constructor.dart.textual_outline_modelled.expect
new file mode 100644
index 0000000..e85d57e
--- /dev/null
+++ b/pkg/front_end/testcases/enhanced_enums/super_parameters/super_constructor.dart.textual_outline_modelled.expect
@@ -0,0 +1,10 @@
+class A {
+ A(this.field);
+ int field;
+}
+
+class B extends A {
+ B(int field) : super(field);
+}
+
+main() {}
diff --git a/pkg/front_end/testcases/enhanced_enums/super_parameters/super_constructor.dart.weak.expect b/pkg/front_end/testcases/enhanced_enums/super_parameters/super_constructor.dart.weak.expect
new file mode 100644
index 0000000..779bfc3
--- /dev/null
+++ b/pkg/front_end/testcases/enhanced_enums/super_parameters/super_constructor.dart.weak.expect
@@ -0,0 +1,18 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+ field core::int field;
+ constructor •(core::int field) → self::A
+ : self::A::field = field, super core::Object::•()
+ ;
+}
+class B extends self::A {
+ constructor •(core::int field) → self::B
+ : super self::A::•(field)
+ ;
+}
+static method main() → dynamic {
+ new self::B::•(2);
+}
diff --git a/pkg/front_end/testcases/enhanced_enums/super_parameters/super_constructor.dart.weak.modular.expect b/pkg/front_end/testcases/enhanced_enums/super_parameters/super_constructor.dart.weak.modular.expect
new file mode 100644
index 0000000..779bfc3
--- /dev/null
+++ b/pkg/front_end/testcases/enhanced_enums/super_parameters/super_constructor.dart.weak.modular.expect
@@ -0,0 +1,18 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+ field core::int field;
+ constructor •(core::int field) → self::A
+ : self::A::field = field, super core::Object::•()
+ ;
+}
+class B extends self::A {
+ constructor •(core::int field) → self::B
+ : super self::A::•(field)
+ ;
+}
+static method main() → dynamic {
+ new self::B::•(2);
+}
diff --git a/pkg/front_end/testcases/enhanced_enums/super_parameters/super_constructor.dart.weak.outline.expect b/pkg/front_end/testcases/enhanced_enums/super_parameters/super_constructor.dart.weak.outline.expect
new file mode 100644
index 0000000..03c7d16
--- /dev/null
+++ b/pkg/front_end/testcases/enhanced_enums/super_parameters/super_constructor.dart.weak.outline.expect
@@ -0,0 +1,15 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+ field core::int field;
+ constructor •(core::int field) → self::A
+ ;
+}
+class B extends self::A {
+ constructor •(core::int field) → self::B
+ ;
+}
+static method main() → dynamic
+ ;
diff --git a/pkg/front_end/testcases/enhanced_enums/super_parameters/super_constructor.dart.weak.transformed.expect b/pkg/front_end/testcases/enhanced_enums/super_parameters/super_constructor.dart.weak.transformed.expect
new file mode 100644
index 0000000..779bfc3
--- /dev/null
+++ b/pkg/front_end/testcases/enhanced_enums/super_parameters/super_constructor.dart.weak.transformed.expect
@@ -0,0 +1,18 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+ field core::int field;
+ constructor •(core::int field) → self::A
+ : self::A::field = field, super core::Object::•()
+ ;
+}
+class B extends self::A {
+ constructor •(core::int field) → self::B
+ : super self::A::•(field)
+ ;
+}
+static method main() → dynamic {
+ new self::B::•(2);
+}
diff --git a/pkg/front_end/testcases/general/enum_super_constructor.dart b/pkg/front_end/testcases/general/enum_super_constructor.dart
new file mode 100644
index 0000000..6cab395
--- /dev/null
+++ b/pkg/front_end/testcases/general/enum_super_constructor.dart
@@ -0,0 +1,17 @@
+// Copyright (c) 2022, 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.16
+
+enum A {
+ a;
+ A() : super();
+}
+
+enum B {
+ b;
+ const B() : super();
+}
+
+main() {}
\ No newline at end of file
diff --git a/pkg/front_end/testcases/general/enum_super_constructor.dart.textual_outline.expect b/pkg/front_end/testcases/general/enum_super_constructor.dart.textual_outline.expect
new file mode 100644
index 0000000..5f6cef5
--- /dev/null
+++ b/pkg/front_end/testcases/general/enum_super_constructor.dart.textual_outline.expect
@@ -0,0 +1,4 @@
+// @dart = 2.16
+enum A { a; A() : super(); }
+enum B { b; const B() : super(); }
+main() {}
diff --git a/pkg/front_end/testcases/general/enum_super_constructor.dart.weak.expect b/pkg/front_end/testcases/general/enum_super_constructor.dart.weak.expect
new file mode 100644
index 0000000..4c629c8
--- /dev/null
+++ b/pkg/front_end/testcases/general/enum_super_constructor.dart.weak.expect
@@ -0,0 +1,66 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/enum_super_constructor.dart:9:3: Error: This requires the 'enhanced-enums' language feature to be enabled.
+// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.17 or higher, and running 'pub get'.
+// A() : super();
+// ^
+//
+// pkg/front_end/testcases/general/enum_super_constructor.dart:9:3: Error: Generative enum constructors must be marked as 'const'.
+// A() : super();
+// ^
+//
+// pkg/front_end/testcases/general/enum_super_constructor.dart:14:3: Error: This requires the 'enhanced-enums' language feature to be enabled.
+// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.17 or higher, and running 'pub get'.
+// const B() : super();
+// ^
+//
+// pkg/front_end/testcases/general/enum_super_constructor.dart:14:15: Error: Enum constructors can't contain super-initializers.
+// const B() : super();
+// ^
+//
+// pkg/front_end/testcases/general/enum_super_constructor.dart:9:9: Error: Enum constructors can't contain super-initializers.
+// A() : super();
+// ^
+//
+import self as self;
+import "dart:core" as core;
+
+class A extends core::_Enum /*isEnum*/ {
+ static const field core::List<self::A> values = invalid-expression "pkg/front_end/testcases/general/enum_super_constructor.dart:8:3: Error: Couldn't find constructor 'A'.
+ a;
+ ^";
+ static const field self::A a = invalid-expression "pkg/front_end/testcases/general/enum_super_constructor.dart:8:3: Error: Couldn't find constructor 'A'.
+ a;
+ ^";
+ constructor •(core::int index, core::String name) → self::A
+ : final dynamic #t1 = invalid-expression "pkg/front_end/testcases/general/enum_super_constructor.dart:9:9: Error: Enum constructors can't contain super-initializers.
+ A() : super();
+ ^"
+ ;
+ method toString() → core::String
+ return "A.${this.{core::_Enum::_name}{core::String}}";
+}
+class B extends core::_Enum /*isEnum*/ {
+ static const field core::List<self::B> values = invalid-expression "pkg/front_end/testcases/general/enum_super_constructor.dart:14:15: Error: Enum constructors can't contain super-initializers.
+ const B() : super();
+ ^";
+ static const field self::B b = invalid-expression "pkg/front_end/testcases/general/enum_super_constructor.dart:14:15: Error: Enum constructors can't contain super-initializers.
+ const B() : super();
+ ^";
+ const constructor •(core::int index, core::String name) → self::B
+ : final dynamic #t2 = invalid-expression "pkg/front_end/testcases/general/enum_super_constructor.dart:14:15: Error: Enum constructors can't contain super-initializers.
+ const B() : super();
+ ^"
+ ;
+ method toString() → core::String
+ return "B.${this.{core::_Enum::_name}{core::String}}";
+}
+static method main() → dynamic {}
+
+
+
+Constructor coverage from constants:
+org-dartlang-testcase:///enum_super_constructor.dart:
+- B. (from org-dartlang-testcase:///enum_super_constructor.dart:14:9)
diff --git a/pkg/front_end/testcases/general/enum_super_constructor.dart.weak.modular.expect b/pkg/front_end/testcases/general/enum_super_constructor.dart.weak.modular.expect
new file mode 100644
index 0000000..4c629c8
--- /dev/null
+++ b/pkg/front_end/testcases/general/enum_super_constructor.dart.weak.modular.expect
@@ -0,0 +1,66 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/enum_super_constructor.dart:9:3: Error: This requires the 'enhanced-enums' language feature to be enabled.
+// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.17 or higher, and running 'pub get'.
+// A() : super();
+// ^
+//
+// pkg/front_end/testcases/general/enum_super_constructor.dart:9:3: Error: Generative enum constructors must be marked as 'const'.
+// A() : super();
+// ^
+//
+// pkg/front_end/testcases/general/enum_super_constructor.dart:14:3: Error: This requires the 'enhanced-enums' language feature to be enabled.
+// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.17 or higher, and running 'pub get'.
+// const B() : super();
+// ^
+//
+// pkg/front_end/testcases/general/enum_super_constructor.dart:14:15: Error: Enum constructors can't contain super-initializers.
+// const B() : super();
+// ^
+//
+// pkg/front_end/testcases/general/enum_super_constructor.dart:9:9: Error: Enum constructors can't contain super-initializers.
+// A() : super();
+// ^
+//
+import self as self;
+import "dart:core" as core;
+
+class A extends core::_Enum /*isEnum*/ {
+ static const field core::List<self::A> values = invalid-expression "pkg/front_end/testcases/general/enum_super_constructor.dart:8:3: Error: Couldn't find constructor 'A'.
+ a;
+ ^";
+ static const field self::A a = invalid-expression "pkg/front_end/testcases/general/enum_super_constructor.dart:8:3: Error: Couldn't find constructor 'A'.
+ a;
+ ^";
+ constructor •(core::int index, core::String name) → self::A
+ : final dynamic #t1 = invalid-expression "pkg/front_end/testcases/general/enum_super_constructor.dart:9:9: Error: Enum constructors can't contain super-initializers.
+ A() : super();
+ ^"
+ ;
+ method toString() → core::String
+ return "A.${this.{core::_Enum::_name}{core::String}}";
+}
+class B extends core::_Enum /*isEnum*/ {
+ static const field core::List<self::B> values = invalid-expression "pkg/front_end/testcases/general/enum_super_constructor.dart:14:15: Error: Enum constructors can't contain super-initializers.
+ const B() : super();
+ ^";
+ static const field self::B b = invalid-expression "pkg/front_end/testcases/general/enum_super_constructor.dart:14:15: Error: Enum constructors can't contain super-initializers.
+ const B() : super();
+ ^";
+ const constructor •(core::int index, core::String name) → self::B
+ : final dynamic #t2 = invalid-expression "pkg/front_end/testcases/general/enum_super_constructor.dart:14:15: Error: Enum constructors can't contain super-initializers.
+ const B() : super();
+ ^"
+ ;
+ method toString() → core::String
+ return "B.${this.{core::_Enum::_name}{core::String}}";
+}
+static method main() → dynamic {}
+
+
+
+Constructor coverage from constants:
+org-dartlang-testcase:///enum_super_constructor.dart:
+- B. (from org-dartlang-testcase:///enum_super_constructor.dart:14:9)
diff --git a/pkg/front_end/testcases/general/enum_super_constructor.dart.weak.outline.expect b/pkg/front_end/testcases/general/enum_super_constructor.dart.weak.outline.expect
new file mode 100644
index 0000000..ce1a0f0
--- /dev/null
+++ b/pkg/front_end/testcases/general/enum_super_constructor.dart.weak.outline.expect
@@ -0,0 +1,48 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/enum_super_constructor.dart:9:3: Error: This requires the 'enhanced-enums' language feature to be enabled.
+// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.17 or higher, and running 'pub get'.
+// A() : super();
+// ^
+//
+// pkg/front_end/testcases/general/enum_super_constructor.dart:9:3: Error: Generative enum constructors must be marked as 'const'.
+// A() : super();
+// ^
+//
+// pkg/front_end/testcases/general/enum_super_constructor.dart:14:3: Error: This requires the 'enhanced-enums' language feature to be enabled.
+// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.17 or higher, and running 'pub get'.
+// const B() : super();
+// ^
+//
+// pkg/front_end/testcases/general/enum_super_constructor.dart:14:15: Error: Enum constructors can't contain super-initializers.
+// const B() : super();
+// ^
+//
+import self as self;
+import "dart:core" as core;
+
+class A extends core::_Enum /*isEnum*/ {
+ static const field core::List<self::A> values = const <self::A>[self::A::a];
+ static const field self::A a = invalid-expression "pkg/front_end/testcases/general/enum_super_constructor.dart:8:3: Error: Couldn't find constructor 'A'.
+ a;
+ ^";
+ constructor •(core::int index, core::String name) → self::A
+ ;
+ method toString() → core::String
+ return "A.${this.{core::_Enum::_name}{core::String}}";
+}
+class B extends core::_Enum /*isEnum*/ {
+ static const field core::List<self::B> values = const <self::B>[self::B::b];
+ static const field self::B b = const self::B::•(0, "b");
+ const constructor •(core::int index, core::String name) → self::B
+ : final dynamic #t1 = invalid-expression "pkg/front_end/testcases/general/enum_super_constructor.dart:14:15: Error: Enum constructors can't contain super-initializers.
+ const B() : super();
+ ^"
+ ;
+ method toString() → core::String
+ return "B.${this.{core::_Enum::_name}{core::String}}";
+}
+static method main() → dynamic
+ ;
diff --git a/pkg/front_end/testcases/general/enum_super_constructor.dart.weak.transformed.expect b/pkg/front_end/testcases/general/enum_super_constructor.dart.weak.transformed.expect
new file mode 100644
index 0000000..4c629c8
--- /dev/null
+++ b/pkg/front_end/testcases/general/enum_super_constructor.dart.weak.transformed.expect
@@ -0,0 +1,66 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/enum_super_constructor.dart:9:3: Error: This requires the 'enhanced-enums' language feature to be enabled.
+// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.17 or higher, and running 'pub get'.
+// A() : super();
+// ^
+//
+// pkg/front_end/testcases/general/enum_super_constructor.dart:9:3: Error: Generative enum constructors must be marked as 'const'.
+// A() : super();
+// ^
+//
+// pkg/front_end/testcases/general/enum_super_constructor.dart:14:3: Error: This requires the 'enhanced-enums' language feature to be enabled.
+// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.17 or higher, and running 'pub get'.
+// const B() : super();
+// ^
+//
+// pkg/front_end/testcases/general/enum_super_constructor.dart:14:15: Error: Enum constructors can't contain super-initializers.
+// const B() : super();
+// ^
+//
+// pkg/front_end/testcases/general/enum_super_constructor.dart:9:9: Error: Enum constructors can't contain super-initializers.
+// A() : super();
+// ^
+//
+import self as self;
+import "dart:core" as core;
+
+class A extends core::_Enum /*isEnum*/ {
+ static const field core::List<self::A> values = invalid-expression "pkg/front_end/testcases/general/enum_super_constructor.dart:8:3: Error: Couldn't find constructor 'A'.
+ a;
+ ^";
+ static const field self::A a = invalid-expression "pkg/front_end/testcases/general/enum_super_constructor.dart:8:3: Error: Couldn't find constructor 'A'.
+ a;
+ ^";
+ constructor •(core::int index, core::String name) → self::A
+ : final dynamic #t1 = invalid-expression "pkg/front_end/testcases/general/enum_super_constructor.dart:9:9: Error: Enum constructors can't contain super-initializers.
+ A() : super();
+ ^"
+ ;
+ method toString() → core::String
+ return "A.${this.{core::_Enum::_name}{core::String}}";
+}
+class B extends core::_Enum /*isEnum*/ {
+ static const field core::List<self::B> values = invalid-expression "pkg/front_end/testcases/general/enum_super_constructor.dart:14:15: Error: Enum constructors can't contain super-initializers.
+ const B() : super();
+ ^";
+ static const field self::B b = invalid-expression "pkg/front_end/testcases/general/enum_super_constructor.dart:14:15: Error: Enum constructors can't contain super-initializers.
+ const B() : super();
+ ^";
+ const constructor •(core::int index, core::String name) → self::B
+ : final dynamic #t2 = invalid-expression "pkg/front_end/testcases/general/enum_super_constructor.dart:14:15: Error: Enum constructors can't contain super-initializers.
+ const B() : super();
+ ^"
+ ;
+ method toString() → core::String
+ return "B.${this.{core::_Enum::_name}{core::String}}";
+}
+static method main() → dynamic {}
+
+
+
+Constructor coverage from constants:
+org-dartlang-testcase:///enum_super_constructor.dart:
+- B. (from org-dartlang-testcase:///enum_super_constructor.dart:14:9)
diff --git a/pkg/front_end/testcases/textual_outline.status b/pkg/front_end/testcases/textual_outline.status
index a380aef..e5d43b6 100644
--- a/pkg/front_end/testcases/textual_outline.status
+++ b/pkg/front_end/testcases/textual_outline.status
@@ -50,6 +50,7 @@
enhanced_enums/simple_fields: FormatterCrash
enhanced_enums/simple_interfaces: FormatterCrash
enhanced_enums/simple_mixins: FormatterCrash
+enhanced_enums/super_parameters/malformed_constructors: FormatterCrash
enhanced_enums/supertype_resolved_before_checking: FormatterCrash
extension_types/basic_show: FormatterCrash
extension_types/call_not_get: FormatterCrash
@@ -84,6 +85,7 @@
general/constructor_initializer_invalid: FormatterCrash
general/covariant_generic2: FormatterCrash
general/duplicated_declarations: FormatterCrash
+general/enum_super_constructor: FormatterCrash
general/error_recovery/annotations: FormatterCrash
general/error_recovery/constructor_recovery_bad_name_general.crash: FormatterCrash
general/error_recovery/constructor_recovery_bad_name_get.crash: FormatterCrash
diff --git a/pkg/front_end/tool/fasta_perf.dart b/pkg/front_end/tool/fasta_perf.dart
index b9b02a3..6c5a003 100644
--- a/pkg/front_end/tool/fasta_perf.dart
+++ b/pkg/front_end/tool/fasta_perf.dart
@@ -13,6 +13,7 @@
show readBytesFromFileSync;
import 'package:analyzer/dart/analysis/features.dart';
+import 'package:analyzer/source/line_info.dart';
import 'package:analyzer/src/fasta/ast_builder.dart';
import 'package:args/args.dart';
@@ -95,11 +96,11 @@
}
/// Scan [contents] and return the first token produced by the scanner.
-Token tokenize(List<int> contents) {
+ScannerResult tokenize(List<int> contents) {
scanTimer.start();
- var token = scan(contents).tokens;
+ var result = scan(contents);
scanTimer.stop();
- return token;
+ return result;
}
/// Scans every file in [files] and reports the time spent doing so.
@@ -173,7 +174,7 @@
var listener = new DirectiveListenerWithNative();
new TopLevelParser(listener,
useImplicitCreationExpression: useImplicitCreationExpressionInCfe)
- .parseUnit(tokenize(contents));
+ .parseUnit(tokenize(contents).tokens);
return new Set<String>()
..addAll(listener.imports.map((directive) => directive.uri!))
..addAll(listener.exports.map((directive) => directive.uri!))
@@ -203,17 +204,19 @@
/// Parse the full body of [source].
void parseFull(Uri uri, List<int> source) {
- var tokens = tokenize(source);
- Parser parser = new Parser(new _PartialAstBuilder(uri),
+ var result = tokenize(source);
+ var lineInfo = LineInfo(result.lineStarts);
+ Parser parser = new Parser(new _PartialAstBuilder(uri, lineInfo),
useImplicitCreationExpression: useImplicitCreationExpressionInCfe);
- parser.parseUnit(tokens);
+ parser.parseUnit(result.tokens);
}
// Note: AstBuilder doesn't build compilation-units or classes, only method
// bodies. So this listener is not feature complete.
class _PartialAstBuilder extends AstBuilder {
- _PartialAstBuilder(Uri uri)
- : super(null, uri, true, FeatureSet.latestLanguageVersion(), uri);
+ _PartialAstBuilder(Uri uri, LineInfo lineInfo)
+ : super(
+ null, uri, true, FeatureSet.latestLanguageVersion(), lineInfo, uri);
}
// Invoke the fasta kernel generator for the program starting in [entryUri]
diff --git a/pkg/front_end/tool/perf.dart b/pkg/front_end/tool/perf.dart
index be32427..f7ebb13 100644
--- a/pkg/front_end/tool/perf.dart
+++ b/pkg/front_end/tool/perf.dart
@@ -96,13 +96,15 @@
/// Uses the diet-parser to parse only directives in [source].
CompilationUnit parseDirectives(Source source) {
- var token = tokenize(source);
+ var result = tokenize(source);
+ var lineInfo = LineInfo(result.lineStarts);
var parser = new Parser(
source,
AnalysisErrorListener.NULL_LISTENER,
featureSet: FeatureSet.latestLanguageVersion(),
+ lineInfo: lineInfo,
);
- return parser.parseDirectives(token);
+ return parser.parseDirectives(result.tokens);
}
/// Parses every file in [files] and reports the time spent doing so.
@@ -119,14 +121,16 @@
/// Parse the full body of [source] and return it's compilation unit.
CompilationUnit parseFull(Source source) {
- var token = tokenize(source);
+ var result = tokenize(source);
+ var lineInfo = LineInfo(result.lineStarts);
parseTimer.start();
var parser = new Parser(
source,
AnalysisErrorListener.NULL_LISTENER,
featureSet: FeatureSet.latestLanguageVersion(),
+ lineInfo: lineInfo,
);
- var unit = parser.parseCompilationUnit(token);
+ var unit = parser.parseCompilationUnit(result.tokens);
parseTimer.stop();
return unit;
}
@@ -218,7 +222,7 @@
}
/// Scan [source] and return the first token produced by the scanner.
-Token tokenize(Source source) {
+ScannerResult tokenize(Source source) {
scanTimer.start();
// TODO(sigmund): is there a way to scan from a random-access-file without
// first converting to String?
@@ -232,7 +236,7 @@
}
}
scanTimer.stop();
- return token;
+ return result;
}
String _findSdkPath() {
diff --git a/pkg/nnbd_migration/lib/instrumentation.dart b/pkg/nnbd_migration/lib/instrumentation.dart
index 2091796..afb9bd9 100644
--- a/pkg/nnbd_migration/lib/instrumentation.dart
+++ b/pkg/nnbd_migration/lib/instrumentation.dart
@@ -29,7 +29,7 @@
factory CodeReference.fromAstNode(AstNode node) {
var compilationUnit = node.thisOrAncestorOfType<CompilationUnit>()!;
var source = compilationUnit.declaredElement!.source;
- var location = compilationUnit.lineInfo!.getLocation(node.offset);
+ var location = compilationUnit.lineInfo.getLocation(node.offset);
return CodeReference(source.fullName, node.offset, location.lineNumber,
location.columnNumber, _computeEnclosingName(node));
}
diff --git a/pkg/nnbd_migration/lib/src/edge_builder.dart b/pkg/nnbd_migration/lib/src/edge_builder.dart
index d7cfb1c..5784c34 100644
--- a/pkg/nnbd_migration/lib/src/edge_builder.dart
+++ b/pkg/nnbd_migration/lib/src/edge_builder.dart
@@ -3515,7 +3515,7 @@
buffer.write(' in "');
buffer.write(node.toSource());
buffer.write('" on line ');
- buffer.write(unit.lineInfo!.getLocation(node.offset).lineNumber);
+ buffer.write(unit.lineInfo.getLocation(node.offset).lineNumber);
buffer.write(' of "');
buffer.write(unit.declaredElement!.source.fullName);
buffer.write('"');
diff --git a/pkg/nnbd_migration/lib/src/front_end/info_builder.dart b/pkg/nnbd_migration/lib/src/front_end/info_builder.dart
index c6f4bb7..15b67af 100644
--- a/pkg/nnbd_migration/lib/src/front_end/info_builder.dart
+++ b/pkg/nnbd_migration/lib/src/front_end/info_builder.dart
@@ -433,7 +433,7 @@
var edits = info != null
? _computeEdits(info, sourceOffset, result)
: <EditDetail>[];
- var lineNumber = lineInfo!.getLocation(sourceOffset).lineNumber;
+ var lineNumber = lineInfo.getLocation(sourceOffset).lineNumber;
var traces = info == null
? const <TraceInfo>[]
: _computeTraces(info.fixReasons);
diff --git a/pkg/nnbd_migration/lib/src/node_builder.dart b/pkg/nnbd_migration/lib/src/node_builder.dart
index fde5e28..e9b8d09 100644
--- a/pkg/nnbd_migration/lib/src/node_builder.dart
+++ b/pkg/nnbd_migration/lib/src/node_builder.dart
@@ -976,7 +976,7 @@
buffer.write(' in "');
buffer.write(node.toSource());
buffer.write('" on line ');
- buffer.write(unit.lineInfo!.getLocation(node.offset).lineNumber);
+ buffer.write(unit.lineInfo.getLocation(node.offset).lineNumber);
buffer.write(' of "');
buffer.write(unit.declaredElement!.source.fullName);
buffer.write('"');
diff --git a/pkg/nnbd_migration/test/migration_visitor_test_base.dart b/pkg/nnbd_migration/test/migration_visitor_test_base.dart
index 3f57caae..c60d2f8 100644
--- a/pkg/nnbd_migration/test/migration_visitor_test_base.dart
+++ b/pkg/nnbd_migration/test/migration_visitor_test_base.dart
@@ -414,7 +414,7 @@
/// file [offset], with the given [function] name.
TypeMatcher<CodeReference> matchCodeRef(
{required int offset, required String function}) {
- var location = testUnit!.lineInfo!.getLocation(offset);
+ var location = testUnit!.lineInfo.getLocation(offset);
return TypeMatcher<CodeReference>()
.having((cr) => cr.line, 'line', location.lineNumber)
.having((cr) => cr.column, 'column', location.columnNumber)
diff --git a/pkg/scrape/lib/scrape.dart b/pkg/scrape/lib/scrape.dart
index 1665006..f6c9989 100644
--- a/pkg/scrape/lib/scrape.dart
+++ b/pkg/scrape/lib/scrape.dart
@@ -267,9 +267,11 @@
scanner.configureFeatures(
featureSet: featureSet, featureSetForOverriding: featureSet);
var startToken = scanner.tokenize();
+ var lineInfo = LineInfo(scanner.lineStarts);
// Parse it.
- var parser = Parser(stringSource, errorListener, featureSet: featureSet);
+ var parser = Parser(stringSource, errorListener,
+ featureSet: featureSet, lineInfo: lineInfo);
parser.enableOptionalNewAndConst = true;
parser.enableSetLiterals = true;
@@ -301,8 +303,6 @@
return;
}
- var lineInfo = LineInfo(scanner.lineStarts);
-
_scrapedFileCount++;
_scrapedLineCount += lineInfo.lineCount;
diff --git a/tools/VERSION b/tools/VERSION
index f273964..4e9a74d 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
MAJOR 2
MINOR 17
PATCH 0
-PRERELEASE 167
+PRERELEASE 168
PRERELEASE_PATCH 0
\ No newline at end of file