xref: /trunk/main/idlc/source/astdeclaration.cxx (revision cdf0e10c4e3984b49a9502b011690b615761d4a3)
1 /*************************************************************************
2  *
3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4  *
5  * Copyright 2000, 2010 Oracle and/or its affiliates.
6  *
7  * OpenOffice.org - a multi-platform office productivity suite
8  *
9  * This file is part of OpenOffice.org.
10  *
11  * OpenOffice.org is free software: you can redistribute it and/or modify
12  * it under the terms of the GNU Lesser General Public License version 3
13  * only, as published by the Free Software Foundation.
14  *
15  * OpenOffice.org is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18  * GNU Lesser General Public License version 3 for more details
19  * (a copy is included in the LICENSE file that accompanied this code).
20  *
21  * You should have received a copy of the GNU Lesser General Public License
22  * version 3 along with OpenOffice.org.  If not, see
23  * <http://www.openoffice.org/license.html>
24  * for a copy of the LGPLv3 License.
25  *
26  ************************************************************************/
27 
28 // MARKER(update_precomp.py): autogen include statement, do not remove
29 #include "precompiled_idlc.hxx"
30 #include <idlc/astdeclaration.hxx>
31 #include <idlc/astscope.hxx>
32 #include <rtl/strbuf.hxx>
33 
34 using namespace ::rtl;
35 
36 static OString sGlobal("::");
37 
38 static OString convertName(const OString& name)
39 {
40     OStringBuffer nameBuffer(name.getLength()+1);
41     sal_Int32 nIndex = 0;
42     do
43     {
44         OString token( name.getToken( 0, ':', nIndex ) );
45         if( token.getLength() )
46         {
47             nameBuffer.append('/');
48             nameBuffer.append( token );
49         }
50     } while( nIndex != -1 );
51     return nameBuffer.makeStringAndClear();
52 }
53 
54 AstDeclaration::AstDeclaration(NodeType type, const OString& name, AstScope* pScope)
55     : m_localName(name)
56     , m_pScope(pScope)
57     , m_nodeType(type)
58     , m_bImported(sal_False)
59     , m_bIsAdded(sal_False)
60     , m_bInMainFile(sal_False)
61     , m_bPredefined(false)
62 {
63     if ( m_pScope )
64     {
65         AstDeclaration* pDecl = scopeAsDecl(m_pScope);
66         if (pDecl)
67         {
68             m_scopedName = pDecl->getScopedName();
69             if (m_scopedName.getLength() > 0)
70                 m_scopedName += sGlobal;
71             m_scopedName += m_localName;
72         }
73     } else
74     {
75         m_scopedName = m_localName;
76     }
77     m_fullName = convertName(m_scopedName);
78 
79     if ( idlc()->getFileName() == idlc()->getRealFileName() )
80     {
81         m_fileName = idlc()->getMainFileName();
82         m_bInMainFile = sal_True;
83     } else
84     {
85         m_fileName = idlc()->getFileName();
86         m_bImported = sal_True;
87     }
88 
89     if ( idlc()->isDocValid() )
90         m_documentation = OStringToOUString(idlc()->getDocumentation(), RTL_TEXTENCODING_UTF8);
91 
92     m_bPublished = idlc()->isPublished();
93 }
94 
95 
96 AstDeclaration::~AstDeclaration()
97 {
98 
99 }
100 
101 void AstDeclaration::setPredefined(bool bPredefined)
102 {
103     m_bPredefined = bPredefined;
104     if ( m_bPredefined )
105     {
106         m_fileName = OString();
107         m_bInMainFile = sal_False;
108     }
109 }
110 
111 void AstDeclaration::setName(const ::rtl::OString& name)
112 {
113     m_scopedName = name;
114     sal_Int32 nIndex = name.lastIndexOf( ':' );
115     m_localName = name.copy( nIndex+1 );
116 
117 // Huh ? There is always at least one token
118 
119 //  sal_Int32 count = name.getTokenCount(':');
120 
121 //  if ( count > 0 )
122 //  {
123 //      m_localName = name.getToken(count-1, ':');
124 //      m_scopedName = name;
125 //  } else if ( m_pScope )
126 //  {
127 //      m_localName = name;
128 //      AstDeclaration* pDecl = scopeAsDecl(m_pScope);
129 //      if (pDecl)
130 //      {
131 //          m_scopedName = pDecl->getScopedName();
132 //          if (m_scopedName.getLength() > 0)
133 //              m_scopedName += sGlobal;
134 //          m_scopedName += m_localName;
135 //      }
136 //  } else
137 //  {
138 //      m_localName = name;
139 //      m_scopedName = name;
140 //  }
141     m_fullName = convertName(m_scopedName);
142 }
143 
144 bool AstDeclaration::isType() const {
145     switch (m_nodeType) {
146     case NT_interface:
147     case NT_instantiated_struct:
148     case NT_union:
149     case NT_enum:
150     case NT_sequence:
151     case NT_array:
152     case NT_typedef:
153     case NT_predefined:
154     case NT_type_parameter:
155         return true;
156 
157     default:
158         OSL_ASSERT(m_nodeType != NT_struct); // see AstStruct::isType
159         return false;
160     }
161 }
162 
163 sal_Bool AstDeclaration::hasAncestor(AstDeclaration* pDecl)
164 {
165     if (this == pDecl)
166         return sal_True;
167     if ( !m_pScope )
168         return sal_False;
169     return scopeAsDecl(m_pScope)->hasAncestor(pDecl);
170 }
171 
172 sal_Bool AstDeclaration::dump(RegistryKey& rKey)
173 {
174     AstScope* pScope = declAsScope(this);
175     sal_Bool bRet = sal_True;
176 
177     if ( pScope )
178     {
179         DeclList::const_iterator iter = pScope->getIteratorBegin();
180         DeclList::const_iterator end = pScope->getIteratorEnd();
181         AstDeclaration* pDecl = NULL;
182         while ( iter != end && bRet)
183         {
184             pDecl = *iter;
185             if ( pDecl->isInMainfile() )
186             {
187                 switch ( pDecl->getNodeType() )
188                 {
189                     case NT_module:
190                     case NT_constants:
191                     case NT_interface:
192                     case NT_struct:
193                     case NT_exception:
194                     case NT_enum:
195                     case NT_union:
196                     case NT_typedef:
197                     case NT_service:
198                     case NT_singleton:
199                         bRet = pDecl->dump(rKey);
200                         break;
201                     default:
202                         break;
203                 }
204             }
205 
206             ++iter;
207         }
208     }
209     return bRet;
210 }
211 
212