Skip to content

Commit 7faeed3

Browse files
committed
show outline symbols
1 parent 2f97116 commit 7faeed3

File tree

2 files changed

+109
-32
lines changed

2 files changed

+109
-32
lines changed

extension.ts

Lines changed: 40 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -1,43 +1,45 @@
1-
import vscode = require("vscode");
1+
import vscode = require('vscode');
22
const { workspace, window } = vscode;
3-
import http = require("http");
3+
import http = require('http');
44

5-
const API = require("cos-api4node");
6-
const LOG = require("./log");
7-
const panel = require("./status-bar-panel");
8-
const CmdExport = require("./commands/export");
9-
const { CurrentDoc } = require("./commands/currentdoc");
10-
const IsApiError = require("./is-api-error");
5+
const API = require('cos-api4node');
6+
const LOG = require('./log');
7+
const panel = require('./status-bar-panel');
8+
const CmdExport = require('./commands/export');
9+
const { CurrentDoc } = require('./commands/currentdoc');
10+
const IsApiError = require('./is-api-error');
1111

12-
import { COSExplorerProvider } from "./explorer/explorer";
12+
import { ObjectScriptSymbolProvider } from './providers/ObjectScriptSymbolProvider';
13+
14+
import { COSExplorerProvider } from './explorer/explorer';
1315
export var cosExplorerProvider: COSExplorerProvider;
1416

1517
export async function activate(context: vscode.ExtensionContext): Promise<void> {
16-
const languages = require(context.asAbsolutePath("./package.json"))["contributes"]["languages"].map(lang => lang.id);
18+
const languages = require(context.asAbsolutePath('./package.json'))['contributes']['languages'].map(lang => lang.id);
1719

1820
const log = LOG(window);
1921

2022
cosExplorerProvider = new COSExplorerProvider();
21-
vscode.window.registerTreeDataProvider("cosExplorer", cosExplorerProvider);
23+
vscode.window.registerTreeDataProvider('cosExplorer', cosExplorerProvider);
2224

2325
const Config = workspace => {
2426
let options = null;
2527
const init = () => {
26-
options = workspace.getConfiguration("cos");
28+
options = workspace.getConfiguration('cos');
2729
};
2830
init();
2931

3032
return {
3133
init,
3234
get: option => options.get(option),
3335
conn: () => {
34-
const _conn = options.get("conn");
35-
_conn.toString = () => JSON.stringify(Object.assign({}, _conn, { password: "***" }), null, 4);
36+
const _conn = options.get('conn');
37+
_conn.toString = () => JSON.stringify(Object.assign({}, _conn, { password: '***' }), null, 4);
3638
return _conn;
3739
},
3840
export: () => {
3941
const root = workspace.rootPath;
40-
return Object.assign({}, options.get("export"), { root });
42+
return Object.assign({}, options.get('export'), { root });
4143
}
4244
};
4345
};
@@ -47,8 +49,8 @@ export async function activate(context: vscode.ExtensionContext): Promise<void>
4749
api = API(conn);
4850
api.headServer(err => {
4951
const conn = config.conn();
50-
if (err) return log("Connection FAILED: " + conn, err);
51-
log("Connected " + conn);
52+
if (err) return log('Connection FAILED: ' + conn, err);
53+
log('Connected ' + conn);
5254
panel.set(conn);
5355
});
5456
cosExplorerProvider.setAPI(api, conn.ns);
@@ -77,7 +79,7 @@ export async function activate(context: vscode.ExtensionContext): Promise<void>
7779
); //reload config on event
7880

