diff --git a/pkg/compiler/lib/src/js_emitter/record_use_emitter.dart b/pkg/compiler/lib/src/js_emitter/record_use_emitter.dart index c72bcd14e45..9a69d26bba4 100644 --- a/pkg/compiler/lib/src/js_emitter/record_use_emitter.dart +++ b/pkg/compiler/lib/src/js_emitter/record_use_emitter.dart @@ -10,11 +10,7 @@ /// null, List, Map, or constant objects. library; -import 'dart:io'; - import 'package:compiler/src/elements/entities.dart'; -// ignore: implementation_imports -import 'package:front_end/src/api_unstable/dart2js.dart' show relativizeUri; import 'package:compiler/src/deferred_load/output_unit.dart'; import 'package:compiler/src/js_model/js_world.dart'; import 'package:record_use/record_use_internal.dart'; @@ -50,6 +46,9 @@ class RecordUseCollector { } void _register(String loadingUnit, RecordedUse recordedUse) { + if (!recordedUse.function.library.canonicalUri.isScheme('package')) { + return; + } final callReference = switch (recordedUse) { RecordedCallWithArguments() => CallWithArguments( loadingUnit: loadingUnit, @@ -76,11 +75,7 @@ class RecordUseCollector { identifier: Identifier( name: key.name!, scope: key.enclosingClass?.name, - importUri: relativizeUri( - Uri.base, - key.library.canonicalUri, - Platform.isWindows, - ), + importUri: key.library.canonicalUri.toString(), ), loadingUnit: outputUnitToName[_closedWorld.outputUnitData.outputUnitForMember( diff --git a/pkg/compiler/test/record_use/data/js_interop.dart b/pkg/compiler/test/record_use/data/lib/js_interop.dart similarity index 85% rename from pkg/compiler/test/record_use/data/js_interop.dart rename to pkg/compiler/test/record_use/data/lib/js_interop.dart index 0fd0ad6a3b2..edb243c39e1 100644 --- a/pkg/compiler/test/record_use/data/js_interop.dart +++ b/pkg/compiler/test/record_use/data/lib/js_interop.dart @@ -4,6 +4,7 @@ import 'dart:js_interop'; +// ignore: experimental_member_use import 'package:meta/meta.dart' show RecordUse; void main() { @@ -11,5 +12,6 @@ void main() { } @JS() +// ignore: experimental_member_use @RecordUse() external int someExternalFunction(int k); diff --git a/pkg/compiler/test/record_use/data/js_interop.dart.json.expect b/pkg/compiler/test/record_use/data/lib/js_interop.dart.json.expect similarity index 100% rename from pkg/compiler/test/record_use/data/js_interop.dart.json.expect rename to pkg/compiler/test/record_use/data/lib/js_interop.dart.json.expect diff --git a/pkg/compiler/test/record_use/data/pubspec.yaml b/pkg/compiler/test/record_use/data/pubspec.yaml new file mode 100644 index 00000000000..9b1bb649c81 --- /dev/null +++ b/pkg/compiler/test/record_use/data/pubspec.yaml @@ -0,0 +1,14 @@ +# Copyright (c) 2026, 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. + +name: record_use_js_test +publish_to: none + +resolution: workspace + +environment: + sdk: ^3.12.0-0 + +dependencies: + meta: any diff --git a/pkg/compiler/test/record_use/record_use_test.dart b/pkg/compiler/test/record_use/record_use_test.dart index 9691deb7e9e..eeb09df35c1 100644 --- a/pkg/compiler/test/record_use/record_use_test.dart +++ b/pkg/compiler/test/record_use/record_use_test.dart @@ -3,10 +3,9 @@ // BSD-style license that can be found in the LICENSE file. import 'dart:convert'; -import 'dart:io' show Directory, File, Platform; +import 'dart:io' show Directory, File; -import 'package:compiler/compiler_api.dart' as api show OutputType; -import 'package:compiler/compiler_api.dart'; +import 'package:compiler/compiler_api.dart' as api; import 'package:compiler/src/commandline_options.dart' show Flags; import 'package:compiler/src/util/memory_compiler.dart'; import 'package:expect/expect.dart' show Expect; @@ -23,37 +22,82 @@ const List compilerOptions = [Flags.writeRecordedUses, Flags.testMode]; /// Run `dart -DupdateExpectations=true pkg/vm/test/transformations/record_use_test.dart` /// to update the shared expectations to the VM output. Future main() async { - final vmTestCases = Directory('pkg/vm/testcases/transformations/record_use'); - final jsTestCases = Directory.fromUri(Platform.script.resolve('data')); - final testFiles = [...jsTestCases.listSync(), ...vmTestCases.listSync()] - .whereType() - .where((file) => file.path.endsWith('.dart')) - .map( - (file) => TestFile( - file: file, - basename: path.basename(file.path), - contents: file.readAsStringSync(), - uri: _createUri(path.basename(file.path)), - ), - ); + final vmFiles = _getTestFiles( + 'pkg/vm/testcases/transformations/record_use/lib', + 'record_use_test', + ); + final jsFiles = _getTestFiles( + 'pkg/compiler/test/record_use/data/lib', + 'record_use_js_test', + ); - final allFiles = {for (final file in testFiles) file.uri.path: file.contents}; + final testFiles = [...vmFiles, ...jsFiles]; + + final allFiles = { + for (final file in vmFiles) + '/record_use_test/lib/${file.basename}': file.contents, + for (final file in jsFiles) + '/record_use_js_test/lib/${file.basename}': file.contents, + '/.dart_tool/package_config.json': jsonEncode({ + "configVersion": 2, + "packages": [ + { + "name": "record_use_test", + "rootUri": "/record_use_test/", + "packageUri": "lib/", + "languageVersion": "3.9", + }, + { + "name": "record_use_js_test", + "rootUri": "/record_use_js_test/", + "packageUri": "lib/", + "languageVersion": "3.9", + }, + { + "name": "meta", + "rootUri": Directory.current.uri.resolve('pkg/meta/').toString(), + "packageUri": "lib/", + "languageVersion": "3.9", + }, + ], + }), + }; for (final testFile in testFiles.where((element) => element.hasMain)) { + final bool isThrowsTest = testFile.basename.contains('throws'); test( '${testFile.file.path}', skip: dart2jsNotSupported.contains(testFile.basename), () async { + final diagnosticCollector = DiagnosticCollector(); final recordedUsages = await compileWithUsages( entryPoint: testFile.uri, memorySourceFiles: allFiles, + diagnosticHandler: diagnosticCollector, + expectSuccess: !isThrowsTest, ); + + if (isThrowsTest) { + Expect.isTrue(recordedUsages == null); + final errors = diagnosticCollector.errors + .map((e) => e.text) + .join('\n'); + if (testFile.basename.contains('invalid_location')) { + Expect.contains('RecordUse', errors); + Expect.contains( + 'annotation cannot be placed on this element', + errors, + ); + } + return; + } + final goldenFile = File(testFile.file.path + '.json.expect'); const update = bool.fromEnvironment('updateExpectations'); if (!goldenFile.existsSync() || update) { await goldenFile.create(); - await goldenFile.writeAsString(recordedUsages); + await goldenFile.writeAsString(recordedUsages!); } else { - final actual = Recordings.fromJson(jsonDecode(recordedUsages)); + final actual = Recordings.fromJson(jsonDecode(recordedUsages!)); final goldenContents = await goldenFile.readAsString(); final golden = Recordings.fromJson(jsonDecode(goldenContents)); final semanticEquals = actual.semanticEquals( @@ -63,8 +107,6 @@ Future main() async { // Ensure test coverage of tear offs, add pragmas to prevent // optimiations if necessary. allowTearoffToStaticPromotion: false, - uriMapping: (String uri) => - uri.replaceFirst('memory:sdk/tests/web/native/', ''), loadingUnitMapping: (String unit) => const {'out': '1', 'out_1': '2'}[unit] ?? unit, ); @@ -80,6 +122,49 @@ Future main() async { }, ); } + + test('outside_package_throws', () async { + final entryPoint = Uri.parse('memory:/outside.dart'); + final memorySourceFiles = { + ...allFiles, + '/outside.dart': ''' +import 'package:meta/meta.dart' show RecordUse; +class SomeClass { + @RecordUse() + static String someStaticMethod(int a) => a.toString(); +} +void main() { + print(SomeClass.someStaticMethod(42)); +} +''', + }; + final diagnosticCollector = DiagnosticCollector(); + await compileWithUsages( + entryPoint: entryPoint, + memorySourceFiles: memorySourceFiles, + diagnosticHandler: diagnosticCollector, + expectSuccess: false, + ); + final errors = diagnosticCollector.errors.map((e) => e.text).join('\n'); + Expect.contains('RecordUse', errors); + Expect.contains('package:', errors); + }); +} + +Iterable _getTestFiles(String dirPath, String packageName) { + return Directory(dirPath) + .listSync() + .whereType() + .where((file) => file.path.endsWith('.dart')) + .map( + (file) => TestFile( + file: file, + basename: path.basename(file.path), + contents: file.readAsStringSync(), + uri: Uri.parse('package:$packageName/${path.basename(file.path)}'), + packageName: packageName, + ), + ); } class TestFile { @@ -87,12 +172,14 @@ class TestFile { final String basename; final String contents; final Uri uri; + final String packageName; const TestFile({ required this.file, required this.basename, required this.contents, required this.uri, + required this.packageName, }); bool get hasMain => contents.contains('main()'); @@ -100,30 +187,35 @@ class TestFile { typedef CompiledOutput = Map>; -Future compileWithUsages({ +Future compileWithUsages({ Uri? entryPoint, required Map memorySourceFiles, + api.CompilerDiagnostics? diagnosticHandler, + bool expectSuccess = true, }) async { final outputProvider = OutputCollector(); - CompilationResult result = await runCompiler( + api.CompilationResult result = await runCompiler( entryPoint: entryPoint, memorySourceFiles: memorySourceFiles, outputProvider: outputProvider, + diagnosticHandler: diagnosticHandler, options: [Flags.writeRecordedUses], + packageConfig: Uri.parse('memory:/.dart_tool/package_config.json'), ); - Expect.isTrue(result.isSuccess); + if (expectSuccess) { + Expect.isTrue(result.isSuccess); + } else { + if (result.isSuccess) { + throw 'Compilation succeeded but was expected to fail.'; + } + return null; + } - return outputProvider.outputMap[OutputType.recordedUses]!.values.first + return outputProvider.outputMap[api.OutputType.recordedUses]!.values.first .toString(); } -// Pretend this is a dart2js_native test to allow use of 'native' keyword -// and import of private libraries. -Uri _createUri(String fileName) { - return Uri.parse('memory:sdk/tests/web/native/$fileName'); -} - const dart2jsNotSupported = { // No support for instance constants. // https://github.com/dart-lang/native/issues/2893 diff --git a/pkg/dart2wasm/lib/compile.dart b/pkg/dart2wasm/lib/compile.dart index 99088b3ee99..7b6a17e421b 100644 --- a/pkg/dart2wasm/lib/compile.dart +++ b/pkg/dart2wasm/lib/compile.dart @@ -725,8 +725,7 @@ Future _runCodegenPhase( return moduleOutput.moduleImportName; } - record_use.transformComponent( - component, options.recordedUsesFile!, options.mainUri, + record_use.transformComponent(component, options.recordedUsesFile!, loadingUnitLookup: loadingUnitForNode); } diff --git a/pkg/dart2wasm/test/record_use_test.dart b/pkg/dart2wasm/test/record_use_test.dart index 9279f69af11..dd435d938f0 100644 --- a/pkg/dart2wasm/test/record_use_test.dart +++ b/pkg/dart2wasm/test/record_use_test.dart @@ -12,49 +12,83 @@ import 'util.dart'; final Uri _pkgVmDir = Platform.script.resolve('../../vm/'); -Future runTestCase(Uri source) async { +Future runTestCase( + Uri sourceFileUri, + Uri sourcePackageUri, + Uri packagesFileUri, +) async { + final bool isThrowsTest = sourceFileUri.path.contains('throws'); await withTempDir((String tempDir) async { final recordedUsesFile = path.join(tempDir, 'recorded_usages.json'); - await run([ + final List args = [ Platform.executable, 'compile', 'wasm', '-O2', - source.toFilePath(), + '--packages=${packagesFileUri.toFilePath()}', + sourceFileUri.toFilePath(), '-o', path.join(tempDir, 'out.wasm'), '--enable-deferred-loading', '--extra-compiler-option=--recorded-uses=$recordedUsesFile', - ]); + ]; + + if (isThrowsTest) { + final result = await Process.run(args.first, args.skip(1).toList()); + if (result.exitCode == 0) { + throw 'Compilation succeeded for $sourceFileUri but was expected to fail.'; + } + final errors = '${result.stdout}\n${result.stderr}'; + if (sourceFileUri.path.contains('invalid_location')) { + if (!errors.contains('RecordUse') || + !errors.contains('cannot be placed on this element')) { + throw 'Wrong error message for $sourceFileUri:\n$errors'; + } + } + return; + } + + await run(args); final actualSemantic = Recordings.fromJson( jsonDecode(File(recordedUsesFile).readAsStringSync()), ); - final goldenFile = File('${source.toFilePath()}.json.expect'); - final goldenContents = await goldenFile.readAsString(); - final golden = Recordings.fromJson(jsonDecode(goldenContents)); - final semanticEquals = - actualSemantic.semanticEquals(golden, loadingUnitMapping: (unit) { - final codeUnits = unit.codeUnits; - int result = 0; - int power = 1; - for (final codeUnit in codeUnits) { - result += (codeUnit - 35) * power; - power *= 92; - } - return '$result'; - }); + final goldenFile = File('${sourceFileUri.toFilePath()}.json.expect'); const update = bool.fromEnvironment('updateExpectations'); + + bool semanticEquals = false; + if (goldenFile.existsSync()) { + final goldenContents = await goldenFile.readAsString(); + final golden = Recordings.fromJson(jsonDecode(goldenContents)); + semanticEquals = + actualSemantic.semanticEquals(golden, loadingUnitMapping: (unit) { + final codeUnits = unit.codeUnits; + int result = 0; + int power = 1; + for (final codeUnit in codeUnits) { + result += (codeUnit - 35) * power; + power *= 92; + } + return '$result'; + }); + } + if (update && !semanticEquals) { - goldenFile.writeAsStringSync(jsonEncode(actualSemantic)); - print('Updated expectations for $source'); + goldenFile.writeAsStringSync( + JsonEncoder.withIndent(' ').convert(actualSemantic.toJson()), + ); + print('Updated expectations for $sourceFileUri'); } else if (!semanticEquals) { - print('Actual: ${actualSemantic.toJson()}'); - print('Expected: ${golden.toJson()}'); + final encoder = JsonEncoder.withIndent(' '); + print('Actual:\n${encoder.convert(actualSemantic.toJson())}'); + if (goldenFile.existsSync()) { + final goldenContents = await goldenFile.readAsString(); + print('Expected:\n$goldenContents'); + } print('To update expectations, run: dart -DupdateExpectations=true ' 'pkg/dart2wasm/test/record_use_test.dart ' - '${path.basename(source.toFilePath())}'); - throw 'Expectations for $source do not match'; + '${path.basename(sourceFileUri.toFilePath())}'); + throw 'Expectations for $sourceFileUri do not match'; } }); } @@ -62,15 +96,57 @@ Future runTestCase(Uri source) async { Future main(List args) async { assert(args.isEmpty || args.length == 1); final filter = args.firstOrNull; - final testCasesDir = Directory.fromUri( - _pkgVmDir.resolve('testcases/transformations/record_use/'), + final recordUseTestDir = _pkgVmDir.resolve( + 'testcases/transformations/record_use/', ); + final testCasesDir = Directory.fromUri(recordUseTestDir.resolve('lib/')); + final packagesFileUri = _pkgVmDir.resolve( + '../../.dart_tool/package_config.json', + ); + for (var fse in testCasesDir.listSync(recursive: true, followLinks: false)) { if (fse is! File) continue; if (fse.path.endsWith('.dart') && !fse.path.contains('helper') && (filter == null || fse.path.contains(filter))) { - await runTestCase(fse.uri); + final name = path.basename(fse.path); + final packageUri = Uri.parse('package:record_use_test/$name'); + await runTestCase(fse.uri, packageUri, packagesFileUri); } } + + await runOutsidePackageThrows(packagesFileUri); +} + +Future runOutsidePackageThrows(Uri packagesFileUri) async { + await withTempDir((String tempDir) async { + final sourceFile = File(path.join(tempDir, 'outside.dart')); + sourceFile.writeAsStringSync(''' +import 'package:meta/meta.dart' show RecordUse; +class SomeClass { + @RecordUse() + static String someStaticMethod(int a) => a.toString(); +} +void main() { + print(SomeClass.someStaticMethod(42)); +} +'''); + final result = await Process.run(Platform.executable, [ + 'compile', + 'wasm', + '-O2', + '--packages=${packagesFileUri.toFilePath()}', + sourceFile.path, + '-o', + path.join(tempDir, 'out.wasm'), + ]); + + if (result.exitCode == 0) { + throw 'Compilation succeeded but was expected to fail.'; + } + final errors = '${result.stdout}\n${result.stderr}'; + if (!errors.contains('RecordUse') || !errors.contains('package:')) { + throw 'Wrong error message for outside package test:\n$errors'; + } + }); } diff --git a/pkg/front_end/lib/src/codes/diagnostic.g.dart b/pkg/front_end/lib/src/codes/diagnostic.g.dart index 7dc93a647b1..2f07ef51f94 100644 --- a/pkg/front_end/lib/src/codes/diagnostic.g.dart +++ b/pkg/front_end/lib/src/codes/diagnostic.g.dart @@ -14996,6 +14996,13 @@ const MessageCode recordUseCannotBePlacedHere = const MessageCode( """`RecordUse` annotation cannot be placed on this element.""", ); +// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE. +const MessageCode recordUseOutsideOfPackage = const MessageCode( + "RecordUseOutsideOfPackage", + problemMessage: + """`RecordUse` annotations are only supported in libraries with a `package:` URI.""", +); + // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE. const MessageCode recordUsedAsCallable = const MessageCode( "RecordUsedAsCallable", diff --git a/pkg/front_end/lib/src/kernel/record_use.dart b/pkg/front_end/lib/src/kernel/record_use.dart index 9860cfbd09a..06d9b783185 100644 --- a/pkg/front_end/lib/src/kernel/record_use.dart +++ b/pkg/front_end/lib/src/kernel/record_use.dart @@ -45,15 +45,32 @@ bool isRecordUse(Class cls) => cls.enclosingLibrary.importUri == _metaLibraryUri; // Coverage-ignore(suite): Not run. -bool isBeingRecorded(Class cls) => isRecordUse(cls) || hasRecordUse(cls); +bool _enclosedInLibraryWithPackageUri(Annotatable node) { + final Library? library = switch (node) { + Library l => l, + Class c => c.enclosingLibrary, + Member m => m.enclosingLibrary, + _ => null, + }; + return library?.importUri.isScheme('package') ?? false; +} // Coverage-ignore(suite): Not run. -/// If [cls] annotation is in turn annotated by a recording annotation. -bool hasRecordUse(Class cls) => cls.annotations - .whereType() - .map((e) => e.constant) - .whereType() - .any((annotation) => isRecordUse(annotation.classNode)); +bool isBeingRecorded(Annotatable node) { + final bool hasAnnotation = hasRecordUseAnnotation(node); + + if (!hasAnnotation) return false; + + return _enclosedInLibraryWithPackageUri(node); +} + +// Coverage-ignore(suite): Not run. +Uri? _getFileUri(Annotatable node) { + if (node is Library) return node.fileUri; + if (node is Class) return node.fileUri; + if (node is Member) return node.fileUri; + return node.location?.file; +} // Coverage-ignore(suite): Not run. /// Report if the resource annotations is placed on anything but a static @@ -63,6 +80,17 @@ void validateRecordUseDeclaration( ErrorReporter errorReporter, Iterable resourceAnnotations, ) { + if (resourceAnnotations.isEmpty) return; + + final Uri? fileUri = _getFileUri(node); + if (fileUri == null) return; + + if (!_enclosedInLibraryWithPackageUri(node)) { + errorReporter.report( + diag.recordUseOutsideOfPackage.withLocation(fileUri, node.fileOffset, 1), + ); + } + final bool onNonStaticMethod = node is! Procedure || !node.isStatic || node.kind != ProcedureKind.Method; @@ -72,7 +100,7 @@ void validateRecordUseDeclaration( if (onNonStaticMethod && onClassWithoutConstConstructor) { errorReporter.report( diag.recordUseCannotBePlacedHere.withLocation( - node.location!.file, + fileUri, node.fileOffset, 1, ), diff --git a/pkg/front_end/messages.status b/pkg/front_end/messages.status index f2fecef72d3..9f3e550b162 100644 --- a/pkg/front_end/messages.status +++ b/pkg/front_end/messages.status @@ -140,6 +140,7 @@ front_end/PatchInjectionFailed/example: missingExample # Patching. front_end/PatternMatchingError/example: missingExample # Seemingly this is not issued as an error, but ends up in the kernel AST. front_end/PositionalAfterNamedArgument/example: missingExample # Seemingly only issued in Analyzer front_end/RecordUseCannotBePlacedHere/example: missingExample # No coverage. +front_end/RecordUseOutsideOfPackage/example: missingExample # No coverage. front_end/SdkRootNotFound/example: missingExample # Issued on what is essentially a wrong setup. front_end/SdkSpecificationNotFound/example: missingExample # Issued on what is essentially a wrong setup. front_end/SdkSummaryNotFound/example: missingExample # Issued on what is essentially a wrong setup. diff --git a/pkg/front_end/messages.yaml b/pkg/front_end/messages.yaml index f5296a4520e..2bff702fe63 100644 --- a/pkg/front_end/messages.yaml +++ b/pkg/front_end/messages.yaml @@ -7175,6 +7175,10 @@ recordUseCannotBePlacedHere: parameters: none problemMessage: "`RecordUse` annotation cannot be placed on this element." +recordUseOutsideOfPackage: + parameters: none + problemMessage: "`RecordUse` annotations are only supported in libraries with a `package:` URI." + wasmImportOrExportInUserCode: parameters: none problemMessage: "Pragmas `wasm:import` and `wasm:export` are for internal use only and cannot be used by user code." diff --git a/pkg/vm/lib/kernel_front_end.dart b/pkg/vm/lib/kernel_front_end.dart index b7f06247f70..9cfbb1f184d 100644 --- a/pkg/vm/lib/kernel_front_end.dart +++ b/pkg/vm/lib/kernel_front_end.dart @@ -871,7 +871,7 @@ Future runGlobalTransformations( final recordedUsagesFile = args.recordedUsages; if (recordedUsagesFile != null) { assert(args.source != null); - record_use.transformComponent(component, recordedUsagesFile, args.source!); + record_use.transformComponent(component, recordedUsagesFile); } } diff --git a/pkg/vm/lib/transformations/record_use/constant_collector.dart b/pkg/vm/lib/transformations/record_use/constant_collector.dart index a1d77fabb34..d85e16f2230 100644 --- a/pkg/vm/lib/transformations/record_use/constant_collector.dart +++ b/pkg/vm/lib/transformations/record_use/constant_collector.dart @@ -3,7 +3,7 @@ // BSD-style license that can be found in the LICENSE file. import 'package:kernel/ast.dart'; -import 'package:front_end/src/kernel/record_use.dart' as recordUse; +import 'package:front_end/src/kernel/record_use.dart' as record_use; /// Expose only the [collect] method of a [_ConstantCollector] to outside use. extension type ConstantCollector(_ConstantCollector _collector) { @@ -79,7 +79,7 @@ class _ConstantCollector implements ConstantVisitor { void visitInstanceConstant(InstanceConstant constant) { assert(_expression != null); final classNode = constant.classNode; - if (_hasRecordUseAnnotation[classNode] ??= recordUse.hasRecordUseAnnotation( + if (_hasRecordUseAnnotation[classNode] ??= record_use.isBeingRecorded( classNode, )) { collector(_expression!, constant); diff --git a/pkg/vm/lib/transformations/record_use/record_call.dart b/pkg/vm/lib/transformations/record_use/record_call.dart index 1c322941848..e962f3815c5 100644 --- a/pkg/vm/lib/transformations/record_use/record_call.dart +++ b/pkg/vm/lib/transformations/record_use/record_call.dart @@ -2,7 +2,7 @@ // 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/kernel/record_use.dart' as recordUse; +import 'package:front_end/src/kernel/record_use.dart' show isBeingRecorded; import 'package:kernel/ast.dart' as ast; import 'package:record_use/record_use_internal.dart'; import 'package:vm/transformations/record_use/record_use.dart'; @@ -24,18 +24,15 @@ class CallRecorder { /// A function to look up the loading unit for a reference. final LoadingUnitLookup _loadingUnitLookup; - /// The source uri to base relative URIs off of. - final Uri _source; - /// Whether to save line and column info as well as the URI. //TODO(mosum): add verbose mode to enable this bool exactLocation = false; - CallRecorder(this._source, this._loadingUnitLookup); + CallRecorder(this._loadingUnitLookup); /// Will record a static invocation if it is annotated with `@RecordUse`. void recordStaticInvocation(ast.StaticInvocation node) { - if (recordUse.hasRecordUseAnnotation(node.target)) { + if (isBeingRecorded(node.target)) { // Collect the (int, bool, double, or String) arguments passed in the call. final createCallReference = _createCallReference(node); _addToUsage(node.target, createCallReference); @@ -46,10 +43,7 @@ class CallRecorder { void recordConstantExpression(ast.ConstantExpression node) { final constant = node.constant; if (constant is ast.StaticTearOffConstant) { - final hasRecordUseAnnotation = recordUse.hasRecordUseAnnotation( - constant.target, - ); - if (hasRecordUseAnnotation) { + if (isBeingRecorded(constant.target)) { _addToUsage( constant.target, CallTearoff(loadingUnit: _loadingUnitLookup(node)), @@ -139,11 +133,11 @@ class CallRecorder { ast.Member target, ) { final enclosingLibrary = target.enclosingLibrary; - String file = getImportUri(enclosingLibrary, _source); + final importUri = enclosingLibrary.importUri.toString(); return ( identifier: Identifier( - importUri: file, + importUri: importUri, scope: target.enclosingClass?.name, name: target.name.text, ), diff --git a/pkg/vm/lib/transformations/record_use/record_instance.dart b/pkg/vm/lib/transformations/record_use/record_instance.dart index 962ecafc24e..9fb522b4410 100644 --- a/pkg/vm/lib/transformations/record_use/record_instance.dart +++ b/pkg/vm/lib/transformations/record_use/record_instance.dart @@ -22,9 +22,6 @@ class InstanceRecorder { /// A function to look up the loading unit for a reference. final LoadingUnitLookup _loadingUnitLookup; - /// The source uri to base relative URIs off of. - final Uri _source; - /// A visitor traversing and collecting constants. late final ConstantCollector collector; @@ -32,7 +29,7 @@ class InstanceRecorder { //TODO(mosum): add verbose mode to enable this bool exactLocation = false; - InstanceRecorder(this._source, this._loadingUnitLookup) { + InstanceRecorder(this._loadingUnitLookup) { collector = ConstantCollector.collectWith(_collectInstance); } @@ -66,10 +63,10 @@ class InstanceRecorder { ast.Class cls, ) { final enclosingLibrary = cls.enclosingLibrary; - final file = getImportUri(enclosingLibrary, _source); + final importUri = enclosingLibrary.importUri.toString(); return ( - identifier: Identifier(importUri: file, name: cls.name), + identifier: Identifier(importUri: importUri, name: cls.name), loadingUnit: _loadingUnitLookup(cls), ); } diff --git a/pkg/vm/lib/transformations/record_use/record_use.dart b/pkg/vm/lib/transformations/record_use/record_use.dart index 2957a602150..a887425ea6c 100644 --- a/pkg/vm/lib/transformations/record_use/record_use.dart +++ b/pkg/vm/lib/transformations/record_use/record_use.dart @@ -5,8 +5,6 @@ import 'dart:convert'; import 'dart:io'; -import 'package:_fe_analyzer_shared/src/util/relativize.dart' - show relativizeUri; import 'package:collection/collection.dart'; import 'package:kernel/ast.dart' as ast; import 'package:record_use/record_use_internal.dart'; @@ -44,14 +42,13 @@ LoadingUnitLookup _getDefaultLoadingUnitLookup(ast.Component component) { /// application. ast.Component transformComponent( ast.Component component, - Uri recordedUsagesFile, - Uri source, { + Uri recordedUsagesFile, { LoadingUnitLookup? loadingUnitLookup, }) { loadingUnitLookup ??= _getDefaultLoadingUnitLookup(component); - final callRecorder = CallRecorder(source, loadingUnitLookup); - final instanceRecorder = InstanceRecorder(source, loadingUnitLookup); + final callRecorder = CallRecorder(loadingUnitLookup); + final instanceRecorder = InstanceRecorder(loadingUnitLookup); component.accept(_RecordUseVisitor(callRecorder, instanceRecorder)); final usages = _usages( @@ -196,17 +193,6 @@ InstanceConstant evaluateInstanceConstant(ast.InstanceConstant constant) => Never _unsupported(String constantType) => throw UnsupportedError('$constantType is not supported for recording.'); -String getImportUri(ast.Library library, Uri source) { - String file; - final importUri = library.importUri; - if (importUri.isScheme('file')) { - file = relativizeUri(source, library.fileUri, Platform.isWindows); - } else { - file = library.importUri.toString(); - } - return file; -} - ast.Library? enclosingLibrary(ast.TreeNode node) { while (node is! ast.Library) { final parent = node.parent; diff --git a/pkg/vm/lib/transformations/type_flow/native_code.dart b/pkg/vm/lib/transformations/type_flow/native_code.dart index ecb40190ff2..358fbfb96f8 100644 --- a/pkg/vm/lib/transformations/type_flow/native_code.dart +++ b/pkg/vm/lib/transformations/type_flow/native_code.dart @@ -7,7 +7,7 @@ library; import 'dart:core' hide Type; -import 'package:front_end/src/api_prototype/record_use.dart' as recordUse; +import 'package:front_end/src/api_prototype/record_use.dart' as record_use; import 'package:kernel/ast.dart'; import 'package:kernel/library_index.dart' show LibraryIndex; @@ -226,7 +226,7 @@ class PragmaEntryPointsVisitor extends RecursiveVisitor { visitField(Field field) { if (field.isInstanceMember && field.enclosingClass!.hasConstConstructor && - recordUse.hasRecordUse(field.enclosingClass!)) { + record_use.isBeingRecorded(field.enclosingClass!)) { // If a class has a `@RecordUse` annotation then a user-defined linker // script may want to inspect instance constants of the class, so we have // to preserve all fields. diff --git a/pkg/vm/lib/transformations/type_flow/transformer.dart b/pkg/vm/lib/transformations/type_flow/transformer.dart index 415a5d511e2..9ce60d0f66a 100644 --- a/pkg/vm/lib/transformations/type_flow/transformer.dart +++ b/pkg/vm/lib/transformations/type_flow/transformer.dart @@ -9,7 +9,7 @@ import 'dart:core' hide Type; import 'package:front_end/src/api_prototype/static_weak_references.dart' show StaticWeakReferences; -import 'package:front_end/src/api_prototype/record_use.dart' as RecordUse; +import 'package:front_end/src/api_prototype/record_use.dart' as record_use; import 'package:kernel/ast.dart' hide Statement, StatementVisitor; import 'package:kernel/ast.dart' as ast show Statement; import 'package:kernel/class_hierarchy.dart' @@ -344,7 +344,7 @@ class CleanupAnnotations extends RecursiveVisitor { protobufHandler?.usesAnnotationClass(cls) ?? false; return cls == pragmaClass || usesProtobufAnnotation || - RecordUse.isBeingRecorded(cls); + record_use.isRecordUse(cls); } } return false; diff --git a/pkg/vm/pubspec.yaml b/pkg/vm/pubspec.yaml index 3685cfeadd8..c2b09dd2e12 100644 --- a/pkg/vm/pubspec.yaml +++ b/pkg/vm/pubspec.yaml @@ -10,7 +10,6 @@ resolution: workspace # Use 'any' constraints here; we get our versions from the DEPS file. dependencies: - _fe_analyzer_shared: any args: any build_integration: any collection: any diff --git a/pkg/vm/test/transformations/record_use_test.dart b/pkg/vm/test/transformations/record_use_test.dart index 273b6ca9add..66188b2b865 100644 --- a/pkg/vm/test/transformations/record_use_test.dart +++ b/pkg/vm/test/transformations/record_use_test.dart @@ -21,12 +21,21 @@ import 'package:path/path.dart' as path; final Uri _pkgVmDir = Platform.script.resolve('../..'); -void runTestCaseAot(Uri source, bool throws) async { +void runTestCaseAot( + Uri sourceFileUri, + Uri sourcePackageUri, + Uri packagesFileUri, + bool throws, +) async { final target = VmTarget(TargetFlags(supportMirrors: false)); Component component; try { - component = await compileTestCaseToKernelProgram(source, target: target); + component = await compileTestCaseToKernelProgram( + sourcePackageUri, + target: target, + packagesFileUri: packagesFileUri, + ); } catch (e) { if (throws) { return; @@ -52,7 +61,7 @@ void runTestCaseAot(Uri source, bool throws) async { useProtobufTreeShakerV2: true, treeShakeWriteOnlyFields: true, recordedUsages: recordedUsagesFile, - source: source, + source: sourcePackageUri, ), ); @@ -66,12 +75,16 @@ void runTestCaseAot(Uri source, bool throws) async { component.mainMethod!.enclosingLibrary, ).replaceAll(_pkgVmDir.toString(), 'org-dartlang-test:///'); - compareResultWithExpectationsFile(source, actual, expectFilePostfix: '.aot'); + compareResultWithExpectationsFile( + sourceFileUri, + actual, + expectFilePostfix: '.aot', + ); final actualSemantic = Recordings.fromJson( jsonDecode(File.fromUri(recordedUsagesFile).readAsStringSync()), ); - final goldenFile = File('${source.toFilePath()}.json.expect'); + final goldenFile = File('${sourceFileUri.toFilePath()}.json.expect'); final update = bool.fromEnvironment('updateExpectations'); bool semanticEquals = false; @@ -83,7 +96,7 @@ void runTestCaseAot(Uri source, bool throws) async { if (!semanticEquals || update) { compareResultWithExpectationsFile( - source, + sourceFileUri, File.fromUri(recordedUsagesFile).readAsStringSync(), expectFilePostfix: '.json', ); @@ -94,9 +107,14 @@ void main(List args) { assert(args.isEmpty || args.length == 1); final filter = args.firstOrNull; group('record-use-transformations', () { - final testCasesDir = Directory.fromUri( - _pkgVmDir.resolve('testcases/transformations/record_use/'), + final recordUseTestDir = _pkgVmDir.resolve( + 'testcases/transformations/record_use/', ); + final testCasesDir = Directory.fromUri(recordUseTestDir.resolve('lib/')); + final packagesFileUri = _pkgVmDir.resolve( + '../../.dart_tool/package_config.json', + ); + for (var file in testCasesDir .listSync(recursive: true, followLinks: false) @@ -104,11 +122,42 @@ void main(List args) { if (file.path.endsWith('.dart') && !file.path.contains('helper') && (filter == null || file.path.contains(filter))) { + final name = path.basename(file.path); + final packageUri = Uri.parse('package:record_use_test/$name'); test( '${file.path} aot', - () => runTestCaseAot(file.uri, file.path.contains('throws')), + () => runTestCaseAot( + file.uri, + packageUri, + packagesFileUri, + file.path.contains('throws'), + ), ); } } + + test('outside_package_throws', () async { + final sourceFileUri = recordUseTestDir.resolve( + 'outside_package_throws.dart', + ); + final target = VmTarget(TargetFlags(supportMirrors: false)); + + bool failed = false; + try { + await compileTestCaseToKernelProgram( + sourceFileUri, + target: target, + packagesFileUri: packagesFileUri, + ); + } catch (e) { + failed = true; + final message = e.toString(); + expect(message, contains('RecordUse')); + expect(message, contains('package:')); + } + if (!failed) { + fail('Should have failed with a diagnostic error'); + } + }); }); } diff --git a/pkg/vm/testcases/transformations/record_use/basic.dart b/pkg/vm/testcases/transformations/record_use/lib/basic.dart similarity index 100% rename from pkg/vm/testcases/transformations/record_use/basic.dart rename to pkg/vm/testcases/transformations/record_use/lib/basic.dart diff --git a/pkg/vm/testcases/transformations/record_use/basic.dart.aot.expect b/pkg/vm/testcases/transformations/record_use/lib/basic.dart.aot.expect similarity index 100% rename from pkg/vm/testcases/transformations/record_use/basic.dart.aot.expect rename to pkg/vm/testcases/transformations/record_use/lib/basic.dart.aot.expect diff --git a/pkg/vm/testcases/transformations/record_use/basic.dart.json.expect b/pkg/vm/testcases/transformations/record_use/lib/basic.dart.json.expect similarity index 91% rename from pkg/vm/testcases/transformations/record_use/basic.dart.json.expect rename to pkg/vm/testcases/transformations/record_use/lib/basic.dart.json.expect index d9676b46c89..b34b1cd9222 100644 --- a/pkg/vm/testcases/transformations/record_use/basic.dart.json.expect +++ b/pkg/vm/testcases/transformations/record_use/lib/basic.dart.json.expect @@ -24,7 +24,7 @@ "identifier": { "name": "someStaticMethod2", "scope": "SomeClass", - "uri": "basic.dart" + "uri": "package:record_use_test/basic.dart" }, "loading_unit": "1" } diff --git a/pkg/vm/testcases/transformations/record_use/complex.dart b/pkg/vm/testcases/transformations/record_use/lib/complex.dart similarity index 100% rename from pkg/vm/testcases/transformations/record_use/complex.dart rename to pkg/vm/testcases/transformations/record_use/lib/complex.dart diff --git a/pkg/vm/testcases/transformations/record_use/complex.dart.aot.expect b/pkg/vm/testcases/transformations/record_use/lib/complex.dart.aot.expect similarity index 100% rename from pkg/vm/testcases/transformations/record_use/complex.dart.aot.expect rename to pkg/vm/testcases/transformations/record_use/lib/complex.dart.aot.expect diff --git a/pkg/vm/testcases/transformations/record_use/complex.dart.json.expect b/pkg/vm/testcases/transformations/record_use/lib/complex.dart.json.expect similarity index 91% rename from pkg/vm/testcases/transformations/record_use/complex.dart.json.expect rename to pkg/vm/testcases/transformations/record_use/lib/complex.dart.json.expect index 3f106d1d9e0..56b7fa4fbb5 100644 --- a/pkg/vm/testcases/transformations/record_use/complex.dart.json.expect +++ b/pkg/vm/testcases/transformations/record_use/lib/complex.dart.json.expect @@ -28,7 +28,7 @@ "identifier": { "name": "generate", "scope": "OtherClass", - "uri": "complex.dart" + "uri": "package:record_use_test/complex.dart" }, "loading_unit": "1" } diff --git a/pkg/vm/testcases/transformations/record_use/const_argument_instance.dart b/pkg/vm/testcases/transformations/record_use/lib/const_argument_instance.dart similarity index 100% rename from pkg/vm/testcases/transformations/record_use/const_argument_instance.dart rename to pkg/vm/testcases/transformations/record_use/lib/const_argument_instance.dart diff --git a/pkg/vm/testcases/transformations/record_use/const_argument_instance.dart.aot.expect b/pkg/vm/testcases/transformations/record_use/lib/const_argument_instance.dart.aot.expect similarity index 100% rename from pkg/vm/testcases/transformations/record_use/const_argument_instance.dart.aot.expect rename to pkg/vm/testcases/transformations/record_use/lib/const_argument_instance.dart.aot.expect diff --git a/pkg/vm/testcases/transformations/record_use/const_argument_instance.dart.json.expect b/pkg/vm/testcases/transformations/record_use/lib/const_argument_instance.dart.json.expect similarity index 89% rename from pkg/vm/testcases/transformations/record_use/const_argument_instance.dart.json.expect rename to pkg/vm/testcases/transformations/record_use/lib/const_argument_instance.dart.json.expect index c94909164f7..99e698196dc 100644 --- a/pkg/vm/testcases/transformations/record_use/const_argument_instance.dart.json.expect +++ b/pkg/vm/testcases/transformations/record_use/lib/const_argument_instance.dart.json.expect @@ -29,7 +29,7 @@ "definition": { "identifier": { "name": "someStaticMethod2", - "uri": "const_argument_instance.dart" + "uri": "package:record_use_test/const_argument_instance.dart" }, "loading_unit": "1" } diff --git a/pkg/vm/testcases/transformations/record_use/different.dart b/pkg/vm/testcases/transformations/record_use/lib/different.dart similarity index 100% rename from pkg/vm/testcases/transformations/record_use/different.dart rename to pkg/vm/testcases/transformations/record_use/lib/different.dart diff --git a/pkg/vm/testcases/transformations/record_use/different.dart.aot.expect b/pkg/vm/testcases/transformations/record_use/lib/different.dart.aot.expect similarity index 100% rename from pkg/vm/testcases/transformations/record_use/different.dart.aot.expect rename to pkg/vm/testcases/transformations/record_use/lib/different.dart.aot.expect diff --git a/pkg/vm/testcases/transformations/record_use/different.dart.json.expect b/pkg/vm/testcases/transformations/record_use/lib/different.dart.json.expect similarity index 100% rename from pkg/vm/testcases/transformations/record_use/different.dart.json.expect rename to pkg/vm/testcases/transformations/record_use/lib/different.dart.json.expect diff --git a/pkg/vm/testcases/transformations/record_use/enum_const_arg.dart b/pkg/vm/testcases/transformations/record_use/lib/enum_const_arg.dart similarity index 100% rename from pkg/vm/testcases/transformations/record_use/enum_const_arg.dart rename to pkg/vm/testcases/transformations/record_use/lib/enum_const_arg.dart diff --git a/pkg/vm/testcases/transformations/record_use/enum_const_arg.dart.aot.expect b/pkg/vm/testcases/transformations/record_use/lib/enum_const_arg.dart.aot.expect similarity index 100% rename from pkg/vm/testcases/transformations/record_use/enum_const_arg.dart.aot.expect rename to pkg/vm/testcases/transformations/record_use/lib/enum_const_arg.dart.aot.expect diff --git a/pkg/vm/testcases/transformations/record_use/enum_const_arg.dart.json.expect b/pkg/vm/testcases/transformations/record_use/lib/enum_const_arg.dart.json.expect similarity index 91% rename from pkg/vm/testcases/transformations/record_use/enum_const_arg.dart.json.expect rename to pkg/vm/testcases/transformations/record_use/lib/enum_const_arg.dart.json.expect index bfe1ed1672b..d17d8624c2e 100644 --- a/pkg/vm/testcases/transformations/record_use/enum_const_arg.dart.json.expect +++ b/pkg/vm/testcases/transformations/record_use/lib/enum_const_arg.dart.json.expect @@ -34,7 +34,7 @@ "definition": { "identifier": { "name": "doSomething", - "uri": "enum_const_arg.dart" + "uri": "package:record_use_test/enum_const_arg.dart" }, "loading_unit": "1" } diff --git a/pkg/vm/testcases/transformations/record_use/extension.dart b/pkg/vm/testcases/transformations/record_use/lib/extension.dart similarity index 100% rename from pkg/vm/testcases/transformations/record_use/extension.dart rename to pkg/vm/testcases/transformations/record_use/lib/extension.dart diff --git a/pkg/vm/testcases/transformations/record_use/extension.dart.aot.expect b/pkg/vm/testcases/transformations/record_use/lib/extension.dart.aot.expect similarity index 100% rename from pkg/vm/testcases/transformations/record_use/extension.dart.aot.expect rename to pkg/vm/testcases/transformations/record_use/lib/extension.dart.aot.expect diff --git a/pkg/vm/testcases/transformations/record_use/extension.dart.json.expect b/pkg/vm/testcases/transformations/record_use/lib/extension.dart.json.expect similarity index 90% rename from pkg/vm/testcases/transformations/record_use/extension.dart.json.expect rename to pkg/vm/testcases/transformations/record_use/lib/extension.dart.json.expect index 0e379547abc..ebf2facb293 100644 --- a/pkg/vm/testcases/transformations/record_use/extension.dart.json.expect +++ b/pkg/vm/testcases/transformations/record_use/lib/extension.dart.json.expect @@ -23,7 +23,7 @@ "definition": { "identifier": { "name": "_extension#0|callWithArgs", - "uri": "extension.dart" + "uri": "package:record_use_test/extension.dart" }, "loading_unit": "1" } diff --git a/pkg/vm/testcases/transformations/record_use/instance_class.dart b/pkg/vm/testcases/transformations/record_use/lib/instance_class.dart similarity index 100% rename from pkg/vm/testcases/transformations/record_use/instance_class.dart rename to pkg/vm/testcases/transformations/record_use/lib/instance_class.dart diff --git a/pkg/vm/testcases/transformations/record_use/instance_class.dart.aot.expect b/pkg/vm/testcases/transformations/record_use/lib/instance_class.dart.aot.expect similarity index 100% rename from pkg/vm/testcases/transformations/record_use/instance_class.dart.aot.expect rename to pkg/vm/testcases/transformations/record_use/lib/instance_class.dart.aot.expect diff --git a/pkg/vm/testcases/transformations/record_use/instance_class.dart.json.expect b/pkg/vm/testcases/transformations/record_use/lib/instance_class.dart.json.expect similarity index 90% rename from pkg/vm/testcases/transformations/record_use/instance_class.dart.json.expect rename to pkg/vm/testcases/transformations/record_use/lib/instance_class.dart.json.expect index 14313545c3b..52b9327383f 100644 --- a/pkg/vm/testcases/transformations/record_use/instance_class.dart.json.expect +++ b/pkg/vm/testcases/transformations/record_use/lib/instance_class.dart.json.expect @@ -20,7 +20,7 @@ "definition": { "identifier": { "name": "MyClass", - "uri": "instance_class.dart" + "uri": "package:record_use_test/instance_class.dart" }, "loading_unit": "1" }, diff --git a/pkg/vm/testcases/transformations/record_use/instance_complex.dart b/pkg/vm/testcases/transformations/record_use/lib/instance_complex.dart similarity index 100% rename from pkg/vm/testcases/transformations/record_use/instance_complex.dart rename to pkg/vm/testcases/transformations/record_use/lib/instance_complex.dart diff --git a/pkg/vm/testcases/transformations/record_use/instance_complex.dart.aot.expect b/pkg/vm/testcases/transformations/record_use/lib/instance_complex.dart.aot.expect similarity index 100% rename from pkg/vm/testcases/transformations/record_use/instance_complex.dart.aot.expect rename to pkg/vm/testcases/transformations/record_use/lib/instance_complex.dart.aot.expect diff --git a/pkg/vm/testcases/transformations/record_use/instance_complex.dart.json.expect b/pkg/vm/testcases/transformations/record_use/lib/instance_complex.dart.json.expect similarity index 95% rename from pkg/vm/testcases/transformations/record_use/instance_complex.dart.json.expect rename to pkg/vm/testcases/transformations/record_use/lib/instance_complex.dart.json.expect index 40ebf60b48a..82c5665c521 100644 --- a/pkg/vm/testcases/transformations/record_use/instance_complex.dart.json.expect +++ b/pkg/vm/testcases/transformations/record_use/lib/instance_complex.dart.json.expect @@ -76,7 +76,7 @@ "definition": { "identifier": { "name": "MyClass", - "uri": "instance_complex.dart" + "uri": "package:record_use_test/instance_complex.dart" }, "loading_unit": "1" }, diff --git a/pkg/vm/testcases/transformations/record_use/instance_duplicates.dart b/pkg/vm/testcases/transformations/record_use/lib/instance_duplicates.dart similarity index 100% rename from pkg/vm/testcases/transformations/record_use/instance_duplicates.dart rename to pkg/vm/testcases/transformations/record_use/lib/instance_duplicates.dart diff --git a/pkg/vm/testcases/transformations/record_use/instance_duplicates.dart.aot.expect b/pkg/vm/testcases/transformations/record_use/lib/instance_duplicates.dart.aot.expect similarity index 100% rename from pkg/vm/testcases/transformations/record_use/instance_duplicates.dart.aot.expect rename to pkg/vm/testcases/transformations/record_use/lib/instance_duplicates.dart.aot.expect diff --git a/pkg/vm/testcases/transformations/record_use/instance_duplicates.dart.json.expect b/pkg/vm/testcases/transformations/record_use/lib/instance_duplicates.dart.json.expect similarity index 92% rename from pkg/vm/testcases/transformations/record_use/instance_duplicates.dart.json.expect rename to pkg/vm/testcases/transformations/record_use/lib/instance_duplicates.dart.json.expect index c822bc7ec56..c19c88cdb87 100644 --- a/pkg/vm/testcases/transformations/record_use/instance_duplicates.dart.json.expect +++ b/pkg/vm/testcases/transformations/record_use/lib/instance_duplicates.dart.json.expect @@ -30,7 +30,7 @@ "definition": { "identifier": { "name": "MyClass", - "uri": "instance_duplicates.dart" + "uri": "package:record_use_test/instance_duplicates.dart" }, "loading_unit": "1" }, diff --git a/pkg/vm/testcases/transformations/record_use/instance_method.dart b/pkg/vm/testcases/transformations/record_use/lib/instance_method.dart similarity index 100% rename from pkg/vm/testcases/transformations/record_use/instance_method.dart rename to pkg/vm/testcases/transformations/record_use/lib/instance_method.dart diff --git a/pkg/vm/testcases/transformations/record_use/instance_method.dart.aot.expect b/pkg/vm/testcases/transformations/record_use/lib/instance_method.dart.aot.expect similarity index 60% rename from pkg/vm/testcases/transformations/record_use/instance_method.dart.aot.expect rename to pkg/vm/testcases/transformations/record_use/lib/instance_method.dart.aot.expect index e852b934c4b..77afbc411d3 100644 --- a/pkg/vm/testcases/transformations/record_use/instance_method.dart.aot.expect +++ b/pkg/vm/testcases/transformations/record_use/lib/instance_method.dart.aot.expect @@ -1,16 +1,11 @@ library #lib; import self as self; -import "package:meta/meta.dart" as meta; import "dart:core" as core; -import "package:meta/meta.dart" show RecordUse; +abstract class MyClass extends core::Object /*hasConstConstructor*/ { -@#C1 -class MyClass extends core::Object /*hasConstConstructor*/ { - - [@vm.inferred-type.metadata=dart.core::_Smi (value: 42)] + [@vm.unreachable.metadata=] [@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,getterSelectorId:1] - [@vm.unboxing-info.metadata=[!regcc]] final field core::int i; } @@ -20,12 +15,6 @@ static method main() → void { } [@vm.inferred-return-type.metadata=dart.core::Null? (value: null)] -@#C3 static method doSomething() → void { core::print("a"); } -constants { - #C1 = meta::RecordUse {} - #C2 = 42 - #C3 = self::MyClass {i:#C2} -} diff --git a/pkg/vm/testcases/transformations/record_use/instance_method.dart.json.expect b/pkg/vm/testcases/transformations/record_use/lib/instance_method.dart.json.expect similarity index 100% rename from pkg/vm/testcases/transformations/record_use/instance_method.dart.json.expect rename to pkg/vm/testcases/transformations/record_use/lib/instance_method.dart.json.expect diff --git a/pkg/vm/testcases/transformations/record_use/instance_not_annotation.dart b/pkg/vm/testcases/transformations/record_use/lib/instance_not_annotation.dart similarity index 100% rename from pkg/vm/testcases/transformations/record_use/instance_not_annotation.dart rename to pkg/vm/testcases/transformations/record_use/lib/instance_not_annotation.dart diff --git a/pkg/vm/testcases/transformations/record_use/instance_not_annotation.dart.aot.expect b/pkg/vm/testcases/transformations/record_use/lib/instance_not_annotation.dart.aot.expect similarity index 100% rename from pkg/vm/testcases/transformations/record_use/instance_not_annotation.dart.aot.expect rename to pkg/vm/testcases/transformations/record_use/lib/instance_not_annotation.dart.aot.expect diff --git a/pkg/vm/testcases/transformations/record_use/instance_not_annotation.dart.json.expect b/pkg/vm/testcases/transformations/record_use/lib/instance_not_annotation.dart.json.expect similarity index 86% rename from pkg/vm/testcases/transformations/record_use/instance_not_annotation.dart.json.expect rename to pkg/vm/testcases/transformations/record_use/lib/instance_not_annotation.dart.json.expect index fc1cc294b40..81e1fcdc3f0 100644 --- a/pkg/vm/testcases/transformations/record_use/instance_not_annotation.dart.json.expect +++ b/pkg/vm/testcases/transformations/record_use/lib/instance_not_annotation.dart.json.expect @@ -13,7 +13,7 @@ "definition": { "identifier": { "name": "MyClass", - "uri": "instance_not_annotation.dart" + "uri": "package:record_use_test/instance_not_annotation.dart" }, "loading_unit": "1" }, diff --git a/pkg/vm/testcases/transformations/record_use/loading_units_multiple.dart b/pkg/vm/testcases/transformations/record_use/lib/loading_units_multiple.dart similarity index 100% rename from pkg/vm/testcases/transformations/record_use/loading_units_multiple.dart rename to pkg/vm/testcases/transformations/record_use/lib/loading_units_multiple.dart diff --git a/pkg/vm/testcases/transformations/record_use/lib/loading_units_multiple.dart.aot.expect b/pkg/vm/testcases/transformations/record_use/lib/loading_units_multiple.dart.aot.expect new file mode 100644 index 00000000000..e801714ab1a --- /dev/null +++ b/pkg/vm/testcases/transformations/record_use/lib/loading_units_multiple.dart.aot.expect @@ -0,0 +1,15 @@ +library #lib; +import self as self; +import "package:record_use_test/loading_units_multiple_helper_shared.dart" as loa; +import "package:record_use_test/loading_units_multiple_helper.dart" as loa2; + +import "package:record_use_test/loading_units_multiple_helper_shared.dart"; +import "package:record_use_test/loading_units_multiple_helper.dart" deferred as helper; + + +[@vm.inferred-return-type.metadata=dart.async::_Future] +static method main() → void async /* emittedValueType= void */ { + loa::SomeClass::someStaticMethod(42); + await LoadLibrary(helper); + let final dynamic #t1 = CheckLibraryIsLoaded(helper) in loa2::invokeDeferred(); +} diff --git a/pkg/vm/testcases/transformations/record_use/loading_units_multiple.dart.json.expect b/pkg/vm/testcases/transformations/record_use/lib/loading_units_multiple.dart.json.expect similarity index 89% rename from pkg/vm/testcases/transformations/record_use/loading_units_multiple.dart.json.expect rename to pkg/vm/testcases/transformations/record_use/lib/loading_units_multiple.dart.json.expect index d6e3113ecb6..5fc5c3aca95 100644 --- a/pkg/vm/testcases/transformations/record_use/loading_units_multiple.dart.json.expect +++ b/pkg/vm/testcases/transformations/record_use/lib/loading_units_multiple.dart.json.expect @@ -31,7 +31,7 @@ "identifier": { "name": "someStaticMethod", "scope": "SomeClass", - "uri": "loading_units_multiple_helper_shared.dart" + "uri": "package:record_use_test/loading_units_multiple_helper_shared.dart" }, "loading_unit": "1" } diff --git a/pkg/vm/testcases/transformations/record_use/loading_units_multiple_helper.dart b/pkg/vm/testcases/transformations/record_use/lib/loading_units_multiple_helper.dart similarity index 100% rename from pkg/vm/testcases/transformations/record_use/loading_units_multiple_helper.dart rename to pkg/vm/testcases/transformations/record_use/lib/loading_units_multiple_helper.dart diff --git a/pkg/vm/testcases/transformations/record_use/loading_units_multiple_helper_shared.dart b/pkg/vm/testcases/transformations/record_use/lib/loading_units_multiple_helper_shared.dart similarity index 100% rename from pkg/vm/testcases/transformations/record_use/loading_units_multiple_helper_shared.dart rename to pkg/vm/testcases/transformations/record_use/lib/loading_units_multiple_helper_shared.dart diff --git a/pkg/vm/testcases/transformations/record_use/loading_units_simple.dart b/pkg/vm/testcases/transformations/record_use/lib/loading_units_simple.dart similarity index 100% rename from pkg/vm/testcases/transformations/record_use/loading_units_simple.dart rename to pkg/vm/testcases/transformations/record_use/lib/loading_units_simple.dart diff --git a/pkg/vm/testcases/transformations/record_use/loading_units_simple.dart.aot.expect b/pkg/vm/testcases/transformations/record_use/lib/loading_units_simple.dart.aot.expect similarity index 81% rename from pkg/vm/testcases/transformations/record_use/loading_units_simple.dart.aot.expect rename to pkg/vm/testcases/transformations/record_use/lib/loading_units_simple.dart.aot.expect index be08525a696..7494a998d47 100644 --- a/pkg/vm/testcases/transformations/record_use/loading_units_simple.dart.aot.expect +++ b/pkg/vm/testcases/transformations/record_use/lib/loading_units_simple.dart.aot.expect @@ -2,10 +2,10 @@ library #lib; import self as self; import "dart:core" as core; import "package:meta/meta.dart" as meta; -import "loading_units_simple_helper.dart" as loa; +import "package:record_use_test/loading_units_simple_helper.dart" as loa; import "package:meta/meta.dart" show RecordUse; -import "org-dartlang-test:///testcases/transformations/record_use/loading_units_simple_helper.dart" deferred as helper; +import "package:record_use_test/loading_units_simple_helper.dart" deferred as helper; abstract class SomeClass extends core::Object { diff --git a/pkg/vm/testcases/transformations/record_use/loading_units_simple.dart.json.expect b/pkg/vm/testcases/transformations/record_use/lib/loading_units_simple.dart.json.expect similarity index 86% rename from pkg/vm/testcases/transformations/record_use/loading_units_simple.dart.json.expect rename to pkg/vm/testcases/transformations/record_use/lib/loading_units_simple.dart.json.expect index cfc48d54e2a..44e0a1e3c96 100644 --- a/pkg/vm/testcases/transformations/record_use/loading_units_simple.dart.json.expect +++ b/pkg/vm/testcases/transformations/record_use/lib/loading_units_simple.dart.json.expect @@ -24,7 +24,7 @@ "identifier": { "name": "someStaticMethod", "scope": "SomeClass", - "uri": "loading_units_simple.dart" + "uri": "package:record_use_test/loading_units_simple.dart" }, "loading_unit": "1" } @@ -43,7 +43,7 @@ "identifier": { "name": "someStaticMethod", "scope": "SomeClass", - "uri": "loading_units_simple_helper.dart" + "uri": "package:record_use_test/loading_units_simple_helper.dart" }, "loading_unit": "2" } diff --git a/pkg/vm/testcases/transformations/record_use/loading_units_simple_helper.dart b/pkg/vm/testcases/transformations/record_use/lib/loading_units_simple_helper.dart similarity index 100% rename from pkg/vm/testcases/transformations/record_use/loading_units_simple_helper.dart rename to pkg/vm/testcases/transformations/record_use/lib/loading_units_simple_helper.dart diff --git a/pkg/vm/testcases/transformations/record_use/map_complex_keys.dart b/pkg/vm/testcases/transformations/record_use/lib/map_complex_keys.dart similarity index 100% rename from pkg/vm/testcases/transformations/record_use/map_complex_keys.dart rename to pkg/vm/testcases/transformations/record_use/lib/map_complex_keys.dart diff --git a/pkg/vm/testcases/transformations/record_use/map_complex_keys.dart.aot.expect b/pkg/vm/testcases/transformations/record_use/lib/map_complex_keys.dart.aot.expect similarity index 100% rename from pkg/vm/testcases/transformations/record_use/map_complex_keys.dart.aot.expect rename to pkg/vm/testcases/transformations/record_use/lib/map_complex_keys.dart.aot.expect diff --git a/pkg/vm/testcases/transformations/record_use/map_complex_keys.dart.json.expect b/pkg/vm/testcases/transformations/record_use/lib/map_complex_keys.dart.json.expect similarity index 93% rename from pkg/vm/testcases/transformations/record_use/map_complex_keys.dart.json.expect rename to pkg/vm/testcases/transformations/record_use/lib/map_complex_keys.dart.json.expect index 3ad5c265f0a..574a6a76dbd 100644 --- a/pkg/vm/testcases/transformations/record_use/map_complex_keys.dart.json.expect +++ b/pkg/vm/testcases/transformations/record_use/lib/map_complex_keys.dart.json.expect @@ -49,7 +49,7 @@ "identifier": { "name": "someStaticMethod", "scope": "SomeClass", - "uri": "map_complex_keys.dart" + "uri": "package:record_use_test/map_complex_keys.dart" }, "loading_unit": "1" } diff --git a/pkg/vm/testcases/transformations/record_use/named_and_positional.dart b/pkg/vm/testcases/transformations/record_use/lib/named_and_positional.dart similarity index 100% rename from pkg/vm/testcases/transformations/record_use/named_and_positional.dart rename to pkg/vm/testcases/transformations/record_use/lib/named_and_positional.dart diff --git a/pkg/vm/testcases/transformations/record_use/named_and_positional.dart.aot.expect b/pkg/vm/testcases/transformations/record_use/lib/named_and_positional.dart.aot.expect similarity index 100% rename from pkg/vm/testcases/transformations/record_use/named_and_positional.dart.aot.expect rename to pkg/vm/testcases/transformations/record_use/lib/named_and_positional.dart.aot.expect diff --git a/pkg/vm/testcases/transformations/record_use/named_and_positional.dart.json.expect b/pkg/vm/testcases/transformations/record_use/lib/named_and_positional.dart.json.expect similarity index 95% rename from pkg/vm/testcases/transformations/record_use/named_and_positional.dart.json.expect rename to pkg/vm/testcases/transformations/record_use/lib/named_and_positional.dart.json.expect index abf773e9840..e19dc42110a 100644 --- a/pkg/vm/testcases/transformations/record_use/named_and_positional.dart.json.expect +++ b/pkg/vm/testcases/transformations/record_use/lib/named_and_positional.dart.json.expect @@ -80,7 +80,7 @@ "identifier": { "name": "someStaticMethod", "scope": "SomeClass", - "uri": "named_and_positional.dart" + "uri": "package:record_use_test/named_and_positional.dart" }, "loading_unit": "1" } diff --git a/pkg/vm/testcases/transformations/record_use/named_both.dart b/pkg/vm/testcases/transformations/record_use/lib/named_both.dart similarity index 100% rename from pkg/vm/testcases/transformations/record_use/named_both.dart rename to pkg/vm/testcases/transformations/record_use/lib/named_both.dart diff --git a/pkg/vm/testcases/transformations/record_use/named_both.dart.aot.expect b/pkg/vm/testcases/transformations/record_use/lib/named_both.dart.aot.expect similarity index 100% rename from pkg/vm/testcases/transformations/record_use/named_both.dart.aot.expect rename to pkg/vm/testcases/transformations/record_use/lib/named_both.dart.aot.expect diff --git a/pkg/vm/testcases/transformations/record_use/named_both.dart.json.expect b/pkg/vm/testcases/transformations/record_use/lib/named_both.dart.json.expect similarity index 95% rename from pkg/vm/testcases/transformations/record_use/named_both.dart.json.expect rename to pkg/vm/testcases/transformations/record_use/lib/named_both.dart.json.expect index 15af0cfa77d..99f85529906 100644 --- a/pkg/vm/testcases/transformations/record_use/named_both.dart.json.expect +++ b/pkg/vm/testcases/transformations/record_use/lib/named_both.dart.json.expect @@ -72,7 +72,7 @@ "identifier": { "name": "someStaticMethod", "scope": "SomeClass", - "uri": "named_both.dart" + "uri": "package:record_use_test/named_both.dart" }, "loading_unit": "1" } diff --git a/pkg/vm/testcases/transformations/record_use/named_optional.dart b/pkg/vm/testcases/transformations/record_use/lib/named_optional.dart similarity index 100% rename from pkg/vm/testcases/transformations/record_use/named_optional.dart rename to pkg/vm/testcases/transformations/record_use/lib/named_optional.dart diff --git a/pkg/vm/testcases/transformations/record_use/named_optional.dart.aot.expect b/pkg/vm/testcases/transformations/record_use/lib/named_optional.dart.aot.expect similarity index 100% rename from pkg/vm/testcases/transformations/record_use/named_optional.dart.aot.expect rename to pkg/vm/testcases/transformations/record_use/lib/named_optional.dart.aot.expect diff --git a/pkg/vm/testcases/transformations/record_use/named_optional.dart.json.expect b/pkg/vm/testcases/transformations/record_use/lib/named_optional.dart.json.expect similarity index 92% rename from pkg/vm/testcases/transformations/record_use/named_optional.dart.json.expect rename to pkg/vm/testcases/transformations/record_use/lib/named_optional.dart.json.expect index 080d5ca9cfa..f43e7c3b2f5 100644 --- a/pkg/vm/testcases/transformations/record_use/named_optional.dart.json.expect +++ b/pkg/vm/testcases/transformations/record_use/lib/named_optional.dart.json.expect @@ -35,7 +35,7 @@ "identifier": { "name": "someStaticMethod", "scope": "SomeClass", - "uri": "named_optional.dart" + "uri": "package:record_use_test/named_optional.dart" }, "loading_unit": "1" } diff --git a/pkg/vm/testcases/transformations/record_use/named_required.dart b/pkg/vm/testcases/transformations/record_use/lib/named_required.dart similarity index 100% rename from pkg/vm/testcases/transformations/record_use/named_required.dart rename to pkg/vm/testcases/transformations/record_use/lib/named_required.dart diff --git a/pkg/vm/testcases/transformations/record_use/named_required.dart.aot.expect b/pkg/vm/testcases/transformations/record_use/lib/named_required.dart.aot.expect similarity index 100% rename from pkg/vm/testcases/transformations/record_use/named_required.dart.aot.expect rename to pkg/vm/testcases/transformations/record_use/lib/named_required.dart.aot.expect diff --git a/pkg/vm/testcases/transformations/record_use/named_required.dart.json.expect b/pkg/vm/testcases/transformations/record_use/lib/named_required.dart.json.expect similarity index 92% rename from pkg/vm/testcases/transformations/record_use/named_required.dart.json.expect rename to pkg/vm/testcases/transformations/record_use/lib/named_required.dart.json.expect index c6540b5eee8..963f5c2e429 100644 --- a/pkg/vm/testcases/transformations/record_use/named_required.dart.json.expect +++ b/pkg/vm/testcases/transformations/record_use/lib/named_required.dart.json.expect @@ -35,7 +35,7 @@ "identifier": { "name": "someStaticMethod", "scope": "SomeClass", - "uri": "named_required.dart" + "uri": "package:record_use_test/named_required.dart" }, "loading_unit": "1" } diff --git a/pkg/vm/testcases/transformations/record_use/named_with_function_arg.dart b/pkg/vm/testcases/transformations/record_use/lib/named_with_function_arg.dart similarity index 100% rename from pkg/vm/testcases/transformations/record_use/named_with_function_arg.dart rename to pkg/vm/testcases/transformations/record_use/lib/named_with_function_arg.dart diff --git a/pkg/vm/testcases/transformations/record_use/named_with_function_arg.dart.aot.expect b/pkg/vm/testcases/transformations/record_use/lib/named_with_function_arg.dart.aot.expect similarity index 100% rename from pkg/vm/testcases/transformations/record_use/named_with_function_arg.dart.aot.expect rename to pkg/vm/testcases/transformations/record_use/lib/named_with_function_arg.dart.aot.expect diff --git a/pkg/vm/testcases/transformations/record_use/named_with_function_arg.dart.json.expect b/pkg/vm/testcases/transformations/record_use/lib/named_with_function_arg.dart.json.expect similarity index 89% rename from pkg/vm/testcases/transformations/record_use/named_with_function_arg.dart.json.expect rename to pkg/vm/testcases/transformations/record_use/lib/named_with_function_arg.dart.json.expect index 0d2c4f303a9..4a3ca1b7259 100644 --- a/pkg/vm/testcases/transformations/record_use/named_with_function_arg.dart.json.expect +++ b/pkg/vm/testcases/transformations/record_use/lib/named_with_function_arg.dart.json.expect @@ -26,7 +26,7 @@ "definition": { "identifier": { "name": "Ext|foo", - "uri": "named_with_function_arg.dart" + "uri": "package:record_use_test/named_with_function_arg.dart" }, "loading_unit": "1" } diff --git a/pkg/vm/testcases/transformations/record_use/nested.dart b/pkg/vm/testcases/transformations/record_use/lib/nested.dart similarity index 100% rename from pkg/vm/testcases/transformations/record_use/nested.dart rename to pkg/vm/testcases/transformations/record_use/lib/nested.dart diff --git a/pkg/vm/testcases/transformations/record_use/nested.dart.aot.expect b/pkg/vm/testcases/transformations/record_use/lib/nested.dart.aot.expect similarity index 100% rename from pkg/vm/testcases/transformations/record_use/nested.dart.aot.expect rename to pkg/vm/testcases/transformations/record_use/lib/nested.dart.aot.expect diff --git a/pkg/vm/testcases/transformations/record_use/nested.dart.json.expect b/pkg/vm/testcases/transformations/record_use/lib/nested.dart.json.expect similarity index 91% rename from pkg/vm/testcases/transformations/record_use/nested.dart.json.expect rename to pkg/vm/testcases/transformations/record_use/lib/nested.dart.json.expect index f58e0b9bad6..40837d003a0 100644 --- a/pkg/vm/testcases/transformations/record_use/nested.dart.json.expect +++ b/pkg/vm/testcases/transformations/record_use/lib/nested.dart.json.expect @@ -33,7 +33,7 @@ "definition": { "identifier": { "name": "MyClass", - "uri": "nested.dart" + "uri": "package:record_use_test/nested.dart" }, "loading_unit": "1" }, @@ -54,7 +54,7 @@ "definition": { "identifier": { "name": "MyOtherClass", - "uri": "nested.dart" + "uri": "package:record_use_test/nested.dart" }, "loading_unit": "1" }, diff --git a/pkg/vm/testcases/transformations/record_use/nested_instance_constant.dart b/pkg/vm/testcases/transformations/record_use/lib/nested_instance_constant.dart similarity index 100% rename from pkg/vm/testcases/transformations/record_use/nested_instance_constant.dart rename to pkg/vm/testcases/transformations/record_use/lib/nested_instance_constant.dart diff --git a/pkg/vm/testcases/transformations/record_use/nested_instance_constant.dart.aot.expect b/pkg/vm/testcases/transformations/record_use/lib/nested_instance_constant.dart.aot.expect similarity index 100% rename from pkg/vm/testcases/transformations/record_use/nested_instance_constant.dart.aot.expect rename to pkg/vm/testcases/transformations/record_use/lib/nested_instance_constant.dart.aot.expect diff --git a/pkg/vm/testcases/transformations/record_use/nested_instance_constant.dart.json.expect b/pkg/vm/testcases/transformations/record_use/lib/nested_instance_constant.dart.json.expect similarity index 88% rename from pkg/vm/testcases/transformations/record_use/nested_instance_constant.dart.json.expect rename to pkg/vm/testcases/transformations/record_use/lib/nested_instance_constant.dart.json.expect index 841d79721cb..a6d58d85da3 100644 --- a/pkg/vm/testcases/transformations/record_use/nested_instance_constant.dart.json.expect +++ b/pkg/vm/testcases/transformations/record_use/lib/nested_instance_constant.dart.json.expect @@ -20,7 +20,7 @@ "definition": { "identifier": { "name": "Recorded", - "uri": "nested_instance_constant.dart" + "uri": "package:record_use_test/nested_instance_constant.dart" }, "loading_unit": "1" }, diff --git a/pkg/vm/testcases/transformations/record_use/partfile_helper.dart b/pkg/vm/testcases/transformations/record_use/lib/partfile_helper.dart similarity index 100% rename from pkg/vm/testcases/transformations/record_use/partfile_helper.dart rename to pkg/vm/testcases/transformations/record_use/lib/partfile_helper.dart diff --git a/pkg/vm/testcases/transformations/record_use/partfile_main.dart b/pkg/vm/testcases/transformations/record_use/lib/partfile_main.dart similarity index 100% rename from pkg/vm/testcases/transformations/record_use/partfile_main.dart rename to pkg/vm/testcases/transformations/record_use/lib/partfile_main.dart diff --git a/pkg/vm/testcases/transformations/record_use/partfile_main.dart.aot.expect b/pkg/vm/testcases/transformations/record_use/lib/partfile_main.dart.aot.expect similarity index 91% rename from pkg/vm/testcases/transformations/record_use/partfile_main.dart.aot.expect rename to pkg/vm/testcases/transformations/record_use/lib/partfile_main.dart.aot.expect index ae84b919fff..43f66ca2f3e 100644 --- a/pkg/vm/testcases/transformations/record_use/partfile_main.dart.aot.expect +++ b/pkg/vm/testcases/transformations/record_use/lib/partfile_main.dart.aot.expect @@ -6,7 +6,7 @@ import "package:meta/meta.dart" as meta; import "package:meta/meta.dart" show RecordUse; part partfile_helper.dart; -abstract class SomeClass extends core::Object { // from org-dartlang-test:///testcases/transformations/record_use/partfile_helper.dart +abstract class SomeClass extends core::Object { // from org-dartlang-test:///testcases/transformations/record_use/lib/partfile_helper.dart [@vm.inferred-return-type.metadata=int] [@vm.unboxing-info.metadata=(i)->i] diff --git a/pkg/vm/testcases/transformations/record_use/partfile_main.dart.json.expect b/pkg/vm/testcases/transformations/record_use/lib/partfile_main.dart.json.expect similarity index 89% rename from pkg/vm/testcases/transformations/record_use/partfile_main.dart.json.expect rename to pkg/vm/testcases/transformations/record_use/lib/partfile_main.dart.json.expect index d073197e013..b9036db87fa 100644 --- a/pkg/vm/testcases/transformations/record_use/partfile_main.dart.json.expect +++ b/pkg/vm/testcases/transformations/record_use/lib/partfile_main.dart.json.expect @@ -24,7 +24,7 @@ "identifier": { "name": "someStaticMethod", "scope": "SomeClass", - "uri": "partfile_main.dart" + "uri": "package:record_use_test/partfile_main.dart" }, "loading_unit": "1" } diff --git a/pkg/vm/testcases/transformations/record_use/positional_both.dart b/pkg/vm/testcases/transformations/record_use/lib/positional_both.dart similarity index 100% rename from pkg/vm/testcases/transformations/record_use/positional_both.dart rename to pkg/vm/testcases/transformations/record_use/lib/positional_both.dart diff --git a/pkg/vm/testcases/transformations/record_use/positional_both.dart.aot.expect b/pkg/vm/testcases/transformations/record_use/lib/positional_both.dart.aot.expect similarity index 100% rename from pkg/vm/testcases/transformations/record_use/positional_both.dart.aot.expect rename to pkg/vm/testcases/transformations/record_use/lib/positional_both.dart.aot.expect diff --git a/pkg/vm/testcases/transformations/record_use/positional_both.dart.json.expect b/pkg/vm/testcases/transformations/record_use/lib/positional_both.dart.json.expect similarity index 93% rename from pkg/vm/testcases/transformations/record_use/positional_both.dart.json.expect rename to pkg/vm/testcases/transformations/record_use/lib/positional_both.dart.json.expect index e3a332df564..6ccab20e701 100644 --- a/pkg/vm/testcases/transformations/record_use/positional_both.dart.json.expect +++ b/pkg/vm/testcases/transformations/record_use/lib/positional_both.dart.json.expect @@ -45,7 +45,7 @@ "identifier": { "name": "someStaticMethod", "scope": "SomeClass", - "uri": "positional_both.dart" + "uri": "package:record_use_test/positional_both.dart" }, "loading_unit": "1" } diff --git a/pkg/vm/testcases/transformations/record_use/positional_both_with_type_argument.dart b/pkg/vm/testcases/transformations/record_use/lib/positional_both_with_type_argument.dart similarity index 100% rename from pkg/vm/testcases/transformations/record_use/positional_both_with_type_argument.dart rename to pkg/vm/testcases/transformations/record_use/lib/positional_both_with_type_argument.dart diff --git a/pkg/vm/testcases/transformations/record_use/positional_both_with_type_argument.dart.aot.expect b/pkg/vm/testcases/transformations/record_use/lib/positional_both_with_type_argument.dart.aot.expect similarity index 100% rename from pkg/vm/testcases/transformations/record_use/positional_both_with_type_argument.dart.aot.expect rename to pkg/vm/testcases/transformations/record_use/lib/positional_both_with_type_argument.dart.aot.expect diff --git a/pkg/vm/testcases/transformations/record_use/positional_both_with_type_argument.dart.json.expect b/pkg/vm/testcases/transformations/record_use/lib/positional_both_with_type_argument.dart.json.expect similarity index 91% rename from pkg/vm/testcases/transformations/record_use/positional_both_with_type_argument.dart.json.expect rename to pkg/vm/testcases/transformations/record_use/lib/positional_both_with_type_argument.dart.json.expect index 8f704318811..223718d9496 100644 --- a/pkg/vm/testcases/transformations/record_use/positional_both_with_type_argument.dart.json.expect +++ b/pkg/vm/testcases/transformations/record_use/lib/positional_both_with_type_argument.dart.json.expect @@ -45,7 +45,7 @@ "identifier": { "name": "someStaticMethod", "scope": "SomeClass", - "uri": "positional_both_with_type_argument.dart" + "uri": "package:record_use_test/positional_both_with_type_argument.dart" }, "loading_unit": "1" } diff --git a/pkg/vm/testcases/transformations/record_use/positional_optional.dart b/pkg/vm/testcases/transformations/record_use/lib/positional_optional.dart similarity index 100% rename from pkg/vm/testcases/transformations/record_use/positional_optional.dart rename to pkg/vm/testcases/transformations/record_use/lib/positional_optional.dart diff --git a/pkg/vm/testcases/transformations/record_use/positional_optional.dart.aot.expect b/pkg/vm/testcases/transformations/record_use/lib/positional_optional.dart.aot.expect similarity index 100% rename from pkg/vm/testcases/transformations/record_use/positional_optional.dart.aot.expect rename to pkg/vm/testcases/transformations/record_use/lib/positional_optional.dart.aot.expect diff --git a/pkg/vm/testcases/transformations/record_use/positional_optional.dart.json.expect b/pkg/vm/testcases/transformations/record_use/lib/positional_optional.dart.json.expect similarity index 91% rename from pkg/vm/testcases/transformations/record_use/positional_optional.dart.json.expect rename to pkg/vm/testcases/transformations/record_use/lib/positional_optional.dart.json.expect index a813c27ec66..43c488451e7 100644 --- a/pkg/vm/testcases/transformations/record_use/positional_optional.dart.json.expect +++ b/pkg/vm/testcases/transformations/record_use/lib/positional_optional.dart.json.expect @@ -35,7 +35,7 @@ "identifier": { "name": "someStaticMethod", "scope": "SomeClass", - "uri": "positional_optional.dart" + "uri": "package:record_use_test/positional_optional.dart" }, "loading_unit": "1" } diff --git a/pkg/vm/testcases/transformations/record_use/record_enum.dart b/pkg/vm/testcases/transformations/record_use/lib/record_enum.dart similarity index 100% rename from pkg/vm/testcases/transformations/record_use/record_enum.dart rename to pkg/vm/testcases/transformations/record_use/lib/record_enum.dart diff --git a/pkg/vm/testcases/transformations/record_use/record_enum.dart.aot.expect b/pkg/vm/testcases/transformations/record_use/lib/record_enum.dart.aot.expect similarity index 100% rename from pkg/vm/testcases/transformations/record_use/record_enum.dart.aot.expect rename to pkg/vm/testcases/transformations/record_use/lib/record_enum.dart.aot.expect diff --git a/pkg/vm/testcases/transformations/record_use/record_enum.dart.json.expect b/pkg/vm/testcases/transformations/record_use/lib/record_enum.dart.json.expect similarity index 92% rename from pkg/vm/testcases/transformations/record_use/record_enum.dart.json.expect rename to pkg/vm/testcases/transformations/record_use/lib/record_enum.dart.json.expect index cdafcb08b82..729cf0c0d8b 100644 --- a/pkg/vm/testcases/transformations/record_use/record_enum.dart.json.expect +++ b/pkg/vm/testcases/transformations/record_use/lib/record_enum.dart.json.expect @@ -31,7 +31,7 @@ "definition": { "identifier": { "name": "MyClass", - "uri": "record_enum.dart" + "uri": "package:record_use_test/record_enum.dart" }, "loading_unit": "1" }, diff --git a/pkg/vm/testcases/transformations/record_use/record_instance_constant.dart.aot.expect b/pkg/vm/testcases/transformations/record_use/lib/record_instance_constant.dart.aot.expect similarity index 100% rename from pkg/vm/testcases/transformations/record_use/record_instance_constant.dart.aot.expect rename to pkg/vm/testcases/transformations/record_use/lib/record_instance_constant.dart.aot.expect diff --git a/pkg/vm/testcases/transformations/record_use/record_instance_constant.dart.json.expect b/pkg/vm/testcases/transformations/record_use/lib/record_instance_constant.dart.json.expect similarity index 100% rename from pkg/vm/testcases/transformations/record_use/record_instance_constant.dart.json.expect rename to pkg/vm/testcases/transformations/record_use/lib/record_instance_constant.dart.json.expect diff --git a/pkg/vm/testcases/transformations/record_use/record_instance_constant_empty.dart b/pkg/vm/testcases/transformations/record_use/lib/record_instance_constant_empty.dart similarity index 100% rename from pkg/vm/testcases/transformations/record_use/record_instance_constant_empty.dart rename to pkg/vm/testcases/transformations/record_use/lib/record_instance_constant_empty.dart diff --git a/pkg/vm/testcases/transformations/record_use/record_instance_constant_empty.dart.aot.expect b/pkg/vm/testcases/transformations/record_use/lib/record_instance_constant_empty.dart.aot.expect similarity index 100% rename from pkg/vm/testcases/transformations/record_use/record_instance_constant_empty.dart.aot.expect rename to pkg/vm/testcases/transformations/record_use/lib/record_instance_constant_empty.dart.aot.expect diff --git a/pkg/vm/testcases/transformations/record_use/record_instance_constant_empty.dart.json.expect b/pkg/vm/testcases/transformations/record_use/lib/record_instance_constant_empty.dart.json.expect similarity index 87% rename from pkg/vm/testcases/transformations/record_use/record_instance_constant_empty.dart.json.expect rename to pkg/vm/testcases/transformations/record_use/lib/record_instance_constant_empty.dart.json.expect index 49b2603a739..8b167413947 100644 --- a/pkg/vm/testcases/transformations/record_use/record_instance_constant_empty.dart.json.expect +++ b/pkg/vm/testcases/transformations/record_use/lib/record_instance_constant_empty.dart.json.expect @@ -19,7 +19,7 @@ "definition": { "identifier": { "name": "MyClass", - "uri": "record_instance_constant_empty.dart" + "uri": "package:record_use_test/record_instance_constant_empty.dart" }, "loading_unit": "1" }, diff --git a/pkg/vm/testcases/transformations/record_use/lib/record_use_invalid_location_throws.dart b/pkg/vm/testcases/transformations/record_use/lib/record_use_invalid_location_throws.dart new file mode 100644 index 00000000000..ca68ca6da5a --- /dev/null +++ b/pkg/vm/testcases/transformations/record_use/lib/record_use_invalid_location_throws.dart @@ -0,0 +1,12 @@ +// Copyright (c) 2026, 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:meta/meta.dart' show RecordUse; + +class A { + @RecordUse() + void method() {} +} + +void main() {} diff --git a/pkg/vm/testcases/transformations/record_use/simple.dart b/pkg/vm/testcases/transformations/record_use/lib/simple.dart similarity index 100% rename from pkg/vm/testcases/transformations/record_use/simple.dart rename to pkg/vm/testcases/transformations/record_use/lib/simple.dart diff --git a/pkg/vm/testcases/transformations/record_use/simple.dart.aot.expect b/pkg/vm/testcases/transformations/record_use/lib/simple.dart.aot.expect similarity index 100% rename from pkg/vm/testcases/transformations/record_use/simple.dart.aot.expect rename to pkg/vm/testcases/transformations/record_use/lib/simple.dart.aot.expect diff --git a/pkg/vm/testcases/transformations/record_use/simple.dart.json.expect b/pkg/vm/testcases/transformations/record_use/lib/simple.dart.json.expect similarity index 90% rename from pkg/vm/testcases/transformations/record_use/simple.dart.json.expect rename to pkg/vm/testcases/transformations/record_use/lib/simple.dart.json.expect index c6d7b1da61d..9524233572d 100644 --- a/pkg/vm/testcases/transformations/record_use/simple.dart.json.expect +++ b/pkg/vm/testcases/transformations/record_use/lib/simple.dart.json.expect @@ -24,7 +24,7 @@ "identifier": { "name": "someStaticMethod", "scope": "SomeClass", - "uri": "simple.dart" + "uri": "package:record_use_test/simple.dart" }, "loading_unit": "1" } diff --git a/pkg/vm/testcases/transformations/record_use/tearoff.dart b/pkg/vm/testcases/transformations/record_use/lib/tearoff.dart similarity index 100% rename from pkg/vm/testcases/transformations/record_use/tearoff.dart rename to pkg/vm/testcases/transformations/record_use/lib/tearoff.dart diff --git a/pkg/vm/testcases/transformations/record_use/tearoff.dart.aot.expect b/pkg/vm/testcases/transformations/record_use/lib/tearoff.dart.aot.expect similarity index 100% rename from pkg/vm/testcases/transformations/record_use/tearoff.dart.aot.expect rename to pkg/vm/testcases/transformations/record_use/lib/tearoff.dart.aot.expect diff --git a/pkg/vm/testcases/transformations/record_use/tearoff.dart.json.expect b/pkg/vm/testcases/transformations/record_use/lib/tearoff.dart.json.expect similarity index 88% rename from pkg/vm/testcases/transformations/record_use/tearoff.dart.json.expect rename to pkg/vm/testcases/transformations/record_use/lib/tearoff.dart.json.expect index 1d99d394665..68a7f0545fa 100644 --- a/pkg/vm/testcases/transformations/record_use/tearoff.dart.json.expect +++ b/pkg/vm/testcases/transformations/record_use/lib/tearoff.dart.json.expect @@ -15,7 +15,7 @@ "identifier": { "name": "someStaticMethod", "scope": "SomeClass", - "uri": "tearoff.dart" + "uri": "package:record_use_test/tearoff.dart" }, "loading_unit": "1" } diff --git a/pkg/vm/testcases/transformations/record_use/top_level_method.dart b/pkg/vm/testcases/transformations/record_use/lib/top_level_method.dart similarity index 100% rename from pkg/vm/testcases/transformations/record_use/top_level_method.dart rename to pkg/vm/testcases/transformations/record_use/lib/top_level_method.dart diff --git a/pkg/vm/testcases/transformations/record_use/top_level_method.dart.aot.expect b/pkg/vm/testcases/transformations/record_use/lib/top_level_method.dart.aot.expect similarity index 100% rename from pkg/vm/testcases/transformations/record_use/top_level_method.dart.aot.expect rename to pkg/vm/testcases/transformations/record_use/lib/top_level_method.dart.aot.expect diff --git a/pkg/vm/testcases/transformations/record_use/top_level_method.dart.json.expect b/pkg/vm/testcases/transformations/record_use/lib/top_level_method.dart.json.expect similarity index 88% rename from pkg/vm/testcases/transformations/record_use/top_level_method.dart.json.expect rename to pkg/vm/testcases/transformations/record_use/lib/top_level_method.dart.json.expect index 96a17564f52..52720a706d6 100644 --- a/pkg/vm/testcases/transformations/record_use/top_level_method.dart.json.expect +++ b/pkg/vm/testcases/transformations/record_use/lib/top_level_method.dart.json.expect @@ -23,7 +23,7 @@ "definition": { "identifier": { "name": "someTopLevelMethod", - "uri": "top_level_method.dart" + "uri": "package:record_use_test/top_level_method.dart" }, "loading_unit": "1" } diff --git a/pkg/vm/testcases/transformations/record_use/types_of_arguments.dart b/pkg/vm/testcases/transformations/record_use/lib/types_of_arguments.dart similarity index 100% rename from pkg/vm/testcases/transformations/record_use/types_of_arguments.dart rename to pkg/vm/testcases/transformations/record_use/lib/types_of_arguments.dart diff --git a/pkg/vm/testcases/transformations/record_use/types_of_arguments.dart.aot.expect b/pkg/vm/testcases/transformations/record_use/lib/types_of_arguments.dart.aot.expect similarity index 100% rename from pkg/vm/testcases/transformations/record_use/types_of_arguments.dart.aot.expect rename to pkg/vm/testcases/transformations/record_use/lib/types_of_arguments.dart.aot.expect diff --git a/pkg/vm/testcases/transformations/record_use/types_of_arguments.dart.json.expect b/pkg/vm/testcases/transformations/record_use/lib/types_of_arguments.dart.json.expect similarity index 96% rename from pkg/vm/testcases/transformations/record_use/types_of_arguments.dart.json.expect rename to pkg/vm/testcases/transformations/record_use/lib/types_of_arguments.dart.json.expect index 2117e341b93..4634e22d270 100644 --- a/pkg/vm/testcases/transformations/record_use/types_of_arguments.dart.json.expect +++ b/pkg/vm/testcases/transformations/record_use/lib/types_of_arguments.dart.json.expect @@ -121,7 +121,7 @@ "identifier": { "name": "someStaticMethod", "scope": "SomeClass", - "uri": "types_of_arguments.dart" + "uri": "package:record_use_test/types_of_arguments.dart" }, "loading_unit": "1" } diff --git a/pkg/vm/testcases/transformations/record_use/loading_units_multiple.dart.aot.expect b/pkg/vm/testcases/transformations/record_use/loading_units_multiple.dart.aot.expect deleted file mode 100644 index 7aaabe9a5b8..00000000000 --- a/pkg/vm/testcases/transformations/record_use/loading_units_multiple.dart.aot.expect +++ /dev/null @@ -1,15 +0,0 @@ -library #lib; -import self as self; -import "loading_units_multiple_helper_shared.dart" as loa; -import "loading_units_multiple_helper.dart" as loa2; - -import "org-dartlang-test:///testcases/transformations/record_use/loading_units_multiple_helper_shared.dart"; -import "org-dartlang-test:///testcases/transformations/record_use/loading_units_multiple_helper.dart" deferred as helper; - - -[@vm.inferred-return-type.metadata=dart.async::_Future] -static method main() → void async /* emittedValueType= void */ { - loa::SomeClass::someStaticMethod(42); - await LoadLibrary(helper); - let final dynamic #t1 = CheckLibraryIsLoaded(helper) in loa2::invokeDeferred(); -} diff --git a/pkg/vm/testcases/transformations/record_use/outside_package_throws.dart b/pkg/vm/testcases/transformations/record_use/outside_package_throws.dart new file mode 100644 index 00000000000..cd931af015c --- /dev/null +++ b/pkg/vm/testcases/transformations/record_use/outside_package_throws.dart @@ -0,0 +1,14 @@ +// Copyright (c) 2026, 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:meta/meta.dart' show RecordUse; + +class SomeClass { + @RecordUse() + static String someStaticMethod(int a) => a.toString(); +} + +void main() { + print(SomeClass.someStaticMethod(42)); +} diff --git a/pkg/vm/testcases/transformations/record_use/pubspec.yaml b/pkg/vm/testcases/transformations/record_use/pubspec.yaml new file mode 100644 index 00000000000..1acf38cf829 --- /dev/null +++ b/pkg/vm/testcases/transformations/record_use/pubspec.yaml @@ -0,0 +1,14 @@ +# Copyright (c) 2026, 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. + +name: record_use_test +publish_to: none + +resolution: workspace + +environment: + sdk: ^3.12.0-0 + +dependencies: + meta: any diff --git a/pubspec.yaml b/pubspec.yaml index ed073fbaa82..dac1f74ec68 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -28,6 +28,7 @@ workspace: - pkg/build_integration - pkg/cfg - pkg/compiler + - pkg/compiler/test/record_use/data - pkg/dart2bytecode - pkg/dart2js_info - pkg/dart2js_runtime_metrics @@ -75,6 +76,7 @@ workspace: - pkg/testing - pkg/test_runner - pkg/vm + - pkg/vm/testcases/transformations/record_use - pkg/vm_service - pkg/vm_service_interface - pkg/vm_service_protos