# TODO list (epic)

- [x] Create a TODO list
- [x] Custom Functions (not external)
    - [x] Add support for function definitions in the type checker
    - [x] Add support for function definitions in the LLVM emitter
- [ ] Structures
    - [x] Add support for definitions in the type checker
    - [x] Add support for definitions in the LLVM emitter
    - [x] Add support for member accesses in the type checker
    - [x] Add support for member accesses in the LLVM emitter
    - [x] Add support for packed in the parser
    - [x] Add support for packed in the LLVM emitter
    - [x] Add support for nested member accesses
    - [ ] Add support for nested structure initializers (LLVM)
    - [ ] Add support for setting values in struct (uses second ret val)
- [ ] Enums
    - [x] Add support for enums in the parser
    - [ ] Add support for enums in the type checker
    - [ ] Add support for enums in the LLVM emitter
    - [ ] Add support for member accesses in the type checker
    - [ ] Add support for member accesses in the LLVM emitter
- [ ] Unions
    - [ ] Add support for unions in the parser
    - [ ] Add support for unions in the type checker
    - [ ] Add support for unions in the LLVM emitter
    - [ ] Add support for member accesses in the type checker
    - [ ] Add support for member accesses in the LLVM emitter
- [ ] Modules
    - [ ] Add support for modules in the type checker
        - [ ] Modify functions, structures, unions and enums to have names mangling
    - [ ] Add support for modules in the LLVM emitter
        - [ ] Modify functions, structures, unions and enums to have names mangling
- [ ] Typed Unions
    - [ ] Add support for unions in the parser
    - [ ] Add support for unions in the type checker
    - [ ] Add support for unions in the LLVM emitter
    - [ ] Add support for member accesses in the type checker
    - [ ] Add support for member accesses in the LLVM emitter
- [ ] Create a self-sustained compiler/kernel
    - [ ] Get a basic UEFI hello world working
    - [ ] Create a kernel that can read the root partition
    - [ ] Create a kernel that has some memory management and malloc
    - [ ] Re-write the compiler frontend for the kernel
        - [ ] Lexer
        - [ ] Parser
        - [ ] Type checker
            - Check if pointers have been checked for NULL before being used,
              to avoid null dereferencing.
            - Throw error if a variable is shadowing another one from another
              scope.
            - Throw error if a function's return value is not used or
              explicitly ignored
    - [ ] Re-write the backend
        - [ ] Create an assembler for x86_64
        - [ ] Create a custom backend
