private void lateInitForClass(@Nonnull ClassPathNode classPath) {
		// Since the content displayed is for a whole class, and the tool tabs are scoped to a method, we need to
		// update them when a method is selected. We do so by tracking the caret position for being within the
		// range of one of the methods in the last AST model.
		Box<PathNode<?>> lastPathBox = new Box<>();
		Box<ClassResult> lastResultBox = new Box<>();
		editor.getCaretPosEventStream().addObserver(e -> {
			if (lastConcreteAst == null)
				return;
			ClassInfo declaringClass = classPath.getValue();
			int caret = editor.getCodeArea().getCaretPosition();
			for (ASTElement root : lastConcreteAst) {
				if (root instanceof ASTClass astClass) {
					for (ASTElement child : astClass.children()) {
						ClassMember classMember;
						if (child instanceof ASTMethod astMethod && astMethod.range().within(caret)) {
							String name = astMethod.getName().literal();
							String desc = astMethod.getDescriptor().literal();
							classMember = declaringClass.getDeclaredMethod(name, desc);
						} else if (child instanceof ASTField astField && astField.range().within(caret)) {
							String name = astField.getName().literal();
							String desc = astField.getDescriptor().literal();
							classMember = declaringClass.getDeclaredField(name, desc);
						} else {
							continue;
						}

						PathNode<?> prior = lastPathBox.get();
						if (classMember != null) {
							ClassMemberPathNode memberPath = classPath.child(classMember);
							if (!Objects.equals(prior, memberPath)) {
								lastPathBox.set(memberPath);
								eachChild(UpdatableNavigable.class, c -> c.onUpdatePath(memberPath));
							}
						} else {
							if (!Objects.equals(prior, classPath)) {
								lastPathBox.set(classPath);
								eachChild(UpdatableNavigable.class, c -> c.onUpdatePath(classPath));
							}
						}

						ClassResult oldResult = lastResultBox.get();
						if (oldResult != lastResult) {
							lastResultBox.set(lastResult);
							eachChild(AssemblerBuildConsumer.class, c -> c.consumeClass(lastResult, lastAssembledClass));
						}
						return;
					}
				}
			}
		});

		// Common init
		assemblerToolTabs.onUpdatePath(classPath);
		lateInit();
	}
Called by {@link #onUpdatePath(PathNode)} once before the {@link #path} is set for the first time.
<p/>
Sets up {@link FieldsAndMethodsPane} as a side-tab and sets up notifications for {@link AssemblerToolTabs}
and its children when the selected {@link ClassMember} in the {@link #lastConcreteAst} changes.

@param classPath
		The given path.
recaf-ui/src/main/java/software/coley/recaf/ui/pane/editing/assembler/AssemblerPane.java