criticizer
Version:
Linting for Angular applications, following angular.io/styleguide.
115 lines (89 loc) • 3.17 kB
text/typescript
import * as Lint from 'tslint';
import * as ts from 'typescript';
import * as e from '@angular/compiler/src/expression_parser/ast';
import {SourceMappingVisitor} from '../sourceMappingVisitor';
import {ComponentMetadata} from '../metadata';
export class RecursiveAngularExpressionVisitor extends SourceMappingVisitor implements e.AstVisitor {
public preDefinedVariables = [];
constructor(sourceFile: ts.SourceFile, options: Lint.IOptions,
protected context: ComponentMetadata, protected basePosition: number) {
super(sourceFile, options, context.template.template, basePosition);
}
visit(ast: e.AST, context: any) {
ast.visit(this);
return null;
}
visitBinary(ast: e.Binary, context: any): any {
ast.left.visit(this);
ast.right.visit(this);
return null;
}
visitChain(ast: e.Chain, context: any): any { return this.visitAll(ast.expressions, context); }
visitConditional(ast: e.Conditional, context: any): any {
ast.condition.visit(this);
ast.trueExp.visit(this);
ast.falseExp.visit(this);
return null;
}
visitPipe(ast: e.BindingPipe, context: any): any {
ast.exp.visit(this);
this.visitAll(ast.args, context);
return null;
}
visitFunctionCall(ast: e.FunctionCall, context: any): any {
ast.target.visit(this);
this.visitAll(ast.args, context);
return null;
}
visitImplicitReceiver(ast: e.ImplicitReceiver, context: any): any { return null; }
visitInterpolation(ast: e.Interpolation, context: any): any {
ast.expressions.forEach((e: any, i: number) => this.visit(e, context));
return null;
}
visitKeyedRead(ast: e.KeyedRead, context: any): any {
ast.obj.visit(this);
ast.key.visit(this);
return null;
}
visitKeyedWrite(ast: e.KeyedWrite, context: any): any {
ast.obj.visit(this);
ast.key.visit(this);
ast.value.visit(this);
return null;
}
visitLiteralArray(ast: e.LiteralArray, context: any): any {
return this.visitAll(ast.expressions, context);
}
visitLiteralMap(ast: e.LiteralMap, context: any): any { return this.visitAll(ast.values, context); }
visitLiteralPrimitive(ast: e.LiteralPrimitive, context: any): any { return null; }
visitMethodCall(ast: e.MethodCall, context: any): any {
ast.receiver.visit(this);
return this.visitAll(ast.args, context);
}
visitPrefixNot(ast: e.PrefixNot, context: any): any {
ast.expression.visit(this);
return null;
}
visitPropertyRead(ast: e.PropertyRead, context: any): any {
ast.receiver.visit(this);
return null;
}
visitPropertyWrite(ast: e.PropertyWrite, context: any): any {
ast.receiver.visit(this);
ast.value.visit(this);
return null;
}
visitSafePropertyRead(ast: e.SafePropertyRead, context: any): any {
ast.receiver.visit(this);
return null;
}
visitSafeMethodCall(ast: e.SafeMethodCall, context: any): any {
ast.receiver.visit(this);
return this.visitAll(ast.args, context);
}
visitAll(asts: e.AST[], context: any): any {
asts.forEach(ast => ast.visit(this, context));
return null;
}
visitQuote(ast: e.Quote, context: any): any { return null; }
}