Skip to content

Commit 09f7711

Browse files
committed
feat: refactor output and settings management, add file type statistics tracking
1 parent e5f9942 commit 09f7711

File tree

11 files changed

+102
-12
lines changed

11 files changed

+102
-12
lines changed

src/commands.ts

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@ import * as fs from "fs";
22
import * as path from "path";
33
import * as vscode from "vscode";
44
import { ContextCollector } from "./core";
5-
import { OutputManager } from "./output";
65
import { parserRegistry } from "./parsers";
76
import { FileContext } from "./types";
87
import {
@@ -12,6 +11,8 @@ import {
1211
isTextFile,
1312
shouldIgnoreFile,
1413
} from "./utils";
14+
import { OutputManager } from "./lib/output";
15+
import { getFileTypeStats, showStatsNotification } from "./lib/stats";
1516

1617
export class CommandHandler {
1718
private contextCollector = new ContextCollector();
@@ -189,11 +190,17 @@ export class CommandHandler {
189190
(sum, ctx) => sum + ctx.content.split("\n").length,
190191
0,
191192
);
193+
const stats = getFileTypeStats(allContexts);
192194
await vscode.env.clipboard.writeText(output);
193195

194196
const successMessage = `Copied ${allContexts.length} files (${totalLines} lines) - direct collection`;
195197
this.output.log(`✓ ${successMessage}`);
196-
vscode.window.showInformationMessage(successMessage);
198+
showStatsNotification(
199+
allContexts.length,
200+
totalLines,
201+
stats,
202+
"direct collection",
203+
);
197204
}
198205

199206
private async collectFilesFromDirectory(
@@ -300,6 +307,7 @@ export class CommandHandler {
300307
(sum, ctx) => sum + ctx.content.split("\n").length,
301308
0,
302309
);
310+
const stats = getFileTypeStats(finalContexts);
303311
await vscode.env.clipboard.writeText(output);
304312

305313
const programmingFiles = finalContexts.filter(
@@ -308,10 +316,10 @@ export class CommandHandler {
308316
const modeLabel = applyIgnorePatterns
309317
? "smart filter"
310318
: `${programmingFiles} with imports, ${finalContexts.length - programmingFiles} text`;
311-
const successMessage = `Copied ${finalContexts.length} files (${totalLines} lines) - ${modeLabel}`;
312319

320+
const successMessage = `Copied ${finalContexts.length} files (${totalLines} lines) - ${modeLabel}`;
313321
this.output.log(`✓ ${successMessage}`);
314-
vscode.window.showInformationMessage(successMessage);
322+
showStatsNotification(finalContexts.length, totalLines, stats, modeLabel);
315323
}
316324

317325
async handleCollectAll(): Promise<void> {
@@ -351,12 +359,13 @@ export class CommandHandler {
351359
(sum, ctx) => sum + ctx.content.split("\n").length,
352360
0,
353361
);
362+
const stats = getFileTypeStats(contexts);
354363
const output = formatContexts(contexts);
355364
await vscode.env.clipboard.writeText(output);
356365

357366
const successMessage = `Copied ${contexts.length} files (${totalLines} lines)`;
358367
this.output.log(`✓ ${successMessage}`);
359-
vscode.window.showInformationMessage(successMessage);
368+
showStatsNotification(contexts.length, totalLines, stats);
360369
} catch (error) {
361370
const errorMessage = `Error: ${error}`;
362371
this.output.error(errorMessage, error);

src/core.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import * as fs from "fs";
22
import * as micromatch from "micromatch";
33
import * as path from "path";
44
import { getIgnorePatterns } from "./config";
5-
import { OutputManager } from "./output";
5+
import { OutputManager } from "./lib/output";
66
import { parserRegistry } from "./parsers";
77
import { resolverRegistry } from "./resolvers";
88
import { PythonResolver } from "./resolvers/python-resolver";

src/extension.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import * as vscode from "vscode";
22
import { CommandHandler } from "./commands";
3-
import { OutputManager } from "./output";
4-
import { SettingsInitializer } from "./settings-initializer";
3+
import { OutputManager } from "./lib/output";
4+
import { SettingsInitializer } from "./lib/settings-initializer";
55

66
export async function activate(context: vscode.ExtensionContext) {
77
const output = OutputManager.getInstance();
File renamed without changes.
File renamed without changes.

src/lib/stats.ts

Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
import * as path from "path";
2+
import * as vscode from "vscode";
3+
import { FileContext } from "../types";
4+
5+
interface FileTypeStats {
6+
[ext: string]: { count: number; lines: number };
7+
}
8+
9+
export function getFileTypeStats(contexts: FileContext[]): FileTypeStats {
10+
const stats: FileTypeStats = {};
11+
12+
for (const ctx of contexts) {
13+
const ext = path.extname(ctx.path) || "no extension";
14+
const lines = ctx.content.split("\n").length;
15+
16+
if (!stats[ext]) {
17+
stats[ext] = { count: 0, lines: 0 };
18+
}
19+
20+
stats[ext].count++;
21+
stats[ext].lines += lines;
22+
}
23+
24+
return stats;
25+
}
26+
27+
function showStatsQuickPick(
28+
fileCount: number,
29+
totalLines: number,
30+
stats: FileTypeStats,
31+
modeLabel?: string,
32+
): void {
33+
const entries = Object.entries(stats).sort((a, b) => b[1].lines - a[1].lines);
34+
35+
const items = entries.map(([ext, { count, lines }]) => ({
36+
label: ext,
37+
description: `${count} files`,
38+
detail: `${lines} lines`,
39+
}));
40+
41+
const quickPick = vscode.window.createQuickPick();
42+
quickPick.title = `✓ Copied ${fileCount} files (${totalLines} lines)${modeLabel ? ` - ${modeLabel}` : ""}`;
43+
quickPick.items = items;
44+
quickPick.canSelectMany = false;
45+
46+
quickPick.onDidHide(() => quickPick.dispose());
47+
quickPick.show();
48+
}
49+
50+
export function showStatsNotification(
51+
fileCount: number,
52+
totalLines: number,
53+
stats: FileTypeStats,
54+
modeLabel?: string,
55+
): void {
56+
const statusBarItem = vscode.window.createStatusBarItem(
57+
vscode.StatusBarAlignment.Left,
58+
100,
59+
);
60+
statusBarItem.text = `$(list-unordered) File Stats (${fileCount} files, ${totalLines} lines)`;
61+
statusBarItem.tooltip = "Click to view file type breakdown";
62+
statusBarItem.command = "code-collector.showTempStats";
63+
64+
const disposable = vscode.commands.registerCommand(
65+
"code-collector.showTempStats",
66+
() => {
67+
showStatsQuickPick(fileCount, totalLines, stats, modeLabel);
68+
},
69+
);
70+
71+
statusBarItem.show();
72+
73+
setTimeout(() => {
74+
statusBarItem.dispose();
75+
disposable.dispose();
76+
}, 10000);
77+
78+
vscode.window.showInformationMessage(
79+
`Copied ${fileCount} files (${totalLines} lines)${modeLabel ? ` - ${modeLabel}` : ""}`,
80+
);
81+
}

src/resolvers/jvm-resolver.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
import { XMLParser } from "fast-xml-parser";
22
import * as fs from "fs";
33
import * as path from "path";
4+
import { jvmExtensions } from "../lib/languages";
45
import { ResolverConfig } from "../types";
56
import { BaseResolver } from "./base-resolver";
6-
import { jvmExtensions } from "../languages";
77

88
interface MavenProject {
99
project?: {

src/resolvers/node-resolver.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import * as fs from "fs";
22
import * as path from "path";
33
import * as ts from "typescript";
4-
import { javascriptExtensions } from "../languages";
4+
import { javascriptExtensions } from "../lib/languages";
55
import { ResolverConfig } from "../types";
66
import { BaseResolver } from "./base-resolver";
77

src/resolvers/python-resolver.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import * as fs from "fs";
33
import * as os from "os";
44
import * as path from "path";
55
import * as util from "util";
6-
import { pythonExtensions } from "../languages";
6+
import { pythonExtensions } from "../lib/languages";
77
import { ResolverConfig } from "../types";
88
import { BaseResolver } from "./base-resolver";
99

0 commit comments

Comments
 (0)