Index: site/try/poi/scope_information_visitor.dart |
diff --git a/site/try/poi/scope_information_visitor.dart b/site/try/poi/scope_information_visitor.dart |
deleted file mode 100644 |
index 5f1b5a19560a66ae3dcba01745f9537e87a83fb5..0000000000000000000000000000000000000000 |
--- a/site/try/poi/scope_information_visitor.dart |
+++ /dev/null |
@@ -1,305 +0,0 @@ |
-// 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 trydart.poi.scope_information_visitor; |
- |
-import 'package:compiler/src/elements/modelx.dart' as modelx; |
- |
-import 'package:compiler/src/elements/modelx.dart' show |
- CompilationUnitElementX, |
- FieldElementX; |
- |
-import 'package:compiler/src/elements/visitor.dart' show |
- BaseElementVisitor; |
- |
-import 'package:compiler/src/compiler.dart' show |
- Compiler; |
- |
-import 'package:compiler/src/elements/elements.dart' show |
- AbstractFieldElement, |
- ClassElement, |
- CompilationUnitElement, |
- Element, |
- ElementCategory, |
- FunctionElement, |
- LibraryElement, |
- ScopeContainerElement; |
- |
-import 'package:compiler/src/dart_types.dart' show |
- DartType; |
- |
-/** |
- * 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 BaseElementVisitor/* <void> */ { |
- // TODO(ahe): Include function parameters and local variables. |
- |
- final Compiler compiler; |
- final Element currentElement; |
- final int position; |
- final StringBuffer buffer = new StringBuffer(); |
- int indentationLevel = 0; |
- ClassElement currentClass; |
- |
- bool sortMembers = false; |
- |
- bool ignoreImports = false; |
- |
- ScopeInformationVisitor(this.compiler, 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: ignoreImports || currentClass == null, |
- name: e.libraryName, |
- 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++; |
- sortElements(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; |
- sortElements(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}) { |
- e.ensureResolved(compiler.resolution); |
- 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: () { |
- localMembersSorted(e).forEach((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: () { |
- localMembersSorted(e).forEach((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(compiler.resolution); |
- } |
- 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, null); |
- } |
- } |
- indentationLevel--; |
- buffer.write('\n'); |
- indented.write('}'); |
- } |
- |
- List<Element> localMembersSorted(ScopeContainerElement element) { |
- List<Element> result = <Element>[]; |
- element.forEachLocalMember((Element member) { |
- result.add(member); |
- }); |
- return sortElements(result); |
- } |
- |
- List<Element> sortElements(Iterable<Element> elements) { |
- List<Element> result = new List<Element>.from(elements); |
- if (sortMembers) { |
- result.sort((Element a, Element b) => a.name.compareTo(b.name)); |
- } |
- return result; |
- } |
-} |
- |
-modelx.ScopeX localScope(modelx.LibraryElementX element) => element.localScope; |
- |
-modelx.ImportScope importScope(modelx.LibraryElementX element) { |
- return element.importScope; |
-} |