From 01af3cbc81c6240e1f925268123f0d21973d0307 Mon Sep 17 00:00:00 2001 From: Glenn Sarti Date: Sun, 22 Mar 2020 20:12:50 +0800 Subject: [PATCH] (GH-207) Allow Qualified Resource Names in hover provider Previously the hover provider ignored qualified names like '::foo::bar`. This commit updates the Hover Provider to allow QualifedNames but use what the name is of during processing. This commit also adds tests for this scenario. --- .../manifest/hover_provider.rb | 15 +++++++++++---- .../manifest/hover_provider_spec.rb | 13 +++++++++++++ 2 files changed, 24 insertions(+), 4 deletions(-) diff --git a/lib/puppet-languageserver/manifest/hover_provider.rb b/lib/puppet-languageserver/manifest/hover_provider.rb index a5693144..d547013d 100644 --- a/lib/puppet-languageserver/manifest/hover_provider.rb +++ b/lib/puppet-languageserver/manifest/hover_provider.rb @@ -8,13 +8,17 @@ def self.resolve(content, line_num, char_num, options = {}) :tasks_mode => false }.merge(options) result = PuppetLanguageServer::PuppetParserHelper.object_under_cursor(content, line_num, char_num, - :disallowed_classes => [Puppet::Pops::Model::QualifiedName, Puppet::Pops::Model::BlockExpression], + :disallowed_classes => [Puppet::Pops::Model::BlockExpression], :tasks_mode => options[:tasks_mode]) return LSP::Hover.new if result.nil? path = result[:path] item = result[:model] + # Munge the item + # We're not really interested in the Name of thing yet, we want the "thing" it's a name of + item = path.pop if item.instance_of?(Puppet::Pops::Model::QualifiedName) && !path.empty? + content = nil case item.class.to_s when 'Puppet::Pops::Model::ResourceExpression' @@ -157,12 +161,15 @@ def self.get_call_named_function_expression_content(item, tasks_mode) end def self.get_resource_expression_content(item) + name = item.type_name.value + # Strip top scope colons if found + name = name[2..-1] if name.start_with?('::') # Get an instance of the type - item_object = PuppetLanguageServer::PuppetHelper.get_type(item.type_name.value) + item_object = PuppetLanguageServer::PuppetHelper.get_type(name) return get_puppet_type_content(item_object) unless item_object.nil? - item_object = PuppetLanguageServer::PuppetHelper.get_class(item.type_name.value) + item_object = PuppetLanguageServer::PuppetHelper.get_class(name) return get_puppet_class_content(item_object) unless item_object.nil? - raise "#{item.type_name.value} is not a valid puppet type" + raise "#{name} is not a valid puppet type" end def self.get_puppet_type_content(item_type) diff --git a/spec/languageserver/integration/puppet-languageserver/manifest/hover_provider_spec.rb b/spec/languageserver/integration/puppet-languageserver/manifest/hover_provider_spec.rb index 41b54562..b44ea6ed 100644 --- a/spec/languageserver/integration/puppet-languageserver/manifest/hover_provider_spec.rb +++ b/spec/languageserver/integration/puppet-languageserver/manifest/hover_provider_spec.rb @@ -299,6 +299,8 @@ class Test::WithParams (String $version = 'Bob') { attr_name1 => 'string1', attr_name2 => 'string1', } + +::mock_workspace_class { 'Dah': } EOT } @@ -313,6 +315,17 @@ class Test::WithParams (String $version = 'Bob') { end end + describe 'when cursor is on the top-scoped resource type name' do + let(:line_num) { 5 } + let(:char_num) { 5 } + + it 'should return resource description' do + result = subject.resolve(content, line_num, char_num) + + expect(result.contents).to start_with("**mock_workspace_class** Resource\n") + end + end + describe 'when cursor is on the name of the resource' do let(:line_num) { 0 } let(:char_num) { 26 }