Normalize expression precedence between analyzer and front_end.

Several places in the analyzer and the analysis server were using
hardcoded integers to represent precedence, rather than referring to
constants defined in the front_end.  This led to some subtle
off-by-one errors, because the old analyzer convention (prior to
integration with the front_end parser) used 0 to represent the lowest
precedence of an expression (and -1000 to represent the precedence of
non-expressions), whereas the front_end convention is for 1 to
represent the lowest precedence of an expression.  As far as I can
tell there was no user visible impact, but it made it very difficult
to reason about operator precedence.

This CL updates the analyzer and the analysis server so that they
don't hardcode any precedence values; instead they refer to named
constants in the front end.

In a follow-up CL I'll reduce some hardcoded precedence numbers in the
front end itself.

Change-Id: Id3869afeb83042cc7d6630a0a4a0533a07058736
Reviewed-on: https://dart-review.googlesource.com/c/93964
Reviewed-by: Konstantin Shcheglov <scheglov@google.com>
diff --git a/pkg/analysis_server/lib/src/services/correction/fix_internal.dart b/pkg/analysis_server/lib/src/services/correction/fix_internal.dart
index 6e26b0a..628005d 100644
--- a/pkg/analysis_server/lib/src/services/correction/fix_internal.dart
+++ b/pkg/analysis_server/lib/src/services/correction/fix_internal.dart
@@ -676,7 +676,7 @@
       // TODO(brianwilkerson) Consider updating the right operand.
       return;
     }
-    bool needsParentheses = target.precedence < 15;
+    bool needsParentheses = target.precedence < POSTFIX_PRECEDENCE;
     if (((_isDartCoreIterable(fromType) || _isDartCoreList(fromType)) &&
             _isDartCoreList(toType)) ||
         (_isDartCoreSet(fromType) && _isDartCoreSet(toType))) {
diff --git a/pkg/analysis_server/lib/src/services/correction/util.dart b/pkg/analysis_server/lib/src/services/correction/util.dart
index 9ea11e0..72a1b02 100644
--- a/pkg/analysis_server/lib/src/services/correction/util.dart
+++ b/pkg/analysis_server/lib/src/services/correction/util.dart
@@ -300,17 +300,17 @@
 }
 
 /**
- * Returns [getExpressionPrecedence] for the parent of [node], or `0` if the
- * parent node is a [ParenthesizedExpression].
+ * Returns [getExpressionPrecedence] for the parent of [node], or
+ * ASSIGNMENT_PRECEDENCE if the parent node is a [ParenthesizedExpression].
  *
  * The reason is that `(expr)` is always executed after `expr`.
  */
 int getExpressionParentPrecedence(AstNode node) {
   AstNode parent = node.parent;
   if (parent is ParenthesizedExpression) {
-    return 0;
+    return ASSIGNMENT_PRECEDENCE;
   } else if (parent is IndexExpression && parent.index == node) {
-    return 0;
+    return ASSIGNMENT_PRECEDENCE;
   } else if (parent is AssignmentExpression &&
       node == parent.rightHandSide &&
       parent.parent is CascadeExpression) {
@@ -319,19 +319,20 @@
     // expressions are equal it sometimes means that we don't need parentheses
     // (such as replacing the `b` in `a + b` with `c + d`) and sometimes do
     // (such as replacing the `v` in `..f = v` with `a..b`).
-    return 3;
+    return CONDITIONAL_PRECEDENCE;
   }
   return getExpressionPrecedence(parent);
 }
 
 /**
- * Returns the precedence of [node] it is an [Expression], negative otherwise.
+ * Returns the precedence of [node] it is an [Expression], NO_PRECEDENCE
+ * otherwise.
  */
 int getExpressionPrecedence(AstNode node) {
   if (node is Expression) {
     return node.precedence;
   }
-  return -1000;
+  return NO_PRECEDENCE;
 }
 
 /**
diff --git a/pkg/analysis_server/lib/src/services/refactoring/inline_method.dart b/pkg/analysis_server/lib/src/services/refactoring/inline_method.dart
index 4d7b4e2..78a4586 100644
--- a/pkg/analysis_server/lib/src/services/refactoring/inline_method.dart
+++ b/pkg/analysis_server/lib/src/services/refactoring/inline_method.dart
@@ -14,6 +14,7 @@
 import 'package:analysis_server/src/services/search/search_engine.dart';
 import 'package:analyzer/dart/analysis/results.dart';
 import 'package:analyzer/dart/ast/ast.dart';
+import 'package:analyzer/dart/ast/token.dart';
 import 'package:analyzer/dart/ast/visitor.dart';
 import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/src/dart/analysis/session_helper.dart';
@@ -79,7 +80,7 @@
         return;
       }
       // an optional parameter
-      argumentPrecedence = -1000;
+      argumentPrecedence = NO_PRECEDENCE;
       argumentSource = parameter.defaultValueCode;
       if (argumentSource == null) {
         argumentSource = 'null';
@@ -416,6 +417,7 @@
 class _ParameterOccurrence {
   final int parentPrecedence;
   final SourceRange range;
+
   _ParameterOccurrence(this.parentPrecedence, this.range);
 }
 
diff --git a/pkg/analyzer/lib/dart/ast/token.dart b/pkg/analyzer/lib/dart/ast/token.dart
index 73e0562..55874de 100644
--- a/pkg/analyzer/lib/dart/ast/token.dart
+++ b/pkg/analyzer/lib/dart/ast/token.dart
@@ -7,4 +7,25 @@
  * referenced from the [AST structure](ast.dart).
  */
 export 'package:front_end/src/scanner/token.dart'
