Version 2.15.0-144.0.dev
Merge commit 'e559b80f52fb8dec89bfe82272fa466c4004496d' into 'dev'
diff --git a/pkg/_js_interop_checks/lib/src/transformations/js_util_optimizer.dart b/pkg/_js_interop_checks/lib/src/transformations/js_util_optimizer.dart
index cb04456..add033d 100644
--- a/pkg/_js_interop_checks/lib/src/transformations/js_util_optimizer.dart
+++ b/pkg/_js_interop_checks/lib/src/transformations/js_util_optimizer.dart
@@ -2,7 +2,6 @@
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
-import 'package:front_end/src/api_unstable/dart2js.dart' as api;
import 'package:kernel/ast.dart';
import 'package:kernel/class_hierarchy.dart';
import 'package:kernel/core_types.dart';
@@ -13,7 +12,6 @@
/// Replaces js_util methods with inline calls to foreign_helper JS which
/// emits the code as a JavaScript code fragment.
class JsUtilOptimizer extends Transformer {
- final Procedure _jsTarget;
final Procedure _callMethodTarget;
final List<Procedure> _callMethodUncheckedTargets;
final Procedure _callConstructorTarget;
@@ -32,16 +30,16 @@
'setProperty'
];
final Iterable<Procedure> _allowedInteropJsUtilTargets;
+ final Procedure _jsTarget;
final Procedure _allowInteropTarget;
final Procedure _listEmptyFactory;
final CoreTypes _coreTypes;
final StatefulStaticTypeContext _staticTypeContext;
+ Map<Reference, ExtensionMemberDescriptor>? _extensionMemberIndex;
JsUtilOptimizer(this._coreTypes, ClassHierarchy hierarchy)
- : _jsTarget =
- _coreTypes.index.getTopLevelProcedure('dart:_foreign_helper', 'JS'),
- _callMethodTarget =
+ : _callMethodTarget =
_coreTypes.index.getTopLevelProcedure('dart:js_util', 'callMethod'),
_callMethodUncheckedTargets = List<Procedure>.generate(
5,
@@ -59,6 +57,8 @@
.getTopLevelProcedure('dart:js_util', 'setProperty'),
_setPropertyUncheckedTarget = _coreTypes.index
.getTopLevelProcedure('dart:js_util', '_setPropertyUnchecked'),
+ _jsTarget =
+ _coreTypes.index.getTopLevelProcedure('dart:_foreign_helper', 'JS'),
_allowInteropTarget =
_coreTypes.index.getTopLevelProcedure('dart:js', 'allowInterop'),
_allowedInteropJsUtilTargets = _allowedInteropJsUtilMembers.map(
@@ -74,6 +74,7 @@
_staticTypeContext.enterLibrary(lib);
lib.transformChildren(this);
_staticTypeContext.leaveLibrary(lib);
+ _extensionMemberIndex = null;
return lib;
}
@@ -88,21 +89,24 @@
@override
visitProcedure(Procedure node) {
_staticTypeContext.enterMember(node);
- if (node.isExternal && node.isExtensionMember && !_isDeclaredStatic(node)) {
- var transformedBody;
- if (api.getExtensionMemberKind(node) == ProcedureKind.Getter) {
- transformedBody = _getExternalGetterBody(node);
- } else if (api.getExtensionMemberKind(node) == ProcedureKind.Setter) {
- transformedBody = _getExternalSetterBody(node);
- } else if (api.getExtensionMemberKind(node) == ProcedureKind.Method) {
- transformedBody = _getExternalMethodBody(node);
+ var transformedBody;
+ if (node.isExternal && node.isExtensionMember) {
+ var index = _extensionMemberIndex ??=
+ _createExtensionMembersIndex(node.enclosingLibrary);
+ var nodeDescriptor = index[node.reference]!;
+ if (!nodeDescriptor.isStatic) {
+ if (nodeDescriptor.kind == ExtensionMemberKind.Getter) {
+ transformedBody = _getExternalGetterBody(node);
+ } else if (nodeDescriptor.kind == ExtensionMemberKind.Setter) {
+ transformedBody = _getExternalSetterBody(node);
+ } else if (nodeDescriptor.kind == ExtensionMemberKind.Method) {
+ transformedBody = _getExternalMethodBody(node);
+ }
}
- // TODO(rileyporter): Add transformation for static members and any
- // operators we decide to support.
- if (transformedBody != null) {
- node.function.body = transformedBody;
- node.isExternal = false;
- }
+ }
+ if (transformedBody != null) {
+ node.function.body = transformedBody;
+ node.isExternal = false;
} else {
node.transformChildren(this);
}
@@ -110,6 +114,18 @@
return node;
}
+ /// Returns and initializes `_extensionMemberIndex` to an index of the member
+ /// reference to the member `ExtensionMemberDescriptor`, for all extension
+ /// members in the given [library].
+ Map<Reference, ExtensionMemberDescriptor> _createExtensionMembersIndex(
+ Library library) {
+ _extensionMemberIndex = {};
+ library.extensions.forEach((extension) => extension.members.forEach(
+ (descriptor) =>
+ _extensionMemberIndex![descriptor.member] = descriptor));
+ return _extensionMemberIndex!;
+ }
+
/// Returns a new function body for the given [node] external getter.
///
/// The new function body will call the optimized version of
@@ -121,11 +137,11 @@
_getPropertyTarget,
Arguments([
VariableGet(function.positionalParameters.first),
- StringLiteral(_getMemberName(node))
+ StringLiteral(_getExtensionMemberName(node))
]))
..fileOffset = node.fileOffset;
- return ReturnStatement(AsExpression(
- _lowerGetProperty(getPropertyInvocation), function.returnType));
+ return ReturnStatement(
+ AsExpression(getPropertyInvocation, function.returnType));
}
/// Returns a new function body for the given [node] external setter.
@@ -139,7 +155,7 @@
_setPropertyTarget,
Arguments([
VariableGet(function.positionalParameters.first),
- StringLiteral(_getMemberName(node)),
+ StringLiteral(_getExtensionMemberName(node)),
VariableGet(function.positionalParameters.last)
]))
..fileOffset = node.fileOffset;
@@ -157,7 +173,7 @@
_callMethodTarget,
Arguments([
VariableGet(function.positionalParameters.first),
- StringLiteral(_getMemberName(node)),
+ StringLiteral(_getExtensionMemberName(node)),
ListLiteral(function.positionalParameters
.sublist(1)
.map((argument) => VariableGet(argument))
@@ -168,43 +184,30 @@
_lowerCallMethod(callMethodInvocation), function.returnType));
}
- /// Returns the member name, either from the `@JS` annotation if non-empty,
- /// or parsed from CFE generated node name.
- String _getMemberName(Procedure node) {
+ /// Returns the extension member name.
+ ///
+ /// Returns either the name from the `@JS` annotation if non-empty, or the
+ /// declared name of the extension member. Does not return the CFE generated
+ /// name for the top level member for this extension member.
+ String _getExtensionMemberName(Procedure node) {
var jsAnnotationName = getJSName(node);
if (jsAnnotationName.isNotEmpty) {
return jsAnnotationName;
}
- // TODO(rileyporter): Switch to using the ExtensionMemberDescriptor data.
- var nodeName = node.name.text;
- if (nodeName.contains('#')) {
- return nodeName.substring(nodeName.indexOf('#') + 1);
- } else {
- return nodeName.substring(nodeName.indexOf('|') + 1);
- }
- }
-
- /// Returns whether the given extension [node] is declared as `static`.
- ///
- /// All extension members have `isStatic` true, but the members declared as
- /// static will not have a synthesized `this` variable.
- bool _isDeclaredStatic(Procedure node) {
- return node.function.positionalParameters.isEmpty ||
- node.function.positionalParameters.first.name != '#this';
+ return _extensionMemberIndex![node.reference]!.name.text;
}
/// Replaces js_util method calls with optimization when possible.
///
- /// Lowers `getProperty` for any argument type straight to JS fragment call.
- /// Lowers `setProperty` to `_setPropertyUnchecked` for values that are
+ /// Lowers `setProperty` to `_setPropertyUnchecked` for values that are
/// not Function type and guaranteed to be interop allowed.
/// Lowers `callMethod` to `_callMethodUncheckedN` when the number of given
/// arguments is 0-4 and all arguments are guaranteed to be interop allowed.
+ /// Lowers `callConstructor` to `_callConstructorUncheckedN` when there are
+ /// 0-4 arguments and all arguments are guaranteed to be interop allowed.
@override
visitStaticInvocation(StaticInvocation node) {
- if (node.target == _getPropertyTarget) {
- node = _lowerGetProperty(node);
- } else if (node.target == _setPropertyTarget) {
+ if (node.target == _setPropertyTarget) {
node = _lowerSetProperty(node);
} else if (node.target == _callMethodTarget) {
node = _lowerCallMethod(node);
@@ -215,28 +218,6 @@
return node;
}
- /// Lowers the given js_util `getProperty` call to the foreign_helper JS call
- /// for any argument type. Lowers `getProperty(o, name)` to
- /// `JS('Object|Null', '#.#', o, name)`.
- StaticInvocation _lowerGetProperty(StaticInvocation node) {
- Arguments arguments = node.arguments;
- assert(arguments.types.isEmpty);
- assert(arguments.positional.length == 2);
- assert(arguments.named.isEmpty);
- return StaticInvocation(
- _jsTarget,
- Arguments(
- [
- StringLiteral("Object|Null"),
- StringLiteral("#.#"),
- ...arguments.positional
- ],
- // TODO(rileyporter): Copy type from getProperty when it's generic.
- types: [DynamicType()],
- )..fileOffset = arguments.fileOffset)
- ..fileOffset = node.fileOffset;
- }
-
/// Lowers the given js_util `setProperty` call to `_setPropertyUnchecked`
/// when the additional validation checks in `setProperty` can be elided.
///
diff --git a/pkg/_js_interop_checks/pubspec.yaml b/pkg/_js_interop_checks/pubspec.yaml
index 27f50f2..bae1992 100644
--- a/pkg/_js_interop_checks/pubspec.yaml
+++ b/pkg/_js_interop_checks/pubspec.yaml
@@ -8,7 +8,5 @@
dependencies:
_fe_analyzer_shared:
path: ../_fe_analyzer_shared
- front_end:
- path: ../front_end
kernel:
path: ../kernel
diff --git a/pkg/analysis_server/lib/src/services/refactoring/move_file.dart b/pkg/analysis_server/lib/src/services/refactoring/move_file.dart
index 456dc38..6e97072 100644
--- a/pkg/analysis_server/lib/src/services/refactoring/move_file.dart
+++ b/pkg/analysis_server/lib/src/services/refactoring/move_file.dart
@@ -8,10 +8,8 @@
import 'package:analysis_server/src/services/refactoring/refactoring_internal.dart';
import 'package:analyzer/dart/analysis/results.dart';
import 'package:analyzer/dart/ast/ast.dart';
-import 'package:analyzer/dart/element/element.dart';
import 'package:analyzer/file_system/file_system.dart';
import 'package:analyzer/src/dart/analysis/driver.dart';
-import 'package:analyzer/src/dart/element/element.dart';
import 'package:analyzer/src/generated/source.dart';
import 'package:analyzer_plugin/utilities/change_builder/change_builder_core.dart';
import 'package:analyzer_plugin/utilities/range_factory.dart';
@@ -179,11 +177,8 @@
}
bool _isPackageReference(SourceReference reference) {
- var unitSourceContent = reference.element.unitSourceContent;
- if (unitSourceContent == null) {
- return false;
- }
- var quotedImportUri = unitSourceContent.substring(reference.range.offset,
+ var source = reference.element.source!;
+ var quotedImportUri = source.contents.data.substring(reference.range.offset,
reference.range.offset + reference.range.length);
return packagePrefixedStringPattern.hasMatch(quotedImportUri);
}
@@ -220,10 +215,3 @@
}
}
}
-
-extension on Element {
- String? get unitSourceContent {
- var unitElement = thisOrAncestorOfType<CompilationUnitElementImpl>();
- return unitElement?.sourceContent;
- }
-}
diff --git a/pkg/analyzer/lib/src/dart/analysis/driver.dart b/pkg/analyzer/lib/src/dart/analysis/driver.dart
index 670e73a..fcf5d4e 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 = 179;
+ static const int DATA_VERSION = 180;
/// 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 9c3a24d..766ace4 100644
--- a/pkg/analyzer/lib/src/dart/element/element.dart
+++ b/pkg/analyzer/lib/src/dart/element/element.dart
@@ -974,10 +974,6 @@
@override
late Source source;
- /// The content of the [source] for which this element model was built.
- /// Might be `null` if we don't have it (for example in google3 summaries).
- String? sourceContent;
-
@override
LineInfo? lineInfo;
diff --git a/pkg/analyzer/lib/src/generated/declaration_resolver.dart b/pkg/analyzer/lib/src/generated/declaration_resolver.dart
index 570ef8f..650fde4 100644
--- a/pkg/analyzer/lib/src/generated/declaration_resolver.dart
+++ b/pkg/analyzer/lib/src/generated/declaration_resolver.dart
@@ -107,16 +107,6 @@
(element.aliasedElement as GenericFunctionTypeElement).parameters,
_typeParameters = element.typeParameters;
- String? get _unitSourceContent {
- Element? element = this.element;
- while (element != null) {
- if (element is CompilationUnitElementImpl) {
- return element.sourceContent;
- }
- element = element.enclosingElement;
- }
- }
-
void consumeLocalElements() {
_functionIndex = _functions!.length;
}
@@ -138,8 +128,7 @@
'[accessors: $accessors]'
'[element.source: ${element.source?.fullName}]'
'[libraryFilePath: $libraryFilePath]'
- '[unitFilePath: $unitFilePath]'
- '[unitSourceContent: $_unitSourceContent]',
+ '[unitFilePath: $unitFilePath]',
);
}
return _accessors![_accessorIndex++] as PropertyAccessorElementImpl;
@@ -158,8 +147,7 @@
'[classes: $classes]'
'[element.source: ${element.source?.fullName}]'
'[libraryFilePath: $libraryFilePath]'
- '[unitFilePath: $unitFilePath]'
- '[unitSourceContent: $_unitSourceContent]',
+ '[unitFilePath: $unitFilePath]',
);
}
return _classes![_classIndex++] as ClassElementImpl;
@@ -215,8 +203,7 @@
'[variables: $variables]'
'[element.source: ${element.source?.fullName}]'
'[libraryFilePath: $libraryFilePath]'
- '[unitFilePath: $unitFilePath]'
- '[unitSourceContent: $_unitSourceContent]',
+ '[unitFilePath: $unitFilePath]',
);
}
return _variables![_variableIndex++] as VariableElementImpl;
diff --git a/pkg/analyzer/lib/src/summary2/bundle_reader.dart b/pkg/analyzer/lib/src/summary2/bundle_reader.dart
index 8767463..2b75f9e 100644
--- a/pkg/analyzer/lib/src/summary2/bundle_reader.dart
+++ b/pkg/analyzer/lib/src/summary2/bundle_reader.dart
@@ -1266,7 +1266,6 @@
unitElement.uri = _reader.readOptionalStringReference();
unitElement.isSynthetic = _reader.readBool();
- unitElement.sourceContent = _reader.readOptionalStringUtf8();
_readUnitMacroGenerationDataList(unitElement);
_readClasses(unitElement, unitReference);
diff --git a/pkg/analyzer/lib/src/summary2/bundle_writer.dart b/pkg/analyzer/lib/src/summary2/bundle_writer.dart
index 3103c35..33e913e 100644
--- a/pkg/analyzer/lib/src/summary2/bundle_writer.dart
+++ b/pkg/analyzer/lib/src/summary2/bundle_writer.dart
@@ -449,7 +449,6 @@
_sink._writeStringReference('${unitElement.source.uri}');
_sink._writeOptionalStringReference(unitElement.uri);
_sink.writeBool(unitElement.isSynthetic);
- _sink.writeOptionalStringUtf8(unitElement.sourceContent);
_resolutionSink._writeAnnotationList(unitElement.metadata);
_writeUnitElementMacroGenerationDataList(unitElement);
_writeList(unitElement.classes, _writeClassElement);
diff --git a/pkg/analyzer/lib/src/summary2/library_builder.dart b/pkg/analyzer/lib/src/summary2/library_builder.dart
index 10620eb..fc66eed 100644
--- a/pkg/analyzer/lib/src/summary2/library_builder.dart
+++ b/pkg/analyzer/lib/src/summary2/library_builder.dart
@@ -415,7 +415,6 @@
unitElement.librarySource = inputLibrary.source;
unitElement.lineInfo = unitNode.lineInfo;
unitElement.source = inputUnit.source;
- unitElement.sourceContent = inputUnit.sourceContent;
unitElement.uri = inputUnit.partUriStr;
unitElement.setCodeRange(0, unitNode.length);
diff --git a/pkg/dartdev/lib/src/commands/compile.dart b/pkg/dartdev/lib/src/commands/compile.dart
index 6c3269d..140b083 100644
--- a/pkg/dartdev/lib/src/commands/compile.dart
+++ b/pkg/dartdev/lib/src/commands/compile.dart
@@ -261,6 +261,13 @@
!Sdk.checkArtifactExists(genSnapshot)) {
return 255;
}
+ // AOT compilation isn't supported on ia32. Currently, generating an
+ // executable only supports AOT runtimes, so these commands are disabled.
+ if (Platform.version.contains('ia32')) {
+ stderr.write(
+ "'dart compile $format' is not supported on x86 architectures");
+ return 64;
+ }
// We expect a single rest argument; the dart entry point.
if (argResults.rest.length != 1) {
// This throws.
diff --git a/pkg/dartdev/test/commands/compile_test.dart b/pkg/dartdev/test/commands/compile_test.dart
index 4bf62f0..be43ac7 100644
--- a/pkg/dartdev/test/commands/compile_test.dart
+++ b/pkg/dartdev/test/commands/compile_test.dart
@@ -20,6 +20,7 @@
'Info: Compiling without sound null safety';
void defineCompileTests() {
+ final isRunningOnIA32 = Platform.version.contains('ia32');
// *** NOTE ***: These tests *must* be run with the `--use-sdk` option
// as they depend on a fully built SDK to resolve various snapshot files
// used by compilation.
@@ -51,6 +52,12 @@
'Usage: dart compile <subcommand> [arguments]',
),
);
+
+ expect(result.stdout, contains('jit-snapshot'));
+ expect(result.stdout, contains('kernel'));
+ expect(result.stdout, contains('js'));
+ expect(result.stdout, contains('aot-snapshot'));
+ expect(result.stdout, contains('exe'));
expect(result.exitCode, 0);
});
@@ -118,7 +125,41 @@
expect(result.stdout, contains('I love executables'));
expect(result.stderr, isEmpty);
expect(result.exitCode, 0);
- });
+ }, skip: isRunningOnIA32);
+
+ test('Compile to executable disabled on IA32', () {
+ final p = project(mainSrc: 'void main() { print("I love executables"); }');
+ final inFile = path.canonicalize(path.join(p.dirPath, p.relativeFilePath));
+
+ var result = p.runSync(
+ [
+ 'compile',
+ 'exe',
+ inFile,
+ ],
+ );
+
+ expect(result.stderr,
+ "'dart compile exe' is not supported on x86 architectures");
+ expect(result.exitCode, 64);
+ }, skip: !isRunningOnIA32);
+
+ test('Compile to AOT snapshot disabled on IA32', () {
+ final p = project(mainSrc: 'void main() { print("I love executables"); }');
+ final inFile = path.canonicalize(path.join(p.dirPath, p.relativeFilePath));
+
+ var result = p.runSync(
+ [
+ 'compile',
+ 'aot-snapshot',
+ inFile,
+ ],
+ );
+
+ expect(result.stderr,
+ "'dart compile aot-snapshot' is not supported on x86 architectures");
+ expect(result.exitCode, 64);
+ }, skip: !isRunningOnIA32);
test('Compile and run executable with options', () {
final p = project(
@@ -151,7 +192,7 @@
expect(result.stdout, contains('42'));
expect(result.stderr, isEmpty);
expect(result.exitCode, 0);
- });
+ }, skip: isRunningOnIA32);
test('Compile and run aot snapshot', () {
final p = project(mainSrc: 'void main() { print("I love AOT"); }');
@@ -182,7 +223,7 @@
expect(result.stdout, contains('I love AOT'));
expect(result.stderr, isEmpty);
expect(result.exitCode, 0);
- });
+ }, skip: isRunningOnIA32);
test('Compile and run kernel snapshot', () {
final p = project(mainSrc: 'void main() { print("I love kernel"); }');
@@ -266,7 +307,7 @@
expect(result.exitCode, compileErrorExitCode);
expect(File(outFile).existsSync(), false,
reason: 'File not found: $outFile');
- });
+ }, skip: isRunningOnIA32);
test('Compile exe with warnings', () {
final p = project(mainSrc: '''
@@ -293,7 +334,7 @@
expect(result.exitCode, 0);
expect(File(outFile).existsSync(), true,
reason: 'File not found: $outFile');
- });
+ }, skip: isRunningOnIA32);
test('Compile exe with sound null safety', () {
final p = project(mainSrc: '''void main() {}''');
@@ -315,7 +356,7 @@
expect(result.exitCode, 0);
expect(File(outFile).existsSync(), true,
reason: 'File not found: $outFile');
- });
+ }, skip: isRunningOnIA32);
test('Compile exe with unsound null safety', () {
final p = project(mainSrc: '''
@@ -340,7 +381,7 @@
expect(result.exitCode, 0);
expect(File(outFile).existsSync(), true,
reason: 'File not found: $outFile');
- });
+ }, skip: isRunningOnIA32);
test('Compile and run exe with --sound-null-safety', () {
final p = project(mainSrc: '''void main() {
@@ -374,7 +415,7 @@
expect(result.stdout, contains('sound'));
expect(result.stderr, isEmpty);
expect(result.exitCode, 0);
- });
+ }, skip: isRunningOnIA32);
test('Compile and run exe with --no-sound-null-safety', () {
final p = project(mainSrc: '''void main() {
@@ -408,7 +449,7 @@
expect(result.stdout, contains('unsound'));
expect(result.stderr, isEmpty);
expect(result.exitCode, 0);
- });
+ }, skip: isRunningOnIA32);
test('Compile exe without info', () {
final p = project(mainSrc: '''void main() {}''');
@@ -432,7 +473,7 @@
expect(result.exitCode, 0);
expect(File(outFile).existsSync(), true,
reason: 'File not found: $outFile');
- });
+ }, skip: isRunningOnIA32);
test('Compile exe without warnings', () {
final p = project(mainSrc: '''
@@ -459,7 +500,7 @@
predicate((o) => !'$o'.contains(soundNullSafetyMessage)));
expect(result.stderr, isEmpty);
expect(result.exitCode, 0);
- });
+ }, skip: isRunningOnIA32);
test('Compile JS with sound null safety', () {
final p = project(mainSrc: '''void main() {}''');
@@ -579,7 +620,7 @@
expect(result.exitCode, 0);
expect(File(outFile).existsSync(), true,
reason: 'File not found: $outFile');
- });
+ }, skip: isRunningOnIA32);
test('Compile AOT snapshot with unsound null safety', () {
final p = project(mainSrc: '''
@@ -604,7 +645,7 @@
expect(result.exitCode, 0);
expect(File(outFile).existsSync(), true,
reason: 'File not found: $outFile');
- });
+ }, skip: isRunningOnIA32);
test('Compile AOT snapshot without info', () {
final p = project(mainSrc: '''void main() {}''');
@@ -628,7 +669,7 @@
expect(result.exitCode, 0);
expect(File(outFile).existsSync(), true,
reason: 'File not found: $outFile');
- });
+ }, skip: isRunningOnIA32);
test('Compile AOT snapshot without warnings', () {
final p = project(mainSrc: '''
@@ -655,7 +696,7 @@
predicate((o) => !'$o'.contains(soundNullSafetyMessage)));
expect(result.stderr, isEmpty);
expect(result.exitCode, 0);
- });
+ }, skip: isRunningOnIA32);
test('Compile AOT snapshot with warnings', () {
final p = project(mainSrc: '''
@@ -683,7 +724,7 @@
expect(result.stdout, contains('Warning: '));
expect(result.stderr, isEmpty);
expect(result.exitCode, 0);
- });
+ }, skip: isRunningOnIA32);
test('Compile kernel with invalid trailing argument', () {
final p = project(mainSrc: '''void main() {}''');
diff --git a/pkg/front_end/lib/src/api_unstable/dart2js.dart b/pkg/front_end/lib/src/api_unstable/dart2js.dart
index b8d1d74..e811ba1 100644
--- a/pkg/front_end/lib/src/api_unstable/dart2js.dart
+++ b/pkg/front_end/lib/src/api_unstable/dart2js.dart
@@ -241,23 +241,3 @@
// TODO(sigmund): Delete this API once `member.isRedirectingFactory`
// is implemented correctly for patch files (Issue #33495).
bool isRedirectingFactory(ir.Procedure member) => member.isRedirectingFactory;
-
-/// Determines what `ProcedureKind` the given extension [member] is based on
-/// the member name.
-///
-/// Note: classifies operators as `ProcedureKind.Method`.
-ir.ProcedureKind getExtensionMemberKind(ir.Procedure member) {
- assert(member.isExtensionMember);
- String name = member.name.text;
- int pipeIndex = name.indexOf('|');
- int poundIndex = name.indexOf('#');
- assert(pipeIndex >= 0);
- if (poundIndex >= 0) {
- String getOrSet = name.substring(pipeIndex + 1, poundIndex);
- return getOrSet == 'get'
- ? ir.ProcedureKind.Getter
- : ir.ProcedureKind.Setter;
- } else {
- return member.kind;
- }
-}
diff --git a/pkg/front_end/test/desugar_test.dart b/pkg/front_end/test/desugar_test.dart
index 31089ed..82fdd4a 100644
--- a/pkg/front_end/test/desugar_test.dart
+++ b/pkg/front_end/test/desugar_test.dart
@@ -28,7 +28,6 @@
await testRedirectingFactoryDirect();
await testRedirectingFactorySerialized();
await testRedirectingFactoryPatchFile();
- await testExtensionMemberKind();
});
}
@@ -80,97 +79,3 @@
_B(int x);
}
''';
-
-Future<void> testExtensionMemberKind() async {
- var component = await compileUnit(['e.dart'], {'e.dart': extensionSource});
- var library = component.libraries
- .firstWhere((l) => l.importUri.path.endsWith('e.dart'));
- var descriptors =
- library.extensions.expand((extension) => extension.members).toList();
-
- // Check generated getters and setters for fields.
- var fieldGetter =
- findExtensionField(descriptors, 'field', ir.ExtensionMemberKind.Getter);
- Expect.equals(
- api.getExtensionMemberKind(fieldGetter), ir.ProcedureKind.Getter);
- var fieldSetter =
- findExtensionField(descriptors, 'field', ir.ExtensionMemberKind.Setter);
- Expect.equals(
- api.getExtensionMemberKind(fieldSetter), ir.ProcedureKind.Setter);
- var staticFieldGetter = findExtensionField(
- descriptors, 'staticField', ir.ExtensionMemberKind.Getter);
- Expect.equals(
- api.getExtensionMemberKind(staticFieldGetter), ir.ProcedureKind.Getter);
- var staticFieldSetter = findExtensionField(
- descriptors, 'staticField', ir.ExtensionMemberKind.Setter);
- Expect.equals(
- api.getExtensionMemberKind(staticFieldSetter), ir.ProcedureKind.Setter);
-
- // Check getters and setters.
- var getter = findExtensionMember(descriptors, 'getter');
- Expect.equals(api.getExtensionMemberKind(getter), ir.ProcedureKind.Getter);
- var setter = findExtensionMember(descriptors, 'setter');
- Expect.equals(api.getExtensionMemberKind(setter), ir.ProcedureKind.Setter);
- var staticGetter = findExtensionMember(descriptors, 'staticGetter');
- Expect.equals(
- api.getExtensionMemberKind(staticGetter), ir.ProcedureKind.Getter);
- var staticSetter = findExtensionMember(descriptors, 'staticSetter');
- Expect.equals(
- api.getExtensionMemberKind(staticSetter), ir.ProcedureKind.Setter);
-
- // Check methods.
- var method = findExtensionMember(descriptors, 'method');
- Expect.equals(api.getExtensionMemberKind(method), ir.ProcedureKind.Method);
- var methodTearoff = findExtensionTearoff(descriptors, 'get#method');
- Expect.equals(
- api.getExtensionMemberKind(methodTearoff), ir.ProcedureKind.Getter);
- var staticMethod = findExtensionMember(descriptors, 'staticMethod');
- Expect.equals(
- api.getExtensionMemberKind(staticMethod), ir.ProcedureKind.Method);
-
- // Check operators.
- var operator = findExtensionMember(descriptors, '+');
- Expect.equals(api.getExtensionMemberKind(operator), ir.ProcedureKind.Method);
-}
-
-ir.Member findExtensionMember(
- List<ir.ExtensionMemberDescriptor> descriptors, String memberName) {
- return descriptors
- .firstWhere((d) => d.name.text == memberName)
- .member
- .asMember;
-}
-
-ir.Member findExtensionField(List<ir.ExtensionMemberDescriptor> descriptors,
- String fieldName, ir.ExtensionMemberKind kind) {
- return descriptors
- .firstWhere((d) => d.name.text == fieldName && d.kind == kind)
- .member
- .asMember;
-}
-
-ir.Member findExtensionTearoff(
- List<ir.ExtensionMemberDescriptor> descriptors, String memberName) {
- return descriptors
- .map((d) => d.member.asMember)
- .firstWhere((m) => m.name.text.contains(memberName));
-}
-
-const extensionSource = '''
-class Foo {}
-
-extension Ext on Foo {
- external int field;
- external static int staticField;
-
- external get getter;
- external set setter(_);
- external static get staticGetter;
- external static set staticSetter(_);
-
- external int method();
- external static int staticMethod();
-
- external operator +(_);
-}
-''';
diff --git a/runtime/observatory/tests/service/break_on_dart_colon_test.dart b/runtime/observatory/tests/service/break_on_dart_colon_test.dart
new file mode 100644
index 0000000..f9b4908
--- /dev/null
+++ b/runtime/observatory/tests/service/break_on_dart_colon_test.dart
@@ -0,0 +1,47 @@
+// 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.
+// VMOptions=--verbose_debug
+
+import 'dart:developer';
+
+import 'package:observatory/service_io.dart';
+
+import 'service_test_common.dart';
+import 'test_helper.dart';
+
+// Line in core/print.dart
+const int LINE_A = 10;
+
+testMain() {
+ debugger();
+ print('1');
+ print('2');
+ print('3');
+ print('Done');
+}
+
+IsolateTest expectHitBreakpoint(String uri, int line) {
+ return (Isolate isolate) async {
+ final bpt = await isolate.addBreakpointByScriptUri(uri, line);
+ await resumeIsolate(isolate);
+ await hasStoppedAtBreakpoint(isolate);
+ await stoppedAtLine(line)(isolate);
+ await isolate.removeBreakpoint(bpt);
+ };
+}
+
+var tests = <IsolateTest>[
+ hasStoppedAtBreakpoint,
+
+ // Dart libraries are not debuggable by default
+ markDartColonLibrariesDebuggable,
+
+ expectHitBreakpoint('org-dartlang-sdk:///sdk/lib/core/print.dart', LINE_A),
+ expectHitBreakpoint('dart:core/print.dart', LINE_A),
+ expectHitBreakpoint('/core/print.dart', LINE_A),
+
+ resumeIsolate,
+];
+
+main(args) => runIsolateTests(args, tests, testeeConcurrent: testMain);
diff --git a/runtime/observatory/tests/service/service_kernel.status b/runtime/observatory/tests/service/service_kernel.status
index e5f8df6..af626d9 100644
--- a/runtime/observatory/tests/service/service_kernel.status
+++ b/runtime/observatory/tests/service/service_kernel.status
@@ -47,6 +47,7 @@
bad_reload_test: SkipByDesign # Hot reload is disabled in AOT mode.
break_on_activation_test: SkipByDesign # Debugger is disabled in AOT mode.
break_on_async_function_test: SkipByDesign # Debugger is disabled in AOT mode.
+break_on_dart_colon_test: SkipByDesign # Debugger is disabled in AOT mode.
break_on_default_constructor_test: SkipByDesign # Debugger is disabled in AOT mode.
break_on_function_child_isolate_test: SkipByDesign # Debugger is disabled in AOT mode.
break_on_function_many_child_isolates_test: SkipByDesign # Debugger is disabled in AOT mode.
diff --git a/runtime/observatory_2/tests/service_2/break_on_dart_colon_test.dart b/runtime/observatory_2/tests/service_2/break_on_dart_colon_test.dart
new file mode 100644
index 0000000..e0d400c3
--- /dev/null
+++ b/runtime/observatory_2/tests/service_2/break_on_dart_colon_test.dart
@@ -0,0 +1,47 @@
+// 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.
+// VMOptions=--verbose_debug
+
+import 'dart:developer';
+
+import 'package:observatory_2/service_io.dart';
+
+import 'service_test_common.dart';
+import 'test_helper.dart';
+
+// Line in core/print.dart
+const int LINE_A = 10;
+
+testMain() {
+ debugger();
+ print('1');
+ print('2');
+ print('3');
+ print('Done');
+}
+
+IsolateTest expectHitBreakpoint(String uri, int line) {
+ return (Isolate isolate) async {
+ final bpt = await isolate.addBreakpointByScriptUri(uri, line);
+ await resumeIsolate(isolate);
+ await hasStoppedAtBreakpoint(isolate);
+ await stoppedAtLine(line)(isolate);
+ await isolate.removeBreakpoint(bpt);
+ };
+}
+
+var tests = <IsolateTest>[
+ hasStoppedAtBreakpoint,
+
+ // Dart libraries are not debuggable by default
+ markDartColonLibrariesDebuggable,
+
+ expectHitBreakpoint('org-dartlang-sdk:///sdk/lib/core/print.dart', LINE_A),
+ expectHitBreakpoint('dart:core/print.dart', LINE_A),
+ expectHitBreakpoint('/core/print.dart', LINE_A),
+
+ resumeIsolate,
+];
+
+main(args) => runIsolateTests(args, tests, testeeConcurrent: testMain);
diff --git a/runtime/observatory_2/tests/service_2/service_2_kernel.status b/runtime/observatory_2/tests/service_2/service_2_kernel.status
index 5138ddd..322b922 100644
--- a/runtime/observatory_2/tests/service_2/service_2_kernel.status
+++ b/runtime/observatory_2/tests/service_2/service_2_kernel.status
@@ -47,6 +47,7 @@
bad_reload_test: SkipByDesign # Hot reload is disabled in AOT mode.
break_on_activation_test: SkipByDesign # Debugger is disabled in AOT mode.
break_on_async_function_test: SkipByDesign # Debugger is disabled in AOT mode.
+break_on_dart_colon_test: SkipByDesign # Debugger is disabled in AOT mode.
break_on_default_constructor_test: SkipByDesign # Debugger is disabled in AOT mode.
break_on_function_child_isolate_test: SkipByDesign # Debugger is disabled in AOT mode.
break_on_function_many_child_isolates_test: SkipByDesign # Debugger is disabled in AOT mode.
diff --git a/runtime/vm/debugger.cc b/runtime/vm/debugger.cc
index 7763cc7..7bbf92b 100644
--- a/runtime/vm/debugger.cc
+++ b/runtime/vm/debugger.cc
@@ -3129,6 +3129,7 @@
const GrowableObjectArray& libs = GrowableObjectArray::Handle(
isolate_->group()->object_store()->libraries());
bool is_package = script_url.StartsWith(Symbols::PackageScheme());
+ bool is_dart_colon = script_url.StartsWith(Symbols::DartScheme());
Script& script_for_lib = Script::Handle(zone);
for (intptr_t i = 0; i < libs.Length(); i++) {
lib ^= libs.At(i);
@@ -3136,7 +3137,8 @@
// are available for look up. When certain script only contains
// top level functions, scripts could still be loaded correctly.
lib.EnsureTopLevelClassIsFinalized();
- script_for_lib = lib.LookupScript(script_url, !is_package);
+ bool useResolvedUri = !is_package && !is_dart_colon;
+ script_for_lib = lib.LookupScript(script_url, useResolvedUri);
if (!script_for_lib.IsNull()) {
scripts.Add(script_for_lib);
}
diff --git a/tools/VERSION b/tools/VERSION
index cb88287..fe63169 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
MAJOR 2
MINOR 15
PATCH 0
-PRERELEASE 143
+PRERELEASE 144
PRERELEASE_PATCH 0
\ No newline at end of file