| 6380 | } |
| 6381 | |
| 6382 | BfFieldDeclaration* BfReducer::CreateFieldDeclaration(BfTokenNode* tokenNode, BfTypeReference* typeRef, BfIdentifierNode* nameIdentifier, BfFieldDeclaration* prevFieldDeclaration) |
| 6383 | { |
| 6384 | auto fieldDeclaration = mAlloc->Alloc<BfFieldDeclaration>(); |
| 6385 | if (prevFieldDeclaration != NULL) |
| 6386 | { |
| 6387 | ReplaceNode(tokenNode, fieldDeclaration); |
| 6388 | MEMBER_SET(fieldDeclaration, mPrecedingComma, tokenNode); |
| 6389 | MEMBER_SET(fieldDeclaration, mNameNode, nameIdentifier); |
| 6390 | fieldDeclaration->mDocumentation = prevFieldDeclaration->mDocumentation; |
| 6391 | fieldDeclaration->mAttributes = prevFieldDeclaration->mAttributes; |
| 6392 | fieldDeclaration->mProtectionSpecifier = prevFieldDeclaration->mProtectionSpecifier; |
| 6393 | fieldDeclaration->mStaticSpecifier = prevFieldDeclaration->mStaticSpecifier; |
| 6394 | fieldDeclaration->mTypeRef = prevFieldDeclaration->mTypeRef; |
| 6395 | fieldDeclaration->mConstSpecifier = prevFieldDeclaration->mConstSpecifier; |
| 6396 | fieldDeclaration->mReadOnlySpecifier = prevFieldDeclaration->mReadOnlySpecifier; |
| 6397 | fieldDeclaration->mVolatileSpecifier = prevFieldDeclaration->mVolatileSpecifier; |
| 6398 | fieldDeclaration->mNewSpecifier = prevFieldDeclaration->mNewSpecifier; |
| 6399 | fieldDeclaration->mExternSpecifier = prevFieldDeclaration->mExternSpecifier; |
| 6400 | tokenNode = ExpectTokenAfter(fieldDeclaration, BfToken_Semicolon, BfToken_AssignEquals, BfToken_Comma, BfToken_Tilde); |
| 6401 | if (tokenNode == NULL) |
| 6402 | return fieldDeclaration; |
| 6403 | mVisitorPos.mReadPos--; // Go back to token |
| 6404 | } |
| 6405 | else |
| 6406 | { |
| 6407 | ReplaceNode(typeRef, fieldDeclaration); |
| 6408 | fieldDeclaration->mTypeRef = typeRef; |
| 6409 | fieldDeclaration->mInitializer = NULL; |
| 6410 | if (nameIdentifier != NULL) |
| 6411 | { |
| 6412 | fieldDeclaration->mNameNode = nameIdentifier; |
| 6413 | MoveNode(fieldDeclaration->mNameNode, fieldDeclaration); |
| 6414 | } |
| 6415 | } |
| 6416 | CheckMultiuseAttributeTypeRef(fieldDeclaration->mTypeRef); |
| 6417 | |
| 6418 | BfToken token = tokenNode->GetToken(); |
| 6419 | if (token == BfToken_AssignEquals) |
| 6420 | { |
| 6421 | MEMBER_SET(fieldDeclaration, mEqualsNode, tokenNode); |
| 6422 | MoveNode(tokenNode, fieldDeclaration); |
| 6423 | mVisitorPos.MoveNext(); |
| 6424 | |
| 6425 | mIsFieldInitializer = true; |
| 6426 | fieldDeclaration->mInitializer = CreateExpressionAfter(fieldDeclaration); |
| 6427 | mIsFieldInitializer = false; |
| 6428 | |
| 6429 | if (fieldDeclaration->mInitializer != NULL) |
| 6430 | { |
| 6431 | MoveNode(fieldDeclaration->mInitializer, fieldDeclaration); |
| 6432 | auto nextToken = ExpectTokenAfter(fieldDeclaration, BfToken_Semicolon, BfToken_Comma, BfToken_Tilde); |
| 6433 | if (nextToken != NULL) |
| 6434 | mVisitorPos.mReadPos--; // Backtrack, someone else eats these |
| 6435 | } |
| 6436 | } |
| 6437 | else if (token == BfToken_Comma) |
| 6438 | { |
| 6439 | // |
nothing calls this directly
no test coverage detected