Skip to content

Commit da13398

Browse files
DanTupCommit Queue
authored andcommitted
[analyzer] Use parameter.nameOffset for synthetic arguments for super params in constant evaluation
These synthetic nodes might be used in diagnostics/contextMessages so they should map to reasonable offsets. Fixes Dart-Code/Dart-Code#5359 Change-Id: I65aee5f04ccc074ce943e7043dd8f41d4b6a0847 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/399661 Reviewed-by: Phil Quitslund <[email protected]> Commit-Queue: Brian Wilkerson <[email protected]> Reviewed-by: Brian Wilkerson <[email protected]>
1 parent 46f53d4 commit da13398

File tree

2 files changed

+117
-2
lines changed

2 files changed

+117
-2
lines changed

pkg/analyzer/lib/src/dart/constant/evaluation.dart

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2593,7 +2593,7 @@ class _InstanceCreationEvaluator {
25932593
for (var parameter in _constructor.parameters) {
25942594
if (parameter is SuperFormalParameterElement) {
25952595
var value = SimpleIdentifierImpl(
2596-
StringToken(TokenType.STRING, parameter.name, -1),
2596+
StringToken(TokenType.STRING, parameter.name, parameter.nameOffset),
25972597
)
25982598
..staticElement = parameter
25992599
..setPseudoExpressionStaticType(parameter.type);
@@ -2604,7 +2604,8 @@ class _InstanceCreationEvaluator {
26042604
NamedExpressionImpl(
26052605
name: LabelImpl(
26062606
label: SimpleIdentifierImpl(
2607-
StringToken(TokenType.STRING, parameter.name, -1),
2607+
StringToken(
2608+
TokenType.STRING, parameter.name, parameter.nameOffset),
26082609
)..staticElement = parameter,
26092610
colon: StringToken(TokenType.COLON, ':', -1),
26102611
),

pkg/analyzer/test/src/dart/constant/evaluation_test.dart

Lines changed: 114 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2076,6 +2076,120 @@ const c = _;
20762076
''');
20772077
}
20782078

2079+
test_visitInstanceCreationExpression_invalidNamedArg() async {
2080+
await assertErrorsInCode('''
2081+
class A {
2082+
const A({ required int x });
2083+
}
2084+
const a = A(x: false);
2085+
''', [
2086+
error(CompileTimeErrorCode.ARGUMENT_TYPE_NOT_ASSIGNABLE, 58, 5),
2087+
error(CompileTimeErrorCode.CONST_CONSTRUCTOR_PARAM_TYPE_MISMATCH, 55, 8),
2088+
]);
2089+
}
2090+
2091+
test_visitInstanceCreationExpression_invalidNamedArg_superParam() async {
2092+
await assertErrorsInCode('''
2093+
class A {
2094+
const A({ required int x });
2095+
}
2096+
class B extends A {
2097+
const B({ required super.x });
2098+
}
2099+
const a = B(x: false);
2100+
''', [
2101+
error(CompileTimeErrorCode.ARGUMENT_TYPE_NOT_ASSIGNABLE, 113, 5),
2102+
error(CompileTimeErrorCode.CONST_CONSTRUCTOR_PARAM_TYPE_MISMATCH, 110, 8),
2103+
]);
2104+
}
2105+
2106+
test_visitInstanceCreationExpression_invalidPositionalArg() async {
2107+
await assertErrorsInCode('''
2108+
class A {
2109+
const A(int x);
2110+
}
2111+
const a = A(false);
2112+
''', [
2113+
error(CompileTimeErrorCode.ARGUMENT_TYPE_NOT_ASSIGNABLE, 42, 5),
2114+
error(CompileTimeErrorCode.CONST_CONSTRUCTOR_PARAM_TYPE_MISMATCH, 42, 5),
2115+
]);
2116+
}
2117+
2118+
test_visitInstanceCreationExpression_invalidPositionalArg_superParam() async {
2119+
await assertErrorsInCode('''
2120+
class A {
2121+
const A(int x);
2122+
}
2123+
class B extends A {
2124+
const B(super.x);
2125+
}
2126+
const a = B(false);
2127+
''', [
2128+
error(CompileTimeErrorCode.ARGUMENT_TYPE_NOT_ASSIGNABLE, 84, 5),
2129+
error(CompileTimeErrorCode.CONST_CONSTRUCTOR_PARAM_TYPE_MISMATCH, 84, 5),
2130+
]);
2131+
}
2132+
2133+
test_visitInstanceCreationExpression_missingNamedArg() async {
2134+
await assertErrorsInCode('''
2135+
class A {
2136+
const A({required int x });
2137+
}
2138+
const a = A();
2139+
''', [
2140+
error(CompileTimeErrorCode.MISSING_REQUIRED_ARGUMENT, 52, 1),
2141+
]);
2142+
}
2143+
2144+
test_visitInstanceCreationExpression_missingNamedArg_superParam() async {
2145+
await assertErrorsInCode('''
2146+
class A {
2147+
const A({required int x });
2148+
}
2149+
class B extends A {
2150+
const B({required super.x });
2151+
}
2152+
const a = B();
2153+
''', [
2154+
error(CompileTimeErrorCode.MISSING_REQUIRED_ARGUMENT, 106, 1),
2155+
error(CompileTimeErrorCode.CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE, 106,
2156+
3),
2157+
error(CompileTimeErrorCode.INVALID_CONSTANT, 106, 3,
2158+
contextMessages: [message(testFile, 88, 1)]),
2159+
]);
2160+
}
2161+
2162+
test_visitInstanceCreationExpression_missingPositionalArg() async {
2163+
await assertErrorsInCode('''
2164+
class A {
2165+
const A(int x);
2166+
}
2167+
const a = A();
2168+
''', [
2169+
error(CompileTimeErrorCode.NOT_ENOUGH_POSITIONAL_ARGUMENTS_NAME_SINGULAR,
2170+
42, 1),
2171+
]);
2172+
}
2173+
2174+
test_visitInstanceCreationExpression_missingPositionalArg_superParam() async {
2175+
await assertErrorsInCode('''
2176+
class A {
2177+
const A(int x);
2178+
}
2179+
class B extends A {
2180+
const B(super.x);
2181+
}
2182+
const a = B();
2183+
''', [
2184+
error(CompileTimeErrorCode.NOT_ENOUGH_POSITIONAL_ARGUMENTS_NAME_SINGULAR,
2185+
84, 1),
2186+
error(CompileTimeErrorCode.CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE, 82,
2187+
3),
2188+
error(CompileTimeErrorCode.INVALID_CONSTANT, 82, 3,
2189+
contextMessages: [message(testFile, 66, 1)]),
2190+
]);
2191+
}
2192+
20792193
test_visitInstanceCreationExpression_noArgs() async {
20802194
await assertNoErrorsInCode('''
20812195
class A {

0 commit comments

Comments
 (0)