static InFlightDiagnostic diagnoseTypoCorrection(TypeChecker &tc, DeclNameLoc loc, ValueDecl *decl) { if (auto var = dyn_cast<VarDecl>(decl)) { // Suggest 'self' at the use point instead of pointing at the start // of the function. if (var->isSelfParameter()) return tc.diagnose(loc.getBaseNameLoc(), diag::note_typo_candidate, decl->getName().str()); } if (!decl->getLoc().isValid() && decl->getDeclContext()->isTypeContext()) { Decl *parentDecl = dyn_cast<ExtensionDecl>(decl->getDeclContext()); if (!parentDecl) parentDecl = cast<NominalTypeDecl>(decl->getDeclContext()); if (parentDecl->getLoc().isValid()) { StringRef kind = (isa<VarDecl>(decl) ? "property" : isa<ConstructorDecl>(decl) ? "initializer" : isa<FuncDecl>(decl) ? "method" : "member"); return tc.diagnose(parentDecl, diag::note_typo_candidate_implicit_member, decl->getName().str(), kind); } } return tc.diagnose(decl, diag::note_typo_candidate, decl->getName().str()); }
static Decl *findExplicitParentForImplicitDecl(ValueDecl *decl) { if (!decl->getLoc().isValid() && decl->getDeclContext()->isTypeContext()) { Decl *parentDecl = dyn_cast<ExtensionDecl>(decl->getDeclContext()); if (!parentDecl) parentDecl = cast<NominalTypeDecl>(decl->getDeclContext()); if (parentDecl->getLoc().isValid()) return parentDecl; } return nullptr; }