blob: 600487a800fba8b5a832e8d51127a57709e79c11 [file] [log] [blame]
// Copyright (c) 2014, 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 analyzer2dart.convertedWorld;
import 'dart:collection';
import 'package:analyzer/analyzer.dart';
import 'package:compiler/src/dart_types.dart' as dart2js;
import 'package:compiler/src/elements/elements.dart' as dart2js;
import 'package:analyzer/src/generated/element.dart' as analyzer;
import 'package:compiler/src/cps_ir/cps_ir_nodes.dart' as ir;
import 'closed_world.dart';
import 'element_converter.dart';
import 'cps_generator.dart';
import 'util.dart';
/// A [ClosedWorld] converted to the dart2js element model.
abstract class ConvertedWorld {
Iterable<dart2js.LibraryElement> get libraries;
Iterable<dart2js.AstElement> get resolvedElements;
Iterable<dart2js.ClassElement> get instantiatedClasses;
dart2js.FunctionElement get mainFunction;
ir.Node getIr(dart2js.Element element);
dart2js.DartTypes get dartTypes;
}
class _ConvertedWorldImpl implements ConvertedWorld {
final dart2js.FunctionElement mainFunction;
Map<dart2js.AstElement, ir.Node> executableElements =
new HashMap<dart2js.AstElement, ir.Node>();
final List<dart2js.ClassElement> instantiatedClasses =
<dart2js.ClassElement>[];
_ConvertedWorldImpl(this.mainFunction);
// TODO(johnniwinther): Add all used libraries and all SDK libraries to the
// set of libraries in the converted world.
Iterable<dart2js.LibraryElement> get libraries => [mainFunction.library];
Iterable<dart2js.AstElement> get resolvedElements => executableElements.keys;
ir.Node getIr(dart2js.Element element) => executableElements[element];
final dart2js.DartTypes dartTypes = new _DartTypes();
}
ConvertedWorld convertWorld(ClosedWorld closedWorld) {
ElementConverter converter = new ElementConverter();
_ConvertedWorldImpl convertedWorld = new _ConvertedWorldImpl(
converter.convertElement(closedWorld.mainFunction));
void convert(analyzer.Element analyzerElement, AstNode node) {
// Skip conversion of SDK sources since we don't generate code for it
// anyway.
if (analyzerElement.source.isInSystemLibrary) return;
dart2js.AstElement dart2jsElement =
converter.convertElement(analyzerElement);
CpsElementVisitor visitor = new CpsElementVisitor(converter, node);
ir.Node cpsNode = analyzerElement.accept(visitor);
convertedWorld.executableElements[dart2jsElement] = cpsNode;
if (cpsNode == null && !analyzerElement.isSynthetic) {
String message =
'No CPS node generated for $analyzerElement (${node.runtimeType}).';
reportSourceMessage(analyzerElement.source, node, message);
throw new UnimplementedError(message);
}
}
void convertClass(analyzer.ClassElement analyzerElement, _) {
// Skip conversion of SDK sources since we don't generate code for it
// anyway.
if (analyzerElement.source.isInSystemLibrary) return;
convertedWorld.instantiatedClasses.add(
converter.convertElement(analyzerElement));
}
closedWorld.executableElements.forEach(convert);
closedWorld.variables.forEach(convert);
closedWorld.fields.forEach(convert);
closedWorld.instantiatedClasses.forEach(convertClass);
return convertedWorld;
}
// TODO(johnniwinther): Implement [coreTypes] using [TypeProvider].
class _DartTypes implements dart2js.DartTypes {
@override
get coreTypes => throw new UnsupportedError("coreTypes");
@override
bool isSubtype(dart2js.DartType t, dart2js.DartType s) {
throw new UnsupportedError("isSubtype");
}
}