| // Copyright (c) 2024, 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. |
| |
| import 'dart:io'; |
| |
| import 'package:expect/expect.dart'; |
| import 'package:path/path.dart' as p; |
| import 'package:test_runner/src/command_output.dart'; |
| import 'package:test_runner/src/static_error.dart'; |
| |
| void _checkError(StaticError error, |
| {required String path, |
| required int line, |
| required int column, |
| required String message}) { |
| Expect.equals(p.relative(path, from: Directory.current.path), error.path); |
| Expect.equals(line, error.line); |
| Expect.equals(column, error.column); |
| Expect.equals(message, error.message); |
| } |
| |
| void main() { |
| // TODO(55202): Add general testing of CFE and analyzer error parsing. |
| testCfeErrors(); |
| testDart2jsCompilerErrors(); |
| testDart2WasmCompilerErrors(); |
| testDevCompilerErrors(); |
| } |
| |
| void testCfeErrors() { |
| _testMultipleCfeErrors(); |
| } |
| |
| /// Regression test for parsing multiple errors. |
| void _testMultipleCfeErrors() { |
| var errors = <StaticError>[]; |
| var warnings = <StaticError>[]; |
| FastaCommandOutput.parseErrors(''' |
| tests/language/explicit_type_instantiation_parsing_test.dart:171:26: Error: Cannot access static member on an instantiated generic class. |
| Try removing the type arguments or placing them after the member name. |
| expect1<Class>(Z<X, X>.instance); |
| ^^^^^^^^ |
| tests/language/explicit_type_instantiation_parsing_test.dart:232:6: Error: A comparison expression can't be an operand of another comparison expression. |
| Try putting parentheses around one of the comparisons. |
| X<2>(2); |
| ^ |
| tests/language/explicit_type_instantiation_parsing_test.dart:236:6: Error: A comparison expression can't be an operand of another comparison expression. |
| Try putting parentheses around one of the comparisons. |
| X<2>; |
| ^ |
| tests/language/explicit_type_instantiation_parsing_test.dart:236:7: Error: Expected an identifier, but got ';'. |
| Try inserting an identifier before ';'. |
| X<2>; |
| ^ |
| tests/language/explicit_type_instantiation_parsing_test.dart:242:6: Error: A comparison expression can't be an operand of another comparison expression. |
| Try putting parentheses around one of the comparisons. |
| X<2>.instance; // Not type argument. |
| ^ |
| tests/language/explicit_type_instantiation_parsing_test.dart:242:7: Error: Expected an identifier, but got '.'. |
| Try inserting an identifier before '.'. |
| X<2>.instance; // Not type argument. |
| ^ |
| tests/language/explicit_type_instantiation_parsing_test.dart:248:6: Error: A comparison expression can't be an operand of another comparison expression. |
| Try putting parentheses around one of the comparisons. |
| X<2>.any; |
| ^ |
| tests/language/explicit_type_instantiation_parsing_test.dart:248:7: Error: Expected an identifier, but got '.'. |
| Try inserting an identifier before '.'. |
| X<2>.any; |
| ^ |
| tests/language/explicit_type_instantiation_parsing_test.dart:255:8: Error: Member not found: 'any'. |
| X<X>.any; // Invalid, Class does not have any static `any` member. |
| ^^^ |
| tests/language/explicit_type_instantiation_parsing_test.dart:259:8: Error: Cannot access static member on an instantiated generic class. |
| Try removing the type arguments or placing them after the member name. |
| X<X>.instance; // Does have static `instance` member, can't access this way. |
| ^^^^^^^^ |
| tests/language/explicit_type_instantiation_parsing_test.dart:265:6: Error: A comparison expression can't be an operand of another comparison expression. |
| Try putting parentheses around one of the comparisons. |
| X<X>2; |
| ^ |
| tests/language/explicit_type_instantiation_parsing_test.dart:272:6: Error: A comparison expression can't be an operand of another comparison expression. |
| Try putting parentheses around one of the comparisons. |
| X<X>-1; |
| ^ |
| tests/language/explicit_type_instantiation_parsing_test.dart:277:7: Error: A comparison expression can't be an operand of another comparison expression. |
| Try putting parentheses around one of the comparisons. |
| f1<X> - 1; |
| ^ |
| tests/language/explicit_type_instantiation_parsing_test.dart:207:12: Warning: Operand of null-aware operation '!' has type 'Type' which excludes null. |
| - 'Type' is from 'dart:core'. |
| expect1((Z<X, X>)![1].asBool); // ignore: unnecessary_non_null_assertion |
| ^ |
| ''', errors, warnings); |
| |
| var path = 'tests/language/explicit_type_instantiation_parsing_test.dart'; |
| |
| Expect.equals(13, errors.length); |
| Expect.equals(1, warnings.length); |
| |
| _checkError(errors[0], |
| path: path, |
| line: 171, |
| column: 26, |
| message: "Cannot access static member on an instantiated generic class."); |
| |
| _checkError(errors[1], |
| path: path, |
| line: 232, |
| column: 6, |
| message: |
| "A comparison expression can't be an operand of another comparison expression."); |
| |
| _checkError(errors[2], |
| path: path, |
| line: 236, |
| column: 6, |
| message: |
| "A comparison expression can't be an operand of another comparison expression."); |
| |
| _checkError(errors[3], |
| path: path, |
| line: 236, |
| column: 7, |
| message: "Expected an identifier, but got ';'."); |
| |
| _checkError(errors[4], |
| path: path, |
| line: 242, |
| column: 6, |
| message: |
| "A comparison expression can't be an operand of another comparison expression."); |
| |
| _checkError(errors[5], |
| path: path, |
| line: 242, |
| column: 7, |
| message: "Expected an identifier, but got '.'."); |
| |
| _checkError(errors[6], |
| path: path, |
| line: 248, |
| column: 6, |
| message: |
| "A comparison expression can't be an operand of another comparison expression."); |
| |
| _checkError(errors[7], |
| path: path, |
| line: 248, |
| column: 7, |
| message: "Expected an identifier, but got '.'."); |
| |
| _checkError(errors[8], |
| path: path, line: 255, column: 8, message: "Member not found: 'any'."); |
| |
| _checkError(errors[9], |
| path: path, |
| line: 259, |
| column: 8, |
| message: "Cannot access static member on an instantiated generic class."); |
| |
| _checkError(errors[10], |
| path: path, |
| line: 265, |
| column: 6, |
| message: |
| "A comparison expression can't be an operand of another comparison expression."); |
| |
| _checkError(errors[11], |
| path: path, |
| line: 272, |
| column: 6, |
| message: |
| "A comparison expression can't be an operand of another comparison expression."); |
| |
| _checkError(errors[12], |
| path: path, |
| line: 277, |
| column: 7, |
| message: |
| "A comparison expression can't be an operand of another comparison expression."); |
| |
| _checkError(warnings[0], |
| path: path, |
| line: 207, |
| column: 12, |
| message: |
| "Operand of null-aware operation '!' has type 'Type' which excludes null."); |
| } |
| |
| void testDart2jsCompilerErrors() { |
| _testMultipleDart2jsCompilerErrors(); |
| } |
| |
| void _testMultipleDart2jsCompilerErrors() { |
| var errors = <StaticError>[]; |
| Dart2jsCompilerCommandOutput.parseErrors(''' |
| tests/language/explicit_type_instantiation_parsing_test.dart:171:26: |
| Error: Cannot access static member on an instantiated generic class. |
| Try removing the type arguments or placing them after the member name. |
| expect1<Class>(Z<X, X>.instance); |
| ^^^^^^^^ |
| tests/language/explicit_type_instantiation_parsing_test.dart:232:6: |
| Error: A comparison expression can't be an operand of another comparison expression. |
| Try putting parentheses around one of the comparisons. |
| X<2>(2); |
| ^ |
| ''', errors); |
| |
| var path = 'tests/language/explicit_type_instantiation_parsing_test.dart'; |
| |
| Expect.equals(2, errors.length); |
| |
| _checkError(errors[0], |
| path: path, |
| line: 171, |
| column: 26, |
| message: "Cannot access static member on an instantiated generic class."); |
| |
| _checkError(errors[1], |
| path: path, |
| line: 232, |
| column: 6, |
| message: |
| "A comparison expression can't be an operand of another comparison expression."); |
| } |
| |
| void testDart2WasmCompilerErrors() { |
| _testMultipleDart2WasmCompilerErrors(); |
| } |
| |
| void _testMultipleDart2WasmCompilerErrors() { |
| var errors = <StaticError>[]; |
| Dart2WasmCompilerCommandOutput.parseErrors(''' |
| tests/language/explicit_type_instantiation_parsing_test.dart:171:26: Error: Cannot access static member on an instantiated generic class. |
| Try removing the type arguments or placing them after the member name. |
| expect1<Class>(Z<X, X>.instance); |
| ^^^^^^^^ |
| tests/language/explicit_type_instantiation_parsing_test.dart:232:6: Error: A comparison expression can't be an operand of another comparison expression. |
| Try putting parentheses around one of the comparisons. |
| X<2>(2); |
| ^ |
| ''', errors); |
| |
| var path = 'tests/language/explicit_type_instantiation_parsing_test.dart'; |
| |
| Expect.equals(2, errors.length); |
| |
| _checkError(errors[0], |
| path: path, |
| line: 171, |
| column: 26, |
| message: "Cannot access static member on an instantiated generic class."); |
| |
| _checkError(errors[1], |
| path: path, |
| line: 232, |
| column: 6, |
| message: |
| "A comparison expression can't be an operand of another comparison expression."); |
| } |
| |
| void testDevCompilerErrors() { |
| _testMultipleDevCompilerErrors(); |
| } |
| |
| void _testMultipleDevCompilerErrors() { |
| var errors = <StaticError>[]; |
| DevCompilerCommandOutput.parseErrors(''' |
| org-dartlang-app:/tests/language/explicit_type_instantiation_parsing_test.dart:171:26: Error: Cannot access static member on an instantiated generic class. |
| Try removing the type arguments or placing them after the member name. |
| expect1<Class>(Z<X, X>.instance); |
| ^^^^^^^^ |
| org-dartlang-app:/tests/language/explicit_type_instantiation_parsing_test.dart:232:6: Error: A comparison expression can't be an operand of another comparison expression. |
| Try putting parentheses around one of the comparisons. |
| X<2>(2); |
| ^ |
| ''', errors); |
| |
| var path = 'tests/language/explicit_type_instantiation_parsing_test.dart'; |
| |
| Expect.equals(2, errors.length); |
| |
| _checkError(errors[0], |
| path: path, |
| line: 171, |
| column: 26, |
| message: "Cannot access static member on an instantiated generic class."); |
| |
| _checkError(errors[1], |
| path: path, |
| line: 232, |
| column: 6, |
| message: |
| "A comparison expression can't be an operand of another comparison expression."); |
| } |