BOZConstantExpr::BOZConstantExpr(ASTContext &C, SourceLocation Loc, SourceLocation MaxLoc, llvm::StringRef Data) : ConstantExpr(BOZConstantExprClass, C.IntegerTy, Loc, MaxLoc) { unsigned Radix = 0; switch (Data[0]) { case 'B': Kind = BinaryExprClass; Radix = 2; break; case 'O': Kind = Octal; Radix = 8; break; case 'Z': case 'X': Kind = Hexadecimal; Radix = 16; break; } size_t LastQuote = Data.rfind(Data[1]); assert(LastQuote == llvm::StringRef::npos && "Invalid BOZ constant!"); llvm::StringRef NumStr = Data.slice(2, LastQuote); APInt Val; NumStr.getAsInteger(Radix, Val); Num.setValue(C, Val); }
Symbol symbol(llvm::StringRef QName) { Symbol Sym; Sym.ID = SymbolID(QName.str()); size_t Pos = QName.rfind("::"); if (Pos == llvm::StringRef::npos) { Sym.Name = QName; Sym.Scope = ""; } else { Sym.Name = QName.substr(Pos + 2); Sym.Scope = QName.substr(0, Pos + 2); } return Sym; }
// Helpers to produce fake index symbols for memIndex() or completions(). // USRFormat is a regex replacement string for the unqualified part of the USR. Symbol sym(llvm::StringRef QName, index::SymbolKind Kind, llvm::StringRef USRFormat) { Symbol Sym; std::string USR = "******"; // We synthesize a few simple cases of USRs by hand! size_t Pos = QName.rfind("::"); if (Pos == llvm::StringRef::npos) { Sym.Name = QName; Sym.Scope = ""; } else { Sym.Name = QName.substr(Pos + 2); Sym.Scope = QName.substr(0, Pos + 2); USR += "@N@" + replace(QName.substr(0, Pos), "::", "@N@"); // ns:: -> @N@ns } USR += llvm::Regex("^.*$").sub(USRFormat, Sym.Name); // e.g. func -> @F@func# Sym.ID = SymbolID(USR); Sym.SymInfo.Kind = Kind; Sym.Flags |= Symbol::IndexedForCodeCompletion; Sym.Origin = SymbolOrigin::Static; return Sym; }