Created
March 21, 2018 00:00
-
-
Save guid-empty/dee26f5af786caf0ab584c359471fef0 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// 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