Class: IgniterLang::Classifier

Inherits:
Object
  • Object
show all
Defined in:
lib/igniter_lang/classifier.rb

Constant Summary collapse

DEFAULT_VERSION =
"classifier-pass-executable-proof-v0"

Instance Method Summary collapse

Constructor Details

#initialize(classifier_version: DEFAULT_VERSION) ⇒ Classifier

Returns a new instance of Classifier.



9
10
11
# File 'lib/igniter_lang/classifier.rb', line 9

def initialize(classifier_version: DEFAULT_VERSION)
  @classifier_version = classifier_version
end

Instance Method Details

#classify(parsed_program, sample_input:) ⇒ Object



13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
# File 'lib/igniter_lang/classifier.rb', line 13

def classify(parsed_program, sample_input:)
  assumption_registry = assumption_registry(parsed_program)
  contracts = parsed_program.fetch("contracts").map do |contract|
    classify_contract(parsed_program, contract, sample_input, assumption_registry)
  end

  result = {
    "kind" => "classified_program",
    "classifier_version" => @classifier_version,
    "program_id" => program_id(parsed_program),
    "source_path" => parsed_program.fetch("source_path"),
    "source_hash" => parsed_program.fetch("source_hash"),
    "grammar_version" => parsed_program.fetch("grammar_version"),
    "module" => parsed_program.fetch("module"),
    "type_declarations" => type_declarations(parsed_program),
    "contracts" => contracts,
    "oof_log" => contracts.flat_map { |contract| contract.fetch("oof_log") },
    "semantic_ir_ref" => nil
  }
  result["assumption_registry"] = assumption_registry.values unless assumption_registry.empty?
  olap_points = parsed_program.fetch("olap_points", [])
  result["olap_points"] = olap_points unless olap_points.empty?
  result
end

#type_declarations(parsed_program) ⇒ Object



38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
# File 'lib/igniter_lang/classifier.rb', line 38

def type_declarations(parsed_program)
  parsed_program.fetch("types", []).map do |type|
    {
      "kind" => "type",
      "name" => type.fetch("name"),
      "fields" => type.fetch("fields", []).map do |field|
        {
          "name" => field.fetch("name"),
          "type_annotation" => normalize_type(field.fetch("type_annotation")),
          "optional" => field.fetch("optional", false)
        }
      end
    }
  end
end