eslint-plugin-codelyzer
Version:
152 lines (151 loc) • 7.88 kB
JavaScript
;
var __extends = (this && this.__extends) || (function () {
var extendStatics = function (d, b) {
extendStatics = Object.setPrototypeOf ||
({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
return extendStatics(d, b);
};
return function (d, b) {
extendStatics(d, b);
function __() { this.constructor = d; }
d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
};
})();
Object.defineProperty(exports, "__esModule", { value: true });
var ast = require("@angular/compiler");
var expressionTypes_1 = require("../expressionTypes");
var recursiveAngularExpressionVisitor_1 = require("./recursiveAngularExpressionVisitor");
var sourceMappingVisitor_1 = require("../sourceMappingVisitor");
var getExpressionDisplacement = function (binding) {
var attrLen = 0;
var valLen = 0;
var totalLength = 0;
var result = 0;
if (binding instanceof ast.BoundEventAst ||
binding instanceof ast.BoundElementPropertyAst ||
binding instanceof ast.BoundDirectivePropertyAst) {
var subBindingLen = 0;
if (binding instanceof ast.BoundElementPropertyAst) {
switch (binding.type) {
case 4:
subBindingLen = 'animate'.length + 1;
break;
case 1:
subBindingLen = 'attr'.length + 1;
break;
case 2:
subBindingLen = 'class'.length + 1;
break;
case 3:
subBindingLen = 'style'.length + 1;
break;
}
}
if (!(binding instanceof ast.BoundDirectivePropertyAst)) {
attrLen = binding.name.length + 4 + subBindingLen;
}
if (binding instanceof ast.BoundEventAst) {
valLen = binding.handler.span.end;
}
else if (binding instanceof ast.BoundDirectivePropertyAst &&
(binding.templateName === 'ngForOf' || binding.templateName === 'ngIf')) {
result = binding.sourceSpan.start.file.content.lastIndexOf(binding.value.source);
if (binding.templateName === 'ngIf') {
if (binding.value.ast.span.start > 0)
result = binding.sourceSpan.start.file.content.lastIndexOf(binding.value.source) + binding.value.ast.span.start;
}
}
else {
valLen = binding.value.span.end;
}
if (!(binding instanceof ast.BoundDirectivePropertyAst) || (binding.templateName !== 'ngForOf' && binding.templateName !== 'ngIf')) {
totalLength = binding.sourceSpan.end.offset - binding.sourceSpan.start.offset;
var whitespace = totalLength - (attrLen + valLen) - 1;
result = whitespace + attrLen + binding.sourceSpan.start.offset;
}
}
else if (binding instanceof ast.BoundTextAst) {
result = binding.sourceSpan.start.offset;
}
return result;
};
var BasicTemplateAstVisitor = (function (_super) {
__extends(BasicTemplateAstVisitor, _super);
function BasicTemplateAstVisitor(sourceFile, _originalOptions, context, templateStart, expressionVisitorCtrl) {
if (expressionVisitorCtrl === void 0) { expressionVisitorCtrl = recursiveAngularExpressionVisitor_1.RecursiveAngularExpressionVisitor; }
var _this = _super.call(this, sourceFile, _originalOptions, context.template.template, templateStart) || this;
_this._originalOptions = _originalOptions;
_this.context = context;
_this.templateStart = templateStart;
_this.expressionVisitorCtrl = expressionVisitorCtrl;
_this._variables = {};
return _this;
}
BasicTemplateAstVisitor.prototype.visit = function (node, context) {
node.visit(this, context);
};
BasicTemplateAstVisitor.prototype.visitNgContent = function (ast, context) { };
BasicTemplateAstVisitor.prototype.visitEmbeddedTemplate = function (ast, context) {
var _this = this;
ast.directives.forEach(function (d) { return _this.visit(d, context); });
ast.variables.forEach(function (v) { return _this.visit(v, context); });
ast.children.forEach(function (e) { return _this.visit(e, context); });
ast.outputs.forEach(function (o) { return _this.visit(o, context); });
ast.attrs.forEach(function (a) { return _this.visit(a, context); });
ast.references.forEach(function (r) { return _this.visit(r, context); });
};
BasicTemplateAstVisitor.prototype.visitElement = function (element, context) {
var _this = this;
element.references.forEach(function (r) { return _this.visit(r, context); });
element.inputs.forEach(function (i) { return _this.visit(i, context); });
element.outputs.forEach(function (o) { return _this.visit(o, context); });
element.attrs.forEach(function (a) { return _this.visit(a, context); });
element.children.forEach(function (e) { return _this.visit(e, context); });
element.directives.forEach(function (d) { return _this.visit(d, context); });
};
BasicTemplateAstVisitor.prototype.visitReference = function (ast, context) { };
BasicTemplateAstVisitor.prototype.visitVariable = function (ast, context) {
this._variables[ast.name] = true;
};
BasicTemplateAstVisitor.prototype.visitEvent = function (ast, context) {
this._variables['$event'] = true;
this.visitNgTemplateAST(ast.handler, this.templateStart + getExpressionDisplacement(ast));
this._variables['$event'] = false;
};
BasicTemplateAstVisitor.prototype.visitElementProperty = function (prop, context) {
var ast = prop.value.ast;
ast.interpolateExpression = prop.value.source;
this.visitNgTemplateAST(prop.value, this.templateStart + getExpressionDisplacement(prop), prop);
};
BasicTemplateAstVisitor.prototype.visitAttr = function (ast, context) { };
BasicTemplateAstVisitor.prototype.visitBoundText = function (text, context) {
if (expressionTypes_1.ExpTypes.ASTWithSource(text.value)) {
var ast_1 = text.value.ast;
ast_1.interpolateExpression = text.value.source;
this.visitNgTemplateAST(ast_1, this.templateStart + getExpressionDisplacement(text));
}
};
BasicTemplateAstVisitor.prototype.visitText = function (text, context) { };
BasicTemplateAstVisitor.prototype.visitDirective = function (ast, context) {
var _this = this;
ast.inputs.forEach(function (o) { return _this.visit(o, context); });
ast.hostProperties.forEach(function (p) { return _this.visit(p, context); });
ast.hostEvents.forEach(function (e) { return _this.visit(e, context); });
};
BasicTemplateAstVisitor.prototype.visitDirectiveProperty = function (prop, context) {
if (expressionTypes_1.ExpTypes.ASTWithSource(prop.value)) {
this.visitNgTemplateAST(prop.value, this.templateStart + getExpressionDisplacement(prop), prop);
}
};
BasicTemplateAstVisitor.prototype.visitNgTemplateAST = function (ast, templateStart, prop) {
var _this = this;
var templateVisitor = new this.expressionVisitorCtrl(this.getSourceFile(), this._originalOptions, this.context, templateStart);
templateVisitor.preDefinedVariables = this._variables;
templateVisitor.parentAST = prop;
templateVisitor.visit(ast);
templateVisitor.getFailures().forEach(function (f) { return _this.addFailure(f); });
};
return BasicTemplateAstVisitor;
}(sourceMappingVisitor_1.SourceMappingVisitor));
exports.BasicTemplateAstVisitor = BasicTemplateAstVisitor;