[cfe] Avoid synthesized locations for reporting conflict errors

Part of https://github.com/dart-lang/sdk/issues/47453

Change-Id: I51277f2c548b4632b9b9870b522f19a9e8c77498
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/239680
Reviewed-by: Johnni Winther <johnniwinther@google.com>
Commit-Queue: Chloe Stefantsova <cstefantsova@google.com>
This commit is contained in:
Chloe Stefantsova 2022-03-31 17:12:18 +00:00 committed by Commit Bot
parent ef413b95e0
commit d2b0a372ab
15 changed files with 319 additions and 8 deletions

View file

@ -5641,6 +5641,33 @@ Message _withArgumentsInputFileNotFound(Uri uri_) {
arguments: {'uri': uri_});
}
// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
const Template<
Message Function(
String
name)> templateInstanceAndSynthesizedStaticConflict = const Template<
Message Function(String name)>(
problemMessageTemplate:
r"""This instance member conflicts with the synthesized static member called '#name'.""",
withArguments: _withArgumentsInstanceAndSynthesizedStaticConflict);
// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
const Code<Message Function(String name)>
codeInstanceAndSynthesizedStaticConflict =
const Code<Message Function(String name)>(
"InstanceAndSynthesizedStaticConflict",
analyzerCodes: <String>["CONFLICTING_STATIC_AND_INSTANCE"]);
// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
Message _withArgumentsInstanceAndSynthesizedStaticConflict(String name) {
if (name.isEmpty) throw 'No name provided';
name = demangleMixinApplicationName(name);
return new Message(codeInstanceAndSynthesizedStaticConflict,
problemMessage:
"""This instance member conflicts with the synthesized static member called '${name}'.""",
arguments: {'name': name});
}
// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
const Template<Message Function(int count, int count2)>
templateInstantiationTooFewArguments =

View file

@ -37,6 +37,7 @@ import '../../messages.dart'
templateCantInferTypeDueToNoCombinedSignature,
templateDuplicatedDeclaration,
templateDuplicatedDeclarationCause,
templateInstanceAndSynthesizedStaticConflict,
templateMissingImplementationCause,
templateMissingImplementationNotAbstract;
import '../../names.dart' show noSuchMethodName;
@ -531,12 +532,23 @@ class ClassMembersNodeBuilder {
staticMember = b;
instanceMember = a;
}
classBuilder.libraryBuilder.addProblem(messageStaticAndInstanceConflict,
staticMember.charOffset, name.length, staticMember.fileUri,
context: <LocatedMessage>[
messageStaticAndInstanceConflictCause.withLocation(
instanceMember.fileUri, instanceMember.charOffset, name.length)
]);
if (!staticMember.isSynthesized) {
classBuilder.libraryBuilder.addProblem(messageStaticAndInstanceConflict,
staticMember.charOffset, name.length, staticMember.fileUri,
context: <LocatedMessage>[
messageStaticAndInstanceConflictCause.withLocation(
instanceMember.fileUri,
instanceMember.charOffset,
name.length)
]);
} else {
classBuilder.libraryBuilder.addProblem(
templateInstanceAndSynthesizedStaticConflict
.withArguments(staticMember.name.text),
instanceMember.charOffset,
name.length,
instanceMember.fileUri);
}
} else {
// This message can be reported twice (when merging localMembers with
// classSetters, or localSetters with classMembers). By ensuring that

View file

@ -284,7 +284,8 @@ class SourceEnumBuilder extends SourceClassBuilder {
staticFieldNameScheme,
fieldReference: valuesFieldReference,
fieldGetterReference: valuesGetterReference,
fieldSetterReference: valuesSetterReference);
fieldSetterReference: valuesSetterReference,
isSynthesized: true);
members["values"] = valuesBuilder;
DeclaredSourceConstructorBuilder? synthesizedDefaultConstructorBuilder;

View file

