void asCBuilder::ParseScripts() { asCArray<asCParser*> parsers; // Parse all the files as if they were one asUINT n = 0; for( n = 0; n < scripts.GetLength(); n++ ) { asCParser *parser = new asCParser(this); parsers.PushLast(parser); // Parse the script file parser->ParseScript(scripts[n]); } if( numErrors == 0 ) { // Find all type declarations for( n = 0; n < scripts.GetLength(); n++ ) { asCScriptNode *node = parsers[n]->GetScriptNode(); // Find structure definitions first node = node->firstChild; while( node ) { asCScriptNode *next = node->next; if( node->nodeType == snClass ) { node->DisconnectParent(); RegisterClass(node, scripts[n]); } else if( node->nodeType == snInterface ) { node->DisconnectParent(); RegisterInterface(node, scripts[n]); } node = next; } } // Register script methods found in the structures for( n = 0; n < classDeclarations.GetLength(); n++ ) { sClassDeclaration *decl = classDeclarations[n]; asCScriptNode *node = decl->node->firstChild->next; // Skip list of classes and interfaces while( node && node->nodeType == snIdentifier ) node = node->next; while( node ) { asCScriptNode *next = node->next; if( node->nodeType == snFunction ) { node->DisconnectParent(); RegisterScriptFunction(module->GetNextFunctionId(), node, decl->script, decl->objType); } node = next; } // Make sure the default constructor exists for classes if( decl->objType->beh.construct == engine->scriptTypeBehaviours.beh.construct ) { AddDefaultConstructor(decl->objType, decl->script); } } // Register script methods found in the interfaces for( n = 0; n < interfaceDeclarations.GetLength(); n++ ) { sClassDeclaration *decl = interfaceDeclarations[n]; asCScriptNode *node = decl->node->firstChild->next; while( node ) { asCScriptNode *next = node->next; if( node->nodeType == snFunction ) { node->DisconnectParent(); RegisterScriptFunction(module->GetNextFunctionId(), node, decl->script, decl->objType, true); } node = next; } } // Find other global nodes for( n = 0; n < scripts.GetLength(); n++ ) { // Find other global nodes asCScriptNode *node = parsers[n]->GetScriptNode(); node = node->firstChild; while( node ) { asCScriptNode *next = node->next; node->DisconnectParent(); if( node->nodeType == snFunction ) { RegisterScriptFunction(module->GetNextFunctionId(), node, scripts[n]); } else if( node->nodeType == snGlobalVar ) { RegisterGlobalVar(node, scripts[n]); } else if( node->nodeType == snImport ) { RegisterImportedFunction(module->GetNextImportedFunctionId(), node, scripts[n]); } else { // Unused script node int r, c; scripts[n]->ConvertPosToRowCol(node->tokenPos, &r, &c); WriteWarning(scripts[n]->name.AddressOf(), TXT_UNUSED_SCRIPT_NODE, r, c); delete node; } node = next; } } } for( n = 0; n < parsers.GetLength(); n++ ) delete parsers[n]; }
void asCBuilder::ParseScripts() { asCArray<asCParser*> parsers; // Parse all the files as if they were one asUINT n = 0; for( n = 0; n < scripts.GetLength(); n++ ) { asCParser *parser = new asCParser(this); parsers.PushLast(parser); // Parse the script file parser->ParseScript(scripts[n]); } if( numErrors == 0 ) { // Find all type declarations for( n = 0; n < scripts.GetLength(); n++ ) { asCScriptNode *node = parsers[n]->GetScriptNode(); // Find structure definitions first node = node->firstChild; while( node ) { asCScriptNode *next = node->next; if( node->nodeType == snStruct ) { node->DisconnectParent(); RegisterStruct(node, scripts[n]); } node = next; } } // Find other global nodes for( n = 0; n < scripts.GetLength(); n++ ) { // Find other global nodes asCScriptNode *node = parsers[n]->GetScriptNode(); node = node->firstChild; while( node ) { asCScriptNode *next = node->next; node->DisconnectParent(); if( node->nodeType == snFunction ) { RegisterScriptFunction(module->GetNextFunctionId(), node, scripts[n]); } else if( node->nodeType == snGlobalVar ) { RegisterGlobalVar(node, scripts[n]); } else if( node->nodeType == snImport ) { RegisterImportedFunction(module->GetNextImportedFunctionId(), node, scripts[n]); } else { // Unused script node int r, c; scripts[n]->ConvertPosToRowCol(node->tokenPos, &r, &c); WriteWarning(scripts[n]->name.AddressOf(), TXT_UNUSED_SCRIPT_NODE, r, c); delete node; } node = next; } } } for( n = 0; n < parsers.GetLength(); n++ ) delete parsers[n]; }