43 lines
1.3 KiB
Dart
43 lines
1.3 KiB
Dart
// 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 kernel.transformations.infer_types;
|
|
|
|
import '../ast.dart';
|
|
import '../type_propagation/type_propagation.dart';
|
|
|
|
Program transformProgram(Program program) {
|
|
TypePropagation propagation = new TypePropagation(program);
|
|
|
|
var attacher = new InferredValueAttacher(propagation, program);
|
|
attacher.attachInferredValues();
|
|
|
|
return program;
|
|
}
|
|
|
|
class InferredValueAttacher extends RecursiveVisitor {
|
|
final TypePropagation propagation;
|
|
final Program program;
|
|
|
|
InferredValueAttacher(this.propagation, this.program);
|
|
|
|
attachInferredValues() => program.accept(this);
|
|
|
|
visitField(Field node) {
|
|
node.inferredValue = propagation.getFieldValue(node);
|
|
super.visitField(node);
|
|
}
|
|
|
|
visitFunctionNode(FunctionNode node) {
|
|
node.positionalParameters.forEach(_annotateVariableDeclaration);
|
|
node.namedParameters.forEach(_annotateVariableDeclaration);
|
|
node.inferredReturnValue = propagation.getReturnValue(node);
|
|
super.visitFunctionNode(node);
|
|
}
|
|
|
|
_annotateVariableDeclaration(VariableDeclaration variable) {
|
|
variable.inferredValue = propagation.getParameterValue(variable);
|
|
}
|
|
}
|