Line data Source code
1 : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 : /*
3 : * This file is part of the LibreOffice project.
4 : *
5 : * This Source Code Form is subject to the terms of the Mozilla Public
6 : * License, v. 2.0. If a copy of the MPL was not distributed with this
7 : * file, You can obtain one at http://mozilla.org/MPL/2.0/.
8 : *
9 : * This file incorporates work covered by the following license notice:
10 : *
11 : * Licensed to the Apache Software Foundation (ASF) under one or more
12 : * contributor license agreements. See the NOTICE file distributed
13 : * with this work for additional information regarding copyright
14 : * ownership. The ASF licenses this file to you under the Apache
15 : * License, Version 2.0 (the "License"); you may not use this file
16 : * except in compliance with the License. You may obtain a copy of
17 : * the License at http://www.apache.org/licenses/LICENSE-2.0 .
18 : */
19 :
20 : #include <idlc/astdeclaration.hxx>
21 : #include <idlc/astscope.hxx>
22 : #include <rtl/strbuf.hxx>
23 :
24 : using namespace ::rtl;
25 :
26 138 : static OString sGlobal("::");
27 :
28 761684 : static OString convertName(const OString& name)
29 : {
30 761684 : OStringBuffer nameBuffer(name.getLength()+1);
31 761684 : sal_Int32 nIndex = 0;
32 5834220 : do
33 : {
34 5834220 : OString token( name.getToken( 0, ':', nIndex ) );
35 5834220 : if( !token.isEmpty() )
36 : {
37 3292197 : nameBuffer.append('/');
38 3292197 : nameBuffer.append( token );
39 5834220 : }
40 : } while( nIndex != -1 );
41 761684 : return nameBuffer.makeStringAndClear();
42 : }
43 :
44 761684 : AstDeclaration::AstDeclaration(NodeType type, const OString& name, AstScope* pScope)
45 : : m_localName(name)
46 : , m_pScope(pScope)
47 : , m_nodeType(type)
48 : , m_bImported(sal_False)
49 : , m_bIsAdded(sal_False)
50 : , m_bInMainFile(sal_False)
51 761684 : , m_bPredefined(false)
52 : {
53 761684 : if ( m_pScope )
54 : {
55 756290 : AstDeclaration* pDecl = scopeAsDecl(m_pScope);
56 756290 : if (pDecl)
57 : {
58 756290 : m_scopedName = pDecl->getScopedName();
59 756290 : if (!m_scopedName.isEmpty())
60 597935 : m_scopedName += sGlobal;
61 756290 : m_scopedName += m_localName;
62 : }
63 : } else
64 : {
65 5394 : m_scopedName = m_localName;
66 : }
67 761684 : m_fullName = convertName(m_scopedName);
68 :
69 761684 : if ( idlc()->getFileName() == idlc()->getRealFileName() )
70 : {
71 150648 : m_fileName = idlc()->getMainFileName();
72 150648 : m_bInMainFile = sal_True;
73 : } else
74 : {
75 611036 : m_fileName = idlc()->getFileName();
76 611036 : m_bImported = sal_True;
77 : }
78 :
79 761684 : m_documentation = idlc()->processDocumentation();
80 :
81 761684 : m_bPublished = idlc()->isPublished();
82 761684 : }
83 :
84 :
85 223741 : AstDeclaration::~AstDeclaration()
86 : {
87 :
88 223741 : }
89 :
90 1177 : void AstDeclaration::setPredefined(bool bPredefined)
91 : {
92 1177 : m_bPredefined = bPredefined;
93 1177 : if ( m_bPredefined )
94 : {
95 690 : m_fileName = OString();
96 690 : m_bInMainFile = sal_False;
97 : }
98 1177 : }
99 :
100 0 : void AstDeclaration::setName(const ::rtl::OString& name)
101 : {
102 0 : m_scopedName = name;
103 0 : sal_Int32 nIndex = name.lastIndexOf( ':' );
104 0 : m_localName = name.copy( nIndex+1 );
105 :
106 : // Huh ? There is always at least one token
107 :
108 : // sal_Int32 count = name.getTokenCount(':');
109 :
110 : // if ( count > 0 )
111 : // {
112 : // m_localName = name.getToken(count-1, ':');
113 : // m_scopedName = name;
114 : // } else if ( m_pScope )
115 : // {
116 : // m_localName = name;
117 : // AstDeclaration* pDecl = scopeAsDecl(m_pScope);
118 : // if (pDecl)
119 : // {
120 : // m_scopedName = pDecl->getScopedName();
121 : // if (m_scopedName.getLength() > 0)
122 : // m_scopedName += sGlobal;
123 : // m_scopedName += m_localName;
124 : // }
125 : // } else
126 : // {
127 : // m_localName = name;
128 : // m_scopedName = name;
129 : // }
130 0 : m_fullName = convertName(m_scopedName);
131 0 : }
132 :
133 201384 : bool AstDeclaration::isType() const {
134 201384 : switch (m_nodeType) {
135 : case NT_interface:
136 : case NT_instantiated_struct:
137 : case NT_union:
138 : case NT_enum:
139 : case NT_sequence:
140 : case NT_array:
141 : case NT_typedef:
142 : case NT_predefined:
143 : case NT_type_parameter:
144 201384 : return true;
145 :
146 : default:
147 : OSL_ASSERT(m_nodeType != NT_struct); // see AstStruct::isType
148 0 : return false;
149 : }
150 : }
151 :
152 15134 : sal_Bool AstDeclaration::hasAncestor(AstDeclaration* pDecl)
153 : {
154 15134 : if (this == pDecl)
155 0 : return sal_True;
156 15134 : if ( !m_pScope )
157 7567 : return sal_False;
158 7567 : return scopeAsDecl(m_pScope)->hasAncestor(pDecl);
159 : }
160 :
161 26905 : sal_Bool AstDeclaration::dump(RegistryKey& rKey)
162 : {
163 26905 : AstScope* pScope = declAsScope(this);
164 26905 : sal_Bool bRet = sal_True;
165 :
166 26905 : if ( pScope )
167 : {
168 26905 : DeclList::const_iterator iter = pScope->getIteratorBegin();
169 26905 : DeclList::const_iterator end = pScope->getIteratorEnd();
170 26905 : AstDeclaration* pDecl = NULL;
171 204105 : while ( iter != end && bRet)
172 : {
173 150295 : pDecl = *iter;
174 150295 : if ( pDecl->isInMainfile() )
175 : {
176 117097 : switch ( pDecl->getNodeType() )
177 : {
178 : case NT_module:
179 : case NT_constants:
180 : case NT_interface:
181 : case NT_struct:
182 : case NT_exception:
183 : case NT_enum:
184 : case NT_union:
185 : case NT_typedef:
186 : case NT_service:
187 : case NT_singleton:
188 26779 : bRet = pDecl->dump(rKey);
189 26779 : break;
190 : default:
191 90318 : break;
192 : }
193 : }
194 :
195 150295 : ++iter;
196 : }
197 : }
198 26905 : return bRet;
199 414 : }
200 :
201 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|