# core/analyzers/syntax.analyzer.ts

> 35 lines of code and 11 definitions.

Tree: GovLab Patterns
Language: typescript
Layer: processing
Canonical: https://banes-lab.com/anatomy/patterns#file-patterns-core-analyzers-syntax-analyzer-ts
Source text: https://banes-lab.com/source/patterns/core/analyzers/syntax.analyzer.ts.txt

Listed in [core/analyzers](https://banes-lab.com/api/source/patterns/core/analyzers.md), after [core/analyzers/schema.analyzer.ts](https://banes-lab.com/source/patterns/core/analyzers/schema.analyzer.ts.md).

## Definitions

- `identifierNames` (lexical_declaration, line 25, exported)
- `syntaxDistribution` (lexical_declaration, line 32, exported)
- `typeStats` (lexical_declaration, line 16)
- `TOP_TYPES` (lexical_declaration, line 4)
- `RARE_TYPES` (lexical_declaration, line 5)
- `UNKNOWN_TYPE` (lexical_declaration, line 6)
- `IDENTIFIER_TYPES` (lexical_declaration, line 8)
- `counts` (lexical_declaration, line 17)
- `{ nodeType }` (lexical_declaration, line 19)
- `{ nodeType, text }` (lexical_declaration, line 27, exported)
- `types` (lexical_declaration, line 35, exported)

## Contained in

- [core/analyzers](https://banes-lab.com/anatomy/patterns/folder-patterns-core-analyzers.md)

## Uses

- [core/counters/base.counter.ts](https://banes-lab.com/source/patterns/core/counters/base.counter.ts.md)

## Used by

- [core/analyzers/definition.analyzer.ts](https://banes-lab.com/source/patterns/core/analyzers/definition.analyzer.ts.md)
- [core/coordinators/page.coordinator.ts](https://banes-lab.com/source/patterns/core/coordinators/page.coordinator.ts.md)
- [core/loaders/source.loader.ts](https://banes-lab.com/source/patterns/core/loaders/source.loader.ts.md)

## Linked from

- [core/analyzers](https://banes-lab.com/anatomy/patterns/folder-patterns-core-analyzers.md)
- [core/coordinators](https://banes-lab.com/anatomy/patterns/folder-patterns-core-coordinators.md)
- [core/counters](https://banes-lab.com/anatomy/patterns/folder-patterns-core-counters.md)
- [core/loaders](https://banes-lab.com/anatomy/patterns/folder-patterns-core-loaders.md)

## Source

```typescript
import type { Distribution, TypeStat } from "#types/code.types";
import { increment } from "#core/counters/base.counter";

const TOP_TYPES = 8;
const RARE_TYPES = 6;
const UNKNOWN_TYPE = "unknown";

const IDENTIFIER_TYPES: ReadonlySet<string> = new Set([
    "identifier",
    "type_identifier",
    "shorthand_property_identifier",
    "property_identifier",
    "field_identifier",
]);

const typeStats = function typeStats(records: readonly Record<string, unknown>[]): TypeStat[] {
    const counts = new Map<string, number>();
    for (const record of records) {
        const { nodeType } = record;
        increment(counts, typeof nodeType === "string" ? nodeType : UNKNOWN_TYPE);
    }
    return [...counts.entries()].map(([type, count]) => ({ count, type })).sort((a, b) => b.count - a.count);
};

export const identifierNames = function identifierNames(records: readonly Record<string, unknown>[]): string[] {
    return records.flatMap((record) => {
        const { nodeType, text } = record;
        return typeof nodeType === "string" && IDENTIFIER_TYPES.has(nodeType) && typeof text === "string" ? [text] : [];
    });
};

export const syntaxDistribution = function syntaxDistribution(
    records: readonly Record<string, unknown>[],
): Distribution {
    const types = typeStats(records);
    return {
        invariants: types.slice(0, TOP_TYPES),
        variants: types.filter((stat) => stat.count === 1).slice(0, RARE_TYPES),
    };
};
```
