Add ElementKind.MIXIN, use it for MixinElement.

Change-Id: Ie95c6c331ff437c4d6b99bfc7f9a3109f47c985b
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/332460
Commit-Queue: Konstantin Shcheglov <scheglov@google.com>
Reviewed-by: Brian Wilkerson <brianwilkerson@google.com>
This commit is contained in:
Konstantin Shcheglov 2023-10-26 18:27:39 +00:00 committed by Commit Queue
parent afa7842594
commit 49ef0be2bc
7 changed files with 30 additions and 18 deletions

View file

@ -94,6 +94,9 @@ ElementKind convertElementKind(engine.ElementKind kind) {
if (kind == engine.ElementKind.METHOD) {
return ElementKind.METHOD;
}
if (kind == engine.ElementKind.MIXIN) {
return ElementKind.MIXIN;
}
if (kind == engine.ElementKind.PARAMETER) {
return ElementKind.PARAMETER;
}

View file

@ -30,6 +30,7 @@ Element? _getContainer(Element element) {
ElementKind.FUNCTION,
ElementKind.GETTER,
ElementKind.METHOD,
ElementKind.MIXIN,
ElementKind.SETTER,
};
return element.thisOrAncestorMatching(
@ -156,6 +157,7 @@ enum CallHierarchyKind {
ElementKind.FUNCTION: function,
ElementKind.GETTER: property,
ElementKind.METHOD: method,
ElementKind.MIXIN: mixin,
ElementKind.SETTER: property,
};

View file

@ -169,7 +169,8 @@ class CreateMethod extends ResolvedCorrectionProducer {
// maybe static
if (target is Identifier) {
staticModifier = target.staticElement?.kind == ElementKind.CLASS ||
target.staticElement?.kind == ElementKind.EXTENSION_TYPE;
target.staticElement?.kind == ElementKind.EXTENSION_TYPE ||
target.staticElement?.kind == ElementKind.MIXIN;
}
// use different utils
var targetPath = targetClassElement.source.fullName;

View file

@ -134,6 +134,7 @@ class ImportLibrary extends MultiCorrectionProducer {
ElementKind.CLASS,
ElementKind.ENUM,
ElementKind.FUNCTION_TYPE_ALIAS,
ElementKind.MIXIN,
ElementKind.TYPE_ALIAS,
]);
} else if (mightBeImplicitConstructor(targetNode)) {

View file

@ -3491,7 +3491,7 @@ mixin A {
''');
_createRefactoringForStartEndComments();
return _assertConditionsError(
"Class 'A' already declares method with name 'res'.");
"Mixin 'A' already declares method with name 'res'.");
}
Future<void> test_bad_conflict_method_shadowsSuperDeclaration() async {

View file

@ -965,34 +965,36 @@ class ElementKind implements Comparable<ElementKind> {
static const ElementKind METHOD = ElementKind('METHOD', 20, "method");
static const ElementKind NAME = ElementKind('NAME', 21, "<name>");
static const ElementKind MIXIN = ElementKind('MIXIN', 21, "mixin");
static const ElementKind NEVER = ElementKind('NEVER', 22, "<never>");
static const ElementKind NAME = ElementKind('NAME', 22, "<name>");
static const ElementKind NEVER = ElementKind('NEVER', 23, "<never>");
static const ElementKind PARAMETER =
ElementKind('PARAMETER', 23, "parameter");
ElementKind('PARAMETER', 24, "parameter");
static const ElementKind PART = ElementKind('PART', 24, "part");
static const ElementKind PART = ElementKind('PART', 25, "part");
static const ElementKind PREFIX = ElementKind('PREFIX', 25, "import prefix");
static const ElementKind PREFIX = ElementKind('PREFIX', 26, "import prefix");
static const ElementKind RECORD = ElementKind('RECORD', 26, "record");
static const ElementKind RECORD = ElementKind('RECORD', 27, "record");
static const ElementKind SETTER = ElementKind('SETTER', 27, "setter");
static const ElementKind SETTER = ElementKind('SETTER', 28, "setter");
static const ElementKind TOP_LEVEL_VARIABLE =
ElementKind('TOP_LEVEL_VARIABLE', 28, "top level variable");
ElementKind('TOP_LEVEL_VARIABLE', 29, "top level variable");
static const ElementKind FUNCTION_TYPE_ALIAS =
ElementKind('FUNCTION_TYPE_ALIAS', 29, "function type alias");
ElementKind('FUNCTION_TYPE_ALIAS', 30, "function type alias");
static const ElementKind TYPE_PARAMETER =
ElementKind('TYPE_PARAMETER', 30, "type parameter");
ElementKind('TYPE_PARAMETER', 31, "type parameter");
static const ElementKind TYPE_ALIAS =
ElementKind('TYPE_ALIAS', 31, "type alias");
ElementKind('TYPE_ALIAS', 32, "type alias");
static const ElementKind UNIVERSE = ElementKind('UNIVERSE', 32, "<universe>");
static const ElementKind UNIVERSE = ElementKind('UNIVERSE', 33, "<universe>");
static const List<ElementKind> values = [
CLASS,
@ -1014,6 +1016,7 @@ class ElementKind implements Comparable<ElementKind> {
LIBRARY,
LOCAL_VARIABLE,
METHOD,
MIXIN,
NAME,
NEVER,
PARAMETER,

View file

@ -550,6 +550,9 @@ class ClassElementImpl extends ClassOrMixinElementImpl
return true;
}
@override
ElementKind get kind => ElementKind.CLASS;
@override
set methods(List<MethodElementImpl> methods) {
assert(!isMixinApplication);
@ -742,10 +745,6 @@ abstract class ClassOrMixinElementImpl extends InterfaceElementImpl {
set isBase(bool isBase) {
setModifier(Modifier.BASE, isBase);
}
/// TODO(scheglov) Do we need a separate kind for `MixinElement`?
@override
ElementKind get kind => ElementKind.CLASS;
}
/// A concrete implementation of a [CompilationUnitElement].
@ -5057,6 +5056,9 @@ class MixinElementImpl extends ClassOrMixinElementImpl
return hasModifier(Modifier.BASE);
}
@override
ElementKind get kind => ElementKind.MIXIN;
@override
List<InterfaceType> get mixins => const [];