bool HandleComment(Preprocessor &PP, SourceRange Range) override { StringRef Text = Lexer::getSourceText(CharSourceRange::getCharRange(Range), PP.getSourceManager(), PP.getLangOpts()); if (!Text.consume_front(IWYUPragma)) return false; // FIXME(ioeric): resolve the header and store actual file path. For now, // we simply assume the written header is suitable to be #included. Includes->addMapping(PP.getSourceManager().getFilename(Range.getBegin()), isLiteralInclude(Text) ? Text.str() : ("\"" + Text + "\"").str()); return false; }
llvm::Expected<HeaderFile> toHeaderFile(llvm::StringRef Header, llvm::StringRef HintPath) { if (isLiteralInclude(Header)) return HeaderFile{Header.str(), /*Verbatim=*/true}; auto U = URI::parse(Header); if (!U) return U.takeError(); auto IncludePath = URI::includeSpelling(*U); if (!IncludePath) return IncludePath.takeError(); if (!IncludePath->empty()) return HeaderFile{std::move(*IncludePath), /*Verbatim=*/true}; auto Resolved = URI::resolve(*U, HintPath); if (!Resolved) return Resolved.takeError(); return HeaderFile{std::move(*Resolved), /*Verbatim=*/false}; }
bool HeaderFile::valid() const { return (Verbatim && isLiteralInclude(File)) || (!Verbatim && llvm::sys::path::is_absolute(File)); }