forked from microsoft/vscode-cpptools
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathreferencesModel.ts
More file actions
163 lines (147 loc) · 6.73 KB
/
Copy pathreferencesModel.ts
File metadata and controls
163 lines (147 loc) · 6.73 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
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
154
155
156
157
158
159
160
161
162
163
/* --------------------------------------------------------------------------------------------
* Copyright (c) Microsoft Corporation. All Rights Reserved.
* See 'LICENSE' in the project root for license information.
* ------------------------------------------------------------------------------------------ */
'use strict';
import * as vscode from 'vscode';
import { ReferenceInfo, ReferencesResult, ReferenceType } from './references';
export class ReferencesModel {
readonly nodes: TreeNode[] = []; // Raw flat list of references
private originalSymbol: string = "";
public groupByFile: boolean;
constructor(resultsInput: ReferencesResult, readonly isCanceled: boolean, groupByFile: boolean, readonly refreshCallback: () => void) {
this.originalSymbol = resultsInput.text;
this.groupByFile = groupByFile;
// Only filter out confirmed references when operation has finished.
// Otherwise, show all results in the "Other References" view while previewing or if the request was canceled.
const results: ReferenceInfo[] = resultsInput.isFinished ?
resultsInput.referenceInfos.filter(r => r.type !== ReferenceType.Confirmed) : resultsInput.referenceInfos;
// Build a single flat list of all leaf nodes
// Currently, the hierarchy is built each time referencesTreeDataProvider requests nodes.
for (const r of results) {
// Add reference to file
const noReferenceLocation: boolean = r.position.line === 0 && r.position.character === 0;
if (noReferenceLocation) {
const node: TreeNode = new TreeNode(this, NodeType.fileWithPendingRef);
node.fileUri = vscode.Uri.file(r.file);
node.filename = r.file;
node.referenceType = r.type;
this.nodes.push(node);
} else {
const range: vscode.Range = new vscode.Range(r.position.line, r.position.character, r.position.line, r.position.character + this.originalSymbol.length);
const uri: vscode.Uri = vscode.Uri.file(r.file);
const location: vscode.Location = new vscode.Location(uri, range);
const node: TreeNode = new TreeNode(this, NodeType.reference);
node.fileUri = uri;
node.filename = r.file;
node.referencePosition = r.position;
node.referenceLocation = location;
node.referenceText = r.text;
node.referenceType = r.type;
this.nodes.push(node);
}
}
}
hasResults(): boolean {
return this.nodes.length > 0;
}
getReferenceTypeNodes(): TreeNode[] {
const result: TreeNode[] = [];
for (const n of this.nodes) {
const i: number = result.findIndex(e => e.referenceType === n.referenceType);
if (i < 0) {
const node: TreeNode = new TreeNode(this, NodeType.referenceType);
node.referenceType = n.referenceType;
result.push(node);
}
}
return result;
}
getFileNodes(refType?: ReferenceType): TreeNode[] {
const result: TreeNode[] = [];
let filteredFiles: TreeNode[] = [];
// Get files by reference type if refType is specified.
if (refType !== undefined) {
filteredFiles = this.nodes.filter(i => i.referenceType === refType);
} else {
filteredFiles = this.nodes;
}
// Create new nodes per unique file
for (const n of filteredFiles) {
const i: number = result.findIndex(item => item.filename === n.filename);
if (i < 0) {
const nodeType: NodeType = n.node === NodeType.fileWithPendingRef ? NodeType.fileWithPendingRef : NodeType.file;
const node: TreeNode = new TreeNode(this, nodeType);
node.filename = n.filename;
node.fileUri = n.fileUri;
node.referenceType = refType;
result.push(node);
}
}
result.sort((a, b) => {
if (a.filename === undefined) {
if (b.filename === undefined) {
return 0;
} else {
return -1;
}
} else if (b.filename === undefined) {
return 1;
} else {
return a.filename.localeCompare(b.filename);
}
});
return result;
}
getReferenceNodes(filename?: string, refType?: ReferenceType): TreeNode[] {
if (refType === undefined || refType === null) {
if (filename === undefined || filename === null) {
return this.nodes;
}
return this.nodes.filter(i => i.filename === filename);
}
if (filename === undefined || filename === null) {
return this.nodes.filter(i => i.referenceType === refType);
}
return this.nodes.filter(i => i.filename === filename && i.referenceType === refType);
}
getAllReferenceNodes(): TreeNode[] {
return this.nodes.filter(i => i.node === NodeType.reference);
}
getAllFilesWithPendingReferenceNodes(): TreeNode[] {
const result: TreeNode[] = this.nodes.filter(i => i.node === NodeType.fileWithPendingRef);
result.sort((a, b) => {
if (a.filename === undefined) {
if (b.filename === undefined) {
return 0;
} else {
return -1;
}
} else if (b.filename === undefined) {
return 1;
} else {
return a.filename.localeCompare(b.filename);
}
});
return result;
}
}
export enum NodeType {
undefined, // Use undefined for creating a flat raw list of reference results.
referenceType, // A node to group reference types.
file, // File node that has reference nodes.
fileWithPendingRef, // File node with pending references to find (e.g. it has no reference children yet).
reference // A reference node, which is either a string, comment, inactive reference, etc.
}
export class TreeNode {
// Optional properties for file related info
public filename?: string;
public fileUri?: vscode.Uri;
// Optional properties for reference item info
public referencePosition?: vscode.Position;
public referenceLocation?: vscode.Location;
public referenceText?: string;
public referenceType?: ReferenceType;
constructor(readonly model: ReferencesModel, readonly node: NodeType) {
}
}