redcar 0.7 → 0.8

Sign up to get free protection for your applications and to get access to all the features.
Files changed (131) hide show
  1. data/CHANGES +42 -0
  2. data/README.md +5 -3
  3. data/Rakefile +39 -81
  4. data/bin/redcar +1 -1
  5. data/lib/redcar.rb +9 -6
  6. data/lib/redcar/installer.rb +1 -1
  7. data/lib/redcar/ruby_extensions.rb +19 -0
  8. data/lib/redcar/runner.rb +1 -1
  9. data/lib/redcar/usage.rb +3 -0
  10. data/lib/redcar_quick_start.rb +11 -11
  11. data/plugins/application/features/step_definitions/tree_steps.rb +22 -5
  12. data/plugins/application/features/step_definitions/window_steps.rb +9 -1
  13. data/plugins/application/features/support/env.rb +5 -2
  14. data/plugins/application/lib/application.rb +51 -46
  15. data/plugins/application/lib/application/window.rb +60 -30
  16. data/plugins/application_swt/lib/application_swt.rb +16 -16
  17. data/plugins/application_swt/lib/application_swt/window.rb +35 -7
  18. data/plugins/auto_completer/features/support/env.rb +0 -2
  19. data/plugins/auto_indenter/features/support/env.rb +0 -1
  20. data/plugins/auto_pairer/features/auto_pairer.feature +50 -45
  21. data/plugins/auto_pairer/features/support/env.rb +0 -1
  22. data/plugins/auto_pairer/lib/auto_pairer/document_controller.rb +11 -6
  23. data/plugins/clipboard-viewer/Screenshot.png +0 -0
  24. data/plugins/clipboard-viewer/lib/clipboard_viewer.rb +50 -0
  25. data/plugins/clipboard-viewer/lib/clipboard_viewer/browser_controller.rb +27 -0
  26. data/plugins/clipboard-viewer/lib/clipboard_viewer/clipboard_bar.rb +67 -0
  27. data/plugins/clipboard-viewer/plugin.rb +9 -0
  28. data/plugins/clipboard-viewer/views/clipboard.html.erb +15 -0
  29. data/plugins/clipboard-viewer/views/default.css +43 -0
  30. data/plugins/clipboard-viewer/views/redcar_small_icon.png +0 -0
  31. data/plugins/comment/features/line_comment.feature +137 -0
  32. data/plugins/comment/features/selection_comment.feature +21 -0
  33. data/plugins/comment/features/step_definitions/comment_steps.rb +7 -0
  34. data/plugins/comment/lib/comment.rb +266 -0
  35. data/plugins/comment/plugin.rb +7 -0
  36. data/plugins/comment/vendor/comment_lib.json +47 -0
  37. data/plugins/declarations/lib/declarations.rb +1 -1
  38. data/plugins/document_search/features/replace.feature +10 -2
  39. data/plugins/document_search/features/support/env.rb +0 -1
  40. data/plugins/document_search/lib/document_search.rb +4 -1
  41. data/plugins/document_search/lib/document_search/replace.rb +11 -3
  42. data/plugins/document_search/lib/document_search/search_and_replace.rb +5 -2
  43. data/plugins/edit_view/features/case_change.feature +9 -9
  44. data/plugins/edit_view/features/cursor_navigation.feature +36 -0
  45. data/plugins/edit_view/features/step_definitions/editing_steps.rb +63 -8
  46. data/plugins/edit_view/features/step_definitions/notebook_steps.rb +2 -0
  47. data/plugins/edit_view/features/step_definitions/tab_steps.rb +8 -5
  48. data/plugins/edit_view/features/support/env.rb +8 -2
  49. data/plugins/edit_view/lib/edit_view.rb +16 -1
  50. data/plugins/edit_view/lib/edit_view/actions/cmd_enter.rb +11 -0
  51. data/plugins/edit_view/lib/edit_view/document.rb +27 -10
  52. data/plugins/edit_view/lib/edit_view/edit_tab.rb +17 -4
  53. data/plugins/edit_view/spec/edit_view/document_spec.rb +3 -0
  54. data/plugins/edit_view_swt/lib/edit_view_swt.rb +42 -3
  55. data/plugins/edit_view_swt/lib/edit_view_swt/word_movement.rb +17 -15
  56. data/plugins/help/lib/help.rb +40 -0
  57. data/plugins/help/plugin.rb +8 -0
  58. data/plugins/html_view/features/step_definitions/html_view_steps.rb +6 -4
  59. data/plugins/line_tools/features/support/env.rb +0 -1
  60. data/plugins/macros/features/step_definitions/macro_steps.rb +0 -55
  61. data/plugins/macros/features/support/env.rb +0 -2
  62. data/plugins/open_default_app/lib/open_default_app.rb +35 -0
  63. data/plugins/open_default_app/plugin.rb +8 -0
  64. data/plugins/open_default_app/screenshot.png +0 -0
  65. data/plugins/plugin_manager_ui/lib/plugin_manager_ui.rb +17 -3
  66. data/plugins/project/features/find_file.feature +3 -2
  67. data/plugins/project/features/highlight_focussed_tab.feature +8 -0
  68. data/plugins/project/features/move_and_rename_files.feature +25 -0
  69. data/plugins/project/features/open_and_save_files.feature +10 -1
  70. data/plugins/project/features/open_directory_tree.feature +32 -2
  71. data/plugins/project/features/step_definitions/directory_steps.rb +17 -0
  72. data/plugins/project/features/step_definitions/project_tree_steps.rb +3 -0
  73. data/plugins/project/features/sub_project.feature +14 -0
  74. data/plugins/project/features/support/env.rb +22 -3
  75. data/plugins/project/features/watch_for_modified_files.feature +32 -9
  76. data/plugins/project/lib/project.rb +53 -21
  77. data/plugins/project/lib/project/adapters/local.rb +21 -16
  78. data/plugins/project/lib/project/adapters/remote.rb +15 -13
  79. data/plugins/project/lib/project/commands.rb +37 -16
  80. data/plugins/project/lib/project/dir_controller.rb +41 -42
  81. data/plugins/project/lib/project/drb_service.rb +35 -21
  82. data/plugins/project/lib/project/file_list.rb +7 -1
  83. data/plugins/project/lib/project/manager.rb +28 -3
  84. data/plugins/project/lib/project/sub_project.rb +17 -0
  85. data/plugins/project/lib/project/support/recycle.js +2 -0
  86. data/plugins/project/lib/project/support/trash.rb +72 -0
  87. data/plugins/project/spec/fixtures/multi-byte-files/a/341/204/200/341/205/247/341/206/274/341/204/205/341/205/251/foo +1 -0
  88. data/plugins/project/spec/fixtures/multi-byte-files//341/204/220/341/205/246/341/204/211/341/205/263/341/204/220/341/205/263.py +1 -0
  89. data/plugins/project/spec/project/file_list_spec.rb +4 -0
  90. data/plugins/redcar/features/goto_line_command.feature +20 -0
  91. data/plugins/redcar/redcar.rb +107 -47
  92. data/plugins/repl/lib/repl.rb +20 -20
  93. data/plugins/repl/lib/repl/clojure_mirror.rb +50 -58
  94. data/plugins/repl/lib/repl/groovy_mirror.rb +22 -41
  95. data/plugins/repl/lib/repl/repl_mirror.rb +85 -14
  96. data/plugins/repl/lib/repl/ruby_mirror.rb +12 -39
  97. data/plugins/repl/spec/repl/groovy_mirror_spec.rb +1 -1
  98. data/plugins/repl/spec/repl/ruby_mirror_spec.rb +12 -12
  99. data/plugins/ruby/README +6 -0
  100. data/plugins/ruby/lib/syntax_check/ruby.rb +28 -0
  101. data/plugins/ruby/plugin.rb +7 -0
  102. data/plugins/runnables/features/command_tree.feature +9 -0
  103. data/plugins/runnables/features/file_runner_input.feature +20 -0
  104. data/plugins/runnables/features/run_alternate_command.feature +14 -0
  105. data/plugins/runnables/features/support/env.rb +42 -5
  106. data/plugins/runnables/lib/runnables.rb +67 -21
  107. data/plugins/runnables/lib/runnables/commands.rb +35 -18
  108. data/plugins/runnables/lib/runnables/tree_mirror/nodes/runnable_group.rb +23 -37
  109. data/plugins/runnables/lib/runnables/tree_mirror/nodes/runnable_type_group.rb +16 -18
  110. data/plugins/scm_svn/features/support/env.rb +0 -3
  111. data/plugins/snippets/features/snippets.feature +17 -2
  112. data/plugins/snippets/features/support/env.rb +0 -1
  113. data/plugins/snippets/lib/snippets/tab_handler.rb +51 -18
  114. data/plugins/swt/lib/swt/cucumber_patches.rb +13 -68
  115. data/plugins/swt/lib/swt/cucumber_runner.rb +2 -3
  116. data/plugins/syntax_check/README +6 -0
  117. data/plugins/syntax_check/lib/syntax_check.rb +16 -0
  118. data/plugins/syntax_check/lib/syntax_check/checker.rb +47 -0
  119. data/plugins/syntax_check/lib/syntax_check/error.rb +23 -0
  120. data/plugins/syntax_check/plugin.rb +7 -0
  121. data/plugins/tree_view_swt/lib/tree_view_swt.rb +6 -0
  122. data/plugins/web_bookmarks/Screenshot.png +0 -0
  123. data/plugins/web_bookmarks/lib/web_bookmarks.rb +42 -0
  124. data/plugins/web_bookmarks/lib/web_bookmarks/bookmark.rb +43 -0
  125. data/plugins/web_bookmarks/lib/web_bookmarks/browser_bar.rb +70 -0
  126. data/plugins/web_bookmarks/lib/web_bookmarks/commands.rb +111 -0
  127. data/plugins/web_bookmarks/lib/web_bookmarks/tree.rb +67 -0
  128. data/plugins/web_bookmarks/lib/web_bookmarks/view_controller.rb +22 -0
  129. data/plugins/web_bookmarks/plugin.rb +11 -0
  130. data/plugins/web_bookmarks/views/index.html.erb +5 -0
  131. metadata +60 -10
