Version 2.14.0-342.0.dev
Merge commit '90ee35cdf9e5faab80cb87690430dcd673b1231b' into 'dev'
diff --git a/DEPS b/DEPS
index f498427..653673b 100644
--- a/DEPS
+++ b/DEPS
@@ -72,7 +72,7 @@
"gperftools_revision": "180bfa10d7cb38e8b3784d60943d50e8fcef0dcb",
# Revisions of /third_party/* dependencies.
- "args_rev": "d8fea36c10ef96797be02e3d132d572445cd86f4",
+ "args_rev": "0329844afcf3efa9e92a1dc55d7d10226b0fa932",
"async_rev": "25a7e2ec39c03622b86918cb9ce3e7d00dd283d1",
"bazel_worker_rev": "0885637b037979afbf5bcd05fd748b309fd669c0",
"benchmark_harness_rev": "c546dbd9f639f75cd2f75de8df2eb9f8ea15e8e7",
diff --git a/pkg/analysis_server/lib/src/lsp/client_configuration.dart b/pkg/analysis_server/lib/src/lsp/client_configuration.dart
index 332330f..9093676 100644
--- a/pkg/analysis_server/lib/src/lsp/client_configuration.dart
+++ b/pkg/analysis_server/lib/src/lsp/client_configuration.dart
@@ -2,10 +2,102 @@
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
+import 'package:collection/collection.dart';
+import 'package:path/path.dart' as path;
+
+/// Provides access to both global and resource-specific client configuration.
+///
+/// Resource-specific config is currently only supported at the WorkspaceFolder
+/// level so when looking up config for a resource, the nearest WorkspaceFolders
+/// config will be used.
+class LspClientConfiguration {
+ /// Global settings for the workspace.
+ ///
+ /// Used as a fallback for resource settings if no specific config is found
+ /// for the resource.
+ LspGlobalClientConfiguration _globalSettings =
+ LspGlobalClientConfiguration({});
+
+ /// Settings for each resource.
+ ///
+ /// Keys are string paths without trailing path separators (eg. 'C:\foo').
+ final Map<String, LspResourceClientConfiguration> _resourceSettings =
+ <String, LspResourceClientConfiguration>{};
+
+ /// Pattern for stripping trailing slashes that may be been provided by the
+ /// client (in WorkspaceFolder URIs) for consistent comparisons.
+ final _trailingSlashPattern = RegExp(r'[\/]+$');
+
+ /// Returns the global configuration for the whole workspace.
+ LspGlobalClientConfiguration get global => _globalSettings;
+
+ /// Returns whether or not the provided new configuration changes any values
+ /// that would require analysis roots to be updated.
+ bool affectsAnalysisRoots(LspGlobalClientConfiguration otherConfig) {
+ return _globalSettings.analysisExcludedFolders !=
+ otherConfig.analysisExcludedFolders;
+ }
+
+ /// Returns config for a given resource.
+ ///
+ /// Because we only support config at the WorkspaceFolder level, this is done
+ /// by finding the nearest WorkspaceFolder to [resourcePath] and using config
+ /// for that.
+ ///
+ /// If no specific config is available, returns [global].
+ LspResourceClientConfiguration forResource(String resourcePath) {
+ final workspaceFolder = _getWorkspaceFolderPath(resourcePath);
+
+ if (workspaceFolder == null) {
+ return _globalSettings;
+ }
+
+ return _resourceSettings[_normaliseFolderPath(workspaceFolder)] ??
+ _globalSettings;
+ }
+
+ /// Replaces all previously known configuration with updated values from the
+ /// client.
+ void replace(
+ Map<String, Object?> globalConfig,
+ Map<String, Map<String, Object?>> workspaceFolderConfig,
+ ) {
+ _globalSettings = LspGlobalClientConfiguration(globalConfig);
+
+ _resourceSettings
+ ..clear()
+ ..addAll(workspaceFolderConfig.map(
+ (key, value) => MapEntry(
+ _normaliseFolderPath(key),
+ LspResourceClientConfiguration(value, _globalSettings),
+ ),
+ ));
+ }
+
+ /// Gets the path for the WorkspaceFolder closest to [resourcePath].
+ String? _getWorkspaceFolderPath(String resourcePath) {
+ final candidates = _resourceSettings.keys
+ .where((wfPath) =>
+ wfPath == _normaliseFolderPath(resourcePath) ||
+ path.isWithin(wfPath, resourcePath))
+ .toList();
+ candidates.sort((a, b) => -a.length.compareTo(b.length));
+ return candidates.firstOrNull;
+ }
+
+ /// Normalises a folder path to never have a trailing path separator.
+ String _normaliseFolderPath(String path) =>
+ path.replaceAll(_trailingSlashPattern, '');
+}
+
/// Wraps the client (editor) configuration to provide stronger typing and
/// handling of default values where a setting has not been supplied.
-class LspClientConfiguration {
- final Map<String, dynamic> _settings = <String, dynamic>{};
+///
+/// Settings in this class are only allowed to be configured at the workspace
+/// level (they will be ignored at the resource level).
+class LspGlobalClientConfiguration extends LspResourceClientConfiguration {
+ LspGlobalClientConfiguration(Map<String, Object?> settings)
+ : super(settings, null);
List<String> get analysisExcludedFolders {
// This setting is documented as a string array, but because editors are
@@ -20,30 +112,48 @@
}
}
- bool get completeFunctionCalls => _settings['completeFunctionCalls'] ?? false;
- bool get enableSdkFormatter => _settings['enableSdkFormatter'] ?? true;
- int? get lineLength => _settings['lineLength'];
+ /// Whether methods/functions in completion should include parens and argument
+ /// placeholders when used in an invocation context.
+ bool get completeFunctionCalls =>
+ _settings['completeFunctionCalls'] as bool? ?? false;
/// A preview flag for enabling commit characters for completions.
///
/// This is a temporary setting to allow this feature to be tested without
/// defaulting to on for everybody.
bool get previewCommitCharacters =>
- _settings['previewCommitCharacters'] ?? false;
+ _settings['previewCommitCharacters'] as bool? ?? false;
/// Whether diagnostics should be generated for TODO comments.
- bool get showTodos => _settings['showTodos'] ?? false;
+ bool get showTodos => _settings['showTodos'] as bool? ?? false;
+}
- /// Returns whether or not the provided new configuration changes any values
- /// that would require analysis roots to be updated.
- bool affectsAnalysisRoots(Map<String, dynamic> newConfig) {
- return _settings['analysisExcludedFolders'] !=
- newConfig['analysisExcludedFolders'];
- }
+/// Wraps the client (editor) configuration for a specific resource.
+///
+/// Settings in this class are only allowed to be configured either for a
+/// resource or for the whole workspace.
+///
+/// Right now, we treat "resource" to always mean a WorkspaceFolder since no
+/// known editors allow per-file configuration and it allows us to keep the
+/// settings cached, invalidated only when WorkspaceFolders change.
+class LspResourceClientConfiguration {
+ final Map<String, Object?> _settings;
+ final LspResourceClientConfiguration? _fallback;
- void replace(Map<String, dynamic> newConfig) {
- _settings
- ..clear()
- ..addAll(newConfig);
- }
+ LspResourceClientConfiguration(this._settings, this._fallback);
+
+ /// Whether to enable the SDK formatter.
+ ///
+ /// If this setting is `false`, the formatter will be unregistered with the
+ /// client.
+ bool get enableSdkFormatter =>
+ _settings['enableSdkFormatter'] as bool? ??
+ _fallback?.enableSdkFormatter ??
+ true;
+
+ /// The line length used when formatting documents.
+ ///
+ /// If null, the formatters default will be used.
+ int? get lineLength =>
+ _settings['lineLength'] as int? ?? _fallback?.lineLength;
}
diff --git a/pkg/analysis_server/lib/src/lsp/handlers/handler_change_workspace_folders.dart b/pkg/analysis_server/lib/src/lsp/handlers/handler_change_workspace_folders.dart
index 9a530d3..e270255 100644
--- a/pkg/analysis_server/lib/src/lsp/handlers/handler_change_workspace_folders.dart
+++ b/pkg/analysis_server/lib/src/lsp/handlers/handler_change_workspace_folders.dart
@@ -23,8 +23,8 @@
DidChangeWorkspaceFoldersParams.jsonHandler;
@override
- ErrorOr<void> handle(
- DidChangeWorkspaceFoldersParams params, CancellationToken token) {
+ Future<ErrorOr<void>> handle(
+ DidChangeWorkspaceFoldersParams params, CancellationToken token) async {
// Don't do anything if our analysis roots are not based on open workspaces.
if (!updateAnalysisRoots) {
return success(null);
@@ -37,7 +37,7 @@
.map((wf) => Uri.parse(wf.uri).toFilePath())
.toList();
- server.updateWorkspaceFolders(added, removed);
+ await server.updateWorkspaceFolders(added, removed);
return success(null);
}
diff --git a/pkg/analysis_server/lib/src/lsp/handlers/handler_completion.dart b/pkg/analysis_server/lib/src/lsp/handlers/handler_completion.dart
index a1c9fab..2ab3d5d 100644
--- a/pkg/analysis_server/lib/src/lsp/handlers/handler_completion.dart
+++ b/pkg/analysis_server/lib/src/lsp/handlers/handler_completion.dart
@@ -261,7 +261,7 @@
/// insert dupes.
final completeFunctionCalls = _hasExistingArgList(target.entity)
? false
- : server.clientConfiguration.completeFunctionCalls;
+ : server.clientConfiguration.global.completeFunctionCalls;
final results = serverSuggestions.map(
(item) {
@@ -292,7 +292,7 @@
// depending on how the spec is updated.
// https://github.com/microsoft/vscode-languageserver-node/issues/673
includeCommitCharacters:
- server.clientConfiguration.previewCommitCharacters,
+ server.clientConfiguration.global.previewCommitCharacters,
completeFunctionCalls: completeFunctionCalls,
);
},
@@ -390,8 +390,8 @@
// this should be removed (or made conditional based on a capability)
// depending on how the spec is updated.
// https://github.com/microsoft/vscode-languageserver-node/issues/673
- includeCommitCharacters:
- server.clientConfiguration.previewCommitCharacters,
+ includeCommitCharacters: server
+ .clientConfiguration.global.previewCommitCharacters,
completeFunctionCalls: completeFunctionCalls,
));
results.addAll(setResults);
diff --git a/pkg/analysis_server/lib/src/lsp/handlers/handler_format_on_type.dart b/pkg/analysis_server/lib/src/lsp/handlers/handler_format_on_type.dart
index 1ed3a71..3148284 100644
--- a/pkg/analysis_server/lib/src/lsp/handlers/handler_format_on_type.dart
+++ b/pkg/analysis_server/lib/src/lsp/handlers/handler_format_on_type.dart
@@ -32,8 +32,8 @@
return success(null);
}
- return generateEditsForFormatting(
- result, server.clientConfiguration.lineLength);
+ final lineLength = server.clientConfiguration.forResource(path).lineLength;
+ return generateEditsForFormatting(result, lineLength);
}
@override
@@ -43,12 +43,15 @@
return success(null);
}
- if (!server.clientConfiguration.enableSdkFormatter) {
- return error(ServerErrorCodes.FeatureDisabled,
- 'Formatter was disabled by client settings');
- }
-
final path = pathOfDoc(params.textDocument);
- return path.mapResult((path) => formatFile(path));
+ return path.mapResult((path) {
+ if (!server.clientConfiguration.forResource(path).enableSdkFormatter) {
+ // Because we now support formatting for just some WorkspaceFolders
+ // we should silently do nothing for those that are disabled.
+ return success(null);
+ }
+
+ return formatFile(path);
+ });
}
}
diff --git a/pkg/analysis_server/lib/src/lsp/handlers/handler_format_range.dart b/pkg/analysis_server/lib/src/lsp/handlers/handler_format_range.dart
index d6f7247..f92433a 100644
--- a/pkg/analysis_server/lib/src/lsp/handlers/handler_format_range.dart
+++ b/pkg/analysis_server/lib/src/lsp/handlers/handler_format_range.dart
@@ -32,9 +32,8 @@
return success(null);
}
- return generateEditsForFormatting(
- result, server.clientConfiguration.lineLength,
- range: range);
+ final lineLength = server.clientConfiguration.forResource(path).lineLength;
+ return generateEditsForFormatting(result, lineLength, range: range);
}
@override
@@ -44,12 +43,14 @@
return success(null);
}
- if (!server.clientConfiguration.enableSdkFormatter) {
- return error(ServerErrorCodes.FeatureDisabled,
- 'Formatter was disabled by client settings');
- }
-
final path = pathOfDoc(params.textDocument);
- return path.mapResult((path) => formatRange(path, params.range));
+ return path.mapResult((path) {
+ if (!server.clientConfiguration.forResource(path).enableSdkFormatter) {
+ // Because we now support formatting for just some WorkspaceFolders
+ // we should silently do nothing for those that are disabled.
+ return success(null);
+ }
+ return formatRange(path, params.range);
+ });
}
}
diff --git a/pkg/analysis_server/lib/src/lsp/handlers/handler_formatting.dart b/pkg/analysis_server/lib/src/lsp/handlers/handler_formatting.dart
index 75b7a41..23a7cad 100644
--- a/pkg/analysis_server/lib/src/lsp/handlers/handler_formatting.dart
+++ b/pkg/analysis_server/lib/src/lsp/handlers/handler_formatting.dart
@@ -32,8 +32,8 @@
return success(null);
}
- return generateEditsForFormatting(
- result, server.clientConfiguration.lineLength);
+ final lineLength = server.clientConfiguration.forResource(path).lineLength;
+ return generateEditsForFormatting(result, lineLength);
}
@override
@@ -43,12 +43,14 @@
return success(null);
}
- if (!server.clientConfiguration.enableSdkFormatter) {
- return error(ServerErrorCodes.FeatureDisabled,
- 'Formatter was disabled by client settings');
- }
-
final path = pathOfDoc(params.textDocument);
- return path.mapResult((path) => formatFile(path));
+ return path.mapResult((path) {
+ if (!server.clientConfiguration.forResource(path).enableSdkFormatter) {
+ // Because we now support formatting for just some WorkspaceFolders
+ // we should silently do nothing for those that are disabled.
+ return success(null);
+ }
+ return formatFile(path);
+ });
}
}
diff --git a/pkg/analysis_server/lib/src/lsp/handlers/handler_initialized.dart b/pkg/analysis_server/lib/src/lsp/handlers/handler_initialized.dart
index d842bbb..b0e3ca3 100644
--- a/pkg/analysis_server/lib/src/lsp/handlers/handler_initialized.dart
+++ b/pkg/analysis_server/lib/src/lsp/handlers/handler_initialized.dart
@@ -28,10 +28,8 @@
server,
);
- await server.fetchClientConfigurationAndPerformDynamicRegistration();
-
if (!server.initializationOptions.onlyAnalyzeProjectsWithOpenFiles) {
- server.updateWorkspaceFolders(openWorkspacePaths, const []);
+ await server.updateWorkspaceFolders(openWorkspacePaths, const []);
}
return success(null);
diff --git a/pkg/analysis_server/lib/src/lsp/lsp_analysis_server.dart b/pkg/analysis_server/lib/src/lsp/lsp_analysis_server.dart
index 7f381dd..cac5665 100644
--- a/pkg/analysis_server/lib/src/lsp/lsp_analysis_server.dart
+++ b/pkg/analysis_server/lib/src/lsp/lsp_analysis_server.dart
@@ -205,33 +205,49 @@
/// register/unregister requests for any supported/enabled dynamic registrations.
Future<void> fetchClientConfigurationAndPerformDynamicRegistration() async {
if (clientCapabilities?.configuration ?? false) {
+ // Take a copy of workspace folders because we need to match up the
+ // responses to the request by index and it's possible _workspaceFolders
+ // will change after we sent the request but before we get the response.
+ final folders = _workspaceFolders.toList();
+
// Fetch all configuration we care about from the client. This is just
// "dart" for now, but in future this may be extended to include
// others (for example "flutter").
final response = await sendRequest(
Method.workspace_configuration,
ConfigurationParams(items: [
+ // Dart settings for each workspace folder.
+ for (final folder in folders)
+ ConfigurationItem(
+ scopeUri: Uri.file(folder).toString(),
+ section: 'dart',
+ ),
+ // Global Dart settings. This comes last to simplify matching up the
+ // indexes in the results (folder[i] is the i'th item).
ConfigurationItem(section: 'dart'),
]));
final result = response.result;
- // Expect the result to be a single list (to match the single
- // ConfigurationItem we requested above) and that it should be
- // a standard map of settings.
+ // Expect the result to be a list with 1 + folders.length items to
+ // match the request above, and each should be a standard map of settings.
// If the above code is extended to support multiple sets of config
- // this will need tweaking to handle each group appropriately.
+ // this will need tweaking to handle the item for each section.
if (result != null &&
result is List<dynamic> &&
- result.length == 1 &&
- result.first is Map<String, dynamic>) {
- final newConfig = result.first;
- final refreshRoots =
- clientConfiguration.affectsAnalysisRoots(newConfig);
+ result.length == 1 + folders.length) {
+ // Config is stored as a map keyed by the workspace folder, and a key of
+ // null for the global config
+ final workspaceFolderConfig = {
+ for (var i = 0; i < folders.length; i++)
+ folders[i]: result[i] as Map<String, Object?>? ?? {},
+ };
+ final newGlobalConfig = result.last as Map<String, Object?>? ?? {};
- clientConfiguration.replace(newConfig);
+ final oldGlobalConfig = clientConfiguration.global;
+ clientConfiguration.replace(newGlobalConfig, workspaceFolderConfig);
- if (refreshRoots) {
+ if (clientConfiguration.affectsAnalysisRoots(oldGlobalConfig)) {
_refreshAnalysisRoots();
}
}
@@ -638,14 +654,16 @@
sendServerErrorNotification('Socket error', error, stack);
}
- void updateWorkspaceFolders(
- List<String> addedPaths, List<String> removedPaths) {
+ Future<void> updateWorkspaceFolders(
+ List<String> addedPaths, List<String> removedPaths) async {
// TODO(dantup): This is currently case-sensitive!
_workspaceFolders
..addAll(addedPaths)
..removeAll(removedPaths);
+ await fetchClientConfigurationAndPerformDynamicRegistration();
+
_refreshAnalysisRoots();
}
@@ -699,7 +717,7 @@
? _workspaceFolders.toSet()
: _getRootsForOpenFiles();
- final excludedPaths = clientConfiguration.analysisExcludedFolders
+ final excludedPaths = clientConfiguration.global.analysisExcludedFolders
.expand((excludePath) => resourceProvider.pathContext
.isAbsolute(excludePath)
? [excludePath]
@@ -889,5 +907,5 @@
bool _shouldSendError(protocol.AnalysisError error) =>
error.code != ErrorType.TODO.name.toLowerCase() ||
- analysisServer.clientConfiguration.showTodos;
+ analysisServer.clientConfiguration.global.showTodos;
}
diff --git a/pkg/analysis_server/lib/src/lsp/server_capabilities_computer.dart b/pkg/analysis_server/lib/src/lsp/server_capabilities_computer.dart
index ca0b352..89f26d4 100644
--- a/pkg/analysis_server/lib/src/lsp/server_capabilities_computer.dart
+++ b/pkg/analysis_server/lib/src/lsp/server_capabilities_computer.dart
@@ -136,9 +136,10 @@
LspClientCapabilities clientCapabilities) {
final codeActionLiteralSupport = clientCapabilities.literalCodeActions;
final renameOptionsSupport = clientCapabilities.renameValidation;
- final enableFormatter = _server.clientConfiguration.enableSdkFormatter;
+ final enableFormatter =
+ _server.clientConfiguration.global.enableSdkFormatter;
final previewCommitCharacters =
- _server.clientConfiguration.previewCommitCharacters;
+ _server.clientConfiguration.global.previewCommitCharacters;
final dynamicRegistrations =
ClientDynamicRegistrations(clientCapabilities.raw);
@@ -321,9 +322,10 @@
final registrations = <Registration>[];
- final enableFormatter = _server.clientConfiguration.enableSdkFormatter;
+ final enableFormatter =
+ _server.clientConfiguration.global.enableSdkFormatter;
final previewCommitCharacters =
- _server.clientConfiguration.previewCommitCharacters;
+ _server.clientConfiguration.global.previewCommitCharacters;
/// Helper for creating registrations with IDs.
void register(bool condition, Method method, [ToJsonable? options]) {
diff --git a/pkg/analysis_server/test/lsp/client_configuration_test.dart b/pkg/analysis_server/test/lsp/client_configuration_test.dart
new file mode 100644
index 0000000..86788dc
--- /dev/null
+++ b/pkg/analysis_server/test/lsp/client_configuration_test.dart
@@ -0,0 +1,62 @@
+// Copyright (c) 2021, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analysis_server/src/lsp/client_configuration.dart';
+import 'package:analyzer/src/test_utilities/resource_provider_mixin.dart';
+import 'package:test/test.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+void main() {
+ defineReflectiveSuite(() {
+ defineReflectiveTests(ClientConfigurationTest);
+ });
+}
+
+@reflectiveTest
+class ClientConfigurationTest with ResourceProviderMixin {
+ void test_folderConfig() {
+ final folder = convertPath('/home/test');
+ final file = convertPath('/home/test/file.dart');
+ final config = LspClientConfiguration();
+ config.replace(
+ {'lineLength': 100},
+ {
+ folder: {'lineLength': 200}
+ },
+ );
+ expect(config.forResource(file).lineLength, equals(200));
+ }
+
+ void test_folderConfig_globalFallback() {
+ final file = convertPath('/home/test/file.dart');
+ final config = LspClientConfiguration();
+ config.replace({'lineLength': 100}, {});
+ // Should fall back to the global config.
+ expect(config.forResource(file).lineLength, equals(100));
+ }
+
+ void test_folderConfig_nested() {
+ final folderOne = convertPath('/one');
+ final folderTwo = convertPath('/one/two');
+ final folderThree = convertPath('/one/two/three');
+ final file = convertPath('/one/two/three/file.dart');
+ final config = LspClientConfiguration();
+ config.replace(
+ {'lineLength': 50},
+ {
+ folderOne: {'lineLength': 100},
+ folderThree: {'lineLength': 300},
+ folderTwo: {'lineLength': 200},
+ },
+ );
+ // Should use the inner-most folder (folderThree).
+ expect(config.forResource(file).lineLength, equals(300));
+ }
+
+ void test_globalConfig() {
+ final config = LspClientConfiguration();
+ config.replace({'lineLength': 100}, {});
+ expect(config.global.lineLength, equals(100));
+ }
+}
diff --git a/pkg/analysis_server/test/lsp/format_test.dart b/pkg/analysis_server/test/lsp/format_test.dart
index 741a740..5ba380f 100644
--- a/pkg/analysis_server/test/lsp/format_test.dart
+++ b/pkg/analysis_server/test/lsp/format_test.dart
@@ -309,6 +309,97 @@
await expectFormattedContents(mainFileUri, contents, expectedLongLines);
}
+ Future<void> test_lineLength_outsideWorkspaceFolders() async {
+ const contents = '''
+main() {
+ print('123456789 ''123456789 ''123456789 ');
+}
+''';
+ const expectedContents = '''
+main() {
+ print(
+ '123456789 '
+ '123456789 '
+ '123456789 ');
+}
+''';
+
+ await provideConfig(
+ () => initialize(
+ // Use empty roots so the test file is not inside any known
+ // WorkspaceFolder.
+ allowEmptyRootUri: true,
+ workspaceCapabilities: withDidChangeConfigurationDynamicRegistration(
+ withConfigurationSupport(emptyWorkspaceClientCapabilities)),
+ ),
+ // Global config (this should be used).
+ {'lineLength': 10},
+ );
+ await openFile(mainFileUri, contents);
+ await expectFormattedContents(mainFileUri, contents, expectedContents);
+ }
+
+ Future<void> test_lineLength_workspaceFolderSpecified() async {
+ const contents = '''
+main() {
+ print('123456789 ''123456789 ''123456789 ');
+}
+''';
+ const expectedContents = '''
+main() {
+ print(
+ '123456789 '
+ '123456789 '
+ '123456789 ');
+}
+''';
+
+ await provideConfig(
+ () => initialize(
+ workspaceCapabilities: withDidChangeConfigurationDynamicRegistration(
+ withConfigurationSupport(emptyWorkspaceClientCapabilities))),
+ // Global config.
+ {'lineLength': 200},
+ folderConfig: {
+ // WorkspaceFolder config for this project (this should be used).
+ projectFolderPath: {'lineLength': 10},
+ },
+ );
+ await openFile(mainFileUri, contents);
+ await expectFormattedContents(mainFileUri, contents, expectedContents);
+ }
+
+ Future<void> test_lineLength_workspaceFolderUnspecified() async {
+ const contents = '''
+main() {
+ print('123456789 ''123456789 ''123456789 ');
+}
+''';
+ const expectedContents = '''
+main() {
+ print(
+ '123456789 '
+ '123456789 '
+ '123456789 ');
+}
+''';
+
+ await provideConfig(
+ () => initialize(
+ workspaceCapabilities: withDidChangeConfigurationDynamicRegistration(
+ withConfigurationSupport(emptyWorkspaceClientCapabilities))),
+ // Global config (this should be used).
+ {'lineLength': 10},
+ folderConfig: {
+ // WorkspaceFolder config for this project that doesn't specific
+ // lineLength.
+ projectFolderPath: {'someOtherValue': 'foo'},
+ },
+ );
+ await openFile(mainFileUri, contents);
+ await expectFormattedContents(mainFileUri, contents, expectedContents);
+ }
+
Future<void> test_minimalEdits_addWhitespace() async {
// Check we only get one edit to add the required whitespace and not
// an entire document replacement.
diff --git a/pkg/analysis_server/test/lsp/server_abstract.dart b/pkg/analysis_server/test/lsp/server_abstract.dart
index ad2d20b..a7a8ea0 100644
--- a/pkg/analysis_server/test/lsp/server_abstract.dart
+++ b/pkg/analysis_server/test/lsp/server_abstract.dart
@@ -1458,14 +1458,34 @@
/// Calls the supplied function and responds to any `workspace/configuration`
/// request with the supplied config.
- Future<ResponseMessage> provideConfig(Future<ResponseMessage> Function() f,
- FutureOr<Map<String, dynamic>> config) {
+ Future<ResponseMessage> provideConfig(
+ Future<ResponseMessage> Function() f,
+ FutureOr<Map<String, Object?>> globalConfig, {
+ FutureOr<Map<String, Map<String, Object?>>>? folderConfig,
+ }) {
return handleExpectedRequest<ResponseMessage, ConfigurationParams,
- List<Map<String, dynamic>>>(
+ List<Map<String, Object?>>>(
Method.workspace_configuration,
ConfigurationParams.fromJson,
f,
- handler: (configurationParams) async => [await config],
+ handler: (configurationParams) async {
+ // We must respond to the request for config with items that match the
+ // request. For any item in the request without a folder, we will return
+ // the global config. For any item in the request with a folder we will
+ // return the config for that item in the map, or fall back to the global
+ // config if it does not exist.
+ final global = await globalConfig;
+ final folders = await folderConfig;
+ return configurationParams.items.map(
+ (requestedConfig) {
+ final uri = requestedConfig.scopeUri;
+ final path = uri != null ? Uri.parse(uri).toFilePath() : null;
+ // Use the config the test provided for this path, or fall back to
+ // global.
+ return (folders != null ? folders[path] : null) ?? global;
+ },
+ ).toList();
+ },
);
}
diff --git a/pkg/analysis_server/test/lsp/test_all.dart b/pkg/analysis_server/test/lsp/test_all.dart
index fbdd56c..752d3f1 100644
--- a/pkg/analysis_server/test/lsp/test_all.dart
+++ b/pkg/analysis_server/test/lsp/test_all.dart
@@ -8,6 +8,7 @@
import 'analyzer_status_test.dart' as analyzer_status;
import 'cancel_request_test.dart' as cancel_request;
import 'change_workspace_folders_test.dart' as change_workspace_folders;
+import 'client_configuration_test.dart' as client_configuration;
import 'closing_labels_test.dart' as closing_labels;
import 'code_actions_assists_test.dart' as code_actions_assists;
import 'code_actions_fixes_test.dart' as code_actions_fixes;
@@ -48,6 +49,7 @@
analyzer_status.main();
cancel_request.main();
change_workspace_folders.main();
+ client_configuration.main();
closing_labels.main();
code_actions_assists.main();
code_actions_fixes.main();
diff --git a/pkg/analysis_server/test/src/cider/fixes_test.dart b/pkg/analysis_server/test/src/cider/fixes_test.dart
index fa71e62..4e57e14 100644
--- a/pkg/analysis_server/test/src/cider/fixes_test.dart
+++ b/pkg/analysis_server/test/src/cider/fixes_test.dart
@@ -48,7 +48,7 @@
''');
// The file was resolved only once, even though we have 2 errors.
- expect(fileResolver.testView!.resolvedFiles, [convertPath(testPath)]);
+ expect(fileResolver.testView!.resolvedLibraries, [convertPath(testPath)]);
}
Future<void> test_createMethod() async {
diff --git a/pkg/analyzer/lib/src/dart/analysis/driver.dart b/pkg/analyzer/lib/src/dart/analysis/driver.dart
index 4743b03..c7726fb 100644
--- a/pkg/analyzer/lib/src/dart/analysis/driver.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/driver.dart
@@ -80,7 +80,7 @@
/// TODO(scheglov) Clean up the list of implicitly analyzed files.
class AnalysisDriver implements AnalysisDriverGeneric {
/// The version of data format, should be incremented on every format change.
- static const int DATA_VERSION = 162;
+ static const int DATA_VERSION = 161;
/// The number of exception contexts allowed to write. Once this field is
/// zero, we stop writing any new exception contexts in this process.
diff --git a/pkg/analyzer/lib/src/dart/element/element.dart b/pkg/analyzer/lib/src/dart/element/element.dart
index a1800cd..666d9be 100644
--- a/pkg/analyzer/lib/src/dart/element/element.dart
+++ b/pkg/analyzer/lib/src/dart/element/element.dart
@@ -969,13 +969,6 @@
@override
LineInfo? lineInfo;
- /// The path of the file which is derived from the [source], and in addition
- /// to source declarations contains also declarations added by running
- /// macro(s).
- ///
- /// Might be `null` if there is no corresponding macro-produced file.
- String? macroPath;
-
/// The source of the library containing this compilation unit.
///
/// This is the same as the source of the containing [LibraryElement],
@@ -2368,16 +2361,6 @@
/// children of this element's parent.
String get identifier => name!;
- /// Return `true` if this element was created from a declaration that
- /// exists in a macro-generated code, but not in the source code.
- bool get isFromMacro {
- return hasModifier(Modifier.IS_FROM_MACRO);
- }
-
- set isFromMacro(bool isFromMacro) {
- setModifier(Modifier.IS_FROM_MACRO, isFromMacro);
- }
-
bool get isNonFunctionTypeAliasesEnabled {
return library!.featureSet.isEnabled(Feature.nonfunction_type_aliases);
}
@@ -4298,26 +4281,23 @@
/// type being referred to is the return type.
static const Modifier IMPLICIT_TYPE = Modifier('IMPLICIT_TYPE', 16);
- /// Indicates that this element was created from macro-generated code.
- static const Modifier IS_FROM_MACRO = Modifier('IS_FROM_MACRO', 17);
-
/// Indicates that modifier 'lazy' was applied to the element.
- static const Modifier LATE = Modifier('LATE', 18);
+ static const Modifier LATE = Modifier('LATE', 17);
/// Indicates that a class is a mixin application.
- static const Modifier MIXIN_APPLICATION = Modifier('MIXIN_APPLICATION', 19);
+ static const Modifier MIXIN_APPLICATION = Modifier('MIXIN_APPLICATION', 18);
/// Indicates that the pseudo-modifier 'set' was applied to the element.
- static const Modifier SETTER = Modifier('SETTER', 20);
+ static const Modifier SETTER = Modifier('SETTER', 19);
/// Indicates that the modifier 'static' was applied to the element.
- static const Modifier STATIC = Modifier('STATIC', 21);
+ static const Modifier STATIC = Modifier('STATIC', 20);
/// Indicates that the element does not appear in the source code but was
/// implicitly created. For example, if a class does not define any
/// constructors, an implicit zero-argument constructor will be created and it
/// will be marked as being synthetic.
- static const Modifier SYNTHETIC = Modifier('SYNTHETIC', 22);
+ static const Modifier SYNTHETIC = Modifier('SYNTHETIC', 21);
static const List<Modifier> values = [
ABSTRACT,
@@ -4336,7 +4316,6 @@
HAS_INITIALIZER,
HAS_PART_OF_DIRECTIVE,
IMPLICIT_TYPE,
- IS_FROM_MACRO,
LATE,
MIXIN_APPLICATION,
SETTER,
diff --git a/pkg/analyzer/lib/src/dart/micro/resolve_file.dart b/pkg/analyzer/lib/src/dart/micro/resolve_file.dart
index aa4627e..d52742b 100644
--- a/pkg/analyzer/lib/src/dart/micro/resolve_file.dart
+++ b/pkg/analyzer/lib/src/dart/micro/resolve_file.dart
@@ -507,7 +507,7 @@
);
});
- testView?.addResolvedFile(path);
+ testView?.addResolvedLibrary(path);
late Map<FileState, UnitAnalysisResult> results;
@@ -762,13 +762,13 @@
}
class FileResolverTestView {
- /// The paths of files which were resolved.
+ /// The paths of libraries which were resolved.
///
- /// The file path is added every time when it is resolved.
- final List<String> resolvedFiles = [];
+ /// The library path is added every time when it is resolved.
+ final List<String> resolvedLibraries = [];
- void addResolvedFile(String path) {
- resolvedFiles.add(path);
+ void addResolvedLibrary(String path) {
+ resolvedLibraries.add(path);
}
}
diff --git a/pkg/analyzer/lib/src/generated/error_verifier.dart b/pkg/analyzer/lib/src/generated/error_verifier.dart
index b4880fb..3ad6c31 100644
--- a/pkg/analyzer/lib/src/generated/error_verifier.dart
+++ b/pkg/analyzer/lib/src/generated/error_verifier.dart
@@ -518,8 +518,9 @@
_withEnclosingExecutable(element, () {
_checkForInvalidModifierOnBody(
node.body, CompileTimeErrorCode.INVALID_MODIFIER_ON_CONSTRUCTOR);
- _checkForConstConstructorWithNonFinalField(node, element);
- _checkForConstConstructorWithNonConstSuper(node);
+ if (!_checkForConstConstructorWithNonConstSuper(node)) {
+ _checkForConstConstructorWithNonFinalField(node, element);
+ }
_constructorFieldsVerifier.verify(node);
_checkForRedirectingConstructorErrorCodes(node);
_checkForMultipleSuperInitializers(node);
@@ -1851,23 +1852,40 @@
/// are no invocations of non-'const' super constructors, and that there are
/// no instance variables mixed in.
///
+ /// Return `true` if an error is reported here, and the caller should stop
+ /// checking the constructor for constant-related errors.
+ ///
/// See [CompileTimeErrorCode.CONST_CONSTRUCTOR_WITH_NON_CONST_SUPER], and
/// [CompileTimeErrorCode.CONST_CONSTRUCTOR_WITH_MIXIN_WITH_FIELD].
- void _checkForConstConstructorWithNonConstSuper(
+ bool _checkForConstConstructorWithNonConstSuper(
ConstructorDeclaration constructor) {
if (!_enclosingExecutable.isConstConstructor) {
- return;
+ return false;
}
// OK, const factory, checked elsewhere
if (constructor.factoryKeyword != null) {
- return;
+ return false;
}
// check for mixins
var instanceFields = <FieldElement>[];
for (var mixin in _enclosingClass!.mixins) {
- instanceFields.addAll(mixin.element.fields
- .where((field) => !field.isStatic && !field.isSynthetic));
+ instanceFields.addAll(mixin.element.fields.where((field) {
+ if (field.isStatic) {
+ return false;
+ }
+ if (field.isSynthetic) {
+ return false;
+ }
+ // From the abstract and external fields specification:
+ // > An abstract instance variable declaration D is treated as an
+ // > abstract getter declaration and possibly an abstract setter
+ // > declaration. The setter is included if and only if D is non-final.
+ if (field.isAbstract && field.isFinal) {
+ return false;
+ }
+ return true;
+ }));
}
if (instanceFields.length == 1) {
var field = instanceFields.single;
@@ -1875,7 +1893,7 @@
CompileTimeErrorCode.CONST_CONSTRUCTOR_WITH_MIXIN_WITH_FIELD,
constructor.returnType,
["'${field.enclosingElement.name}.${field.name}'"]);
- return;
+ return true;
} else if (instanceFields.length > 1) {
var fieldNames = instanceFields
.map((field) => "'${field.enclosingElement.name}.${field.name}'")
@@ -1884,7 +1902,7 @@
CompileTimeErrorCode.CONST_CONSTRUCTOR_WITH_MIXIN_WITH_FIELDS,
constructor.returnType,
[fieldNames]);
- return;
+ return true;
}
// try to find and check super constructor invocation
@@ -1892,26 +1910,26 @@
if (initializer is SuperConstructorInvocation) {
var element = initializer.staticElement;
if (element == null || element.isConst) {
- return;
+ return false;
}
errorReporter.reportErrorForNode(
CompileTimeErrorCode.CONST_CONSTRUCTOR_WITH_NON_CONST_SUPER,
initializer,
[element.enclosingElement.displayName]);
- return;
+ return true;
}
}
// no explicit super constructor invocation, check default constructor
var supertype = _enclosingClass!.supertype;
if (supertype == null) {
- return;
+ return false;
}
if (supertype.isDartCoreObject) {
- return;
+ return false;
}
var unnamedConstructor = supertype.element.unnamedConstructor;
if (unnamedConstructor == null || unnamedConstructor.isConst) {
- return;
+ return false;
}
// default constructor is not 'const', report problem
@@ -1919,6 +1937,7 @@
CompileTimeErrorCode.CONST_CONSTRUCTOR_WITH_NON_CONST_SUPER,
constructor.returnType,
[supertype]);
+ return true;
}
/// Verify that if the given [constructor] declaration is 'const' then there
@@ -1935,10 +1954,6 @@
if (!classElement.hasNonFinalField) {
return;
}
- // TODO(brianwilkerson) Stop generating
- // CONST_CONSTRUCTOR_WITH_NON_FINAL_FIELD when either
- // CONST_CONSTRUCTOR_WITH_NON_CONST_SUPER or
- // CONST_CONSTRUCTOR_WITH_MIXIN_WITH_FIELD is also generated.
errorReporter.reportErrorForName(
CompileTimeErrorCode.CONST_CONSTRUCTOR_WITH_NON_FINAL_FIELD,
constructor);
diff --git a/pkg/analyzer/lib/src/generated/ffi_verifier.dart b/pkg/analyzer/lib/src/generated/ffi_verifier.dart
index 73cc7f3..576627a 100644
--- a/pkg/analyzer/lib/src/generated/ffi_verifier.dart
+++ b/pkg/analyzer/lib/src/generated/ffi_verifier.dart
@@ -77,8 +77,8 @@
inCompound = true;
compound = node;
if (node.declaredElement!.isEmptyStruct) {
- _errorReporter
- .reportErrorForNode(FfiCode.EMPTY_STRUCT, node, [node.name]);
+ _errorReporter.reportErrorForNode(
+ FfiCode.EMPTY_STRUCT, node.name, [node.name.name]);
}
if (className == _structClassName) {
_validatePackedAnnotation(node.metadata);
@@ -544,8 +544,8 @@
_errorReporter.reportErrorForNode(
FfiCode.MUST_BE_A_SUBTYPE, node, [TPrime, F, 'asFunction']);
}
- _validateFfiLeafCallUsesNoHandles(node.argumentList.arguments, TPrime,
- node);
+ _validateFfiLeafCallUsesNoHandles(
+ node.argumentList.arguments, TPrime, node);
}
_validateIsLeafIsConst(node);
}
@@ -637,8 +637,8 @@
}
}
- void _validateFfiLeafCallUsesNoHandles(NodeList<Expression> args,
- DartType nativeType, AstNode errorNode) {
+ void _validateFfiLeafCallUsesNoHandles(
+ NodeList<Expression> args, DartType nativeType, AstNode errorNode) {
if (args.isNotEmpty) {
for (final arg in args) {
if (arg is NamedExpression) {
@@ -715,6 +715,8 @@
} else if (declaredType.isCompoundSubtype) {
final clazz = (declaredType as InterfaceType).element;
if (clazz.isEmptyStruct) {
+ // TODO(brianwilkerson) There are no tests for this branch. Ensure
+ // that the diagnostic is correct and add tests.
_errorReporter
.reportErrorForNode(FfiCode.EMPTY_STRUCT, node, [clazz.name]);
}
@@ -750,8 +752,13 @@
final DartType T = node.typeArgumentTypes![0];
if (!_isValidFfiNativeFunctionType(T)) {
- _errorReporter.reportErrorForNode(
- FfiCode.MUST_BE_A_NATIVE_FUNCTION_TYPE, node, [T, 'fromFunction']);
+ AstNode errorNode = node.methodName;
+ var typeArgument = node.typeArguments?.arguments[0];
+ if (typeArgument != null) {
+ errorNode = typeArgument;
+ }
+ _errorReporter.reportErrorForNode(FfiCode.MUST_BE_A_NATIVE_FUNCTION_TYPE,
+ errorNode, [T, 'fromFunction']);
return;
}
@@ -810,7 +817,7 @@
/// `DynamicLibrary.lookupFunction<S, F>()`.
void _validateLookupFunction(MethodInvocation node) {
final typeArguments = node.typeArguments?.arguments;
- if (typeArguments?.length != 2) {
+ if (typeArguments == null || typeArguments.length != 2) {
// There are other diagnostics reported against the invocation and the
// diagnostics generated below might be inaccurate, so don't report them.
return;
@@ -820,19 +827,19 @@
final DartType S = argTypes[0];
final DartType F = argTypes[1];
if (!_isValidFfiNativeFunctionType(S)) {
- final AstNode errorNode = typeArguments![0];
+ final AstNode errorNode = typeArguments[0];
_errorReporter.reportErrorForNode(FfiCode.MUST_BE_A_NATIVE_FUNCTION_TYPE,
errorNode, [S, 'lookupFunction']);
return;
}
if (!_validateCompatibleFunctionTypes(F, S)) {
- final AstNode errorNode = typeArguments![1];
+ final AstNode errorNode = typeArguments[1];
_errorReporter.reportErrorForNode(
FfiCode.MUST_BE_A_SUBTYPE, errorNode, [S, F, 'lookupFunction']);
}
_validateIsLeafIsConst(node);
- _validateFfiLeafCallUsesNoHandles(node.argumentList.arguments, S,
- typeArguments![0]);
+ _validateFfiLeafCallUsesNoHandles(
+ node.argumentList.arguments, S, typeArguments[0]);
}
/// Validate that none of the [annotations] are from `dart:ffi`.
diff --git a/pkg/analyzer/lib/src/summary2/bundle_reader.dart b/pkg/analyzer/lib/src/summary2/bundle_reader.dart
index 211a94c..4448606 100644
--- a/pkg/analyzer/lib/src/summary2/bundle_reader.dart
+++ b/pkg/analyzer/lib/src/summary2/bundle_reader.dart
@@ -31,7 +31,6 @@
class BundleReader {
final SummaryDataReader _reader;
final Map<Uri, Uint8List> _unitsInformativeBytes;
- final Map<Uri, Uint8List> _macroUnitsInformativeBytes;
final Map<String, LibraryReader> libraryMap = {};
@@ -39,10 +38,8 @@
required LinkedElementFactory elementFactory,
required Uint8List resolutionBytes,
Map<Uri, Uint8List> unitsInformativeBytes = const {},
- Map<Uri, Uint8List> macroUnitsInformativeBytes = const {},
}) : _reader = SummaryDataReader(resolutionBytes),
- _unitsInformativeBytes = unitsInformativeBytes,
- _macroUnitsInformativeBytes = macroUnitsInformativeBytes {
+ _unitsInformativeBytes = unitsInformativeBytes {
_reader.offset = _reader.bytes.length - 4 * 4;
var baseResolutionOffset = _reader.readUInt32();
var librariesOffset = _reader.readUInt32();
@@ -73,7 +70,6 @@
elementFactory: elementFactory,
reader: _reader,
unitsInformativeBytes: _unitsInformativeBytes,
- macroUnitsInformativeBytes: _macroUnitsInformativeBytes,
baseResolutionOffset: baseResolutionOffset,
referenceReader: referenceReader,
reference: reference,
@@ -88,7 +84,6 @@
ApplyConstantOffsets? applyConstantOffsets;
void Function()? _readMembers;
void Function()? applyInformativeDataToMembers;
- void Function()? applyInformativeDataToMacroMembers;
ClassElementLinkedData({
required Reference reference,
@@ -111,9 +106,6 @@
applyInformativeDataToMembers?.call();
applyInformativeDataToMembers = null;
-
- applyInformativeDataToMacroMembers?.call();
- applyInformativeDataToMacroMembers = null;
}
}
@@ -424,7 +416,6 @@
final LinkedElementFactory _elementFactory;
final SummaryDataReader _reader;
final Map<Uri, Uint8List> _unitsInformativeBytes;
- final Map<Uri, Uint8List> _macroUnitsInformativeBytes;
final int _baseResolutionOffset;
final _ReferenceReader _referenceReader;
final Reference _reference;
@@ -439,7 +430,6 @@
required LinkedElementFactory elementFactory,
required SummaryDataReader reader,
required Map<Uri, Uint8List> unitsInformativeBytes,
- required Map<Uri, Uint8List> macroUnitsInformativeBytes,
required int baseResolutionOffset,
required _ReferenceReader referenceReader,
required Reference reference,
@@ -448,7 +438,6 @@
}) : _elementFactory = elementFactory,
_reader = reader,
_unitsInformativeBytes = unitsInformativeBytes,
- _macroUnitsInformativeBytes = macroUnitsInformativeBytes,
_baseResolutionOffset = baseResolutionOffset,
_referenceReader = referenceReader,
_reference = reference,
@@ -509,10 +498,6 @@
InformativeDataApplier(_elementFactory, _unitsInformativeBytes)
.applyTo(libraryElement);
- InformativeDataApplier(_elementFactory, _macroUnitsInformativeBytes,
- onlyIfFromMacro: true)
- .applyTo(libraryElement);
-
return libraryElement;
}
@@ -1233,7 +1218,6 @@
unitElement.uri = _reader.readOptionalStringReference();
unitElement.isSynthetic = _reader.readBool();
unitElement.sourceContent = _reader.readOptionalStringUtf8();
- unitElement.macroPath = _reader.readOptionalStringUtf8();
_readClasses(unitElement, unitReference);
_readEnums(unitElement, unitReference);
diff --git a/pkg/analyzer/lib/src/summary2/bundle_writer.dart b/pkg/analyzer/lib/src/summary2/bundle_writer.dart
index 35d4cce..a88940b 100644
--- a/pkg/analyzer/lib/src/summary2/bundle_writer.dart
+++ b/pkg/analyzer/lib/src/summary2/bundle_writer.dart
@@ -441,7 +441,6 @@
_sink._writeOptionalStringReference(unitElement.uri);
_sink.writeBool(unitElement.isSynthetic);
_sink.writeOptionalStringUtf8(unitElement.sourceContent);
- _sink.writeOptionalStringUtf8(unitElement.macroPath);
_resolutionSink._writeAnnotationList(unitElement.metadata);
_writeList(unitElement.classes, _writeClassElement);
_writeList(unitElement.enums, _writeEnumElement);
diff --git a/pkg/analyzer/lib/src/summary2/element_builder.dart b/pkg/analyzer/lib/src/summary2/element_builder.dart
index 2d5d9c2..3737f6e 100644
--- a/pkg/analyzer/lib/src/summary2/element_builder.dart
+++ b/pkg/analyzer/lib/src/summary2/element_builder.dart
@@ -56,21 +56,6 @@
_unitElement.typeAliases = _enclosingContext.typeAliases;
}
- void buildDeclarationElementsMacro(CompilationUnit? unit) {
- if (unit == null) {
- return;
- }
-
- _visitPropertyFirst<TopLevelVariableDeclaration>(unit.declarations);
-
- _unitElement.classes = _mergeElements(
- _unitElement.classes,
- _enclosingContext.classes,
- );
-
- // TODO(scheglov) other top-level elements
- }
-
/// Build exports and imports, metadata into [_libraryElement].
void buildLibraryElementChildren(CompilationUnit unit) {
unit.directives.accept(this);
@@ -987,41 +972,6 @@
node?.accept(this);
}
- /// Return a new list that includes [sourceElements] plus elements
- /// with not yet existing names from [macroElements].
- List<T> _mergeElements<T extends Element>(
- List<T> sourceElements,
- List<T> macroElements,
- ) {
- var result = <T>[];
-
- var sourceMap = <String, T>{};
- for (var element in sourceElements) {
- var name = element.name;
- if (name != null) {
- result.add(element);
- sourceMap[name] = element;
- }
- }
-
- for (var element in macroElements) {
- var sourceElement = sourceMap[element.name];
- if (sourceElement == null) {
- (element as ElementImpl).isFromMacro = true;
- result.add(element);
- } else if (sourceElement is ClassElementImpl &&
- element is ClassElementImpl) {
- sourceElement.methods = _mergeElements(
- sourceElement.methods,
- element.methods,
- );
- }
- // TODO(scheglov) Other class members.
- }
-
- return result;
- }
-
Uri? _selectAbsoluteUri(NamespaceDirective directive) {
var relativeUriStr = _selectRelativeUri(
directive.configurations,
diff --git a/pkg/analyzer/lib/src/summary2/element_flags.dart b/pkg/analyzer/lib/src/summary2/element_flags.dart
index a2bce77..e808000 100644
--- a/pkg/analyzer/lib/src/summary2/element_flags.dart
+++ b/pkg/analyzer/lib/src/summary2/element_flags.dart
@@ -8,14 +8,12 @@
class ClassElementFlags {
static const int _isAbstract = 1 << 0;
- static const int _isFromMacro = 1 << 1;
- static const int _isMixinApplication = 1 << 2;
- static const int _isSimplyBounded = 1 << 3;
+ static const int _isMixinApplication = 1 << 1;
+ static const int _isSimplyBounded = 1 << 2;
static void read(SummaryDataReader reader, ClassElementImpl element) {
var byte = reader.readByte();
element.isAbstract = (byte & _isAbstract) != 0;
- element.isFromMacro = (byte & _isFromMacro) != 0;
element.isMixinApplication = (byte & _isMixinApplication) != 0;
element.isSimplyBounded = (byte & _isSimplyBounded) != 0;
}
@@ -23,7 +21,6 @@
static void write(BufferedSink sink, ClassElementImpl element) {
var result = 0;
result |= element.isAbstract ? _isAbstract : 0;
- result |= element.isFromMacro ? _isFromMacro : 0;
result |= element.isMixinApplication ? _isMixinApplication : 0;
result |= element.isSimplyBounded ? _isSimplyBounded : 0;
sink.writeByte(result);
@@ -164,9 +161,8 @@
static const int _isAbstract = 1 << 1;
static const int _isAsynchronous = 1 << 2;
static const int _isExternal = 1 << 3;
- static const int _isFromMacro = 1 << 4;
- static const int _isGenerator = 1 << 5;
- static const int _isStatic = 1 << 6;
+ static const int _isGenerator = 1 << 4;
+ static const int _isStatic = 1 << 5;
static void read(SummaryDataReader reader, MethodElementImpl element) {
var byte = reader.readByte();
@@ -174,7 +170,6 @@
element.isAbstract = (byte & _isAbstract) != 0;
element.isAsynchronous = (byte & _isAsynchronous) != 0;
element.isExternal = (byte & _isExternal) != 0;
- element.isFromMacro = (byte & _isFromMacro) != 0;
element.isGenerator = (byte & _isGenerator) != 0;
element.isStatic = (byte & _isStatic) != 0;
}
@@ -185,7 +180,6 @@
result |= element.isAbstract ? _isAbstract : 0;
result |= element.isAsynchronous ? _isAsynchronous : 0;
result |= element.isExternal ? _isExternal : 0;
- result |= element.isFromMacro ? _isFromMacro : 0;
result |= element.isGenerator ? _isGenerator : 0;
result |= element.isStatic ? _isStatic : 0;
sink.writeByte(result);
diff --git a/pkg/analyzer/lib/src/summary2/informative_data.dart b/pkg/analyzer/lib/src/summary2/informative_data.dart
index fda2dbc..1dd1e5f 100644
--- a/pkg/analyzer/lib/src/summary2/informative_data.dart
+++ b/pkg/analyzer/lib/src/summary2/informative_data.dart
@@ -55,16 +55,12 @@
class InformativeDataApplier {
final LinkedElementFactory _elementFactory;
- final Map<Uri, Uint8List> _unitsInformativeBytes;
-
- /// Apply only to elements that are from macro-generated code.
- final bool _onlyIfFromMacro;
+ final Map<Uri, Uint8List> _unitsInformativeBytes2;
InformativeDataApplier(
this._elementFactory,
- this._unitsInformativeBytes, {
- bool onlyIfFromMacro = false,
- }) : _onlyIfFromMacro = onlyIfFromMacro;
+ this._unitsInformativeBytes2,
+ );
void applyTo(LibraryElementImpl libraryElement) {
if (_elementFactory.isApplyingInformativeData) {
@@ -76,7 +72,7 @@
for (var i = 0; i < unitElements.length; i++) {
var unitElement = unitElements[i] as CompilationUnitElementImpl;
var unitUri = unitElement.source.uri;
- var unitInfoBytes = _unitsInformativeBytes[unitUri];
+ var unitInfoBytes = _unitsInformativeBytes2[unitUri];
if (unitInfoBytes != null) {
var unitReader = SummaryDataReader(unitInfoBytes);
var unitInfo = _InfoUnit(unitReader);
@@ -181,37 +177,28 @@
_InfoClassDeclaration info,
) {
element as ClassElementImpl;
- var linkedData = element.linkedData as ClassElementLinkedData;
- if (_shouldApply(element)) {
- element.setCodeRange(info.codeOffset, info.codeLength);
- element.nameOffset = info.nameOffset;
- element.documentationComment = info.documentationComment;
- _applyToTypeParameters(
- element.typeParameters_unresolved,
- info.typeParameters,
- );
+ element.setCodeRange(info.codeOffset, info.codeLength);
+ element.nameOffset = info.nameOffset;
+ element.documentationComment = info.documentationComment;
+ _applyToTypeParameters(
+ element.typeParameters_unresolved,
+ info.typeParameters,
+ );
- linkedData.applyConstantOffsets = ApplyConstantOffsets(
- info.constantOffsets,
- (applier) {
- applier.applyToMetadata(element);
- applier.applyToTypeParameters(element.typeParameters);
- },
- );
- linkedData.applyInformativeDataToMembers = () {
- _applyToConstructors(element.constructors, info.constructors);
- _applyToFields(element.fields, info.fields);
- _applyToAccessors(element.accessors, info.accessors);
- _applyToMethods(element.methods, info.methods);
- };
- } else {
- linkedData.applyInformativeDataToMacroMembers = () {
- _applyToConstructors(element.constructors, info.constructors);
- _applyToFields(element.fields, info.fields);
- _applyToAccessors(element.accessors, info.accessors);
- _applyToMethods(element.methods, info.methods);
- };
- }
+ var linkedData = element.linkedData as ClassElementLinkedData;
+ linkedData.applyConstantOffsets = ApplyConstantOffsets(
+ info.constantOffsets,
+ (applier) {
+ applier.applyToMetadata(element);
+ applier.applyToTypeParameters(element.typeParameters);
+ },
+ );
+ linkedData.applyInformativeDataToMembers = () {
+ _applyToConstructors(element.constructors, info.constructors);
+ _applyToFields(element.fields, info.fields);
+ _applyToAccessors(element.accessors, info.accessors);
+ _applyToMethods(element.methods, info.methods);
+ };
}
void _applyToClassTypeAlias(
@@ -521,10 +508,6 @@
infoList,
(element, info) {
element as MethodElementImpl;
- if (!_shouldApply(element)) {
- return;
- }
-
element.setCodeRange(info.codeOffset, info.codeLength);
element.nameOffset = info.nameOffset;
element.documentationComment = info.documentationComment;
@@ -644,10 +627,6 @@
},
);
}
-
- bool _shouldApply(ElementImpl element) {
- return !_onlyIfFromMacro || element.isFromMacro;
- }
}
class _InfoClassDeclaration {
diff --git a/pkg/analyzer/lib/src/summary2/library_builder.dart b/pkg/analyzer/lib/src/summary2/library_builder.dart
index 12df589..ba1e230 100644
--- a/pkg/analyzer/lib/src/summary2/library_builder.dart
+++ b/pkg/analyzer/lib/src/summary2/library_builder.dart
@@ -110,12 +110,6 @@
elementBuilder.buildLibraryElementChildren(linkingUnit.node);
}
elementBuilder.buildDeclarationElements(linkingUnit.node);
-
- ElementBuilder(
- libraryBuilder: this,
- unitReference: linkingUnit.reference,
- unitElement: linkingUnit.element,
- ).buildDeclarationElementsMacro(linkingUnit.macroNode);
}
_declareDartCoreDynamicNever();
}
@@ -174,7 +168,6 @@
linkingUnit.node.featureSet.isEnabled(Feature.non_nullable),
);
linkingUnit.node.accept(resolver);
- linkingUnit.macroNode?.accept(resolver);
}
}
@@ -253,7 +246,6 @@
var linkingUnits = <LinkingUnit>[];
for (var inputUnit in inputLibrary.units) {
var unitNode = inputUnit.unit as ast.CompilationUnitImpl;
- var unitMacroNode = inputUnit.macro?.unit as ast.CompilationUnitImpl?;
var unitElement = CompilationUnitElementImpl();
unitElement.isSynthetic = inputUnit.isSynthetic;
@@ -261,7 +253,6 @@
unitElement.lineInfo = unitNode.lineInfo;
unitElement.source = inputUnit.source;
unitElement.sourceContent = inputUnit.sourceContent;
- unitElement.macroPath = inputUnit.macro?.path;
unitElement.uri = inputUnit.partUriStr;
unitElement.setCodeRange(0, unitNode.length);
@@ -275,7 +266,6 @@
isDefiningUnit: isDefiningUnit,
reference: unitReference,
node: unitNode,
- macroNode: unitMacroNode,
element: unitElement,
),
);
@@ -307,7 +297,6 @@
final bool isDefiningUnit;
final Reference reference;
final ast.CompilationUnitImpl node;
- final ast.CompilationUnitImpl? macroNode;
final CompilationUnitElementImpl element;
LinkingUnit({
@@ -315,7 +304,6 @@
required this.isDefiningUnit,
required this.reference,
required this.node,
- required this.macroNode,
required this.element,
});
}
diff --git a/pkg/analyzer/lib/src/summary2/link.dart b/pkg/analyzer/lib/src/summary2/link.dart
index 3b51acc..f0b0174 100644
--- a/pkg/analyzer/lib/src/summary2/link.dart
+++ b/pkg/analyzer/lib/src/summary2/link.dart
@@ -251,7 +251,6 @@
final String? sourceContent;
final bool isSynthetic;
final ast.CompilationUnit unit;
- final LinkInputUnitMacro? macro;
LinkInputUnit({
required this.partDirectiveIndex,
@@ -260,7 +259,6 @@
this.sourceContent,
required this.isSynthetic,
required this.unit,
- this.macro,
});
Uri get uri => source.uri;
@@ -268,19 +266,6 @@
String get uriStr => '$uri';
}
-class LinkInputUnitMacro {
- /// The path of the file that was parsed into [unit].
- /// We don't need complete [Source] because this file does not have a
- /// separate [Uri], it is a reflection of the source file.
- final String path;
- final ast.CompilationUnit unit;
-
- LinkInputUnitMacro({
- required this.path,
- required this.unit,
- });
-}
-
class LinkResult {
@Deprecated('This field is not used anymore')
final Uint8List astBytes = Uint8List(0);
diff --git a/pkg/analyzer/test/src/dart/micro/simple_file_resolver_test.dart b/pkg/analyzer/test/src/dart/micro/simple_file_resolver_test.dart
index 0944438..6e07a14 100644
--- a/pkg/analyzer/test/src/dart/micro/simple_file_resolver_test.dart
+++ b/pkg/analyzer/test/src/dart/micro/simple_file_resolver_test.dart
@@ -673,34 +673,34 @@
var path = convertPath('/workspace/dart/test/lib/test.dart');
// No resolved files yet.
- expect(fileResolver.testView!.resolvedFiles, isEmpty);
+ expect(fileResolver.testView!.resolvedLibraries, isEmpty);
// No cached, will resolve once.
expect(getTestErrors().errors, hasLength(1));
- expect(fileResolver.testView!.resolvedFiles, [path]);
+ expect(fileResolver.testView!.resolvedLibraries, [path]);
// Has cached, will be not resolved again.
expect(getTestErrors().errors, hasLength(1));
- expect(fileResolver.testView!.resolvedFiles, [path]);
+ expect(fileResolver.testView!.resolvedLibraries, [path]);
// New resolver.
// Still has cached, will be not resolved.
createFileResolver();
expect(getTestErrors().errors, hasLength(1));
- expect(fileResolver.testView!.resolvedFiles, <Object>[]);
+ expect(fileResolver.testView!.resolvedLibraries, <Object>[]);
// Change the file, new resolver.
// With changed file the previously cached result cannot be used.
addTestFile('var a = c;');
createFileResolver();
expect(getTestErrors().errors, hasLength(1));
- expect(fileResolver.testView!.resolvedFiles, [path]);
+ expect(fileResolver.testView!.resolvedLibraries, [path]);
// New resolver.
// Still has cached, will be not resolved.
createFileResolver();
expect(getTestErrors().errors, hasLength(1));
- expect(fileResolver.testView!.resolvedFiles, <Object>[]);
+ expect(fileResolver.testView!.resolvedLibraries, <Object>[]);
}
test_getErrors_reuse_changeDependency() {
@@ -716,15 +716,15 @@
var path = convertPath('/workspace/dart/test/lib/test.dart');
// No resolved files yet.
- expect(fileResolver.testView!.resolvedFiles, isEmpty);
+ expect(fileResolver.testView!.resolvedLibraries, isEmpty);
// No cached, will resolve once.
expect(getTestErrors().errors, hasLength(1));
- expect(fileResolver.testView!.resolvedFiles, [path]);
+ expect(fileResolver.testView!.resolvedLibraries, [path]);
// Has cached, will be not resolved again.
expect(getTestErrors().errors, hasLength(1));
- expect(fileResolver.testView!.resolvedFiles, [path]);
+ expect(fileResolver.testView!.resolvedLibraries, [path]);
// Change the dependency, new resolver.
// The signature of the result is different.
@@ -734,13 +734,13 @@
''');
createFileResolver();
expect(getTestErrors().errors, hasLength(1));
- expect(fileResolver.testView!.resolvedFiles, [path]);
+ expect(fileResolver.testView!.resolvedLibraries, [path]);
// New resolver.
// Still has cached, will be not resolved.
createFileResolver();
expect(getTestErrors().errors, hasLength(1));
- expect(fileResolver.testView!.resolvedFiles, <Object>[]);
+ expect(fileResolver.testView!.resolvedLibraries, <Object>[]);
}
test_getLibraryByUri() {
@@ -1060,20 +1060,20 @@
// No resolved files yet.
var testView = fileResolver.testView!;
- expect(testView.resolvedFiles, isEmpty);
+ expect(testView.resolvedLibraries, isEmpty);
await resolveFile2(path);
var result1 = result;
// The file was resolved.
- expect(testView.resolvedFiles, [path]);
+ expect(testView.resolvedLibraries, [path]);
// The result is cached.
expect(fileResolver.cachedResults, contains(path));
// Ask again, no changes, not resolved.
await resolveFile2(path);
- expect(testView.resolvedFiles, [path]);
+ expect(testView.resolvedLibraries, [path]);
// The same result was returned.
expect(result, same(result1));
@@ -1084,7 +1084,7 @@
// The was a change to a file, no matter which, resolve again.
await resolveFile2(path);
- expect(testView.resolvedFiles, [path, path]);
+ expect(testView.resolvedLibraries, [path, path]);
// Get should get a new result.
expect(result, isNot(same(result1)));
@@ -1103,7 +1103,7 @@
// No resolved files yet.
var testView = fileResolver.testView!;
- expect(testView.resolvedFiles, isEmpty);
+ expect(testView.resolvedLibraries, isEmpty);
fileResolver.resolve(
path: b_path,
@@ -1112,7 +1112,7 @@
);
// The file was resolved.
- expect(testView.resolvedFiles, [a_path]);
+ expect(testView.resolvedLibraries, [a_path]);
// The completion location was set, so not units are resolved.
// So, the result should not be cached.
diff --git a/pkg/analyzer/test/src/diagnostics/const_constructor_with_mixin_with_field_test.dart b/pkg/analyzer/test/src/diagnostics/const_constructor_with_mixin_with_field_test.dart
index 73e81a8..08b1904 100644
--- a/pkg/analyzer/test/src/diagnostics/const_constructor_with_mixin_with_field_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/const_constructor_with_mixin_with_field_test.dart
@@ -15,6 +15,37 @@
@reflectiveTest
class ConstConstructorWithMixinWithFieldTest extends PubPackageResolutionTest {
+ test_class_instance_abstract() async {
+ await assertErrorsInCode('''
+mixin A {
+ abstract int a;
+}
+
+class B with A {
+ @override
+ int a;
+ const B(this.a);
+}
+''', [
+ error(
+ CompileTimeErrorCode.CONST_CONSTRUCTOR_WITH_MIXIN_WITH_FIELD, 77, 1),
+ ]);
+ }
+
+ test_class_instance_abstract_final() async {
+ await assertNoErrorsInCode('''
+mixin A {
+ abstract final int a;
+}
+
+class B with A {
+ @override
+ final int a;
+ const B(this.a);
+}
+''');
+ }
+
test_class_instance_final() async {
await assertErrorsInCode('''
class A {
@@ -64,7 +95,6 @@
const B();
}
''', [
- error(CompileTimeErrorCode.CONST_CONSTRUCTOR_WITH_NON_FINAL_FIELD, 62, 1),
error(
CompileTimeErrorCode.CONST_CONSTRUCTOR_WITH_MIXIN_WITH_FIELD, 62, 1),
]);
@@ -81,7 +111,6 @@
const B();
}
''', [
- error(CompileTimeErrorCode.CONST_CONSTRUCTOR_WITH_NON_FINAL_FIELD, 71, 1),
error(
CompileTimeErrorCode.CONST_CONSTRUCTOR_WITH_MIXIN_WITH_FIELDS, 71, 1),
]);
@@ -119,7 +148,6 @@
const X();
}
''', [
- error(CompileTimeErrorCode.CONST_CONSTRUCTOR_WITH_NON_FINAL_FIELD, 62, 1),
error(
CompileTimeErrorCode.CONST_CONSTRUCTOR_WITH_MIXIN_WITH_FIELD, 62, 1),
]);
diff --git a/pkg/analyzer/test/src/diagnostics/const_constructor_with_non_final_field_test.dart b/pkg/analyzer/test/src/diagnostics/const_constructor_with_non_final_field_test.dart
index 4d4f331..0b5cf6e 100644
--- a/pkg/analyzer/test/src/diagnostics/const_constructor_with_non_final_field_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/const_constructor_with_non_final_field_test.dart
@@ -15,35 +15,6 @@
@reflectiveTest
class ConstConstructorWithNonFinalFieldTest extends PubPackageResolutionTest {
- test_mixin() async {
- await assertErrorsInCode(r'''
-class A {
- var a;
-}
-class B extends Object with A {
- const B();
-}
-''', [
- error(CompileTimeErrorCode.CONST_CONSTRUCTOR_WITH_NON_FINAL_FIELD, 61, 1),
- error(
- CompileTimeErrorCode.CONST_CONSTRUCTOR_WITH_MIXIN_WITH_FIELD, 61, 1),
- ]);
- }
-
- test_super() async {
- await assertErrorsInCode(r'''
-class A {
- var a;
-}
-class B extends A {
- const B();
-}
-''', [
- error(CompileTimeErrorCode.CONST_CONSTRUCTOR_WITH_NON_FINAL_FIELD, 49, 1),
- error(CompileTimeErrorCode.CONST_CONSTRUCTOR_WITH_NON_CONST_SUPER, 49, 1),
- ]);
- }
-
test_this_named() async {
await assertErrorsInCode(r'''
class A {
diff --git a/pkg/analyzer/test/src/diagnostics/must_be_a_native_function_type_test.dart b/pkg/analyzer/test/src/diagnostics/must_be_a_native_function_type_test.dart
index c46e611..ced28b0 100644
--- a/pkg/analyzer/test/src/diagnostics/must_be_a_native_function_type_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/must_be_a_native_function_type_test.dart
@@ -25,7 +25,7 @@
}
}
''', [
- error(FfiCode.MUST_BE_A_NATIVE_FUNCTION_TYPE, 89, 26),
+ error(FfiCode.MUST_BE_A_NATIVE_FUNCTION_TYPE, 110, 1),
]);
}
diff --git a/pkg/analyzer/test/src/diagnostics/subtype_of_struct_class_test.dart b/pkg/analyzer/test/src/diagnostics/subtype_of_struct_class_test.dart
index ab9e982..026be64 100644
--- a/pkg/analyzer/test/src/diagnostics/subtype_of_struct_class_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/subtype_of_struct_class_test.dart
@@ -51,7 +51,7 @@
class S extends Struct {}
class C implements S {}
''', [
- error(FfiCode.EMPTY_STRUCT, 19, 25),
+ error(FfiCode.EMPTY_STRUCT, 25, 1),
error(FfiCode.SUBTYPE_OF_STRUCT_CLASS_IN_IMPLEMENTS, 64, 1),
]);
}
@@ -62,7 +62,7 @@
class S extends Union {}
class C implements S {}
''', [
- error(FfiCode.EMPTY_STRUCT, 19, 24),
+ error(FfiCode.EMPTY_STRUCT, 25, 1),
error(FfiCode.SUBTYPE_OF_STRUCT_CLASS_IN_IMPLEMENTS, 63, 1),
]);
}
@@ -76,7 +76,7 @@
class S extends Struct {}
class C with S {}
''', [
- error(FfiCode.EMPTY_STRUCT, 19, 25),
+ error(FfiCode.EMPTY_STRUCT, 25, 1),
error(CompileTimeErrorCode.MIXIN_INHERITS_FROM_NOT_OBJECT, 58, 1),
error(FfiCode.SUBTYPE_OF_STRUCT_CLASS_IN_WITH, 58, 1),
]);
@@ -88,7 +88,7 @@
class S extends Union {}
class C with S {}
''', [
- error(FfiCode.EMPTY_STRUCT, 19, 24),
+ error(FfiCode.EMPTY_STRUCT, 25, 1),
error(CompileTimeErrorCode.MIXIN_INHERITS_FROM_NOT_OBJECT, 57, 1),
error(FfiCode.SUBTYPE_OF_STRUCT_CLASS_IN_WITH, 57, 1),
]);
diff --git a/pkg/analyzer/test/src/summary/element_text.dart b/pkg/analyzer/test/src/summary/element_text.dart
index 982f6c8..acbd956 100644
--- a/pkg/analyzer/test/src/summary/element_text.dart
+++ b/pkg/analyzer/test/src/summary/element_text.dart
@@ -269,7 +269,6 @@
void _writeClassElement(ClassElement e) {
_writeIndentedLine(() {
- _writeFromMacro(e);
_writeIf(e.isAbstract && !e.isMixin, 'abstract ');
_writeIf(!e.isSimplyBounded, 'notSimplyBounded ');
@@ -471,10 +470,6 @@
_assertNonSyntheticElementSelf(e);
}
- void _writeFromMacro(Element e) {
- _writeIf((e as ElementImpl).isFromMacro, 'fromMacro ');
- }
-
void _writeFunctionElement(FunctionElement e) {
_writeIndentedLine(() {
_writeIf(e.isExternal, 'external ');
@@ -546,7 +541,6 @@
void _writeMethodElement(MethodElement e) {
_writeIndentedLine(() {
- _writeFromMacro(e);
_writeIf(e.isSynthetic, 'synthetic ');
_writeIf(e.isStatic, 'static ');
_writeIf(e.isAbstract, 'abstract ');
diff --git a/pkg/analyzer/test/src/summary/resynthesize_ast2_test.dart b/pkg/analyzer/test/src/summary/resynthesize_ast2_test.dart
index 2466ab4..3a95b46 100644
--- a/pkg/analyzer/test/src/summary/resynthesize_ast2_test.dart
+++ b/pkg/analyzer/test/src/summary/resynthesize_ast2_test.dart
@@ -100,17 +100,10 @@
_addNonDartLibraries({}, inputLibraries, source);
var unitsInformativeBytes = <Uri, Uint8List>{};
- var macroUnitsInformativeBytes = <Uri, Uint8List>{};
for (var inputLibrary in inputLibraries) {
for (var inputUnit in inputLibrary.units) {
var informativeBytes = writeUnitInformative(inputUnit.unit);
unitsInformativeBytes[inputUnit.uri] = informativeBytes;
-
- var macroUnit = inputUnit.macro?.unit;
- if (macroUnit != null) {
- var informativeBytes = writeUnitInformative(macroUnit);
- macroUnitsInformativeBytes[inputUnit.uri] = informativeBytes;
- }
}
}
@@ -145,7 +138,6 @@
BundleReader(
elementFactory: elementFactory,
unitsInformativeBytes: unitsInformativeBytes,
- macroUnitsInformativeBytes: macroUnitsInformativeBytes,
resolutionBytes: linkResult.resolutionBytes,
),
);
@@ -164,31 +156,12 @@
List<LinkInputUnit> units,
FeatureSet featureSet,
) {
- LinkInputUnitMacro? definingUnitMacro;
- {
- var macroSource = sourceFactory.resolveUri(
- definingSource,
- definingSource.shortName.replaceAll('.dart', '.macro_dart'),
- );
- var macroPath = macroSource?.fullName;
- if (macroPath != null) {
- var text = _readSafely(macroPath);
- if (text.isNotEmpty) {
- definingUnitMacro = LinkInputUnitMacro(
- path: macroPath,
- unit: parseText(text, featureSet),
- );
- }
- }
- }
-
units.add(
LinkInputUnit(
partDirectiveIndex: null,
source: definingSource,
isSynthetic: false,
unit: definingUnit,
- macro: definingUnitMacro,
),
);
diff --git a/pkg/analyzer/test/src/summary/resynthesize_common.dart b/pkg/analyzer/test/src/summary/resynthesize_common.dart
index ae5fbb6..caee60d 100644
--- a/pkg/analyzer/test/src/summary/resynthesize_common.dart
+++ b/pkg/analyzer/test/src/summary/resynthesize_common.dart
@@ -21246,96 +21246,6 @@
''');
}
- test_macro_addClass() async {
- newFile('/test.macro_dart', content: r'''
-class A {}
-class B {}
-''');
- var library = await checkLibrary('''
-class A {}
-''');
- checkElementText(library, r'''
-library
- definingUnit
- classes
- class A @6
- constructors
- synthetic @-1
- fromMacro class B @17
- constructors
- synthetic @-1
-''');
- _assertMacroPath(
- library.definingCompilationUnit,
- convertPath('/test.macro_dart'),
- );
- }
-
- test_macro_addToClass_addMethod() async {
- newFile('/test.macro_dart', content: r'''
-class A {
- void foo() {}
- void bar(int a) {}
-}
-''');
- var library = await checkLibrary('''
-class A {
- void foo() {}
-}
-''');
- checkElementText(library, r'''
-library
- definingUnit
- classes
- class A @6
- constructors
- synthetic @-1
- methods
- foo @17
- returnType: void
- fromMacro bar @33
- parameters
- requiredPositional a @41
- type: int
- returnType: void
-''');
- }
-
- test_macro_addToClass_addMethod_offsets() async {
- newFile('/test.macro_dart', content: r'''
-class A {
- void foo() {}
- void bar(int a) {}
-}
-''');
- var library = await checkLibrary('''
-/// shift
-class A {
- void foo() {}
-}
-''');
- // The source code has an additional comment, and offsets of the
- // elements that are declared in the source correspond to the state
- // of the source code, not a (slightly) out of date macro-generated code.
- checkElementText(library, r'''
-library
- definingUnit
- classes
- class A @16
- documentationComment: /// shift
- constructors
- synthetic @-1
- methods
- foo @27
- returnType: void
- fromMacro bar @33
- parameters
- requiredPositional a @41
- type: int
- returnType: void
-''');
- }
-
test_main_class() async {
var library = await checkLibrary('class main {}');
checkElementText(library, r'''
@@ -33668,11 +33578,6 @@
''');
}
- void _assertMacroPath(CompilationUnitElement unitElement, String expected) {
- unitElement as CompilationUnitElementImpl;
- expect(unitElement.macroPath, expected);
- }
-
void _assertTypeStr(DartType type, String expected) {
var typeStr = type.getDisplayString(withNullability: true);
expect(typeStr, expected);
diff --git a/pkg/compiler/lib/src/js_emitter/startup_emitter/model_emitter.dart b/pkg/compiler/lib/src/js_emitter/startup_emitter/model_emitter.dart
index d660d94..4495763 100644
--- a/pkg/compiler/lib/src/js_emitter/startup_emitter/model_emitter.dart
+++ b/pkg/compiler/lib/src/js_emitter/startup_emitter/model_emitter.dart
@@ -352,17 +352,15 @@
/// Generates a simple header that provides the compiler's build id.
js.Comment buildGeneratedBy() {
- StringBuffer flavor = new StringBuffer();
- flavor.write('fast startup emitter');
- // TODO(johnniwinther): Remove this flavor.
- flavor.write(', strong');
+ final flavor = StringBuffer();
+ flavor.write(_options.nullSafetyMode);
if (_options.trustPrimitives) flavor.write(', trust primitives');
if (_options.omitImplicitChecks) flavor.write(', omit checks');
if (_options.laxRuntimeTypeToString) {
flavor.write(', lax runtime type');
}
if (_options.useContentSecurityPolicy) flavor.write(', CSP');
- return new js.Comment(generatedBy(_options, flavor: '$flavor'));
+ return js.Comment(generatedBy(_options, flavor: '$flavor'));
}
js.Statement buildDeferredInitializerGlobal() {
diff --git a/pkg/front_end/lib/src/fasta/builder/class_builder.dart b/pkg/front_end/lib/src/fasta/builder/class_builder.dart
index acf8fb5..8a3759b 100644
--- a/pkg/front_end/lib/src/fasta/builder/class_builder.dart
+++ b/pkg/front_end/lib/src/fasta/builder/class_builder.dart
@@ -349,8 +349,7 @@
void build(String ignore, Builder declaration) {
MemberBuilder member = declaration as MemberBuilder;
member.buildOutlineExpressions(
- library, coreTypes, delayedActionPerformers,
- clonedFunctionNodes);
+ library, coreTypes, delayedActionPerformers, clonedFunctionNodes);
}
MetadataBuilder.buildAnnotations(
@@ -1131,6 +1130,10 @@
@override
Constructor? lookupConstructor(Name name, {bool isSuper: false}) {
+ if (name.text == "new") {
+ name = new Name("", name.library);
+ }
+
Class? instanceClass = cls;
if (isSuper) {
instanceClass = instanceClass.superclass;
diff --git a/pkg/front_end/lib/src/fasta/source/diet_listener.dart b/pkg/front_end/lib/src/fasta/source/diet_listener.dart
index 88490a6..37348d5 100644
--- a/pkg/front_end/lib/src/fasta/source/diet_listener.dart
+++ b/pkg/front_end/lib/src/fasta/source/diet_listener.dart
@@ -1054,6 +1054,9 @@
? ""
: nameOrQualified as String;
}
+ if (libraryBuilder.enableConstructorTearOffsInLibrary) {
+ suffix = suffix == "new" ? "" : suffix;
+ }
declaration = currentClass!.constructors.local[suffix];
declaration = handleDuplicatedName(declaration, token);
checkBuilder(token, declaration, nameOrQualified);
diff --git a/pkg/front_end/lib/src/fasta/source/outline_builder.dart b/pkg/front_end/lib/src/fasta/source/outline_builder.dart
index 4cc93c2..a4c8a0e 100644
--- a/pkg/front_end/lib/src/fasta/source/outline_builder.dart
+++ b/pkg/front_end/lib/src/fasta/source/outline_builder.dart
@@ -129,9 +129,7 @@
List<String>? popIdentifierList(int count) {
if (count == 0) return null;
- List<String> list = new List<String>.filled(
- count,
- /* dummyValue = */ '');
+ List<String> list = new List<String>.filled(count, /* dummyValue = */ '');
bool isParserRecovery = false;
for (int i = count - 1; i >= 0; i--) {
popCharOffset();
@@ -1808,11 +1806,7 @@
checkEmpty(beginToken.charOffset);
if (fieldInfos == null) return;
libraryBuilder.addFields(
- metadata,
- modifiers,
- /* isTopLevel = */ true,
- type,
- fieldInfos);
+ metadata, modifiers, /* isTopLevel = */ true, type, fieldInfos);
}
@override
@@ -1873,11 +1867,7 @@
List<MetadataBuilder>? metadata = pop() as List<MetadataBuilder>?;
if (fieldInfos == null) return;
libraryBuilder.addFields(
- metadata,
- modifiers,
- /* isTopLevel = */ false,
- type,
- fieldInfos);
+ metadata, modifiers, /* isTopLevel = */ false, type, fieldInfos);
}
List<FieldInfo>? popFieldInfos(int count) {
@@ -2232,13 +2222,15 @@
@override
void handleNewAsIdentifier(Token token) {
- // TODO(johnniwinther, paulberry): disable this error when the
- // "constructor-tearoffs" feature is enabled.
- addProblem(
- templateExperimentNotEnabled.withArguments('constructor-tearoffs',
- libraryBuilder.enableConstructorTearOffsVersionInLibrary.toText()),
- token.charOffset,
- token.length);
+ if (!libraryBuilder.enableConstructorTearOffsInLibrary) {
+ addProblem(
+ templateExperimentNotEnabled.withArguments(
+ 'constructor-tearoffs',
+ libraryBuilder.enableConstructorTearOffsVersionInLibrary
+ .toText()),
+ token.charOffset,
+ token.length);
+ }
}
}
diff --git a/pkg/front_end/lib/src/fasta/source/source_library_builder.dart b/pkg/front_end/lib/src/fasta/source/source_library_builder.dart
index 102a830..c4c13ce 100644
--- a/pkg/front_end/lib/src/fasta/source/source_library_builder.dart
+++ b/pkg/front_end/lib/src/fasta/source/source_library_builder.dart
@@ -644,6 +644,9 @@
prefix = name as String;
suffix = null;
}
+ if (enableConstructorTearOffsInLibrary) {
+ suffix = suffix == "new" ? "" : suffix;
+ }
if (prefix == className) {
return suffix ?? "";
}
diff --git a/pkg/front_end/testcases/constructor_tearoffs/explicit_new_as_unnamed.dart b/pkg/front_end/testcases/constructor_tearoffs/explicit_new_as_unnamed.dart
new file mode 100644
index 0000000..52f4e5c
--- /dev/null
+++ b/pkg/front_end/testcases/constructor_tearoffs/explicit_new_as_unnamed.dart
@@ -0,0 +1,23 @@
+// Copyright (c) 2021, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+class A {
+ A.new();
+}
+
+class B {
+ B();
+}
+
+class C {
+ C();
+ C.new(); // Error.
+}
+
+class D {
+ D.new();
+ D(); // Error.
+}
+
+main() {}
diff --git a/pkg/front_end/testcases/constructor_tearoffs/explicit_new_as_unnamed.dart.strong.expect b/pkg/front_end/testcases/constructor_tearoffs/explicit_new_as_unnamed.dart.strong.expect
new file mode 100644
index 0000000..7e82eb9
--- /dev/null
+++ b/pkg/front_end/testcases/constructor_tearoffs/explicit_new_as_unnamed.dart.strong.expect
@@ -0,0 +1,42 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/constructor_tearoffs/explicit_new_as_unnamed.dart:15:3: Error: 'C' is already declared in this scope.
+// C.new(); // Error.
+// ^
+// pkg/front_end/testcases/constructor_tearoffs/explicit_new_as_unnamed.dart:14:3: Context: Previous declaration of 'C'.
+// C();
+// ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/explicit_new_as_unnamed.dart:20:3: Error: 'D' is already declared in this scope.
+// D(); // Error.
+// ^
+// pkg/front_end/testcases/constructor_tearoffs/explicit_new_as_unnamed.dart:19:3: Context: Previous declaration of 'D'.
+// D.new();
+// ^
+//
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+ constructor •() → self::A
+ : super core::Object::•()
+ ;
+}
+class B extends core::Object {
+ constructor •() → self::B
+ : super core::Object::•()
+ ;
+}
+class C extends core::Object {
+ constructor •() → self::C
+ : super core::Object::•()
+ ;
+}
+class D extends core::Object {
+ constructor •() → self::D
+ : super core::Object::•()
+ ;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/constructor_tearoffs/explicit_new_as_unnamed.dart.strong.transformed.expect b/pkg/front_end/testcases/constructor_tearoffs/explicit_new_as_unnamed.dart.strong.transformed.expect
new file mode 100644
index 0000000..7e82eb9
--- /dev/null
+++ b/pkg/front_end/testcases/constructor_tearoffs/explicit_new_as_unnamed.dart.strong.transformed.expect
@@ -0,0 +1,42 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/constructor_tearoffs/explicit_new_as_unnamed.dart:15:3: Error: 'C' is already declared in this scope.
+// C.new(); // Error.
+// ^
+// pkg/front_end/testcases/constructor_tearoffs/explicit_new_as_unnamed.dart:14:3: Context: Previous declaration of 'C'.
+// C();
+// ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/explicit_new_as_unnamed.dart:20:3: Error: 'D' is already declared in this scope.
+// D(); // Error.
+// ^
+// pkg/front_end/testcases/constructor_tearoffs/explicit_new_as_unnamed.dart:19:3: Context: Previous declaration of 'D'.
+// D.new();
+// ^
+//
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+ constructor •() → self::A
+ : super core::Object::•()
+ ;
+}
+class B extends core::Object {
+ constructor •() → self::B
+ : super core::Object::•()
+ ;
+}
+class C extends core::Object {
+ constructor •() → self::C
+ : super core::Object::•()
+ ;
+}
+class D extends core::Object {
+ constructor •() → self::D
+ : super core::Object::•()
+ ;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/constructor_tearoffs/explicit_new_as_unnamed.dart.textual_outline.expect b/pkg/front_end/testcases/constructor_tearoffs/explicit_new_as_unnamed.dart.textual_outline.expect
new file mode 100644
index 0000000..e970626
--- /dev/null
+++ b/pkg/front_end/testcases/constructor_tearoffs/explicit_new_as_unnamed.dart.textual_outline.expect
@@ -0,0 +1,15 @@
+class A {
+ A.new();
+}
+class B {
+ B();
+}
+class C {
+ C();
+ C.new();
+}
+class D {
+ D.new();
+ D();
+}
+main() {}
diff --git a/pkg/front_end/testcases/constructor_tearoffs/explicit_new_as_unnamed.dart.weak.expect b/pkg/front_end/testcases/constructor_tearoffs/explicit_new_as_unnamed.dart.weak.expect
new file mode 100644
index 0000000..7e82eb9
--- /dev/null
+++ b/pkg/front_end/testcases/constructor_tearoffs/explicit_new_as_unnamed.dart.weak.expect
@@ -0,0 +1,42 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/constructor_tearoffs/explicit_new_as_unnamed.dart:15:3: Error: 'C' is already declared in this scope.
+// C.new(); // Error.
+// ^
+// pkg/front_end/testcases/constructor_tearoffs/explicit_new_as_unnamed.dart:14:3: Context: Previous declaration of 'C'.
+// C();
+// ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/explicit_new_as_unnamed.dart:20:3: Error: 'D' is already declared in this scope.
+// D(); // Error.
+// ^
+// pkg/front_end/testcases/constructor_tearoffs/explicit_new_as_unnamed.dart:19:3: Context: Previous declaration of 'D'.
+// D.new();
+// ^
+//
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+ constructor •() → self::A
+ : super core::Object::•()
+ ;
+}
+class B extends core::Object {
+ constructor •() → self::B
+ : super core::Object::•()
+ ;
+}
+class C extends core::Object {
+ constructor •() → self::C
+ : super core::Object::•()
+ ;
+}
+class D extends core::Object {
+ constructor •() → self::D
+ : super core::Object::•()
+ ;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/constructor_tearoffs/explicit_new_as_unnamed.dart.weak.outline.expect b/pkg/front_end/testcases/constructor_tearoffs/explicit_new_as_unnamed.dart.weak.outline.expect
new file mode 100644
index 0000000..47a2971
--- /dev/null
+++ b/pkg/front_end/testcases/constructor_tearoffs/explicit_new_as_unnamed.dart.weak.outline.expect
@@ -0,0 +1,39 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/constructor_tearoffs/explicit_new_as_unnamed.dart:15:3: Error: 'C' is already declared in this scope.
+// C.new(); // Error.
+// ^
+// pkg/front_end/testcases/constructor_tearoffs/explicit_new_as_unnamed.dart:14:3: Context: Previous declaration of 'C'.
+// C();
+// ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/explicit_new_as_unnamed.dart:20:3: Error: 'D' is already declared in this scope.
+// D(); // Error.
+// ^
+// pkg/front_end/testcases/constructor_tearoffs/explicit_new_as_unnamed.dart:19:3: Context: Previous declaration of 'D'.
+// D.new();
+// ^
+//
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+ constructor •() → self::A
+ ;
+}
+class B extends core::Object {
+ constructor •() → self::B
+ ;
+}
+class C extends core::Object {
+ constructor •() → self::C
+ ;
+}
+class D extends core::Object {
+ constructor •() → self::D
+ ;
+}
+static method main() → dynamic
+ ;
diff --git a/pkg/front_end/testcases/constructor_tearoffs/explicit_new_as_unnamed.dart.weak.transformed.expect b/pkg/front_end/testcases/constructor_tearoffs/explicit_new_as_unnamed.dart.weak.transformed.expect
new file mode 100644
index 0000000..7e82eb9
--- /dev/null
+++ b/pkg/front_end/testcases/constructor_tearoffs/explicit_new_as_unnamed.dart.weak.transformed.expect
@@ -0,0 +1,42 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/constructor_tearoffs/explicit_new_as_unnamed.dart:15:3: Error: 'C' is already declared in this scope.
+// C.new(); // Error.
+// ^
+// pkg/front_end/testcases/constructor_tearoffs/explicit_new_as_unnamed.dart:14:3: Context: Previous declaration of 'C'.
+// C();
+// ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/explicit_new_as_unnamed.dart:20:3: Error: 'D' is already declared in this scope.
+// D(); // Error.
+// ^
+// pkg/front_end/testcases/constructor_tearoffs/explicit_new_as_unnamed.dart:19:3: Context: Previous declaration of 'D'.
+// D.new();
+// ^
+//
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+ constructor •() → self::A
+ : super core::Object::•()
+ ;
+}
+class B extends core::Object {
+ constructor •() → self::B
+ : super core::Object::•()
+ ;
+}
+class C extends core::Object {
+ constructor •() → self::C
+ : super core::Object::•()
+ ;
+}
+class D extends core::Object {
+ constructor •() → self::D
+ : super core::Object::•()
+ ;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/constructor_tearoffs/redirecting_constructors.dart.strong.expect b/pkg/front_end/testcases/constructor_tearoffs/redirecting_constructors.dart.strong.expect
index b0293c7..b589af6 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/redirecting_constructors.dart.strong.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/redirecting_constructors.dart.strong.expect
@@ -2,43 +2,20 @@
//
// Problems in library:
//
-// pkg/front_end/testcases/constructor_tearoffs/redirecting_constructors.dart:6:5: Error: This requires the 'constructor-tearoffs' language feature to be enabled.
-// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.14 or higher, and running 'pub get'.
-// A.new();
-// ^^^
-//
-// pkg/front_end/testcases/constructor_tearoffs/redirecting_constructors.dart:7:38: Error: This requires the 'constructor-tearoffs' language feature to be enabled.
-// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.14 or higher, and running 'pub get'.
-// factory A.redirectingFactory() = A.new;
-// ^^^
-//
-// pkg/front_end/testcases/constructor_tearoffs/redirecting_constructors.dart:8:43: Error: This requires the 'constructor-tearoffs' language feature to be enabled.
-// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.14 or higher, and running 'pub get'.
-// factory A.redirectingFactoryChild() = B.new;
-// ^^^
-//
-// pkg/front_end/testcases/constructor_tearoffs/redirecting_constructors.dart:7:36: Error: Redirection constructor target not found: 'A.new'
-// factory A.redirectingFactory() = A.new;
-// ^
-//
// pkg/front_end/testcases/constructor_tearoffs/redirecting_constructors.dart:20:5: Error: Expected ';' after this.
// A x3 f3();
// ^^
//
-// pkg/front_end/testcases/constructor_tearoffs/redirecting_constructors.dart:12:7: Error: The superclass, 'A', has no unnamed constructor that takes no arguments.
-// class B extends A {}
-// ^
-//
import self as self;
import "dart:core" as core;
class A extends core::Object {
static final field dynamic _redirecting# = <dynamic>[self::A::redirectingFactory, self::A::redirectingFactoryChild, self::A::redirectingTwice]/*isLegacy*/;
- constructor new() → self::A
+ constructor •() → self::A
: super core::Object::•()
;
static factory redirectingFactory() → self::A
- let dynamic #redirecting_factory = "A.new" in invalid-expression;
+ let dynamic #redirecting_factory = self::A::• in invalid-expression;
static factory redirectingFactoryChild() → self::A
let dynamic #redirecting_factory = self::B::• in invalid-expression;
static factory redirectingTwice() → self::A
@@ -46,7 +23,7 @@
}
class B extends self::A {
synthetic constructor •() → self::B
- : invalid-initializer
+ : super self::A::•()
;
}
static method test() → dynamic {
diff --git a/pkg/front_end/testcases/constructor_tearoffs/redirecting_constructors.dart.strong.transformed.expect b/pkg/front_end/testcases/constructor_tearoffs/redirecting_constructors.dart.strong.transformed.expect
index 44e6acc..a3c5d1d 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/redirecting_constructors.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/redirecting_constructors.dart.strong.transformed.expect
@@ -2,43 +2,20 @@
//
// Problems in library:
//
-// pkg/front_end/testcases/constructor_tearoffs/redirecting_constructors.dart:6:5: Error: This requires the 'constructor-tearoffs' language feature to be enabled.
-// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.14 or higher, and running 'pub get'.
-// A.new();
-// ^^^
-//
-// pkg/front_end/testcases/constructor_tearoffs/redirecting_constructors.dart:7:38: Error: This requires the 'constructor-tearoffs' language feature to be enabled.
-// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.14 or higher, and running 'pub get'.
-// factory A.redirectingFactory() = A.new;
-// ^^^
-//
-// pkg/front_end/testcases/constructor_tearoffs/redirecting_constructors.dart:8:43: Error: This requires the 'constructor-tearoffs' language feature to be enabled.
-// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.14 or higher, and running 'pub get'.
-// factory A.redirectingFactoryChild() = B.new;
-// ^^^
-//
-// pkg/front_end/testcases/constructor_tearoffs/redirecting_constructors.dart:7:36: Error: Redirection constructor target not found: 'A.new'
-// factory A.redirectingFactory() = A.new;
-// ^
-//
// pkg/front_end/testcases/constructor_tearoffs/redirecting_constructors.dart:20:5: Error: Expected ';' after this.
// A x3 f3();
// ^^
//
-// pkg/front_end/testcases/constructor_tearoffs/redirecting_constructors.dart:12:7: Error: The superclass, 'A', has no unnamed constructor that takes no arguments.
-// class B extends A {}
-// ^
-//
import self as self;
import "dart:core" as core;
class A extends core::Object {
static final field dynamic _redirecting# = <dynamic>[self::A::redirectingFactory, self::A::redirectingFactoryChild, self::A::redirectingTwice]/*isLegacy*/;
- constructor new() → self::A
+ constructor •() → self::A
: super core::Object::•()
;
static factory redirectingFactory() → self::A
- let core::String* #redirecting_factory = "A.new" in invalid-expression;
+ let Never #redirecting_factory = self::A::• in invalid-expression;
static factory redirectingFactoryChild() → self::A
let Never #redirecting_factory = self::B::• in invalid-expression;
static factory redirectingTwice() → self::A
@@ -46,7 +23,7 @@
}
class B extends self::A {
synthetic constructor •() → self::B
- : invalid-initializer
+ : super self::A::•()
;
}
static method test() → dynamic {
diff --git a/pkg/front_end/testcases/constructor_tearoffs/redirecting_constructors.dart.weak.expect b/pkg/front_end/testcases/constructor_tearoffs/redirecting_constructors.dart.weak.expect
index b0293c7..b589af6 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/redirecting_constructors.dart.weak.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/redirecting_constructors.dart.weak.expect
@@ -2,43 +2,20 @@
//
// Problems in library:
//
-// pkg/front_end/testcases/constructor_tearoffs/redirecting_constructors.dart:6:5: Error: This requires the 'constructor-tearoffs' language feature to be enabled.
-// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.14 or higher, and running 'pub get'.
-// A.new();
-// ^^^
-//
-// pkg/front_end/testcases/constructor_tearoffs/redirecting_constructors.dart:7:38: Error: This requires the 'constructor-tearoffs' language feature to be enabled.
-// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.14 or higher, and running 'pub get'.
-// factory A.redirectingFactory() = A.new;
-// ^^^
-//
-// pkg/front_end/testcases/constructor_tearoffs/redirecting_constructors.dart:8:43: Error: This requires the 'constructor-tearoffs' language feature to be enabled.
-// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.14 or higher, and running 'pub get'.
-// factory A.redirectingFactoryChild() = B.new;
-// ^^^
-//
-// pkg/front_end/testcases/constructor_tearoffs/redirecting_constructors.dart:7:36: Error: Redirection constructor target not found: 'A.new'
-// factory A.redirectingFactory() = A.new;
-// ^
-//
// pkg/front_end/testcases/constructor_tearoffs/redirecting_constructors.dart:20:5: Error: Expected ';' after this.
// A x3 f3();
// ^^
//
-// pkg/front_end/testcases/constructor_tearoffs/redirecting_constructors.dart:12:7: Error: The superclass, 'A', has no unnamed constructor that takes no arguments.
-// class B extends A {}
-// ^
-//
import self as self;
import "dart:core" as core;
class A extends core::Object {
static final field dynamic _redirecting# = <dynamic>[self::A::redirectingFactory, self::A::redirectingFactoryChild, self::A::redirectingTwice]/*isLegacy*/;
- constructor new() → self::A
+ constructor •() → self::A
: super core::Object::•()
;
static factory redirectingFactory() → self::A
- let dynamic #redirecting_factory = "A.new" in invalid-expression;
+ let dynamic #redirecting_factory = self::A::• in invalid-expression;
static factory redirectingFactoryChild() → self::A
let dynamic #redirecting_factory = self::B::• in invalid-expression;
static factory redirectingTwice() → self::A
@@ -46,7 +23,7 @@
}
class B extends self::A {
synthetic constructor •() → self::B
- : invalid-initializer
+ : super self::A::•()
;
}
static method test() → dynamic {
diff --git a/pkg/front_end/testcases/constructor_tearoffs/redirecting_constructors.dart.weak.outline.expect b/pkg/front_end/testcases/constructor_tearoffs/redirecting_constructors.dart.weak.outline.expect
index b9415d3..e80d672 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/redirecting_constructors.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/redirecting_constructors.dart.weak.outline.expect
@@ -1,35 +1,13 @@
library /*isNonNullableByDefault*/;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/constructor_tearoffs/redirecting_constructors.dart:6:5: Error: This requires the 'constructor-tearoffs' language feature to be enabled.
-// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.14 or higher, and running 'pub get'.
-// A.new();
-// ^^^
-//
-// pkg/front_end/testcases/constructor_tearoffs/redirecting_constructors.dart:7:38: Error: This requires the 'constructor-tearoffs' language feature to be enabled.
-// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.14 or higher, and running 'pub get'.
-// factory A.redirectingFactory() = A.new;
-// ^^^
-//
-// pkg/front_end/testcases/constructor_tearoffs/redirecting_constructors.dart:8:43: Error: This requires the 'constructor-tearoffs' language feature to be enabled.
-// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.14 or higher, and running 'pub get'.
-// factory A.redirectingFactoryChild() = B.new;
-// ^^^
-//
-// pkg/front_end/testcases/constructor_tearoffs/redirecting_constructors.dart:7:36: Error: Redirection constructor target not found: 'A.new'
-// factory A.redirectingFactory() = A.new;
-// ^
-//
import self as self;
import "dart:core" as core;
class A extends core::Object {
static final field dynamic _redirecting# = <dynamic>[self::A::redirectingFactory, self::A::redirectingFactoryChild, self::A::redirectingTwice]/*isLegacy*/;
- constructor new() → self::A
+ constructor •() → self::A
;
static factory redirectingFactory() → self::A
- let dynamic #redirecting_factory = "A.new" in invalid-expression;
+ let dynamic #redirecting_factory = self::A::• in invalid-expression;
static factory redirectingFactoryChild() → self::A
let dynamic #redirecting_factory = self::B::• in invalid-expression;
static factory redirectingTwice() → self::A
diff --git a/pkg/front_end/testcases/constructor_tearoffs/redirecting_constructors.dart.weak.transformed.expect b/pkg/front_end/testcases/constructor_tearoffs/redirecting_constructors.dart.weak.transformed.expect
index 44e6acc..a3c5d1d 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/redirecting_constructors.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/redirecting_constructors.dart.weak.transformed.expect
@@ -2,43 +2,20 @@
//
// Problems in library:
//
-// pkg/front_end/testcases/constructor_tearoffs/redirecting_constructors.dart:6:5: Error: This requires the 'constructor-tearoffs' language feature to be enabled.
-// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.14 or higher, and running 'pub get'.
-// A.new();
-// ^^^
-//
-// pkg/front_end/testcases/constructor_tearoffs/redirecting_constructors.dart:7:38: Error: This requires the 'constructor-tearoffs' language feature to be enabled.
-// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.14 or higher, and running 'pub get'.
-// factory A.redirectingFactory() = A.new;
-// ^^^
-//
-// pkg/front_end/testcases/constructor_tearoffs/redirecting_constructors.dart:8:43: Error: This requires the 'constructor-tearoffs' language feature to be enabled.
-// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.14 or higher, and running 'pub get'.
-// factory A.redirectingFactoryChild() = B.new;
-// ^^^
-//
-// pkg/front_end/testcases/constructor_tearoffs/redirecting_constructors.dart:7:36: Error: Redirection constructor target not found: 'A.new'
-// factory A.redirectingFactory() = A.new;
-// ^
-//
// pkg/front_end/testcases/constructor_tearoffs/redirecting_constructors.dart:20:5: Error: Expected ';' after this.
// A x3 f3();
// ^^
//
-// pkg/front_end/testcases/constructor_tearoffs/redirecting_constructors.dart:12:7: Error: The superclass, 'A', has no unnamed constructor that takes no arguments.
-// class B extends A {}
-// ^
-//
import self as self;
import "dart:core" as core;
class A extends core::Object {
static final field dynamic _redirecting# = <dynamic>[self::A::redirectingFactory, self::A::redirectingFactoryChild, self::A::redirectingTwice]/*isLegacy*/;
- constructor new() → self::A
+ constructor •() → self::A
: super core::Object::•()
;
static factory redirectingFactory() → self::A
- let core::String* #redirecting_factory = "A.new" in invalid-expression;
+ let Never #redirecting_factory = self::A::• in invalid-expression;
static factory redirectingFactoryChild() → self::A
let Never #redirecting_factory = self::B::• in invalid-expression;
static factory redirectingTwice() → self::A
@@ -46,7 +23,7 @@
}
class B extends self::A {
synthetic constructor •() → self::B
- : invalid-initializer
+ : super self::A::•()
;
}
static method test() → dynamic {
diff --git a/pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart b/pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart
index c8527be..5784e0a 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart
+++ b/pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart
@@ -16,7 +16,7 @@
const C.new(this.x);
}
-class D extend C {
+class D extends C {
D(int x) : super.new(x * 2);
}
diff --git a/pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart.strong.expect b/pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart.strong.expect
index 8bde084..50ef75f8 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart.strong.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart.strong.expect
@@ -1,139 +1,52 @@
library /*isNonNullableByDefault*/;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart:6:5: Error: This requires the 'constructor-tearoffs' language feature to be enabled.
-// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.14 or higher, and running 'pub get'.
-// A.new();
-// ^^^
-//
-// pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart:7:38: Error: This requires the 'constructor-tearoffs' language feature to be enabled.
-// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.14 or higher, and running 'pub get'.
-// factory A.redirectingFactory() = A.new;
-// ^^^
-//
-// pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart:8:43: Error: This requires the 'constructor-tearoffs' language feature to be enabled.
-// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.14 or higher, and running 'pub get'.
-// factory A.redirectingFactoryChild() = B.new;
-// ^^^
-//
-// pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart:9:26: Error: This requires the 'constructor-tearoffs' language feature to be enabled.
-// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.14 or higher, and running 'pub get'.
-// A.redirecting() : this.new();
-// ^^^
-//
-// pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart:16:11: Error: This requires the 'constructor-tearoffs' language feature to be enabled.
-// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.14 or higher, and running 'pub get'.
-// const C.new(this.x);
-// ^^^
-//
-// pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart:19:9: Error: Expected 'extends' instead of this.
-// class D extend C {
-// ^^^^^^
-//
-// pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart:20:20: Error: This requires the 'constructor-tearoffs' language feature to be enabled.
-// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.14 or higher, and running 'pub get'.
-// D(int x) : super.new(x * 2);
-// ^^^
-//
-// pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart:7:36: Error: Redirection constructor target not found: 'A.new'
-// factory A.redirectingFactory() = A.new;
-// ^
-//
-// pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart:20:14: Error: Superclass has no constructor named 'Object.new'.
-// D(int x) : super.new(x * 2);
-// ^^^^^
-//
-// pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart:25:11: Error: Method not found: 'C.new'.
-// const C.new(1);
-// ^^^
-//
-// pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart:26:9: Error: Method not found: 'C.new'.
-// new C.new(1);
-// ^^^
-//
-// pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart:28:14: Error: Getter not found: 'new'.
-// var f1 = A.new;
-// ^^^
-//
-// pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart:30:14: Error: Getter not found: 'new'.
-// var f3 = C.new;
-// ^^^
-//
-// pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart:37:23: Error: Getter not found: 'new'.
-// A Function() g1 = A.new;
-// ^^^
-//
-// pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart:39:28: Error: Getter not found: 'new'.
-// C Function(int x) g3 = C.new;
-// ^^^
-//
-// pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart:12:7: Error: The superclass, 'A', has no unnamed constructor that takes no arguments.
-// class B extends A {}
-// ^
-//
import self as self;
import "dart:core" as core;
class A extends core::Object {
static final field dynamic _redirecting# = <dynamic>[self::A::redirectingFactory, self::A::redirectingFactoryChild]/*isLegacy*/;
- constructor new() → self::A
+ constructor •() → self::A
: super core::Object::•()
;
constructor redirecting() → self::A
- : this self::A::new()
+ : this self::A::•()
;
static factory redirectingFactory() → self::A
- let dynamic #redirecting_factory = "A.new" in invalid-expression;
+ let dynamic #redirecting_factory = self::A::• in invalid-expression;
static factory redirectingFactoryChild() → self::A
let dynamic #redirecting_factory = self::B::• in invalid-expression;
}
class B extends self::A {
synthetic constructor •() → self::B
- : invalid-initializer
+ : super self::A::•()
;
}
class C extends core::Object /*hasConstConstructor*/ {
final field core::int x;
- const constructor new(core::int x) → self::C
+ const constructor •(core::int x) → self::C
: self::C::x = x, super core::Object::•()
;
}
-class D extends core::Object {
+class D extends self::C {
constructor •(core::int x) → self::D
- : final dynamic #t1 = invalid-expression "pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart:20:14: Error: Superclass has no constructor named 'Object.new'.
- D(int x) : super.new(x * 2);
- ^^^^^"
+ : super self::C::•(x.{core::num::*}(2){(core::num) → core::int})
;
}
static method test() → dynamic {
new self::D::•(1);
- invalid-expression "pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart:25:11: Error: Method not found: 'C.new'.
- const C.new(1);
- ^^^";
- invalid-expression "pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart:26:9: Error: Method not found: 'C.new'.
- new C.new(1);
- ^^^";
- dynamic f1 = invalid-expression "pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart:28:14: Error: Getter not found: 'new'.
- var f1 = A.new;
- ^^^";
- () → self::B f2 = #C1;
- dynamic f3 = invalid-expression "pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart:30:14: Error: Getter not found: 'new'.
- var f3 = C.new;
- ^^^";
- (core::int) → self::D f4 = #C2;
- f1{dynamic}.call();
+ #C2;
+ new self::C::•(1);
+ () → self::A f1 = #C3;
+ () → self::B f2 = #C4;
+ (core::int) → self::C f3 = #C5;
+ (core::int) → self::D f4 = #C6;
+ f1(){() → self::A};
f2(){() → self::B};
- f3{dynamic}.call(1);
+ f3(1){(core::int) → self::C};
f4(1){(core::int) → self::D};
- () → self::A g1 = invalid-expression "pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart:37:23: Error: Getter not found: 'new'.
- A Function() g1 = A.new;
- ^^^" as{TypeError,ForDynamic,ForNonNullableByDefault} () → self::A;
- () → self::B g2 = #C1;
- (core::int) → self::C g3 = invalid-expression "pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart:39:28: Error: Getter not found: 'new'.
- C Function(int x) g3 = C.new;
- ^^^" as{TypeError,ForDynamic,ForNonNullableByDefault} (core::int) → self::C;
- (core::int) → self::D g4 = #C2;
+ () → self::A g1 = #C3;
+ () → self::B g2 = #C4;
+ (core::int) → self::C g3 = #C5;
+ (core::int) → self::D g4 = #C6;
g1(){() → self::A};
g2(){() → self::B};
g3(1){(core::int) → self::C};
@@ -142,6 +55,16 @@
static method main() → dynamic {}
constants {
- #C1 = constructor-tearoff self::B::•
- #C2 = constructor-tearoff self::D::•
+ #C1 = 1
+ #C2 = self::C {x:#C1}
+ #C3 = constructor-tearoff self::A::•
+ #C4 = constructor-tearoff self::B::•
+ #C5 = constructor-tearoff self::C::•
+ #C6 = constructor-tearoff self::D::•
}
+
+
+Constructor coverage from constants:
+org-dartlang-testcase:///unnamed_constructor.dart:
+- C. (from org-dartlang-testcase:///unnamed_constructor.dart:16:9)
+- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
diff --git a/pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart.strong.transformed.expect b/pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart.strong.transformed.expect
index be73c25..44b6f22 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart.strong.transformed.expect
@@ -1,139 +1,52 @@
library /*isNonNullableByDefault*/;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart:6:5: Error: This requires the 'constructor-tearoffs' language feature to be enabled.
-// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.14 or higher, and running 'pub get'.
-// A.new();
-// ^^^
-//
-// pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart:7:38: Error: This requires the 'constructor-tearoffs' language feature to be enabled.
-// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.14 or higher, and running 'pub get'.
-// factory A.redirectingFactory() = A.new;
-// ^^^
-//
-// pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart:8:43: Error: This requires the 'constructor-tearoffs' language feature to be enabled.
-// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.14 or higher, and running 'pub get'.
-// factory A.redirectingFactoryChild() = B.new;
-// ^^^
-//
-// pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart:9:26: Error: This requires the 'constructor-tearoffs' language feature to be enabled.
-// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.14 or higher, and running 'pub get'.
-// A.redirecting() : this.new();
-// ^^^
-//
-// pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart:16:11: Error: This requires the 'constructor-tearoffs' language feature to be enabled.
-// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.14 or higher, and running 'pub get'.
-// const C.new(this.x);
-// ^^^
-//
-// pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart:19:9: Error: Expected 'extends' instead of this.
-// class D extend C {
-// ^^^^^^
-//
-// pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart:20:20: Error: This requires the 'constructor-tearoffs' language feature to be enabled.
-// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.14 or higher, and running 'pub get'.
-// D(int x) : super.new(x * 2);
-// ^^^
-//
-// pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart:7:36: Error: Redirection constructor target not found: 'A.new'
-// factory A.redirectingFactory() = A.new;
-// ^
-//
-// pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart:20:14: Error: Superclass has no constructor named 'Object.new'.
-// D(int x) : super.new(x * 2);
-// ^^^^^
-//
-// pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart:25:11: Error: Method not found: 'C.new'.
-// const C.new(1);
-// ^^^
-//
-// pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart:26:9: Error: Method not found: 'C.new'.
-// new C.new(1);
-// ^^^
-//
-// pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart:28:14: Error: Getter not found: 'new'.
-// var f1 = A.new;
-// ^^^
-//
-// pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart:30:14: Error: Getter not found: 'new'.
-// var f3 = C.new;
-// ^^^
-//
-// pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart:37:23: Error: Getter not found: 'new'.
-// A Function() g1 = A.new;
-// ^^^
-//
-// pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart:39:28: Error: Getter not found: 'new'.
-// C Function(int x) g3 = C.new;
-// ^^^
-//
-// pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart:12:7: Error: The superclass, 'A', has no unnamed constructor that takes no arguments.
-// class B extends A {}
-// ^
-//
import self as self;
import "dart:core" as core;
class A extends core::Object {
static final field dynamic _redirecting# = <dynamic>[self::A::redirectingFactory, self::A::redirectingFactoryChild]/*isLegacy*/;
- constructor new() → self::A
+ constructor •() → self::A
: super core::Object::•()
;
constructor redirecting() → self::A
- : this self::A::new()
+ : this self::A::•()
;
static factory redirectingFactory() → self::A
- let core::String* #redirecting_factory = "A.new" in invalid-expression;
+ let Never #redirecting_factory = self::A::• in invalid-expression;
static factory redirectingFactoryChild() → self::A
let Never #redirecting_factory = self::B::• in invalid-expression;
}
class B extends self::A {
synthetic constructor •() → self::B
- : invalid-initializer
+ : super self::A::•()
;
}
class C extends core::Object /*hasConstConstructor*/ {
final field core::int x;
- const constructor new(core::int x) → self::C
+ const constructor •(core::int x) → self::C
: self::C::x = x, super core::Object::•()
;
}
-class D extends core::Object {
+class D extends self::C {
constructor •(core::int x) → self::D
- : final dynamic #t1 = invalid-expression "pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart:20:14: Error: Superclass has no constructor named 'Object.new'.
- D(int x) : super.new(x * 2);
- ^^^^^"
+ : super self::C::•(x.{core::num::*}(2){(core::num) → core::int})
;
}
static method test() → dynamic {
new self::D::•(1);
- invalid-expression "pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart:25:11: Error: Method not found: 'C.new'.
- const C.new(1);
- ^^^";
- invalid-expression "pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart:26:9: Error: Method not found: 'C.new'.
- new C.new(1);
- ^^^";
- dynamic f1 = invalid-expression "pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart:28:14: Error: Getter not found: 'new'.
- var f1 = A.new;
- ^^^";
- () → self::B f2 = #C1;
- dynamic f3 = invalid-expression "pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart:30:14: Error: Getter not found: 'new'.
- var f3 = C.new;
- ^^^";
- (core::int) → self::D f4 = #C2;
- f1{dynamic}.call();
+ #C2;
+ new self::C::•(1);
+ () → self::A f1 = #C3;
+ () → self::B f2 = #C4;
+ (core::int) → self::C f3 = #C5;
+ (core::int) → self::D f4 = #C6;
+ f1(){() → self::A};
f2(){() → self::B};
- f3{dynamic}.call(1);
+ f3(1){(core::int) → self::C};
f4(1){(core::int) → self::D};
- () → self::A g1 = invalid-expression "pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart:37:23: Error: Getter not found: 'new'.
- A Function() g1 = A.new;
- ^^^";
- () → self::B g2 = #C1;
- (core::int) → self::C g3 = invalid-expression "pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart:39:28: Error: Getter not found: 'new'.
- C Function(int x) g3 = C.new;
- ^^^";
- (core::int) → self::D g4 = #C2;
+ () → self::A g1 = #C3;
+ () → self::B g2 = #C4;
+ (core::int) → self::C g3 = #C5;
+ (core::int) → self::D g4 = #C6;
g1(){() → self::A};
g2(){() → self::B};
g3(1){(core::int) → self::C};
@@ -142,6 +55,16 @@
static method main() → dynamic {}
constants {
- #C1 = constructor-tearoff self::B::•
- #C2 = constructor-tearoff self::D::•
+ #C1 = 1
+ #C2 = self::C {x:#C1}
+ #C3 = constructor-tearoff self::A::•
+ #C4 = constructor-tearoff self::B::•
+ #C5 = constructor-tearoff self::C::•
+ #C6 = constructor-tearoff self::D::•
}
+
+
+Constructor coverage from constants:
+org-dartlang-testcase:///unnamed_constructor.dart:
+- C. (from org-dartlang-testcase:///unnamed_constructor.dart:16:9)
+- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
diff --git a/pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart.textual_outline.expect b/pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart.textual_outline.expect
index d70331c..3e34a96 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart.textual_outline.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart.textual_outline.expect
@@ -9,7 +9,7 @@
final int x;
const C.new(this.x);
}
-class D extend C {
+class D extends C {
D(int x) : super.new(x * 2);
}
test() {}
diff --git a/pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart.weak.expect b/pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart.weak.expect
index 8bde084..50ef75f8 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart.weak.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart.weak.expect
@@ -1,139 +1,52 @@
library /*isNonNullableByDefault*/;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart:6:5: Error: This requires the 'constructor-tearoffs' language feature to be enabled.
-// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.14 or higher, and running 'pub get'.
-// A.new();
-// ^^^
-//
-// pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart:7:38: Error: This requires the 'constructor-tearoffs' language feature to be enabled.
-// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.14 or higher, and running 'pub get'.
-// factory A.redirectingFactory() = A.new;
-// ^^^
-//
-// pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart:8:43: Error: This requires the 'constructor-tearoffs' language feature to be enabled.
-// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.14 or higher, and running 'pub get'.
-// factory A.redirectingFactoryChild() = B.new;
-// ^^^
-//
-// pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart:9:26: Error: This requires the 'constructor-tearoffs' language feature to be enabled.
-// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.14 or higher, and running 'pub get'.
-// A.redirecting() : this.new();
-// ^^^
-//
-// pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart:16:11: Error: This requires the 'constructor-tearoffs' language feature to be enabled.
-// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.14 or higher, and running 'pub get'.
-// const C.new(this.x);
-// ^^^
-//
-// pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart:19:9: Error: Expected 'extends' instead of this.
-// class D extend C {
-// ^^^^^^
-//
-// pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart:20:20: Error: This requires the 'constructor-tearoffs' language feature to be enabled.
-// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.14 or higher, and running 'pub get'.
-// D(int x) : super.new(x * 2);
-// ^^^
-//
-// pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart:7:36: Error: Redirection constructor target not found: 'A.new'
-// factory A.redirectingFactory() = A.new;
-// ^
-//
-// pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart:20:14: Error: Superclass has no constructor named 'Object.new'.
-// D(int x) : super.new(x * 2);
-// ^^^^^
-//
-// pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart:25:11: Error: Method not found: 'C.new'.
-// const C.new(1);
-// ^^^
-//
-// pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart:26:9: Error: Method not found: 'C.new'.
-// new C.new(1);
-// ^^^
-//
-// pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart:28:14: Error: Getter not found: 'new'.
-// var f1 = A.new;
-// ^^^
-//
-// pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart:30:14: Error: Getter not found: 'new'.
-// var f3 = C.new;
-// ^^^
-//
-// pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart:37:23: Error: Getter not found: 'new'.
-// A Function() g1 = A.new;
-// ^^^
-//
-// pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart:39:28: Error: Getter not found: 'new'.
-// C Function(int x) g3 = C.new;
-// ^^^
-//
-// pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart:12:7: Error: The superclass, 'A', has no unnamed constructor that takes no arguments.
-// class B extends A {}
-// ^
-//
import self as self;
import "dart:core" as core;
class A extends core::Object {
static final field dynamic _redirecting# = <dynamic>[self::A::redirectingFactory, self::A::redirectingFactoryChild]/*isLegacy*/;
- constructor new() → self::A
+ constructor •() → self::A
: super core::Object::•()
;
constructor redirecting() → self::A
- : this self::A::new()
+ : this self::A::•()
;
static factory redirectingFactory() → self::A
- let dynamic #redirecting_factory = "A.new" in invalid-expression;
+ let dynamic #redirecting_factory = self::A::• in invalid-expression;
static factory redirectingFactoryChild() → self::A
let dynamic #redirecting_factory = self::B::• in invalid-expression;
}
class B extends self::A {
synthetic constructor •() → self::B
- : invalid-initializer
+ : super self::A::•()
;
}
class C extends core::Object /*hasConstConstructor*/ {
final field core::int x;
- const constructor new(core::int x) → self::C
+ const constructor •(core::int x) → self::C
: self::C::x = x, super core::Object::•()
;
}
-class D extends core::Object {
+class D extends self::C {
constructor •(core::int x) → self::D
- : final dynamic #t1 = invalid-expression "pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart:20:14: Error: Superclass has no constructor named 'Object.new'.
- D(int x) : super.new(x * 2);
- ^^^^^"
+ : super self::C::•(x.{core::num::*}(2){(core::num) → core::int})
;
}
static method test() → dynamic {
new self::D::•(1);
- invalid-expression "pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart:25:11: Error: Method not found: 'C.new'.
- const C.new(1);
- ^^^";
- invalid-expression "pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart:26:9: Error: Method not found: 'C.new'.
- new C.new(1);
- ^^^";
- dynamic f1 = invalid-expression "pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart:28:14: Error: Getter not found: 'new'.
- var f1 = A.new;
- ^^^";
- () → self::B f2 = #C1;
- dynamic f3 = invalid-expression "pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart:30:14: Error: Getter not found: 'new'.
- var f3 = C.new;
- ^^^";
- (core::int) → self::D f4 = #C2;
- f1{dynamic}.call();
+ #C2;
+ new self::C::•(1);
+ () → self::A f1 = #C3;
+ () → self::B f2 = #C4;
+ (core::int) → self::C f3 = #C5;
+ (core::int) → self::D f4 = #C6;
+ f1(){() → self::A};
f2(){() → self::B};
- f3{dynamic}.call(1);
+ f3(1){(core::int) → self::C};
f4(1){(core::int) → self::D};
- () → self::A g1 = invalid-expression "pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart:37:23: Error: Getter not found: 'new'.
- A Function() g1 = A.new;
- ^^^" as{TypeError,ForDynamic,ForNonNullableByDefault} () → self::A;
- () → self::B g2 = #C1;
- (core::int) → self::C g3 = invalid-expression "pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart:39:28: Error: Getter not found: 'new'.
- C Function(int x) g3 = C.new;
- ^^^" as{TypeError,ForDynamic,ForNonNullableByDefault} (core::int) → self::C;
- (core::int) → self::D g4 = #C2;
+ () → self::A g1 = #C3;
+ () → self::B g2 = #C4;
+ (core::int) → self::C g3 = #C5;
+ (core::int) → self::D g4 = #C6;
g1(){() → self::A};
g2(){() → self::B};
g3(1){(core::int) → self::C};
@@ -142,6 +55,16 @@
static method main() → dynamic {}
constants {
- #C1 = constructor-tearoff self::B::•
- #C2 = constructor-tearoff self::D::•
+ #C1 = 1
+ #C2 = self::C {x:#C1}
+ #C3 = constructor-tearoff self::A::•
+ #C4 = constructor-tearoff self::B::•
+ #C5 = constructor-tearoff self::C::•
+ #C6 = constructor-tearoff self::D::•
}
+
+
+Constructor coverage from constants:
+org-dartlang-testcase:///unnamed_constructor.dart:
+- C. (from org-dartlang-testcase:///unnamed_constructor.dart:16:9)
+- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
diff --git a/pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart.weak.outline.expect b/pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart.weak.outline.expect
index aa40cc6..b0b2882 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart.weak.outline.expect
@@ -1,56 +1,15 @@
library /*isNonNullableByDefault*/;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart:6:5: Error: This requires the 'constructor-tearoffs' language feature to be enabled.
-// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.14 or higher, and running 'pub get'.
-// A.new();
-// ^^^
-//
-// pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart:7:38: Error: This requires the 'constructor-tearoffs' language feature to be enabled.
-// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.14 or higher, and running 'pub get'.
-// factory A.redirectingFactory() = A.new;
-// ^^^
-//
-// pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart:8:43: Error: This requires the 'constructor-tearoffs' language feature to be enabled.
-// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.14 or higher, and running 'pub get'.
-// factory A.redirectingFactoryChild() = B.new;
-// ^^^
-//
-// pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart:9:26: Error: This requires the 'constructor-tearoffs' language feature to be enabled.
-// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.14 or higher, and running 'pub get'.
-// A.redirecting() : this.new();
-// ^^^
-//
-// pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart:16:11: Error: This requires the 'constructor-tearoffs' language feature to be enabled.
-// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.14 or higher, and running 'pub get'.
-// const C.new(this.x);
-// ^^^
-//
-// pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart:19:9: Error: Expected 'extends' instead of this.
-// class D extend C {
-// ^^^^^^
-//
-// pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart:20:20: Error: This requires the 'constructor-tearoffs' language feature to be enabled.
-// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.14 or higher, and running 'pub get'.
-// D(int x) : super.new(x * 2);
-// ^^^
-//
-// pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart:7:36: Error: Redirection constructor target not found: 'A.new'
-// factory A.redirectingFactory() = A.new;
-// ^
-//
import self as self;
import "dart:core" as core;
class A extends core::Object {
static final field dynamic _redirecting# = <dynamic>[self::A::redirectingFactory, self::A::redirectingFactoryChild]/*isLegacy*/;
- constructor new() → self::A
+ constructor •() → self::A
;
constructor redirecting() → self::A
;
static factory redirectingFactory() → self::A
- let dynamic #redirecting_factory = "A.new" in invalid-expression;
+ let dynamic #redirecting_factory = self::A::• in invalid-expression;
static factory redirectingFactoryChild() → self::A
let dynamic #redirecting_factory = self::B::• in invalid-expression;
}
@@ -60,11 +19,11 @@
}
class C extends core::Object /*hasConstConstructor*/ {
final field core::int x;
- const constructor new(core::int x) → self::C
+ const constructor •(core::int x) → self::C
: self::C::x = x, super core::Object::•()
;
}
-class D extends core::Object {
+class D extends self::C {
constructor •(core::int x) → self::D
;
}
diff --git a/pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart.weak.transformed.expect b/pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart.weak.transformed.expect
index be73c25..44b6f22 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart.weak.transformed.expect
@@ -1,139 +1,52 @@
library /*isNonNullableByDefault*/;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart:6:5: Error: This requires the 'constructor-tearoffs' language feature to be enabled.
-// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.14 or higher, and running 'pub get'.
-// A.new();
-// ^^^
-//
-// pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart:7:38: Error: This requires the 'constructor-tearoffs' language feature to be enabled.
-// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.14 or higher, and running 'pub get'.
-// factory A.redirectingFactory() = A.new;
-// ^^^
-//
-// pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart:8:43: Error: This requires the 'constructor-tearoffs' language feature to be enabled.
-// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.14 or higher, and running 'pub get'.
-// factory A.redirectingFactoryChild() = B.new;
-// ^^^
-//
-// pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart:9:26: Error: This requires the 'constructor-tearoffs' language feature to be enabled.
-// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.14 or higher, and running 'pub get'.
-// A.redirecting() : this.new();
-// ^^^
-//
-// pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart:16:11: Error: This requires the 'constructor-tearoffs' language feature to be enabled.
-// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.14 or higher, and running 'pub get'.
-// const C.new(this.x);
-// ^^^
-//
-// pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart:19:9: Error: Expected 'extends' instead of this.
-// class D extend C {
-// ^^^^^^
-//
-// pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart:20:20: Error: This requires the 'constructor-tearoffs' language feature to be enabled.
-// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.14 or higher, and running 'pub get'.
-// D(int x) : super.new(x * 2);
-// ^^^
-//
-// pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart:7:36: Error: Redirection constructor target not found: 'A.new'
-// factory A.redirectingFactory() = A.new;
-// ^
-//
-// pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart:20:14: Error: Superclass has no constructor named 'Object.new'.
-// D(int x) : super.new(x * 2);
-// ^^^^^
-//
-// pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart:25:11: Error: Method not found: 'C.new'.
-// const C.new(1);
-// ^^^
-//
-// pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart:26:9: Error: Method not found: 'C.new'.
-// new C.new(1);
-// ^^^
-//
-// pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart:28:14: Error: Getter not found: 'new'.
-// var f1 = A.new;
-// ^^^
-//
-// pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart:30:14: Error: Getter not found: 'new'.
-// var f3 = C.new;
-// ^^^
-//
-// pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart:37:23: Error: Getter not found: 'new'.
-// A Function() g1 = A.new;
-// ^^^
-//
-// pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart:39:28: Error: Getter not found: 'new'.
-// C Function(int x) g3 = C.new;
-// ^^^
-//
-// pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart:12:7: Error: The superclass, 'A', has no unnamed constructor that takes no arguments.
-// class B extends A {}
-// ^
-//
import self as self;
import "dart:core" as core;
class A extends core::Object {
static final field dynamic _redirecting# = <dynamic>[self::A::redirectingFactory, self::A::redirectingFactoryChild]/*isLegacy*/;
- constructor new() → self::A
+ constructor •() → self::A
: super core::Object::•()
;
constructor redirecting() → self::A
- : this self::A::new()
+ : this self::A::•()
;
static factory redirectingFactory() → self::A
- let core::String* #redirecting_factory = "A.new" in invalid-expression;
+ let Never #redirecting_factory = self::A::• in invalid-expression;
static factory redirectingFactoryChild() → self::A
let Never #redirecting_factory = self::B::• in invalid-expression;
}
class B extends self::A {
synthetic constructor •() → self::B
- : invalid-initializer
+ : super self::A::•()
;
}
class C extends core::Object /*hasConstConstructor*/ {
final field core::int x;
- const constructor new(core::int x) → self::C
+ const constructor •(core::int x) → self::C
: self::C::x = x, super core::Object::•()
;
}
-class D extends core::Object {
+class D extends self::C {
constructor •(core::int x) → self::D
- : final dynamic #t1 = invalid-expression "pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart:20:14: Error: Superclass has no constructor named 'Object.new'.
- D(int x) : super.new(x * 2);
- ^^^^^"
+ : super self::C::•(x.{core::num::*}(2){(core::num) → core::int})
;
}
static method test() → dynamic {
new self::D::•(1);
- invalid-expression "pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart:25:11: Error: Method not found: 'C.new'.
- const C.new(1);
- ^^^";
- invalid-expression "pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart:26:9: Error: Method not found: 'C.new'.
- new C.new(1);
- ^^^";
- dynamic f1 = invalid-expression "pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart:28:14: Error: Getter not found: 'new'.
- var f1 = A.new;
- ^^^";
- () → self::B f2 = #C1;
- dynamic f3 = invalid-expression "pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart:30:14: Error: Getter not found: 'new'.
- var f3 = C.new;
- ^^^";
- (core::int) → self::D f4 = #C2;
- f1{dynamic}.call();
+ #C2;
+ new self::C::•(1);
+ () → self::A f1 = #C3;
+ () → self::B f2 = #C4;
+ (core::int) → self::C f3 = #C5;
+ (core::int) → self::D f4 = #C6;
+ f1(){() → self::A};
f2(){() → self::B};
- f3{dynamic}.call(1);
+ f3(1){(core::int) → self::C};
f4(1){(core::int) → self::D};
- () → self::A g1 = invalid-expression "pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart:37:23: Error: Getter not found: 'new'.
- A Function() g1 = A.new;
- ^^^";
- () → self::B g2 = #C1;
- (core::int) → self::C g3 = invalid-expression "pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart:39:28: Error: Getter not found: 'new'.
- C Function(int x) g3 = C.new;
- ^^^";
- (core::int) → self::D g4 = #C2;
+ () → self::A g1 = #C3;
+ () → self::B g2 = #C4;
+ (core::int) → self::C g3 = #C5;
+ (core::int) → self::D g4 = #C6;
g1(){() → self::A};
g2(){() → self::B};
g3(1){(core::int) → self::C};
@@ -142,6 +55,16 @@
static method main() → dynamic {}
constants {
- #C1 = constructor-tearoff self::B::•
- #C2 = constructor-tearoff self::D::•
+ #C1 = 1
+ #C2 = self::C {x:#C1}
+ #C3 = constructor-tearoff self::A::•
+ #C4 = constructor-tearoff self::B::•
+ #C5 = constructor-tearoff self::C::•
+ #C6 = constructor-tearoff self::D::•
}
+
+
+Constructor coverage from constants:
+org-dartlang-testcase:///unnamed_constructor.dart:
+- C. (from org-dartlang-testcase:///unnamed_constructor.dart:16:9)
+- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
diff --git a/pkg/front_end/testcases/textual_outline.status b/pkg/front_end/testcases/textual_outline.status
index a8a4fb3..08d5069 100644
--- a/pkg/front_end/testcases/textual_outline.status
+++ b/pkg/front_end/testcases/textual_outline.status
@@ -24,6 +24,7 @@
const_functions/const_functions_const_ctor_error: FormatterCrash
const_functions/const_functions_const_factory: FormatterCrash
constructor_tearoffs/explicit_instantiation_errors: FormatterCrash
+constructor_tearoffs/explicit_new_as_unnamed: FormatterCrash
constructor_tearoffs/generic_tearoff_with_context: FormatterCrash
constructor_tearoffs/generic_tearoff_without_context: FormatterCrash
constructor_tearoffs/identical_instantiated_function_tearoffs: FormatterCrash
diff --git a/runtime/bin/process_android.cc b/runtime/bin/process_android.cc
index 874d99a..16955e9 100644
--- a/runtime/bin/process_android.cc
+++ b/runtime/bin/process_android.cc
@@ -1109,6 +1109,7 @@
}
void ProcessInfoList::Init() {
+ active_processes_ = NULL;
ASSERT(ProcessInfoList::mutex_ == nullptr);
ProcessInfoList::mutex_ = new Mutex();
}
@@ -1120,6 +1121,9 @@
}
void ExitCodeHandler::Init() {
+ running_ = false;
+ process_count_ = 0;
+ terminate_done_ = false;
ASSERT(ExitCodeHandler::monitor_ == nullptr);
ExitCodeHandler::monitor_ = new Monitor();
}
@@ -1136,6 +1140,7 @@
ASSERT(signal_mutex == nullptr);
signal_mutex = new Mutex();
+ signal_handlers = NULL;
ASSERT(Process::global_exit_code_mutex_ == nullptr);
Process::global_exit_code_mutex_ = new Mutex();
diff --git a/runtime/bin/process_fuchsia.cc b/runtime/bin/process_fuchsia.cc
index f87c28c..de4433c 100644
--- a/runtime/bin/process_fuchsia.cc
+++ b/runtime/bin/process_fuchsia.cc
@@ -826,6 +826,7 @@
void Process::ClearSignalHandlerByFd(intptr_t fd, Dart_Port port) {}
void ProcessInfoList::Init() {
+ active_processes_ = NULL;
ASSERT(ProcessInfoList::mutex_ == nullptr);
ProcessInfoList::mutex_ = new Mutex();
}
@@ -837,6 +838,9 @@
}
void ExitCodeHandler::Init() {
+ port_ = ZX_HANDLE_INVALID;
+ running_ = false;
+ terminate_done_ = false;
ASSERT(ExitCodeHandler::monitor_ == nullptr);
ExitCodeHandler::monitor_ = new Monitor();
}
diff --git a/runtime/bin/process_linux.cc b/runtime/bin/process_linux.cc
index c20649e..95a9c86 100644
--- a/runtime/bin/process_linux.cc
+++ b/runtime/bin/process_linux.cc
@@ -1105,6 +1105,7 @@
}
void ProcessInfoList::Init() {
+ active_processes_ = NULL;
ASSERT(ProcessInfoList::mutex_ == nullptr);
ProcessInfoList::mutex_ = new Mutex();
}
@@ -1116,6 +1117,9 @@
}
void ExitCodeHandler::Init() {
+ running_ = false;
+ process_count_ = 0;
+ terminate_done_ = false;
ASSERT(ExitCodeHandler::monitor_ == nullptr);
ExitCodeHandler::monitor_ = new Monitor();
}
@@ -1132,6 +1136,7 @@
ASSERT(signal_mutex == nullptr);
signal_mutex = new Mutex();
+ signal_handlers = NULL;
ASSERT(Process::global_exit_code_mutex_ == nullptr);
Process::global_exit_code_mutex_ = new Mutex();
diff --git a/runtime/bin/process_macos.cc b/runtime/bin/process_macos.cc
index f20c589..6bbbfae 100644
--- a/runtime/bin/process_macos.cc
+++ b/runtime/bin/process_macos.cc
@@ -1141,6 +1141,7 @@
}
void ProcessInfoList::Init() {
+ active_processes_ = NULL;
ASSERT(ProcessInfoList::mutex_ == nullptr);
ProcessInfoList::mutex_ = new Mutex();
}
@@ -1152,6 +1153,9 @@
}
void ExitCodeHandler::Init() {
+ running_ = false;
+ process_count_ = 0;
+ terminate_done_ = false;
ASSERT(ExitCodeHandler::monitor_ == nullptr);
ExitCodeHandler::monitor_ = new Monitor();
}
@@ -1168,6 +1172,7 @@
ASSERT(signal_mutex == nullptr);
signal_mutex = new Mutex();
+ signal_handlers = NULL;
ASSERT(Process::global_exit_code_mutex_ == nullptr);
Process::global_exit_code_mutex_ = new Mutex();
diff --git a/runtime/bin/process_win.cc b/runtime/bin/process_win.cc
index 1e3a02c..c34b003 100644
--- a/runtime/bin/process_win.cc
+++ b/runtime/bin/process_win.cc
@@ -1096,6 +1096,7 @@
}
void ProcessInfoList::Init() {
+ active_processes_ = nullptr;
ASSERT(ProcessInfoList::mutex_ == nullptr);
ProcessInfoList::mutex_ = new Mutex();
}
@@ -1109,11 +1110,13 @@
void Process::Init() {
ProcessInfoList::Init();
+ signal_handlers = NULL;
ASSERT(signal_mutex == nullptr);
signal_mutex = new Mutex();
ASSERT(initialized_mutex == nullptr);
initialized_mutex = new Mutex();
+ load_attempted = false;
ASSERT(Process::global_exit_code_mutex_ == nullptr);
Process::global_exit_code_mutex_ = new Mutex();
diff --git a/tests/language/const/constructor_mixin2_test.dart b/tests/language/const/constructor_mixin2_test.dart
index a7bc863..873141d 100644
--- a/tests/language/const/constructor_mixin2_test.dart
+++ b/tests/language/const/constructor_mixin2_test.dart
@@ -15,8 +15,6 @@
{
const B(foo) : super(foo);
// ^
-// [analyzer] COMPILE_TIME_ERROR.CONST_CONSTRUCTOR_WITH_NON_FINAL_FIELD
-// ^
// [analyzer] COMPILE_TIME_ERROR.CONST_CONSTRUCTOR_WITH_MIXIN_WITH_FIELD
// ^
// [cfe] A constant constructor can't call a non-constant super constructor.
diff --git a/tests/language_2/const/constructor_mixin2_test.dart b/tests/language_2/const/constructor_mixin2_test.dart
index 5794d86..de57333 100644
--- a/tests/language_2/const/constructor_mixin2_test.dart
+++ b/tests/language_2/const/constructor_mixin2_test.dart
@@ -17,8 +17,6 @@
{
const B(foo) : super(foo);
// ^
-// [analyzer] COMPILE_TIME_ERROR.CONST_CONSTRUCTOR_WITH_NON_FINAL_FIELD
-// ^
// [analyzer] COMPILE_TIME_ERROR.CONST_CONSTRUCTOR_WITH_MIXIN_WITH_FIELD
// ^
// [cfe] A constant constructor can't call a non-constant super constructor.
diff --git a/tools/VERSION b/tools/VERSION
index 6197956..f4cab42 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
MAJOR 2
MINOR 14
PATCH 0
-PRERELEASE 341
+PRERELEASE 342
PRERELEASE_PATCH 0
\ No newline at end of file