source: dev/trunk/abdev/BasicCompiler_Common/include/Namespace.h@ 153

Last change on this file since 153 was 107, checked in by dai_9181, 18 years ago

Importsステートメントを導入した。実装は作り途中。

File size: 3.3 KB
Line 
1#pragma once
2
3#include <vector>
4#include <string>
5#include <boost/foreach.hpp>
6
7using namespace std;
8
9class NamespaceScopes : public vector<string>
10{
11public:
12 NamespaceScopes(){}
13 NamespaceScopes( const string &namespaceStr );
14 ~NamespaceScopes(){}
15
16 string ToString() const
17 {
18 string namespaceStr;
19 const vector<string> &me = *this;
20
21 bool isFirst = true;
22 BOOST_FOREACH( const string &itemStr, me ){
23 if( isFirst ){
24 isFirst = false;
25 }
26 else{
27 namespaceStr += ".";
28 }
29
30 namespaceStr += itemStr;
31 }
32 return namespaceStr;
33 }
34
35 // 等しいかをチェック
36 bool IsEqual( const string &name ) const
37 {
38 if( ToString() == name ){
39 return true;
40 }
41 return false;
42 }
43
44 // 等しいかをチェック
45 bool IsEqual( const NamespaceScopes &namespaceScopes ) const
46 {
47 if( ToString() == namespaceScopes.ToString() ){
48 return true;
49 }
50 return false;
51 }
52
53 // 所属しているかをチェック
54 // 例:
55 // baseNamespaceScopes = "Discoversoft"
56 // entryNamespaceScopes = "Discoversoft.ActiveBasic"
57 // この場合、entryNamespaceScopes は baseNamespaceScopes に所属している。
58 static bool IsBelong( const NamespaceScopes &baseNamespaceScopes, const NamespaceScopes &entryNamespaceScopes )
59 {
60 if( baseNamespaceScopes.size() > entryNamespaceScopes.size() ){
61 return false;
62 }
63
64 for( int i=0; i<(int)baseNamespaceScopes.size(); i++ ){
65 if( baseNamespaceScopes[i] != entryNamespaceScopes[i] ){
66 return false;
67 }
68 }
69 return true;
70 }
71
72 bool IsImported() const;
73
74 bool IsLiving() const;
75
76 // 包括しているかをチェック
77 // 例:
78 // this = "Discoversoft.ActiveBasic"
79 // living = "Discoversoft.ActiveBasic"
80 // name = "ActiveBasic"
81 // この場合、living は name を包括している。
82 bool IsCoverd( const string &name ) const;
83 bool IsCoverd( const NamespaceScopes &namespaceScopes ) const;
84
85 // 指定された名前空間が同一エリアと見なされるかどうかをチェック
86 static bool IsSameArea( const NamespaceScopes &baseNamespaceScopes, const NamespaceScopes &entryNamespaceScopes ){
87 if( entryNamespaceScopes.size() ){
88 if( baseNamespaceScopes.IsCoverd( entryNamespaceScopes ) ){
89 // 包括しているときは同一と見なす
90 return true;
91 }
92 }
93 else{
94 if( baseNamespaceScopes.size() ){
95 // 名前空間の判断が必要なとき
96 if( baseNamespaceScopes.IsImported()
97 || baseNamespaceScopes.IsLiving() ){
98 // Using指定があるとき
99 // または
100 // 指定された名前空間が現在の名前空間スコープと同一のとき
101 return true;
102 }
103 }
104 else{
105 return true;
106 }
107 }
108
109 return false;
110 }
111};
112
113class NamespaceScopesCollection : public vector<NamespaceScopes>
114{
115public:
116 bool IsExist( const NamespaceScopes &namespaceScopes ) const
117 {
118 const NamespaceScopesCollection &namespaceScopesCollection = *this;
119 BOOST_FOREACH( const NamespaceScopes &tempNamespaceScopes, namespaceScopesCollection ){
120 if( tempNamespaceScopes.IsEqual( namespaceScopes ) ){
121 return true;
122 }
123 }
124 return false;
125 }
126 bool IsExist( const string &namespaceStr ) const
127 {
128 return IsExist( NamespaceScopes( namespaceStr ) );
129 }
130 void SplitNamespace( const char *fullName, char *namespaceStr, char *simpleName ) const;
131
132 void Imports( const string &namespaceStr );
133
134 static bool CollectNamespaces( const char *source, NamespaceScopesCollection &namespaceScopesCollection );
135};
Note: See TracBrowser for help on using the repository browser.