brighterscript 0.53.1 → 0.54.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,146 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.HoverProcessor = void 0;
4
+ const source_map_1 = require("source-map");
5
+ const reflection_1 = require("../../astUtils/reflection");
6
+ const TokenKind_1 = require("../../lexer/TokenKind");
7
+ const BrsTranspileState_1 = require("../../parser/BrsTranspileState");
8
+ const Parser_1 = require("../../parser/Parser");
9
+ const util_1 = require("../../util");
10
+ class HoverProcessor {
11
+ constructor(event) {
12
+ this.event = event;
13
+ }
14
+ process() {
15
+ let hover;
16
+ if ((0, reflection_1.isBrsFile)(this.event.file)) {
17
+ hover = this.getBrsFileHover(this.event.file);
18
+ }
19
+ else if ((0, reflection_1.isXmlFile)(this.event.file)) {
20
+ hover = this.getXmlFileHover(this.event.file);
21
+ }
22
+ //if we got a result, "return" it
23
+ if (hover) {
24
+ //assign the hover to the event
25
+ this.event.hovers.push(hover);
26
+ }
27
+ }
28
+ buildContentsWithDocs(text, startingToken) {
29
+ const parts = [text];
30
+ const docs = this.getTokenDocumentation(this.event.file.parser.tokens, startingToken);
31
+ if (docs) {
32
+ parts.push('***', docs);
33
+ }
34
+ return parts.join('\n');
35
+ }
36
+ getBrsFileHover(file) {
37
+ var _a, _b, _c, _d;
38
+ const scope = this.event.scopes[0];
39
+ const fence = (code) => util_1.default.mdFence(code, 'brightscript');
40
+ //get the token at the position
41
+ let token = file.getTokenAt(this.event.position);
42
+ let hoverTokenTypes = [
43
+ TokenKind_1.TokenKind.Identifier,
44
+ TokenKind_1.TokenKind.Function,
45
+ TokenKind_1.TokenKind.EndFunction,
46
+ TokenKind_1.TokenKind.Sub,
47
+ TokenKind_1.TokenKind.EndSub
48
+ ];
49
+ //throw out invalid tokens and the wrong kind of tokens
50
+ if (!token || !hoverTokenTypes.includes(token.kind)) {
51
+ return null;
52
+ }
53
+ const expression = file.getClosestExpression(this.event.position);
54
+ if (expression) {
55
+ let containingNamespace = (_a = file.getNamespaceStatementForPosition(expression.range.start)) === null || _a === void 0 ? void 0 : _a.getName(Parser_1.ParseMode.BrighterScript);
56
+ const fullName = (_b = util_1.default.getAllDottedGetParts(expression)) === null || _b === void 0 ? void 0 : _b.map(x => x.text).join('.');
57
+ //find a constant with this name
58
+ const constant = scope.getConstFileLink(fullName, containingNamespace);
59
+ if (constant) {
60
+ const constantValue = new source_map_1.SourceNode(null, null, null, constant.item.value.transpile(new BrsTranspileState_1.BrsTranspileState(file))).toString();
61
+ return {
62
+ contents: this.buildContentsWithDocs(fence(`const ${constant.item.fullName} = ${constantValue}`), constant.item.tokens.const),
63
+ range: token.range
64
+ };
65
+ }
66
+ }
67
+ let lowerTokenText = token.text.toLowerCase();
68
+ //look through local variables first
69
+ {
70
+ //get the function scope for this position (if exists)
71
+ let functionScope = file.getFunctionScopeAtPosition(this.event.position);
72
+ if (functionScope) {
73
+ //find any variable with this name
74
+ for (const varDeclaration of functionScope.variableDeclarations) {
75
+ //we found a variable declaration with this token text!
76
+ if (varDeclaration.name.toLowerCase() === lowerTokenText) {
77
+ let typeText;
78
+ if ((0, reflection_1.isFunctionType)(varDeclaration.type)) {
79
+ typeText = varDeclaration.type.toString();
80
+ }
81
+ else {
82
+ typeText = `${varDeclaration.name} as ${varDeclaration.type.toString()}`;
83
+ }
84
+ return {
85
+ range: token.range,
86
+ //append the variable name to the front for scope
87
+ contents: fence(typeText)
88
+ };
89
+ }
90
+ }
91
+ for (const labelStatement of functionScope.labelStatements) {
92
+ if (labelStatement.name.toLocaleLowerCase() === lowerTokenText) {
93
+ return {
94
+ range: token.range,
95
+ contents: fence(`${labelStatement.name}: label`)
96
+ };
97
+ }
98
+ }
99
+ }
100
+ }
101
+ //look through all callables in relevant scopes
102
+ for (let scope of this.event.scopes) {
103
+ let callable = scope.getCallableByName(lowerTokenText);
104
+ if (callable) {
105
+ return {
106
+ range: token.range,
107
+ contents: this.buildContentsWithDocs(fence(callable.type.toString()), (_d = (_c = callable.functionStatement) === null || _c === void 0 ? void 0 : _c.func) === null || _d === void 0 ? void 0 : _d.functionType)
108
+ };
109
+ }
110
+ }
111
+ }
112
+ /**
113
+ * Combine all the documentation found before a token (i.e. comment tokens)
114
+ */
115
+ getTokenDocumentation(tokens, token) {
116
+ const comments = [];
117
+ const idx = tokens === null || tokens === void 0 ? void 0 : tokens.indexOf(token);
118
+ if (!idx || idx === -1) {
119
+ return undefined;
120
+ }
121
+ for (let i = idx - 1; i >= 0; i--) {
122
+ const token = tokens[i];
123
+ //skip whitespace and newline chars
124
+ if (token.kind === TokenKind_1.TokenKind.Comment) {
125
+ comments.push(token);
126
+ }
127
+ else if (token.kind === TokenKind_1.TokenKind.Newline || token.kind === TokenKind_1.TokenKind.Whitespace) {
128
+ //skip these tokens
129
+ continue;
130
+ //any other token means there are no more comments
131
+ }
132
+ else {
133
+ break;
134
+ }
135
+ }
136
+ if (comments.length > 0) {
137
+ return comments.reverse().map(x => x.text.replace(/^('|rem)/i, '')).join('\n');
138
+ }
139
+ }
140
+ getXmlFileHover(file) {
141
+ //TODO add xml hovers
142
+ return undefined;
143
+ }
144
+ }
145
+ exports.HoverProcessor = HoverProcessor;
146
+ //# sourceMappingURL=HoverProcessor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"HoverProcessor.js","sourceRoot":"","sources":["../../../src/bscPlugin/hover/HoverProcessor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,167 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const chai_1 = require("chai");
4
+ const Program_1 = require("../../Program");
5
+ const util_1 = require("../../util");
6
+ const sinon_1 = require("sinon");
7
+ let sinon = (0, sinon_1.createSandbox)();
8
+ let rootDir = (0, util_1.standardizePath) `${process.cwd()}/.tmp/rootDir`;
9
+ const fence = (code) => util_1.default.mdFence(code, 'brightscript');
10
+ describe('HoverProcessor', () => {
11
+ let program;
12
+ beforeEach(() => {
13
+ program = new Program_1.Program({ rootDir: rootDir, sourceMap: true });
14
+ });
15
+ afterEach(() => {
16
+ sinon.restore();
17
+ program.dispose();
18
+ });
19
+ it('does not short-circuit the event since our plugin is the base plugin', () => {
20
+ const mock = sinon.mock();
21
+ program.plugins.add({
22
+ name: 'test-plugin',
23
+ provideHover: mock
24
+ });
25
+ const file = program.setFile('source/main.brs', `
26
+ sub main()
27
+ end sub
28
+ `);
29
+ //get the hover
30
+ program.getHover(file.pathAbsolute, util_1.default.createPosition(1, 20));
31
+ //the onGetHover function from `test-plugin` should always get called because
32
+ //BscPlugin should never short-circuit the event
33
+ (0, chai_1.expect)(mock.called).to.be.true;
34
+ });
35
+ describe('BrsFile', () => {
36
+ it('works for param types', () => {
37
+ const file = program.setFile('source/main.brs', `
38
+ sub DoSomething(name as string)
39
+ name = 1
40
+ sayMyName = function(name as string)
41
+ end function
42
+ end sub
43
+ `);
44
+ //hover over the `name = 1` line
45
+ let hover = program.getHover(file.pathAbsolute, util_1.default.createPosition(2, 24))[0];
46
+ (0, chai_1.expect)(hover).to.exist;
47
+ (0, chai_1.expect)(hover.range).to.eql(util_1.default.createRange(2, 20, 2, 24));
48
+ //hover over the `name` parameter declaration
49
+ hover = program.getHover(file.pathAbsolute, util_1.default.createPosition(1, 34))[0];
50
+ (0, chai_1.expect)(hover).to.exist;
51
+ (0, chai_1.expect)(hover.range).to.eql(util_1.default.createRange(1, 32, 1, 36));
52
+ });
53
+ //ignore this for now...it's not a huge deal
54
+ it('does not match on keywords or data types', () => {
55
+ let file = program.setFile({ src: `${rootDir}/source/main.brs`, dest: 'source/main.brs' }, `
56
+ sub Main(name as string)
57
+ end sub
58
+ sub as()
59
+ end sub
60
+ `);
61
+ //hover over the `as`
62
+ (0, chai_1.expect)(program.getHover(file.pathAbsolute, util_1.default.createPosition(1, 31))).to.be.empty;
63
+ //hover over the `string`
64
+ (0, chai_1.expect)(program.getHover(file.pathAbsolute, util_1.default.createPosition(1, 36))).to.be.empty;
65
+ });
66
+ it('finds declared function', () => {
67
+ let file = program.setFile({ src: `${rootDir}/source/main.brs`, dest: 'source/main.brs' }, `
68
+ function Main(count = 1)
69
+ firstName = "bob"
70
+ age = 21
71
+ shoeSize = 10
72
+ end function
73
+ `);
74
+ let hover = program.getHover(file.pathAbsolute, util_1.default.createPosition(1, 28))[0];
75
+ (0, chai_1.expect)(hover).to.exist;
76
+ (0, chai_1.expect)(hover.range).to.eql(util_1.default.createRange(1, 25, 1, 29));
77
+ (0, chai_1.expect)(hover.contents).to.eql(fence('function Main(count? as dynamic) as dynamic'));
78
+ });
79
+ it('finds variable function hover in same scope', () => {
80
+ let file = program.setFile({ src: `${rootDir}/source/main.brs`, dest: 'source/main.brs' }, `
81
+ sub Main()
82
+ sayMyName = sub(name as string)
83
+ end sub
84
+
85
+ sayMyName()
86
+ end sub
87
+ `);
88
+ let hover = program.getHover(file.pathAbsolute, util_1.default.createPosition(5, 24))[0];
89
+ (0, chai_1.expect)(hover.range).to.eql(util_1.default.createRange(5, 20, 5, 29));
90
+ (0, chai_1.expect)(hover.contents).to.eql(fence('sub sayMyName(name as string) as void'));
91
+ });
92
+ it('finds function hover in file scope', () => {
93
+ let file = program.setFile({ src: `${rootDir}/source/main.brs`, dest: 'source/main.brs' }, `
94
+ sub Main()
95
+ sayMyName()
96
+ end sub
97
+
98
+ sub sayMyName()
99
+
100
+ end sub
101
+ `);
102
+ let hover = program.getHover(file.pathAbsolute, util_1.default.createPosition(2, 25))[0];
103
+ (0, chai_1.expect)(hover.range).to.eql(util_1.default.createRange(2, 20, 2, 29));
104
+ (0, chai_1.expect)(hover.contents).to.eql(fence('sub sayMyName() as void'));
105
+ });
106
+ it('finds function hover in scope', () => {
107
+ let rootDir = process.cwd();
108
+ program = new Program_1.Program({
109
+ rootDir: rootDir
110
+ });
111
+ let mainFile = program.setFile({ src: `${rootDir}/source/main.brs`, dest: 'source/main.brs' }, `
112
+ sub Main()
113
+ sayMyName()
114
+ end sub
115
+ `);
116
+ program.setFile({ src: `${rootDir}/source/lib.brs`, dest: 'source/lib.brs' }, `
117
+ sub sayMyName(name as string)
118
+
119
+ end sub
120
+ `);
121
+ let hover = program.getHover(mainFile.pathAbsolute, util_1.default.createPosition(2, 25))[0];
122
+ (0, chai_1.expect)(hover === null || hover === void 0 ? void 0 : hover.range).to.eql(util_1.default.createRange(2, 20, 2, 29));
123
+ (0, chai_1.expect)(hover === null || hover === void 0 ? void 0 : hover.contents).to.eql(fence('sub sayMyName(name as string) as void'));
124
+ });
125
+ it('finds top-level constant value', () => {
126
+ program.setFile('source/main.bs', `
127
+ sub main()
128
+ print SOME_VALUE
129
+ end sub
130
+ const SOME_VALUE = true
131
+ `);
132
+ // print SOM|E_VALUE
133
+ let hover = program.getHover('source/main.bs', util_1.default.createPosition(2, 29))[0];
134
+ (0, chai_1.expect)(hover === null || hover === void 0 ? void 0 : hover.range).to.eql(util_1.default.createRange(2, 26, 2, 36));
135
+ (0, chai_1.expect)(hover === null || hover === void 0 ? void 0 : hover.contents).to.eql(fence('const SOME_VALUE = true'));
136
+ });
137
+ it('finds namespaced constant value', () => {
138
+ program.setFile('source/main.bs', `
139
+ sub main()
140
+ print name.SOME_VALUE
141
+ end sub
142
+ namespace name
143
+ const SOME_VALUE = true
144
+ end namespace
145
+ `);
146
+ // print name.SOM|E_VALUE
147
+ let hover = program.getHover('source/main.bs', util_1.default.createPosition(2, 34))[0];
148
+ (0, chai_1.expect)(hover === null || hover === void 0 ? void 0 : hover.range).to.eql(util_1.default.createRange(2, 31, 2, 41));
149
+ (0, chai_1.expect)(hover === null || hover === void 0 ? void 0 : hover.contents).to.eql(fence('const name.SOME_VALUE = true'));
150
+ });
151
+ it('finds deep namespaced constant value', () => {
152
+ program.setFile('source/main.bs', `
153
+ sub main()
154
+ print name.sp.a.c.e.SOME_VALUE
155
+ end sub
156
+ namespace name.sp.a.c.e
157
+ const SOME_VALUE = true
158
+ end namespace
159
+ `);
160
+ // print name.sp.a.c.e.SOM|E_VALUE
161
+ let hover = program.getHover('source/main.bs', util_1.default.createPosition(2, 43))[0];
162
+ (0, chai_1.expect)(hover === null || hover === void 0 ? void 0 : hover.range).to.eql(util_1.default.createRange(2, 40, 2, 50));
163
+ (0, chai_1.expect)(hover === null || hover === void 0 ? void 0 : hover.contents).to.eql(fence('const name.sp.a.c.e.SOME_VALUE = true'));
164
+ });
165
+ });
166
+ });
167
+ //# sourceMappingURL=HoverProcessor.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"HoverProcessor.spec.js","sourceRoot":"","sources":["../../../src/bscPlugin/hover/HoverProcessor.spec.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  import type { CodeWithSourceMap } from 'source-map';
2
- import type { CompletionItem, Hover, Position, Location, Diagnostic } from 'vscode-languageserver';
2
+ import type { CompletionItem, Position, Location, Diagnostic } from 'vscode-languageserver';
3
3
  import { SignatureInformation, DocumentSymbol, SymbolInformation } from 'vscode-languageserver';
4
4
  import type { Scope } from '../Scope';
5
5
  import { FunctionScope } from '../FunctionScope';
@@ -80,6 +80,10 @@ export declare class BrsFile {
80
80
  * @param position
81
81
  */
82
82
  getTokenAt(position: Position): Token;
83
+ /**
84
+ * Walk the AST and find the expression that this token is most specifically contained within
85
+ */
86
+ getClosestExpression(position: Position): Expression | Statement;
83
87
  get parser(): Parser;
84
88
  private _parser;
85
89
  fileContents: string;
@@ -217,11 +221,6 @@ export declare class BrsFile {
217
221
  */
218
222
  getDefinition(position: Position): Location[];
219
223
  getClassMemberDefinitions(textToSearchFor: string, file: BrsFile): Location[];
220
- getHover(position: Position): Hover;
221
- /**
222
- * Build a hover documentation for a callable.
223
- */
224
- private getCallableDocumentation;
225
224
  getSignatureHelpForNamespaceMethods(callableName: string, dottedGetText: string, scope: Scope): {
226
225
  key: string;
227
226
  signature: SignatureInformation;