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

Unified Diff: pkg/dev_compiler/lib/src/compiler/code_generator.dart

Issue 2781443003: Fix #28120, strong mode allows field overrides (Closed)
Patch Set: fix Created 3 years, 9 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 side-by-side diff with in-line comments
Download patch
Index: pkg/dev_compiler/lib/src/compiler/code_generator.dart
diff --git a/pkg/dev_compiler/lib/src/compiler/code_generator.dart b/pkg/dev_compiler/lib/src/compiler/code_generator.dart
index 50d6c19e5535a112484041abfd2cd437bdcaf34b..57385514e6147b03e2533fd7c3c427ed8da50754 100644
--- a/pkg/dev_compiler/lib/src/compiler/code_generator.dart
+++ b/pkg/dev_compiler/lib/src/compiler/code_generator.dart
@@ -39,7 +39,6 @@ import '../closure/closure_annotator.dart' show ClosureAnnotator;
import '../js_ast/js_ast.dart' as JS;
import '../js_ast/js_ast.dart' show js;
import 'ast_builder.dart' show AstBuilder;
-import 'class_property_model.dart';
import 'compiler.dart' show BuildUnit, CompilerOptions, JSModuleFile;
import 'element_helpers.dart';
import 'element_loader.dart' show ElementLoader;
@@ -50,6 +49,7 @@ import 'js_names.dart' as JS;
import 'js_typeref_codegen.dart' show JsTypeRefCodegen;
import 'module_builder.dart' show pathToJSIdentifier;
import 'nullable_type_inference.dart' show NullableTypeInference;
+import 'property_model.dart';
import 'reify_coercions.dart' show CoercionReifier;
import 'side_effect_analysis.dart' show ConstFieldVisitor, isStateless;
import 'type_utilities.dart';
@@ -156,6 +156,10 @@ class CodeGenerator extends GeneralizingAstVisitor
/// class we're currently compiling, or `null` if we aren't compiling a class.
ClassPropertyModel _classProperties;
+ /// Information about virtual fields for all libraries in the current build
+ /// unit.
+ final virtualFields = new VirtualFieldModel();
+
CodeGenerator(
AnalysisContext c, this.summaryData, this.options, this._extensionTypes)
: context = c,
@@ -246,7 +250,7 @@ class CodeGenerator extends GeneralizingAstVisitor
// Transform the AST to make coercions explicit.
compilationUnits = CoercionReifier.reify(compilationUnits);
- if (compilationUnits.any((u) => _isDartRuntime(
+ if (compilationUnits.any((u) => isSdkInternalRuntime(
resolutionMap.elementDeclaredByCompilationUnit(u).library))) {
// Don't allow these to be renamed when we're building the SDK.
// There is JS code in dart:* that depends on their names.
@@ -266,7 +270,7 @@ class CodeGenerator extends GeneralizingAstVisitor
resolutionMap.elementDeclaredByCompilationUnit(unit).library;
if (unit.element != library.definingCompilationUnit) continue;
- var libraryTemp = _isDartRuntime(library)
+ var libraryTemp = isSdkInternalRuntime(library)
? _runtimeModule
: new JS.TemporaryId(jsLibraryName(_libraryRoot, library));
_libraries[library] = libraryTemp;
@@ -275,7 +279,7 @@ class CodeGenerator extends GeneralizingAstVisitor
// dart:_runtime has a magic module that holds extension method symbols.
// TODO(jmesserly): find a cleaner design for this.
- if (_isDartRuntime(library)) {
+ if (isSdkInternalRuntime(library)) {
items.add(new JS.ExportDeclaration(js
.call('const # = Object.create(null)', [_extensionSymbolsModule])));
}
@@ -286,7 +290,7 @@ class CodeGenerator extends GeneralizingAstVisitor
var nodes = new HashMap<Element, AstNode>.identity();
var sdkBootstrappingFns = new List<FunctionElement>();
for (var unit in compilationUnits) {
- if (_isDartRuntime(
+ if (isSdkInternalRuntime(
resolutionMap.elementDeclaredByCompilationUnit(unit).library)) {
sdkBootstrappingFns.addAll(
resolutionMap.elementDeclaredByCompilationUnit(unit).functions);
@@ -830,7 +834,8 @@ class CodeGenerator extends GeneralizingAstVisitor
var extensions = _extensionsToImplement(classElem);
var savedClassProperties = _classProperties;
- _classProperties = new ClassPropertyModel.build(classElem, extensions);
+ _classProperties =
+ new ClassPropertyModel.build(virtualFields, classElem, extensions);
var classExpr = _emitClassExpression(
classElem, _emitClassMethods(node, ctors, fields),
@@ -2520,7 +2525,7 @@ class CodeGenerator extends GeneralizingAstVisitor
var element = resolutionMap.elementDeclaredByFunctionDeclaration(node);
var nameExpr = _emitTopLevelName(element);
body.add(annotate(js.statement('# = #', [nameExpr, fn]), node, element));
- if (!_isDartRuntime(element.library)) {
+ if (!isSdkInternalRuntime(element.library)) {
body.add(_emitFunctionTagged(nameExpr, element.type, topLevel: true)
.toStatement());
}
@@ -4093,7 +4098,7 @@ class CodeGenerator extends GeneralizingAstVisitor
// Treat dart:runtime stuff as safe to eagerly evaluate.
// TODO(jmesserly): it'd be nice to avoid this special case.
- var isJSTopLevel = field.isFinal && _isDartRuntime(element.library);
+ var isJSTopLevel = field.isFinal && isSdkInternalRuntime(element.library);
if (eagerInit || isJSTopLevel) {
// Remember that we emitted it this way, so re-export can take advantage
// of this fact.
@@ -5023,7 +5028,7 @@ class CodeGenerator extends GeneralizingAstVisitor
if (isSuper &&
!member.isSynthetic &&
member is FieldElementImpl &&
- !member.isVirtual) {
+ !virtualFields.isVirtual(member)) {
// If super.x is a sealed field, then x is an instance property since
// subclasses cannot override x.
jsTarget = new JS.This();
@@ -6020,9 +6025,6 @@ bool isLibraryPrefix(Expression node) =>
LibraryElement _getLibrary(AnalysisContext c, String uri) =>
c.computeLibraryElement(c.sourceFactory.forUri(uri));
-bool _isDartRuntime(LibraryElement l) =>
- l.isInSdk && l.source.uri.toString() == 'dart:_runtime';
-
/// Returns `true` if [target] is a prefix for a deferred library and [name]
/// is "loadLibrary".
///
« no previous file with comments | « pkg/dev_compiler/lib/src/compiler/class_property_model.dart ('k') | pkg/dev_compiler/lib/src/compiler/element_helpers.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698