1a0dd104d4
* 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>
112 lines
3.4 KiB
Dart
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');
|