Files
dexpr/docs/language_info.md
2026-04-07 15:16:19 +03:00

158 lines
4.9 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Language Info Modülü
**Konum:** `src/language_info.rs`
Editör entegrasyonu için dil metadata'sı üretir. Built-in fonksiyonlar, tipe göre metodlar ve host-kayıtlı genişletmeleri JSON formatında dışa aktarır. Frontend editör kütüphanesi (`codemirror-lang-dexpr`) bu JSON'u alarak tip-bazlı autocomplete sağlar.
---
## Yapılar
### FunctionInfo
| Alan | Tip | Açıklama |
|------|-----|----------|
| `name` | `&'static str` | Fonksiyon adı |
| `signature` | `&'static str` | İmza (örn: `"(min, max) -> Number"`) |
| `doc` | `Option<&'static str>` | Opsiyonel açıklama |
### MethodInfo
| Alan | Tip | Açıklama |
|------|-----|----------|
| `name` | `&'static str` | Metod adı |
| `signature` | `&'static str` | İmza (örn: `"() -> String"`) |
| `doc` | `Option<&'static str>` | Opsiyonel açıklama |
### VariableInfo
| Alan | Tip | Açıklama |
|------|-----|----------|
| `name` | `String` | Değişken adı |
| `type_name` | `String` | Tip adı: `String`, `Number`, `Boolean`, `NumberList`, `StringList`, `Object`, `List` |
| `doc` | `Option<String>` | Opsiyonel açıklama |
### LanguageInfo
Tüm metadata'yı toplayan ana yapı.
| Alan | Tip | Açıklama |
|------|-----|----------|
| `functions` | `Vec<FunctionInfo>` | Fonksiyon listesi |
| `methods` | `Vec<(&'static str, Vec<MethodInfo>)>` | Tipe göre metod listesi |
| `variables` | `Vec<VariableInfo>` | Değişken listesi |
---
## Metodlar
### `LanguageInfo::builtin() -> Self`
Tüm built-in fonksiyon ve metodları içeren yeni bir `LanguageInfo` oluşturur.
**Built-in fonksiyonlar:** `log`, `rand`
**Built-in metodlar (tipe göre):**
| Tip | Metodlar |
|-----|----------|
| `String` | `upper`, `lower`, `trim`, `trimStart`, `trimEnd`, `split`, `replace`, `contains`, `startsWith`, `endsWith`, `length`, `charAt`, `substring` |
| `Number` | *(yok)* |
| `Boolean` | *(yok)* |
| `NumberList` | `length`, `len`, `isEmpty`, `first`, `last`, `get`, `contains`, `indexOf`, `slice`, `reverse`, `sort`, `sum`, `avg`, `min`, `max` |
| `StringList` | `length`, `len`, `isEmpty`, `first`, `last`, `get`, `contains`, `indexOf`, `slice`, `reverse`, `sort`, `join` |
| `Object` | `keys`, `values`, `length`, `len`, `contains`, `get` |
| `List` | `length`, `len`, `isEmpty`, `first`, `last`, `get`, `contains`, `indexOf`, `slice`, `reverse`, `join`, `map`, `filter`, `find`, `sort` |
### `add_function(name, signature, doc)`
Host-kayıtlı fonksiyon ekler (VM'deki `register_function` ile eşleşir).
### `add_method(type_name, name, signature, doc)`
Host-kayıtlı metod ekler (VM'deki `register_method` ile eşleşir). Belirtilen tipe ait metod listesine eklenir.
### `add_variable(name, type_name, doc)`
External değişken ekler (VM'deki `set_global` ile eşleşir). Editörde autocomplete ve tip-bazlı metod önerileri için kullanılır.
### `to_json() -> String`
Tüm metadata'yı JSON formatında serileştirir. Frontend editör kütüphanesine gönderilecek çıktıyı üretir.
---
## JSON Formatı
`to_json()` çıktısı:
```json
{
"functions": [
{"name": "log", "signature": "(...args) -> null", "doc": "Print values to output"},
{"name": "getRate", "signature": "(code: String) -> Number", "doc": "Get exchange rate"}
],
"methods": {
"String": [
{"name": "upper", "signature": "() -> String"},
{"name": "toTitleCase", "signature": "() -> String", "doc": "Custom host method"}
],
"Number": [],
"NumberList": [
{"name": "sum", "signature": "() -> Number"}
],
"StringList": [
{"name": "join", "signature": "(delim?: String) -> String"}
]
},
"variables": [
{"name": "price", "type": "Number"},
{"name": "category", "type": "String", "doc": "Product category"}
]
}
```
---
## Kullanım Örneği
```rust
use dexpr::language_info::LanguageInfo;
// 1. Built-in metadata oluştur
let mut info = LanguageInfo::builtin();
// 2. Host fonksiyonları ekle (register_function ile eşleşmeli)
info.add_function("getRate", "(code: String) -> Number", Some("Get exchange rate"));
info.add_function("fetchPrice", "(sku: String) -> Number", None);
// 3. Host metodları ekle (register_method ile eşleşmeli)
info.add_method("String", "toTitleCase", "() -> String", None);
// 4. External değişkenleri ekle (set_global ile eşleşmeli)
info.add_variable("price", "Number", None);
info.add_variable("category", "String", Some("Ürün kategorisi".to_string()));
info.add_variable("items", "StringList", None);
// 5. JSON üret ve frontend'e gönder
let json = info.to_json();
// json -> HTTP response, WebSocket message, vb.
```
---
## Frontend Entegrasyonu
Üretilen JSON doğrudan `codemirror-lang-dexpr` kütüphanesine verilir:
```typescript
import { dexpr } from "codemirror-lang-dexpr";
// Rust'tan gelen JSON parse edilir
const languageInfo = JSON.parse(jsonFromRust);
const extensions = [basicSetup, dexpr(languageInfo)];
```
Detaylar için: [Editor Modülü](editor.md)