Skip to content

Commit d824745

Browse files
committed
Merge remote-tracking branch 'origin/fix_desugared_directive' into fix_desugared_directive
# Conflicts: # src/noAccessMissingMemberRule.ts # test/angularWhitespaceRule.spec.ts # test/templatesUsePublicRule.spec.ts
2 parents c1873e9 + 4429088 commit d824745

13 files changed

+3440
-108
lines changed

package-lock.json

Lines changed: 2136 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,8 @@
2121
},
2222
"contributors": [
2323
"Minko Gechev <mgechev@gmail.com>",
24-
"Preslav Semov <preslavsemov@gmail.com>"
24+
"Preslav Semov <preslavsemov@gmail.com>",
25+
"William Koza <william.koza@gmail.com>"
2526
],
2627
"repository": {
2728
"type": "git",
@@ -46,8 +47,8 @@
4647
},
4748
"homepage": "https://github.com/mgechev/codelyzer#readme",
4849
"devDependencies": {
49-
"@angular/compiler": "^4.2.3",
50-
"@angular/core": "^4.2.3",
50+
"@angular/compiler": "^4.3.3",
51+
"@angular/core": "^4.3.3",
5152
"@types/chai": "^3.4.33",
5253
"@types/less": "0.0.31",
5354
"@types/mocha": "^2.2.32",

src/angular/config.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@ export const Config: Config = {
6363
},
6464

6565
predefinedDirectives: [
66-
{ selector: 'form', exportAs: 'ngForm' },
66+
{ selector: 'form:not([ngNoForm]):not([formGroup]), ngForm, [ngForm]', exportAs: 'ngForm' },
6767
{ selector: '[routerLinkActive]', exportAs: 'routerLinkActive' },
6868
{ selector: '[ngModel]:not([formControlName]):not([formControl])', exportAs: 'ngModel' },
6969
{ selector: '[md-menu-item], [mat-menu-item]', exportAs: 'mdMenuItem' },

src/angular/ngWalker.ts

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -126,16 +126,18 @@ export class NgWalker extends Lint.RuleWalker {
126126
this.visitNgInjectable(<ts.ClassDeclaration>decorator.parent, decorator);
127127
}
128128

129+
130+
if (name === 'Pipe') {
131+
this.visitNgPipe(<ts.ClassDeclaration>decorator.parent, decorator);
132+
}
133+
129134
// Not invoked @Component or @Pipe, or @Directive
130135
if (!(<ts.CallExpression>decorator.expression).arguments ||
131136
!(<ts.CallExpression>decorator.expression).arguments.length ||
132137
!(<ts.ObjectLiteralExpression>(<ts.CallExpression>decorator.expression).arguments[0]).properties) {
133138
return;
134139
}
135140

136-
if (name === 'Pipe') {
137-
this.visitNgPipe(<ts.ClassDeclaration>decorator.parent, decorator);
138-
}
139141
}
140142

141143
protected visitNgComponent(metadata: ComponentMetadata) {

src/angular/templates/basicTemplateAstVisitor.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import { SourceMappingVisitor } from '../sourceMappingVisitor';
1010
import { NgWalker } from '../ngWalker';
1111

1212

13+
1314
const getExpressionDisplacement = (binding: any) => {
1415
let attrLen = 0;
1516
let valLen = 0;

src/angular/templates/templateParser.ts

Lines changed: 105 additions & 69 deletions
Original file line numberDiff line numberDiff line change
@@ -45,34 +45,53 @@ class Console {
4545
warn(message: string) {}
4646
}
4747

48-
4948
let defaultDirectives = [];
5049

51-
export const parseTemplate = (template: string, directives: DirectiveDeclaration[] = []) => {
50+
export const parseTemplate = (
51+
template: string,
52+
directives: DirectiveDeclaration[] = []
53+
) => {
5254
defaultDirectives = directives.map(d => dummyMetadataFactory(d));
5355

5456
const TemplateParser = <any>compiler.TemplateParser;
5557
const expressionParser = new compiler.Parser(new compiler.Lexer());
5658
const elementSchemaRegistry = new compiler.DomElementSchemaRegistry();
5759
const ngConsole = new Console();
58-
const htmlParser =
59-
new compiler.I18NHtmlParser(new compiler.HtmlParser());
60+
const htmlParser = new compiler.HtmlParser();
6061

6162
let tmplParser: any;
6263

63-
SemVerDSL
64-
.gte('4.0.0-beta.8', () => {
65-
const config = new compiler.CompilerConfig({});
66-
tmplParser =
67-
new TemplateParser(config, expressionParser, elementSchemaRegistry, htmlParser, ngConsole, []);
68-
})
64+
SemVerDSL.gte('4.0.0-beta.8', () => {
65+
const config = new compiler.CompilerConfig({});
66+
tmplParser = new TemplateParser(
67+
config,
68+
expressionParser,
69+
elementSchemaRegistry,
70+
htmlParser,
71+
ngConsole,
72+
[]
73+
);
74+
})
6975
.elseIf.lt('4.1.0', () => {
70-
tmplParser =
71-
new TemplateParser(expressionParser, elementSchemaRegistry, htmlParser, ngConsole, []);
72-
}).else(() => {
76+
tmplParser = new TemplateParser(
77+
expressionParser,
78+
elementSchemaRegistry,
79+
htmlParser,
80+
ngConsole,
81+
[]
82+
);
83+
})
84+
.else(() => {
7385
const config = new compiler.CompilerConfig({});
74-
tmplParser =
75-
new TemplateParser(config, new compiler.JitReflector(), expressionParser, elementSchemaRegistry, htmlParser, ngConsole, []);
86+
tmplParser = new TemplateParser(
87+
config,
88+
new compiler.JitReflector(),
89+
expressionParser,
90+
elementSchemaRegistry,
91+
htmlParser,
92+
ngConsole,
93+
[]
94+
);
7695
});
7796

7897
const interpolation = Config.interpolation;
@@ -117,60 +136,77 @@ export const parseTemplate = (template: string, directives: DirectiveDeclaration
117136
};
118137
let result = null;
119138
try {
120-
SemVerDSL.lt('4.1.0', () => {
121-
result = tmplParser.tryParse(
122-
(compiler.CompileDirectiveMetadata as any).create({
123-
type,
124-
template: templateMetadata
125-
}),
126-
template, defaultDirectives, [], [NO_ERRORS_SCHEMA], '').templateAst;
127-
}).elseIf.lt('4.1.3', () => {
128-
result = tmplParser.tryParse(
129-
compiler.CompileDirectiveMetadata.create({
130-
type,
131-
template: templateMetadata,
132-
isHost: true,
133-
isComponent: true,
134-
selector: '',
135-
exportAs: '',
136-
changeDetection: ChangeDetectionStrategy.Default,
137-
inputs: [],
138-
outputs: [],
139-
host: {},
140-
providers: [],
141-
viewProviders: [],
142-
queries: [],
143-
viewQueries: [],
144-
entryComponents: [],
145-
componentViewType: null,
146-
rendererType: null,
147-
componentFactory: null
148-
}),
149-
template, defaultDirectives, [], [NO_ERRORS_SCHEMA], '').templateAst;
150-
}).else(() => {
151-
result = tmplParser.tryParse(
152-
compiler.CompileDirectiveMetadata.create({
153-
type,
154-
template: templateMetadata,
155-
isHost: true,
156-
isComponent: true,
157-
selector: '',
158-
exportAs: '',
159-
changeDetection: ChangeDetectionStrategy.Default,
160-
inputs: [],
161-
outputs: [],
162-
host: {},
163-
providers: [],
164-
viewProviders: [],
165-
queries: [],
166-
viewQueries: [],
167-
entryComponents: [],
168-
componentViewType: null,
169-
rendererType: null,
170-
componentFactory: null
171-
}),
172-
template, defaultDirectives, [], [NO_ERRORS_SCHEMA], '').templateAst;
173-
});
139+
SemVerDSL.lt('4.1.0', () => {
140+
result = tmplParser.tryParse(
141+
(compiler.CompileDirectiveMetadata as any).create({
142+
type,
143+
template: templateMetadata
144+
}),
145+
template,
146+
defaultDirectives,
147+
[],
148+
[NO_ERRORS_SCHEMA],
149+
''
150+
).templateAst;
151+
})
152+
.elseIf.lt('4.1.3', () => {
153+
result = tmplParser.tryParse(
154+
compiler.CompileDirectiveMetadata.create({
155+
type,
156+
template: templateMetadata,
157+
isHost: true,
158+
isComponent: true,
159+
selector: '',
160+
exportAs: '',
161+
changeDetection: ChangeDetectionStrategy.Default,
162+
inputs: [],
163+
outputs: [],
164+
host: {},
165+
providers: [],
166+
viewProviders: [],
167+
queries: [],
168+
viewQueries: [],
169+
entryComponents: [],
170+
componentViewType: null,
171+
rendererType: null,
172+
componentFactory: null
173+
}),
174+
template,
175+
defaultDirectives,
176+
[],
177+
[NO_ERRORS_SCHEMA],
178+
''
179+
).templateAst;
180+
})
181+
.else(() => {
182+
result = tmplParser.tryParse(
183+
compiler.CompileDirectiveMetadata.create({
184+
type,
185+
template: templateMetadata,
186+
isHost: true,
187+
isComponent: true,
188+
selector: '',
189+
exportAs: '',
190+
changeDetection: ChangeDetectionStrategy.Default,
191+
inputs: [],
192+
outputs: [],
193+
host: {},
194+
providers: [],
195+
viewProviders: [],
196+
queries: [],
197+
viewQueries: [],
198+
entryComponents: [],
199+
componentViewType: null,
200+
rendererType: null,
201+
componentFactory: null
202+
}),
203+
template,
204+
defaultDirectives,
205+
[],
206+
[NO_ERRORS_SCHEMA],
207+
''
208+
).templateAst;
209+
});
174210
} catch (e) {
175211
console.log(e);
176212
}

src/bananaInBoxRule.ts

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ const InvalidSyntaxBoxOpen = '([';
99
const InvalidSyntaxBoxClose = '])';
1010
const ValidSyntaxOpen = '[(';
1111
const ValidSyntaxClose = ')]';
12-
const InvalidSyntaxBoxRe = new RegExp('\\(\\[(.*?)\\]\\)(.*?)');
12+
const InvalidSyntaxBoxRe = new RegExp('\\[(.*?)\\]');
1313

1414
const getReplacements = (text: ast.BoundEventAst, absolutePosition: number) => {
1515
const expr: string = (text.sourceSpan as any).toString();
@@ -29,15 +29,14 @@ class BananaInBoxTemplateVisitor extends BasicTemplateAstVisitor {
2929

3030
visitEvent(prop: ast.BoundEventAst, context: any): any {
3131

32-
if (prop.sourceSpan) {
33-
// Note that will not be reliable for different interpolation symbols
32+
if (prop.name) {
3433
let error = null;
35-
const expr: any = (<any>prop.sourceSpan).toString();
36-
if (InvalidSyntaxBoxRe.test(expr)) {
34+
if (InvalidSyntaxBoxRe.test(prop.name)) {
3735
error = 'Invalid binding syntax. Use [(expr)] instead';
3836
}
3937

4038
if (error) {
39+
const expr: any = (<any>prop.sourceSpan).toString();
4140
const internalStart = expr.indexOf(InvalidSyntaxBoxOpen) + 1;
4241
const start = prop.sourceSpan.start.offset + internalStart;
4342
const absolutePosition = this.getSourcePosition(start - 1);

0 commit comments

Comments
 (0)