X Tutup
Skip to content

Commit 331a051

Browse files
vicbtbosch
authored andcommitted
feat(Parser): implement Unparser
fixes #1949 closes #2395
1 parent 92f1af8 commit 331a051

File tree

6 files changed

+344
-41
lines changed

6 files changed

+344
-41
lines changed

modules/angular2/src/change_detection/parser/ast.ts

Lines changed: 43 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -8,23 +8,23 @@ export class AST {
88

99
assign(context, locals, value) { throw new BaseException("Not supported"); }
1010

11-
visit(visitor): any { return null; }
11+
visit(visitor: AstVisitor): any { return null; }
1212

1313
toString(): string { return "AST"; }
1414
}
1515

1616
export class EmptyExpr extends AST {
1717
eval(context, locals) { return null; }
1818

19-
visit(visitor) {
19+
visit(visitor: AstVisitor) {
2020
// do nothing
2121
}
2222
}
2323

2424
export class ImplicitReceiver extends AST {
2525
eval(context, locals) { return context; }
2626

27-
visit(visitor) { return visitor.visitImplicitReceiver(this); }
27+
visit(visitor: AstVisitor) { return visitor.visitImplicitReceiver(this); }
2828
}
2929

3030
/**
@@ -42,7 +42,7 @@ export class Chain extends AST {
4242
return result;
4343
}
4444

45-
visit(visitor) { return visitor.visitChain(this); }
45+
visit(visitor: AstVisitor) { return visitor.visitChain(this); }
4646
}
4747

4848
export class Conditional extends AST {
@@ -56,7 +56,7 @@ export class Conditional extends AST {
5656
}
5757
}
5858

59-
visit(visitor) { return visitor.visitConditional(this); }
59+
visit(visitor: AstVisitor) { return visitor.visitConditional(this); }
6060
}
6161

6262
export class AccessMember extends AST {
@@ -88,7 +88,7 @@ export class AccessMember extends AST {
8888
}
8989
}
9090

91-
visit(visitor) { return visitor.visitAccessMember(this); }
91+
visit(visitor: AstVisitor) { return visitor.visitAccessMember(this); }
9292
}
9393

9494
export class SafeAccessMember extends AST {
@@ -102,7 +102,7 @@ export class SafeAccessMember extends AST {
102102
return isBlank(evaluatedReceiver) ? null : this.getter(evaluatedReceiver);
103103
}
104104

105-
visit(visitor) { return visitor.visitSafeAccessMember(this); }
105+
visit(visitor: AstVisitor) { return visitor.visitSafeAccessMember(this); }
106106
}
107107

108108
export class KeyedAccess extends AST {
@@ -123,7 +123,7 @@ export class KeyedAccess extends AST {
123123
return value;
124124
}
125125

126-
visit(visitor) { return visitor.visitKeyedAccess(this); }
126+
visit(visitor: AstVisitor) { return visitor.visitKeyedAccess(this); }
127127
}
128128

129129
export class Pipe extends AST {
@@ -132,15 +132,15 @@ export class Pipe extends AST {
132132
super();
133133
}
134134

135-
visit(visitor) { return visitor.visitPipe(this); }
135+
visit(visitor: AstVisitor) { return visitor.visitPipe(this); }
136136
}
137137

138138
export class LiteralPrimitive extends AST {
139139
constructor(public value) { super(); }
140140

141141
eval(context, locals) { return this.value; }
142142

143-
visit(visitor) { return visitor.visitLiteralPrimitive(this); }
143+
visit(visitor: AstVisitor) { return visitor.visitLiteralPrimitive(this); }
144144
}
145145

146146
export class LiteralArray extends AST {
@@ -150,7 +150,7 @@ export class LiteralArray extends AST {
150150
return ListWrapper.map(this.expressions, (e) => e.eval(context, locals));
151151
}
152152

153-
visit(visitor) { return visitor.visitLiteralArray(this); }
153+
visit(visitor: AstVisitor) { return visitor.visitLiteralArray(this); }
154154
}
155155

156156
export class LiteralMap extends AST {
@@ -164,15 +164,15 @@ export class LiteralMap extends AST {
164164
return res;
165165
}
166166

167-
visit(visitor) { return visitor.visitLiteralMap(this); }
167+
visit(visitor: AstVisitor) { return visitor.visitLiteralMap(this); }
168168
}
169169

170170
export class Interpolation extends AST {
171171
constructor(public strings: List<any>, public expressions: List<any>) { super(); }
172172

173173
eval(context, locals) { throw new BaseException("evaluating an Interpolation is not supported"); }
174174

175-
visit(visitor) { visitor.visitInterpolation(this); }
175+
visit(visitor: AstVisitor) { visitor.visitInterpolation(this); }
176176
}
177177

178178
export class Binary extends AST {
@@ -223,15 +223,15 @@ export class Binary extends AST {
223223
throw 'Internal error [$operation] not handled';
224224
}
225225

226-
visit(visitor) { return visitor.visitBinary(this); }
226+
visit(visitor: AstVisitor) { return visitor.visitBinary(this); }
227227
}
228228

229229
export class PrefixNot extends AST {
230230
constructor(public expression: AST) { super(); }
231231

232232
eval(context, locals) { return !this.expression.eval(context, locals); }
233233

234-
visit(visitor) { return visitor.visitPrefixNot(this); }
234+
visit(visitor: AstVisitor) { return visitor.visitPrefixNot(this); }
235235
}
236236

237237
export class Assignment extends AST {
@@ -241,7 +241,7 @@ export class Assignment extends AST {
241241
return this.target.assign(context, locals, this.value.eval(context, locals));
242242
}
243243

244-
visit(visitor) { return visitor.visitAssignment(this); }
244+
visit(visitor: AstVisitor) { return visitor.visitAssignment(this); }
245245
}
246246

247247
export class MethodCall extends AST {
@@ -262,7 +262,7 @@ export class MethodCall extends AST {
262262
}
263263
}
264264

265-
visit(visitor) { return visitor.visitMethodCall(this); }
265+
visit(visitor: AstVisitor) { return visitor.visitMethodCall(this); }
266266
}
267267

268268
export class SafeMethodCall extends AST {
@@ -278,7 +278,7 @@ export class SafeMethodCall extends AST {
278278
return this.fn(evaluatedReceiver, evaluatedArgs);
279279
}
280280

281-
visit(visitor) { return visitor.visitSafeMethodCall(this); }
281+
visit(visitor: AstVisitor) { return visitor.visitSafeMethodCall(this); }
282282
}
283283

284284
export class FunctionCall extends AST {
@@ -292,7 +292,7 @@ export class FunctionCall extends AST {
292292
return FunctionWrapper.apply(obj, evalList(context, locals, this.args));
293293
}
294294

295-
visit(visitor) { return visitor.visitFunctionCall(this); }
295+
visit(visitor: AstVisitor) { return visitor.visitFunctionCall(this); }
296296
}
297297

298298
export class ASTWithSource extends AST {
@@ -304,7 +304,7 @@ export class ASTWithSource extends AST {
304304

305305
assign(context, locals, value) { return this.ast.assign(context, locals, value); }
306306

307-
visit(visitor) { return this.ast.visit(visitor); }
307+
visit(visitor: AstVisitor) { return this.ast.visit(visitor); }
308308

309309
toString(): string { return `${this.source} in ${this.location}`; }
310310
}
@@ -314,27 +314,27 @@ export class TemplateBinding {
314314
public expression: ASTWithSource) {}
315315
}
316316

317-
// INTERFACE
318-
export class AstVisitor {
319-
visitAccessMember(ast: AccessMember) {}
320-
visitAssignment(ast: Assignment) {}
321-
visitBinary(ast: Binary) {}
322-
visitChain(ast: Chain) {}
323-
visitConditional(ast: Conditional) {}
324-
visitPipe(ast: Pipe) {}
325-
visitFunctionCall(ast: FunctionCall) {}
326-
visitImplicitReceiver(ast: ImplicitReceiver) {}
327-
visitKeyedAccess(ast: KeyedAccess) {}
328-
visitLiteralArray(ast: LiteralArray) {}
329-
visitLiteralMap(ast: LiteralMap) {}
330-
visitLiteralPrimitive(ast: LiteralPrimitive) {}
331-
visitMethodCall(ast: MethodCall) {}
332-
visitPrefixNot(ast: PrefixNot) {}
333-
visitSafeAccessMember(ast: SafeAccessMember) {}
334-
visitSafeMethodCall(ast: SafeMethodCall) {}
317+
export interface AstVisitor {
318+
visitAccessMember(ast: AccessMember): any;
319+
visitAssignment(ast: Assignment): any;
320+
visitBinary(ast: Binary): any;
321+
visitChain(ast: Chain): any;
322+
visitConditional(ast: Conditional): any;
323+
visitPipe(ast: Pipe): any;
324+
visitFunctionCall(ast: FunctionCall): any;
325+
visitImplicitReceiver(ast: ImplicitReceiver): any;
326+
visitInterpolation(ast: Interpolation): any;
327+
visitKeyedAccess(ast: KeyedAccess): any;
328+
visitLiteralArray(ast: LiteralArray): any;
329+
visitLiteralMap(ast: LiteralMap): any;
330+
visitLiteralPrimitive(ast: LiteralPrimitive): any;
331+
visitMethodCall(ast: MethodCall): any;
332+
visitPrefixNot(ast: PrefixNot): any;
333+
visitSafeAccessMember(ast: SafeAccessMember): any;
334+
visitSafeMethodCall(ast: SafeMethodCall): any;
335335
}
336336

337-
export class AstTransformer {
337+
export class AstTransformer implements AstVisitor {
338338
visitImplicitReceiver(ast: ImplicitReceiver) { return ast; }
339339

340340
visitInterpolation(ast: Interpolation) {
@@ -393,6 +393,10 @@ export class AstTransformer {
393393
}
394394
return res;
395395
}
396+
397+
visitChain(ast: Chain) { throw new BaseException('Not implemented'); }
398+
399+
visitAssignment(ast: Assignment) { throw new BaseException('Not implemented'); }
396400
}
397401

398402
var _evalListCache = [

modules/angular2/src/change_detection/proto_change_detector.ts

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -122,7 +122,6 @@ class ProtoRecordBuilder {
122122

123123
_appendRecords(b: BindingRecord, variableNames: List<string>) {
124124
if (b.isDirectiveLifecycle()) {
125-
;
126125
ListWrapper.push(
127126
this.records,
128127
new ProtoRecord(RECORD_TYPE_DIRECTIVE_LIFECYCLE, b.lifecycleEvent, null, [], [], -1, null,
@@ -133,7 +132,7 @@ class ProtoRecordBuilder {
133132
}
134133
}
135134

136-
class _ConvertAstIntoProtoRecords {
135+
class _ConvertAstIntoProtoRecords implements AstVisitor {
137136
constructor(private _records: List<ProtoRecord>, private _bindingRecord: BindingRecord,
138137
private _expressionAsString: string, private _variableNames: List<any>) {}
139138

@@ -240,6 +239,10 @@ class _ConvertAstIntoProtoRecords {
240239
[key], null, obj);
241240
}
242241

242+
visitAssignment(ast: Assignment) { throw new BaseException('Not supported'); }
243+
244+
visitChain(ast: Chain) { throw new BaseException('Not supported'); }
245+
243246
_visitAll(asts: List<any>) {
244247
var res = ListWrapper.createFixedSize(asts.length);
245248
for (var i = 0; i < asts.length; ++i) {

modules/angular2/src/facade/lang.dart

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,8 @@ class StringWrapper {
8888
static bool contains(String s, String substr) {
8989
return s.contains(substr);
9090
}
91+
92+
static bool isString(s) => s is String;
9193
}
9294

9395
class StringJoiner {

modules/angular2/src/facade/lang.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -132,6 +132,8 @@ export class StringWrapper {
132132
}
133133

134134
static contains(s: string, substr: string): boolean { return s.indexOf(substr) != -1; }
135+
136+
static isString(s: any): boolean { return typeof s === 'string' || s instanceof String; }
135137
}
136138

137139
export class StringJoiner {

0 commit comments

Comments
 (0)
X Tutup