-
Notifications
You must be signed in to change notification settings - Fork 85
Expand file tree
/
Copy pathsort-function-attributes.ts
More file actions
52 lines (44 loc) · 1.38 KB
/
sort-function-attributes.ts
File metadata and controls
52 lines (44 loc) · 1.38 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
import { NonterminalKind } from '@nomicfoundation/slang/cst';
import { TerminalNode } from '../slang-nodes/TerminalNode.js';
import type { SortableAttribute } from './types.d.ts';
const visibilityKeyWords = new Set([
'external',
'internal',
'public',
'private'
]);
const mutabilityKeyWords = new Set(['pure', 'constant', 'payable', 'view']);
export function sortFunctionAttributes(
aVariant: SortableAttribute,
bVariant: SortableAttribute
): number {
const aIsString = aVariant instanceof TerminalNode;
const bIsString = bVariant instanceof TerminalNode;
// Both are strings
if (aIsString && bIsString) {
// Visibility First
if (visibilityKeyWords.has(aVariant.value)) return -1;
if (visibilityKeyWords.has(bVariant.value)) return 1;
// State Mutability Second
if (mutabilityKeyWords.has(aVariant.value)) return -1;
if (mutabilityKeyWords.has(bVariant.value)) return 1;
// Virtual keyword last
return 0;
}
// Only one is a string
if (aIsString) return -1;
if (bIsString) return 1;
// Both are nodes
// OverrideSpecifiers before ModifierInvocation
if (
aVariant.kind === NonterminalKind.OverrideSpecifier &&
bVariant.kind === NonterminalKind.ModifierInvocation
)
return -1;
if (
bVariant.kind === NonterminalKind.OverrideSpecifier &&
aVariant.kind === NonterminalKind.ModifierInvocation
)
return 1;
return 0;
}