88class Index {
99 private $ fqcns = [];
1010 private $ classes = [];
11+ private $ interfaces = [];
1112 private $ classMap = [];
1213 private $ flippedClassMap = [];
1314 private $ extends = [];
@@ -17,9 +18,10 @@ class Index {
1718 public function getFQCNs (){
1819 return $ this ->fqcns ;
1920 }
20- public function addFQCN (FQCN $ fqcn ){
21- $ this ->fqcns [$ fqcn ->toString ()] = $ fqcn ;
22- }
21+
22+ /**
23+ * @return FQCN
24+ */
2325 public function findFQCNByFile ($ file ){
2426 if (!array_key_exists ($ file , $ this ->flippedClassMap )){
2527 return null ;
@@ -34,28 +36,54 @@ public function findFQCNByFile($file){
3436 return $ this ->fqcns [$ fqcnStr ];
3537 }
3638
37- public function getInterfaces (){
38- return $ this ->interfaces ;
39- }
40- public function addInterface (InterfaceData $ interface ){
41- $ this ->interfaces [$ interface ->fqcn ->toString ()] = $ interface ;
42- }
43-
44- public function getClasses (){
45- return $ this ->classes ;
46- }
39+ /**
40+ * @return ClassData
41+ */
4742 public function findClassByFQCN (FQCN $ fqcn ){
4843 $ str = $ fqcn ->toString ();
4944 if (array_key_exists ($ str , $ this ->classes )){
5045 return $ this ->classes [$ str ];
5146 }
5247 return null ;
5348 }
54- public function addClass (ClassData $ class , $ key = null ){
55- if ($ key )
56- $ this ->classes [$ key ] = $ class ;
57- else
58- $ this ->classes [$ class ->fqcn ->toString ()] = $ class ;
49+
50+ /**
51+ * @return InterfaceData
52+ */
53+ public function findInterfaceByFQCN (FQCN $ fqcn ){
54+ $ str = $ fqcn ->toString ();
55+ if (array_key_exists ($ str , $ this ->interfaces )){
56+ return $ this ->interfaces [$ str ];
57+ }
58+ }
59+ public function findClassChildren (FQCN $ class ){
60+ if (!array_key_exists ($ class ->toString (), $ this ->extends )
61+ || !is_array ($ this ->extends [$ class ->toString ()])
62+ ){
63+ $ this ->extends [$ class ->toString ()] = [];
64+ }
65+ return $ this ->extends [$ class ->toString ()];
66+ }
67+ public function getClasses (){
68+ return $ this ->classes ;
69+ }
70+ public function addClass (ClassData $ class ){
71+ $ this ->classes [$ class ->fqcn ->toString ()] = $ class ;
72+ if (!empty ($ class ->getParent ())){
73+ $ this ->addExtend ($ class , $ class ->getParent ());
74+ }
75+ foreach ($ this ->findClassChildren ($ class ->fqcn ) AS $ child ){
76+ $ child ->setParent ($ class );
77+ }
78+ }
79+ public function addInterface (InterfaceData $ interface ){
80+ $ this ->interfaces [$ interface ->fqcn ->toString ()] = $ interface ;
81+ }
82+ public function getInterfaces (){
83+ return $ this ->interfaces ;
84+ }
85+ public function addFQCN (FQCN $ fqcn ){
86+ $ this ->fqcns [$ fqcn ->toString ()] = $ fqcn ;
5987 }
6088
6189 public function getClassMap (){
@@ -64,27 +92,27 @@ public function getClassMap(){
6492 public function getFlippedClassMap (){
6593 return $ this ->classMap ;
6694 }
67- public function setClassMap (array $ classMap ){
68- $ this ->classMap = $ classMap ;
69- $ this ->flippedClassMap = array_flip ($ classMap );
95+ public function getImplements (){
96+ return $ this ->implements ;
7097 }
7198 public function getExtends (){
7299 return $ this ->extends ;
73100 }
74- public function addExtend ($ class , $ parent ){
75- if (!array_key_exists ($ parent , $ this ->extends )
76- || !is_array ($ this ->extends [$ parent ])){
77- $ this ->extends [$ parent ] = [];
78- }
79- if (!in_array ($ class , $ this ->extends [$ parent ])){
80- $ this ->extends [$ parent ][] = $ class ;
101+
102+ public function setClassMap (array $ classMap ){
103+ $ this ->classMap = $ classMap ;
104+ $ this ->flippedClassMap = array_flip ($ classMap );
105+ }
106+ protected function addExtend (ClassData $ class , FQCN $ parent ){
107+ $ this ->findClassChildren ($ parent );
108+ $ this ->extends [$ parent ->toString ()][$ class ->fqcn ->toString ()] = $ class ;
109+ $ parentClass = $ this ->findClassByFQCN ($ parent );
110+ if ($ parentClass instanceof ClassData){
111+ $ class ->setParent ($ parentClass );
81112 }
82113 }
83114
84- public function getImplements (){
85- return $ this ->implements ;
86- }
87- public function addImplement ($ class , $ interface ){
115+ protected function addImplement ($ class , $ interface ){
88116 if (!array_key_exists ($ interface , $ this ->implements )
89117 || !is_array ($ this ->implements [$ interface ])){
90118 $ this ->implements [$ interface ] = [];
0 commit comments