Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1)

Side by Side Diff: pkg/compiler/lib/src/compiler.dart

Issue 1376863004: Avoid eager enqueueing from resolution (Closed) Base URL: https://github.com/dart-lang/sdk.git@master
Patch Set: Fix deferred+mirrors bug. Created 5 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file
2 // for details. All rights reserved. Use of this source code is governed by a 2 // for details. All rights reserved. Use of this source code is governed by a
3 // BSD-style license that can be found in the LICENSE file. 3 // BSD-style license that can be found in the LICENSE file.
4 4
5 library dart2js.compiler_base; 5 library dart2js.compiler_base;
6 6
7 import 'dart:async' show 7 import 'dart:async' show
8 EventSink, 8 EventSink,
9 Future; 9 Future;
10 10
11 import '../compiler_new.dart' as api; 11 import '../compiler_new.dart' as api;
12 import 'cache_strategy.dart' show 12 import 'cache_strategy.dart' show
13 CacheStrategy; 13 CacheStrategy;
14 import 'closure.dart' as closureMapping show 14 import 'closure.dart' as closureMapping show
15 ClosureTask; 15 ClosureTask;
16 import 'common/backend_api.dart' show 16 import 'common/backend_api.dart' show
17 Backend; 17 Backend;
18 import 'common/codegen.dart' show 18 import 'common/codegen.dart' show
19 CodegenRegistry, 19 CodegenRegistry,
20 CodegenWorkItem; 20 CodegenWorkItem;
21 import 'common/names.dart' show 21 import 'common/names.dart' show
22 Identifiers, 22 Identifiers,
23 Uris; 23 Uris;
24 import 'common/registry.dart' show 24 import 'common/registry.dart' show
25 Registry; 25 Registry;
26 import 'common/resolution.dart' show 26 import 'common/resolution.dart' show
27 Parsing, 27 Parsing,
28 Resolution, 28 Resolution,
29 ResolutionWorkItem; 29 ResolutionWorkItem,
30 ResolutionWorldImpact;
30 import 'common/tasks.dart' show 31 import 'common/tasks.dart' show
31 CompilerTask, 32 CompilerTask,
32 GenericTask; 33 GenericTask;
33 import 'common/work.dart' show 34 import 'common/work.dart' show
34 WorkItem; 35 WorkItem;
35 import 'compile_time_constants.dart'; 36 import 'compile_time_constants.dart';
36 import 'constants/values.dart'; 37 import 'constants/values.dart';
37 import 'core_types.dart' show 38 import 'core_types.dart' show
38 CoreTypes; 39 CoreTypes;
39 import 'dart_backend/dart_backend.dart' as dart_backend; 40 import 'dart_backend/dart_backend.dart' as dart_backend;
(...skipping 722 matching lines...) Expand 10 before | Expand all | Expand 10 after
762 .then((LibraryElement libraryElement) { 763 .then((LibraryElement libraryElement) {
763 documentClass = libraryElement.find('Comment'); 764 documentClass = libraryElement.find('Comment');
764 }); 765 });
765 } 766 }
766 }).then((_) => backend.onLibrariesLoaded(loadedLibraries)); 767 }).then((_) => backend.onLibrariesLoaded(loadedLibraries));
767 } 768 }
768 769
769 bool isProxyConstant(ConstantValue value) { 770 bool isProxyConstant(ConstantValue value) {
770 FieldElement field = coreLibrary.find('proxy'); 771 FieldElement field = coreLibrary.find('proxy');
771 if (field == null) return false; 772 if (field == null) return false;
772 if (!enqueuer.resolution.hasBeenResolved(field)) return false; 773 if (!resolution.hasBeenResolved(field)) return false;
773 if (proxyConstant == null) { 774 if (proxyConstant == null) {
774 proxyConstant = 775 proxyConstant =
775 constants.getConstantValue( 776 constants.getConstantValue(
776 resolver.constantCompiler.compileConstant(field)); 777 resolver.constantCompiler.compileConstant(field));
777 } 778 }
778 return proxyConstant == value; 779 return proxyConstant == value;
779 } 780 }
780 781
781 Element findRequiredElement(LibraryElement library, String name) { 782 Element findRequiredElement(LibraryElement library, String name) {
782 var element = library.find(name); 783 var element = library.find(name);
(...skipping 370 matching lines...) Expand 10 before | Expand all | Expand 10 after
1153 * processing the queues). Also compute the number of methods that 1154 * processing the queues). Also compute the number of methods that
1154 * were resolved, but not compiled (aka excess resolution). 1155 * were resolved, but not compiled (aka excess resolution).
1155 */ 1156 */
1156 checkQueues() { 1157 checkQueues() {
1157 for (Enqueuer world in [enqueuer.resolution, enqueuer.codegen]) { 1158 for (Enqueuer world in [enqueuer.resolution, enqueuer.codegen]) {
1158 world.forEach((WorkItem work) { 1159 world.forEach((WorkItem work) {
1159 reporter.internalError(work.element, "Work list is not empty."); 1160 reporter.internalError(work.element, "Work list is not empty.");
1160 }); 1161 });
1161 } 1162 }
1162 if (!REPORT_EXCESS_RESOLUTION) return; 1163 if (!REPORT_EXCESS_RESOLUTION) return;
1163 var resolved = new Set.from(enqueuer.resolution.resolvedElements); 1164 var resolved = new Set.from(enqueuer.resolution.processedElements);
1164 for (Element e in enqueuer.codegen.generatedCode.keys) { 1165 for (Element e in enqueuer.codegen.generatedCode.keys) {
1165 resolved.remove(e); 1166 resolved.remove(e);
1166 } 1167 }
1167 for (Element e in new Set.from(resolved)) { 1168 for (Element e in new Set.from(resolved)) {
1168 if (e.isClass || 1169 if (e.isClass ||
1169 e.isField || 1170 e.isField ||
1170 e.isTypeVariable || 1171 e.isTypeVariable ||
1171 e.isTypedef || 1172 e.isTypedef ||
1172 identical(e.kind, ElementKind.ABSTRACT_FIELD)) { 1173 identical(e.kind, ElementKind.ABSTRACT_FIELD)) {
1173 resolved.remove(e); 1174 resolved.remove(e);
1174 } 1175 }
1175 if (identical(e.kind, ElementKind.GENERATIVE_CONSTRUCTOR)) { 1176 if (identical(e.kind, ElementKind.GENERATIVE_CONSTRUCTOR)) {
1176 resolved.remove(e); 1177 resolved.remove(e);
1177 } 1178 }
1178 if (backend.isBackendLibrary(e.library)) { 1179 if (backend.isBackendLibrary(e.library)) {
1179 resolved.remove(e); 1180 resolved.remove(e);
1180 } 1181 }
1181 } 1182 }
1182 reporter.log('Excess resolution work: ${resolved.length}.'); 1183 reporter.log('Excess resolution work: ${resolved.length}.');
1183 for (Element e in resolved) { 1184 for (Element e in resolved) {
1184 reporter.reportWarningMessage(e, 1185 reporter.reportWarningMessage(e,
1185 MessageKind.GENERIC, 1186 MessageKind.GENERIC,
1186 {'text': 'Warning: $e resolved but not compiled.'}); 1187 {'text': 'Warning: $e resolved but not compiled.'});
1187 } 1188 }
1188 } 1189 }
1189 1190
1190 WorldImpact analyzeElement(Element element) { 1191 ResolutionWorldImpact analyzeElement(Element element) {
1191 assert(invariant(element, 1192 assert(invariant(element,
1192 element.impliesType || 1193 element.impliesType ||
1193 element.isField || 1194 element.isField ||
1194 element.isFunction || 1195 element.isFunction ||
1195 element.isGenerativeConstructor || 1196 element.isGenerativeConstructor ||
1196 element.isGetter || 1197 element.isGetter ||
1197 element.isSetter, 1198 element.isSetter,
1198 message: 'Unexpected element kind: ${element.kind}')); 1199 message: 'Unexpected element kind: ${element.kind}'));
1199 assert(invariant(element, element is AnalyzableElement, 1200 assert(invariant(element, element is AnalyzableElement,
1200 message: 'Element $element is not analyzable.')); 1201 message: 'Element $element is not analyzable.'));
1201 assert(invariant(element, element.isDeclaration)); 1202 assert(invariant(element, element.isDeclaration));
1202 ResolutionEnqueuer world = enqueuer.resolution; 1203 return resolution.analyzeElement(element);
1203 if (world.hasBeenResolved(element)) {
1204 return const WorldImpact();
1205 }
1206 assert(parser != null);
1207 Node tree = parser.parse(element);
1208 assert(invariant(element, !element.isSynthesized || tree == null));
1209 WorldImpact worldImpact = resolver.resolve(element);
1210 if (tree != null && !analyzeSignaturesOnly && !suppressWarnings) {
1211 // Only analyze nodes with a corresponding [TreeElements].
1212 checker.check(element);
1213 }
1214 world.registerResolvedElement(element);
1215 return worldImpact;
1216 } 1204 }
1217 1205
1218 WorldImpact analyze(ResolutionWorkItem work, ResolutionEnqueuer world) { 1206 ResolutionWorldImpact analyze(ResolutionWorkItem work,
1207 ResolutionEnqueuer world) {
1219 assert(invariant(work.element, identical(world, enqueuer.resolution))); 1208 assert(invariant(work.element, identical(world, enqueuer.resolution)));
1220 assert(invariant(work.element, !work.isAnalyzed, 1209 assert(invariant(work.element, !work.isAnalyzed,
1221 message: 'Element ${work.element} has already been analyzed')); 1210 message: 'Element ${work.element} has already been analyzed'));
1222 if (shouldPrintProgress) { 1211 if (shouldPrintProgress) {
1223 // TODO(ahe): Add structured diagnostics to the compiler API and 1212 // TODO(ahe): Add structured diagnostics to the compiler API and
1224 // use it to separate this from the --verbose option. 1213 // use it to separate this from the --verbose option.
1225 if (phase == PHASE_RESOLVING) { 1214 if (phase == PHASE_RESOLVING) {
1226 reporter.log( 1215 reporter.log(
1227 'Resolved ${enqueuer.resolution.resolvedElements.length} ' 1216 'Resolved ${enqueuer.resolution.processedElements.length} '
1228 'elements.'); 1217 'elements.');
1229 progress.reset(); 1218 progress.reset();
1230 } 1219 }
1231 } 1220 }
1232 AstElement element = work.element; 1221 AstElement element = work.element;
1233 if (world.hasBeenResolved(element)) { 1222 if (world.hasBeenProcessed(element)) {
1234 return const WorldImpact(); 1223 return const ResolutionWorldImpact();
1235 } 1224 }
1236 WorldImpact worldImpact = analyzeElement(element); 1225 ResolutionWorldImpact worldImpact = analyzeElement(element);
1237 backend.onElementResolved(element, element.resolvedAst.elements); 1226 backend.onElementResolved(element, element.resolvedAst.elements);
1227 world.registerProcessedElement(element);
1238 return worldImpact; 1228 return worldImpact;
1239 } 1229 }
1240 1230
1241 WorldImpact codegen(CodegenWorkItem work, CodegenEnqueuer world) { 1231 WorldImpact codegen(CodegenWorkItem work, CodegenEnqueuer world) {
1242 assert(invariant(work.element, identical(world, enqueuer.codegen))); 1232 assert(invariant(work.element, identical(world, enqueuer.codegen)));
1243 if (shouldPrintProgress) { 1233 if (shouldPrintProgress) {
1244 // TODO(ahe): Add structured diagnostics to the compiler API and 1234 // TODO(ahe): Add structured diagnostics to the compiler API and
1245 // use it to separate this from the --verbose option. 1235 // use it to separate this from the --verbose option.
1246 reporter.log( 1236 reporter.log(
1247 'Compiled ${enqueuer.codegen.generatedCode.length} methods.'); 1237 'Compiled ${enqueuer.codegen.generatedCode.length} methods.');
(...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after
1323 prevToken = currentToken; 1313 prevToken = currentToken;
1324 currentToken = currentToken.next; 1314 currentToken = currentToken.next;
1325 } 1315 }
1326 return firstToken; 1316 return firstToken;
1327 } 1317 }
1328 1318
1329 void reportUnusedCode() { 1319 void reportUnusedCode() {
1330 void checkLive(member) { 1320 void checkLive(member) {
1331 if (member.isErroneous) return; 1321 if (member.isErroneous) return;
1332 if (member.isFunction) { 1322 if (member.isFunction) {
1333 if (!enqueuer.resolution.hasBeenResolved(member)) { 1323 if (!enqueuer.resolution.hasBeenProcessed(member)) {
1334 reporter.reportHintMessage( 1324 reporter.reportHintMessage(
1335 member, MessageKind.UNUSED_METHOD, {'name': member.name}); 1325 member, MessageKind.UNUSED_METHOD, {'name': member.name});
1336 } 1326 }
1337 } else if (member.isClass) { 1327 } else if (member.isClass) {
1338 if (!member.isResolved) { 1328 if (!member.isResolved) {
1339 reporter.reportHintMessage( 1329 reporter.reportHintMessage(
1340 member, MessageKind.UNUSED_CLASS, {'name': member.name}); 1330 member, MessageKind.UNUSED_CLASS, {'name': member.name});
1341 } else { 1331 } else {
1342 member.forEachLocalMember(checkLive); 1332 member.forEachLocalMember(checkLive);
1343 } 1333 }
(...skipping 139 matching lines...) Expand 10 before | Expand all | Expand 10 after
1483 ClassElement symbolClass; 1473 ClassElement symbolClass;
1484 ClassElement stackTraceClass; 1474 ClassElement stackTraceClass;
1485 ClassElement futureClass; 1475 ClassElement futureClass;
1486 ClassElement iterableClass; 1476 ClassElement iterableClass;
1487 ClassElement streamClass; 1477 ClassElement streamClass;
1488 ClassElement resourceClass; 1478 ClassElement resourceClass;
1489 1479
1490 _CompilerCoreTypes(this.resolution); 1480 _CompilerCoreTypes(this.resolution);
1491 1481
1492 @override 1482 @override
1493 InterfaceType get objectType => objectClass.computeType(resolution); 1483 InterfaceType get objectType {
1484 objectClass.ensureResolved(resolution);
1485 return objectClass.rawType;
1486 }
1494 1487
1495 @override 1488 @override
1496 InterfaceType get boolType => boolClass.computeType(resolution); 1489 InterfaceType get boolType {
1490 boolClass.ensureResolved(resolution);
1491 return boolClass.rawType;
1492 }
1497 1493
1498 @override 1494 @override
1499 InterfaceType get doubleType => doubleClass.computeType(resolution); 1495 InterfaceType get doubleType {
1496 doubleClass.ensureResolved(resolution);
1497 return doubleClass.rawType;
1498 }
1500 1499
1501 @override 1500 @override
1502 InterfaceType get functionType => functionClass.computeType(resolution); 1501 InterfaceType get functionType {
1502 functionClass.ensureResolved(resolution);
1503 return functionClass.rawType;
1504 }
1503 1505
1504 @override 1506 @override
1505 InterfaceType get intType => intClass.computeType(resolution); 1507 InterfaceType get intType {
1508 intClass.ensureResolved(resolution);
1509 return intClass.rawType;
1510 }
1506 1511
1507 @override 1512 @override
1508 InterfaceType get resourceType => resourceClass.computeType(resolution); 1513 InterfaceType get resourceType {
1514 resourceClass.ensureResolved(resolution);
1515 return resourceClass.rawType;
1516 }
1509 1517
1510 @override 1518 @override
1511 InterfaceType listType([DartType elementType]) { 1519 InterfaceType listType([DartType elementType]) {
1512 InterfaceType type = listClass.computeType(resolution); 1520 listClass.ensureResolved(resolution);
1521 InterfaceType type = listClass.rawType;
1513 if (elementType == null) { 1522 if (elementType == null) {
1514 return listClass.rawType; 1523 return type;
1515 } 1524 }
1516 return type.createInstantiation([elementType]); 1525 return type.createInstantiation([elementType]);
1517 } 1526 }
1518 1527
1519 @override 1528 @override
1520 InterfaceType mapType([DartType keyType, 1529 InterfaceType mapType([DartType keyType,
1521 DartType valueType]) { 1530 DartType valueType]) {
1522 InterfaceType type = mapClass.computeType(resolution); 1531 mapClass.ensureResolved(resolution);
1532 InterfaceType type = mapClass.rawType;
1523 if (keyType == null && valueType == null) { 1533 if (keyType == null && valueType == null) {
1524 return mapClass.rawType; 1534 return type;
1525 } else if (keyType == null) { 1535 } else if (keyType == null) {
1526 keyType = const DynamicType(); 1536 keyType = const DynamicType();
1527 } else if (valueType == null) { 1537 } else if (valueType == null) {
1528 valueType = const DynamicType(); 1538 valueType = const DynamicType();
1529 } 1539 }
1530 return type.createInstantiation([keyType, valueType]); 1540 return type.createInstantiation([keyType, valueType]);
1531 } 1541 }
1532 1542
1533 @override 1543 @override
1534 InterfaceType get nullType => nullClass.computeType(resolution); 1544 InterfaceType get nullType {
1545 nullClass.ensureResolved(resolution);
1546 return nullClass.rawType;
1547 }
1535 1548
1536 @override 1549 @override
1537 InterfaceType get numType => numClass.computeType(resolution); 1550 InterfaceType get numType {
1551 numClass.ensureResolved(resolution);
1552 return numClass.rawType;
1553 }
1538 1554
1539 @override 1555 @override
1540 InterfaceType get stringType => stringClass.computeType(resolution); 1556 InterfaceType get stringType {
1557 stringClass.ensureResolved(resolution);
1558 return stringClass.rawType;
1559 }
1541 1560
1542 @override 1561 @override
1543 InterfaceType get symbolType => symbolClass.computeType(resolution); 1562 InterfaceType get symbolType {
1563 symbolClass.ensureResolved(resolution);
1564 return symbolClass.rawType;
1565 }
1544 1566
1545 @override 1567 @override
1546 InterfaceType get typeType => typeClass.computeType(resolution); 1568 InterfaceType get typeType {
1569 typeClass.ensureResolved(resolution);
1570 return typeClass.rawType;
1571 }
1547 1572
1548 @override 1573 @override
1549 InterfaceType iterableType([DartType elementType]) { 1574 InterfaceType iterableType([DartType elementType]) {
1550 InterfaceType type = iterableClass.computeType(resolution); 1575 iterableClass.ensureResolved(resolution);
1576 InterfaceType type = iterableClass.rawType;
1551 if (elementType == null) { 1577 if (elementType == null) {
1552 return iterableClass.rawType; 1578 return type;
1553 } 1579 }
1554 return type.createInstantiation([elementType]); 1580 return type.createInstantiation([elementType]);
1555 } 1581 }
1556 1582
1557 @override 1583 @override
1558 InterfaceType futureType([DartType elementType]) { 1584 InterfaceType futureType([DartType elementType]) {
1559 InterfaceType type = futureClass.computeType(resolution); 1585 futureClass.ensureResolved(resolution);
1586 InterfaceType type = futureClass.rawType;
1560 if (elementType == null) { 1587 if (elementType == null) {
1561 return futureClass.rawType; 1588 return type;
1562 } 1589 }
1563 return type.createInstantiation([elementType]); 1590 return type.createInstantiation([elementType]);
1564 } 1591 }
1565 1592
1566 @override 1593 @override
1567 InterfaceType streamType([DartType elementType]) { 1594 InterfaceType streamType([DartType elementType]) {
1568 InterfaceType type = streamClass.computeType(resolution); 1595 streamClass.ensureResolved(resolution);
1596 InterfaceType type = streamClass.rawType;
1569 if (elementType == null) { 1597 if (elementType == null) {
1570 return streamClass.rawType; 1598 return type;
1571 } 1599 }
1572 return type.createInstantiation([elementType]); 1600 return type.createInstantiation([elementType]);
1573 } 1601 }
1574 } 1602 }
1575 1603
1576 class _CompilerDiagnosticReporter extends DiagnosticReporter { 1604 class _CompilerDiagnosticReporter extends DiagnosticReporter {
1577 final Compiler compiler; 1605 final Compiler compiler;
1578 final DiagnosticOptions options; 1606 final DiagnosticOptions options;
1579 1607
1580 Element _currentElement; 1608 Element _currentElement;
(...skipping 332 matching lines...) Expand 10 before | Expand all | Expand 10 after
1913 const <DiagnosticMessage>[], 1941 const <DiagnosticMessage>[],
1914 api.Diagnostic.HINT); 1942 api.Diagnostic.HINT);
1915 }); 1943 });
1916 } 1944 }
1917 } 1945 }
1918 } 1946 }
1919 1947
1920 // TODO(johnniwinther): Move [ResolverTask] here. 1948 // TODO(johnniwinther): Move [ResolverTask] here.
1921 class _CompilerResolution implements Resolution { 1949 class _CompilerResolution implements Resolution {
1922 final Compiler compiler; 1950 final Compiler compiler;
1951 final Map<Element, ResolutionWorldImpact> _worldImpactCache =
1952 <Element, ResolutionWorldImpact>{};
1923 1953
1924 _CompilerResolution(this.compiler); 1954 _CompilerResolution(this.compiler);
1925 1955
1926 @override 1956 @override
1927 DiagnosticReporter get reporter => compiler.reporter; 1957 DiagnosticReporter get reporter => compiler.reporter;
1928 1958
1929 @override 1959 @override
1930 Parsing get parsing => compiler.parsing; 1960 Parsing get parsing => compiler.parsing;
1931 1961
1932 @override 1962 @override
(...skipping 21 matching lines...) Expand all
1954 1984
1955 @override 1985 @override
1956 FunctionSignature resolveSignature(FunctionElement function) { 1986 FunctionSignature resolveSignature(FunctionElement function) {
1957 return compiler.resolver.resolveSignature(function); 1987 return compiler.resolver.resolveSignature(function);
1958 } 1988 }
1959 1989
1960 @override 1990 @override
1961 DartType resolveTypeAnnotation(Element element, TypeAnnotation node) { 1991 DartType resolveTypeAnnotation(Element element, TypeAnnotation node) {
1962 return compiler.resolver.resolveTypeAnnotation(element, node); 1992 return compiler.resolver.resolveTypeAnnotation(element, node);
1963 } 1993 }
1994
1995 ResolutionWorldImpact analyzeElement(Element element) {
1996 return _worldImpactCache.putIfAbsent(element, () {
1997 assert(compiler.parser != null);
1998 Node tree = compiler.parser.parse(element);
1999 assert(invariant(element, !element.isSynthesized || tree == null));
2000 ResolutionWorldImpact worldImpact = compiler.resolver.resolve(element);
2001 if (tree != null &&
2002 !compiler.analyzeSignaturesOnly &&
2003 !compiler.suppressWarnings) {
2004 // Only analyze nodes with a corresponding [TreeElements].
2005 compiler.checker.check(element);
2006 }
2007 return worldImpact;
2008 });
2009 }
2010
2011 @override
2012 bool hasBeenResolved(Element element) {
2013 return _worldImpactCache.containsKey(element);
2014 }
1964 } 2015 }
1965 2016
1966 // TODO(johnniwinther): Move [ParserTask], [PatchParserTask], [DietParserTask] 2017 // TODO(johnniwinther): Move [ParserTask], [PatchParserTask], [DietParserTask]
1967 // and [ScannerTask] here. 2018 // and [ScannerTask] here.
1968 class _CompilerParsing implements Parsing { 2019 class _CompilerParsing implements Parsing {
1969 final Compiler compiler; 2020 final Compiler compiler;
1970 2021
1971 _CompilerParsing(this.compiler); 2022 _CompilerParsing(this.compiler);
1972 2023
1973 @override 2024 @override
1974 DiagnosticReporter get reporter => compiler.reporter; 2025 DiagnosticReporter get reporter => compiler.reporter;
1975 2026
1976 @override 2027 @override
1977 measure(f()) => compiler.parser.measure(f); 2028 measure(f()) => compiler.parser.measure(f);
1978 2029
1979 @override 2030 @override
1980 void parsePatchClass(ClassElement cls) { 2031 void parsePatchClass(ClassElement cls) {
1981 compiler.patchParser.measure(() { 2032 compiler.patchParser.measure(() {
1982 if (cls.isPatch) { 2033 if (cls.isPatch) {
1983 compiler.patchParser.parsePatchClassNode(cls); 2034 compiler.patchParser.parsePatchClassNode(cls);
1984 } 2035 }
1985 }); 2036 });
1986 } 2037 }
1987 } 2038 }
OLDNEW
« no previous file with comments | « pkg/compiler/lib/src/compile_time_constants.dart ('k') | pkg/compiler/lib/src/dart_backend/backend.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698