@@ -37,8 +37,12 @@ final class PhpNamespace
37
37
/** @var bool */
38
38
private $ bracketedSyntax = false ;
39
39
40
- /** @var string[] */
41
- private $ aliases = [];
40
+ /** @var string[][] */
41
+ private $ aliases = [
42
+ self ::NAME_NORMAL => [],
43
+ self ::NAME_FUNCTION => [],
44
+ self ::NAME_CONSTANT => [],
45
+ ];
42
46
43
47
/** @var ClassType[] */
44
48
private $ classes = [];
@@ -90,44 +94,62 @@ public function getBracketedSyntax(): bool
90
94
* @throws InvalidStateException
91
95
* @return static
92
96
*/
93
- public function addUse (string $ name , string $ alias = null ): self
97
+ public function addUse (string $ name , string $ alias = null , string $ of = self :: NAME_NORMAL ): self
94
98
{
95
99
if (
96
100
!Helpers::isNamespaceIdentifier ($ name , true )
97
101
|| (Helpers::isIdentifier ($ name ) && isset (Helpers::KEYWORDS [strtolower ($ name )]))
98
102
) {
99
- throw new Nette \InvalidArgumentException ("Value ' $ name' is not valid class name. " );
103
+ throw new Nette \InvalidArgumentException ("Value ' $ name' is not valid class/function/constant name. " );
104
+
100
105
} elseif ($ alias && (!Helpers::isIdentifier ($ alias ) || isset (Helpers::KEYWORDS [strtolower ($ alias )]))) {
101
106
throw new Nette \InvalidArgumentException ("Value ' $ alias' is not valid alias. " );
102
107
}
103
108
104
109
$ name = ltrim ($ name , '\\' );
110
+ $ aliases = $ this ->aliases [$ of ];
111
+ $ used = [self ::NAME_NORMAL => $ this ->classes , self ::NAME_FUNCTION => $ this ->functions , self ::NAME_CONSTANT => []][$ of ];
112
+
105
113
if ($ alias === null ) {
106
114
$ base = Helpers::extractShortName ($ name );
107
115
$ counter = null ;
108
116
do {
109
117
$ alias = $ base . $ counter ;
110
118
$ counter ++;
111
- } while ((isset ($ this -> aliases [$ alias ]) && $ this -> aliases [$ alias ] !== $ name ) || isset ($ this -> classes [$ alias ]));
119
+ } while ((isset ($ aliases [$ alias ]) && $ aliases [$ alias ] !== $ name ) || isset ($ used [$ alias ]));
112
120
113
- } elseif (isset ($ this -> aliases [$ alias ]) && $ this -> aliases [$ alias ] !== $ name ) {
121
+ } elseif (isset ($ aliases [$ alias ]) && $ aliases [$ alias ] !== $ name ) {
114
122
throw new InvalidStateException (
115
- "Alias ' $ alias' used already for ' {$ this -> aliases [$ alias ]}', cannot use for ' $ name'. "
123
+ "Alias ' $ alias' used already for ' {$ aliases [$ alias ]}', cannot use for ' $ name'. "
116
124
);
117
- } elseif (isset ($ this -> classes [$ alias ])) {
118
- throw new Nette \InvalidStateException ("Name ' $ alias' used already for ' $ this ->name \\{$ this -> classes [$ alias ]->getName ()}'. " );
125
+ } elseif (isset ($ used [$ alias ])) {
126
+ throw new Nette \InvalidStateException ("Name ' $ alias' used already for ' $ this ->name \\{$ used [$ alias ]->getName ()}'. " );
119
127
}
120
128
121
- $ this ->aliases [$ alias ] = $ name ;
129
+ $ this ->aliases [$ of ][ $ alias ] = $ name ;
122
130
return $ this ;
123
131
}
124
132
125
133
134
+ /** @return static */
135
+ public function addUseFunction (string $ name , string $ alias = null ): self
136
+ {
137
+ return $ this ->addUse ($ name , $ alias , self ::NAME_FUNCTION );
138
+ }
139
+
140
+
141
+ /** @return static */
142
+ public function addUseConstant (string $ name , string $ alias = null ): self
143
+ {
144
+ return $ this ->addUse ($ name , $ alias , self ::NAME_CONSTANT );
145
+ }
146
+
147
+
126
148
/** @return string[] */
127
- public function getUses (): array
149
+ public function getUses (string $ of = self :: NAME_NORMAL ): array
128
150
{
129
- asort ($ this ->aliases );
130
- return $ this ->aliases ;
151
+ asort ($ this ->aliases [ $ of ] );
152
+ return $ this ->aliases [ $ of ] ;
131
153
}
132
154
133
155
@@ -138,24 +160,34 @@ public function unresolveName(string $name): string
138
160
}
139
161
140
162
141
- public function simplifyType (string $ type ): string
163
+ public function simplifyType (string $ type, string $ of = self :: NAME_NORMAL ): string
142
164
{
143
- return preg_replace_callback ('~[\w\x7f-\xff \\\\]+~ ' , function ($ m ) { return $ this ->simplifyName ($ m [0 ]); }, $ type );
165
+ return preg_replace_callback ('~[\w\x7f-\xff \\\\]+~ ' , function ($ m ) use ( $ of ) { return $ this ->simplifyName ($ m [0 ], $ of ); }, $ type );
144
166
}
145
167
146
168
147
- public function simplifyName (string $ name ): string
169
+ public function simplifyName (string $ name, string $ of = self :: NAME_NORMAL ): string
148
170
{
149
171
if (isset (Helpers::KEYWORDS [strtolower ($ name )]) || $ name === '' ) {
150
172
return $ name ;
151
173
}
152
174
$ name = ltrim ($ name , '\\' );
175
+
176
+ if ($ of !== self ::NAME_NORMAL ) {
177
+ foreach ($ this ->aliases [$ of ] as $ alias => $ original ) {
178
+ if (strcasecmp ($ original , $ name ) === 0 ) {
179
+ return $ alias ;
180
+ }
181
+ }
182
+ return $ this ->simplifyName (Helpers::extractNamespace ($ name ) . '\\' ) . Helpers::extractShortName ($ name );
183
+ }
184
+
153
185
$ lower = strtolower ($ name );
154
186
$ res = Strings::startsWith ($ lower , strtolower ($ this ->name ) . '\\' )
155
187
? substr ($ name , strlen ($ this ->name ) + 1 )
156
188
: null ;
157
189
158
- foreach ($ this ->aliases as $ alias => $ original ) {
190
+ foreach ($ this ->aliases [ $ of ] as $ alias => $ original ) {
159
191
if (Strings::startsWith ($ lower . '\\' , strtolower ($ original ) . '\\' )) {
160
192
$ short = $ alias . substr ($ name , strlen ($ original ));
161
193
if (!isset ($ res ) || strlen ($ res ) > strlen ($ short )) {
@@ -164,7 +196,7 @@ public function simplifyName(string $name): string
164
196
}
165
197
}
166
198
167
- return $ res ?: ($ this ->name ? '\\' : '' ) . $ name ;
199
+ return $ res ?? ($ this ->name ? '\\' : '' ) . $ name ;
168
200
}
169
201
170
202
@@ -174,7 +206,7 @@ public function add(ClassType $class): self
174
206
$ name = $ class ->getName ();
175
207
if ($ name === null ) {
176
208
throw new Nette \InvalidArgumentException ('Class does not have a name. ' );
177
- } elseif ($ orig = $ this ->aliases [$ name ] ?? null ) {
209
+ } elseif ($ orig = $ this ->aliases [self :: NAME_NORMAL ][ $ name ] ?? null ) {
178
210
throw new Nette \InvalidStateException ("Name ' $ name' used already as alias for $ orig. " );
179
211
}
180
212
$ this ->classes [$ name ] = $ class ;
@@ -209,6 +241,9 @@ public function addEnum(string $name): ClassType
209
241
210
242
public function addFunction (string $ name ): GlobalFunction
211
243
{
244
+ if ($ orig = $ this ->aliases [self ::NAME_FUNCTION ][$ name ] ?? null ) {
245
+ throw new Nette \InvalidStateException ("Name ' $ name' used already as alias for $ orig. " );
246
+ }
212
247
return $ this ->functions [$ name ] = new GlobalFunction ($ name );
213
248
}
214
249
0 commit comments