Class: CExtractorFunctions

Inherits:
Object show all
Includes:
CExtractorConstants, CExtractorTypes
Defined in:
lib/ceedling/c_extractor/c_extractor_functions.rb

Constant Summary

Constants included from CExtractorConstants

CExtractorConstants::C11_SPECIFIER_KEYWORDS, CExtractorConstants::DECORATOR_KEYWORDS, CExtractorConstants::DEFAULT_CHUNK_SIZE, CExtractorConstants::DEFAULT_MAX_FUNCTION_LENGTH, CExtractorConstants::DEFAULT_MAX_LINE_LENGTH, CExtractorConstants::MODIFIER_KEYWORDS, CExtractorConstants::MSVC_CALLING_CONVENTIONS, CExtractorConstants::PRIVATE_KEYWORDS, CExtractorConstants::TYPE_KEYWORDS, CExtractorConstants::TYPE_QUALIFIER_KEYWORDS

Instance Attribute Summary collapse

Instance Method Summary collapse

Instance Attribute Details

#max_line_length=(value) ⇒ Object (writeonly)

Sets the attribute max_line_length

Parameters:

  • value

    the value to set the attribute max_line_length to.



18
19
20
# File 'lib/ceedling/c_extractor/c_extractor_functions.rb', line 18

def max_line_length=(value)
  @max_line_length = value
end

Instance Method Details

#setupObject



20
21
22
23
24
25
# File 'lib/ceedling/c_extractor/c_extractor_functions.rb', line 20

def setup()
  # Aliases
  @code_text = @c_extractor_code_text

  @max_line_length = DEFAULT_MAX_LINE_LENGTH
end

#try_extract_function_declaration(scanner) ⇒ Object



27
28
29
30
31
32
33
34
35
# File 'lib/ceedling/c_extractor/c_extractor_functions.rb', line 27

def try_extract_function_declaration(scanner)
  # Look for function signature
  signature = extract_function_signature(scanner, :declaration)
  return [false, nil] unless signature

  name = extract_function_name(signature)
  decorators, signature_stripped = parse_decorators_and_strip(signature, name)
  return [true, CFunctionDeclaration.new(name: name, signature: signature, decorators: decorators, signature_stripped: signature_stripped)]
end

#try_extract_function_definition(scanner, filepath) ⇒ Object

Try to extract a complete function from the scanner Returns [success, function_data] where:

  • success: boolean indicating if extraction was successful
  • function_data: CFunctionDefinition with as much info as available (may be partial on failure)


41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
# File 'lib/ceedling/c_extractor/c_extractor_functions.rb', line 41

def try_extract_function_definition(scanner, filepath)
  start_pos = scanner.pos

  # Look for function signature
  signature = extract_function_signature(scanner, :definition)
  return [false, CFunctionDefinition.new] unless signature
  
  @code_text.skip_deadspace(scanner)

  unless scanner.peek(1) == '{'
    return [false, CFunctionDefinition.new(
      name: extract_function_name(signature),
      signature: signature,
      filepath: filepath
    )]
  end
  
  # Extract function body
  success, braced_body = @code_text.extract_balanced_braces(scanner)
  unless success
    return [false, CFunctionDefinition.new(
      name: extract_function_name(signature),
      signature: signature,
      source_filepath: filepath,
      code_block: scanner.string[start_pos...scanner.pos]
    )]
  end
  
  # Extract full function definition
  code_block = scanner.string[start_pos...scanner.pos]
  
  # Fill out function data class
  name = extract_function_name(signature)
  decorators, signature_stripped = parse_decorators_and_strip(signature, name)

  func = CFunctionDefinition.new(
    name: name,
    signature: signature,
    source_filepath: filepath,
    body: braced_body,
    code_block: code_block,
    line_count: code_block.count("\n") + 1,
    decorators: decorators,
    signature_stripped: signature_stripped
  )

  return [true, func]
end