diff --git a/src/material/checkbox/checkbox-module.ts b/src/material/checkbox/checkbox-module.ts index 2c003fed71f7..04fba3939e45 100644 --- a/src/material/checkbox/checkbox-module.ts +++ b/src/material/checkbox/checkbox-module.ts @@ -17,7 +17,6 @@ import {MatCheckboxRequiredValidator} from './checkbox-required-validator'; exports: [MatCheckboxRequiredValidator], declarations: [MatCheckboxRequiredValidator], }) -// tslint:disable-next-line:class-name export class _MatCheckboxRequiredValidatorModule { } diff --git a/src/material/menu/menu-module.ts b/src/material/menu/menu-module.ts index 63b1dce3b6b6..29c2e092099e 100644 --- a/src/material/menu/menu-module.ts +++ b/src/material/menu/menu-module.ts @@ -28,7 +28,6 @@ import {MAT_MENU_SCROLL_STRATEGY_FACTORY_PROVIDER, MatMenuTrigger} from './menu- ], providers: [MAT_MENU_SCROLL_STRATEGY_FACTORY_PROVIDER] }) -// tslint:disable-next-line:class-name export class _MatMenuDirectivesModule {} @NgModule({ diff --git a/src/material/menu/menu.ts b/src/material/menu/menu.ts index f672fa2c6775..f79a2e7a277c 100644 --- a/src/material/menu/menu.ts +++ b/src/material/menu/menu.ts @@ -97,7 +97,6 @@ let menuPanelUid = 0; /** Base class with all of the `MatMenu` functionality. */ @Directive() -// tslint:disable-next-line:class-name export class _MatMenuBase implements AfterContentInit, MatMenuPanel, OnInit, OnDestroy { private _keyManager: FocusKeyManager; @@ -519,9 +518,7 @@ export class MatMenu extends _MatMenuBase {} {provide: MatMenu, useExisting: _MatMenu} ] }) -// tslint:disable-next-line:class-name export class _MatMenu extends MatMenu { - constructor(elementRef: ElementRef, ngZone: NgZone, @Inject(MAT_MENU_DEFAULT_OPTIONS) defaultOptions: MatMenuDefaultOptions) { super(elementRef, ngZone, defaultOptions); diff --git a/src/material/radio/radio.ts b/src/material/radio/radio.ts index 6944c5d93529..822628d2d582 100644 --- a/src/material/radio/radio.ts +++ b/src/material/radio/radio.ts @@ -96,7 +96,6 @@ export const MAT_RADIO_GROUP = * @docs-private */ @Directive() -// tslint:disable-next-line:class-name export abstract class _MatRadioGroupBase implements AfterContentInit, ControlValueAccessor { /** Selected value for the radio group. */ @@ -354,7 +353,6 @@ const _MatRadioButtonMixinBase: * @docs-private */ @Directive() -// tslint:disable-next-line:class-name export abstract class _MatRadioButtonBase extends _MatRadioButtonMixinBase implements OnInit, AfterViewInit, OnDestroy, CanDisableRipple, HasTabIndex { diff --git a/src/material/slide-toggle/slide-toggle-module.ts b/src/material/slide-toggle/slide-toggle-module.ts index adc9d9fa70bb..c79c3dbcbb6c 100644 --- a/src/material/slide-toggle/slide-toggle-module.ts +++ b/src/material/slide-toggle/slide-toggle-module.ts @@ -17,9 +17,7 @@ import {MatSlideToggleRequiredValidator} from './slide-toggle-required-validator exports: [MatSlideToggleRequiredValidator], declarations: [MatSlideToggleRequiredValidator], }) -// tslint:disable-next-line:class-name -export class _MatSlideToggleRequiredValidatorModule { -} +export class _MatSlideToggleRequiredValidatorModule {} @NgModule({ imports: [ diff --git a/src/material/tabs/ink-bar.ts b/src/material/tabs/ink-bar.ts index e6e62c562ece..c357034a59ec 100644 --- a/src/material/tabs/ink-bar.ts +++ b/src/material/tabs/ink-bar.ts @@ -14,7 +14,6 @@ import {ANIMATION_MODULE_TYPE} from '@angular/platform-browser/animations'; * Interface for a a MatInkBar positioner method, defining the positioning and width of the ink * bar in a set of tabs. */ -// tslint:disable-next-line class-name Using leading underscore to denote internal interface. export interface _MatInkBarPositioner { (element: HTMLElement): { left: string, width: string }; } diff --git a/src/material/tabs/tab-body.ts b/src/material/tabs/tab-body.ts index 6c69486c53a1..4ab09617a536 100644 --- a/src/material/tabs/tab-body.ts +++ b/src/material/tabs/tab-body.ts @@ -109,7 +109,6 @@ export class MatTabBodyPortal extends CdkPortalOutlet implements OnInit, OnDestr * @docs-private */ @Directive() -// tslint:disable-next-line:class-name export abstract class _MatTabBodyBase implements OnInit, OnDestroy { /** Current position of the tab-body in the tab-group. Zero means that the tab is visible. */ private _positionIndex: number; diff --git a/src/material/tabs/tab-group.ts b/src/material/tabs/tab-group.ts index 1236829e8d64..2e558937921f 100644 --- a/src/material/tabs/tab-group.ts +++ b/src/material/tabs/tab-group.ts @@ -79,7 +79,6 @@ interface MatTabGroupBaseHeader { * @docs-private */ @Directive() -// tslint:disable-next-line:class-name export abstract class _MatTabGroupBase extends _MatTabGroupMixinBase implements AfterContentInit, AfterContentChecked, OnDestroy, CanColor, CanDisableRipple { diff --git a/src/material/tabs/tab-header.ts b/src/material/tabs/tab-header.ts index 160f65538038..be0f30c08287 100644 --- a/src/material/tabs/tab-header.ts +++ b/src/material/tabs/tab-header.ts @@ -39,7 +39,6 @@ import {MatPaginatedTabHeader} from './paginated-tab-header'; * @docs-private */ @Directive() -// tslint:disable-next-line:class-name export abstract class _MatTabHeaderBase extends MatPaginatedTabHeader implements AfterContentChecked, AfterContentInit, AfterViewInit, OnDestroy { diff --git a/src/material/tabs/tab-nav-bar/tab-nav-bar.ts b/src/material/tabs/tab-nav-bar/tab-nav-bar.ts index 6dc6087e474b..90d4cf05ba97 100644 --- a/src/material/tabs/tab-nav-bar/tab-nav-bar.ts +++ b/src/material/tabs/tab-nav-bar/tab-nav-bar.ts @@ -54,7 +54,6 @@ import {startWith, takeUntil} from 'rxjs/operators'; * @docs-private */ @Directive() -// tslint:disable-next-line:class-name export abstract class _MatTabNavBase extends MatPaginatedTabHeader implements AfterContentChecked, AfterContentInit, OnDestroy { @@ -192,7 +191,6 @@ const _MatTabLinkMixinBase: /** Base class with all of the `MatTabLink` functionality. */ @Directive() -// tslint:disable-next-line:class-name export class _MatTabLinkBase extends _MatTabLinkMixinBase implements AfterViewInit, OnDestroy, CanDisable, CanDisableRipple, HasTabIndex, RippleTarget, FocusableOption { diff --git a/tools/tslint-rules/symbolNamingRule.ts b/tools/tslint-rules/symbolNamingRule.ts new file mode 100644 index 000000000000..b39a7e8ac098 --- /dev/null +++ b/tools/tslint-rules/symbolNamingRule.ts @@ -0,0 +1,28 @@ +import * as ts from 'typescript'; +import * as Lint from 'tslint'; + +/** Lint rule that checks the names of classes and interfaces against a pattern. */ +export class Rule extends Lint.Rules.AbstractRule { + /** Pattern that we should validate against. */ + private _pattern: RegExp; + + constructor(options: Lint.IOptions) { + super(options); + this._pattern = new RegExp(options.ruleArguments[0] || '.*'); + } + + apply(sourceFile: ts.SourceFile): Lint.RuleFailure[] { + return this.applyWithFunction(sourceFile, checkSourceFile, this._pattern); + } +} + +function checkSourceFile(context: Lint.WalkContext) { + context.sourceFile.forEachChild(function walk(node) { + if ((ts.isClassDeclaration(node) || ts.isInterfaceDeclaration(node) || + ts.isTypeAliasDeclaration(node)) && node.name && !context.options.test(node.name.text)) { + context.addFailureAtNode(node.name, `Symbol name must match pattern ${context.options}`); + } + + node.forEachChild(walk); + }); +} diff --git a/tslint.json b/tslint.json index fc3ee5982c72..3b15ba2e7021 100644 --- a/tslint.json +++ b/tslint.json @@ -19,7 +19,6 @@ // TSLint now shows warnings if types for properties are inferred. This rule needs to be // disabled because all properties need to have explicit types set to work for Dgeni. "no-inferrable-types": false, - "class-name": true, "comment-format": [ true, "check-space" @@ -143,6 +142,7 @@ "member-naming": [true, { "private": "^_" }], + "symbol-naming": [true, "^_?[A-Z][a-zA-Z0-9]*$"], "validate-decorators": [true, { "Component": { "argument": 0,