Skip to content

Commit 82eebc3

Browse files
Gold856nobody5050
andauthored
Refactor file generation logic (#787)
Co-authored-by: Nobody5050 <[email protected]>
1 parent 5730f70 commit 82eebc3

File tree

9 files changed

+522
-617
lines changed

9 files changed

+522
-617
lines changed

vscode-wpilib/package-lock.json

Lines changed: 8 additions & 7 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

vscode-wpilib/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -476,7 +476,7 @@
476476
"@types/mkdirp": "^1.0.1",
477477
"@types/mocha": "^8.0.3",
478478
"@types/ncp": "^2.0.4",
479-
"@types/node": "^10.2.0",
479+
"@types/node": "^14.16.0",
480480
"@types/node-fetch": "^2.5.7",
481481
"@types/triple-beam": "^1.3.1",
482482
"@types/vscode": "1.57.0",

vscode-wpilib/src/cpp/commands.ts

Lines changed: 32 additions & 150 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,13 @@
11
'use strict';
22
import * as fs from 'fs';
3+
import { copyFile } from 'fs/promises';
34
import * as jsonc from 'jsonc-parser';
45
import * as path from 'path';
56
import * as vscode from 'vscode';
67
import { ICommandAPI, ICommandCreator, IPreferencesAPI } from '../api';
78
import { logger } from '../logger';
8-
import { getClassName, ncpAsync } from '../utilities';
9+
import { getClassName } from '../utilities';
10+
import * as fileUtils from '../shared/fileUtils';
911

1012
export interface ICppJsonLayout {
1113
name: string;
@@ -25,158 +27,38 @@ async function performCopy(
2527
includeRoot: vscode.Uri,
2628
replaceName: string
2729
): Promise<boolean> {
28-
const commandFolder = path.join(commandRoot, command.foldername);
29-
const copiedSrcFiles: string[] = [];
30-
const copiedHeaderFiles: string[] = [];
31-
await ncpAsync(commandFolder, folderSrc.fsPath, {
32-
filter: (cf: string): boolean => {
33-
if (!fs.lstatSync(cf).isFile()) {
34-
return true;
35-
}
36-
const bn = path.basename(cf);
37-
if (command.source.indexOf(bn) > -1) {
38-
copiedSrcFiles.push(path.relative(commandFolder, cf));
39-
return true;
40-
} else {
41-
return false;
42-
}
43-
},
44-
});
45-
46-
await ncpAsync(commandFolder, folderHeader.fsPath, {
47-
filter: (cf: string): boolean => {
48-
if (!fs.lstatSync(cf).isFile()) {
49-
return true;
50-
}
51-
const bn = path.basename(cf);
52-
if (command.headers.indexOf(bn) > -1) {
53-
copiedHeaderFiles.push(path.relative(commandFolder, cf));
54-
return true;
55-
} else {
56-
return false;
57-
}
58-
},
59-
});
60-
61-
let promiseArray: Promise<void>[] = [];
62-
63-
for (const f of copiedHeaderFiles) {
64-
const file = path.join(folderHeader.fsPath, f);
65-
promiseArray.push(
66-
new Promise<void>((resolve, reject) => {
67-
fs.readFile(file, 'utf8', (err, dataIn) => {
68-
if (err) {
69-
reject(err);
70-
} else {
71-
const dataOut = dataIn.replace(new RegExp(command.replacename, 'g'), replaceName);
72-
fs.writeFile(file, dataOut, 'utf8', (err1) => {
73-
if (err1) {
74-
reject(err);
75-
} else {
76-
resolve();
77-
}
78-
});
79-
}
80-
});
81-
})
30+
try {
31+
const commandFolder = path.join(commandRoot, command.foldername);
32+
33+
const renamedHeader = path.join(folderHeader.fsPath, `${replaceName}.h`);
34+
const renamedSource = path.join(folderSrc.fsPath, `${replaceName}.cpp`);
35+
// The source and header arrays are always one item long
36+
await copyFile(path.join(commandFolder, command.headers[0]), renamedHeader);
37+
await copyFile(path.join(commandFolder, command.source[0]), renamedSource);
38+
39+
// Process header files
40+
const headerReplacements = new Map<RegExp, string>();
41+
headerReplacements.set(new RegExp(command.replacename, 'g'), replaceName);
42+
43+
await fileUtils.processFile(renamedHeader, headerReplacements);
44+
// Process source files with more complex replacements
45+
const sourceReplacements = new Map<RegExp, string>();
46+
const joinedName = path
47+
.join(path.relative(includeRoot.path, folderHeader.path), replaceName)
48+
.replace(/\\/g, '/');
49+
50+
sourceReplacements.set(
51+
new RegExp(`#include "${command.replacename}.h"`, 'g'),
52+
`#include "${joinedName}.h"`
8253
);
83-
}
84-
85-
await Promise.all(promiseArray);
86-
87-
promiseArray = [];
88-
89-
for (const f of copiedSrcFiles) {
90-
const file = path.join(folderSrc.fsPath, f);
91-
promiseArray.push(
92-
new Promise<void>((resolve, reject) => {
93-
fs.readFile(file, 'utf8', (err, dataIn) => {
94-
if (err) {
95-
reject(err);
96-
} else {
97-
const joinedName = path
98-
.join(path.relative(includeRoot.path, folderHeader.path), replaceName)
99-
.replace(/\\/g, '/');
54+
sourceReplacements.set(new RegExp(command.replacename, 'g'), replaceName);
10055

101-
const dataOut = dataIn
102-
.replace(
103-
new RegExp(`#include "${command.replacename}.h"`, 'g'),
104-
`#include "${joinedName}.h"`
105-
)
106-
.replace(new RegExp(command.replacename, 'g'), replaceName);
107-
108-
fs.writeFile(file, dataOut, 'utf8', (err1) => {
109-
if (err1) {
110-
reject(err);
111-
} else {
112-
resolve();
113-
}
114-
});
115-
}
116-
});
117-
})
118-
);
56+
await fileUtils.processFile(renamedSource, sourceReplacements);
57+
return true;
58+
} catch (error) {
59+
logger.error('Error performing copy operation:', error);
60+
return false;
11961
}
120-
121-
await Promise.all(promiseArray);
122-
123-
let movePromiseArray: Promise<void>[] = [];
124-
for (const f of copiedSrcFiles) {
125-
const file = path.join(folderSrc.fsPath, f);
126-
const bname = path.basename(file);
127-
const dirname = path.dirname(file);
128-
if (path.basename(file).indexOf(command.replacename) > -1) {
129-
const newname = path.join(
130-
dirname,
131-
bname.replace(new RegExp(command.replacename, 'g'), replaceName)
132-
);
133-
movePromiseArray.push(
134-
new Promise<void>((resolve, reject) => {
135-
fs.rename(file, newname, (err) => {
136-
if (err) {
137-
reject(err);
138-
} else {
139-
resolve();
140-
}
141-
});
142-
})
143-
);
144-
}
145-
}
146-
147-
if (movePromiseArray.length > 0) {
148-
await Promise.all(movePromiseArray);
149-
}
150-
151-
movePromiseArray = [];
152-
for (const f of copiedHeaderFiles) {
153-
const file = path.join(folderHeader.fsPath, f);
154-
const bname = path.basename(file);
155-
const dirname = path.dirname(file);
156-
if (path.basename(file).indexOf(command.replacename) > -1) {
157-
const newname = path.join(
158-
dirname,
159-
bname.replace(new RegExp(command.replacename, 'g'), replaceName)
160-
);
161-
movePromiseArray.push(
162-
new Promise<void>((resolve, reject) => {
163-
fs.rename(file, newname, (err) => {
164-
if (err) {
165-
reject(err);
166-
} else {
167-
resolve();
168-
}
169-
});
170-
})
171-
);
172-
}
173-
}
174-
175-
if (movePromiseArray.length > 0) {
176-
await Promise.all(movePromiseArray);
177-
}
178-
179-
return true;
18062
}
18163

18264
export class Commands {

vscode-wpilib/src/java/commands.ts

Lines changed: 27 additions & 78 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,13 @@
11
'use strict';
2-
import * as fs from 'fs';
2+
import { readFile } from 'fs';
3+
import { copyFile } from 'fs/promises';
34
import * as jsonc from 'jsonc-parser';
45
import * as path from 'path';
56
import * as vscode from 'vscode';
67
import { ICommandAPI, ICommandCreator, IPreferencesAPI } from '../api';
78
import { logger } from '../logger';
8-
import { getClassName, getPackageName, ncpAsync } from '../utilities';
9+
import * as fileUtils from '../shared/fileUtils';
10+
import { getClassName, getPackageName } from '../utilities';
911

1012
export interface IJavaJsonLayout {
1113
name: string;
@@ -22,86 +24,33 @@ async function performCopy(
2224
replaceName: string,
2325
javaPackage: string
2426
): Promise<boolean> {
25-
const commandFolder = path.join(commandRoot, command.foldername);
26-
const copiedFiles: string[] = [];
27-
await ncpAsync(commandFolder, folder.fsPath, {
28-
filter: (cf: string): boolean => {
29-
if (fs.lstatSync(cf).isFile()) {
30-
copiedFiles.push(path.relative(commandFolder, cf));
31-
}
32-
return true;
33-
},
34-
});
27+
try {
28+
// Copy files and track them
29+
const renamedCommand = path.join(folder.fsPath, `${replaceName}.java`);
30+
await copyFile(
31+
path.join(commandRoot, command.foldername, `${command.replacename}.java`),
32+
renamedCommand
33+
);
3534

36-
const replacePackageFrom = 'edu\\.wpi\\.first\\.wpilibj\\.(?:commands)\\..+?(?=;|\\.)';
37-
const replacePackageTo = javaPackage;
35+
// Create replacements map
36+
const replacements = new Map<RegExp, string>();
3837

39-
const promiseArray: Promise<void>[] = [];
38+
// Add package replacement
39+
replacements.set(/edu\.wpi\.first\.wpilibj\.(?:commands)\..+?(?=;|\.)/g, javaPackage);
4040

41-
for (const f of copiedFiles) {
42-
const file = path.join(folder.fsPath, f);
43-
promiseArray.push(
44-
new Promise<void>((resolve, reject) => {
45-
fs.readFile(file, 'utf8', (err, dataIn) => {
46-
if (err) {
47-
reject(err);
48-
} else {
49-
const dataOut = dataIn
50-
.replace(new RegExp(replacePackageFrom, 'g'), replacePackageTo)
51-
.replace(new RegExp(command.replacename, 'g'), replaceName);
52-
fs.writeFile(file, dataOut, 'utf8', (err1) => {
53-
if (err1) {
54-
reject(err);
55-
} else {
56-
resolve();
57-
}
58-
});
59-
}
60-
});
61-
})
62-
);
63-
}
41+
// Add classname replacement
42+
replacements.set(new RegExp(command.replacename, 'g'), replaceName);
6443

65-
await Promise.all(promiseArray);
44+
// Process files with replacements
45+
await fileUtils.processFile(renamedCommand, replacements);
6646

67-
const movePromiseArray: Promise<string>[] = [];
68-
for (const f of copiedFiles) {
69-
const file = path.join(folder.fsPath, f);
70-
const bname = path.basename(file);
71-
const dirname = path.dirname(file);
72-
if (path.basename(file).indexOf(command.replacename) > -1) {
73-
const newname = path.join(
74-
dirname,
75-
bname.replace(new RegExp(command.replacename, 'g'), replaceName)
76-
);
77-
movePromiseArray.push(
78-
new Promise<string>((resolve, reject) => {
79-
fs.rename(file, newname, (err) => {
80-
if (err) {
81-
reject(err);
82-
} else {
83-
resolve(newname);
84-
}
85-
});
86-
})
87-
);
88-
}
47+
const document = await vscode.workspace.openTextDocument(vscode.Uri.file(renamedCommand));
48+
await vscode.window.showTextDocument(document);
49+
return true;
50+
} catch (error) {
51+
logger.error('Error performing copy operation:', error);
52+
return false;
8953
}
90-
91-
if (movePromiseArray.length > 0) {
92-
const renamedCopiedFiles = await Promise.all(movePromiseArray);
93-
for (const file of renamedCopiedFiles) {
94-
const uri = vscode.Uri.file(file);
95-
try {
96-
const td = await vscode.workspace.openTextDocument(uri);
97-
await vscode.window.showTextDocument(td);
98-
} catch (err) {
99-
logger.warn('Failed to open copied file: ' + file, err);
100-
}
101-
}
102-
}
103-
104-
return true;
10554
}
10655

10756
export class Commands {
@@ -110,7 +59,7 @@ export class Commands {
11059
constructor(resourceRoot: string, core: ICommandAPI, preferences: IPreferencesAPI) {
11160
const commandFolder = path.join(resourceRoot, 'src', 'commands');
11261
const resourceFile = path.join(commandFolder, this.commandResourceName);
113-
fs.readFile(resourceFile, 'utf8', (err, data) => {
62+
readFile(resourceFile, 'utf8', (err, data) => {
11463
if (err) {
11564
logger.error('Command file error: ', err);
11665
return;
@@ -147,7 +96,7 @@ export class Commands {
14796
}
14897
logger.log(packageslash);
14998
} else {
150-
// Coult not root path, ask for one
99+
// Could not root path, ask for one
151100
const res = await getPackageName();
152101
if (res === undefined) {
153102
return false;

0 commit comments

Comments
 (0)