Skip to content

Commit 2d5af40

Browse files
committed
Make regexps more general just to filter out lines
1 parent d713075 commit 2d5af40

File tree

4 files changed

+77
-40
lines changed

4 files changed

+77
-40
lines changed

src/providers/angular-html-definition-provider.ts

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -14,15 +14,24 @@ export class AngularHtmlDefinitionProvider implements DefinitionProvider {
1414

1515
const regexps = [
1616
// Interpolation. ex: {{ myProp }}
17-
/{{\s*(\w+)[\.\s\w]*}}/g,
17+
/{{(.*)}}/g,
1818

19-
// Input attributes. ex: [...]="myProp"
20-
/\[\(?[\w\.\-?]*\)?\]=\"!?(\w+)[\.\w]*\"/g,
19+
// Input attributes. ex: [(...)]="myProp"
20+
/\[\(?[\w\.\-?]*\)?\]=\"(.*)"/g,
2121

2222
// Output attributes. ex: (...)="myMethod(...)"
23-
/\([\w\.]*\)=\"(\w+)\([\S]*\)\"/g
23+
/\([\w\.]*\)=\"(.*)\"/g,
24+
25+
// Structural attributes. ex: *ngIf="myProp"
26+
/\*\w+=\"(.*)\"/g
2427
];
25-
let propertyName: string = utils.parseByLocationRegexps(lineText, position.character, regexps);
28+
let expressionMatch: string = utils.parseByLocationRegexps(lineText, position.character, regexps);
29+
if (!expressionMatch) return false;
30+
31+
let range = document.getWordRangeAtPosition(position);
32+
if (!range) return false;
33+
34+
let propertyName = document.getText(range);
2635

2736
const componentFilePath = document.fileName.substr(0, document.fileName.lastIndexOf('.')) + '.ts';
2837

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,8 @@
11
<div>
22
{{ myProperty }}
33
<input type="text" [class.error]="myGetter" [(ngModel)]="myLongProperty" (click)="myMethod($event)">
4+
5+
<div *ngIf="good"></div>
6+
7+
{{ myProperty | myPipe }}
48
</div>

test/_test_files/foo.component.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
})
66
export class FooComponent {
77
myProperty = '';
8-
myLongProperty: string;
8+
@Input() myLongProperty: string;
99

1010
constructor() { }
1111

@@ -16,4 +16,6 @@ export class FooComponent {
1616
myMethod() {
1717
// do smth
1818
}
19+
20+
good = false;
1921
}

test/providers/angular-html-definition-provider.test.ts

Lines changed: 56 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -10,43 +10,65 @@ suite('AngularHtmlDefinitionProvider', () => {
1010
await openFileInVscode(templateFilePath);
1111
});
1212

13-
test('should resolve interpolation', async () => {
14-
const result = await vscode.commands.executeCommand<vscode.Location[]>('vscode.executeDefinitionProvider',
15-
vscode.Uri.file(templateFilePath), new vscode.Position(1, 8));
16-
17-
assert.notEqual(result[0], undefined, 'definition did not resolve');
18-
assert.equal(result[0].uri.fsPath, workspaceFilePath('foo.component.ts'), 'wrong file resolution');
19-
assert.equal(result[0].range.start.line, 6, 'wrong line position');
20-
assert.equal(result[0].range.start.character, 12, 'wrong character position');
21-
});
13+
suite('should resolve property/method', () => {
14+
test('from interpolation', async () => {
15+
const result = await vscode.commands.executeCommand<vscode.Location[]>('vscode.executeDefinitionProvider',
16+
vscode.Uri.file(templateFilePath), new vscode.Position(1, 8));
2217

23-
test('should resolve one way binded input', async () => {
24-
const result = await vscode.commands.executeCommand<vscode.Location[]>('vscode.executeDefinitionProvider',
25-
vscode.Uri.file(templateFilePath), new vscode.Position(2, 40));
18+
assert.notEqual(result[0], undefined, 'definition did not resolve');
19+
assert.equal(result[0].uri.fsPath, workspaceFilePath('foo.component.ts'), 'wrong file resolution');
20+
assert.equal(result[0].range.start.line, 6, 'wrong line position');
21+
assert.equal(result[0].range.start.character, 12, 'wrong character position');
22+
});
2623

27-
assert.notEqual(result[0], undefined, 'definition did not resolve');
28-
assert.equal(result[0].uri.fsPath, workspaceFilePath('foo.component.ts'), 'wrong file resolution');
29-
assert.equal(result[0].range.start.line, 11, 'wrong line position');
30-
assert.equal(result[0].range.start.character, 14, 'wrong character position');
31-
});
24+
test('from interpolation with pipe', async () => {
25+
const result = await vscode.commands.executeCommand<vscode.Location[]>('vscode.executeDefinitionProvider',
26+
vscode.Uri.file(templateFilePath), new vscode.Position(6, 9));
3227

33-
test('should resolve two way binded input', async () => {
34-
const result = await vscode.commands.executeCommand<vscode.Location[]>('vscode.executeDefinitionProvider',
35-
vscode.Uri.file(templateFilePath), new vscode.Position(2, 62));
28+
assert.notEqual(result[0], undefined, 'definition did not resolve');
29+
assert.equal(result[0].uri.fsPath, workspaceFilePath('foo.component.ts'), 'wrong file resolution');
30+
assert.equal(result[0].range.start.line, 6, 'wrong line position');
31+
assert.equal(result[0].range.start.character, 12, 'wrong character position');
32+
});
3633

37-
assert.notEqual(result[0], undefined, 'definition did not resolve');
38-
assert.equal(result[0].uri.fsPath, workspaceFilePath('foo.component.ts'), 'wrong file resolution');
39-
assert.equal(result[0].range.start.line, 7, 'wrong line position');
40-
assert.equal(result[0].range.start.character, 16, 'wrong character position');
41-
});
42-
43-
test('should resolve output', async () => {
44-
const result = await vscode.commands.executeCommand<vscode.Location[]>('vscode.executeDefinitionProvider',
45-
vscode.Uri.file(templateFilePath), new vscode.Position(2, 86));
46-
47-
assert.notEqual(result[0], undefined, 'definition did not resolve');
48-
assert.equal(result[0].uri.fsPath, workspaceFilePath('foo.component.ts'), 'wrong file resolution');
49-
assert.equal(result[0].range.start.line, 15, 'wrong line position');
50-
assert.equal(result[0].range.start.character, 10, 'wrong character position');
34+
test('from one way binded input attribute', async () => {
35+
const result = await vscode.commands.executeCommand<vscode.Location[]>('vscode.executeDefinitionProvider',
36+
vscode.Uri.file(templateFilePath), new vscode.Position(2, 40));
37+
38+
assert.notEqual(result[0], undefined, 'definition did not resolve');
39+
assert.equal(result[0].uri.fsPath, workspaceFilePath('foo.component.ts'), 'wrong file resolution');
40+
assert.equal(result[0].range.start.line, 11, 'wrong line position');
41+
assert.equal(result[0].range.start.character, 14, 'wrong character position');
42+
});
43+
44+
test('from two way binded input attribute', async () => {
45+
const result = await vscode.commands.executeCommand<vscode.Location[]>('vscode.executeDefinitionProvider',
46+
vscode.Uri.file(templateFilePath), new vscode.Position(2, 62));
47+
48+
assert.notEqual(result[0], undefined, 'definition did not resolve');
49+
assert.equal(result[0].uri.fsPath, workspaceFilePath('foo.component.ts'), 'wrong file resolution');
50+
assert.equal(result[0].range.start.line, 7, 'wrong line position');
51+
assert.equal(result[0].range.start.character, 25, 'wrong character position');
52+
});
53+
54+
test('from output attribute', async () => {
55+
const result = await vscode.commands.executeCommand<vscode.Location[]>('vscode.executeDefinitionProvider',
56+
vscode.Uri.file(templateFilePath), new vscode.Position(2, 86));
57+
58+
assert.notEqual(result[0], undefined, 'definition did not resolve');
59+
assert.equal(result[0].uri.fsPath, workspaceFilePath('foo.component.ts'), 'wrong file resolution');
60+
assert.equal(result[0].range.start.line, 15, 'wrong line position');
61+
assert.equal(result[0].range.start.character, 10, 'wrong character position');
62+
});
63+
64+
test('from structural attribute', async () => {
65+
const result = await vscode.commands.executeCommand<vscode.Location[]>('vscode.executeDefinitionProvider',
66+
vscode.Uri.file(templateFilePath), new vscode.Position(4, 15));
67+
68+
assert.notEqual(result[0], undefined, 'definition did not resolve');
69+
assert.equal(result[0].uri.fsPath, workspaceFilePath('foo.component.ts'), 'wrong file resolution');
70+
assert.equal(result[0].range.start.line, 19, 'wrong line position');
71+
assert.equal(result[0].range.start.character, 6, 'wrong character position');
72+
});
5173
});
5274
});

0 commit comments

Comments
 (0)