| 71 | |
| 72 | |
| 73 | def get_plain_module_render_state(plain_module: PlainModule) -> PlainModuleRenderState | None: |
| 74 | sc = spec_change(plain_module) |
| 75 | cc = code_change(plain_module) |
| 76 | all_required_modules = plain_module.all_required_modules |
| 77 | last_rendered_module_name, last_rendered_frid = plain_module.get_module_render_status() |
| 78 | if last_rendered_module_name is None and last_rendered_frid is None: |
| 79 | return None |
| 80 | |
| 81 | if last_rendered_module_name == plain_module.module_name: |
| 82 | module = plain_module |
| 83 | else: |
| 84 | found_module: PlainModule | None = None |
| 85 | for required_module in all_required_modules: |
| 86 | if required_module.module_name == last_rendered_module_name: |
| 87 | found_module = required_module |
| 88 | |
| 89 | if found_module is None: |
| 90 | raise ModuleDoesNotExistError( |
| 91 | f"Last rendered module {last_rendered_module_name} not found in {[rmodule.module_name for rmodule in all_required_modules]}" |
| 92 | ) |
| 93 | module = found_module |
| 94 | |
| 95 | pr = PlainModuleRenderState( |
| 96 | last_render_module=module, |
| 97 | last_render_frid=last_rendered_frid, |
| 98 | change=None, |
| 99 | change_type=None, |
| 100 | ) |
| 101 | |
| 102 | if sc is None and cc is None: |
| 103 | return pr |
| 104 | |
| 105 | if sc is not None: |
| 106 | pr.change = sc |
| 107 | pr.change_type = "spec_change" |
| 108 | |
| 109 | if cc is not None and ( |
| 110 | pr.change is None |
| 111 | or (pr.change is not None and module_comes_before_or_equal(all_required_modules, cc, pr.change)) |
| 112 | ): |
| 113 | pr.change = cc |
| 114 | pr.change_type = "code_change" |
| 115 | |
| 116 | return pr |
| 117 | |
| 118 | |
| 119 | def get_all_affected_modules_from_change( |