/*
 * adhoc.h
 *
 *  Created on: Nov 28, 2015
 *      Author: pgess
 */
//SECTIONTAG adhoc pass
#ifndef SRC_INSTRUCTIONS_ADHOC_H_
#define SRC_INSTRUCTIONS_ADHOC_H_

#include "abstractpass.h"

#ifndef FRIEND_ADHOC_UNITTESTS
	#define FRIEND_ADHOC_UNITTESTS
#endif

namespace xreate {

	class ContextQuery;

	class AdhocScheme {
	public:
		AdhocScheme(const Expression& scheme);
		CodeScope* getImplementationForCommand(const std::string& comm);
		const TypeAnnotation& getResultType();
		const std::string& getContext();

	private:
		TypeAnnotation __resultType;
		std::string __context;
		std::map<std::string, CodeScope*> __commands;
	};

	class AdhocPass: public AbstractPass<void> {
		FRIEND_ADHOC_UNITTESTS

		public:
			AdhocPass(PassManager* manager): AbstractPass(manager) {}
			AdhocScheme* determineForScope(CodeScope* entry);

		//	virtual void process(const Expression& expression, PassContext context, const std::string& varDecl="");
			void run() override;

		private:
			std::map<std::string, AdhocScheme*> __schemes;
			ContextQuery* queryContext;
	};
}

#endif /* SRC_INSTRUCTIONS_ADHOC_H_ */
