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

Unified Diff: pkg/dev_compiler/lib/src/compiler/code_generator.dart

Issue 2757753002: Migrate DDC to the new analysis driver.
Patch Set: Created 3 years, 9 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 side-by-side diff with in-line comments
Download patch
Index: pkg/dev_compiler/lib/src/compiler/code_generator.dart
diff --git a/pkg/dev_compiler/lib/src/compiler/code_generator.dart b/pkg/dev_compiler/lib/src/compiler/code_generator.dart
index f9d81e92bd138a147b1ed05cdc9005d0d324835f..c127ce326387c4b3e56bed16a97830c0790daa89 100644
--- a/pkg/dev_compiler/lib/src/compiler/code_generator.dart
+++ b/pkg/dev_compiler/lib/src/compiler/code_generator.dart
@@ -3,6 +3,7 @@
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
+import 'dart:async';
import 'dart:collection' show HashMap, HashSet;
import 'dart:math' show min, max;
@@ -13,6 +14,7 @@ import 'package:analyzer/dart/ast/token.dart' show Token, TokenType;
import 'package:analyzer/dart/ast/standard_resolution_map.dart';
import 'package:analyzer/dart/element/element.dart';
import 'package:analyzer/dart/element/type.dart';
+import 'package:analyzer/src/dart/analysis/driver.dart';
import 'package:analyzer/src/dart/ast/token.dart' show StringToken;
import 'package:analyzer/src/dart/element/element.dart'
show FieldElementImpl, LocalVariableElementImpl;
@@ -20,7 +22,7 @@ import 'package:analyzer/src/dart/element/type.dart' show DynamicTypeImpl;
import 'package:analyzer/src/dart/sdk/sdk.dart';
import 'package:analyzer/src/generated/engine.dart' show AnalysisContext;
import 'package:analyzer/src/generated/resolver.dart'
- show TypeProvider, NamespaceBuilder;
+ show NamespaceBuilder, TypeProvider, TypeProviderImpl;
import 'package:analyzer/src/generated/type_system.dart'
show StrongTypeSystemImpl;
import 'package:analyzer/src/summary/idl.dart' show UnlinkedUnit;
@@ -56,11 +58,11 @@ import 'type_utilities.dart';
class CodeGenerator extends GeneralizingAstVisitor
with ClosureAnnotator, JsTypeRefCodegen, NullableTypeInference {
- final AnalysisContext context;
+ final AnalysisDriver driver;
final SummaryDataStore summaryData;
final CompilerOptions options;
- final StrongTypeSystemImpl rules;
+ StrongTypeSystemImpl rules;
/// The set of libraries we are currently compiling, and the temporaries used
/// to refer to them.
@@ -108,26 +110,26 @@ class CodeGenerator extends GeneralizingAstVisitor
final _eagerTopLevelFields = new HashSet<Element>.identity();
/// The type provider from the current Analysis [context].
- final TypeProvider types;
+ TypeProvider types;
- final LibraryElement dartCoreLibrary;
- final LibraryElement dartJSLibrary;
+ LibraryElement dartCoreLibrary;
+ LibraryElement dartJSLibrary;
/// The dart:async `StreamIterator<>` type.
- final InterfaceType _asyncStreamIterator;
+ InterfaceType _asyncStreamIterator;
/// The dart:_interceptors JSArray element.
- final ClassElement _jsArray;
-
- final ClassElement boolClass;
- final ClassElement intClass;
- final ClassElement interceptorClass;
- final ClassElement nullClass;
- final ClassElement numClass;
- final ClassElement objectClass;
- final ClassElement stringClass;
- final ClassElement functionClass;
- final ClassElement privateSymbolClass;
+ ClassElement _jsArray;
+
+ ClassElement boolClass;
+ ClassElement intClass;
+ ClassElement interceptorClass;
+ ClassElement nullClass;
+ ClassElement numClass;
+ ClassElement objectClass;
+ ClassElement stringClass;
+ ClassElement functionClass;
+ ClassElement privateSymbolClass;
ConstFieldVisitor _constants;
@@ -156,27 +158,47 @@ class CodeGenerator extends GeneralizingAstVisitor
/// class we're currently compiling, or `null` if we aren't compiling a class.
ClassPropertyModel _classProperties;
- CodeGenerator(
- AnalysisContext c, this.summaryData, this.options, this._extensionTypes)
- : context = c,
- rules = new StrongTypeSystemImpl(c.typeProvider),
- types = c.typeProvider,
- _asyncStreamIterator =
- _getLibrary(c, 'dart:async').getType('StreamIterator').type,
- _jsArray = _getLibrary(c, 'dart:_interceptors').getType('JSArray'),
- interceptorClass =
- _getLibrary(c, 'dart:_interceptors').getType('Interceptor'),
- dartCoreLibrary = _getLibrary(c, 'dart:core'),
- boolClass = _getLibrary(c, 'dart:core').getType('bool'),
- intClass = _getLibrary(c, 'dart:core').getType('int'),
- numClass = _getLibrary(c, 'dart:core').getType('num'),
- nullClass = _getLibrary(c, 'dart:core').getType('Null'),
- objectClass = _getLibrary(c, 'dart:core').getType('Object'),
- stringClass = _getLibrary(c, 'dart:core').getType('String'),
- functionClass = _getLibrary(c, 'dart:core').getType('Function'),
- privateSymbolClass =
- _getLibrary(c, 'dart:_internal').getType('PrivateSymbol'),
- dartJSLibrary = _getLibrary(c, 'dart:js');
+ CodeGenerator._(
+ this.driver, this.summaryData, this.options, this._extensionTypes);
+
+ static Future<CodeGenerator> create(
+ AnalysisDriver driver,
+ SummaryDataStore summaryData,
+ CompilerOptions options,
+ ExtensionTypeSet extensionTypes) async {
+ CodeGenerator codeGenerator =
+ new CodeGenerator._(driver, summaryData, options, extensionTypes);
+ await codeGenerator._initialize();
+ return codeGenerator;
+ }
+
+ Future<Null> _initialize() async {
+ var coreLibrary = await _computeLibraryByUri('dart:core');
+ var asyncLibrary = await _computeLibraryByUri('dart:async');
+
+ types = new TypeProviderImpl(coreLibrary, asyncLibrary);
+ rules = new StrongTypeSystemImpl(types);
+
+ _asyncStreamIterator = asyncLibrary.getType('StreamIterator').type;
+
+ var interceptorsLibrary = await _computeLibraryByUri('dart:_interceptors');
+ _jsArray = interceptorsLibrary.getType('JSArray');
+ interceptorClass = interceptorsLibrary.getType('Interceptor');
+
+ dartCoreLibrary = coreLibrary;
+ boolClass = coreLibrary.getType('bool');
+ intClass = coreLibrary.getType('int');
+ numClass = coreLibrary.getType('num');
+ nullClass = coreLibrary.getType('Null');
+ objectClass = coreLibrary.getType('Object');
+ stringClass = coreLibrary.getType('String');
+ functionClass = coreLibrary.getType('Function');
+
+ var internalLibrary = await _computeLibraryByUri('dart:_internal');
+ privateSymbolClass = internalLibrary.getType('PrivateSymbol');
+
+ dartJSLibrary = await _computeLibraryByUri('dart:js');
+ }
LibraryElement get currentLibrary => _loader.currentElement.library;
@@ -205,7 +227,7 @@ class CodeGenerator extends GeneralizingAstVisitor
.elementDeclaredByCompilationUnit(u)
.librarySource
.isInSystemLibrary)) {
- var sdk = context.sourceFactory.dartSdk;
+ var sdk = driver.sourceFactory.dartSdk;
summaryData.addBundle(
null,
sdk is SummaryBasedDartSdk
@@ -228,7 +250,7 @@ class CodeGenerator extends GeneralizingAstVisitor
uriToUnit.keys.toSet(),
(uri) => summaryData.linkedMap[uri],
(uri) => summaryData.unlinkedMap[uri] ?? uriToUnit[uri],
- context.declaredVariables.get,
+ driver.declaredVariables.get,
true)
.forEach(assembler.addLinkedLibrary);
@@ -283,7 +305,7 @@ class CodeGenerator extends GeneralizingAstVisitor
// Collect all Element -> Node mappings, in case we need to forward declare
// any nodes.
- var nodes = new HashMap<Element, AstNode>.identity();
+ var nodes = new HashMap<Element, AstNode>();
var sdkBootstrappingFns = new List<FunctionElement>();
for (var unit in compilationUnits) {
if (_isDartRuntime(
@@ -295,7 +317,7 @@ class CodeGenerator extends GeneralizingAstVisitor
}
_loader = new ElementLoader(nodes);
if (compilationUnits.isNotEmpty) {
- _constants = new ConstFieldVisitor(context,
+ _constants = new ConstFieldVisitor(types, driver.declaredVariables,
dummySource: resolutionMap
.elementDeclaredByCompilationUnit(compilationUnits.first)
.source);
@@ -1865,7 +1887,7 @@ class CodeGenerator extends GeneralizingAstVisitor
} else {
// Method
// Swap in "Object" for parameter types that are covariant overrides.
- var objectType = context.typeProvider.objectType;
+ var objectType = types.objectType;
elementToType =
(MethodElement element) => element.getReifiedType(objectType);
getOverride = classElem.lookUpInheritedConcreteMethod;
@@ -5922,6 +5944,10 @@ class CodeGenerator extends GeneralizingAstVisitor
return path.endsWith(".template.dart");
}
+
+ Future<LibraryElement> _computeLibraryByUri(String libraryUri) async {
+ return await driver.resynthesizeLibrary(libraryUri);
+ }
}
/// Choose a canonical name from the [library] element.

Powered by Google App Engine
This is Rietveld 408576698