// Copyright (c) 2012, 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. class _InvocationMirror implements InvocationMirror { // Constants describing the invocation type. static final int _METHOD = 0; static final int _GETTER = 1; static final int _SETTER = 2; // Internal representation of the invocation mirror. final String _functionName; final List _argumentsDescriptor; final List _arguments; // External representation of the invocation mirror; populated on demand. String _memberName; int _type; List _positionalArguments; Map _namedArguments; void _setMemberNameAndType() { if (_functionName.startsWith("get:")) { _type = _GETTER; _memberName = _functionName.substring(4); } else if (_functionName.startsWith("set:")) { _type = _SETTER; _memberName = _functionName.substring(4).concat("="); } else { _type = _METHOD; _memberName = _functionName; } } String get memberName { if (_memberName == null) { _setMemberNameAndType(); } return _memberName; } List get positionalArguments { if (_positionalArguments == null) { // Exclude receiver. int numPositionalArguments = _argumentsDescriptor[1] - 1; _positionalArguments = _arguments.getRange(1, numPositionalArguments); } return _positionalArguments; } Map get namedArguments { if (_namedArguments == null) { _namedArguments = new Map(); int numArguments = _argumentsDescriptor[0] - 1; // Exclude receiver. int numPositionalArguments = _argumentsDescriptor[1] - 1; int numNamedArguments = numArguments - numPositionalArguments; for (int i = 0; i < numNamedArguments; i++) { String arg_name = _argumentsDescriptor[2 + 2*i]; var arg_value = _arguments[_argumentsDescriptor[3 + 2*i]]; _namedArguments[arg_name] = arg_value; } } return _namedArguments; } bool get isMethod { if (_type == null) { _setMemberNameAndType(); } return _type == _METHOD; } bool get isAccessor { if (_type == null) { _setMemberNameAndType(); } return _type != _METHOD; } bool get isGetter { if (_type == null) { _setMemberNameAndType(); } return _type == _GETTER; } bool get isSetter { if (_type == null) { _setMemberNameAndType(); } return _type == _SETTER; } _InvocationMirror(this._functionName, this._argumentsDescriptor, this._arguments); static _allocateInvocationMirror(String functionName, List argumentsDescriptor, List arguments) { return new _InvocationMirror(functionName, argumentsDescriptor, arguments); } static _invoke(Object receiver, String functionName, List argumentsDescriptor, List arguments) native "InvocationMirror_invoke"; invokeOn(Object receiver) { return _invoke(receiver, _functionName, _argumentsDescriptor, _arguments); } }