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 329 : static OString sGlobal("::");
27 :
28 14770 : static OString convertName(const OString& name)
29 : {
30 14770 : OStringBuffer nameBuffer(name.getLength()+1);
31 14770 : sal_Int32 nIndex = 0;
32 36964 : do
33 : {
34 36964 : OString token( name.getToken( 0, ':', nIndex ) );
35 36964 : if( !token.isEmpty() )
36 : {
37 25209 : nameBuffer.append('/');
38 25209 : nameBuffer.append( token );
39 36964 : }
40 36964 : } while( nIndex != -1 );
41 14770 : return nameBuffer.makeStringAndClear();
42 : }
43 :
44 14770 : AstDeclaration::AstDeclaration(NodeType type, const OString& name, AstScope* pScope)
45 : : m_localName(name)
46 : , m_pScope(pScope)
47 : , m_nodeType(type)
48 : , m_bImported(false)
49 : , m_bIsAdded(false)
50 : , m_bInMainFile(false)
51 : , m_bPredefined(false)
52 14770 : , m_lineNumber(0)
53 : {
54 14770 : if ( m_pScope )
55 : {
56 14037 : AstDeclaration* pDecl = scopeAsDecl(m_pScope);
57 14037 : if (pDecl)
58 : {
59 14037 : m_scopedName = pDecl->getScopedName();
60 14037 : if (!m_scopedName.isEmpty())
61 3159 : m_scopedName += sGlobal;
62 14037 : m_scopedName += m_localName;
63 : }
64 : } else
65 : {
66 733 : m_scopedName = m_localName;
67 : }
68 14770 : m_fullName = convertName(m_scopedName);
69 :
70 14770 : if ( idlc()->getFileName() == idlc()->getRealFileName() )
71 : {
72 14770 : m_fileName = idlc()->getMainFileName();
73 14770 : m_bInMainFile = true;
74 : } else
75 : {
76 0 : m_fileName = idlc()->getFileName();
77 0 : m_bImported = true;
78 : }
79 :
80 14770 : m_documentation = idlc()->processDocumentation();
81 :
82 14770 : m_bPublished = idlc()->isPublished();
83 14770 : }
84 :
85 :
86 442 : AstDeclaration::~AstDeclaration()
87 : {
88 :
89 442 : }
90 :
91 1752 : void AstDeclaration::setPredefined(bool bPredefined)
92 : {
93 1752 : m_bPredefined = bPredefined;
94 1752 : if ( m_bPredefined )
95 : {
96 1645 : m_fileName = OString();
97 1645 : m_bInMainFile = false;
98 : }
99 1752 : }
100 :
101 276 : bool AstDeclaration::isType() const {
102 276 : switch (m_nodeType) {
103 : case NT_interface:
104 : case NT_instantiated_struct:
105 : case NT_enum:
106 : case NT_sequence:
107 : case NT_typedef:
108 : case NT_predefined:
109 : case NT_type_parameter:
110 271 : return true;
111 :
112 : default:
113 : OSL_ASSERT(m_nodeType != NT_struct); // see AstStruct::isType
114 5 : return false;
115 : }
116 : }
117 :
118 12 : bool AstDeclaration::hasAncestor(AstDeclaration* pDecl)
119 : {
120 12 : if (this == pDecl)
121 0 : return true;
122 12 : if ( !m_pScope )
123 4 : return false;
124 8 : return scopeAsDecl(m_pScope)->hasAncestor(pDecl);
125 : }
126 :
127 240 : bool AstDeclaration::dump(RegistryKey& rKey)
128 : {
129 240 : AstScope* pScope = declAsScope(this);
130 240 : bool bRet = true;
131 :
132 240 : if ( pScope )
133 : {
134 240 : DeclList::const_iterator iter = pScope->getIteratorBegin();
135 240 : DeclList::const_iterator end = pScope->getIteratorEnd();
136 240 : AstDeclaration* pDecl = NULL;
137 3270 : while ( iter != end && bRet)
138 : {
139 2790 : pDecl = *iter;
140 2790 : if ( pDecl->isInMainfile() )
141 : {
142 2649 : switch ( pDecl->getNodeType() )
143 : {
144 : case NT_module:
145 : case NT_constants:
146 : case NT_interface:
147 : case NT_struct:
148 : case NT_exception:
149 : case NT_enum:
150 : case NT_typedef:
151 : case NT_service:
152 : case NT_singleton:
153 393 : bRet = pDecl->dump(rKey);
154 393 : break;
155 : default:
156 2256 : break;
157 : }
158 : }
159 :
160 2790 : ++iter;
161 : }
162 : }
163 240 : return bRet;
164 987 : }
165 :
166 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|