Skip to content

Commit 9277398

Browse files
author
John Messerly
committed
Revert "fixes #173, ability to use native JS indexers"
This reverts commit 8dc1eeeb4dcc4d186f59513abd18f98e67c36339. Review URL: https://codereview.chromium.org/1160343003
1 parent 59852b5 commit 9277398

File tree

7 files changed

+9
-96
lines changed

7 files changed

+9
-96
lines changed

pkg/dev_compiler/lib/src/codegen/js_codegen.dart

Lines changed: 6 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -110,7 +110,7 @@ class JSCodegenVisitor extends GeneralizingAstVisitor with ConversionVisitor {
110110
if (unit.directives.isNotEmpty) {
111111
var libraryDir = unit.directives.first;
112112
if (libraryDir is LibraryDirective) {
113-
var jsName = findNodeAnnotation(libraryDir, _isJsNameAnnotation);
113+
var jsName = getAnnotationValue(libraryDir, _isJsNameAnnotation);
114114
jsDefaultValue = getConstantField(jsName, 'name', types.stringType);
115115
}
116116
}
@@ -329,7 +329,7 @@ class JSCodegenVisitor extends GeneralizingAstVisitor with ConversionVisitor {
329329
// If we've already emitted this class, skip it.
330330
var classElem = node.element;
331331
var type = classElem.type;
332-
var jsName = findNodeAnnotation(node, _isJsNameAnnotation);
332+
var jsName = getAnnotationValue(node, _isJsNameAnnotation);
333333

334334
if (jsName != null) return _emitJsType(node.name.name, jsName);
335335

@@ -350,7 +350,7 @@ class JSCodegenVisitor extends GeneralizingAstVisitor with ConversionVisitor {
350350
_classHeritage(classElem), _emitClassMethods(node, ctors, fields));
351351

352352
String jsPeerName;
353-
var jsPeer = findNodeAnnotation(node, _isJsPeerInterface);
353+
var jsPeer = getAnnotationValue(node, _isJsPeerInterface);
354354
if (jsPeer != null) {
355355
jsPeerName = getConstantField(jsPeer, 'name', types.stringType);
356356
}
@@ -475,7 +475,7 @@ class JSCodegenVisitor extends GeneralizingAstVisitor with ConversionVisitor {
475475
jsMethods.add(_emitImplicitConstructor(node, fields));
476476
}
477477

478-
bool hasJsPeer = findNodeAnnotation(node, _isJsPeerInterface) != null;
478+
bool hasJsPeer = getAnnotationValue(node, _isJsPeerInterface) != null;
479479

480480
bool hasIterator = false;
481481
for (var m in node.members) {
@@ -1349,12 +1349,7 @@ class JSCodegenVisitor extends GeneralizingAstVisitor with ConversionVisitor {
13491349

13501350
JS.Expression _emitSet(Expression lhs, Expression rhs) {
13511351
if (lhs is IndexExpression) {
1352-
var target = _getTarget(lhs);
1353-
if (_useNativeJsIndexer(target.staticType)) {
1354-
return js.call(
1355-
'#[#] = #', [_visit(target), _visit(lhs.index), _visit(rhs)]);
1356-
}
1357-
return _emitSend(target, '[]=', [lhs.index, rhs]);
1352+
return _emitSend(_getTarget(lhs), '[]=', [lhs.index, rhs]);
13581353
}
13591354

13601355
Expression target = null;
@@ -2121,18 +2116,9 @@ class JSCodegenVisitor extends GeneralizingAstVisitor with ConversionVisitor {
21212116

21222117
@override
21232118
visitIndexExpression(IndexExpression node) {
2124-
var target = _getTarget(node);
2125-
if (_useNativeJsIndexer(target.staticType)) {
2126-
return new JS.PropertyAccess(_visit(target), _visit(node.index));
2127-
}
2128-
return _emitSend(target, '[]', [node.index]);
2119+
return _emitSend(_getTarget(node), '[]', [node.index]);
21292120
}
21302121

2131-
// TODO(jmesserly): ideally we'd check the method and see if it is marked
2132-
// `external`, but that doesn't work because it isn't in the element model.
2133-
bool _useNativeJsIndexer(DartType type) =>
2134-
findElementAnnotation(type.element, _isJsIndexerAnnotation) != null;
2135-
21362122
/// Gets the target of a [PropertyAccess] or [IndexExpression].
21372123
/// Those two nodes are special because they're both allowed on left side of
21382124
/// an assignment expression and cascades.
@@ -2650,9 +2636,6 @@ String jsOutputPath(LibraryInfo info, Uri root) {
26502636
// TODO(jmesserly): validate the library. See issue #135.
26512637
bool _isJsNameAnnotation(DartObjectImpl value) => value.type.name == 'JsName';
26522638

2653-
bool _isJsIndexerAnnotation(DartObjectImpl value) =>
2654-
value.type.name == 'JsIndexer';
2655-
26562639
bool _isJsPeerInterface(DartObjectImpl value) =>
26572640
value.type.name == 'JsPeerInterface';
26582641

pkg/dev_compiler/lib/src/utils.dart

Lines changed: 1 addition & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -349,7 +349,7 @@ String resourceOutputPath(Uri resourceUri, Uri entryUri) {
349349
///
350350
/// (v) => v.type.name == 'Deprecated' && v.type.element.library.isDartCore
351351
///
352-
DartObjectImpl findNodeAnnotation(
352+
DartObjectImpl getAnnotationValue(
353353
AnnotatedNode node, bool test(DartObjectImpl value)) {
354354
for (var metadata in node.metadata) {
355355
ElementAnnotationImpl element = metadata.elementAnnotation;
@@ -364,19 +364,6 @@ DartObjectImpl findNodeAnnotation(
364364
return null;
365365
}
366366

367-
/// Similar to [findNodeAnnotation] but starts from any element.
368-
DartObjectImpl findElementAnnotation(
369-
Element element, bool test(DartObjectImpl value)) {
370-
for (var metadata in element.metadata) {
371-
var evalResult = metadata.evaluationResult;
372-
if (evalResult == null) continue;
373-
374-
var value = evalResult.value;
375-
if (value != null && test(value)) return value;
376-
}
377-
return null;
378-
}
379-
380367
/// Given a constant [value], a [fieldName], and an [expectedType], returns the
381368
/// value of that field.
382369
///

pkg/dev_compiler/test/codegen/domtest.dart

Lines changed: 0 additions & 16 deletions
This file was deleted.

pkg/dev_compiler/test/codegen/expect/domtest.js

Lines changed: 0 additions & 16 deletions
This file was deleted.

pkg/dev_compiler/test/codegen/expect/domtest.txt

Lines changed: 0 additions & 1 deletion
This file was deleted.

pkg/dev_compiler/test/codegen/expect/sunflower/dom.js

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -19,11 +19,8 @@ var core = dart.import(core);
1919
constructors: () => ({Overload: [Overload, []]})
2020
});
2121
let overload = dart.const(new Overload());
22-
class JsIndexer extends core.Object {
23-
JsIndexer() {
24-
}
25-
}
2622
let EventListener = dart.typedef('EventListener', () => dart.functionType(dart.void, [Event]));
23+
class Event extends core.Object {}
2724
let InputElement = HTMLInputElement;
2825
let CanvasElement = HTMLCanvasElement;
2926
class RenderingContext extends core.Object {}
@@ -44,8 +41,8 @@ var core = dart.import(core);
4441
exports.JsName = JsName;
4542
exports.Overload = Overload;
4643
exports.overload = overload;
47-
exports.JsIndexer = JsIndexer;
4844
exports.EventListener = EventListener;
45+
exports.Event = Event;
4946
exports.InputElement = InputElement;
5047
exports.CanvasElement = CanvasElement;
5148
exports.RenderingContext = RenderingContext;

pkg/dev_compiler/test/codegen/sunflower/dom.dart

Lines changed: 0 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -19,10 +19,6 @@ class Overload {
1919
}
2020
const overload = const Overload();
2121

22-
class JsIndexer {
23-
const JsIndexer();
24-
}
25-
2622
external Document get document;
2723

2824
@JsName(name: 'Document')
@@ -34,27 +30,10 @@ abstract class Document {
3430
abstract class Element {
3531
void addEventListener(String type, EventListener callback, [bool capture]);
3632
String textContent;
37-
NodeList get childNodes;
38-
}
39-
40-
@JsName()
41-
class Node {}
42-
43-
@JsName()
44-
@JsIndexer()
45-
class NodeList {
46-
external NodeList();
47-
external num get length;
48-
external set length(num _);
49-
external Node item(num index);
50-
51-
external Node operator [](num index);
52-
external void operator []=(num index, Node);
5333
}
5434

5535
typedef void EventListener(Event e);
5636

57-
@JsName()
5837
abstract class Event {}
5938

6039
@JsName(name: 'HTMLInputElement')

0 commit comments

Comments
 (0)