void printMatchError(llvm::raw_ostream &os, const MatchResultPtr& result) { switch (result->matchCode) { case MATCH_SUCCESS : os << "matched"; break; case MATCH_CALLABLE_ERROR : { MatchCallableError *e = (MatchCallableError*)result.ptr(); os << "callable pattern \"" << shortString(e->patternExpr->asString()); os << "\" did not match \""; printStaticName(os, e->callable); os << "\""; break; } case MATCH_ARITY_ERROR : { MatchArityError *e = (MatchArityError*)result.ptr(); os << "incorrect number of arguments: expected "; if (e->variadic) os << "at least "; os << e->expectedArgs << " arguments, got " << e->gotArgs << " arguments"; break; } case MATCH_ARGUMENT_ERROR : { MatchArgumentError *e = (MatchArgumentError *)result.ptr(); os << "pattern \"" << shortString(e->arg->type->asString()); os << "\" did not match type \""; printStaticName(os, e->type.ptr()); os << "\" of argument " << e->argIndex + 1; break; } case MATCH_MULTI_ARGUMENT_ERROR : { MatchMultiArgumentError *e = (MatchMultiArgumentError *)result.ptr(); os << "variadic argument type pattern did not match types of arguments "; os << "starting at " << e->argIndex + 1; break; } case MATCH_PREDICATE_ERROR : { MatchPredicateError *e = (MatchPredicateError *)result.ptr(); os << "predicate \"" << shortString(e->predicateExpr->asString()) << "\" failed"; break; } case MATCH_BINDING_ERROR : { MatchBindingError *e = (MatchBindingError *)result.ptr(); os << "pattern \"" << shortString(e->arg->type->asString()); os << "\" did not match type \""; printStaticName(os, e->type.ptr()); os << "\" of binding " << e->argIndex + 1; break; } case MATCH_MULTI_BINDING_ERROR : { MatchMultiBindingError *e = (MatchMultiBindingError *)result.ptr(); os << "variadic binding type pattern did not match types of values "; os << "starting at " << e->argIndex + 1; break; } default : assert(false); break; } }
static SourcePtr evalToSource(Location const &location, ExprListPtr args, EnvPtr env) { llvm::SmallString<128> sourceTextBuf; llvm::raw_svector_ostream sourceTextOut(sourceTextBuf); MultiStaticPtr values = evaluateMultiStatic(args, env); for (size_t i = 0; i < values->size(); ++i) { printStaticName(sourceTextOut, values->values[i]); } llvm::SmallString<128> sourceNameBuf; llvm::raw_svector_ostream sourceNameOut(sourceNameBuf); sourceNameOut << "<eval "; printFileLineCol(sourceNameOut, location); sourceNameOut << ">"; sourceTextOut.flush(); return new Source(sourceNameOut.str(), llvm::MemoryBuffer::getMemBufferCopy(sourceTextBuf)); }
static bool shouldLogCallable(ObjectPtr callable) { if (logMatchSymbols.empty()) return false; ModulePtr m = staticModule(callable); if (!m) return false; string name; llvm::raw_string_ostream sout(name); printStaticName(sout, callable); sout.flush(); pair<string,string> specificKey = make_pair(m->moduleName, name); pair<string,string> moduleGlobKey = make_pair(m->moduleName, string("*")); pair<string,string> anyModuleKey = make_pair(string("*"), name); return logMatchSymbols.find(specificKey) != logMatchSymbols.end() || logMatchSymbols.find(moduleGlobKey) != logMatchSymbols.end() || logMatchSymbols.find(anyModuleKey) != logMatchSymbols.end(); }