From 44a86e63dd4a479be0441f139827740a5a3c9483 Mon Sep 17 00:00:00 2001 From: Arturo Cuya Date: Sat, 28 May 2022 22:56:59 -0500 Subject: [PATCH] fix(hover): add hover to namespace functions --- src/Scope.ts | 4 ++- src/files/BrsFile.spec.ts | 75 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 78 insertions(+), 1 deletion(-) diff --git a/src/Scope.ts b/src/Scope.ts index b40509ae3..fd4396024 100644 --- a/src/Scope.ts +++ b/src/Scope.ts @@ -399,7 +399,9 @@ export class Scope { let lowerName = name.toLowerCase(); let callables = this.getAllCallables(); for (let callable of callables) { - if (callable.callable.getName(ParseMode.BrighterScript).toLowerCase() === lowerName) { + const callableName = callable.callable.getName(ParseMode.BrighterScript); + // Split by `.` and check the last term to consider namespaces. + if (callableName.toLowerCase() === lowerName || callableName.split('.').pop()?.toLowerCase() === lowerName) { return callable.callable; } } diff --git a/src/files/BrsFile.spec.ts b/src/files/BrsFile.spec.ts index e8f5903cb..95da9ef55 100644 --- a/src/files/BrsFile.spec.ts +++ b/src/files/BrsFile.spec.ts @@ -1715,6 +1715,28 @@ describe('BrsFile', () => { ].join('\n')); }); + it('finds declared namespace function', () => { + let file = program.setFile({ src: `${rootDir}/source/main.brs`, dest: 'source/main.brs' }, ` + namespace mySpace + function Main(count = 1) + firstName = "bob" + age = 21 + shoeSize = 10 + end function + end namespace + `); + + let hover = file.getHover(Position.create(2, 28)); + expect(hover).to.exist; + + expect(hover.range).to.eql(Range.create(2, 25, 2, 29)); + expect(hover.contents).to.equal([ + '```brightscript', + 'function Main(count? as dynamic) as dynamic', + '```' + ].join('\n')); + }); + it('finds variable function hover in same scope', () => { let file = program.setFile({ src: `${rootDir}/source/main.brs`, dest: 'source/main.brs' }, ` sub Main() @@ -1789,6 +1811,29 @@ describe('BrsFile', () => { ].join('\n')); }); + it('finds namespace function hover in file scope', () => { + let file = program.setFile({ src: `${rootDir}/source/main.brs`, dest: 'source/main.brs' }, ` + namespace mySpace + sub Main() + sayMyName() + end sub + + sub sayMyName() + + end sub + end namespace + `); + + let hover = file.getHover(Position.create(3, 25)); + + expect(hover.range).to.eql(Range.create(3, 20, 3, 29)); + expect(hover.contents).to.equal([ + '```brightscript', + 'sub sayMyName() as void', + '```' + ].join('\n')); + }); + it('finds function hover in scope', () => { let rootDir = process.cwd(); program = new Program({ @@ -1818,6 +1863,36 @@ describe('BrsFile', () => { ].join('\n')); }); + it('finds namespace function hover in scope', () => { + let rootDir = process.cwd(); + program = new Program({ + rootDir: rootDir + }); + + let mainFile = program.setFile({ src: `${rootDir}/source/main.brs`, dest: 'source/main.brs' }, ` + sub Main() + mySpace.sayMyName() + end sub + `); + + program.setFile({ src: `${rootDir}/source/lib.brs`, dest: 'source/lib.brs' }, ` + namespace mySpace + sub sayMyName(name as string) + end sub + end namespace + `); + + let hover = mainFile.getHover(Position.create(2, 34)); + expect(hover).to.exist; + + expect(hover.range).to.eql(Range.create(2, 28, 2, 37)); + expect(hover.contents).to.equal([ + '```brightscript', + 'sub sayMyName(name as string) as void', + '```' + ].join('\n')); + }); + it('includes markdown comments in hover.', async () => { let rootDir = process.cwd(); program = new Program({