@@ -2,39 +2,17 @@ module Redcar
2
2
  class Runnables
3
3
  class RunnableGroup
4
4
  include Redcar::Tree::Mirror::NodeMirror
5
+ attr_reader :text
5
6
 
6
- def initialize(name,path,runnables)
7
- @children = []
8
- @name = name
9
- if runnables.any?
10
- group = []
11
- type = nil
12
- i = 0
13
- runnables.map.sort_by{|r|r["type"]||""}.each do |runnable|
14
- if runnable["type"] == nil or runnable["type"] == ""
15
- @children << Runnable.new(runnable["name"],path,runnable)
16
- elsif type.nil?
17
- type = runnable["type"]
18
- group << runnable
19
- elsif type == runnable["type"]
20
- group << runnable
21
- end
22
- if i == runnables.length - 1 or type != runnable["type"]
23
- if type == name
24
- group.each {|r| @children << Runnable.new(r["name"],path,r)}
25
- else
26
- type = type[name.length,type.length] if type =~ /^#{name}/
27
- type = type[1,type.length] if type =~ /^\//
28
- if type == ""
29
- @children << Runnable.new(runnable["name"],path,runnable)
30
- else
31
- @children << RunnableTypeGroup.new(type,path,group) unless group.size == 0
32
- end
33
- end
34
- type = runnable["type"]
35
- group = [runnable]
36
- end
37
- i = i + 1
7
+ def initialize(name, path, runnables)
8
+ @text = name
9
+ @runnables = []
10
+ @subgroups = {}
11
+ runnables.each do |runnable|
12
+ if runnable["type"].nil? or runnable["type"].empty?
13
+ @runnables << Runnable.new(runnable["name"], path, runnable)
14
+ else
15
+ type_group(runnable["type"]).add_runnable Runnable.new(runnable["name"], path, runnable)
38
16
  end
