| 11220 | } |
| 11221 | |
| 11222 | void BfReducer::HandleTypeDeclaration(BfTypeDeclaration* typeDecl, BfAttributeDirective* attributes, BfAstNode* deferredHeadNode, bool findInitializer) |
| 11223 | { |
| 11224 | SetAndRestoreValue<BfTypeDeclaration*> prevTypeDecl(mCurTypeDecl, typeDecl); |
| 11225 | CurTypeState curTypeState(typeDecl, mAlloc); |
| 11226 | SetAndRestoreValue<CurTypeState*> prevTypeState(mCurTypeState, &curTypeState); |
| 11227 | SetAndRestoreValue<BfVisitorPos> prevVisitorPos(mVisitorPos, BfVisitorPos(BfNodeDynCast<BfBlock>(typeDecl->mDefineNode))); |
| 11228 | |
| 11229 | if (findInitializer) |
| 11230 | prevVisitorPos.CancelRestore(); |
| 11231 | |
| 11232 | if (attributes != NULL) |
| 11233 | { |
| 11234 | MEMBER_SET(typeDecl, mAttributes, attributes); |
| 11235 | typeDecl->mTriviaStart = BF_MIN(typeDecl->mAttributes->mTriviaStart, attributes->mTriviaStart); |
| 11236 | } |
| 11237 | |
| 11238 | if ((!IsNodeRelevant(deferredHeadNode, typeDecl)) && (!typeDecl->IsTemporary()) && (!findInitializer)) |
| 11239 | { |
| 11240 | typeDecl->mIgnoreDeclaration = true; |
| 11241 | return; |
| 11242 | } |
| 11243 | |
| 11244 | BfAstNode* prevNode = NULL; |
| 11245 | |
| 11246 | bool isDone = !mVisitorPos.MoveNext(); |
| 11247 | while (!isDone) |
| 11248 | { |
| 11249 | auto node = mVisitorPos.GetCurrent(); |
| 11250 | if (node == prevNode) |
| 11251 | { |
| 11252 | BF_FATAL("Should have handled node already"); |
| 11253 | // If we're stuck on an error and can't process any more nodes |
| 11254 | break; |
| 11255 | } |
| 11256 | prevNode = node; |
| 11257 | BfAstNode* typeMember = BfNodeDynCast<BfMemberDeclaration>(node); |
| 11258 | if (typeMember == NULL) |
| 11259 | { |
| 11260 | if (findInitializer) |
| 11261 | { |
| 11262 | bool isInitializerStatement = IsInitializerStatement(node); |
| 11263 | if (isInitializerStatement) |
| 11264 | return; |
| 11265 | } |
| 11266 | |
| 11267 | SetAndRestoreValue<BfAstNode*> prevTypeMemberNodeStart(mTypeMemberNodeStart, node); |
| 11268 | typeMember = ReadTypeMember(node); |
| 11269 | } |
| 11270 | |
| 11271 | //methodDeclaration->mDocumentation = FindDocumentation(methodDeclaration); |
| 11272 | |
| 11273 | isDone = !mVisitorPos.MoveNext(); |
| 11274 | if (typeMember != NULL) |
| 11275 | { |
| 11276 | mVisitorPos.Write(typeMember); |
| 11277 | } |
| 11278 | } |
| 11279 | mVisitorPos.Trim(); |
no test coverage detected