thrift-support 3.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../core/src/types.ts", "../../core/src/ast/nodes.types.ts", "../../core/src/config/index.ts", "../../core/src/utils/error-handler.ts", "../../core/src/utils/report-builder.ts", "../../core/src/utils/memory-monitor.ts", "../../core/src/utils/optimized-lru-cache.ts", "../../core/src/utils/cache-manager.ts", "../../core/src/utils/cache-expiry.ts", "../../core/src/utils/cache-keys.ts", "../../core/src/config/cache-config.ts", "../../core/src/ast/cache.ts", "../../core/src/utils/line-range.ts", "../../core/src/utils/quote-tracker.ts", "../../core/src/ast/factory.ts", "../../core/src/ast/tokenizer.ts", "../../core/src/ast/text-utils.ts", "../../core/src/ast/ranges.ts", "../../core/src/ast/parser-helpers.ts", "../../core/src/ast/token-utils.ts", "../../core/src/ast/parser.ts", "../../core/src/ast/utils.ts", "../../core/src/formatter/ast-index.ts", "../../core/src/utils/bracket-depth-tracker.ts", "../../core/src/formatter/field-parser.ts", "../../core/src/formatter/const-format.ts", "../../core/src/formatter/comment-format.ts", "../../core/src/formatter/enum-content.ts", "../../core/src/formatter/field-format.ts", "../../core/src/formatter/struct-format.ts", "../../core/src/formatter/indent.ts", "../../core/src/formatter/inline-format.ts", "../../core/src/formatter/line-handlers.ts", "../../core/src/formatter/line-detection.ts", "../../core/src/formatter/service-content.ts", "../../core/src/formatter/service-method.ts", "../../core/src/formatter/struct-content.ts", "../../core/src/formatter/single-line-format.ts", "../../core/src/formatter/text-utils.ts", "../../core/src/formatter/formatter-core.ts", "../../core/src/formatter/chunked-format.ts", "../../core/src/formatter/index.ts", "../../core/src/diagnostics/diagnostic-codes.ts", "../../core/src/diagnostics/include-resolver.ts", "../../core/src/diagnostics/utils.ts", "../../core/src/diagnostics/rules/analysis-context.ts", "../../core/src/diagnostics/rules/type-utils.ts", "../../core/src/diagnostics/rules/service-check.ts", "../../core/src/diagnostics/rules/struct-check.ts", "../../core/src/diagnostics/rules/general-check.ts", "../../core/src/diagnostics/rules/syntax-check.ts", "../../core/src/diagnostics/rules/analyzer.ts", "../../core/src/utils/safe-path.ts", "../../core/src/index.ts", "../src/index.ts", "../src/args.ts", "../src/config.ts", "../src/glob.ts", "../src/commands/format.ts", "../src/commands/lint.ts", "../src/output.ts", "../src/commands/parse.ts", "../src/commands/symbols.ts"],
4
+ "sourcesContent": ["/**\n * Core type abstractions \u2014 structurally compatible with vscode.Position,\n * vscode.Range, vscode.Uri, and vscode.DiagnosticSeverity.\n *\n * TypeScript structural typing allows these to be used interchangeably\n * with their vscode counterparts without any explicit conversion.\n *\n * Reference: tests/test-helpers/vscode-mock.js\n */\n\nexport class Position {\n constructor(\n public readonly line: number,\n public readonly character: number\n ) {}\n}\n\nexport class Range {\n public readonly start: Position;\n public readonly end: Position;\n\n constructor(startLine: number, startCharacter: number, endLine: number, endCharacter: number);\n constructor(start: Position, end: Position);\n constructor(\n startLineOrStart: number | Position,\n startCharacterOrEnd: number | Position,\n endLine?: number,\n endCharacter?: number\n ) {\n if (\n startLineOrStart instanceof Position &&\n startCharacterOrEnd instanceof Position\n ) {\n this.start = startLineOrStart;\n this.end = startCharacterOrEnd;\n } else if (\n typeof startLineOrStart === 'object' &&\n startLineOrStart !== null &&\n typeof startCharacterOrEnd === 'object' &&\n startCharacterOrEnd !== null\n ) {\n // Duck-typed Position objects (e.g. from vscode.Position)\n this.start = new Position(\n (startLineOrStart).line,\n (startLineOrStart).character\n );\n this.end = new Position(\n (startCharacterOrEnd).line,\n (startCharacterOrEnd).character\n );\n } else {\n this.start = new Position(\n startLineOrStart as number,\n startCharacterOrEnd as number\n );\n this.end = new Position(endLine!, endCharacter!);\n }\n }\n\n contains(position: Position): boolean {\n return (\n position.line >= this.start.line &&\n position.line <= this.end.line &&\n (position.line !== this.start.line || position.character >= this.start.character) &&\n (position.line !== this.end.line || position.character <= this.end.character)\n );\n }\n}\n\nexport class Location {\n constructor(\n public readonly uri: Uri,\n public readonly range: Range\n ) {}\n}\n\nexport class Uri {\n public readonly fsPath: string;\n\n constructor(\n public readonly scheme: string,\n public readonly authority: string,\n public readonly path: string,\n public readonly query: string,\n public readonly fragment: string\n ) {\n this.fsPath = path;\n }\n\n static file(filePath: string): Uri {\n return new Uri('file', '', filePath, '', '');\n }\n\n static parse(value: string): Uri {\n if (!value || typeof value !== 'string') {\n return new Uri('file', '', '', '', '');\n }\n const protoIdx = value.indexOf('://');\n if (protoIdx < 1) {\n return new Uri('file', '', value, '', '');\n }\n const scheme = value.slice(0, protoIdx);\n const afterProto = value.slice(protoIdx + 3);\n const slashIdx = afterProto.indexOf('/');\n const authority = slashIdx === -1 ? afterProto : afterProto.slice(0, slashIdx);\n let rest = slashIdx === -1 ? '' : afterProto.slice(slashIdx);\n let fragment = '';\n let query = '';\n const hashIndex = rest.indexOf('#');\n if (hashIndex !== -1) {\n fragment = rest.slice(hashIndex + 1);\n rest = rest.slice(0, hashIndex);\n }\n const queryIndex = rest.indexOf('?');\n if (queryIndex !== -1) {\n query = rest.slice(queryIndex + 1);\n rest = rest.slice(0, queryIndex);\n }\n const pathValue = rest || '';\n return new Uri(scheme, authority, pathValue, query, fragment);\n }\n\n toString(): string {\n const authorityPart = this.authority ? this.authority : '';\n const queryPart = this.query ? `?${this.query}` : '';\n const fragmentPart = this.fragment ? `#${this.fragment}` : '';\n return `${this.scheme}://${authorityPart}${this.path}${queryPart}${fragmentPart}`;\n }\n}\n\nexport class TextEdit {\n constructor(\n public readonly range: Range,\n public readonly newText: string\n ) {}\n\n static replace(range: Range, newText: string): TextEdit {\n return new TextEdit(range, newText);\n }\n}\n\nexport class DocumentSymbol {\n public children: DocumentSymbol[] = [];\n\n constructor(\n public readonly name: string,\n public readonly detail: string,\n public readonly kind: number,\n public readonly range: Range,\n public readonly selectionRange: Range\n ) {}\n}\n\nexport const SymbolKind = {\n Struct: 0,\n Class: 1,\n Enum: 2,\n Interface: 3,\n Field: 4,\n EnumMember: 5,\n Method: 6,\n Namespace: 7,\n File: 8,\n TypeParameter: 9,\n Constant: 10,\n Variable: 11\n} as const;\n\nexport enum DiagnosticSeverity {\n Error = 0,\n Warning = 1,\n Information = 2,\n Hint = 3\n}\n\nexport class SelectionRange {\n constructor(\n public readonly range: Range,\n public readonly parent?: SelectionRange\n ) {}\n}\n", "import {Range} from '../types';\n\nexport enum ThriftNodeType {\n Document = 'Document',\n Namespace = 'Namespace',\n Include = 'Include',\n Const = 'Const',\n Typedef = 'Typedef',\n Enum = 'Enum',\n EnumMember = 'EnumMember',\n Struct = 'Struct',\n Union = 'Union',\n Exception = 'Exception',\n Service = 'Service',\n Interaction = 'Interaction',\n Performs = 'Performs',\n Function = 'Function',\n Field = 'Field',\n Comment = 'Comment',\n Invalid = 'Invalid'\n}\n\n/**\n * AST \u8282\u70B9\u57FA\u7840\u7ED3\u6784\u3002\n */\nexport interface ThriftNodeBase {\n type: ThriftNodeType;\n range: Range;\n nameRange?: Range;\n parent?: ThriftNode;\n children?: ThriftNode[];\n name?: string;\n}\n\n/**\n * AST \u8282\u70B9\u8054\u5408\u7C7B\u578B\u3002\n */\nexport type ThriftNode =\n ThriftDocument\n | Namespace\n | Include\n | Const\n | Typedef\n | Enum\n | EnumMember\n | Struct\n | Field\n | Service\n | Interaction\n | Performs\n | ThriftFunction\n | InvalidNode;\n\n/**\n * performs \u58F0\u660E\u8282\u70B9\uFF08fbthrift\uFF09\u3002\n */\nexport interface Performs extends ThriftNodeBase {\n type: ThriftNodeType.Performs;\n interactionName: string;\n interactionNameRange?: Range;\n}\n\n/**\n * \u6587\u6863\u6839\u8282\u70B9\u3002\n */\nexport interface ThriftDocument extends ThriftNodeBase {\n type: ThriftNodeType.Document;\n body: ThriftNode[];\n}\n\n/**\n * namespace \u8282\u70B9\u3002\n */\nexport interface Namespace extends ThriftNodeBase {\n type: ThriftNodeType.Namespace;\n scope: string; // e.g., 'go', 'java'\n namespace: string; // e.g., 'com.example' // Renamed from name to avoid conflict/confusion, though base has name\n}\n\n/**\n * include \u8282\u70B9\u3002\n */\nexport interface Include extends ThriftNodeBase {\n type: ThriftNodeType.Include;\n path: string;\n}\n\n/**\n * const \u8282\u70B9\u3002\n */\nexport interface Const extends ThriftNodeBase {\n type: ThriftNodeType.Const;\n valueType: string;\n valueTypeRange?: Range;\n value: string;\n valueRange?: Range;\n}\n\n/**\n * typedef \u8282\u70B9\u3002\n */\nexport interface Typedef extends ThriftNodeBase {\n type: ThriftNodeType.Typedef;\n aliasType: string;\n aliasTypeRange?: Range;\n}\n\n/**\n * enum \u8282\u70B9\u3002\n */\nexport interface Enum extends ThriftNodeBase {\n type: ThriftNodeType.Enum;\n members: EnumMember[];\n isSenum?: boolean;\n}\n\n/**\n * enum \u6210\u5458\u8282\u70B9\u3002\n */\nexport interface EnumMember extends ThriftNodeBase {\n type: ThriftNodeType.EnumMember;\n initializer?: string;\n initializerRange?: Range;\n}\n\n/**\n * struct/union/exception \u8282\u70B9\u3002\n */\nexport interface Struct extends ThriftNodeBase {\n type: ThriftNodeType.Struct | ThriftNodeType.Union | ThriftNodeType.Exception;\n fields: Field[];\n}\n\n/**\n * \u5B57\u6BB5\u8282\u70B9\u3002\n */\nexport interface Field extends ThriftNodeBase {\n type: ThriftNodeType.Field;\n id: number;\n requiredness?: 'required' | 'optional';\n fieldType: string;\n typeRange?: Range;\n defaultValue?: string;\n defaultValueRange?: Range;\n}\n\n/**\n * service \u8282\u70B9\u3002\n */\nexport interface Service extends ThriftNodeBase {\n type: ThriftNodeType.Service;\n extends?: string;\n extendsRange?: Range;\n functions: ThriftFunction[];\n performs?: Performs[];\n}\n\n/**\n * interaction \u8282\u70B9\uFF08fbthrift\uFF09\u3002\n */\nexport interface Interaction extends ThriftNodeBase {\n type: ThriftNodeType.Interaction;\n functions: ThriftFunction[];\n}\n\n/**\n * \u51FD\u6570\u8282\u70B9\u3002\n */\nexport interface ThriftFunction extends ThriftNodeBase {\n type: ThriftNodeType.Function;\n returnType: string;\n returnTypeRange?: Range;\n oneway: boolean;\n isStream?: boolean;\n isSink?: boolean;\n arguments: Field[];\n throws: Field[];\n}\n\n/**\n * \u65E0\u6548\u8282\u70B9\uFF08\u7528\u4E8E\u5BB9\u9519\u4E0E\u9519\u8BEF\u6062\u590D\uFF09\u3002\n */\nexport interface InvalidNode extends ThriftNodeBase {\n type: ThriftNodeType.Invalid;\n raw: string;\n message?: string;\n}\n\n// Helper functions for type checking\n/**\n * \u5224\u65AD\u662F\u5426\u4E3A Service \u8282\u70B9\u3002\n */\nexport function isServiceNode(node: ThriftNode): node is Service {\n return node.type === ThriftNodeType.Service;\n}\n\n/**\n * \u5224\u65AD\u662F\u5426\u4E3A Interaction \u8282\u70B9\u3002\n */\nexport function isInteractionNode(node: ThriftNode): node is Interaction {\n return node.type === ThriftNodeType.Interaction;\n}\n\n/**\n * \u5224\u65AD\u662F\u5426\u4E3A\u7ED3\u6784\u4F53\u76F8\u5173\u8282\u70B9\u3002\n */\nexport function isStructNode(node: ThriftNode): node is Struct {\n return node.type === ThriftNodeType.Struct ||\n node.type === ThriftNodeType.Union ||\n node.type === ThriftNodeType.Exception;\n}\n\n/**\n * \u5224\u65AD\u662F\u5426\u4E3A Enum \u8282\u70B9\u3002\n */\nexport function isEnumNode(node: ThriftNode): node is Enum {\n return node.type === ThriftNodeType.Enum;\n}\n\n/**\n * \u5224\u65AD\u662F\u5426\u4E3A Field \u8282\u70B9\u3002\n */\nexport function isFieldNode(node: ThriftNode): node is Field {\n return node.type === ThriftNodeType.Field;\n}\n", "/**\n * \u7F13\u5B58\u6761\u76EE\u914D\u7F6E\n */\nexport interface CacheEntry {\n /** \u7F13\u5B58\u6700\u5927\u6761\u76EE\u6570 */\n maxSize: number;\n /** \u7F13\u5B58\u6761\u76EE\u5B58\u6D3B\u65F6\u95F4\uFF08\u6BEB\u79D2\uFF09 */\n ttlMs: number;\n /** LRU-K \u53C2\u6570\uFF0C\u9ED8\u8BA4\u4E3A2\uFF0C\u8868\u793A\u8003\u8651\u6700\u540E2\u6B21\u8BBF\u95EE */\n lruK?: number;\n /** \u9A71\u9010\u9608\u503C\uFF0C\u5F53\u8FBE\u5230\u8FD9\u4E2A\u6BD4\u4F8B\u65F6\u5F00\u59CB\u4E3B\u52A8\u9A71\u9010\uFF0C\u9ED8\u8BA40.8 */\n evictionThreshold?: number;\n}\n\n/**\n * \u7F13\u5B58\u914D\u7F6E\uFF0C\u5B9A\u4E49\u5404\u7C7B\u7F13\u5B58\u7684\u8FC7\u671F\u65F6\u95F4\u4E0E\u5927\u5C0F\n */\nexport interface CacheConfig {\n /** AST \u7F13\u5B58\u6700\u5927\u5B58\u6D3B\u65F6\u95F4\uFF08\u6BEB\u79D2\uFF09 */\n astMaxAgeMs: number;\n /** include \u7C7B\u578B\u7F13\u5B58\u6700\u5927\u5B58\u6D3B\u65F6\u95F4\uFF08\u6BEB\u79D2\uFF09 */\n includeTypesMaxAgeMs: number;\n /** References \u7F13\u5B58\u914D\u7F6E */\n references: CacheEntry;\n /** Workspace symbols \u7F13\u5B58\u914D\u7F6E */\n workspaceSymbols: CacheEntry;\n /** File symbols \u7F13\u5B58\u914D\u7F6E */\n fileSymbols: CacheEntry;\n /** Document symbols \u7F13\u5B58\u914D\u7F6E */\n documentSymbols: CacheEntry;\n /** Hover includes \u7F13\u5B58\u914D\u7F6E */\n hoverIncludes: CacheEntry;\n /** Hover \u5185\u5BB9\u7F13\u5B58\u914D\u7F6E */\n hoverContent: CacheEntry;\n /** Definition \u7F13\u5B58\u914D\u7F6E */\n definition: CacheEntry;\n /** Definition\uFF08\u6587\u6863\u7EA7\uFF09\u7F13\u5B58\u914D\u7F6E */\n definitionDocument: CacheEntry;\n /** Definition\uFF08\u5DE5\u4F5C\u533A\u7EA7\uFF09\u7F13\u5B58\u914D\u7F6E */\n definitionWorkspace: CacheEntry;\n /** Diagnostics block \u7F13\u5B58\u914D\u7F6E */\n diagnosticsBlocks: CacheEntry;\n /** Diagnostics member \u7F13\u5B58\u914D\u7F6E */\n diagnosticsMembers: CacheEntry;\n}\n\n/** \u5185\u5B58\u7BA1\u7406\u914D\u7F6E */\nexport interface MemoryConfig {\n /** \u5185\u5B58\u4F7F\u7528\u5CF0\u503C\u9608\u503C\uFF08\u9ED8\u8BA40.8\uFF0C\u537380%\uFF09 */\n memoryPressureThreshold: number;\n /** \u5185\u5B58\u538B\u529B\u68C0\u67E5\u95F4\u9694\uFF08\u6BEB\u79D2\uFF0C\u9ED8\u8BA430\u79D2\uFF09 */\n memoryPressureCheckInterval: number;\n /** GC\u89E6\u53D1\u9608\u503C\uFF08\u9ED8\u8BA40.8\uFF0C\u537380%\uFF09 */\n gcThreshold: number;\n /** \u7F13\u5B58\u5927\u5C0F\u52A8\u6001\u8C03\u6574\u56E0\u5B50\uFF08\u9ED8\u8BA41.0\uFF0C1.0\u8868\u793A\u6839\u636E\u5185\u5B58\u538B\u529B\u81EA\u52A8\u8C03\u6574\uFF09 */\n dynamicAdjustmentFactor: number;\n /** \u4F30\u7B97\u5355\u4E2A\u9879\u76EE\u5185\u5B58\u5360\u7528\u5927\u5C0F\u7684\u51FD\u6570 */\n itemSizeEstimator: (key: unknown, value: unknown) => number;\n /** \u9A71\u9010\u7B56\u7565\u7C7B\u578B */\n evictionStrategy: 'lru' | 'lfu' | 'ttl' | 'memory-pressure' | 'priority';\n}\n\n/** \u9ED8\u8BA4\u7F13\u5B58\u6761\u76EE\u914D\u7F6E */\nexport const DEFAULT_CACHE_ENTRY: CacheEntry = {maxSize: 100, ttlMs: 10000};\n\n/** \u7F13\u5B58\u914D\u7F6E\u9ED8\u8BA4\u503C */\nexport const cacheConfig: CacheConfig = {\n astMaxAgeMs: 5 * 60 * 1000, // \u62BD\u8C61\u8BED\u6CD5\u6811\u7F13\u5B58\u6700\u5927\u5E74\u9F84\n includeTypesMaxAgeMs: 3 * 60 * 1000, // \u5305\u542B\u7C7B\u578B\u7F13\u5B58\u6700\u5927\u5E74\u9F84\n references: {maxSize: 1000, ttlMs: 30000, lruK: 2, evictionThreshold: 0.8}, // \u5F15\u7528\u7F13\u5B58\u914D\u7F6E - \u4ECE 10s \u5EF6\u957F\u81F3 30s\n workspaceSymbols: {maxSize: 1000, ttlMs: 60000, lruK: 2, evictionThreshold: 0.8}, // \u5DE5\u4F5C\u533A\u7B26\u53F7\u7F13\u5B58\u914D\u7F6E\n fileSymbols: {maxSize: 500, ttlMs: 30000, lruK: 2, evictionThreshold: 0.7}, // \u6587\u4EF6\u7B26\u53F7\u7F13\u5B58\u914D\u7F6E\n documentSymbols: {maxSize: 500, ttlMs: 30000, lruK: 2, evictionThreshold: 0.7}, // \u6587\u6863\u7B26\u53F7\u7F13\u5B58\u914D\u7F6E - \u4ECE 10s \u5EF6\u957F\u81F3 30s\n hoverIncludes: {maxSize: 200, ttlMs: 30000, lruK: 2, evictionThreshold: 0.8}, // \u60AC\u505C\u5305\u542B\u7F13\u5B58\u914D\u7F6E\n hoverContent: {maxSize: 100, ttlMs: 30000, lruK: 2, evictionThreshold: 0.7}, // \u60AC\u505C\u5185\u5BB9\u7F13\u5B58\u914D\u7F6E - \u4ECE 10s \u5EF6\u957F\u81F3 30s\n definition: {maxSize: 1000, ttlMs: 30000, lruK: 2, evictionThreshold: 0.8}, // \u5B9A\u4E49\u7F13\u5B58\u914D\u7F6E - \u4ECE 10s \u5EF6\u957F\u81F3 30s\n definitionDocument: {maxSize: 500, ttlMs: 30000, lruK: 2, evictionThreshold: 0.8}, // \u5B9A\u4E49\u6587\u6863\u7F13\u5B58\u914D\u7F6E - \u4ECE 10s \u5EF6\u957F\u81F3 30s\n definitionWorkspace: {maxSize: 200, ttlMs: 30000, lruK: 2, evictionThreshold: 0.8}, // \u5B9A\u4E49\u5DE5\u4F5C\u533A\u7F13\u5B58\u914D\u7F6E\n diagnosticsBlocks: {maxSize: 500, ttlMs: 10 * 60 * 1000, lruK: 2, evictionThreshold: 0.7}, // \u8BCA\u65AD\u5757\u7EA7\u7F13\u5B58\u914D\u7F6E - \u4ECE 5min \u5EF6\u957F\u81F3 10min\uFF0CmaxSize \u4ECE 200 \u63D0\u5347\u81F3 500\n diagnosticsMembers: {maxSize: 1000, ttlMs: 10 * 60 * 1000, lruK: 2, evictionThreshold: 0.7} // \u8BCA\u65AD\u6210\u5458\u7EA7\u7F13\u5B58\u914D\u7F6E - \u4ECE 5min \u5EF6\u957F\u81F3 10min\uFF0CmaxSize \u4ECE 500 \u63D0\u5347\u81F3 1000\n};\n\n/** \u5185\u5B58\u914D\u7F6E\u9ED8\u8BA4\u503C */\nexport const memoryConfig: MemoryConfig = {\n memoryPressureThreshold: 0.8,\n memoryPressureCheckInterval: 30000,\n gcThreshold: 0.8,\n dynamicAdjustmentFactor: 1.0,\n itemSizeEstimator: (key: unknown, value: unknown) => {\n // \u6539\u8FDB\u7684\u5185\u5B58\u4F30\u7B97\u51FD\u6570\uFF0C\u8003\u8651\u5BF9\u8C61\u7ED3\u6784\u6DF1\u5EA6\u548C\u7C7B\u578B\n const estimate = (obj: unknown): number => {\n if (obj === null || obj === undefined) {\n return 8;\n }\n if (typeof obj === 'boolean') {\n return 4;\n }\n if (typeof obj === 'number') {\n return 8;\n }\n if (typeof obj === 'string') {\n return obj.length * 2 + 48;\n } // Unicode \u5B57\u7B26 + \u5BF9\u8C61\u5F00\u9500\n if (typeof obj === 'symbol') {\n return 32;\n }\n if (typeof obj === 'bigint') {\n return 16;\n }\n\n // \u5BF9\u8C61\u6216\u6570\u7EC4\n if (Array.isArray(obj)) {\n let size = 64; // Array \u5BF9\u8C61\u5F00\u9500\n for (const item of obj) {\n size += estimate(item) + 8; // \u6570\u7EC4\u5143\u7D20\u5F15\u7528\n }\n return size;\n }\n\n if (typeof obj === 'object') {\n let size = 64; // \u5BF9\u8C61\u5F00\u9500\n const record = obj as Record<string, unknown>;\n for (const [k, v] of Object.entries(record)) {\n size += k.length * 2 + 32; // \u952E\u7684\u5F00\u9500\n size += estimate(v); // \u503C\u7684\u5F00\u9500\n }\n return size;\n }\n\n return 64; // \u9ED8\u8BA4\u5BF9\u8C61\u5927\u5C0F\n };\n\n return estimate(key) + estimate(value) + 16; // \u952E\u503C\u5BF9\u603B\u5927\u5C0F\n },\n evictionStrategy: 'lru'\n};\n\n/**\n * \u5168\u5C40\u914D\u7F6E\u96C6\u5408\n */\nexport const config = {\n /** \u6587\u4EF6\u6A21\u5F0F\u914D\u7F6E */\n filePatterns: {\n /** Thrift \u6587\u4EF6\u5339\u914D\u6A21\u5F0F */\n thrift: '**/*.thrift',\n /** \u6392\u9664 node_modules */\n excludeNodeModules: '**/node_modules/**'\n },\n /** \u641C\u7D22\u76F8\u5173\u914D\u7F6E */\n search: {\n /** \u6BCF\u6B21\u641C\u7D22\u5904\u7406\u7684\u6700\u5927\u6587\u4EF6\u6570 */\n workspaceFileLimit: 1000,\n /** include \u6587\u4EF6\u641C\u7D22\u7684\u6700\u5927\u6570\u91CF */\n includeFileLimit: 1\n },\n /** \u7F13\u5B58\u76F8\u5173\u914D\u7F6E */\n cache: cacheConfig,\n /** References \u76F8\u5173\u914D\u7F6E */\n references: {\n /** \u6587\u4EF6\u5217\u8868\u5237\u65B0\u95F4\u9694\uFF08\u6BEB\u79D2\uFF09 */\n fileListUpdateIntervalMs: 30000,\n /** AST \u7F13\u5B58 TTL\uFF08\u6BEB\u79D2\uFF09 */\n astCacheTtlMs: 5000\n },\n /** Workspace symbols \u76F8\u5173\u914D\u7F6E */\n workspaceSymbols: {\n /** \u6587\u4EF6\u5217\u8868\u5237\u65B0\u95F4\u9694\uFF08\u6BEB\u79D2\uFF09 */\n fileListUpdateIntervalMs: 30000\n },\n /**\n * Diagnostics \u76F8\u5173\u914D\u7F6E\u3002\n * analysisDelayMs \u63A7\u5236\u7528\u6237\u505C\u6B62\u8F93\u5165\u540E\u7B49\u5F85\u591A\u4E45\u89E6\u53D1\u5206\u6790\uFF08\u9632\u6296\uFF09\uFF1B\n * minAnalysisIntervalMs \u9650\u5236\u540C\u4E00\u6587\u6863\u4E24\u6B21\u5206\u6790\u7684\u6700\u5C0F\u95F4\u9694\uFF08\u8282\u6D41\uFF09\uFF1B\n * maxConcurrentAnalyses \u4ECE 1 \u63D0\u5347\u81F3 3 \u4EE5\u63D0\u5347\u591A\u6587\u4EF6\u5E76\u53D1\u5904\u7406\u80FD\u529B\u3002\n */\n diagnostics: {\n /** \u57FA\u7840\u5206\u6790\u5EF6\u8FDF\uFF08\u6BEB\u79D2\uFF09\uFF0C\u7528\u6237\u505C\u6B62\u8F93\u5165\u540E\u7B49\u5F85\u6B64\u65F6\u95F4\u518D\u89E6\u53D1\u5206\u6790 */\n analysisDelayMs: 300,\n /** \u6700\u5C0F\u5206\u6790\u95F4\u9694\uFF08\u6BEB\u79D2\uFF09\uFF0C\u540C\u4E00\u6587\u6863\u4E24\u6B21\u5206\u6790\u7684\u6700\u5C0F\u95F4\u9694 */\n minAnalysisIntervalMs: 1000,\n /** \u5E76\u53D1\u8BCA\u65AD\u5206\u6790\u4E0A\u9650\uFF081\u21923\uFF09\uFF0C\u63D0\u5347\u591A\u6587\u4EF6\u5904\u7406\u541E\u5410 */\n maxConcurrentAnalyses: 3,\n /** \u4F9D\u8D56\u6587\u4EF6\u5206\u6790\u5EF6\u8FDF\u500D\u6570\uFF0C\u4F9D\u8D56\u6587\u4EF6\u7684\u5206\u6790\u5EF6\u8FDF = analysisDelayMs * \u6B64\u56E0\u5B50 */\n dependentAnalysisDelayFactor: 2\n },\n /**\n * \u6027\u80FD\u76D1\u63A7\u76F8\u5173\u914D\u7F6E\u3002\n * \u64CD\u4F5C\u8017\u65F6\u8D85\u8FC7 slowOperationThresholdMs \u4F1A\u5728\u65E5\u5FD7\u4E2D\u6807\u8BB0\u4E3A\u6162\u64CD\u4F5C\uFF1B\n * maxMetrics \u9650\u5236\u5185\u5B58\u4E2D\u4FDD\u7559\u7684\u6027\u80FD\u8BB0\u5F55\u6570\u91CF\uFF0C\u8D85\u51FA\u540E\u65E7\u8BB0\u5F55\u88AB\u622A\u65AD\u3002\n */\n performance: {\n /** \u6162\u64CD\u4F5C\u9608\u503C\uFF08\u6BEB\u79D2\uFF09\uFF0C\u8D85\u8FC7\u6B64\u503C\u7684\u64CD\u4F5C\u4F1A\u89E6\u53D1\u8B66\u544A\u65E5\u5FD7 */\n slowOperationThresholdMs: 100,\n /** \u6700\u5927\u6027\u80FD\u8BB0\u5F55\u6761\u6570\uFF0C\u7528\u4E8E\u751F\u6210\u6027\u80FD\u62A5\u544A */\n maxMetrics: 100\n },\n /**\n * \u589E\u91CF\u80FD\u529B\u914D\u7F6E\uFF08\u9ED8\u8BA4\u542F\u7528\uFF0C\u4E0D\u66B4\u9732\u7ED9\u7528\u6237\u914D\u7F6E\uFF09\u3002\n * \u589E\u91CF\u6A21\u5F0F\u4E0B\u4EC5\u5BF9\u7F16\u8F91\u5F71\u54CD\u7684\u533A\u57DF\u91CD\u65B0\u5206\u6790/\u683C\u5F0F\u5316\uFF0C\u5927\u5E45\u964D\u4F4E\u5927\u6587\u4EF6\u7F16\u8F91\u5EF6\u8FDF\u3002\n * \u5F53\u810F\u533A\u8D85\u8FC7 maxDirtyLines \u65F6\u81EA\u52A8\u9000\u56DE\u5168\u91CF\u5904\u7406\u4EE5\u907F\u514D\u589E\u91CF\u5408\u5E76\u5F00\u9500\u8D85\u8FC7\u5168\u91CF\u6210\u672C\u3002\n */\n incremental: {\n analysisEnabled: true,\n formattingEnabled: true,\n /** \u5355\u6B21\u5141\u8BB8\u7684\u6700\u5927\u810F\u533A\u884C\u6570\uFF08\u7EA6 200 \u884C\uFF09\uFF0C\u8D85\u9650\u5219\u9000\u56DE\u5168\u91CF\u5904\u7406 */\n maxDirtyLines: 200\n },\n /** \u5185\u5B58\u7BA1\u7406\u914D\u7F6E */\n memory: memoryConfig\n};\n", "/**\n * \u9519\u8BEF\u4E0A\u4E0B\u6587\u4FE1\u606F\u3002\n */\nexport interface ErrorContext {\n component: string;\n operation: string;\n filePath?: string;\n additionalInfo?: Record<string, unknown>;\n}\n\n/**\n * ErrorHandler\uFF1A\u7EDF\u4E00\u9519\u8BEF\u4E0E\u544A\u8B66\u5904\u7406\uFF08core \u7248\u672C\uFF0C\u4E0D\u4F9D\u8D56 vscode\uFF09\u3002\n * \u5728 CLI/core \u73AF\u5883\u4E2D\u4F7F\u7528 console \u8F93\u51FA\u66FF\u4EE3 vscode.window \u901A\u77E5\u3002\n */\nexport class ErrorHandler {\n private static instance: ErrorHandler;\n\n private errorStats = {\n total: 0,\n warnings: 0,\n infos: 0,\n byComponent: new Map<string, number>(),\n byOperation: new Map<string, number>()\n };\n\n private aggregations = new Map<string, {count: number; lastMessage: string; component: string; operation: string}>();\n\n static getInstance(): ErrorHandler {\n this.instance ??= new ErrorHandler();\n return this.instance;\n }\n\n handleError(error: unknown, context: ErrorContext): void {\n const errorMessage = error instanceof Error ? error.message : String(error);\n this.errorStats.total++;\n this.incrementCounter(this.errorStats.byComponent, context.component);\n this.incrementCounter(this.errorStats.byOperation, context.operation);\n\n const aggKey = `${context.component}:${context.operation}:${errorMessage}`;\n const existing = this.aggregations.get(aggKey);\n if (existing) {\n existing.count++;\n } else {\n this.aggregations.set(aggKey, {count: 1, lastMessage: errorMessage, component: context.component, operation: context.operation});\n }\n\n // eslint-disable-next-line no-console\n console.error(`[${context.component}:${context.operation}] ${errorMessage}`);\n }\n\n handleWarning(_message: string, context: ErrorContext): void {\n this.errorStats.warnings++;\n this.incrementCounter(this.errorStats.byComponent, context.component);\n }\n\n handleInfo(_message: string, context: ErrorContext): void {\n this.errorStats.infos++;\n this.incrementCounter(this.errorStats.byComponent, context.component);\n }\n\n safe<T>(fn: () => T, fallbackValue: T): T {\n try {\n return fn();\n } catch {\n return fallbackValue;\n }\n }\n\n wrapSync<T>(fn: () => T, context: ErrorContext, fallbackValue?: T): T | undefined {\n const hasFallback = arguments.length >= 3;\n try {\n return fn();\n } catch (error) {\n this.handleError(error, context);\n if (hasFallback) {\n return fallbackValue;\n }\n throw error;\n }\n }\n\n async wrapAsync<T>(fn: () => Promise<T>, context: ErrorContext, fallbackValue?: T): Promise<T | undefined> {\n const hasFallback = arguments.length >= 3;\n try {\n return await fn();\n } catch (error) {\n this.handleError(error, context);\n if (hasFallback) {\n return fallbackValue;\n }\n throw error;\n }\n }\n\n getStats() {\n return {...this.errorStats};\n }\n\n /** Backward-compatible alias for getStats(). */\n getErrorStats() {\n return this.getStats();\n }\n\n /** Returns the error aggregation map keyed by component:operation:message. */\n getErrorAggregations() {\n return new Map(this.aggregations);\n }\n\n /** Resets all stats and aggregations. */\n resetStats(): void {\n this.errorStats.total = 0;\n this.errorStats.warnings = 0;\n this.errorStats.infos = 0;\n this.errorStats.byComponent.clear();\n this.errorStats.byOperation.clear();\n this.aggregations.clear();\n }\n\n private incrementCounter(map: Map<string, number>, key: string): void {\n map.set(key, (map.get(key) ?? 0) + 1);\n }\n}\n", "export class ReportBuilder {\n private lines: string[] = [];\n\n add(line = ''): void {\n this.lines.push(line);\n }\n\n addLines(lines: string[]): void {\n this.lines.push(...lines);\n }\n\n toString(): string {\n return this.lines.join('\\n');\n }\n}\n\nexport function formatMb(bytes: number, decimals = 2): string {\n return `${(bytes / 1024 / 1024).toFixed(decimals)} MB`;\n}\n", "import {ErrorHandler} from './error-handler';\nimport {formatMb, ReportBuilder} from './report-builder';\n\nexport interface MemoryUsageInfo {\n /** \u5F53\u524D\u5185\u5B58\u4F7F\u7528\u91CF\uFF08\u5B57\u8282\uFF09 */\n currentUsage: number;\n /** \u5185\u5B58\u4F7F\u7528\u5CF0\u503C\uFF08\u5B57\u8282\uFF09 */\n peakUsage: number;\n /** \u7F13\u5B58\u5206\u914D\u7684\u5185\u5B58\u4F30\u7B97\uFF08\u5B57\u8282\uFF09 */\n cacheAllocated: number;\n /** \u7F13\u5B58\u5B9E\u9645\u4F7F\u7528\u7684\u5185\u5B58\u4F30\u7B97\uFF08\u5B57\u8282\uFF09 */\n cacheUsed: number;\n /** \u65F6\u95F4\u6233 */\n timestamp: number;\n}\n\nexport interface CacheStatistics {\n /** \u7F13\u5B58\u540D\u79F0 */\n name: string;\n /** \u7F13\u5B58\u5927\u5C0F */\n size: number;\n /** \u6700\u5927\u5BB9\u91CF */\n maxSize: number;\n /** \u547D\u4E2D\u7387 */\n hitRate: number;\n /** \u6E05\u7406\u6B21\u6570 */\n cleanupCount: number;\n /** \u6700\u540E\u6E05\u7406\u65F6\u95F4 */\n lastCleanup: number;\n}\n\nexport interface PerformanceMetrics {\n operation: string;\n duration: number; // Using duration field to store memory usage\n timestamp: number;\n documentUri?: string;\n}\n\nexport interface MemoryOptimizationSuggestion {\n id: string;\n type: 'eviction' | 'resize' | 'cleanup' | 'disable' | 'optimize';\n description: string;\n severity: 'low' | 'medium' | 'high';\n impact: 'memory' | 'performance' | 'both';\n confidence: number; // 0-1\n recommendation: string;\n affectedComponents: string[];\n}\n\nexport interface MemoryTrend {\n slope: number; // \u5185\u5B58\u53D8\u5316\u8D8B\u52BF\u659C\u7387\n stability: 'increasing' | 'decreasing' | 'stable';\n period: number; // \u8D8B\u52BF\u5206\u6790\u7684\u65F6\u95F4\u7A97\u53E3\uFF08\u6BEB\u79D2\uFF09\n}\n\n/**\n * \u8D8B\u52BF\u5206\u6790\u5668\n */\nclass TrendAnalyzer {\n private samples: {timestamp: number, usage: number}[] = [];\n private readonly maxSamples: number = 50; // \u6700\u591A\u4FDD\u5B5850\u4E2A\u6837\u672C\n\n public addSample(timestamp: number, usage: number): void {\n this.samples.push({timestamp, usage});\n // \u4F7F\u7528 splice \u539F\u5730\u5220\u9664\uFF0C\u907F\u514D\u521B\u5EFA\u65B0\u6570\u7EC4\n if (this.samples.length > this.maxSamples) {\n this.samples.splice(0, this.samples.length - this.maxSamples);\n }\n }\n\n public calculateTrend(): MemoryTrend {\n if (this.samples.length < 3) {\n return {slope: 0, stability: 'stable', period: 0};\n }\n\n // \u4F7F\u7528\u6700\u5C0F\u4E8C\u4E58\u6CD5\u8BA1\u7B97\u8D8B\u52BF\u7EBF\n const n = this.samples.length;\n let sumX = 0, sumY = 0, sumXY = 0, sumXX = 0;\n\n for (let i = 0; i < n; i++) {\n const x = this.samples[i].timestamp;\n const y = this.samples[i].usage;\n sumX += x;\n sumY += y;\n sumXY += x * y;\n sumXX += x * x;\n }\n\n const slope = (n * sumXY - sumX * sumY) / (n * sumXX - sumX * sumX);\n\n let stability: 'increasing' | 'decreasing' | 'stable';\n if (slope > 1000) { // \u6BCF\u79D2\u589E\u52A0\u8D85\u8FC71MB\n stability = 'increasing';\n } else if (slope < -1000) { // \u6BCF\u79D2\u51CF\u5C11\u8D85\u8FC71MB\n stability = 'decreasing';\n } else {\n stability = 'stable';\n }\n\n return {\n slope,\n stability,\n period: this.samples[this.samples.length - 1].timestamp - this.samples[0].timestamp\n };\n }\n\n public getAverageUsage(): number {\n if (this.samples.length === 0) {\n return 0;\n }\n const total = this.samples.reduce((sum, sample) => sum + sample.usage, 0);\n return total / this.samples.length;\n }\n}\n\n/**\n * \u9884\u6D4B\u5F15\u64CE\n */\nclass PredictionEngine {\n private trendAnalyzer: TrendAnalyzer;\n\n constructor(trendAnalyzer: TrendAnalyzer) {\n this.trendAnalyzer = trendAnalyzer;\n }\n\n public predictMemoryUsage(windowMs: number): number {\n const trend = this.trendAnalyzer.calculateTrend();\n const currentUsage = this.trendAnalyzer['samples'].length > 0\n ? this.trendAnalyzer['samples'][this.trendAnalyzer['samples'].length - 1].usage\n : 0;\n\n // \u57FA\u4E8E\u8D8B\u52BF\u9884\u6D4B\u672A\u6765\u7684\u5185\u5B58\u4F7F\u7528\n const predictedIncrease = trend.slope * (windowMs / 1000); // \u5047\u8BBE\u659C\u7387\u662F\u6BCF\u79D2\u7684\u53D8\u5316\n return Math.max(0, currentUsage + predictedIncrease);\n }\n}\n\n/**\n * \u4F18\u5316\u5EFA\u8BAE\u751F\u6210\u5668\n */\nclass OptimizationAdvisor {\n public generateSuggestions(\n currentUsage: number,\n peakUsage: number,\n cacheStats: Map<string, CacheStatistics>,\n trend: MemoryTrend\n ): MemoryOptimizationSuggestion[] {\n const suggestions: MemoryOptimizationSuggestion[] = [];\n\n // \u5EFA\u8BAE1: \u9AD8\u5185\u5B58\u4F7F\u7528\u7387\n if (peakUsage > 0) {\n const usageRatio = currentUsage / peakUsage;\n if (usageRatio > 0.85) {\n suggestions.push({\n id: 'high-memory-usage',\n type: 'eviction',\n description: '\u5185\u5B58\u4F7F\u7528\u7387\u8FC7\u9AD8\uFF0C\u63A5\u8FD1\u5CF0\u503C\u768485%',\n severity: 'high',\n impact: 'memory',\n confidence: 0.9,\n recommendation: '\u7ACB\u5373\u6267\u884C\u7F13\u5B58\u6E05\u7406\uFF0C\u5E76\u8003\u8651\u51CF\u5C11\u7F13\u5B58\u5927\u5C0F',\n affectedComponents: ['all-caches']\n });\n } else if (usageRatio > 0.7) {\n suggestions.push({\n id: 'moderate-memory-usage',\n type: 'eviction',\n description: '\u5185\u5B58\u4F7F\u7528\u7387\u8F83\u9AD8\uFF0C\u8D85\u8FC7\u5CF0\u503C\u768470%',\n severity: 'medium',\n impact: 'memory',\n confidence: 0.7,\n recommendation: '\u8003\u8651\u4E3B\u52A8\u6E05\u7406\u90E8\u5206\u7F13\u5B58\u9879',\n affectedComponents: ['all-caches']\n });\n }\n }\n\n // \u5EFA\u8BAE2: \u7F13\u5B58\u4F7F\u7528\u7387\u8FC7\u9AD8\n for (const [name, stats] of cacheStats) {\n if (stats.size > stats.maxSize * 0.9) {\n suggestions.push({\n id: `high-cache-usage-${name}`,\n type: 'resize',\n description: `\u7F13\u5B58 \"${name}\" \u4F7F\u7528\u7387\u8D85\u8FC790%`,\n severity: 'medium',\n impact: 'memory',\n confidence: 0.8,\n recommendation: `\u8003\u8651\u6E05\u7406\u7F13\u5B58 \"${name}\" \u6216\u589E\u52A0\u5176\u6700\u5927\u5BB9\u91CF`,\n affectedComponents: [name]\n });\n }\n\n if (stats.hitRate < 0.3) {\n suggestions.push({\n id: `low-hit-rate-${name}`,\n type: 'optimize',\n description: `\u7F13\u5B58 \"${name}\" \u547D\u4E2D\u7387\u8FC7\u4F4E(${(stats.hitRate * 100).toFixed(1)}%)`,\n severity: 'medium',\n impact: 'performance',\n confidence: 0.75,\n recommendation: `\u8003\u8651\u8C03\u6574\u7F13\u5B58 \"${name}\" \u7684\u7B56\u7565\u6216\u5B8C\u5168\u7981\u7528\u8BE5\u7F13\u5B58`,\n affectedComponents: [name]\n });\n }\n }\n\n // \u5EFA\u8BAE3: \u5185\u5B58\u589E\u957F\u8D8B\u52BF\n if (trend.stability === 'increasing' && trend.slope > 100000) { // \u6BCF\u79D2\u589E\u52A0\u8D85\u8FC7100KB\n suggestions.push({\n id: 'memory-increase-trend',\n type: 'cleanup',\n description: '\u5185\u5B58\u4F7F\u7528\u5448\u73B0\u6301\u7EED\u4E0A\u5347\u8D8B\u52BF',\n severity: 'high',\n impact: 'memory',\n confidence: 0.85,\n recommendation: '\u6267\u884C\u5168\u9762\u7684\u7F13\u5B58\u6E05\u7406\uFF0C\u5E76\u68C0\u67E5\u662F\u5426\u5B58\u5728\u5185\u5B58\u6CC4\u6F0F',\n affectedComponents: ['all-components']\n });\n }\n\n return suggestions.sort((a, b) =>\n this.severityScore(b.severity) - this.severityScore(a.severity)\n );\n }\n\n private severityScore(severity: string): number {\n switch (severity) {\n case 'high':\n return 3;\n case 'medium':\n return 2;\n case 'low':\n return 1;\n default:\n return 0;\n }\n }\n}\n\n/**\n * \u667A\u80FD\u5185\u5B58\u76D1\u63A7\u5668 - \u8DDF\u8E2A\u6269\u5C55\u5185\u5B58\u4F7F\u7528\u60C5\u51B5\u5E76\u63D0\u4F9B\u5185\u5B58\u4F18\u5316\u5EFA\u8BAE\u3002\n */\nexport class SmartMemoryMonitor {\n private static instance: SmartMemoryMonitor;\n\n private memoryHistory: MemoryUsageInfo[] = [];\n private cacheStats: Map<string, CacheStatistics> = new Map();\n private peakUsage = 0;\n private errorHandler: ErrorHandler;\n private readonly MAX_HISTORY_SIZE = 100; // \u4FDD\u7559\u6700\u8FD1100\u6761\u8BB0\u5F55\n\n // \u65B0\u589E\u7684\u667A\u80FD\u7EC4\u4EF6\n private trendAnalyzer: TrendAnalyzer;\n private predictionEngine: PredictionEngine;\n private optimizationAdvisor: OptimizationAdvisor;\n\n constructor(errorHandler?: ErrorHandler) {\n this.errorHandler = errorHandler ?? new ErrorHandler();\n this.trendAnalyzer = new TrendAnalyzer();\n this.predictionEngine = new PredictionEngine(this.trendAnalyzer);\n this.optimizationAdvisor = new OptimizationAdvisor();\n }\n\n static getInstance(): SmartMemoryMonitor {\n SmartMemoryMonitor.instance ??= new SmartMemoryMonitor();\n return SmartMemoryMonitor.instance;\n }\n\n /**\n * \u8BB0\u5F55\u5F53\u524D\u5185\u5B58\u4F7F\u7528\u60C5\u51B5\n */\n public recordMemoryUsage(): void {\n const usage = this.errorHandler.safe(() => this.getCurrentMemoryUsage(), null);\n if (!usage) {\n return;\n }\n\n // \u66F4\u65B0\u5CF0\u503C\n if (usage.currentUsage > this.peakUsage) {\n this.peakUsage = usage.currentUsage;\n usage.peakUsage = this.peakUsage;\n }\n\n // \u6DFB\u52A0\u5230\u5386\u53F2\u8BB0\u5F55\uFF08\u4F7F\u7528 splice \u539F\u5730\u5220\u9664\uFF0C\u907F\u514D\u521B\u5EFA\u65B0\u6570\u7EC4\uFF09\n this.memoryHistory.push(usage);\n\n // \u9650\u5236\u5386\u53F2\u8BB0\u5F55\u5927\u5C0F\uFF0C\u4F7F\u7528 splice \u539F\u5730\u5220\u9664\n if (this.memoryHistory.length > this.MAX_HISTORY_SIZE) {\n this.memoryHistory.splice(0, this.memoryHistory.length - this.MAX_HISTORY_SIZE);\n }\n\n // \u6DFB\u52A0\u5230\u8D8B\u52BF\u5206\u6790\u5668\n this.trendAnalyzer.addSample(usage.timestamp, usage.currentUsage);\n }\n\n /**\n * \u83B7\u53D6\u5F53\u524D\u5185\u5B58\u4F7F\u7528\u60C5\u51B5\n */\n private getCurrentMemoryUsage(): MemoryUsageInfo {\n let currentUsage = 0;\n let cacheAllocated = 0;\n let cacheUsed = 0;\n\n // \u83B7\u53D6V8\u5806\u5185\u5B58\u4FE1\u606F\n if (typeof process !== 'undefined' && process.memoryUsage !== undefined) {\n const mem = process.memoryUsage();\n currentUsage = mem.heapUsed || 0;\n\n // \u4F7F\u7528\u66F4\u7CBE\u786E\u7684\u7F13\u5B58\u5185\u5B58\u4F30\u7B97\n for (const stats of this.cacheStats.values()) {\n // \u4F7F\u7528\u5B9E\u9645\u7684\u5185\u5B58\u4F30\u7B97\u51FD\u6570\uFF0C\u800C\u4E0D\u662F\u7B80\u5355\u7684 1KB/\u6761\u76EE\n cacheUsed += this.estimateCacheMemoryUsage(stats);\n cacheAllocated += this.estimateCacheAllocatedMemory(stats);\n }\n }\n\n return {\n currentUsage,\n peakUsage: this.peakUsage,\n cacheAllocated,\n cacheUsed,\n timestamp: Date.now()\n };\n }\n\n /**\n * \u4F30\u7B97\u7F13\u5B58\u4F7F\u7528\u7684\u5B9E\u9645\u5185\u5B58\u91CF\uFF08\u5B57\u8282\uFF09\n */\n private estimateCacheMemoryUsage(stats: CacheStatistics): number {\n // \u57FA\u4E8E\u7F13\u5B58\u5927\u5C0F\u548C\u5E73\u5747\u6761\u76EE\u5927\u5C0F\u4F30\u7B97\n // \u4F7F\u7528\u66F4\u5408\u7406\u7684\u4F30\u7B97\uFF1A\u6BCF\u4E2A\u7F13\u5B58\u6761\u76EE\u7EA6 2-5KB\uFF08\u53D6\u51B3\u4E8E\u6570\u636E\u7ED3\u6784\uFF09\n const avgEntrySize = 3000; // 3KB \u5E73\u5747\u6761\u76EE\u5927\u5C0F\n return stats.size * avgEntrySize;\n }\n\n /**\n * \u4F30\u7B97\u7F13\u5B58\u5206\u914D\u7684\u603B\u5185\u5B58\u91CF\uFF08\u5B57\u8282\uFF09\n */\n private estimateCacheAllocatedMemory(stats: CacheStatistics): number {\n // \u8003\u8651\u7F13\u5B58\u7684\u6700\u5927\u5BB9\u91CF\u548C\u5185\u90E8\u6570\u636E\u7ED3\u6784\u5F00\u9500\n const avgEntrySize = 3000; // 3KB \u5E73\u5747\u6761\u76EE\u5927\u5C0F\n const overheadFactor = 1.2; // 20% \u989D\u5916\u5F00\u9500\uFF08Map \u7ED3\u6784\u3001\u5F15\u7528\u7B49\uFF09\n return stats.maxSize * avgEntrySize * overheadFactor;\n }\n\n /**\n * \u66F4\u65B0\u7F13\u5B58\u7EDF\u8BA1\u4FE1\u606F\n */\n public updateCacheStats(cacheName: string, stats: Partial<CacheStatistics>): void {\n const existing = this.cacheStats.get(cacheName) ?? {\n name: cacheName,\n size: 0,\n maxSize: 0,\n hitRate: 0,\n cleanupCount: 0,\n lastCleanup: 0\n };\n\n const updatedStats = {...existing, ...stats};\n this.cacheStats.set(cacheName, updatedStats);\n }\n\n /**\n * \u83B7\u53D6\u5185\u5B58\u4F7F\u7528\u62A5\u544A\n */\n public getMemoryReport(): string {\n if (this.memoryHistory.length === 0) {\n return '\u6682\u65E0\u5185\u5B58\u4F7F\u7528\u6570\u636E';\n }\n\n const latest = this.memoryHistory[this.memoryHistory.length - 1];\n const avgUsage = this.memoryHistory.reduce((sum, m) => sum + m.currentUsage, 0) / this.memoryHistory.length;\n\n // \u83B7\u53D6\u8D8B\u52BF\u4FE1\u606F\n const trend = this.trendAnalyzer.calculateTrend();\n\n const report = new ReportBuilder();\n report.add('## Thrift Support \u5185\u5B58\u4F7F\u7528\u62A5\u544A');\n report.add();\n report.add(`**\u7EDF\u8BA1\u65F6\u95F4:** ${new Date().toLocaleString()}`);\n report.add(`**\u5F53\u524D\u5185\u5B58\u4F7F\u7528:** ${formatMb(latest.currentUsage)}`);\n report.add(`**\u5185\u5B58\u4F7F\u7528\u5CF0\u503C:** ${formatMb(latest.peakUsage)}`);\n report.add(`**\u5E73\u5747\u5185\u5B58\u4F7F\u7528:** ${formatMb(avgUsage)}`);\n report.add(`**\u7F13\u5B58\u4F30\u7B97\u4F7F\u7528:** ${formatMb(latest.cacheUsed)}`);\n report.add(`**\u7F13\u5B58\u4F30\u7B97\u5206\u914D:** ${formatMb(latest.cacheAllocated)}`);\n report.add(`**\u5185\u5B58\u8D8B\u52BF:** ${trend.stability} (\u53D8\u5316\u7387: ${trend.slope.toFixed(2)} bytes/sec)`);\n report.add();\n\n if (this.cacheStats.size > 0) {\n report.add('### \u7F13\u5B58\u7EDF\u8BA1');\n for (const [name, stats] of this.cacheStats) {\n report.add(`- **${name}**: size=${stats.size}/${stats.maxSize}, hitRate=${(stats.hitRate * 100).toFixed(1)}%, cleanups=${stats.cleanupCount}`);\n }\n report.add();\n }\n\n // \u751F\u6210\u4F18\u5316\u5EFA\u8BAE\n const suggestions = this.generateOptimizationSuggestions();\n if (suggestions.length > 0) {\n report.add('### \u5185\u5B58\u4F18\u5316\u5EFA\u8BAE');\n for (const suggestion of suggestions) {\n const severityIcon = suggestion.severity === 'high' ? '\uD83D\uDEA8' :\n suggestion.severity === 'medium' ? '\u26A0\uFE0F' : '\uD83D\uDCA1';\n report.add(`- ${severityIcon} **${suggestion.description}** - ${suggestion.recommendation}`);\n }\n report.add();\n } else {\n report.add('### \u5185\u5B58\u4F18\u5316\u5EFA\u8BAE');\n report.add('- \u2705 \u5185\u5B58\u4F7F\u7528\u72B6\u51B5\u826F\u597D\uFF0C\u65E0\u9700\u7279\u6B8A\u4F18\u5316\u5EFA\u8BAE');\n report.add();\n }\n\n return report.toString();\n }\n\n /**\n * \u83B7\u53D6\u5185\u5B58\u4F7F\u7528\u8D8B\u52BF\u6570\u636E\uFF0C\u7528\u4E8E\u56FE\u8868\u5C55\u793A\n */\n public getMemoryTrendData(): PerformanceMetrics[] {\n return this.memoryHistory.map(usage => ({\n operation: 'memory-usage',\n duration: usage.currentUsage, // \u91CD\u7528duration\u5B57\u6BB5\u5B58\u50A8\u5185\u5B58\u4F7F\u7528\u91CF\n timestamp: usage.timestamp,\n documentUri: 'memory'\n }));\n }\n\n /**\n * \u624B\u52A8\u89E6\u53D1\u5783\u573E\u56DE\u6536\uFF08\u5982\u679C\u53EF\u7528\uFF09\n */\n public forceGarbageCollection(): void {\n if (global.gc) {\n global.gc();\n this.recordMemoryUsage();\n }\n }\n\n /**\n * \u6E05\u7406\u5185\u5B58\u5386\u53F2\u8BB0\u5F55\n */\n public clearMemoryHistory(): void {\n this.memoryHistory = [];\n this.trendAnalyzer = new TrendAnalyzer(); // \u91CD\u5EFA\u8D8B\u52BF\u5206\u6790\u5668\n }\n\n /**\n * \u68C0\u67E5\u662F\u5426\u5185\u5B58\u4F7F\u7528\u8FC7\u9AD8\n */\n public isHighMemoryUsage(thresholdRatio = 0.8): boolean {\n if (this.memoryHistory.length === 0) {\n return false;\n }\n\n const latest = this.memoryHistory[this.memoryHistory.length - 1];\n return latest.peakUsage > 0 && (latest.currentUsage / latest.peakUsage) > thresholdRatio;\n }\n\n /**\n * \u68C0\u67E5\u5185\u5B58\u4F7F\u7528\u8D8B\u52BF\n */\n public getMemoryTrend(): MemoryTrend {\n return this.trendAnalyzer.calculateTrend();\n }\n\n /**\n * \u9884\u6D4B\u672A\u6765\u5185\u5B58\u9700\u6C42\n */\n public predictMemoryRequirements(windowMs: number): number {\n return this.predictionEngine.predictMemoryUsage(windowMs);\n }\n\n /**\n * \u63D0\u4F9B\u4F18\u5316\u5EFA\u8BAE\n */\n public generateOptimizationSuggestions(): MemoryOptimizationSuggestion[] {\n const latest = this.memoryHistory.length > 0\n ? this.memoryHistory[this.memoryHistory.length - 1]\n : {currentUsage: 0, peakUsage: this.peakUsage};\n\n const trend = this.trendAnalyzer.calculateTrend();\n\n return this.optimizationAdvisor.generateSuggestions(\n latest.currentUsage,\n latest.peakUsage,\n this.cacheStats,\n trend\n );\n }\n\n /**\n * \u83B7\u53D6\u7F13\u5B58\u7EDF\u8BA1\u4FE1\u606F\n */\n public getAllCacheStats(): Map<string, CacheStatistics> {\n return new Map(this.cacheStats);\n }\n\n /**\n * \u83B7\u53D6\u5F53\u524D\u5185\u5B58\u4F7F\u7528\u91CF\n */\n public getCurrentUsage(): number {\n if (this.memoryHistory.length === 0) {\n return 0;\n }\n return this.memoryHistory[this.memoryHistory.length - 1].currentUsage;\n }\n\n /**\n * \u83B7\u53D6\u5CF0\u503C\u5185\u5B58\u4F7F\u7528\u91CF\n */\n public getPeakUsage(): number {\n return this.peakUsage;\n }\n}\n\n// \u4E3A\u4E86\u5411\u540E\u517C\u5BB9\uFF0C\u5BFC\u51FA\u539F\u7C7B\u540D\nexport class MemoryMonitor extends SmartMemoryMonitor {\n}\n", "export interface AdvancedCacheOptions<K = unknown, V = unknown> {\n maxSize: number;\n ttlMs: number;\n // LRU-K\u53C2\u6570\uFF0C\u8868\u793A\u8003\u8651\u8FC7\u53BBK\u6B21\u8BBF\u95EE\n lruK?: number;\n // \u9A71\u9010\u9608\u503C\uFF0C\u5F53\u8FBE\u5230\u8FD9\u4E2A\u6BD4\u4F8B\u65F6\u5F00\u59CB\u4E3B\u52A8\u9A71\u9010\n evictionThreshold?: number;\n // \u4F18\u5148\u7EA7\u51FD\u6570\n priorityFn?: (key: K, value: V) => number;\n // \u5185\u5B58\u4F30\u7B97\u51FD\u6570\n sizeEstimator?: (key: K, value: V) => number;\n}\n\ninterface CacheItem<V> {\n value: V;\n timestamp: number;\n accessTimes: number[]; // \u7528\u4E8ELRU-K\u7B97\u6CD5\uFF0C\u8BB0\u5F55\u6700\u8FD1K\u6B21\u8BBF\u95EE\u65F6\u95F4\n accessCount: number; // \u7528\u4E8ELFU\u7B97\u6CD5\uFF0C\u8BB0\u5F55\u8BBF\u95EE\u6B21\u6570\n priority?: number; // \u4F18\u5148\u7EA7\n estimatedSize: number; // \u4F30\u7B97\u7684\u5185\u5B58\u5927\u5C0F\n}\n\nexport class AdvancedLruCache<K, V> {\n private readonly maxSize: number;\n private readonly ttlMs: number;\n private readonly lruK: number;\n private readonly evictionThreshold: number;\n private readonly priorityFn?: (key: K, value: V) => number;\n private readonly sizeEstimator?: (key: K, value: V) => number;\n\n private entries: Map<K, CacheItem<V>> = new Map();\n private totalEstimatedSize = 0;\n\n /**\n * \u521B\u5EFA\u9AD8\u7EA7LRU\u7F13\u5B58\uFF0C\u652F\u6301LRU-K\u548C\u4F18\u5148\u7EA7\u529F\u80FD\u3002\n * @param options \u7F13\u5B58\u914D\u7F6E\u9009\u9879\n */\n constructor(options: AdvancedCacheOptions<K, V>) {\n this.maxSize = Math.max(0, options.maxSize);\n this.ttlMs = Math.max(0, options.ttlMs);\n this.lruK = options.lruK ?? 2; // \u9ED8\u8BA4\u4E3A2\uFF0C\u8003\u8651\u6700\u8FD12\u6B21\u8BBF\u95EE\n this.evictionThreshold = options.evictionThreshold ?? 0.8; // \u9ED8\u8BA480%\n this.priorityFn = options.priorityFn;\n this.sizeEstimator = options.sizeEstimator;\n }\n\n /**\n * \u83B7\u53D6\u7F13\u5B58\u503C\u3002\n * @param key \u7F13\u5B58\u952E\n * @returns \u7F13\u5B58\u503C\uFF0C\u5982\u679C\u4E0D\u5B58\u5728\u6216\u5DF2\u8FC7\u671F\u5219\u8FD4\u56DE undefined\n */\n get(key: K): V | undefined {\n const record = this.entries.get(key);\n if (!record) {\n return undefined;\n }\n\n if (this.isExpired(record.timestamp)) {\n this.entries.delete(key);\n this.totalEstimatedSize -= record.estimatedSize;\n return undefined;\n }\n\n // \u66F4\u65B0\u8BBF\u95EE\u8BB0\u5F55\uFF08\u7528\u4E8ELRU-K\uFF09\n const now = Date.now();\n const updatedAccessTimes = [...record.accessTimes, now].slice(-this.lruK);\n const updatedAccessCount = record.accessCount + 1;\n\n // \u8BA1\u7B97\u4F18\u5148\u7EA7\uFF08\u5982\u679C\u6709\u4F18\u5148\u7EA7\u51FD\u6570\uFF09\n let priority: number | undefined;\n if (this.priorityFn) {\n priority = this.priorityFn(key, record.value);\n }\n\n // \u91CD\u65B0\u8BBE\u7F6E\u7F13\u5B58\u9879\u4EE5\u66F4\u65B0\u8BBF\u95EE\u65F6\u95F4\n this.entries.delete(key);\n this.entries.set(key, {\n ...record,\n timestamp: now,\n accessTimes: updatedAccessTimes,\n accessCount: updatedAccessCount,\n priority\n });\n\n return record.value;\n }\n\n /**\n * \u8BBE\u7F6E\u7F13\u5B58\u503C\u3002\n * @param key \u7F13\u5B58\u952E\n * @param value \u7F13\u5B58\u503C\n */\n set(key: K, value: V): void {\n if (this.maxSize === 0) {\n return;\n }\n\n const now = Date.now();\n\n // \u8BA1\u7B97\u4F30\u8BA1\u5927\u5C0F\n let estimatedSize = 1; // \u9ED8\u8BA4\u5927\u5C0F\n if (this.sizeEstimator) {\n estimatedSize = this.sizeEstimator(key, value);\n }\n\n // \u8BA1\u7B97\u4F18\u5148\u7EA7\uFF08\u5982\u679C\u6709\u4F18\u5148\u7EA7\u51FD\u6570\uFF09\n let priority: number | undefined;\n if (this.priorityFn) {\n priority = this.priorityFn(key, value);\n }\n\n const existing = this.entries.get(key);\n if (existing) {\n this.totalEstimatedSize -= existing.estimatedSize;\n this.entries.delete(key);\n }\n\n // \u6DFB\u52A0\u65B0\u7684\u7F13\u5B58\u9879\n this.entries.set(key, {\n value,\n timestamp: now,\n accessTimes: [now],\n accessCount: 1,\n priority,\n estimatedSize\n });\n\n this.totalEstimatedSize += estimatedSize;\n\n this.pruneExpired(now);\n\n // Optimize the eviction strategy by using a more efficient approach\n if (this.entries.size > this.maxSize * this.evictionThreshold) {\n this.evictOverflow();\n }\n }\n\n /**\n * \u5220\u9664\u6307\u5B9A\u952E\u7684\u7F13\u5B58\u3002\n * @param key \u7F13\u5B58\u952E\n */\n delete(key: K): void {\n const record = this.entries.get(key);\n if (record) {\n this.totalEstimatedSize -= record.estimatedSize;\n }\n this.entries.delete(key);\n }\n\n /**\n * \u6E05\u7A7A\u6240\u6709\u7F13\u5B58\u3002\n */\n clear(): void {\n this.entries.clear();\n this.totalEstimatedSize = 0;\n }\n\n /**\n * \u83B7\u53D6\u5F53\u524D\u7F13\u5B58\u5927\u5C0F\u3002\n * @returns \u7F13\u5B58\u6761\u76EE\u6570\u91CF\n */\n size(): number {\n return this.entries.size;\n }\n\n /**\n * \u5224\u65AD\u7F13\u5B58\u662F\u5426\u5305\u542B\u6307\u5B9A\u952E\u3002\n */\n has(key: K): boolean {\n return this.entries.has(key);\n }\n\n /**\n * \u83B7\u53D6\u5F53\u524D\u4F30\u7B97\u7684\u603B\u5185\u5B58\u5927\u5C0F\u3002\n */\n estimatedSize(): number {\n return this.totalEstimatedSize;\n }\n\n /**\n * \u83B7\u53D6\u7F13\u5B58\u5BB9\u91CF\u5229\u7528\u7387\u3002\n */\n utilization(): number {\n if (this.maxSize === 0) {\n return 0;\n }\n return this.entries.size / this.maxSize;\n }\n\n private evictOverflow(): void {\n // \u6839\u636E\u9A71\u9010\u9608\u503C\u51B3\u5B9A\u662F\u5426\u5F00\u59CB\u9A71\u9010\n const thresholdSize = Math.max(1, Math.min(this.maxSize, Math.floor(this.maxSize * this.evictionThreshold)));\n while (this.entries.size > thresholdSize) {\n const keyToRemove = this.selectKeyForEviction();\n if (keyToRemove === undefined) {\n break;\n }\n\n const record = this.entries.get(keyToRemove);\n if (record) {\n this.totalEstimatedSize -= record.estimatedSize;\n }\n\n this.entries.delete(keyToRemove);\n }\n }\n\n private selectKeyForEviction(): K | undefined {\n // \u5B9E\u73B0\u591A\u79CD\u9A71\u9010\u7B56\u7565\n // 1. \u9996\u5148\u5C1D\u8BD5\u57FA\u4E8E\u4F18\u5148\u7EA7\u7684\u9A71\u9010\uFF08\u4F18\u5148\u7EA7\u6700\u4F4E\u7684\u4F18\u5148\u88AB\u9A71\u9010\uFF09\n const entriesArray = Array.from(this.entries.entries());\n\n // \u5982\u679C\u6709\u4F18\u5148\u7EA7\u4FE1\u606F\uFF0C\u4F7F\u7528\u4F18\u5148\u7EA7\u4F5C\u4E3A\u4E3B\u8981\u9A71\u9010\u4F9D\u636E\n if (entriesArray.some(([, item]) => item.priority !== undefined)) {\n const lowestPriorityEntry = entriesArray.reduce((lowest, current) => {\n const currentPriority = current[1].priority ?? Number.POSITIVE_INFINITY;\n const lowestPriority = lowest[1].priority ?? Number.POSITIVE_INFINITY;\n\n // \u5982\u679C\u4F18\u5148\u7EA7\u76F8\u540C\uFF0C\u5219\u4F7F\u7528LRU\u7B56\u7565\n if (currentPriority === lowestPriority) {\n const currentLatestAccess = Math.max(...current[1].accessTimes);\n const lowestLatestAccess = Math.max(...lowest[1].accessTimes);\n\n return currentLatestAccess < lowestLatestAccess ? current : lowest;\n }\n\n return currentPriority < lowestPriority ? current : lowest;\n });\n\n return lowestPriorityEntry[0];\n }\n\n // 2. \u5982\u679C\u6CA1\u6709\u4F18\u5148\u7EA7\uFF0C\u5219\u4F7F\u7528\u6539\u8FDB\u7684LRU-K\u7B97\u6CD5\n // \u9009\u62E9\u6700\u8FD1\u6700\u5C11\u8BBF\u95EE\u7684\u9879\uFF08\u57FA\u4E8E\u6700\u540E\u4E00\u6B21\u8BBF\u95EE\u65F6\u95F4\u548C\u8BBF\u95EE\u9891\u7387\uFF09\n let oldestKey: K | undefined;\n let oldestTime = Infinity;\n\n for (const [key, item] of this.entries) {\n // \u4F7F\u7528\u6700\u540E\u4E00\u6B21\u8BBF\u95EE\u65F6\u95F4\u4F5C\u4E3ALRU\u5224\u65AD\u4F9D\u636E\n const latestAccess = Math.max(...item.accessTimes);\n if (latestAccess < oldestTime) {\n oldestTime = latestAccess;\n oldestKey = key;\n }\n }\n\n return oldestKey;\n }\n\n private pruneExpired(now: number): void {\n if (this.ttlMs <= 0) {\n return;\n }\n\n // \u4F7F\u7528\u66F4\u9AD8\u6548\u7684\u65B9\u5F0F\u6E05\u7406\u8FC7\u671F\u6761\u76EE\n const expiredKeys: K[] = [];\n for (const [key, record] of this.entries) {\n if (this.isExpired(record.timestamp, now)) {\n expiredKeys.push(key);\n this.totalEstimatedSize -= record.estimatedSize;\n }\n }\n\n for (const key of expiredKeys) {\n this.entries.delete(key);\n }\n }\n\n private isExpired(timestamp: number, now: number = Date.now()): boolean {\n if (this.ttlMs <= 0) {\n return false;\n }\n return now - timestamp > this.ttlMs;\n }\n}\n\n// \u4E3A\u4FDD\u6301\u5411\u540E\u517C\u5BB9\u6027\uFF0C\u4FDD\u7559\u539F\u6709\u7684LruCache\u7C7B\nexport class LruCache<K, V> {\n private readonly maxSize: number;\n private readonly ttlMs: number;\n private entries: Map<K, {value: V; timestamp: number}> = new Map();\n\n /**\n * \u521B\u5EFA LRU \u7F13\u5B58\u3002\n * @param maxSize \u6700\u5927\u7F13\u5B58\u6761\u76EE\u6570\n * @param ttlMs \u7F13\u5B58\u8FC7\u671F\u65F6\u95F4\uFF08\u6BEB\u79D2\uFF09\n */\n constructor(maxSize: number, ttlMs: number) {\n this.maxSize = Math.max(0, maxSize);\n this.ttlMs = Math.max(0, ttlMs);\n }\n\n /**\n * \u83B7\u53D6\u7F13\u5B58\u503C\u3002\n * @param key \u7F13\u5B58\u952E\n * @returns \u7F13\u5B58\u503C\uFF0C\u5982\u679C\u4E0D\u5B58\u5728\u6216\u5DF2\u8FC7\u671F\u5219\u8FD4\u56DE undefined\n */\n get(key: K): V | undefined {\n const record = this.entries.get(key);\n if (!record) {\n return undefined;\n }\n if (this.isExpired(record.timestamp)) {\n this.entries.delete(key);\n return undefined;\n }\n this.entries.delete(key);\n const refreshed = {value: record.value, timestamp: Date.now()};\n this.entries.set(key, refreshed);\n return refreshed.value;\n }\n\n /**\n * \u8BBE\u7F6E\u7F13\u5B58\u503C\u3002\n * @param key \u7F13\u5B58\u952E\n * @param value \u7F13\u5B58\u503C\n */\n set(key: K, value: V): void {\n if (this.maxSize === 0) {\n return;\n }\n const now = Date.now();\n if (this.entries.has(key)) {\n this.entries.delete(key);\n }\n this.entries.set(key, {value, timestamp: now});\n this.pruneExpired(now);\n this.evictOverflow();\n }\n\n /**\n * \u5220\u9664\u6307\u5B9A\u952E\u7684\u7F13\u5B58\u3002\n * @param key \u7F13\u5B58\u952E\n */\n delete(key: K): void {\n this.entries.delete(key);\n }\n\n /**\n * \u6E05\u7A7A\u6240\u6709\u7F13\u5B58\u3002\n */\n clear(): void {\n this.entries.clear();\n }\n\n /**\n * \u83B7\u53D6\u5F53\u524D\u7F13\u5B58\u5927\u5C0F\u3002\n * @returns \u7F13\u5B58\u6761\u76EE\u6570\u91CF\n */\n size(): number {\n return this.entries.size;\n }\n\n private evictOverflow(): void {\n while (this.entries.size > this.maxSize) {\n let deleted = false;\n for (const key of this.entries.keys()) {\n this.entries.delete(key);\n deleted = true;\n break;\n }\n if (!deleted) {\n break;\n }\n }\n }\n\n private pruneExpired(now: number): void {\n if (this.ttlMs <= 0) {\n return;\n }\n for (const [key, record] of this.entries) {\n if (now - record.timestamp > this.ttlMs) {\n this.entries.delete(key);\n }\n }\n }\n\n private isExpired(timestamp: number): boolean {\n if (this.ttlMs <= 0) {\n return false;\n }\n return Date.now() - timestamp > this.ttlMs;\n }\n}\n", "import {MemoryMonitor} from './memory-monitor';\nimport {AdvancedCacheOptions, AdvancedLruCache} from './optimized-lru-cache';\n\n/**\n * \u7F13\u5B58\u914D\u7F6E\u9879\u3002\n */\nexport interface CacheConfig<K = string, V = unknown> {\n maxSize: number;\n ttl: number; // Time to live in milliseconds\n lruK?: number; // LRU-K parameter for considering past K accesses\n evictionThreshold?: number; // Threshold for proactive eviction\n priorityFn?: (key: K, value: V) => number; // Priority function\n sizeEstimator?: (key: K, value: V) => number; // Size estimator function\n}\n\n/**\n * \u7F13\u5B58\u6761\u76EE\u7ED3\u6784\u3002\n */\nexport interface CacheEntry<T> {\n /** \u7F13\u5B58\u7684\u6570\u636E */\n data: T;\n /** \u7F13\u5B58\u521B\u5EFA/\u66F4\u65B0\u7684\u65F6\u95F4\u6233 */\n timestamp: number;\n}\n\n/**\n * \u7F13\u5B58\u7EDF\u8BA1\u4FE1\u606F\u63A5\u53E3\n */\nexport interface CacheStatistics {\n size: number;\n maxSize: number;\n hitRate: number;\n cleanupCount: number;\n lastCleanup: number;\n}\n\n/**\n * \u5185\u5B58\u611F\u77E5\u7684\u7F13\u5B58\u7BA1\u7406\u5668\n */\nexport class MemoryAwareCacheManager {\n private static instance: MemoryAwareCacheManager;\n private caches: Map<string, AdvancedLruCache<string, unknown>> = new Map();\n private configs: Map<string, CacheConfig<string, unknown>> = new Map();\n\n // \u6DFB\u52A0\u5185\u5B58\u76D1\u63A7\u96C6\u6210\n private readonly MEMORY_MONITORING_ENABLED = true;\n private cleanupCount: Map<string, number> = new Map();\n private lastCleanup: Map<string, number> = new Map();\n private hitCount: Map<string, {hits: number; misses: number}> = new Map();\n\n // \u6DFB\u52A0\u5185\u5B58\u538B\u529B\u76D1\u63A7\u76F8\u5173\u5C5E\u6027\n private memoryPressureLevel: 'normal' | 'medium' | 'high' = 'normal';\n private lastMemoryCheck = 0;\n private memoryCheckInterval = 30000; // 30\u79D2\u68C0\u67E5\u4E00\u6B21\n private dynamicAdjustmentFactor = 1.0; // \u52A8\u6001\u8C03\u6574\u56E0\u5B50\n\n /**\n * \u83B7\u53D6\u5355\u4F8B\u5B9E\u4F8B\u3002\n * @returns {MemoryAwareCacheManager} CacheManager \u5355\u4F8B\n */\n static getInstance(): MemoryAwareCacheManager {\n this.instance ??= new MemoryAwareCacheManager();\n return this.instance;\n }\n\n /**\n * \u6CE8\u518C\u7F13\u5B58\u914D\u7F6E\u3002\n * @param name \u7F13\u5B58\u540D\u79F0\n * @param config \u7F13\u5B58\u914D\u7F6E\uFF08\u6700\u5927\u5927\u5C0F\u3001TTL\u3001LRU-K\u53C2\u6570\u7B49\uFF09\n */\n registerCache(name: string, config: CacheConfig): void {\n this.configs.set(name, config);\n\n // \u521B\u5EFA\u65B0\u7684\u9AD8\u7EA7\u7F13\u5B58\u5B9E\u4F8B\n const cacheOptions: AdvancedCacheOptions<string, unknown> = {\n maxSize: config.maxSize,\n ttlMs: config.ttl,\n lruK: config.lruK,\n evictionThreshold: config.evictionThreshold,\n priorityFn: config.priorityFn,\n sizeEstimator: config.sizeEstimator\n };\n\n const cache = new AdvancedLruCache(cacheOptions);\n this.caches.set(name, cache);\n\n this.cleanupCount.set(name, 0);\n this.lastCleanup.set(name, 0);\n this.hitCount.set(name, {hits: 0, misses: 0});\n }\n\n /**\n * \u5199\u5165\u7F13\u5B58\u3002\n * @param cacheName \u7F13\u5B58\u540D\u79F0\n * @param key \u7F13\u5B58\u952E\n * @param value \u7F13\u5B58\u503C\n * @throws Error \u5982\u679C\u7F13\u5B58\u672A\u6CE8\u518C\n */\n set<T>(cacheName: string, key: string, value: T): void {\n const cache = this.caches.get(cacheName);\n if (!cache) {\n throw new Error(`Cache ${cacheName} not registered`);\n }\n\n const sizeBefore = cache.size();\n const hadKey = cache.has(key);\n const expectedSize = hadKey ? sizeBefore : sizeBefore + 1;\n\n cache.set(key, value);\n\n const sizeAfter = cache.size();\n if (sizeAfter < expectedSize) {\n const count = this.cleanupCount.get(cacheName) ?? 0;\n this.cleanupCount.set(cacheName, count + 1);\n this.lastCleanup.set(cacheName, Date.now());\n }\n\n // Check if we need to adjust for memory pressure\n this.checkAndAdjustForMemoryPressure();\n\n // Update memory monitor if available\n this.updateMemoryMonitor();\n }\n\n /**\n * \u8BFB\u53D6\u7F13\u5B58\uFF08\u8FC7\u671F\u81EA\u52A8\u6E05\u9664\uFF09\u3002\n * @param cacheName \u7F13\u5B58\u540D\u79F0\n * @param key \u7F13\u5B58\u952E\n * @returns \u7F13\u5B58\u503C\uFF0C\u5982\u679C\u4E0D\u5B58\u5728\u6216\u5DF2\u8FC7\u671F\u5219\u8FD4\u56DE undefined\n */\n get<T>(cacheName: string, key: string): T | undefined {\n const cache = this.caches.get(cacheName);\n if (!cache) {\n this.recordMiss(cacheName);\n return undefined;\n }\n\n const result = cache.get(key);\n\n if (result !== undefined) {\n this.recordHit(cacheName);\n } else {\n this.recordMiss(cacheName);\n }\n\n // Update memory monitor if available\n this.updateMemoryMonitor();\n\n return result as T;\n }\n\n /**\n * \u6E05\u7406\u6307\u5B9A\u7F13\u5B58\u540D\u79F0\u4E0B\u7684\u6240\u6709\u6761\u76EE\u3002\n */\n clear(cacheName: string): void {\n const cache = this.caches.get(cacheName);\n if (cache) {\n cache.clear();\n }\n\n // Update memory monitor if available\n this.updateMemoryMonitor();\n }\n\n /**\n * \u5220\u9664\u6307\u5B9A\u952E\u3002\n */\n delete(cacheName: string, key: string): void {\n const cache = this.caches.get(cacheName);\n if (cache) {\n cache.delete(key);\n }\n\n // Update memory monitor if available\n this.updateMemoryMonitor();\n }\n\n /**\n * \u6E05\u7A7A\u6240\u6709\u7F13\u5B58\u3002\n */\n clearAll(): void {\n this.caches.forEach(cache => cache.clear());\n this.cleanupCount.clear();\n this.lastCleanup.clear();\n this.hitCount.clear();\n\n // Update memory monitor if available\n this.updateMemoryMonitor();\n }\n\n /**\n * \u68C0\u67E5\u5E76\u6839\u636E\u5185\u5B58\u538B\u529B\u8C03\u6574\u7F13\u5B58\n */\n private checkAndAdjustForMemoryPressure(): void {\n const now = Date.now();\n // \u68C0\u67E5\u9891\u7387\uFF0C\u907F\u514D\u8FC7\u4E8E\u9891\u7E41\n if (now - this.lastMemoryCheck < this.memoryCheckInterval) {\n return;\n }\n\n this.lastMemoryCheck = now;\n\n const memoryMonitor = this.getMemoryMonitor();\n if (!memoryMonitor) {\n return;\n }\n\n memoryMonitor.recordMemoryUsage();\n const currentUsage = memoryMonitor.getCurrentUsage();\n const peakUsage = memoryMonitor.getPeakUsage();\n\n if (peakUsage > 0) {\n const usageRatio = currentUsage / peakUsage;\n\n if (usageRatio > 0.85) {\n this.memoryPressureLevel = 'high';\n this.performAggressiveCleanup();\n } else if (usageRatio > 0.7) {\n this.memoryPressureLevel = 'medium';\n this.performModerateCleanup();\n } else {\n this.memoryPressureLevel = 'normal';\n }\n }\n }\n\n /**\n * \u52A8\u6001\u8C03\u6574\u7F13\u5B58\u5BB9\u91CF\n */\n adjustCacheCapacity(memoryUsage: number): void {\n const peakUsage = this.getPeakUsageEstimate();\n if (peakUsage > 0) {\n const usageRatio = memoryUsage / peakUsage;\n\n // \u6839\u636E\u5185\u5B58\u4F7F\u7528\u7387\u52A8\u6001\u8C03\u6574\u7F13\u5B58\u5BB9\u91CF\n for (const [cacheName] of this.caches.entries()) {\n const config = this.configs.get(cacheName);\n if (config) {\n let adjustedMaxSize = config.maxSize;\n\n if (usageRatio > 0.85) {\n // \u9AD8\u5185\u5B58\u538B\u529B\uFF1A\u51CF\u5C0F\u7F13\u5B58\u5BB9\u91CF\n adjustedMaxSize = Math.floor(config.maxSize * 0.5 * this.dynamicAdjustmentFactor);\n } else if (usageRatio > 0.7) {\n // \u4E2D\u7B49\u5185\u5B58\u538B\u529B\uFF1A\u9002\u5EA6\u51CF\u5C0F\u7F13\u5B58\u5BB9\u91CF\n adjustedMaxSize = Math.floor(config.maxSize * 0.7 * this.dynamicAdjustmentFactor);\n } else if (usageRatio < 0.5) {\n // \u4F4E\u5185\u5B58\u538B\u529B\uFF1A\u589E\u52A0\u7F13\u5B58\u5BB9\u91CF\n adjustedMaxSize = Math.min(\n Math.floor(config.maxSize * 1.2 * this.dynamicAdjustmentFactor),\n config.maxSize * 2\n );\n }\n\n // \u521B\u5EFA\u65B0\u7684\u7F13\u5B58\u5B9E\u4F8B\u5E76\u8FC1\u79FB\u6570\u636E\uFF08\u7B80\u5316\u5904\u7406\uFF0C\u5B9E\u9645\u4E0A\u6211\u4EEC\u53EF\u4EE5\u901A\u8FC7\u5185\u90E8\u65B9\u6CD5\u8C03\u6574\uFF09\n // \u8FD9\u91CC\u53EA\u662F\u793A\u610F\uFF0C\u5B9E\u9645\u4E2D\u6211\u4EEC\u53EF\u80FD\u9700\u8981\u91CD\u65B0\u521B\u5EFA\u7F13\u5B58\n const newConfig: CacheConfig = {\n ...config,\n maxSize: Math.max(1, adjustedMaxSize) // \u786E\u4FDD\u81F3\u5C11\u67091\u7684\u5927\u5C0F\n };\n\n this.registerCache(cacheName, newConfig);\n }\n }\n }\n }\n\n /**\n * \u4F30\u7B97\u5CF0\u503C\u5185\u5B58\u4F7F\u7528\uFF08\u7B80\u5316\u7248\u672C\uFF09\n */\n private getPeakUsageEstimate(): number {\n let estimatedPeak = 0;\n for (const [cacheName] of this.caches.entries()) {\n const config = this.configs.get(cacheName);\n if (config) {\n // \u7C97\u7565\u4F30\u7B97\u5185\u5B58\u4F7F\u7528\n estimatedPeak += config.maxSize * 1024; // \u6BCF\u98791KB\n }\n }\n return estimatedPeak;\n }\n\n /**\n * \u6267\u884C\u6FC0\u8FDB\u7684\u6E05\u7406\u7B56\u7565\n */\n private performAggressiveCleanup(): void {\n for (const [cacheName, cache] of this.caches.entries()) {\n // \u5BF9\u4E8E\u9AD8\u7EA7\u7F13\u5B58\uFF0C\u5B83\u4F1A\u81EA\u52A8\u5904\u7406\u9A71\u9010\uFF0C\u4F46\u6211\u4EEC\u4E5F\u53EF\u4EE5\u624B\u52A8\u5E72\u9884\n // \u7B80\u5355\u5730\u51CF\u5C11\u7F13\u5B58\u5927\u5C0F\u6765\u5F3A\u5236\u9A71\u9010\n const config = this.configs.get(cacheName);\n if (config) {\n // \u8FD9\u91CC\u6211\u4EEC\u53EF\u4EE5\u4E34\u65F6\u51CF\u5C11\u7F13\u5B58\u5927\u5C0F\u4EE5\u5F3A\u5236\u9A71\u9010\u66F4\u591A\u9879\u76EE\n const currentSize = cache.size();\n if (currentSize > config.maxSize * 0.6) {\n // \u6A21\u62DF\u4E00\u4E2A\u4E34\u65F6\u7684\u5C0F\u5BB9\u91CF\u7F13\u5B58\u6548\u679C\n // \u5728\u5B9E\u9645\u7684AdvancedLruCache\u4E2D\uFF0C\u8FD9\u4F1A\u81EA\u52A8\u89E6\u53D1\u9A71\u9010\n }\n }\n }\n }\n\n /**\n * \u6267\u884C\u9002\u5EA6\u7684\u6E05\u7406\u7B56\u7565\n */\n private performModerateCleanup(): void {\n // \u9002\u5EA6\u6E05\u7406\uFF0C\u53EA\u5904\u7406\u7279\u522B\u5927\u7684\u7F13\u5B58\n for (const [cacheName, cache] of this.caches.entries()) {\n void cacheName;\n if (cache.size() > 0) {\n // \u89E6\u53D1\u5185\u90E8\u7684\u6E05\u7406\u903B\u8F91\n }\n }\n }\n\n private recordHit(cacheName: string): void {\n const stats = this.hitCount.get(cacheName) ?? {hits: 0, misses: 0};\n stats.hits++;\n this.hitCount.set(cacheName, stats);\n }\n\n private recordMiss(cacheName: string): void {\n const stats = this.hitCount.get(cacheName) ?? {hits: 0, misses: 0};\n stats.misses++;\n this.hitCount.set(cacheName, stats);\n }\n\n /**\n * \u83B7\u53D6\u6307\u5B9A\u7F13\u5B58\u7684\u7EDF\u8BA1\u4FE1\u606F\n */\n public getCacheStats(cacheName: string): {size: number; maxSize: number; hitRate: number; cleanupCount: number} {\n const cache = this.caches.get(cacheName);\n const config = this.configs.get(cacheName);\n const cleanup = this.cleanupCount.get(cacheName) ?? 0;\n const stats = this.hitCount.get(cacheName) ?? {hits: 0, misses: 0};\n\n const totalAccesses = stats.hits + stats.misses;\n const hitRate = totalAccesses > 0 ? stats.hits / totalAccesses : 0;\n\n return {\n size: cache?.size() ?? 0,\n maxSize: config?.maxSize ?? 0,\n hitRate,\n cleanupCount: cleanup\n };\n }\n\n /**\n * \u83B7\u53D6\u6240\u6709\u7F13\u5B58\u7684\u7EDF\u8BA1\u4FE1\u606F\n */\n public getAllCacheStats(): Map<string, {size: number; maxSize: number; hitRate: number; cleanupCount: number}> {\n const allStats = new Map<string, {size: number; maxSize: number; hitRate: number; cleanupCount: number}>();\n\n for (const [cacheName] of this.caches) {\n allStats.set(cacheName, this.getCacheStats(cacheName));\n }\n\n return allStats;\n }\n\n /**\n * \u66F4\u65B0\u5185\u5B58\u76D1\u63A7\u4E2D\u7684\u7F13\u5B58\u7EDF\u8BA1\u4FE1\u606F\n */\n public updateMemoryMonitor(): void {\n if (!this.MEMORY_MONITORING_ENABLED) {\n return;\n }\n\n const memoryMonitor = this.getMemoryMonitor();\n if (!memoryMonitor) {\n return;\n }\n\n for (const [cacheName] of this.caches.entries()) {\n const stats = this.getCacheStats(cacheName);\n const lastCleanup = this.lastCleanup.get(cacheName) ?? 0;\n\n // \u66F4\u65B0\u7F13\u5B58\u7EDF\u8BA1\u4FE1\u606F\n memoryMonitor.updateCacheStats(cacheName, {\n name: cacheName,\n size: stats.size,\n maxSize: stats.maxSize,\n hitRate: stats.hitRate,\n cleanupCount: stats.cleanupCount,\n lastCleanup\n });\n }\n }\n\n private getMemoryMonitor(): MemoryMonitor | null {\n try {\n return MemoryMonitor.getInstance();\n } catch {\n return null;\n }\n }\n\n /**\n * \u83B7\u53D6\u5185\u5B58\u538B\u529B\u7EA7\u522B\n */\n public getMemoryPressureLevel(): 'normal' | 'medium' | 'high' {\n return this.memoryPressureLevel;\n }\n\n /**\n * \u8BBE\u7F6E\u52A8\u6001\u8C03\u6574\u56E0\u5B50\n */\n public setDynamicAdjustmentFactor(factor: number): void {\n this.dynamicAdjustmentFactor = factor;\n }\n\n /**\n * \u83B7\u53D6\u7F13\u5B58\u5229\u7528\u7387\u4FE1\u606F\n */\n public getCacheUtilization(): Map<string, number> {\n const utilizationMap = new Map<string, number>();\n for (const [cacheName, cache] of this.caches.entries()) {\n const config = this.configs.get(cacheName);\n if (config && config.maxSize > 0) {\n utilizationMap.set(cacheName, cache.utilization());\n }\n }\n return utilizationMap;\n }\n}\n\n// \u4E3A\u4E86\u4FDD\u6301\u5411\u540E\u517C\u5BB9\u6027\uFF0C\u7EE7\u7EED\u5BFC\u51FA\u539F\u7C7B\u540D\nexport class CacheManager extends MemoryAwareCacheManager {\n}\n", "import * as crypto from 'crypto';\n\nexport function isExpired(timestamp: number, ttlMs: number, now: number = Date.now()): boolean {\n if (ttlMs <= 0) {\n return false;\n }\n return now - timestamp > ttlMs;\n}\n\nexport function isFresh(timestamp: number, ttlMs: number, now: number = Date.now()): boolean {\n return !isExpired(timestamp, ttlMs, now);\n}\n\n/**\n * \u751F\u6210\u5185\u5BB9\u54C8\u5E0C\uFF0C\u7528\u4E8E\u9A8C\u8BC1\u7F13\u5B58\u6570\u636E\u4E00\u81F4\u6027\n * @param content \u8981\u54C8\u5E0C\u7684\u5185\u5BB9\n * @param useCrypto \u662F\u5426\u4F7F\u7528 crypto \u6A21\u5757\uFF08\u66F4\u5B89\u5168\u4F46\u7A0D\u6162\uFF09\n * @returns \u54C8\u5E0C\u503C\uFF08\u5341\u516D\u8FDB\u5236\u5B57\u7B26\u4E32\uFF09\n */\nexport function hashContent(content: string, useCrypto: boolean = true): string {\n if (useCrypto) {\n // \u4F7F\u7528 crypto \u6A21\u5757\u751F\u6210 SHA-256 \u54C8\u5E0C\uFF08\u66F4\u5B89\u5168\uFF09\n try {\n return crypto.createHash('sha256').update(content).digest('hex').substring(0, 16);\n } catch {\n // \u5982\u679C crypto \u4E0D\u53EF\u7528\uFF0C\u56DE\u9000\u5230\u7B80\u5355\u54C8\u5E0C\n }\n }\n\n // \u4F7F\u7528\u7B80\u5355\u7684\u5B57\u7B26\u4E32\u54C8\u5E0C\u7B97\u6CD5\uFF08DJB2\uFF09\u4F5C\u4E3A\u56DE\u9000\n let hash = 5381;\n for (let i = 0; i < content.length; i++) {\n hash = (hash * 33) ^ content.charCodeAt(i);\n }\n return (hash >>> 0).toString(16);\n}\n", "import {hashContent} from './cache-expiry';\n\nexport interface LineRangeKey {\n startLine: number;\n endLine: number;\n}\n\nexport function makeLineRangeKey(range: LineRangeKey): string {\n return `${range.startLine}-${range.endLine}`;\n}\n\nexport function makeUriRangeKey(uri: string, range: LineRangeKey): string {\n return `${uri}:${makeLineRangeKey(range)}`;\n}\n\n/**\n * \u751F\u6210\u5E26\u5185\u5BB9\u54C8\u5E0C\u7684 URI \u952E\n * \u683C\u5F0F: uri@hash:version\uFF08\u5982\u679C\u63D0\u4F9B\uFF09\n * @param uri \u6587\u6863 URI\n * @param content \u6587\u6863\u5185\u5BB9\n * @param version \u7248\u672C\u53F7\uFF08\u53EF\u9009\uFF09\n * @returns \u7F13\u5B58\u952E\n */\nexport function makeUriContentKey(uri: string, content: string, version?: number): string {\n // \u4F7F\u7528 crypto \u54C8\u5E0C\u4EE5\u63D0\u9AD8\u5B89\u5168\u6027\uFF0C\u907F\u514D\u54C8\u5E0C\u51B2\u7A81\n const hash = hashContent(content, true);\n return version !== undefined ? `${uri}@${hash}:${version}` : `${uri}@${hash}`;\n}\n", "/**\n * \u7F13\u5B58\u914D\u7F6E\u7BA1\u7406 - \u7EDF\u4E00\u7BA1\u7406\u6240\u6709\u7F13\u5B58\u7684\u914D\u7F6E\n */\n\nimport {config} from '../config';\nimport {CacheConfig} from '../utils/cache-manager';\nimport {ErrorHandler} from '../utils/error-handler';\n\nconst errorHandler = ErrorHandler.getInstance();\n\n/**\n * \u7F13\u5B58\u914D\u7F6E\u5B9A\u4E49\n */\nexport const CACHE_CONFIGS: Record<string, CacheConfig> = {\n // AST \u5168\u91CF\u7F13\u5B58\n 'ast-full': {\n maxSize: 100, // \u6700\u591A\u7F13\u5B58 100 \u4E2A\u5B8C\u6574\u7684 AST\n ttl: config.cache.astMaxAgeMs,\n lruK: 2, // \u8003\u8651\u6700\u8FD1 2 \u6B21\u8BBF\u95EE\n evictionThreshold: 0.8, // \u4F7F\u7528\u7387\u8FBE\u5230 80% \u65F6\u5F00\u59CB\u9A71\u9010\n priorityFn: (_key, value) => {\n // \u4F18\u5148\u4FDD\u7559\u5927\u6587\u4EF6\u7684 AST\uFF08\u5047\u8BBE\u8BBF\u95EE\u9891\u7387\u66F4\u9AD8\uFF09\n const astSize = (value as {content?: string}).content?.length ?? 0;\n return astSize;\n }\n },\n\n // AST \u533A\u57DF\u7F13\u5B58\n 'ast-region': {\n maxSize: 200, // \u533A\u57DF\u7F13\u5B58\u53EF\u4EE5\u66F4\u5927\n ttl: config.cache.astMaxAgeMs,\n lruK: 2,\n evictionThreshold: 0.7, // \u66F4\u6FC0\u8FDB\u7684\u9A71\u9010\u7B56\u7565\n priorityFn: (_key, value) => {\n // \u4F18\u5148\u4FDD\u7559\u5927\u533A\u57DF\u7684 AST\n const regionSize = Array.isArray(value) ? value.length : 0;\n return regionSize;\n }\n },\n\n // \u8BCA\u65AD\u5206\u6790\u7F13\u5B58 - \u533A\u5757\u8BCA\u65AD\n 'diagnostics-blocks': {\n maxSize: 50, // \u8BCA\u65AD\u5206\u6790\u7F13\u5B58\u8F83\u5C0F\n ttl: config.cache.astMaxAgeMs,\n lruK: 2,\n evictionThreshold: 0.8\n },\n\n // \u8BCA\u65AD\u5206\u6790\u7F13\u5B58 - \u6210\u5458\u8BCA\u65AD\n 'diagnostics-members': {\n maxSize: 80,\n ttl: config.cache.astMaxAgeMs,\n lruK: 2,\n evictionThreshold: 0.8\n },\n\n // \u7B26\u53F7\u67E5\u627E\u7F13\u5B58 - \u6587\u6863\u7B26\u53F7\n 'documentSymbols': {\n maxSize: 150,\n ttl: config.cache.astMaxAgeMs,\n lruK: 2,\n evictionThreshold: 0.8\n },\n\n // \u7B26\u53F7\u67E5\u627E\u7F13\u5B58 - \u5DE5\u4F5C\u533A\u7B26\u53F7\n 'workspaceSymbols': {\n maxSize: 200,\n ttl: config.cache.astMaxAgeMs,\n lruK: 2,\n evictionThreshold: 0.8\n },\n\n // \u7B26\u53F7\u67E5\u627E\u7F13\u5B58 - \u6587\u4EF6\u7B26\u53F7\n 'fileSymbols': {\n maxSize: 150,\n ttl: config.cache.astMaxAgeMs,\n lruK: 2,\n evictionThreshold: 0.8\n },\n\n // \u5B9A\u4E49\u67E5\u627E\u7F13\u5B58\n 'definition': {\n maxSize: 100,\n ttl: config.cache.astMaxAgeMs,\n lruK: 2,\n evictionThreshold: 0.8\n },\n\n // \u5B9A\u4E49\u6587\u6863\u7F13\u5B58\n 'document': {\n maxSize: 150,\n ttl: config.cache.astMaxAgeMs,\n lruK: 2,\n evictionThreshold: 0.8\n },\n\n // \u5DE5\u4F5C\u533A\u5B9A\u4E49\u7F13\u5B58\n 'workspace': {\n maxSize: 200,\n ttl: config.cache.astMaxAgeMs,\n lruK: 2,\n evictionThreshold: 0.8\n },\n\n // \u5F15\u7528\u67E5\u627E\u7F13\u5B58\n 'references': {\n maxSize: 100,\n ttl: config.cache.astMaxAgeMs,\n lruK: 2,\n evictionThreshold: 0.8\n },\n\n // \u5F15\u7528 AST \u7F13\u5B58\n 'references-ast': {\n maxSize: config.cache.references?.maxSize ?? 100,\n ttl: config.cache.references?.ttlMs ?? config.cache.astMaxAgeMs,\n lruK: config.cache.references?.lruK ?? 2,\n evictionThreshold: config.cache.references?.evictionThreshold ?? 0.8,\n priorityFn: () => {\n // \u57FA\u4E8E\u547D\u4E2D\u7387\u4F18\u5148\n return 1;\n },\n sizeEstimator: (key: string, value: unknown) => {\n // \u4F30\u7B97\u5185\u5B58\u4F7F\u7528\n try {\n let contentHashLength = 0;\n if (typeof value === 'object' && value) {\n const record = value as {contentHash?: unknown};\n if (typeof record.contentHash === 'string') {\n contentHashLength = record.contentHash.length;\n }\n }\n return key.length + contentHashLength;\n } catch {\n return 100;\n }\n }\n },\n\n // \u60AC\u505C\u5305\u542B\u7F13\u5B58\n 'hoverIncludes': {\n maxSize: 50,\n ttl: config.cache.astMaxAgeMs,\n lruK: 2,\n evictionThreshold: 0.8\n },\n\n // \u60AC\u505C\u5185\u5BB9\u7F13\u5B58\n 'hoverContent': {\n maxSize: 100,\n ttl: config.cache.astMaxAgeMs,\n lruK: 2,\n evictionThreshold: 0.8\n },\n\n // \u5B8C\u6210\u9879\u7F13\u5B58\n 'completion-items': {\n maxSize: 150,\n ttl: config.cache.astMaxAgeMs,\n lruK: 2,\n evictionThreshold: 0.7\n },\n\n // \u683C\u5F0F\u5316\u7F13\u5B58\n 'formatting': {\n maxSize: 80,\n ttl: config.cache.astMaxAgeMs,\n lruK: 2,\n evictionThreshold: 0.8\n }\n};\n\n/**\n * \u7F13\u5B58\u914D\u7F6E\u9A8C\u8BC1\n */\nexport function validateCacheConfig(name: string, config: CacheConfig): boolean {\n if (config.maxSize <= 0) {\n errorHandler.handleWarning(`Cache config \"${name}\": maxSize must be > 0`, {\n component: 'CacheConfig',\n operation: 'validateCacheConfig',\n additionalInfo: {name}\n });\n return false;\n }\n\n if (config.ttl < 0) {\n errorHandler.handleWarning(`Cache config \"${name}\": ttl must be >= 0`, {\n component: 'CacheConfig',\n operation: 'validateCacheConfig',\n additionalInfo: {name}\n });\n return false;\n }\n\n const evictionThreshold = config.evictionThreshold ?? 1;\n if (evictionThreshold <= 0 || evictionThreshold > 1) {\n errorHandler.handleWarning(`Cache config \"${name}\": evictionThreshold must be in (0, 1]`, {\n component: 'CacheConfig',\n operation: 'validateCacheConfig',\n additionalInfo: {name, evictionThreshold}\n });\n return false;\n }\n\n if (config.lruK !== undefined && config.lruK < 1) {\n errorHandler.handleWarning(`Cache config \"${name}\": lruK must be >= 1`, {\n component: 'CacheConfig',\n operation: 'validateCacheConfig',\n additionalInfo: {name, lruK: config.lruK}\n });\n return false;\n }\n\n return true;\n}\n\n/**\n * \u83B7\u53D6\u6240\u6709\u7F13\u5B58\u914D\u7F6E\n */\nexport function getAllCacheConfigs(): Record<string, CacheConfig> {\n return {...CACHE_CONFIGS};\n}\n\n/**\n * \u6CE8\u518C\u6240\u6709\u7F13\u5B58\u914D\u7F6E\u5230\u7F13\u5B58\u7BA1\u7406\u5668\n */\nexport function registerAllCacheConfigs(cacheManager: {\n registerCache: (name: string, config: CacheConfig) => void;\n}): void {\n for (const [name, config] of Object.entries(CACHE_CONFIGS)) {\n if (validateCacheConfig(name, config)) {\n cacheManager.registerCache(name, config);\n } else {\n errorHandler.handleWarning(`Skipping invalid cache config: ${name}`, {\n component: 'CacheConfig',\n operation: 'registerAllCacheConfigs',\n additionalInfo: {name}\n });\n }\n }\n}\n\n/**\n * \u66F4\u65B0\u7F13\u5B58\u914D\u7F6E\n */\nexport function updateCacheConfig(\n name: string,\n updates: Partial<CacheConfig>\n): CacheConfig | null {\n const existing = CACHE_CONFIGS[name];\n if (existing === undefined) {\n return null;\n }\n\n const updated = {...existing, ...updates};\n if (validateCacheConfig(name, updated)) {\n CACHE_CONFIGS[name] = updated;\n return updated;\n }\n\n return null;\n}\n", "import * as nodes from './nodes.types';\nimport {config} from '../config';\nimport {LineRange} from '../utils/line-range';\nimport {CacheManager} from '../utils/cache-manager'; // Import the enhanced cache manager\nimport {makeUriContentKey, makeUriRangeKey} from '../utils/cache-keys';\nimport {isExpired, isFresh, hashContent} from '../utils/cache-expiry';\nimport {CACHE_CONFIGS} from '../config/cache-config';\n// Initialize the cache manager\nconst cacheManager = CacheManager.getInstance();\n\n// Register AST cache configurations using centralized configs\ncacheManager.registerCache('ast-full', CACHE_CONFIGS['ast-full']);\n\ncacheManager.registerCache('ast-region', CACHE_CONFIGS['ast-region']);\n\ninterface ASTCacheEntry {\n contentHash: string; // \u5185\u5BB9\u54C8\u5E0C\uFF0C\u7528\u4E8E\u9A8C\u8BC1\u4E00\u81F4\u6027\n content: string;\n ast: nodes.ThriftDocument;\n timestamp: number;\n}\n\n// New interface for region-based cache entries\ninterface ASTRegionCacheEntry {\n contentHash: string; // \u5185\u5BB9\u54C8\u5E0C\uFF0C\u7528\u4E8E\u9A8C\u8BC1\u4E00\u81F4\u6027\n content: string;\n regionAST: nodes.ThriftNode[];\n range: LineRange;\n timestamp: number;\n}\n\n// Use the new cache manager for primary caches\nconst astCache = new Map<string, ASTCacheEntry>();\nconst astRegionCache = new Map<string, ASTRegionCacheEntry[]>(); // Keyed by URI\nconst CACHE_MAX_AGE = config.cache.astMaxAgeMs;\n\n/**\n * \u83B7\u53D6\u7F13\u5B58\u4E2D\u7684 AST\uFF08\u82E5\u547D\u4E2D\u4E14\u672A\u8FC7\u671F\uFF09\u3002\n * @param uri \u6587\u6863 URI\n * @param content \u6587\u6863\u5185\u5BB9\n * @param version \u7248\u672C\u53F7\uFF08\u53EF\u9009\uFF09\n * @returns \u7F13\u5B58\u547D\u4E2D\u65F6\u8FD4\u56DE AST\uFF0C\u5426\u5219\u8FD4\u56DE null\n */\nexport function getCachedAst(uri: string, content: string, version?: number): nodes.ThriftDocument | null {\n const now = Date.now();\n\n // \u5C1D\u8BD5\u4F7F\u7528\u4F18\u5316\u7684\u7F13\u5B58\u952E\u67E5\u627E\n const cacheKey = makeUriContentKey(uri, content, version);\n\n // \u5148\u68C0\u67E5 astCache Map\n const cached = astCache.get(cacheKey) ?? astCache.get(uri); // \u5411\u540E\u517C\u5BB9\n\n if (cached && isFresh(cached.timestamp, CACHE_MAX_AGE, now)) {\n // \u9A8C\u8BC1\u5185\u5BB9\u54C8\u5E0C\u4EE5\u786E\u4FDD\u7F13\u5B58\u6570\u636E\u4E00\u81F4\u6027\n const currentHash = hashContent(content);\n if (cached.contentHash === currentHash && cached.content === content) {\n // Notify the cache manager about access for memory awareness\n cacheManager.get('ast-full', cacheKey);\n return cached.ast;\n }\n }\n\n return null;\n}\n\n/**\n * \u83B7\u53D6\u7F13\u5B58\u4E2D\u7684 AST \u7247\u6BB5\uFF08\u82E5\u547D\u4E2D\u4E14\u672A\u8FC7\u671F\uFF09\u3002\n * @param uri \u6587\u6863 URI\n * @param range \u884C\u8303\u56F4\n * @param content \u7247\u6BB5\u5185\u5BB9\n * @returns \u7F13\u5B58\u547D\u4E2D\u65F6\u8FD4\u56DE AST \u7247\u6BB5\uFF0C\u5426\u5219\u8FD4\u56DE null\n */\nexport function getCachedAstRange(uri: string, range: LineRange, content: string): nodes.ThriftNode[] | null {\n const now = Date.now();\n const uriCache = astRegionCache.get(uri);\n const cacheKey = makeUriRangeKey(uri, range);\n\n if (!uriCache) {\n // Notify the cache manager about access\n cacheManager.get('ast-region', cacheKey);\n return null;\n }\n\n // Find cached entry for this specific range\n const cached = uriCache.find(entry =>\n entry.range.startLine === range.startLine &&\n entry.range.endLine === range.endLine &&\n isFresh(entry.timestamp, CACHE_MAX_AGE, now)\n );\n\n if (cached) {\n // \u9A8C\u8BC1\u5185\u5BB9\u54C8\u5E0C\u4EE5\u786E\u4FDD\u7F13\u5B58\u6570\u636E\u4E00\u81F4\u6027\n const currentHash = hashContent(content);\n if (cached.contentHash === currentHash && cached.content === content) {\n // Notify the cache manager about access for memory awareness\n cacheManager.get('ast-region', cacheKey);\n return cached.regionAST;\n }\n }\n\n return null;\n}\n\n/**\n * \u5199\u5165 AST \u7247\u6BB5\u7F13\u5B58\u3002\n * @param uri \u6587\u6863 URI\n * @param range \u884C\u8303\u56F4\n * @param content \u7247\u6BB5\u5185\u5BB9\n * @param ast \u89E3\u6790\u540E\u7684 AST \u7247\u6BB5\n * @returns void\n */\nexport function setCachedAstRange(uri: string, range: LineRange, content: string, ast: nodes.ThriftNode[]): void {\n if (!astRegionCache.has(uri)) {\n astRegionCache.set(uri, []);\n }\n\n let uriCache = astRegionCache.get(uri);\n if (!uriCache) {\n uriCache = [];\n astRegionCache.set(uri, uriCache);\n }\n\n // Remove existing entry for this range to avoid duplicates\n const existingIndex = uriCache.findIndex(entry =>\n entry.range.startLine === range.startLine &&\n entry.range.endLine === range.endLine\n );\n\n if (existingIndex !== -1) {\n uriCache.splice(existingIndex, 1);\n }\n\n // Add new entry with content hash for validation\n uriCache.push({\n contentHash: hashContent(content), // \u751F\u6210\u5185\u5BB9\u54C8\u5E0C\n content,\n regionAST: ast,\n range,\n timestamp: Date.now()\n });\n\n // Limit the number of entries per URI to prevent memory issues\n if (uriCache.length > 50) { // Use a reasonable constant instead of config value\n uriCache.shift(); // Remove oldest entry\n }\n\n // Notify the cache manager about the set operation for memory awareness\n cacheManager.set('ast-region', makeUriRangeKey(uri, range), ast);\n}\n\n/**\n * \u6E05\u7406\u6307\u5B9A\u6587\u6863\u7684 AST \u7247\u6BB5\u7F13\u5B58\u3002\n * @param uri \u6587\u6863 URI\n * @returns void\n */\nexport function clearAstRegionCacheForDocument(uri: string): void {\n const entries = astRegionCache.get(uri);\n if (entries) {\n for (const entry of entries) {\n cacheManager.delete('ast-region', makeUriRangeKey(uri, entry.range));\n }\n }\n astRegionCache.delete(uri);\n}\n\n/**\n * \u5199\u5165 AST \u7F13\u5B58\u3002\n * @param uri \u6587\u6863 URI\n * @param content \u6587\u6863\u5185\u5BB9\n * @param ast \u89E3\u6790\u540E\u7684 AST\n * @param version \u7248\u672C\u53F7\uFF08\u53EF\u9009\uFF09\n * @returns void\n */\nexport function setCachedAst(uri: string, content: string, ast: nodes.ThriftDocument, version?: number): void {\n const entry = {\n contentHash: hashContent(content), // \u751F\u6210\u5185\u5BB9\u54C8\u5E0C\n content,\n ast,\n timestamp: Date.now()\n };\n\n // \u4F7F\u7528\u4F18\u5316\u7684\u7F13\u5B58\u952E\n const cacheKey = makeUriContentKey(uri, content, version);\n\n astCache.set(cacheKey, entry);\n\n // Notify the cache manager about the set operation for memory awareness\n cacheManager.set('ast-full', cacheKey, entry);\n}\n\n/**\n * \u6E05\u7406\u8FC7\u671F AST \u7F13\u5B58\u3002\n * @returns void\n */\nexport function clearExpiredAstCache(): void {\n const now = Date.now();\n for (const [uri, entry] of Array.from(astCache.entries())) {\n if (isExpired(entry.timestamp, CACHE_MAX_AGE, now)) {\n astCache.delete(uri);\n cacheManager.delete('ast-full', uri);\n }\n }\n\n for (const [uri, entries] of Array.from(astRegionCache.entries())) {\n const freshEntries = entries.filter(entry => isFresh(entry.timestamp, CACHE_MAX_AGE, now));\n const expiredEntries = entries.filter(entry => isExpired(entry.timestamp, CACHE_MAX_AGE, now));\n for (const entry of expiredEntries) {\n cacheManager.delete('ast-region', makeUriRangeKey(uri, entry.range));\n }\n if (freshEntries.length === 0) {\n astRegionCache.delete(uri);\n } else if (freshEntries.length !== entries.length) {\n astRegionCache.set(uri, freshEntries);\n }\n }\n}\n\n/**\n * \u6E05\u7406\u6307\u5B9A\u6587\u6863\u7684 AST \u7F13\u5B58\u3002\n * @param uri \u6587\u6863 URI\n * @returns void\n */\nexport function clearAstCacheForDocument(uri: string): void {\n // Clear all entries that start with the URI\n for (const key of astCache.keys()) {\n if (key.startsWith(uri)) {\n astCache.delete(key);\n cacheManager.delete('ast-full', key);\n }\n }\n clearAstRegionCacheForDocument(uri);\n}\n\n/**\n * \u89E3\u6790\u5E76\u7F13\u5B58 AST\u3002\n * @param uri \u6587\u6863 URI\n * @param content \u6587\u6863\u5185\u5BB9\n * @param parse \u89E3\u6790\u51FD\u6570\n * @param version \u7248\u672C\u53F7\uFF08\u53EF\u9009\uFF09\n * @returns AST\n */\nexport function parseWithAstCache(\n uri: string,\n content: string,\n parse: () => nodes.ThriftDocument,\n version?: number\n): nodes.ThriftDocument {\n const cached = getCachedAst(uri, content, version);\n if (cached) {\n return cached;\n }\n const ast = parse();\n setCachedAst(uri, content, ast, version);\n return ast;\n}\n", "\n/** Represents a contiguous span of lines (0-indexed, inclusive). */\nexport interface LineRange {\n startLine: number;\n endLine: number;\n}\n\n/**\n * Create a normalised LineRange, clamping start to \u22650 and end to \u2265start.\n * Fractional values are floored.\n */\nexport function createLineRange(startLine: number, endLine: number): LineRange {\n const s = Math.max(0, Math.floor(startLine));\n const e = Math.max(s, Math.floor(endLine));\n return {startLine: s, endLine: e};\n}\n\n/**\n * Return a normalised copy of `range`, or `null` if input is falsy or\n * contains non-finite values.\n */\nexport function normalizeLineRange(range: LineRange | null | undefined): LineRange | null {\n if (!range) {\n return null;\n }\n const startLine = Math.min(range.startLine, range.endLine);\n const endLine = Math.max(range.startLine, range.endLine);\n if (!Number.isFinite(startLine) || !Number.isFinite(endLine)) {\n return null;\n }\n return createLineRange(startLine, endLine);\n}\n\n/**\n * Merge an array of line ranges into the minimum set of non-overlapping\n * ranges sorted by start line. Adjacent ranges (gap \u2264 1) are coalesced.\n */\nexport function mergeLineRanges(ranges: LineRange[]): LineRange[] {\n if (!ranges.length) {\n return [];\n }\n const normalized = ranges\n .map(range => normalizeLineRange(range))\n .filter((range): range is LineRange => range !== null)\n .sort((a, b) => a.startLine - b.startLine || a.endLine - b.endLine);\n if (!normalized.length) {\n return [];\n }\n const merged: LineRange[] = [];\n let current = normalized[0];\n for (let i = 1; i < normalized.length; i++) {\n const next = normalized[i];\n if (next.startLine <= current.endLine + 1) {\n current = {\n startLine: current.startLine,\n endLine: Math.max(current.endLine, next.endLine)\n };\n } else {\n merged.push(current);\n current = next;\n }\n }\n merged.push(current);\n return merged;\n}\n\n/** Collapse an array of ranges into a single bounding range, or `null` if empty. */\nexport function collapseLineRanges(ranges: LineRange[]): LineRange | null {\n if (!ranges.length) {\n return null;\n }\n const normalized = mergeLineRanges(ranges);\n if (!normalized.length) {\n return null;\n }\n return {\n startLine: Math.min(...normalized.map(range => range.startLine)),\n endLine: Math.max(...normalized.map(range => range.endLine))\n };\n}\n\n/** Number of lines covered by `range` (inclusive, minimum 0). */\nexport function lineRangeLineCount(range: LineRange): number {\n const normalized = normalizeLineRange(range);\n if (!normalized) {\n return 0;\n }\n return normalized.endLine - normalized.startLine + 1;\n}\n\n/** True if `range` and `lineRange` share at least one line. Accepts any Range-shaped object. */\nexport function rangeIntersectsLineRange(range: {start: {line: number}; end: {line: number}}, lineRange: LineRange): boolean {\n return range.start.line <= lineRange.endLine && range.end.line >= lineRange.startLine;\n}\n\n/** True if `lineRange` is fully contained within `range`. */\nexport function rangeContainsLineRange(range: {start: {line: number}; end: {line: number}}, lineRange: LineRange): boolean {\n return range.start.line <= lineRange.startLine && range.end.line >= lineRange.endLine;\n}\n\n/**\n * Derive a LineRange from a text-change event.\n * `lineDelta` is the net line count of the inserted text minus the replaced text.\n */\nexport function lineRangeFromChange(change: {range: {start: {line: number}; end: {line: number}}; text: string}): LineRange {\n const startLine = change.range.start.line;\n const lineDelta = change.text.split('\\n').length - 1;\n const endLine = change.range.end.line + lineDelta;\n return createLineRange(startLine, endLine);\n}\n", "/**\n * \u8F7B\u91CF\u7EA7\u5F15\u53F7\u72B6\u6001\u8DDF\u8E2A\u5668\uFF0C\u6D88\u9664\u5206\u6563\u5728\u591A\u5904\u7684 inS/inD/escaped \u4E09\u5E03\u5C14\u6837\u677F\u4EE3\u7801\u3002\n * \u9010\u5B57\u7B26\u5582\u5165\uFF0C\u81EA\u52A8\u8DDF\u8E2A\u662F\u5426\u5904\u4E8E\u5355\u5F15\u53F7/\u53CC\u5F15\u53F7\u5B57\u7B26\u4E32\u5185\u90E8\u3002\n */\nexport class QuoteTracker {\n private _inSingle = false;\n private _inDouble = false;\n private _escaped = false;\n\n /** \u5582\u5165\u4E00\u4E2A\u5B57\u7B26\uFF0C\u66F4\u65B0\u5F15\u53F7\u8DDF\u8E2A\u72B6\u6001\u3002 */\n feed(ch: string): void {\n if (this._inSingle) {\n if (!this._escaped && ch === '\\\\') { this._escaped = true; return; }\n if (!this._escaped && ch === '\\'') { this._inSingle = false; }\n this._escaped = false;\n return;\n }\n if (this._inDouble) {\n if (!this._escaped && ch === '\\\\') { this._escaped = true; return; }\n if (!this._escaped && ch === '\"') { this._inDouble = false; }\n this._escaped = false;\n return;\n }\n if (ch === '\\'') { this._inSingle = true; return; }\n if (ch === '\"') { this._inDouble = true; }\n }\n\n /** \u5F53\u524D\u662F\u5426\u5904\u4E8E\u5F15\u53F7\u5B57\u7B26\u4E32\u5185\u90E8\u3002 */\n inside(): boolean {\n return this._inSingle || this._inDouble;\n }\n\n /** \u91CD\u7F6E\u8DDF\u8E2A\u72B6\u6001\u3002 */\n reset(): void {\n this._inSingle = false;\n this._inDouble = false;\n this._escaped = false;\n }\n}\n", "import {Range} from '../types';\nimport * as nodes from './nodes.types';\n\nconst PLACEHOLDER_RANGE = new Range(0, 0, 0, 0);\n\nexport function createField(params: {\n range: Range;\n nameRange?: Range;\n typeRange?: Range;\n parent?: nodes.ThriftNode;\n id: number;\n fieldType: string;\n name: string;\n requiredness?: 'required' | 'optional';\n defaultValue?: string;\n defaultValueRange?: Range;\n}): nodes.Field {\n return {\n type: nodes.ThriftNodeType.Field,\n range: params.range,\n nameRange: params.nameRange,\n typeRange: params.typeRange,\n parent: params.parent,\n id: params.id,\n requiredness: params.requiredness,\n fieldType: params.fieldType,\n name: params.name,\n defaultValue: params.defaultValue,\n defaultValueRange: params.defaultValueRange\n };\n}\n\nexport function createDocument(params: {\n range: Range;\n body?: nodes.ThriftNode[];\n parent?: nodes.ThriftNode;\n}): nodes.ThriftDocument {\n return {\n type: nodes.ThriftNodeType.Document,\n range: params.range,\n body: params.body ?? [],\n parent: params.parent\n };\n}\n\nexport function createStructBlock(params: {\n type: nodes.ThriftNodeType.Struct | nodes.ThriftNodeType.Union | nodes.ThriftNodeType.Exception;\n name: string;\n nameRange?: Range;\n parent: nodes.ThriftNode;\n}): nodes.Struct {\n return {\n type: params.type,\n name: params.name,\n range: PLACEHOLDER_RANGE,\n nameRange: params.nameRange,\n parent: params.parent,\n fields: []\n };\n}\n\nexport function createEnumBlock(params: {\n name: string;\n nameRange?: Range;\n parent: nodes.ThriftNode;\n isSenum: boolean;\n}): nodes.Enum {\n return {\n type: nodes.ThriftNodeType.Enum,\n name: params.name,\n range: PLACEHOLDER_RANGE,\n nameRange: params.nameRange,\n parent: params.parent,\n members: [],\n isSenum: params.isSenum\n };\n}\n\nexport function createServiceBlock(params: {\n name: string;\n nameRange?: Range;\n parent: nodes.ThriftNode;\n extends?: string;\n extendsRange?: Range;\n}): nodes.Service {\n return {\n type: nodes.ThriftNodeType.Service,\n name: params.name,\n extends: params.extends,\n extendsRange: params.extendsRange,\n range: PLACEHOLDER_RANGE,\n nameRange: params.nameRange,\n parent: params.parent,\n functions: []\n };\n}\n\nexport function createInteractionBlock(params: {\n name: string;\n nameRange?: Range;\n parent: nodes.ThriftNode;\n}): nodes.Interaction {\n return {\n type: nodes.ThriftNodeType.Interaction,\n name: params.name,\n range: PLACEHOLDER_RANGE,\n nameRange: params.nameRange,\n parent: params.parent,\n functions: []\n };\n}\n", "export type TokenType = 'identifier' | 'number' | 'string' | 'symbol' | 'whitespace' | 'comment';\n\nexport interface Token {\n type: TokenType;\n value: string;\n start: number;\n end: number;\n}\n\nconst symbolChars = new Set(['{', '}', '(', ')', '[', ']', '<', '>', ',', ';', ':', '=', '.']);\n\ninterface ScanState {\n inBlockComment: boolean;\n}\n\nexport interface LineScanResult {\n tokens: Token[];\n stripped: string;\n}\n\nexport class ThriftTokenizer {\n private state: ScanState = {inBlockComment: false};\n\n public scanLine(line: string): LineScanResult {\n return scanLine(line, this.state);\n }\n\n public tokenizeLine(line: string): Token[] {\n return this.scanLine(line).tokens;\n }\n}\n\n/**\n * Tokenize a single line of Thrift source.\n * @param line - Line content.\n * @returns Tokens found in the line.\n */\nexport function tokenizeLine(line: string): Token[] {\n return scanLine(line, {inBlockComment: false}).tokens;\n}\n\nfunction scanLine(line: string, state: ScanState): LineScanResult {\n const tokens: Token[] = [];\n const stripped = line.split('');\n let i = 0;\n let escaped = false;\n\n const maskRange = (start: number, end: number) => {\n for (let idx = start; idx < end && idx < stripped.length; idx++) {\n stripped[idx] = ' ';\n }\n };\n\n while (i < line.length) {\n if (state.inBlockComment) {\n const end = line.indexOf('*/', i);\n if (end === -1) {\n tokens.push({type: 'comment', value: line.slice(i), start: i, end: line.length});\n maskRange(i, line.length);\n i = line.length;\n break;\n }\n const endIndex = end + 2;\n tokens.push({type: 'comment', value: line.slice(i, endIndex), start: i, end: endIndex});\n maskRange(i, endIndex);\n i = endIndex;\n state.inBlockComment = false;\n continue;\n }\n\n const ch = line[i];\n\n if (ch === ' ' || ch === '\\t') {\n const start = i;\n while (i < line.length && (line[i] === ' ' || line[i] === '\\t')) {\n i += 1;\n }\n tokens.push({type: 'whitespace', value: line.slice(start, i), start, end: i});\n continue;\n }\n\n if (ch === '\"' || ch === '\\'') {\n const quote = ch;\n const start = i;\n let value = '';\n i += 1;\n escaped = false;\n while (i < line.length) {\n const curr = line[i];\n if (!escaped && curr === '\\\\') {\n escaped = true;\n value += curr;\n i += 1;\n continue;\n }\n if (!escaped && curr === quote) {\n i += 1;\n break;\n }\n escaped = false;\n value += curr;\n i += 1;\n }\n tokens.push({type: 'string', value, start, end: i});\n continue;\n }\n\n if (ch === '/' && line[i + 1] === '*') {\n const start = i;\n const end = line.indexOf('*/', i + 2);\n if (end === -1) {\n tokens.push({type: 'comment', value: line.slice(start), start, end: line.length});\n maskRange(start, line.length);\n state.inBlockComment = true;\n break;\n }\n const endIndex = end + 2;\n tokens.push({type: 'comment', value: line.slice(start, endIndex), start, end: endIndex});\n maskRange(start, endIndex);\n i = endIndex;\n continue;\n }\n\n if (ch === '/' && line[i + 1] === '/') {\n tokens.push({type: 'comment', value: line.slice(i), start: i, end: line.length});\n maskRange(i, line.length);\n break;\n }\n if (ch === '#') {\n tokens.push({type: 'comment', value: line.slice(i), start: i, end: line.length});\n maskRange(i, line.length);\n break;\n }\n\n if ((ch >= 'A' && ch <= 'Z') || (ch >= 'a' && ch <= 'z') || ch === '_') {\n const start = i;\n i += 1;\n while (i < line.length) {\n const next = line[i];\n if ((next >= 'A' && next <= 'Z') || (next >= 'a' && next <= 'z') || (next >= '0' && next <= '9') || next === '_') {\n i += 1;\n continue;\n }\n break;\n }\n tokens.push({type: 'identifier', value: line.slice(start, i), start, end: i});\n continue;\n }\n\n if (ch >= '0' && ch <= '9') {\n const start = i;\n i += 1;\n while (i < line.length) {\n const next = line[i];\n if (next >= '0' && next <= '9') {\n i += 1;\n continue;\n }\n break;\n }\n tokens.push({type: 'number', value: line.slice(start, i), start, end: i});\n continue;\n }\n\n if (symbolChars.has(ch)) {\n tokens.push({type: 'symbol', value: ch, start: i, end: i + 1});\n i += 1;\n continue;\n }\n\n tokens.push({type: 'symbol', value: ch, start: i, end: i + 1});\n i += 1;\n }\n\n return {tokens, stripped: stripped.join('')};\n}\n\n/**\n * Tokenize multi-line Thrift text with absolute offsets.\n * @param text - Text content.\n * @returns Tokens found in the text.\n */\nexport function tokenizeText(text: string): Token[] {\n const tokens: Token[] = [];\n const tokenizer = new ThriftTokenizer();\n let lineStart = 0;\n for (let i = 0; i <= text.length; i++) {\n if (i === text.length || text[i] === '\\n') {\n const line = text.slice(lineStart, i);\n const lineTokens = tokenizer.tokenizeLine(line);\n for (const token of lineTokens) {\n // Construct directly to avoid spread allocation overhead\n tokens.push({type: token.type, value: token.value, start: token.start + lineStart, end: token.end + lineStart});\n }\n if (i < text.length) {\n tokens.push({type: 'whitespace', value: '\\n', start: i, end: i + 1});\n }\n lineStart = i + 1;\n }\n }\n return tokens;\n}\n", "import {Range} from '../types';\n\n/**\n * \u5254\u9664\u884C\u5185\u6CE8\u91CA\u5185\u5BB9\uFF0C\u4FDD\u7559\u5B57\u7B26\u4E32\u5B57\u9762\u91CF\u3002\n * @param line \u884C\u5185\u5BB9\n * @returns \u53BB\u9664\u6CE8\u91CA\u540E\u7684\u6587\u672C\n */\nexport function stripLineComments(line: string): string {\n let out = '';\n let inS = false;\n let inD = false;\n let escaped = false;\n for (let i = 0; i < line.length; i++) {\n const ch = line[i];\n const next = i + 1 < line.length ? line[i + 1] : '';\n if (inS) {\n if (!escaped && ch === '\\\\') {\n escaped = true;\n out += ch;\n continue;\n }\n if (!escaped && ch === '\\'') {\n inS = false;\n }\n escaped = false;\n out += ch;\n continue;\n }\n if (inD) {\n if (!escaped && ch === '\\\\') {\n escaped = true;\n out += ch;\n continue;\n }\n if (!escaped && ch === '\"') {\n inD = false;\n }\n escaped = false;\n out += ch;\n continue;\n }\n if (ch === '\\'') {\n inS = true;\n out += ch;\n continue;\n }\n if (ch === '\"') {\n inD = true;\n out += ch;\n continue;\n }\n if ((ch === '/' && next === '/') || ch === '#') {\n break;\n }\n out += ch;\n }\n return out;\n}\n\n/**\n * \u5904\u7406\u884C\u5C3E\u7684\u6CE8\u89E3\u3002\n * @param line \u884C\u5185\u5BB9\n * @returns \u53BB\u9664\u6CE8\u89E3\u540E\u7684\u884C\u5185\u5BB9\n */\nexport function stripTrailingAnnotation(line: string): string {\n const trimmed = line.trimEnd();\n if (!trimmed.endsWith(')')) {\n return line;\n }\n let inS = false;\n let inD = false;\n let escaped = false;\n let depth = 0;\n for (let i = trimmed.length - 1; i >= 0; i--) {\n const ch = trimmed[i];\n if (escaped) {\n escaped = false;\n continue;\n }\n if (ch === '\\\\') {\n escaped = true;\n continue;\n }\n if (inS) {\n if (ch === '\\'') {\n inS = false;\n }\n continue;\n }\n if (inD) {\n if (ch === '\"') {\n inD = false;\n }\n continue;\n }\n if (ch === '\\'') {\n inS = true;\n continue;\n }\n if (ch === '\"') {\n inD = true;\n continue;\n }\n if (ch === ')') {\n depth++;\n continue;\n }\n if (ch === '(') {\n depth--;\n if (depth === 0) {\n return trimmed.slice(0, i).trimEnd();\n }\n }\n }\n return line;\n}\n\n/**\n * \u5206\u5272\u9876\u5C42\u9017\u53F7\u5E76\u4FDD\u7559\u504F\u79FB\u91CF\u3002\n * @param text \u8F93\u5165\u6587\u672C\n * @returns \u5206\u5272\u540E\u7684\u6587\u672C\u7247\u6BB5\u53CA\u5176\u8D77\u59CB\u504F\u79FB\u91CF\u6570\u7EC4\n */\nexport function splitTopLevelCommasWithOffsets(text: string): Array<{text: string; start: number}> {\n const parts: Array<{text: string; start: number}> = [];\n let start = 0;\n let depthAngle = 0;\n let depthBracket = 0;\n let depthBrace = 0;\n let depthParen = 0;\n let inS = false;\n let inD = false;\n let escaped = false;\n for (let i = 0; i < text.length; i++) {\n const ch = text[i];\n if (inS) {\n if (!escaped && ch === '\\\\') {\n escaped = true;\n continue;\n }\n if (!escaped && ch === '\\'') {\n inS = false;\n }\n escaped = false;\n continue;\n }\n if (inD) {\n if (!escaped && ch === '\\\\') {\n escaped = true;\n continue;\n }\n if (!escaped && ch === '\"') {\n inD = false;\n }\n escaped = false;\n continue;\n }\n if (ch === '\\'') {\n inS = true;\n continue;\n }\n if (ch === '\"') {\n inD = true;\n continue;\n }\n if (ch === '<') {\n depthAngle++;\n continue;\n }\n if (ch === '>') {\n depthAngle = Math.max(0, depthAngle - 1);\n continue;\n }\n if (ch === '[') {\n depthBracket++;\n continue;\n }\n if (ch === ']') {\n depthBracket = Math.max(0, depthBracket - 1);\n continue;\n }\n if (ch === '{') {\n depthBrace++;\n continue;\n }\n if (ch === '}') {\n depthBrace = Math.max(0, depthBrace - 1);\n continue;\n }\n if (ch === '(') {\n depthParen++;\n continue;\n }\n if (ch === ')') {\n depthParen = Math.max(0, depthParen - 1);\n continue;\n }\n\n if (ch === ',' && depthAngle === 0 && depthBracket === 0 && depthBrace === 0 && depthParen === 0) {\n const segment = text.slice(start, i);\n const leading = segment.match(/^\\s*/)?.[0].length ?? 0;\n const trimmed = segment.trim();\n if (trimmed) {\n parts.push({text: trimmed, start: start + leading});\n }\n start = i + 1;\n }\n }\n const tail = text.slice(start);\n const leading = tail.match(/^\\s*/)?.[0].length ?? 0;\n const trimmed = tail.trim();\n if (trimmed) {\n parts.push({text: trimmed, start: start + leading});\n }\n return parts;\n}\n\n/**\n * \u5C06\u6587\u672C\u504F\u79FB\u8F6C\u6362\u4E3A\u884C\u5217\u5750\u6807\u3002\n * @param text \u539F\u59CB\u6587\u672C\n * @param baseLine \u8D77\u59CB\u884C\n * @param baseChar \u8D77\u59CB\u5217\n * @param offset \u6587\u672C\u504F\u79FB\n * @returns \u884C\u5217\u5750\u6807\n */\nexport function offsetToPosition(\n text: string,\n baseLine: number,\n baseChar: number,\n offset: number\n): {line: number; char: number} {\n let line = baseLine;\n let char = baseChar;\n for (let i = 0; i < offset && i < text.length; i++) {\n if (text[i] === '\\n') {\n line++;\n char = 0;\n } else {\n char++;\n }\n }\n return {line, char};\n}\n\n/**\n * \u8BFB\u53D6\u5339\u914D\u62EC\u53F7\u5185\u7684\u6587\u672C\u3002\n * @param lines \u6587\u6863\u884C\u5185\u5BB9\n * @param startLine \u8D77\u59CB\u884C\n * @param startChar \u8D77\u59CB\u5217\n * @returns \u6587\u672C\u4E0E\u7ED3\u675F\u4F4D\u7F6E\n */\nexport function readParenthesizedText(\n lines: string[],\n startLine: number,\n startChar: number\n): {text: string; endLine: number; endChar: number} | null {\n let line = startLine;\n let char = startChar;\n let depth = 1;\n let text = '';\n\n while (line < lines.length) {\n const lineText = lines[line];\n while (char < lineText.length) {\n const c = lineText[char];\n if (c === '(') {\n depth++;\n text += c;\n } else if (c === ')') {\n depth--;\n if (depth === 0) {\n return {text, endLine: line, endChar: char};\n }\n text += c;\n } else {\n text += c;\n }\n char++;\n }\n line++;\n char = 0;\n if (line < lines.length) {\n text += '\\n';\n }\n }\n return null;\n}\n\n/**\n * \u67E5\u627E\u9996\u4E2A\u975E\u7A7A\u767D\u5B57\u7B26\u4F4D\u7F6E\u3002\n * @param lines \u6587\u6863\u884C\u5185\u5BB9\n * @param line \u8D77\u59CB\u884C\n * @param char \u8D77\u59CB\u5217\n * @param limitLine \u7ED3\u675F\u884C\n * @returns \u4F4D\u7F6E\u6216 null\n */\nexport function findFirstNonWhitespaceAfter(\n lines: string[],\n line: number,\n char: number,\n limitLine: number\n): {line: number; char: number} | null {\n let currentLine = line;\n let currentChar = char + 1;\n while (currentLine < lines.length && currentLine <= limitLine) {\n const text = lines[currentLine] ?? '';\n while (currentChar < text.length) {\n const ch = text[currentChar];\n if (!/\\s/.test(ch)) {\n return {line: currentLine, char: currentChar};\n }\n currentChar++;\n }\n currentLine++;\n currentChar = 0;\n }\n return null;\n}\n\n/**\n * \u67E5\u627E\u672B\u5C3E\u7684\u975E\u7A7A\u767D\u5B57\u7B26\u4F4D\u7F6E\u3002\n * @param lines \u6587\u6863\u884C\u5185\u5BB9\n * @param startLine \u8D77\u59CB\u884C\n * @param endLine \u7ED3\u675F\u884C\n * @returns \u4F4D\u7F6E\u6216 null\n */\nexport function findLastNonWhitespaceUpTo(\n lines: string[],\n startLine: number,\n endLine: number\n): {line: number; char: number} | null {\n for (let line = endLine; line >= startLine; line--) {\n const text = lines[line] ?? '';\n for (let i = text.length - 1; i >= 0; i--) {\n const ch = text[i];\n if (!/\\s/.test(ch) && ch !== ';') {\n return {line, char: i + 1};\n }\n if (ch === '/' && i > 0 && text[i - 1] === '/') {\n break;\n }\n }\n }\n return null;\n}\n\n/**\n * \u6309\u8303\u56F4\u622A\u53D6\u6587\u672C\u3002\n * @param lines \u6587\u6863\u884C\u5185\u5BB9\n * @param range \u622A\u53D6\u8303\u56F4\n * @returns \u6587\u672C\u5185\u5BB9\n */\nexport function sliceTextByRange(lines: string[], range: Range): string {\n if (range.start.line === range.end.line) {\n const line = lines[range.start.line] ?? '';\n return line.slice(range.start.character, range.end.character);\n }\n const parts: string[] = [];\n parts.push((lines[range.start.line] ?? '').slice(range.start.character));\n for (let i = range.start.line + 1; i < range.end.line; i++) {\n parts.push(lines[i] ?? '');\n }\n parts.push((lines[range.end.line] ?? '').slice(0, range.end.character));\n return parts.join('\\n');\n}\n\nexport function escapeRegExp(value: string): string {\n return value.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n}\n", "import {Range} from '../types';\nimport {escapeRegExp, findFirstNonWhitespaceAfter, findLastNonWhitespaceUpTo, sliceTextByRange} from './text-utils';\n\n/**\n * \u89E3\u6790\u5B57\u6BB5\u9ED8\u8BA4\u503C\u8303\u56F4\u4E0E\u6587\u672C\u3002\n * @param segmentText \u5B57\u6BB5\u6587\u672C\n * @returns \u9ED8\u8BA4\u503C\u4FE1\u606F\u6216 null\n */\nexport function findDefaultValueRange(segmentText: string): {start: number; end: number; value: string} | null {\n let depthAngle = 0;\n let depthBracket = 0;\n let depthBrace = 0;\n let depthParen = 0;\n let inS = false;\n let inD = false;\n let escaped = false;\n for (let i = 0; i < segmentText.length; i++) {\n const ch = segmentText[i];\n if (inS) {\n if (!escaped && ch === '\\\\') {\n escaped = true;\n continue;\n }\n if (!escaped && ch === '\\'') {\n inS = false;\n }\n escaped = false;\n continue;\n }\n if (inD) {\n if (!escaped && ch === '\\\\') {\n escaped = true;\n continue;\n }\n if (!escaped && ch === '\"') {\n inD = false;\n }\n escaped = false;\n continue;\n }\n if (ch === '\\'') {\n inS = true;\n continue;\n }\n if (ch === '\"') {\n inD = true;\n continue;\n }\n if (ch === '<') {\n depthAngle++;\n continue;\n }\n if (ch === '>') {\n depthAngle = Math.max(0, depthAngle - 1);\n continue;\n }\n if (ch === '[') {\n depthBracket++;\n continue;\n }\n if (ch === ']') {\n depthBracket = Math.max(0, depthBracket - 1);\n continue;\n }\n if (ch === '{') {\n depthBrace++;\n continue;\n }\n if (ch === '}') {\n depthBrace = Math.max(0, depthBrace - 1);\n continue;\n }\n if (ch === '(') {\n depthParen++;\n continue;\n }\n if (ch === ')') {\n depthParen = Math.max(0, depthParen - 1);\n continue;\n }\n if (ch === '=' && depthAngle === 0 && depthBracket === 0 && depthBrace === 0 && depthParen === 0) {\n const tail = segmentText.slice(i + 1);\n const leading = tail.match(/^\\s*/)?.[0].length ?? 0;\n const value = tail.slice(leading).trimEnd();\n const start = i + 1 + leading;\n const end = start + value.length;\n return {start, end, value};\n }\n escaped = false;\n }\n return null;\n}\n\n/**\n * \u5728\u8303\u56F4\u5185\u5BFB\u627E throws \u7684\u53C2\u6570\u8D77\u70B9\u3002\n * @param lines \u6587\u6863\u884C\u5185\u5BB9\n * @param startLine \u8D77\u59CB\u884C\n * @param startChar \u8D77\u59CB\u5217\n * @param endLine \u7ED3\u675F\u884C\n * @param endChar \u7ED3\u675F\u5217\n * @returns throws \u53C2\u6570\u8D77\u59CB\u4F4D\u7F6E\n */\nexport function findThrowsStartInRange(\n lines: string[],\n startLine: number,\n startChar: number,\n endLine: number,\n endChar: number\n): {line: number; char: number} | null {\n let seenThrows = false;\n for (let line = startLine; line < lines.length; line++) {\n if (line > endLine) {\n break;\n }\n const lineText = lines[line];\n const searchStart = line === startLine ? startChar : 0;\n const searchEnd = line === endLine ? endChar : lineText.length;\n const segment = lineText.slice(searchStart, searchEnd);\n if (!seenThrows) {\n const idx = segment.indexOf('throws');\n if (idx !== -1) {\n seenThrows = true;\n const parenIdx = segment.indexOf('(', idx + 'throws'.length);\n if (parenIdx !== -1) {\n return {line, char: searchStart + parenIdx};\n }\n }\n } else {\n const parenIdx = segment.indexOf('(');\n if (parenIdx !== -1) {\n return {line, char: searchStart + parenIdx};\n }\n }\n }\n return null;\n}\n\n/**\n * \u6784\u5EFA const \u503C\u8303\u56F4\u4E0E\u6587\u672C\u3002\n * @param lines \u6587\u6863\u884C\u5185\u5BB9\n * @param startLine \u8D77\u59CB\u884C\n * @param endLine \u7ED3\u675F\u884C\n * @param eqLine \u7B49\u53F7\u6240\u5728\u884C\n * @param eqChar \u7B49\u53F7\u6240\u5728\u5217\n * @returns const \u503C\u8303\u56F4\u4E0E\u6587\u672C\n */\nexport function buildConstValueRange(\n lines: string[],\n _startLine: number,\n endLine: number,\n eqLine: number,\n eqChar: number\n): {range?: Range; value: string} {\n if (eqLine < 0 || eqChar < 0) {\n return {range: undefined, value: ''};\n }\n const start = findFirstNonWhitespaceAfter(lines, eqLine, eqChar, endLine);\n const end = findLastNonWhitespaceUpTo(lines, eqLine, endLine);\n if (!start || !end) {\n return {range: undefined, value: ''};\n }\n const range = new Range(start.line, start.char, end.line, end.char);\n return {range, value: sliceTextByRange(lines, range)};\n}\n\n/**\n * \u8BA1\u7B97\u521D\u59CB\u5316\u8868\u8FBE\u5F0F\u8303\u56F4\u3002\n * @param line \u539F\u59CB\u884C\u6587\u672C\n * @param codeOnly \u53BB\u6CE8\u91CA\u540E\u7684\u6587\u672C\n * @param initializer \u521D\u59CB\u5316\u8868\u8FBE\u5F0F\n * @param lineNumber \u884C\u53F7\n * @returns \u521D\u59CB\u5316\u8303\u56F4\n */\nexport function findInitializerRange(\n line: string,\n codeOnly: string,\n initializer: string | undefined,\n lineNumber: number\n): Range | undefined {\n if (initializer === undefined || initializer === '') {\n return undefined;\n }\n const codeIndex = line.indexOf(codeOnly);\n if (codeIndex === -1) {\n return undefined;\n }\n const eqIndex = codeOnly.indexOf('=');\n if (eqIndex === -1) {\n return undefined;\n }\n const initText = initializer.trim();\n const afterEq = codeOnly.slice(eqIndex + 1);\n const leading = afterEq.match(/^\\s*/)?.[0].length ?? 0;\n const startChar = codeIndex + eqIndex + 1 + leading;\n const endChar = startChar + initText.length;\n return new Range(lineNumber, startChar, lineNumber, endChar);\n}\n\n/**\n * \u8BA1\u7B97\u540D\u79F0\u8303\u56F4\u3002\n * @param line \u539F\u59CB\u884C\u6587\u672C\n * @param lineNumber \u884C\u53F7\n * @param name \u540D\u79F0\u6587\u672C\n * @param codeOnly \u53BB\u6CE8\u91CA\u540E\u7684\u6587\u672C\n * @returns \u540D\u79F0\u8303\u56F4\n */\nexport function findNameRangeInLine(\n line: string,\n lineNumber: number,\n name: string,\n codeOnly: string\n): Range | undefined {\n const codeIndex = line.indexOf(codeOnly);\n const searchStart = codeIndex >= 0 ? codeIndex : 0;\n return findWordRangeInLine(line, lineNumber, name, searchStart);\n}\n\n/**\n * \u5728\u884C\u5185\u641C\u7D22\u5355\u8BCD\u8303\u56F4\u3002\n * @param line \u539F\u59CB\u884C\u6587\u672C\n * @param lineNumber \u884C\u53F7\n * @param word \u76EE\u6807\u5355\u8BCD\n * @param searchStart \u8D77\u59CB\u5217\n * @returns \u5355\u8BCD\u8303\u56F4\n */\nexport function findWordRangeInLine(\n line: string,\n lineNumber: number,\n word: string,\n searchStart: number\n): Range | undefined {\n if (!word) {\n return undefined;\n }\n const escaped = escapeRegExp(word);\n const regex = new RegExp(`\\\\b${escaped}\\\\b`, 'g');\n let match: RegExpExecArray | null;\n while ((match = regex.exec(line)) !== null) {\n if (match.index >= searchStart) {\n return new Range(lineNumber, match.index, lineNumber, match.index + word.length);\n }\n }\n return undefined;\n}\n\n/**\n * \u67E5\u627E\u7C7B\u578B\u6587\u672C\u7684\u8303\u56F4\u3002\n * @param line \u539F\u59CB\u884C\u6587\u672C\n * @param lineNumber \u884C\u53F7\n * @param typeText \u7C7B\u578B\u6587\u672C\n * @param searchStart \u8D77\u59CB\u5217\n * @returns \u7C7B\u578B\u8303\u56F4\n */\nexport function findTypeRangeInLine(\n line: string,\n lineNumber: number,\n typeText: string,\n searchStart: number\n): Range | undefined {\n if (!typeText) {\n return undefined;\n }\n const idx = line.indexOf(typeText, searchStart);\n if (idx >= 0) {\n return new Range(lineNumber, idx, lineNumber, idx + typeText.length);\n }\n return undefined;\n}\n", "import {Range} from '../types';\nimport * as nodes from './nodes.types';\nimport {createField} from './factory';\nimport {tokenizeText} from './tokenizer';\nimport {offsetToPosition, splitTopLevelCommasWithOffsets, stripLineComments} from './text-utils';\nimport {findDefaultValueRange} from './ranges';\n\nexport * from './text-utils';\nexport * from './ranges';\n\n/**\n * \u89E3\u6790\u5B57\u6BB5\u5217\u8868\u6587\u672C\u3002\n * @param text \u5B57\u6BB5\u6587\u672C\n * @param baseLine \u8D77\u59CB\u884C\n * @param baseChar \u8D77\u59CB\u5217\n * @returns \u5B57\u6BB5\u5217\u8868\n */\nexport function parseFieldList(text: string, baseLine: number, baseChar: number): nodes.Field[] {\n const fields: nodes.Field[] = [];\n const segments = splitTopLevelCommasWithOffsets(text);\n for (const seg of segments) {\n const leading = seg.text.match(/^\\s*/)?.[0].length ?? 0;\n const segmentText = stripLineComments(seg.text).trim();\n if (!segmentText) {\n continue;\n }\n const segmentStart = seg.start + leading;\n const segmentEnd = segmentStart + segmentText.length;\n const tokens = tokenizeText(segmentText).filter(token => token.type !== 'whitespace' && token.type !== 'comment');\n if (tokens.length === 0) {\n continue;\n }\n const idIndex = tokens.findIndex(token => token.type === 'number');\n if (idIndex === -1) {\n continue;\n }\n let colonIndex = -1;\n for (let i = idIndex + 1; i < tokens.length; i++) {\n if (tokens[i].type === 'symbol' && tokens[i].value === ':') {\n colonIndex = i;\n break;\n }\n }\n if (colonIndex === -1) {\n continue;\n }\n let cursor = colonIndex + 1;\n let requiredness: 'required' | 'optional' | undefined;\n if (tokens[cursor]?.type === 'identifier' &&\n (tokens[cursor].value === 'required' || tokens[cursor].value === 'optional')) {\n requiredness = tokens[cursor].value as 'required' | 'optional';\n cursor += 1;\n }\n const typeStartToken = tokens[cursor];\n if (typeStartToken === undefined) {\n continue;\n }\n let nameTokenIndex = -1;\n let angleDepth = 0;\n for (let i = cursor; i < tokens.length; i++) {\n const token = tokens[i];\n if (token.type === 'symbol') {\n if (token.value === '<') {\n angleDepth += 1;\n } else if (token.value === '>') {\n angleDepth = Math.max(0, angleDepth - 1);\n }\n if (angleDepth === 0 && (token.value === '=' || token.value === '(' || token.value === ',' || token.value === ';')) {\n break;\n }\n continue;\n }\n if (token.type === 'identifier') {\n nameTokenIndex = i;\n }\n }\n if (nameTokenIndex === -1) {\n continue;\n }\n const nameToken = tokens[nameTokenIndex];\n const fieldType = segmentText.slice(typeStartToken.start, nameToken.start).trim();\n if (!fieldType) {\n continue;\n }\n const defaultInfo = findDefaultValueRange(segmentText);\n const startPos = offsetToPosition(text, baseLine, baseChar, segmentStart);\n const endPos = offsetToPosition(text, baseLine, baseChar, segmentEnd);\n const nameStart = offsetToPosition(text, baseLine, baseChar, segmentStart + nameToken.start);\n const nameEnd = offsetToPosition(text, baseLine, baseChar, segmentStart + nameToken.end);\n const typeStart = offsetToPosition(text, baseLine, baseChar, segmentStart + typeStartToken.start);\n const typeEnd = offsetToPosition(text, baseLine, baseChar, segmentStart + nameToken.start);\n const defaultStart = defaultInfo ? offsetToPosition(text, baseLine, baseChar, segmentStart + defaultInfo.start) : null;\n const defaultEnd = defaultInfo ? offsetToPosition(text, baseLine, baseChar, segmentStart + defaultInfo.end) : null;\n const field = createField({\n range: new Range(startPos.line, startPos.char, endPos.line, endPos.char),\n nameRange: new Range(nameStart.line, nameStart.char, nameEnd.line, nameEnd.char),\n typeRange: new Range(typeStart.line, typeStart.char, typeEnd.line, typeEnd.char),\n id: parseInt(tokens[idIndex].value, 10),\n requiredness: requiredness ?? 'required',\n fieldType,\n name: nameToken.value,\n defaultValue: defaultInfo?.value,\n defaultValueRange: defaultStart && defaultEnd ? new Range(defaultStart.line, defaultStart.char, defaultEnd.line, defaultEnd.char) : undefined\n });\n fields.push(field);\n }\n return fields;\n}\n", "import {ThriftTokenizer, Token, tokenizeLine} from './tokenizer';\n\nexport type TokenWithIndex = Token & {index: number};\n\nexport function filterMeaningfulTokens(tokens: Token[]): Token[] {\n return tokens.filter(token => token.type !== 'whitespace' && token.type !== 'comment');\n}\n\nexport function getMeaningfulTokens(line: string, tokenizer?: ThriftTokenizer): Token[] {\n const tokens = tokenizer ? tokenizer.tokenizeLine(line) : tokenizeLine(line);\n return filterMeaningfulTokens(tokens);\n}\n\nexport function readQualifiedIdentifier(tokens: Token[], startIndex: number): {\n value: string;\n endIndex: number;\n startOffset: number;\n endOffset: number\n} | null {\n const first = tokens[startIndex];\n if (first === undefined || first.type !== 'identifier') {\n return null;\n }\n let value = first.value;\n let endIndex = startIndex + 1;\n let endOffset = first.end;\n while (tokens[endIndex] !== undefined && tokens[endIndex].type === 'symbol' && tokens[endIndex].value === '.' &&\n tokens[endIndex + 1] !== undefined && tokens[endIndex + 1].type === 'identifier') {\n value += '.' + tokens[endIndex + 1].value;\n endOffset = tokens[endIndex + 1].end;\n endIndex += 2;\n }\n return {\n value,\n endIndex,\n startOffset: first.start,\n endOffset\n };\n}\n\nexport function findFirstIdentifier(tokens: Token[], startIndex: number): TokenWithIndex | null {\n for (let i = startIndex; i < tokens.length; i++) {\n if (tokens[i].type === 'identifier') {\n return {...tokens[i], index: i};\n }\n }\n return null;\n}\n\nexport function findIdentifierIndex(tokens: Token[], value: string, startIndex: number): number {\n for (let i = startIndex; i < tokens.length; i++) {\n if (tokens[i].type === 'identifier' && tokens[i].value === value) {\n return i;\n }\n }\n return -1;\n}\n\nexport function findLastIdentifier(tokens: Token[], endIndex: number): TokenWithIndex | null {\n for (let i = Math.min(tokens.length, endIndex) - 1; i >= 0; i--) {\n if (tokens[i].type === 'identifier') {\n return {...tokens[i], index: i};\n }\n }\n return null;\n}\n\nexport function findSymbolIndex(tokens: Token[], value: string): number {\n for (let i = 0; i < tokens.length; i++) {\n if (tokens[i].type === 'symbol' && tokens[i].value === value) {\n return i;\n }\n }\n return -1;\n}\n\nexport function findSymbolIndexFrom(tokens: Token[], value: string, startIndex: number): number {\n for (let i = startIndex; i < tokens.length; i++) {\n if (tokens[i].type === 'symbol' && tokens[i].value === value) {\n return i;\n }\n }\n return -1;\n}\n", "import {Range} from '../types';\nimport * as nodes from './nodes.types';\nimport {config} from '../config';\nimport {\n clearAstCacheForDocument,\n clearExpiredAstCache,\n getCachedAstRange,\n parseWithAstCache,\n setCachedAst,\n setCachedAstRange\n} from './cache';\nimport {createLineRange, LineRange} from '../utils/line-range';\nimport {QuoteTracker} from '../utils/quote-tracker';\nimport {createField, createDocument, createStructBlock, createEnumBlock, createServiceBlock, createInteractionBlock} from './factory';\nimport {isExpired, isFresh} from '../utils/cache-expiry';\nimport {\n buildConstValueRange,\n findDefaultValueRange,\n findInitializerRange,\n findThrowsStartInRange,\n findTypeRangeInLine,\n findWordRangeInLine,\n parseFieldList,\n readParenthesizedText,\n stripTrailingAnnotation\n} from './parser-helpers';\nimport {\n filterMeaningfulTokens,\n findFirstIdentifier,\n findIdentifierIndex,\n findLastIdentifier,\n findSymbolIndex,\n findSymbolIndexFrom,\n readQualifiedIdentifier\n} from './token-utils';\nimport {ThriftTokenizer, Token, tokenizeLine} from './tokenizer';\n\nexport interface ParseRegion {\n startLine: number;\n endLine: number;\n}\n\nexport interface IncrementalParseResult {\n ast: nodes.ThriftDocument;\n affectedNodes: nodes.ThriftNode[];\n newNodes: nodes.ThriftNode[];\n}\n\nexport interface ParseContext {\n currentLine: number;\n lines: string[];\n token: ThriftTokenizer;\n}\n\nexport class ThriftParser {\n private static astByUri = new Map<string, {ast: nodes.ThriftDocument; timestamp: number}>();\n private text: string;\n private lines: string[];\n private currentLine = 0;\n private tokenizer: ThriftTokenizer;\n\n constructor(content: string | {getText(): string}) {\n this.text = typeof content === 'string' ? content : content.getText();\n this.lines = this.text.split(/\\r?\\n/);\n this.tokenizer = new ThriftTokenizer();\n }\n\n /**\n * \u5E26\u7F13\u5B58\u7684\u89E3\u6790\u5165\u53E3\uFF08\u57FA\u4E8E URI\u3001\u5185\u5BB9\u548C\u7248\u672C\u53F7\uFF09\u3002\n * \u4F7F\u7528 URI + \u7248\u672C\u53F7 + \u5185\u5BB9\u54C8\u5E0C \u4F5C\u4E3A\u7F13\u5B58\u952E\uFF0C\u63D0\u9AD8\u7F13\u5B58\u547D\u4E2D\u7387\u3002\n */\n public static parseWithCacheByVersion(uri: string, content: string, version?: number): nodes.ThriftDocument {\n const ast = parseWithAstCache(uri, content, () => {\n const parser = new ThriftParser(content);\n return parser.parse();\n }, version);\n\n ThriftParser.setCachedAstByUriUnsafe(uri, ast);\n return ast;\n }\n\n /** Backward-compatible alias: parseWithCache({getText(), uri: {toString()}}) */\n public static parseWithCache(doc: {getText(): string; uri: {toString(): string}}): nodes.ThriftDocument {\n return ThriftParser.parseWithCacheByVersion(doc.uri.toString(), doc.getText());\n }\n\n /**\n * \u5E26\u7F13\u5B58\u7684\u89E3\u6790\u5165\u53E3\uFF08\u57FA\u4E8E URI \u4E0E\u5185\u5BB9\uFF09\u3002\n * \u4F7F\u7528 URI + \u5185\u5BB9\u54C8\u5E0C \u4F5C\u4E3A\u7F13\u5B58\u952E\u3002\n */\n public static parseContentWithCache(uri: string, content: string): nodes.ThriftDocument {\n // \u4F7F\u7528\u4F18\u5316\u7684\u7F13\u5B58\u952E\uFF1AURI + \u5185\u5BB9\u54C8\u5E0C\n const ast = parseWithAstCache(uri, content, () => {\n const parser = new ThriftParser(content);\n return parser.parse();\n });\n\n ThriftParser.setCachedAstByUriUnsafe(uri, ast);\n return ast;\n }\n\n /**\n * \u6E05\u7406\u8FC7\u671F AST \u7F13\u5B58\u3002\n */\n public static clearExpiredCache(): void {\n clearExpiredAstCache();\n ThriftParser.clearExpiredAstByUriCache();\n }\n\n /**\n * \u6E05\u7406\u6307\u5B9A\u6587\u6863\u7684 AST \u7F13\u5B58\u3002\n */\n public static clearDocumentCache(uri: string): void {\n clearAstCacheForDocument(uri);\n ThriftParser.astByUri.delete(uri);\n }\n\n /**\n * \u89E3\u6790 Thrift \u6587\u672C\u4E3A AST\u3002\n */\n public parse(): nodes.ThriftDocument {\n const estimatedSize = Math.min(this.lines.length, 1000);\n const root = createDocument({\n range: this.createRange(0, 0, this.lines.length > 0 ? this.lines.length - 1 : 0,\n this.lines.length > 0 ? this.lines[this.lines.length - 1].length : 0),\n body: new Array<nodes.ThriftNode>(estimatedSize)\n });\n\n this.currentLine = 0;\n let bodyIndex = 0;\n while (this.currentLine < this.lines.length) {\n const node = this.parseNextNode(root);\n if (node) {\n if (bodyIndex >= root.body.length) {\n root.body.length = Math.min(root.body.length * 2, 100000);\n }\n root.body[bodyIndex++] = node;\n this.addChild(root, node);\n }\n }\n root.body.length = bodyIndex;\n\n return root;\n }\n\n private ensureChildren(node: nodes.ThriftNode): nodes.ThriftNode[] {\n return node.children ??= [];\n }\n\n private addChild(parent: nodes.ThriftNode, child: nodes.ThriftNode): void {\n const children = this.ensureChildren(parent);\n if (!children.includes(child)) {\n children.push(child);\n }\n }\n\n private scanLine(line: string): {stripped: string; tokens: Token[]} {\n const scan = this.tokenizer.scanLine(line);\n return {\n stripped: scan.stripped,\n tokens: filterMeaningfulTokens(scan.tokens)\n };\n }\n\n private countBraces(tokens: Token[]): {open: number; close: number} {\n let open = 0;\n let close = 0;\n for (const token of tokens) {\n if (token.type !== 'symbol') {\n continue;\n }\n if (token.value === '{') {\n open++;\n } else if (token.value === '}') {\n close++;\n }\n }\n return {open, close};\n }\n\n private parseNextNode(parent: nodes.ThriftNode): nodes.ThriftNode | null {\n if (this.currentLine >= this.lines.length) {\n return null;\n }\n\n const line = this.lines[this.currentLine];\n const scan = this.scanLine(line);\n const trimmed = scan.stripped.trim();\n\n // Skip empty lines and comments\n if (!trimmed) {\n this.currentLine++;\n return null;\n }\n\n const tokens = scan.tokens;\n if (tokens.length === 0) {\n this.currentLine++;\n return null;\n }\n\n const keywordToken = tokens[0];\n if (keywordToken.type !== 'identifier') {\n this.currentLine++;\n return null;\n }\n\n if (keywordToken.value === 'namespace') {\n const scope = readQualifiedIdentifier(tokens, 1);\n const namespace = scope ? readQualifiedIdentifier(tokens, scope.endIndex) : null;\n if (scope && namespace) {\n const node: nodes.Namespace = {\n type: nodes.ThriftNodeType.Namespace,\n range: this.createRange(this.currentLine, 0, this.currentLine, line.length),\n nameRange: this.createRange(this.currentLine, namespace.startOffset, this.currentLine, namespace.endOffset),\n parent: parent,\n scope: scope.value,\n namespace: namespace.value,\n name: namespace.value\n };\n this.currentLine++;\n return node;\n }\n const invalid = this.createInvalidNode(parent, line, 'Invalid namespace declaration');\n this.currentLine++;\n return invalid;\n }\n\n if (keywordToken.value === 'include') {\n const pathToken = tokens[1];\n if (pathToken !== undefined && pathToken.type === 'string') {\n const node: nodes.Include = {\n type: nodes.ThriftNodeType.Include,\n range: this.createRange(this.currentLine, 0, this.currentLine, line.length),\n parent: parent,\n path: pathToken.value,\n name: pathToken.value\n };\n this.currentLine++;\n return node;\n }\n const invalid = this.createInvalidNode(parent, line, 'Invalid include declaration');\n this.currentLine++;\n return invalid;\n }\n\n if (keywordToken.value === 'struct' || keywordToken.value === 'union' || keywordToken.value === 'exception') {\n const nameToken = findFirstIdentifier(tokens, 1);\n if (nameToken) {\n return this.parseStruct(parent, keywordToken.value, nameToken.value);\n }\n const invalid = this.createInvalidNode(parent, line, `Invalid ${keywordToken.value} declaration`);\n this.currentLine++;\n return invalid;\n }\n\n if (keywordToken.value === 'enum' || keywordToken.value === 'senum') {\n const nameToken = findFirstIdentifier(tokens, 1);\n if (nameToken) {\n return this.parseEnum(parent, nameToken.value, keywordToken.value === 'senum');\n }\n const invalid = this.createInvalidNode(parent, line, `Invalid ${keywordToken.value} declaration`);\n this.currentLine++;\n return invalid;\n }\n\n if (keywordToken.value === 'service') {\n const nameToken = findFirstIdentifier(tokens, 1);\n if (nameToken) {\n let extendsName: string | undefined;\n let extendsRange: Range | undefined;\n const extendsIndex = findIdentifierIndex(tokens, 'extends', nameToken.index + 1);\n if (extendsIndex !== -1) {\n const parentName = readQualifiedIdentifier(tokens, extendsIndex + 1);\n if (parentName) {\n extendsName = parentName.value;\n extendsRange = this.createRange(\n this.currentLine, parentName.startOffset,\n this.currentLine, parentName.endOffset\n );\n }\n }\n return this.parseService(parent, nameToken.value, extendsName, extendsRange);\n }\n const invalid = this.createInvalidNode(parent, line, 'Invalid service declaration');\n this.currentLine++;\n return invalid;\n }\n\n if (keywordToken.value === 'interaction') {\n const nameToken = findFirstIdentifier(tokens, 1);\n if (nameToken) {\n return this.parseInteraction(parent, nameToken.value);\n }\n const invalid = this.createInvalidNode(parent, line, 'Invalid interaction declaration');\n this.currentLine++;\n return invalid;\n }\n\n if (keywordToken.value === 'const') {\n const equalsIndex = findSymbolIndex(tokens, '=');\n if (equalsIndex !== -1) {\n const nameToken = findLastIdentifier(tokens, equalsIndex);\n if (nameToken) {\n const typeText = line.slice(keywordToken.end, nameToken.start).trim();\n if (typeText) {\n return this.parseConst(parent, typeText, nameToken.value);\n }\n }\n }\n const invalid = this.createInvalidNode(parent, line, 'Invalid const declaration');\n this.currentLine++;\n return invalid;\n }\n\n if (keywordToken.value === 'typedef') {\n const nameToken = findLastIdentifier(tokens, tokens.length);\n if (nameToken && nameToken.index > 0) {\n const keywordIndex = keywordToken.end;\n const aliasType = line.slice(keywordIndex, nameToken.start).trim();\n const node: nodes.Typedef = {\n type: nodes.ThriftNodeType.Typedef,\n range: this.createRange(this.currentLine, 0, this.currentLine, line.length),\n nameRange: this.createRange(this.currentLine, nameToken.start, this.currentLine, nameToken.end),\n parent: parent,\n aliasType: aliasType,\n aliasTypeRange: findTypeRangeInLine(line, this.currentLine, aliasType, keywordIndex),\n name: nameToken.value\n };\n this.currentLine++;\n return node;\n }\n const invalid = this.createInvalidNode(parent, line, 'Invalid typedef declaration');\n this.currentLine++;\n return invalid;\n }\n\n // Skip unrecognized lines\n this.currentLine++;\n return null;\n }\n\n private createInvalidNode(parent: nodes.ThriftNode, line: string, message: string): nodes.InvalidNode {\n return {\n type: nodes.ThriftNodeType.Invalid,\n range: this.createRange(this.currentLine, 0, this.currentLine, line.length),\n parent: parent,\n raw: line,\n message\n };\n }\n\n\n private parseStruct(parent: nodes.ThriftNode, structType: string, name: string): nodes.Struct {\n const startLine = this.currentLine;\n const type = structType === 'exception' ? nodes.ThriftNodeType.Exception :\n structType === 'union' ? nodes.ThriftNodeType.Union : nodes.ThriftNodeType.Struct;\n const line = this.lines[startLine];\n const keywordIndex = line.indexOf(structType);\n const searchStart = keywordIndex >= 0 ? keywordIndex + structType.length : 0;\n\n const structNode = createStructBlock({\n type,\n name,\n nameRange: findWordRangeInLine(line, startLine, name, searchStart),\n parent\n });\n\n // Parse body\n this.currentLine = this.parseStructBody(structNode);\n structNode.range = this.createRange(startLine, 0, this.currentLine,\n (this.lines[this.currentLine] ?? '').length);\n return structNode;\n }\n\n /**\n * \u901A\u7528\u7684\u5927\u62EC\u53F7\u5305\u88F9\u5757\u89E3\u6790\u5668\u3002\n * Phase 1: \u5B9A\u4F4D\u5F00\u62EC\u53F7 `{`\n * Phase 2: \u9010\u884C\u626B\u63CF\uFF0C\u8C03\u7528 bodyParser \u89E3\u6790\u5185\u5BB9\uFF0C\u76F4\u5230 braceCount \u5F52\u96F6\u3002\n */\n private parseBracedBlock(\n bodyParser: (line: string, scan: {stripped: string; tokens: Token[]}) => void\n ): number {\n let braceCount = 0;\n // Phase 1: Find opening brace\n while (this.currentLine < this.lines.length) {\n const line = this.lines[this.currentLine];\n const scan = this.scanLine(line);\n const braceStats = this.countBraces(scan.tokens);\n if (braceStats.open > 0) {\n braceCount += braceStats.open - braceStats.close;\n break;\n }\n this.currentLine++;\n }\n\n this.currentLine++; // Move past opening brace\n if (braceCount <= 0) {\n return this.currentLine;\n }\n\n // Phase 2: Parse body until closing brace\n while (this.currentLine < this.lines.length && braceCount > 0) {\n const line = this.lines[this.currentLine];\n const scan = this.scanLine(line);\n\n const braceStats = this.countBraces(scan.tokens);\n if (braceStats.open > 0 || braceStats.close > 0) {\n braceCount += braceStats.open - braceStats.close;\n if (braceCount <= 0) {\n this.currentLine++;\n break;\n }\n }\n\n bodyParser(line, scan);\n this.currentLine++;\n }\n\n return this.currentLine;\n }\n\n private parseStructBody(parent: nodes.Struct): number {\n // Phase 1: locate the opening brace; account for `{...}` closing on the same line\n let braceCount = 0;\n while (this.currentLine < this.lines.length) {\n const line = this.lines[this.currentLine];\n const scan = this.scanLine(line);\n const braces = this.countBraces(scan.tokens);\n if (braces.open > 0) {\n braceCount = braces.open - braces.close;\n break;\n }\n this.currentLine++;\n }\n this.currentLine++;\n if (braceCount <= 0) {\n return this.currentLine;\n }\n\n // Phase 2: parse fields with multi-line awareness, until struct body closes\n while (this.currentLine < this.lines.length) {\n const line = this.lines[this.currentLine];\n const scan = this.scanLine(line);\n const trimmed = scan.stripped.trim();\n\n // Struct body terminator is a top-level `}` on this line\n if (trimmed.startsWith('}')) {\n this.currentLine++;\n break;\n }\n\n if (!trimmed || scan.tokens.length === 0) {\n this.currentLine++;\n continue;\n }\n\n const startLine = this.currentLine;\n const field = this.parseStructFieldLine(parent, line, scan.stripped, scan.tokens);\n if (field) {\n const endLine = this.computeStructFieldEndLine(startLine);\n if (endLine > startLine) {\n field.range = this.createRange(\n startLine,\n 0,\n endLine,\n (this.lines[endLine] ?? '').length\n );\n }\n parent.fields.push(field);\n this.addChild(parent, field);\n this.currentLine = endLine + 1;\n } else {\n this.currentLine++;\n }\n }\n return this.currentLine;\n }\n\n /**\n * \u7ED9\u5B9A\u5B57\u6BB5\u8D77\u59CB\u884C\uFF0C\u8BA1\u7B97\u5176\u771F\u5B9E\u7ED3\u675F\u884C\uFF08\u8003\u8651\u8DE8\u884C default value \u4E0E\u5C3E\u90E8\u6CE8\u89E3\uFF09\u3002\n * \u5B57\u7B26\u7EA7\u626B\u63CF `[]`/`{}`/`()` \u5D4C\u5957\uFF1B\u9047\u5230 struct body \u81EA\u8EAB\u7684 `}`\uFF08\u6240\u6709 brace \u6DF1\u5EA6\u5F52\u96F6\u65F6\u51FA\u73B0\u7684 `}`\uFF09\u5219\u505C\u6B62\u3002\n * \u5185\u8054\u5904\u7406\u5B57\u7B26\u4E32\u5B57\u9762\u91CF\u4E0E\u5355\u884C/\u5757\u6CE8\u91CA\uFF0C\u907F\u514D\u4F9D\u8D56 tokenizer \u7684\u8DE8\u884C state\u3002\n */\n private computeStructFieldEndLine(startLine: number): number {\n let depthAngle = 0;\n let depthBracket = 0;\n let depthBrace = 0;\n let depthParen = 0;\n let inBlockComment = false;\n\n for (let li = startLine; li < this.lines.length; li++) {\n const stripped = this.stripCommentsAndStrings(this.lines[li], inBlockComment);\n inBlockComment = stripped.endsInBlockComment;\n const text = stripped.text;\n for (let i = 0; i < text.length; i++) {\n const ch = text[i];\n if (ch === '<') { depthAngle++; continue; }\n if (ch === '>') { depthAngle = Math.max(0, depthAngle - 1); continue; }\n if (ch === '[') { depthBracket++; continue; }\n if (ch === ']') { depthBracket = Math.max(0, depthBracket - 1); continue; }\n if (ch === '{') { depthBrace++; continue; }\n if (ch === '}') {\n if (depthBrace === 0) {\n return Math.max(startLine, li - 1);\n }\n depthBrace--;\n continue;\n }\n if (ch === '(') { depthParen++; continue; }\n if (ch === ')') { depthParen = Math.max(0, depthParen - 1); continue; }\n if (depthAngle === 0 && depthBracket === 0 && depthBrace === 0 && depthParen === 0\n && (ch === ',' || ch === ';')) {\n return li;\n }\n }\n if (!inBlockComment) {\n const next = this.findNextNonEmptyLineRaw(li + 1);\n if (next === -1) { return li; }\n const nextStripped = this.stripCommentsAndStrings(this.lines[next], false).text.trim();\n // Recovery: if the next line opens a new field, treat the current field as ended\n // here even when brackets are still unbalanced (malformed source).\n if (/^\\d+\\s*:/.test(nextStripped)) {\n return li;\n }\n if (depthAngle === 0 && depthBracket === 0 && depthBrace === 0 && depthParen === 0\n && nextStripped.startsWith('}')) {\n return li;\n }\n }\n }\n return this.lines.length - 1;\n }\n\n private findNextNonEmptyLineRaw(startIdx: number): number {\n for (let i = startIdx; i < this.lines.length; i++) {\n if (this.stripCommentsAndStrings(this.lines[i], false).text.trim()) {\n return i;\n }\n }\n return -1;\n }\n\n /**\n * \u53BB\u9664\u5B57\u7B26\u4E32\u5B57\u9762\u91CF\u5185\u5BB9\u4E0E\u6CE8\u91CA\uFF0C\u4EC5\u4FDD\u7559\u7ED3\u6784\u6027\u5B57\u7B26\uFF08\u62EC\u53F7\u3001\u9017\u53F7\u3001\u5206\u53F7\u7B49\uFF09\u3002\n * \u6CE8\u610F\uFF1A\u5B57\u7B26\u4E32\u5185\u5BB9\u88AB**\u79FB\u9664**\uFF08\u4E0D\u4FDD\u7559\u5360\u4F4D\u7B26\uFF09\uFF0C\u56E0\u6B64\u8FD4\u56DE\u7684 text \u4E0D\u53EF\u7528\u4E8E\n * \u5217\u4F4D\u7F6E\u8BA1\u7B97\u2014\u2014\u4EC5\u9002\u7528\u4E8E\u7ED3\u6784\u6027\u626B\u63CF\u3002\n * \u4E0D\u4FEE\u6539 this.tokenizer \u7684\u8DE8\u884C state\u3002\n */\n private stripCommentsAndStrings(line: string, inBlockComment: boolean): {text: string; endsInBlockComment: boolean} {\n let out = '';\n let i = 0;\n let block = inBlockComment;\n let escaped = false;\n while (i < line.length) {\n if (block) {\n const close = line.indexOf('*/', i);\n if (close === -1) {\n return {text: out, endsInBlockComment: true};\n }\n i = close + 2;\n block = false;\n continue;\n }\n const ch = line[i];\n const next = i + 1 < line.length ? line[i + 1] : '';\n if (ch === '/' && next === '*') {\n block = true;\n i += 2;\n continue;\n }\n if ((ch === '/' && next === '/') || ch === '#') {\n break;\n }\n if (ch === '\"' || ch === '\\'') {\n const quote = ch;\n i++;\n escaped = false;\n while (i < line.length) {\n const c = line[i];\n if (escaped) { escaped = false; i++; continue; }\n if (c === '\\\\') { escaped = true; i++; continue; }\n if (c === quote) { i++; break; }\n i++;\n }\n continue;\n }\n out += ch;\n i++;\n }\n return {text: out, endsInBlockComment: block};\n }\n\n private parseStructFieldLine(parent: nodes.Struct, line: string, cleanLine: string, tokens: Token[]): nodes.Field | null {\n const trimmed = cleanLine.trim();\n if (!trimmed) {\n return null;\n }\n if (tokens.length === 0) {\n return null;\n }\n const idIndex = tokens.findIndex(token => token.type === 'number');\n if (idIndex === -1) {\n return null;\n }\n const colonIndex = findSymbolIndexFrom(tokens, ':', idIndex + 1);\n if (colonIndex === -1) {\n return null;\n }\n let cursor = colonIndex + 1;\n let requiredness: 'required' | 'optional' | undefined;\n if (tokens[cursor]?.type === 'identifier' &&\n (tokens[cursor].value === 'required' || tokens[cursor].value === 'optional')) {\n requiredness = tokens[cursor].value as 'required' | 'optional';\n cursor += 1;\n }\n const typeStartToken = tokens[cursor];\n if (typeStartToken === undefined) {\n return null;\n }\n let nameTokenIndex = -1;\n let angleDepth = 0;\n for (let i = cursor; i < tokens.length; i++) {\n const token = tokens[i];\n if (token.type === 'symbol') {\n if (token.value === '<') {\n angleDepth += 1;\n } else if (token.value === '>') {\n angleDepth = Math.max(0, angleDepth - 1);\n }\n if (angleDepth === 0 && (token.value === '(' || token.value === '=' || token.value === ',' || token.value === ';')) {\n break;\n }\n continue;\n }\n if (token.type === 'identifier') {\n nameTokenIndex = i;\n }\n }\n if (nameTokenIndex === -1) {\n return null;\n }\n const nameToken = tokens[nameTokenIndex];\n const fieldType = cleanLine.slice(typeStartToken.start, nameToken.start).trim();\n if (!fieldType) {\n return null;\n }\n const valueTarget = stripTrailingAnnotation(cleanLine.replace(/[,;]\\s*$/, ''));\n const nameRange = this.createRange(\n this.currentLine,\n nameToken.start,\n this.currentLine,\n nameToken.end\n );\n const typeRange = this.createRange(\n this.currentLine,\n typeStartToken.start,\n this.currentLine,\n nameToken.start\n );\n const defaultInfo = findDefaultValueRange(valueTarget);\n const defaultStart = defaultInfo ? defaultInfo.start : null;\n const defaultEnd = defaultInfo ? defaultInfo.end : null;\n return createField({\n range: this.createRange(this.currentLine, 0, this.currentLine, line.length),\n nameRange,\n typeRange,\n parent,\n id: parseInt(tokens[idIndex].value, 10),\n requiredness,\n fieldType,\n name: nameToken.value,\n defaultValue: defaultInfo?.value,\n defaultValueRange: defaultStart !== null && defaultEnd !== null\n ? this.createRange(this.currentLine, defaultStart, this.currentLine, defaultEnd)\n : undefined\n });\n }\n\n private parseEnum(parent: nodes.ThriftNode, name: string, isSenum: boolean): nodes.Enum {\n const startLine = this.currentLine;\n const line = this.lines[startLine];\n const keywordIndex = line.indexOf(isSenum ? 'senum' : 'enum');\n const searchStart = keywordIndex >= 0 ? keywordIndex + (isSenum ? 'senum'.length : 'enum'.length) : 0;\n const enumNode = createEnumBlock({\n name,\n nameRange: findWordRangeInLine(line, startLine, name, searchStart),\n parent,\n isSenum\n });\n\n // Parse body\n this.currentLine = this.parseEnumBody(enumNode);\n enumNode.range = this.createRange(startLine, 0, this.currentLine,\n (this.lines[this.currentLine] ?? '').length);\n return enumNode;\n }\n\n private parseEnumBody(parent: nodes.Enum): number {\n return this.parseBracedBlock((line, scan) => {\n const member = this.parseEnumMemberLine(parent, line, scan.stripped, scan.tokens);\n if (member) {\n parent.members.push(member);\n this.addChild(parent, member);\n }\n });\n }\n\n private parseEnumMemberLine(parent: nodes.Enum, line: string, cleanLine: string, tokens: Token[]): nodes.EnumMember | null {\n const trimmed = cleanLine.trim();\n if (!trimmed) {\n return null;\n }\n if (tokens.length === 0) {\n return null;\n }\n const nameToken = tokens.find(token => token.type === 'identifier');\n if (!nameToken) {\n return null;\n }\n const equalsIndex = findSymbolIndex(tokens, '=');\n let initializer: string | undefined;\n let initializerRange: Range | undefined;\n if (equalsIndex !== -1) {\n let startOffset: number | null = null;\n let endOffset: number | null = null;\n let angleDepth = 0;\n let bracketDepth = 0;\n let braceDepth = 0;\n let parenDepth = 0;\n for (let i = equalsIndex + 1; i < tokens.length; i++) {\n const token = tokens[i];\n if (token.type === 'symbol') {\n if (token.value === '<') {\n angleDepth += 1;\n } else if (token.value === '>') {\n angleDepth = Math.max(0, angleDepth - 1);\n } else if (token.value === '[') {\n bracketDepth += 1;\n } else if (token.value === ']') {\n bracketDepth = Math.max(0, bracketDepth - 1);\n } else if (token.value === '{') {\n braceDepth += 1;\n } else if (token.value === '}') {\n braceDepth = Math.max(0, braceDepth - 1);\n } else if (token.value === '(') {\n parenDepth += 1;\n } else if (token.value === ')') {\n parenDepth = Math.max(0, parenDepth - 1);\n }\n if (angleDepth === 0 && bracketDepth === 0 && braceDepth === 0 && parenDepth === 0 &&\n (token.value === ',' || token.value === ';' || token.value === '(')) {\n break;\n }\n }\n startOffset ??= token.start;\n endOffset = token.end;\n }\n if (startOffset !== null && endOffset !== null) {\n const rawInitializer = cleanLine.slice(startOffset, endOffset).trim();\n const trimmed = stripTrailingAnnotation(rawInitializer.replace(/[,;]\\s*$/, '')).trim();\n initializer = trimmed || undefined;\n if (initializer !== undefined && initializer !== '') {\n initializerRange = this.createRange(\n this.currentLine,\n startOffset,\n this.currentLine,\n endOffset\n );\n }\n }\n }\n initializerRange ??= findInitializerRange(cleanLine, cleanLine, initializer, this.currentLine);\n const nameRange = this.createRange(\n this.currentLine,\n nameToken.start,\n this.currentLine,\n nameToken.end\n );\n return {\n type: nodes.ThriftNodeType.EnumMember,\n range: this.createRange(this.currentLine, 0, this.currentLine, line.length),\n nameRange,\n parent: parent,\n name: nameToken.value,\n initializer,\n initializerRange\n };\n }\n\n private parseService(parent: nodes.ThriftNode, name: string, extendsClass: string | undefined, extendsRange?: Range): nodes.Service {\n const startLine = this.currentLine;\n const line = this.lines[startLine];\n const keywordIndex = line.indexOf('service');\n const searchStart = keywordIndex >= 0 ? keywordIndex + 'service'.length : 0;\n const serviceNode = createServiceBlock({\n name,\n nameRange: findWordRangeInLine(line, startLine, name, searchStart),\n parent,\n extends: extendsClass,\n extendsRange\n });\n\n // Parse body\n this.currentLine = this.parseServiceBody(serviceNode);\n serviceNode.range = this.createRange(startLine, 0, this.currentLine,\n (this.lines[this.currentLine] ?? '').length);\n return serviceNode;\n }\n\n private parseInteraction(parent: nodes.ThriftNode, name: string): nodes.Interaction {\n const startLine = this.currentLine;\n const line = this.lines[startLine];\n const keywordIndex = line.indexOf('interaction');\n const searchStart = keywordIndex >= 0 ? keywordIndex + 'interaction'.length : 0;\n const interactionNode = createInteractionBlock({\n name,\n nameRange: findWordRangeInLine(line, startLine, name, searchStart),\n parent\n });\n\n this.currentLine = this.parseInteractionBody(interactionNode);\n interactionNode.range = this.createRange(startLine, 0, this.currentLine,\n (this.lines[this.currentLine] ?? '').length);\n return interactionNode;\n }\n\n private parseInteractionBody(parent: nodes.Interaction): number {\n return this.parseBracedBlock((line, scan) => {\n const funcParsed = this.parseServiceFunctionLine(line, scan.stripped, scan.tokens);\n if (funcParsed) {\n const funcNode = this.buildFunctionNode(parent, funcParsed, line);\n if (funcNode) {\n parent.functions.push(funcNode);\n this.addChild(parent, funcNode);\n }\n }\n });\n }\n\n private parseServiceBody(parent: nodes.Service): number {\n return this.parseBracedBlock((line, scan) => {\n const funcParsed = this.parseServiceFunctionLine(line, scan.stripped, scan.tokens);\n if (funcParsed) {\n const funcNode = this.buildFunctionNode(parent, funcParsed, line);\n if (funcNode) {\n parent.functions.push(funcNode);\n this.addChild(parent, funcNode);\n }\n } else {\n const perfNode = this.parsePerforms(parent, line, scan.stripped, scan.tokens);\n if (perfNode) {\n (parent.performs ??= []).push(perfNode);\n this.addChild(parent, perfNode);\n }\n }\n });\n }\n\n /**\n * Scan a line for throws clause starting at `start`, return the index after the throws block.\n */\n private skipThrowsBlock(line: string, start: number): number {\n if (line.substring(start, start + 6) !== 'throws') {\n return start;\n }\n let throwsParenCount = 0;\n let j = start + 6;\n for (; j < line.length; j++) {\n if (line[j] === '(') {\n throwsParenCount++;\n } else if (line[j] === ')') {\n throwsParenCount--;\n if (throwsParenCount === 0) {\n j++;\n break;\n }\n }\n }\n while (j < line.length && /\\s/.test(line[j])) {\n j++;\n }\n return j;\n }\n\n /**\n * Find function signature end by scanning for the closing paren after args,\n * then skipping any throws clause and trailing whitespace.\n */\n private findFunctionEnd(\n startLine: number,\n startChar: number,\n initialParenCount: number\n ): {endLine: number; endChar: number} | null {\n let parenCount = initialParenCount;\n for (let lineNum = startLine; lineNum < this.lines.length; lineNum++) {\n const text = this.lines[lineNum];\n const colStart = lineNum === startLine ? startChar : 0;\n for (let i = colStart; i < text.length; i++) {\n if (text[i] === '(') {\n parenCount++;\n } else if (text[i] === ')') {\n parenCount--;\n if (parenCount === 0) {\n const j = this.skipThrowsBlock(text, i + 1);\n if (j < text.length && (text[j] === ',' || text[j] === ';' || text[j] === '{')) {\n return {endLine: lineNum, endChar: j + 1};\n }\n }\n }\n }\n }\n return null;\n }\n\n /**\n * Parse throws clause if present between args end and function end.\n */\n private parseFunctionThrows(\n argsEndLine: number,\n argsEndChar: number,\n funcEndLine: number,\n funcEndChar: number\n ): {fields: nodes.Field[]; endLine: number; endChar: number} {\n const throwsFields: nodes.Field[] = [];\n let resultEndLine = funcEndLine;\n let resultEndChar = funcEndChar;\n\n const throwsStart = findThrowsStartInRange(\n this.lines, argsEndLine, argsEndChar, funcEndLine, funcEndChar\n );\n if (throwsStart) {\n const throwsResult = readParenthesizedText(this.lines, throwsStart.line, throwsStart.char + 1);\n if (throwsResult) {\n throwsFields.push(...parseFieldList(throwsResult.text, throwsStart.line, throwsStart.char + 1));\n resultEndLine = throwsResult.endLine;\n resultEndChar = throwsResult.endChar;\n }\n }\n return {fields: throwsFields, endLine: resultEndLine, endChar: resultEndChar};\n }\n\n private buildFunctionNode(\n parent: nodes.ThriftNode,\n funcParsed: {\n name: string;\n returnType: string;\n nameRange: Range | undefined;\n returnTypeRange: Range | undefined;\n oneway: boolean;\n isStream: boolean;\n isSink: boolean;\n funcStartLine: number;\n funcStartChar: number;\n funcEndLine: number;\n funcEndChar: number;\n },\n line: string\n ): nodes.ThriftFunction | null {\n const {\n name,\n returnType,\n nameRange,\n returnTypeRange,\n oneway,\n isStream,\n isSink,\n funcStartLine,\n funcStartChar\n } = funcParsed;\n let funcEndLine = funcParsed.funcEndLine;\n let funcEndChar = funcParsed.funcEndChar;\n\n const args: nodes.Field[] = [];\n const parenStartPos = line.indexOf('(');\n let argResult: {text: string; endLine: number; endChar: number} | null = null;\n if (parenStartPos !== -1) {\n argResult = readParenthesizedText(this.lines, this.currentLine, parenStartPos + 1);\n if (argResult) {\n args.push(...parseFieldList(argResult.text, this.currentLine, parenStartPos + 1));\n funcEndLine = argResult.endLine;\n funcEndChar = this.lines[argResult.endLine] ? this.lines[argResult.endLine].length : 0;\n }\n }\n\n const end = this.findFunctionEnd(funcStartLine, funcStartChar, 0);\n if (end) {\n funcEndLine = end.endLine;\n funcEndChar = end.endChar;\n }\n\n const argsEndLine = argResult ? argResult.endLine : funcStartLine;\n const argsEndChar = argResult ? argResult.endChar + 1 : Math.max(parenStartPos + 1, funcStartChar);\n const throws = this.parseFunctionThrows(argsEndLine, argsEndChar, funcEndLine, funcEndChar);\n funcEndLine = throws.endLine;\n funcEndChar = throws.endChar;\n\n const funcNode: nodes.ThriftFunction = {\n type: nodes.ThriftNodeType.Function,\n range: this.createRange(funcStartLine, funcStartChar, funcEndLine, funcEndChar),\n nameRange,\n parent: parent,\n name,\n returnType,\n returnTypeRange,\n oneway,\n isStream: isStream || undefined,\n isSink: isSink || undefined,\n arguments: args,\n throws: throws.fields\n };\n\n args.forEach(arg => {\n arg.parent = funcNode;\n this.addChild(funcNode, arg);\n });\n throws.fields.forEach(field => {\n field.parent = funcNode;\n this.addChild(funcNode, field);\n });\n\n return funcNode;\n }\n\n /**\n * \u89E3\u6790 service \u6216 interaction \u4E2D\u7684 performs \u58F0\u660E\u3002\n */\n private parsePerforms(parent: nodes.ThriftNode, line: string, cleanLine: string, tokens: Token[]): nodes.Performs | null {\n const trimmed = cleanLine.trim();\n if (!trimmed || tokens.length === 0) {\n return null;\n }\n if (tokens[0].type !== 'identifier' || tokens[0].value !== 'performs') {\n return null;\n }\n const nameToken = tokens[1];\n if (nameToken === undefined || nameToken.type !== 'identifier') {\n return null;\n }\n const nameRange = this.createRange(\n this.currentLine,\n nameToken.start,\n this.currentLine,\n nameToken.end\n );\n return {\n type: nodes.ThriftNodeType.Performs,\n range: this.createRange(this.currentLine, 0, this.currentLine, line.length),\n nameRange,\n parent: parent,\n name: nameToken.value,\n interactionName: nameToken.value,\n interactionNameRange: nameRange\n };\n }\n\n private parseServiceFunctionLine(line: string, cleanLine: string, tokens: Token[]): {\n name: string;\n returnType: string;\n nameRange: Range | undefined;\n returnTypeRange: Range | undefined;\n oneway: boolean;\n isStream: boolean;\n isSink: boolean;\n funcStartLine: number;\n funcStartChar: number;\n funcEndLine: number;\n funcEndChar: number;\n } | null {\n const trimmed = cleanLine.trim();\n if (!trimmed) {\n return null;\n }\n if (tokens.length === 0) {\n return null;\n }\n const parenIndex = findSymbolIndex(tokens, '(');\n if (parenIndex === -1) {\n return null;\n }\n let nameTokenIndex = -1;\n for (let i = parenIndex - 1; i >= 0; i--) {\n if (tokens[i].type === 'identifier') {\n nameTokenIndex = i;\n break;\n }\n }\n if (nameTokenIndex === -1) {\n return null;\n }\n const oneway = tokens[0].type === 'identifier' && tokens[0].value === 'oneway';\n let returnTypeStartIndex = oneway ? 1 : 0;\n let isStream = false;\n let isSink = false;\n // Check for stream/sink prefix after oneway\n if (returnTypeStartIndex < tokens.length && tokens[returnTypeStartIndex].type === 'identifier') {\n if (tokens[returnTypeStartIndex].value === 'stream') {\n isStream = true;\n returnTypeStartIndex += 1;\n } else if (tokens[returnTypeStartIndex].value === 'sink') {\n isSink = true;\n returnTypeStartIndex += 1;\n }\n }\n const returnTypeStartToken = tokens[returnTypeStartIndex];\n if (returnTypeStartToken === undefined || returnTypeStartIndex >= nameTokenIndex) {\n return null;\n }\n const nameToken = tokens[nameTokenIndex];\n // Include stream/sink keyword in return type string\n const typeStart = isStream ? returnTypeStartIndex - 1 : (isSink ? returnTypeStartIndex - 1 : returnTypeStartIndex);\n const returnType = cleanLine.slice(tokens[typeStart].start, nameToken.start).trim();\n if (!returnType) {\n return null;\n }\n const funcStartLine = this.currentLine;\n const funcStartChar = tokens[typeStart].start;\n const nameRange = this.createRange(\n funcStartLine,\n nameToken.start,\n funcStartLine,\n nameToken.end\n );\n const returnTypeRange = this.createRange(\n funcStartLine,\n tokens[typeStart].start,\n funcStartLine,\n nameToken.start\n );\n return {\n name: nameToken.value,\n returnType,\n nameRange,\n returnTypeRange,\n oneway,\n isStream,\n isSink,\n funcStartLine,\n funcStartChar,\n funcEndLine: funcStartLine,\n funcEndChar: line.length\n };\n }\n\n private parseConst(parent: nodes.ThriftNode, valueType: string, name: string): nodes.Const {\n const startLine = this.currentLine;\n const line = this.lines[startLine];\n const keywordIndex = line.indexOf('const');\n const searchStart = keywordIndex >= 0 ? keywordIndex + 'const'.length : 0;\n let endLine = this.currentLine;\n let depthBrace = 0;\n let depthBracket = 0;\n let depthParen = 0;\n let seenEquals = false;\n let eqLine = -1;\n let eqChar = -1;\n const qt = new QuoteTracker();\n\n while (endLine < this.lines.length) {\n const line = this.lines[endLine];\n for (let i = 0; i < line.length; i++) {\n const ch = line[i];\n if (qt.inside()) {\n qt.feed(ch);\n continue;\n }\n if (ch === '\\'' || ch === '\"') {\n qt.feed(ch);\n continue;\n }\n if (ch === '=' && !seenEquals) {\n seenEquals = true;\n if (eqLine === -1) {\n eqLine = endLine;\n eqChar = i;\n }\n continue;\n }\n if (!seenEquals) {\n continue;\n }\n if (ch === '{') {\n depthBrace++;\n }\n if (ch === '}') {\n depthBrace = Math.max(0, depthBrace - 1);\n }\n if (ch === '[') {\n depthBracket++;\n }\n if (ch === ']') {\n depthBracket = Math.max(0, depthBracket - 1);\n }\n if (ch === '(') {\n depthParen++;\n }\n if (ch === ')') {\n depthParen = Math.max(0, depthParen - 1);\n }\n }\n\n if (seenEquals && depthBrace === 0 && depthBracket === 0 && depthParen === 0) {\n break;\n }\n endLine++;\n }\n\n const valueRangeInfo = buildConstValueRange(this.lines, startLine, endLine, eqLine, eqChar);\n const constNode: nodes.Const = {\n type: nodes.ThriftNodeType.Const,\n range: this.createRange(startLine, 0, endLine, (this.lines[endLine] ?? '').length),\n nameRange: findWordRangeInLine(line, startLine, name, searchStart),\n parent: parent,\n valueType: valueType,\n valueTypeRange: findTypeRangeInLine(line, startLine, valueType, searchStart),\n name: name,\n value: valueRangeInfo.value,\n valueRange: valueRangeInfo.range\n };\n\n this.currentLine = endLine + 1;\n return constNode;\n }\n\n /**\n * \u89E3\u6790\u6307\u5B9A\u884C\u8303\u56F4\u7684\u5185\u5BB9\uFF0C\u7528\u4E8E\u589E\u91CF\u89E3\u6790\u3002\n */\n public parseRange(startLine: number, endLine: number): nodes.ThriftNode[] {\n const nodesInRange: nodes.ThriftNode[] = [];\n\n // Adjust bounds to ensure they are valid\n const actualStartLine = Math.max(0, Math.min(startLine, this.lines.length - 1));\n const actualEndLine = Math.max(actualStartLine, Math.min(endLine, this.lines.length - 1));\n\n // Save current state to restore after parsing range\n const originalCurrentLine = this.currentLine;\n\n this.currentLine = actualStartLine;\n\n while (this.currentLine <= actualEndLine && this.currentLine < this.lines.length) {\n const line = this.lines[this.currentLine];\n if (line.trim()) { // Only parse non-empty lines\n // Create a temporary parent for range parsing\n const tempParent = createDocument({\n range: this.createRange(actualStartLine, 0, actualEndLine,\n (this.lines[actualEndLine] ?? '').length),\n body: []\n }) as nodes.ThriftNode;\n\n const node = this.parseNextNode(tempParent);\n if (node) {\n nodesInRange.push(node);\n }\n } else {\n this.currentLine++;\n }\n }\n\n // Restore original state\n this.currentLine = originalCurrentLine;\n\n return nodesInRange;\n }\n\n /**\n * \u66F4\u65B0\u5206\u6790\u53D7\u66F4\u6539\u5F71\u54CD\u7684\u533A\u57DF\uFF08\u6269\u5C55\u810F\u533A\u7B97\u6CD5\uFF09\uFF0C\u73B0\u5728\u5177\u6709\u66F4\u7CBE\u786E\u7684\u4F9D\u8D56\u5206\u6790\u3002\n *\n * Token \u9A71\u52A8\uFF1A\u6240\u6709\u82B1\u62EC\u53F7 / \u5173\u952E\u5B57 / \u7EC8\u6B62\u7B26\u5224\u5B9A\u90FD\u57FA\u4E8E tokenizer \u89E3\u6790\u540E\u7684 token \u6D41\uFF0C\n * \u907F\u514D\u5B57\u7B26\u4E32\u5B57\u9762\u91CF\uFF08\u5982 `const Msg = {\"key\": \"{value}\"}` \u4E2D\u7684 `{` / `}`\uFF09\u88AB\u8BEF\u8BA1\u5165\n * \u82B1\u62EC\u53F7\u6DF1\u5EA6\uFF0C\u5BFC\u81F4\u810F\u533A\u8FB9\u754C\u5224\u65AD\u9519\u8BEF\u3002\n */\n public analyzeAffectedRegion(startLine: number, endLine: number): {start: number; end: number} {\n let affectedStart = startLine;\n let affectedEnd = endLine;\n\n // \u4E0A\u884C\u626B\u63CF\uFF1A\u5B9A\u4F4D\u5305\u542B startLine \u7684\u9876\u7EA7\u58F0\u660E\n for (let line = startLine; line >= 0 && line > startLine - 50; line--) {\n const text = this.lines[line];\n if (text === undefined) {\n continue;\n }\n const tokens = this.tokenizeLineMeaningful(text);\n if (tokens.length === 0) {\n continue;\n }\n if (isTopLevelDeclaration(tokens) || hasSymbolToken(tokens, '{')) {\n affectedStart = line;\n\n // \u4E0B\u884C\u626B\u63CF\uFF1A\u57FA\u4E8E token \u8BA1\u6570\u82B1\u62EC\u53F7\u6DF1\u5EA6\uFF08\u5FFD\u7565\u5B57\u7B26\u4E32/\u6CE8\u91CA\u5185\u7684\u5B57\u7B26\uFF09\n let braceDepth = 0;\n for (let searchLine = line; searchLine < this.lines.length && searchLine < line + 100; searchLine++) {\n const sText = this.lines[searchLine];\n if (sText === undefined) {\n continue;\n }\n const sTokens = this.tokenizeLineMeaningful(sText);\n const braces = this.countBraces(sTokens);\n braceDepth += braces.open - braces.close;\n if (braceDepth <= 0) {\n affectedEnd = Math.max(affectedEnd, searchLine);\n break;\n }\n }\n break;\n }\n }\n\n // \u4E0B\u884C\u626B\u63CF\uFF1A\u6269\u5C55\u5230\u5305\u542B `}` \u6216\u4EE5 `;` / `,` \u7EC8\u6B62\u7684\u884C\n for (let line = endLine; line < this.lines.length && line < endLine + 20; line++) {\n const text = this.lines[line];\n if (text === undefined) {\n continue;\n }\n const tokens = this.tokenizeLineMeaningful(text);\n if (hasSymbolToken(tokens, '}') || endsWithStatementTerminator(tokens)) {\n affectedEnd = line;\n break;\n }\n }\n\n return {start: affectedStart, end: affectedEnd};\n }\n\n /**\n * \u5355\u884C\u65E0\u72B6\u6001 tokenize\uFF08\u4E0D\u4F9D\u8D56 `this.tokenizer` \u7684\u8DE8\u884C\u5757\u6CE8\u91CA\u72B6\u6001\uFF09\u3002\n * \u7528\u4E8E `analyzeAffectedRegion` \u8FD9\u7C7B\u4ECE\u6587\u6863\u4E2D\u95F4\u5F00\u59CB\u626B\u63CF\u7684\u573A\u666F\u3002\n */\n private tokenizeLineMeaningful(line: string): Token[] {\n return filterMeaningfulTokens(tokenizeLine(line));\n }\n\n /**\n * \u5206\u6790 AST \u8282\u70B9\u4E4B\u95F4\u7684\u4F9D\u8D56\u5173\u7CFB\u3002\n */\n public analyzeDependencies(ast: nodes.ThriftDocument): Map<nodes.ThriftNode, nodes.ThriftNode[]> {\n const dependencies = new Map<nodes.ThriftNode, nodes.ThriftNode[]>();\n\n // Build O(1) type-name lookup from ast.body\n const typeIndex = new Map<string, nodes.ThriftNode>();\n for (const node of ast.body) {\n if (node.name !== undefined &&\n (node.type === nodes.ThriftNodeType.Struct ||\n node.type === nodes.ThriftNodeType.Enum ||\n node.type === nodes.ThriftNodeType.Typedef ||\n node.type === nodes.ThriftNodeType.Service)) {\n typeIndex.set(node.name, node);\n }\n }\n\n for (const node of ast.body) {\n const nodeDeps: nodes.ThriftNode[] = [];\n\n if (node.type === nodes.ThriftNodeType.Service) {\n const service = node;\n for (const func of service.functions) {\n this.addTypeDependency(typeIndex, func.returnType, nodeDeps);\n for (const arg of func.arguments) {\n this.addTypeDependency(typeIndex, arg.fieldType, nodeDeps);\n }\n for (const thr of func.throws) {\n this.addTypeDependency(typeIndex, thr.fieldType, nodeDeps);\n }\n }\n } else if (node.type === nodes.ThriftNodeType.Struct ||\n node.type === nodes.ThriftNodeType.Exception ||\n node.type === nodes.ThriftNodeType.Union) {\n const structLike = node;\n for (const field of structLike.fields) {\n this.addTypeDependency(typeIndex, field.fieldType, nodeDeps);\n }\n } else if (node.type === nodes.ThriftNodeType.Const) {\n const constNode = node;\n this.addTypeDependency(typeIndex, constNode.valueType, nodeDeps);\n }\n\n if (nodeDeps.length > 0) {\n dependencies.set(node, nodeDeps);\n }\n }\n\n return dependencies;\n }\n\n private addTypeDependency(typeIndex: Map<string, nodes.ThriftNode>, typeStr: string | undefined, deps: nodes.ThriftNode[]): void {\n if (typeStr === undefined || typeStr === '') {\n return;\n }\n\n const typeMatches = typeStr.match(/[a-zA-Z_][a-zA-Z0-9_]*/g) ?? [];\n for (const typeName of typeMatches) {\n const dep = typeIndex.get(typeName);\n if (dep !== undefined && !deps.includes(dep)) {\n deps.push(dep);\n }\n }\n }\n\n /**\n * \u4ECE\u89E3\u6790\u4E0A\u4E0B\u6587\u4E2D\u6062\u590D\u89E3\u6790\u72B6\u6001\u3002\n */\n public saveParseContext(): ParseContext {\n return {\n currentLine: this.currentLine,\n lines: this.lines,\n token: this.tokenizer\n };\n }\n\n /**\n * \u6062\u590D\u89E3\u6790\u4E0A\u4E0B\u6587\u3002\n */\n public restoreParseContext(context: ParseContext): void {\n this.currentLine = context.currentLine;\n this.lines = context.lines;\n this.tokenizer = context.token;\n }\n\n /**\n * \u5E26\u7F13\u5B58\u7684\u589E\u91CF\u89E3\u6790\u5165\u53E3\u3002\n */\n public static incrementalParseWithCache(doc: {getText(): string; uri: {toString(): string}}, dirtyRange: LineRange): IncrementalParseResult | null;\n public static incrementalParseWithCache(uri: string, content: string, dirtyRange: LineRange): IncrementalParseResult | null;\n public static incrementalParseWithCache(\n uriOrDoc: string | {getText(): string; uri: {toString(): string}},\n contentOrRange: string | LineRange,\n dirtyRange?: LineRange\n ): IncrementalParseResult | null {\n let uri: string;\n let content: string;\n let range: LineRange;\n if (typeof uriOrDoc === 'string') {\n uri = uriOrDoc;\n content = contentOrRange as string;\n range = dirtyRange!;\n } else {\n uri = uriOrDoc.uri.toString();\n content = uriOrDoc.getText();\n range = contentOrRange as LineRange;\n }\n return ThriftParser._incrementalParseWithCache(uri, content, range);\n }\n\n private static _incrementalParseWithCache(\n uri: string,\n content: string,\n dirtyRange: LineRange\n ): IncrementalParseResult | null {\n\n let fullAst = ThriftParser.getCachedAstByUriUnsafe(uri);\n if (!fullAst) {\n fullAst = parseWithAstCache(uri, content, () => {\n const parser = new ThriftParser(content);\n return parser.parse();\n });\n ThriftParser.setCachedAstByUriUnsafe(uri, fullAst);\n }\n\n // Determine affected range based on changes\n const parser = new ThriftParser(content);\n const affectedRange = parser.analyzeAffectedRegion(dirtyRange.startLine, dirtyRange.endLine);\n\n // Try to get cached AST for the affected range\n const rangeContent = parser.extractRangeContent(affectedRange.start, affectedRange.end);\n let newNodes = getCachedAstRange(uri,\n createLineRange(affectedRange.start, affectedRange.end),\n rangeContent\n );\n\n const affectedNodes: nodes.ThriftNode[] = [];\n\n newNodes ??= parser.parseRange(affectedRange.start, affectedRange.end);\n\n // Identify which existing nodes in the full AST overlap with the affected range\n for (const node of fullAst.body) {\n if (node.range.start.line <= affectedRange.end && node.range.end.line >= affectedRange.start) {\n affectedNodes.push(node);\n }\n }\n\n const incrementalResult: IncrementalParseResult = {\n ast: fullAst,\n affectedNodes: affectedNodes,\n newNodes: newNodes\n };\n\n const mergedAst = parser.mergeIncrementalResults(fullAst, incrementalResult);\n setCachedAstRange(uri,\n createLineRange(affectedRange.start, affectedRange.end),\n rangeContent,\n newNodes\n );\n setCachedAst(uri, content, mergedAst);\n ThriftParser.setCachedAstByUriUnsafe(uri, mergedAst);\n\n return {\n ...incrementalResult,\n ast: mergedAst\n };\n }\n\n /**\n * Helper method to extract content for a specific range\n */\n private extractRangeContent(startLine: number, endLine: number): string {\n return this.lines.slice(startLine, endLine + 1).join('\\n');\n }\n\n /**\n * \u5408\u5E76\u589E\u91CF\u89E3\u6790\u7ED3\u679C\u5230\u5B8C\u6574 AST \u4E2D\u3002\n */\n public mergeIncrementalResults(\n fullAst: nodes.ThriftDocument,\n incrementalResult: IncrementalParseResult\n ): nodes.ThriftDocument {\n // NOTE: do NOT short-circuit on empty newNodes \u2014 deletions produce exactly that case\n // (affectedNodes non-empty, newNodes empty). We must always apply the diff so that\n // deleted nodes are removed from the body.\n\n // If nothing changed at all, return the original AST unchanged\n if (incrementalResult.newNodes.length === 0 && incrementalResult.affectedNodes.length === 0) {\n return fullAst;\n }\n\n // Create a copy of the full AST to avoid modifying the original\n const updatedAst: nodes.ThriftDocument = {\n ...fullAst,\n body: [...fullAst.body]\n };\n\n // Remove affected nodes that will be replaced\n if (incrementalResult.affectedNodes.length > 0) {\n updatedAst.body = updatedAst.body.filter(node =>\n !incrementalResult.affectedNodes.some(affectedNode =>\n this.rangesOverlap(affectedNode.range, node.range)\n )\n );\n }\n\n // Add or update the new nodes in the appropriate positions\n for (const newNode of incrementalResult.newNodes) {\n this.reparentNode(updatedAst, newNode);\n // Find the position where this node should be inserted based on line numbers\n let inserted = false;\n\n for (let i = 0; i < updatedAst.body.length; i++) {\n if (updatedAst.body[i].range.start.line > newNode.range.start.line) {\n updatedAst.body.splice(i, 0, newNode);\n inserted = true;\n break;\n }\n }\n\n // If not inserted yet, append to the end\n if (!inserted) {\n updatedAst.body.push(newNode);\n }\n }\n\n // Re-sort the body by line number to maintain order\n updatedAst.body.sort((a, b) => a.range.start.line - b.range.start.line);\n\n return updatedAst;\n }\n\n private rangesOverlap(a: Range, b: Range): boolean {\n return a.start.line <= b.end.line && a.end.line >= b.start.line;\n }\n\n /**\n * \u83B7\u53D6\u7F13\u5B58\u4E2D\u7684 AST\uFF08\u6309 URI\uFF0C\u5FFD\u7565\u5185\u5BB9\u5339\u914D\uFF09\u3002\n * \u6CE8\u610F\uFF1A\u8BE5\u65B9\u6CD5\u53EF\u80FD\u8FD4\u56DE\u4E0E\u5F53\u524D\u6587\u6863\u5185\u5BB9\u4E0D\u4E00\u81F4\u7684 AST\uFF0C\u4EC5\u7528\u4E8E\u589E\u91CF\u89E3\u6790\u7B49\u5BB9\u9519\u573A\u666F\u3002\n */\n private static getCachedAstByUriUnsafe(uri: string): nodes.ThriftDocument | null {\n const cached = ThriftParser.astByUri.get(uri);\n if (cached && isFresh(cached.timestamp, config.cache.astMaxAgeMs)) {\n return cached.ast;\n }\n return null;\n }\n\n private static setCachedAstByUriUnsafe(uri: string, ast: nodes.ThriftDocument): void {\n ThriftParser.astByUri.set(uri, {ast, timestamp: Date.now()});\n }\n\n private static clearExpiredAstByUriCache(): void {\n const now = Date.now();\n for (const [uri, entry] of Array.from(ThriftParser.astByUri.entries())) {\n if (isExpired(entry.timestamp, config.cache.astMaxAgeMs, now)) {\n ThriftParser.astByUri.delete(uri);\n }\n }\n }\n\n private reparentNode(parent: nodes.ThriftNode, node: nodes.ThriftNode): void {\n node.parent = parent;\n const children = this.getChildNodes(node);\n children.forEach(child => this.reparentNode(node, child));\n }\n\n private getChildNodes(node: nodes.ThriftNode): nodes.ThriftNode[] {\n const result = new Set<nodes.ThriftNode>();\n\n if (node.children) {\n node.children.forEach(child => result.add(child));\n }\n\n if (node.type === nodes.ThriftNodeType.Document) {\n (node.body ?? []).forEach(child => result.add(child));\n } else if (node.type === nodes.ThriftNodeType.Enum) {\n (node.members ?? []).forEach(child => result.add(child));\n } else if (\n node.type === nodes.ThriftNodeType.Struct ||\n node.type === nodes.ThriftNodeType.Union ||\n node.type === nodes.ThriftNodeType.Exception\n ) {\n (node.fields ?? []).forEach(child => result.add(child));\n } else if (node.type === nodes.ThriftNodeType.Service) {\n (node.functions ?? []).forEach(child => result.add(child));\n (node.performs ?? []).forEach(child => result.add(child));\n } else if (node.type === nodes.ThriftNodeType.Interaction) {\n (node.functions ?? []).forEach(child => result.add(child));\n } else if (node.type === nodes.ThriftNodeType.Function) {\n (node.arguments ?? []).forEach(child => result.add(child));\n (node.throws ?? []).forEach(child => result.add(child));\n }\n\n return Array.from(result);\n }\n\n private createRange(startLine: number, startChar: number, endLine: number, endChar: number): Range {\n return new Range(startLine, startChar, endLine, endChar);\n }\n}\n\n/**\n * \u9876\u7EA7\u58F0\u660E\u5173\u952E\u5B57\u96C6\u5408\u3002\u7528\u4E8E `analyzeAffectedRegion` \u4E0A\u884C\u626B\u63CF\u65F6\u8BC6\u522B\u810F\u533A\u6240\u5C5E\u7684\u58F0\u660E\u3002\n */\nconst TOP_LEVEL_DECL_KEYWORDS = new Set<string>([\n 'struct', 'service', 'interaction', 'enum', 'union', 'exception'\n]);\n\n/**\n * \u5224\u65AD token \u6D41\u662F\u5426\u4EE5\u9876\u7EA7\u58F0\u660E\u5F00\u5934\uFF0C\u5373 `keyword + identifier` \u6A21\u5F0F\u3002\n * \u66FF\u4EE3\u6B63\u5219 `/\\b(struct|service|interaction|enum|union|exception)\\s+\\w+/`\u3002\n */\nfunction isTopLevelDeclaration(tokens: Token[]): boolean {\n for (let i = 0; i < tokens.length - 1; i++) {\n const t = tokens[i];\n if (t.type === 'identifier' && TOP_LEVEL_DECL_KEYWORDS.has(t.value)) {\n const next = tokens[i + 1];\n if (next.type === 'identifier') {\n return true;\n }\n }\n }\n return false;\n}\n\n/**\n * \u68C0\u67E5 token \u6D41\u4E2D\u662F\u5426\u5305\u542B\u67D0\u4E2A symbol\u3002\u590D\u7528\u4E00\u6B21\u6027\u904D\u5386\uFF0C\u907F\u514D\u5BF9\u539F\u59CB\u5B57\u7B26\u4E32\u518D\u505A `match` / `includes`\uFF0C\n * \u4E5F\u80FD\u81EA\u52A8\u5FFD\u7565\u5B57\u7B26\u4E32\u5B57\u9762\u91CF\u5185\u51FA\u73B0\u7684\u540C\u540D\u5B57\u7B26\u3002\n */\nfunction hasSymbolToken(tokens: Token[], value: string): boolean {\n for (const t of tokens) {\n if (t.type === 'symbol' && t.value === value) {\n return true;\n }\n }\n return false;\n}\n\n/**\n * \u5224\u65AD\u6700\u540E\u4E00\u4E2A\u6709\u6548 token \u662F\u5426\u662F\u8BED\u53E5\u7EC8\u6B62\u7B26 (`;` \u6216 `,`)\u3002\n * \u66FF\u4EE3 `text.trim().endsWith(';')` / `endsWith(',')` \u2014\u2014 \u5B57\u7B26\u4E32\u5B57\u9762\u91CF\u5185\u7684\u6807\u70B9\u4E0D\u4F1A\u88AB\u8BEF\u5224\u3002\n */\nfunction endsWithStatementTerminator(tokens: Token[]): boolean {\n const last = tokens[tokens.length - 1];\n if (last === undefined || last.type !== 'symbol') {\n return false;\n }\n return last.value === ';' || last.value === ',';\n}\n", "import {Range, Position} from '../types';\nimport * as nodes from './nodes.types';\n\n/**\n * \u6536\u96C6 include \u8282\u70B9\u3002\n */\nexport function collectIncludes(doc: nodes.ThriftDocument): nodes.Include[] {\n return doc.body.filter((node): node is nodes.Include => node.type === nodes.ThriftNodeType.Include);\n}\n\n/**\n * \u6536\u96C6\u9876\u5C42\u7C7B\u578B\u8282\u70B9\u3002\n */\nexport function collectTopLevelTypes(doc: nodes.ThriftDocument): nodes.ThriftNode[] {\n return doc.body.filter(node =>\n node.type === nodes.ThriftNodeType.Struct ||\n node.type === nodes.ThriftNodeType.Union ||\n node.type === nodes.ThriftNodeType.Exception ||\n node.type === nodes.ThriftNodeType.Enum ||\n node.type === nodes.ThriftNodeType.Service ||\n node.type === nodes.ThriftNodeType.Typedef ||\n node.type === nodes.ThriftNodeType.Const\n );\n}\n\n/**\n * \u6DF1\u5EA6\u904D\u5386 AST\u3002\n */\nexport function walkNodes(node: nodes.ThriftNode, cb: (node: nodes.ThriftNode) => void): void {\n cb(node);\n if (node.type === nodes.ThriftNodeType.Document) {\n node.body.forEach(child => walkNodes(child, cb));\n return;\n }\n if (node.type === nodes.ThriftNodeType.Struct ||\n node.type === nodes.ThriftNodeType.Union ||\n node.type === nodes.ThriftNodeType.Exception) {\n node.fields.forEach(field => walkNodes(field, cb));\n return;\n }\n if (node.type === nodes.ThriftNodeType.Enum) {\n node.members.forEach(member => walkNodes(member, cb));\n return;\n }\n if (node.type === nodes.ThriftNodeType.Service) {\n node.functions.forEach(fn => walkNodes(fn, cb));\n return;\n }\n if (node.type === nodes.ThriftNodeType.Function) {\n node.arguments.forEach(arg => walkNodes(arg, cb));\n node.throws.forEach(thr => walkNodes(thr, cb));\n }\n}\n\n/**\n * \u5224\u65AD\u4F4D\u7F6E\u662F\u5426\u5728 range \u5185\u3002\n */\nexport function positionInRange(range: Range, position: Position): boolean {\n const {start, end} = range;\n if (position.line < start.line || position.line > end.line) {\n return false;\n }\n if (position.line === start.line && position.character < start.character) {\n return false;\n }\n if (position.line === end.line && position.character > end.character) {\n return false;\n }\n return true;\n}\n\n/**\n * \u8BA1\u7B97 range \u7684\u6392\u5E8F\u6743\u91CD\uFF08\u8D8A\u5C0F\u8D8A\u7CBE\u786E\uFF09\u3002\n */\nexport function rangeSize(range: Range): number {\n const lineSpan = range.end.line - range.start.line;\n const charSpan = range.end.character - range.start.character;\n return lineSpan * 100000 + charSpan;\n}\n\n/**\n * \u67E5\u627E\u5305\u542B\u6307\u5B9A\u4F4D\u7F6E\u7684\u6700\u5C0F\u8282\u70B9\u3002\n */\nexport function findSmallestNodeAtPosition(doc: nodes.ThriftDocument, position: Position): nodes.ThriftNode | undefined {\n let best: nodes.ThriftNode | undefined;\n walkNodes(doc, node => {\n if (!positionInRange(node.range, position)) {\n return;\n }\n if (!best) {\n best = node;\n return;\n }\n if (rangeSize(node.range) < rangeSize(best.range)) {\n best = node;\n }\n });\n return best;\n}\n\n/**\n * \u4ECE\u53F6\u5B50\u8282\u70B9\u5411\u4E0A\u6784\u5EFA\u8282\u70B9\u8DEF\u5F84\u3002\n */\nexport function nodePathFromLeaf(node: nodes.ThriftNode | undefined): nodes.ThriftNode[] {\n const path: nodes.ThriftNode[] = [];\n let current: nodes.ThriftNode | undefined = node;\n while (current) {\n path.push(current);\n current = current.parent;\n }\n return path;\n}\n", "import * as nodes from '../ast/nodes.types';\n\nexport interface AstIndex {\n structStarts: Map<number, nodes.Struct>;\n structFieldIndex: Map<number, nodes.Field>;\n /** start.line \u2192 end.line for multi-line struct fields (only when end > start) */\n structFieldEnds: Map<number, number>;\n enumStarts: Map<number, nodes.Enum>;\n enumMemberIndex: Map<number, nodes.EnumMember>;\n serviceStarts: Map<number, nodes.Service>;\n serviceFunctionIndex: Map<number, nodes.ThriftFunction>;\n interactionStarts: Map<number, nodes.Interaction>;\n constStarts: Map<number, nodes.Const>;\n constEnds: Map<number, number>;\n}\n\n/**\n * \u6784\u5EFA AST \u7D22\u5F15\uFF0C\u4FBF\u4E8E\u6309\u884C\u5B9A\u4F4D\u7ED3\u6784\u4F53/\u679A\u4E3E/\u670D\u52A1/\u5E38\u91CF\u8282\u70B9\u3002\n * @param ast Thrift \u6587\u6863 AST\n * @returns AST \u7D22\u5F15\n */\nexport function buildAstIndex(ast: nodes.ThriftDocument): AstIndex {\n const structStarts = new Map<number, nodes.Struct>();\n const structFieldIndex = new Map<number, nodes.Field>();\n const structFieldEnds = new Map<number, number>();\n const enumStarts = new Map<number, nodes.Enum>();\n const enumMemberIndex = new Map<number, nodes.EnumMember>();\n const serviceStarts = new Map<number, nodes.Service>();\n const serviceFunctionIndex = new Map<number, nodes.ThriftFunction>();\n const interactionStarts = new Map<number, nodes.Interaction>();\n const constStarts = new Map<number, nodes.Const>();\n const constEnds = new Map<number, number>();\n\n const visit = (node: nodes.ThriftNode) => {\n switch (node.type) {\n case nodes.ThriftNodeType.Struct:\n case nodes.ThriftNodeType.Union:\n case nodes.ThriftNodeType.Exception: {\n const structNode = node;\n structStarts.set(structNode.range.start.line, structNode);\n structNode.fields.forEach(field => {\n const startLine = field.range.start.line;\n const endLine = field.range.end.line;\n structFieldIndex.set(startLine, field);\n if (endLine > startLine) {\n structFieldEnds.set(startLine, endLine);\n // \u4E3A\u591A\u884C\u5B57\u6BB5\u7684\u6240\u6709\u4E2D\u95F4\u884C\u586B\u5145 structFieldIndex\uFF0C\n // \u4F7F struct-content.ts \u4E2D\u7684 fieldNode.range.start.line !== lineIndex\n // \u68C0\u67E5\u80FD\u5C06\u7EED\u884C\u6807\u8BB0\u4E3A\u5DF2\u5904\u7406\uFF0C\u907F\u514D\u5C06\u5176\u5F53\u4F5C\u72EC\u7ACB\u5B57\u6BB5\u89E3\u6790\u3002\n for (let li = startLine + 1; li <= endLine; li++) {\n if (!structFieldIndex.has(li)) {\n structFieldIndex.set(li, field);\n }\n }\n }\n });\n break;\n }\n case nodes.ThriftNodeType.Enum: {\n const enumNode = node;\n enumStarts.set(enumNode.range.start.line, enumNode);\n enumNode.members.forEach(member => {\n enumMemberIndex.set(member.range.start.line, member);\n });\n break;\n }\n case nodes.ThriftNodeType.Service: {\n const serviceNode = node;\n serviceStarts.set(serviceNode.range.start.line, serviceNode);\n serviceNode.functions.forEach(fn => {\n serviceFunctionIndex.set(fn.range.start.line, fn);\n });\n break;\n }\n case nodes.ThriftNodeType.Interaction: {\n const interactionNode = node;\n interactionStarts.set(interactionNode.range.start.line, interactionNode);\n break;\n }\n case nodes.ThriftNodeType.Const: {\n const constNode = node;\n constStarts.set(constNode.range.start.line, constNode);\n constEnds.set(constNode.range.start.line, constNode.range.end.line);\n break;\n }\n default:\n break;\n }\n };\n\n ast.body.forEach(visit);\n\n return {\n structStarts,\n structFieldIndex,\n structFieldEnds,\n enumStarts,\n enumMemberIndex,\n serviceStarts,\n serviceFunctionIndex,\n interactionStarts,\n constStarts,\n constEnds\n };\n}\n", "/**\n * \u8F7B\u91CF\u7EA7\u62EC\u53F7\u6DF1\u5EA6\u8DDF\u8E2A\u5668\uFF0C\u6D88\u9664\u5206\u6563\u5728\u591A\u5904\u7684\n * depthAngle/depthBracket/depthBrace/depthParen \u56DB\u53D8\u91CF\u6837\u677F\u4EE3\u7801\u3002\n * \u9010\u5B57\u7B26\u5582\u5165\uFF0C\u81EA\u52A8\u8DDF\u8E2A `<>`\u3001`[]`\u3001`{}`\u3001`()` \u5D4C\u5957\u6DF1\u5EA6\u3002\n */\nexport class BracketDepthTracker {\n private _angle = 0;\n private _bracket = 0;\n private _brace = 0;\n private _paren = 0;\n\n /** \u5582\u5165\u4E00\u4E2A\u5B57\u7B26\uFF0C\u66F4\u65B0\u62EC\u53F7\u6DF1\u5EA6\u3002 */\n feed(ch: string): void {\n switch (ch) {\n case '<': this._angle++; break;\n case '>': this._angle = Math.max(0, this._angle - 1); break;\n case '[': this._bracket++; break;\n case ']': this._bracket = Math.max(0, this._bracket - 1); break;\n case '{': this._brace++; break;\n case '}': this._brace = Math.max(0, this._brace - 1); break;\n case '(': this._paren++; break;\n case ')': this._paren = Math.max(0, this._paren - 1); break;\n }\n }\n\n /** \u6240\u6709\u62EC\u53F7\u6DF1\u5EA6\u662F\u5426\u90FD\u4E3A\u96F6\uFF08\u9876\u5C42\uFF09\u3002 */\n atTop(): boolean {\n return this._angle === 0 && this._bracket === 0 && this._brace === 0 && this._paren === 0;\n }\n\n /** \u83B7\u53D6\u5404\u6DF1\u5EA6\u503C\u3002 */\n get depths(): { angle: number; bracket: number; brace: number; paren: number } {\n return {\n angle: this._angle,\n bracket: this._bracket,\n brace: this._brace,\n paren: this._paren\n };\n }\n\n /** \u91CD\u7F6E\u6240\u6709\u6DF1\u5EA6\u5230\u96F6\u3002 */\n reset(): void {\n this._angle = 0;\n this._bracket = 0;\n this._brace = 0;\n this._paren = 0;\n }\n}\n", "import {ConstField, EnumField, StructField} from '../interfaces.types';\nimport * as nodes from '../ast/nodes.types';\nimport {QuoteTracker} from '../utils/quote-tracker';\nimport {BracketDepthTracker} from '../utils/bracket-depth-tracker';\n\n/**\n * \u62C6\u5206\u884C\u5185\u6CE8\u91CA\u3002\n * @param line \u539F\u59CB\u884C\u6587\u672C\n * @returns \u4EE3\u7801\u4E0E\u6CE8\u91CA\n */\nexport function splitLineComment(line: string): {code: string; comment: string} {\n const qt = new QuoteTracker();\n for (let i = 0; i < line.length; i++) {\n const ch = line[i];\n const next = i + 1 < line.length ? line[i + 1] : '';\n if (!qt.inside()) {\n if (ch === '/' && next === '/') {\n return {code: line.slice(0, i), comment: line.slice(i).trim()};\n }\n if (ch === '#') {\n return {code: line.slice(0, i), comment: line.slice(i).trim()};\n }\n }\n qt.feed(ch);\n }\n return {code: line, comment: ''};\n}\n\n/**\n * \u62C6\u5206\u5C3E\u90E8\u6CE8\u89E3\u3002\n * @param source \u539F\u59CB\u6587\u672C\n * @returns \u57FA\u7840\u6587\u672C\u4E0E\u6CE8\u89E3\u6587\u672C\n */\nexport function splitTrailingAnnotation(source: string): {base: string; annotation: string} {\n const trimmed = source.trimEnd();\n if (!trimmed.endsWith(')')) {\n return {base: source.trim(), annotation: ''};\n }\n const qt = new QuoteTracker();\n const stack: number[] = [];\n let lastPair: {start: number; end: number} | null = null;\n\n for (let i = 0; i < trimmed.length; i++) {\n const ch = trimmed[i];\n if (!qt.inside()) {\n if (ch === '(') {\n stack.push(i);\n continue;\n }\n if (ch === ')' && stack.length > 0) {\n const start = stack.pop() as number;\n if (stack.length === 0) {\n lastPair = {start, end: i};\n }\n continue;\n }\n }\n qt.feed(ch);\n }\n\n if (!lastPair) {\n return {base: source.trim(), annotation: ''};\n }\n const tail = trimmed.slice(lastPair.end + 1).trim();\n if (tail) {\n return {base: source.trim(), annotation: ''};\n }\n return {\n base: trimmed.slice(0, lastPair.start).trimEnd(),\n annotation: trimmed.slice(lastPair.start, lastPair.end + 1)\n };\n}\n\n/**\n * \u89C4\u8303\u5316\u7C7B\u578B\u5B57\u7B26\u4E32\u4E2D\u7684\u7A7A\u767D\u3002\n * @param type \u7C7B\u578B\u6587\u672C\n * @returns \u89C4\u8303\u5316\u540E\u7684\u7C7B\u578B\n */\nexport function normalizeType(type: string): string {\n const qt = new QuoteTracker();\n const out: string[] = [];\n let i = 0;\n while (i < type.length) {\n const ch = type[i];\n if (qt.inside()) {\n out.push(ch);\n qt.feed(ch);\n i++;\n continue;\n }\n if (ch === '\\'' || ch === '\"') {\n out.push(ch);\n qt.feed(ch);\n i++;\n continue;\n }\n // Consume whitespace before/after <, >, and around ,\n if (ch === '<' || ch === '>' || ch === ',') {\n // Trim trailing whitespace before the symbol\n while (out.length > 0 && out[out.length - 1] === ' ') {\n out.pop();\n }\n out.push(ch);\n // Skip whitespace after the symbol\n i++;\n while (i < type.length && type[i] === ' ') { i++; }\n continue;\n }\n out.push(ch);\n i++;\n }\n return out.join('');\n}\n\n/**\n * \u57FA\u4E8E AST \u6784\u5EFA\u7ED3\u6784\u4F53\u5B57\u6BB5\u63CF\u8FF0\u3002\n * @param line \u539F\u59CB\u884C\u6587\u672C\uFF08\u591A\u884C\u5B57\u6BB5\u65F6\u4E3A\u6574\u6BB5\u62FC\u63A5\u3001\u7528 \\n \u5206\u9694\uFF09\n * @param field AST \u5B57\u6BB5\u8282\u70B9\n * @returns \u7ED3\u6784\u4F53\u5B57\u6BB5\u4FE1\u606F\n */\nexport function buildStructFieldFromAst(line: string, field: nodes.Field): StructField | null {\n if (line.includes('\\n')) {\n return buildMultiLineStructFieldFromAst(line, field);\n }\n const {code, comment} = splitLineComment(line);\n let remainder = code.trim();\n let trailing = '';\n const suffixMatch = remainder.match(/^(.*?)([,;]\\s*)$/);\n if (suffixMatch) {\n remainder = suffixMatch[1].trim();\n trailing = suffixMatch[2].trim();\n }\n let annotation = '';\n const annSplit = splitTrailingAnnotation(remainder);\n if (annSplit.annotation) {\n remainder = annSplit.base;\n annotation = annSplit.annotation;\n }\n\n const qualifier = field.requiredness ?? '';\n const type = normalizeType(field.fieldType || '');\n const name = field.name ?? '';\n let suffix = '';\n if (field.defaultValue !== undefined) {\n suffix = ` = ${field.defaultValue}`;\n }\n if (trailing) {\n suffix += trailing;\n }\n\n if (!name || !type) {\n return null;\n }\n\n return {\n line: line.trim(),\n id: String(field.id),\n qualifier,\n type,\n name,\n suffix,\n comment,\n annotation\n };\n}\n\n/**\n * \u5904\u7406\u8DE8\u884C\u7684 struct field\u3002\n * \u8F93\u5165\u662F\u6E90\u6587\u4EF6\u4E2D field \u8D77\u59CB\u884C\u5230\u7ED3\u675F\u884C\u7684\u62FC\u63A5\uFF08\u7528 \\n \u5206\u9694\uFF09\u3002\n * \u8F93\u51FA\u7684 suffix \u4E2D\u4FDD\u7559 \\n\uFF0C\u5EF6\u7EED\u884C\u5DF2 trim \u524D\u5BFC\u7A7A\u767D\uFF0C\u7559\u5F85\u683C\u5F0F\u5316\u9636\u6BB5\u91CD\u65B0\u7F29\u8FDB\u3002\n */\nfunction buildMultiLineStructFieldFromAst(text: string, field: nodes.Field): StructField | null {\n const rawLines = text.split('\\n');\n const cleanedLines = rawLines.map(l => splitLineComment(l).code);\n const qualifier = field.requiredness ?? '';\n const type = normalizeType(field.fieldType || '');\n const name = field.name ?? '';\n if (!name || !type) {\n return null;\n }\n\n // \u63D0\u53D6\u9996\u884C\u884C\u5185\u6CE8\u91CA\n const firstLineComment = splitLineComment(rawLines[0]).comment;\n\n const firstLine = cleanedLines[0];\n const eqIdx = findTopLevelEqualsIndex(firstLine);\n if (eqIdx === -1) {\n // No `=` on the first line \u2014 fall back to single-line behavior on first line.\n return buildStructFieldFromAst(rawLines[0], field);\n }\n\n const lastIdx = cleanedLines.length - 1;\n let lastClean = cleanedLines[lastIdx].trimEnd();\n // \u63D0\u53D6\u6700\u540E\u4E00\u884C\u884C\u5185\u6CE8\u91CA\n const lastLineComment = splitLineComment(rawLines[lastIdx]).comment;\n let trailing = '';\n const tsMatch = lastClean.match(/([,;]\\s*)$/);\n if (tsMatch) {\n trailing = tsMatch[1].trim();\n lastClean = lastClean.slice(0, lastClean.length - tsMatch[1].length).trimEnd();\n }\n let annotation = '';\n const annSplit = splitTrailingAnnotation(lastClean);\n if (annSplit.annotation) {\n annotation = annSplit.annotation;\n lastClean = annSplit.base.trimEnd();\n }\n\n const firstDV = firstLine.slice(eqIdx + 1).trim();\n const dvParts: string[] = [firstDV];\n for (let i = 1; i < lastIdx; i++) {\n dvParts.push(cleanedLines[i].trim());\n }\n if (lastIdx > 0) {\n const lastDV = lastClean.trim();\n if (lastDV) {\n dvParts.push(lastDV);\n }\n }\n const defaultValueText = dvParts.join('\\n');\n\n let suffix = ` = ${defaultValueText}`;\n if (trailing) {\n suffix += trailing;\n }\n\n // \u5408\u5E76\u6CE8\u91CA\uFF1A\u4F18\u5148\u6700\u540E\u4E00\u884C\u6CE8\u91CA\uFF0C\u5176\u6B21\u9996\u884C\u6CE8\u91CA\n const comment = lastLineComment || firstLineComment;\n\n return {\n line: text.trim(),\n id: String(field.id),\n qualifier,\n type,\n name,\n suffix,\n comment,\n annotation\n };\n}\n\n/**\n * \u627E\u5230\u9996\u884C\u4E2D\u7684\u9876\u5C42 `=`\uFF08\u4E0D\u5728\u5B57\u7B26\u4E32\u3001`<>`\u3001`[]`\u3001`{}`\u3001`()` \u5185\uFF09\u3002\n */\nfunction findTopLevelEqualsIndex(text: string): number {\n const qt = new QuoteTracker();\n const bt = new BracketDepthTracker();\n for (let i = 0; i < text.length; i++) {\n const ch = text[i];\n if (!qt.inside()) {\n bt.feed(ch);\n if (ch === '=' && bt.atTop()) {\n return i;\n }\n }\n qt.feed(ch);\n }\n return -1;\n}\n\n/**\n * \u4ECE\u6587\u672C\u89E3\u6790\u7ED3\u6784\u4F53\u5B57\u6BB5\u4FE1\u606F\u3002\n * @param text \u5B57\u6BB5\u6587\u672C\n * @returns \u5B57\u6BB5\u4FE1\u606F\n */\nexport function parseStructFieldText(text: string): StructField | null {\n if (!text || text.length > 4000) {\n return null;\n }\n const {code, comment} = splitLineComment(text);\n let remainder = code.trim();\n\n const prefixMatch = remainder.match(/^\\s*(\\d+:\\s*(?:required|optional)?\\s*)(.*)$/);\n if (!prefixMatch) {\n return null;\n }\n const prefix = prefixMatch[1];\n remainder = prefixMatch[2]!;\n\n const idQualMatch = prefix.match(/^\\s*(\\d+):\\s*((?:required|optional)?)\\s*/);\n const id = idQualMatch ? idQualMatch[1] : '';\n const qualifier = idQualMatch ? idQualMatch[2] : '';\n\n let trailing = '';\n const suffixMatch = remainder.match(/^(.*?)([,;]\\s*)$/);\n if (suffixMatch) {\n remainder = suffixMatch[1].trim();\n trailing = suffixMatch[2].trim();\n }\n\n let annotation = '';\n const annSplit = splitTrailingAnnotation(remainder);\n if (annSplit.annotation) {\n remainder = annSplit.base;\n annotation = annSplit.annotation;\n }\n\n const fieldMatch = remainder.match(/^(.+?)\\s+([a-zA-Z_][a-zA-Z0-9_]*)(?:\\s*=\\s*(.+))?$/);\n if (!fieldMatch) {\n return null;\n }\n\n const type = normalizeType(fieldMatch[1].trim());\n const name = fieldMatch[2];\n const defaultValue = fieldMatch[3];\n\n let suffix = '';\n if (defaultValue) {\n suffix = ` = ${defaultValue.trim()}`;\n }\n if (trailing) {\n suffix += trailing;\n }\n\n return {\n line: text.trim(),\n id,\n qualifier,\n type,\n name,\n suffix,\n comment,\n annotation\n };\n}\n\n/**\n * \u5224\u65AD\u662F\u5426\u4E3A\u7ED3\u6784\u4F53\u5B57\u6BB5\u884C\u3002\n * @param line \u884C\u6587\u672C\n * @returns \u662F\u5426\u4E3A\u5B57\u6BB5\n */\nexport function isStructFieldText(line: string): boolean {\n const t = line.trimStart();\n const c = t.charCodeAt(0);\n if (!(c >= 48 && c <= 57)) {\n return false;\n }\n return /^\\s*\\d+:\\s*(?:required|optional)?\\s*.+$/.test(line);\n}\n\n/**\n * \u57FA\u4E8E AST \u6784\u5EFA\u679A\u4E3E\u5B57\u6BB5\u63CF\u8FF0\u3002\n * @param line \u539F\u59CB\u884C\u6587\u672C\n * @param member AST \u679A\u4E3E\u6210\u5458\n * @returns \u679A\u4E3E\u5B57\u6BB5\u4FE1\u606F\n */\nexport function buildEnumFieldFromAst(line: string, member: nodes.EnumMember): EnumField | null {\n const {code, comment} = splitLineComment(line);\n let remainder = code.trim();\n let trailing = '';\n const suffixMatch = remainder.match(/^(.*?)([,;]\\s*)$/);\n if (suffixMatch) {\n remainder = suffixMatch[1].trim();\n trailing = suffixMatch[2].trim();\n }\n\n let annotation = '';\n const annSplit = splitTrailingAnnotation(remainder);\n if (annSplit.annotation) {\n remainder = annSplit.base;\n annotation = annSplit.annotation;\n }\n\n let value = member.initializer;\n if (value === undefined || value === '') {\n const match = remainder.match(/=\\s*([^,;]+)\\s*$/);\n if (match) {\n value = match[1].trim();\n }\n }\n if (member.name === undefined || member.name === '') {\n return null;\n }\n\n return {\n line: line.trim(),\n name: member.name,\n value: value ?? '',\n suffix: trailing,\n comment,\n annotation\n };\n}\n\n/**\n * \u4ECE\u6587\u672C\u89E3\u6790\u679A\u4E3E\u5B57\u6BB5\u4FE1\u606F\u3002\n * @param text \u5B57\u6BB5\u6587\u672C\n * @returns \u679A\u4E3E\u5B57\u6BB5\u4FE1\u606F\n */\nexport function parseEnumFieldText(text: string): EnumField | null {\n if (!text) {\n return null;\n }\n const {code, comment} = splitLineComment(text);\n let remainder = code.trim();\n\n let trailing = '';\n const suffixMatch = remainder.match(/^(.*?)([,;]\\s*)$/);\n if (suffixMatch) {\n remainder = suffixMatch[1].trim();\n trailing = suffixMatch[2].trim();\n }\n\n let annotation = '';\n const annSplit = splitTrailingAnnotation(remainder);\n if (annSplit.annotation) {\n remainder = annSplit.base;\n annotation = annSplit.annotation;\n }\n\n const fieldMatch = remainder.match(/^([a-zA-Z_][a-zA-Z0-9_]*)\\s*(?:=\\s*(.+))?$/);\n if (!fieldMatch) {\n return null;\n }\n\n return {\n line: text.trim(),\n name: fieldMatch[1],\n value: (fieldMatch[2] || '').trim(),\n suffix: trailing,\n comment,\n annotation\n };\n}\n\n/**\n * \u5224\u65AD\u662F\u5426\u4E3A\u679A\u4E3E\u5B57\u6BB5\u884C\u3002\n * @param line \u884C\u6587\u672C\n * @returns \u662F\u5426\u4E3A\u679A\u4E3E\u5B57\u6BB5\n */\nexport function isEnumFieldText(line: string): boolean {\n const t = line.trimStart();\n const cc = t.charCodeAt(0);\n const isLetter = (cc >= 65 && cc <= 90) || (cc >= 97 && cc <= 122) || cc === 95;\n if (!isLetter) {\n return false;\n }\n return /^\\s*[a-zA-Z_][a-zA-Z0-9_]*\\s*=\\s*[-+]?(?:\\d+|0x[0-9a-fA-F]+)/i.test(line);\n}\n\n/**\n * \u89E3\u6790 const \u5B57\u6BB5\u4FE1\u606F\u3002\n * @param source \u5E38\u91CF\u6587\u672C\n * @returns const \u5B57\u6BB5\u4FE1\u606F\n */\nexport function parseConstFieldText(source: string): ConstField | null {\n if (!source) {\n return null;\n }\n const lines = source.split('\\n');\n const header = (lines[0] || '').trim();\n const m = header.match(/^const\\s+([\\w<>,\\s]+?)\\s+(\\w+)\\s*=\\s*(.*)$/);\n if (!m) {\n return null;\n }\n const type = normalizeType(m[1].trim());\n const name = m[2].trim();\n let firstValuePart = (m[3] || '').trim();\n\n let comment = '';\n const commentIdx = firstValuePart.indexOf('//');\n if (commentIdx >= 0) {\n comment = firstValuePart.slice(commentIdx).trim();\n firstValuePart = firstValuePart.slice(0, commentIdx).trim();\n }\n\n let value = firstValuePart;\n if (lines.length > 1) {\n const rest = lines.slice(1).map(l => l.trim()).join('\\n');\n value = (value ? value + '\\n' : '') + rest;\n }\n\n return {\n line: header,\n type,\n name,\n value,\n comment\n };\n}\n", "import {ConstField, ThriftFormattingOptions} from '../interfaces.types';\nimport {QuoteTracker} from '../utils/quote-tracker';\n\ntype IndentProvider = (level: number, options: ThriftFormattingOptions) => string;\n\ninterface ConstFormatDeps {\n getIndent: IndentProvider;\n}\n\n/**\n * Check if a single-line value is a collection delimited by [...] or {...},\n * correctly skipping brackets inside quoted strings.\n */\nfunction isInlineDelimitedCollection(value: string): boolean {\n if (value.length < 2) { return false; }\n const open = value[0];\n if (open !== '[' && open !== '{') { return false; }\n const close = open === '[' ? ']' : '}';\n const qt = new QuoteTracker();\n let depth = 0;\n for (let i = 0; i < value.length; i++) {\n const ch = value[i];\n if (qt.inside()) { qt.feed(ch); continue; }\n if (ch === '\\'' || ch === '\"') { qt.feed(ch); continue; }\n if (ch === open) { depth++; }\n if (ch === close) { depth--; }\n }\n return depth === 0 && value[value.length - 1] === close;\n}\n\n/**\n * Format const fields with alignment and collection expansion options.\n * @param fields - Const fields to format.\n * @param options - Formatting options.\n * @param indentLevel - Base indentation level for the const block.\n * @param deps - Formatting dependencies.\n * @returns Formatted const field lines.\n */\nexport function formatConstFields(\n fields: ConstField[],\n options: ThriftFormattingOptions,\n indentLevel: number,\n deps: ConstFormatDeps\n): string[] {\n if (fields.length === 0) {\n return [];\n }\n\n const collectionStyle = options.collectionStyle || 'preserve';\n const maxLineLength = options.maxLineLength || 100;\n\n const indent = deps.getIndent(indentLevel, options);\n const valueIndent = deps.getIndent(indentLevel + 1, options);\n const alignComments = options.alignComments;\n\n const adjFields = fields.map((f) => {\n let value = f.value;\n const isInlineCollection = !value.includes('\\n') && isInlineDelimitedCollection(value);\n\n let shouldExpand = false;\n if (isInlineCollection) {\n if (collectionStyle === 'multiline') {\n shouldExpand = true;\n } else if (collectionStyle === 'auto') {\n const inlineLine = `${indent}const ${f.type} ${f.name} = ${value}${f.comment ? ' ' + f.comment : ''}`;\n if (inlineLine.length > maxLineLength) {\n shouldExpand = true;\n }\n }\n }\n\n if (shouldExpand) {\n const open = value[0];\n const close = value[value.length - 1];\n const inner = value.substring(1, value.length - 1).trim();\n\n const items: string[] = [];\n let current = '';\n let depth = 0;\n let inString = false;\n let stringChar = '';\n for (let i = 0; i < inner.length; i++) {\n const ch = inner[i];\n const prev = i > 0 ? inner[i - 1] : '';\n if (inString) {\n current += ch;\n if (ch === stringChar && prev !== '\\\\') {\n inString = false;\n }\n continue;\n }\n if (ch === '\"' || ch === '\\'') {\n inString = true;\n stringChar = ch;\n current += ch;\n continue;\n }\n if (ch === '[' || ch === '{' || ch === '(') {\n depth++;\n current += ch;\n continue;\n }\n if (ch === ']' || ch === '}' || ch === ')') {\n depth--;\n current += ch;\n continue;\n }\n if (ch === ',' && depth === 0) {\n if (current.trim()) {\n items.push(current.trim());\n }\n current = '';\n } else {\n current += ch;\n }\n }\n if (current.trim()) {\n items.push(current.trim());\n }\n\n const lines: string[] = [open];\n for (let idx = 0; idx < items.length; idx++) {\n const comma = idx < items.length - 1 ? ',' : '';\n lines.push(items[idx] + comma);\n }\n lines.push(close);\n value = lines.join('\\n');\n }\n\n return {...f, value};\n });\n\n const maxTypeWidth = Math.max(...adjFields.map(f => f.type.length));\n const maxNameWidth = Math.max(...adjFields.map(f => f.name.length));\n\n let maxFirstLineBaseLen = 0;\n for (const f of adjFields) {\n if (!f.comment) {\n continue;\n }\n const firstLineValue = f.value.includes('\\n') ? f.value.split('\\n')[0] : f.value;\n const base = `const ${f.type.padEnd(maxTypeWidth)} ${f.name.padEnd(maxNameWidth)} = ${firstLineValue}`;\n if (base.length > maxFirstLineBaseLen) {\n maxFirstLineBaseLen = base.length;\n }\n }\n\n return adjFields.map(field => {\n const paddedType = field.type.padEnd(maxTypeWidth);\n const paddedName = field.name.padEnd(maxNameWidth);\n\n if (field.value.includes('\\n')) {\n const lines = field.value.split('\\n');\n const firstLine = lines[0];\n const outLines: string[] = [];\n\n let first = `${indent}const ${paddedType} ${paddedName} = ${firstLine}`;\n if (field.comment) {\n if (alignComments) {\n const currentLen = first.length - indent.length;\n const pad = Math.max(1, maxFirstLineBaseLen - currentLen + 1);\n first = first + ' '.repeat(pad) + field.comment;\n } else {\n first += ` ${field.comment}`;\n }\n }\n outLines.push(first);\n\n for (let i = 1; i < lines.length; i++) {\n const raw = lines[i];\n const line = raw.trim();\n if (!line) {\n outLines.push('');\n continue;\n }\n\n if (line === '}' || line === ']') {\n outLines.push(indent + line);\n continue;\n }\n\n if (line.startsWith('//')) {\n let idx = outLines.length - 1;\n while (idx >= 0 && outLines[idx] === '') {\n idx--;\n }\n if (idx >= 0) {\n outLines[idx] += ` ${line}`;\n } else {\n outLines.push(indent + line);\n }\n continue;\n }\n\n outLines.push(valueIndent + line);\n }\n\n if (alignComments) {\n const indices: number[] = [];\n let maxContentLen = 0;\n for (let idx = 1; idx < outLines.length; idx++) {\n const l = outLines[idx];\n const trimmed = l.trim();\n if (!trimmed || trimmed === '}' || trimmed === ']') {\n continue;\n }\n const m = l.match(/^(\\s*)(.*?)(\\s*)(\\/\\/.*)$/);\n if (m) {\n const leading = m[1] || '';\n const content = (m[2] || '').replace(/\\s+$/, '');\n const len = leading.length + content.length;\n if (len > maxContentLen) {\n maxContentLen = len;\n }\n indices.push(idx);\n }\n }\n if (indices.length > 0) {\n for (const idx of indices) {\n const l = outLines[idx];\n const m = l.match(/^(\\s*)(.*?)(\\s*)(\\/\\/.*)$/);\n if (!m) {\n continue;\n }\n const leading = m[1] || '';\n const content = (m[2] || '').replace(/\\s+$/, '');\n const comment = (m[4] || '').replace(/^\\s+/, '');\n const currentLen = leading.length + content.length;\n const pad = Math.max(1, maxContentLen - currentLen + 1);\n outLines[idx] = leading + content + ' '.repeat(pad) + comment;\n }\n }\n }\n\n return outLines.join('\\n');\n } else {\n let base = `${indent}const ${paddedType} ${paddedName} = ${field.value}`;\n if (field.comment) {\n if (alignComments) {\n const currentLen = base.length - indent.length;\n const pad = Math.max(1, maxFirstLineBaseLen - currentLen + 1);\n base = base + ' '.repeat(pad) + field.comment;\n } else {\n base += ` ${field.comment}`;\n }\n }\n return base;\n }\n });\n}\n", "import {ThriftFormattingOptions} from '../interfaces.types';\n\ntype IndentProvider = (level: number, options: ThriftFormattingOptions) => string;\n\ninterface CommentFormatDeps {\n getIndent: IndentProvider;\n getServiceIndent: IndentProvider;\n}\n\ninterface BlockCommentResult {\n formattedLines: string[];\n endIndex: number;\n}\n\n/**\n * Format a block comment starting at the given index.\n * @param lines - Full document lines.\n * @param startIndex - Index where the block comment starts.\n * @param indentLevel - Current indentation level.\n * @param inService - Whether the formatter is inside a service block.\n * @param serviceIndentLevel - Base indentation level for service blocks.\n * @param options - Formatting options.\n * @param deps - Formatting dependencies.\n * @returns Formatted block comment lines and the last index consumed, or null if not a block comment.\n */\nexport function formatBlockComment(\n lines: string[],\n startIndex: number,\n indentLevel: number,\n inService: boolean,\n serviceIndentLevel: number,\n options: ThriftFormattingOptions,\n deps: CommentFormatDeps\n): BlockCommentResult | null {\n const originalLine = lines[startIndex];\n const line = originalLine.trim();\n if (!line.startsWith('/*')) {\n return null;\n }\n\n const commentLines: string[] = [originalLine];\n let j = startIndex + 1;\n let closed = line.includes('*/');\n while (!closed && j < lines.length) {\n commentLines.push(lines[j]);\n if (lines[j].includes('*/')) {\n closed = true;\n }\n j++;\n }\n\n const indentStr = inService\n ? deps.getServiceIndent(serviceIndentLevel + 1, options)\n : deps.getIndent(indentLevel, options);\n\n if (commentLines.length === 1) {\n return {\n formattedLines: [indentStr + line],\n endIndex: startIndex\n };\n }\n\n const formattedLines: string[] = [];\n const openTrim = commentLines[0].trim();\n const openIsDoc = openTrim.startsWith('/**');\n const openToken = openIsDoc ? '/**' : '/*';\n const openRest = openTrim.slice(openToken.length);\n formattedLines.push(indentStr + openToken + openRest);\n\n for (let k = 1; k < commentLines.length - 1; k++) {\n let mid = commentLines[k].trim();\n if (mid.startsWith('*')) {\n mid = mid.slice(1);\n }\n mid = mid.replace(/^\\s*/, '');\n const alignmentSpace = ' ';\n if (mid.length > 0) {\n formattedLines.push(indentStr + alignmentSpace + '* ' + mid);\n } else {\n formattedLines.push(indentStr + alignmentSpace + '*');\n }\n }\n\n const closingSpace = ' ';\n formattedLines.push(indentStr + closingSpace + '*/');\n\n return {\n formattedLines,\n endIndex: j - 1\n };\n}\n", "import {EnumField, ThriftFormattingOptions} from '../interfaces.types';\nimport * as nodes from '../ast/nodes.types';\n\ntype IndentProvider = (level: number, options: ThriftFormattingOptions) => string;\ntype EnumFormatter = (fields: EnumField[], options: ThriftFormattingOptions, indentLevel: number) => string[];\ntype EnumFieldParser = (text: string) => EnumField | null;\ntype EnumFieldBuilder = (line: string, fieldNode: nodes.EnumMember) => EnumField | null;\ntype EnumFieldMatcher = (line: string) => boolean;\n\ninterface EnumContentDeps {\n getIndent: IndentProvider;\n formatEnumFields: EnumFormatter;\n buildEnumFieldFromAst: EnumFieldBuilder;\n parseEnumFieldText: EnumFieldParser;\n isEnumFieldText: EnumFieldMatcher;\n}\n\ninterface EnumContentResult {\n handled: boolean;\n inEnum: boolean;\n indentLevel: number;\n enumFields: EnumField[];\n formattedLines: string[];\n}\n\n/**\n * Format a line inside an enum block.\n * @param line - Current line (trimmed).\n * @param lineIndex - Current line index.\n * @param indentLevel - Current indentation level.\n * @param enumFields - Accumulated enum fields.\n * @param enumMemberIndex - AST index for enum members.\n * @param options - Formatting options.\n * @param deps - Formatting dependencies.\n * @returns Updated enum state and formatted output.\n */\nexport function formatEnumContentLine(\n line: string,\n lineIndex: number,\n indentLevel: number,\n enumFields: EnumField[],\n enumMemberIndex: Map<number, nodes.EnumMember>,\n options: ThriftFormattingOptions,\n deps: EnumContentDeps\n): EnumContentResult {\n if (line.startsWith('}')) {\n const formattedLines: string[] = [];\n if (enumFields.length > 0) {\n const formattedFields = deps.formatEnumFields(enumFields, options, indentLevel);\n formattedLines.push(...formattedFields);\n enumFields = [];\n }\n const nextIndent = indentLevel - 1;\n formattedLines.push(deps.getIndent(nextIndent, options) + line);\n return {\n handled: true,\n inEnum: false,\n indentLevel: nextIndent,\n enumFields,\n formattedLines\n };\n }\n\n const hasEnumField = enumMemberIndex.has(lineIndex) || deps.isEnumFieldText(line);\n const formattedLines: string[] = [];\n if (enumFields.length > 0 && !hasEnumField) {\n const formattedFields = deps.formatEnumFields(enumFields, options, indentLevel);\n formattedLines.push(...formattedFields);\n enumFields = [];\n }\n\n const enumNode = enumMemberIndex.get(lineIndex);\n const fieldInfo = enumNode\n ? deps.buildEnumFieldFromAst(line, enumNode)\n : deps.parseEnumFieldText(line);\n if (fieldInfo) {\n return {\n handled: true,\n inEnum: true,\n indentLevel,\n enumFields: [...enumFields, fieldInfo],\n formattedLines\n };\n }\n\n return {\n handled: formattedLines.length > 0,\n inEnum: true,\n indentLevel,\n enumFields,\n formattedLines\n };\n}\n", "import {EnumField, ThriftFormattingOptions} from '../interfaces.types';\n\ntype IndentProvider = (level: number, options: ThriftFormattingOptions) => string;\n\ninterface FieldFormatDeps {\n getIndent: IndentProvider;\n}\n\n/**\n * Format enum fields with alignment options.\n * @param fields - Enum fields to format.\n * @param options - Formatting options.\n * @param indentLevel - Base indentation level for the fields.\n * @param deps - Formatting dependencies.\n * @returns Formatted enum field lines.\n */\nexport function formatEnumFields(\n fields: EnumField[],\n options: ThriftFormattingOptions,\n indentLevel: number,\n deps: FieldFormatDeps\n): string[] {\n const needsAlignment = options.alignEnumNames || options.alignEnumEquals || options.alignEnumValues || options.alignComments || options.trailingComma !== 'preserve';\n if (!needsAlignment) {\n return fields.map(f => deps.getIndent(indentLevel, options) + f.line);\n }\n\n const indent = deps.getIndent(indentLevel, options);\n\n const fieldsWithValues = fields.filter(f => f.value);\n const maxNameWidth = fieldsWithValues.length > 0\n ? Math.max(...fieldsWithValues.map(f => f.name.length), 0)\n : 0;\n let maxContentWidth = 0;\n let maxAnnoStart = 0;\n const interim: Array<{\n base: string;\n comment: string;\n hasComma: boolean;\n hasSemicolon: boolean;\n annotation: string\n }> = [];\n\n for (const f of fields) {\n let hasComma = f.suffix ? /,/.test(f.suffix) : false;\n const hasSemicolon = f.suffix ? /;/.test(f.suffix) : false;\n\n if (!hasSemicolon) {\n if (options.trailingComma === 'add') {\n hasComma = true;\n } else if (options.trailingComma === 'remove') {\n hasComma = false;\n }\n }\n\n let base = indent;\n if (f.value) {\n if (options.alignEnumEquals) {\n base += f.name.padEnd(maxNameWidth) + ' = ';\n } else {\n const namePart = options.alignEnumNames ? f.name.padEnd(maxNameWidth) : f.name;\n base += namePart + ' = ';\n }\n base += '' + f.value;\n } else {\n base += f.name;\n }\n\n const baseWidth = base.length - indent.length;\n if (options.alignAnnotations && f.annotation !== undefined) {\n maxAnnoStart = Math.max(maxAnnoStart, baseWidth);\n }\n\n interim.push({\n base,\n comment: f.comment,\n hasComma,\n hasSemicolon,\n annotation: f.annotation ?? ''\n });\n }\n\n if (options.alignAnnotations) {\n interim.forEach(({base, annotation, hasComma, hasSemicolon}) => {\n let line = base;\n if (annotation) {\n const currentWidth = base.length - indent.length;\n const spaces = maxAnnoStart - currentWidth + 1;\n line = base + ' '.repeat(Math.max(1, spaces)) + annotation;\n }\n let w = line.length - indent.length;\n if (hasSemicolon) {\n w += 1;\n } else if (hasComma) {\n w += 1;\n }\n maxContentWidth = Math.max(maxContentWidth, w);\n });\n } else {\n interim.forEach(({base, annotation, hasComma, hasSemicolon}) => {\n let line = base;\n if (annotation) {\n line = base + ' ' + annotation;\n }\n let w = line.length - indent.length;\n if (hasSemicolon) {\n w += 1;\n } else if (hasComma) {\n w += 1;\n }\n maxContentWidth = Math.max(maxContentWidth, w);\n });\n }\n\n return interim.map(({base, comment, hasComma, hasSemicolon, annotation}) => {\n let line = base;\n\n if (annotation) {\n if (options.alignAnnotations) {\n const currentWidth = line.length - indent.length;\n const spaces = maxAnnoStart - currentWidth + 1;\n line += ' '.repeat(Math.max(1, spaces)) + annotation;\n } else {\n line += ' ' + annotation;\n }\n }\n\n // Add comma or semicolon before comment (not after)\n if (hasSemicolon) {\n line += ';';\n } else if (hasComma) {\n line += ',';\n }\n\n if (comment) {\n if (options.alignComments) {\n const currentWidth = line.length - indent.length;\n const pad = Math.max(1, maxContentWidth - currentWidth + 1);\n line += ' '.repeat(pad) + comment;\n } else {\n line += ' ' + comment;\n }\n }\n\n return line;\n });\n}\n", "import {StructField, ThriftFormattingOptions} from '../interfaces.types';\n\ntype IndentProvider = (level: number, options: ThriftFormattingOptions) => string;\n\ninterface StructFormatDeps {\n getIndent: IndentProvider;\n}\n\n/**\n * Calculate the starting position for annotations based on field content width.\n * This function is used both for max content width calculation and target annotation alignment.\n */\nfunction calculateAnnotationStartPosition(\n field: StructField,\n options: ThriftFormattingOptions,\n maxFieldIdWidth: number,\n maxQualifierWidth: number,\n maxTypeWidth: number,\n maxNameWidth: number\n): number {\n let w = 0;\n w += maxFieldIdWidth + 2;\n if (options.alignTypes) {\n w += maxQualifierWidth;\n if (maxQualifierWidth > 0) {\n w += 1;\n }\n } else {\n w += field.qualifier.length;\n if (field.qualifier.length > 0) {\n w += 1;\n }\n }\n w += (options.alignTypes ? maxTypeWidth : field.type.length);\n w += 1;\n if (options.alignFieldNames && (field.suffix || (field.annotation !== undefined && field.annotation !== ''))) {\n w += maxNameWidth;\n if (field.suffix) {\n let s = field.suffix;\n if (/,\\s*$/.test(s)) {\n s = s.replace(/,\\s*$/, '');\n }\n if (s.includes('=')) {\n s = s.replace(/\\s*=\\s*/, ' = ');\n }\n w += s.length;\n }\n } else {\n w += field.name.length;\n if (field.suffix) {\n let s = field.suffix;\n if (/,\\s*$/.test(s)) {\n s = s.replace(/,\\s*$/, '');\n }\n if (s.includes('=')) {\n s = s.replace(/\\s*=\\s*/, ' = ');\n }\n w += s.length;\n }\n }\n return w;\n}\n\n/**\n * Format struct fields with alignment options.\n * @param fields - Struct fields to format.\n * @param options - Formatting options.\n * @param indentLevel - Base indentation level for the fields.\n * @param deps - Formatting dependencies.\n * @returns Formatted struct field lines.\n */\nexport function formatStructFields(\n fields: StructField[],\n options: ThriftFormattingOptions,\n indentLevel: number,\n deps: StructFormatDeps\n): string[] {\n const sortedFields = fields;\n\n const needsAlignment = options.alignTypes || options.alignFieldNames || options.alignComments || options.alignAnnotations;\n\n if (!needsAlignment && options.trailingComma === 'preserve') {\n return sortedFields.map(f => deps.getIndent(indentLevel, options) + f.line);\n }\n\n let maxFieldIdWidth = 0;\n let maxQualifierWidth = 0;\n let maxTypeWidth = 0;\n let maxNameWidth = 0;\n let maxAnnotationWidth = 0;\n let maxContentWidth = 0;\n\n const parsedFields = sortedFields.map(field => {\n maxFieldIdWidth = Math.max(maxFieldIdWidth, field.id.length);\n maxQualifierWidth = Math.max(maxQualifierWidth, field.qualifier.length);\n maxTypeWidth = Math.max(maxTypeWidth, field.type.length);\n maxNameWidth = Math.max(maxNameWidth, field.name.length);\n const isMultiLineField = !!(field.suffix && field.suffix.includes('\\n'));\n if (!isMultiLineField && options.alignAnnotations && field.annotation !== undefined && field.annotation !== '') {\n maxAnnotationWidth = Math.max(maxAnnotationWidth, field.annotation.length);\n }\n return field;\n });\n\n parsedFields.forEach(field => {\n // Multi-line fields' annotations/comments live on the last line and don't participate in alignment.\n if (field.suffix && field.suffix.includes('\\n')) {\n return;\n }\n let contentWidth = 0;\n contentWidth += maxFieldIdWidth + 2;\n\n if (options.alignTypes) {\n contentWidth += maxQualifierWidth;\n if (maxQualifierWidth > 0) {\n contentWidth += 1;\n }\n } else {\n contentWidth += field.qualifier.length;\n if (field.qualifier.length > 0) {\n contentWidth += 1;\n }\n }\n\n if (options.alignTypes) {\n contentWidth += maxTypeWidth;\n } else {\n contentWidth += field.type.length;\n }\n contentWidth += 1;\n\n // Clean suffix for width calculation to ensure idempotency\n // For idempotency, calculate based on ideal output, not input spacing\n // Trailing spaces in suffix are alignment padding and should be ignored\n let cleanSuffixForWidth = field.suffix || '';\n // Detect comma from suffix (original location)\n const hasCommaForWidth = field.suffix ? /,\\s*$/.test(field.suffix) : false;\n\n // Remove trailing spaces that are just for alignment\n // These spaces are not meaningful content and should not affect width calculation\n cleanSuffixForWidth = cleanSuffixForWidth.replace(/\\s+$/, '');\n\n if (hasCommaForWidth) {\n cleanSuffixForWidth = cleanSuffixForWidth.replace(/,\\s*$/, '');\n }\n if (cleanSuffixForWidth && cleanSuffixForWidth.includes('=')) {\n cleanSuffixForWidth = cleanSuffixForWidth.replace(/\\s*=\\s*/, ' = ');\n }\n\n if (options.alignFieldNames && (cleanSuffixForWidth || (field.annotation !== undefined && field.annotation !== ''))) {\n contentWidth += maxNameWidth;\n if (cleanSuffixForWidth) {\n contentWidth += cleanSuffixForWidth.length;\n }\n } else {\n contentWidth += field.name.length;\n if (cleanSuffixForWidth) {\n contentWidth += cleanSuffixForWidth.length;\n }\n }\n\n if (options.alignAnnotations && field.annotation !== undefined && field.annotation !== '') {\n contentWidth += 1;\n contentWidth += maxAnnotationWidth;\n } else if (field.annotation !== undefined && field.annotation !== '') {\n contentWidth += 1 + field.annotation.length;\n }\n\n // Add comma width if present (for idempotency, use hasCommaForWidth instead of checking field.suffix)\n // Also add comma width when in 'add' mode and there's no semicolon\n if (options.trailingComma === 'preserve' && hasCommaForWidth) {\n contentWidth += 1;\n } else if (options.trailingComma === 'add' && !/;/.test(field.suffix || '')) {\n contentWidth += 1;\n }\n\n maxContentWidth = Math.max(maxContentWidth, contentWidth);\n });\n\n const targetAnnoStart = (() => {\n if (!options.alignAnnotations) {\n return 0;\n }\n let max = 0;\n parsedFields.forEach(f => {\n if (f === undefined || f.annotation === undefined || f.annotation === '') {\n return;\n }\n if (f.suffix && f.suffix.includes('\\n')) {\n return;\n }\n const w = calculateAnnotationStartPosition(\n f,\n options,\n maxFieldIdWidth,\n maxQualifierWidth,\n maxTypeWidth,\n maxNameWidth\n );\n if (w > max) {\n max = w;\n }\n });\n return max;\n })();\n\n const commentCount = parsedFields.reduce((acc, f) => acc + ((f !== undefined && f.comment) ? 1 : 0), 0);\n\n return parsedFields.map(field => {\n if (field.suffix && field.suffix.includes('\\n')) {\n return formatMultiLineStructField(\n field,\n options,\n indentLevel,\n deps,\n maxFieldIdWidth,\n maxQualifierWidth,\n maxTypeWidth,\n maxNameWidth\n );\n }\n let formattedLine = deps.getIndent(indentLevel, options);\n\n const fieldIdWithColon = field.id + ':';\n formattedLine += fieldIdWithColon.padEnd(maxFieldIdWidth + 1) + ' ';\n\n if (options.alignTypes) {\n formattedLine += field.qualifier.padEnd(maxQualifierWidth);\n if (maxQualifierWidth > 0) {\n formattedLine += ' ';\n }\n } else {\n formattedLine += field.qualifier;\n if (field.qualifier.length > 0) {\n formattedLine += ' ';\n }\n }\n\n if (options.alignTypes) {\n formattedLine += field.type.padEnd(maxTypeWidth);\n } else {\n formattedLine += field.type;\n }\n\n formattedLine += ' ';\n\n let cleanSuffix = field.suffix || '';\n let hasComma = cleanSuffix ? /,\\s*$/.test(cleanSuffix) : false;\n const hasSemicolon = cleanSuffix ? /;/.test(cleanSuffix) : false;\n\n // Remove trailing spaces that are just for alignment (for idempotency)\n // These spaces are not meaningful content\n cleanSuffix = cleanSuffix.replace(/\\s+$/, '');\n\n // Remove trailing comma from suffix (we'll add it back later before annotation/comment)\n if (hasComma) {\n cleanSuffix = cleanSuffix.replace(/,\\s*$/, '');\n }\n\n // Remove semicolon from suffix (we'll add it back later before annotation/comment)\n if (hasSemicolon) {\n cleanSuffix = cleanSuffix.replace(/;/g, '');\n }\n\n if (cleanSuffix && cleanSuffix.includes('=')) {\n cleanSuffix = cleanSuffix.replace(/\\s*=\\s*/, ' = ');\n }\n\n if (options.trailingComma === 'add' && !hasComma && !hasSemicolon) {\n hasComma = true;\n } else if (options.trailingComma === 'remove' && hasComma && !hasSemicolon) {\n hasComma = false;\n }\n\n const hasContentAfterName = (cleanSuffix && cleanSuffix.length > 0) || (field.annotation !== undefined && field.annotation !== '');\n if (options.alignFieldNames && hasContentAfterName) {\n formattedLine += field.name.padEnd(maxNameWidth);\n if (cleanSuffix) {\n formattedLine += cleanSuffix;\n }\n } else {\n formattedLine += field.name;\n if (cleanSuffix) {\n formattedLine += cleanSuffix;\n }\n }\n\n if (field.annotation !== undefined && field.annotation !== '') {\n if (options.alignAnnotations) {\n const currentWidth = formattedLine.length - deps.getIndent(indentLevel, options).length;\n const spaces = targetAnnoStart - currentWidth + 1;\n formattedLine += ' '.repeat(Math.max(0, spaces)) + field.annotation;\n } else {\n formattedLine += ' ' + field.annotation;\n }\n }\n\n // Add comma or semicolon before comment (not after)\n if (hasSemicolon) {\n formattedLine += ';';\n } else if (hasComma) {\n formattedLine += ',';\n }\n\n if (field.comment) {\n if (options.alignComments) {\n const currentWidth = formattedLine.length - deps.getIndent(indentLevel, options).length;\n const diff = maxContentWidth - currentWidth;\n const basePad = Math.max(1, diff + 1);\n const padSpaces = commentCount > 1 ? basePad : 1;\n formattedLine += ' '.repeat(padSpaces) + field.comment;\n } else {\n formattedLine += ' ' + field.comment;\n }\n }\n\n return formattedLine;\n });\n}\n\n/**\n * Format a struct field whose default value spans multiple lines.\n * Outputs a multi-line string: header on the first line, continuation lines re-indented\n * one level deeper, and the closing bracket + annotation/trailing on the final line.\n */\nfunction formatMultiLineStructField(\n field: StructField,\n options: ThriftFormattingOptions,\n indentLevel: number,\n deps: StructFormatDeps,\n maxFieldIdWidth: number,\n maxQualifierWidth: number,\n maxTypeWidth: number,\n maxNameWidth: number\n): string {\n const baseIndent = deps.getIndent(indentLevel, options);\n const innerIndent = deps.getIndent(indentLevel + 1, options);\n\n let suffix = field.suffix || '';\n let hasComma = /,\\s*$/.test(suffix);\n const hasSemicolon = /;\\s*$/.test(suffix);\n suffix = suffix.replace(/\\s+$/, '');\n if (hasComma) {\n suffix = suffix.replace(/,\\s*$/, '');\n }\n if (hasSemicolon) {\n suffix = suffix.replace(/;\\s*$/, '');\n }\n if (options.trailingComma === 'add' && !hasComma && !hasSemicolon) {\n hasComma = true;\n } else if (options.trailingComma === 'remove' && hasComma && !hasSemicolon) {\n hasComma = false;\n }\n\n // suffix is like \" = {\\nLine2\\nLine3\\n}\" \u2014 strip leading \" = \"\n const eqStripped = suffix.replace(/^\\s*=\\s*/, '');\n const parts = eqStripped.split('\\n');\n const firstDV = parts[0] ?? '';\n const middleDV = parts.length > 2 ? parts.slice(1, -1) : [];\n const lastDV = parts.length > 1 ? parts[parts.length - 1] : '';\n\n // String continuation (backslash-terminated multi-line string): preserve verbatim\n // so the embedded whitespace inside the string isn't perturbed.\n if (firstDV.startsWith('\"') || firstDV.startsWith('\\'')) {\n let header = baseIndent;\n header += (field.id + ':').padEnd(maxFieldIdWidth + 1) + ' ';\n if (options.alignTypes) {\n header += field.qualifier.padEnd(maxQualifierWidth);\n if (maxQualifierWidth > 0) {\n header += ' ';\n }\n header += field.type.padEnd(maxTypeWidth);\n } else {\n header += field.qualifier;\n if (field.qualifier.length > 0) {\n header += ' ';\n }\n header += field.type;\n }\n header += ' ';\n header += options.alignFieldNames ? field.name.padEnd(maxNameWidth) : field.name;\n header += ' = ' + firstDV;\n const tailLines = [...middleDV];\n let last = lastDV;\n if (field.annotation !== undefined && field.annotation !== '') {\n last += ' ' + field.annotation;\n }\n if (hasSemicolon) { last += ';'; }\n else if (hasComma) { last += ','; }\n if (field.comment) { last += ' ' + field.comment; }\n if (parts.length > 1) {\n tailLines.push(last);\n }\n return [header, ...tailLines].join('\\n');\n }\n\n let firstLine = baseIndent;\n firstLine += (field.id + ':').padEnd(maxFieldIdWidth + 1) + ' ';\n if (options.alignTypes) {\n firstLine += field.qualifier.padEnd(maxQualifierWidth);\n if (maxQualifierWidth > 0) {\n firstLine += ' ';\n }\n firstLine += field.type.padEnd(maxTypeWidth);\n } else {\n firstLine += field.qualifier;\n if (field.qualifier.length > 0) {\n firstLine += ' ';\n }\n firstLine += field.type;\n }\n firstLine += ' ';\n if (options.alignFieldNames) {\n firstLine += field.name.padEnd(maxNameWidth);\n } else {\n firstLine += field.name;\n }\n firstLine += ' = ' + firstDV;\n\n const middleLines = middleDV.filter(m => m.trim().length > 0).map(m => innerIndent + m);\n\n let lastLine = baseIndent + lastDV;\n if (field.annotation !== undefined && field.annotation !== '') {\n lastLine += ' ' + field.annotation;\n }\n if (hasSemicolon) {\n lastLine += ';';\n } else if (hasComma) {\n lastLine += ',';\n }\n if (field.comment) {\n lastLine += ' ' + field.comment;\n }\n\n return [firstLine, ...middleLines, lastLine].join('\\n');\n}\n", "import {ThriftFormattingOptions} from '../interfaces.types';\n\n/**\n * Build indentation string for the given level.\n * @param level - Indent depth.\n * @param options - Formatting options.\n * @returns Indentation string.\n */\nexport function getIndent(level: number, options: ThriftFormattingOptions): string {\n const indentSize = options.indentSize || 2;\n if (options.insertSpaces) {\n return ' '.repeat(level * indentSize);\n }\n return '\\t'.repeat(level);\n}\n\n/**\n * Build indentation string for service formatting.\n * @param level - Indent depth.\n * @param options - Formatting options.\n * @returns Indentation string.\n */\nexport function getServiceIndent(level: number, options: ThriftFormattingOptions): string {\n return getIndent(level, options);\n}\n", "import {EnumField, StructField, ThriftFormattingOptions} from '../interfaces.types';\n\ntype IndentProvider = (level: number, options: ThriftFormattingOptions) => string;\ntype StructFormatter = (fields: StructField[], options: ThriftFormattingOptions, indentLevel: number) => string[];\ntype EnumFormatter = (fields: EnumField[], options: ThriftFormattingOptions, indentLevel: number) => string[];\ntype StructFieldParser = (text: string) => StructField | null;\ntype EnumFieldParser = (text: string) => EnumField | null;\ntype SignatureNormalizer = (text: string) => string;\ntype PartSplitter = (content: string) => string[];\n\ninterface InlineFormatDeps {\n getIndent: IndentProvider;\n getServiceIndent: IndentProvider;\n formatStructFields: StructFormatter;\n formatEnumFields: EnumFormatter;\n parseStructFieldText: StructFieldParser;\n parseEnumFieldText: EnumFieldParser;\n normalizeGenericsInSignature: SignatureNormalizer;\n splitTopLevelParts: PartSplitter;\n}\n\n/**\n * Check whether the line is an inline struct/union/exception definition.\n * @param line - Raw line content.\n * @returns True when the line contains a complete inline struct-like body.\n */\nexport function isInlineStructLike(line: string): boolean {\n return /^(struct|union|exception)\\b/.test(line) && line.includes('{') && line.includes('}');\n}\n\n/**\n * Check whether the line is an inline enum definition.\n * @param line - Raw line content.\n * @returns True when the line contains a complete inline enum body.\n */\nexport function isInlineEnum(line: string): boolean {\n return /^(enum|senum)\\b/.test(line) && line.includes('{') && line.includes('}');\n}\n\n/**\n * Check whether the line is an inline service definition.\n * @param line - Raw line content.\n * @returns True when the line contains a complete inline service body.\n */\nexport function isInlineService(line: string): boolean {\n return /^service\\b/.test(line) && line.includes('{') && line.includes('}');\n}\n\n/**\n * Format an inline struct/union/exception definition into multi-line output.\n * @param line - Inline definition line.\n * @param indentLevel - Base indentation level.\n * @param options - Formatting options.\n * @param deps - Formatting dependencies.\n * @returns Formatted lines or null when not an inline body.\n */\nexport function formatInlineStructLike(\n line: string,\n indentLevel: number,\n options: ThriftFormattingOptions,\n deps: InlineFormatDeps\n): string[] | null {\n const openBraceIndex = line.indexOf('{');\n const closeBraceIndex = line.lastIndexOf('}');\n if (openBraceIndex === -1 || closeBraceIndex === -1 || openBraceIndex >= closeBraceIndex) {\n return null;\n }\n const structHeader = line.substring(0, openBraceIndex).trim();\n const structContent = line.substring(openBraceIndex + 1, closeBraceIndex).trim();\n\n const out: string[] = [];\n out.push(deps.getIndent(indentLevel, options) + structHeader + ' {');\n if (structContent) {\n const fieldStrings = deps.splitTopLevelParts(structContent);\n const fieldInfos: StructField[] = [];\n for (const fieldStr of fieldStrings) {\n const fieldInfo = deps.parseStructFieldText(fieldStr.trim());\n if (fieldInfo) {\n fieldInfos.push(fieldInfo);\n }\n }\n if (fieldInfos.length > 0) {\n const formattedFields = deps.formatStructFields(fieldInfos, options, indentLevel + 1);\n out.push(...formattedFields);\n }\n }\n out.push(deps.getIndent(indentLevel, options) + '}');\n return out;\n}\n\n/**\n * Format an inline enum definition into multi-line output.\n * @param line - Inline enum definition line.\n * @param indentLevel - Base indentation level.\n * @param options - Formatting options.\n * @param deps - Formatting dependencies.\n * @returns Formatted lines or null when not an inline body.\n */\nexport function formatInlineEnum(\n line: string,\n indentLevel: number,\n options: ThriftFormattingOptions,\n deps: InlineFormatDeps\n): string[] | null {\n const openBraceIndex = line.indexOf('{');\n const closeBraceIndex = line.lastIndexOf('}');\n if (openBraceIndex === -1 || closeBraceIndex === -1 || openBraceIndex >= closeBraceIndex) {\n return null;\n }\n const enumHeader = line.substring(0, openBraceIndex).trim();\n const enumContent = line.substring(openBraceIndex + 1, closeBraceIndex).trim();\n\n const out: string[] = [];\n out.push(deps.getIndent(indentLevel, options) + enumHeader + ' {');\n if (enumContent) {\n const fieldStrings = deps.splitTopLevelParts(enumContent);\n const enumFieldInfos: EnumField[] = [];\n for (const fieldStr of fieldStrings) {\n const fieldInfo = deps.parseEnumFieldText(fieldStr.trim());\n if (fieldInfo) {\n enumFieldInfos.push(fieldInfo);\n }\n }\n if (enumFieldInfos.length > 0) {\n const formattedFields = deps.formatEnumFields(enumFieldInfos, options, indentLevel + 1);\n out.push(...formattedFields);\n }\n }\n out.push(deps.getIndent(indentLevel, options) + '}');\n return out;\n}\n\n/**\n * Format an inline service definition into multi-line output.\n * @param line - Inline service definition line.\n * @param indentLevel - Base indentation level.\n * @param options - Formatting options.\n * @param deps - Formatting dependencies.\n * @returns Formatted lines or null when not an inline body.\n */\nexport function formatInlineService(\n line: string,\n indentLevel: number,\n options: ThriftFormattingOptions,\n deps: InlineFormatDeps\n): string[] | null {\n const openBraceIndex = line.indexOf('{');\n const closeBraceIndex = line.lastIndexOf('}');\n if (openBraceIndex === -1 || closeBraceIndex === -1 || openBraceIndex >= closeBraceIndex) {\n return null;\n }\n const serviceHeader = line.substring(0, openBraceIndex).trim();\n const serviceContent = line.substring(openBraceIndex + 1, closeBraceIndex).trim();\n\n const out: string[] = [];\n out.push(deps.getIndent(indentLevel, options) + serviceHeader + ' {');\n if (serviceContent) {\n const methodStrings = deps.splitTopLevelParts(serviceContent);\n for (const methodStr of methodStrings) {\n const trimmedMethod = methodStr.trim();\n if (trimmedMethod) {\n const normalizedMethod = deps.normalizeGenericsInSignature(trimmedMethod);\n out.push(deps.getServiceIndent(indentLevel + 1, options) + normalizedMethod);\n }\n }\n }\n out.push(deps.getIndent(indentLevel, options) + '}');\n return out;\n}\n", "import {ConstField, StructField, ThriftFormattingOptions} from '../interfaces.types';\n\ntype IndentProvider = (level: number, options: ThriftFormattingOptions) => string;\ntype StructFormatter = (fields: StructField[], options: ThriftFormattingOptions, indentLevel: number) => string[];\ntype ConstFormatter = (fields: ConstField[], options: ThriftFormattingOptions, indentLevel: number) => string[];\ntype StructFieldMatcher = (line: string) => boolean;\ntype ConstFieldParser = (text: string) => ConstField | null;\ntype SignatureNormalizer = (text: string) => string;\n\ninterface FlushStructDeps {\n formatStructFields: StructFormatter;\n isStructFieldText: StructFieldMatcher;\n}\n\ninterface FlushConstDeps {\n formatConstFields: ConstFormatter;\n}\n\ninterface SkipLineDeps {\n getIndent: IndentProvider;\n getServiceIndent: IndentProvider;\n}\n\ninterface ConstStartDeps {\n parseConstFieldText: ConstFieldParser;\n}\n\ninterface TypedefDeps {\n getIndent: IndentProvider;\n normalizeGenericsInSignature: SignatureNormalizer;\n}\n\ninterface OpenBraceDeps {\n getIndent: IndentProvider;\n}\n\ninterface FlushStructResult {\n structFields: StructField[];\n formattedLines: string[];\n flushed: boolean;\n}\n\ninterface FlushConstResult {\n constFields: ConstField[];\n inConstBlock: boolean;\n constBlockIndentLevel: number | null;\n formattedLines: string[];\n flushed: boolean;\n}\n\ninterface ConstStartResult {\n handled: boolean;\n nextIndex: number;\n constFields: ConstField[];\n inConstBlock: boolean;\n constBlockIndentLevel: number | null;\n}\n\n/**\n * Flush accumulated struct fields before non-field separators or comments.\n * @param inStruct - Whether the formatter is inside a struct block.\n * @param structFields - Collected struct fields.\n * @param line - Current line (trimmed).\n * @param lineIndex - Current line index.\n * @param structFieldIndex - AST index for struct fields.\n * @param indentLevel - Current indentation level.\n * @param options - Formatting options.\n * @param deps - Formatting dependencies.\n * @returns Updated struct fields and formatted output.\n */\nexport function flushStructFieldsIfNeeded(\n inStruct: boolean,\n structFields: StructField[],\n line: string,\n lineIndex: number,\n structFieldIndex: Map<number, unknown>,\n indentLevel: number,\n options: ThriftFormattingOptions,\n deps: FlushStructDeps\n): FlushStructResult {\n if (!inStruct || structFields.length === 0) {\n return {structFields, formattedLines: [], flushed: false};\n }\n\n const hasStructField = structFieldIndex.has(lineIndex) || deps.isStructFieldText(line);\n if (!hasStructField && !line.startsWith('}')) {\n const formattedLines = deps.formatStructFields(structFields, options, indentLevel);\n return {structFields: [], formattedLines, flushed: true};\n }\n\n return {structFields, formattedLines: [], flushed: false};\n}\n\n/**\n * Flush pending const fields when a const block ends.\n * @param inConstBlock - Whether const block is active.\n * @param constFields - Collected const fields.\n * @param isConstStart - Whether current line starts a const definition.\n * @param constBlockIndentLevel - Indent level of const block.\n * @param indentLevel - Current indentation level.\n * @param options - Formatting options.\n * @param deps - Formatting dependencies.\n * @returns Updated const block state and formatted output.\n */\nexport function flushConstBlockIfNeeded(\n inConstBlock: boolean,\n constFields: ConstField[],\n isConstStart: boolean,\n constBlockIndentLevel: number | null,\n indentLevel: number,\n options: ThriftFormattingOptions,\n deps: FlushConstDeps\n): FlushConstResult {\n if (inConstBlock && constFields.length > 0 && !isConstStart) {\n const formattedLines = deps.formatConstFields(constFields, options, constBlockIndentLevel ?? indentLevel);\n return {\n constFields: [],\n inConstBlock: false,\n constBlockIndentLevel: null,\n formattedLines,\n flushed: true\n };\n }\n\n return {\n constFields,\n inConstBlock,\n constBlockIndentLevel,\n formattedLines: [],\n flushed: false\n };\n}\n\n/**\n * Format empty lines and line comments.\n * @param line - Current line (trimmed).\n * @param inService - Whether the formatter is inside a service block.\n * @param serviceIndentLevel - Base service indentation level.\n * @param indentLevel - Current indentation level.\n * @param options - Formatting options.\n * @param deps - Formatting dependencies.\n * @returns Formatted line array or null when not handled.\n */\nexport function formatSkippedLine(\n line: string,\n inService: boolean,\n serviceIndentLevel: number,\n indentLevel: number,\n options: ThriftFormattingOptions,\n deps: SkipLineDeps,\n inInteraction?: boolean\n): string[] | null {\n if (!line || line.startsWith('//') || line.startsWith('#')) {\n const indent = (inService || inInteraction === true)\n ? deps.getServiceIndent(serviceIndentLevel + 1, options)\n : deps.getIndent(indentLevel, options);\n return [indent + line];\n }\n return null;\n}\n\n/**\n * Handle const definitions using AST indices.\n * @param lines - Full document lines.\n * @param lineIndex - Current line index.\n * @param isConstStart - Whether current line starts a const definition.\n * @param constEnds - Map of const start to end line.\n * @param inStruct - Whether the formatter is inside a struct block.\n * @param inEnum - Whether the formatter is inside an enum block.\n * @param inService - Whether the formatter is inside a service block.\n * @param indentLevel - Current indentation level.\n * @param constFields - Collected const fields.\n * @param constBlockIndentLevel - Indent level of const block.\n * @param deps - Formatting dependencies.\n * @returns Updated const block state and next index.\n */\nexport function handleConstStartLine(\n lines: string[],\n lineIndex: number,\n isConstStart: boolean,\n constEnds: Map<number, number>,\n inStruct: boolean,\n inEnum: boolean,\n inService: boolean,\n indentLevel: number,\n constFields: ConstField[],\n constBlockIndentLevel: number | null,\n deps: ConstStartDeps\n): ConstStartResult {\n if (!isConstStart) {\n return {\n handled: false,\n nextIndex: lineIndex,\n constFields,\n inConstBlock: false,\n constBlockIndentLevel\n };\n }\n\n const endLine = constEnds.get(lineIndex) ?? lineIndex;\n const constText = lines.slice(lineIndex, endLine + 1).join('\\n');\n const fieldInfo = deps.parseConstFieldText(constText);\n let inConstBlock = false;\n\n if (fieldInfo) {\n if (constFields.length === 0) {\n constBlockIndentLevel = (inStruct || inEnum || inService) ? indentLevel : 0;\n }\n constFields = [...constFields, fieldInfo];\n inConstBlock = true;\n }\n\n return {\n handled: true,\n nextIndex: endLine,\n constFields,\n inConstBlock,\n constBlockIndentLevel\n };\n}\n\n/**\n * Format a typedef line.\n * @param line - Current line (trimmed).\n * @param indentLevel - Current indentation level.\n * @param options - Formatting options.\n * @param deps - Formatting dependencies.\n * @returns Formatted typedef line or null when not handled.\n */\nexport function formatTypedefLine(\n line: string,\n indentLevel: number,\n options: ThriftFormattingOptions,\n deps: TypedefDeps\n): string[] | null {\n if (/^\\s*typedef\\b/.test(line)) {\n const normalized = deps.normalizeGenericsInSignature(line);\n return [deps.getIndent(indentLevel, options) + normalized];\n }\n return null;\n}\n\n/**\n * Format a standalone opening brace line.\n * @param line - Current line (trimmed).\n * @param indentLevel - Current indentation level.\n * @param options - Formatting options.\n * @param deps - Formatting dependencies.\n * @returns Formatted line or null when not handled.\n */\nexport function formatOpenBraceLine(\n line: string,\n indentLevel: number,\n options: ThriftFormattingOptions,\n deps: OpenBraceDeps\n): string[] | null {\n if (line === '{') {\n const level = Math.max(indentLevel - 1, 0);\n return [deps.getIndent(level, options) + line];\n }\n return null;\n}\n", "/**\n * Check if a line starts a struct/union/exception definition.\n * @param line - Raw line content.\n * @returns True when the line opens a struct-like block.\n */\nexport function isStructStartLine(line: string): boolean {\n return /^(struct|union|exception)\\b/.test(line) && line.includes('{') && !line.includes('}');\n}\n\n/**\n * Check if a line starts an enum definition.\n * @param line - Raw line content.\n * @returns True when the line opens an enum block.\n */\nexport function isEnumStartLine(line: string): boolean {\n return /^(enum|senum)\\b/.test(line) && line.includes('{') && !line.includes('}');\n}\n\n/**\n * Check if a line starts a service definition.\n * @param line - Raw line content.\n * @returns True when the line opens a service block.\n */\nexport function isServiceStartLine(line: string): boolean {\n return /^service\\b/.test(line) && line.includes('{') && !line.includes('}');\n}\n\n/**\n * Check if a line starts an interaction definition (fbthrift).\n * @param line - Raw line content.\n * @returns True when the line opens an interaction block.\n */\nexport function isInteractionStartLine(line: string): boolean {\n return /^interaction\\b/.test(line) && line.includes('{') && !line.includes('}');\n}\n\n/**\n * Check if a line starts an annotation block (fbthrift `@Name{...}`).\n * @param line - Raw line content.\n * @returns True when the line opens a multi-line annotation block.\n */\nexport function isAnnotationStartLine(line: string): boolean {\n return /^\\s*@[A-Za-z_][A-Za-z0-9_]*\\s*\\{/.test(line) && !line.includes('}');\n}\n", "import {ThriftFormattingOptions} from '../interfaces.types';\n\ntype IndentProvider = (level: number, options: ThriftFormattingOptions) => string;\ntype ServiceMethodMatcher = (line: string, lineIndex: number) => boolean;\ntype SignatureNormalizer = (text: string) => string;\n\ninterface ServiceContentDeps {\n getServiceIndent: IndentProvider;\n normalizeGenericsInSignature: SignatureNormalizer;\n isServiceMethod: ServiceMethodMatcher;\n}\n\ninterface ServiceContentResult {\n formattedLines: string[];\n closeService: boolean;\n annotationDepth: number;\n}\n\n/**\n * Format a line inside a service block.\n * @param line - Current line (trimmed).\n * @param serviceIndentLevel - Base indentation level for the service.\n * @param options - Formatting options.\n * @param deps - Formatting dependencies.\n * @param annotationDepth - Current annotation block nesting depth (caller-maintained).\n * @returns Formatting result with closeService flag and updated annotationDepth.\n */\nexport function formatServiceContentLine(\n line: string,\n lineIndex: number,\n serviceIndentLevel: number,\n options: ThriftFormattingOptions,\n deps: ServiceContentDeps,\n annotationDepth = 0\n): ServiceContentResult {\n if (line === '{') {\n return {\n formattedLines: [deps.getServiceIndent(serviceIndentLevel, options) + line],\n closeService: false,\n annotationDepth\n };\n }\n\n // Multi-line annotation block start (e.g. @MethodMetadata{)\n if (/^\\s*@[A-Za-z_][A-Za-z0-9_]*\\s*\\{/.test(line) && !line.includes('}')) {\n return {\n formattedLines: [deps.getServiceIndent(serviceIndentLevel + 1, options) + line],\n closeService: false,\n annotationDepth: annotationDepth + 1\n };\n }\n\n // Lines inside an annotation block: count net braces while skipping string\n // literals and line comments so that `key = \"value with {brace}\"` or\n // `// {` do not affect the tracked depth.\n if (annotationDepth > 0) {\n const newDepth = annotationDepth + countNetBraces(line);\n\n if (newDepth <= 0) {\n return {\n formattedLines: [deps.getServiceIndent(serviceIndentLevel + 1, options) + line],\n closeService: false,\n annotationDepth: 0\n };\n }\n return {\n formattedLines: [deps.getServiceIndent(serviceIndentLevel + 2, options) + line],\n closeService: false,\n annotationDepth: newDepth\n };\n }\n\n if (line.startsWith('}')) {\n return {\n formattedLines: [deps.getServiceIndent(serviceIndentLevel, options) + line],\n closeService: true,\n annotationDepth: 0\n };\n }\n\n if (/^\\s*\\d+:\\s*/.test(line)) {\n const paramIndent = deps.getServiceIndent(serviceIndentLevel + 2, options);\n return {\n formattedLines: [paramIndent + line.trim()],\n closeService: false,\n annotationDepth\n };\n }\n\n if (deps.isServiceMethod(line, lineIndex)) {\n const normalized = deps.normalizeGenericsInSignature(line);\n const methodIndent = deps.getServiceIndent(serviceIndentLevel + 1, options);\n return {\n formattedLines: [methodIndent + normalized],\n closeService: false,\n annotationDepth\n };\n }\n\n if (line.trim().startsWith('/**') || line.trim().startsWith('*') || line.trim().startsWith('*/')) {\n return {\n formattedLines: [deps.getServiceIndent(serviceIndentLevel + 1, options) + line.trim()],\n closeService: false,\n annotationDepth\n };\n }\n\n return {\n formattedLines: [deps.getServiceIndent(serviceIndentLevel + 1, options) + line],\n closeService: false,\n annotationDepth\n };\n}\n\n/**\n * Count the net number of structural braces on a single (trimmed) line,\n * ignoring braces that appear inside string literals or after a `//` comment.\n */\nfunction countNetBraces(line: string): number {\n let net = 0;\n let inDouble = false;\n let inSingle = false;\n for (let i = 0; i < line.length; i++) {\n const ch = line[i];\n if (inDouble) {\n if (ch === '\\\\') { i++; continue; }\n if (ch === '\"') { inDouble = false; }\n } else if (inSingle) {\n if (ch === '\\\\') { i++; continue; }\n if (ch === \"'\") { inSingle = false; }\n } else if (ch === '\"') {\n inDouble = true;\n } else if (ch === \"'\") {\n inSingle = true;\n } else if (ch === '/' && line[i + 1] === '/') {\n break; // rest of line is a comment\n } else if (ch === '{') {\n net++;\n } else if (ch === '}') {\n net--;\n }\n }\n return net;\n}\n", "import * as nodes from '../ast/nodes.types';\n\n// Simple structural check used when no AST index is available.\n// Kept as a basic heuristic for standalone calls, not used in the formatter main loop.\nfunction isServiceMethodByPattern(line: string): boolean {\n const trimmed = line.trim();\n if (trimmed.startsWith('//') || trimmed.startsWith('#') || trimmed.startsWith('/*') || trimmed.startsWith('*')) {\n return false;\n }\n // A service method line has the shape: [oneway] TypeOrVoid name(...)\n if (/^\\s*(?:oneway\\s+)?[A-Za-z_][A-Za-z0-9_<>\\s,]*\\s+[A-Za-z_][A-Za-z0-9_]*\\s*\\(/.test(line)) {\n return true;\n }\n return false;\n}\n\n/**\n * Check whether a line matches a service method.\n * Uses AST index lookup when available (preferred in the formatter main loop).\n * Falls back to a simple structural pattern for standalone calls.\n */\nexport function isServiceMethodLine(\n line: string,\n lineIndex?: number,\n serviceFunctionIndex?: Map<number, nodes.ThriftFunction>\n): boolean {\n if (serviceFunctionIndex !== undefined && lineIndex !== undefined) {\n return serviceFunctionIndex.has(lineIndex);\n }\n return isServiceMethodByPattern(line);\n}\n", "import {StructField, ThriftFormattingOptions} from '../interfaces.types';\nimport * as nodes from '../ast/nodes.types';\n\ntype IndentProvider = (level: number, options: ThriftFormattingOptions) => string;\ntype StructFormatter = (fields: StructField[], options: ThriftFormattingOptions, indentLevel: number) => string[];\ntype StructFieldParser = (text: string) => StructField | null;\ntype StructFieldBuilder = (line: string, fieldNode: nodes.Field) => StructField | null;\ntype SignatureNormalizer = (text: string) => string;\ntype ServiceMethodMatcher = (line: string, lineIndex: number) => boolean;\n\ninterface StructContentDeps {\n getIndent: IndentProvider;\n formatStructFields: StructFormatter;\n buildStructFieldFromAst: StructFieldBuilder;\n parseStructFieldText: StructFieldParser;\n normalizeGenericsInSignature: SignatureNormalizer;\n isServiceMethod: ServiceMethodMatcher;\n /** Original source lines (used for multi-line field slicing). */\n sourceLines?: string[];\n /** Map of multi-line field start line \u2192 end line (inclusive). */\n structFieldEnds?: Map<number, number>;\n}\n\ninterface StructContentResult {\n handled: boolean;\n inStruct: boolean;\n indentLevel: number;\n structFields: StructField[];\n formattedLines: string[];\n /**\n * \u5F53\u672C\u884C\u662F\u591A\u884C\u5B57\u6BB5\u7684\u8D77\u59CB\u884C\u65F6\uFF0C\u8BBE\u4E3A\u8BE5\u5B57\u6BB5\u7684\u7ED3\u675F\u884C\u53F7\uFF08\u542B\uFF09\u3002\n * \u5916\u5C42 formatter-core.ts \u7684\u4E3B\u5FAA\u73AF\u68C0\u67E5\u6B64\u5B57\u6BB5\uFF0C\u5C06 `i` \u8DF3\u5230 `skipToIndex`\uFF0C\n * \u8DF3\u8FC7\u5DF2\u5408\u5E76\u5904\u7406\u7684\u7EED\u884C\u3002\n *\n * \u524D\u7F6E\u6761\u4EF6\uFF1A\u8C03\u7528\u65B9\u5FC5\u987B\u5728 deps \u4E2D\u63D0\u4F9B sourceLines \u548C structFieldEnds\uFF0C\n * \u4E14 structFieldEnds \u4E2D\u7684 key \u5FC5\u987B\u4E5F\u5728 structFieldIndex \u4E2D\u5B58\u5728\u3002\n */\n skipToIndex?: number;\n}\n\n/**\n * Format a line inside a struct/union/exception block.\n * @param line - Current line (trimmed).\n * @param lineIndex - Current line index.\n * @param indentLevel - Current indentation level.\n * @param structFields - Accumulated struct fields.\n * @param structFieldIndex - AST index for struct fields.\n * @param options - Formatting options.\n * @param deps - Formatting dependencies.\n * @returns Updated struct state and formatted output.\n */\nexport function formatStructContentLine(\n line: string,\n lineIndex: number,\n indentLevel: number,\n structFields: StructField[],\n structFieldIndex: Map<number, nodes.Field>,\n options: ThriftFormattingOptions,\n deps: StructContentDeps\n): StructContentResult {\n if (line.startsWith('}')) {\n const formattedLines: string[] = [];\n if (structFields.length > 0) {\n const formattedFields = deps.formatStructFields(structFields, options, indentLevel);\n formattedLines.push(...formattedFields);\n structFields = [];\n }\n const nextIndent = indentLevel - 1;\n formattedLines.push(deps.getIndent(nextIndent, options) + line);\n return {\n handled: true,\n inStruct: false,\n indentLevel: nextIndent,\n structFields,\n formattedLines\n };\n }\n\n if (deps.isServiceMethod(line, lineIndex)) {\n const normalized = deps.normalizeGenericsInSignature(line);\n return {\n handled: true,\n inStruct: true,\n indentLevel,\n structFields,\n formattedLines: [deps.getIndent(indentLevel, options) + normalized]\n };\n }\n\n const fieldNode = structFieldIndex.get(lineIndex);\n // Continuation line of a multi-line field already consumed \u2014 swallow without output.\n if (fieldNode && fieldNode.range.start.line !== lineIndex) {\n return {\n handled: true,\n inStruct: true,\n indentLevel,\n structFields,\n formattedLines: []\n };\n }\n // For multi-line field start, build the field from the full source span so the\n // formatter can re-indent continuation lines correctly.\n let fieldInfo: StructField | null = null;\n let skipToIndex: number | undefined;\n if (fieldNode) {\n const endLine = deps.structFieldEnds?.get(lineIndex);\n if (endLine !== undefined && deps.sourceLines && endLine > lineIndex) {\n const slice = deps.sourceLines.slice(lineIndex, endLine + 1).join('\\n');\n fieldInfo = deps.buildStructFieldFromAst(slice, fieldNode);\n skipToIndex = endLine;\n } else {\n fieldInfo = deps.buildStructFieldFromAst(line, fieldNode);\n }\n } else {\n fieldInfo = deps.parseStructFieldText(line);\n }\n if (fieldInfo) {\n return {\n handled: true,\n inStruct: true,\n indentLevel,\n structFields: [...structFields, fieldInfo],\n formattedLines: [],\n skipToIndex\n };\n }\n\n return {\n handled: false,\n inStruct: true,\n indentLevel,\n structFields,\n formattedLines: []\n };\n}\n", "import {EnumField, StructField, ThriftFormattingOptions} from '../interfaces.types';\n\ntype IndentProvider = (level: number, options: ThriftFormattingOptions) => string;\ntype StructFormatter = (fields: StructField[], options: ThriftFormattingOptions, indentLevel: number) => string[];\ntype EnumFormatter = (fields: EnumField[], options: ThriftFormattingOptions, indentLevel: number) => string[];\ntype StructFieldParser = (text: string) => StructField | null;\ntype EnumFieldParser = (text: string) => EnumField | null;\ntype SignatureNormalizer = (text: string) => string;\ntype PartSplitter = (content: string) => string[];\n\ninterface SingleLineFormatDeps {\n getIndent: IndentProvider;\n getServiceIndent: IndentProvider;\n formatStructFields: StructFormatter;\n formatEnumFields: EnumFormatter;\n parseStructFieldText: StructFieldParser;\n parseEnumFieldText: EnumFieldParser;\n normalizeGenericsInSignature: SignatureNormalizer;\n splitTopLevelParts: PartSplitter;\n}\n\n/**\n * Format a single-line struct/union/exception definition.\n * @param line - Single-line struct-like definition.\n * @param indentLevel - Base indentation level.\n * @param options - Formatting options.\n * @param deps - Formatting dependencies.\n * @returns Formatted lines, or null when not a valid single-line body.\n */\nexport function formatSingleLineStruct(\n line: string,\n indentLevel: number,\n options: ThriftFormattingOptions,\n deps: SingleLineFormatDeps\n): string[] | null {\n if (!line.includes('{') || !line.includes('}')) {\n return null;\n }\n const openBraceIndex = line.indexOf('{');\n const closeBraceIndex = line.lastIndexOf('}');\n\n if (openBraceIndex === -1 || closeBraceIndex === -1 || openBraceIndex >= closeBraceIndex) {\n return null;\n }\n\n const structHeader = line.substring(0, openBraceIndex).trim();\n const structContent = line.substring(openBraceIndex + 1, closeBraceIndex).trim();\n const formattedLines: string[] = [];\n\n formattedLines.push(deps.getIndent(indentLevel, options) + structHeader + ' {');\n\n if (structContent) {\n const fieldStrings = deps.splitTopLevelParts(structContent);\n const fieldInfos: StructField[] = [];\n for (const fieldStr of fieldStrings) {\n const fieldInfo = deps.parseStructFieldText(fieldStr.trim());\n if (fieldInfo) {\n fieldInfos.push(fieldInfo);\n }\n }\n\n if (fieldInfos.length > 0) {\n const formattedFields = deps.formatStructFields(fieldInfos, options, indentLevel + 1);\n formattedLines.push(...formattedFields);\n }\n }\n\n formattedLines.push(deps.getIndent(indentLevel, options) + '}');\n return formattedLines;\n}\n\n/**\n * Format a single-line enum definition.\n * @param line - Single-line enum definition.\n * @param indentLevel - Base indentation level.\n * @param options - Formatting options.\n * @param deps - Formatting dependencies.\n * @returns Formatted lines, or null when not a valid single-line body.\n */\nexport function formatSingleLineEnum(\n line: string,\n indentLevel: number,\n options: ThriftFormattingOptions,\n deps: SingleLineFormatDeps\n): string[] | null {\n if (!line.includes('{') || !line.includes('}')) {\n return null;\n }\n const openBraceIndex = line.indexOf('{');\n const closeBraceIndex = line.lastIndexOf('}');\n\n if (openBraceIndex === -1 || closeBraceIndex === -1 || openBraceIndex >= closeBraceIndex) {\n return null;\n }\n\n const enumHeader = line.substring(0, openBraceIndex).trim();\n const enumContent = line.substring(openBraceIndex + 1, closeBraceIndex).trim();\n const formattedLines: string[] = [];\n\n formattedLines.push(deps.getIndent(indentLevel, options) + enumHeader + ' {');\n\n if (enumContent) {\n const fieldStrings = deps.splitTopLevelParts(enumContent);\n const enumFieldInfos: EnumField[] = [];\n for (const fieldStr of fieldStrings) {\n const fieldInfo = deps.parseEnumFieldText(fieldStr.trim());\n if (fieldInfo) {\n enumFieldInfos.push(fieldInfo);\n }\n }\n\n if (enumFieldInfos.length > 0) {\n const formattedFields = deps.formatEnumFields(enumFieldInfos, options, indentLevel + 1);\n formattedLines.push(...formattedFields);\n }\n }\n\n formattedLines.push(deps.getIndent(indentLevel, options) + '}');\n return formattedLines;\n}\n\n/**\n * Format a single-line service definition.\n * @param line - Single-line service definition.\n * @param indentLevel - Base indentation level.\n * @param options - Formatting options.\n * @param deps - Formatting dependencies.\n * @returns Formatted lines, or null when not a valid single-line body.\n */\nexport function formatSingleLineService(\n line: string,\n indentLevel: number,\n options: ThriftFormattingOptions,\n deps: SingleLineFormatDeps\n): string[] | null {\n if (!line.includes('{') || !line.includes('}')) {\n return null;\n }\n const openBraceIndex = line.indexOf('{');\n const closeBraceIndex = line.lastIndexOf('}');\n\n if (openBraceIndex === -1 || closeBraceIndex === -1 || openBraceIndex >= closeBraceIndex) {\n return null;\n }\n\n const serviceHeader = line.substring(0, openBraceIndex).trim();\n const serviceContent = line.substring(openBraceIndex + 1, closeBraceIndex).trim();\n const formattedLines: string[] = [];\n\n formattedLines.push(deps.getIndent(indentLevel, options) + serviceHeader + ' {');\n\n if (serviceContent) {\n const methodStrings = deps.splitTopLevelParts(serviceContent);\n for (const methodStr of methodStrings) {\n const trimmedMethod = methodStr.trim();\n if (trimmedMethod) {\n const normalizedMethod = deps.normalizeGenericsInSignature(trimmedMethod);\n formattedLines.push(deps.getServiceIndent(indentLevel + 1, options) + normalizedMethod);\n }\n }\n }\n\n formattedLines.push(deps.getIndent(indentLevel, options) + '}');\n return formattedLines;\n}\n", "/**\n * Split a single-line body into top-level parts, ignoring nested generics/collections and strings.\n * @param content - Inline body text to split.\n * @returns Top-level parts with surrounding whitespace trimmed.\n */\nimport {QuoteTracker} from '../utils/quote-tracker';\n\nexport function splitTopLevelParts(content: string): string[] {\n const parts: string[] = [];\n let buf = '';\n let depthAngle = 0;\n let depthParen = 0;\n let depthBrace = 0;\n let depthBracket = 0;\n const qt = new QuoteTracker();\n\n for (let i = 0; i < content.length; i++) {\n const ch = content[i];\n const next = i + 1 < content.length ? content[i + 1] : '';\n\n if (!qt.inside()) {\n if (ch === '<') {\n depthAngle++;\n } else if (ch === '>') {\n depthAngle = Math.max(0, depthAngle - 1);\n } else if (ch === '(') {\n depthParen++;\n } else if (ch === ')') {\n depthParen = Math.max(0, depthParen - 1);\n } else if (ch === '{') {\n depthBrace++;\n } else if (ch === '}') {\n depthBrace = Math.max(0, depthBrace - 1);\n } else if (ch === '[') {\n depthBracket++;\n } else if (ch === ']') {\n depthBracket = Math.max(0, depthBracket - 1);\n }\n\n const atTop = depthAngle === 0 && depthParen === 0 && depthBrace === 0 && depthBracket === 0;\n if (atTop && (ch === ';' || ch === ',')) {\n if (buf.trim()) {\n parts.push(buf.trim());\n }\n buf = '';\n qt.feed(ch);\n if (next === ' ' || next === '\\t') {\n continue;\n }\n continue;\n }\n }\n\n buf += ch;\n qt.feed(ch);\n }\n\n if (buf.trim()) {\n parts.push(buf.trim());\n }\n return parts;\n}\n\n/**\n * Normalize generics spacing within a Thrift signature line, keeping any trailing comment.\n * @param text - Signature line to normalize.\n * @returns Normalized signature with preserved trailing comment.\n */\nexport function normalizeGenericsInSignature(text: string): string {\n if (!text) {\n return text;\n }\n let code = text;\n let comment = '';\n const cm = code.match(/^(.*?)(\\/\\/.*)$/);\n if (cm) {\n code = cm[1].trimEnd();\n comment = cm[2];\n }\n const res: string[] = [];\n let depthAngle = 0;\n const qt = new QuoteTracker();\n const n = code.length;\n for (let i = 0; i < n; i++) {\n const ch = code[i];\n\n if (qt.inside()) {\n res.push(ch);\n qt.feed(ch);\n continue;\n }\n\n if (ch === '\"' || ch === '\\'') {\n res.push(ch);\n qt.feed(ch);\n continue;\n }\n if (ch === '<') {\n while (res.length > 0 && res[res.length - 1] === ' ') {\n res.pop();\n }\n res.push('<');\n depthAngle++;\n while (i + 1 < n && code[i + 1] === ' ') {\n i++;\n }\n continue;\n }\n if (ch === ',' && depthAngle > 0) {\n while (res.length > 0 && res[res.length - 1] === ' ') {\n res.pop();\n }\n res.push(',');\n while (i + 1 < n && code[i + 1] === ' ') {\n i++;\n }\n continue;\n }\n if (ch === '>') {\n if (depthAngle > 0) {\n while (res.length > 0 && res[res.length - 1] === ' ') {\n res.pop();\n }\n res.push('>');\n depthAngle = Math.max(0, depthAngle - 1);\n let k = i + 1;\n while (k < n && code[k] === ' ') {\n k++;\n }\n if (k < n) {\n const next = code[k];\n if (next === ',' || next === '>' || next === ')') {\n i = k - 1;\n }\n } else {\n i = k - 1;\n }\n continue;\n }\n }\n res.push(ch);\n }\n const normalized = res.join('');\n return comment ? `${normalized} ${comment}` : normalized;\n}\n", "import {ConstField, EnumField, StructField, ThriftFormattingOptions} from '../interfaces.types';\nimport {ThriftParser} from '../ast/parser';\nimport {buildAstIndex} from './ast-index';\nimport {\n buildEnumFieldFromAst,\n buildStructFieldFromAst,\n isEnumFieldText,\n isStructFieldText,\n parseConstFieldText,\n parseEnumFieldText,\n parseStructFieldText\n} from './field-parser';\nimport {formatConstFields} from './const-format';\nimport {formatBlockComment} from './comment-format';\nimport {formatEnumContentLine} from './enum-content';\nimport {formatEnumFields} from './field-format';\nimport {formatStructFields} from './struct-format';\nimport {getIndent, getServiceIndent} from './indent';\nimport {\n formatInlineEnum,\n formatInlineService,\n formatInlineStructLike,\n isInlineEnum,\n isInlineService,\n isInlineStructLike\n} from './inline-format';\nimport {\n flushConstBlockIfNeeded,\n flushStructFieldsIfNeeded,\n formatOpenBraceLine,\n formatSkippedLine,\n formatTypedefLine,\n handleConstStartLine\n} from './line-handlers';\nimport {isAnnotationStartLine, isEnumStartLine, isInteractionStartLine, isServiceStartLine, isStructStartLine} from './line-detection';\nimport {formatServiceContentLine} from './service-content';\nimport {isServiceMethodLine} from './service-method';\nimport {formatStructContentLine} from './struct-content';\nimport {formatSingleLineEnum, formatSingleLineService, formatSingleLineStruct} from './single-line-format';\nimport {normalizeGenericsInSignature, splitTopLevelParts} from './text-utils';\nimport {createLineRange, LineRange} from '../utils/line-range';\nimport {hashContent} from '../utils/cache-expiry';\nimport {ErrorHandler} from '../utils/error-handler';\n\nconst formatErrorHandler = new ErrorHandler();\n\nconst DEFAULT_FORMAT_OPTIONS: ThriftFormattingOptions = {\n trailingComma: 'preserve',\n alignTypes: true,\n alignFieldNames: true,\n alignStructDefaults: false,\n alignAnnotations: true,\n alignComments: true,\n alignEnumNames: true,\n alignEnumEquals: true,\n alignEnumValues: true,\n indentSize: 4,\n maxLineLength: 100,\n collectionStyle: 'preserve',\n insertSpaces: true,\n tabSize: 4\n};\n\n/**\n * Format Thrift source with unified rules.\n * @param content - Raw Thrift content to format.\n * @param options - Formatting options.\n * @param dirtyRange - Optional dirty range for incremental formatting.\n * @returns Formatted Thrift content.\n */\nexport function formatThriftContent(\n content: string,\n options: ThriftFormattingOptions = DEFAULT_FORMAT_OPTIONS,\n dirtyRange?: LineRange\n): string {\n const lines = content.split(/\\r?\\n/);\n\n const lastLineIndex = Math.max(0, lines.length - 1);\n if (dirtyRange) {\n const startLine = Math.max(0, Math.min(dirtyRange.startLine, lastLineIndex));\n const endLine = Math.max(0, Math.min(dirtyRange.endLine, lastLineIndex));\n dirtyRange = createLineRange(startLine, endLine);\n }\n\n let ast;\n if (dirtyRange && options.incrementalFormattingEnabled === true) {\n const uri = `mock:formatter:${hashContent(content)}`;\n const incrementalResult = ThriftParser.incrementalParseWithCache(uri, content, dirtyRange);\n ast = incrementalResult?.ast ?? new ThriftParser(content).parse();\n } else {\n ast = new ThriftParser(content).parse();\n }\n\n const astIndex = buildAstIndex(ast);\n const {\n structStarts,\n structFieldIndex,\n structFieldEnds,\n enumStarts,\n enumMemberIndex,\n serviceStarts,\n serviceFunctionIndex,\n interactionStarts,\n constStarts,\n constEnds\n } = astIndex;\n const formattedLines: string[] = [];\n let indentLevel = (options.initialContext && typeof options.initialContext.indentLevel === 'number')\n ? options.initialContext.indentLevel : 0;\n let inStruct = !!(options.initialContext && options.initialContext.inStruct);\n let inEnum = !!(options.initialContext && options.initialContext.inEnum);\n let inService = options.initialContext?.inService === true;\n let inInteraction = options.initialContext?.inInteraction === true;\n let serviceIndentLevel = (options.initialContext && typeof options.initialContext.indentLevel === 'number')\n ? options.initialContext.indentLevel : 0;\n let structFields: StructField[] = [];\n let enumFields: EnumField[] = [];\n let constFields: ConstField[] = [];\n let inConstBlock = false;\n // Track the indent level where the current const block started, so flushing uses the correct base indent\n let constBlockIndentLevel: number | null = null;\n // Track annotation block depth for top-level @Annotation{...} blocks\n let topAnnotationDepth = 0;\n // Caller-maintained annotation depths for service/interaction bodies (avoids module-level state)\n let serviceAnnotationDepth = 0;\n let interactionAnnotationDepth = 0;\n\n for (let i = 0; i < lines.length; i++) {\n try {\n const originalLine = lines[i];\n const line = originalLine.trim();\n const isConstStart = constStarts.has(i);\n const isStructStart = structStarts.has(i) || isStructStartLine(line);\n const isEnumStart = enumStarts.has(i) || isEnumStartLine(line);\n const isServiceStart = serviceStarts.has(i) || isServiceStartLine(line);\n const isInteractionStart = interactionStarts.has(i) || isInteractionStartLine(line);\n\n // Flush accumulated struct fields before non-field separators/comments inside struct\n const structFlush = flushStructFieldsIfNeeded(\n inStruct,\n structFields,\n line,\n i,\n structFieldIndex,\n indentLevel,\n options,\n {\n formatStructFields: (fields, innerOptions, level) =>\n formatStructFields(fields, innerOptions, level, {getIndent}),\n isStructFieldText\n }\n );\n if (structFlush.formattedLines.length > 0) {\n formattedLines.push(...structFlush.formattedLines);\n }\n structFields = structFlush.structFields;\n\n // Handle block comments\n const blockComment = formatBlockComment(\n lines,\n i,\n indentLevel,\n inService,\n serviceIndentLevel,\n options,\n {getIndent, getServiceIndent}\n );\n if (blockComment) {\n formattedLines.push(...blockComment.formattedLines);\n i = blockComment.endIndex;\n continue;\n }\n\n // Flush const block if needed\n const constFlush = flushConstBlockIfNeeded(\n inConstBlock,\n constFields,\n isConstStart,\n constBlockIndentLevel,\n indentLevel,\n options,\n {\n formatConstFields: (fields, innerOptions, level) =>\n formatConstFields(fields, innerOptions, level, {getIndent})\n }\n );\n if (constFlush.formattedLines.length > 0) {\n formattedLines.push(...constFlush.formattedLines);\n }\n constFields = constFlush.constFields;\n inConstBlock = constFlush.inConstBlock;\n constBlockIndentLevel = constFlush.constBlockIndentLevel;\n\n // Skip empty lines and line comments\n const skippedLine = formatSkippedLine(\n line,\n inService,\n serviceIndentLevel,\n indentLevel,\n options,\n {getIndent, getServiceIndent},\n inInteraction\n );\n if (skippedLine) {\n formattedLines.push(...skippedLine);\n continue;\n }\n\n // Handle const fields (AST indexed)\n const constStart = handleConstStartLine(\n lines,\n i,\n isConstStart,\n constEnds,\n inStruct,\n inEnum,\n inService,\n indentLevel,\n constFields,\n constBlockIndentLevel,\n {parseConstFieldText}\n );\n if (constStart.handled) {\n constFields = constStart.constFields;\n inConstBlock = constStart.inConstBlock;\n constBlockIndentLevel = constStart.constBlockIndentLevel;\n i = constStart.nextIndex;\n continue;\n }\n\n // Typedef normalization\n const typedefLine = formatTypedefLine(line, indentLevel, options, {\n getIndent,\n normalizeGenericsInSignature\n });\n if (typedefLine) {\n formattedLines.push(...typedefLine);\n continue;\n }\n\n // Handle struct/union/exception definitions\n if (isInlineStructLike(line)) {\n const formattedInline = formatInlineStructLike(line, indentLevel, options, {\n getIndent,\n getServiceIndent,\n formatStructFields: (fields, inlineOptions, level) =>\n formatStructFields(fields, inlineOptions, level, {getIndent}),\n formatEnumFields: (fields, inlineOptions, level) =>\n formatEnumFields(fields, inlineOptions, level, {getIndent}),\n parseStructFieldText,\n parseEnumFieldText,\n normalizeGenericsInSignature,\n splitTopLevelParts\n });\n if (formattedInline) {\n formattedLines.push(...formattedInline);\n continue;\n }\n }\n if (isStructStart) {\n const formattedSingleLine = formatSingleLineStruct(line, indentLevel, options, {\n getIndent,\n getServiceIndent,\n formatStructFields: (fields, innerOptions, level) =>\n formatStructFields(fields, innerOptions, level, {getIndent}),\n formatEnumFields: (fields, innerOptions, level) =>\n formatEnumFields(fields, innerOptions, level, {getIndent}),\n parseStructFieldText,\n parseEnumFieldText,\n normalizeGenericsInSignature,\n splitTopLevelParts\n });\n if (formattedSingleLine) {\n formattedLines.push(...formattedSingleLine);\n continue;\n }\n formattedLines.push(getIndent(indentLevel, options) + line);\n indentLevel++;\n inStruct = true;\n continue;\n }\n\n // Handle service definitions\n if (isInlineService(line)) {\n const formattedInline = formatInlineService(line, indentLevel, options, {\n getIndent,\n getServiceIndent,\n formatStructFields: (fields, inlineOptions, level) =>\n formatStructFields(fields, inlineOptions, level, {getIndent}),\n formatEnumFields: (fields, inlineOptions, level) =>\n formatEnumFields(fields, inlineOptions, level, {getIndent}),\n parseStructFieldText,\n parseEnumFieldText,\n normalizeGenericsInSignature,\n splitTopLevelParts\n });\n if (formattedInline) {\n formattedLines.push(...formattedInline);\n continue;\n }\n }\n if (isServiceStart) {\n const formattedSingleLine = formatSingleLineService(line, indentLevel, options, {\n getIndent,\n getServiceIndent,\n formatStructFields: (fields, innerOptions, level) =>\n formatStructFields(fields, innerOptions, level, {getIndent}),\n formatEnumFields: (fields, innerOptions, level) =>\n formatEnumFields(fields, innerOptions, level, {getIndent}),\n parseStructFieldText,\n parseEnumFieldText,\n normalizeGenericsInSignature,\n splitTopLevelParts\n });\n if (formattedSingleLine) {\n formattedLines.push(...formattedSingleLine);\n continue;\n }\n formattedLines.push(getIndent(indentLevel, options) + line);\n // For service, we want methods to be indented 2 spaces, not 4\n // So we don't increment indentLevel here, but track service state\n inService = true;\n serviceIndentLevel = indentLevel; // Track the service base level\n continue;\n }\n\n // Handle interaction definitions (similar to service)\n if (isInteractionStart) {\n formattedLines.push(getIndent(indentLevel, options) + line);\n inInteraction = true;\n serviceIndentLevel = indentLevel;\n continue;\n }\n if (inStruct) {\n const structResult = formatStructContentLine(\n line,\n i,\n indentLevel,\n structFields,\n structFieldIndex,\n options,\n {\n getIndent,\n formatStructFields: (fields, innerOptions, level) =>\n formatStructFields(fields, innerOptions, level, {getIndent}),\n buildStructFieldFromAst,\n parseStructFieldText,\n normalizeGenericsInSignature,\n isServiceMethod: (line, li) => isServiceMethodLine(line, li, serviceFunctionIndex),\n sourceLines: lines,\n structFieldEnds\n }\n );\n structFields = structResult.structFields;\n if (structResult.formattedLines.length > 0) {\n formattedLines.push(...structResult.formattedLines);\n }\n indentLevel = structResult.indentLevel;\n inStruct = structResult.inStruct;\n if (structResult.handled) {\n // \u591A\u884C\u5B57\u6BB5\uFF1Astruct-content \u5DF2\u5C06\u8D77\u59CB\u884C\u5230\u7ED3\u675F\u884C\u5408\u5E76\u4E3A\u4E00\u4E2A\u5B57\u6BB5\uFF1B\n // \u8DF3\u8FC7\u5DF2\u6D88\u8D39\u7684\u7EED\u884C\uFF0C\u907F\u514D\u91CD\u590D\u5904\u7406\u3002\n if (structResult.skipToIndex !== undefined && structResult.skipToIndex > i) {\n i = structResult.skipToIndex;\n }\n continue;\n }\n }\n\n // Handle service content\n if (inService) {\n const serviceResult = formatServiceContentLine(line, i, serviceIndentLevel, options, {\n getServiceIndent,\n normalizeGenericsInSignature,\n isServiceMethod: (line, li) => isServiceMethodLine(line, li, serviceFunctionIndex)\n }, serviceAnnotationDepth);\n formattedLines.push(...serviceResult.formattedLines);\n serviceAnnotationDepth = serviceResult.annotationDepth;\n if (serviceResult.closeService) {\n inService = false;\n serviceAnnotationDepth = 0;\n }\n continue;\n }\n\n // Handle interaction content (same formatting as service)\n if (inInteraction) {\n const interactionResult = formatServiceContentLine(line, i, serviceIndentLevel, options, {\n getServiceIndent,\n normalizeGenericsInSignature,\n isServiceMethod: (line, li) => isServiceMethodLine(line, li, serviceFunctionIndex)\n }, interactionAnnotationDepth);\n formattedLines.push(...interactionResult.formattedLines);\n interactionAnnotationDepth = interactionResult.annotationDepth;\n if (interactionResult.closeService) {\n inInteraction = false;\n interactionAnnotationDepth = 0;\n }\n continue;\n }\n\n // Handle top-level annotation blocks (e.g. @ServiceMetadata{...})\n if (isAnnotationStartLine(line)) {\n formattedLines.push(getIndent(indentLevel, options) + line);\n indentLevel++;\n topAnnotationDepth++;\n continue;\n }\n if (topAnnotationDepth > 0) {\n if (line === '}') {\n topAnnotationDepth--;\n if (topAnnotationDepth === 0) {\n indentLevel--;\n }\n }\n formattedLines.push(getIndent(indentLevel, options) + line);\n continue;\n }\n\n if (isInlineEnum(line)) {\n const formattedInline = formatInlineEnum(line, indentLevel, options, {\n getIndent,\n getServiceIndent,\n formatStructFields: (fields, inlineOptions, level) =>\n formatStructFields(fields, inlineOptions, level, {getIndent}),\n formatEnumFields: (fields, inlineOptions, level) =>\n formatEnumFields(fields, inlineOptions, level, {getIndent}),\n parseStructFieldText,\n parseEnumFieldText,\n normalizeGenericsInSignature,\n splitTopLevelParts\n });\n if (formattedInline) {\n formattedLines.push(...formattedInline);\n continue;\n }\n }\n if (isEnumStart) {\n const formattedSingleLine = formatSingleLineEnum(line, indentLevel, options, {\n getIndent,\n getServiceIndent,\n formatStructFields: (fields, innerOptions, level) =>\n formatStructFields(fields, innerOptions, level, {getIndent}),\n formatEnumFields: (fields, innerOptions, level) =>\n formatEnumFields(fields, innerOptions, level, {getIndent}),\n parseStructFieldText,\n parseEnumFieldText,\n normalizeGenericsInSignature,\n splitTopLevelParts\n });\n if (formattedSingleLine) {\n formattedLines.push(...formattedSingleLine);\n continue;\n }\n formattedLines.push(getIndent(indentLevel, options) + line);\n indentLevel++;\n inEnum = true;\n continue;\n }\n if (inEnum) {\n const enumResult = formatEnumContentLine(\n line,\n i,\n indentLevel,\n enumFields,\n enumMemberIndex,\n options,\n {\n getIndent,\n formatEnumFields: (fields, innerOptions, level) =>\n formatEnumFields(fields, innerOptions, level, {getIndent}),\n buildEnumFieldFromAst,\n parseEnumFieldText,\n isEnumFieldText\n }\n );\n enumFields = enumResult.enumFields;\n if (enumResult.formattedLines.length > 0) {\n formattedLines.push(...enumResult.formattedLines);\n }\n indentLevel = enumResult.indentLevel;\n inEnum = enumResult.inEnum;\n if (enumResult.handled) {\n continue;\n }\n }\n\n const openBraceLine = formatOpenBraceLine(line, indentLevel, options, {getIndent});\n if (openBraceLine) {\n formattedLines.push(...openBraceLine);\n continue;\n }\n\n formattedLines.push(getIndent(indentLevel, options) + line);\n } catch (lineError) {\n formatErrorHandler.handleWarning('Line formatting failed, preserving original', {\n component: 'formatThriftContent',\n operation: 'formatLine',\n additionalInfo: {line: i, error: lineError instanceof Error ? lineError.message : 'Unknown'}\n });\n formattedLines.push(getIndent(indentLevel, options) + lines[i].trim());\n }\n }\n\n if (constFields.length > 0) {\n const formattedFields = formatConstFields(constFields, options, constBlockIndentLevel ?? indentLevel, {\n getIndent\n });\n formattedLines.push(...formattedFields);\n }\n if (structFields.length > 0) {\n const formattedFields = formatStructFields(structFields, options, indentLevel, {\n getIndent\n });\n formattedLines.push(...formattedFields);\n }\n if (enumFields.length > 0) {\n const formattedFields = formatEnumFields(enumFields, options, indentLevel, {\n getIndent\n });\n formattedLines.push(...formattedFields);\n }\n\n const cleaned = formattedLines.map(l => l.trimEnd());\n return cleaned.join('\\n');\n}\n", "/**\n * Chunked formatting for large files.\n *\n * When a file exceeds CHUNK_THRESHOLD lines, we split along top-level block\n * boundaries (namespace, include, typedef, const, struct, enum, service, etc.)\n * and format each chunk independently. This keeps per-chunk work bounded and\n * avoids O(n^2) effects from alignment column scanning across thousands of\n * unrelated fields.\n *\n * The chunks are determined by the AST's top-level body nodes. Lines between\n * top-level nodes (comments, blank lines) are grouped with the *next* node\n * (leading context). The formatted chunks are joined with the original inter-\n * block spacing preserved (blank lines between definitions).\n */\n\nimport {ThriftFormattingOptions} from '../interfaces.types';\nimport {ThriftParser} from '../ast/parser';\nimport * as nodes from '../ast/nodes.types';\n\n/**\n * Files shorter than this are formatted in one pass (no chunking overhead).\n * Set high because the direct path is already fast (6000 lines < 20ms).\n * Chunking adds per-chunk AST parse overhead that only pays off for very\n * large files where O(n) effects in alignment scanning compound.\n */\nexport const CHUNK_THRESHOLD = 10000;\n\ninterface Chunk {\n startLine: number;\n endLine: number; // inclusive\n text: string;\n}\n\n/**\n * Split content into top-level chunks using AST body node boundaries.\n * Each chunk contains exactly one top-level definition plus any leading\n * comments/blank lines that precede it.\n */\nexport function splitIntoChunks(content: string): Chunk[] {\n const lines = content.split('\\n');\n if (lines.length <= CHUNK_THRESHOLD) {\n return [{startLine: 0, endLine: lines.length - 1, text: content}];\n }\n\n let ast: nodes.ThriftDocument;\n try {\n ast = new ThriftParser(content).parse();\n } catch {\n // Parse failure \u2192 single chunk fallback\n return [{startLine: 0, endLine: lines.length - 1, text: content}];\n }\n\n const bodyNodes = ast.body.filter(\n n => n.type !== nodes.ThriftNodeType.Invalid\n );\n\n if (bodyNodes.length === 0) {\n return [{startLine: 0, endLine: lines.length - 1, text: content}];\n }\n\n const chunks: Chunk[] = [];\n let prevEnd = -1;\n\n for (let i = 0; i < bodyNodes.length; i++) {\n const node = bodyNodes[i];\n const nodeEnd = node.range.end.line;\n\n // Leading lines (comments, blanks) between previous node end and this node start\n const chunkStart = prevEnd + 1;\n const chunkEnd = Math.max(nodeEnd, chunkStart);\n\n chunks.push({\n startLine: chunkStart,\n endLine: chunkEnd,\n text: lines.slice(chunkStart, chunkEnd + 1).join('\\n')\n });\n\n prevEnd = chunkEnd;\n }\n\n // Trailing lines after last node (dangling comments, blank lines)\n if (prevEnd < lines.length - 1) {\n const trailingStart = prevEnd + 1;\n const trailingText = lines.slice(trailingStart).join('\\n');\n if (trailingText.trim().length > 0) {\n chunks.push({\n startLine: trailingStart,\n endLine: lines.length - 1,\n text: trailingText\n });\n }\n }\n\n return chunks;\n}\n\n/**\n * Format content using chunked strategy.\n * Each chunk is formatted independently with `formatFn`, then reassembled.\n */\nexport function formatChunked(\n content: string,\n options: ThriftFormattingOptions,\n formatFn: (chunk: string, opts: ThriftFormattingOptions) => string\n): string {\n const chunks = splitIntoChunks(content);\n\n if (chunks.length <= 1) {\n return formatFn(content, options);\n }\n\n const formattedChunks: string[] = [];\n\n for (const chunk of chunks) {\n const formatted = formatFn(chunk.text, options);\n formattedChunks.push(formatted);\n }\n\n return formattedChunks.join('\\n');\n}\n", "import {ThriftFormattingOptions} from '../interfaces.types';\nimport {LineRange} from '../utils/line-range';\nimport {ErrorHandler} from '../utils/error-handler';\nimport {formatThriftContent} from './formatter-core';\nimport {CHUNK_THRESHOLD, formatChunked} from './chunked-format';\n\n/**\n * ThriftFormatter\uFF1A\u5C06 Thrift \u6E90\u7801\u683C\u5F0F\u5316\u4E3A\u7EDF\u4E00\u98CE\u683C\u3002\n */\nexport class ThriftFormatter {\n private errorHandler: ErrorHandler;\n\n constructor(deps?: {errorHandler?: ErrorHandler}) {\n this.errorHandler = deps?.errorHandler ?? new ErrorHandler();\n }\n\n /**\n * \u683C\u5F0F\u5316\u6307\u5B9A\u6587\u672C\u5185\u5BB9\u3002\n * \u5BF9\u8D85\u8FC7 CHUNK_THRESHOLD \u884C\u7684\u6587\u4EF6\u542F\u7528\u5206\u5757\u683C\u5F0F\u5316\u4EE5\u63D0\u5347\u6027\u80FD\u3002\n */\n public format(content: string, options?: ThriftFormattingOptions, dirtyRange?: LineRange): string {\n try {\n // Chunked formatting for large files without explicit dirty range\n if (dirtyRange === undefined && content.split('\\n').length > CHUNK_THRESHOLD) {\n return formatChunked(content, options ?? {} as ThriftFormattingOptions, (chunk, opts) =>\n formatThriftContent(chunk, opts)\n );\n }\n return formatThriftContent(content, options, dirtyRange);\n } catch (error) {\n this.errorHandler.handleError(error, {\n component: 'ThriftFormatter',\n operation: 'format',\n additionalInfo: {contentLength: content.length}\n });\n return content;\n }\n }\n\n public formatThriftCode(text: string, options: ThriftFormattingOptions, dirtyRange?: LineRange): string {\n // Delegate to the existing format method\n return this.format(text, options, dirtyRange);\n }\n\n}\n", "/**\n * Shared diagnostic code constants for Thrift IDL.\n *\n * Centralizing these strings prevents drift between the diagnostic rules\n * (which emit them) and the code-actions provider (which consumes them\n * to offer quick-fixes).\n */\n\nexport const DIAGNOSTIC_CODES = {\n /** Unknown type reference (struct field, const, service arg, etc.) */\n TYPE_UNKNOWN: 'type.unknown',\n /** Typedef references an unknown base type */\n TYPEDEF_UNKNOWN_BASE: 'typedef.unknownBase',\n /** Service method return type is unknown */\n SERVICE_RETURN_TYPE_UNKNOWN: 'service.returnType.unknown',\n /** Throws clause references an unknown type */\n SERVICE_THROWS_UNKNOWN: 'service.throws.unknown',\n /** Service extends an unknown parent */\n SERVICE_EXTENDS_UNKNOWN: 'service.extends.unknown',\n /** Service extends a type that is not a service */\n SERVICE_EXTENDS_NOT_SERVICE: 'service.extends.notService',\n /** oneway method return type is not void */\n SERVICE_ONEWAY_RETURN_NOT_VOID: 'service.oneway.returnNotVoid',\n /** oneway method has throws clause */\n SERVICE_ONEWAY_HAS_THROWS: 'service.oneway.hasThrows',\n /** throws clause references a non-exception type */\n SERVICE_THROWS_NOT_EXCEPTION: 'service.throws.notException',\n /** Duplicate field ID in struct/union/exception */\n FIELD_DUPLICATE_ID: 'field.duplicateId',\n /** Default value type mismatch with field type */\n VALUE_TYPE_MISMATCH: 'value.typeMismatch',\n /** Enum member value is not an integer literal */\n ENUM_VALUE_NOT_INTEGER: 'enum.valueNotInteger',\n /** Unmatched closing brace/paren */\n SYNTAX_UNMATCHED_CLOSER: 'syntax.unmatchedCloser',\n /** Mismatched brace/paren pair */\n SYNTAX_MISMATCHED: 'syntax.mismatched',\n /** Unclosed brace/paren */\n SYNTAX_UNCLOSED: 'syntax.unclosed',\n} as const;\n\nexport type DiagnosticCode = typeof DIAGNOSTIC_CODES[keyof typeof DIAGNOSTIC_CODES];\n\n/**\n * Diagnostic codes that indicate an unknown/unresolved type reference.\n * The code-actions provider uses this set to offer \"Insert include\" quick-fixes.\n */\nexport const UNKNOWN_TYPE_DIAGNOSTIC_CODES = new Set<string>([\n DIAGNOSTIC_CODES.TYPE_UNKNOWN,\n DIAGNOSTIC_CODES.SERVICE_RETURN_TYPE_UNKNOWN,\n DIAGNOSTIC_CODES.SERVICE_THROWS_UNKNOWN,\n DIAGNOSTIC_CODES.TYPEDEF_UNKNOWN_BASE,\n]);\n", "import * as nodes from '../ast/nodes.types';\n\n/**\n * \u6536\u96C6 AST \u5185\u5B9A\u4E49\u7684\u7C7B\u578B\u4E0E\u7C7B\u578B\u7C7B\u522B\u3002\n * @param ast Thrift AST \u6839\u8282\u70B9\n * @returns \u7C7B\u578B\u540D\u79F0\u5230\u7C7B\u578B\u7C7B\u522B\u7684\u6620\u5C04 (e.g. \"User\" -> \"struct\")\n */\nexport function collectTypesFromAst(ast: nodes.ThriftDocument): Map<string, string> {\n const typeKind = new Map<string, string>();\n for (const node of ast.body) {\n switch (node.type) {\n case nodes.ThriftNodeType.Typedef:\n if (typeof node.name === 'string' && node.name.length > 0) {\n typeKind.set(node.name, 'typedef');\n }\n break;\n case nodes.ThriftNodeType.Enum:\n if (typeof node.name === 'string' && node.name.length > 0) {\n typeKind.set(node.name, (node).isSenum === true ? 'senum' : 'enum');\n }\n break;\n case nodes.ThriftNodeType.Struct:\n if (typeof node.name === 'string' && node.name.length > 0) {\n typeKind.set(node.name, 'struct');\n }\n break;\n case nodes.ThriftNodeType.Union:\n if (typeof node.name === 'string' && node.name.length > 0) {\n typeKind.set(node.name, 'union');\n }\n break;\n case nodes.ThriftNodeType.Exception:\n if (typeof node.name === 'string' && node.name.length > 0) {\n typeKind.set(node.name, 'exception');\n }\n break;\n case nodes.ThriftNodeType.Service:\n if (typeof node.name === 'string' && node.name.length > 0) {\n typeKind.set(node.name, 'service');\n }\n break;\n case nodes.ThriftNodeType.Interaction:\n if (typeof node.name === 'string' && node.name.length > 0) {\n typeKind.set(node.name, 'interaction');\n }\n break;\n default:\n break;\n }\n }\n return typeKind;\n}\n", "import {Range} from '../types';\nimport * as nodes from '../ast/nodes.types';\nimport {\n createLineRange,\n LineRange,\n mergeLineRanges,\n normalizeLineRange,\n rangeContainsLineRange,\n rangeIntersectsLineRange\n} from '../utils/line-range';\n\nexport function stripCommentsFromLine(rawLine: string, state: {inBlock: boolean}): string {\n let out = '';\n let inS = false, inD = false, escaped = false;\n for (let i = 0; i < rawLine.length;) {\n const ch = rawLine[i];\n const next = i + 1 < rawLine.length ? rawLine[i + 1] : '';\n\n if (!inS && !inD && !state.inBlock && ch === '/' && next === '*') {\n state.inBlock = true;\n i += 2;\n continue;\n }\n if (state.inBlock) {\n const endIdx = rawLine.indexOf('*/', i);\n if (endIdx === -1) {\n return out;\n } else {\n state.inBlock = false;\n i = endIdx + 2;\n continue;\n }\n }\n\n if ((ch === '\"' && !inS && !escaped) || (ch === '\\'' && !inD && !escaped)) {\n if (ch === '\"') {\n inD = !inD;\n } else {\n inS = !inS;\n }\n out += ch;\n i++;\n continue;\n }\n if ((inS || inD) && ch === '\\\\' && !escaped) {\n out += ch;\n i++;\n escaped = true;\n continue;\n }\n if (escaped) {\n out += ch;\n i++;\n escaped = false;\n continue;\n }\n\n if (!inS && !inD) {\n if ((ch === '/' && next === '/') || ch === '#') {\n break;\n }\n }\n\n out += ch;\n i++;\n }\n return out;\n}\n\nfunction stripStringLiterals(rawLine: string): string {\n let out = '';\n let inS = false;\n let inD = false;\n let escaped = false;\n\n for (let i = 0; i < rawLine.length; i++) {\n const ch = rawLine[i];\n\n if (escaped) {\n escaped = false;\n continue;\n }\n if (inS) {\n if (ch === '\\\\') {\n escaped = true;\n continue;\n }\n if (ch === '\\'') {\n inS = false;\n }\n continue;\n }\n if (inD) {\n if (ch === '\\\\') {\n escaped = true;\n continue;\n }\n if (ch === '\"') {\n inD = false;\n }\n continue;\n }\n\n if (ch === '\\'') {\n inS = true;\n continue;\n }\n if (ch === '\"') {\n inD = true;\n continue;\n }\n\n out += ch;\n }\n\n return out;\n}\n\nconst STRUCTURAL_TOKEN_PATTERN = /\\b(struct|union|exception|enum|senum|service|typedef|const|namespace|include)\\b/;\nconst STRUCTURAL_CHAR_PATTERN = /[{}]/;\n\nexport function sanitizeStructuralText(rawLine: string): string {\n const withoutComments = stripCommentsFromLine(rawLine, {inBlock: false});\n return stripStringLiterals(withoutComments);\n}\n\nexport function hasStructuralTokens(rawLine: string): boolean {\n const sanitized = sanitizeStructuralText(rawLine);\n return STRUCTURAL_CHAR_PATTERN.test(sanitized) || STRUCTURAL_TOKEN_PATTERN.test(sanitized);\n}\n\nexport function includesKeyword(rawLine: string): boolean {\n return /\\binclude\\b/.test(sanitizeStructuralText(rawLine));\n}\n\nexport const diagnosticsTestUtils = {\n includesKeyword,\n hasStructuralTokens,\n sanitizeStructuralText\n};\n\nexport function findBestContainingRange(ast: nodes.ThriftDocument, dirtyRange: LineRange) {\n const normalized = normalizeLineRange(dirtyRange);\n if (!normalized) {\n return null;\n }\n let best: LineRange | null = null;\n let bestSpan = Number.POSITIVE_INFINITY;\n for (const node of ast.body) {\n if (node.range.start.line > normalized.startLine || node.range.end.line < normalized.endLine) {\n continue;\n }\n const span = node.range.end.line - node.range.start.line;\n if (span < bestSpan) {\n bestSpan = span;\n best = createLineRange(node.range.start.line, node.range.end.line);\n }\n }\n return best;\n}\n\nexport function findBestContainingRangeForChanges(ast: nodes.ThriftDocument, dirtyRanges: LineRange[]) {\n const merged = mergeLineRanges(dirtyRanges);\n if (!merged.length) {\n return null;\n }\n let best: LineRange | null = null;\n let bestSpan = Number.POSITIVE_INFINITY;\n for (const node of ast.body) {\n const containsAll = merged.every(range => rangeContainsLineRange(node.range, range));\n if (!containsAll) {\n continue;\n }\n const span = node.range.end.line - node.range.start.line;\n if (span < bestSpan) {\n bestSpan = span;\n best = createLineRange(node.range.start.line, node.range.end.line);\n }\n }\n return best;\n}\n\nexport function findBestContainingMemberRange(ast: nodes.ThriftDocument, dirtyRange: LineRange) {\n const normalized = normalizeLineRange(dirtyRange);\n if (!normalized) {\n return null;\n }\n let best: LineRange | null = null;\n let bestSpan = Number.POSITIVE_INFINITY;\n for (const node of ast.body) {\n if (!rangeContainsLineRange(node.range, normalized)) {\n continue;\n }\n let members: Array<{range: Range}> = [];\n if (node.type === nodes.ThriftNodeType.Struct || node.type === nodes.ThriftNodeType.Union || node.type === nodes.ThriftNodeType.Exception) {\n members = (node ).fields;\n } else if (node.type === nodes.ThriftNodeType.Enum) {\n members = (node ).members;\n } else if (node.type === nodes.ThriftNodeType.Service) {\n members = (node ).functions;\n } else {\n continue;\n }\n for (const member of members) {\n if (!rangeContainsLineRange(member.range, normalized)) {\n continue;\n }\n const span = member.range.end.line - member.range.start.line;\n if (span < bestSpan) {\n bestSpan = span;\n best = createLineRange(member.range.start.line, member.range.end.line);\n }\n }\n }\n return best;\n}\n\nexport function findBestContainingMemberRangeForChanges(ast: nodes.ThriftDocument, dirtyRanges: LineRange[]) {\n const merged = mergeLineRanges(dirtyRanges);\n if (!merged.length) {\n return null;\n }\n let best: LineRange | null = null;\n let bestSpan = Number.POSITIVE_INFINITY;\n for (const node of ast.body) {\n const containsAll = merged.every(range => rangeContainsLineRange(node.range, range));\n if (!containsAll) {\n continue;\n }\n let members: Array<{range: Range}> = [];\n if (node.type === nodes.ThriftNodeType.Struct || node.type === nodes.ThriftNodeType.Union || node.type === nodes.ThriftNodeType.Exception) {\n members = (node ).fields;\n } else if (node.type === nodes.ThriftNodeType.Enum) {\n members = (node ).members;\n } else if (node.type === nodes.ThriftNodeType.Service) {\n members = (node ).functions;\n } else {\n continue;\n }\n for (const member of members) {\n const memberContainsAll = merged.every(range => rangeContainsLineRange(member.range, range));\n if (!memberContainsAll) {\n continue;\n }\n const span = member.range.end.line - member.range.start.line;\n if (span < bestSpan) {\n bestSpan = span;\n best = createLineRange(member.range.start.line, member.range.end.line);\n }\n }\n }\n return best;\n}\n\nexport function findContainingNode(ast: nodes.ThriftDocument, targetRange: LineRange) {\n const normalized = normalizeLineRange(targetRange);\n if (!normalized) {\n return null;\n }\n let best: nodes.ThriftDocument['body'][number] | null = null;\n let bestSpan = Number.POSITIVE_INFINITY;\n for (const node of ast.body) {\n if (!rangeContainsLineRange(node.range, normalized)) {\n continue;\n }\n const span = node.range.end.line - node.range.start.line;\n if (span < bestSpan) {\n bestSpan = span;\n best = node;\n }\n }\n return best;\n}\n\nexport function buildPartialLines(lines: string[], startLine: number, endLine: number): string[] {\n return lines.map((line, idx) => (idx >= startLine && idx <= endLine) ? line : '');\n}\n\nexport function hashText(text: string): number {\n let hash = 5381;\n for (let i = 0; i < text.length; i++) {\n hash = ((hash << 5) + hash) + text.charCodeAt(i);\n hash |= 0;\n }\n return hash;\n}\n\nexport function filterIssuesByLineRange(issues: {range: Range}[], lineRange: LineRange) {\n return issues.filter(issue => rangeIntersectsLineRange(issue.range, lineRange));\n}\n", "import * as path from 'path';\nimport * as nodes from '../../ast/nodes.types';\nimport {collectTypesFromAst} from '../include-resolver';\n\nexport interface AnalysisContext {\n includeAliases: Set<string>;\n typeKind: Map<string, string>;\n}\n\n/**\n * \u63D0\u53D6 include \u522B\u540D\u96C6\u5408\uFF0C\u7528\u4E8E\u547D\u540D\u7A7A\u95F4\u7C7B\u578B\u89E3\u6790\u3002\n * @param ast \u5F53\u524D AST\n * @returns include \u522B\u540D\u96C6\u5408\n */\nexport function collectIncludeAliasesFromAst(ast: nodes.ThriftDocument): Set<string> {\n const includeAliases = new Set<string>();\n for (const node of ast.body) {\n if (node.type === nodes.ThriftNodeType.Include) {\n const includePath = (node ).path;\n const alias = path.basename(includePath, '.thrift');\n if (alias) {\n includeAliases.add(alias);\n }\n }\n }\n return includeAliases;\n}\n\n/**\n * \u6784\u5EFA\u8BCA\u65AD\u4E0A\u4E0B\u6587\uFF08include \u522B\u540D + \u5DF2\u5B9A\u4E49\u7C7B\u578B\u96C6\u5408\uFF09\u3002\n * @param ast \u5F53\u524D AST\n * @returns \u5206\u6790\u4E0A\u4E0B\u6587\n */\nexport function buildAnalysisContext(ast: nodes.ThriftDocument): AnalysisContext {\n return {\n includeAliases: collectIncludeAliasesFromAst(ast),\n typeKind: collectTypesFromAst(ast)\n };\n}\n", "import {QuoteTracker} from '../../utils/quote-tracker';\n\nconst PRIMITIVES = new Set<string>([\n 'void', 'bool', 'byte', 'i8', 'i16', 'i32', 'i64', 'double', 'string', 'binary', 'uuid'\n]);\n\n// Thrift extended-syntax keyword types valid as reference<> arguments\nconst KEYWORD_TYPES = new Set<string>(['interaction', 'service']);\n\nconst integerTypes = new Set<string>(['byte', 'i8', 'i16', 'i32', 'i64']);\nconst uuidRegex = /^[0-9a-fA-F]{8}-([0-9a-fA-F]{4}-){3}[0-9a-fA-F]{12}$/;\n\n/**\n * \u83B7\u53D6 Thrift \u5185\u7F6E\u57FA\u7840\u7C7B\u578B\u96C6\u5408\u3002\n * @returns \u57FA\u7840\u7C7B\u578B\u96C6\u5408\n */\nexport function getPrimitiveTypes(): Set<string> {\n return PRIMITIVES;\n}\n\nconst CONTAINER_KEYWORDS = new Set(['list', 'set', 'map', 'stream', 'sink', 'interaction', 'reference']);\n\nexport interface ContainerTypeInfo {\n keyword: string;\n typeArgs: string[];\n}\n\n/**\n * Parse a container type using angle-bracket depth tracking instead of regex.\n * Handles nested generics like list<map<string, i32>> correctly.\n * @returns Container info or null if the type is not a valid container.\n */\nexport function parseContainerTypeInfo(typeText: string): ContainerTypeInfo | null {\n const cleaned = typeText.trim();\n // Find the keyword before the first '<'\n let keywordEnd = -1;\n for (let i = 0; i < cleaned.length; i++) {\n const ch = cleaned[i];\n if (ch === '<') {\n keywordEnd = i;\n break;\n }\n if (ch === ' ' || ch === '\\t') {\n if (keywordEnd === -1) {\n keywordEnd = i;\n }\n // Continue scanning \u2014 there could be spaces before '<'\n continue;\n }\n keywordEnd = -1;\n }\n if (keywordEnd <= 0) { return null; }\n\n const keyword = cleaned.slice(0, keywordEnd).trim();\n if (!CONTAINER_KEYWORDS.has(keyword)) { return null; }\n\n // Find the matching '>' using depth tracking\n const openPos = cleaned.indexOf('<', keywordEnd);\n if (openPos === -1) { return null; }\n\n let depth = 0;\n let closePos = -1;\n for (let i = openPos; i < cleaned.length; i++) {\n if (cleaned[i] === '<') { depth++; }\n if (cleaned[i] === '>') {\n depth--;\n if (depth === 0) { closePos = i; break; }\n }\n }\n if (closePos === -1) { return null; }\n\n // Check nothing follows except whitespace/annotations\n const tail = cleaned.slice(closePos + 1).trim();\n if (tail.length > 0 && !tail.startsWith('(')) { return null; }\n\n const inner = cleaned.slice(openPos + 1, closePos).trim();\n if (inner.length === 0) { return null; }\n\n const typeArgs = splitTopLevelAngles(inner);\n if (keyword === 'map' && typeArgs.length !== 2) { return null; }\n if (keyword !== 'map' && typeArgs.length !== 1) { return null; }\n\n return {keyword, typeArgs};\n}\n\n/**\n * Strip trailing annotations from a type string for structural analysis.\n * Uses paren depth tracking to handle nested annotations like (range={min:0, max:100}).\n */\nfunction stripAnnotationsForType(typeText: string): string {\n let depth = 0;\n let cutStart = -1;\n const qt = new QuoteTracker();\n for (let i = 0; i < typeText.length; i++) {\n const ch = typeText[i];\n if (qt.inside()) { qt.feed(ch); continue; }\n if (ch === '\\'' || ch === '\"') { qt.feed(ch); continue; }\n if (ch === '(') {\n if (depth === 0) { cutStart = i; }\n depth++;\n }\n if (ch === ')') {\n depth--;\n if (depth === 0 && cutStart !== -1) {\n // Check nothing follows except whitespace\n const tail = typeText.slice(i + 1).trim();\n if (tail.length === 0) {\n return typeText.slice(0, cutStart).trim();\n }\n cutStart = -1;\n }\n }\n }\n return typeText.trim();\n}\n\nfunction parseContainerType(typeText: string): boolean {\n return parseContainerTypeInfo(stripAnnotationsForType(typeText)) !== null;\n}\n\n/**\n * \u6309\u9876\u5C42\u6CDB\u578B\u6DF1\u5EA6\u62C6\u5206\u7C7B\u578B\u53C2\u6570\u5217\u8868\u3002\n * @param typeInner \u7C7B\u578B\u53C2\u6570\u5217\u8868\u6587\u672C\n * @returns \u62C6\u5206\u540E\u7684\u53C2\u6570\u6570\u7EC4\n */\nfunction splitTopLevelAngles(typeInner: string): string[] {\n const parts: string[] = [];\n let buf = '';\n let depth = 0;\n for (let i = 0; i < typeInner.length; i++) {\n const ch = typeInner[i];\n if (ch === '<') {\n depth++;\n }\n if (ch === '>') {\n depth = Math.max(0, depth - 1);\n }\n if (ch === ',' && depth === 0) {\n parts.push(buf);\n buf = '';\n } else {\n buf += ch;\n }\n }\n if (buf) {\n parts.push(buf);\n }\n return parts.map(s => s.trim()).filter(Boolean);\n}\n\n/**\n * \u79FB\u9664\u7C7B\u578B\u6CE8\u89E3\uFF08\u5982 `(go.tag=\"...\")`\uFF09\u5E76\u4FDD\u7559\u7C7B\u578B\u4E3B\u4F53\u3002\n * @param typeText \u7C7B\u578B\u6587\u672C\n * @returns \u53BB\u9664\u6CE8\u89E3\u540E\u7684\u7C7B\u578B\u6587\u672C\n */\nfunction stripTypeAnnotations(typeText: string): string {\n let out = '';\n let parenDepth = 0;\n const qt = new QuoteTracker();\n\n for (let i = 0; i < typeText.length; i++) {\n const ch = typeText[i];\n\n if (parenDepth > 0) {\n qt.feed(ch);\n if (!qt.inside() && ch === ')') {\n parenDepth--;\n }\n continue;\n }\n\n if (!qt.inside()) {\n if (ch === '(') {\n parenDepth++;\n continue;\n }\n }\n\n out += ch;\n qt.feed(ch);\n }\n\n return out.trim();\n}\n\n/**\n * \u5224\u65AD\u7C7B\u578B\u662F\u5426\u5DF2\u5B9A\u4E49\u6216\u5C5E\u4E8E\u57FA\u7840\u7C7B\u578B\uFF08\u542B\u5BB9\u5668/\u547D\u540D\u7A7A\u95F4\u7C7B\u578B\uFF09\u3002\n * @param typeName \u7C7B\u578B\u540D\u79F0\n * @param definedTypes \u5DF2\u5B9A\u4E49\u7C7B\u578B\u96C6\u5408\n * @param includeAliases include \u522B\u540D\u96C6\u5408\n * @returns \u662F\u5426\u4E3A\u5DF2\u77E5\u7C7B\u578B\n */\n/**\n * Detect whether a default value string has unclosed brackets/braces/parens\n * indicating it was truncated by single-line parsing.\n */\nfunction hasUnclosedDelimiters(value: string): boolean {\n let depthBracket = 0, depthBrace = 0, depthParen = 0;\n const qt = new QuoteTracker();\n for (let i = 0; i < value.length; i++) {\n const ch = value[i];\n if (qt.inside()) { qt.feed(ch); continue; }\n if (ch === '\\'' || ch === '\"') { qt.feed(ch); continue; }\n if (ch === '[') { depthBracket++; }\n if (ch === ']') { depthBracket = Math.max(0, depthBracket - 1); }\n if (ch === '{') { depthBrace++; }\n if (ch === '}') { depthBrace = Math.max(0, depthBrace - 1); }\n if (ch === '(') { depthParen++; }\n if (ch === ')') { depthParen = Math.max(0, depthParen - 1); }\n }\n return depthBracket > 0 || depthBrace > 0 || depthParen > 0;\n}\n\n/**\n * Read subsequent lines to build the complete multi-line default value.\n * Used by diagnostics to properly validate multi-line collection defaults.\n */\nexport function resolveMultilineDefaultFromLines(\n lines: string[],\n startLine: number,\n initialValue: string\n): string | null {\n if (!hasUnclosedDelimiters(initialValue)) {\n return null;\n }\n\n let depthBracket = 0, depthBrace = 0, depthParen = 0;\n const qt = new QuoteTracker();\n for (let i = 0; i < initialValue.length; i++) {\n const ch = initialValue[i];\n if (qt.inside()) { qt.feed(ch); continue; }\n if (ch === '\\'' || ch === '\"') { qt.feed(ch); continue; }\n if (ch === '[') { depthBracket++; }\n if (ch === ']') { depthBracket = Math.max(0, depthBracket - 1); }\n if (ch === '{') { depthBrace++; }\n if (ch === '}') { depthBrace = Math.max(0, depthBrace - 1); }\n if (ch === '(') { depthParen++; }\n if (ch === ')') { depthParen = Math.max(0, depthParen - 1); }\n }\n\n const parts: string[] = [initialValue];\n let endLine = startLine;\n const maxLine = Math.min(startLine + 50, lines.length - 1);\n\n while ((depthBracket > 0 || depthBrace > 0 || depthParen > 0) && endLine < maxLine) {\n endLine++;\n const nextLine = lines[endLine];\n for (let i = 0; i < nextLine.length; i++) {\n const ch = nextLine[i];\n if (qt.inside()) { qt.feed(ch); continue; }\n if (ch === '\\'' || ch === '\"') { qt.feed(ch); continue; }\n if (ch === '[') { depthBracket++; }\n if (ch === ']') { depthBracket = Math.max(0, depthBracket - 1); }\n if (ch === '{') { depthBrace++; }\n if (ch === '}') { depthBrace = Math.max(0, depthBrace - 1); }\n if (ch === '(') { depthParen++; }\n if (ch === ')') { depthParen = Math.max(0, depthParen - 1); }\n }\n parts.push(nextLine);\n }\n\n const fullValue = parts.join('\\n');\n // Strip trailing comma/semicolon, then annotations (with nested paren support)\n const withoutComma = fullValue.replace(/[,;]\\s*$/, '');\n return stripAnnotationsForType(withoutComma).trimEnd();\n}\n\n/**\n * Resolve a multi-line string default value that uses Thrift's backslash\n * line-continuation syntax. E.g.:\n * \"Hello \\\n * World\"\n * becomes \"Hello World\".\n */\nexport function resolveMultilineStringDefault(\n lines: string[],\n startLine: number,\n initialValue: string\n): string | null {\n const trimmed = initialValue.trimEnd();\n const quote = trimmed[0];\n if (quote !== '\"' && quote !== '\\'') { return null; }\n\n // Already properly closed on the same line \u2014 no resolution needed\n if (trimmed.endsWith(quote) && trimmed.length >= 2) { return null; }\n\n if (!trimmed.endsWith('\\\\')) { return null; }\n\n // first part: strip the trailing continuation backslash\n const parts: string[] = [trimmed.slice(0, -1)];\n let endLine = startLine;\n const maxLine = lines.length - 1;\n\n while (endLine < maxLine) {\n endLine++;\n const rawLine = lines[endLine] ?? '';\n const stripped = stripCodeLineComments(rawLine);\n if (stripped.trimEnd().endsWith('\\\\')) {\n parts.push(stripped.slice(0, -1));\n } else {\n parts.push(stripped);\n break;\n }\n }\n\n const fullValue = parts.join('');\n const withoutComma = fullValue.replace(/[,;]\\s*$/, '');\n return stripAnnotationsForType(withoutComma).trimEnd();\n}\n\n/**\n * Strip // line comment from a code line, respecting quote context.\n */\nfunction stripCodeLineComments(line: string): string {\n let inS = false, inD = false, escaped = false;\n for (let i = 0; i < line.length; i++) {\n const ch = line[i];\n if (inS) {\n if (!escaped && ch === '\\\\') { escaped = true; continue; }\n if (!escaped && ch === '\\'') { inS = false; }\n escaped = false;\n continue;\n }\n if (inD) {\n if (!escaped && ch === '\\\\') { escaped = true; continue; }\n if (!escaped && ch === '\"') { inD = false; }\n escaped = false;\n continue;\n }\n if (ch === '\\'') { inS = true; continue; }\n if (ch === '\"') { inD = true; continue; }\n if (ch === '/' && i + 1 < line.length && line[i + 1] === '/') {\n return line.slice(0, i);\n }\n }\n return line;\n}\n\nexport function isKnownType(\n typeName: string,\n definedTypes: Set<string>,\n includeAliases: Set<string>,\n _depth = 0\n): boolean {\n // Guard against pathological deeply-nested generic types (e.g. list<list<list<...>>>)\n // that could cause a stack overflow.\n if (_depth > 10) {\n return false;\n }\n if (!typeName) {\n return false;\n }\n const t = stripTypeAnnotations(typeName).trim();\n if (PRIMITIVES.has(t)) {\n return true;\n }\n if (KEYWORD_TYPES.has(t)) {\n return true;\n }\n if (definedTypes.has(t)) {\n return true;\n }\n const namespaced = t.match(/^([A-Za-z_][A-Za-z0-9_]*)\\.([A-Za-z_][A-Za-z0-9_]*)$/);\n if (namespaced) {\n const alias = namespaced[1];\n const base = namespaced[2];\n if (!includeAliases.has(alias)) {\n return false;\n }\n return PRIMITIVES.has(base) || definedTypes.has(base);\n }\n if (parseContainerType(t)) {\n const inner = t.slice(t.indexOf('<') + 1, t.lastIndexOf('>'));\n const parts = splitTopLevelAngles(inner);\n return parts.every(p => isKnownType(p, definedTypes, includeAliases, _depth + 1));\n }\n return false;\n}\n\n/**\n * \u89E3\u6790 `ns.Type` \u5F62\u5F0F\u7684\u771F\u5B9E\u7C7B\u578B\u540D\uFF0C\u6821\u9A8C include alias \u5408\u6CD5\u6027\u3002\n * @param typeName \u547D\u540D\u7A7A\u95F4\u7C7B\u578B\u6587\u672C\n * @param includeAliases include \u522B\u540D\u96C6\u5408\n * @returns \u89E3\u6790\u540E\u7684\u57FA\u7840\u7C7B\u578B\u540D\u6216 null\n */\nexport function resolveNamespacedBase(typeName: string, includeAliases: Set<string>): string | null {\n if (!typeName.includes('.')) {\n return typeName;\n }\n const parts = typeName.split('.');\n const alias = parts[0];\n if (!alias || !includeAliases.has(alias)) {\n return null;\n }\n return parts[parts.length - 1] || null;\n}\n\n/**\n * \u5224\u65AD\u5B57\u7B26\u4E32\u662F\u5426\u4E3A\u5408\u6CD5\u6574\u6570\u6587\u672C\u3002\n * @param text \u5F85\u5224\u65AD\u6587\u672C\n * @returns \u662F\u5426\u4E3A\u6574\u6570\n */\nexport function isIntegerLiteral(text: string): boolean {\n const t = text.trim();\n return /^-?\\d+$/.test(t) && !/^-?\\d+\\.\\d+$/.test(t);\n}\n\n/**\n * \u5224\u65AD\u5B57\u7B26\u4E32\u662F\u5426\u4E3A\u5408\u6CD5\u6D6E\u70B9\u6587\u672C\u3002\n * @param text \u5F85\u5224\u65AD\u6587\u672C\n * @returns \u662F\u5426\u4E3A\u6D6E\u70B9\u6570\n */\nfunction isFloatLiteral(text: string): boolean {\n const t = text.trim();\n return /^-?(?:\\d+(?:\\.\\d*)?|\\.\\d+)(?:[eE][+-]?\\d+)?$/.test(t);\n}\n\n/**\n * \u5224\u65AD\u5B57\u7B26\u4E32\u662F\u5426\u4E3A\u5F15\u53F7\u5305\u88F9\u7684\u5B57\u9762\u91CF\u3002\n * @param text \u5F85\u5224\u65AD\u6587\u672C\n * @returns \u662F\u5426\u4E3A\u5F15\u53F7\u5B57\u7B26\u4E32\n */\nfunction isQuotedString(text: string): boolean {\n const t = text.trim();\n if ((t.startsWith('\"') && t.endsWith('\"')) || (t.startsWith('\\'') && t.endsWith('\\''))) {\n return t.length >= 2;\n }\n return false;\n}\n\n/**\n * \u4ECE\u6CE8\u91CA\u5254\u9664\u540E\u7684\u5B57\u6BB5\u884C\u4E2D\u89E3\u6790\u9ED8\u8BA4\u503C\u8868\u8FBE\u5F0F\u3002\n * @param codeLine \u5B57\u6BB5\u4EE3\u7801\u884C\n * @returns \u9ED8\u8BA4\u503C\u6587\u672C\u6216 null\n */\nexport function extractDefaultValue(codeLine: string): string | null {\n let depthAngle = 0, depthBracket = 0, depthBrace = 0, depthParen = 0;\n const qt = new QuoteTracker();\n let eq = -1;\n for (let i = 0; i < codeLine.length; i++) {\n const ch = codeLine[i];\n if (!qt.inside()) {\n if (ch === '<') {\n depthAngle++;\n } else if (ch === '>') {\n depthAngle = Math.max(0, depthAngle - 1);\n } else if (ch === '[') {\n depthBracket++;\n } else if (ch === ']') {\n depthBracket = Math.max(0, depthBracket - 1);\n } else if (ch === '{') {\n depthBrace++;\n } else if (ch === '}') {\n depthBrace = Math.max(0, depthBrace - 1);\n } else if (ch === '(') {\n depthParen++;\n } else if (ch === ')') {\n depthParen = Math.max(0, depthParen - 1);\n } else if (ch === '=' && depthAngle === 0 && depthBracket === 0 && depthBrace === 0 && depthParen === 0) {\n eq = i;\n break;\n }\n }\n qt.feed(ch);\n }\n if (eq === -1) {\n return null;\n }\n\n let i = eq + 1;\n depthAngle = depthBracket = depthBrace = depthParen = 0;\n qt.reset();\n let buf = '';\n const n = codeLine.length;\n while (i < n) {\n const ch = codeLine[i];\n if (!qt.inside()) {\n if (ch === '<') {\n depthAngle++;\n } else if (ch === '>') {\n depthAngle = Math.max(0, depthAngle - 1);\n } else if (ch === '[') {\n depthBracket++;\n } else if (ch === ']') {\n depthBracket = Math.max(0, depthBracket - 1);\n } else if (ch === '{') {\n depthBrace++;\n } else if (ch === '}') {\n depthBrace = Math.max(0, depthBrace - 1);\n } else if (ch === '(' && depthAngle === 0 && depthBracket === 0 && depthBrace === 0 && depthParen === 0) {\n break;\n } else if (ch === '(') {\n depthParen++;\n } else if (ch === ')') {\n depthParen = Math.max(0, depthParen - 1);\n }\n\n if ((ch === ',' || ch === ';') && depthAngle === 0 && depthBracket === 0 && depthBrace === 0 && depthParen === 0) {\n break;\n }\n }\n\n buf += ch;\n qt.feed(ch);\n i++;\n }\n return buf.trim();\n}\n\n/**\n * \u6839\u636E\u5B57\u6BB5\u7C7B\u578B\u5224\u65AD\u9ED8\u8BA4\u503C\u6587\u672C\u662F\u5426\u5408\u6CD5\u3002\n * @param valueRaw \u9ED8\u8BA4\u503C\u6587\u672C\n * @param typeText \u5B57\u6BB5\u7C7B\u578B\n * @returns \u662F\u5426\u5339\u914D\n */\nfunction valueMatchesType(valueRaw: string, typeText: string): boolean {\n const t = stripTypeAnnotations(typeText).trim();\n const v = valueRaw.trim();\n\n if (integerTypes.has(t)) {\n return isIntegerLiteral(v);\n }\n if (t === 'double') {\n return isIntegerLiteral(v) || isFloatLiteral(v);\n }\n if (t === 'bool') {\n return v === 'true' || v === 'false';\n }\n if (t === 'string' || t === 'binary') {\n return isQuotedString(v);\n }\n if (t === 'uuid') {\n if (!isQuotedString(v)) {\n return false;\n }\n const inner = v.slice(1, -1);\n return uuidRegex.test(inner);\n }\n const containerInfo = parseContainerTypeInfo(t);\n if (containerInfo !== null) {\n if (containerInfo.keyword === 'list') {\n return v.startsWith('[') && v.endsWith(']');\n }\n if (containerInfo.keyword === 'set') {\n // set literals accept both [...] and {...} in Thrift IDL\n return (v.startsWith('[') && v.endsWith(']')) || (v.startsWith('{') && v.endsWith('}'));\n }\n if (containerInfo.keyword === 'map') {\n return v.startsWith('{') && v.endsWith('}');\n }\n // stream, sink, interaction, reference \u2014 accept any value\n return true;\n }\n\n return true;\n}\n\n/**\n * \u68C0\u67E5\u9ED8\u8BA4\u503C\u662F\u5426\u6EE1\u8DB3\u5B57\u6BB5\u7C7B\u578B\u7EA6\u675F\u3002\n * @param typeText \u5B57\u6BB5\u7C7B\u578B\n * @param valueText \u9ED8\u8BA4\u503C\u6587\u672C\n * @returns \u662F\u5426\u5408\u6CD5\n */\nexport function isValidDefaultValue(typeText: string, valueText: string): boolean {\n const value = valueText.trim();\n if (!value) {\n return true;\n }\n return valueMatchesType(value, typeText);\n}\n", "import {Range, DiagnosticSeverity} from '../../types';\nimport * as nodes from '../../ast/nodes.types';\nimport {ThriftIssue} from '../types';\nimport {isKnownType, resolveNamespacedBase} from './type-utils';\nimport {DIAGNOSTIC_CODES} from '../diagnostic-codes';\n\nexport function checkService(\n node: nodes.Service | nodes.Interaction,\n lines: string[],\n definedTypes: Set<string>,\n includeAliases: Set<string>,\n typeKind: Map<string, string>,\n issues: ThriftIssue[]\n) {\n // Check extends (services only)\n if (node.type === nodes.ThriftNodeType.Service && node.extends !== undefined) {\n const parentName = node.extends;\n let base = parentName;\n let parentKind = typeKind.get(parentName);\n if (parentKind === undefined && parentName.includes('.')) {\n base = resolveNamespacedBase(parentName, includeAliases) ?? '';\n parentKind = typeof base === 'string' && base.length > 0 ? typeKind.get(base) : undefined;\n }\n\n const lineNo = node.range.start.line;\n const lineText = lines[lineNo] || '';\n const col = lineText.indexOf('extends');\n const range = col >= 0\n ? new Range(lineNo, col, lineNo, col + 'extends'.length)\n : node.range;\n\n if (base.length === 0 || parentKind === undefined) {\n issues.push({\n message: `Unknown parent service '${parentName}' in extends`,\n range,\n severity: DiagnosticSeverity.Error,\n code: DIAGNOSTIC_CODES.SERVICE_EXTENDS_UNKNOWN\n });\n } else if (parentKind !== 'service') {\n issues.push({\n message: `Parent type '${parentName}' is not a service`,\n range,\n severity: DiagnosticSeverity.Error,\n code: DIAGNOSTIC_CODES.SERVICE_EXTENDS_NOT_SERVICE\n });\n }\n }\n\n // Check functions\n for (const fn of node.functions) {\n const fnName = fn.name ?? 'unknown';\n // stream/sink functions are inherently not oneway\n if (fn.oneway && fn.isStream !== true && fn.isSink !== true) {\n if (fn.returnType.trim() !== 'void') {\n issues.push({\n message: `oneway method '${fnName}' must return void`,\n range: fn.range,\n severity: DiagnosticSeverity.Error,\n code: DIAGNOSTIC_CODES.SERVICE_ONEWAY_RETURN_NOT_VOID\n });\n }\n if (fn.throws !== undefined && fn.throws.length > 0) {\n issues.push({\n message: `oneway method '${fnName}' must not declare throws`,\n range: fn.range,\n severity: DiagnosticSeverity.Error,\n code: DIAGNOSTIC_CODES.SERVICE_ONEWAY_HAS_THROWS\n });\n }\n }\n if (!isKnownType(fn.returnType, definedTypes, includeAliases)) {\n const lineNo = fn.range.start.line;\n issues.push({\n message: `Unknown return type '${fn.returnType}'`,\n range: findTypeRange(lines, lineNo, fn.returnType, fn.range),\n severity: DiagnosticSeverity.Error,\n code: DIAGNOSTIC_CODES.SERVICE_RETURN_TYPE_UNKNOWN\n });\n }\n\n for (const arg of fn.arguments) {\n if (!isKnownType(arg.fieldType, definedTypes, includeAliases)) {\n issues.push({\n message: `Unknown type '${arg.fieldType}'`,\n range: arg.typeRange ?? arg.range,\n severity: DiagnosticSeverity.Error,\n code: DIAGNOSTIC_CODES.TYPE_UNKNOWN\n });\n }\n }\n\n for (const thr of fn.throws) {\n const base = resolveNamespacedBase(thr.fieldType, includeAliases);\n const kind = typeof base === 'string' && base.length > 0 ? typeKind.get(base) : undefined;\n if (typeof base !== 'string' || base.length === 0 || kind === undefined) {\n issues.push({\n message: `Unknown exception type '${thr.fieldType}' in throws`,\n range: thr.range,\n severity: DiagnosticSeverity.Error,\n code: DIAGNOSTIC_CODES.SERVICE_THROWS_UNKNOWN\n });\n } else if (kind !== 'exception') {\n issues.push({\n message: `Type '${thr.fieldType}' in throws is not an exception`,\n range: thr.range,\n severity: DiagnosticSeverity.Error,\n code: DIAGNOSTIC_CODES.SERVICE_THROWS_NOT_EXCEPTION\n });\n }\n }\n }\n}\n\nfunction findTypeRange(lines: string[], lineNo: number, typeText: string, fallback: Range): Range {\n if (lineNo >= 0 && lineNo < lines.length) {\n const idx = lines[lineNo].indexOf(typeText);\n if (idx >= 0) {\n return new Range(lineNo, idx, lineNo, idx + typeText.length);\n }\n }\n return fallback;\n}\n", "import {DiagnosticSeverity} from '../../types';\nimport * as nodes from '../../ast/nodes.types';\nimport {ThriftIssue} from '../types';\nimport {isKnownType, isValidDefaultValue, resolveMultilineDefaultFromLines, resolveMultilineStringDefault} from './type-utils';\nimport {DIAGNOSTIC_CODES} from '../diagnostic-codes';\n\nexport function checkStruct(\n node: nodes.Struct,\n definedTypes: Set<string>,\n includeAliases: Set<string>,\n lines: string[],\n issues: ThriftIssue[]\n) {\n const fieldIds = new Set<number>();\n for (const field of node.fields) {\n if (fieldIds.has(field.id)) {\n issues.push({\n message: `Duplicate field id ${field.id}`,\n range: field.range,\n severity: DiagnosticSeverity.Error,\n code: DIAGNOSTIC_CODES.FIELD_DUPLICATE_ID\n });\n }\n fieldIds.add(field.id);\n\n if (!isKnownType(field.fieldType, definedTypes, includeAliases)) {\n issues.push({\n message: `Unknown type '${field.fieldType}'`,\n range: field.typeRange ?? field.range,\n severity: DiagnosticSeverity.Error,\n code: DIAGNOSTIC_CODES.TYPE_UNKNOWN\n });\n }\n\n let defaultValue = field.defaultValue;\n if (typeof defaultValue === 'string' && defaultValue.length > 0) {\n // Resolve multi-line default values that were truncated by the single-line parser\n const tdv = defaultValue.trim();\n if (tdv.startsWith('[') || tdv.startsWith('{') || tdv.startsWith('(')) {\n const multiline = resolveMultilineDefaultFromLines(lines, field.range.start.line, defaultValue);\n if (multiline !== null) {\n defaultValue = multiline;\n }\n } else if (tdv.startsWith('\"') || tdv.startsWith('\\'')) {\n // Handle multi-line string values with backslash line-continuation\n const multiline = resolveMultilineStringDefault(lines, field.range.start.line, defaultValue);\n if (multiline !== null) {\n defaultValue = multiline;\n }\n }\n if (!isValidDefaultValue(field.fieldType, defaultValue)) {\n issues.push({\n message: `Invalid default value '${defaultValue}' for type '${field.fieldType}'`,\n range: field.defaultValueRange ?? field.range,\n severity: DiagnosticSeverity.Warning,\n code: DIAGNOSTIC_CODES.VALUE_TYPE_MISMATCH\n });\n }\n }\n }\n}\n", "import {Range, DiagnosticSeverity} from '../../types';\nimport * as nodes from '../../ast/nodes.types';\nimport {ThriftIssue} from '../types';\nimport {getPrimitiveTypes, isIntegerLiteral, isKnownType} from './type-utils';\nimport {DIAGNOSTIC_CODES} from '../diagnostic-codes';\n\nconst primitives = getPrimitiveTypes();\n\nexport function checkTypedef(\n node: nodes.Typedef,\n lines: string[],\n definedTypes: Set<string>,\n includeAliases: Set<string>,\n issues: ThriftIssue[]\n) {\n const baseType = node.aliasType.trim();\n if (!isKnownType(baseType, definedTypes, includeAliases) && !primitives.has(baseType)) {\n const lineNo = node.range.start.line;\n issues.push({\n message: `Unknown base type '${baseType}' in typedef`,\n range: findTypeRange(lines, lineNo, baseType, node.range),\n severity: DiagnosticSeverity.Error,\n code: DIAGNOSTIC_CODES.TYPEDEF_UNKNOWN_BASE\n });\n }\n}\n\nexport function checkConst(\n node: nodes.Const,\n lines: string[],\n definedTypes: Set<string>,\n includeAliases: Set<string>,\n issues: ThriftIssue[]\n) {\n const constType = node.valueType.trim();\n if (!isKnownType(constType, definedTypes, includeAliases)) {\n const lineNo = node.range.start.line;\n issues.push({\n message: `Unknown type '${constType}'`,\n range: findTypeRange(lines, lineNo, constType, node.range),\n severity: DiagnosticSeverity.Error,\n code: DIAGNOSTIC_CODES.TYPE_UNKNOWN\n });\n }\n}\n\nexport function checkEnum(node: nodes.Enum, issues: ThriftIssue[]) {\n if (node.isSenum !== true) {\n for (const member of node.members) {\n if (typeof member.initializer === 'string' && member.initializer.length > 0 && !isIntegerLiteral(member.initializer)) {\n issues.push({\n message: `Enum value must be an integer literal`,\n range: member.range,\n severity: DiagnosticSeverity.Error,\n code: DIAGNOSTIC_CODES.ENUM_VALUE_NOT_INTEGER\n });\n }\n }\n }\n}\n\nfunction findTypeRange(lines: string[], lineNo: number, typeText: string, fallback: Range): Range {\n if (lineNo >= 0 && lineNo < lines.length) {\n const idx = lines[lineNo].indexOf(typeText);\n if (idx >= 0) {\n return new Range(lineNo, idx, lineNo, idx + typeText.length);\n }\n }\n return fallback;\n}\n", "import {Range, DiagnosticSeverity} from '../../types';\nimport {ThriftIssue} from '../types';\nimport {DIAGNOSTIC_CODES} from '../diagnostic-codes';\n\nexport function checkSyntax(codeLines: string[], issues: ThriftIssue[]) {\n const stack: {ch: string; line: number; char: number}[] = [];\n for (let lineNo = 0; lineNo < codeLines.length; lineNo++) {\n const line = codeLines[lineNo];\n let inS = false, inD = false, escaped = false;\n for (let i = 0; i < line.length; i++) {\n const ch = line[i];\n\n if (inS) {\n if (!escaped && ch === '\\\\') {\n escaped = true;\n continue;\n }\n if (!escaped && ch === '\\'') {\n inS = false;\n }\n escaped = false;\n continue;\n }\n if (inD) {\n if (!escaped && ch === '\\\\') {\n escaped = true;\n continue;\n }\n if (!escaped && ch === '\"') {\n inD = false;\n }\n escaped = false;\n continue;\n }\n if (ch === '\\'') {\n inS = true;\n continue;\n }\n if (ch === '\"') {\n inD = true;\n continue;\n }\n\n if (ch === '{' || ch === '(' || ch === '<') {\n stack.push({ch, line: lineNo, char: i});\n } else if (ch === '}' || ch === ')' || ch === '>') {\n if (ch === '>') {\n const top = stack[stack.length - 1];\n if (top !== undefined && top.ch === '<') {\n stack.pop();\n }\n continue;\n }\n const open = stack.pop();\n if (!open) {\n issues.push({\n message: `Unmatched closing '${ch}'`,\n range: new Range(lineNo, i, lineNo, i + 1),\n severity: DiagnosticSeverity.Error,\n code: DIAGNOSTIC_CODES.SYNTAX_UNMATCHED_CLOSER\n });\n } else {\n const pair: Record<string, string> = {'}': '{', ')': '('};\n if (open.ch !== pair[ch]) {\n issues.push({\n message: `Mismatched '${open.ch}' and '${ch}'`,\n range: new Range(lineNo, i, lineNo, i + 1),\n severity: DiagnosticSeverity.Error,\n code: DIAGNOSTIC_CODES.SYNTAX_MISMATCHED\n });\n }\n }\n }\n }\n }\n\n for (const open of stack) {\n issues.push({\n message: `Unclosed '${open.ch}'`,\n range: new Range(open.line, open.char, open.line, open.char + 1),\n severity: DiagnosticSeverity.Error,\n code: DIAGNOSTIC_CODES.SYNTAX_UNCLOSED\n });\n }\n}\n", "import {Uri} from '../../types';\nimport {ThriftParser} from '../../ast/parser';\nimport * as nodes from '../../ast/nodes.types';\nimport {collectTypesFromAst} from '../include-resolver';\nimport {LineRange, normalizeLineRange, rangeIntersectsLineRange} from '../../utils/line-range';\nimport {stripCommentsFromLine} from '../utils';\nimport {ThriftIssue} from '../types';\nimport {AnalysisContext, collectIncludeAliasesFromAst} from './analysis-context';\n\nimport {checkService} from './service-check';\nimport {checkStruct} from './struct-check';\nimport {checkConst, checkEnum, checkTypedef} from './general-check';\nimport {checkSyntax} from './syntax-check';\n\n/**\n * \u6267\u884C AST \u7EA7\u522B\u8BCA\u65AD\u5E76\u8FD4\u56DE\u95EE\u9898\u5217\u8868\u3002\n * @param ast \u5F53\u524D AST\n * @param lines \u6587\u6863\u884C\u5185\u5BB9\n * @param includedTypes include \u5BFC\u5165\u7C7B\u578B\u96C6\u5408\n * @param context \u5206\u6790\u4E0A\u4E0B\u6587\n * @param analysisScope \u8BCA\u65AD\u8303\u56F4\uFF08\u884C\u7EA7\uFF09\n * @returns \u8BCA\u65AD\u95EE\u9898\u5217\u8868\n */\nexport function analyzeThriftAst(\n ast: nodes.ThriftDocument,\n lines: string[],\n includedTypes?: Map<string, string>,\n context?: AnalysisContext,\n analysisScope?: LineRange\n): ThriftIssue[] {\n const issues: ThriftIssue[] = [];\n\n const codeLines: string[] = [];\n const state = {inBlock: false};\n for (const raw of lines) {\n codeLines.push(stripCommentsFromLine(raw, state));\n }\n\n const includeAliases = context?.includeAliases ?? collectIncludeAliasesFromAst(ast);\n const typeKind = context?.typeKind\n ? new Map(context.typeKind)\n : collectTypesFromAst(ast);\n\n if (includedTypes) {\n for (const [name, kind] of includedTypes) {\n if (!typeKind.has(name)) {\n typeKind.set(name, kind);\n }\n }\n }\n\n const definedTypes = new Set<string>([...typeKind.keys()]);\n\n // Check Nodes\n for (const node of ast.body) {\n switch (node.type) {\n case nodes.ThriftNodeType.Service:\n case nodes.ThriftNodeType.Interaction:\n checkService(node , lines, definedTypes, includeAliases, typeKind, issues);\n break;\n case nodes.ThriftNodeType.Struct:\n case nodes.ThriftNodeType.Union:\n case nodes.ThriftNodeType.Exception:\n checkStruct(node , definedTypes, includeAliases, lines, issues);\n break;\n case nodes.ThriftNodeType.Typedef:\n checkTypedef(node , lines, definedTypes, includeAliases, issues);\n break;\n case nodes.ThriftNodeType.Const:\n checkConst(node , lines, definedTypes, includeAliases, issues);\n break;\n case nodes.ThriftNodeType.Enum:\n checkEnum(node , issues);\n break;\n default:\n break;\n }\n }\n\n // Check Syntax\n checkSyntax(codeLines, issues);\n\n // Apply Scope\n if (analysisScope) {\n const normalized = normalizeLineRange(analysisScope);\n if (normalized) {\n return issues.filter(issue => rangeIntersectsLineRange(issue.range, normalized));\n }\n }\n\n return issues;\n}\n\n/**\n * \u89E3\u6790\u6587\u672C\u5E76\u6267\u884C\u8BCA\u65AD\u89C4\u5219\u3002\n * @param text \u6587\u672C\u5185\u5BB9\n * @param uri \u6587\u6863 URI\n * @param includedTypes include \u5BFC\u5165\u7C7B\u578B\u96C6\u5408\n * @returns \u8BCA\u65AD\u95EE\u9898\u5217\u8868\n */\nexport function analyzeThriftText(\n text: string,\n uri?: Uri,\n includedTypes?: Map<string, string>\n): ThriftIssue[] {\n const lines = text.split('\\n');\n const ast = uri\n ? ThriftParser.parseContentWithCache(uri.toString(), text)\n : new ThriftParser(text).parse();\n\n return analyzeThriftAst(ast, lines, includedTypes);\n}\n", "import * as path from 'path';\n\n/**\n * \u5B89\u5168\u89E3\u6790 include \u8DEF\u5F84\uFF0C\u786E\u4FDD resolved \u8DEF\u5F84\u4E0D\u4F1A\u9003\u9038\u51FA boundaryDir\u3002\n * @param includePath - include \u6307\u4EE4\u4E2D\u7684\u8DEF\u5F84\uFF08\u53EF\u80FD\u5305\u542B .. \u904D\u5386\uFF09\n * @param resolveFrom - \u89E3\u6790\u76F8\u5BF9\u8DEF\u5F84\u7684\u57FA\u51C6\u76EE\u5F55\uFF08\u901A\u5E38\u662F include \u6587\u4EF6\u7684\u6240\u5728\u76EE\u5F55\uFF09\n * @param boundaryDir - \u8FB9\u754C\u68C0\u67E5\u76EE\u5F55\uFF0Cresolved \u8DEF\u5F84\u5FC5\u987B\u5728\u6B64\u76EE\u5F55\u5185\uFF08\u9ED8\u8BA4\u4E0E resolveFrom \u76F8\u540C\uFF09\n * @returns \u5B89\u5168\u89E3\u6790\u540E\u7684\u7EDD\u5BF9\u8DEF\u5F84\uFF0C\u82E5\u8DEF\u5F84\u9003\u9038\u5219\u8FD4\u56DE undefined\n */\nexport function safeResolveIncludePath(\n includePath: string,\n resolveFrom: string,\n boundaryDir: string = resolveFrom\n): string | undefined {\n if (path.isAbsolute(includePath)) {\n const resolved = path.normalize(includePath);\n if (!isWithinDir(resolved, boundaryDir)) {\n return undefined;\n }\n return resolved;\n }\n const resolved = path.normalize(path.resolve(resolveFrom, includePath));\n if (!isWithinDir(resolved, boundaryDir)) {\n return undefined;\n }\n return resolved;\n}\n\nfunction isWithinDir(target: string, dir: string): boolean {\n const normalizedDir = path.normalize(dir) + path.sep;\n return target.startsWith(normalizedDir) || target === path.normalize(dir);\n}\n", "// Core types (structurally compatible with vscode.*)\nexport {Position, Range, Uri, Location, TextEdit, DocumentSymbol, SymbolKind, DiagnosticSeverity, SelectionRange} from './types';\n\n// Shared interfaces\nexport type {ThriftFormattingOptions, StructField, EnumField, ConstField} from './interfaces.types';\n\n// AST\nexport {ThriftParser} from './ast/parser';\nexport type {IncrementalParseResult} from './ast/parser';\nexport * as nodes from './ast/nodes.types';\nexport {createField, createDocument, createStructBlock, createEnumBlock, createServiceBlock, createInteractionBlock} from './ast/factory';\nexport {sliceTextByRange} from './ast/text-utils';\nexport {positionInRange, rangeSize, findSmallestNodeAtPosition, collectIncludes, collectTopLevelTypes, nodePathFromLeaf, walkNodes} from './ast/utils';\n\n// Formatter\nexport {ThriftFormatter} from './formatter/index';\nexport {formatThriftContent} from './formatter/formatter-core';\n\n// Diagnostics\nexport {DIAGNOSTIC_CODES, UNKNOWN_TYPE_DIAGNOSTIC_CODES} from './diagnostics/diagnostic-codes';\nexport type {DiagnosticCode} from './diagnostics/diagnostic-codes';\nexport {analyzeThriftAst, analyzeThriftText} from './diagnostics/rules/analyzer';\nexport {collectTypesFromAst} from './diagnostics/include-resolver';\nexport type {ThriftIssue, BlockCacheValue, MemberCacheValue, BlockAstCacheEntry, BlockCache, MemberCache, MemberCacheByBlock} from './diagnostics/types';\nexport {AnalysisContext, collectIncludeAliasesFromAst, buildAnalysisContext} from './diagnostics/rules/analysis-context';\nexport {\n stripCommentsFromLine, sanitizeStructuralText, hasStructuralTokens, includesKeyword,\n diagnosticsTestUtils,\n findBestContainingRange, findBestContainingRangeForChanges,\n findBestContainingMemberRange, findBestContainingMemberRangeForChanges,\n findContainingNode, buildPartialLines, hashText, filterIssuesByLineRange\n} from './diagnostics/utils';\n\n// Config defaults\nexport {config, config as defaultConfig, cacheConfig, memoryConfig} from './config/index';\nexport type {CacheConfig, CacheEntry, MemoryConfig} from './config/index';\nexport {CACHE_CONFIGS, getAllCacheConfigs, updateCacheConfig, validateCacheConfig, registerAllCacheConfigs} from './config/cache-config';\n\n// Utils - line range\nexport {LineRange, createLineRange, normalizeLineRange, mergeLineRanges, collapseLineRanges, lineRangeLineCount, rangeIntersectsLineRange, rangeContainsLineRange, lineRangeFromChange} from './utils/line-range';\n\n// Utils - error handling\nexport {ErrorHandler} from './utils/error-handler';\nexport type {ErrorContext} from './utils/error-handler';\n\n// Utils - cache management\nexport {CacheManager, MemoryAwareCacheManager} from './utils/cache-manager';\nexport type {CacheConfig as CacheManagerConfig} from './utils/cache-manager';\nexport {LruCache} from './utils/optimized-lru-cache';\nexport {makeLineRangeKey, makeUriRangeKey, makeUriContentKey} from './utils/cache-keys';\nexport type {LineRangeKey} from './utils/cache-keys';\nexport {isExpired, isFresh, hashContent} from './utils/cache-expiry';\n\n// Utils - memory and reporting\nexport {MemoryMonitor} from './utils/memory-monitor';\nexport {ReportBuilder, formatMb} from './utils/report-builder';\nexport {safeResolveIncludePath} from './utils/safe-path';\nexport {QuoteTracker} from './utils/quote-tracker';\nexport {parseContainerTypeInfo} from './diagnostics/rules/type-utils';\nexport type {ContainerTypeInfo} from './diagnostics/rules/type-utils';\n", "/**\n * thrift-support CLI \u5165\u53E3\u70B9\u3002\n * \u7EDF\u4E00\u547D\u4EE4\u884C\u5DE5\u5177\uFF1Aformat / lint / parse / symbols\n */\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport {parseArgs} from './args';\nimport {findConfigFile, loadConfig, resolveFormatOptions} from './config';\nimport {expandFiles} from './glob';\nimport {runFormat} from './commands/format';\nimport {runLint} from './commands/lint';\nimport {runParse} from './commands/parse';\nimport {runSymbols} from './commands/symbols';\n\ndeclare const CLI_VERSION: string;\nconst VERSION = typeof CLI_VERSION !== 'undefined' ? CLI_VERSION : '0.0.0';\nconst HELP_TEXT = `\nthrift-support v${VERSION}\nCLI tool for Apache Thrift IDL: format, lint, parse, symbols\n\nUsage:\n thrift-support <command> [options] <files...>\n\nCommands:\n format Format Thrift IDL files\n lint Run diagnostic rules (syntax + semantic checks)\n parse Parse and output AST (JSON)\n symbols List defined symbols\n\nGlobal Options:\n --help, -h Show help\n --version, -v Show version\n --config <path> Specify config file path\n\nFormat Options:\n --check Check mode: exit 1 if unformatted files found\n --write, -w Write formatted output back to files\n --stdin Read from stdin, output to stdout\n --stdin-filepath <p> Used with --stdin for config file lookup\n --indent-size <n> Indent size (default: 4)\n --max-line-length <n> Max line length (default: 100)\n --trailing-comma <m> preserve | add | remove\n --collection-style <m> preserve | multiline | auto\n\nLint Options:\n --severity <level> error | warning | all (default: all)\n --json JSON output\n --include-path <dir> Include search path (can be repeated)\n --quiet, -q Only output when issues found\n\nParse Options:\n --stdin Read from stdin\n\nSymbols Options:\n --json JSON output\n --flat Flat output (no nesting)\n\nExamples:\n thrift-support format --check src/**/*.thrift\n thrift-support format --write src/\n thrift-support lint --severity error src/**/*.thrift\n thrift-support parse service.thrift | jq '.body[0]'\n thrift-support symbols --json service.thrift\n\nExit Codes:\n 0 Success\n 1 Lint errors / format --check found unformatted files\n 2 Usage error (invalid arguments, missing files)\n 3 Internal error (parse failure, I/O error)\n`.trim();\n\nfunction main(): void {\n const args = parseArgs(process.argv);\n\n if (args.version) {\n process.stdout.write(`thrift-support v${VERSION}\\n`);\n process.exit(0);\n }\n\n if (args.help) {\n process.stdout.write(HELP_TEXT + '\\n');\n process.exit(0);\n }\n\n // Load config \u2014 use --stdin-filepath for lookup when in stdin mode.\n // For directory inputs, search from the directory itself (not its parent).\n let configLookupDir: string;\n if (args.files.length > 0) {\n const firstResolved = path.resolve(args.files[0]);\n try {\n configLookupDir = fs.statSync(firstResolved).isDirectory()\n ? firstResolved\n : path.dirname(firstResolved);\n } catch {\n configLookupDir = path.dirname(firstResolved);\n }\n } else if (args.stdinFilepath !== null && args.stdinFilepath !== undefined) {\n configLookupDir = path.dirname(path.resolve(args.stdinFilepath));\n } else {\n configLookupDir = process.cwd();\n }\n const configPath = args.configPath ?? findConfigFile(configLookupDir);\n const config = configPath !== null && configPath !== undefined ? loadConfig(configPath) : {};\n\n // Expand file patterns\n const files = args.stdin ? [] : expandFiles(args.files);\n\n let exitCode: number;\n\n switch (args.command) {\n case 'format': {\n const formatOpts = resolveFormatOptions(config, {\n indentSize: args.indentSize,\n maxLineLength: args.maxLineLength,\n trailingComma: args.trailingComma,\n collectionStyle: args.collectionStyle,\n });\n exitCode = runFormat(files, args, formatOpts);\n break;\n }\n case 'lint':\n exitCode = runLint(files, args, config);\n break;\n case 'parse':\n exitCode = runParse(files, args);\n break;\n case 'symbols':\n exitCode = runSymbols(files, args);\n break;\n default:\n process.stderr.write(HELP_TEXT + '\\n');\n exitCode = 2;\n }\n\n process.exit(exitCode);\n}\n\nmain();\n", "/**\n * \u624B\u5199 CLI \u53C2\u6570\u89E3\u6790\u5668 \u2014 \u96F6\u4F9D\u8D56\uFF0C\u7EA6 150 \u884C\u3002\n */\n\nexport type Command = 'format' | 'lint' | 'parse' | 'symbols' | 'help' | 'version';\n\nexport interface ParsedArgs {\n command: Command;\n files: string[];\n // Global\n help: boolean;\n version: boolean;\n // Format\n check: boolean;\n write: boolean;\n stdin: boolean;\n stdinFilepath?: string;\n indentSize?: number;\n maxLineLength?: number;\n trailingComma?: 'preserve' | 'add' | 'remove';\n collectionStyle?: 'preserve' | 'multiline' | 'auto';\n // Lint\n severity?: 'error' | 'warning' | 'all';\n json: boolean;\n includePaths: string[];\n quiet: boolean;\n // Symbols\n flat: boolean;\n // Config\n configPath?: string;\n}\n\nconst COMMANDS = new Set<string>(['format', 'lint', 'parse', 'symbols']);\nconst TRAILING_COMMA_VALUES = new Set(['preserve', 'add', 'remove']);\nconst COLLECTION_STYLE_VALUES = new Set(['preserve', 'multiline', 'auto']);\nconst SEVERITY_VALUES = new Set(['error', 'warning', 'all']);\n\nfunction parseError(message: string): never {\n process.stderr.write(`Error: ${message}\\n`);\n process.stderr.write('Run \"thrift-support --help\" for usage information.\\n');\n process.exit(2);\n}\n\nfunction consumeNextArg(args: string[], i: number, flag: string): string {\n if (i + 1 >= args.length) {\n parseError(`${flag} requires a value`);\n }\n return args[i + 1];\n}\n\nexport function parseArgs(argv: string[]): ParsedArgs {\n // Strip node + script path\n const args = argv.slice(2);\n\n const result: ParsedArgs = {\n command: 'help',\n files: [],\n help: false,\n version: false,\n check: false,\n write: false,\n stdin: false,\n json: false,\n quiet: false,\n flat: false,\n includePaths: [],\n };\n\n if (args.length === 0) {\n result.help = true;\n return result;\n }\n\n // Check for --help / --version before command\n if (args[0] === '--help' || args[0] === '-h') {\n result.help = true;\n return result;\n }\n if (args[0] === '--version' || args[0] === '-v' || args[0] === '-V') {\n result.command = 'version';\n result.version = true;\n return result;\n }\n\n // First non-flag arg is the command\n if (COMMANDS.has(args[0])) {\n result.command = args[0] as Command;\n } else if (args[0].startsWith('-')) {\n parseError(`Unknown flag \"${args[0]}\" before command`);\n } else {\n parseError(`Unknown command \"${args[0]}\". Available: format, lint, parse, symbols`);\n }\n\n let i = 1;\n while (i < args.length) {\n const arg = args[i];\n switch (arg) {\n case '--help':\n case '-h':\n result.help = true;\n break;\n case '--version':\n case '-v':\n case '-V':\n result.version = true;\n result.command = 'version';\n break;\n case '--check':\n result.check = true;\n break;\n case '--write':\n case '-w':\n result.write = true;\n break;\n case '--stdin':\n result.stdin = true;\n break;\n case '--stdin-filepath': {\n result.stdinFilepath = consumeNextArg(args, i, '--stdin-filepath');\n i++;\n break;\n }\n case '--indent-size': {\n const val = parseInt(consumeNextArg(args, i, '--indent-size'), 10);\n if (isNaN(val) || val < 1) {parseError('--indent-size must be a positive integer');}\n result.indentSize = val;\n i++;\n break;\n }\n case '--max-line-length': {\n const val = parseInt(consumeNextArg(args, i, '--max-line-length'), 10);\n if (isNaN(val) || val < 1) {parseError('--max-line-length must be a positive integer');}\n result.maxLineLength = val;\n i++;\n break;\n }\n case '--trailing-comma': {\n const val = consumeNextArg(args, i, '--trailing-comma');\n if (!TRAILING_COMMA_VALUES.has(val)) {parseError(`--trailing-comma must be one of: preserve, add, remove`);}\n result.trailingComma = val as 'preserve' | 'add' | 'remove';\n i++;\n break;\n }\n case '--collection-style': {\n const val = consumeNextArg(args, i, '--collection-style');\n if (!COLLECTION_STYLE_VALUES.has(val)) {parseError(`--collection-style must be one of: preserve, multiline, auto`);}\n result.collectionStyle = val as 'preserve' | 'multiline' | 'auto';\n i++;\n break;\n }\n case '--severity': {\n const val = consumeNextArg(args, i, '--severity');\n if (!SEVERITY_VALUES.has(val)) {parseError(`--severity must be one of: error, warning, all`);}\n result.severity = val as 'error' | 'warning' | 'all';\n i++;\n break;\n }\n case '--json':\n result.json = true;\n break;\n case '--include-path': {\n result.includePaths.push(consumeNextArg(args, i, '--include-path'));\n i++;\n break;\n }\n case '--quiet':\n case '-q':\n result.quiet = true;\n break;\n case '--flat':\n result.flat = true;\n break;\n case '--config': {\n result.configPath = consumeNextArg(args, i, '--config');\n i++;\n break;\n }\n default:\n if (arg.startsWith('-')) {\n parseError(`Unknown option \"${arg}\" for command \"${result.command}\"`);\n }\n result.files.push(arg);\n break;\n }\n i++;\n }\n\n return result;\n}\n", "/**\n * \u914D\u7F6E\u6587\u4EF6\u67E5\u627E\u4E0E\u89E3\u6790\u3002\n * \u652F\u6301 .thriftrc.json \u5411\u4E0A\u67E5\u627E\uFF0C\u4E0E VS Code thrift.format.* \u8BBE\u7F6E\u4E00\u81F4\u3002\n */\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport type {ThriftFormattingOptions} from '@tanzz/thrift-core';\n\nconst CONFIG_FILENAME = '.thriftrc.json';\n\nexport interface ThriftCliConfig {\n format?: Partial<ThriftFormattingOptions>;\n lint?: {\n severity?: 'error' | 'warning' | 'all';\n };\n}\n\n/**\n * \u4ECE\u6307\u5B9A\u76EE\u5F55\u5411\u4E0A\u67E5\u627E .thriftrc.json\n */\nexport function findConfigFile(startDir: string): string | null {\n let dir = path.resolve(startDir);\n const root = path.parse(dir).root;\n\n while (true) {\n const candidate = path.join(dir, CONFIG_FILENAME);\n if (fs.existsSync(candidate)) {\n return candidate;\n }\n const parent = path.dirname(dir);\n if (parent === dir || dir === root) {\n return null;\n }\n dir = parent;\n }\n}\n\n/**\n * \u8BFB\u53D6\u5E76\u89E3\u6790\u914D\u7F6E\u6587\u4EF6\n */\nexport function loadConfig(configPath: string): ThriftCliConfig {\n try {\n const content = fs.readFileSync(configPath, 'utf-8');\n return JSON.parse(content) as ThriftCliConfig;\n } catch (error) {\n process.stderr.write(`Warning: Failed to read config file ${configPath}: ${error instanceof Error ? error.message : String(error)}\\n`);\n return {};\n }\n}\n\n/**\n * \u89E3\u6790\u914D\u7F6E\u6587\u4EF6\u4E2D\u7684 format \u9009\u9879\u4E3A ThriftFormattingOptions\n */\nexport function resolveFormatOptions(\n config: ThriftCliConfig,\n overrides: {\n indentSize?: number;\n maxLineLength?: number;\n trailingComma?: 'preserve' | 'add' | 'remove';\n collectionStyle?: 'preserve' | 'multiline' | 'auto';\n }\n): Partial<ThriftFormattingOptions> {\n const base = config.format ?? {};\n const result: Partial<ThriftFormattingOptions> = {...base};\n\n // CLI flags override config file\n if (overrides.indentSize !== undefined) {result.indentSize = overrides.indentSize;}\n if (overrides.maxLineLength !== undefined) {result.maxLineLength = overrides.maxLineLength;}\n if (overrides.trailingComma !== undefined) {result.trailingComma = overrides.trailingComma;}\n if (overrides.collectionStyle !== undefined) {result.collectionStyle = overrides.collectionStyle;}\n\n return result;\n}\n", "/**\n * \u6587\u4EF6\u5C55\u5F00\uFF1A\u76EE\u5F55\u9012\u5F52 + glob \u6A21\u5F0F\u5339\u914D + .thrift \u540E\u7F00\u8FC7\u6EE4\u3002\n * \u96F6\u4F9D\u8D56\uFF0C\u4E0D\u4F7F\u7528 glob \u5E93\u3002\u652F\u6301\u57FA\u672C glob \u6A21\u5F0F\uFF1A\n * - * \u5339\u914D\u8DEF\u5F84\u6BB5\u5185\u4EFB\u610F\u5B57\u7B26\n * - ** \u9012\u5F52\u5339\u914D\u4EFB\u610F\u5B50\u76EE\u5F55\n * - ? \u5339\u914D\u5355\u4E2A\u5B57\u7B26\n */\nimport * as fs from 'fs';\nimport * as path from 'path';\n\n/**\n * \u5C06 CLI \u4F20\u5165\u7684\u6587\u4EF6\u8DEF\u5F84/\u6A21\u5F0F\u5217\u8868\u5C55\u5F00\u4E3A\u5B9E\u9645\u6587\u4EF6\u5217\u8868\u3002\n * - \u5982\u679C\u8DEF\u5F84\u662F\u6587\u4EF6\uFF0C\u76F4\u63A5\u52A0\u5165\n * - \u5982\u679C\u8DEF\u5F84\u662F\u76EE\u5F55\uFF0C\u9012\u5F52\u67E5\u627E *.thrift \u6587\u4EF6\n * - \u5982\u679C\u8DEF\u5F84\u5305\u542B glob \u5B57\u7B26\uFF08* ?\uFF09\uFF0C\u6267\u884C\u6A21\u5F0F\u5339\u914D\n */\nexport function expandFiles(patterns: string[]): string[] {\n const files: string[] = [];\n\n for (const pattern of patterns) {\n if (isGlobPattern(pattern)) {\n expandGlob(pattern, files);\n } else {\n const resolved = path.resolve(pattern);\n\n if (!fs.existsSync(resolved)) {\n process.stderr.write(`Warning: \"${pattern}\" does not exist, skipping.\\n`);\n continue;\n }\n\n const stat = fs.statSync(resolved);\n if (stat.isFile()) {\n files.push(resolved);\n } else if (stat.isDirectory()) {\n collectThriftFiles(resolved, files);\n }\n }\n }\n\n return [...new Set(files)]; // deduplicate\n}\n\nfunction isGlobPattern(p: string): boolean {\n return p.includes('*') || p.includes('?');\n}\n\n/**\n * \u5C55\u5F00 glob \u6A21\u5F0F\u3002\n * \u5C06\u6A21\u5F0F\u62C6\u5206\u4E3A\u56FA\u5B9A\u524D\u7F00\uFF08\u4E0D\u542B\u901A\u914D\u7B26\u7684\u6700\u957F\u8DEF\u5F84\uFF09\u548C glob \u540E\u7F00\uFF0C\n * \u7136\u540E\u4ECE\u524D\u7F00\u76EE\u5F55\u9012\u5F52\u5339\u914D\u3002\n */\nfunction expandGlob(pattern: string, result: string[]): void {\n const normalized = pattern.replace(/\\\\/g, '/');\n const parts = normalized.split('/');\n\n // Find the first segment with a glob character\n let prefixEnd = 0;\n while (prefixEnd < parts.length && !isGlobPattern(parts[prefixEnd])) {\n prefixEnd++;\n }\n\n const prefixParts = parts.slice(0, prefixEnd);\n const globParts = parts.slice(prefixEnd);\n\n const baseDir = path.resolve(prefixParts.length > 0 ? prefixParts.join('/') : '.');\n\n if (!fs.existsSync(baseDir) || !fs.statSync(baseDir).isDirectory()) {\n return;\n }\n\n matchGlob(baseDir, globParts, 0, result);\n}\n\nfunction matchGlob(dir: string, globParts: string[], partIndex: number, result: string[]): void {\n if (partIndex >= globParts.length) {\n return;\n }\n\n const segment = globParts[partIndex];\n const isLast = partIndex === globParts.length - 1;\n\n if (segment === '**') {\n // ** matches zero or more directories\n // Try matching the rest from current directory (zero dirs matched)\n if (partIndex + 1 < globParts.length) {\n matchGlob(dir, globParts, partIndex + 1, result);\n }\n\n // Recurse into subdirectories\n let entries: fs.Dirent[];\n try {\n entries = fs.readdirSync(dir, {withFileTypes: true});\n } catch {\n return;\n }\n\n for (const entry of entries) {\n if (entry.name.startsWith('.') || entry.name === 'node_modules') {continue;}\n const fullPath = path.join(dir, entry.name);\n if (entry.isDirectory()) {\n // Continue matching ** from this subdirectory\n matchGlob(fullPath, globParts, partIndex, result);\n } else if (entry.isFile() && isLast && entry.name.endsWith('.thrift')) {\n // ** as last segment matches .thrift files only\n result.push(fullPath);\n }\n }\n } else {\n // Normal segment with possible * or ? wildcards\n let entries: fs.Dirent[];\n try {\n entries = fs.readdirSync(dir, {withFileTypes: true});\n } catch {\n return;\n }\n\n for (const entry of entries) {\n if (!globMatch(segment, entry.name)) {continue;}\n const fullPath = path.join(dir, entry.name);\n\n if (isLast) {\n if (entry.isFile() && entry.name.endsWith('.thrift')) {\n result.push(fullPath);\n } else if (entry.isDirectory()) {\n // Pattern ended with a directory match \u2014 collect .thrift files\n collectThriftFiles(fullPath, result);\n }\n } else {\n if (entry.isDirectory()) {\n matchGlob(fullPath, globParts, partIndex + 1, result);\n }\n }\n }\n }\n}\n\n/**\n * Match a filename against a glob segment using pure string matching (no RegExp).\n * Supports * (any chars) and ? (single char).\n */\nfunction globMatch(pattern: string, name: string): boolean {\n let pi = 0; // pattern index\n let ni = 0; // name index\n let starPi = -1; // last * position in pattern\n let starNi = -1; // name position when last * was hit\n\n while (ni < name.length) {\n if (pi < pattern.length && (pattern[pi] === name[ni] || pattern[pi] === '?')) {\n pi++;\n ni++;\n } else if (pi < pattern.length && pattern[pi] === '*') {\n starPi = pi;\n starNi = ni;\n pi++; // try matching * with zero chars first\n } else if (starPi !== -1) {\n // backtrack: let * match one more char\n pi = starPi + 1;\n starNi++;\n ni = starNi;\n } else {\n return false;\n }\n }\n\n // Consume trailing *s in pattern\n while (pi < pattern.length && pattern[pi] === '*') {\n pi++;\n }\n\n return pi === pattern.length;\n}\n\nfunction collectThriftFiles(dir: string, result: string[]): void {\n let entries: fs.Dirent[];\n try {\n entries = fs.readdirSync(dir, {withFileTypes: true});\n } catch {\n return; // skip unreadable directories\n }\n\n for (const entry of entries) {\n const fullPath = path.join(dir, entry.name);\n if (entry.isDirectory()) {\n // Skip hidden dirs and node_modules\n if (entry.name.startsWith('.') || entry.name === 'node_modules') {continue;}\n collectThriftFiles(fullPath, result);\n } else if (entry.isFile() && entry.name.endsWith('.thrift')) {\n result.push(fullPath);\n }\n }\n}\n", "/**\n * format \u547D\u4EE4\uFF1A\u683C\u5F0F\u5316 Thrift IDL \u6587\u4EF6\u3002\n */\nimport * as fs from 'fs';\nimport {ThriftFormatter} from '@tanzz/thrift-core';\nimport type {ThriftFormattingOptions} from '@tanzz/thrift-core';\nimport type {ParsedArgs} from '../args';\n\nconst DEFAULT_OPTIONS: ThriftFormattingOptions = {\n trailingComma: 'preserve',\n alignTypes: true,\n alignFieldNames: true,\n alignStructDefaults: false,\n alignAnnotations: true,\n alignComments: true,\n alignEnumNames: true,\n alignEnumEquals: true,\n alignEnumValues: true,\n indentSize: 4,\n maxLineLength: 100,\n collectionStyle: 'preserve',\n insertSpaces: true,\n tabSize: 4,\n};\n\nexport function runFormat(\n files: string[],\n args: ParsedArgs,\n formatOverrides: Partial<ThriftFormattingOptions>\n): number {\n const options: ThriftFormattingOptions = {...DEFAULT_OPTIONS, ...formatOverrides};\n const formatter = new ThriftFormatter();\n\n // --stdin mode\n if (args.stdin) {\n if (args.write) {\n process.stderr.write('Error: --write cannot be used with --stdin.\\n');\n return 2;\n }\n return formatStdin(formatter, options, args.check);\n }\n\n if (files.length === 0) {\n process.stderr.write('Error: No files specified.\\n');\n return 2;\n }\n\n let hasUnformatted = false;\n\n for (const filePath of files) {\n let content: string;\n try {\n content = fs.readFileSync(filePath, 'utf-8');\n } catch (error) {\n process.stderr.write(`Error: Cannot read \"${filePath}\": ${error instanceof Error ? error.message : String(error)}\\n`);\n return 3;\n }\n\n let formatted: string;\n try {\n formatted = formatter.format(content, options);\n } catch (error) {\n process.stderr.write(`Error: Formatting failed for \"${filePath}\": ${error instanceof Error ? error.message : String(error)}\\n`);\n return 3;\n }\n\n if (args.check) {\n // --check mode: exit 1 if any file needs formatting\n if (formatted !== content) {\n process.stdout.write(`${filePath}\\n`);\n hasUnformatted = true;\n }\n } else if (args.write) {\n // --write mode: write back to file\n if (formatted !== content) {\n fs.writeFileSync(filePath, formatted, 'utf-8');\n process.stderr.write(`Formatted: ${filePath}\\n`);\n }\n } else {\n // Default: output to stdout\n process.stdout.write(formatted);\n if (!formatted.endsWith('\\n')) {\n process.stdout.write('\\n');\n }\n }\n }\n\n return hasUnformatted ? 1 : 0;\n}\n\nfunction formatStdin(formatter: ThriftFormatter, options: ThriftFormattingOptions, checkMode: boolean): number {\n const chunks: Buffer[] = [];\n const buf = Buffer.alloc(65536);\n let bytesRead: number;\n while ((bytesRead = fs.readSync(process.stdin.fd, buf, 0, buf.length, null)) > 0) {\n chunks.push(buf.subarray(0, bytesRead));\n }\n\n const content = Buffer.concat(chunks).toString('utf-8');\n try {\n const formatted = formatter.format(content, options);\n if (checkMode) {\n if (formatted !== content) {\n process.stderr.write('<stdin>: unformatted\\n');\n return 1;\n }\n return 0;\n }\n process.stdout.write(formatted);\n return 0;\n } catch (error) {\n process.stderr.write(`Error: Formatting failed: ${error instanceof Error ? error.message : String(error)}\\n`);\n return 3;\n }\n}\n", "/**\n * lint \u547D\u4EE4\uFF1A\u8FD0\u884C\u8BCA\u65AD\u89C4\u5219\uFF0C\u68C0\u67E5\u8BED\u6CD5\u548C\u8BED\u4E49\u9519\u8BEF\u3002\n */\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport {ThriftParser, analyzeThriftAst, collectTypesFromAst, collectIncludes, DiagnosticSeverity, safeResolveIncludePath} from '@tanzz/thrift-core';\nimport type {ThriftIssue} from '@tanzz/thrift-core';\nimport type {ParsedArgs} from '../args';\nimport type {ThriftCliConfig} from '../config';\nimport {formatIssuesText, formatIssuesJson} from '../output';\n\nexport function runLint(files: string[], args: ParsedArgs, config: ThriftCliConfig = {}): number {\n if (files.length === 0) {\n process.stderr.write('Error: No files specified.\\n');\n return 2;\n }\n\n const severityFilter = args.severity ?? config.lint?.severity ?? 'all';\n let totalIssues = 0;\n const allJsonIssues: object[] = [];\n\n for (const filePath of files) {\n let content: string;\n try {\n content = fs.readFileSync(filePath, 'utf-8');\n } catch (error) {\n process.stderr.write(`Error: Cannot read \"${filePath}\": ${error instanceof Error ? error.message : String(error)}\\n`);\n return 3;\n }\n\n let issues: ThriftIssue[];\n try {\n const lines = content.split('\\n');\n const ast = ThriftParser.parseContentWithCache(filePath, content);\n const includedTypes = resolveIncludeTypes(ast, filePath, args.includePaths);\n issues = analyzeThriftAst(ast, lines, includedTypes);\n } catch (error) {\n process.stderr.write(`Error: Analysis failed for \"${filePath}\": ${error instanceof Error ? error.message : String(error)}\\n`);\n return 3;\n }\n\n // Filter by severity\n if (severityFilter !== 'all') {\n const targetSeverity = severityFilter === 'error' ? DiagnosticSeverity.Error : DiagnosticSeverity.Warning;\n issues = issues.filter(issue => issue.severity <= targetSeverity);\n }\n\n if (issues.length === 0) {continue;}\n totalIssues += issues.length;\n\n if (args.json) {\n allJsonIssues.push(...formatIssuesJson(filePath, issues));\n } else if (!args.quiet) {\n process.stdout.write(formatIssuesText(filePath, issues) + '\\n');\n }\n }\n\n if (args.json) {\n process.stdout.write(JSON.stringify(allJsonIssues, null, 2) + '\\n');\n }\n\n if (!args.quiet && !args.json && totalIssues > 0) {\n process.stderr.write(`\\n${totalIssues} issue(s) found.\\n`);\n }\n\n return totalIssues > 0 ? 1 : 0;\n}\n\n/**\n * \u4ECE AST include \u8282\u70B9\u4E2D\u89E3\u6790 include \u6587\u4EF6\u7684\u7C7B\u578B\u3002\n * \u4F7F\u7528 AST \u800C\u975E\u539F\u59CB\u6B63\u5219\uFF0C\u4EE5\u907F\u514D\u5339\u914D\u6CE8\u91CA\u4E2D\u7684 include \u6307\u4EE4\u3002\n */\nfunction resolveIncludeTypes(\n ast: ReturnType<typeof ThriftParser.parseContentWithCache>,\n filePath: string,\n includePaths: string[]\n): Map<string, string> | undefined {\n const includedTypes = new Map<string, string>();\n const searchDirs = [path.dirname(filePath), ...includePaths];\n\n for (const includeNode of collectIncludes(ast)) {\n const includeName = includeNode.path;\n const alias = path.basename(includeName, '.thrift');\n\n for (const dir of searchDirs) {\n const resolvedPath = safeResolveIncludePath(includeName, dir, dir);\n if (resolvedPath === undefined) { continue; }\n if (fs.existsSync(resolvedPath)) {\n try {\n const includeContent = fs.readFileSync(resolvedPath, 'utf-8');\n const includeAst = ThriftParser.parseContentWithCache(resolvedPath, includeContent);\n const types = collectTypesFromAst(includeAst);\n for (const [name, kind] of types) {\n includedTypes.set(`${alias}.${name}`, kind);\n }\n } catch {\n // Skip unreadable include files\n }\n break;\n }\n }\n }\n\n return includedTypes.size > 0 ? includedTypes : undefined;\n}\n", "/**\n * \u8F93\u51FA\u683C\u5F0F\u5316\uFF1A\u8BCA\u65AD/AST/\u7B26\u53F7\u7684\u6587\u672C\u548C JSON \u8F93\u51FA\u3002\n */\nimport type {ThriftIssue} from '@tanzz/thrift-core';\nimport {DiagnosticSeverity} from '@tanzz/thrift-core';\n\nconst SEVERITY_LABELS: Record<number, string> = {\n [DiagnosticSeverity.Error]: 'error',\n [DiagnosticSeverity.Warning]: 'warning',\n [DiagnosticSeverity.Information]: 'info',\n [DiagnosticSeverity.Hint]: 'hint',\n};\n\nexport function formatIssuesText(filePath: string, issues: ThriftIssue[]): string {\n if (issues.length === 0) {return '';}\n\n const lines: string[] = [];\n for (const issue of issues) {\n const severity = SEVERITY_LABELS[issue.severity] ?? 'unknown';\n const line = issue.range.start.line + 1;\n const col = issue.range.start.character + 1;\n lines.push(`${filePath}:${line}:${col}: ${severity}: ${issue.message}${issue.code !== null && issue.code !== undefined ? ` [${issue.code}]` : ''}`);\n }\n return lines.join('\\n');\n}\n\nexport function formatIssuesJson(filePath: string, issues: ThriftIssue[]): object[] {\n return issues.map(issue => ({\n file: filePath,\n line: issue.range.start.line + 1,\n column: issue.range.start.character + 1,\n endLine: issue.range.end.line + 1,\n endColumn: issue.range.end.character + 1,\n severity: SEVERITY_LABELS[issue.severity] ?? 'unknown',\n message: issue.message,\n code: issue.code ?? null,\n }));\n}\n\nexport interface SymbolInfo {\n name: string;\n kind: string;\n line: number;\n detail?: string;\n children?: SymbolInfo[];\n}\n\nexport function formatSymbolsText(symbols: SymbolInfo[], indent: number = 0): string {\n const lines: string[] = [];\n const prefix = ' '.repeat(indent);\n for (const sym of symbols) {\n const detail = sym.detail !== null && sym.detail !== undefined ? ` ${sym.detail}` : '';\n lines.push(`${prefix}${sym.kind} ${sym.name}${detail} (line ${sym.line})`);\n if (sym.children && sym.children.length > 0) {\n lines.push(formatSymbolsText(sym.children, indent + 1));\n }\n }\n return lines.join('\\n');\n}\n", "/**\n * parse \u547D\u4EE4\uFF1A\u89E3\u6790 Thrift \u6587\u4EF6\u5E76\u8F93\u51FA AST\uFF08JSON \u683C\u5F0F\uFF09\u3002\n */\nimport * as fs from 'fs';\nimport {ThriftParser} from '@tanzz/thrift-core';\nimport type {ParsedArgs} from '../args';\n\nexport function runParse(files: string[], args: ParsedArgs): number {\n // --stdin mode\n if (args.stdin) {\n return parseStdin();\n }\n\n if (files.length === 0) {\n process.stderr.write('Error: No files specified.\\n');\n return 2;\n }\n\n const results: object[] = [];\n\n for (const filePath of files) {\n let content: string;\n try {\n content = fs.readFileSync(filePath, 'utf-8');\n } catch (error) {\n process.stderr.write(`Error: Cannot read \"${filePath}\": ${error instanceof Error ? error.message : String(error)}\\n`);\n return 3;\n }\n\n try {\n const ast = new ThriftParser(content).parse();\n if (files.length === 1) {\n process.stdout.write(JSON.stringify(ast, astReplacer, 2) + '\\n');\n } else {\n results.push({file: filePath, ast: JSON.parse(JSON.stringify(ast, astReplacer)) as object});\n }\n } catch (error) {\n process.stderr.write(`Error: Parse failed for \"${filePath}\": ${error instanceof Error ? error.message : String(error)}\\n`);\n return 3;\n }\n }\n\n if (files.length > 1) {\n process.stdout.write(JSON.stringify(results, null, 2) + '\\n');\n }\n\n return 0;\n}\n\nfunction parseStdin(): number {\n const chunks: Buffer[] = [];\n const buf = Buffer.alloc(65536);\n let bytesRead: number;\n while ((bytesRead = fs.readSync(process.stdin.fd, buf, 0, buf.length, null)) > 0) {\n chunks.push(buf.subarray(0, bytesRead));\n }\n\n const content = Buffer.concat(chunks).toString('utf-8');\n try {\n const ast = new ThriftParser(content).parse();\n process.stdout.write(JSON.stringify(ast, astReplacer, 2) + '\\n');\n return 0;\n } catch (error) {\n process.stderr.write(`Error: Parse failed: ${error instanceof Error ? error.message : String(error)}\\n`);\n return 3;\n }\n}\n\n/**\n * JSON replacer that removes circular `parent` references from AST nodes.\n */\nfunction astReplacer(key: string, value: unknown): unknown {\n if (key === 'parent') {return undefined;}\n return value;\n}\n", "/**\n * symbols \u547D\u4EE4\uFF1A\u5217\u51FA\u6587\u4EF6\u4E2D\u5B9A\u4E49\u7684\u6240\u6709\u7B26\u53F7\u3002\n * \u53C2\u8003 document-symbol-provider.ts:89-213 \u7684\u7B26\u53F7\u63D0\u53D6\u903B\u8F91\u3002\n */\nimport * as fs from 'fs';\nimport {ThriftParser, nodes} from '@tanzz/thrift-core';\nimport type {ParsedArgs} from '../args';\nimport {formatSymbolsText, SymbolInfo} from '../output';\n\nexport function runSymbols(files: string[], args: ParsedArgs): number {\n if (files.length === 0) {\n process.stderr.write('Error: No files specified.\\n');\n return 2;\n }\n\n const allResults: {file: string; symbols: SymbolInfo[]}[] = [];\n\n for (const filePath of files) {\n let content: string;\n try {\n content = fs.readFileSync(filePath, 'utf-8');\n } catch (error) {\n process.stderr.write(`Error: Cannot read \"${filePath}\": ${error instanceof Error ? error.message : String(error)}\\n`);\n return 3;\n }\n\n try {\n const ast = new ThriftParser(content).parse();\n const symbols = extractSymbols(ast, args.flat);\n\n if (args.json) {\n allResults.push({file: filePath, symbols});\n } else {\n if (files.length > 1) {\n process.stdout.write(`\\n${filePath}:\\n`);\n }\n const text = formatSymbolsText(symbols);\n if (text) {process.stdout.write(text + '\\n');}\n }\n } catch (error) {\n process.stderr.write(`Error: Symbol extraction failed for \"${filePath}\": ${error instanceof Error ? error.message : String(error)}\\n`);\n return 3;\n }\n }\n\n if (args.json) {\n if (files.length === 1 && allResults.length === 1) {\n process.stdout.write(JSON.stringify(allResults[0].symbols, null, 2) + '\\n');\n } else {\n process.stdout.write(JSON.stringify(allResults, null, 2) + '\\n');\n }\n }\n\n return 0;\n}\n\nfunction extractSymbols(ast: nodes.ThriftDocument, flat: boolean): SymbolInfo[] {\n const symbols: SymbolInfo[] = [];\n\n for (const node of ast.body) {\n const sym = nodeToSymbol(node, flat);\n if (sym) {\n if (flat && sym.children) {\n // Flatten: push parent, then children at top level\n const children = sym.children;\n sym.children = undefined;\n symbols.push(sym);\n symbols.push(...children);\n } else {\n symbols.push(sym);\n }\n }\n }\n\n return symbols;\n}\n\nfunction nodeToSymbol(node: nodes.ThriftNode, flat: boolean): SymbolInfo | null {\n const line = node.range.start.line + 1;\n\n switch (node.type) {\n case nodes.ThriftNodeType.Namespace: {\n const ns = node;\n return {\n name: ns.namespace,\n kind: 'namespace',\n line,\n detail: `(${ns.scope})`,\n };\n }\n case nodes.ThriftNodeType.Include: {\n const inc = node;\n return {\n name: inc.path,\n kind: 'include',\n line,\n };\n }\n case nodes.ThriftNodeType.Const: {\n const c = node;\n return {\n name: c.name ?? '',\n kind: 'const',\n line,\n detail: c.valueType,\n };\n }\n case nodes.ThriftNodeType.Typedef: {\n const td = node;\n return {\n name: td.name ?? '',\n kind: 'typedef',\n line,\n detail: td.aliasType,\n };\n }\n case nodes.ThriftNodeType.Enum: {\n const en = node;\n const children = en.members.map(m => ({\n name: m.name ?? '',\n kind: 'enum-member',\n line: m.range.start.line + 1,\n detail: m.initializer !== undefined ? `= ${m.initializer}` : undefined,\n }));\n return {\n name: en.name ?? '',\n kind: en.isSenum === true ? 'senum' : 'enum',\n line,\n children: flat ? children : (children.length > 0 ? children : undefined),\n };\n }\n case nodes.ThriftNodeType.Struct:\n case nodes.ThriftNodeType.Union:\n case nodes.ThriftNodeType.Exception: {\n const st = node;\n const kind = node.type === nodes.ThriftNodeType.Struct ? 'struct'\n : node.type === nodes.ThriftNodeType.Union ? 'union'\n : 'exception';\n const children = st.fields.map(f => ({\n name: f.name ?? '',\n kind: 'field',\n line: f.range.start.line + 1,\n detail: `${f.id}: ${f.requiredness ?? ''} ${f.fieldType}`.trim(),\n }));\n return {\n name: st.name ?? '',\n kind,\n line,\n children: flat ? children : (children.length > 0 ? children : undefined),\n };\n }\n case nodes.ThriftNodeType.Service: {\n const svc = node;\n const children = svc.functions.map(fn => ({\n name: fn.name ?? '',\n kind: 'function',\n line: fn.range.start.line + 1,\n detail: `${fn.oneway ? 'oneway ' : ''}${fn.returnType}(${fn.arguments.map(a => `${a.fieldType} ${a.name ?? ''}`).join(', ')})`,\n }));\n return {\n name: svc.name ?? '',\n kind: 'service',\n line,\n detail: svc.extends !== null && svc.extends !== undefined ? `extends ${svc.extends}` : undefined,\n children: flat ? children : (children.length > 0 ? children : undefined),\n };\n }\n case nodes.ThriftNodeType.Interaction: {\n const inter = node;\n const children = inter.functions.map(fn => ({\n name: fn.name ?? '',\n kind: 'function',\n line: fn.range.start.line + 1,\n detail: `${fn.returnType}(${fn.arguments.map(a => `${a.fieldType} ${a.name ?? ''}`).join(', ')})`,\n }));\n return {\n name: inter.name ?? '',\n kind: 'interaction',\n line,\n children: flat ? children : (children.length > 0 ? children : undefined),\n };\n }\n default:\n return null;\n }\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["exports", "path", "DiagnosticSeverity", "exports", "ThriftNodeType", "exports", "exports", "exports", "exports", "exports", "exports", "exports", "exports", "exports", "exports", "parse", "exports", "exports", "exports", "nodes", "exports", "exports", "leading", "trimmed", "exports", "exports", "exports", "nodes", "ThriftParser", "trimmed", "line", "parser", "exports", "exports", "collectIncludes", "nodes", "path", "exports", "nodes", "exports", "exports", "exports", "exports", "exports", "formattedLines", "exports", "exports", "exports", "exports", "exports", "exports", "exports", "exports", "exports", "exports", "exports", "exports", "line", "exports", "nodes", "ThriftFormatter", "exports", "exports", "exports", "collectTypesFromAst", "nodes", "exports", "nodes", "exports", "path", "nodes", "exports", "i", "exports", "nodes", "exports", "exports", "exports", "exports", "analyzeThriftAst", "nodes", "exports", "safeResolveIncludePath", "path", "resolved", "exports", "fs", "path", "fs", "path", "fs", "fs", "path", "import_thrift_core", "import_thrift_core", "fs", "import_thrift_core", "fs", "import_thrift_core"]
7
+ }