-    show Keyword, Token, TokenType;
+    show
+        Keyword,
+        Token,
+        TokenType,
+        NO_PRECEDENCE,
+        ASSIGNMENT_PRECEDENCE,
+        CASCADE_PRECEDENCE,
+        CONDITIONAL_PRECEDENCE,
+        IF_NULL_PRECEDENCE,
+        LOGICAL_OR_PRECEDENCE,
+        LOGICAL_AND_PRECEDENCE,
+        EQUALITY_PRECEDENCE,
+        RELATIONAL_PRECEDENCE,
+        BITWISE_OR_PRECEDENCE,
+        BITWISE_XOR_PRECEDENCE,
+        BITWISE_AND_PRECEDENCE,
+        SHIFT_PRECEDENCE,
+        ADDITIVE_PRECEDENCE,
+        MULTIPLICATIVE_PRECEDENCE,
+        PREFIX_PRECEDENCE,
+        POSTFIX_PRECEDENCE,
+        SELECTOR_PRECEDENCE;
diff --git a/pkg/analyzer/lib/src/dart/ast/ast.dart b/pkg/analyzer/lib/src/dart/ast/ast.dart
index 15c99d9..da5fe14 100644
--- a/pkg/analyzer/lib/src/dart/ast/ast.dart
+++ b/pkg/analyzer/lib/src/dart/ast/ast.dart
@@ -501,7 +501,7 @@
   }
 
   @override
-  int get precedence => 7;
+  int get precedence => RELATIONAL_PRECEDENCE;
 
   @override
   TypeAnnotation get type => _type;
@@ -778,7 +778,7 @@
   }
 
   @override
-  int get precedence => 1;
+  int get precedence => ASSIGNMENT_PRECEDENCE;
 
   @deprecated
   @override
@@ -1017,7 +1017,7 @@
   }
 
   @override
-  int get precedence => 14;
+  int get precedence => PREFIX_PRECEDENCE;
 
   @override
   E accept<E>(AstVisitor<E> visitor) => visitor.visitAwaitExpression(this);
@@ -1426,7 +1426,7 @@
   Token get endToken => _cascadeSections.endToken;
 
   @override
-  int get precedence => 2;
+  int get precedence => CASCADE_PRECEDENCE;
 
   @override
   Expression get target => _target;
@@ -2581,7 +2581,7 @@
   Token get endToken => _elseExpression.endToken;
 
   @override
-  int get precedence => 3;
+  int get precedence => CONDITIONAL_PRECEDENCE;
 
   @override
   Expression get thenExpression => _thenExpression;
@@ -5731,7 +5731,7 @@
   }
 
   @override
-  int get precedence => 16;
+  int get precedence => SELECTOR_PRECEDENCE;
 
   @override
   TypeParameterList get typeParameters => _typeParameters;
@@ -5808,7 +5808,7 @@
   }
 
   @override
-  int get precedence => 15;
+  int get precedence => POSTFIX_PRECEDENCE;
 
   @deprecated
   @override
@@ -6787,7 +6787,7 @@
   bool get isCascaded => period != null;
 
   @override
-  int get precedence => 15;
+  int get precedence => POSTFIX_PRECEDENCE;
 
   @deprecated
   @override
@@ -6975,7 +6975,7 @@
   bool get isImplicit => keyword == null;
 
   @override
-  int get precedence => 16;
+  int get precedence => SELECTOR_PRECEDENCE;
 
   /**
    * Return the type arguments associated with the constructor, rather than with
@@ -7013,7 +7013,7 @@
    *
    * Also note that this method can cause constant evaluation to occur, which
    * can be computationally expensive.
-   * 
+   *
    * Deprecated: Use `LinterContext.canBeConst` instead.
    */
   @deprecated
