Class: KZ::KZSwiftFileAnalyse

Inherits:
Object
  • Object
show all
Defined in:
lib/cocoapods-kz/helpers/repair_dynamic_swift.rb

Class Method Summary collapse

Class Method Details

.analyse_swift_file(swift_files, need_handle_func) ⇒ Object



224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
# File 'lib/cocoapods-kz/helpers/repair_dynamic_swift.rb', line 224

def self.analyse_swift_file(swift_files, need_handle_func)
  swift_types = []

  cursor_index = 0
  swift_files.each_with_index do |line, index|
    next if line.start_with?("//")
    next if index < cursor_index

    if KZSwiftClass.check_line_have_class_tag(line)
      class_begin_line = find_type_begin_index(index, cursor_index, swift_files)
      class_end_line = find_type_end_index(index, swift_files)

      # 封装无关代码
      if class_begin_line > cursor_index
        contexts = swift_files[cursor_index...class_begin_line]
        swift_types << KZSwiftParagraph.new(contexts, need_handle_func)
      end

      # 封装类代码
      contexts = swift_files[class_begin_line..class_end_line]
      swift_types << KZSwiftClass.new(contexts)

      # 更新游标
      cursor_index = class_end_line + 1
    elsif KZSwiftEnum.check_line_have_enum_tag(line)
      enum_begin_line = find_type_begin_index(index, cursor_index, swift_files)
      enum_end_line = find_type_end_index(index, swift_files)

      # 封装无关代码
      if enum_begin_line > cursor_index
        contexts = swift_files[cursor_index...enum_begin_line]
        swift_types << KZSwiftParagraph.new(contexts, need_handle_func)
      end

      # 封装枚举代码
      contexts = swift_files[enum_begin_line..enum_end_line]
      swift_types << KZSwiftEnum.new(contexts)

      # 更新游标
      cursor_index = enum_end_line + 1
    end
  end

  # 封装无关代码
  if cursor_index < swift_files.length
    contexts = swift_files[cursor_index...swift_files.length]
    swift_types << KZSwiftParagraph.new(contexts, need_handle_func)
  end

  swift_types
end

.find_type_begin_index(current_index, cursor_index, swift_files) ⇒ Object



276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
# File 'lib/cocoapods-kz/helpers/repair_dynamic_swift.rb', line 276

def self.find_type_begin_index(current_index, cursor_index, swift_files)
  class_begin_line = current_index
  if current_index > 0
    (cursor_index...current_index).reverse_each do |_index|
      previous_line = swift_files[_index].lstrip

      next if previous_line == ""

      if previous_line.start_with?("@")
        class_begin_line = _index
      else
        break
      end
    end
  end
  class_begin_line
end

.find_type_end_index(current_index, swift_files) ⇒ Object



294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
# File 'lib/cocoapods-kz/helpers/repair_dynamic_swift.rb', line 294

def self.find_type_end_index(current_index, swift_files)
  class_end_line = current_index
  if current_index < swift_files.length
    left_bracket_count = -1
    (current_index...swift_files.length).each do |_index|
      next_line = swift_files[_index]

      left_brackets = next_line.scan(/{/)
      right_brackets = next_line.scan(/}/)

      if left_brackets.length > 0
        left_bracket_count = 0 if left_bracket_count == -1
        left_bracket_count += left_brackets.length
      end

      if right_brackets.length > 0
        left_bracket_count -= right_brackets.length

        if left_bracket_count == 0
          class_end_line = _index
          break
        end
      end
    end
  end
  class_end_line
end