| Index: pkg/front_end/error_recovery.yaml
|
| diff --git a/pkg/front_end/error_recovery.yaml b/pkg/front_end/error_recovery.yaml
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..241d4db4dca1d659679bfb3baa334fe29d6f678c
|
| --- /dev/null
|
| +++ b/pkg/front_end/error_recovery.yaml
|
| @@ -0,0 +1,120 @@
|
| +# Copyright (c) 2017, 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.
|
| +
|
| +# Each entry in this file corresponds to an error recovery scenario. For each
|
| +# scenario we specify:
|
| +#
|
| +# 1. An explanation of the problem (description).
|
| +# 2. Important recovery notes (recovery): a list of text notes explaining of
|
| +# how the code is interpreted by the front-end and its clients.
|
| +# 3. An optional set of questions if we don't have the answer at this
|
| +# moment (questions).
|
| +# 4. An example code that illustrates the problem (example).
|
| +#
|
| +# At this time this is just a documentation file, the goal however is to turn it
|
| +# also into a test suite so every example can be tested automatically.
|
| +#
|
| +# To do so we can start annotating the examples to indicate relevant error
|
| +# locations with comments of the form `/*@error=name*/`, where `name` is a
|
| +# message name from `messages.yaml` that corresponds to the error (if known). If
|
| +# the compiler doesn't yet have a specific error message for the error, use
|
| +# `/*@error=?*/`. This comment should go immediately before the token where the
|
| +# error is reported. If we know at this time that the error has a region,
|
| +# include an /*@errorEnd*/ at the point where the region ends.
|
| +
|
| +NameConflictDuplicateField:
|
| + description: "A field was declared twice."
|
| + recovery:
|
| + - "both fields can be seen in the generated kernel output."
|
| + - "code completion works on the types and inside initializers of either field."
|
| + - "any errors from the usage of the field should be lower priority than this error."
|
| + - "accesses to the field get resolved to the first declaration (in text order)."
|
| + example: >-
|
| + List bar = [1, 2];
|
| + StringBuffer foo = new StringBuffer();
|
| + class A {
|
| + int /*@error=DuplicatedName*/ field /*@errorEnd*/ = bar.length;
|
| + String /*@error=DuplicatedName*/ field /*@errorEnd*/ = '$foo';
|
| + }
|
| +
|
| +NameConflictDuplicateMethod:
|
| + description: "A method was declared twice."
|
| + recovery:
|
| + - "both methods can be seen in the generated kernel output."
|
| + - "code completion works within both methods."
|
| + - "other code that accesses the method will be resolved to the first declaration."
|
| + example: >-
|
| + List bar = [1, 2];
|
| + class A {
|
| + int /*@error=DuplicatedName*/ m /*@errorEnd*/() => bar.length;
|
| + int /*@error=DuplicatedName*/ m /*@errorEnd*/(StringBuffer foo) => '$foo';
|
| + }
|
| +
|
| +NameConflictInconsitentMemberKind:
|
| + description: "A method and a field have the same name."
|
| + recovery:
|
| + - "both can be seen in the generated output."
|
| + - "first declaration wins."
|
| + example: >-
|
| + List bar = [1, 2];
|
| + class A {
|
| + int /*@error=DuplicatedName*/ m /*@errorEnd*/ = bar.length;
|
| + int /*@error=DuplicatedName*/ m /*@errorEnd*/(StringBuffer foo) => '$foo';
|
| + }
|
| +
|
| +ImportIsOutOfOrder:
|
| + description: "An import was written below a definition."
|
| + recovery:
|
| + - "treat it as if the import was on top."
|
| + - "no cascading errors are presented as if the import was missing."
|
| + example: >-
|
| + class A extends B {}
|
| + /*@error=?*/
|
| + import 'b.dart'; // b.dart defines B
|
| + /*@errorEnd*/
|
| +
|
| +CallAMissingConstructor:
|
| + description: "A named constructor has a typo in the name."
|
| + recovery:
|
| + - "keep the expression where it occurs."
|
| + - "treat the type of the expression as if a valid constructor was used."
|
| + example: >-
|
| + class C {
|
| + bar() => null;
|
| + }
|
| + main() {
|
| + var x = new C./*error=MethodNotFound*/foo();
|
| + x.bar(); // no errors here, `x` has inferred type `C`.
|
| + }
|
| +
|
| +TreatAbstractFunctionsAsEmpty:
|
| + description: "A function in a non-abstract class is missing a body."
|
| + recovery: "Treat it as if it was empty."
|
| + example: >-
|
| + class A {
|
| + foo() /*@error=ExpectedBody*/;
|
| + }
|
| +
|
| +IgnoreEmptyOptionalArgs:
|
| + description: "A function declares optional argument, but the list is empty."
|
| + recovery: "Treat it as if it wasn't there."
|
| + example: >-
|
| + m(a, b, []){}
|
| +
|
| +IgnoreEmptyOptionalArgs:
|
| + description: "A function declares both positional and named arguments."
|
| + questions: "Treat it as if only named arguments are there?"
|
| + example: >-
|
| + m(a, b, [c], {d}){}
|
| +
|
| +# TODO(sigmund): add details to the list below
|
| +
|
| +NameConflictDuplicateTopLevelField:
|
| + description: "A top-level field was declared twice."
|
| +
|
| +NameConflictDuplicateTopLevelMethod:
|
| + description: "A top-level method was declared twice."
|
| +
|
| +NameConflictDuplicateTopLevelDeclaration:
|
| + description: "Two top-level declarations use the same name."
|
|
|