blob: fcfc0d39f40c2b12375d6ca7951b8f8d19661283 [file] [log] [blame]
// Copyright (c) 2020, 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/ast/ast.dart';
import 'package:analyzer/src/dart/ast/ast.dart';
import 'package:analyzer/src/dart/element/element.dart';
import 'package:analyzer/src/summary2/linked_unit_context.dart';
import 'package:analyzer/src/summary2/reference.dart';
class LinkedElementBuilder {
final CompilationUnitElementImpl _unitElement;
final Reference _classRef;
final Reference _enumRef;
final Reference _extensionRef;
final Reference _functionRef;
final Reference _getterRef;
final Reference _mixinRef;
final Reference _setterRef;
final Reference _typeAliasRef;
final Reference _variableRef;
var _nextUnnamedExtensionId = 0;
LinkedElementBuilder(LinkedUnitContext unitContext)
: _unitElement = unitContext.reference.element,
_classRef = unitContext.reference.getChild('@class'),
_enumRef = unitContext.reference.getChild('@enum'),
_extensionRef = unitContext.reference.getChild('@extension'),
_functionRef = unitContext.reference.getChild('@function'),
_getterRef = unitContext.reference.getChild('@getter'),
_mixinRef = unitContext.reference.getChild('@mixin'),
_setterRef = unitContext.reference.getChild('@setter'),
_typeAliasRef = unitContext.reference.getChild('@typeAlias'),
_variableRef = unitContext.reference.getChild('@variable');
ClassElementImpl classDeclaration(ClassDeclaration node) {
var element = node.declaredElement as ClassElementImpl;
if (element != null) {
return element;
}
var nameNode = node.name;
element = ClassElementImpl.forLinkedNode(
_unitElement,
_classRef.getChild(nameNode.name),
node,
);
nameNode.staticElement = element;
return element;
}
ClassElementImpl classTypeAlias(ClassTypeAlias node) {
var element = node.declaredElement as ClassElementImpl;
if (element != null) {
return element;
}
var nameNode = node.name;
element = ClassElementImpl.forLinkedNode(
_unitElement,
_classRef.getChild(nameNode.name),
node,
);
nameNode.staticElement = element;
return element;
}
EnumElementImpl enumDeclaration(EnumDeclaration node) {
var element = node.declaredElement as EnumElementImpl;
if (element != null) {
return element;
}
var nameNode = node.name;
element = EnumElementImpl.forLinkedNode(
_unitElement,
_enumRef.getChild(nameNode.name),
node,
);
nameNode.staticElement = element;
return element;
}
ExtensionElementImpl extensionDeclaration(ExtensionDeclarationImpl node) {
var element = node.declaredElement as ExtensionElementImpl;
if (element != null) {
return element;
}
var name = node.name?.name;
var refName = name ?? 'extension-${_nextUnnamedExtensionId++}';
element = ExtensionElementImpl.forLinkedNode(
_unitElement,
_extensionRef.getChild(refName),
node,
);
node.declaredElement = element;
return element;
}
ExecutableElementImpl functionDeclaration(FunctionDeclaration node) {
var element = node.declaredElement as ExecutableElementImpl;
if (element != null) {
return element;
}
var nameNode = node.name;
var name = nameNode.name;
if (node.isGetter) {
element = PropertyAccessorElementImpl.forLinkedNode(
_unitElement,
_getterRef.getChild(name),
node,
);
} else if (node.isSetter) {
element = PropertyAccessorElementImpl.forLinkedNode(
_unitElement,
_setterRef.getChild(name),
node,
);
} else {
element = FunctionElementImpl.forLinkedNode(
_unitElement,
_functionRef.getChild(name),
node,
);
}
nameNode.staticElement = element;
return element;
}
GenericTypeAliasElementImpl functionTypeAlias(FunctionTypeAlias node) {
var element = node.declaredElement as GenericTypeAliasElementImpl;
if (element != null) {
return element;
}
var nameNode = node.name;
element = GenericTypeAliasElementImpl.forLinkedNode(
_unitElement,
_typeAliasRef.getChild(nameNode.name),
node,
);
nameNode.staticElement = element;
return element;
}
GenericTypeAliasElementImpl genericTypeAlias(GenericTypeAlias node) {
var element = node.declaredElement as GenericTypeAliasElementImpl;
if (element != null) {
return element;
}
var nameNode = node.name;
element = GenericTypeAliasElementImpl.forLinkedNode(
_unitElement,
_typeAliasRef.getChild(nameNode.name),
node,
);
nameNode.staticElement = element;
return element;
}
MixinElementImpl mixinDeclaration(MixinDeclaration node) {
var element = node.declaredElement as MixinElementImpl;
if (element != null) {
return element;
}
var nameNode = node.name;
element = MixinElementImpl.forLinkedNode(
_unitElement,
_mixinRef.getChild(nameNode.name),
node,
);
nameNode.staticElement = element;
return element;
}
TopLevelVariableElementImpl topLevelVariable(VariableDeclaration node) {
var element = node.declaredElement as TopLevelVariableElementImpl;
if (element != null) {
return element;
}
var nameNode = node.name;
element = TopLevelVariableElementImpl.forLinkedNodeFactory(
_unitElement,
_variableRef.getChild(nameNode.name),
node,
);
nameNode.staticElement = element;
return element;
}
}