enum OptimizeResult
{
NEXT_STAGE,
+ REDO_STAGE,
REDO_PREVIOUS
};
+ enum ResolveFlags
+ {
+ RESOLVE_BLOCKS = 1,
+ RESOLVE_TYPES = 2,
+ RESOLVE_VARIABLES = 4,
+ RESOLVE_EXPRESSIONS = 8,
+ RESOLVE_FUNCTIONS = 16,
+ RESOLVE_ALL = 31
+ };
+
Features features;
Module *module;
std::vector<std::string> imported_names;
Intended for debugging purposes. */
std::string get_stage_debug(Stage::Type) const;
+ /** Returns diagnostics from compilation. The output is intended to be
+ viewed by humans. */
+ std::string get_diagnostics() const;
+
private:
/** Appends a module to the target, processing any imports found in it. */
void append_module(Module &, DataFile::Collection *);
variables. */
void generate(Stage &, Mode);
+ template<typename T>
+ bool resolve(Stage &, unsigned &, unsigned);
+
+ /** Resolves various references between nodes. Flags can be specified to
+ request resolving particular aspects. Resolving may ripple into other
+ aspects as necessary. */
+ void resolve(Stage &, unsigned = RESOLVE_ALL);
+
+ /** Checks the validity of the module. If the return value is false, the
+ module's diagnostics list will contain additional information of errors. */
+ bool validate(Stage &);
+
+ static bool diagnostic_line_order(const Diagnostic &, const Diagnostic &);
+
/** Applies optimizations to a stage. The return value indicates which
stage should be optimized next. */
OptimizeResult optimize(Stage &);