Example #1
0
		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]()";
			}
		}
Example #2
0
		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.");
		}
Example #3
0
		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.");
		}
Example #4
0
		std::string Scope::toString() const {
			return makeString("Scope(vars: %s, statements: %s)",
					makeArrayPtrString(variables_).c_str(),
					makeArrayString(statementList_).c_str());
		}