| 3030 | } |
| 3031 | |
| 3032 | void asCBuilder::AddInterfaceFromMixinToClass(sClassDeclaration *decl, asCScriptNode *errNode, sMixinClass *mixin) |
| 3033 | { |
| 3034 | // Determine what interfaces that the mixin implements |
| 3035 | asCScriptNode *node = mixin->node; |
| 3036 | asASSERT(node->nodeType == snClass); |
| 3037 | |
| 3038 | // Skip the name of the mixin |
| 3039 | node = node->firstChild->next; |
| 3040 | |
| 3041 | |
| 3042 | while( node && node->nodeType == snIdentifier ) |
| 3043 | { |
| 3044 | bool ok = true; |
| 3045 | asSNameSpace *ns; |
| 3046 | asCString name; |
| 3047 | if( GetNamespaceAndNameFromNode(node, mixin->script, mixin->ns, ns, name) < 0 ) |
| 3048 | ok = false; |
| 3049 | else |
| 3050 | { |
| 3051 | // Find the object type for the interface |
| 3052 | asCObjectType *objType = GetObjectType(name.AddressOf(), ns); |
| 3053 | |
| 3054 | // Check that the object type is an interface |
| 3055 | if( objType && objType->IsInterface() ) |
| 3056 | { |
| 3057 | // Only add the interface if the class doesn't already implement it |
| 3058 | if( !decl->typeInfo->Implements(objType) ) |
| 3059 | AddInterfaceToClass(decl, errNode, objType); |
| 3060 | } |
| 3061 | else |
| 3062 | { |
| 3063 | WriteError(TXT_MIXIN_CLASS_CANNOT_INHERIT, mixin->script, node); |
| 3064 | ok = false; |
| 3065 | } |
| 3066 | } |
| 3067 | |
| 3068 | if( !ok ) |
| 3069 | { |
| 3070 | // Remove this node so the error isn't reported again |
| 3071 | asCScriptNode *delNode = node; |
| 3072 | node = node->prev; |
| 3073 | delNode->DisconnectParent(); |
| 3074 | delNode->Destroy(engine); |
| 3075 | } |
| 3076 | |
| 3077 | node = node->next; |
| 3078 | } |
| 3079 | } |
| 3080 | |
| 3081 | void asCBuilder::AddInterfaceToClass(sClassDeclaration *decl, asCScriptNode *errNode, asCObjectType *intfType) |
| 3082 | { |
nothing calls this directly
no test coverage detected