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

Unified Diff: dart/site/try/poi/poi.dart

Issue 738423002: Use serialized scope info to test incremental compiler. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge
Patch Set: Merged with r41954. Created 6 years, 1 month 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: dart/site/try/poi/poi.dart
diff --git a/dart/site/try/poi/poi.dart b/dart/site/try/poi/poi.dart
index 0261ba5584fd39fa79b24a3f391446f1ad6060d9..3be187076d1973da5defbbc672d691c44c936575 100644
--- a/dart/site/try/poi/poi.dart
+++ b/dart/site/try/poi/poi.dart
@@ -63,6 +63,9 @@ import 'package:compiler/src/scanner/scannerlib.dart' show
import 'package:compiler/src/js/js.dart' show
js;
+import 'scope_information_visitor.dart' show
+ ScopeInformationVisitor;
+
/// Enabled by the option --enable-dart-mind. Controls if this program should
/// be querying Dart Mind.
bool isDartMindEnabled = false;
@@ -492,7 +495,7 @@ Element findPosition(int position, Element element) {
String scopeInformation(Element element, int position) {
ScopeInformationVisitor visitor =
- new ScopeInformationVisitor(element, position);
+ new ScopeInformationVisitor(cachedCompiler, element, position);
element.accept(visitor);
return '${visitor.buffer}';
}
@@ -545,259 +548,6 @@ class ScriptOnlyFilter implements QueueFilter {
}
}
-/**
- * Serializes scope information about an element. This is accomplished by
- * calling the [serialize] method on each element. Some elements need special
- * treatment, as their enclosing scope must also be serialized.
- */
-class ScopeInformationVisitor extends ElementVisitor/* <void> */ {
- // TODO(ahe): Include function parameters and local variables.
-
- final Element currentElement;
- final int position;
- final StringBuffer buffer = new StringBuffer();
- int indentationLevel = 0;
- ClassElement currentClass;
-
- ScopeInformationVisitor(this.currentElement, this.position);
-
- String get indentation => ' ' * indentationLevel;
-
- StringBuffer get indented => buffer..write(indentation);
-
- void visitElement(Element e) {
- serialize(e, omitEnclosing: false);
- }
-
- void visitLibraryElement(LibraryElement e) {
- bool isFirst = true;
- forEach(Element member) {
- if (!isFirst) {
- buffer.write(',');
- }
- buffer.write('\n');
- indented;
- serialize(member);
- isFirst = false;
- }
- serialize(
- e,
- // TODO(ahe): We omit the import scope if there is no current
- // class. That's wrong.
- omitEnclosing: currentClass == null,
- name: e.getLibraryName(),
- serializeEnclosing: () {
- // The enclosing scope of a library is a scope which contains all the
- // imported names.
- isFirst = true;
- buffer.write('{\n');
- indentationLevel++;
- indented.write('"kind": "imports",\n');
- indented.write('"members": [');
- indentationLevel++;
- importScope(e).importScope.values.forEach(forEach);
- indentationLevel--;
- buffer.write('\n');
- indented.write('],\n');
- // The enclosing scope of the imported names scope is the superclass
- // scope of the current class.
- indented.write('"enclosing": ');
- serializeClassSide(
- currentClass.superclass, isStatic: false, includeSuper: true);
- buffer.write('\n');
- indentationLevel--;
- indented.write('}');
- },
- serializeMembers: () {
- isFirst = true;
- localScope(e).values.forEach(forEach);
- });
- }
-
- void visitClassElement(ClassElement e) {
- currentClass = e;
- serializeClassSide(e, isStatic: true);
- }
-
- /// Serializes one of the "sides" a class. The sides of a class are "instance
- /// side" and "class side". These terms are from Smalltalk. The instance side
- /// is all the local instance members of the class (the members of the
- /// mixin), and the class side is the equivalent for static members and
- /// constructors.
- /// The scope chain is ordered so that the "class side" is searched before
- /// the "instance side".
- void serializeClassSide(
- ClassElement e,
- {bool isStatic: false,
- bool omitEnclosing: false,
- bool includeSuper: false}) {
- bool isFirst = true;
- var serializeEnclosing;
- String kind;
- if (isStatic) {
- kind = 'class side';
- serializeEnclosing = () {
- serializeClassSide(e, isStatic: false, omitEnclosing: omitEnclosing);
- };
- } else {
- kind = 'instance side';
- }
- if (includeSuper) {
- assert(!omitEnclosing && !isStatic);
- if (e.superclass == null) {
- omitEnclosing = true;
- } else {
- // Members of the superclass are represented as a separate scope.
- serializeEnclosing = () {
- serializeClassSide(
- e.superclass, isStatic: false, omitEnclosing: false,
- includeSuper: true);
- };
- }
- }
- serialize(
- e, omitEnclosing: omitEnclosing, serializeEnclosing: serializeEnclosing,
- kind: kind, serializeMembers: () {
- e.forEachLocalMember((Element member) {
- // Filter out members that don't belong to this "side".
- if (member.isConstructor) {
- // In dart2js, some constructors aren't static, but that isn't
- // convenient here.
- if (!isStatic) return;
- } else if (member.isStatic != isStatic) {
- return;
- }
- if (!isFirst) {
- buffer.write(',');
- }
- buffer.write('\n');
- indented;
- serialize(member);
- isFirst = false;
- });
- });
- }
-
- void visitScopeContainerElement(ScopeContainerElement e) {
- bool isFirst = true;
- serialize(e, omitEnclosing: false, serializeMembers: () {
- e.forEachLocalMember((Element member) {
- if (!isFirst) {
- buffer.write(',');
- }
- buffer.write('\n');
- indented;
- serialize(member);
- isFirst = false;
- });
- });
- }
-
- void visitCompilationUnitElement(CompilationUnitElement e) {
- e.enclosingElement.accept(this);
- }
-
- void visitAbstractFieldElement(AbstractFieldElement e) {
- throw new UnsupportedError('AbstractFieldElement cannot be serialized.');
- }
-
- void serialize(
- Element element,
- {bool omitEnclosing: true,
- void serializeMembers(),
- void serializeEnclosing(),
- String kind,
- String name}) {
- if (element.isAbstractField) {
- AbstractFieldElement field = element;
- FunctionElement getter = field.getter;
- FunctionElement setter = field.setter;
- if (getter != null) {
- serialize(
- getter,
- omitEnclosing: omitEnclosing,
- serializeMembers: serializeMembers,
- serializeEnclosing: serializeEnclosing,
- kind: kind,
- name: name);
- }
- if (setter != null) {
- if (getter != null) {
- buffer.write(',\n');
- indented;
- }
- serialize(
- getter,
- omitEnclosing: omitEnclosing,
- serializeMembers: serializeMembers,
- serializeEnclosing: serializeEnclosing,
- kind: kind,
- name: name);
- }
- return;
- }
- DartType type;
- int category = element.kind.category;
- if (category == ElementCategory.FUNCTION ||
- category == ElementCategory.VARIABLE ||
- element.isConstructor) {
- type = element.computeType(cachedCompiler);
- }
- if (name == null) {
- name = element.name;
- }
- if (kind == null) {
- kind = '${element.kind}';
- }
- buffer.write('{\n');
- indentationLevel++;
- if (name != '') {
- indented
- ..write('"name": "')
- ..write(name)
- ..write('",\n');
- }
- indented
- ..write('"kind": "')
- ..write(kind)
- ..write('"');
- if (type != null) {
- buffer.write(',\n');
- indented
- ..write('"type": "')
- ..write(type)
- ..write('"');
- }
- if (serializeMembers != null) {
- buffer.write(',\n');
- indented.write('"members": [');
- indentationLevel++;
- serializeMembers();
- indentationLevel--;
- buffer.write('\n');
- indented.write(']');
- }
- if (!omitEnclosing) {
- buffer.write(',\n');
- indented.write('"enclosing": ');
- if (serializeEnclosing != null) {
- serializeEnclosing();
- } else {
- element.enclosingElement.accept(this);
- }
- }
- indentationLevel--;
- buffer.write('\n');
- indented.write('}');
- }
-}
-
-modelx.ScopeX localScope(modelx.LibraryElementX element) => element.localScope;
-
-modelx.ImportScope importScope(modelx.LibraryElementX element) {
- return element.importScope;
-}
-
class PoiTask extends CompilerTask {
PoiTask(Compiler compiler) : super(compiler);
« no previous file with comments | « dart/pkg/dart2js_incremental/lib/library_updater.dart ('k') | dart/site/try/poi/scope_information_visitor.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698