Name::Name(const Name& name, size_t substrSize) : isAbsolute_(name.isAbsolute()) { assert(substrSize <= name.size()); list_.reserve(substrSize); for(std::size_t i = 0; i < substrSize; i++){ list_.push_back(name.at(i)); } }
Name Name::makeAbsolute(const Name& name) const{ assert(isAbsolute()); assert(!name.empty()); if(name.isAbsolute()) { return name.copy(); } else { return concat(name); } }
SearchResult performInnerAliasSearch(AST::Alias& alias, const Name& name) { if (name.size() != 1 || name.isAbsolute()) return SearchResult::None(); const auto iterator = alias.namedTemplateVariables().find(name.at(0)); if (iterator != alias.namedTemplateVariables().end()) { return SearchResult::TemplateVar(*(iterator->second)); } return SearchResult::None(); }
SearchResult performInnerCatchClauseSearch(AST::CatchClause* catchClause, const Name& name) { if (name.size() != 1 || name.isAbsolute()) return SearchResult::None(); const auto iterator = catchClause->namedVariables().find(name.at(0)); if (iterator != catchClause->namedVariables().end()) { return SearchResult::Var(*(iterator->second)); } return SearchResult::None(); }
SearchResult performInnerTypeInstanceSearch(AST::TypeInstance& typeInstance, const Name& name) { if (name.size() != 1 || name.isAbsolute()) return SearchResult::None(); const auto iterator = typeInstance.namedTemplateVariables().find(name.at(0)); if (iterator != typeInstance.namedTemplateVariables().end()) { return SearchResult::TemplateVar(*(iterator->second)); } return SearchResult::None(); }
Name::Name(const Name& prefix, const Name& suffix) : isAbsolute_(prefix.isAbsolute()) { list_.reserve(prefix.size() + suffix.size()); for(std::size_t i = 0; i < prefix.size(); i++){ list_.push_back(prefix.at(i)); } for(std::size_t i = 0; i < suffix.size(); i++){ list_.push_back(suffix.at(i)); } }
Name::Name(const Name& prefix, const String& suffix) : isAbsolute_(prefix.isAbsolute()) { list_.reserve(prefix.size() + 1); for (std::size_t i = 0; i < prefix.size(); i++) { list_.push_back(prefix.at(i)); } // No member of a name can be an empty string. if (suffix.size() > 0) { list_.push_back(suffix); } }
SearchResult performSearch(Context& context, const Name& name, const size_t searchStartPosition) { assert(!name.empty()); const auto& scopeStack = context.scopeStack(); const size_t startPosition = name.isAbsolute() ? scopeStack.size() - 1 : searchStartPosition; for (size_t i = startPosition; i < scopeStack.size(); i++) { const auto pos = scopeStack.size() - i - 1; const auto result = performInnerSearch(scopeStack[pos], name); if (!result.isNone()) return result; } return SearchResult::None(); }
SearchResult performInnerFunctionSearch(AST::Function& function, const Name& name) { if (name.size() != 1 || name.isAbsolute()) return SearchResult::None(); // Search template variables. { const auto iterator = function.namedTemplateVariables().find(name.at(0)); if (iterator != function.namedTemplateVariables().end()) { return SearchResult::TemplateVar(*(iterator->second)); } } // Search parameter variables. { const auto iterator = function.namedVariables().find(name.at(0)); if (iterator != function.namedVariables().end()) { return SearchResult::Var(*(iterator->second)); } } return SearchResult::None(); }