Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(185)

Side by Side Diff: pkg/front_end/lib/src/fasta/kernel/kernel_field_builder.dart

Issue 2941093002: Only attempt to do type inference on fields that lack a declared type. (Closed)
Patch Set: Created 3 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file
2 // for details. All rights reserved. Use of this source code is governed by a 2 // for details. All rights reserved. Use of this source code is governed by a
3 // BSD-style license that can be found in the LICENSE file. 3 // BSD-style license that can be found in the LICENSE file.
4 4
5 library fasta.kernel_field_builder; 5 library fasta.kernel_field_builder;
6 6
7 import 'package:front_end/src/fasta/kernel/body_builder.dart' show BodyBuilder; 7 import 'package:front_end/src/fasta/kernel/body_builder.dart' show BodyBuilder;
8 8
9 import 'package:front_end/src/fasta/kernel/kernel_shadow_ast.dart' 9 import 'package:front_end/src/fasta/kernel/kernel_shadow_ast.dart'
10 show KernelField; 10 show KernelField;
(...skipping 16 matching lines...) Expand all
27 27
28 import '../errors.dart' show internalError; 28 import '../errors.dart' show internalError;
29 29
30 import 'kernel_builder.dart' 30 import 'kernel_builder.dart'
31 show Builder, FieldBuilder, KernelTypeBuilder, MetadataBuilder; 31 show Builder, FieldBuilder, KernelTypeBuilder, MetadataBuilder;
32 32
33 class KernelFieldBuilder extends FieldBuilder<Expression> { 33 class KernelFieldBuilder extends FieldBuilder<Expression> {
34 final Field field; 34 final Field field;
35 final List<MetadataBuilder> metadata; 35 final List<MetadataBuilder> metadata;
36 final KernelTypeBuilder type; 36 final KernelTypeBuilder type;
37 final Token initializerToken; 37 final Token initializerTokenForInference;
38 final bool hasInitializer;
38 39
39 KernelFieldBuilder(this.metadata, this.type, String name, int modifiers, 40 KernelFieldBuilder(
40 Builder compilationUnit, int charOffset, this.initializerToken) 41 this.metadata,
42 this.type,
43 String name,
44 int modifiers,
45 Builder compilationUnit,
46 int charOffset,
47 this.initializerTokenForInference,
48 this.hasInitializer)
41 : field = new KernelField(null, fileUri: compilationUnit?.relativeFileUri) 49 : field = new KernelField(null, fileUri: compilationUnit?.relativeFileUri)
42 ..fileOffset = charOffset, 50 ..fileOffset = charOffset,
43 super(name, modifiers, compilationUnit, charOffset); 51 super(name, modifiers, compilationUnit, charOffset);
44 52
45 bool get hasInitializer => initializerToken != null;
46
47 void set initializer(Expression value) { 53 void set initializer(Expression value) {
48 if (!hasInitializer && value is! NullLiteral && !isConst && !isFinal) { 54 if (!hasInitializer && value is! NullLiteral && !isConst && !isFinal) {
49 internalError("Attempt to set initializer on field without initializer."); 55 internalError("Attempt to set initializer on field without initializer.");
50 } 56 }
51 field.initializer = value..parent = field; 57 field.initializer = value..parent = field;
52 } 58 }
53 59
54 Field build(SourceLibraryBuilder library) { 60 Field build(SourceLibraryBuilder library) {
55 field.name ??= new Name(name, library.target); 61 field.name ??= new Name(name, library.target);
56 if (type != null) { 62 if (type != null) {
57 field.type = type.build(library); 63 field.type = type.build(library);
58 } 64 }
59 bool isInstanceMember = !isStatic && !isTopLevel; 65 bool isInstanceMember = !isStatic && !isTopLevel;
60 field 66 field
61 ..isFinal = isFinal 67 ..isFinal = isFinal
62 ..isConst = isConst 68 ..isConst = isConst
63 ..hasImplicitGetter = isInstanceMember 69 ..hasImplicitGetter = isInstanceMember
64 ..hasImplicitSetter = isInstanceMember && !isConst && !isFinal 70 ..hasImplicitSetter = isInstanceMember && !isConst && !isFinal
65 ..isStatic = !isInstanceMember; 71 ..isStatic = !isInstanceMember;
66 if (initializerToken != null && !initializerToken.isEof) { 72 if (initializerTokenForInference != null &&
73 !initializerTokenForInference.isEof) {
74 assert(type == null);
67 library.loader.typeInferenceEngine.recordField(field); 75 library.loader.typeInferenceEngine.recordField(field);
68 } 76 }
69 return field; 77 return field;
70 } 78 }
71 79
72 Field get target => field; 80 Field get target => field;
73 81
74 @override 82 @override
75 void prepareInitializerInference( 83 void prepareInitializerInference(
76 SourceLibraryBuilder library, ClassBuilder currentClass) { 84 SourceLibraryBuilder library, ClassBuilder currentClass) {
77 if (initializerToken != null && !initializerToken.isEof) { 85 if (initializerTokenForInference != null &&
86 !initializerTokenForInference.isEof) {
78 var memberScope = 87 var memberScope =
79 currentClass == null ? library.scope : currentClass.scope; 88 currentClass == null ? library.scope : currentClass.scope;
80 // TODO(paulberry): Is it correct to pass library.uri into BodyBuilder, or 89 // TODO(paulberry): Is it correct to pass library.uri into BodyBuilder, or
81 // should it be the part URI? 90 // should it be the part URI?
82 var typeInferenceEngine = library.loader.typeInferenceEngine; 91 var typeInferenceEngine = library.loader.typeInferenceEngine;
83 var listener = new TypeInferenceListener(); 92 var listener = new TypeInferenceListener();
84 var typeInferrer = typeInferenceEngine.createTopLevelTypeInferrer( 93 var typeInferrer = typeInferenceEngine.createTopLevelTypeInferrer(
85 listener, field.enclosingClass?.thisType, field); 94 listener, field.enclosingClass?.thisType, field);
86 var bodyBuilder = new BodyBuilder( 95 var bodyBuilder = new BodyBuilder(
87 library, 96 library,
88 this, 97 this,
89 memberScope, 98 memberScope,
90 null, 99 null,
91 typeInferenceEngine.classHierarchy, 100 typeInferenceEngine.classHierarchy,
92 typeInferenceEngine.coreTypes, 101 typeInferenceEngine.coreTypes,
93 currentClass, 102 currentClass,
94 isInstanceMember, 103 isInstanceMember,
95 library.uri, 104 library.uri,
96 typeInferrer); 105 typeInferrer);
97 Parser parser = new Parser(bodyBuilder); 106 Parser parser = new Parser(bodyBuilder);
98 Token token = parser.parseExpression(initializerToken); 107 Token token = parser.parseExpression(initializerTokenForInference);
99 Expression expression = bodyBuilder.popForValue(); 108 Expression expression = bodyBuilder.popForValue();
100 bodyBuilder.checkEmpty(token.charOffset); 109 bodyBuilder.checkEmpty(token.charOffset);
101 initializer = expression; 110 initializer = expression;
102 } 111 }
103 } 112 }
104 113
105 @override 114 @override
106 DartType get builtType => field.type; 115 DartType get builtType => field.type;
107 } 116 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698