Version 1.23.0-dev.9.0
Merge commit '9a9074bf6b26d6a4202571172270c64ade4b6dc9' into dev
diff --git a/pkg/analysis_server/lib/src/plugin/plugin_locator.dart b/pkg/analysis_server/lib/src/plugin/plugin_locator.dart
index 968ee53..85e3527 100644
--- a/pkg/analysis_server/lib/src/plugin/plugin_locator.dart
+++ b/pkg/analysis_server/lib/src/plugin/plugin_locator.dart
@@ -37,6 +37,8 @@
*/
final ResourceProvider resourceProvider;
+ final Map<String, String> pluginMap = <String, String>{};
+
/**
* Initialize a newly created plugin locator to use the given
* [resourceProvider] to access the file system.
@@ -56,6 +58,13 @@
* returning it.
*/
String findPlugin(String packageRoot) {
+ return pluginMap.putIfAbsent(packageRoot, () => _findPlugin(packageRoot));
+ }
+
+ /**
+ * The implementation of [findPlugin].
+ */
+ String _findPlugin(String packageRoot) {
Folder packageFolder = resourceProvider.getFolder(packageRoot);
File pubspecFile = packageFolder.getChildAssumingFile(pubspecFileName);
if (pubspecFile.exists) {
diff --git a/pkg/analysis_server/lib/src/services/correction/assist.dart b/pkg/analysis_server/lib/src/services/correction/assist.dart
index 3b8ea1c..7158950 100644
--- a/pkg/analysis_server/lib/src/services/correction/assist.dart
+++ b/pkg/analysis_server/lib/src/services/correction/assist.dart
@@ -83,6 +83,8 @@
'CONVERT_DOCUMENTATION_INTO_LINE',
30,
"Convert into line documentation comment");
+ static const CONVERT_FLUTTER_CHILD =
+ const AssistKind('CONVERT_FLUTTER_CHILD', 30, "Convert to children:");
static const CONVERT_INTO_BLOCK_BODY = const AssistKind(
'CONVERT_INTO_BLOCK_BODY', 30, "Convert into block body");
static const CONVERT_INTO_EXPRESSION_BODY = const AssistKind(
@@ -119,10 +121,10 @@
"Join 'if' statement with outer 'if' statement");
static const JOIN_VARIABLE_DECLARATION = const AssistKind(
'JOIN_VARIABLE_DECLARATION', 30, "Join variable declaration");
- static const MOVE_FLUTTER_WIDGET_DOWN = const AssistKind(
- "MOVE_FLUTTER_WIDGET_DOWN", 30, "Move widget down");
- static const MOVE_FLUTTER_WIDGET_UP = const AssistKind(
- "MOVE_FLUTTER_WIDGET_UP", 30, "Move widget up");
+ static const MOVE_FLUTTER_WIDGET_DOWN =
+ const AssistKind("MOVE_FLUTTER_WIDGET_DOWN", 30, "Move widget down");
+ static const MOVE_FLUTTER_WIDGET_UP =
+ const AssistKind("MOVE_FLUTTER_WIDGET_UP", 30, "Move widget up");
static const REPARENT_FLUTTER_LIST = const AssistKind(
"REPARENT_FLUTTER_LIST", 30, "Wrap widget list with new widget");
static const REPARENT_FLUTTER_WIDGET = const AssistKind(
diff --git a/pkg/analysis_server/lib/src/services/correction/assist_internal.dart b/pkg/analysis_server/lib/src/services/correction/assist_internal.dart
index c343b17..18d32b1 100644
--- a/pkg/analysis_server/lib/src/services/correction/assist_internal.dart
+++ b/pkg/analysis_server/lib/src/services/correction/assist_internal.dart
@@ -121,6 +121,7 @@
_addProposal_convertDocumentationIntoLine();
_addProposal_convertToBlockFunctionBody();
_addProposal_convertToExpressionFunctionBody();
+ _addProposal_convertFlutterChild();
_addProposal_convertToForIndexLoop();
_addProposal_convertToIsNot_onIs();
_addProposal_convertToIsNot_onNot();
@@ -505,6 +506,73 @@
_addAssist(DartAssistKind.CONVERT_DOCUMENTATION_INTO_LINE, []);
}
+ void _addProposal_convertFlutterChild() {
+ NamedExpression namedExp;
+ // Allow assist to activate from either the new-expr or the child: arg.
+ if (node is SimpleIdentifier &&
+ node.parent is Label &&
+ node.parent.parent is NamedExpression) {
+ namedExp = node.parent.parent as NamedExpression;
+ if ((node as SimpleIdentifier).name != 'child' ||
+ namedExp.expression == null) {
+ return;
+ }
+ if (namedExp.parent?.parent is! InstanceCreationExpression) {
+ return;
+ }
+ InstanceCreationExpression newExpr = namedExp.parent.parent;
+ if (newExpr == null || !_isFlutterInstanceCreationExpression(newExpr)) {
+ return;
+ }
+ } else {
+ InstanceCreationExpression newExpr = _identifyNewExpression();
+ if (newExpr == null || !_isFlutterInstanceCreationExpression(newExpr)) {
+ _coverageMarker();
+ return;
+ }
+ namedExp = _findChildArgument(newExpr);
+ if (namedExp == null || namedExp.expression == null) {
+ _coverageMarker();
+ return;
+ }
+ }
+ InstanceCreationExpression childArg = _getChildWidget(namedExp, false);
+ if (childArg == null) {
+ _coverageMarker();
+ return;
+ }
+ int childLoc = namedExp.offset + 'child'.length;
+ _addInsertEdit(childLoc, 'ren');
+ int listLoc = childArg.offset;
+ String childArgSrc = utils.getNodeText(childArg);
+ if (!childArgSrc.contains(eol)) {
+ _addInsertEdit(listLoc, '<Widget>[');
+ _addInsertEdit(listLoc + childArg.length, ']');
+ } else {
+ int newlineLoc = childArgSrc.lastIndexOf(eol);
+ if (newlineLoc == childArgSrc.length) {
+ newlineLoc -= 1;
+ }
+ String indentOld = utils.getLinePrefix(childArg.offset + 1 + newlineLoc);
+ String indentNew = '$indentOld${utils.getIndent(1)}';
+ // The separator includes 'child:' but that has no newlines.
+ String separator =
+ utils.getText(namedExp.offset, childArg.offset - namedExp.offset);
+ String prefix = separator.contains(eol) ? "" : "$eol$indentNew";
+ if (prefix.isEmpty) {
+ _addInsertEdit(namedExp.offset + 'child:'.length, ' <Widget>[');
+ _addRemoveEdit(rangeStartLength(childArg.offset - 2, 2));
+ } else {
+ _addInsertEdit(listLoc, '<Widget>[');
+ }
+ String newChildArgSrc = childArgSrc.replaceAll(
+ new RegExp("^$indentOld", multiLine: true), "$indentNew");
+ newChildArgSrc = "$prefix$newChildArgSrc,$eol$indentOld]";
+ _addReplaceEdit(rangeNode(childArg), newChildArgSrc);
+ }
+ _addAssist(DartAssistKind.CONVERT_FLUTTER_CHILD, []);
+ }
+
void _addProposal_convertIntoFinalField() {
// Find the enclosing getter.
MethodDeclaration getter;
@@ -2311,11 +2379,12 @@
return _getChildWidget(child);
}
- InstanceCreationExpression _getChildWidget(NamedExpression child) {
+ InstanceCreationExpression _getChildWidget(NamedExpression child,
+ [bool strict = false]) {
if (child?.expression is InstanceCreationExpression) {
InstanceCreationExpression childNewExpr = child.expression;
if (_isFlutterInstanceCreationExpression(childNewExpr)) {
- if (_findChildArgument(childNewExpr) != null) {
+ if (!strict || (_findChildArgument(childNewExpr) != null)) {
return childNewExpr;
}
}
diff --git a/pkg/analysis_server/test/services/correction/assist_test.dart b/pkg/analysis_server/test/services/correction/assist_test.dart
index b52c25d..29b3920 100644
--- a/pkg/analysis_server/test/services/correction/assist_test.dart
+++ b/pkg/analysis_server/test/services/correction/assist_test.dart
@@ -1036,6 +1036,129 @@
''');
}
+ test_convertFlutterChild_OK_multiLine() async {
+ _configureFlutterPkg({
+ 'src/widgets/framework.dart': _flutter_framework_code,
+ });
+ await resolveTestUnit('''
+import 'package:flutter/src/widgets/framework.dart';
+build() {
+ return new Scaffold(
+// start
+ body: new Center(
+ /*caret*/child: new Container(
+ width: 200.0,
+ height: 300.0,
+ ),
+ key: null,
+ ),
+// end
+ );
+}
+''');
+ _setCaretLocation();
+ await assertHasAssist(
+ DartAssistKind.CONVERT_FLUTTER_CHILD,
+ '''
+import 'package:flutter/src/widgets/framework.dart';
+build() {
+ return new Scaffold(
+// start
+ body: new Center(
+ /*caret*/children: <Widget>[
+ new Container(
+ width: 200.0,
+ height: 300.0,
+ ),
+ ],
+ key: null,
+ ),
+// end
+ );
+}
+''');
+ }
+
+ test_convertFlutterChild_OK_newlineChild() async {
+ // This case could occur with deeply nested constructors, common in Flutter.
+ _configureFlutterPkg({
+ 'src/widgets/framework.dart': _flutter_framework_code,
+ });
+ await resolveTestUnit('''
+import 'package:flutter/src/widgets/framework.dart';
+build() {
+ return new Scaffold(
+// start
+ body: new Center(
+ /*caret*/child:
+ new Container(
+ width: 200.0,
+ height: 300.0,
+ ),
+ key: null,
+ ),
+// end
+ );
+}
+''');
+ _setCaretLocation();
+ await assertHasAssist(
+ DartAssistKind.CONVERT_FLUTTER_CHILD,
+ '''
+import 'package:flutter/src/widgets/framework.dart';
+build() {
+ return new Scaffold(
+// start
+ body: new Center(
+ /*caret*/children: <Widget>[
+ new Container(
+ width: 200.0,
+ height: 300.0,
+ ),
+ ],
+ key: null,
+ ),
+// end
+ );
+}
+''');
+ }
+
+ test_convertFlutterChild_OK_singleLine() async {
+ _configureFlutterPkg({
+ 'src/widgets/framework.dart': _flutter_framework_code,
+ });
+ await resolveTestUnit('''
+import 'package:flutter/src/widgets/framework.dart';
+build() {
+ return new Scaffold(
+// start
+ body: new Center(
+ /*caret*/child: new GestureDetector(),
+ key: null,
+ ),
+// end
+ );
+}
+''');
+ _setCaretLocation();
+ await assertHasAssist(
+ DartAssistKind.CONVERT_FLUTTER_CHILD,
+ '''
+import 'package:flutter/src/widgets/framework.dart';
+build() {
+ return new Scaffold(
+// start
+ body: new Center(
+ /*caret*/children: <Widget>[new GestureDetector()],
+ key: null,
+ ),
+// end
+ );
+}
+''');
+ }
+
test_convertToBlockBody_BAD_noEnclosingFunction() async {
await resolveTestUnit('''
var v = 123;
@@ -3502,6 +3625,104 @@
''');
}
+ test_moveFlutterWidgetDown_OK() async {
+ _configureFlutterPkg({
+ 'src/widgets/framework.dart': _flutter_framework_code,
+ });
+ await resolveTestUnit('''
+import 'package:flutter/src/widgets/framework.dart';
+build() {
+ return new Scaffold(
+// start
+ body: new /*caret*/GestureDetector(
+ onTap: () => startResize(),
+ child: new Center(
+ child: new Container(
+ width: 200.0,
+ height: 300.0,
+ ),
+ key: null,
+ ),
+ ),
+// end
+ );
+}
+startResize() {}
+''');
+ _setCaretLocation();
+ await assertHasAssist(
+ DartAssistKind.MOVE_FLUTTER_WIDGET_DOWN,
+ '''
+import 'package:flutter/src/widgets/framework.dart';
+build() {
+ return new Scaffold(
+// start
+ body: new Center(
+ child: new /*caret*/GestureDetector(
+ onTap: () => startResize(),
+ child: new Container(
+ width: 200.0,
+ height: 300.0,
+ ),
+ ),
+ key: null,
+ ),
+// end
+ );
+}
+startResize() {}
+''');
+ }
+
+ test_moveFlutterWidgetUp_OK() async {
+ _configureFlutterPkg({
+ 'src/widgets/framework.dart': _flutter_framework_code,
+ });
+ await resolveTestUnit('''
+import 'package:flutter/src/widgets/framework.dart';
+build() {
+ return new Scaffold(
+// start
+ body: new Center(
+ child: new /*caret*/GestureDetector(
+ onTap: () => startResize(),
+ child: new Container(
+ width: 200.0,
+ height: 300.0,
+ ),
+ ),
+ key: null,
+ ),
+// end
+ );
+}
+startResize() {}
+''');
+ _setCaretLocation();
+ await assertHasAssist(
+ DartAssistKind.MOVE_FLUTTER_WIDGET_UP,
+ '''
+import 'package:flutter/src/widgets/framework.dart';
+build() {
+ return new Scaffold(
+// start
+ body: new /*caret*/GestureDetector(
+ onTap: () => startResize(),
+ child: new Center(
+ child: new Container(
+ width: 200.0,
+ height: 300.0,
+ ),
+ key: null,
+ ),
+ ),
+// end
+ );
+}
+startResize() {}
+''');
+ }
+
test_removeTypeAnnotation_classField_OK() async {
await resolveTestUnit('''
class A {
@@ -3666,104 +3887,6 @@
await assertNoAssist(DartAssistKind.REPARENT_FLUTTER_LIST);
}
- test_moveFlutterWidgetDown_OK() async {
- _configureFlutterPkg({
- 'src/widgets/framework.dart': _flutter_framework_code,
- });
- await resolveTestUnit('''
-import 'package:flutter/src/widgets/framework.dart';
-build() {
- return new Scaffold(
-// start
- body: new /*caret*/GestureDetector(
- onTap: () => startResize(),
- child: new Center(
- child: new Container(
- width: 200.0,
- height: 300.0,
- ),
- key: null,
- ),
- ),
-// end
- );
-}
-startResize() {}
-''');
- _setCaretLocation();
- await assertHasAssist(
- DartAssistKind.MOVE_FLUTTER_WIDGET_DOWN,
- '''
-import 'package:flutter/src/widgets/framework.dart';
-build() {
- return new Scaffold(
-// start
- body: new Center(
- child: new /*caret*/GestureDetector(
- onTap: () => startResize(),
- child: new Container(
- width: 200.0,
- height: 300.0,
- ),
- ),
- key: null,
- ),
-// end
- );
-}
-startResize() {}
-''');
- }
-
- test_moveFlutterWidgetUp_OK() async {
- _configureFlutterPkg({
- 'src/widgets/framework.dart': _flutter_framework_code,
- });
- await resolveTestUnit('''
-import 'package:flutter/src/widgets/framework.dart';
-build() {
- return new Scaffold(
-// start
- body: new Center(
- child: new /*caret*/GestureDetector(
- onTap: () => startResize(),
- child: new Container(
- width: 200.0,
- height: 300.0,
- ),
- ),
- key: null,
- ),
-// end
- );
-}
-startResize() {}
-''');
- _setCaretLocation();
- await assertHasAssist(
- DartAssistKind.MOVE_FLUTTER_WIDGET_UP,
- '''
-import 'package:flutter/src/widgets/framework.dart';
-build() {
- return new Scaffold(
-// start
- body: new /*caret*/GestureDetector(
- onTap: () => startResize(),
- child: new Center(
- child: new Container(
- width: 200.0,
- height: 300.0,
- ),
- key: null,
- ),
- ),
-// end
- );
-}
-startResize() {}
-''');
- }
-
test_reparentFlutterList_OK_multiLine() async {
_configureFlutterPkg({
'src/widgets/framework.dart': _flutter_framework_code,
diff --git a/pkg/compiler/lib/src/closure.dart b/pkg/compiler/lib/src/closure.dart
index 9d7dc74..95962b6 100644
--- a/pkg/compiler/lib/src/closure.dart
+++ b/pkg/compiler/lib/src/closure.dart
@@ -1081,7 +1081,7 @@
closedWorldRefiner.registerClosureClass(globalizedElement);
MethodElement callElement = new SynthesizedCallMethodElementX(
Identifiers.call, element, globalizedElement, node, elements);
- backend.mirrorsData.maybeMarkClosureAsNeededForReflection(
+ backend.mirrorsDataBuilder.maybeMarkClosureAsNeededForReflection(
globalizedElement, callElement, element);
MemberElement enclosing = element.memberContext;
enclosing.nestedClosures.add(callElement);
diff --git a/pkg/compiler/lib/src/js_backend/backend.dart b/pkg/compiler/lib/src/js_backend/backend.dart
index 372938b..7a6b935 100644
--- a/pkg/compiler/lib/src/js_backend/backend.dart
+++ b/pkg/compiler/lib/src/js_backend/backend.dart
@@ -380,10 +380,10 @@
bool htmlLibraryIsLoaded = false;
/// Resolution analysis for tracking reflective access to type variables.
- TypeVariableResolutionAnalysis typeVariableResolutionAnalysis;
+ TypeVariableResolutionAnalysis _typeVariableResolutionAnalysis;
/// Codegen handler for reflective access to type variables.
- TypeVariableCodegenAnalysis typeVariableCodegenAnalysis;
+ TypeVariableCodegenAnalysis _typeVariableCodegenAnalysis;
/// Resolution support for generating table of interceptors and
/// constructors for custom elements.
@@ -440,7 +440,7 @@
OneShotInterceptorData _oneShotInterceptorData;
BackendUsage _backendUsage;
BackendUsageBuilder _backendUsageBuilder;
- MirrorsData mirrorsData;
+ MirrorsDataImpl _mirrorsData;
CheckedModeHelpers _checkedModeHelpers;
native.NativeResolutionEnqueuer _nativeResolutionEnqueuer;
@@ -504,7 +504,7 @@
impacts = new BackendImpacts(compiler.options, commonElements, helpers);
backendClasses = new JavaScriptBackendClasses(
compiler.elementEnvironment, helpers, nativeBaseData);
- mirrorsData = new MirrorsData(
+ _mirrorsData = new MirrorsDataImpl(
compiler, compiler.options, commonElements, helpers, constants);
_backendUsageBuilder = new BackendUsageBuilderImpl(
compiler.elementEnvironment, commonElements, helpers);
@@ -515,10 +515,8 @@
_nativeCodegenEnqueuer = new native.NativeCodegenEnqueuer(
compiler, emitter, _nativeResolutionEnqueuer);
- typeVariableResolutionAnalysis = new TypeVariableResolutionAnalysis(
+ _typeVariableResolutionAnalysis = new TypeVariableResolutionAnalysis(
compiler.elementEnvironment, impacts, backendUsageBuilder);
- typeVariableCodegenAnalysis =
- new TypeVariableCodegenAnalysis(this, helpers, mirrorsData);
customElementsResolutionAnalysis = new CustomElementsResolutionAnalysis(
compiler.resolution,
constantSystem,
@@ -550,7 +548,7 @@
nativeBaseData,
nativeResolutionEnqueuer,
backendUsageBuilder,
- mirrorsData,
+ mirrorsDataBuilder,
customElementsResolutionAnalysis,
rtiNeedBuilder);
patchResolverTask = new PatchResolverTask(compiler);
@@ -574,6 +572,24 @@
Target get target => _target;
+ /// Resolution analysis for tracking reflective access to type variables.
+ TypeVariableResolutionAnalysis get typeVariableResolutionAnalysis {
+ assert(invariant(NO_LOCATION_SPANNABLE, _typeVariableCodegenAnalysis == null,
+ message: "TypeVariableHandler has already been created."));
+ return _typeVariableResolutionAnalysis;
+ }
+
+ /// Codegen handler for reflective access to type variables.
+ TypeVariableCodegenAnalysis get typeVariableCodegenAnalysis {
+ assert(invariant(NO_LOCATION_SPANNABLE, _typeVariableCodegenAnalysis != null,
+ message: "TypeVariableHandler has not been created yet."));
+ return _typeVariableCodegenAnalysis;
+ }
+
+ MirrorsData get mirrorsData => _mirrorsData;
+
+ MirrorsDataBuilder get mirrorsDataBuilder => _mirrorsData;
+
/// Codegen support for tree-shaking entries of `LookupMap`.
LookupMapAnalysis get lookupMapAnalysis {
assert(invariant(NO_LOCATION_SPANNABLE, _lookupMapAnalysis != null,
@@ -782,7 +798,7 @@
for (Entity entity in compiler.enqueuer.resolution.processedEntities) {
processAnnotations(entity, closedWorldRefiner);
}
- mirrorsData.computeMembersNeededForReflection(
+ mirrorsDataBuilder.computeMembersNeededForReflection(
compiler.enqueuer.resolution.worldBuilder, closedWorld);
_backendUsage = _backendUsageBuilder.close();
_rtiNeed = rtiNeedBuilder.computeRuntimeTypesNeed(
@@ -875,7 +891,7 @@
_interceptorDataBuilder,
_backendUsageBuilder,
_rtiNeedBuilder,
- mirrorsData,
+ mirrorsDataBuilder,
noSuchMethodRegistry,
customElementsResolutionAnalysis,
lookupMapResolutionAnalysis,
@@ -890,6 +906,7 @@
/// Creates an [Enqueuer] for code generation specific to this backend.
CodegenEnqueuer createCodegenEnqueuer(
CompilerTask task, Compiler compiler, ClosedWorld closedWorld) {
+ _typeVariableCodegenAnalysis = new TypeVariableCodegenAnalysis(this, helpers, mirrorsData);
_lookupMapAnalysis = new LookupMapAnalysis(
reporter,
constantSystem,
@@ -914,7 +931,6 @@
backendClasses,
backendUsage,
rtiNeed,
- mirrorsData,
customElementsCodegenAnalysis,
typeVariableCodegenAnalysis,
lookupMapAnalysis,
@@ -1192,7 +1208,6 @@
rtiNeed,
nativeCodegenEnqueuer,
namer,
- mirrorsData,
oneShotInterceptorData,
lookupMapAnalysis,
rtiChecksBuilder);
diff --git a/pkg/compiler/lib/src/js_backend/codegen_listener.dart b/pkg/compiler/lib/src/js_backend/codegen_listener.dart
index 81e8cd3..d867b23 100644
--- a/pkg/compiler/lib/src/js_backend/codegen_listener.dart
+++ b/pkg/compiler/lib/src/js_backend/codegen_listener.dart
@@ -39,7 +39,6 @@
final BackendUsage _backendUsage;
final RuntimeTypesNeed _rtiNeed;
- final MirrorsData _mirrorsData;
final CustomElementsCodegenAnalysis _customElementsAnalysis;
final TypeVariableCodegenAnalysis _typeVariableCodegenAnalysis;
@@ -58,7 +57,6 @@
this._backendClasses,
this._backendUsage,
this._rtiNeed,
- this._mirrorsData,
this._customElementsAnalysis,
this._typeVariableCodegenAnalysis,
this._lookupMapAnalysis,
@@ -251,7 +249,6 @@
@override
WorldImpact registerUsedElement(MemberElement member) {
WorldImpactBuilderImpl worldImpact = new WorldImpactBuilderImpl();
- _mirrorsData.registerUsedMember(member);
_customElementsAnalysis.registerStaticUse(member);
if (member.isFunction && member.isInstanceMember) {
diff --git a/pkg/compiler/lib/src/js_backend/impact_transformer.dart b/pkg/compiler/lib/src/js_backend/impact_transformer.dart
index e4ad53e..f244be1 100644
--- a/pkg/compiler/lib/src/js_backend/impact_transformer.dart
+++ b/pkg/compiler/lib/src/js_backend/impact_transformer.dart
@@ -44,7 +44,7 @@
final NativeBasicData _nativeBaseData;
final NativeResolutionEnqueuer _nativeResolutionEnqueuer;
final BackendUsageBuilder _backendUsageBuider;
- final MirrorsData _mirrorsData;
+ final MirrorsDataBuilder _mirrorsDataBuilder;
final CustomElementsResolutionAnalysis _customElementsResolutionAnalysis;
final RuntimeTypesNeedBuilder _rtiNeedBuilder;
@@ -57,7 +57,7 @@
this._nativeBaseData,
this._nativeResolutionEnqueuer,
this._backendUsageBuider,
- this._mirrorsData,
+ this._mirrorsDataBuilder,
this._customElementsResolutionAnalysis,
this._rtiNeedBuilder);
@@ -226,7 +226,7 @@
if (worldImpact.constSymbolNames.isNotEmpty) {
registerImpact(_impacts.constSymbol);
for (String constSymbolName in worldImpact.constSymbolNames) {
- _mirrorsData.registerConstSymbol(constSymbolName);
+ _mirrorsDataBuilder.registerConstSymbol(constSymbolName);
}
}
@@ -344,7 +344,6 @@
final RuntimeTypesNeed _rtiNeed;
final NativeCodegenEnqueuer _nativeCodegenEnqueuer;
final Namer _namer;
- final MirrorsData _mirrorsData;
final OneShotInterceptorData _oneShotInterceptorData;
final LookupMapAnalysis _lookupMapAnalysis;
final RuntimeTypesChecksBuilder _rtiChecksBuilder;
@@ -360,7 +359,6 @@
this._rtiNeed,
this._nativeCodegenEnqueuer,
this._namer,
- this._mirrorsData,
this._oneShotInterceptorData,
this._lookupMapAnalysis,
this._rtiChecksBuilder);
@@ -444,10 +442,6 @@
}
}
- for (String name in impact.constSymbols) {
- _mirrorsData.registerConstSymbol(name);
- }
-
for (Set<ClassElement> classes in impact.specializedGetInterceptors) {
_oneShotInterceptorData.registerSpecializedGetInterceptor(
classes, _namer);
diff --git a/pkg/compiler/lib/src/js_backend/mirrors_data.dart b/pkg/compiler/lib/src/js_backend/mirrors_data.dart
index ffe5997..97d348c 100644
--- a/pkg/compiler/lib/src/js_backend/mirrors_data.dart
+++ b/pkg/compiler/lib/src/js_backend/mirrors_data.dart
@@ -16,7 +16,104 @@
import 'backend_helpers.dart';
import 'constant_handler_javascript.dart';
-class MirrorsData {
+abstract class MirrorsData {
+ /// True if a call to preserveMetadataMarker has been seen. This means that
+ /// metadata must be retained for dart:mirrors to work correctly.
+ // resolution-empty-queue
+ bool get mustRetainMetadata;
+
+ /// True if any metadata has been retained. This is slightly different from
+ /// [mustRetainMetadata] and tells us if any metadata was retained. For
+ /// example, if [mustRetainMetadata] is true but there is no metadata in the
+ /// program, this variable will stil be false.
+ // emitter
+ bool get hasRetainedMetadata;
+
+ /// True if a call to preserveLibraryNames has been seen.
+ // emitter
+ bool get mustRetainLibraryNames;
+
+ /// True if a call to preserveNames has been seen.
+ // resolution-empty-queue
+ bool get mustPreserveNames;
+
+ /// True if a call to disableTreeShaking has been seen.
+ bool get isTreeShakingDisabled;
+
+ /// True if a call to preserveUris has been seen and the preserve-uris flag
+ /// is set.
+ bool get mustPreserveUris;
+
+ /// Set of symbols that the user has requested for reflection.
+ Iterable<String> get symbolsUsed;
+
+ /// Set of elements that the user has requested for reflection.
+ Iterable<Element> get targetsUsed;
+
+ /// Should [element] (a getter) that would normally not be generated due to
+ /// treeshaking be retained for reflection?
+ bool shouldRetainGetter(Element element);
+
+ /// Should [element] (a setter) hat would normally not be generated due to
+ /// treeshaking be retained for reflection?
+ bool shouldRetainSetter(Element element);
+
+ /// Should [name] be retained for reflection?
+ bool shouldRetainName(String name);
+
+ /// Returns true if this element is covered by a mirrorsUsed annotation.
+ ///
+ /// Note that it might still be ok to tree shake the element away if no
+ /// reflection is used in the program (and thus [isTreeShakingDisabled] is
+ /// still false). Therefore _do not_ use this predicate to decide inclusion
+ /// in the tree, use [requiredByMirrorSystem] instead.
+ bool referencedFromMirrorSystem(Element element, [recursive = true]);
+
+ /// Returns `true` if [element] can be accessed through reflection, that is,
+ /// is in the set of elements covered by a `MirrorsUsed` annotation.
+ ///
+ /// This property is used to tag emitted elements with a marker which is
+ /// checked by the runtime system to throw an exception if an element is
+ /// accessed (invoked, get, set) that is not accessible for the reflective
+ /// system.
+ bool isAccessibleByReflection(Element element);
+
+ bool retainMetadataOf(Element element);
+
+ bool invokedReflectively(Element element);
+
+ /// Returns `true` if this member element needs reflection information at
+ /// runtime.
+ bool isMemberAccessibleByReflection(MemberElement element);
+
+ /// Returns true if this element has to be enqueued due to
+ /// mirror usage. Might be a subset of [referencedFromMirrorSystem] if
+ /// normal tree shaking is still active ([isTreeShakingDisabled] is false).
+ bool requiredByMirrorSystem(Element element);
+}
+
+abstract class MirrorsDataBuilder {
+ void registerUsedMember(MemberElement member);
+
+ /// Called by [MirrorUsageAnalyzerTask] after it has merged all @MirrorsUsed
+ /// annotations. The arguments corresponds to the unions of the corresponding
+ /// fields of the annotations.
+ void registerMirrorUsage(
+ Set<String> symbols, Set<Element> targets, Set<Element> metaTargets);
+
+ /// Called when `const Symbol(name)` is seen.
+ void registerConstSymbol(String name);
+
+ void maybeMarkClosureAsNeededForReflection(
+ ClosureClassElement globalizedElement,
+ FunctionElement callFunction,
+ FunctionElement function);
+
+ void computeMembersNeededForReflection(
+ ResolutionWorldBuilder worldBuilder, ClosedWorld closedWorld);
+}
+
+class MirrorsDataImpl implements MirrorsData, MirrorsDataBuilder {
/// True if a call to preserveMetadataMarker has been seen. This means that
/// metadata must be retained for dart:mirrors to work correctly.
bool mustRetainMetadata = false;
@@ -43,10 +140,10 @@
/// is set.
bool mustPreserveUris = false;
- /// List of symbols that the user has requested for reflection.
+ /// Set of symbols that the user has requested for reflection.
final Set<String> symbolsUsed = new Set<String>();
- /// List of elements that the user has requested for reflection.
+ /// Set of elements that the user has requested for reflection.
final Set<Element> targetsUsed = new Set<Element>();
/// List of annotations provided by user that indicate that the annotated
@@ -64,7 +161,7 @@
final JavaScriptConstantCompiler _constants;
- MirrorsData(this._compiler, this._options, this._commonElements,
+ MirrorsDataImpl(this._compiler, this._options, this._commonElements,
this._helpers, this._constants);
void registerUsedMember(MemberElement member) {
@@ -164,15 +261,13 @@
if (metaTargets != null) metaTargetsUsed.addAll(metaTargets);
}
- /**
- * Returns `true` if [element] can be accessed through reflection, that is,
- * is in the set of elements covered by a `MirrorsUsed` annotation.
- *
- * This property is used to tag emitted elements with a marker which is
- * checked by the runtime system to throw an exception if an element is
- * accessed (invoked, get, set) that is not accessible for the reflective
- * system.
- */
+ /// Returns `true` if [element] can be accessed through reflection, that is,
+ /// is in the set of elements covered by a `MirrorsUsed` annotation.
+ ///
+ /// This property is used to tag emitted elements with a marker which is
+ /// checked by the runtime system to throw an exception if an element is
+ /// accessed (invoked, get, set) that is not accessible for the reflective
+ /// system.
bool isAccessibleByReflection(Element element) {
if (element.isClass) {
element = _getDartClass(element);
@@ -410,7 +505,7 @@
_membersNeededForReflection.add(globalizedElement);
}
- /// Called when [:const Symbol(name):] is seen.
+ /// Called when `const Symbol(name)` is seen.
void registerConstSymbol(String name) {
symbolsUsed.add(name);
if (name.endsWith('=')) {
diff --git a/pkg/compiler/lib/src/js_backend/resolution_listener.dart b/pkg/compiler/lib/src/js_backend/resolution_listener.dart
index 31d6cee..52f1881 100644
--- a/pkg/compiler/lib/src/js_backend/resolution_listener.dart
+++ b/pkg/compiler/lib/src/js_backend/resolution_listener.dart
@@ -48,7 +48,7 @@
final InterceptorDataBuilder _interceptorData;
final BackendUsageBuilder _backendUsage;
final RuntimeTypesNeedBuilder _rtiNeedBuilder;
- final MirrorsData _mirrorsData;
+ final MirrorsDataBuilder _mirrorsDataBuilder;
final NoSuchMethodRegistry _noSuchMethodRegistry;
final CustomElementsResolutionAnalysis _customElementsAnalysis;
@@ -73,7 +73,7 @@
this._interceptorData,
this._backendUsage,
this._rtiNeedBuilder,
- this._mirrorsData,
+ this._mirrorsDataBuilder,
this._noSuchMethodRegistry,
this._customElementsAnalysis,
this._lookupMapResolutionAnalysis,
@@ -286,7 +286,7 @@
@override
WorldImpact registerUsedElement(MemberElement member) {
WorldImpactBuilderImpl worldImpact = new WorldImpactBuilderImpl();
- _mirrorsData.registerUsedMember(member);
+ _mirrorsDataBuilder.registerUsedMember(member);
_customElementsAnalysis.registerStaticUse(member);
if (member.isFunction && member.isInstanceMember) {
diff --git a/pkg/compiler/lib/src/mirrors_used.dart b/pkg/compiler/lib/src/mirrors_used.dart
index 8414a54..7ddd29a 100644
--- a/pkg/compiler/lib/src/mirrors_used.dart
+++ b/pkg/compiler/lib/src/mirrors_used.dart
@@ -99,7 +99,7 @@
List<String> symbols = analyzer.mergedMirrorUsage.symbols;
List<Element> targets = analyzer.mergedMirrorUsage.targets;
List<Element> metaTargets = analyzer.mergedMirrorUsage.metaTargets;
- compiler.backend.mirrorsData.registerMirrorUsage(
+ compiler.backend.mirrorsDataBuilder.registerMirrorUsage(
symbols == null ? null : new Set<String>.from(symbols),
targets == null ? null : new Set<Element>.from(targets),
metaTargets == null ? null : new Set<Element>.from(metaTargets));
diff --git a/pkg/compiler/lib/src/parser/element_listener.dart b/pkg/compiler/lib/src/parser/element_listener.dart
index 5c1a5e7..55e7e25 100644
--- a/pkg/compiler/lib/src/parser/element_listener.dart
+++ b/pkg/compiler/lib/src/parser/element_listener.dart
@@ -731,6 +731,16 @@
case ErrorKind.Unspecified:
errorCode = MessageKind.GENERIC;
break;
+
+ case ErrorKind.BuiltInIdentifierAsType:
+ errorCode = MessageKind.GENERIC;
+ arguments = {"text": "Can't use '${token.lexeme}' as a type."};
+ break;
+
+ case ErrorKind.BuiltInIdentifierInDeclaration:
+ errorCode = MessageKind.GENERIC;
+ arguments = {"text": "Can't use '${token.lexeme}' as a name here."};
+ break;
}
SourceSpan span = reporter.spanFromToken(token);
reportError(span, errorCode, arguments);
diff --git a/pkg/front_end/lib/src/fasta/colors.dart b/pkg/front_end/lib/src/fasta/colors.dart
index 6f3214d..753da3d 100644
--- a/pkg/front_end/lib/src/fasta/colors.dart
+++ b/pkg/front_end/lib/src/fasta/colors.dart
@@ -98,9 +98,16 @@
/// Note: do not call this method directly, as it is expensive to
/// compute. Instead, use [CompilerContext.enableColors].
bool computeEnableColors(CompilerContext context) {
- if (Platform.isWindows) {
+ bool ansiSupported;
+ try {
+ ansiSupported = Platform.ansiSupported;
+ } on NoSuchMethodError catch (e) {
+ // Ignored: We're running on an older version of the Dart VM which doesn't
+ // implement `ansiSupported`.
+ }
+ if (ansiSupported == false) {
if (context.options.verbose) {
- print("Not enabling colors, running on Windows.");
+ print("Not enabling colors, 'Platform.ansiSupported' is false.");
}
return false;
}
@@ -119,6 +126,16 @@
return false;
}
+ if (ansiSupported == true && Platform.isWindows) {
+ if (context.options.verbose) {
+ print("Enabling colors as OS is Windows.");
+ }
+ return true;
+ }
+
+ // We have to check if the terminal actually supports colors. Currently,
+ // `Platform.ansiSupported` is hard-coded to true on non-Windows platforms.
+
// The `-S` option of `tput` allows us to query multiple capabilities at
// once.
ProcessResult result = Process.runSync(
diff --git a/pkg/front_end/lib/src/fasta/kernel/body_builder.dart b/pkg/front_end/lib/src/fasta/kernel/body_builder.dart
index 87d342a..d9156ba 100644
--- a/pkg/front_end/lib/src/fasta/kernel/body_builder.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/body_builder.dart
@@ -818,18 +818,26 @@
Token last = parts.last;
Quote quote = analyzeQuote(first.lexeme);
List<Expression> expressions = <Expression>[];
- expressions
+ // Contains more than just \' or \".
+ if (first.lexeme.length > 1) {
+ expressions
.add(new StringLiteral(unescapeFirstStringPart(first.lexeme, quote)));
+ }
for (int i = 1; i < parts.length - 1; i++) {
var part = parts[i];
if (part is Token) {
- expressions.add(new StringLiteral(unescape(part.lexeme, quote)));
+ if (part.lexeme.length != 0) {
+ expressions.add(new StringLiteral(unescape(part.lexeme, quote)));
+ }
} else {
expressions.add(toValue(part));
}
}
- expressions
+ // Contains more than just \' or \".
+ if (last.lexeme.length > 1) {
+ expressions
.add(new StringLiteral(unescapeLastStringPart(last.lexeme, quote)));
+ }
push(new StringConcatenation(expressions)
..fileOffset = endToken.charOffset);
}
diff --git a/pkg/front_end/lib/src/fasta/parser/error_kind.dart b/pkg/front_end/lib/src/fasta/parser/error_kind.dart
index 1dc8ef4..1c98c55 100644
--- a/pkg/front_end/lib/src/fasta/parser/error_kind.dart
+++ b/pkg/front_end/lib/src/fasta/parser/error_kind.dart
@@ -7,6 +7,8 @@
/// Kinds of error codes.
enum ErrorKind {
AsciiControlCharacter,
+ BuiltInIdentifierAsType,
+ BuiltInIdentifierInDeclaration,
EmptyNamedParameterList,
EmptyOptionalParameterList,
Encoding,
diff --git a/pkg/front_end/lib/src/fasta/parser/identifier_context.dart b/pkg/front_end/lib/src/fasta/parser/identifier_context.dart
index 6b72d0f..17d04f4 100644
--- a/pkg/front_end/lib/src/fasta/parser/identifier_context.dart
+++ b/pkg/front_end/lib/src/fasta/parser/identifier_context.dart
@@ -11,8 +11,10 @@
class IdentifierContext {
/// Identifier is being declared as the name of an import prefix (i.e. `Foo`
/// in `import "..." as Foo;`)
- static const importPrefixDeclaration =
- const IdentifierContext._('importPrefixDeclaration', inDeclaration: true);
+ static const importPrefixDeclaration = const IdentifierContext._(
+ 'importPrefixDeclaration',
+ inDeclaration: true,
+ isBuiltInIdentifierAllowed: false);
/// Identifier is the start of a dotted name in a conditional import or
/// export.
@@ -44,8 +46,10 @@
isContinuation: true);
/// Identifier is the name being declared by a typedef declaration.
- static const typedefDeclaration =
- const IdentifierContext._('typedefDeclaration', inDeclaration: true);
+ static const typedefDeclaration = const IdentifierContext._(
+ 'typedefDeclaration',
+ inDeclaration: true,
+ isBuiltInIdentifierAllowed: false);
/// Identifier is a field initializer in a formal parameter list (i.e. it
/// appears directly after `this.`).
@@ -83,8 +87,8 @@
isContinuation: true);
/// Identifier is the type name being declared by an enum declaration.
- static const enumDeclaration =
- const IdentifierContext._('enumDeclaration', inDeclaration: true);
+ static const enumDeclaration = const IdentifierContext._('enumDeclaration',
+ inDeclaration: true, isBuiltInIdentifierAllowed: false);
/// Identifier is an enumerated value name being declared by an enum
/// declaration.
@@ -93,27 +97,32 @@
/// Identifier is the name being declared by a named mixin declaration (e.g.
/// `Foo` in `class Foo = X with Y;`).
- static const namedMixinDeclaration =
- const IdentifierContext._('namedMixinDeclaration', inDeclaration: true);
+ static const namedMixinDeclaration = const IdentifierContext._(
+ 'namedMixinDeclaration',
+ inDeclaration: true,
+ isBuiltInIdentifierAllowed: false);
/// Identifier is the name being declared by a class declaration.
- static const classDeclaration =
- const IdentifierContext._('classDeclaration', inDeclaration: true);
+ static const classDeclaration = const IdentifierContext._('classDeclaration',
+ inDeclaration: true, isBuiltInIdentifierAllowed: false);
/// Identifier is the name of a type variable being declared (e.g. `Foo` in
/// `class C<Foo extends num> {}`).
- static const typeVariableDeclaration =
- const IdentifierContext._('typeVariableDeclaration', inDeclaration: true);
+ static const typeVariableDeclaration = const IdentifierContext._(
+ 'typeVariableDeclaration',
+ inDeclaration: true,
+ isBuiltInIdentifierAllowed: false);
/// Identifier is the start of a reference to a type declared elsewhere.
- static const typeReference =
- const IdentifierContext._('typeReference', isScopeReference: true);
+ static const typeReference = const IdentifierContext._('typeReference',
+ isScopeReference: true, isBuiltInIdentifierAllowed: false);
/// Identifier is part of a reference to a type declared elsewhere, but it's
/// not the first identifier of the reference.
static const typeReferenceContinuation = const IdentifierContext._(
'typeReferenceContinuation',
- isContinuation: true);
+ isContinuation: true,
+ isBuiltInIdentifierAllowed: false);
/// Identifier is a name being declared by a top level variable declaration.
static const topLevelVariableDeclaration = const IdentifierContext._(
@@ -262,12 +271,16 @@
/// Indicates whether the identifier should be looked up in the current scope.
final bool isScopeReference;
+ /// Indicates whether built-in identifiers are allowed in this context.
+ final bool isBuiltInIdentifierAllowed;
+
const IdentifierContext._(this._name,
{this.inDeclaration: false,
this.inLibraryOrPartOfDeclaration: false,
this.inSymbol: false,
this.isContinuation: false,
- this.isScopeReference: false});
+ this.isScopeReference: false,
+ this.isBuiltInIdentifierAllowed: true});
String toString() => _name;
}
diff --git a/pkg/front_end/lib/src/fasta/parser/parser.dart b/pkg/front_end/lib/src/fasta/parser/parser.dart
index 7d7dd55..5a0d95a 100644
--- a/pkg/front_end/lib/src/fasta/parser/parser.dart
+++ b/pkg/front_end/lib/src/fasta/parser/parser.dart
@@ -887,6 +887,13 @@
if (!token.isIdentifier()) {
token =
reportUnrecoverableError(token, ErrorKind.ExpectedIdentifier)?.next;
+ } else if (token.isBuiltInIdentifier &&
+ !context.isBuiltInIdentifierAllowed) {
+ if (context.inDeclaration) {
+ reportRecoverableError(token, ErrorKind.BuiltInIdentifierInDeclaration);
+ } else if (!optional("dynamic", token)) {
+ reportRecoverableError(token, ErrorKind.BuiltInIdentifierAsType);
+ }
}
listener.handleIdentifier(token, context);
return token.next;
diff --git a/pkg/front_end/lib/src/fasta/scanner/string_scanner.dart b/pkg/front_end/lib/src/fasta/scanner/string_scanner.dart
index d397cc9..a7ac73b 100644
--- a/pkg/front_end/lib/src/fasta/scanner/string_scanner.dart
+++ b/pkg/front_end/lib/src/fasta/scanner/string_scanner.dart
@@ -8,7 +8,7 @@
import 'precedence.dart' show PrecedenceInfo;
-import 'token.dart' show StringToken, Token;
+import 'token.dart' show StringToken;
/**
* Scanner that reads from a String and creates tokens that points to
diff --git a/pkg/front_end/lib/src/fasta/scanner/token.dart b/pkg/front_end/lib/src/fasta/scanner/token.dart
index bb7efd8..5d72286 100644
--- a/pkg/front_end/lib/src/fasta/scanner/token.dart
+++ b/pkg/front_end/lib/src/fasta/scanner/token.dart
@@ -124,8 +124,9 @@
bool get isEof => false;
- @override
bool get isOperator => info.isOperator;
+
+ bool get isBuiltInIdentifier => false;
}
/**
@@ -177,6 +178,12 @@
bool isIdentifier() => keyword.isPseudo || keyword.isBuiltIn;
+ bool get isBuiltInIdentifier {
+ // TODO(ahe): Remove special case for "deferred" once dartbug.com/29069 is
+ // fixed.
+ return keyword.isBuiltIn || identical("deferred", lexeme);
+ }
+
String toString() => "KeywordToken($lexeme)";
}
diff --git a/pkg/front_end/lib/src/fasta/scanner/utf8_bytes_scanner.dart b/pkg/front_end/lib/src/fasta/scanner/utf8_bytes_scanner.dart
index cca00d0..291ddf3 100644
--- a/pkg/front_end/lib/src/fasta/scanner/utf8_bytes_scanner.dart
+++ b/pkg/front_end/lib/src/fasta/scanner/utf8_bytes_scanner.dart
@@ -10,7 +10,7 @@
import 'precedence.dart' show PrecedenceInfo;
-import 'token.dart' show StringToken, Token;
+import 'token.dart' show StringToken;
import 'array_based_scanner.dart' show ArrayBasedScanner;
diff --git a/pkg/kernel/bin/reified_dart.dart b/pkg/kernel/bin/reified_dart.dart
index b87807d..dfdeb30 100755
--- a/pkg/kernel/bin/reified_dart.dart
+++ b/pkg/kernel/bin/reified_dart.dart
@@ -141,6 +141,7 @@
}
ProcessResult result = await Process.run(dartkPath, [
+ "--strong",
"--sdk=$sdkPath",
"--target=vmreify",
"--link",
diff --git a/pkg/kernel/lib/ast.dart b/pkg/kernel/lib/ast.dart
index c04a54d..220878e 100644
--- a/pkg/kernel/lib/ast.dart
+++ b/pkg/kernel/lib/ast.dart
@@ -2756,6 +2756,7 @@
abstract class Statement extends TreeNode {
accept(StatementVisitor v);
+ accept1(StatementVisitor1 v, arg);
}
/// A statement with a compile-time error.
@@ -2763,6 +2764,7 @@
/// Should throw an exception at runtime.
class InvalidStatement extends Statement {
accept(StatementVisitor v) => v.visitInvalidStatement(this);
+ accept1(StatementVisitor1 v, arg) => v.visitInvalidStatement(this, arg);
visitChildren(Visitor v) {}
transformChildren(Transformer v) {}
@@ -2776,6 +2778,7 @@
}
accept(StatementVisitor v) => v.visitExpressionStatement(this);
+ accept1(StatementVisitor1 v, arg) => v.visitExpressionStatement(this, arg);
visitChildren(Visitor v) {
expression?.accept(v);
@@ -2797,6 +2800,7 @@
}
accept(StatementVisitor v) => v.visitBlock(this);
+ accept1(StatementVisitor1 v, arg) => v.visitBlock(this, arg);
visitChildren(Visitor v) {
visitList(statements, v);
@@ -2814,6 +2818,7 @@
class EmptyStatement extends Statement {
accept(StatementVisitor v) => v.visitEmptyStatement(this);
+ accept1(StatementVisitor1 v, arg) => v.visitEmptyStatement(this, arg);
visitChildren(Visitor v) {}
transformChildren(Transformer v) {}
@@ -2829,6 +2834,7 @@
}
accept(StatementVisitor v) => v.visitAssertStatement(this);
+ accept1(StatementVisitor1 v, arg) => v.visitAssertStatement(this, arg);
visitChildren(Visitor v) {
condition?.accept(v);
@@ -2860,6 +2866,7 @@
}
accept(StatementVisitor v) => v.visitLabeledStatement(this);
+ accept1(StatementVisitor1 v, arg) => v.visitLabeledStatement(this, arg);
visitChildren(Visitor v) {
body?.accept(v);
@@ -2899,6 +2906,7 @@
BreakStatement(this.target);
accept(StatementVisitor v) => v.visitBreakStatement(this);
+ accept1(StatementVisitor1 v, arg) => v.visitBreakStatement(this, arg);
visitChildren(Visitor v) {}
transformChildren(Transformer v) {}
@@ -2914,6 +2922,7 @@
}
accept(StatementVisitor v) => v.visitWhileStatement(this);
+ accept1(StatementVisitor1 v, arg) => v.visitWhileStatement(this, arg);
visitChildren(Visitor v) {
condition?.accept(v);
@@ -2942,6 +2951,7 @@
}
accept(StatementVisitor v) => v.visitDoStatement(this);
+ accept1(StatementVisitor1 v, arg) => v.visitDoStatement(this, arg);
visitChildren(Visitor v) {
body?.accept(v);
@@ -2974,6 +2984,7 @@
}
accept(StatementVisitor v) => v.visitForStatement(this);
+ accept1(StatementVisitor1 v, arg) => v.visitForStatement(this, arg);
visitChildren(Visitor v) {
visitList(variables, v);
@@ -3010,6 +3021,7 @@
}
accept(StatementVisitor v) => v.visitForInStatement(this);
+ accept1(StatementVisitor1 v, arg) => v.visitForInStatement(this, arg);
visitChildren(Visitor v) {
variable?.accept(v);
@@ -3047,6 +3059,7 @@
}
accept(StatementVisitor v) => v.visitSwitchStatement(this);
+ accept1(StatementVisitor1 v, arg) => v.visitSwitchStatement(this, arg);
visitChildren(Visitor v) {
expression?.accept(v);
@@ -3109,6 +3122,8 @@
ContinueSwitchStatement(this.target);
accept(StatementVisitor v) => v.visitContinueSwitchStatement(this);
+ accept1(StatementVisitor1 v, arg) =>
+ v.visitContinueSwitchStatement(this, arg);
visitChildren(Visitor v) {}
transformChildren(Transformer v) {}
@@ -3126,6 +3141,7 @@
}
accept(StatementVisitor v) => v.visitIfStatement(this);
+ accept1(StatementVisitor1 v, arg) => v.visitIfStatement(this, arg);
visitChildren(Visitor v) {
condition?.accept(v);
@@ -3157,6 +3173,7 @@
}
accept(StatementVisitor v) => v.visitReturnStatement(this);
+ accept1(StatementVisitor1 v, arg) => v.visitReturnStatement(this, arg);
visitChildren(Visitor v) {
expression?.accept(v);
@@ -3180,6 +3197,7 @@
}
accept(StatementVisitor v) => v.visitTryCatch(this);
+ accept1(StatementVisitor1 v, arg) => v.visitTryCatch(this, arg);
visitChildren(Visitor v) {
body?.accept(v);
@@ -3245,6 +3263,7 @@
}
accept(StatementVisitor v) => v.visitTryFinally(this);
+ accept1(StatementVisitor1 v, arg) => v.visitTryFinally(this, arg);
visitChildren(Visitor v) {
body?.accept(v);
@@ -3292,6 +3311,7 @@
}
accept(StatementVisitor v) => v.visitYieldStatement(this);
+ accept1(StatementVisitor1 v, arg) => v.visitYieldStatement(this, arg);
visitChildren(Visitor v) {
expression?.accept(v);
@@ -3376,6 +3396,7 @@
}
accept(StatementVisitor v) => v.visitVariableDeclaration(this);
+ accept1(StatementVisitor1 v, arg) => v.visitVariableDeclaration(this, arg);
visitChildren(Visitor v) {
type?.accept(v);
@@ -3409,6 +3430,7 @@
}
accept(StatementVisitor v) => v.visitFunctionDeclaration(this);
+ accept1(StatementVisitor1 v, arg) => v.visitFunctionDeclaration(this, arg);
visitChildren(Visitor v) {
variable?.accept(v);
diff --git a/pkg/kernel/lib/target/vm.dart b/pkg/kernel/lib/target/vm.dart
index ed22544..72c7165 100644
--- a/pkg/kernel/lib/target/vm.dart
+++ b/pkg/kernel/lib/target/vm.dart
@@ -83,7 +83,7 @@
setup_builtin_library.transformProgram(program);
if (strongMode) {
- new Erasure().transform(program);
+ performErasure(program);
}
new SanitizeForVM().transform(program);
@@ -99,4 +99,8 @@
.transform(program);
_hierarchy = null; // Hierarchy must be recomputed.
}
+
+ void performErasure(Program program) {
+ new Erasure().transform(program);
+ }
}
diff --git a/pkg/kernel/lib/target/vmreify.dart b/pkg/kernel/lib/target/vmreify.dart
index db2c63e..1d0fe0a9 100644
--- a/pkg/kernel/lib/target/vmreify.dart
+++ b/pkg/kernel/lib/target/vmreify.dart
@@ -40,4 +40,10 @@
// TODO(dmitryas): remove this when the libraries are in dart:_internal
@override
void performTreeShaking(Program program) {}
+
+ // Here we disable Erasure pass of VmTarget class. The information deleted by
+ // the Erasure pass is required for Generic Type Reification. Also, reify
+ // transformation also performs its own Erasure pass.
+ @override
+ void performErasure(Program program) {}
}
diff --git a/pkg/kernel/lib/transformations/closure/converter.dart b/pkg/kernel/lib/transformations/closure/converter.dart
index 9ebd806..a2a45e5 100644
--- a/pkg/kernel/lib/transformations/closure/converter.dart
+++ b/pkg/kernel/lib/transformations/closure/converter.dart
@@ -676,8 +676,8 @@
String closureClassName = createNameForClosureClass(procedure.function);
Class closureClass = null;
for (TreeNode node in newLibraryMembers) {
- if (node is Class && (node as Class).name == closureClassName) {
- closureClass = node as Class;
+ if (node is Class && node.name == closureClassName) {
+ closureClass = node;
}
}
if (closureClass == null) {
@@ -739,7 +739,7 @@
positionalParameters: positionalParameters,
namedParameters: namedParameters,
requiredParameterCount: function.requiredParameterCount,
- returnType: substitute(function.returnType, substitution),
+ returnType: substitute(function.returnType, cloner.typeSubstitution),
inferredReturnValue: inferredReturnValue);
}
diff --git a/pkg/kernel/lib/transformations/reify/transformation/builder.dart b/pkg/kernel/lib/transformations/reify/transformation/builder.dart
index db46b96..13af0ed 100644
--- a/pkg/kernel/lib/transformations/reify/transformation/builder.dart
+++ b/pkg/kernel/lib/transformations/reify/transformation/builder.dart
@@ -238,12 +238,8 @@
}
if (type is InterfaceType || type is Supertype) {
- InterfaceType interfaceType = null;
- if (type is InterfaceType) {
- interfaceType = type;
- } else {
- interfaceType = (type as Supertype).asInterfaceType;
- }
+ InterfaceType interfaceType =
+ (type is InterfaceType) ? type : (type as Supertype).asInterfaceType;
Class cls = interfaceType.classNode;
Expression declaration = createReference(cls);
List<DartType> typeArguments = interfaceType.typeArguments;
diff --git a/pkg/kernel/lib/transformations/reify/transformation/remove_generics.dart b/pkg/kernel/lib/transformations/reify/transformation/remove_generics.dart
index aafff7d..1a103f6 100644
--- a/pkg/kernel/lib/transformations/reify/transformation/remove_generics.dart
+++ b/pkg/kernel/lib/transformations/reify/transformation/remove_generics.dart
@@ -27,12 +27,24 @@
}
TreeNode removeTypeArgumentsOfStaticCall(StaticInvocation node) {
- Class cls = node.target.parent;
- if (removeTypeParameters(cls)) {
- node.arguments.types.clear();
- Procedure target = node.target;
- target.function.typeParameters.clear();
+ if (node.target.parent is Class) {
+ Class cls = node.target.parent;
+ if (!removeTypeParameters(cls)) {
+ return node;
+ }
+ } else {
+ // If parent is a Library, then a global procedure is invoked, and it may
+ // be a generic function, so we need to remove type arguments anyway.
+ assert(node.target.parent is Library);
}
+ node.arguments.types.clear();
+ Procedure target = node.target;
+ target.function.typeParameters.clear();
+ return node;
+ }
+
+ TreeNode removeTypeArgumentOfMethodInvocation(MethodInvocation node) {
+ node.arguments.types.clear();
return node;
}
@@ -96,7 +108,8 @@
@override
StaticInvocation visitStaticInvocation(StaticInvocation node) {
node.transformChildren(this);
- if (node.target.kind == ProcedureKind.Factory) {
+ if (node.target.kind == ProcedureKind.Factory ||
+ node.target.kind == ProcedureKind.Method) {
node = removeTypeArgumentsOfStaticCall(node);
}
return node;
@@ -116,4 +129,10 @@
}
return node;
}
+
+ @override
+ Expression visitMethodInvocation(MethodInvocation node) {
+ node.transformChildren(this);
+ return removeTypeArgumentOfMethodInvocation(node);
+ }
}
diff --git a/pkg/kernel/lib/transformations/reify/transformation/transformer.dart b/pkg/kernel/lib/transformations/reify/transformation/transformer.dart
index 8672485..a057443 100644
--- a/pkg/kernel/lib/transformations/reify/transformation/transformer.dart
+++ b/pkg/kernel/lib/transformations/reify/transformation/transformer.dart
@@ -103,6 +103,8 @@
// TODO(karlklose): find a way to get rid of this state in the visitor.
TransformationContext context;
+ static const String genericMethodTypeParametersName = r"$typeParameters";
+
bool libraryShouldBeTransformed(Library library) {
return libraryToTransform == null || libraryToTransform == library;
}
@@ -180,6 +182,9 @@
// Intercept calls to factories of classes we do not transform
return interceptInstantiation(invocation, target);
}
+
+ addTypeArgumentToGenericInvocation(invocation);
+
return invocation;
}
@@ -419,6 +424,8 @@
FunctionNode visitFunctionNode(FunctionNode node) {
trace(node);
+ addTypeArgumentToGenericDeclaration(node);
+
// If we have a [TransformationContext] with a runtime type field and we
// translate a constructor or factory, we need a parameter that the code of
// initializers or the factory body can use to access type arguments.
@@ -572,4 +579,46 @@
new InterfaceType(builder.coreTypes.mapClass,
<DartType>[node.keyType, node.valueType]));
}
+
+ Expression visitMethodInvocation(MethodInvocation node) {
+ node.transformChildren(this);
+ addTypeArgumentToGenericInvocation(node);
+ return node;
+ }
+
+ bool isGenericMethod(FunctionNode node) {
+ if (node.parent is Member) {
+ Member member = node.parent;
+ if (member is Constructor ||
+ member is Procedure && member.kind == ProcedureKind.Factory) {
+ return member.enclosingClass.typeParameters.length <
+ node.typeParameters.length;
+ }
+ }
+ return node.typeParameters.isNotEmpty;
+ }
+
+ void addTypeArgumentToGenericInvocation(InvocationExpression expression) {
+ if (expression.arguments.types.length > 0) {
+ ListLiteral genericMethodTypeParameters = new ListLiteral(
+ expression.arguments.types
+ .map(createRuntimeType)
+ .toList(growable: false),
+ typeArgument: rtiLibrary.typeType);
+ expression.arguments.named.add(new NamedExpression(
+ genericMethodTypeParametersName, genericMethodTypeParameters)
+ ..parent = expression.arguments);
+ }
+ }
+
+ void addTypeArgumentToGenericDeclaration(FunctionNode node) {
+ if (isGenericMethod(node)) {
+ VariableDeclaration genericMethodTypeParameters = new VariableDeclaration(
+ genericMethodTypeParametersName,
+ type: new InterfaceType(
+ builder.coreTypes.listClass, <DartType>[rtiLibrary.typeType]));
+ genericMethodTypeParameters.parent = node;
+ node.namedParameters.insert(0, genericMethodTypeParameters);
+ }
+ }
}
diff --git a/pkg/kernel/lib/visitor.dart b/pkg/kernel/lib/visitor.dart
index 4790e73..dc2c6c3 100644
--- a/pkg/kernel/lib/visitor.dart
+++ b/pkg/kernel/lib/visitor.dart
@@ -381,3 +381,42 @@
R visitCheckLibraryIsLoaded(CheckLibraryIsLoaded node, arg) =>
defaultExpression(node, arg);
}
+
+abstract class StatementVisitor1<R> {
+ R defaultStatement(Statement node, arg) => null;
+
+ R visitInvalidStatement(InvalidStatement node, arg) =>
+ defaultStatement(node, arg);
+ R visitExpressionStatement(ExpressionStatement node, arg) =>
+ defaultStatement(node, arg);
+ R visitBlock(Block node, arg) => defaultStatement(node, arg);
+ R visitEmptyStatement(EmptyStatement node, arg) =>
+ defaultStatement(node, arg);
+ R visitAssertStatement(AssertStatement node, arg) =>
+ defaultStatement(node, arg);
+ R visitLabeledStatement(LabeledStatement node, arg) =>
+ defaultStatement(node, arg);
+ R visitBreakStatement(BreakStatement node, arg) =>
+ defaultStatement(node, arg);
+ R visitWhileStatement(WhileStatement node, arg) =>
+ defaultStatement(node, arg);
+ R visitDoStatement(DoStatement node, arg) => defaultStatement(node, arg);
+ R visitForStatement(ForStatement node, arg) => defaultStatement(node, arg);
+ R visitForInStatement(ForInStatement node, arg) =>
+ defaultStatement(node, arg);
+ R visitSwitchStatement(SwitchStatement node, arg) =>
+ defaultStatement(node, arg);
+ R visitContinueSwitchStatement(ContinueSwitchStatement node, arg) =>
+ defaultStatement(node, arg);
+ R visitIfStatement(IfStatement node, arg) => defaultStatement(node, arg);
+ R visitReturnStatement(ReturnStatement node, arg) =>
+ defaultStatement(node, arg);
+ R visitTryCatch(TryCatch node, arg) => defaultStatement(node, arg);
+ R visitTryFinally(TryFinally node, arg) => defaultStatement(node, arg);
+ R visitYieldStatement(YieldStatement node, arg) =>
+ defaultStatement(node, arg);
+ R visitVariableDeclaration(VariableDeclaration node, arg) =>
+ defaultStatement(node, arg);
+ R visitFunctionDeclaration(FunctionDeclaration node, arg) =>
+ defaultStatement(node, arg);
+}
diff --git a/pkg/kernel/test/reify/suite.dart b/pkg/kernel/test/reify/suite.dart
index 337e3ae..aa04009 100644
--- a/pkg/kernel/test/reify/suite.dart
+++ b/pkg/kernel/test/reify/suite.dart
@@ -15,6 +15,8 @@
import 'package:kernel/target/targets.dart' show Target, TargetFlags, getTarget;
+import 'package:kernel/target/vmcc.dart' show VmClosureConvertedTarget;
+
import 'kernel_chain.dart'
show MatchExpectation, Print, ReadDill, SanityCheck, WriteDill;
@@ -30,9 +32,6 @@
import 'package:kernel/ast.dart' show Program;
-import 'package:kernel/transformations/closure_conversion.dart'
- as closure_conversion;
-
import 'package:kernel/transformations/generic_types_reification.dart'
as generic_types_reification;
@@ -57,10 +56,9 @@
sdk: sdk,
packagePath: packages.toFilePath()),
steps = <Step>[
- const Kernel(),
+ const NotReifiedKernel(),
const Print(),
const SanityCheck(),
- const ClosureConversion(),
const GenericTypesReification(),
const Print(),
const SanityCheck(),
@@ -126,14 +124,51 @@
Uri vm = Uri.base.resolve("out/ReleaseX64/dart");
Uri packages = Uri.base.resolve(".packages");
- bool strongMode = false;
- bool updateExpectations = environment["updateExpectations"] == "true";
+ // Strong mode is required to keep the type arguments in invocations of
+ // generic methods.
+ bool strongMode = true;
+ bool updateExpectations = const String.fromEnvironment("updateExpectations",
+ defaultValue: "false") ==
+ "true";
return new TestContext(sdk, vm, packages, strongMode,
createDartSdk(sdk, strongMode: strongMode), updateExpectations);
}
-class Kernel extends Step<TestDescription, Program, TestContext> {
- const Kernel();
+// [NotReifiedTarget] is intended to work as the [Target] class that
+// [VmGenericTypesReifiedTarget] inherits from, but with some transformations
+// disabled. Those include tree shaking and generic types information erasure
+// passes.
+// [NotReifiedTarget] also adds the necessary runtime libraries.
+class NotReifiedTarget extends VmClosureConvertedTarget {
+ NotReifiedTarget(TargetFlags flags) : super(flags);
+
+ @override
+ String get name => "not reified target";
+
+ // Tree shaking needs to be disabled, because Generic Types Reification
+ // transformation relies on certain runtime libraries to be present in
+ // the program that is being transformed. If the tree shaker is enabled,
+ // it just deletes everything from those libraries, because they aren't
+ // used in the program being transform prior to the transformation.
+ @override
+ void performTreeShaking(Program program) {}
+
+ // Erasure needs to be disabled, because it removes the necessary information
+ // about type arguments for generic methods.
+ @override
+ void performErasure(Program program) {}
+
+ // Adds the necessary runtime libraries.
+ @override
+ List<String> get extraRequiredLibraries {
+ Target reifyTarget = getTarget("vmreify", this.flags);
+ var x = reifyTarget.extraRequiredLibraries;
+ return x;
+ }
+}
+
+class NotReifiedKernel extends Step<TestDescription, Program, TestContext> {
+ const NotReifiedKernel();
String get name => "kernel";
@@ -142,19 +177,15 @@
try {
DartLoader loader = await testContext.createLoader();
- Target target = getTarget(
- "vm", new TargetFlags(strongMode: testContext.options.strongMode));
- // reifyTarget is used to add the GTR-specific runtime libraries
- // when the program is being loaded
- Target reifyTarget = getTarget(
- "vmreify",
- new TargetFlags(
- strongMode: testContext.options.strongMode,
- kernelRuntime: Platform.script.resolve('../../runtime/')));
+ // Strong mode is required to keep the type arguments in invocations of
+ // generic methods.
+ Target target = new NotReifiedTarget(new TargetFlags(
+ strongMode: true,
+ kernelRuntime: Platform.script.resolve("../../runtime/")));
String path = description.file.path;
Uri uri = Uri.base.resolve(path);
- loader.loadProgram(uri, target: reifyTarget);
+ loader.loadProgram(uri, target: target);
var program = loader.program;
for (var error in loader.errors) {
return fail(program, "$error");
@@ -169,21 +200,6 @@
}
}
-class ClosureConversion extends Step<Program, Program, TestContext> {
- const ClosureConversion();
-
- String get name => "closure conversion";
-
- Future<Result<Program>> run(Program program, TestContext testContext) async {
- try {
- program = closure_conversion.transformProgram(program);
- return pass(program);
- } catch (e, s) {
- return crash(e, s);
- }
- }
-}
-
class GenericTypesReification extends Step<Program, Program, TestContext> {
const GenericTypesReification();
diff --git a/pkg/kernel/testcases/reify/closure2_test.dart.expect b/pkg/kernel/testcases/reify/closure2_test.dart.expect
index a6c537a..3c547f5 100644
--- a/pkg/kernel/testcases/reify/closure2_test.dart.expect
+++ b/pkg/kernel/testcases/reify/closure2_test.dart.expect
@@ -41,7 +41,7 @@
constructor •(typ::ReifiedType $type, final mock::Context context) → dynamic
: self::Closure#A#fun#function::$type = $type, self::Closure#A#fun#function::context = context
;
- method call(dynamic o) → dynamic {
+ method call(dynamic o) → core::bool {
"This is a temporary solution. In the VM, this will become an additional parameter.";
final mock::Context #contextParameter = this.{self::Closure#A#fun#function::context};
return typ::isSubtypeOf(int::type(o), this.$Closure#A#fun#function$T);
@@ -53,7 +53,7 @@
}
static final field core::List<dec::Class> $declarations = (core::List<dec::Class> d) → core::List<dec::Class> {
dec::init(d, 0, new typ::Interface::•(d.[](17)));
- dec::init(d, 1, new typ::Interface::•(d.[](17)), <dynamic>[new typ::Interface::•(d.[](19))], new typ::FunctionType::•(new typ::Interface::•(d.[](19)), const typ::Dynamic::•(), 0, <dynamic>[const typ::Dynamic::•()]));
+ dec::init(d, 1, new typ::Interface::•(d.[](17)), <dynamic>[new typ::Interface::•(d.[](19))], new typ::FunctionType::•(new typ::Interface::•(d.[](19)), new typ::Interface::•(d.[](5)), 0, <dynamic>[const typ::Dynamic::•()]));
dec::init(d, 2, new typ::Interface::•(d.[](17)));
dec::init(d, 3, new typ::Interface::•(d.[](17)));
dec::init(d, 4, new typ::Interface::•(d.[](17)));
@@ -79,7 +79,7 @@
return d;
}.call(dec::allocateDeclarations(<dynamic>["A", "Closure#A#fun#function", "X", "Y", "Null", "bool", "String", "int", "double", "Type", "AbstractClassInstantiationError", "NoSuchMethodError", "CyclicInitializationError", "UnsupportedError", "IntegerDivisionByZeroException", "RangeError", "ArgumentError", "Object", "HasRuntimeTypeGetter", "Function", "Comparable", "Pattern", "num", "Error", "Exception"], <dynamic>[1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0]));
static method main() → dynamic {
- dynamic tester = new self::A::•(new typ::Interface::•(self::$declarations.[](0), <dynamic>[new typ::Interface::•(self::$declarations.[](2))])).fun();
+ dynamic tester = new self::A::•(new typ::Interface::•(self::$declarations.[](0), <dynamic>[new typ::Interface::•(self::$declarations.[](2))])).{self::A::fun}();
tes::expectTrue(tester.call(new self::X::•()));
tes::expectFalse(tester.call(new self::Y::•()));
}
diff --git a/pkg/kernel/testcases/reify/closure_test.dart.expect b/pkg/kernel/testcases/reify/closure_test.dart.expect
index 50134be..0b759eb 100644
--- a/pkg/kernel/testcases/reify/closure_test.dart.expect
+++ b/pkg/kernel/testcases/reify/closure_test.dart.expect
@@ -58,84 +58,44 @@
get $type() → typ::ReifiedType
return new typ::Interface::•(self::$declarations.[](4));
}
-class Closure#bar extends core::Object implements core::Function, int::HasRuntimeTypeGetter {
+class Closure#baz extends core::Object implements core::Function, int::HasRuntimeTypeGetter {
field core::String note = "This is temporary. The VM doesn't need closure classes.";
constructor •() → dynamic
;
- method call(self::A a) → dynamic
- return self::bar(a);
+ method call(dynamic a) → self::B
+ return self::baz(a);
get $type() → typ::ReifiedType
return new typ::Interface::•(self::$declarations.[](5));
}
-class Closure#baz extends core::Object implements core::Function, int::HasRuntimeTypeGetter {
- field core::String note = "This is temporary. The VM doesn't need closure classes.";
- constructor •() → dynamic
- ;
- method call(dynamic a) → self::B
- return self::baz(a);
- get $type() → typ::ReifiedType
- return new typ::Interface::•(self::$declarations.[](6));
-}
-class Closure#baz extends core::Object implements core::Function, int::HasRuntimeTypeGetter {
- field core::String note = "This is temporary. The VM doesn't need closure classes.";
- constructor •() → dynamic
- ;
- method call(dynamic a) → self::B
- return self::baz(a);
- get $type() → typ::ReifiedType
- return new typ::Interface::•(self::$declarations.[](7));
-}
-class Closure#bar extends core::Object implements core::Function, int::HasRuntimeTypeGetter {
- field core::String note = "This is temporary. The VM doesn't need closure classes.";
- constructor •() → dynamic
- ;
- method call(self::A a) → dynamic
- return self::bar(a);
- get $type() → typ::ReifiedType
- return new typ::Interface::•(self::$declarations.[](8));
-}
-class Closure#baz extends core::Object implements core::Function, int::HasRuntimeTypeGetter {
- field core::String note = "This is temporary. The VM doesn't need closure classes.";
- constructor •() → dynamic
- ;
- method call(dynamic a) → self::B
- return self::baz(a);
- get $type() → typ::ReifiedType
- return new typ::Interface::•(self::$declarations.[](9));
-}
static final field core::List<dec::Class> $declarations = (core::List<dec::Class> d) → core::List<dec::Class> {
- dec::init(d, 0, new typ::Interface::•(d.[](24)));
- dec::init(d, 1, new typ::Interface::•(d.[](24)));
- dec::init(d, 2, new typ::Interface::•(d.[](24)), <dynamic>[new typ::Interface::•(d.[](10))], new typ::FunctionType::•(new typ::Interface::•(d.[](10)), new typ::Interface::•(d.[](1)), 0, <dynamic>[new typ::Interface::•(d.[](0))]));
- dec::init(d, 3, new typ::Interface::•(d.[](24)), <dynamic>[new typ::Interface::•(d.[](10))], new typ::FunctionType::•(new typ::Interface::•(d.[](10)), new typ::Interface::•(d.[](0)), 0, <dynamic>[new typ::Interface::•(d.[](1))]));
- dec::init(d, 4, new typ::Interface::•(d.[](24)), <dynamic>[new typ::Interface::•(d.[](10))], new typ::FunctionType::•(new typ::Interface::•(d.[](10)), const typ::Dynamic::•(), 0, <dynamic>[new typ::Interface::•(d.[](0))]));
- dec::init(d, 5, new typ::Interface::•(d.[](24)), <dynamic>[new typ::Interface::•(d.[](10))], new typ::FunctionType::•(new typ::Interface::•(d.[](10)), const typ::Dynamic::•(), 0, <dynamic>[new typ::Interface::•(d.[](0))]));
- dec::init(d, 6, new typ::Interface::•(d.[](24)), <dynamic>[new typ::Interface::•(d.[](10))], new typ::FunctionType::•(new typ::Interface::•(d.[](10)), new typ::Interface::•(d.[](1)), 0, <dynamic>[const typ::Dynamic::•()]));
- dec::init(d, 7, new typ::Interface::•(d.[](24)), <dynamic>[new typ::Interface::•(d.[](10))], new typ::FunctionType::•(new typ::Interface::•(d.[](10)), new typ::Interface::•(d.[](1)), 0, <dynamic>[const typ::Dynamic::•()]));
- dec::init(d, 8, new typ::Interface::•(d.[](24)), <dynamic>[new typ::Interface::•(d.[](10))], new typ::FunctionType::•(new typ::Interface::•(d.[](10)), const typ::Dynamic::•(), 0, <dynamic>[new typ::Interface::•(d.[](0))]));
- dec::init(d, 9, new typ::Interface::•(d.[](24)), <dynamic>[new typ::Interface::•(d.[](10))], new typ::FunctionType::•(new typ::Interface::•(d.[](10)), new typ::Interface::•(d.[](1)), 0, <dynamic>[const typ::Dynamic::•()]));
+ dec::init(d, 0, new typ::Interface::•(d.[](20)));
+ dec::init(d, 1, new typ::Interface::•(d.[](20)));
+ dec::init(d, 2, new typ::Interface::•(d.[](20)), <dynamic>[new typ::Interface::•(d.[](6))], new typ::FunctionType::•(new typ::Interface::•(d.[](6)), new typ::Interface::•(d.[](1)), 0, <dynamic>[new typ::Interface::•(d.[](0))]));
+ dec::init(d, 3, new typ::Interface::•(d.[](20)), <dynamic>[new typ::Interface::•(d.[](6))], new typ::FunctionType::•(new typ::Interface::•(d.[](6)), new typ::Interface::•(d.[](0)), 0, <dynamic>[new typ::Interface::•(d.[](1))]));
+ dec::init(d, 4, new typ::Interface::•(d.[](20)), <dynamic>[new typ::Interface::•(d.[](6))], new typ::FunctionType::•(new typ::Interface::•(d.[](6)), const typ::Dynamic::•(), 0, <dynamic>[new typ::Interface::•(d.[](0))]));
+ dec::init(d, 5, new typ::Interface::•(d.[](20)), <dynamic>[new typ::Interface::•(d.[](6))], new typ::FunctionType::•(new typ::Interface::•(d.[](6)), new typ::Interface::•(d.[](1)), 0, <dynamic>[const typ::Dynamic::•()]));
+ dec::init(d, 6, new typ::Interface::•(d.[](20)));
+ dec::init(d, 7, new typ::Interface::•(d.[](20)));
+ dec::init(d, 8, new typ::Interface::•(d.[](20)));
+ dec::init(d, 9, new typ::Interface::•(d.[](20)), <dynamic>[new typ::Interface::•(d.[](22), <dynamic>[new typ::Interface::•(d.[](9))]), new typ::Interface::•(d.[](23))]);
dec::init(d, 10, new typ::Interface::•(d.[](24)));
dec::init(d, 11, new typ::Interface::•(d.[](24)));
- dec::init(d, 12, new typ::Interface::•(d.[](24)));
- dec::init(d, 13, new typ::Interface::•(d.[](24)), <dynamic>[new typ::Interface::•(d.[](26), <dynamic>[new typ::Interface::•(d.[](13))]), new typ::Interface::•(d.[](27))]);
- dec::init(d, 14, new typ::Interface::•(d.[](28)));
- dec::init(d, 15, new typ::Interface::•(d.[](28)));
- dec::init(d, 16, new typ::Interface::•(d.[](24)));
- dec::init(d, 17, new typ::Interface::•(d.[](29)));
- dec::init(d, 18, new typ::Interface::•(d.[](29)));
- dec::init(d, 19, new typ::Interface::•(d.[](29)));
- dec::init(d, 20, new typ::Interface::•(d.[](29)));
- dec::init(d, 21, new typ::Interface::•(d.[](24)), <dynamic>[new typ::Interface::•(d.[](30))]);
- dec::init(d, 22, new typ::Interface::•(d.[](23)));
- dec::init(d, 23, new typ::Interface::•(d.[](29)));
- dec::init(d, 24, null);
- dec::init(d, 26, new typ::Interface::•(d.[](24)));
- dec::init(d, 27, new typ::Interface::•(d.[](24)));
- dec::init(d, 28, new typ::Interface::•(d.[](24)), <dynamic>[new typ::Interface::•(d.[](26), <dynamic>[new typ::Interface::•(d.[](28))])]);
- dec::init(d, 29, new typ::Interface::•(d.[](24)));
- dec::init(d, 30, new typ::Interface::•(d.[](24)));
+ dec::init(d, 12, new typ::Interface::•(d.[](20)));
+ dec::init(d, 13, new typ::Interface::•(d.[](25)));
+ dec::init(d, 14, new typ::Interface::•(d.[](25)));
+ dec::init(d, 15, new typ::Interface::•(d.[](25)));
+ dec::init(d, 16, new typ::Interface::•(d.[](25)));
+ dec::init(d, 17, new typ::Interface::•(d.[](20)), <dynamic>[new typ::Interface::•(d.[](26))]);
+ dec::init(d, 18, new typ::Interface::•(d.[](19)));
+ dec::init(d, 19, new typ::Interface::•(d.[](25)));
+ dec::init(d, 20, null);
+ dec::init(d, 22, new typ::Interface::•(d.[](20)));
+ dec::init(d, 23, new typ::Interface::•(d.[](20)));
+ dec::init(d, 24, new typ::Interface::•(d.[](20)), <dynamic>[new typ::Interface::•(d.[](22), <dynamic>[new typ::Interface::•(d.[](24))])]);
+ dec::init(d, 25, new typ::Interface::•(d.[](20)));
+ dec::init(d, 26, new typ::Interface::•(d.[](20)));
return d;
-}.call(dec::allocateDeclarations(<dynamic>["A", "B", "Closure#main#foo", "Closure#main#qux", "Closure#bar", "Closure#bar", "Closure#baz", "Closure#baz", "Closure#bar", "Closure#baz", "Function", "Null", "bool", "String", "int", "double", "Type", "AbstractClassInstantiationError", "NoSuchMethodError", "CyclicInitializationError", "UnsupportedError", "IntegerDivisionByZeroException", "RangeError", "ArgumentError", "Object", "HasRuntimeTypeGetter", "Comparable", "Pattern", "num", "Error", "Exception"], <dynamic>[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0]));
+}.call(dec::allocateDeclarations(<dynamic>["A", "B", "Closure#main#foo", "Closure#main#qux", "Closure#bar", "Closure#baz", "Function", "Null", "bool", "String", "int", "double", "Type", "AbstractClassInstantiationError", "NoSuchMethodError", "CyclicInitializationError", "UnsupportedError", "IntegerDivisionByZeroException", "RangeError", "ArgumentError", "Object", "HasRuntimeTypeGetter", "Comparable", "Pattern", "num", "Error", "Exception"], <dynamic>[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0]));
static method bar(self::A a) → dynamic {
return null;
}
@@ -145,18 +105,18 @@
static method main() → dynamic {
final (self::A) → self::B foo = new self::Closure#main#foo::•(null);
final (self::B) → self::A qux = new self::Closure#main#qux::•(null);
- tes::expectTrue(typ::isSubtypeOf(int::type(foo), new typ::FunctionType::•(new typ::Interface::•(self::$declarations.[](10)), new typ::Interface::•(self::$declarations.[](1)), 0, <dynamic>[new typ::Interface::•(self::$declarations.[](0))])));
- tes::expectTrue(!typ::isSubtypeOf(int::type(qux), new typ::FunctionType::•(new typ::Interface::•(self::$declarations.[](10)), new typ::Interface::•(self::$declarations.[](1)), 0, <dynamic>[new typ::Interface::•(self::$declarations.[](0))])));
- tes::expectTrue(!typ::isSubtypeOf(int::type(foo), new typ::FunctionType::•(new typ::Interface::•(self::$declarations.[](10)), new typ::Interface::•(self::$declarations.[](0)), 0, <dynamic>[new typ::Interface::•(self::$declarations.[](1))])));
- tes::expectTrue(typ::isSubtypeOf(int::type(qux), new typ::FunctionType::•(new typ::Interface::•(self::$declarations.[](10)), new typ::Interface::•(self::$declarations.[](0)), 0, <dynamic>[new typ::Interface::•(self::$declarations.[](1))])));
- tes::expectTrue(typ::isSubtypeOf(int::type(new self::Closure#bar::•()), new typ::FunctionType::•(new typ::Interface::•(self::$declarations.[](10)), new typ::Interface::•(self::$declarations.[](1)), 0, <dynamic>[new typ::Interface::•(self::$declarations.[](0))])));
- tes::expectTrue(!typ::isSubtypeOf(int::type(new self::Closure#bar::•()), new typ::FunctionType::•(new typ::Interface::•(self::$declarations.[](10)), new typ::Interface::•(self::$declarations.[](0)), 0, <dynamic>[new typ::Interface::•(self::$declarations.[](1))])));
- tes::expectTrue(typ::isSubtypeOf(int::type(new self::Closure#baz::•()), new typ::FunctionType::•(new typ::Interface::•(self::$declarations.[](10)), new typ::Interface::•(self::$declarations.[](1)), 0, <dynamic>[new typ::Interface::•(self::$declarations.[](0))])));
- tes::expectTrue(!typ::isSubtypeOf(int::type(new self::Closure#baz::•()), new typ::FunctionType::•(new typ::Interface::•(self::$declarations.[](10)), new typ::Interface::•(self::$declarations.[](0)), 0, <dynamic>[new typ::Interface::•(self::$declarations.[](1))])));
- dynamic rab = new self::Closure#bar::•();
- dynamic zab = new self::Closure#baz::•();
- tes::expectTrue(typ::isSubtypeOf(int::type(rab), new typ::FunctionType::•(new typ::Interface::•(self::$declarations.[](10)), new typ::Interface::•(self::$declarations.[](1)), 0, <dynamic>[new typ::Interface::•(self::$declarations.[](0))])));
- tes::expectTrue(!typ::isSubtypeOf(int::type(rab), new typ::FunctionType::•(new typ::Interface::•(self::$declarations.[](10)), new typ::Interface::•(self::$declarations.[](0)), 0, <dynamic>[new typ::Interface::•(self::$declarations.[](1))])));
- tes::expectTrue(typ::isSubtypeOf(int::type(zab), new typ::FunctionType::•(new typ::Interface::•(self::$declarations.[](10)), new typ::Interface::•(self::$declarations.[](1)), 0, <dynamic>[new typ::Interface::•(self::$declarations.[](0))])));
- tes::expectTrue(!typ::isSubtypeOf(int::type(zab), new typ::FunctionType::•(new typ::Interface::•(self::$declarations.[](10)), new typ::Interface::•(self::$declarations.[](0)), 0, <dynamic>[new typ::Interface::•(self::$declarations.[](1))])));
+ tes::expectTrue(typ::isSubtypeOf(int::type(foo), new typ::FunctionType::•(new typ::Interface::•(self::$declarations.[](6)), new typ::Interface::•(self::$declarations.[](1)), 0, <dynamic>[new typ::Interface::•(self::$declarations.[](0))])));
+ tes::expectTrue(!typ::isSubtypeOf(int::type(qux), new typ::FunctionType::•(new typ::Interface::•(self::$declarations.[](6)), new typ::Interface::•(self::$declarations.[](1)), 0, <dynamic>[new typ::Interface::•(self::$declarations.[](0))])));
+ tes::expectTrue(!typ::isSubtypeOf(int::type(foo), new typ::FunctionType::•(new typ::Interface::•(self::$declarations.[](6)), new typ::Interface::•(self::$declarations.[](0)), 0, <dynamic>[new typ::Interface::•(self::$declarations.[](1))])));
+ tes::expectTrue(typ::isSubtypeOf(int::type(qux), new typ::FunctionType::•(new typ::Interface::•(self::$declarations.[](6)), new typ::Interface::•(self::$declarations.[](0)), 0, <dynamic>[new typ::Interface::•(self::$declarations.[](1))])));
+ tes::expectTrue(typ::isSubtypeOf(int::type(new self::Closure#bar::•()), new typ::FunctionType::•(new typ::Interface::•(self::$declarations.[](6)), new typ::Interface::•(self::$declarations.[](1)), 0, <dynamic>[new typ::Interface::•(self::$declarations.[](0))])));
+ tes::expectTrue(!typ::isSubtypeOf(int::type(new self::Closure#bar::•()), new typ::FunctionType::•(new typ::Interface::•(self::$declarations.[](6)), new typ::Interface::•(self::$declarations.[](0)), 0, <dynamic>[new typ::Interface::•(self::$declarations.[](1))])));
+ tes::expectTrue(typ::isSubtypeOf(int::type(new self::Closure#baz::•()), new typ::FunctionType::•(new typ::Interface::•(self::$declarations.[](6)), new typ::Interface::•(self::$declarations.[](1)), 0, <dynamic>[new typ::Interface::•(self::$declarations.[](0))])));
+ tes::expectTrue(!typ::isSubtypeOf(int::type(new self::Closure#baz::•()), new typ::FunctionType::•(new typ::Interface::•(self::$declarations.[](6)), new typ::Interface::•(self::$declarations.[](0)), 0, <dynamic>[new typ::Interface::•(self::$declarations.[](1))])));
+ (self::A) → dynamic rab = new self::Closure#bar::•();
+ (dynamic) → self::B zab = new self::Closure#baz::•();
+ tes::expectTrue(typ::isSubtypeOf(int::type(rab), new typ::FunctionType::•(new typ::Interface::•(self::$declarations.[](6)), new typ::Interface::•(self::$declarations.[](1)), 0, <dynamic>[new typ::Interface::•(self::$declarations.[](0))])));
+ tes::expectTrue(!typ::isSubtypeOf(int::type(rab), new typ::FunctionType::•(new typ::Interface::•(self::$declarations.[](6)), new typ::Interface::•(self::$declarations.[](0)), 0, <dynamic>[new typ::Interface::•(self::$declarations.[](1))])));
+ tes::expectTrue(typ::isSubtypeOf(int::type(zab), new typ::FunctionType::•(new typ::Interface::•(self::$declarations.[](6)), new typ::Interface::•(self::$declarations.[](1)), 0, <dynamic>[new typ::Interface::•(self::$declarations.[](0))])));
+ tes::expectTrue(!typ::isSubtypeOf(int::type(zab), new typ::FunctionType::•(new typ::Interface::•(self::$declarations.[](6)), new typ::Interface::•(self::$declarations.[](0)), 0, <dynamic>[new typ::Interface::•(self::$declarations.[](1))])));
}
diff --git a/pkg/kernel/testcases/reify/field_initializer2_test.dart.expect b/pkg/kernel/testcases/reify/field_initializer2_test.dart.expect
index e27360d..93f4456 100644
--- a/pkg/kernel/testcases/reify/field_initializer2_test.dart.expect
+++ b/pkg/kernel/testcases/reify/field_initializer2_test.dart.expect
@@ -19,12 +19,15 @@
return this.{=self::A::$type};
}
class B extends core::Object implements int::HasRuntimeTypeGetter {
- field dynamic x;
+ field self::A x;
field dynamic y;
final field typ::ReifiedType $type;
constructor •(typ::ReifiedType $type) → void
: self::B::x = self::B::$init$x($type), self::B::$type = $type, self::B::y = new self::A::•(new typ::Interface::•(self::$declarations.[](0), typ::getTypeArguments(typ::asInstanceOf($type, self::$declarations.[](1))))), super core::Object::•()
;
+ set x$cc(self::A x_) → dynamic {
+ this.{=self::B::x} = x_ as self::A;
+ }
get $B$T() → typ::ReifiedType
return typ::getTypeArguments(typ::asInstanceOf(this.$type, self::$declarations.[](1))).[](0);
get $is$A() → core::bool
@@ -59,9 +62,9 @@
return d;
}.call(dec::allocateDeclarations(<dynamic>["A", "B", "Null", "bool", "String", "int", "double", "Type", "AbstractClassInstantiationError", "NoSuchMethodError", "CyclicInitializationError", "UnsupportedError", "IntegerDivisionByZeroException", "RangeError", "ArgumentError", "Object", "HasRuntimeTypeGetter", "Comparable", "Pattern", "num", "Error", "Exception"], <dynamic>[1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0]));
static method main() → dynamic {
- dynamic b = new self::B::•(new typ::Interface::•(self::$declarations.[](1), <dynamic>[new typ::Interface::•(self::$declarations.[](0), <dynamic>[const typ::Dynamic::•()])]));
- tes::expectTrue(let dynamic #t1 = b.x in #t1 is int::HasRuntimeTypeGetter && #t1.$is$A && (let dynamic #t2 = new typ::Interface::•(self::$declarations.[](0), <dynamic>[new typ::Interface::•(self::$declarations.[](0), <dynamic>[const typ::Dynamic::•()])]) in typ::isSubtypeOf(#t1.$type, #t2)));
- tes::expectTrue(let dynamic #t3 = b.y in #t3 is int::HasRuntimeTypeGetter && #t3.$is$A && (let dynamic #t4 = new typ::Interface::•(self::$declarations.[](0), <dynamic>[new typ::Interface::•(self::$declarations.[](0), <dynamic>[const typ::Dynamic::•()])]) in typ::isSubtypeOf(#t3.$type, #t4)));
- tes::expectFalse(let dynamic #t5 = b.x in #t5 is int::HasRuntimeTypeGetter && #t5.$is$A && (let dynamic #t6 = new typ::Interface::•(self::$declarations.[](0), <dynamic>[new typ::Interface::•(self::$declarations.[](1), <dynamic>[const typ::Dynamic::•()])]) in typ::isSubtypeOf(#t5.$type, #t6)));
- tes::expectFalse(let dynamic #t7 = b.y in #t7 is int::HasRuntimeTypeGetter && #t7.$is$A && (let dynamic #t8 = new typ::Interface::•(self::$declarations.[](0), <dynamic>[new typ::Interface::•(self::$declarations.[](1), <dynamic>[const typ::Dynamic::•()])]) in typ::isSubtypeOf(#t7.$type, #t8)));
+ self::B b = new self::B::•(new typ::Interface::•(self::$declarations.[](1), <dynamic>[new typ::Interface::•(self::$declarations.[](0), <dynamic>[const typ::Dynamic::•()])]));
+ tes::expectTrue(let dynamic #t1 = b.{self::B::x} in #t1 is int::HasRuntimeTypeGetter && #t1.$is$A && (let dynamic #t2 = new typ::Interface::•(self::$declarations.[](0), <dynamic>[new typ::Interface::•(self::$declarations.[](0), <dynamic>[const typ::Dynamic::•()])]) in typ::isSubtypeOf(#t1.$type, #t2)));
+ tes::expectTrue(let dynamic #t3 = b.{self::B::y} in #t3 is int::HasRuntimeTypeGetter && #t3.$is$A && (let dynamic #t4 = new typ::Interface::•(self::$declarations.[](0), <dynamic>[new typ::Interface::•(self::$declarations.[](0), <dynamic>[const typ::Dynamic::•()])]) in typ::isSubtypeOf(#t3.$type, #t4)));
+ tes::expectFalse(let dynamic #t5 = b.{self::B::x} in #t5 is int::HasRuntimeTypeGetter && #t5.$is$A && (let dynamic #t6 = new typ::Interface::•(self::$declarations.[](0), <dynamic>[new typ::Interface::•(self::$declarations.[](1), <dynamic>[const typ::Dynamic::•()])]) in typ::isSubtypeOf(#t5.$type, #t6)));
+ tes::expectFalse(let dynamic #t7 = b.{self::B::y} in #t7 is int::HasRuntimeTypeGetter && #t7.$is$A && (let dynamic #t8 = new typ::Interface::•(self::$declarations.[](0), <dynamic>[new typ::Interface::•(self::$declarations.[](1), <dynamic>[const typ::Dynamic::•()])]) in typ::isSubtypeOf(#t7.$type, #t8)));
}
diff --git a/pkg/kernel/testcases/reify/field_initializer_test.dart.expect b/pkg/kernel/testcases/reify/field_initializer_test.dart.expect
index f5ad332..8490bf3 100644
--- a/pkg/kernel/testcases/reify/field_initializer_test.dart.expect
+++ b/pkg/kernel/testcases/reify/field_initializer_test.dart.expect
@@ -60,6 +60,6 @@
return x;
}
static method main() → dynamic {
- dynamic b = new self::B::•(new typ::Interface::•(self::$declarations.[](1), <dynamic>[const typ::Dynamic::•()]));
+ self::B b = new self::B::•(new typ::Interface::•(self::$declarations.[](1), <dynamic>[const typ::Dynamic::•()]));
tes::expectOutput("b1\nb2\nb3\nb4\na1\na2\nA\nB");
}
diff --git a/pkg/kernel/testcases/reify/function_type_test.dart.expect b/pkg/kernel/testcases/reify/function_type_test.dart.expect
index 7d49eff..c953f80 100644
--- a/pkg/kernel/testcases/reify/function_type_test.dart.expect
+++ b/pkg/kernel/testcases/reify/function_type_test.dart.expect
@@ -156,46 +156,46 @@
return false;
}
static final field core::List<dec::Class> $declarations = (core::List<dec::Class> d) → core::List<dec::Class> {
- dec::init(d, 0, new typ::Interface::•(d.[](30)));
+ dec::init(d, 0, new typ::Interface::•(d.[](17)));
dec::init(d, 1, new typ::Interface::•(d.[](0)));
dec::init(d, 2, new typ::Interface::•(d.[](0)));
- dec::init(d, 3, new typ::Interface::•(d.[](30)), <dynamic>[new typ::Interface::•(d.[](15))], new typ::FunctionType::•(new typ::Interface::•(d.[](15)), new typ::Interface::•(d.[](1)), 0, <dynamic>[new typ::Interface::•(d.[](0))]));
- dec::init(d, 4, new typ::Interface::•(d.[](30)), <dynamic>[], new typ::FunctionType::•(new typ::Interface::•(d.[](15)), new typ::Void::•(), 2, <dynamic>[new typ::Interface::•(d.[](0))]));
- dec::init(d, 5, new typ::Interface::•(d.[](30)), <dynamic>[], new typ::FunctionType::•(new typ::Interface::•(d.[](15)), new typ::Void::•(), 0, <dynamic>[new typ::Interface::•(d.[](0))]));
- dec::init(d, 6, new typ::Interface::•(d.[](30)), <dynamic>[], new typ::FunctionType::•(new typ::Interface::•(d.[](15)), new typ::Void::•(), 2, <dynamic>[new typ::Interface::•(d.[](0)), new typ::Interface::•(d.[](1))]));
- dec::init(d, 7, new typ::Interface::•(d.[](30)), <dynamic>[], new typ::FunctionType::•(new typ::Interface::•(d.[](15)), new typ::Void::•(), 4, <dynamic>[new typ::Interface::•(d.[](0)), new typ::Interface::•(d.[](1)), new typ::Interface::•(d.[](2))]));
- dec::init(d, 8, new typ::Interface::•(d.[](30)), <dynamic>[], new typ::FunctionType::•(new typ::Interface::•(d.[](15)), new typ::Void::•(), 2, <dynamic>[new typ::Interface::•(d.[](0)), new typ::Interface::•(d.[](1)), new typ::Interface::•(d.[](2))]));
- dec::init(d, 9, new typ::Interface::•(d.[](30)), <dynamic>[], new typ::FunctionType::•(new typ::Interface::•(d.[](15)), new typ::Void::•(), 3, <dynamic>["a", new typ::Interface::•(d.[](0))]));
- dec::init(d, 10, new typ::Interface::•(d.[](30)), <dynamic>[], new typ::FunctionType::•(new typ::Interface::•(d.[](15)), new typ::Void::•(), 0, <dynamic>[new typ::Interface::•(d.[](0))]));
- dec::init(d, 11, new typ::Interface::•(d.[](30)), <dynamic>[], new typ::FunctionType::•(new typ::Interface::•(d.[](15)), new typ::Void::•(), 3, <dynamic>[new typ::Interface::•(d.[](0)), "b", new typ::Interface::•(d.[](1))]));
- dec::init(d, 12, new typ::Interface::•(d.[](30)), <dynamic>[], new typ::FunctionType::•(new typ::Interface::•(d.[](15)), new typ::Void::•(), 5, <dynamic>[new typ::Interface::•(d.[](0)), "b", new typ::Interface::•(d.[](1)), "c", new typ::Interface::•(d.[](2))]));
- dec::init(d, 13, new typ::Interface::•(d.[](30)), <dynamic>[], new typ::FunctionType::•(new typ::Interface::•(d.[](15)), new typ::Void::•(), 3, <dynamic>[new typ::Interface::•(d.[](0)), new typ::Interface::•(d.[](1)), "c", new typ::Interface::•(d.[](2))]));
- dec::init(d, 14, new typ::Interface::•(d.[](30)), <dynamic>[], new typ::FunctionType::•(new typ::Interface::•(d.[](15)), new typ::Void::•(), 17, <dynamic>["kE", const typ::Dynamic::•(), "ii", const typ::Dynamic::•(), "oP", const typ::Dynamic::•(), "Ij", const typ::Dynamic::•(), "pA", const typ::Dynamic::•(), "zD", const typ::Dynamic::•(), "aZ", const typ::Dynamic::•(), "UU", const typ::Dynamic::•()]));
- dec::init(d, 15, new typ::Interface::•(d.[](30)));
- dec::init(d, 16, new typ::Interface::•(d.[](30)), <dynamic>[new typ::Interface::•(d.[](32), <dynamic>[d.[](16).variables.[](0)])]);
- dec::init(d, 17, new typ::Interface::•(d.[](30)));
- dec::init(d, 18, new typ::Interface::•(d.[](30)));
- dec::init(d, 19, new typ::Interface::•(d.[](30)), <dynamic>[new typ::Interface::•(d.[](33), <dynamic>[new typ::Interface::•(d.[](19))]), new typ::Interface::•(d.[](34))]);
- dec::init(d, 20, new typ::Interface::•(d.[](35)));
+ dec::init(d, 3, new typ::Interface::•(d.[](17)), <dynamic>[new typ::Interface::•(d.[](15))], new typ::FunctionType::•(new typ::Interface::•(d.[](15)), new typ::Interface::•(d.[](1)), 0, <dynamic>[new typ::Interface::•(d.[](0))]));
+ dec::init(d, 4, new typ::Interface::•(d.[](17)), <dynamic>[], new typ::FunctionType::•(new typ::Interface::•(d.[](15)), new typ::Void::•(), 2, <dynamic>[new typ::Interface::•(d.[](0))]));
+ dec::init(d, 5, new typ::Interface::•(d.[](17)), <dynamic>[], new typ::FunctionType::•(new typ::Interface::•(d.[](15)), new typ::Void::•(), 0, <dynamic>[new typ::Interface::•(d.[](0))]));
+ dec::init(d, 6, new typ::Interface::•(d.[](17)), <dynamic>[], new typ::FunctionType::•(new typ::Interface::•(d.[](15)), new typ::Void::•(), 2, <dynamic>[new typ::Interface::•(d.[](0)), new typ::Interface::•(d.[](1))]));
+ dec::init(d, 7, new typ::Interface::•(d.[](17)), <dynamic>[], new typ::FunctionType::•(new typ::Interface::•(d.[](15)), new typ::Void::•(), 4, <dynamic>[new typ::Interface::•(d.[](0)), new typ::Interface::•(d.[](1)), new typ::Interface::•(d.[](2))]));
+ dec::init(d, 8, new typ::Interface::•(d.[](17)), <dynamic>[], new typ::FunctionType::•(new typ::Interface::•(d.[](15)), new typ::Void::•(), 2, <dynamic>[new typ::Interface::•(d.[](0)), new typ::Interface::•(d.[](1)), new typ::Interface::•(d.[](2))]));
+ dec::init(d, 9, new typ::Interface::•(d.[](17)), <dynamic>[], new typ::FunctionType::•(new typ::Interface::•(d.[](15)), new typ::Void::•(), 3, <dynamic>["a", new typ::Interface::•(d.[](0))]));
+ dec::init(d, 10, new typ::Interface::•(d.[](17)), <dynamic>[], new typ::FunctionType::•(new typ::Interface::•(d.[](15)), new typ::Void::•(), 0, <dynamic>[new typ::Interface::•(d.[](0))]));
+ dec::init(d, 11, new typ::Interface::•(d.[](17)), <dynamic>[], new typ::FunctionType::•(new typ::Interface::•(d.[](15)), new typ::Void::•(), 3, <dynamic>[new typ::Interface::•(d.[](0)), "b", new typ::Interface::•(d.[](1))]));
+ dec::init(d, 12, new typ::Interface::•(d.[](17)), <dynamic>[], new typ::FunctionType::•(new typ::Interface::•(d.[](15)), new typ::Void::•(), 5, <dynamic>[new typ::Interface::•(d.[](0)), "b", new typ::Interface::•(d.[](1)), "c", new typ::Interface::•(d.[](2))]));
+ dec::init(d, 13, new typ::Interface::•(d.[](17)), <dynamic>[], new typ::FunctionType::•(new typ::Interface::•(d.[](15)), new typ::Void::•(), 3, <dynamic>[new typ::Interface::•(d.[](0)), new typ::Interface::•(d.[](1)), "c", new typ::Interface::•(d.[](2))]));
+ dec::init(d, 14, new typ::Interface::•(d.[](17)), <dynamic>[], new typ::FunctionType::•(new typ::Interface::•(d.[](15)), new typ::Void::•(), 17, <dynamic>["kE", const typ::Dynamic::•(), "ii", const typ::Dynamic::•(), "oP", const typ::Dynamic::•(), "Ij", const typ::Dynamic::•(), "pA", const typ::Dynamic::•(), "zD", const typ::Dynamic::•(), "aZ", const typ::Dynamic::•(), "UU", const typ::Dynamic::•()]));
+ dec::init(d, 15, new typ::Interface::•(d.[](17)));
+ dec::init(d, 16, new typ::Interface::•(d.[](17)), <dynamic>[new typ::Interface::•(d.[](32), <dynamic>[d.[](16).variables.[](0)])]);
+ dec::init(d, 17, null);
+ dec::init(d, 18, new typ::Interface::•(d.[](17)));
+ dec::init(d, 19, new typ::Interface::•(d.[](17)));
+ dec::init(d, 20, new typ::Interface::•(d.[](17)), <dynamic>[new typ::Interface::•(d.[](33), <dynamic>[new typ::Interface::•(d.[](20))]), new typ::Interface::•(d.[](34))]);
dec::init(d, 21, new typ::Interface::•(d.[](35)));
- dec::init(d, 22, new typ::Interface::•(d.[](30)));
- dec::init(d, 23, new typ::Interface::•(d.[](36)));
+ dec::init(d, 22, new typ::Interface::•(d.[](35)));
+ dec::init(d, 23, new typ::Interface::•(d.[](17)));
dec::init(d, 24, new typ::Interface::•(d.[](36)));
dec::init(d, 25, new typ::Interface::•(d.[](36)));
dec::init(d, 26, new typ::Interface::•(d.[](36)));
- dec::init(d, 27, new typ::Interface::•(d.[](30)), <dynamic>[new typ::Interface::•(d.[](37))]);
- dec::init(d, 28, new typ::Interface::•(d.[](29)));
- dec::init(d, 29, new typ::Interface::•(d.[](36)));
- dec::init(d, 30, null);
+ dec::init(d, 27, new typ::Interface::•(d.[](36)));
+ dec::init(d, 28, new typ::Interface::•(d.[](17)), <dynamic>[new typ::Interface::•(d.[](37))]);
+ dec::init(d, 29, new typ::Interface::•(d.[](30)));
+ dec::init(d, 30, new typ::Interface::•(d.[](36)));
dec::init(d, 32, new typ::Interface::•(d.[](38), <dynamic>[d.[](32).variables.[](0)]));
- dec::init(d, 33, new typ::Interface::•(d.[](30)));
- dec::init(d, 34, new typ::Interface::•(d.[](30)));
- dec::init(d, 35, new typ::Interface::•(d.[](30)), <dynamic>[new typ::Interface::•(d.[](33), <dynamic>[new typ::Interface::•(d.[](35))])]);
- dec::init(d, 36, new typ::Interface::•(d.[](30)));
- dec::init(d, 37, new typ::Interface::•(d.[](30)));
- dec::init(d, 38, new typ::Interface::•(d.[](30)));
+ dec::init(d, 33, new typ::Interface::•(d.[](17)));
+ dec::init(d, 34, new typ::Interface::•(d.[](17)));
+ dec::init(d, 35, new typ::Interface::•(d.[](17)), <dynamic>[new typ::Interface::•(d.[](33), <dynamic>[new typ::Interface::•(d.[](35))])]);
+ dec::init(d, 36, new typ::Interface::•(d.[](17)));
+ dec::init(d, 37, new typ::Interface::•(d.[](17)));
+ dec::init(d, 38, new typ::Interface::•(d.[](17)));
return d;
-}.call(dec::allocateDeclarations(<dynamic>["A", "B", "C", "D", "ER0P1", "ER1P0", "ER1P1", "ER1P2", "ER2P1", "ER0N1", "ER1N0", "ER1N1", "ER1N2", "ER2N1", "ER0N8", "Function", "List", "Null", "bool", "String", "int", "double", "Type", "AbstractClassInstantiationError", "NoSuchMethodError", "CyclicInitializationError", "UnsupportedError", "IntegerDivisionByZeroException", "RangeError", "ArgumentError", "Object", "HasRuntimeTypeGetter", "EfficientLengthIterable", "Comparable", "Pattern", "num", "Error", "Exception", "Iterable"], <dynamic>[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1]));
+}.call(dec::allocateDeclarations(<dynamic>["A", "B", "C", "D", "ER0P1", "ER1P0", "ER1P1", "ER1P2", "ER2P1", "ER0N1", "ER1N0", "ER1N1", "ER1N2", "ER2N1", "ER0N8", "Function", "List", "Object", "Null", "bool", "String", "int", "double", "Type", "AbstractClassInstantiationError", "NoSuchMethodError", "CyclicInitializationError", "UnsupportedError", "IntegerDivisionByZeroException", "RangeError", "ArgumentError", "HasRuntimeTypeGetter", "EfficientLengthIterable", "Comparable", "Pattern", "num", "Error", "Exception", "Iterable"], <dynamic>[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1]));
static method foo(self::A a) → self::C {
return null;
}
@@ -216,7 +216,7 @@
}
static method main() → dynamic {
self::test(new self::D::•());
- for (dynamic c in int::attachType(<dynamic>[new self::ER0P1::•(), new self::ER1P0::•(), new self::ER1P1::•(), new self::ER1P2::•(), new self::ER2P1::•(), new self::ER0N1::•(), new self::ER1N0::•(), new self::ER1N1::•(), new self::ER1N2::•(), new self::ER2N1::•()], new typ::Interface::•(self::$declarations.[](16), <dynamic>[const typ::Dynamic::•()]))) {
+ for (core::Object c in int::attachType(<core::Object>[new self::ER0P1::•(), new self::ER1P0::•(), new self::ER1P1::•(), new self::ER1P2::•(), new self::ER2P1::•(), new self::ER0N1::•(), new self::ER1N0::•(), new self::ER1N1::•(), new self::ER1N2::•(), new self::ER2N1::•()], new typ::Interface::•(self::$declarations.[](16), <dynamic>[new typ::Interface::•(self::$declarations.[](17))]))) {
self::test(c);
}
tes::expectOutput("true\ntrue\nfalse\nfalse\ntrue\nfalse\nfalse\nfalse\nfalse\ntrue\nfalse\nfalse\nfalse\ntrue\nfalse\nfalse\ntrue\ntrue\nfalse\nfalse\nfalse\nfalse\ntrue\nfalse\nfalse\nfalse\ntrue\nfalse\nfalse\nfalse\ntrue\nfalse\nfalse\nfalse\nfalse\ntrue\nfalse\nfalse\nfalse\ntrue\nfalse\nfalse\nfalse\ntrue\ntrue\nfalse\nfalse\nfalse\ntrue\nfalse\nfalse\nfalse\ntrue\nfalse\nfalse\nfalse\ntrue\ntrue\ntrue\ntrue\nfalse\ntrue\nfalse\nfalse\nfalse\ntrue\nfalse\nfalse\nfalse\nfalse\nfalse\nfalse\ntrue\nfalse\nfalse\nfalse\nfalse\nfalse\ntrue\nfalse\nfalse\nfalse\nfalse\nfalse\nfalse\nfalse\ntrue\nfalse\nfalse\nfalse\nfalse\ntrue\nfalse\nfalse\nfalse\ntrue\nfalse\nfalse\nfalse\nfalse\ntrue\nfalse\nfalse\nfalse\ntrue\nfalse\nfalse\nfalse\ntrue\nfalse\nfalse\nfalse\nfalse\ntrue\ntrue\nfalse\nfalse\ntrue\nfalse\nfalse\nfalse\ntrue\nfalse\nfalse\nfalse\nfalse\ntrue\ntrue\ntrue\nfalse\ntrue\nfalse\nfalse\nfalse\nfalse\nfalse\nfalse\nfalse\nfalse\nfalse\nfalse\nfalse\ntrue");
diff --git a/pkg/kernel/testcases/reify/generic_methods_simple_test.dart b/pkg/kernel/testcases/reify/generic_methods_simple_test.dart
new file mode 100644
index 0000000..f2e13d8
--- /dev/null
+++ b/pkg/kernel/testcases/reify/generic_methods_simple_test.dart
@@ -0,0 +1,15 @@
+// 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.
+
+library generic_methods_simple_test;
+
+import 'test_base.dart';
+
+bool fun<T>(int s) {
+ return true;
+}
+
+main() {
+ expectTrue(fun<double>(2));
+}
diff --git a/pkg/kernel/testcases/reify/generic_methods_simple_test.dart.expect b/pkg/kernel/testcases/reify/generic_methods_simple_test.dart.expect
new file mode 100644
index 0000000..53c2725
--- /dev/null
+++ b/pkg/kernel/testcases/reify/generic_methods_simple_test.dart.expect
@@ -0,0 +1,35 @@
+library generic_methods_simple_test;
+import self as self;
+import "dart:core" as core;
+import "../../runtime/reify/types.dart" as typ;
+import "./test_base.dart" as tes;
+import "../../runtime/reify/declarations.dart" as dec;
+
+static final field core::List<dec::Class> $declarations = (core::List<dec::Class> d) → core::List<dec::Class> {
+ dec::init(d, 0, new typ::Interface::•(d.[](13)));
+ dec::init(d, 1, new typ::Interface::•(d.[](14)));
+ dec::init(d, 2, new typ::Interface::•(d.[](14)));
+ dec::init(d, 3, new typ::Interface::•(d.[](14)), <dynamic>[new typ::Interface::•(d.[](15), <dynamic>[new typ::Interface::•(d.[](3))]), new typ::Interface::•(d.[](16))]);
+ dec::init(d, 4, new typ::Interface::•(d.[](13)));
+ dec::init(d, 5, new typ::Interface::•(d.[](14)));
+ dec::init(d, 6, new typ::Interface::•(d.[](17)));
+ dec::init(d, 7, new typ::Interface::•(d.[](17)));
+ dec::init(d, 8, new typ::Interface::•(d.[](17)));
+ dec::init(d, 9, new typ::Interface::•(d.[](17)));
+ dec::init(d, 10, new typ::Interface::•(d.[](14)), <dynamic>[new typ::Interface::•(d.[](18))]);
+ dec::init(d, 11, new typ::Interface::•(d.[](12)));
+ dec::init(d, 12, new typ::Interface::•(d.[](17)));
+ dec::init(d, 13, new typ::Interface::•(d.[](14)), <dynamic>[new typ::Interface::•(d.[](15), <dynamic>[new typ::Interface::•(d.[](13))])]);
+ dec::init(d, 14, null);
+ dec::init(d, 15, new typ::Interface::•(d.[](14)));
+ dec::init(d, 16, new typ::Interface::•(d.[](14)));
+ dec::init(d, 17, new typ::Interface::•(d.[](14)));
+ dec::init(d, 18, new typ::Interface::•(d.[](14)));
+ return d;
+}.call(dec::allocateDeclarations(<dynamic>["double", "Null", "bool", "String", "int", "Type", "AbstractClassInstantiationError", "NoSuchMethodError", "CyclicInitializationError", "UnsupportedError", "IntegerDivisionByZeroException", "RangeError", "ArgumentError", "num", "Object", "Comparable", "Pattern", "Error", "Exception"], <dynamic>[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0]));
+static method fun(core::int s, {core::List<typ::ReifiedType> $typeParameters}) → core::bool {
+ return true;
+}
+static method main() → dynamic {
+ tes::expectTrue(self::fun(2, $typeParameters: <typ::ReifiedType>[new typ::Interface::•(self::$declarations.[](0))]));
+}
diff --git a/pkg/kernel/testcases/reify/is1_test.dart.expect b/pkg/kernel/testcases/reify/is1_test.dart.expect
index 7f3642a..020cdc3 100644
--- a/pkg/kernel/testcases/reify/is1_test.dart.expect
+++ b/pkg/kernel/testcases/reify/is1_test.dart.expect
@@ -72,11 +72,11 @@
return d;
}.call(dec::allocateDeclarations(<dynamic>["N", "I", "D", "A", "Null", "bool", "String", "int", "double", "Type", "AbstractClassInstantiationError", "NoSuchMethodError", "CyclicInitializationError", "UnsupportedError", "IntegerDivisionByZeroException", "RangeError", "ArgumentError", "Object", "HasRuntimeTypeGetter", "Comparable", "Pattern", "num", "Error", "Exception"], <dynamic>[0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0]));
static method main() → dynamic {
- dynamic x = new self::A::•(new typ::Interface::•(self::$declarations.[](3), <dynamic>[new typ::Interface::•(self::$declarations.[](1))]));
+ self::A x = new self::A::•(new typ::Interface::•(self::$declarations.[](3), <dynamic>[new typ::Interface::•(self::$declarations.[](1))]));
tes::expectTrue(let dynamic #t1 = x in #t1 is int::HasRuntimeTypeGetter && #t1.$is$A && (let dynamic #t2 = new typ::Interface::•(self::$declarations.[](3), <dynamic>[new typ::Interface::•(self::$declarations.[](0))]) in typ::isSubtypeOf(#t1.$type, #t2)));
tes::expectTrue(let dynamic #t3 = x in #t3 is int::HasRuntimeTypeGetter && #t3.$is$A && (let dynamic #t4 = new typ::Interface::•(self::$declarations.[](3), <dynamic>[new typ::Interface::•(self::$declarations.[](1))]) in typ::isSubtypeOf(#t3.$type, #t4)));
tes::expectFalse(let dynamic #t5 = x in #t5 is int::HasRuntimeTypeGetter && #t5.$is$A && (let dynamic #t6 = new typ::Interface::•(self::$declarations.[](3), <dynamic>[new typ::Interface::•(self::$declarations.[](2))]) in typ::isSubtypeOf(#t5.$type, #t6)));
- dynamic y = new self::A::•(new typ::Interface::•(self::$declarations.[](3), <dynamic>[const typ::Dynamic::•()]));
+ self::A y = new self::A::•(new typ::Interface::•(self::$declarations.[](3), <dynamic>[const typ::Dynamic::•()]));
tes::expectTrue(let dynamic #t7 = y in #t7 is int::HasRuntimeTypeGetter && #t7.$is$A && (let dynamic #t8 = new typ::Interface::•(self::$declarations.[](3), <dynamic>[new typ::Interface::•(self::$declarations.[](0))]) in typ::isSubtypeOf(#t7.$type, #t8)));
tes::expectTrue(let dynamic #t9 = y in #t9 is int::HasRuntimeTypeGetter && #t9.$is$A && (let dynamic #t10 = new typ::Interface::•(self::$declarations.[](3), <dynamic>[new typ::Interface::•(self::$declarations.[](1))]) in typ::isSubtypeOf(#t9.$type, #t10)));
tes::expectTrue(let dynamic #t11 = y in #t11 is int::HasRuntimeTypeGetter && #t11.$is$A && (let dynamic #t12 = new typ::Interface::•(self::$declarations.[](3), <dynamic>[new typ::Interface::•(self::$declarations.[](2))]) in typ::isSubtypeOf(#t11.$type, #t12)));
diff --git a/pkg/kernel/testcases/reify/native_types_test.dart.expect b/pkg/kernel/testcases/reify/native_types_test.dart.expect
index 0000d2f..ca0fa91 100644
--- a/pkg/kernel/testcases/reify/native_types_test.dart.expect
+++ b/pkg/kernel/testcases/reify/native_types_test.dart.expect
@@ -79,7 +79,7 @@
constructor •(final mock::Context context) → dynamic
: self::Closure#main#function::context = context
;
- method call() → dynamic {
+ method call() → self::C {
"This is a temporary solution. In the VM, this will become an additional parameter.";
final mock::Context #contextParameter = this.{self::Closure#main#function::context};
return throw int::attachType(new core::AbstractClassInstantiationError::•("C"), new typ::Interface::•(self::$declarations.[](3)));
@@ -119,7 +119,7 @@
constructor •(final mock::Context context) → dynamic
: self::Closure#main#function#1::context = context
;
- method call(dynamic e) → dynamic {
+ method call(dynamic e) → core::bool {
"This is a temporary solution. In the VM, this will become an additional parameter.";
final mock::Context #contextParameter = this.{self::Closure#main#function#1::context};
return typ::isSubtypeOf(int::type(e), new typ::Interface::•(self::$declarations.[](3)));
@@ -199,7 +199,7 @@
constructor •(final mock::Context context) → dynamic
: self::Closure#main#function#3::context = context
;
- method call(dynamic e) → dynamic {
+ method call(dynamic e) → core::bool {
"This is a temporary solution. In the VM, this will become an additional parameter.";
final mock::Context #contextParameter = this.{self::Closure#main#function#3::context};
return typ::isSubtypeOf(int::type(e), new typ::Interface::•(self::$declarations.[](7)));
@@ -279,7 +279,7 @@
constructor •(final mock::Context context) → dynamic
: self::Closure#main#function#5::context = context
;
- method call(dynamic e) → dynamic {
+ method call(dynamic e) → core::bool {
"This is a temporary solution. In the VM, this will become an additional parameter.";
final mock::Context #contextParameter = this.{self::Closure#main#function#5::context};
return typ::isSubtypeOf(int::type(e), new typ::Interface::•(self::$declarations.[](10)));
@@ -322,7 +322,7 @@
method call() → dynamic {
"This is a temporary solution. In the VM, this will become an additional parameter.";
final mock::Context #contextParameter = this.{self::Closure#main#function#6::context};
- return int::attachType(<dynamic>[], new typ::Interface::•(self::$declarations.[](12), <dynamic>[const typ::Dynamic::•()])).[](1);
+ return int::attachType(<dynamic>[], new typ::Interface::•(self::$declarations.[](12), <dynamic>[const typ::Dynamic::•()])).{core::List::[]}(1);
}
get $type() → typ::ReifiedType
return new typ::Interface::•(self::$declarations.[](11));
@@ -359,7 +359,7 @@
constructor •(final mock::Context context) → dynamic
: self::Closure#main#function#7::context = context
;
- method call(dynamic e) → dynamic {
+ method call(dynamic e) → core::bool {
"This is a temporary solution. In the VM, this will become an additional parameter.";
final mock::Context #contextParameter = this.{self::Closure#main#function#7::context};
return typ::isSubtypeOf(int::type(e), new typ::Interface::•(self::$declarations.[](14)));
@@ -398,18 +398,18 @@
static final field core::List<dec::Class> $declarations = (core::List<dec::Class> d) → core::List<dec::Class> {
dec::init(d, 0, new typ::Interface::•(d.[](18)));
dec::init(d, 1, new typ::Interface::•(d.[](18)));
- dec::init(d, 2, new typ::Interface::•(d.[](18)), <dynamic>[new typ::Interface::•(d.[](26))], new typ::FunctionType::•(new typ::Interface::•(d.[](26)), const typ::Dynamic::•(), 0, <dynamic>[]));
+ dec::init(d, 2, new typ::Interface::•(d.[](18)), <dynamic>[new typ::Interface::•(d.[](26))], new typ::FunctionType::•(new typ::Interface::•(d.[](26)), new typ::Interface::•(d.[](0)), 0, <dynamic>[]));
dec::init(d, 3, new typ::Interface::•(d.[](27)));
- dec::init(d, 4, new typ::Interface::•(d.[](18)), <dynamic>[new typ::Interface::•(d.[](26))], new typ::FunctionType::•(new typ::Interface::•(d.[](26)), const typ::Dynamic::•(), 0, <dynamic>[const typ::Dynamic::•()]));
+ dec::init(d, 4, new typ::Interface::•(d.[](18)), <dynamic>[new typ::Interface::•(d.[](26))], new typ::FunctionType::•(new typ::Interface::•(d.[](26)), new typ::Interface::•(d.[](19)), 0, <dynamic>[const typ::Dynamic::•()]));
dec::init(d, 5, new typ::Interface::•(d.[](18)), <dynamic>[new typ::Interface::•(d.[](26))], new typ::FunctionType::•(new typ::Interface::•(d.[](26)), const typ::Dynamic::•(), 0, <dynamic>[]));
- dec::init(d, 6, new typ::Interface::•(d.[](18)), <dynamic>[new typ::Interface::•(d.[](26))], new typ::FunctionType::•(new typ::Interface::•(d.[](26)), const typ::Dynamic::•(), 0, <dynamic>[const typ::Dynamic::•()]));
+ dec::init(d, 6, new typ::Interface::•(d.[](18)), <dynamic>[new typ::Interface::•(d.[](26))], new typ::FunctionType::•(new typ::Interface::•(d.[](26)), new typ::Interface::•(d.[](19)), 0, <dynamic>[const typ::Dynamic::•()]));
dec::init(d, 7, new typ::Interface::•(d.[](27)));
dec::init(d, 8, new typ::Interface::•(d.[](18)), <dynamic>[new typ::Interface::•(d.[](26))], new typ::FunctionType::•(new typ::Interface::•(d.[](26)), const typ::Dynamic::•(), 0, <dynamic>[]));
- dec::init(d, 9, new typ::Interface::•(d.[](18)), <dynamic>[new typ::Interface::•(d.[](26))], new typ::FunctionType::•(new typ::Interface::•(d.[](26)), const typ::Dynamic::•(), 0, <dynamic>[const typ::Dynamic::•()]));
+ dec::init(d, 9, new typ::Interface::•(d.[](18)), <dynamic>[new typ::Interface::•(d.[](26))], new typ::FunctionType::•(new typ::Interface::•(d.[](26)), new typ::Interface::•(d.[](19)), 0, <dynamic>[const typ::Dynamic::•()]));
dec::init(d, 10, new typ::Interface::•(d.[](27)));
dec::init(d, 11, new typ::Interface::•(d.[](18)), <dynamic>[new typ::Interface::•(d.[](26))], new typ::FunctionType::•(new typ::Interface::•(d.[](26)), const typ::Dynamic::•(), 0, <dynamic>[]));
dec::init(d, 12, new typ::Interface::•(d.[](18)), <dynamic>[new typ::Interface::•(d.[](28), <dynamic>[d.[](12).variables.[](0)])]);
- dec::init(d, 13, new typ::Interface::•(d.[](18)), <dynamic>[new typ::Interface::•(d.[](26))], new typ::FunctionType::•(new typ::Interface::•(d.[](26)), const typ::Dynamic::•(), 0, <dynamic>[const typ::Dynamic::•()]));
+ dec::init(d, 13, new typ::Interface::•(d.[](18)), <dynamic>[new typ::Interface::•(d.[](26))], new typ::FunctionType::•(new typ::Interface::•(d.[](26)), new typ::Interface::•(d.[](19)), 0, <dynamic>[const typ::Dynamic::•()]));
dec::init(d, 14, new typ::Interface::•(d.[](21)));
dec::init(d, 15, new typ::Interface::•(d.[](29)));
dec::init(d, 16, new typ::Interface::•(d.[](29)));
diff --git a/pkg/kernel/testcases/reify/reuse_type_variables_test.dart.expect b/pkg/kernel/testcases/reify/reuse_type_variables_test.dart.expect
index ebdfa26..473772b 100644
--- a/pkg/kernel/testcases/reify/reuse_type_variables_test.dart.expect
+++ b/pkg/kernel/testcases/reify/reuse_type_variables_test.dart.expect
@@ -147,15 +147,15 @@
return d;
}.call(dec::allocateDeclarations(<dynamic>["X", "Y", "Z", "C", "D", "E", "Null", "bool", "String", "int", "double", "Type", "AbstractClassInstantiationError", "NoSuchMethodError", "CyclicInitializationError", "UnsupportedError", "IntegerDivisionByZeroException", "RangeError", "ArgumentError", "Object", "HasRuntimeTypeGetter", "Comparable", "Pattern", "num", "Error", "Exception"], <dynamic>[0, 0, 0, 3, 3, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0]));
static method main() → dynamic {
- dynamic c = new self::C::•(new typ::Interface::•(self::$declarations.[](3), <dynamic>[new typ::Interface::•(self::$declarations.[](0)), new typ::Interface::•(self::$declarations.[](1)), new typ::Interface::•(self::$declarations.[](2))]));
- dynamic d = c.foo();
+ self::C c = new self::C::•(new typ::Interface::•(self::$declarations.[](3), <dynamic>[new typ::Interface::•(self::$declarations.[](0)), new typ::Interface::•(self::$declarations.[](1)), new typ::Interface::•(self::$declarations.[](2))]));
+ dynamic d = c.{self::C::foo}();
tes::expectTrue(let dynamic #t1 = d in #t1 is int::HasRuntimeTypeGetter && #t1.$is$D && (let dynamic #t2 = new typ::Interface::•(self::$declarations.[](4), <dynamic>[new typ::Interface::•(self::$declarations.[](0)), new typ::Interface::•(self::$declarations.[](1)), new typ::Interface::•(self::$declarations.[](2))]) in typ::isSubtypeOf(#t1.$type, #t2)));
- d = c.hest();
+ d = c.{self::C::hest}();
tes::expectTrue(!(let dynamic #t3 = d in #t3 is int::HasRuntimeTypeGetter && #t3.$is$D && (let dynamic #t4 = new typ::Interface::•(self::$declarations.[](4), <dynamic>[new typ::Interface::•(self::$declarations.[](0)), new typ::Interface::•(self::$declarations.[](1)), new typ::Interface::•(self::$declarations.[](2))]) in typ::isSubtypeOf(#t3.$type, #t4))));
tes::expectTrue(let dynamic #t5 = d in #t5 is int::HasRuntimeTypeGetter && #t5.$is$D && (let dynamic #t6 = new typ::Interface::•(self::$declarations.[](4), <dynamic>[new typ::Interface::•(self::$declarations.[](0)), new typ::Interface::•(self::$declarations.[](2)), new typ::Interface::•(self::$declarations.[](1))]) in typ::isSubtypeOf(#t5.$type, #t6)));
c = d.baz();
tes::expectTrue(let dynamic #t7 = c in #t7 is int::HasRuntimeTypeGetter && #t7.$is$C && (let dynamic #t8 = new typ::Interface::•(self::$declarations.[](3), <dynamic>[new typ::Interface::•(self::$declarations.[](0)), new typ::Interface::•(self::$declarations.[](2)), new typ::Interface::•(self::$declarations.[](1))]) in typ::isSubtypeOf(#t7.$type, #t8)));
- dynamic e = c.bar();
+ dynamic e = c.{self::C::bar}();
tes::expectTrue(let dynamic #t9 = e in #t9 is int::HasRuntimeTypeGetter && #t9.$is$E && (let dynamic #t10 = new typ::Interface::•(self::$declarations.[](5), <dynamic>[new typ::Interface::•(self::$declarations.[](0)), new typ::Interface::•(self::$declarations.[](2))]) in typ::isSubtypeOf(#t9.$type, #t10)));
c = e.qux();
tes::expectTrue(let dynamic #t11 = c in #t11 is int::HasRuntimeTypeGetter && #t11.$is$C && (let dynamic #t12 = new typ::Interface::•(self::$declarations.[](3), <dynamic>[new typ::Interface::•(self::$declarations.[](0)), new typ::Interface::•(self::$declarations.[](2)), new typ::Interface::•(self::$declarations.[](2))]) in typ::isSubtypeOf(#t11.$type, #t12)));
diff --git a/pkg/kernel/testcases/reify/simple_test.dart.expect b/pkg/kernel/testcases/reify/simple_test.dart.expect
index 3023fe3..3b1c713 100644
--- a/pkg/kernel/testcases/reify/simple_test.dart.expect
+++ b/pkg/kernel/testcases/reify/simple_test.dart.expect
@@ -145,8 +145,8 @@
tes::write(!(let dynamic #t8 = o in #t8 is int::HasRuntimeTypeGetter && #t8.$is$D));
}
static method main() → dynamic {
- dynamic objects = int::attachType(<dynamic>[new self::A::•(), new self::B::•(), new self::C::•(), new self::D::•()], new typ::Interface::•(self::$declarations.[](6), <dynamic>[const typ::Dynamic::•()]));
- objects.forEach(new self::Closure#testIs::•());
- objects.forEach(new self::Closure#testIsNot::•());
+ core::List<self::C> objects = int::attachType(<self::C>[new self::A::•(), new self::B::•(), new self::C::•(), new self::D::•()], new typ::Interface::•(self::$declarations.[](6), <dynamic>[new typ::Interface::•(self::$declarations.[](0))]));
+ objects.{core::Iterable::forEach}(new self::Closure#testIs::•());
+ objects.{core::Iterable::forEach}(new self::Closure#testIsNot::•());
tes::expectOutput("true\nfalse\ntrue\nfalse\nfalse\ntrue\ntrue\nfalse\nfalse\nfalse\ntrue\nfalse\nfalse\ntrue\ntrue\ntrue\nfalse\ntrue\nfalse\ntrue\ntrue\nfalse\nfalse\ntrue\ntrue\ntrue\nfalse\ntrue\ntrue\nfalse\nfalse\nfalse");
}
diff --git a/pkg/kernel/testcases/reify/subclass_test.dart.expect b/pkg/kernel/testcases/reify/subclass_test.dart.expect
index 55d42f8..2317bb7 100644
--- a/pkg/kernel/testcases/reify/subclass_test.dart.expect
+++ b/pkg/kernel/testcases/reify/subclass_test.dart.expect
@@ -108,12 +108,12 @@
return d;
}.call(dec::allocateDeclarations(<dynamic>["X", "Y", "R", "A", "B", "C", "D", "Null", "bool", "String", "int", "double", "Type", "AbstractClassInstantiationError", "NoSuchMethodError", "CyclicInitializationError", "UnsupportedError", "IntegerDivisionByZeroException", "RangeError", "ArgumentError", "Object", "HasRuntimeTypeGetter", "Comparable", "Pattern", "num", "Error", "Exception"], <dynamic>[0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0]));
static method main() → dynamic {
- tes::expectTrue(let dynamic #t1 = new self::A::•(new typ::Interface::•(self::$declarations.[](3), <dynamic>[new typ::Interface::•(self::$declarations.[](0))])).foo() in #t1 is int::HasRuntimeTypeGetter && #t1.$is$R && (let dynamic #t2 = new typ::Interface::•(self::$declarations.[](2), <dynamic>[new typ::Interface::•(self::$declarations.[](0))]) in typ::isSubtypeOf(#t1.$type, #t2)));
- tes::expectTrue(let dynamic #t3 = new self::B::•(new typ::Interface::•(self::$declarations.[](4), <dynamic>[new typ::Interface::•(self::$declarations.[](0))])).foo() in #t3 is int::HasRuntimeTypeGetter && #t3.$is$R && (let dynamic #t4 = new typ::Interface::•(self::$declarations.[](2), <dynamic>[new typ::Interface::•(self::$declarations.[](0))]) in typ::isSubtypeOf(#t3.$type, #t4)));
- tes::expectTrue(let dynamic #t5 = new self::C::•(new typ::Interface::•(self::$declarations.[](5), <dynamic>[new typ::Interface::•(self::$declarations.[](0))])).foo() in #t5 is int::HasRuntimeTypeGetter && #t5.$is$R && (let dynamic #t6 = new typ::Interface::•(self::$declarations.[](2), <dynamic>[new typ::Interface::•(self::$declarations.[](1))]) in typ::isSubtypeOf(#t5.$type, #t6)));
- tes::expectTrue(let dynamic #t7 = new self::D::•(new typ::Interface::•(self::$declarations.[](6), <dynamic>[new typ::Interface::•(self::$declarations.[](0))])).foo() in #t7 is int::HasRuntimeTypeGetter && #t7.$is$R && (let dynamic #t8 = new typ::Interface::•(self::$declarations.[](2), <dynamic>[new typ::Interface::•(self::$declarations.[](2), <dynamic>[new typ::Interface::•(self::$declarations.[](0))])]) in typ::isSubtypeOf(#t7.$type, #t8)));
- tes::expectTrue(!(let dynamic #t9 = new self::A::•(new typ::Interface::•(self::$declarations.[](3), <dynamic>[new typ::Interface::•(self::$declarations.[](0))])).foo() in #t9 is int::HasRuntimeTypeGetter && #t9.$is$R && (let dynamic #t10 = new typ::Interface::•(self::$declarations.[](2), <dynamic>[new typ::Interface::•(self::$declarations.[](1))]) in typ::isSubtypeOf(#t9.$type, #t10))));
- tes::expectTrue(!(let dynamic #t11 = new self::B::•(new typ::Interface::•(self::$declarations.[](4), <dynamic>[new typ::Interface::•(self::$declarations.[](0))])).foo() in #t11 is int::HasRuntimeTypeGetter && #t11.$is$R && (let dynamic #t12 = new typ::Interface::•(self::$declarations.[](2), <dynamic>[new typ::Interface::•(self::$declarations.[](1))]) in typ::isSubtypeOf(#t11.$type, #t12))));
- tes::expectTrue(!(let dynamic #t13 = new self::C::•(new typ::Interface::•(self::$declarations.[](5), <dynamic>[new typ::Interface::•(self::$declarations.[](0))])).foo() in #t13 is int::HasRuntimeTypeGetter && #t13.$is$R && (let dynamic #t14 = new typ::Interface::•(self::$declarations.[](2), <dynamic>[new typ::Interface::•(self::$declarations.[](0))]) in typ::isSubtypeOf(#t13.$type, #t14))));
- tes::expectTrue(!(let dynamic #t15 = new self::D::•(new typ::Interface::•(self::$declarations.[](6), <dynamic>[new typ::Interface::•(self::$declarations.[](0))])).foo() in #t15 is int::HasRuntimeTypeGetter && #t15.$is$R && (let dynamic #t16 = new typ::Interface::•(self::$declarations.[](2), <dynamic>[new typ::Interface::•(self::$declarations.[](2), <dynamic>[new typ::Interface::•(self::$declarations.[](1))])]) in typ::isSubtypeOf(#t15.$type, #t16))));
+ tes::expectTrue(let dynamic #t1 = new self::A::•(new typ::Interface::•(self::$declarations.[](3), <dynamic>[new typ::Interface::•(self::$declarations.[](0))])).{self::A::foo}() in #t1 is int::HasRuntimeTypeGetter && #t1.$is$R && (let dynamic #t2 = new typ::Interface::•(self::$declarations.[](2), <dynamic>[new typ::Interface::•(self::$declarations.[](0))]) in typ::isSubtypeOf(#t1.$type, #t2)));
+ tes::expectTrue(let dynamic #t3 = new self::B::•(new typ::Interface::•(self::$declarations.[](4), <dynamic>[new typ::Interface::•(self::$declarations.[](0))])).{self::A::foo}() in #t3 is int::HasRuntimeTypeGetter && #t3.$is$R && (let dynamic #t4 = new typ::Interface::•(self::$declarations.[](2), <dynamic>[new typ::Interface::•(self::$declarations.[](0))]) in typ::isSubtypeOf(#t3.$type, #t4)));
+ tes::expectTrue(let dynamic #t5 = new self::C::•(new typ::Interface::•(self::$declarations.[](5), <dynamic>[new typ::Interface::•(self::$declarations.[](0))])).{self::A::foo}() in #t5 is int::HasRuntimeTypeGetter && #t5.$is$R && (let dynamic #t6 = new typ::Interface::•(self::$declarations.[](2), <dynamic>[new typ::Interface::•(self::$declarations.[](1))]) in typ::isSubtypeOf(#t5.$type, #t6)));
+ tes::expectTrue(let dynamic #t7 = new self::D::•(new typ::Interface::•(self::$declarations.[](6), <dynamic>[new typ::Interface::•(self::$declarations.[](0))])).{self::A::foo}() in #t7 is int::HasRuntimeTypeGetter && #t7.$is$R && (let dynamic #t8 = new typ::Interface::•(self::$declarations.[](2), <dynamic>[new typ::Interface::•(self::$declarations.[](2), <dynamic>[new typ::Interface::•(self::$declarations.[](0))])]) in typ::isSubtypeOf(#t7.$type, #t8)));
+ tes::expectTrue(!(let dynamic #t9 = new self::A::•(new typ::Interface::•(self::$declarations.[](3), <dynamic>[new typ::Interface::•(self::$declarations.[](0))])).{self::A::foo}() in #t9 is int::HasRuntimeTypeGetter && #t9.$is$R && (let dynamic #t10 = new typ::Interface::•(self::$declarations.[](2), <dynamic>[new typ::Interface::•(self::$declarations.[](1))]) in typ::isSubtypeOf(#t9.$type, #t10))));
+ tes::expectTrue(!(let dynamic #t11 = new self::B::•(new typ::Interface::•(self::$declarations.[](4), <dynamic>[new typ::Interface::•(self::$declarations.[](0))])).{self::A::foo}() in #t11 is int::HasRuntimeTypeGetter && #t11.$is$R && (let dynamic #t12 = new typ::Interface::•(self::$declarations.[](2), <dynamic>[new typ::Interface::•(self::$declarations.[](1))]) in typ::isSubtypeOf(#t11.$type, #t12))));
+ tes::expectTrue(!(let dynamic #t13 = new self::C::•(new typ::Interface::•(self::$declarations.[](5), <dynamic>[new typ::Interface::•(self::$declarations.[](0))])).{self::A::foo}() in #t13 is int::HasRuntimeTypeGetter && #t13.$is$R && (let dynamic #t14 = new typ::Interface::•(self::$declarations.[](2), <dynamic>[new typ::Interface::•(self::$declarations.[](0))]) in typ::isSubtypeOf(#t13.$type, #t14))));
+ tes::expectTrue(!(let dynamic #t15 = new self::D::•(new typ::Interface::•(self::$declarations.[](6), <dynamic>[new typ::Interface::•(self::$declarations.[](0))])).{self::A::foo}() in #t15 is int::HasRuntimeTypeGetter && #t15.$is$R && (let dynamic #t16 = new typ::Interface::•(self::$declarations.[](2), <dynamic>[new typ::Interface::•(self::$declarations.[](2), <dynamic>[new typ::Interface::•(self::$declarations.[](1))])]) in typ::isSubtypeOf(#t15.$type, #t16))));
}
diff --git a/pkg/kernel/testcases/reify/super1_test.dart.expect b/pkg/kernel/testcases/reify/super1_test.dart.expect
index 8b3d20d..3879cd4 100644
--- a/pkg/kernel/testcases/reify/super1_test.dart.expect
+++ b/pkg/kernel/testcases/reify/super1_test.dart.expect
@@ -3,6 +3,7 @@
import "dart:core" as core;
import "../../runtime/reify/interceptors.dart" as int;
import "../../runtime/reify/types.dart" as typ;
+import "dart:mock" as mock;
import "../../runtime/reify/declarations.dart" as dec;
class A extends core::Object implements int::HasRuntimeTypeGetter {
@@ -18,7 +19,7 @@
class B extends self::A implements int::HasRuntimeTypeGetter {
field core::int i;
constructor •(typ::ReifiedType $type, core::int i) → void
- : self::B::i = i, super self::A::•($type)
+ : self::B::i = let final mock::Context #context = int::attachType(new mock::Context::•(1), new typ::Interface::•(self::$declarations.[](2))) in let dynamic #t1 = #context.[]=(0, i) in #context.[](0), super self::A::•($type)
;
constructor redirect(typ::ReifiedType $type) → void
: this self::B::•($type, 42)
@@ -27,27 +28,28 @@
return typ::getTypeArguments(typ::asInstanceOf(this.$type, self::$declarations.[](1))).[](0);
}
static final field core::List<dec::Class> $declarations = (core::List<dec::Class> d) → core::List<dec::Class> {
- dec::init(d, 0, new typ::Interface::•(d.[](15)));
+ dec::init(d, 0, new typ::Interface::•(d.[](16)));
dec::init(d, 1, new typ::Interface::•(d.[](0), <dynamic>[d.[](1).variables.[](0)]));
- dec::init(d, 2, new typ::Interface::•(d.[](15)));
- dec::init(d, 3, new typ::Interface::•(d.[](15)));
- dec::init(d, 4, new typ::Interface::•(d.[](15)), <dynamic>[new typ::Interface::•(d.[](17), <dynamic>[new typ::Interface::•(d.[](4))]), new typ::Interface::•(d.[](18))]);
- dec::init(d, 5, new typ::Interface::•(d.[](19)));
- dec::init(d, 6, new typ::Interface::•(d.[](19)));
- dec::init(d, 7, new typ::Interface::•(d.[](15)));
- dec::init(d, 8, new typ::Interface::•(d.[](20)));
- dec::init(d, 9, new typ::Interface::•(d.[](20)));
- dec::init(d, 10, new typ::Interface::•(d.[](20)));
- dec::init(d, 11, new typ::Interface::•(d.[](20)));
- dec::init(d, 12, new typ::Interface::•(d.[](15)), <dynamic>[new typ::Interface::•(d.[](21))]);
- dec::init(d, 13, new typ::Interface::•(d.[](14)));
- dec::init(d, 14, new typ::Interface::•(d.[](20)));
- dec::init(d, 15, null);
- dec::init(d, 17, new typ::Interface::•(d.[](15)));
- dec::init(d, 18, new typ::Interface::•(d.[](15)));
- dec::init(d, 19, new typ::Interface::•(d.[](15)), <dynamic>[new typ::Interface::•(d.[](17), <dynamic>[new typ::Interface::•(d.[](19))])]);
- dec::init(d, 20, new typ::Interface::•(d.[](15)));
- dec::init(d, 21, new typ::Interface::•(d.[](15)));
+ dec::init(d, 2, new typ::Interface::•(d.[](16)));
+ dec::init(d, 3, new typ::Interface::•(d.[](16)));
+ dec::init(d, 4, new typ::Interface::•(d.[](16)));
+ dec::init(d, 5, new typ::Interface::•(d.[](16)), <dynamic>[new typ::Interface::•(d.[](18), <dynamic>[new typ::Interface::•(d.[](5))]), new typ::Interface::•(d.[](19))]);
+ dec::init(d, 6, new typ::Interface::•(d.[](20)));
+ dec::init(d, 7, new typ::Interface::•(d.[](20)));
+ dec::init(d, 8, new typ::Interface::•(d.[](16)));
+ dec::init(d, 9, new typ::Interface::•(d.[](21)));
+ dec::init(d, 10, new typ::Interface::•(d.[](21)));
+ dec::init(d, 11, new typ::Interface::•(d.[](21)));
+ dec::init(d, 12, new typ::Interface::•(d.[](21)));
+ dec::init(d, 13, new typ::Interface::•(d.[](16)), <dynamic>[new typ::Interface::•(d.[](22))]);
+ dec::init(d, 14, new typ::Interface::•(d.[](15)));
+ dec::init(d, 15, new typ::Interface::•(d.[](21)));
+ dec::init(d, 16, null);
+ dec::init(d, 18, new typ::Interface::•(d.[](16)));
+ dec::init(d, 19, new typ::Interface::•(d.[](16)));
+ dec::init(d, 20, new typ::Interface::•(d.[](16)), <dynamic>[new typ::Interface::•(d.[](18), <dynamic>[new typ::Interface::•(d.[](20))])]);
+ dec::init(d, 21, new typ::Interface::•(d.[](16)));
+ dec::init(d, 22, new typ::Interface::•(d.[](16)));
return d;
-}.call(dec::allocateDeclarations(<dynamic>["A", "B", "Null", "bool", "String", "int", "double", "Type", "AbstractClassInstantiationError", "NoSuchMethodError", "CyclicInitializationError", "UnsupportedError", "IntegerDivisionByZeroException", "RangeError", "ArgumentError", "Object", "HasRuntimeTypeGetter", "Comparable", "Pattern", "num", "Error", "Exception"], <dynamic>[1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0]));
+}.call(dec::allocateDeclarations(<dynamic>["A", "B", "Context", "Null", "bool", "String", "int", "double", "Type", "AbstractClassInstantiationError", "NoSuchMethodError", "CyclicInitializationError", "UnsupportedError", "IntegerDivisionByZeroException", "RangeError", "ArgumentError", "Object", "HasRuntimeTypeGetter", "Comparable", "Pattern", "num", "Error", "Exception"], <dynamic>[1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0]));
static method main() → dynamic {}
diff --git a/pkg/kernel/testcases/reify/super3_test.dart.expect b/pkg/kernel/testcases/reify/super3_test.dart.expect
index 7ced8ac..6ec46e7 100644
--- a/pkg/kernel/testcases/reify/super3_test.dart.expect
+++ b/pkg/kernel/testcases/reify/super3_test.dart.expect
@@ -53,6 +53,6 @@
return d;
}.call(dec::allocateDeclarations(<dynamic>["A", "B", "Null", "bool", "String", "int", "double", "Type", "AbstractClassInstantiationError", "NoSuchMethodError", "CyclicInitializationError", "UnsupportedError", "IntegerDivisionByZeroException", "RangeError", "ArgumentError", "Object", "HasRuntimeTypeGetter", "Comparable", "Pattern", "num", "Error", "Exception"], <dynamic>[1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0]));
static method main() → dynamic {
- new self::B::•().foo;
+ new self::B::•().{self::A::foo};
new self::B::redirect();
}
diff --git a/pkg/kernel/testcases/reify/typevariable1_test.dart.expect b/pkg/kernel/testcases/reify/typevariable1_test.dart.expect
index 6feca7a..d6856ba 100644
--- a/pkg/kernel/testcases/reify/typevariable1_test.dart.expect
+++ b/pkg/kernel/testcases/reify/typevariable1_test.dart.expect
@@ -56,6 +56,6 @@
return d;
}.call(dec::allocateDeclarations(<dynamic>["Z", "N", "Null", "bool", "String", "int", "double", "Type", "AbstractClassInstantiationError", "NoSuchMethodError", "CyclicInitializationError", "UnsupportedError", "IntegerDivisionByZeroException", "RangeError", "ArgumentError", "Object", "HasRuntimeTypeGetter", "Comparable", "Pattern", "num", "Error", "Exception"], <dynamic>[0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0]));
static method main() → dynamic {
- dynamic one = new self::Z::•().succ;
+ dynamic one = new self::Z::•().{self::Z::succ};
dynamic two = one.succ;
}
diff --git a/pkg/kernel/testcases/reify/typevariable3_test.dart.expect b/pkg/kernel/testcases/reify/typevariable3_test.dart.expect
index c8e09ce..a6f8ff2 100644
--- a/pkg/kernel/testcases/reify/typevariable3_test.dart.expect
+++ b/pkg/kernel/testcases/reify/typevariable3_test.dart.expect
@@ -14,6 +14,9 @@
dynamic temp = t;
return temp;
}
+ method foo$cc(core::Object t) → dynamic {
+ return this.{=self::C::foo}(t as dynamic);
+ }
get $C$T() → typ::ReifiedType
return typ::getTypeArguments(typ::asInstanceOf(this.$type, self::$declarations.[](0))).[](0);
get runtimeType() → core::Type
@@ -43,5 +46,5 @@
return d;
}.call(dec::allocateDeclarations(<dynamic>["C", "Null", "bool", "String", "int", "double", "Type", "AbstractClassInstantiationError", "NoSuchMethodError", "CyclicInitializationError", "UnsupportedError", "IntegerDivisionByZeroException", "RangeError", "ArgumentError", "Object", "HasRuntimeTypeGetter", "Comparable", "Pattern", "num", "Error", "Exception"], <dynamic>[1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0]));
static method main() → dynamic {
- self::C c = new self::C::•(new typ::Interface::•(self::$declarations.[](0), <dynamic>[new typ::Interface::•(self::$declarations.[](0), <dynamic>[const typ::Dynamic::•()])])).foo(new self::C::•(new typ::Interface::•(self::$declarations.[](0), <dynamic>[const typ::Dynamic::•()])));
+ self::C c = new self::C::•(new typ::Interface::•(self::$declarations.[](0), <dynamic>[new typ::Interface::•(self::$declarations.[](0), <dynamic>[const typ::Dynamic::•()])])).{self::C::foo}(new self::C::•(new typ::Interface::•(self::$declarations.[](0), <dynamic>[const typ::Dynamic::•()])));
}
diff --git a/runtime/vm/kernel_to_il.cc b/runtime/vm/kernel_to_il.cc
index 41eb3d6..2c16279 100644
--- a/runtime/vm/kernel_to_il.cc
+++ b/runtime/vm/kernel_to_il.cc
@@ -2748,6 +2748,23 @@
}
+Fragment FlowGraphBuilder::StringInterpolateSingle(TokenPosition position) {
+ const int kNumberOfArguments = 1;
+ const Array& kNoArgumentNames = Object::null_array();
+ const dart::Class& cls = dart::Class::Handle(
+ dart::Library::LookupCoreClass(Symbols::StringBase()));
+ ASSERT(!cls.IsNull());
+ const Function& function = dart::Function::ZoneHandle(
+ Z, dart::Resolver::ResolveStatic(cls, dart::Library::PrivateCoreLibName(
+ Symbols::InterpolateSingle()),
+ kNumberOfArguments, kNoArgumentNames));
+ Fragment instructions;
+ instructions += PushArgument();
+ instructions += StaticCall(position, function, 1);
+ return instructions;
+}
+
+
Fragment FlowGraphBuilder::ThrowTypeError() {
const dart::Class& klass = dart::Class::ZoneHandle(
Z, dart::Library::LookupCoreClass(Symbols::TypeError()));
@@ -5161,22 +5178,26 @@
Fragment instructions;
- // The type arguments for CreateArray.
- instructions += Constant(TypeArguments::ZoneHandle(Z));
- instructions += IntConstant(expressions.length());
- instructions += CreateArray();
- LocalVariable* array = MakeTemporary();
+ if (node->expressions().length() == 1) {
+ instructions += TranslateExpression(node->expressions()[0]);
+ instructions += StringInterpolateSingle(node->position());
+ } else {
+ // The type arguments for CreateArray.
+ instructions += Constant(TypeArguments::ZoneHandle(Z));
+ instructions += IntConstant(expressions.length());
+ instructions += CreateArray();
+ LocalVariable* array = MakeTemporary();
- for (intptr_t i = 0; i < node->expressions().length(); i++) {
- instructions += LoadLocal(array);
- instructions += IntConstant(i);
- instructions += TranslateExpression(node->expressions()[i]);
- instructions += StoreIndexed(kArrayCid);
- instructions += Drop();
+ for (intptr_t i = 0; i < node->expressions().length(); i++) {
+ instructions += LoadLocal(array);
+ instructions += IntConstant(i);
+ instructions += TranslateExpression(node->expressions()[i]);
+ instructions += StoreIndexed(kArrayCid);
+ instructions += Drop();
+ }
+
+ instructions += StringInterpolate(node->position());
}
-
- instructions += StringInterpolate(node->position());
-
fragment_ = instructions;
}
diff --git a/runtime/vm/kernel_to_il.h b/runtime/vm/kernel_to_il.h
index 6093f4b..d019cda 100644
--- a/runtime/vm/kernel_to_il.h
+++ b/runtime/vm/kernel_to_il.h
@@ -876,6 +876,7 @@
Fragment StoreLocal(TokenPosition position, LocalVariable* variable);
Fragment StoreStaticField(TokenPosition position, const dart::Field& field);
Fragment StringInterpolate(TokenPosition position);
+ Fragment StringInterpolateSingle(TokenPosition position);
Fragment ThrowTypeError();
Fragment ThrowNoSuchMethodError();
Fragment BuildImplicitClosureCreation(const Function& target);
diff --git a/sdk/lib/io/socket.dart b/sdk/lib/io/socket.dart
index 0a112d5..1f733ba 100644
--- a/sdk/lib/io/socket.dart
+++ b/sdk/lib/io/socket.dart
@@ -695,7 +695,7 @@
* If an error occur when trying to join the multicast group an
* exception is thrown.
*/
- void joinMulticast(InternetAddress group, {NetworkInterface interface});
+ void joinMulticast(InternetAddress group, [NetworkInterface interface]);
/**
* Leave a multicast group.
@@ -703,7 +703,7 @@
* If an error occur when trying to join the multicase group an
* exception is thrown.
*/
- void leaveMulticast(InternetAddress group, {NetworkInterface interface});
+ void leaveMulticast(InternetAddress group, [NetworkInterface interface]);
}
diff --git a/tests/co19/co19-dart2js.status b/tests/co19/co19-dart2js.status
index 74ca448..9007166 100644
--- a/tests/co19/co19-dart2js.status
+++ b/tests/co19/co19-dart2js.status
@@ -92,28 +92,7 @@
Language/Expressions/Function_Invocation/async_generator_invokation_t08: Timeout, Skip # Issue 25967
Language/Expressions/Function_Invocation/async_generator_invokation_t10: Timeout, Skip # Issue 25967
Language/Expressions/Function_Invocation/async_invokation_t04: RuntimeError, Pass # co19 issue 57
-Language/Expressions/Identifier_Reference/built_in_identifier_t35: MissingCompileTimeError # Issue 25732
-Language/Expressions/Identifier_Reference/built_in_identifier_t36: MissingCompileTimeError # Issue 25732
-Language/Expressions/Identifier_Reference/built_in_identifier_t37: MissingCompileTimeError # Issue 25732
-Language/Expressions/Identifier_Reference/built_in_identifier_t53: MissingCompileTimeError # Issue 25733
-Language/Expressions/Identifier_Reference/built_in_identifier_t54: MissingCompileTimeError # Issue 25733
-Language/Expressions/Identifier_Reference/built_in_identifier_t55: MissingCompileTimeError # Issue 25733
-Language/Expressions/Identifier_Reference/built_in_identifier_t56: MissingCompileTimeError # Issue 25733
-Language/Expressions/Identifier_Reference/built_in_identifier_t57: MissingCompileTimeError # Issue 25733
-Language/Expressions/Identifier_Reference/built_in_identifier_t58: MissingCompileTimeError # Issue 25733
-Language/Expressions/Identifier_Reference/built_in_identifier_t59: MissingCompileTimeError # Issue 25733
-Language/Expressions/Identifier_Reference/built_in_identifier_t60: MissingCompileTimeError # Issue 25733
-Language/Expressions/Identifier_Reference/built_in_identifier_t61: MissingCompileTimeError # Issue 25733
-Language/Expressions/Identifier_Reference/built_in_identifier_t62: MissingCompileTimeError # Issue 25733
-Language/Expressions/Identifier_Reference/built_in_identifier_t63: MissingCompileTimeError # Issue 25733
-Language/Expressions/Identifier_Reference/built_in_identifier_t64: MissingCompileTimeError # Issue 25733
-Language/Expressions/Identifier_Reference/built_in_identifier_t65: MissingCompileTimeError # Issue 25733
-Language/Expressions/Identifier_Reference/built_in_identifier_t66: MissingCompileTimeError # Issue 25733
-Language/Expressions/Identifier_Reference/built_in_identifier_t67: MissingCompileTimeError # Issue 25733
-Language/Expressions/Identifier_Reference/built_in_identifier_t68: MissingCompileTimeError # Issue 25733
-Language/Expressions/Identifier_Reference/built_in_not_dynamic_t14: MissingCompileTimeError # Issue 25732
Language/Expressions/Identifier_Reference/built_in_not_dynamic_t15: MissingCompileTimeError # Issue 26581
-Language/Expressions/Identifier_Reference/built_in_not_dynamic_t19: MissingCompileTimeError # Issue 25732
Language/Expressions/Identifier_Reference/syntax_built_in_t01: fail # Issue 21154
Language/Expressions/Instance_Creation/New/evaluation_t19: RuntimeError # Please triage this failure
Language/Expressions/Instance_Creation/New/evaluation_t20: RuntimeError # Please triage this failure
diff --git a/tests/co19/co19-kernel.status b/tests/co19/co19-kernel.status
index a5620a6..aed2c9d 100644
--- a/tests/co19/co19-kernel.status
+++ b/tests/co19/co19-kernel.status
@@ -52,6 +52,8 @@
Language/Classes/Getters/syntax_t04: MissingCompileTimeError
Language/Classes/Getters/syntax_t05: MissingCompileTimeError
Language/Classes/Getters/syntax_t07: MissingCompileTimeError
+Language/Classes/Getters/type_object_t01: RuntimeError # Issue 23721
+Language/Classes/Getters/type_object_t02: RuntimeError # Issue 23721
Language/Classes/Instance_Methods/Operators/arity_0_or_1_t02: MissingCompileTimeError
Language/Classes/Instance_Methods/Operators/arity_0_t02: MissingCompileTimeError
Language/Classes/Instance_Methods/Operators/arity_1_t01: MissingCompileTimeError
@@ -98,8 +100,12 @@
Language/Classes/Setters/syntax_t01: RuntimeError
Language/Classes/Setters/syntax_t03: MissingCompileTimeError
Language/Classes/Setters/syntax_t04: RuntimeError
+Language/Classes/Setters/type_object_t01: RuntimeError # Issue 23721
+Language/Classes/Setters/type_object_t02: RuntimeError # Issue 23721
Language/Classes/Static_Methods/declaration_t01: MissingCompileTimeError
Language/Classes/Static_Methods/same_name_method_and_setter_t01: CompileTimeError
+Language/Classes/Static_Methods/type_object_t01: RuntimeError # Issue 23721
+Language/Classes/Static_Methods/type_object_t02: RuntimeError # Issue 23721
Language/Classes/Superclasses/Inheritance_and_Overriding/inheritance_t03: RuntimeError
Language/Classes/Superclasses/superclass_of_itself_t01: MissingCompileTimeError
Language/Classes/Superclasses/superclass_of_itself_t02: MissingCompileTimeError
@@ -149,6 +155,7 @@
Language/Expressions/Assignment/static_warning_t03/none: RuntimeError
Language/Expressions/Assignment/super_assignment_failed_t01: RuntimeError
Language/Expressions/Assignment/super_assignment_failed_t02: RuntimeError
+Language/Expressions/Assignment/super_assignment_failed_t05: RuntimeError # Issue 25671
Language/Expressions/Assignment/super_assignment_value_t02: RuntimeError
Language/Expressions/Await_Expressions/syntax_t06: Crash
Language/Expressions/Constants/bitwise_operators_t02: Crash
@@ -212,6 +219,8 @@
Language/Expressions/Function_Invocation/Binding_Actuals_to_Formals/same_name_arguments_t01: MissingCompileTimeError
Language/Expressions/Function_Invocation/Unqualified_Invocation/instance_context_invocation_t03: MissingCompileTimeError
Language/Expressions/Function_Invocation/Unqualified_Invocation/instance_context_invocation_t04: MissingCompileTimeError
+Language/Expressions/Function_Invocation/async_generator_invokation_t08: Fail # Issue 25967
+Language/Expressions/Function_Invocation/async_generator_invokation_t10: Fail # Issue 25967
Language/Expressions/Identifier_Reference/async_and_generator_t02: MissingCompileTimeError
Language/Expressions/Identifier_Reference/async_and_generator_t03: MissingCompileTimeError
Language/Expressions/Identifier_Reference/async_and_generator_t04: MissingCompileTimeError
@@ -221,15 +230,8 @@
Language/Expressions/Identifier_Reference/async_and_generator_t08: MissingCompileTimeError
Language/Expressions/Identifier_Reference/async_and_generator_t09: MissingCompileTimeError
Language/Expressions/Identifier_Reference/async_and_generator_t10: MissingCompileTimeError
-Language/Expressions/Identifier_Reference/built_in_identifier_t08: MissingCompileTimeError
-Language/Expressions/Identifier_Reference/built_in_identifier_t09: MissingCompileTimeError
-Language/Expressions/Identifier_Reference/built_in_identifier_t10: MissingCompileTimeError
-Language/Expressions/Identifier_Reference/built_in_identifier_t35: Pass # OK, Issue 25732
-Language/Expressions/Identifier_Reference/built_in_identifier_t36: Pass # OK, Issue 25732
-Language/Expressions/Identifier_Reference/built_in_identifier_t37: Pass # OK, Issue 25732
Language/Expressions/Identifier_Reference/built_in_not_dynamic_t01: MissingCompileTimeError
Language/Expressions/Identifier_Reference/built_in_not_dynamic_t12: MissingCompileTimeError
-Language/Expressions/Identifier_Reference/built_in_not_dynamic_t14: Pass # OK, Issue 25732
Language/Expressions/Identifier_Reference/built_in_not_dynamic_t15: MissingCompileTimeError
Language/Expressions/Identifier_Reference/evaluation_static_t02: Crash
Language/Expressions/Identifier_Reference/syntax_built_in_t01: CompileTimeError
@@ -274,6 +276,8 @@
Language/Expressions/Method_Invocation/Ordinary_Invocation/evaluation_t07: RuntimeError # Dartk Issue 28562
Language/Expressions/Method_Invocation/Ordinary_Invocation/method_lookup_failed_t17: RuntimeError
Language/Expressions/Method_Invocation/Ordinary_Invocation/method_lookup_failed_t18: RuntimeError # Dartk Issue 28562
+Language/Expressions/Method_Invocation/Ordinary_Invocation/object_method_invocation_t01: MissingCompileTimeError # Issue 25496
+Language/Expressions/Method_Invocation/Ordinary_Invocation/object_method_invocation_t02: MissingCompileTimeError # Issue 25496
Language/Expressions/Method_Invocation/Super_Invocation/getter_lookup_failed_t01: RuntimeError
Language/Expressions/Method_Invocation/Super_Invocation/getter_lookup_failed_t02: RuntimeError
Language/Expressions/Method_Invocation/Super_Invocation/getter_lookup_failed_t03: RuntimeError
@@ -281,6 +285,14 @@
Language/Expressions/Method_Invocation/Super_Invocation/invocation_t02: MissingCompileTimeError
Language/Expressions/Method_Invocation/Super_Invocation/invocation_t03: MissingCompileTimeError
Language/Expressions/Postfix_Expressions/syntax_t06: MissingCompileTimeError
+Language/Expressions/Property_Extraction/Getter_Access_and_Method_Extraction/class_object_member_t01: MissingCompileTimeError # Issue 24332
+Language/Expressions/Property_Extraction/Getter_Access_and_Method_Extraction/class_object_member_t02: MissingCompileTimeError # Issue 24332
+Language/Expressions/Property_Extraction/Getter_Access_and_Method_Extraction/class_object_member_t03: MissingCompileTimeError # Issue 24332
+Language/Expressions/Property_Extraction/Getter_Access_and_Method_Extraction/class_object_member_t04: MissingCompileTimeError # Issue 24332
+Language/Expressions/Property_Extraction/Getter_Access_and_Method_Extraction/class_object_member_t05: MissingCompileTimeError # Issue 24332
+Language/Expressions/Property_Extraction/Getter_Access_and_Method_Extraction/class_object_member_t06: MissingCompileTimeError # Issue 24332
+Language/Expressions/Property_Extraction/Getter_Access_and_Method_Extraction/class_object_member_t07: MissingCompileTimeError # Issue 24332
+Language/Expressions/Property_Extraction/Getter_Access_and_Method_Extraction/class_object_member_t08: MissingCompileTimeError # Issue 24332
Language/Expressions/Property_Extraction/Super_Getter_Access_and_Method_Closurization/no_such_method_t01: RuntimeError
Language/Expressions/Property_Extraction/Super_Getter_Access_and_Method_Closurization/no_such_method_t02: RuntimeError
Language/Expressions/This/placement_t04: MissingCompileTimeError
@@ -407,6 +419,7 @@
Language/Metadata/compilation_t11: MissingCompileTimeError
Language/Mixins/Mixin_Application/deferred_t01: MissingCompileTimeError
Language/Mixins/Mixin_Application/syntax_t15: MissingCompileTimeError
+Language/Mixins/Mixin_Application/syntax_t16: CompileTimeError # Issue 25765
Language/Mixins/Mixin_Application/wrong_mixin_type_t01: MissingCompileTimeError
Language/Mixins/Mixin_Application/wrong_mixin_type_t02: MissingCompileTimeError
Language/Mixins/Mixin_Application/wrong_mixin_type_t07: MissingCompileTimeError
@@ -418,6 +431,8 @@
Language/Mixins/declaring_constructor_t02: MissingCompileTimeError
Language/Mixins/declaring_constructor_t03: MissingCompileTimeError
Language/Mixins/declaring_constructor_t04: MissingCompileTimeError
+Language/Mixins/declaring_constructor_t05: MissingCompileTimeError # Issue 24767
+Language/Mixins/declaring_constructor_t06: MissingCompileTimeError # Issue 24767
Language/Mixins/declaring_constructor_t07: MissingCompileTimeError
Language/Mixins/declaring_constructor_t08: MissingCompileTimeError
Language/Mixins/declaring_constructor_t09: MissingCompileTimeError
@@ -503,8 +518,15 @@
Language/Statements/Yield_and_Yield_Each/Yield/location_t02: MissingCompileTimeError
Language/Statements/Yield_and_Yield_Each/Yield/location_t04: MissingCompileTimeError
Language/Statements/Yield_and_Yield_Each/Yield/location_t06: MissingCompileTimeError
+Language/Statements/Yield_and_Yield_Each/Yield_Each/execution_async_t08: RuntimeError # Issue 25748
+Language/Statements/Yield_and_Yield_Each/Yield_Each/execution_async_t09: RuntimeError # Issue 25748
+Language/Statements/Yield_and_Yield_Each/Yield_Each/execution_async_t10: RuntimeError # Issue 25748
+Language/Statements/Yield_and_Yield_Each/Yield_Each/execution_sync_t05: RuntimeError # Issue 25662,25634
+Language/Statements/Yield_and_Yield_Each/Yield_Each/location_t01: MissingCompileTimeError # Issue 25495
Language/Statements/Yield_and_Yield_Each/Yield_Each/location_t02: MissingCompileTimeError
+Language/Statements/Yield_and_Yield_Each/Yield_Each/location_t03: MissingCompileTimeError # Issue 25495
Language/Statements/Yield_and_Yield_Each/Yield_Each/location_t04: MissingCompileTimeError
+Language/Statements/Yield_and_Yield_Each/Yield_Each/location_t05: MissingCompileTimeError # Issue 25495
Language/Statements/Yield_and_Yield_Each/Yield_Each/location_t06: MissingCompileTimeError
Language/Types/Static_Types/deferred_type_t01: RuntimeError # Kernel Issue 28335 (deferred libraries)
Language/Types/Static_Types/malformed_type_t01: RuntimeError
diff --git a/tests/co19/co19-runtime.status b/tests/co19/co19-runtime.status
index 9d88cfc..0444d35 100644
--- a/tests/co19/co19-runtime.status
+++ b/tests/co19/co19-runtime.status
@@ -91,7 +91,7 @@
[ ($runtime == vm || $runtime == dart_precompiled) && $mode == debug && $builder_tag == asan ]
Language/Types/Interface_Types/subtype_t27: Skip # Issue 21174.
-[ $runtime == vm || $runtime == dart_precompiled ]
+[ ($runtime == vm || $runtime == dart_precompiled) && $compiler != dartk && $compiler != dartkp ]
# co19 update Sep 29, 2015 (3ed795ea02e022ef19c77cf1b6095b7c8f5584d0)
Language/Classes/Getters/type_object_t01: RuntimeError # Issue 23721
Language/Classes/Getters/type_object_t02: RuntimeError # Issue 23721
diff --git a/tests/compiler/dart2js/kernel/closed_world_test.dart b/tests/compiler/dart2js/kernel/closed_world_test.dart
index 4054692..71639d7 100644
--- a/tests/compiler/dart2js/kernel/closed_world_test.dart
+++ b/tests/compiler/dart2js/kernel/closed_world_test.dart
@@ -137,7 +137,7 @@
backend.interceptorDataBuilder,
backend.backendUsageBuilder,
backend.rtiNeedBuilder,
- backend.mirrorsData,
+ backend.mirrorsDataBuilder,
backend.noSuchMethodRegistry,
backend.customElementsResolutionAnalysis,
backend.lookupMapResolutionAnalysis,
diff --git a/tests/language/language_kernel.status b/tests/language/language_kernel.status
index 5965f94..c90d371 100644
--- a/tests/language/language_kernel.status
+++ b/tests/language/language_kernel.status
@@ -56,21 +56,6 @@
bad_raw_string_negative_test: Fail
black_listed_test/13: MissingCompileTimeError
body_less_constructor_wrong_arg_negative_test: Crash
-built_in_identifier_illegal_test/01: MissingCompileTimeError
-built_in_identifier_illegal_test/04: MissingCompileTimeError
-built_in_identifier_illegal_test/05: MissingCompileTimeError
-built_in_identifier_illegal_test/06: MissingCompileTimeError
-built_in_identifier_illegal_test/07: MissingCompileTimeError
-built_in_identifier_illegal_test/08: MissingCompileTimeError
-built_in_identifier_illegal_test/10: MissingCompileTimeError
-built_in_identifier_illegal_test/12: MissingCompileTimeError
-built_in_identifier_illegal_test/13: MissingCompileTimeError
-built_in_identifier_illegal_test/15: MissingCompileTimeError
-built_in_identifier_illegal_test/16: MissingCompileTimeError
-built_in_identifier_illegal_test/17: MissingCompileTimeError
-built_in_identifier_illegal_test/18: MissingCompileTimeError
-built_in_identifier_illegal_test/19: MissingCompileTimeError
-built_in_identifier_illegal_test/20: MissingCompileTimeError
built_in_identifier_test/01: CompileTimeError
call_nonexistent_static_test/01: CompileTimeError
call_nonexistent_static_test/04: CompileTimeError
diff --git a/tools/VERSION b/tools/VERSION
index 7487bd8..6605793 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
MAJOR 1
MINOR 23
PATCH 0
-PRERELEASE 8
+PRERELEASE 9
PRERELEASE_PATCH 0
diff --git a/tools/create_sdk.py b/tools/create_sdk.py
index 9c1e51f..1d47170 100755
--- a/tools/create_sdk.py
+++ b/tools/create_sdk.py
@@ -61,6 +61,7 @@
# ......isolate/
# ......js/
# ......js_util/
+# ......kernel/
# ......math/
# ......mirrors/
# ......typed_data/
@@ -166,7 +167,7 @@
join(sdk_root, 'bin', 'snapshots', snapshot))
def CopyAnalyzerSources(home, lib_dir):
- for library in ['analyzer', 'analysis_server', 'front_end']:
+ for library in ['analyzer', 'analysis_server', 'front_end', 'kernel']:
copytree(join(home, 'pkg', library), join(lib_dir, library),
ignore=ignore_patterns('*.svn', 'doc', '*.py', '*.gypi', '*.sh',
'.gitignore', 'packages'))