YのようなMemberというタイプの制約の生成、単一化周りを見てみる。用語などを整理をしてみる。Member要はプロパティやメソッドなど。.(ドット)でアクセスする。}}dog.namedog.bark()もうちょっというとValueDeclのサブクラスはだいたいメンバーになれるので、例えばプロパティ、メソッド以外にもネストしたstruct/class/enumの定義や、typealiasなども含まれそう。そもそもMemberを持てる型は大きく2種類。protocolArchetypeType(制約付き)MemberLookup/NameLookup与えられた名前からメンバーを探すことをMemberLookupという。Sema内ではConstraintSystem::performMemberLookupがエントリーポイントで、幾つかのSema関連クラスを通ってASTのNameLookup.cppの関数を呼び出している。いつperformMemberLookupがされるかというと、主にMemberに関する制約生成~Simplify時だが、大きく分けると2つの関数から呼ばれる。ConstraintSystem::addValueMemberConstraintConstraintSystem::addUnresolvedValueMemberConstraintUnresolvedなExprたちいくつかの文脈でUnresolvedという単語がでてくるので確認しておく。基本的には意味どおり「まだ何を指しているかわからない状態」。arg_labels='))))))unresolved_decl_ref_expr関数など、なにか他のところで定義されたものを指しているが、分からない状態。unresolved_member_exprそのメンバーが属するstruct/class/enumなどが省略された場合はこれになる。上で言うと.aもし.aを省略せずにE.aと書いた場合にはまた別のASTになる。function_ref=unapplied)))))))unresolved_dot_exprそのメンバーが属するstruct/class/enumなどが明示的に書かれている場合には.aはこのASTになる。Unresolvedはいつ解決される?unresolved_dot_exprの場合は制約生成時にConstraintGenerator::addValueMemberConstraintで制約追加される。その際にperformMemberLookupされる。その際にperformMemberLookupされる。unresolved_decl_ref_exprの場合はExprの型チェックのPreCheckと呼ばれるフェーズで解決される。Qualified/Unqualifiedfとかのように何かのメンバーでないものを指すときは「Unqualified」。E.aのように何かのメンバーであるものを指すときは「Qualified」AST内でのNameLookup時は区別される。まとめとりあえず用語をみたので、次はもう少し具体的に型推論周りなど見てみる。