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::MODIFIER_KEYWORDS, CExtractorConstants::MSVC_CALLING_CONVENTIONS, CExtractorConstants::PRIVATE_KEYWORDS, CExtractorConstants::TYPE_KEYWORDS, CExtractorConstants::TYPE_QUALIFIER_KEYWORDS

Instance Method Summary collapse

Instance Method Details

#setupObject



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

def setup()
  # Aliases
  @code_text = @c_extractor_code_text
end

#try_extract_function_declaration(scanner) ⇒ Object



23
24
25
26
27
28
29
30
31
# File 'lib/ceedling/c_extractor/c_extractor_functions.rb', line 23

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)


37
38
39
40
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
# File 'lib/ceedling/c_extractor/c_extractor_functions.rb', line 37

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