11module PuppetLanguageServer
22 module HoverProvider
33 def self . resolve ( content , line_num , char_num )
4- item = PuppetLanguageServer ::PuppetParserHelper . object_under_cursor ( content , line_num , char_num , false )
5- return LanguageServer ::Hover . create_nil_response if item . nil?
4+ result = PuppetLanguageServer ::PuppetParserHelper . object_under_cursor ( content , line_num , char_num , false , [ Puppet ::Pops ::Model ::QualifiedName ] )
5+ return LanguageServer ::Hover . create_nil_response if result . nil?
6+
7+ path = result [ :path ]
8+ item = result [ :model ]
69
710 content = nil
811 case item . class . to_s
912 when 'Puppet::Pops::Model::ResourceExpression'
1013 content = get_resource_expression_content ( item )
1114 when 'Puppet::Pops::Model::LiteralString'
12- if item . eContainer . class == Puppet ::Pops ::Model ::AccessExpression
13- expr = item . eContainer . left_expr . expr . value
15+ if path [ - 1 ] . class == Puppet ::Pops ::Model ::AccessExpression
16+ expr = path [ - 1 ] . left_expr . expr . value
1417
15- content = get_hover_content_for_access_expression ( item , expr )
16- elsif item . eContainer . class == Puppet ::Pops ::Model ::ResourceBody
18+ content = get_hover_content_for_access_expression ( path , expr )
19+ elsif path [ - 1 ] . class == Puppet ::Pops ::Model ::ResourceBody
1720 # We are hovering over the resource name
18- content = get_resource_expression_content ( item . eContainer . eContainer )
21+ content = get_resource_expression_content ( path [ - 2 ] )
1922 end
2023 when 'Puppet::Pops::Model::VariableExpression'
2124 expr = item . expr . value
2225
23- content = get_hover_content_for_access_expression ( item , expr )
24- when 'Puppet::Pops::Model::QualifiedName'
25- if !item . eContainer . nil? && item . eContainer . class . to_s == 'Puppet::Pops::Model::ResourceExpression'
26- content = get_resource_expression_content ( item . eContainer )
27- elsif !item . eContainer . nil? && item . eContainer . class . to_s == 'Puppet::Pops::Model::CallNamedFunctionExpression'
28- content = get_call_named_function_expression_content ( item . eContainer )
29- end
30-
26+ content = get_hover_content_for_access_expression ( path , expr )
27+ when 'Puppet::Pops::Model::CallNamedFunctionExpression'
28+ content = get_call_named_function_expression_content ( item )
3129 when 'Puppet::Pops::Model::AttributeOperation'
3230 # Get the parent resource class
33- parent_klass = item . eContainer
31+ distance_up_ast = -1
32+ parent_klass = path [ distance_up_ast ]
3433 while !parent_klass . nil? && parent_klass . class . to_s != 'Puppet::Pops::Model::ResourceBody'
35- parent_klass = parent_klass . eContainer
34+ distance_up_ast -= 1
35+ parent_klass = path [ distance_up_ast ]
3636 end
3737 raise "Unable to find suitable parent object for object of type #{ item . class } " if parent_klass . nil?
3838
3939 # Get an instance of the type
40- item_type = PuppetLanguageServer ::PuppetHelper . get_type ( parent_klass . eContainer . type_name . value )
41- raise "#{ parent_klass . eContainer . type_name . value } is not a valid puppet type" if item_type . nil?
40+ item_type = PuppetLanguageServer ::PuppetHelper . get_type ( path [ distance_up_ast - 1 ] . type_name . value )
41+ raise "#{ path [ distance_up_ast - 1 ] . type_name . value } is not a valid puppet type" if item_type . nil?
4242 # Check if it's a property
4343 attribute = item_type . validproperty? ( item . attribute_name )
4444 if attribute != false
@@ -58,12 +58,20 @@ def self.resolve(content, line_num, char_num)
5858 end
5959 end
6060
61- def self . get_hover_content_for_access_expression ( item , expr )
61+ def self . get_hover_content_for_access_expression ( path , expr )
6262 if expr == 'facts'
6363 # We are dealing with the facts variable
6464 # Just get the first part of the array and display that
65- if item . eContainer . eContents . length > 1
66- factname = item . eContainer . eContents [ 1 ] . value
65+ fact_array = path [ -1 ]
66+ if fact_array . respond_to? :eContents
67+ fact_array_content = fact_array . eContents
68+ else
69+ fact_array_content = [ ]
70+ fact_array . _pcore_contents { |item | fact_array_content . push item }
71+ end
72+
73+ if fact_array_content . length > 1
74+ factname = fact_array_content [ 1 ] . value
6775 content = get_fact_content ( factname )
6876 end
6977 elsif expr . start_with? ( '::' ) && expr . rindex ( ':' ) == 1
0 commit comments