std::string TypeVar::toString() const { switch (kind()) { case NAMEDVAR: return makeString("TypeVar[NAMED](type = %s, name = %s)", namedType().toString().c_str(), name().c_str()); case PATTERNVAR: return makeString("TypeVar[PATTERN](type = %s, typeVarList = %s)", patternType().toString().c_str(), makeArrayString(*(typeVarList())).c_str()); case ANYVAR: return "TypeVar[ANY]()"; default: return "TypeVar[UNKNOWN]()"; } }
std::string Value::toString() const { switch (kind()) { case SELF: return "self"; case THIS: return "this"; case CONSTANT: return makeString("Constant(%s)", constant().toString().c_str()); case ALIAS: return makeString("Alias(alias: %s, templateArguments: %s)", alias().toString().c_str(), makeArrayString(aliasTemplateArguments()).c_str()); case PREDICATE: return makeString("Predicate(%s)", predicate().toString().c_str()); case LOCALVAR: return makeString("LocalVar(%s)", localVar().toString().c_str()); case REINTERPRET: return makeString("Reinterpret(value: %s)", reinterpretOperand().toString().c_str()); case DEREF_REFERENCE: return makeString("DerefReference(%s)", derefOperand().toString().c_str()); case TERNARY: return makeString("Ternary(cond: %s, ifTrue: %s, ifFalse: %s)", ternaryCondition().toString().c_str(), ternaryIfTrue().toString().c_str(), ternaryIfFalse().toString().c_str()); case CAST: return makeString("Cast(value: %s, targetType: %s)", castOperand().toString().c_str(), castTargetType()->toString().c_str()); case POLYCAST: return makeString("PolyCast(value: %s, targetType: %s)", polyCastOperand().toString().c_str(), polyCastTargetType()->toString().c_str()); case INTERNALCONSTRUCT: return makeString("InternalConstruct(args: %s)", makeArrayString(internalConstructParameters()).c_str()); case MEMBERACCESS: return makeString("MemberAccess(object: %s, var: %s)", memberAccessObject().toString().c_str(), memberAccessVar().toString().c_str()); case BIND_REFERENCE: return makeString("BindReference(value: %s)", bindReferenceOperand().toString().c_str()); case TYPEREF: return makeString("TypeRef(targetType: %s)", typeRefType()->toString().c_str()); case TEMPLATEVARREF: return makeString("TemplateVarRef(templateVar: %s)", templateVar()->toString().c_str()); case CALL: return makeString("Call(funcValue: %s, args: %s)", callValue().toString().c_str(), makeArrayString(callParameters()).c_str()); case FUNCTIONREF: return makeString("FunctionRef(name: %s, type: %s, parentType: %s, templateArgs: %s)", functionRefFunction().fullName().toString().c_str(), type()->toString().c_str(), functionRefParentType() != nullptr ? functionRefParentType()->toString().c_str() : "[NONE]", makeArrayString(functionRefTemplateArguments()).c_str()); case TEMPLATEFUNCTIONREF: return makeString("TemplateFunctionRef(name: %s, parentType: %s)", templateFunctionRefName().c_str(), templateFunctionRefParentType()->toString().c_str()); case METHODOBJECT: return makeString("MethodObject(method: %s, object: %s)", methodObject().toString().c_str(), methodOwner().toString().c_str()); case INTERFACEMETHODOBJECT: return makeString("InterfaceMethodObject(method: %s, object: %s)", interfaceMethodObject().toString().c_str(), interfaceMethodOwner().toString().c_str()); case STATICINTERFACEMETHODOBJECT: return makeString("StaticInterfaceMethodObject(method: %s, typeRef: %s)", staticInterfaceMethodObject().toString().c_str(), staticInterfaceMethodOwner().toString().c_str()); case CAPABILITYTEST: return makeString("CapabilityTest(checkType: %s, capabilityType: %s)", capabilityTestCheckType()->toString().c_str(), capabilityTestCapabilityType()->toString().c_str()); case Value::ARRAYLITERAL: return makeString("ArrayLiteral(type: %s, values: %s)", type()->toString().c_str(), makeArrayString(arrayLiteralValues()).c_str()); case NEW: return makeString("New(placementArg: %s, operand: %s)", newPlacementArg().toString().c_str(), newOperand().toString().c_str()); case CASTDUMMYOBJECT: return makeString("[CAST DUMMY OBJECT (FOR SEMANTIC ANALYSIS)](type: %s)", type()->toString().c_str()); } locic_unreachable("Unknown value kind."); }
std::string Value::toDiagString() const { switch (kind()) { case SELF: return "self"; case THIS: return "this"; case CONSTANT: return constant().toString(); case ALIAS: return alias().toString(); case PREDICATE: return predicate().toString(); case LOCALVAR: return localVar().name().asStdString(); case REINTERPRET: return reinterpretOperand().toDiagString(); case DEREF_REFERENCE: return makeString("<deref> %s", derefOperand().toDiagString().c_str()); case TERNARY: return makeString("%s ? %s : %s", ternaryCondition().toDiagString().c_str(), ternaryIfTrue().toDiagString().c_str(), ternaryIfFalse().toDiagString().c_str()); case CAST: return castOperand().toDiagString(); case POLYCAST: return polyCastOperand().toDiagString(); case INTERNALCONSTRUCT: return makeString("@(%s)", makeArrayString(internalConstructParameters()).c_str()); case MEMBERACCESS: return makeString("%s.%s", memberAccessObject().toDiagString().c_str(), memberAccessVar().name().c_str()); case BIND_REFERENCE: return makeString("<bind> %s", bindReferenceOperand().toDiagString().c_str()); case TYPEREF: return typeRefType()->toDiagString(); case TEMPLATEVARREF: return templateVar()->fullName().last().asStdString(); case CALL: return makeString("%s(%s)", callValue().toDiagString().c_str(), makeArrayString(callParameters()).c_str()); case FUNCTIONREF: return functionRefFunction().fullName().toString(); case TEMPLATEFUNCTIONREF: return makeString("%s::%s", templateFunctionRefParentType()->toDiagString().c_str(), templateFunctionRefName().c_str()); case METHODOBJECT: return makeString("%s.%s", methodOwner().toDiagString().c_str(), methodObject().toDiagString().c_str()); case INTERFACEMETHODOBJECT: return makeString("%s.%s", interfaceMethodOwner().toDiagString().c_str(), interfaceMethodObject().toDiagString().c_str()); case STATICINTERFACEMETHODOBJECT: return makeString("%s.%s", staticInterfaceMethodOwner().toDiagString().c_str(), staticInterfaceMethodObject().toDiagString().c_str()); case CAPABILITYTEST: return makeString("%s : %s", capabilityTestCheckType()->toDiagString().c_str(), capabilityTestCapabilityType()->toDiagString().c_str()); case Value::ARRAYLITERAL: return makeString("{ %s }", makeArrayString(arrayLiteralValues()).c_str()); case NEW: return makeString("new(%s) %s", newPlacementArg().toDiagString().c_str(), newOperand().toDiagString().c_str()); case CASTDUMMYOBJECT: locic_unreachable("Shouldn't reach CASTDUMMYOBJECT."); } locic_unreachable("Unknown value kind."); }
std::string Scope::toString() const { return makeString("Scope(vars: %s, statements: %s)", makeArrayPtrString(variables_).c_str(), makeArrayString(statementList_).c_str()); }