@ -70,6 +70,8 @@ class SourceFieldBuilder extends SourceMemberBuilderImpl
@override
final bool isTopLevel;
final bool isSynthesized;
SourceFieldBuilder(
this.metadata,
this.type,
@ -88,7 +90,8 @@ class SourceFieldBuilder extends SourceMemberBuilderImpl
Reference? lateIsSetSetterReference,
Reference? lateGetterReference,
Reference? lateSetterReference,
Token? constInitializerToken})
Token? constInitializerToken,
this.isSynthesized = false})
: _constInitializerToken = constInitializerToken,
super(libraryBuilder, charOffset) {
bool isInstanceMember = fieldNameScheme.isInstanceMember;
@ -757,6 +760,9 @@ class SourceFieldMember extends BuilderClassMember {
@override
bool get isProperty => true;
@override
bool get isSynthesized => memberBuilder.isSynthesized;
@override
bool isSameDeclaration(ClassMember other) {
return other is SourceFieldMember && memberBuilder == other.memberBuilder;

View file

@ -475,6 +475,7 @@ InitializerForStaticField/example: Fail
InitializerOutsideConstructor/example: Fail
InputFileNotFound/analyzerCode: Fail
InputFileNotFound/example: Fail
InstanceAndSynthesizedStaticConflict/example: Fail
InstantiationNonGenericFunctionType/analyzerCode: Fail
InstantiationTooFewArguments/analyzerCode: Fail
InstantiationTooManyArguments/analyzerCode: Fail

View file

@ -4597,6 +4597,10 @@ StaticAndInstanceConflictCause:
problemMessage: "This is the instance member."
severity: CONTEXT
InstanceAndSynthesizedStaticConflict:
problemMessage: "This instance member conflicts with the synthesized static member called '#name'."
analyzerCode: CONFLICTING_STATIC_AND_INSTANCE
FfiAbiSpecificIntegerInvalid:
# Used by dart:ffi
problemMessage: "Classes extending 'AbiSpecificInteger' must have exactly one const constructor, no other members, and no type arguments."

View file

@ -0,0 +1,12 @@
// Copyright (c) 2022, 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.
enum E {
e1,
e2;
void set values(List<E> val) {} // Error.
}
main() {}

View file

@ -0,0 +1,40 @@
library /*isNonNullableByDefault*/;
//
// Problems in library:
//
// pkg/front_end/testcases/enhanced_enums/member_values_conflicts.dart:9:12: Error: This instance member conflicts with the synthesized static member called 'values'.
// void set values(List<E> val) {} // Error.
// ^^^^^^
//
import self as self;
import "dart:core" as core;
class E extends core::_Enum /*isEnum*/ {
static const field core::List<self::E> values = #C7;
static const field self::E e1 = #C3;
static const field self::E e2 = #C6;
const constructor •(core::int index, core::String name) → self::E
: super core::_Enum::•(index, name)
;
method toString() → core::String
return "E.${this.{core::_Enum::_name}{core::String}}";
set values(core::List<self::E> val) → void {}
}
static method main() → dynamic {}
constants {
#C1 = 0
#C2 = "e1"
#C3 = self::E {index:#C1, _name:#C2}
#C4 = 1
#C5 = "e2"
#C6 = self::E {index:#C4, _name:#C5}
#C7 = <self::E>[#C3, #C6]
}
Constructor coverage from constants:
org-dartlang-testcase:///member_values_conflicts.dart:
- E. (from org-dartlang-testcase:///member_values_conflicts.dart:5:6)
- _Enum. (from org-dartlang-sdk:///sdk/lib/core/enum.dart:103:9)
- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)

View file

@ -0,0 +1,40 @@
library /*isNonNullableByDefault*/;
//
// Problems in library:
//
// pkg/front_end/testcases/enhanced_enums/member_values_conflicts.dart:9:12: Error: This instance member conflicts with the synthesized static member called 'values'.
// void set values(List<E> val) {} // Error.
// ^^^^^^
//
import self as self;
import "dart:core" as core;
class E extends core::_Enum /*isEnum*/ {
static const field core::List<self::E> values = #C7;
static const field self::E e1 = #C3;
static const field self::E e2 = #C6;
const constructor •(core::int index, core::String name) → self::E
: super core::_Enum::•(index, name)
;
method toString() → core::String
return "E.${this.{core::_Enum::_name}{core::String}}";
set values(core::List<self::E> val) → void {}
}
static method main() → dynamic {}
constants {
#C1 = 0
#C2 = "e1"
#C3 = self::E {index:#C1, _name:#C2}
#C4 = 1
#C5 = "e2"
#C6 = self::E {index:#C4, _name:#C5}
#C7 = <self::E>[#C3, #C6]
}
Constructor coverage from constants:
org-dartlang-testcase:///member_values_conflicts.dart:
- E. (from org-dartlang-testcase:///member_values_conflicts.dart:5:6)
- _Enum. (from org-dartlang-sdk:///sdk/lib/core/enum.dart:103:9)
- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)

View file

@ -0,0 +1,8 @@
enum E {
e1,
e2;
void set values(List<E> val) {}
}
main() {}

View file

@ -0,0 +1,8 @@
enum E {
e1,
e2;
void set values(List<E> val) {}
}
main() {}

View file

@ -0,0 +1,40 @@
library /*isNonNullableByDefault*/;
//
// Problems in library:
//
// pkg/front_end/testcases/enhanced_enums/member_values_conflicts.dart:9:12: Error: This instance member conflicts with the synthesized static member called 'values'.
// void set values(List<E> val) {} // Error.
// ^^^^^^
//
import self as self;
import "dart:core" as core;
class E extends core::_Enum /*isEnum*/ {
static const field core::List<self::E> values = #C7;
static const field self::E e1 = #C3;
static const field self::E e2 = #C6;
const constructor •(core::int index, core::String name) → self::E
: super core::_Enum::•(index, name)
;
method toString() → core::String
return "E.${this.{core::_Enum::_name}{core::String}}";
set values(core::List<self::E> val) → void {}
}
static method main() → dynamic {}
constants {
#C1 = 0
#C2 = "e1"
#C3 = self::E {index:#C1, _name:#C2}
#C4 = 1
#C5 = "e2"
#C6 = self::E {index:#C4, _name:#C5}
#C7 = <self::E*>[#C3, #C6]
}
Constructor coverage from constants:
org-dartlang-testcase:///member_values_conflicts.dart:
- E. (from org-dartlang-testcase:///member_values_conflicts.dart:5:6)
- _Enum. (from org-dartlang-sdk:///sdk/lib/core/enum.dart:103:9)
- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)

View file

@ -0,0 +1,40 @@
library /*isNonNullableByDefault*/;
//
// Problems in library:
//
// pkg/front_end/testcases/enhanced_enums/member_values_conflicts.dart:9:12: Error: This instance member conflicts with the synthesized static member called 'values'.
// void set values(List<E> val) {} // Error.
// ^^^^^^
//
import self as self;
import "dart:core" as core;
class E extends core::_Enum /*isEnum*/ {
static const field core::List<self::E> values = #C7;
static const field self::E e1 = #C3;
static const field self::E e2 = #C6;
const constructor •(core::int index, core::String name) → self::E
: super core::_Enum::•(index, name)
;
method toString() → core::String
return "E.${this.{core::_Enum::_name}{core::String}}";
set values(core::List<self::E> val) → void {}
}
static method main() → dynamic {}
constants {
#C1 = 0
#C2 = "e1"
#C3 = self::E {index:#C1, _name:#C2}
#C4 = 1
#C5 = "e2"
#C6 = self::E {index:#C4, _name:#C5}
#C7 = <self::E*>[#C3, #C6]
}
Constructor coverage from constants:
org-dartlang-testcase:///member_values_conflicts.dart:
- E. (from org-dartlang-testcase:///member_values_conflicts.dart:5:6)
- _Enum. (from org-dartlang-sdk:///sdk/lib/core/enum.dart:103:9)
- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)

View file

@ -0,0 +1,32 @@
library /*isNonNullableByDefault*/;
//
// Problems in library:
//
// pkg/front_end/testcases/enhanced_enums/member_values_conflicts.dart:9:12: Error: This instance member conflicts with the synthesized static member called 'values'.
// void set values(List<E> val) {} // Error.
// ^^^^^^
//
import self as self;
import "dart:core" as core;
class E extends core::_Enum /*isEnum*/ {
static const field core::List<self::E> values = const <self::E>[self::E::e1, self::E::e2];
static const field self::E e1 = const self::E::•(0, "e1");
static const field self::E e2 = const self::E::•(1, "e2");
const constructor •(core::int index, core::String name) → self::E
: super core::_Enum::•(index, name)
;
method toString() → core::String
return "E.${this.{core::_Enum::_name}{core::String}}";
set values(core::List<self::E> val) → void
;
}
static method main() → dynamic
;
Extra constant evaluation status:
Evaluated: ListLiteral @ org-dartlang-testcase:///member_values_conflicts.dart:5:6 -> ListConstant(const <E*>[const E{_Enum.index: 0, _Enum._name: "e1"}, const E{_Enum.index: 1, _Enum._name: "e2"}])
Evaluated: ConstructorInvocation @ org-dartlang-testcase:///member_values_conflicts.dart:6:3 -> InstanceConstant(const E{_Enum.index: 0, _Enum._name: "e1"})
Evaluated: ConstructorInvocation @ org-dartlang-testcase:///member_values_conflicts.dart:7:3 -> InstanceConstant(const E{_Enum.index: 1, _Enum._name: "e2"})
Extra constant evaluation: evaluated: 8, effectively constant: 3

View file

@ -0,0 +1,40 @@
library /*isNonNullableByDefault*/;
//
// Problems in library:
//
// pkg/front_end/testcases/enhanced_enums/member_values_conflicts.dart:9:12: Error: This instance member conflicts with the synthesized static member called 'values'.
// void set values(List<E> val) {} // Error.
// ^^^^^^
//
import self as self;
import "dart:core" as core;
class E extends core::_Enum /*isEnum*/ {
static const field core::List<self::E> values = #C7;
static const field self::E e1 = #C3;
static const field self::E e2 = #C6;
const constructor •(core::int index, core::String name) → self::E
: super core::_Enum::•(index, name)
;
method toString() → core::String
return "E.${this.{core::_Enum::_name}{core::String}}";
set values(core::List<self::E> val) → void {}
}
static method main() → dynamic {}
constants {
#C1 = 0
#C2 = "e1"
#C3 = self::E {index:#C1, _name:#C2}
#C4 = 1
#C5 = "e2"
#C6 = self::E {index:#C4, _name:#C5}
#C7 = <self::E*>[#C3, #C6]
}
Constructor coverage from constants:
org-dartlang-testcase:///member_values_conflicts.dart:
- E. (from org-dartlang-testcase:///member_values_conflicts.dart:5:6)
- _Enum. (from org-dartlang-sdk:///sdk/lib/core/enum.dart:103:9)
- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)