Index: pkg/fasta/lib/src/builder/class_builder.dart |
diff --git a/pkg/fasta/lib/src/builder/class_builder.dart b/pkg/fasta/lib/src/builder/class_builder.dart |
new file mode 100644 |
index 0000000000000000000000000000000000000000..5e3bfdf417c3c6c8eb1ab295a17d5087b93423f2 |
--- /dev/null |
+++ b/pkg/fasta/lib/src/builder/class_builder.dart |
@@ -0,0 +1,104 @@ |
+// Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file |
+// for details. All rights reserved. Use of this source code is governed by a |
+// BSD-style license that can be found in the LICENSE file. |
+ |
+library fasta.class_builder; |
+ |
+import 'builder.dart' show |
+ Builder, |
+ ConstructorReferenceBuilder, |
+ LibraryBuilder, |
+ MetadataBuilder, |
+ TypeBuilder, |
+ TypeDeclarationBuilder, |
+ TypeVariableBuilder; |
+ |
+import 'scope.dart' show |
+ AmbiguousBuilder, |
+ Scope; |
+ |
+abstract class ClassBuilder<T extends TypeBuilder, R> |
+ extends TypeDeclarationBuilder<T, R> { |
+ final List<TypeVariableBuilder> typeVariables; |
+ |
+ T supertype; |
+ |
+ List<T> interfaces; |
+ |
+ final Map<String, Builder> members; |
+ |
+ ClassBuilder( |
+ List<MetadataBuilder> metadata, int modifiers, |
+ String name, this.typeVariables, this.supertype, this.interfaces, |
+ this.members, List<T> types, LibraryBuilder parent) |
+ : super(metadata, modifiers, name, types, parent); |
+ |
+ List<ConstructorReferenceBuilder> get constructorReferences => null; |
+ |
+ Map<String, Builder> get constructors; |
+ |
+ Map<String, Builder> get membersInScope => members; |
+ |
+ int resolveTypes(LibraryBuilder library) { |
+ Scope scope; |
+ int count = 0; |
+ if (types != null) { |
+ scope = computeInstanceScope(library.scope); |
+ for (T t in types) { |
+ t.resolveIn(scope); |
+ } |
+ count += types.length; |
+ } |
+ return count; |
+ } |
+ |
+ int resolveConstructors(LibraryBuilder library) { |
+ if (constructorReferences == null) return 0; |
+ Scope scope = computeInstanceScope(library.scope); |
+ for (ConstructorReferenceBuilder ref in constructorReferences) { |
+ ref.resolveIn(scope); |
+ } |
+ return constructorReferences.length; |
+ } |
+ |
+ Scope computeInstanceScope(Scope parent) { |
+ if (typeVariables != null) { |
+ Map<String, Builder> local = <String, Builder>{}; |
+ for (TypeVariableBuilder t in typeVariables) { |
+ local[t.name] = t; |
+ } |
+ parent = new Scope(local, parent, isModifiable: false); |
+ } |
+ return new Scope(membersInScope, parent, isModifiable: false); |
+ } |
+ |
+ /// Used to lookup a static member of this class. |
+ Builder findStaticBuilder(String name, {bool isSetter: false}) { |
+ Builder builder = members[name]; |
+ if (builder?.next != null) { |
+ Builder getterBuilder; |
+ Builder setterBuilder; |
+ Builder current = builder; |
+ while (current != null) { |
+ if (current.isGetter && getterBuilder == null) { |
+ getterBuilder = current; |
+ } else if (current.isSetter && setterBuilder == null) { |
+ setterBuilder = current; |
+ } else { |
+ return new AmbiguousBuilder(builder); |
+ } |
+ current = current.next; |
+ } |
+ builder = isSetter ? setterBuilder : getterBuilder; |
+ } |
+ if (builder == null) { |
+ return null; |
+ } else if (isSetter && builder.isGetter) { |
+ return null; |
+ } else { |
+ return builder.isInstanceMember ? null : builder; |
+ } |
+ } |
+ |
+ Builder findConstructorOrFactory(String name); |
+} |