Index: pkg/compiler/lib/src/dart_backend/outputter.dart |
diff --git a/pkg/compiler/lib/src/dart_backend/outputter.dart b/pkg/compiler/lib/src/dart_backend/outputter.dart |
index 45da8e904ebdb97053f18b2c7a2573517050293d..7214a18d035a32d439b688d3332782e33c955f2b 100644 |
--- a/pkg/compiler/lib/src/dart_backend/outputter.dart |
+++ b/pkg/compiler/lib/src/dart_backend/outputter.dart |
@@ -96,7 +96,8 @@ class DartOutputter { |
}; |
} |
- libraryInfo = LibraryInfo.processLibraries(libraries, resolvedElements); |
+ libraryInfo = LibraryInfo.processLibraries( |
+ listener, libraries, resolvedElements); |
elementInfo = ElementInfoProcessor.createElementInfo( |
instantiatedClasses, |
@@ -162,7 +163,7 @@ class DartOutputter { |
makePlaceholders(element) { |
collector.collect(element); |
- if (element.isClass) { |
+ if (element.isClass && !element.isEnumClass) { |
elementInfo.classMembers[element].forEach(makePlaceholders); |
} |
} |
@@ -228,6 +229,7 @@ class LibraryInfo { |
this.userLibraries); |
static LibraryInfo processLibraries( |
+ DiagnosticListener listener, |
Iterable<LibraryElement> libraries, |
Iterable<AstElement> resolvedElements) { |
Set<String> fixedStaticNames = new Set<String>(); |
@@ -276,6 +278,11 @@ class LibraryInfo { |
} |
} |
} |
+ |
+ // Map to keep track of names of enum classes. Since these cannot be renamed |
+ // we ensure that they are unique. |
+ Map<String, ClassElement> enumClassMap = <String, ClassElement>{}; |
+ |
// As of now names of named optionals are not renamed. Therefore add all |
// field names used as named optionals into [fixedMemberNames]. |
for (final element in resolvedElements) { |
@@ -286,7 +293,23 @@ class LibraryInfo { |
if (!optional.isInitializingFormal) continue; |
fixedDynamicNames.add(optional.name); |
} |
+ ClassElement cls = element.enclosingClass; |
+ if (cls != null && cls.isEnumClass) { |
+ fixedDynamicNames.add('index'); |
+ |
+ ClassElement existingEnumClass = |
+ enumClassMap.putIfAbsent(cls.name, () => cls); |
+ if (existingEnumClass != cls) { |
+ listener.reportError(cls, MessageKind.GENERIC, |
+ {'text': "Duplicate enum names are not supported in dart2dart."}); |
+ listener.reportInfo(existingEnumClass, MessageKind.GENERIC, |
+ {'text': "This is the other declaration of '${cls.name}'."}); |
+ } |
+ } |
} |
+ |
+ fixedStaticNames.addAll(enumClassMap.keys); |
+ |
// The VM will automatically invoke the call method of objects |
// that are invoked as functions. Make sure to not rename that. |
fixedDynamicNames.add('call'); |
@@ -409,7 +432,6 @@ class ElementInfoProcessor implements ElementInfo { |
} |
void addMember(element) { |
- ElementAst elementAst = parseElementAst(element); |
if (element.isClassMember) { |
ClassElement enclosingClass = element.enclosingClass; |
assert(enclosingClass.isClass); |
@@ -417,10 +439,11 @@ class ElementInfoProcessor implements ElementInfo { |
assert(shouldOutput(enclosingClass)); |
addClass(enclosingClass); |
classMembers[enclosingClass].add(element); |
- processElement(element, elementAst); |
+ if (enclosingClass.isEnumClass) return; |
+ processElement(element, parseElementAst(element)); |
} else { |
if (element.isTopLevel) { |
- addTopLevel(element, elementAst); |
+ addTopLevel(element, parseElementAst(element)); |
} |
} |
} |
@@ -448,12 +471,16 @@ class MainOutputGenerator { |
bool enableMinification: false}) { |
for (Element element in elementInfo.topLevelElements) { |
topLevelNodes.add(elementInfo.elementAsts[element].ast); |
- if (element.isClass && !element.isMixinApplication) { |
+ if (element.isClass) { |
+ ClassElement cls = element; |
+ if (cls.isMixinApplication || cls.isEnumClass) { |
+ continue; |
+ } |
final members = <Node>[]; |
- for (Element member in elementInfo.classMembers[element]) { |
+ for (Element member in elementInfo.classMembers[cls]) { |
members.add(elementInfo.elementAsts[member].ast); |
} |
- memberNodes[elementInfo.elementAsts[element].ast] = members; |
+ memberNodes[elementInfo.elementAsts[cls].ast] = members; |
} |
} |