39
17
  end
40
18
  end
@@ -43,16 +21,24 @@ module Redcar
43
21
  false
44
22
  end
45
23
 
46
- def text
47
- @name
48
- end
49
-
50
24
  def icon
51
25
  :file
52
26
  end
53
27
 
28
+ # Sort the subgroups first, the runnables after that
54
29
  def children
55
- @children
30
+ @children ||= (@subgroups.sort_by(&:first).collect(&:last) + @runnables.sort_by(&:text))
31
+ end
32
+
33
+ # Return the type group that corresponds to the passed name-path, or self, if name is empty
34
+ # If a child with the specified path does not exist, create it and clear the children cache
35
+ def type_group(name)
36
+ names = name.split("/")
37
+ unless @subgroups[names.first]
38
+ @children = nil
39
+ @subgroups[names.first] = RunnableTypeGroup.new(names.first)
40
+ end
41
+ @subgroups[names.first].type_group(names[1..-1].join)
56
42
  end
57
43
  end
58
44
  end
@@ -1,32 +1,30 @@
1
1
  module Redcar
2
2
  class Runnables
3
- class RunnableTypeGroup
4
- include Redcar::Tree::Mirror::NodeMirror
5
-
6
- def initialize(name,path,runnables)
7
- @name = name
8
- if runnables.any?
9
- @children = runnables.map do |runnable|
10
- Runnable.new(runnable["name"],path,runnable)
11
- end
12
- end
3
+ class RunnableTypeGroup < RunnableGroup
4
+ def initialize(name)
5
+ name_parts = name.split("/")
6
+ @text = name_parts.first
7
+ @runnables = []
8
+ @subgroups = {}
13
9
  end
