void Workflow_CreatePointerVariable(Ptr<workflow::WfClassDeclaration> ctorClass, GlobalStringKey name, description::ITypeDescriptor* type, description::ITypeInfo* typeOverride) { auto var = MakePtr<WfVariableDeclaration>(); var->name.value = name.ToString(); { auto att = MakePtr<WfAttribute>(); att->category.value = L"cpp"; att->name.value = L"Protected"; var->attributes.Add(att); } if (typeOverride) { var->type = GetTypeFromTypeInfo(typeOverride); } if (!var->type) { if (auto ctors = type->GetConstructorGroup()) { if (ctors->GetMethodCount() > 0) { auto ctor = ctors->GetMethod(0); var->type = GetTypeFromTypeInfo(ctor->GetReturn()); } } } if (!var->type) { auto elementType = MakePtr<TypeDescriptorTypeInfo>(type, TypeInfoHint::Normal); auto pointerType = MakePtr<RawPtrTypeInfo>(elementType); var->type = GetTypeFromTypeInfo(pointerType.Obj()); } auto literal = MakePtr<WfLiteralExpression>(); literal->value = WfLiteralValue::Null; var->expression = literal; auto member = MakePtr<WfClassMember>(); member->kind = WfClassMemberKind::Normal; member->declaration = var; ctorClass->members.Add(member); }
Ptr<workflow::WfStatement> Workflow_InstallEvalEvent(GlobalStringKey variableName, description::IEventInfo* eventInfo, Ptr<workflow::WfStatement> evalStatement) { auto func = Workflow_GenerateEventHandler(eventInfo); auto funcBlock = MakePtr<WfBlockStatement>(); funcBlock->statements.Add(evalStatement); func->statement = funcBlock; auto subBlock = MakePtr<WfBlockStatement>(); { auto eventHandlerLambda = MakePtr<WfFunctionExpression>(); eventHandlerLambda->function = func; auto eventHandler = MakePtr<WfVariableDeclaration>(); eventHandler->name.value = L"<event-handler>"; eventHandler->expression = eventHandlerLambda; auto stat = MakePtr<WfVariableStatement>(); stat->variable = eventHandler; subBlock->statements.Add(stat); } { auto var = MakePtr<WfReferenceExpression>(); var->name.value = variableName.ToString(); auto member = MakePtr<WfMemberExpression>(); member->parent = var; member->name.value = eventInfo->GetName(); auto eventHandler = MakePtr<WfReferenceExpression>(); eventHandler->name.value = L"<event-handler>"; auto attachEvent = MakePtr<WfAttachEventExpression>(); attachEvent->event = member; attachEvent->function = eventHandler; auto stat = MakePtr<WfExpressionStatement>(); stat->expression = attachEvent; subBlock->statements.Add(stat); } return subBlock; }
Ptr<workflow::WfStatement> Workflow_InstallEvent(GlobalStringKey variableName, description::IEventInfo* eventInfo, const WString& handlerName) { vint count = eventInfo->GetHandlerType()->GetElementType()->GetGenericArgumentCount() - 1; auto subBlock = MakePtr<WfBlockStatement>(); { auto var = MakePtr<WfReferenceExpression>(); var->name.value = variableName.ToString(); auto member = MakePtr<WfMemberExpression>(); member->parent = var; member->name.value = eventInfo->GetName(); auto refThis = MakePtr<WfReferenceExpression>(); refThis->name.value = L"<this>"; auto handler = MakePtr<WfMemberExpression>(); handler->parent = refThis; handler->name.value = handlerName; auto call = MakePtr<WfCallExpression>(); call->function = handler; for (vint i = 0; i < count; i++) { auto argument = MakePtr<WfOrderedNameExpression>(); argument->name.value = L"$" + itow(i + 1); call->arguments.Add(argument); } auto eventHandler = MakePtr<WfOrderedLambdaExpression>(); eventHandler->body = call; auto attachEvent = MakePtr<WfAttachEventExpression>(); attachEvent->event = member; attachEvent->function = eventHandler; auto stat = MakePtr<WfExpressionStatement>(); stat->expression = attachEvent; subBlock->statements.Add(stat); } return subBlock; }
Ptr<workflow::WfStatement> Workflow_InstallBindProperty(GlobalStringKey variableName, description::IPropertyInfo* propertyInfo, Ptr<workflow::WfExpression> bindExpression) { auto subBlock = MakePtr<WfBlockStatement>(); { auto refThis = MakePtr<WfReferenceExpression>(); refThis->name.value = L"<this>"; auto member = MakePtr<WfMemberExpression>(); member->parent = refThis; member->name.value = L"AddSubscription"; auto call = MakePtr<WfCallExpression>(); call->function = member; call->arguments.Add(bindExpression); auto var = MakePtr<WfVariableDeclaration>(); var->name.value = L"<created-subscription>"; var->expression = call; auto stat = MakePtr<WfVariableStatement>(); stat->variable = var; subBlock->statements.Add(stat); } { auto callback = MakePtr<WfFunctionDeclaration>(); callback->anonymity = WfFunctionAnonymity::Anonymous; callback->returnType = GetTypeFromTypeInfo(TypeInfoRetriver<void>::CreateTypeInfo().Obj());; { auto arg = MakePtr<WfFunctionArgument>(); arg->name.value = L"<value>"; arg->type = GetTypeFromTypeInfo(TypeInfoRetriver<Value>::CreateTypeInfo().Obj()); callback->arguments.Add(arg); } auto callbackBlock = MakePtr<WfBlockStatement>(); callback->statement = callbackBlock; { auto refSubscribee = MakePtr<WfReferenceExpression>(); refSubscribee->name.value = variableName.ToString(); auto member = MakePtr<WfMemberExpression>(); member->parent = refSubscribee; member->name.value = propertyInfo->GetName(); auto var = MakePtr<WfVariableDeclaration>(); var->name.value = L"<old>"; var->expression = member; auto stat = MakePtr<WfVariableStatement>(); stat->variable = var; callbackBlock->statements.Add(stat); } { ITypeInfo* propertyType = propertyInfo->GetReturn(); if (propertyInfo->GetSetter() && propertyInfo->GetSetter()->GetParameterCount() == 1) { propertyType = propertyInfo->GetSetter()->GetParameter(0)->GetType(); } auto refValue = MakePtr<WfReferenceExpression>(); refValue->name.value = L"<value>"; auto cast = MakePtr<WfTypeCastingExpression>(); cast->strategy = WfTypeCastingStrategy::Strong; cast->expression = refValue; cast->type = GetTypeFromTypeInfo(propertyType); auto var = MakePtr<WfVariableDeclaration>(); var->name.value = L"<new>"; var->expression = cast; auto stat = MakePtr<WfVariableStatement>(); stat->variable = var; callbackBlock->statements.Add(stat); } { auto refOld = MakePtr<WfReferenceExpression>(); refOld->name.value = L"<old>"; auto refNew = MakePtr<WfReferenceExpression>(); refNew->name.value = L"<new>"; auto compare = MakePtr<WfBinaryExpression>(); compare->op = WfBinaryOperator::EQ; compare->first = refOld; compare->second = refNew; auto ifStat = MakePtr<WfIfStatement>(); ifStat->expression = compare; callbackBlock->statements.Add(ifStat); auto ifBlock = MakePtr<WfBlockStatement>(); ifStat->trueBranch = ifBlock; auto returnStat = MakePtr<WfReturnStatement>(); ifBlock->statements.Add(returnStat); } { auto refSubscribee = MakePtr<WfReferenceExpression>(); refSubscribee->name.value = variableName.ToString(); auto member = MakePtr<WfMemberExpression>(); member->parent = refSubscribee; member->name.value = propertyInfo->GetName(); auto refNew = MakePtr<WfReferenceExpression>(); refNew->name.value = L"<new>"; auto assign = MakePtr<WfBinaryExpression>(); assign->op = WfBinaryOperator::Assign; assign->first = member; assign->second = refNew; auto stat = MakePtr<WfExpressionStatement>(); stat->expression = assign; callbackBlock->statements.Add(stat); } auto funcExpr = MakePtr<WfFunctionExpression>(); funcExpr->function = callback; auto refThis = MakePtr<WfReferenceExpression>(); refThis->name.value = L"<created-subscription>"; auto member = MakePtr<WfMemberExpression>(); member->parent = refThis; member->name.value = L"Subscribe"; auto call = MakePtr<WfCallExpression>(); call->function = member; call->arguments.Add(funcExpr); auto stat = MakePtr<WfExpressionStatement>(); stat->expression = call; subBlock->statements.Add(stat); } { auto refThis = MakePtr<WfReferenceExpression>(); refThis->name.value = L"<created-subscription>"; auto member = MakePtr<WfMemberExpression>(); member->parent = refThis; member->name.value = L"Update"; auto call = MakePtr<WfCallExpression>(); call->function = member; auto stat = MakePtr<WfExpressionStatement>(); stat->expression = call; subBlock->statements.Add(stat); } return subBlock; }