Skip to content

Instantly share code, notes, and snippets.

@guid-empty
Created March 21, 2018 00:00
Show Gist options
  • Save guid-empty/dee26f5af786caf0ab584c359471fef0 to your computer and use it in GitHub Desktop.
Save guid-empty/dee26f5af786caf0ab584c359471fef0 to your computer and use it in GitHub Desktop.
// wrike.commons
class SymbolResolvedValue {
String name;
Symbol symbol;
SymbolResolvedValue(this.name, this.symbol);
}
I model<T, I extends T>(I model) => model;
SymbolResolvedValue resolve(dynamic resolved) => resolved as SymbolResolvedValue;
Symbol symbolOf(dynamic resolved) => (resolved as SymbolResolvedValue).symbol;
String nameOf(dynamic resolved) => (resolved as SymbolResolvedValue).name;
// our model
class TempTask {
String title;
String parent;
String attachments;
}
class TempFolder {
String parentFolders;
}
void main() {
// codecomplete должен помочь нам избежать ошибок и сопоставить сгенерерованный символ нашему полю (из generic или лямбды)
// чтобы уметь сгенерировать символы в контексте использования, мы должны иметь рабочий код с обращением к конкретному полю нашей модели,
// и по такому обращению однозначно вернуть символ
// это означает, что у нас в любом случае должно быть гдето определенно соответствие между этим конкретным обращением (ключ)
// с соответствующим сгенерированным кодом
model<TempTask, $TempTask>(new $TempTask()).attachments;
model<TempFolder, $TempFolder>(new $TempFolder()).parentFolders;
print(resolve(model<TempTask, $TempTask>(new $TempTask()).attachments).symbol);
print(symbolOf(model<TempTask, $TempTask>(new $TempTask()).title));
print(nameOf(model<TempTask, $TempTask>(new $TempTask()).attachments));
print(nameOf(model<TempTask, $TempTask>(new $TempTask()).title));
}
// generated code
class $TempTask extends Object implements TempTask {
static SymbolResolvedValue get titleResolved => new SymbolResolvedValue('title', #title);
static SymbolResolvedValue get attachmentsResolved => new SymbolResolvedValue('attachments', #attachments);
@override
dynamic noSuchMethod(Invocation invocation) {
if (invocation.memberName == #title) {
return titleResolved;
}
if (invocation.memberName == #attachments) {
return attachmentsResolved;
}
return null;
}
}
class $TempFolder extends Object implements TempFolder {
static SymbolResolvedValue get parentFoldersResolved => new SymbolResolvedValue('parentFolders', #parentFolders);
@override
dynamic noSuchMethod(Invocation invocation) {
if (invocation.memberName == #parentFolders) {
return parentFoldersResolved;
}
return null;
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment