O Dext Framework exige um motor de geração (scaffolding) de altíssima performance e com excelente Developer Experience (DX).
Conforme definido na arquitetura evolutiva do framework, o mecanismo de scaffolding ocorre em dois níveis separados inspirados no ecossistema .NET:
-
Project Templates (
dotnet newstyle): Projetos-base que são mantidos como código Delphi 100% válido (arquivos.dpr,.pas,.dprojque compilam isoladamente na sua pasta). São controlados por um manifesto (dext-template.json) que orienta substituições globais de texto (como Nomes de Projeto, Namespaces e GUIDs do sistema). É muito mais fácil para nós mantermos projetos base sem templates inline intrusivos. -
Code Scaffolding (T4 / Razor Engine style): Utilizado para geração de arquivos baseados em modelos reais (ex: ler o banco de dados via
ISchemaProvidere cuspir uma Unit de Entidade preenchida). Para essa fase, o motor precisa de abstração imperativa: laços (for), condições (if) e formatações parciais.
Concordando 100% com a visão arquitetural moderna: rejeitamos a limitação "logic-less" do Mustache ({{ }}). Embora o Mustache sirva bem para views muito simples, o Scaffolding avançado demanda acesso a sub-nós organizados. Além disso, a sintaxe T4 (<#= Model #>) polui excessivamente a leitura do programador.
O Dext adota uma sintaxe similar ao Razor (no .NET) e ao WebStencils, baseada no indicador @, que flui naturalmente sem concorrer com a gramática rígida do Delphi (como chaves e colchetes).
A avaliação de expressões utiliza o prefixo @.
// Template Válido em Sintaxe Dext-Razor
unit @Model.Namespace.Entities;
interface
type
[Table('@Model.TableName')]
T@Model.EntityName = class(TEntity)
private
FId: Integer;
public
// ...
end;Diferente do C# no Razor, que acopla blocos estruturais em chaves { }, no Delphi as chaves são meros comentários. Logo, para suportar indentação adequada sem depender do parser imperfeito do texto, adotamos delimitação clara via @endif ou blocos inline:
@if (Col.IsPrimaryKey)
[PK, AutoInc]
@endif
property @Col.Name: @Col.DataType;O motor entende a capacidade de caminhar em Generics e listas que foram registradas para a RTTI otimizada.
@foreach (Col in Model.Columns)
F@Col.Name: @Col.DataType;
@endforeachString manipulations nativos acoplados por sintaxe pipe/dot na avaliação sem gerar ruído:
T@Model.TableName.ToPascalCase() = class(TDataApi)Extensões Built-in fundamentais para o Scaffolding:
.ToPascalCase(),.ToCamelCase(),.ToSnakeCase().Pluralize(),.Singularize()
A implementação do motor utiliza um parser descendente recursivo para preencher uma AST:
TTextNode: Texto fonte cru.TExpressionNode: A injeção reativa (@EntityName.ToPascalCase()).TConditionalNode: Bloco em memória avaliado se a condição@iffor Truthy.TLoopNode: Bloco em memória repetido com base num iterável interno.
O motor utiliza o sistema de Reflection do Delphi (RTTI), com planos futuros de migração para o TTypeHandlerRegistry (S07) para eliminar o overhead de TValue.
O motor suporta dois contextos de renderização:
- Raw Mode: Texto puro (padrão para Scaffolding).
- HTML Mode: Auto-escaping de entidades HTML (padrão para Web Views).
Para transparência e guia futuro, o motor atual (Dext.Templating) situa-se no seguinte espectro tecnológico:
| Recurso | Mustache / Logic-less | Dext (S09) | WebStencils | .NET Razor |
|---|---|---|---|---|
| Parsing | Regex / Text Replace | AST Parser | AST Parser | Fully Compiled |
| Lógica | "Logic-less" (Apenas Tags) | If / ForEach | If / For / Each | Full C# Logic |
| Segurança | Escape Manual | Auto-HTML Escape | Native Escape | Contextual Escape |
| Composição | Apenas Partials | Manual (Workaround) | Layouts / Sections | Layouts / Sections |
| Tipagem | Dinâmica / Nenhuma | Dinâmica (RTTI) | Dinâmica | Strongly Typed |
O motor atual é classificado como "Scaffolding++". Ele supera os motores de geração de código tradicionais pela inteligência do parser AST e segurança nativa, mas para atingir o nível industrial de um Full View Engine (como o Razor), as funcionalidades de composição avançada foram movidas para a especificação S10.
- Limpeza: Remover resquícios de motores antigos.
- S01 Integration: Iniciar implementação dos templates de Scaffolding (Entidade, DTO, Repository).