Files
sdk/pkg/dev_compiler/test/sourcemap/sourcemaps_suite.dart
T
Nicholas Shahan 1a0dd104d4 [ddc] Update some sourcemap locations
* Add special handling for String concatenations so the first string
  gets mapped correctly and work better in sound null safety.
* Update variable assignments to more consistently point to helpful
  locations, specifically when lowered from a prefix increment like
  `++x`.
* Run the sourcemap and stacktrace test suites with sound null safety.

Previously these suites were running with unsound null safety so more
operations were wrapped in function calls to check for null. Those calls
allowed for mode step or break points that hid some of the issues
addressed in this change.

Issue: https://github.com/dart-lang/sdk/issues/55692

Change-Id: Ibd887c8da64e72ab84c0698dd49b845abfaedbb8
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/366025
Reviewed-by: Sigmund Cherem <sigmund@google.com>
Commit-Queue: Nicholas Shahan <nshahan@google.com>
2024-05-10 23:49:14 +00:00

112 lines
3.4 KiB
Dart

// Copyright (c) 2017, 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 'dart:io';
import 'package:dev_compiler/src/compiler/shared_command.dart';
import 'package:dev_compiler/src/kernel/command.dart';
import 'package:front_end/src/api_unstable/ddc.dart' as fe;
import 'package:sourcemap_testing/src/stepping_helper.dart';
import 'package:testing/testing.dart';
import 'common.dart';
import 'ddc_common.dart';
Future<ChainContext> createContext(
Chain suite, Map<String, String> environment) async {
return SourceMapContext(environment);
}
class SourceMapContext extends ChainContextWithCleanupHelper
implements WithCompilerState {
final Map<String, String> environment;
@override
fe.InitializedCompilerState? compilerState;
SourceMapContext(this.environment);
List<Step>? _steps;
@override
List<Step> get steps {
return _steps ??= <Step>[
const Setup(),
Compile(DevCompilerRunner(this, debugging: debugging())),
const StepWithD8(),
CheckSteps(debugging()),
];
}
@override
bool debugging() => environment.containsKey('debug');
}
class DevCompilerRunner implements CompilerRunner {
final WithCompilerState context;
final bool debugging;
const DevCompilerRunner(this.context, {this.debugging = false});
@override
Future<Null> run(Uri inputFile, Uri outputFile, Uri outWrapperFile) async {
var outDir = outputFile.resolve('.');
var outputFilename = outputFile.pathSegments.last;
var sdkJsFile = findInOutDir('gen/utils/ddc/stable/sdk/es6/dart_sdk.js');
var jsSdkPath = sdkJsFile.uri;
var ddcSdkSummary = findInOutDir('ddc_outline.dill');
var packageConfigPath =
sdkRoot!.uri.resolve('.dart_tool/package_config.json').toFilePath();
var args = <String>[
'--batch',
'--packages=$packageConfigPath',
'--modules=es6',
'--dart-sdk-summary=${ddcSdkSummary.path}',
'-o',
outputFile.toFilePath(),
inputFile.toFilePath()
];
var succeeded = false;
try {
var result = await compile(ParsedArguments.from(args),
compilerState: context.compilerState);
context.compilerState =
result.compilerState as fe.InitializedCompilerState?;
succeeded = result.success;
} catch (e, s) {
print('Unhandled exception:');
print(e);
print(s);
}
if (!succeeded) {
var ddc = getDdcDir().uri.resolve('bin/dartdevc.dart');
throw 'Error from ddc when executing with something like '
'$dartExecutable ${ddc.toFilePath()} '
"${args.reduce((value, element) => '$value "$element"')}";
}
var jsContent = File.fromUri(outputFile).readAsStringSync();
File.fromUri(outputFile).writeAsStringSync(jsContent.replaceFirst(
"from 'dart_sdk.js'", "from '${uriPathForwardSlashed(jsSdkPath)}'"));
if (debugging) {
createHtmlWrapper(
sdkJsFile, outputFile, jsContent, outputFilename, outDir);
}
var inputPath = inputFile.path;
inputPath = inputPath.substring(0, inputPath.lastIndexOf('.'));
var inputFileNameNoExt = pathToJSIdentifier(inputPath);
File.fromUri(outWrapperFile).writeAsStringSync(
getWrapperContent(jsSdkPath, inputFileNameNoExt, outputFilename));
}
}
void main(List<String> arguments) =>
runMe(arguments, createContext, configurationPath: 'testing.json');