7981
workspace.onDidSaveTextDocument(file => {
80-
if (!config.get("autoCompile")) {
82+
if (!config.get('autoCompile')) {
8183
return;
8284
}
8385
if (languages.includes(file.languageId)) {
@@ -89,18 +91,18 @@ export async function activate(context: vscode.ExtensionContext): Promise<void>
8991

9092
const Save = ({ name, log, fileName }) => (err, data) => {
9193
// IsApiError, ExportDoc - global
92-
const isGetDocError = IsApiError(name, "getDoc", log, window);
94+
const isGetDocError = IsApiError(name, 'getDoc', log, window);
9395
if (isGetDocError({ err, data })) return;
9496

95-
const completed = () => log("Completed.");
97+
const completed = () => log('Completed.');
9698
const exportDoc = ExportDoc({ name, cat: data.result.cat, fileName }, completed);
9799

98100
exportDoc({ err, data });
99101
};
100102

101103
const Export = ({ api, name, log, fileName }) => (err, data) => {
102104
// IsApiError, Save - from upper scope
103-
const isCompileError = IsApiError(name, "compile", log, window);
105+
const isCompileError = IsApiError(name, 'compile', log, window);
104106
if (isCompileError({ err, data })) return;
105107
// after compilation API returns updated storage definition
106108
// but, currently, we don`t have any AST implementation
@@ -113,7 +115,7 @@ export async function activate(context: vscode.ExtensionContext): Promise<void>
113115

114116
const Compile = ({ api, name, log, fileName }) => (err, data) => {
115117
// IsApiError, Export
116-
const isImportError = IsApiError(name, "import", log, window);
118+
const isImportError = IsApiError(name, 'import', log, window);
117119
if (isImportError({ err, data })) return;
118120

119121
const exportCurrent = Export({ api, name, log, fileName });
@@ -135,21 +137,27 @@ export async function activate(context: vscode.ExtensionContext): Promise<void>
135137
};
136138

137139
context.subscriptions.push(
138-
vscode.commands.registerCommand("cos.compile", importCompileExport),
139-
vscode.commands.registerCommand("cos.export", exportAll),
140-
vscode.commands.registerCommand("vscode-cos.explorer.refresh", () => cosExplorerProvider.refresh()),
141-
vscode.commands.registerCommand("vscode-cos.explorer.openClass", vscode.window.showTextDocument),
142-
vscode.commands.registerCommand("vscode-cos.explorer.openRoutine", vscode.window.showTextDocument),
143-
vscode.commands.registerCommand("vscode-cos.explorer.showSystem", () => {
144-
vscode.commands.executeCommand("setContext", "vscode-cos.explorer.showSystem", true);
140+
vscode.commands.registerCommand('cos.compile', importCompileExport),
141+
vscode.commands.registerCommand('cos.export', exportAll),
142+
vscode.commands.registerCommand('vscode-cos.explorer.refresh', () => cosExplorerProvider.refresh()),
143+
vscode.commands.registerCommand('vscode-cos.explorer.openClass', vscode.window.showTextDocument),
144+
vscode.commands.registerCommand('vscode-cos.explorer.openRoutine', vscode.window.showTextDocument),
145+
vscode.commands.registerCommand('vscode-cos.explorer.showSystem', () => {
146+
vscode.commands.executeCommand('setContext', 'vscode-cos.explorer.showSystem', true);
145147
cosExplorerProvider.showSystem = true;
146148
}),
147-
vscode.commands.registerCommand("vscode-cos.explorer.hideSystem", () => {
148-
vscode.commands.executeCommand("setContext", "vscode-cos.explorer.showSystem", false);
149+
vscode.commands.registerCommand('vscode-cos.explorer.hideSystem', () => {
150+
vscode.commands.executeCommand('setContext', 'vscode-cos.explorer.showSystem', false);
149151
cosExplorerProvider.showSystem = false;
150152
}),
151153

152-
vscode.workspace.registerTextDocumentContentProvider("cos", cosExplorerProvider)
154+
vscode.workspace.registerTextDocumentContentProvider('cos', cosExplorerProvider),
155+
vscode.languages.registerDocumentSymbolProvider(
156+
{
157+
language: 'cacheobjectscript'
158+
},
159+
new ObjectScriptSymbolProvider()
160+
)
153161
);
154162
}
155163

Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
import * as vscode from 'vscode';
2+
3+
export class ObjectScriptSymbolProvider implements vscode.DocumentSymbolProvider {
4+
public provideDocumentSymbols(
5+
document: vscode.TextDocument,
6+
token: vscode.CancellationToken
7+
): Thenable<vscode.SymbolInformation[]> {
8+
return new Promise(resolve => {
9+
var symbols: any[] = [];
10+
11+
// This line is here purely to satisfy linter
12+
token = token;
13+
14+
const isClass = document.fileName.toLowerCase().endsWith('cls');
15+
for (var i = 0; i < document.lineCount; i++) {
16+
var line = document.lineAt(i);
17+
18+
if (isClass) {
19+
let method = line.text.match(/^(?:Class|Client)?Method ([^(]+)/i);
20+
if (method) {
21+
symbols.push({
22+
name: method[1],
23+
kind: vscode.SymbolKind.Method,
24+
location: new vscode.Location(document.uri, line.range)
25+
});
26+
}
27+
28+
let property = line.text.match(/^(?:Property|Relationship) (\b\w+\b)/i);
29+
if (property) {
30+
symbols.push({
31+
name: property[1],
32+
kind: vscode.SymbolKind.Property,
33+
location: new vscode.Location(document.uri, line.range)
34+
});
35+
}
36+
37+
let parameter = line.text.match(/^Parameter (\b\w+\b)/i);
38+
if (parameter) {
39+
symbols.push({
40+
name: parameter[1],
41+
kind: vscode.SymbolKind.TypeParameter,
42+
location: new vscode.Location(document.uri, line.range)
43+
});
44+
}
45+
46+
let xdata = line.text.match(/^XData (\b\w+\b)/i);
47+
if (xdata) {
48+
symbols.push({
49+
name: xdata[1],
50+
kind: vscode.SymbolKind.Struct,
51+
location: new vscode.Location(document.uri, line.range)
52+
});
53+
}
54+
} else {
55+
let label = line.text.match(/^(\b\w+\b)/);
56+
if (label) {
57+
symbols.push({
58+
name: label[1],
59+
kind: vscode.SymbolKind.Method,
60+
location: new vscode.Location(document.uri, line.range)
61+
});
62+
}
63+
}
64+
}
65+
66+
resolve(symbols);
67+
});
68+
}
69+
}

0 commit comments

Comments
 (0)