blob: 4ee405d61a2b54c0ad715c159985688fa7e78cc7 [file] [log] [blame]
// Copyright (c) 2019, 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.
import 'package:analyzer/dart/element/element.dart';
import 'package:analyzer/dart/element/type.dart';
import 'package:analyzer/src/dart/element/element.dart';
import 'package:analyzer/src/dart/element/type_algebra.dart';
import 'package:analyzer/src/dart/resolver/scope.dart';
import 'package:analyzer/src/generated/resolver.dart';
import 'package:analyzer/src/summary2/ast_resolver.dart';
import 'package:analyzer/src/summary2/link.dart';
import 'package:analyzer/src/summary2/linked_unit_context.dart';
import 'package:analyzer/src/summary2/reference.dart';
class DefaultValueResolver {
Linker _linker;
LibraryElementImpl _libraryElement;
LinkedUnitContext _linkedContext;
ClassElement _enclosingClassElement;
ExecutableElement _enclosingExecutableElement;
Scope _libraryScope;
Scope _classScope;
AstResolver _astResolver;
DefaultValueResolver(this._linker, Reference libraryRef) {
_libraryElement = _linker.elementFactory.elementOfReference(libraryRef);
_libraryScope = LibraryScope(_libraryElement);
}
void resolve() {
for (CompilationUnitElementImpl unit in _libraryElement.units) {
_linkedContext = unit.linkedContext;
for (var classElement in unit.types) {
_enclosingClassElement = classElement;
_classScope = TypeParameterScope(_libraryScope, classElement);
for (var element in classElement.constructors) {
_constructor(element);
}
for (var element in classElement.methods) {
_method(element);
}
_enclosingClassElement = null;
_classScope = null;
}
for (var element in unit.functions) {
_function(element);
}
}
}
void _constructor(ConstructorElementImpl element) {
if (element.isSynthetic) return;
_astResolver = null;
_enclosingExecutableElement = element;
_parameters(element.parameters);
}
void _function(FunctionElementImpl element) {
_astResolver = null;
_enclosingExecutableElement = element;
_parameters(element.parameters);
}
void _method(MethodElementImpl element) {
_astResolver = null;
_enclosingExecutableElement = element;
_parameters(element.parameters);
}
void _parameter(ParameterElementImpl parameter) {
if (parameter.isNotOptional) return;
// LinkedNodeBuilder node = parameter.linkedNode;
// var unresolvedNode = node.defaultFormalParameter_defaultValue;
// if (unresolvedNode == null) return;
//
// var reader = AstBinaryReader(_linkedContext);
// var unresolvedAst = reader.readNode(unresolvedNode);
//
// if (_astResolver == null) {
// var scope = FunctionScope(
// _classScope ?? _libraryScope,
// _enclosingExecutableElement,
// );
// _astResolver = AstResolver(_linker, _libraryElement, scope);
// }
//
// var contextType = TypeVariableEliminator(_linker.typeProvider)
// .substituteType(parameter.type);
// InferenceContext.setType(unresolvedAst, contextType);
//
// var resolvedNode = _astResolver.resolve(
// _linkedContext,
// unresolvedAst,
// enclosingClassElement: _enclosingClassElement,
// enclosingExecutableElement: _enclosingExecutableElement,
// );
// node.defaultFormalParameter_defaultValue = resolvedNode;
}
void _parameters(List<ParameterElement> parameters) {
for (var parameter in parameters) {
_parameter(parameter);
}
}
}
class TypeVariableEliminator extends Substitution {
final TypeProvider _typeProvider;
TypeVariableEliminator(this._typeProvider);
@override
DartType getSubstitute(TypeParameterElement parameter, bool upperBound) {
return upperBound ? _typeProvider.nullType : _typeProvider.objectType;
}
}