/********************************* * * * ge_ProcessQuery * * * *********************************/ static void ge_ProcessQuery(PE_QUERY query) { switch (query.tag) { case STRNG : st_PrintEntryInfo(st_NameToKey(query.info.query)); break; case ABOUT : clearBuff(); appendBuff(CHARITY_CONT_PROMPT "Charity Interpreter version "CHARITY_VERSION " was written by \n" CHARITY_CONT_PROMPT " Charles Tuckey, \n" CHARITY_CONT_PROMPT " Peter Vesely and \n" CHARITY_CONT_PROMPT " Barry Yee \n" CHARITY_CONT_PROMPT "from May to November, 1995.\n"); outputBuff(stdout); break; case SHOWCOMB : st_PrintEntryInfo(st_NameToKey(query.info.showcomb)); if (isFunction(query.info.showcomb)) { printMsg(MSG, "COMBINATOR DEFN for %s", query.info.showcomb); CodeTableShowComb(query.info.showcomb); } else if (isDatatype(query.info.showcomb)) { st_ShowDatatypeCombinators(st_NameToKey(query.info.showcomb)); } else ; /* do nothing */ break; case DUMPTABLE: st_DumpTable(); break; case REPLACE: if (gb_ReplaceFunctions) printMsg(MSG, "Functions replaced silently."); else printMsg(MSG, "User prompted to replace functions."); printMsg(MSG, "User prompted to replace datatypes."); break; case INCLUDEDIRS: printMsg(MSG,"Search path is %L.",(LIST *)g_strList_IncludeDirs); break; case SHOWMEM: MemDisplayState(); break; case QUERY: ge_ShowHelp(QUERY); break; default: printMsg(FATAL_MSG, "ge_ProcessQuery - Invalid tag (%d)", query.tag); } }
DatatypeType::DatatypeType(const Type& t) throw(IllegalArgumentException) : Type(t) { PrettyCheckArgument(isNull() || isDatatype(), this); }
SEM::Var* ConvertVar(Context& context, const Debug::VarInfo::Kind varKind, const AST::Node<AST::TypeVar>& astTypeVarNode) { const auto& location = astTypeVarNode.location(); switch (astTypeVarNode->kind()) { case AST::TypeVar::ANYVAR: { throw ErrorException("'Any' vars not yet implemented for uninitialised variables."); } case AST::TypeVar::NAMEDVAR: { const auto& varName = astTypeVarNode->name(); // Search all scopes outside of the current scope. const auto searchStartPosition = 1; if (varKind != Debug::VarInfo::VAR_MEMBER && !performSearch(context, Name::Relative() + varName, searchStartPosition).isNone()) { throw ErrorException(makeString("Variable '%s' shadows existing object at position %s.", varName.c_str(), location.toString().c_str())); } const auto varType = ConvertType(context, astTypeVarNode->namedType()); // 'final' keyword uses a different lval type (which doesn't support // moving or re-assignment). const bool isFinalLval = astTypeVarNode->isFinal(); const auto lvalType = makeLvalType(context, isFinalLval, varType); const auto var = SEM::Var::Basic(varType, lvalType); var->setMarkedUnused(astTypeVarNode->isUnused()); var->setOverrideConst(astTypeVarNode->isOverrideConst()); attachVar(context, varName, astTypeVarNode, var, varKind); return var; } case AST::TypeVar::PATTERNVAR: { const auto varType = ConvertType(context, astTypeVarNode->patternType())->resolveAliases(); if (!varType->isDatatype()) { throw ErrorException(makeString("Can't pattern match for non-datatype '%s' at position %s.", varType->toString().c_str(), location.toString().c_str())); } const auto& astChildTypeVars = astTypeVarNode->typeVarList(); const auto& typeChildVars = varType->getObjectType()->variables(); if (astChildTypeVars->size() != typeChildVars.size()) { throw ErrorException(makeString("%llu pattern match children specified; %llu expected (for type '%s') at position %s.", (unsigned long long) astChildTypeVars->size(), (unsigned long long) typeChildVars.size(), varType->toString().c_str(), location.toString().c_str())); } const auto templateVarMap = varType->generateTemplateVarMap(); std::vector<SEM::Var*> children; for (size_t i = 0; i < typeChildVars.size(); i++) { const auto& astVar = astChildTypeVars->at(i); children.push_back(ConvertVar(context, varKind, astVar)); } return SEM::Var::Composite(varType, children); } } std::terminate(); }