#include "stdafx.h" #include #include using namespace ActiveBasic::Common::Lexical; bool NamespaceSupporter::ImportsNamespace( const NamespaceScopes &namespaceScopes ) { _ASSERT( allNamespaceScopesCollection ); if( !allNamespaceScopesCollection->IsExist( namespaceScopes ) ){ return false; } this->importedNamespaces.push_back( namespaceScopes ); return true; } bool NamespaceSupporter::ImportsNamespace( const std::string &namespaceStr ) { NamespaceScopes namespaceScopes( namespaceStr ); return ImportsNamespace( namespaceScopes ); } bool NamespaceSupporter::IsCoverd( const NamespaceScopes &base, const NamespaceScopes &entry ) const { // まずはそのままでマッチングを試みる if( base.IsEqual( entry ) ) { return true; } // 現在の名前空間とのマッチングを試みる typedef NamespaceScopes::const_iterator cnsit_t; cnsit_t first = livingNamespaceScopes.begin(); cnsit_t last = livingNamespaceScopes.end(); NamespaceScopes temp; while( first != last ) { temp.assign( first, last ); temp.append( entry ); if( base.IsEqual( temp ) ) { return true; } --last; } // Importsされている名前空間とのマッチングを試みる foreach( const NamespaceScopes &importedNamespaceScopes, GetImportedNamespaces() ) { if( base.IsEqual( importedNamespaceScopes + entry ) ) { return true; } } return false; } bool NamespaceSupporter::IsSameAreaNamespace( const NamespaceScopes &baseNamespaceScopes, const NamespaceScopes &entryNamespaceScopes ) const { if( entryNamespaceScopes.size() ) { if( IsCoverd( baseNamespaceScopes, entryNamespaceScopes ) ) { // 包括しているときは同一と見なす return true; } } else{ if( baseNamespaceScopes.size() ) { // 名前空間の判断が必要なとき if( this->importedNamespaces.IsImported( baseNamespaceScopes ) || IsLiving( baseNamespaceScopes ) ) { // Using指定があるとき // または // 指定された名前空間が現在の名前空間スコープと同一のとき return true; } } else{ return true; } } return false; }