From cc3ed9a60d7a569f39e4197e541b18dc7ded54b4 Mon Sep 17 00:00:00 2001 From: mgechev Date: Sat, 31 Dec 2016 13:36:07 +0200 Subject: [PATCH] fix: proper check for public members Fix #206 --- src/templatesUsePublicRule.ts | 6 ++---- test/noAccessMissingMemberRule.spec.ts | 21 +++++++++++++++++++++ test/templatesUsePublicRule.spec.ts | 13 +++++++++++++ 3 files changed, 36 insertions(+), 4 deletions(-) diff --git a/src/templatesUsePublicRule.ts b/src/templatesUsePublicRule.ts index f5f6be124..8ec0719d7 100644 --- a/src/templatesUsePublicRule.ts +++ b/src/templatesUsePublicRule.ts @@ -37,10 +37,8 @@ class SymbolAccessValidator extends RecursiveAngularExpressionVisitor { const allMembers = getDeclaredMethods(this.context.controller).concat(getDeclaredProperties(this.context.controller)); const member = allMembers.filter((m: any) => m.name && m.name.text === ast.name).pop(); if (member) { - let isPublic = !member.modifiers; - if (member.modifiers) { - isPublic = member.modifiers.some(m => m.kind === SyntaxKind.current().PublicKeyword); - } + let isPublic = !member.modifiers || !member.modifiers + .some(m => m.kind === SyntaxKind.current().PrivateKeyword || m.kind === SyntaxKind.current().ProtectedKeyword); const width = ast.name.length; if (!isPublic) { const failureString = 'You can bind only to public class members.'; diff --git a/test/noAccessMissingMemberRule.spec.ts b/test/noAccessMissingMemberRule.spec.ts index 9c4bde3d1..e722ffb37 100644 --- a/test/noAccessMissingMemberRule.spec.ts +++ b/test/noAccessMissingMemberRule.spec.ts @@ -723,6 +723,27 @@ describe('no-access-missing-member', () => { }`; assertSuccess('no-access-missing-member', source); }); + + +// it('should succeed with array element access', () => { +// let source = ` +// @Component({ +// template: '
' +// }) +// class Test { +// }`; +// assertFailure('no-access-missing-member', source, { +// message: 'The property "context" that you\'re trying to access does not exist in the class declaration.', +// startPosition: { +// line: 2, +// character: 23 +// }, +// endPosition: { +// line: 2, +// character: 24 +// } +// }); +// }); // TODO // it('should work with getters', () => { // let source = ` diff --git a/test/templatesUsePublicRule.spec.ts b/test/templatesUsePublicRule.spec.ts index f88299186..86d339b0c 100644 --- a/test/templatesUsePublicRule.spec.ts +++ b/test/templatesUsePublicRule.spec.ts @@ -209,5 +209,18 @@ describe('templates-use-public', () => { }`; assertSuccess('templates-use-public', source); }); + + + it('should succeed on public nested props', () => { + let source = ` + @Component({ + selector: 'foobar', + template: '
{{ foo }}
+ }) + class Test { + readonly foo: any; + }`; + assertSuccess('templates-use-public', source); + }); }); });