From 61fcfbba1df27c62b4afb4c56cc81e48d4502b70 Mon Sep 17 00:00:00 2001 From: James Pogran Date: Wed, 24 Oct 2018 16:58:53 -0400 Subject: [PATCH] (GH-66) Fix go to definition This commit fixes building file paths on platforms that use leading slashes. Before the `file://` uri had too many slashes with a path that starts with a backslash. This fix checks the string to see if it starts with a slash and adds the appropriate amount of slashes. --- lib/puppet-languageserver.rb | 1 + .../manifest/definition_provider.rb | 4 ++-- lib/puppet-languageserver/uri_helper.rb | 7 +++++++ .../unit/puppet-languageserver/uri_helper_spec.rb | 14 ++++++++++++++ 4 files changed, 24 insertions(+), 2 deletions(-) create mode 100644 lib/puppet-languageserver/uri_helper.rb create mode 100644 spec/languageserver/unit/puppet-languageserver/uri_helper_spec.rb diff --git a/lib/puppet-languageserver.rb b/lib/puppet-languageserver.rb index d9e05836..feefaf9b 100644 --- a/lib/puppet-languageserver.rb +++ b/lib/puppet-languageserver.rb @@ -18,6 +18,7 @@ puppet_parser_helper puppet_helper facter_helper + uri_helper puppet_monkey_patches providers ].each do |lib| diff --git a/lib/puppet-languageserver/manifest/definition_provider.rb b/lib/puppet-languageserver/manifest/definition_provider.rb index 54da862d..986a1387 100644 --- a/lib/puppet-languageserver/manifest/definition_provider.rb +++ b/lib/puppet-languageserver/manifest/definition_provider.rb @@ -70,7 +70,7 @@ def self.type_or_class(resource_name) item = PuppetLanguageServer::PuppetHelper.get_class(resource_name) if item.nil? unless item.nil? return LanguageServer::Location.create( - 'uri' => 'file:///' + item.source, + 'uri' => PuppetLanguageServer::UriHelper.build_file_uri(item.source), 'fromline' => item.line, 'fromchar' => 0, 'toline' => item.line, @@ -85,7 +85,7 @@ def self.function_name(func_name) item = PuppetLanguageServer::PuppetHelper.function(func_name) return nil if item.nil? || item.source.nil? || item.line.nil? LanguageServer::Location.create( - 'uri' => 'file:///' + item.source, + 'uri' => PuppetLanguageServer::UriHelper.build_file_uri(item.source), 'fromline' => item.line, 'fromchar' => 0, 'toline' => item.line, diff --git a/lib/puppet-languageserver/uri_helper.rb b/lib/puppet-languageserver/uri_helper.rb new file mode 100644 index 00000000..58e804df --- /dev/null +++ b/lib/puppet-languageserver/uri_helper.rb @@ -0,0 +1,7 @@ +module PuppetLanguageServer + module UriHelper + def self.build_file_uri(path) + path.start_with?('/') ? 'file://' + path : 'file:///' + path + end + end +end diff --git a/spec/languageserver/unit/puppet-languageserver/uri_helper_spec.rb b/spec/languageserver/unit/puppet-languageserver/uri_helper_spec.rb new file mode 100644 index 00000000..47cb80a8 --- /dev/null +++ b/spec/languageserver/unit/puppet-languageserver/uri_helper_spec.rb @@ -0,0 +1,14 @@ +require 'spec_helper' + +describe 'uri_helper' do + describe '#build_file_uri' do + it 'should return /// without leading slash' do + test = PuppetLanguageServer::UriHelper.build_file_uri('C:\foo.pp') + expect(test).to eq('file:///C:\foo.pp') + end + it 'should return // with a leading slash' do + test = PuppetLanguageServer::UriHelper.build_file_uri('/opt/foo/foo.pp') + expect(test).to eq('file:///opt/foo/foo.pp') + end + end +end