blob: 170221c141ae2126065393d64f40774b89dcac40 [file] [log] [blame]
// 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:core' hide MapEntry;
import 'package:kernel/kernel.dart';
import 'package:kernel/core_types.dart';
import 'package:kernel/class_hierarchy.dart';
import 'package:kernel/target/targets.dart';
/// A kernel [Target] to configure the Dart Front End for dartdevc.
class DevCompilerTarget extends Target {
bool get strongMode => true; // the only correct answer
bool get enableSuperMixins => true;
String get name => 'dartdevc';
List<String> get extraRequiredLibraries => const [
'dart:_runtime',
'dart:_debugger',
'dart:_foreign_helper',
'dart:_interceptors',
'dart:_internal',
'dart:_isolate_helper',
'dart:_js_helper',
'dart:_js_mirrors',
'dart:_js_primitives',
'dart:_metadata',
'dart:_native_typed_data',
'dart:async',
'dart:collection',
'dart:convert',
'dart:developer',
'dart:io',
'dart:isolate',
'dart:js',
'dart:js_util',
'dart:math',
'dart:mirrors',
'dart:typed_data',
'dart:indexed_db',
'dart:html',
'dart:html_common',
'dart:svg',
'dart:web_audio',
'dart:web_gl',
'dart:web_sql'
];
@override
bool mayDefineRestrictedType(Uri uri) =>
uri.scheme == 'dart' &&
(uri.path == 'core' || uri.path == '_interceptors');
@override
bool enableNative(Uri uri) => uri.scheme == 'dart';
@override
bool get nativeExtensionExpectsString => false;
@override
bool get errorOnUnexactWebIntLiterals => true;
@override
bool get enableNoSuchMethodForwarders => true;
@override
void performModularTransformationsOnLibraries(Component component,
CoreTypes coreTypes, ClassHierarchy hierarchy, List<Library> libraries,
{void logger(String msg)}) {}
@override
Expression instantiateInvocation(CoreTypes coreTypes, Expression receiver,
String name, Arguments arguments, int offset, bool isSuper) {
// TODO(jmesserly): preserve source information?
// (These method are synthetic. Also unclear if the offset will correspond
// to the file where the class resides, or the file where the method we're
// mocking resides).
Expression createInvocation(String name, List<Expression> positional) {
// TODO(jmesserly): this uses the implementation _Invocation class,
// because the CFE does not resolve the redirecting factory constructors
// like it would for user code. Our code generator expects all redirecting
// factories to be resolved to the real constructor.
var ctor = coreTypes.index
.getClass('dart:core', '_Invocation')
.constructors
.firstWhere((c) => c.name.name == name);
return ConstructorInvocation(ctor, Arguments(positional));
}
if (name.startsWith('get:')) {
return createInvocation('getter', [SymbolLiteral(name.substring(4))]);
}
if (name.startsWith('set:')) {
return createInvocation('setter', [
SymbolLiteral(name.substring(4) + '='),
arguments.positional.single
]);
}
var ctorArgs = <Expression>[SymbolLiteral(name)];
bool isGeneric = arguments.types.isNotEmpty;
if (isGeneric) {
ctorArgs.add(
ListLiteral(arguments.types.map((t) => TypeLiteral(t)).toList()));
} else {
ctorArgs.add(NullLiteral());
}
ctorArgs.add(ListLiteral(arguments.positional));
if (arguments.named.isNotEmpty) {
ctorArgs.add(MapLiteral(
arguments.named
.map((n) => MapEntry(SymbolLiteral(n.name), n.value))
.toList(),
keyType: coreTypes.symbolClass.rawType));
}
return createInvocation('method', ctorArgs);
}
@override
Expression instantiateNoSuchMethodError(CoreTypes coreTypes,
Expression receiver, String name, Arguments arguments, int offset,
{bool isMethod = false,
bool isGetter = false,
bool isSetter = false,
bool isField = false,
bool isLocalVariable = false,
bool isDynamic = false,
bool isSuper = false,
bool isStatic = false,
bool isConstructor = false,
bool isTopLevel = false}) {
// TODO(sigmund): implement;
return InvalidExpression(null);
}
}