Hi,

again sorry for morning confusion.

After couple months with PDT and DLTK code base I see many performance 
problems, which cannot be fixed without cooperate with DLTK team and/or modify 
API/architecture .

TI - Type Inference
CA - Code Assist
DOMAst - old ast, used by formatter, syntax highlighter and many others ui 
elements. Not persisted.
AST/Compiler AST - second ast, based on DLTK ast.

1. Imports: in theory PDT registering in model all imports. But, while 
resolving references (for example in TI or CA), AST is required to detect 
aliases. Since 5.6 problem will grow up, because will be possible to import 
function and constants. 
To fix this, we require bug 437856 [1]

2. PHPModelUtils: very useful and complex class, highly used while TI, but not 
designed to use with TI :P. Examples:
a) White TI, IContext subclasses can contain SourceModule, ModuleDeclaration 
(AST), namespace name etc.. But methods in this class isn’tt using this, so  
many times they manually asking for source_module, namespace name…  by AST or 
model traversing.
b) Sometimes they are using IContext, sometimes IModelAccessCache, sometimes 
only type hierarchy, sometimes nothing like in traits [2]

3. Bindings: Now available for DOMAst only, and with very generic 
implementation. If I need IType from MethodInvocation:
a) Traverse compiler ast to find IContext and corresponing ASTNode
b) Run TI, with all performance problems (again many ask for ModuleDeclaration 
and traversing over it).
c) Cache It for concrete AST node
If IMethod/IField is required, collect all fields and methods by PHPModelUtils
JDT works different:
a) Binding resolver, always contain map DOMAst => CompilerAST (built while AST 
convert) - I’m still working on converter
b) Contexts are not required, so probably we should build and cache context 
while ast convert
c) Bindings are also cached on corresponding AST nodes and reused later  (here 
we need small DLTK modification)

We also should allow to get IBinding without DOMAst. Just like in JDT.

4. IModelAccessCache: Nice idea, but if TI traverse over more than one 
SourceModule, current implementation it’s usable only for superClass hierarchy. 
Maybe like attributes in IBuildContext 

5. PDT extensions, any: They are not able to cache own informations while TI. 
Would be nice to extend PDT or DLTK for this use case. Maybe like attributes in 
IBuildContext ?

6. CodeAssistCompanion: Duplicate super hierarchy cache. This class should 
provide IModelAccessCache, and share it between contexts.

7. Traits: horrible to debug, nightmare to implement ;). Its not cached, not 
indexed, and not persisted in model. PHPModelUtils many times, have to traverse 
over AST to detect it, next traverse to collect it, and never cache it. 
Fortunately they are still not popular, but later they will degrade 
performance. I asked DLTK team in [1] how it should be implemented. Maybe 
instead of IImportDeclaration could be IMixinContainer / IMixinDeclaration / 
IMixinDetail

8. Array dereference: Now stored on each dereferencable node. So it’s not 
possible to provide one dedicated TI Evaluator and cache it. We should use 
ArrayAccess for this, like JDT :P.

9. Annotations: Still not standard in PHP, but probably they will be part of 
PHP6/ng and we should start thinking about it. DLTK haven’t annotation support 
yet. See IAnnotable in JDT

I have also other ideas, but this simple list is most important for now and 
future.
Sorry for my english :P

[1] - https://bugs.eclipse.org/bugs/show_bug.cgi?id=437856
[2] - https://bugs.eclipse.org/bugs/show_bug.cgi?id=430316

--
Dawid Pakuła 
+48 795 996 064

w3des.net
ul. Grabiszyńska 108/10
53-437 Wrocław
NIP: 894-293-95-95
REGON: 340769757
_______________________________________________
pdt-dev mailing list
pdt-dev@eclipse.org
https://dev.eclipse.org/mailman/listinfo/pdt-dev

Reply via email to