Avatar
omochimetaru 4/8/2023 2:25 AM
診断メッセージ c++ ERROR(existential_requires_any,none, "use of %select{protocol |}2%0 as a type must be written %1", (Type, Type, bool)) https://github.com/apple/swift/blob/main/include/swift/AST/DiagnosticsSema.def#L5159-L5161
2:26 AM
any不足のエラーその1 any付けるfixitを構築してる c++ std::string fix; llvm::raw_string_ostream OS(fix); if (needsParens) OS << "("; ExistentialTypeRepr existential(SourceLoc(), replaceRepr); existential.print(OS); if (needsParens) OS << ")"; if (auto *proto = dyn_cast_or_null<ProtocolDecl>(T->getBoundDecl())) { if (proto->existentialRequiresAny() && !Ctx.LangOpts.hasFeature(Feature::ImplicitSome)) { Ctx.Diags.diagnose(T->getNameLoc(), diag::existential_requires_any, proto->getDeclaredInterfaceType(), proto->getDeclaredExistentialType(), /*isAlias=*/false) .fixItReplace(replaceRepr->getSourceRange(), fix); } } https://github.com/apple/swift/blob/1b6d160c5ce9b55cf82bd4ee0df51774d0410e03/lib/Sema/TypeCheckType.cpp#L5201 (edited)
2:31 AM
any不足のエラーその2 こっちはfixitが無い・・・? c++ auto parameterized = ParameterizedProtocolType::get(ctx, protoType, argTys); diags.diagnose(loc, diag::existential_requires_any, parameterized, ExistentialType::get(parameterized), /*isAlias=*/isa<TypeAliasType>(type.getPointer())); https://github.com/apple/swift/blob/1b6d160c5ce9b55cf82bd4ee0df51774d0410e03/lib/Sema/TypeCheckType.cpp#L778-L785
2:32 AM
丸括弧が追加されるパターンかどうかの判定 c++ needsParens = existentialNeedsParens(*parentIt);
2:33 AM
c++ bool existentialNeedsParens(TypeRepr *parent) { switch (parent->getKind()) { case TypeReprKind::Optional: case TypeReprKind::Protocol: return true; case TypeReprKind::Metatype: case TypeReprKind::Attributed: case TypeReprKind::Error: case TypeReprKind::Function: case TypeReprKind::Ownership: case TypeReprKind::Composition: case TypeReprKind::OpaqueReturn: case TypeReprKind::NamedOpaqueReturn: case TypeReprKind::Existential: case TypeReprKind::SimpleIdent: case TypeReprKind::GenericIdent: case TypeReprKind::Member: case TypeReprKind::Dictionary: case TypeReprKind::ImplicitlyUnwrappedOptional: case TypeReprKind::Tuple: case TypeReprKind::Fixed: case TypeReprKind::Array: case TypeReprKind::SILBox: case TypeReprKind::Isolated: case TypeReprKind::Placeholder: case TypeReprKind::CompileTimeConst: case TypeReprKind::Vararg: case TypeReprKind::Pack: case TypeReprKind::PackExpansion: case TypeReprKind::PackElement: return false; } }
2:33 AM
↑これ, case TypeReprKind::ImplicitlyUnwrappedOptional: を上にもってくるだけでなんかうまくいったりしねえかなw (edited)
2:34 AM
case TypeReprKind::Composition: のパターンもあるけどこれはそう簡単な話かどうか微妙だな
2:37 AM
@treastrain / Tanaka.R とりあえず、コンパイラの中に実装されてる診断エラーおよびそのFixItの不具合である事がわかったので、githubのapple/swiftにissueを立てると良いと思います。 100%再現するとしている2つのケースについて、それぞれ別のissueにするのが良いと思います。 1件目については僕でも直せるかもしれない。
👍 1
2:38 AM
ときどき再現系は、確定条件がほしいですねえ
2:39 AM
ただ、「file contains invalid or unrecognized Swift syntax」は特徴的なメッセージなので、再現できなくても調べられるかもしれないし、これも報告しちゃっても良いかも。 (edited)
2:41 AM
「file contains invalid unrecognized Swift syntax」はGitHub全体から検索しても見つからない・・・ Xcode内部にあるメッセージなのかなあ