@@ -9,6 +9,7 @@ import 'dart:typed_data';
99import 'package:_fe_analyzer_shared/src/scanner/abstract_scanner.dart'
1010 show ScannerConfiguration;
1111import 'package:front_end/src/base/name_space.dart' ;
12+ import 'package:front_end/src/type_inference/inference_results.dart' ;
1213import 'package:kernel/binary/ast_from_binary.dart'
1314 show
1415 BinaryBuilderWithMetadata,
@@ -50,7 +51,9 @@ import 'package:kernel/kernel.dart'
5051 TypeParameter,
5152 VariableDeclaration,
5253 VisitorDefault,
53- VisitorVoidMixin;
54+ VisitorVoidMixin,
55+ VariableGet,
56+ VariableSet;
5457import 'package:kernel/kernel.dart' as kernel show Combinator;
5558import 'package:kernel/reference_from_index.dart' ;
5659import 'package:kernel/target/changed_structure_notifier.dart'
@@ -87,6 +90,9 @@ import '../source/source_compilation_unit.dart' show SourceCompilationUnitImpl;
8790import '../source/source_library_builder.dart'
8891 show ImplicitLanguageVersion, SourceLibraryBuilder;
8992import '../source/source_loader.dart' ;
93+ import '../type_inference/inference_helper.dart' show InferenceHelper;
94+ import '../type_inference/inference_visitor.dart'
95+ show ExpressionEvaluationHelper;
9096import '../util/error_reporter_file_copier.dart' show saveAsGzip;
9197import '../util/experiment_environment_getter.dart'
9298 show enableIncrementalCompilerBenchmarking, getExperimentEnvironment;
@@ -1693,6 +1699,21 @@ class IncrementalCompiler implements IncrementalKernelGenerator {
16931699 hasDeclaredInitializer: true ,
16941700 initializer: def.value.initializer)
16951701 ..fileOffset = def.value.fileOffset);
1702+ } else if (def.value.isInitializingFormal ||
1703+ def.value.isSuperInitializingFormal) {
1704+ // An (super) initializing formal parameter of a constructor
1705+ // should not shadow the field it was used to initialize,
1706+ // so we'll ignore it.
1707+ } else {
1708+ // Non-const variable we should know about but wasn't told
1709+ // about. Maybe the variable was optimized out? Maybe it wasn't
1710+ // captured? Either way there's something shadowing any fields
1711+ // etc.
1712+ extraKnownVariables.add (new VariableDeclarationImpl (
1713+ def.key,
1714+ type: def.value.type,
1715+ isConst: false ,
1716+ )..fileOffset = def.value.fileOffset);
16961717 }
16971718 } else if (existingType is DynamicType ||
16981719 _ExtensionTypeFinder .isOrContainsExtensionType (
@@ -1932,14 +1953,18 @@ class IncrementalCompiler implements IncrementalKernelGenerator {
19321953 new Name (syntheticProcedureName), ProcedureKind .Method , parameters,
19331954 isStatic: isStatic, fileUri: debugLibrary.fileUri);
19341955
1956+ ExpressionEvaluationHelper expressionEvaluationHelper =
1957+ new ExpressionEvaluationHelperImpl (extraKnownVariables);
1958+
19351959 Expression compiledExpression = await lastGoodKernelTarget.loader
19361960 .buildExpression (
19371961 debugLibrary,
19381962 className ?? extensionName,
19391963 (className != null && ! isStatic) || extensionThis != null ,
19401964 procedure,
19411965 extensionThis,
1942- extraKnownVariables);
1966+ extraKnownVariables,
1967+ expressionEvaluationHelper);
19431968
19441969 parameters.body = new ReturnStatement (compiledExpression)
19451970 ..parent = parameters;
@@ -2160,6 +2185,55 @@ class IncrementalCompiler implements IncrementalKernelGenerator {
21602185 }
21612186}
21622187
2188+ // Coverage-ignore(suite): Not run.
2189+ class ExpressionEvaluationHelperImpl implements ExpressionEvaluationHelper {
2190+ final Set <VariableDeclarationImpl > knownButUnavailable = {};
2191+
2192+ ExpressionEvaluationHelperImpl (List <VariableDeclarationImpl > extraKnown) {
2193+ for (VariableDeclarationImpl variable in extraKnown) {
2194+ if (variable.isConst) {
2195+ // We allow const variables - these are inlined (we check
2196+ // `alwaysInlineConstants` in `compileExpression`).
2197+ continue ;
2198+ }
2199+ knownButUnavailable.add (variable);
2200+ }
2201+ }
2202+
2203+ @override
2204+ ExpressionInferenceResult ? visitVariableGet (
2205+ VariableGet node, DartType typeContext, InferenceHelper helper) {
2206+ if (knownButUnavailable.contains (node.variable)) {
2207+ return _returnKnownVariableUnavailable (node, node.variable, helper);
2208+ }
2209+ return null ;
2210+ }
2211+
2212+ @override
2213+ ExpressionInferenceResult ? visitVariableSet (
2214+ VariableSet node, DartType typeContext, InferenceHelper helper) {
2215+ if (knownButUnavailable.contains (node.variable)) {
2216+ return _returnKnownVariableUnavailable (node, node.variable, helper);
2217+ }
2218+ return null ;
2219+ }
2220+
2221+ ExpressionInferenceResult _returnKnownVariableUnavailable (
2222+ Expression node, VariableDeclaration variable, InferenceHelper helper) {
2223+ return new ExpressionInferenceResult (
2224+ variable.type,
2225+ helper.wrapInProblem (
2226+ node,
2227+ codeExpressionEvaluationKnownVariableUnavailable
2228+ .withArguments (variable.name! ),
2229+ node.fileOffset,
2230+ variable.name! .length,
2231+ errorHasBeenReported: false ,
2232+ includeExpression: false ,
2233+ ));
2234+ }
2235+ }
2236+
21632237// Coverage-ignore(suite): Not run.
21642238class _ExtensionTypeFinder extends VisitorDefault <void > with VisitorVoidMixin {
21652239 static bool isOrContainsExtensionType (DartType type) {
0 commit comments