| 1120 | } |
| 1121 | |
| 1122 | AstNode *SymbolScanner::handleFunction(AstNode *node, top_down) |
| 1123 | { |
| 1124 | // Get function name. |
| 1125 | AstNode *ident = (*node)[0]; |
| 1126 | const Token &tok = ident->getToken(); |
| 1127 | const string &name = tok.getStringValue(); |
| 1128 | Log::debug("function: %s\n", name.c_str()); |
| 1129 | bool isFunctionType = node->getChild(4) != nullptr; |
| 1130 | |
| 1131 | // Create function symbol. |
| 1132 | FunctionBase *func; |
| 1133 | if (isFunctionType) |
| 1134 | { |
| 1135 | func = new FunctionType(tok, m_currentInterface); |
| 1136 | m_currentInterface->addFunctionType(dynamic_cast<FunctionType *>(func)); |
| 1137 | } |
| 1138 | else |
| 1139 | { |
| 1140 | if (m_currentInterface->getFunctions().size() == 0) |
| 1141 | { |
| 1142 | func = new Function(tok, m_currentInterface, 1); |
| 1143 | } |
| 1144 | else |
| 1145 | { |
| 1146 | func = new Function(tok, m_currentInterface); |
| 1147 | } |
| 1148 | m_currentInterface->addFunction(dynamic_cast<Function *>(func)); |
| 1149 | } |
| 1150 | |
| 1151 | m_currentStruct = &(func->getParameters()); |
| 1152 | |
| 1153 | // Get return type. |
| 1154 | AstNode *returnNode = (*node)[1]; |
| 1155 | if (returnNode) /* Function type/definition */ |
| 1156 | { |
| 1157 | Token &returnTokenType = returnNode->getToken(); |
| 1158 | if (returnTokenType.getToken() == TOK_RETURN) |
| 1159 | { |
| 1160 | AstNode *returnTypeNode = returnNode->getChild(0); |
| 1161 | Token &returnTypeToken = returnTypeNode->getToken(); |
| 1162 | switch (returnTypeToken.getToken()) |
| 1163 | { |
| 1164 | case TOK_ONEWAY: |
| 1165 | { |
| 1166 | func->setIsOneway(true); |
| 1167 | func->setReturnStructMemberType(new StructMember("(return)", new VoidType)); |
| 1168 | break; |
| 1169 | } |
| 1170 | |
| 1171 | case TOK_VOID: |
| 1172 | { |
| 1173 | func->setReturnStructMemberType(new StructMember("(return)", new VoidType)); |
| 1174 | break; |
| 1175 | } |
| 1176 | |
| 1177 | default: |
| 1178 | { |
| 1179 | DataType *dataType = lookupDataType(returnTypeNode); |
nothing calls this directly
no test coverage detected