source: dev/trunk/ab5.0/abdev/BasicCompiler_Common/include/NamespaceSupporter.h@ 504

Last change on this file since 504 was 504, checked in by dai_9181, 16 years ago

Symbol::RegistNamespaceSupporterメソッドを追加。

File size: 2.6 KB
Line 
1#pragma once
2
3#include <Namespace.h>
4
5class NamespaceSupporter
6{
7 // Importsされた名前空間
8 NamespaceScopesCollection importedNamespaces;
9
10 // 現在の名前空間
11 NamespaceScopes livingNamespaceScopes;
12
13public:
14 NamespaceScopesCollection &GetImportedNamespaces()
15 {
16 return importedNamespaces;
17 }
18 void SetImportedNamespaces( const NamespaceScopesCollection &namespaces )
19 {
20 this->importedNamespaces = namespaces;
21 }
22 bool ImportsNamespace( const std::string &namespaceStr );
23
24 NamespaceScopes &GetLivingNamespaceScopes()
25 {
26 return livingNamespaceScopes;
27 }
28 void SetLivingNamespaceScopes( const NamespaceScopes &namespaceScopes )
29 {
30 this->livingNamespaceScopes = namespaceScopes;
31 }
32 bool IsLiving( const NamespaceScopes &namespaceScopes ) const
33 {
34 return NamespaceScopes::IsBelong( namespaceScopes, livingNamespaceScopes );
35 }
36
37
38 // 包括しているかをチェック
39 // 例:
40 // this = "Discoversoft.ActiveBasic"
41 // living = "Discoversoft.ActiveBasic"
42 // entryName = "ActiveBasic"
43 // この場合、living は entryName を包括している。
44 bool IsCoverd( const NamespaceScopes &namespaceScopes, const string &entryName ) const
45 {
46 if( namespaceScopes.IsEqual( entryName ) ){
47 return true;
48 }
49
50 string thisStr = namespaceScopes.ToString();
51
52 NamespaceScopes tempLivingNamespaceScopes = livingNamespaceScopes;
53
54 while( tempLivingNamespaceScopes.size() ){
55 string tempStr = tempLivingNamespaceScopes.ToString() + "." + entryName;
56 if( thisStr == tempStr ){
57 return true;
58 }
59
60 tempLivingNamespaceScopes.pop_back();
61 }
62 return false;
63 }
64 bool IsCoverd( const NamespaceScopes &baseNamespaceScopes, const NamespaceScopes &entryNamespaceScopes ) const
65 {
66 return IsCoverd( baseNamespaceScopes, entryNamespaceScopes.ToString() );
67 }
68
69
70 // 指定された名前空間が同一エリアと見なされるかどうかをチェック
71 bool IsSameAreaNamespace( const NamespaceScopes &baseNamespaceScopes, const NamespaceScopes &entryNamespaceScopes ) const
72 {
73 if( entryNamespaceScopes.size() )
74 {
75 if( IsCoverd( baseNamespaceScopes, entryNamespaceScopes ) )
76 {
77 // 包括しているときは同一と見なす
78 return true;
79 }
80 }
81 else{
82 if( baseNamespaceScopes.size() )
83 {
84 // 名前空間の判断が必要なとき
85 if( this->importedNamespaces.IsImported( baseNamespaceScopes )
86 || IsLiving( baseNamespaceScopes ) )
87 {
88 // Using指定があるとき
89 // または
90 // 指定された名前空間が現在の名前空間スコープと同一のとき
91 return true;
92 }
93 }
94 else{
95 return true;
96 }
97 }
98
99 return false;
100 }
101
102 static bool CollectNamespaces( const char *source, NamespaceScopesCollection &namespaceScopesCollection );
103};
Note: See TracBrowser for help on using the repository browser.