14
10
 
15
- def leaf?
16
- false
11
+ # Return the type group that corresponds to the passed name-path, or self, if name is empty
12
+ # If a child with the specified path does not exist, create it and clear the children cache
13
+ def type_group(name)
14
+ return super unless name.empty?
15
+ self
17
16
  end
18
17
 
19
- def text
20
- @name
18
+ # Add a runnable to the children
19
+ # Tries to avoid re-building the children array
20
+ def add_runnable(runnable)
21
+ @children << runnable unless @children.nil?
22
+ return @runnables << runnable
21
23
  end
22
24
 
23
25
  def icon
24
26
  File.join(Redcar::ICONS_DIRECTORY, "folder-open-small-gears.png")
25
27
  end
26
-
27
- def children
28
- @children
29
- end
30
28
  end
31
29
  end
32
30
  end
@@ -1,6 +1,3 @@
1
- RequireSupportFiles File.dirname(__FILE__) + "/../../../application/features/"
2
- RequireSupportFiles File.dirname(__FILE__) + "/../../../project/features/"
3
- RequireSupportFiles File.dirname(__FILE__) + "/../../../runnables/features/"
4
1
  require File.join(Redcar.asset_dir, "svnkit")
5
2
  require 'java'
6
3
  import 'org.tmatesoft.svn.core.io.SVNRepositoryFactory'
@@ -13,6 +13,21 @@ Feature: Snippets
13
13
  And I press the Tab key in the edit tab
14
14
  Then the contents should be "Daniel Benjamin Lucraft<c>"
15
15
 
16
+ Scenario: Snippet text preceded by other characters and separated by non-word characters
17
+ Given there is a snippet with tab trigger "ewf" and scope "" and content
18
+ """
19
+ Earth, Wind, and Fire
20
+ """
21
+ When I replace the contents with "}}ewf<c>"
22
+ And I press the Tab key in the edit tab
23
+ Then the contents should be "}}Earth, Wind, and Fire<c>"
24
+ When I replace the contents with "(1,2,4)}}ewf<c>"
25
+ And I press the Tab key in the edit tab
26
+ Then the contents should be "(1,2,4)}}Earth, Wind, and Fire<c>"
27
+ When I replace the contents with "blank.test1.ewf<c>"
28
+ And I press the Tab key in the edit tab
29
+ Then the contents should be "blank.test1.Earth, Wind, and Fire<c>"
30
+
16
31
  Scenario: Simple content snippet in plain text scope
