====== Types et compatibilités — µcBlockly ======
Ce document décrit le système de typage des blocs : types internes, règles de connexion, pont avec les checks Blockly, et bloc de cast ''variables_cast''.
===== Vue d’ensemble =====
Le typage repose sur **trois couches** :
flowchart LR
subgraph source ["Définition"]
BT["block_types.ts\nTYPE_COMPATIBILITY\nARDUINO_TYPE_TO_INTERNAL"]
REG["block_types_registry.ts\ncheckTypeCompatibility\nBLOCK_TYPE_REGISTRY"]
SH["shared.ts\ngetBlocklyCompatibleChecks"]
end
subgraph runtime ["Exécution Blockly"]
CHK["strict_connection_checker.ts"]
BLK["Blocs : setCheck / setOutput\ngetBlockType()"]
end
BT --> REG
BT --> SH
REG --> CHK
SH --> BLK
REG --> BLK
^ Couche ^ Fichier ^ Rôle ^
| Règles pures | ''src/generators/arduino/block_types.ts'' | Matrice ''TYPE_COMPATIBILITY'', types de cast, helpers ''getCompatibleTypes'' / ''isTypeCompatible'' |
| Registre & vérification | ''src/generators/arduino/block_types_registry.ts'' | Type par bloc (''BLOCK_TYPE_REGISTRY''), ''checkTypeCompatibility'' (alias Blockly ↔ types internes) |
| Checks Blockly | ''src/categories/blockly/shared.ts'' | ''getBlocklyCompatibleChecks'' : convertit un type µcBlockly en checks ''setCheck'' / ''setOutput'' |
| Application runtime | ''src/generators/arduino/strict_connection_checker.ts'' | Connection checker strict au-delà du checker Blockly par défaut |
Les **types internes** (µcBlockly) sont : ''int'', ''float'', ''long'', ''bool'', ''string'', ''char'', ''null''.
Ils ne correspondent pas toujours aux types C++ Arduino émis dans le code généré (ex. ''byte'', ''unsigned int'').
---
===== Matrice ''TYPE_COMPATIBILITY'' =====
Définie dans ''block_types.ts''. Format : ''type_cible → [types_sources_acceptés]''.
La cible inclut toujours elle-même. Une connexion est valide si le type **source** (sortie du bloc enfiché) figure dans la liste de la cible.
^ Type cible ^ Types sources acceptés ^ Remarque ^
| ''int'' | ''int'' | Pas de promotion depuis ''float'' (pas de perte de précision implicite) |
| ''float'' | ''float'', ''int'' | Promotion implicite ''int'' → ''float'' |
| ''long'' | ''long'', ''int'' | Entier long ; ''int'' accepté en entrée |
| ''bool'' | ''bool'' | |
| ''string'' | ''string'', ''char'' | Un caractère peut alimenter une entrée texte |
| ''char'' | ''char'' | |
| ''null'' | ''null'' | Blocs sans valeur typée |
**Types exclus des menus variables** : ''null'', ''array'' (les listes sont typées par leur contenu).
=== Sentinelle ''__NO_TYPE__'' et listes vides ===
* **''__NO_TYPE__''** : type Blockly interne pour « pas encore typé » (variable non initialisée, liste vide, sortie de bloc sans inférence). Les connexions typées sont bloquées tant que le type n’est pas résolu.
* **Listes vides** : pas de valeurs ''{0, 0}'' par défaut ; avertissement utilisateur via ''ARRAY_LIST_UNTYPED_WARNING'' (''array_messages.ts'', ''shared.ts'').
* **Génération** : si le type d’élément reste ''__NO_TYPE__'', le générateur retombe sur ''int'' pour le C++ (''arduino_generator.ts'', ''blocks/array.ts'').
Fonctions associées :
* ''getCompatibleTypes(targetType)'' — liste des sources compatibles pour une cible ;
* ''isTypeCompatible(source, target)'' — test booléen ;
* ''getVariableTypeOptions()'' — liste ordonnée des 11 types Arduino pour **tous** les menus déroulants ;
* ''getArduinoTypeDropdownOptions()'' — options Blockly (libellé + valeur), dans ''variables.ts''.
---
===== Liste centralisée des types Arduino (''ARDUINO_TYPE_KEYS'') =====
Une **seule** liste alimente tous les menus de type :
* ''variables_set_init'' (« mettre … au type … »)
* ''variables_set_type'' (« forcer le type de … »)
* ''variables_cast'' (« de type … »)
* arguments de procédures (''configure_standard_blocks.ts'')
* listes (''array.ts'')
^ Constante / fonction ^ Fichier ^ Rôle ^
| ''ARDUINO_TYPE_KEYS'' | ''block_types.ts'' | 11 clés dans l’ordre Blockly@rduino |
| ''getVariableTypeOptions()'' | ''block_types.ts'' | Retourne une copie de cette liste |
| ''getArduinoTypeLabelKey()'' | ''block_types.ts'' | Clé i18n ''VAR_CAST_TYPE_*'' |
| ''getArduinoTypeDropdownOptions()'' | ''variables.ts'' | Menu Blockly partagé |
| ''ARDUINO_TYPE_TO_CPP'' / ''getCppTypeName()'' | ''block_types.ts'' | Type C++ généré |
| ''ARDUINO_TYPE_TO_INTERNAL'' / ''getInternalTypeForArduinoType()'' | ''block_types.ts'' | Type pour les connexions |
Les libellés traduits utilisent uniquement les clés **''VAR_CAST_TYPE_*''** (fr, en, es, ar).
---
===== Règles Blockly supplémentaires (''checkTypeCompatibility'') =====
''block_types_registry.ts'' complète ''isTypeCompatible'' pour les **alias Blockly** :
^ Situation ^ Compatible ^
| ''bool'' ↔ ''Boolean'' | oui |
| ''string'' ↔ ''String'' | oui |
| ''char'' → ''string'' / ''String'' | oui |
| ''Colour'' ↔ ''String'' / ''string'' | oui (blocs couleur) |
| ''Number'' → ''int'', ''float'', ''long'' | oui (ex. bloc nombre standard) |
| ''int'', ''float'', ''long'' → ''Number'' | oui |
| ''Array'' ↔ ''array'' | oui |
Toute autre paire passe par ''isTypeCompatible'' (matrice ci-dessus).
---
===== Pont Blockly : ''getBlocklyCompatibleChecks'' =====
Dans ''shared.ts'', convertit un type µcBlockly en tableau passé à ''connection.setCheck()'' ou ''block.setOutput()''.
Enrichissements automatiques (mode **non strict**, par défaut) :
^ Type interne présent ^ Checks Blockly ajoutés ^
| ''bool'' | ''Boolean'' |
| ''int'', ''float'', ''long'' | ''Number'' |
| ''string'' | ''String'', ''Colour'' |
| ''array'' | ''Array'' |
**Mode strict** (''strict: true'') : utilisé notamment pour la définition de listes — seul ''float'' ajoute ''Number'', pas ''int'', afin de rejeter les blocs flottants sur une entrée entière stricte.
---
===== Bloc ''variables_cast'' =====
Bloc valeur : ''[entrée VALUE] de type [menu]''.
Fichiers : définition ''categories/blockly/variables.ts'', génération ''generators/arduino/blocks/variables_typed.ts''.
* L’entrée ''VALUE'' accepte **tout** (''setCheck(null)'').
* La sortie est typée dynamiquement selon le menu via ''getBlocklyCompatibleChecks(getInternalTypeForArduinoType(...))''.
=== Menu (partagé avec les autres blocs) ===
^ Clé ''CAST_TYPE'' ^ Libellé FR (clé i18n) ^ Mot-clé C++ généré ^ Type interne (connexions) ^
| ''char'' | ''VAR_CAST_TYPE_CHAR'' | ''char'' | ''char'' |
| ''string'' | ''VAR_CAST_TYPE_STRING'' | ''String'' | ''string'' |
| ''bool'' | ''VAR_CAST_TYPE_BOOL'' | ''bool'' | ''bool'' |
| ''byte'' | ''VAR_CAST_TYPE_BYTE'' | ''byte'' | ''int'' |
| ''int'' | ''VAR_CAST_TYPE_INT'' | ''int'' | ''int'' |
| ''uint'' | ''VAR_CAST_TYPE_UINT'' | ''unsigned int'' | ''int'' |
| ''vint'' | ''VAR_CAST_TYPE_VINT'' | ''volatile int'' | ''int'' |
| ''long'' | ''VAR_CAST_TYPE_LONG'' | ''long'' | ''long'' |
| ''ulong'' | ''VAR_CAST_TYPE_ULONG'' | ''unsigned long'' | ''int'' |
| ''float'' | ''VAR_CAST_TYPE_FLOAT'' | ''float'' | ''float'' |
Constantes : ''ARDUINO_TYPE_KEYS'', ''ARDUINO_TYPE_TO_INTERNAL'', ''ARDUINO_TYPE_TO_CPP'', ''getInternalTypeForArduinoType()'' dans ''block_types.ts''.
Registre dynamique : ''variables_cast: "__DYNAMIC__castType"'' → fonction ''castType'' dans ''block_types_registry.ts''.
Exemple de code généré : branchement d’un get ''toto'' avec cast ''byte'' → ''(byte)(toto)''.
---
===== Types par bloc (''BLOCK_TYPE_REGISTRY'') =====
Chaque bloc a un type statique (''"int"'', ''"string"'', …) ou dynamique (''__DYNAMIC__nomFonction'') dans ''generators/arduino/block_types/.ts''.
Les fonctions dynamiques sont dans ''DYNAMIC_TYPE_FUNCTIONS'' (''block_types_registry.ts'').
Exemples :
* ''variables_get_dynamic'' → type de la variable lue ;
* ''variables_cast'' → ''getInternalTypeForArduinoType(CAST_TYPE)'' ;
* ''math_number'' → ''int'' ou ''float'' selon la valeur / le contexte.
''applyBlockTypesFromRegistry()'' attache ''getBlockType()'' aux définitions Blockly au démarrage.
---
===== Modifier les compatibilités =====
^ Objectif ^ Fichier(s) ^
| Nouvelle règle int/float/string… | ''block_types.ts'' → ''TYPE_COMPATIBILITY'' |
| Nouveau type de cast ou mapping | ''block_types.ts'' → ''ARDUINO_TYPE_KEYS'', ''ARDUINO_TYPE_TO_INTERNAL'', ''ARDUINO_TYPE_TO_CPP'' + libellés ''languages/*.ts'' (''VAR_CAST_TYPE_*'') |
| Alias Blockly (Number, Boolean…) | ''block_types_registry.ts'' → ''checkTypeCompatibility'' |
| Checks ''setCheck'' / ''setOutput'' | ''shared.ts'' → ''getBlocklyCompatibleChecks'' |
| Type d’un bloc spécifique | ''block_types/.ts'' + éventuellement ''DYNAMIC_TYPE_FUNCTIONS'' |
Après modification, vérifier :
npm run build:lib
npm run lint
npm run test
Et tester manuellement les connexions dans l’éditeur (flyout variables, cast, nombres, comparaisons).
---
===== Voir aussi =====
* [[fr:arduino:ucblockly:architecture|ARCHITECTURE.md]] — organisation du dépôt ;
* [[fr:arduino:ucblockly:repartition|REPARTITION_FICHIERS.md]] — répartition ''block_types'' / ''shared'' / ''variables'' ;
* [[fr:arduino:ucblockly:contributing|CONTRIBUTING.md]] — guide contributeur.