| /* | |
| Copyright 2019 Alain Dargelas | |
| Licensed under the Apache License, Version 2.0 (the "License"); | |
| you may not use this file except in compliance with the License. | |
| You may obtain a copy of the License at | |
| http://www.apache.org/licenses/LICENSE-2.0 | |
| Unless required by applicable law or agreed to in writing, software | |
| distributed under the License is distributed on an "AS IS" BASIS, | |
| WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
| See the License for the specific language governing permissions and | |
| limitations under the License. | |
| */ | |
| /* | |
| * File: LibrarySet.cpp | |
| * Author: alain | |
| * | |
| * Created on January 27, 2018, 5:28 PM | |
| */ | |
| #include <vector> | |
| #include <set> | |
| #include <iostream> | |
| #include "SourceCompile/SymbolTable.h" | |
| #include "ErrorReporting/ErrorContainer.h" | |
| #include "Library/LibrarySet.h" | |
| using namespace SURELOG; | |
| LibrarySet::LibrarySet() {} | |
| LibrarySet::LibrarySet(const LibrarySet& orig) {} | |
| LibrarySet::~LibrarySet() {} | |
| Library* LibrarySet::getLibrary(std::string libName) { | |
| for (unsigned int i = 0; i < m_libraries.size(); i++) { | |
| if (m_libraries[i].getName() == libName) return &m_libraries[i]; | |
| } | |
| return NULL; | |
| } | |
| Library* LibrarySet::getLibrary(SymbolId fileId) { | |
| Library* lib = NULL; | |
| for (unsigned int i = 0; i < m_libraries.size(); i++) { | |
| if (m_libraries[i].isMember(fileId)) { | |
| lib = &m_libraries[i]; | |
| break; | |
| } | |
| } | |
| if (lib == NULL) { | |
| getLibrary("work")->addFileId(fileId); | |
| lib = getLibrary("work"); | |
| } | |
| return lib; | |
| } | |
| std::string LibrarySet::report(SymbolTable* symbols) { | |
| std::string report; | |
| for (unsigned int i = 0; i < m_libraries.size(); i++) { | |
| report += m_libraries[i].report(symbols) + "\n"; | |
| } | |
| return report; | |
| } | |
| void LibrarySet::checkErrors(SymbolTable* symbols, ErrorContainer* errors) { | |
| std::map<SymbolId, std::string> fileSet; | |
| for (unsigned int i = 0; i < m_libraries.size(); i++) { | |
| for (auto file : m_libraries[i].getFiles()) { | |
| std::map<SymbolId, std::string>::iterator itr = fileSet.find(file); | |
| if (itr == fileSet.end()) { | |
| fileSet.insert(std::make_pair(file, m_libraries[i].getName())); | |
| } else { | |
| Location loc1(symbols->registerSymbol((*itr).second + ", " + | |
| m_libraries[i].getName())); | |
| Location loc2(file); | |
| Error err(ErrorDefinition::LIB_FILE_MAPS_TO_MULTIPLE_LIBS, loc1, loc2); | |
| errors->addError(err); | |
| } | |
| } | |
| } | |
| } |