Class: Prism::Merge::Provider

Inherits:
Object
  • Object
show all
Defined in:
lib/prism/merge/provider.rb,
sig/prism/merge.rbs

Overview

Base-aware, source-preserving Ruby provider backed by Prism top-level owners. rubocop:disable Metrics/AbcSize, Metrics/ClassLength, Metrics/CyclomaticComplexity, Metrics/MethodLength, Metrics/ParameterLists, Metrics/PerceivedComplexity -- provider decisions, source plans, and verification form one boundary

Defined Under Namespace

Classes: Decision, Document, Owner

Constant Summary collapse

DEFAULT_PROFILE =
:source_preserving

Instance Method Summary collapse

Instance Method Details

#analyze(request) ⇒ Ast::Merge::provider_result

Parameters:

  • request (Ast::Merge::provider_request)

Returns:

  • (Ast::Merge::provider_result)


29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
# File 'lib/prism/merge/provider.rb', line 29

def analyze(request)
  document = parse_document(:analyze, request, :source)
  return document if provider_failure?(document)

  result(
    :analyze,
    request,
    analysis: {
      backend: 'prism',
      valid: true,
      owners: document.owners.map { |owner| owner_description(owner) }
    },
    verification: { source_parsed: true }
  )
end

#capabilitiesAst::Merge::provider_capabilities

Returns:

  • (Ast::Merge::provider_capabilities)


18
19
20
21
22
23
24
25
26
27
# File 'lib/prism/merge/provider.rb', line 18

def capabilities
  {
    operations: Ast::Merge::ProviderContract::OPERATIONS,
    dialects: %i[ruby],
    backends: %i[prism],
    profiles: [DEFAULT_PROFILE],
    role: :backend,
    source_preservation: %i[exact_source owner_fragments line_provenance reparse semantic_verification]
  }.freeze
end

#diff2(request) ⇒ Ast::Merge::provider_result

Parameters:

  • request (Ast::Merge::provider_request)

Returns:

  • (Ast::Merge::provider_result)


45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
# File 'lib/prism/merge/provider.rb', line 45

def diff2(request)
  before = parse_document(:diff2, request, :before)
  return before if provider_failure?(before)

  after = parse_document(:diff2, request, :after)
  return after if provider_failure?(after)

  changes = diff_documents(before, after)
  result(
    :diff2,
    request,
    diff: { changes: changes },
    changes: changes,
    verification: { before_parsed: true, after_parsed: true }
  )
end

#familyString

Returns:

  • (String)


16
# File 'lib/prism/merge/provider.rb', line 16

def family = 'ruby'

#merge2(request) ⇒ Ast::Merge::provider_result

Parameters:

  • request (Ast::Merge::provider_request)

Returns:

  • (Ast::Merge::provider_result)


62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
# File 'lib/prism/merge/provider.rb', line 62

def merge2(request)
  merged = Prism::Merge.merge_ruby(
    request.fetch(:incoming_source),
    request.fetch(:current_source),
    'ruby',
    backend: request[:backend],
    add_template_only_nodes: true
  )
  return merge2_failure(request, merged) unless merged[:ok]

  output = merged.fetch(:output)
  parsed = parse_source(output, :output)
  return render_failure(:merge2, request, parsed) if provider_failure?(parsed)

  result(
    :merge2,
    request,
    output: output,
    render_report: { strategy: :prism_smart_merger, synthesis: :family_emission },
    verification: { output_reparsed: true }
  )
end

#merge3(request) ⇒ Ast::Merge::provider_result

Parameters:

  • request (Ast::Merge::provider_request)

Returns:

  • (Ast::Merge::provider_result)


85
86
87
88
89
90
91
92
93
94
95
96
# File 'lib/prism/merge/provider.rb', line 85

def merge3(request)
  documents = parse_merge3_documents(request)
  return documents if provider_failure?(documents)

  exact_role = exact_revision_role(request)
  decision = decide(documents, include_unmanaged_conflict: exact_role.nil?)
  return render_conflicts(request, documents, decision) unless decision.conflicts.empty?

  return render_exact(request, documents, decision, exact_role) if exact_role

  render_composite(request, documents, decision)
end

#provider_idString

Returns:

  • (String)


15
# File 'lib/prism/merge/provider.rb', line 15

def provider_id = 'ruby.ruby.prism'