コード例 #1
0
ファイル: Name.cpp プロジェクト: PuerkitoBio/locic
	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));
		}
	}
コード例 #2
0
ファイル: Name.cpp プロジェクト: PuerkitoBio/locic
	Name Name::makeAbsolute(const Name& name) const{
		assert(isAbsolute());
		assert(!name.empty());
		if(name.isAbsolute()) {
			return name.copy();
		} else {
			return concat(name);
		}
	}
コード例 #3
0
ファイル: NameSearch.cpp プロジェクト: scrossuk/locic
		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();
		}
コード例 #4
0
ファイル: NameSearch.cpp プロジェクト: scrossuk/locic
		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();
		}
コード例 #5
0
ファイル: NameSearch.cpp プロジェクト: scrossuk/locic
		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();
		}
コード例 #6
0
ファイル: Name.cpp プロジェクト: PuerkitoBio/locic
	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));
		}
	}
コード例 #7
0
ファイル: Name.cpp プロジェクト: PuerkitoBio/locic
	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);
		}
	}
コード例 #8
0
ファイル: NameSearch.cpp プロジェクト: scrossuk/locic
		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();
		}
コード例 #9
0
ファイル: NameSearch.cpp プロジェクト: scrossuk/locic
		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();
		}