Chromium Code Reviews| Index: dart/sdk/lib/_internal/lib/js_types.dart |
| diff --git a/dart/sdk/lib/_internal/lib/js_types.dart b/dart/sdk/lib/_internal/lib/js_types.dart |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..81a3df0ca25fd340c7c7d668b9e7eae0c3b9f713 |
| --- /dev/null |
| +++ b/dart/sdk/lib/_internal/lib/js_types.dart |
| @@ -0,0 +1,87 @@ |
| +// 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 _interceptors; |
| + |
| +class JsType {} |
| + |
| +/** |
| + * Interceptor for JavaScript constructor functions that create Dart |
|
ngeoffray
2013/09/06 06:54:06
What is a JavaScript constructor function? Somethi
ahe
2013/09/09 11:26:29
Done.
|
| + * objects. This is used for a variety of things, such as reflection and |
| + * runtime types. |
| + */ |
| +class JsRuntimeType extends Interceptor implements JsType { |
| + const JsRuntimeType(); |
| + |
| + String get mangledName => JS('String', r'#.builtin$cls', this); |
| + |
| + String get name { |
| + String m = mangledName; |
| + String n = unmangleGlobalNameIfPreservedAnyways(m); |
| + return n == null ? m : n; |
| + } |
| + |
| + String toString() => "JsRuntimeType on '$name'"; |
| +} |
| + |
| +/** |
| + * Interceptor for JavaScript objects that represent function types. |
|
ngeoffray
2013/09/06 06:54:06
Where do these JavaScript objects come from?
ahe
2013/09/09 11:26:29
Done.
|
| + */ |
| +// TODO(ahe): Shouldn't use interceptors for this, instead create a constant. |
|
ngeoffray
2013/09/06 06:54:06
What's "this"? How can you make it a constant?
ahe
2013/09/09 11:26:29
Done.
|
| +class JsFunctionType extends Interceptor implements JsType { |
| + const JsFunctionType(); |
| + |
| + bool get hasReturnType => JS('bool', '"ret" in #', this); |
|
ngeoffray
2013/09/06 06:54:06
Maybe add a helper method hasPropertyIn(String pro
ahe
2013/09/09 11:26:29
I hope to be able to clean this up in a more funda
|
| + get returnType => JS('', '#.ret', this); |
| + |
| + bool get isVoid => JS('bool', '!!#.void', this); |
|
ngeoffray
2013/09/06 06:54:06
Will that work on the Android browser?
ahe
2013/09/09 11:26:29
I think it will now.
|
| + |
| + bool get hasArguments => JS('bool', '"args" in #', this); |
| + List get arguments => JS('JSExtendableArray', '#.args', this); |
| + |
| + bool get hasOptionalArguments => JS('bool', '"opt" in #', this); |
| + List get optionalArguments => JS('JSExtendableArray', '#.opt', this); |
| + |
| + bool get hasNamedArguments => JS('bool', '"named" in #', this); |
| + get namedArguments => JS('=Object', '#.named', this); |
| + |
| + String toString() { |
| + var s = '('; |
| + var sep = ''; |
| + if (hasArguments) { |
| + for (var argument in arguments) { |
| + s = '$s$sep${runtimeTypeToString(argument)}'; |
| + sep = ', '; |
| + } |
| + } |
| + if (hasOptionalArguments) { |
| + s = '$s$sep['; |
| + sep = ''; |
| + for (var argument in optionalArguments) { |
| + s = '$s$sep${runtimeTypeToString(argument)}'; |
| + sep = ', '; |
| + } |
| + s = '$s]'; |
| + } |
| + if (hasNamedArguments) { |
| + s = '${s}$sep{'; |
| + sep = ''; |
| + for (var name in extractKeys(namedArguments)) { |
| + var type = JS('', '#[#]', namedArguments, name); |
| + s = '$s$sep$name: ${runtimeTypeToString(type)}'; |
| + sep = ', '; |
| + } |
| + s = '$s}'; |
| + } |
| + s = '${s}) -> '; |
| + if (isVoid) { |
| + s = '${s}void'; |
| + } else if (hasReturnType) { |
| + s = '$s${runtimeTypeToString(returnType)}'; |
| + } else { |
| + s = '${s}dynamic'; |
| + } |
| + return s; |
| + } |
| +} |