From 86ff933cc7907379b2718f2478b7b166818e0855 Mon Sep 17 00:00:00 2001 From: Moosieus Date: Mon, 1 Dec 2025 21:19:46 -0500 Subject: [PATCH] Traverse `"extends"` properties and flatten the inherited structure. --- lib/lsp_codegen/structure.ex | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/lib/lsp_codegen/structure.ex b/lib/lsp_codegen/structure.ex index ca21311..7ba0bcb 100644 --- a/lib/lsp_codegen/structure.ex +++ b/lib/lsp_codegen/structure.ex @@ -56,13 +56,26 @@ defmodule LSPCodegen.Structure do end) extends = - Enum.flat_map(structure.extends, fn e -> - Enum.find(structures, &(&1.raw_name == e.name)).properties - end) + Enum.flat_map(structure.extends, &all_properties_for(&1.name, structures)) (structure.properties ++ mixins ++ extends) |> Enum.uniq_by(& &1.name) end + # recursively collects ALL properties for a structure by name + defp all_properties_for(name, structures) do + structure = Enum.find(structures, &(&1.raw_name == name)) + + mixins = + Enum.flat_map(structure.mixins, fn m -> + Enum.find(structures, &(&1.raw_name == m.name)).properties + end) + + extends = + Enum.flat_map(structure.extends, &all_properties_for(&1.name, structures)) + + structure.properties ++ mixins ++ extends + end + defp enforce(value) when value in [false, nil], do: ", enforce: true" defp enforce(true), do: ""