Module: Canopus::Language

Defined in:
lib/canopus/language.rb,
lib/canopus/language/symbol.rb,
lib/canopus/language/document.rb,
lib/canopus/language/definition.rb,
lib/canopus/language/syntax_worker.rb,
lib/canopus/language/background_analysis.rb,
sig/canopus.rbs

Defined Under Namespace

Modules: SyntaxWorker Classes: BackgroundAnalysis, Bracket, Definition, Document, DocumentSymbol, Symbol

Constant Summary collapse

DEFINITIONS =

Returns:

[
  ["ruby", "ruby", %w[.rb .rake .gemspec Gemfile Rakefile], "#", /(?:^\s*(?:class|module|def|if|unless|case|while|until|for|begin)\b.*|(?:\bdo|[\[{(])(?:\s*\|[^|]*\|)?\s*)$/, /^\s*(?:end\b|else\b|elsif\b|rescue\b|ensure\b|[\]})])/, [["ruby-lsp"]]],
  ["javascript", "javascript", %w[.js .jsx .mjs .cjs], "//", /[\[{(]\s*$/, /^\s*[\]})]/, [["typescript-language-server", "--stdio"]]],
  ["typescript", "typescript", %w[.ts .tsx], "//", /[\[{(]\s*$/, /^\s*[\]})]/, [["typescript-language-server", "--stdio"]]],
  ["python", "python", %w[.py .pyi], "#", /:\s*(?:#.*)?$/, /^\s*(?:else|elif|except|finally)\b/, [["pyright-langserver", "--stdio"]]],
  ["rust", "rust", %w[.rs], "//", /[\[{(]\s*$/, /^\s*[\]})]/, [["rust-analyzer"]]],
  ["go", "go", %w[.go], "//", /[\[{(]\s*$/, /^\s*[\]})]/, [["gopls"]]],
  ["c", "c", %w[.c .h], "//", /[\[{(]\s*$/, /^\s*[\]})]/, [["clangd"]]],
  ["cpp", "cpp", %w[.cpp .hpp .cc .cxx], "//", /[\[{(]\s*$/, /^\s*[\]})]/, [["clangd"]]],
  ["json", "json", %w[.json .jsonc], "//", /[\[{]\s*$/, /^\s*[\]}]/, []],
  ["yaml", "yaml", %w[.yml .yaml], "#", /:\s*$/, /^\s*$/, []],
  ["toml", "toml", %w[.toml], "#", /[\[{]\s*$/, /^\s*[\]}]/, []],
  ["markdown", "markdown", %w[.md .markdown], "<!--", /\A\z/, /\A\z/, []],
  ["html", "html", %w[.html .erb], "<!--", /<[^\/>]+>\s*$/, /^\s*<\//, []],
  ["xml", "xml", %w[.xml .xhtml .svg], "<!--", /<[^\/>]+>\s*$/, /^\s*<\//, []],
  ["css", "css", %w[.css .scss], "/*", /\{\s*$/, /^\s*}/, []],
  ["shellscript", "shell", %w[.sh .bash .zsh], "#", /\b(?:then|do|case)\s*$/, /^\s*(?:fi|done|esac)\b/, []]
].map { |values| Definition.new(*values) }.freeze
PLAIN =

Returns:

Definition.new("text", "plaintext", [], "#", /\A\z/, /\A\z/, [])

Class Method Summary collapse

Class Method Details

.executable?(name) ⇒ Boolean

Parameters:

  • name (String)

Returns:

  • (Boolean)


34
35
36
37
# File 'lib/canopus/language.rb', line 34

def self.executable?(name)
  paths = name.include?(File::SEPARATOR) ? [name] : ENV.fetch("PATH", "").split(File::PATH_SEPARATOR).map { |path| File.join(path, name) }
  paths.any? { |path| File.file?(path) && File.executable?(path) }
end

.for_path(path) ⇒ Definition

Parameters:

  • path (String, nil)

Returns:



29
30
31
32
33
# File 'lib/canopus/language.rb', line 29

def self.for_path(path)
  return PLAIN unless path
  extension, base = File.extname(path), File.basename(path)
  DEFINITIONS.find { |language| language.extensions.include?(extension) || language.extensions.include?(base) } || PLAIN
end