22
33require_relative "syntax_search/version"
44
5- require 'parser/current'
65require 'tmpdir'
76require 'stringio'
87require 'pathname'
8+ require 'ripper'
99
1010module SyntaxErrorSearch
1111 class Error < StandardError ; end
@@ -80,6 +80,13 @@ def self.valid_without?(without_lines: , code_lines:)
8080 end
8181 end
8282
83+ def self . invalid? ( source )
84+ source = source . join if source . is_a? ( Array )
85+ source = source . to_s
86+
87+ Ripper . new ( source ) . tap ( &:parse ) . error?
88+ end
89+
8390 # Returns truthy if a given input source is valid syntax
8491 #
8592 # SyntaxErrorSearch.valid?(<<~EOM) # => true
@@ -115,38 +122,12 @@ def self.valid_without?(without_lines: , code_lines:)
115122 # so passing a CodeLine in as an object or as an array
116123 # will convert it to it's code representation.
117124 def self . valid? ( source )
118- source = source . join if source . is_a? ( Array )
119- source = source . to_s
120-
121- # Parser writes to stderr even if you catch the error
122- stderr = $stderr
123- $stderr = StringIO . new
124-
125- Parser ::CurrentRuby . parse ( source )
126- true
127- rescue Parser ::SyntaxError => e
128- yield e if block_given?
129- false
130- ensure
131- $stderr = stderr if stderr
125+ !invalid? ( source )
132126 end
133127
134- def self . invalid_type ( source )
135- message = nil
136- self . valid? ( source ) do |error |
137- message = error . message
138- end
139128
140- case message
141- when nil
142- :none
143- when /token kEND/
144- :unmatched_end
145- when /token \$ end/ #
146- :missing_end
147- else
148- raise "Unexpected message #{ message } "
149- end
129+ def self . invalid_type ( source )
130+ WhoDisSyntaxError . new ( source ) . call . error_symbol
150131 end
151132end
152133
@@ -159,3 +140,4 @@ def self.invalid_type(source)
159140require_relative "syntax_search/parse_blocks_from_indent_line"
160141
161142require_relative "syntax_search/code_search"
143+ require_relative "syntax_search/who_dis_syntax_error"
0 commit comments