1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
|
import { Position, Range, Selection, TextEditor, TextLine, WorkspaceEdit } from "vscode";
import { DoxygenCommands, IDocGen } from "./DocGen";
export default class CppGen implements IDocGen {
private lineStart: string;
private endComment: string;
private commandIndicator: string;
private spaceAfterCommand: string;
private activeEditor: TextEditor;
private position: Position;
private comment: string;
private retVals: string[];
private params: string[];
/**
* @param {TextEditor} actEdit Active editor window
* @param {Position} cursorPosition Where the cursor of the user currently is
* @param {string[]} param The parameter names of the method extracted by the parser
* @param {string[]} returnVals The return values extracted by the parser
*/
public constructor(actEdit: TextEditor, cursorPosition: Position, param: string[], returnVals: string[]) {
this.activeEditor = actEdit;
this.position = cursorPosition;
this.comment = "\n"; // Add the new line after the comment indicator
this.params = param;
this.retVals = returnVals;
}
/**
* @inheritdoc
*/
public GenerateDoc() {
this.readConfig();
this.generateComment();
const oldPos: Position = this.position;
const active: Position = this.activeEditor.selection.active;
const anchor: Position = new Position(active.line + 1, active.character); // Start at the next line
const replaceSelection = new Selection(anchor, active);
this.activeEditor.edit((editBuilder) => {
editBuilder.replace(replaceSelection, this.comment); // Insert the comment
});
// Set cursor after brief command
this.setCursor(oldPos.line + 3, oldPos.character);
const newSelectActive = new Position(oldPos.line + 3, oldPos.character + DoxygenCommands.detailed.length);
const newSelectPos = new Position(oldPos.line + 3, oldPos.character);
this.activeEditor.selection = new Selection(newSelectPos, newSelectActive);
}
/***************************************************************************
Implementation
***************************************************************************/
private readConfig() {
this.lineStart = " * "; // TODO: make this customizable
this.endComment = "*/"; // TODO: make this customizable
this.commandIndicator = "@"; // TODO: make this customizable
this.spaceAfterCommand = " "; // TODO: make this customizable
}
private indentLine(commentLine: string): string {
const line: TextLine = this.activeEditor.document.lineAt(this.activeEditor.selection.start.line);
const lineTxt: string = line.text;
let stringToIndent: string = "";
// Find indentation from previous line
for (let i = 0; i < line.firstNonWhitespaceCharacterIndex; i++) {
if (lineTxt.charAt(i) === "\t") {
stringToIndent = stringToIndent + "\t";
} else if (lineTxt.charAt(i) === " ") {
stringToIndent = stringToIndent + " ";
}
}
const textToInsert = stringToIndent + commentLine;
return textToInsert;
}
private generateBrief() {
let line: string = "";
line += this.lineStart;
line += this.commandIndicator;
line += DoxygenCommands.brief;
line += this.spaceAfterCommand;
this.comment += this.indentLine(line);
}
private generateDetailed() {
let line: string = "";
line += this.lineStart;
line += "\n";
this.comment += this.indentLine(line);
line = this.lineStart;
line += DoxygenCommands.detailed + "\n";
this.comment += this.indentLine(line);
line = this.lineStart;
this.comment += this.indentLine(line);
}
private generateParams() {
let line: string = "";
this.params.forEach((element: string) => {
line = this.lineStart;
line += this.commandIndicator;
line += DoxygenCommands.param + " "; // TODO: Make this customizable
line += element + "\n";
this.comment += this.indentLine(line);
});
}
private generateReturn() {
let line: string = "";
this.retVals.forEach((element: string) => {
line = this.lineStart;
line += this.commandIndicator;
line += DoxygenCommands.return + " "; // TODO: Make this customizable
line += element + "\n";
this.comment += this.indentLine(line);
});
}
private generateEnd() {
let line: string = " "; // TODO: Make this customizable
line += this.endComment;
this.comment += this.indentLine(line);
}
private generateComment() {
this.generateBrief();
this.comment += "\n";
this.generateDetailed();
this.comment += "\n";
if (this.params.length !== 0) { // Only if we have parameters
this.generateParams();
}
if (this.retVals.length !== 0) { // Only if we have return values
if (this.params.length !== 0) {
const line: string = this.lineStart + "\n";
this.comment += this.indentLine(line);
}
this.generateReturn();
}
this.generateEnd();
}
private setCursor(line: number, character: number) {
const indentLen: number = this.indentLine("").length;
const move: Selection = new Selection(line, character, line, character);
this.activeEditor.selection = move;
}
}
|