Files
sdk/pkg/dev_compiler/test/memory_compiler.dart
T
Johnni Winther 56a86e599e [cfe,ddc] Add tests for scopes in extensions, extension types and mixins
This adds support using experimental features in id testing in DDC and
uses it to add tests for scopes in extensions, extension types and
mixins.

The tests show that the DartScopeBuilder and DartScopeBuilder2 differ
on the scope on instance members in extensions and extension types for
the synthetic #this variable.

Change-Id: Iec0f3b938da567578b1245ada885370fb2a8b33f
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/335824
Reviewed-by: Jens Johansen <jensj@google.com>
Reviewed-by: Nicholas Shahan <nshahan@google.com>
Commit-Queue: Johnni Winther <johnniwinther@google.com>
2023-11-16 09:37:31 +00:00

81 lines
3.0 KiB
Dart

// Copyright (c) 2023, 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:dev_compiler/dev_compiler.dart';
import 'package:dev_compiler/src/compiler/shared_command.dart';
import 'package:dev_compiler/src/js_ast/js_ast.dart';
import 'package:dev_compiler/src/kernel/command.dart';
import 'package:front_end/src/api_unstable/ddc.dart' as fe;
import 'package:kernel/target/targets.dart';
/// Result compiling using [compileFromMemory].
///
/// This is meant for testing and therefore include not only the resulting
/// [Program] various artifacts of the compilation.
class MemoryCompilerResult {
final fe.DdcResult ddcResult;
final ProgramCompiler compiler;
final Program program;
final List<fe.DiagnosticMessage> errors;
MemoryCompilerResult(
this.ddcResult, this.compiler, this.program, this.errors);
}
/// Uri used as the base uri for files provided in memory through the
/// [MemoryFileSystem].
Uri memoryDirectory = Uri.parse('memory://');
/// Compiles [entryPoint] using the [memoryFiles] as sources.
///
/// [memoryFiles] maps relative paths to their source text. [entryPoint] must
/// be absolute, using [memoryDirectory] as base uri to refer to a file from
/// [memoryFiles].
Future<MemoryCompilerResult> compileFromMemory(
Map<String, String> memoryFiles, Uri entryPoint,
{Map<fe.ExperimentalFlag, bool>? explicitExperimentalFlags}) async {
var errors = <fe.DiagnosticMessage>[];
void diagnosticMessageHandler(fe.DiagnosticMessage message) {
if (message.severity == fe.Severity.error) {
errors.add(message);
}
fe.printDiagnosticMessage(message, print);
}
var memoryFileSystem = fe.MemoryFileSystem(memoryDirectory);
for (var entry in memoryFiles.entries) {
memoryFileSystem
.entityForUri(memoryDirectory.resolve(entry.key))
.writeAsStringSync(entry.value);
}
var options = SharedCompilerOptions(moduleName: 'test');
var compilerState = fe.initializeCompiler(
null,
false,
sourcePathToUri(getSdkPath()),
sourcePathToUri(defaultSdkSummaryPath),
null,
sourcePathToUri(defaultLibrarySpecPath),
[],
DevCompilerTarget(
TargetFlags(trackWidgetCreation: false, soundNullSafety: true)),
fileSystem: fe.HybridFileSystem(memoryFileSystem),
environmentDefines: {},
explicitExperimentalFlags: explicitExperimentalFlags,
nnbdMode: fe.NnbdMode.Strong);
var result =
await fe.compile(compilerState, [entryPoint], diagnosticMessageHandler);
if (result == null) {
throw 'Memory compilation failed';
}
var compiler =
// TODO(nshahan): Do we need to support [importToSummary] and
// [summaryToModule].
ProgramCompiler(result.component, result.classHierarchy, options, {}, {});
var jsModule = compiler.emitModule(result.compiledLibraries);
return MemoryCompilerResult(result, compiler, jsModule, errors);
}