@@ -241,10 +241,37 @@ public static void main(String[] args) {
241
241
242
242
/**
243
243
* If one file defines a name and another uses it as a namespace, we have the
244
- * Constants.COLLDING_PROVIDE_ALIAS_POSTFIX workaround. In partial mode, Clutz can't see all
244
+ * Constants.COLLIDING_PROVIDE_ALIAS_POSTFIX workaround. In partial mode, Clutz can't see all
245
245
* definitions of a name, so the list of names that require aliases must be passed as an input.
246
+ * Also Closure Library uses some names as both classes and namespases. For example,
247
+ * `goog.ui.Component` is not only a class but also a namespace in `goog.ui.Component.EventType`.
246
248
*/
247
- private Set <String > collidingProvides = new LinkedHashSet <>();
249
+ private Set <String > collidingProvides =
250
+ Sets .newHashSet (
251
+ "goog.ui.AdvancedTooltip" ,
252
+ "goog.ui.AnimatedZippy" ,
253
+ "goog.ui.Checkbox" ,
254
+ "goog.ui.ColorPicker" ,
255
+ "goog.ui.Component" ,
256
+ "goog.ui.Container" ,
257
+ "goog.ui.Control" ,
258
+ "goog.ui.Dialog" ,
259
+ "goog.ui.FilteredMenu" ,
260
+ "goog.ui.HoverCard" ,
261
+ "goog.ui.Menu" ,
262
+ "goog.ui.MenuItem" ,
263
+ "goog.ui.ModalPopup" ,
264
+ "goog.ui.Ratings" ,
265
+ "goog.ui.ScrollFloater" ,
266
+ "goog.ui.SliderBase" ,
267
+ "goog.ui.SplitPane" ,
268
+ "goog.ui.TableSorter" ,
269
+ "goog.ui.Textarea" ,
270
+ "goog.ui.TriStateMenuItem" ,
271
+ "goog.ui.Zippy" ,
272
+ "goog.ui.editor.AbstractDialog" ,
273
+ "goog.ui.editor.LinkDialog" ,
274
+ "goog.ui.tree.BaseNode" );
248
275
249
276
DeclarationGenerator (Options opts ) {
250
277
this .opts = opts ;
@@ -397,7 +424,7 @@ String generateDeclarations(
397
424
legacyNamespaceReexportMap =
398
425
new LegacyNamespaceReexportMapBuilder ()
399
426
.build (compiler .getParsedInputs (), opts .depgraph .getGoogProvides ());
400
- collidingProvides = opts .collidingProvides ;
427
+ collidingProvides . addAll ( opts .collidingProvides ) ;
401
428
}
402
429
403
430
unknownType = compiler .getTypeRegistry ().getNativeType (JSTypeNative .UNKNOWN_TYPE );
@@ -487,7 +514,7 @@ String produceDts(Depgraph depgraph) {
487
514
rewrittenProvides .add (rewritenProvide );
488
515
}
489
516
if (needsAlias (shadowedProvides , provide , symbol )) {
490
- emitName += Constants .COLLDING_PROVIDE_ALIAS_POSTFIX ;
517
+ emitName += Constants .COLLIDING_PROVIDE_ALIAS_POSTFIX ;
491
518
}
492
519
if (symbol == null ) {
493
520
// Sometimes goog.provide statements are used as pure markers for dependency management, or
@@ -833,7 +860,7 @@ private void processExternSymbols() {
833
860
boolean isDefault = isDefaultExport (symbol );
834
861
String emitName = symbol .getName ();
835
862
if (needsAlias (shadowedSymbols , symbol .getName (), symbol )) {
836
- emitName += Constants .COLLDING_PROVIDE_ALIAS_POSTFIX ;
863
+ emitName += Constants .COLLIDING_PROVIDE_ALIAS_POSTFIX ;
837
864
}
838
865
839
866
// There is nothing to emit for a namespace, because all its symbols will be visited later,
@@ -1458,6 +1485,9 @@ private TreeWalker(
1458
1485
1459
1486
private String getAbsoluteName (ObjectType objectType ) {
1460
1487
String name = objectType .getDisplayName ();
1488
+ if (collidingProvides .contains (name )) {
1489
+ name += Constants .COLLIDING_PROVIDE_ALIAS_POSTFIX ;
1490
+ }
1461
1491
// Names that do not have a namespace '.' are either platform names in the top level
1462
1492
// namespace like `Object` or `Element`, or they are unqualified `goog.provide`s, e.g.
1463
1493
// `goog.provide('Toplevel')`. In both cases they will be found with the naked name.
@@ -1486,7 +1516,7 @@ private void walk(TypedVar symbol, String emitName) {
1486
1516
// Since closure inlines all aliases before this step, check against
1487
1517
// the type name.
1488
1518
if (!isAliasedClassOrInterface (symbol , ftype )) {
1489
- visitClassOrInterface (getUnqualifiedName (symbol ), ftype );
1519
+ visitClassOrInterface (getUnqualifiedName (emitName ), ftype );
1490
1520
} else {
1491
1521
if (KNOWN_CLASS_ALIASES .containsKey (symbol .getName ())) {
1492
1522
visitKnownTypeValueAlias (
0 commit comments