File: KeyAndFingerprintHolder.swift

package info (click to toggle)
swiftlang 6.0.3-2
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 2,519,992 kB
  • sloc: cpp: 9,107,863; ansic: 2,040,022; asm: 1,135,751; python: 296,500; objc: 82,456; f90: 60,502; lisp: 34,951; pascal: 19,946; sh: 18,133; perl: 7,482; ml: 4,937; javascript: 4,117; makefile: 3,840; awk: 3,535; xml: 914; fortran: 619; cs: 573; ruby: 573
file content (54 lines) | stat: -rw-r--r-- 2,286 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
//===--------- KeyAndFingerprintHolder.swift ------------------------------===//
//
// This source file is part of the Swift.org open source project
//
// Copyright (c) 2021 Apple Inc. and the Swift project authors
// Licensed under Apache License v2.0 with Runtime Library Exception
//
// See https://swift.org/LICENSE.txt for license information
// See https://swift.org/CONTRIBUTORS.txt for the list of Swift project authors
//
//===----------------------------------------------------------------------===//



/// Encapsulates the invariant required for anything with a DependencyKey and an fingerprint
public struct KeyAndFingerprintHolder:
  ExternalDependencyAndFingerprintEnforcer, Equatable, Hashable
{
  /// Def->use arcs go by DependencyKey. There may be >1 node for a given key.
  let key: DependencyKey

  /// The frontend records in the fingerprint, all of the information about an
  /// entity, such that any uses need be rebuilt only if the fingerprint
  /// changes.
  /// When the driver reloads a dependency graph (after a frontend job has run),
  /// it can use the fingerprint to determine if the entity has changed and thus
  /// if uses need to be recompiled.
  ///
  /// However, at present, the frontend does not record this information for
  /// every Decl; it only records it for the source-file-as-a-whole in the
  /// interface hash. The interface hash is a product of all the tokens that are
  /// not inside of function bodies. Thus, if there is no fingerprint, when the
  /// frontend creates an interface node,
  /// it adds a dependency to it from the implementation source file node (which
  /// has the interfaceHash as its fingerprint).
  let fingerprint: InternedString?

  init(_ key: DependencyKey, _ fingerprint: InternedString?) throws {
    self.key = key
    self.fingerprint = fingerprint
    assert(verifyKeyAndFingerprint())
  }
  var externalDependencyToCheck: ExternalDependency? {
    key.designator.externalDependency
  }
  private func verifyKeyAndFingerprint() -> Bool {
    assert(verifyExternalDependencyAndFingerprint())

    if let externalDependency = externalDependencyToCheck, key.aspect != .interface {
        fatalError("Aspect of external dependency must be interface: \(externalDependency)")
    }
    return true
  }
}