public CoreModule(
      @NotNull Disposable parentDisposable, @NotNull Project project, String moduleFilePath) {
    super(project.getPicoContainer(), parentDisposable);
    myLifetime = parentDisposable;
    myProject = project;
    myPath = moduleFilePath;

    Extensions.instantiateArea(ExtensionAreas.IDEA_MODULE, this, null);
    CoreApplicationEnvironment.registerExtensionPoint(
        Extensions.getArea(this), ModuleExtension.EP_NAME, ModuleExtension.class);
    Disposer.register(
        parentDisposable,
        new Disposable() {
          @Override
          public void dispose() {
            Extensions.disposeArea(CoreModule.this);
          }
        });
    initModuleExtensions();

    final ModuleRootManagerImpl moduleRootManager =
        new ModuleRootManagerImpl(
            this,
            ProjectRootManagerImpl.getInstanceImpl(project),
            VirtualFilePointerManager.getInstance()) {
          @Override
          public void loadState(ModuleRootManagerState object) {
            loadState(object, false);
          }
        };
    Disposer.register(
        parentDisposable,
        new Disposable() {
          @Override
          public void dispose() {
            moduleRootManager.disposeComponent();
          }
        });
    getPicoContainer().registerComponentInstance(ModuleRootManager.class, moduleRootManager);
    getPicoContainer()
        .registerComponentInstance(
            PathMacroManager.class, new ModulePathMacroManager(PathMacros.getInstance(), this));
    getPicoContainer()
        .registerComponentInstance(
            ModuleFileIndex.class,
            new ModuleFileIndexImpl(this, DirectoryIndex.getInstance(project)));
    myModuleScopeProvider = createModuleScopeProvider();
  }