| Index: sdk/lib/_internal/compiler/implementation/mirrors/dart2js_member_mirrors.dart
|
| diff --git a/sdk/lib/_internal/compiler/implementation/mirrors/dart2js_member_mirrors.dart b/sdk/lib/_internal/compiler/implementation/mirrors/dart2js_member_mirrors.dart
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..3f4b60489c1cf3634d41a210fcd8727d12e955d0
|
| --- /dev/null
|
| +++ b/sdk/lib/_internal/compiler/implementation/mirrors/dart2js_member_mirrors.dart
|
| @@ -0,0 +1,286 @@
|
| +// Copyright (c) 2013, 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.
|
| +
|
| +part of dart2js.mirrors;
|
| +
|
| +//------------------------------------------------------------------------------
|
| +// Member mirrors implementation.
|
| +//------------------------------------------------------------------------------
|
| +
|
| +abstract class Dart2JsMemberMirror extends Dart2JsElementMirror {
|
| +
|
| + Dart2JsMemberMirror(Dart2JsMirrorSystem system, Element element)
|
| + : super(system, element);
|
| +
|
| + bool get isStatic => false;
|
| +}
|
| +
|
| +
|
| +class Dart2JsMethodKind {
|
| + static const Dart2JsMethodKind REGULAR = const Dart2JsMethodKind("regular");
|
| + static const Dart2JsMethodKind GENERATIVE =
|
| + const Dart2JsMethodKind("generative");
|
| + static const Dart2JsMethodKind REDIRECTING =
|
| + const Dart2JsMethodKind("redirecting");
|
| + static const Dart2JsMethodKind CONST = const Dart2JsMethodKind("const");
|
| + static const Dart2JsMethodKind FACTORY = const Dart2JsMethodKind("factory");
|
| + static const Dart2JsMethodKind GETTER = const Dart2JsMethodKind("getter");
|
| + static const Dart2JsMethodKind SETTER = const Dart2JsMethodKind("setter");
|
| + static const Dart2JsMethodKind OPERATOR = const Dart2JsMethodKind("operator");
|
| +
|
| + final String text;
|
| +
|
| + const Dart2JsMethodKind(this.text);
|
| +
|
| + String toString() => text;
|
| +}
|
| +
|
| +
|
| +String _getOperatorFromOperatorName(String name) {
|
| + Map<String, String> mapping = const {
|
| + 'eq': '==',
|
| + 'not': '~',
|
| + 'index': '[]',
|
| + 'indexSet': '[]=',
|
| + 'mul': '*',
|
| + 'div': '/',
|
| + 'mod': '%',
|
| + 'tdiv': '~/',
|
| + 'add': '+',
|
| + 'sub': '-',
|
| + 'shl': '<<',
|
| + 'shr': '>>',
|
| + 'ge': '>=',
|
| + 'gt': '>',
|
| + 'le': '<=',
|
| + 'lt': '<',
|
| + 'and': '&',
|
| + 'xor': '^',
|
| + 'or': '|',
|
| + };
|
| + String newName = mapping[name];
|
| + if (newName == null) {
|
| + throw new Exception('Unhandled operator name: $name');
|
| + }
|
| + return newName;
|
| +}
|
| +
|
| +class Dart2JsMethodMirror extends Dart2JsMemberMirror
|
| + implements MethodMirror {
|
| + final Dart2JsDeclarationMirror owner;
|
| + final String _simpleNameString;
|
| + final Dart2JsMethodKind _kind;
|
| +
|
| + Dart2JsMethodMirror._internal(Dart2JsDeclarationMirror owner,
|
| + FunctionElement function,
|
| + String this._simpleNameString,
|
| + Dart2JsMethodKind this._kind)
|
| + : this.owner = owner,
|
| + super(owner.mirrorSystem, function);
|
| +
|
| + factory Dart2JsMethodMirror(Dart2JsDeclarationMirror owner,
|
| + FunctionElement function) {
|
| + String realName = function.name;
|
| + // TODO(ahe): This method should not be calling
|
| + // Elements.operatorNameToIdentifier.
|
| + String simpleName =
|
| + Elements.operatorNameToIdentifier(function.name);
|
| + Dart2JsMethodKind kind;
|
| + if (function.kind == ElementKind.GETTER) {
|
| + kind = Dart2JsMethodKind.GETTER;
|
| + } else if (function.kind == ElementKind.SETTER) {
|
| + kind = Dart2JsMethodKind.SETTER;
|
| + simpleName = '$simpleName=';
|
| + } else if (function.kind == ElementKind.GENERATIVE_CONSTRUCTOR) {
|
| + // TODO(johnniwinther): Support detection of redirecting constructors.
|
| + if (function.modifiers.isConst()) {
|
| + kind = Dart2JsMethodKind.CONST;
|
| + } else {
|
| + kind = Dart2JsMethodKind.GENERATIVE;
|
| + }
|
| + } else if (function.modifiers.isFactory()) {
|
| + // TODO(johnniwinther): Support detection of redirecting constructors.
|
| + kind = Dart2JsMethodKind.FACTORY;
|
| + } else if (realName == 'unary-') {
|
| + // TODO(johnniwinther): Use a constant for 'unary-'.
|
| + kind = Dart2JsMethodKind.OPERATOR;
|
| + // Simple name is 'unary-'.
|
| + simpleName = 'unary-';
|
| + } else if (simpleName.startsWith('operator\$')) {
|
| + String str = simpleName.substring(9);
|
| + simpleName = 'operator';
|
| + kind = Dart2JsMethodKind.OPERATOR;
|
| + simpleName = _getOperatorFromOperatorName(str);
|
| + } else {
|
| + kind = Dart2JsMethodKind.REGULAR;
|
| + }
|
| + return new Dart2JsMethodMirror._internal(owner, function,
|
| + simpleName, kind);
|
| + }
|
| +
|
| + FunctionElement get _function => _element;
|
| +
|
| + bool get isTopLevel => owner is LibraryMirror;
|
| +
|
| + // TODO(johnniwinther): This seems stale and broken.
|
| + Symbol get constructorName => isConstructor ? simpleName : const Symbol('');
|
| +
|
| + bool get isConstructor
|
| + => isGenerativeConstructor || isConstConstructor ||
|
| + isFactoryConstructor || isRedirectingConstructor;
|
| +
|
| + bool get isSynthetic => false;
|
| +
|
| + bool get isStatic => _function.modifiers.isStatic();
|
| +
|
| + List<ParameterMirror> get parameters {
|
| + return _parametersFromFunctionSignature(this,
|
| + _function.computeSignature(mirrorSystem.compiler));
|
| + }
|
| +
|
| + TypeMirror get returnType => owner._getTypeMirror(
|
| + _function.computeSignature(mirrorSystem.compiler).returnType);
|
| +
|
| + bool get isAbstract => _function.isAbstract;
|
| +
|
| + bool get isRegularMethod => !(isGetter || isSetter || isConstructor);
|
| +
|
| + bool get isConstConstructor => _kind == Dart2JsMethodKind.CONST;
|
| +
|
| + bool get isGenerativeConstructor => _kind == Dart2JsMethodKind.GENERATIVE;
|
| +
|
| + bool get isRedirectingConstructor => _kind == Dart2JsMethodKind.REDIRECTING;
|
| +
|
| + bool get isFactoryConstructor => _kind == Dart2JsMethodKind.FACTORY;
|
| +
|
| + bool get isGetter => _kind == Dart2JsMethodKind.GETTER;
|
| +
|
| + bool get isSetter => _kind == Dart2JsMethodKind.SETTER;
|
| +
|
| + bool get isOperator => _kind == Dart2JsMethodKind.OPERATOR;
|
| +
|
| + DeclarationMirror lookupInScope(String name) {
|
| + for (Dart2JsParameterMirror parameter in parameters) {
|
| + if (parameter._element.name == name) {
|
| + return parameter;
|
| + }
|
| + }
|
| + return super.lookupInScope(name);
|
| + }
|
| +
|
| + // TODO(johnniwinther): Should this really be in the interface of
|
| + // [MethodMirror]?
|
| + String get source => location.sourceText;
|
| +
|
| + String toString() => 'Mirror on method ${_element.name}';
|
| +}
|
| +
|
| +class Dart2JsFieldMirror extends Dart2JsMemberMirror implements VariableMirror {
|
| + final Dart2JsDeclarationMirror owner;
|
| + VariableElement _variable;
|
| +
|
| + Dart2JsFieldMirror(Dart2JsDeclarationMirror owner,
|
| + VariableElement variable)
|
| + : this.owner = owner,
|
| + this._variable = variable,
|
| + super(owner.mirrorSystem, variable);
|
| +
|
| + Element get _beginElement => _variable.variables;
|
| +
|
| + bool get isTopLevel => owner is LibraryMirror;
|
| +
|
| + bool get isStatic => _variable.modifiers.isStatic();
|
| +
|
| + bool get isFinal => _variable.modifiers.isFinal();
|
| +
|
| + bool get isConst => _variable.modifiers.isConst();
|
| +
|
| + TypeMirror get type =>
|
| + owner._getTypeMirror(_variable.computeType(mirrorSystem.compiler));
|
| +}
|
| +
|
| +class Dart2JsParameterMirror extends Dart2JsMemberMirror
|
| + implements ParameterMirror {
|
| + final Dart2JsDeclarationMirror owner;
|
| + final bool isOptional;
|
| + final bool isNamed;
|
| +
|
| + factory Dart2JsParameterMirror(Dart2JsDeclarationMirror owner,
|
| + VariableElement element,
|
| + {bool isOptional: false,
|
| + bool isNamed: false}) {
|
| + if (element is FieldParameterElement) {
|
| + return new Dart2JsFieldParameterMirror(
|
| + owner, element, isOptional, isNamed);
|
| + }
|
| + return new Dart2JsParameterMirror._normal(
|
| + owner, element, isOptional, isNamed);
|
| + }
|
| +
|
| + Dart2JsParameterMirror._normal(Dart2JsDeclarationMirror owner,
|
| + VariableElement element,
|
| + this.isOptional,
|
| + this.isNamed)
|
| + : this.owner = owner,
|
| + super(owner.mirrorSystem, element);
|
| +
|
| + Element get _beginElement => _variableElement.variables;
|
| +
|
| + VariableElement get _variableElement => _element;
|
| +
|
| + TypeMirror get type => owner._getTypeMirror(
|
| + _variableElement.computeType(mirrorSystem.compiler),
|
| + _variableElement.variables.functionSignature);
|
| +
|
| +
|
| + bool get isFinal => false;
|
| +
|
| + bool get isConst => false;
|
| +
|
| + InstanceMirror get defaultValue {
|
| + Constant constant = mirrorSystem.compiler.constantHandler
|
| + .getConstantForVariable(_variableElement);
|
| + if (constant != null) {
|
| + return _convertConstantToInstanceMirror(mirrorSystem, constant);
|
| + }
|
| + return null;
|
| + }
|
| +
|
| + bool get hasDefaultValue {
|
| + return mirrorSystem.compiler.constantHandler
|
| + .getConstantForVariable(_variableElement) != null;
|
| + }
|
| +
|
| + bool get isInitializingFormal => false;
|
| +
|
| + VariableMirror get initializedField => null;
|
| +}
|
| +
|
| +class Dart2JsFieldParameterMirror extends Dart2JsParameterMirror {
|
| +
|
| + Dart2JsFieldParameterMirror(Dart2JsDeclarationMirror method,
|
| + FieldParameterElement element,
|
| + bool isOptional,
|
| + bool isNamed)
|
| + : super._normal(method, element, isOptional, isNamed);
|
| +
|
| + FieldParameterElement get _fieldParameterElement => _element;
|
| +
|
| + TypeMirror get type {
|
| + VariableListElement variables = _fieldParameterElement.variables;
|
| + VariableDefinitions node = variables.parseNode(mirrorSystem.compiler);
|
| + if (node.type != null) {
|
| + return super.type;
|
| + }
|
| + // Use the field type for initializing formals with no type annotation.
|
| + return owner._getTypeMirror(
|
| + _fieldParameterElement.fieldElement.computeType(mirrorSystem.compiler),
|
| + _fieldParameterElement.fieldElement.variables.functionSignature);
|
| + }
|
| +
|
| + bool get isInitializingFormal => true;
|
| +
|
| + VariableMirror get initializedField => new Dart2JsFieldMirror(
|
| + owner.owner, _fieldParameterElement.fieldElement);
|
| +}
|
|
|