Fix dealiaser throwing on TypeAlias nodes. getAliasedSymbol only accepts Alias, not TypeAlias, so filter on that only. PiperOrigin-RevId: 264161077
diff --git a/internal/tsetse/tests/ban_conformance_pattern/name_test.ts b/internal/tsetse/tests/ban_conformance_pattern/name_test.ts index 6bb06ec..d3ffdd0 100644 --- a/internal/tsetse/tests/ban_conformance_pattern/name_test.ts +++ b/internal/tsetse/tests/ban_conformance_pattern/name_test.ts
@@ -38,6 +38,30 @@ messageText: 'no blob url' }); }); + + it('does not choke on type aliases', () => { + // This test case checks that we do not regress on the AbsoluteMatcher's + // handling of type aliases. In dealias, from utils/ast_tools.ts, the + // typechecker's getAliasedSymbol function should only be called with + // Symbols that verify ts.SymbolFlags.Alias, and ts.SymbolFlags.TypeAlias is + // not acceptable (the typechecker will throw). + + const sources = [ + `export type Foo = {bar: number, baz: (x:string)=>void}`, + `import {Foo} from './file_0'; + export const c: Foo["baz"] = (x:string)=>{};`, + `import {c} from './file_1'; c(window.name);` + ]; + const results = compileAndCheck( + new ConformancePatternRule({ + errorMessage: 'should not trigger', + kind: PatternKind.BANNED_NAME, + values: ['whatever'] + }), + ...sources); + + expect(results.length).toBe(0); + }); }); beforeEach(() => {
diff --git a/internal/tsetse/util/ast_tools.ts b/internal/tsetse/util/ast_tools.ts index cb0f0cb..024c008 100644 --- a/internal/tsetse/util/ast_tools.ts +++ b/internal/tsetse/util/ast_tools.ts
@@ -100,7 +100,8 @@ if (!symbol) { return undefined; } - if (symbol.getFlags() & (ts.SymbolFlags.Alias | ts.SymbolFlags.TypeAlias)) { + if (symbol.getFlags() & ts.SymbolFlags.Alias) { + // Note: something that has only TypeAlias is not acceptable here. return dealias(tc.getAliasedSymbol(symbol), tc); } return symbol;