static void dumpClassMember( Stream &stream, const AbstractClassRep::Field& field ) { stream.writeText( "/*!\r\n" ); if( field.pFieldDocs && field.pFieldDocs[ 0 ] ) { stream.writeText( "@brief " ); String docs( field.pFieldDocs ); S32 newline = docs.find( '\n' ); if( newline == -1 ) stream.writeText( field.pFieldDocs ); else { String brief = docs.substr( 0, newline ); String body = docs.substr( newline + 1 ); stream.writeText( brief ); stream.writeText( "\r\n\r\n" ); stream.writeText( body ); } stream.writeText( "\r\n" ); } const bool isDeprecated = ( field.type == AbstractClassRep::DeprecatedFieldType ); if( isDeprecated ) stream.writeText( "@deprecated This member is deprecated and its value is always undefined.\r\n" ); stream.writeText( "*/\r\n" ); ConsoleBaseType* cbt = ConsoleBaseType::getType( field.type ); const char* type = ( cbt ? cbt->getTypeClassName() : "" ); if( field.elementCount > 1 ) stream.writeText( String::ToString( "%s %s[ %i ];\r\n", isDeprecated ? "deprecated" : type, field.pFieldname, field.elementCount ) ); else stream.writeText( String::ToString( "%s %s;\r\n", isDeprecated ? "deprecated" : type, field.pFieldname ) ); }
GuiInspectorField* GuiInspectorGroup::constructField( S32 fieldType ) { // See if we can construct a field of this type ConsoleBaseType *cbt = ConsoleBaseType::getType(fieldType); if( !cbt ) return NULL; // Alright, is it a datablock? if(cbt->isDatablock()) { // Default to GameBaseData StringTableEntry typeClassName = cbt->getTypeClassName(); if( mParent->getNumInspectObjects() == 1 && !dStricmp(typeClassName, "GameBaseData") ) { // Try and setup the classname based on the object type char className[256]; dSprintf(className,256,"%sData", mParent->getInspectObject( 0 )->getClassName()); // Walk the ACR list and find a matching class if any. AbstractClassRep *walk = AbstractClassRep::getClassList(); while(walk) { if(!dStricmp(walk->getClassName(), className)) break; walk = walk->getNextClass(); } // We found a valid class if (walk) typeClassName = walk->getClassName(); } GuiInspectorDatablockField *dbFieldClass = new GuiInspectorDatablockField( typeClassName ); if( dbFieldClass != NULL ) { // return our new datablock field with correct datablock type enumeration info return dbFieldClass; } } // Nope, not a datablock. So maybe it has a valid inspector field override we can use? if(!cbt->getInspectorFieldType()) // Nothing, so bail. return NULL; // Otherwise try to make it! ConsoleObject *co = create(cbt->getInspectorFieldType()); GuiInspectorField *gif = dynamic_cast<GuiInspectorField*>(co); if(!gif) { // Wasn't appropriate type, bail. delete co; return NULL; } return gif; }
static void dumpVariable( Stream& stream, Dictionary::Entry* entry, const char* inClass = NULL ) { // Skip variables defined in script. if( entry->type < 0 ) return; // Skip internals... don't export them. if ( entry->mUsage && ( dStrstr( entry->mUsage, "@hide" ) || dStrstr( entry->mUsage, "@internal" ) ) ) return; // Split up qualified name. Vector< String > nameComponents; String( entry->name ).split( "::", nameComponents ); if( !nameComponents.size() ) // Safety check. return; // Match filter. if( inClass ) { // Make sure first qualifier in name components is a // namespace qualifier matching the given class name. if( nameComponents.size() <= 1 || dStricmp( nameComponents.first().c_str() + 1, inClass ) != 0 ) // Skip '$'. return; } else { // Make sure, this is *not* in a class namespace. if( nameComponents.size() > 1 && Con::lookupNamespace( nameComponents.first().c_str() + 1 )->mClassRep ) return; } // Skip variables for which we can't decipher their type. ConsoleBaseType* type = ConsoleBaseType::getType( entry->type ); if( !type ) { Con::errorf( "Can't find type for variable '%s'", entry->name ); return; } // Write doc comment. stream.writeText( "/*!\r\n" ); if( !inClass ) { stream.writeText( "@var " ); stream.writeText( type->getTypeClassName() ); stream.writeText( " " ); stream.writeText( entry->name ); stream.writeText( ";\r\n" ); } dumpDoc( stream, entry->mUsage ); stream.writeText( "*/\r\n" ); // Write definition. const U32 numNameComponents = nameComponents.size(); if( !inClass && numNameComponents > 1 ) for( U32 i = 0; i < ( numNameComponents - 1 ); ++ i ) { stream.writeText( "namespace " ); stream.writeText( nameComponents[ i ] ); stream.writeText( " { " ); } if( inClass ) stream.writeText( "static " ); if( entry->mIsConstant ) stream.writeText( "const " ); stream.writeText( type->getTypeClassName() ); stream.writeText( " " ); stream.writeText( nameComponents.last() ); stream.writeText( ";" ); if( !inClass && numNameComponents > 1 ) for( U32 i = 0; i < ( numNameComponents - 1 ); ++ i ) stream.writeText( " } " ); stream.writeText( "\r\n" ); }