17
32
  Given there is a snippet with tab trigger "DBL" and scope "text.plain" and content
18
33
  """
@@ -75,7 +90,7 @@ Feature: Snippets
75
90
  When I replace the contents with "if<c>"
76
91
  And I press the Tab key in the edit tab
77
92
  Then the contents should be "if <c>\n\t\nend"
78
-
93
+
79
94
  Scenario: Escapes dollars
80
95
  Given there is a snippet with tab trigger "DBL" and scope "text.plain" and content
81
96
  """
@@ -336,7 +351,7 @@ Feature: Snippets
336
351
  Then the contents should be "def <s>fname<c> docstring for fname\"\"\"\n"
337
352
  When I replace 4 to 9 with ""
338
353
  Then the contents should be "def <c> docstring for \"\"\"\n"
339
-
354
+
340
355
  Scenario: Abutting dollars 2
341
356
  Given there is a snippet with tab trigger "def" and scope "text.plain" and content
342
357
  """
@@ -1,2 +1 @@
1
1
 
2
- RequireSupportFiles File.dirname(__FILE__) + "/../../../edit_view/features/"
@@ -5,7 +5,7 @@ module Redcar
5
5
  def self.priority
6
6
  10
7
7
  end
8
-
8
+
9
9
  def self.handle(edit_view, modifiers)
10
10
  controller = edit_view.document.controllers(Snippets::DocumentController).first
11
11
  if controller.in_snippet?
@@ -23,31 +23,64 @@ module Redcar
23
23
  find_snippet(edit_view)
24
24
  end
25
25
  end
26
-
26
+
27
27
  def self.activate_snippet(edit_view, snippet)
28
28
  controller = edit_view.document.controllers(Snippets::DocumentController).first
29
29
  doc = edit_view.document
30
- doc.delete(doc.cursor_offset - snippet.tab_trigger.length, snippet.tab_trigger.length)
31
- controller.start_snippet!(snippet)
30
+ edit_view.compound do
31
+ doc.delete(doc.cursor_offset - snippet.tab_trigger.length, snippet.tab_trigger.length)
32
+ controller.start_snippet!(snippet)
33
+ end
32
34
  end
33
-
35
+
34
36
  # Decides whether a snippet can be inserted at this location. If so
35
37
  # returns the snippet, if not returns false.
36
38
  def self.find_snippet(edit_view)
37
39
  document = edit_view.document
38
40
  @word, @offset, @start_word_offset = nil, nil, nil
39
41
  @word = word_before_cursor(edit_view)
40
-
41
42
  if @word
42
43
  @offset = document.cursor_offset
43
44
  @start_word_offset = document.cursor_offset - @word.length
44
- options = Snippets.registry.find_by_scope_and_tab_trigger(document.cursor_scope, @word)
45
+ options = find_snippet_options(document.cursor_scope, @word)
45
46
  if options.any?
46
47
  choose_snippet(edit_view, options)
47
48
  end
48
49
  end
49
50
  end
50
-
51
+
52
+ #search for snippet matches inside a word block in an intelligent way
53
+ def self.find_snippet_options(scope,word)
54
+ search_word = word
55
+ options = search_registry(scope,word)
56
+ if not options.any? and word.match(/\W/) and word.match(/\w/)
57
+
58
+ #most likely, there is just one symbol preceding the snippet
59
+ if not options.any? and char = word.index(/\w/,word.index(/\W/))
60
+ search_word = word[char,word.split(//).length]
61
+ options = search_registry(scope, search_word)
62
+ end
63
+
64
+ #otherwise, search from the end
65
+ if not options.any?
66
+ offset = -1
67
+ while not options.any? and
68
+ (offset * -1) < word.split(//).length and
69
+ symbol_idx = word.rindex(/\W/,offset) and
70
+ char = word.index(/\w/,symbol_idx)
71
+ search_word = word[char,word.split(//).length]
72
+ options = search_registry(scope, search_word)
73
+ offset = offset - 1
74
+ end
75
+ end
76
+ end
77
+ options
78
+ end
79
+
80
+ def self.search_registry(scope,word)
81
+ Snippets.registry.find_by_scope_and_tab_trigger(scope,word)
82
+ end
83
+
51
84
  def self.word_before_cursor(edit_view)
52
85
  document = edit_view.document
53
86
  line = document.get_slice(document.cursor_line_start_offset, document.cursor_offset).reverse
@@ -56,7 +89,7 @@ module Redcar
56
89
  end
57
90
  word
58
91
  end
59
-
92
+
60
93
  def self.choose_snippet(edit_view, snippets)
61
94
  if not snippets or snippets.length == 0
62
95
  false
@@ -64,18 +97,18 @@ module Redcar
64
97
  activate_snippet(edit_view, snippets.first)
65
98
  true
66
99
  else
67
- builder = Menu::Builder.new do
68
- snippets.group_by {|s| s.bundle_name }.each do |_, bsnippets|
69
- bsnippets.each_with_index do |snippet, i|
100
+ builder = Menu::Builder.new do
101
+ snippets.group_by {|s| s.bundle_name }.each do |_, bsnippets|
102
+ bsnippets.each_with_index do |snippet, i|
70
103
  item(snippet.name||"<untitled>") do
71
- Snippets::TabHandler.activate_snippet(edit_view, snippet)
104
+ Snippets::TabHandler.activate_snippet(edit_view, snippet)
72
105
  end
73
- end
74
- separator
106
+ end
107
+ separator
75
108
  end
76
- end
77
- Redcar.app.focussed_window.popup_menu_with_numbers(builder.menu)
78
- true
109
+ end
110
+ Redcar.app.focussed_window.popup_menu_with_numbers(builder.menu)
111
+ true
79
112
  end
80
113
  end
81
114
 
@@ -1,88 +1,33 @@
1
1
 
2
2
  module Cucumber
3
3
  module Ast
4
- class StepInvocation #:nodoc:#
4
+ class StepInvocation #:nodoc:#
5
5
  class << self
6
6
  attr_accessor :wait_time
7
7
  end
8
-
9
- def invoke(step_mother, options)
10
- block = Swt::RRunnable.new do
11
- find_step_match!(step_mother)
12
- unless @skip_invoke || options[:dry_run] || @exception || @step_collection.exception
13
- @skip_invoke = true
14
- begin
15
- @step_match.invoke(@multiline_arg)
16
- step_mother.after_step
17
- status!(:passed)
18
- rescue Pending => e
19
- failed(options, e, false)
20
- status!(:pending)
21
- rescue Undefined => e
22
- failed(options, e, false)
23
- status!(:undefined)
24
- rescue Exception => e
25
- failed(options, e, false)
26
- status!(:failed)
27
- end
28
- end
29
- end
30
-
31
- Redcar::ApplicationSWT.display.syncExec(block)
32
8
 
33
- if ENV["SLOW_CUKES"]
34
- sleep ENV["SLOW_CUKES"].to_f
35
- end
9
+ def invoke_with_swt(step_mother, options)
10
+ block = Swt::RRunnable.new { invoke_without_swt(step_mother, options) }
11
+
12
+ Redcar::ApplicationSWT.display.syncExec(block)
13
+ sleep ENV["SLOW_CUKES"].to_f if ENV["SLOW_CUKES"]
36
14
  sleep(Cucumber::Ast::StepInvocation.wait_time || 0)
37
15
  Cucumber::Ast::StepInvocation.wait_time = nil
38
16
  end
39
- end
40
- end
41
17
 
42
- module RbSupport
43
- class RbLanguage
44
- def require_support_files(path)
45
- @step_mother.load_code_files(Cli::Configuration.code_files_in_paths([path]))
46
- end
18
+ alias_method :invoke_without_swt, :invoke
19
+ alias_method :invoke, :invoke_with_swt
47
20
  end
48
-
49
- module RbDsl
50
- def RequireSupportFiles(path)
51
- RbDsl.require_support_files(path)
52
- end
53
-
54
- class << self
55
- def require_support_files(path)
56
- @rb_language.require_support_files(path)
57
- end
58
- end
59
- end
60
-
61
21
  end
62
-
22
+
63
23
  module Cli
64
24
  class Configuration
65
- def all_files_to_load
66
- requires = @options[:require].empty? ? require_dirs : @options[:require]
67
- files = Configuration.code_files_in_paths(requires)
68
- remove_excluded_files_from(files)
69
- files
25
+ def require_dirs_with_redcar_plugins
26
+ require_dirs_without_redcar_plugins + Dir['plugins/*/features']
70
27
  end
71
28
 
72
- class << self
73
- def code_files_in_paths(requires)
74
- files = requires.map do |path|
75
- path = path.gsub(/\\/, '/') # In case we're on windows. Globs don't work with backslashes.
76
- path = path.gsub(/\/$/, '') # Strip trailing slash.
77
- File.directory?(path) ? Dir["#{path}/**/*"] : path
78
- end.flatten.uniq
79
- files.map! {|f| File.expand_path(f) }
80
- files.reject! {|f| !File.file?(f)}
81
- files.reject! {|f| File.extname(f) == '.feature' }
82
- files.reject! {|f| f =~ /^http/}
83
- files
84
- end
85
- end
29
+ alias_method :require_dirs_without_redcar_plugins, :require_dirs
30
+ alias_method :require_dirs, :require_dirs_with_redcar_plugins
86
31
  end
87
32
  end
88
33
  end
@@ -11,9 +11,8 @@ module Swt
11
11
  begin
12
12
  sleep START_DELAY
13
13
  main = Cucumber::Cli::Main.new(args)
14
- main.execute!(Cucumber::StepMother.new)
14
+ main.execute!
15
15
  Redcar.app.quit
16
- Redcar::ApplicationSWT.display.wake
17
16
  rescue Object => e
18
17
  puts e.message
19
18
  puts e.backtrace
@@ -21,4 +20,4 @@ module Swt
21
20
  end
22
21
  end
23
22
  end
24
- end
23
+ end
@@ -0,0 +1,6 @@
1
+ == Abstract Syntax checking Redcar
2
+
3
+ Get redcar from github.com/redcar/redcar and do a git clone in your
4
+ $HOME/.redcar/plugins of this repository. You will also need a
5
+ concrete syntax checker for your language, Ruby is currently supported
6
+ in timfel/redcar_syntax_check_ruby
@@ -0,0 +1,16 @@
1
+ require 'syntax_check/checker'
2
+ require 'syntax_check/error'
3
+
4
+ module Redcar
5
+ module SyntaxCheck
6
+ def self.remove_syntax_error_annotations(edit_view)
7
+ edit_view.remove_all_annotations :type => Error::Type
8
+ end
9
+
10
+ def self.after_save(doc)
11
+ remove_syntax_error_annotations(doc.edit_view)
12
+ checker = Checker[doc.edit_view.grammar]
13
+ checker.new(doc).check if checker
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,47 @@
1
+ module Redcar
2
+ module SyntaxCheck
3
+ class Checker
4
+ attr_reader :doc
5
+
6
+ def self.checkers
7
+ @checkers ||= {}
8
+ end
9
+
10
+ def self.[] name
11
+ checkers[name]
12
+ end
13
+
14
+ def self.supported_grammars(*names)
15
+ if names.any?
16
+ names.each {|g| Checker.checkers[g] = self }
17
+ @supported_grammars = supported_grammars + names
18
+ else
19
+ @supported_grammars ||= []
20
+ end
21
+ end
22
+
23
+ def initialize(document)
24
+ @doc = document
25
+ end
26
+
27
+ def manifest_path(doc = @doc)
28
+ path = doc.path
29
+ unless path and File.exist? path
30
+ Tempfile.open(doc.title) do |f|
31
+ f << doc.get_all_text
32
+ path = f.path
33
+ end
34
+ end
35
+ path
36
+ end
37
+
38
+ def supported_grammars
39
+ raise NotImplementedError, "My subclass #{self.class.name} should have implemented check"
40
+ end
41
+
42
+ def check
43
+ raise NotImplementedError, "My subclass #{self.class.name} should have implemented check"
44
+ end
45
+ end
46
+ end
47
+ end