| # 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." |