@@ -7462,7 +7462,7 @@
   }
 
   @override
-  int get precedence => 7;
+  int get precedence => RELATIONAL_PRECEDENCE;
 
   @override
   TypeAnnotation get type => _type;
@@ -7721,7 +7721,7 @@
   }
 
   @override
-  int get precedence => 15;
+  int get precedence => POSTFIX_PRECEDENCE;
 
   @deprecated
   @override
@@ -7842,7 +7842,7 @@
 
   /**
    * Initialize a newly created list literal.
-   * 
+   *
    * The [constKeyword] can be `null` if the literal is not a constant. The
    * [typeArguments] can be `null` if no type arguments were declared. The list
    * of [elements] can be `null` if the list is empty.
@@ -7909,7 +7909,7 @@
  */
 abstract class LiteralImpl extends ExpressionImpl implements Literal {
   @override
-  int get precedence => 16;
+  int get precedence => SELECTOR_PRECEDENCE;
 }
 
 /**
@@ -8376,7 +8376,7 @@
   }
 
   @override
-  int get precedence => 15;
+  int get precedence => POSTFIX_PRECEDENCE;
 
   @override
   Expression get realTarget {
@@ -8610,7 +8610,7 @@
   }
 
   @override
-  int get precedence => 0;
+  int get precedence => NO_PRECEDENCE;
 
   @override
   E accept<E>(AstVisitor<E> visitor) => visitor.visitNamedExpression(this);
@@ -9236,7 +9236,7 @@
   }
 
   @override
-  int get precedence => 15;
+  int get precedence => SELECTOR_PRECEDENCE;
 
   @override
   Expression get unParenthesized {
@@ -9462,7 +9462,7 @@
   }
 
   @override
-  int get precedence => 15;
+  int get precedence => POSTFIX_PRECEDENCE;
 
   @deprecated
   @override
@@ -9583,7 +9583,7 @@
   String get name => "${_prefix.name}.${_identifier.name}";
 
   @override
-  int get precedence => 15;
+  int get precedence => POSTFIX_PRECEDENCE;
 
   @override
   SimpleIdentifier get prefix => _prefix;
@@ -9669,7 +9669,7 @@
   }
 
   @override
-  int get precedence => 14;
+  int get precedence => PREFIX_PRECEDENCE;
 
   @deprecated
   @override
@@ -9763,7 +9763,7 @@
       operator != null && operator.type == TokenType.PERIOD_PERIOD;
 
   @override
-  int get precedence => 15;
+  int get precedence => POSTFIX_PRECEDENCE;
 
   @override
   SimpleIdentifier get propertyName => _propertyName;
@@ -9924,7 +9924,7 @@
   Token get endToken => rethrowKeyword;
 
   @override
-  int get precedence => 0;
+  int get precedence => ASSIGNMENT_PRECEDENCE;
 
   @override
   E accept<E>(AstVisitor<E> visitor) => visitor.visitRethrowExpression(this);
@@ -10424,7 +10424,7 @@
   String get name => token.lexeme;
 
   @override
-  int get precedence => 16;
+  int get precedence => SELECTOR_PRECEDENCE;
 
   @deprecated
   @override
@@ -11033,7 +11033,7 @@
   Token get endToken => superKeyword;
 
   @override
-  int get precedence => 16;
+  int get precedence => SELECTOR_PRECEDENCE;
 
   @override
   E accept<E>(AstVisitor<E> visitor) => visitor.visitSuperExpression(this);
@@ -11353,7 +11353,7 @@
   Token get endToken => thisKeyword;
 
   @override
-  int get precedence => 16;
+  int get precedence => SELECTOR_PRECEDENCE;
 
   @override
   E accept<E>(AstVisitor<E> visitor) => visitor.visitThisExpression(this);
@@ -11412,7 +11412,7 @@
   }
 
   @override
-  int get precedence => 0;
+  int get precedence => ASSIGNMENT_PRECEDENCE;
 
   @override
   E accept<E>(AstVisitor<E> visitor) => visitor.visitThrowExpression(this);
diff --git a/pkg/analyzer/lib/src/generated/element_resolver.dart b/pkg/analyzer/lib/src/generated/element_resolver.dart
index 99a2bd6..4f2842a 100644
--- a/pkg/analyzer/lib/src/generated/element_resolver.dart
+++ b/pkg/analyzer/lib/src/generated/element_resolver.dart
@@ -1871,7 +1871,7 @@
   int get offset => targetIdentifier.offset;
 
   @override
-  int get precedence => 16;
+  int get precedence => SELECTOR_PRECEDENCE;
 
   @deprecated
   @override