lib/ClangImporter コードリーディング(全体)

概要

swift/lib/ClangImporter at master · apple/swift · GitHub

CFDatabase.def

CFTypeInfo.h

CFTypeInfo.cpp

CMakeLists.txt

ClangAdapter.h

ClangAdapter.cpp

ClangDiagnosticConsumer.h

ClangDiagnosticConsumer.cpp

ClangImporter.cpp

create

header

ClangImporter.h - ClangImporter::create

std::unique_ptr<ClangImporter>
ClangImporter::create(ASTContext &ctx,
                      const ClangImporterOptions &importerOpts,
                      std::string swiftPCHHash,
                      DependencyTracker *tracker)
  1. clangコマンドをstd::vector<std::string> invocationArgStrsに格納して組み立てていく

    moaible-swift-memo.hateblo.jp

  2. ClangImporterOptions::BridgingHeaderの拡張子が.pchならば

    1. ClangImporter::Impl::setSinglePCHImport(ClangImporterOptions::BridgingHeader)
    2. ClangImporter::Impl::IsReadingBridgingPCHをtrueにする
    3. DependencyTrackerがあるならば
      • DependencyTracker::getClangCollectorでClangImporterDependencyCollectorを取得
      • ClangImporterDependencyCollector::excludePathにClangImporterOptions::BridgingHeaderをセット

ClangImporterDependencyCollector

ClangImporter::createDependencyCollector

super class

clang::DependencyCollector

ExcludedPaths

llvm::StringSet<> ExcludedPaths;

excludePath

void excludePath(StringRef filename)

isClangImporterSpecialName

bool isClangImporterSpecialName(StringRef Filename)

needSystemDependencies

bool needSystemDependencies() override

sawDependency

bool sawDependency(StringRef Filename, bool FromClangModule,
                   bool IsSystem, bool IsClangModuleFile,
                   bool IsMissing) override

IAMInference.h

IAM = Import As Memberの略称

Cグローバル関数と変数を、型またはインスタンスのメンバとしてimportしようとする

IAMInference.cpp

ImportDecl.cpp

ImportEnumInfo.h

EnumKind

特定のC列挙型をSwiftにimportする方法について

definition desc
Enum enumにmapする必要がある、そして全てのcaseが独立してることを意味する
Options option setにmapする必要がある、定数は独立フラグの組み合わせを表している
Unknown 別の型にmapする必要がある、列挙型定数の意図された意味論が判別できないため独立した定数にmapする
Constants 単純な整数値にmapする必要がある

ImportEnumInfo.cpp

ImportMacro.cpp

ImportName.h

ImportName.cpp

ImportedAccessorKind

エンティティをimportするアクセサの種類

definition desc
None x
PropertyGetter x
PropertySetter x
SubscriptGetter x
SubscriptSetter x

ImportType.cpp

ImportHint::ImportHintKind

Various types that we want to do something interesting to after importing them.

definition desc optional import
None 特別なものは何もない ×
Void void ×
BOOL BOOL ×
Boolean Boolean ×
ObjCBridged Swiftの型にbridgeされたObjective-Cのクラス型
NSUInteger NSUInteger ×
ObjCPointer Objective-Cオブジェクトのポインタ型
CFPointer CFオブジェクトポインタ型
Block Blockのポインタ型
CFunctionPointer 関数ポインタ型
OtherPointer いくつかの(上記に該当しない?)ポインタ型
SwiftNewtypeFromCFPointer The source type created a new Swift type, using swift_newtype, of an original underlying CFPointer. This distinction is necessary to trigger audit-checking.

ImporterImpl.h

ConstantConvertKind

定数値に適用する変換の種類

definition desc
None 変換の必要がない
Coerce 指定された型に強制する
Construction 定数値から指定された型を構築
ConstructionWithUnwrap Optionalのイニシャライザを使い、定数値から指定された型を構築
Downcast 指定された型へのチェックされてないダウンキャストを実行する

ImportTypeKind

型importの種類

definition desc
Abstract 調整することなく最も抽象的な形式
Typedef typedefによる型定義
Value リテラル
BridgedValue bridging可能なリテラル
Variable 宣言してる変数の型
AuditedVariable 宣言してる変数の型、xxx
RecordField 構造体 or union型
Result x
AuditedResult x
Parameter x
CFRetainedOutParameter x
CFUnretainedOutParameter x
Pointee ポインタ or 参照型
Property ObjC property
PropertyWithReferenceSemantics weak, assignもしくはunsafe_unretained属性
のObjC property
Enum enumの定義、NSUIntegerとして特別に扱う

Bridgeability

definition desc
None bridgingを一切許可しない(Cポインタのターゲットなど)
Full あらゆる種類のbridgingを可能にする(メソッド宣言のimport結果など)

InferredAttributes.def

MacroTable.def

MappedTypes.def

SortedCFDatabase.def.gyb

SwiftLookupTable.h

SwiftLookupTable.cpp