69a4f20347
This makes it easier to follow class hierarchies and understand where a class is changing the interface. I hit this when I found a class that had the annotation on some methods it was overriding, but not all, which made it confusing. Prepares for adding the lint rule and enforcing it. 40% of overridden methods were annotated - add annotations to the remaining 60%. Change-Id: I02472f4b6c5026a820cf9ff1a7ada663a60f1868 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/96666 Commit-Queue: Nate Bosch <nbosch@google.com> Reviewed-by: Sigmund Cherem <sigmund@google.com>
333 lines
8.1 KiB
Dart
333 lines
8.1 KiB
Dart
// Copyright (c) 2015, 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 dart2js.operators;
|
|
|
|
import 'names.dart' show PublicName;
|
|
import '../universe/call_structure.dart' show CallStructure;
|
|
import '../universe/selector.dart' show Selector, SelectorKind;
|
|
|
|
enum UnaryOperatorKind {
|
|
NOT,
|
|
NEGATE,
|
|
COMPLEMENT,
|
|
}
|
|
|
|
class UnaryOperator {
|
|
final UnaryOperatorKind kind;
|
|
final String name;
|
|
final String selectorName;
|
|
|
|
const UnaryOperator(this.kind, this.name, this.selectorName);
|
|
|
|
bool get isUserDefinable => selectorName != null;
|
|
|
|
Selector get selector => new Selector(SelectorKind.OPERATOR,
|
|
new PublicName(selectorName), CallStructure.NO_ARGS);
|
|
|
|
@override
|
|
String toString() => name;
|
|
|
|
/// The unary ! operator.
|
|
static const UnaryOperator NOT =
|
|
const UnaryOperator(UnaryOperatorKind.NOT, '!', null);
|
|
|
|
/// The unary - operator.
|
|
static const UnaryOperator NEGATE =
|
|
const UnaryOperator(UnaryOperatorKind.NEGATE, '-', 'unary-');
|
|
|
|
/// The unary ~ operator.
|
|
static const UnaryOperator COMPLEMENT =
|
|
const UnaryOperator(UnaryOperatorKind.COMPLEMENT, '~', '~');
|
|
|
|
static UnaryOperator parse(String value) {
|
|
switch (value) {
|
|
case '!':
|
|
return NOT;
|
|
case '-':
|
|
return NEGATE;
|
|
case '~':
|
|
return COMPLEMENT;
|
|
default:
|
|
return null;
|
|
}
|
|
}
|
|
|
|
// ignore: MISSING_RETURN
|
|
static UnaryOperator fromKind(UnaryOperatorKind kind) {
|
|
switch (kind) {
|
|
case UnaryOperatorKind.NOT:
|
|
return NOT;
|
|
case UnaryOperatorKind.NEGATE:
|
|
return NEGATE;
|
|
case UnaryOperatorKind.COMPLEMENT:
|
|
return COMPLEMENT;
|
|
}
|
|
}
|
|
}
|
|
|
|
enum BinaryOperatorKind {
|
|
EQ,
|
|
NOT_EQ,
|
|
INDEX,
|
|
ADD,
|
|
SUB,
|
|
MUL,
|
|
DIV,
|
|
IDIV,
|
|
MOD,
|
|
SHL,
|
|
SHR,
|
|
GTEQ,
|
|
GT,
|
|
LTEQ,
|
|
LT,
|
|
AND,
|
|
OR,
|
|
XOR,
|
|
LOGICAL_AND,
|
|
LOGICAL_OR,
|
|
IF_NULL,
|
|
}
|
|
|
|
class BinaryOperator {
|
|
final BinaryOperatorKind kind;
|
|
final String name;
|
|
|
|
const BinaryOperator._(this.kind, this.name);
|
|
|
|
/// `true` if this operator can be implemented through an `operator [name]`
|
|
/// method.
|
|
bool get isUserDefinable => true;
|
|
|
|
String get selectorName => name;
|
|
|
|
@override
|
|
String toString() => name;
|
|
|
|
/// The == operator.
|
|
static const BinaryOperator EQ =
|
|
const BinaryOperator._(BinaryOperatorKind.EQ, '==');
|
|
|
|
/// The != operator.
|
|
static const BinaryOperator NOT_EQ = const _NotEqualsOperator();
|
|
|
|
/// The [] operator.
|
|
static const BinaryOperator INDEX =
|
|
const BinaryOperator._(BinaryOperatorKind.INDEX, '[]');
|
|
|
|
/// The binary + operator.
|
|
static const BinaryOperator ADD =
|
|
const BinaryOperator._(BinaryOperatorKind.ADD, '+');
|
|
|
|
/// The binary - operator.
|
|
static const BinaryOperator SUB =
|
|
const BinaryOperator._(BinaryOperatorKind.SUB, '-');
|
|
|
|
/// The binary * operator.
|
|
static const BinaryOperator MUL =
|
|
const BinaryOperator._(BinaryOperatorKind.MUL, '*');
|
|
|
|
/// The binary / operator.
|
|
static const BinaryOperator DIV =
|
|
const BinaryOperator._(BinaryOperatorKind.DIV, '/');
|
|
|
|
/// The binary ~/ operator.
|
|
static const BinaryOperator IDIV =
|
|
const BinaryOperator._(BinaryOperatorKind.IDIV, '~/');
|
|
|
|
/// The binary % operator.
|
|
static const BinaryOperator MOD =
|
|
const BinaryOperator._(BinaryOperatorKind.MOD, '%');
|
|
|
|
/// The binary << operator.
|
|
static const BinaryOperator SHL =
|
|
const BinaryOperator._(BinaryOperatorKind.SHL, '<<');
|
|
|
|
/// The binary >> operator.
|
|
static const BinaryOperator SHR =
|
|
const BinaryOperator._(BinaryOperatorKind.SHR, '>>');
|
|
|
|
/// The binary >= operator.
|
|
static const BinaryOperator GTEQ =
|
|
const BinaryOperator._(BinaryOperatorKind.GTEQ, '>=');
|
|
|
|
/// The binary > operator.
|
|
static const BinaryOperator GT =
|
|
const BinaryOperator._(BinaryOperatorKind.GT, '>');
|
|
|
|
/// The binary <= operator.
|
|
static const BinaryOperator LTEQ =
|
|
const BinaryOperator._(BinaryOperatorKind.LTEQ, '<=');
|
|
|
|
/// The binary < operator.
|
|
static const BinaryOperator LT =
|
|
const BinaryOperator._(BinaryOperatorKind.LT, '<');
|
|
|
|
/// The binary & operator.
|
|
static const BinaryOperator AND =
|
|
const BinaryOperator._(BinaryOperatorKind.AND, '&');
|
|
|
|
/// The binary | operator.
|
|
static const BinaryOperator OR =
|
|
const BinaryOperator._(BinaryOperatorKind.OR, '|');
|
|
|
|
/// The binary ^ operator.
|
|
static const BinaryOperator XOR =
|
|
const BinaryOperator._(BinaryOperatorKind.XOR, '^');
|
|
|
|
/// The logical && operator.
|
|
static const BinaryOperator LOGICAL_AND =
|
|
const _LogicalOperator(BinaryOperatorKind.LOGICAL_AND, '&&');
|
|
|
|
/// The binary | operator.
|
|
static const BinaryOperator LOGICAL_OR =
|
|
const _LogicalOperator(BinaryOperatorKind.LOGICAL_OR, '||');
|
|
|
|
/// The if-null ?? operator.
|
|
static const BinaryOperator IF_NULL =
|
|
const _IfNullOperator(BinaryOperatorKind.IF_NULL, '??');
|
|
|
|
static BinaryOperator parse(String value) {
|
|
switch (value) {
|
|
case '&&':
|
|
return LOGICAL_AND;
|
|
case '||':
|
|
return LOGICAL_OR;
|
|
case '??':
|
|
return IF_NULL;
|
|
default:
|
|
return parseUserDefinable(value);
|
|
}
|
|
}
|
|
|
|
static BinaryOperator parseUserDefinable(String value) {
|
|
switch (value) {
|
|
case '==':
|
|
return EQ;
|
|
case '!=':
|
|
return NOT_EQ;
|
|
case '[]':
|
|
return INDEX;
|
|
case '*':
|
|
return MUL;
|
|
case '/':
|
|
return DIV;
|
|
case '%':
|
|
return MOD;
|
|
case '~/':
|
|
return IDIV;
|
|
case '+':
|
|
return ADD;
|
|
case '-':
|
|
return SUB;
|
|
case '<<':
|
|
return SHL;
|
|
case '>>':
|
|
return SHR;
|
|
case '>=':
|
|
return GTEQ;
|
|
case '>':
|
|
return GT;
|
|
case '<=':
|
|
return LTEQ;
|
|
case '<':
|
|
return LT;
|
|
case '&':
|
|
return AND;
|
|
case '^':
|
|
return XOR;
|
|
case '|':
|
|
return OR;
|
|
default:
|
|
return null;
|
|
}
|
|
}
|
|
|
|
// ignore: MISSING_RETURN
|
|
static BinaryOperator fromKind(BinaryOperatorKind kind) {
|
|
switch (kind) {
|
|
case BinaryOperatorKind.EQ:
|
|
return EQ;
|
|
case BinaryOperatorKind.NOT_EQ:
|
|
return NOT_EQ;
|
|
case BinaryOperatorKind.INDEX:
|
|
return INDEX;
|
|
case BinaryOperatorKind.MUL:
|
|
return MUL;
|
|
case BinaryOperatorKind.DIV:
|
|
return DIV;
|
|
case BinaryOperatorKind.MOD:
|
|
return MOD;
|
|
case BinaryOperatorKind.IDIV:
|
|
return IDIV;
|
|
case BinaryOperatorKind.ADD:
|
|
return ADD;
|
|
case BinaryOperatorKind.SUB:
|
|
return SUB;
|
|
case BinaryOperatorKind.SHL:
|
|
return SHL;
|
|
case BinaryOperatorKind.SHR:
|
|
return SHR;
|
|
case BinaryOperatorKind.GTEQ:
|
|
return GTEQ;
|
|
case BinaryOperatorKind.GT:
|
|
return GT;
|
|
case BinaryOperatorKind.LTEQ:
|
|
return LTEQ;
|
|
case BinaryOperatorKind.LT:
|
|
return LT;
|
|
case BinaryOperatorKind.AND:
|
|
return AND;
|
|
case BinaryOperatorKind.XOR:
|
|
return XOR;
|
|
case BinaryOperatorKind.OR:
|
|
return OR;
|
|
case BinaryOperatorKind.LOGICAL_AND:
|
|
return LOGICAL_AND;
|
|
case BinaryOperatorKind.LOGICAL_OR:
|
|
return LOGICAL_OR;
|
|
case BinaryOperatorKind.IF_NULL:
|
|
return IF_NULL;
|
|
}
|
|
}
|
|
}
|
|
|
|
/// The operator !=, which is not user definable operator but instead is a
|
|
/// negation of a call to user definable operator, namely ==.
|
|
class _NotEqualsOperator extends BinaryOperator {
|
|
const _NotEqualsOperator() : super._(BinaryOperatorKind.NOT_EQ, '!=');
|
|
|
|
@override
|
|
bool get isUserDefinable => false;
|
|
|
|
@override
|
|
String get selectorName => '==';
|
|
}
|
|
|
|
/// The operators && and || which are not user definable operators but control
|
|
/// structures.
|
|
class _LogicalOperator extends BinaryOperator {
|
|
const _LogicalOperator(BinaryOperatorKind kind, String name)
|
|
: super._(kind, name);
|
|
|
|
@override
|
|
bool get isUserDefinable => false;
|
|
|
|
@override
|
|
String get selectorName => null;
|
|
}
|
|
|
|
/// The operators ?? is not user definable.
|
|
class _IfNullOperator extends BinaryOperator {
|
|
const _IfNullOperator(BinaryOperatorKind kind, String name)
|
|
: super._(kind, name);
|
|
|
|
@override
|
|
bool get isUserDefinable => false;
|
|
|
|
@override
|
|
String get selectorName => '??';
|
|
}
|