int asCBuilder::CheckNameConflictMember(asCDataType &dt, const char *name, asCScriptNode *node, asCScriptCode *code) { // It's not necessary to check against object types // Check against other members asCObjectType *t = dt.GetObjectType(); // TODO: Improve linear search asCArray<asCProperty *> &props = t->properties; for( asUINT n = 0; n < props.GetLength(); n++ ) { if( props[n]->name == name ) { if( code ) { int r, c; code->ConvertPosToRowCol(node->tokenPos, &r, &c); asCString str; str.Format(TXT_NAME_CONFLICT_s_OBJ_PROPERTY, name); WriteError(code->name.AddressOf(), str.AddressOf(), r, c); } return -1; } } // TODO: Property names must be checked against method names return 0; }
// internal bool asCModule::AreTypesEqual(const asCDataType &a, const asCDataType &b, asCArray<sObjectTypePair> &equals) { if( !a.IsEqualExceptInterfaceType(b) ) return false; asCObjectType *ai = a.GetObjectType(); asCObjectType *bi = b.GetObjectType(); if( ai && ai->IsInterface() ) { // If the interface is in the equals list, then the pair must match the pair in the list bool found = false; unsigned int e; for( e = 0; e < equals.GetLength(); e++ ) { if( equals[e].a == ai ) { found = true; break; } } if( found ) { // Do the pairs match? if( equals[e].b != bi ) return false; } else { // Assume they are equal from now on sObjectTypePair pair = {ai, bi}; equals.PushLast(pair); } } return true; }