Replace assertUnresolvedSimpleIdentifier() with textual expectations. Change-Id: I1227edbc7935091a652dd8220b90dadb77f72b82 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/294180 Reviewed-by: Samuel Rawlins <srawlins@google.com> Commit-Queue: Konstantin Shcheglov <scheglov@google.com>
diff --git a/pkg/analyzer/test/src/dart/analysis/driver_resolution_test.dart b/pkg/analyzer/test/src/dart/analysis/driver_resolution_test.dart index 12be4a5..999c72d 100644 --- a/pkg/analyzer/test/src/dart/analysis/driver_resolution_test.dart +++ b/pkg/analyzer/test/src/dart/analysis/driver_resolution_test.dart
@@ -897,45 +897,6 @@ assertType(identifier, 'Future<dynamic> Function()'); } - test_deferredImport_variable() async { - newFile('$testPackageLibPath/a.dart', 'var v = 0;'); - addTestFile(r''' -import 'a.dart' deferred as a; -main() async { - a.v; - a.v = 1; -} -'''); - await resolveTestFile(); - var import = findElement.import('package:test/a.dart'); - var v = (import.importedLibrary!.publicNamespace.get('v') - as PropertyAccessorElement) - .variable as TopLevelVariableElement; - - { - var prefixed = findNode.prefixed('a.v;'); - assertElement(prefixed, v.getter); - assertType(prefixed, 'int'); - - assertElement(prefixed.prefix, import.prefix?.element); - assertType(prefixed.prefix, null); - - assertElement(prefixed.identifier, v.getter); - assertType(prefixed.identifier, 'int'); - } - - { - var prefixed = findNode.prefixed('a.v = 1;'); - assertElementNull(prefixed); - assertTypeNull(prefixed); - - assertElement(prefixed.prefix, import.prefix?.element); - assertType(prefixed.prefix, null); - - assertUnresolvedSimpleIdentifier(prefixed.identifier); - } - } - test_directive_export() async { newFile('$testPackageLibPath/a.dart', r''' class MyClass {} @@ -1139,30 +1100,6 @@ fElement.type, typeProvider.listType(typeParameterTypeNone(tElement))); } - test_field_generic() async { - addTestFile(r''' -class C<T> { - T f; -} -main(C<int> c) { - c.f; // ref - c.f = 1; -} -'''); - await resolveTestFile(); - - { - var fRef = findNode.simple('f; // ref'); - assertMember(fRef, findElement.getter('f'), {'T': 'int'}); - assertType(fRef, 'int'); - } - - { - var fRef = findNode.simple('f = 1;'); - assertUnresolvedSimpleIdentifier(fRef); - } - } - test_formalParameter_functionTyped() async { addTestFile(r''' class A { @@ -5125,82 +5062,6 @@ assertElement(gRef, findElement.parameter('g')); } - test_postfix_increment_of_postfix_increment() async { - addTestFile(''' -void f(int x) { - x ++ ++; -} -'''); - await resolveTestFile(); - - var xRef = findNode.simple('x ++'); - assertUnresolvedSimpleIdentifier(xRef, disableElementCheck: true); - } - - test_postfixExpression_local() async { - String content = r''' -main() { - int v = 0; - v++; -} -'''; - addTestFile(content); - - await resolveTestFile(); - - List<Statement> mainStatements = _getMainStatements(result); - - VariableElement v; - { - var statement = mainStatements[0] as VariableDeclarationStatement; - v = statement.variables.variables[0].declaredElement!; - expect(v.type, typeProvider.intType); - } - - { - var statement = mainStatements[1] as ExpressionStatement; - - var postfix = statement.expression as PostfixExpression; - expect(postfix.operator.type, TokenType.PLUS_PLUS); - expect(postfix.staticElement!.name, '+'); - expect(postfix.staticType, typeProvider.intType); - - var operand = postfix.operand as SimpleIdentifier; - assertUnresolvedSimpleIdentifier(operand, disableElementCheck: true); - } - } - - test_postfixExpression_propertyAccess() async { - String content = r''' -main() { - new C().f++; -} -class C { - int f; -} -'''; - addTestFile(content); - - await resolveTestFile(); - - List<Statement> mainStatements = _getMainStatements(result); - - { - var statement = mainStatements[0] as ExpressionStatement; - - var postfix = statement.expression as PostfixExpression; - expect(postfix.operator.type, TokenType.PLUS_PLUS); - expect(postfix.staticElement!.name, '+'); - expect(postfix.staticType, typeProvider.intType); - - var propertyAccess = postfix.operand as PropertyAccess; - assertUnresolvedPropertyAccess(propertyAccess); - - SimpleIdentifier propertyName = propertyAccess.propertyName; - assertUnresolvedSimpleIdentifier(propertyName); - } - } - test_prefix_increment_of_non_generator() async { addTestFile(''' void f(bool x) { @@ -5214,30 +5075,6 @@ assertElement(xRef, findElement.parameter('x')); } - test_prefix_increment_of_postfix_increment() async { - addTestFile(''' -void f(int x) { - ++x++; -} -'''); - await resolveTestFile(); - - var xRef = findNode.simple('x++'); - assertUnresolvedSimpleIdentifier(xRef, disableElementCheck: true); - } - - test_prefix_increment_of_prefix_increment() async { - addTestFile(''' -void f(int x) { - ++ ++ x; -} -'''); - await resolveTestFile(); - - var xRef = findNode.simple('x;'); - assertUnresolvedSimpleIdentifier(xRef, disableElementCheck: true); - } - test_prefixedIdentifier_classInstance_instanceField() async { String content = r''' main() { @@ -5332,231 +5169,6 @@ assertType(methodName.staticType, 'double Function(int)'); } - test_prefixedIdentifier_importPrefix_className() async { - newFile('$testPackageLibPath/lib.dart', ''' -class MyClass {} -typedef void MyFunctionTypeAlias(); -int myTopVariable; -int myTopFunction() => 0; -int get myGetter => 0; -void set mySetter(int _) {} -'''); - addTestFile(r''' -import 'lib.dart' as my; -main() { - my.MyClass; - my.MyFunctionTypeAlias; - my.myTopVariable; - my.myTopFunction; - my.myTopFunction(); - my.myGetter; - my.mySetter = 0; -} -'''); - await resolveTestFile(); - // TODO(scheglov) Uncomment and fix "unused imports" hint. -// expect(result.errors, isEmpty); - - var unitElement = result.unit.declaredElement!; - final myImport = unitElement.library.libraryImports[0]; - PrefixElement myPrefix = myImport.prefix!.element; - - var myLibrary = myImport.importedLibrary!; - var myUnit = myLibrary.definingCompilationUnit; - var myClass = myUnit.classes.single; - var myTypeAlias = myUnit.typeAliases.single; - var myTopVariable = myUnit.topLevelVariables[0]; - var myTopFunction = myUnit.functions.single; - var myGetter = myUnit.topLevelVariables[1].getter!; - var mySetter = myUnit.topLevelVariables[2].setter!; - expect(myTopVariable.name, 'myTopVariable'); - expect(myGetter.displayName, 'myGetter'); - expect(mySetter.displayName, 'mySetter'); - - List<Statement> statements = _getMainStatements(result); - - void assertPrefix(SimpleIdentifier identifier) { - expect(identifier.staticElement, same(myPrefix)); - expect(identifier.staticType, isNull); - } - - void assertPrefixedIdentifier( - int statementIndex, Element expectedElement, DartType expectedType) { - var statement = statements[statementIndex] as ExpressionStatement; - var prefixed = statement.expression as PrefixedIdentifier; - assertPrefix(prefixed.prefix); - - expect(prefixed.identifier.staticElement, same(expectedElement)); - expect(prefixed.identifier.staticType, expectedType); - } - - assertPrefixedIdentifier(0, myClass, typeProvider.typeType); - assertPrefixedIdentifier(1, myTypeAlias, typeProvider.typeType); - assertPrefixedIdentifier(2, myTopVariable.getter!, typeProvider.intType); - - { - var statement = statements[3] as ExpressionStatement; - var prefixed = statement.expression as PrefixedIdentifier; - assertPrefix(prefixed.prefix); - - expect(prefixed.identifier.staticElement, same(myTopFunction)); - expect(prefixed.identifier.staticType, isNotNull); - } - - { - var statement = statements[4] as ExpressionStatement; - var invocation = statement.expression as MethodInvocation; - assertPrefix(invocation.target as SimpleIdentifier); - - expect(invocation.methodName.staticElement, same(myTopFunction)); - expect(invocation.methodName.staticType, isNotNull); - } - - assertPrefixedIdentifier(5, myGetter, typeProvider.intType); - - { - var statement = statements[6] as ExpressionStatement; - var assignment = statement.expression as AssignmentExpression; - var left = assignment.leftHandSide as PrefixedIdentifier; - assertPrefix(left.prefix); - assertUnresolvedSimpleIdentifier(left.identifier); - } - } - - test_prefixExpression_local() async { - String content = r''' -main() { - int v = 0; - ++v; - ~v; -} -'''; - addTestFile(content); - - await resolveTestFile(); - - List<Statement> mainStatements = _getMainStatements(result); - - VariableElement v; - { - var statement = mainStatements[0] as VariableDeclarationStatement; - v = statement.variables.variables[0].declaredElement!; - expect(v.type, typeProvider.intType); - } - - { - var statement = mainStatements[1] as ExpressionStatement; - - var prefix = statement.expression as PrefixExpression; - expect(prefix.operator.type, TokenType.PLUS_PLUS); - expect(prefix.staticElement!.name, '+'); - expect(prefix.staticType, typeProvider.intType); - - var operand = prefix.operand as SimpleIdentifier; - assertUnresolvedSimpleIdentifier(operand, disableElementCheck: true); - } - - { - var statement = mainStatements[2] as ExpressionStatement; - - var prefix = statement.expression as PrefixExpression; - expect(prefix.operator.type, TokenType.TILDE); - expect(prefix.staticElement!.name, '~'); - expect(prefix.staticType, typeProvider.intType); - - var operand = prefix.operand as SimpleIdentifier; - expect(operand.staticElement, same(v)); - expect(operand.staticType, typeProvider.intType); - } - } - - test_prefixExpression_local_not() async { - String content = r''' -main() { - bool v = true; - !v; -} -'''; - addTestFile(content); - - await resolveTestFile(); - - List<Statement> mainStatements = _getMainStatements(result); - - VariableElement v; - { - var statement = mainStatements[0] as VariableDeclarationStatement; - v = statement.variables.variables[0].declaredElement!; - expect(v.type, typeProvider.boolType); - } - - { - var statement = mainStatements[1] as ExpressionStatement; - - var prefix = statement.expression as PrefixExpression; - expect(prefix.operator.type, TokenType.BANG); - expect(prefix.staticElement, isNull); - expect(prefix.staticType, typeProvider.boolType); - - var operand = prefix.operand as SimpleIdentifier; - expect(operand.staticElement, same(v)); - expect(operand.staticType, typeProvider.boolType); - } - } - - test_prefixExpression_propertyAccess() async { - String content = r''' -main() { - ++new C().f; - ~new C().f; -} -class C { - int f; -} -'''; - addTestFile(content); - - await resolveTestFile(); - CompilationUnit unit = result.unit; - - var cClassDeclaration = unit.declarations[1] as ClassDeclaration; - ClassElement cClassElement = cClassDeclaration.declaredElement!; - FieldElement fElement = cClassElement.getField('f')!; - - List<Statement> mainStatements = _getMainStatements(result); - - { - var statement = mainStatements[0] as ExpressionStatement; - - var prefix = statement.expression as PrefixExpression; - expect(prefix.operator.type, TokenType.PLUS_PLUS); - expect(prefix.staticElement!.name, '+'); - expect(prefix.staticType, typeProvider.intType); - - var propertyAccess = prefix.operand as PropertyAccess; - assertUnresolvedPropertyAccess(propertyAccess); - - SimpleIdentifier propertyName = propertyAccess.propertyName; - assertUnresolvedSimpleIdentifier(propertyName); - } - - { - var statement = mainStatements[1] as ExpressionStatement; - - var prefix = statement.expression as PrefixExpression; - expect(prefix.operator.type, TokenType.TILDE); - expect(prefix.staticElement!.name, '~'); - expect(prefix.staticType, typeProvider.intType); - - var propertyAccess = prefix.operand as PropertyAccess; - expect(propertyAccess.staticType, typeProvider.intType); - - SimpleIdentifier propertyName = propertyAccess.propertyName; - expect(propertyName.staticElement, same(fElement.getter)); - expect(propertyName.staticType, typeProvider.intType); - } - } - test_propertyAccess_field() async { String content = r''' main() { @@ -5731,236 +5343,6 @@ expect(result.errors, isEmpty); } - test_super() async { - String content = r''' -class A { - void method(int p) {} - int get getter => 0; - void set setter(int p) {} - int operator+(int p) => 0; -} -class B extends A { - void test() { - method(1); - super.method(2); - getter; - super.getter; - setter = 3; - super.setter = 4; - this + 5; - } -} -'''; - addTestFile(content); - await resolveTestFile(); - - var aNode = result.unit.declarations[0] as ClassDeclaration; - var bNode = result.unit.declarations[1] as ClassDeclaration; - - var methodElement = aNode.members[0].declaredElement as MethodElement; - var getterElement = - aNode.members[1].declaredElement as PropertyAccessorElement; - var operatorElement = aNode.members[3].declaredElement as MethodElement; - - var testNode = bNode.members[0] as MethodDeclaration; - var testBody = testNode.body as BlockFunctionBody; - List<Statement> testStatements = testBody.block.statements; - - // method(1); - { - var statement = testStatements[0] as ExpressionStatement; - var invocation = statement.expression as MethodInvocation; - - expect(invocation.target, isNull); - - expect(invocation.methodName.staticElement, same(methodElement)); - } - - // super.method(2); - { - var statement = testStatements[1] as ExpressionStatement; - var invocation = statement.expression as MethodInvocation; - - var target = invocation.target as SuperExpression; - expect( - target.staticType, interfaceTypeNone(bNode.declaredElement!)); // raw - - expect(invocation.methodName.staticElement, same(methodElement)); - } - - // getter; - { - var statement = testStatements[2] as ExpressionStatement; - var identifier = statement.expression as SimpleIdentifier; - - expect(identifier.staticElement, same(getterElement)); - expect(identifier.staticType, typeProvider.intType); - } - - // super.getter; - { - var statement = testStatements[3] as ExpressionStatement; - var propertyAccess = statement.expression as PropertyAccess; - expect(propertyAccess.staticType, typeProvider.intType); - - var target = propertyAccess.target as SuperExpression; - expect( - target.staticType, interfaceTypeNone(bNode.declaredElement!)); // raw - - expect(propertyAccess.propertyName.staticElement, same(getterElement)); - expect(propertyAccess.propertyName.staticType, typeProvider.intType); - } - - // setter = 3; - { - var statement = testStatements[4] as ExpressionStatement; - var assignment = statement.expression as AssignmentExpression; - - var identifier = assignment.leftHandSide as SimpleIdentifier; - assertUnresolvedSimpleIdentifier(identifier); - } - - // this.setter = 4; - { - var statement = testStatements[5] as ExpressionStatement; - var assignment = statement.expression as AssignmentExpression; - - var propertyAccess = assignment.leftHandSide as PropertyAccess; - - var target = propertyAccess.target as SuperExpression; - expect( - target.staticType, interfaceTypeNone(bNode.declaredElement!)); // raw - - assertUnresolvedSimpleIdentifier(propertyAccess.propertyName); - } - - // super + 5; - { - var statement = testStatements[6] as ExpressionStatement; - var binary = statement.expression as BinaryExpression; - - var target = binary.leftOperand as ThisExpression; - expect( - target.staticType, interfaceTypeNone(bNode.declaredElement!)); // raw - - expect(binary.staticElement, same(operatorElement)); - expect(binary.staticType, typeProvider.intType); - } - } - - test_this() async { - String content = r''' -class A { - void method(int p) {} - int get getter => 0; - void set setter(int p) {} - int operator+(int p) => 0; - void test() { - method(1); - this.method(2); - getter; - this.getter; - setter = 3; - this.setter = 4; - this + 5; - } -} -'''; - addTestFile(content); - await resolveTestFile(); - - var aNode = result.unit.declarations[0] as ClassDeclaration; - - var methodElement = aNode.members[0].declaredElement as MethodElement; - var getterElement = - aNode.members[1].declaredElement as PropertyAccessorElement; - var operatorElement = aNode.members[3].declaredElement as MethodElement; - - var testNode = aNode.members[4] as MethodDeclaration; - var testBody = testNode.body as BlockFunctionBody; - List<Statement> testStatements = testBody.block.statements; - - var elementA = findElement.class_('A'); - var thisTypeA = interfaceTypeNone(elementA); - - // method(1); - { - var statement = testStatements[0] as ExpressionStatement; - var invocation = statement.expression as MethodInvocation; - - expect(invocation.target, isNull); - - expect(invocation.methodName.staticElement, same(methodElement)); - } - - // this.method(2); - { - var statement = testStatements[1] as ExpressionStatement; - var invocation = statement.expression as MethodInvocation; - - var target = invocation.target as ThisExpression; - expect(target.staticType, thisTypeA); // raw - - expect(invocation.methodName.staticElement, same(methodElement)); - } - - // getter; - { - var statement = testStatements[2] as ExpressionStatement; - var identifier = statement.expression as SimpleIdentifier; - - expect(identifier.staticElement, same(getterElement)); - expect(identifier.staticType, typeProvider.intType); - } - - // this.getter; - { - var statement = testStatements[3] as ExpressionStatement; - var propertyAccess = statement.expression as PropertyAccess; - expect(propertyAccess.staticType, typeProvider.intType); - - var target = propertyAccess.target as ThisExpression; - expect(target.staticType, thisTypeA); // raw - - expect(propertyAccess.propertyName.staticElement, same(getterElement)); - expect(propertyAccess.propertyName.staticType, typeProvider.intType); - } - - // setter = 3; - { - var statement = testStatements[4] as ExpressionStatement; - var assignment = statement.expression as AssignmentExpression; - - var identifier = assignment.leftHandSide as SimpleIdentifier; - assertUnresolvedSimpleIdentifier(identifier); - } - - // this.setter = 4; - { - var statement = testStatements[5] as ExpressionStatement; - var assignment = statement.expression as AssignmentExpression; - - var propertyAccess = assignment.leftHandSide as PropertyAccess; - - var target = propertyAccess.target as ThisExpression; - expect(target.staticType, thisTypeA); // raw - - assertUnresolvedSimpleIdentifier(propertyAccess.propertyName); - } - - // this + 5; - { - var statement = testStatements[6] as ExpressionStatement; - var binary = statement.expression as BinaryExpression; - - var target = binary.leftOperand as ThisExpression; - expect(target.staticType, thisTypeA); // raw - - expect(binary.staticElement, same(operatorElement)); - expect(binary.staticType, typeProvider.intType); - } - } - test_top_class_constructor_parameter_defaultValue() async { String content = r''' class C { @@ -7274,78 +6656,6 @@ [checkTopVarRef('arg1'), checkTopVarUndefinedNamedRef('arg2')]); } - test_unresolved_postfix_operand() async { - addTestFile(r''' -main() { - a++; -} -'''); - await resolveTestFile(); - expect(result.errors, isNotEmpty); - - var postfix = findNode.postfix('a++'); - assertElementNull(postfix); - assertTypeDynamic(postfix); - - var aRef = postfix.operand as SimpleIdentifier; - assertUnresolvedSimpleIdentifier(aRef); - } - - test_unresolved_postfix_operator() async { - addTestFile(r''' -A a; -main() { - a++; -} -class A {} -'''); - await resolveTestFile(); - expect(result.errors, isNotEmpty); - - var postfix = findNode.postfix('a++'); - assertElementNull(postfix); - assertType(postfix, 'A'); - - var aRef = postfix.operand as SimpleIdentifier; - assertUnresolvedSimpleIdentifier(aRef); - } - - test_unresolved_prefix_operand() async { - addTestFile(r''' -main() { - ++a; -} -'''); - await resolveTestFile(); - expect(result.errors, isNotEmpty); - - var prefix = findNode.prefix('++a'); - assertElementNull(prefix); - assertTypeDynamic(prefix); - - var aRef = prefix.operand as SimpleIdentifier; - assertUnresolvedSimpleIdentifier(aRef); - } - - test_unresolved_prefix_operator() async { - addTestFile(r''' -A a; -main() { - ++a; -} -class A {} -'''); - await resolveTestFile(); - expect(result.errors, isNotEmpty); - - var prefix = findNode.prefix('++a'); - assertElementNull(prefix); - assertTypeDynamic(prefix); - - var aRef = prefix.operand as SimpleIdentifier; - assertUnresolvedSimpleIdentifier(aRef); - } - test_unresolved_prefixedIdentifier_identifier() async { addTestFile(r''' Object foo;
diff --git a/pkg/analyzer/test/src/dart/resolution/assignment_test.dart b/pkg/analyzer/test/src/dart/resolution/assignment_test.dart index 75ce261..abcd7e0 100644 --- a/pkg/analyzer/test/src/dart/resolution/assignment_test.dart +++ b/pkg/analyzer/test/src/dart/resolution/assignment_test.dart
@@ -206,6 +206,48 @@ '''); } + test_importPrefix_deferred_topLevelVariable_simple() async { + newFile('$testPackageLibPath/a.dart', ''' +var v = 0; +'''); + + await assertNoErrorsInCode(r''' +import 'a.dart' deferred as prefix; + +void f() { + prefix.v = 0; +} +'''); + + final node = findNode.assignment('= 0'); + assertResolvedNodeText(node, r''' +AssignmentExpression + leftHandSide: PrefixedIdentifier + prefix: SimpleIdentifier + token: prefix + staticElement: self::@prefix::prefix + staticType: null + period: . + identifier: SimpleIdentifier + token: v + staticElement: <null> + staticType: null + staticElement: <null> + staticType: null + operator: = + rightHandSide: IntegerLiteral + literal: 0 + parameter: package:test/a.dart::@setter::v::@parameter::_v + staticType: int + readElement: <null> + readType: null + writeElement: package:test/a.dart::@setter::v + writeType: int + staticElement: <null> + staticType: int +'''); + } + test_indexExpression_cascade_compound() async { await assertNoErrorsInCode(r''' class A {
diff --git a/pkg/analyzer/test/src/dart/resolution/binary_expression_test.dart b/pkg/analyzer/test/src/dart/resolution/binary_expression_test.dart index 1792ee8..ad16f6b 100644 --- a/pkg/analyzer/test/src/dart/resolution/binary_expression_test.dart +++ b/pkg/analyzer/test/src/dart/resolution/binary_expression_test.dart
@@ -415,6 +415,66 @@ staticType: int '''); } + + test_superQualifier_plus() async { + await assertNoErrorsInCode(r''' +class A { + int operator +(int other) => 0; +} + +class B extends A { + int operator +(int other) => 0; + + void f() { + super + 0; + } +} +'''); + + final node = findNode.binary('+ 0'); + assertResolvedNodeText(node, r''' +BinaryExpression + leftOperand: SuperExpression + superKeyword: super + staticType: B + operator: + + rightOperand: IntegerLiteral + literal: 0 + parameter: self::@class::A::@method::+::@parameter::other + staticType: int + staticElement: self::@class::A::@method::+ + staticInvokeType: int Function(int) + staticType: int +'''); + } + + test_thisExpression_plus() async { + await assertNoErrorsInCode(r''' +class A { + int operator +(int other) => 0; + + void f() { + this + 0; + } +} +'''); + + final node = findNode.binary('+ 0'); + assertResolvedNodeText(node, r''' +BinaryExpression + leftOperand: ThisExpression + thisKeyword: this + staticType: A + operator: + + rightOperand: IntegerLiteral + literal: 0 + parameter: self::@class::A::@method::+::@parameter::other + staticType: int + staticElement: self::@class::A::@method::+ + staticInvokeType: int Function(int) + staticType: int +'''); + } } mixin BinaryExpressionResolutionTestCases on PubPackageResolutionTest {
diff --git a/pkg/analyzer/test/src/dart/resolution/postfix_expression_test.dart b/pkg/analyzer/test/src/dart/resolution/postfix_expression_test.dart index d310a7f..520b70c 100644 --- a/pkg/analyzer/test/src/dart/resolution/postfix_expression_test.dart +++ b/pkg/analyzer/test/src/dart/resolution/postfix_expression_test.dart
@@ -19,6 +19,102 @@ @reflectiveTest class PostfixExpressionResolutionTest extends PubPackageResolutionTest with PostfixExpressionResolutionTestCases { + test_formalParameter_inc_inc() async { + await assertErrorsInCode(r''' +void f(int x) { + x ++ ++; +} +''', [ + error(ParserErrorCode.ILLEGAL_ASSIGNMENT_TO_NON_ASSIGNABLE, 23, 2), + ]); + + final node = findNode.postfix('++;'); + assertResolvedNodeText(node, r''' +PostfixExpression + operand: PostfixExpression + operand: SimpleIdentifier + token: x + staticElement: self::@function::f::@parameter::x + staticType: null + operator: ++ + readElement: self::@function::f::@parameter::x + readType: int + writeElement: self::@function::f::@parameter::x + writeType: int + staticElement: dart:core::@class::num::@method::+ + staticType: int + operator: ++ + readElement: <null> + readType: dynamic + writeElement: <null> + writeType: dynamic + staticElement: <null> + staticType: dynamic +'''); + } + + test_formalParameter_incUnresolved() async { + await assertErrorsInCode(r''' +class A {} + +void f(A a) { + a++; +} +''', [ + error(CompileTimeErrorCode.UNDEFINED_OPERATOR, 29, 2), + ]); + + final node = findNode.postfix('++;'); + assertResolvedNodeText(node, r''' +PostfixExpression + operand: SimpleIdentifier + token: a + staticElement: self::@function::f::@parameter::a + staticType: null + operator: ++ + readElement: self::@function::f::@parameter::a + readType: A + writeElement: self::@function::f::@parameter::a + writeType: A + staticElement: <null> + staticType: A +'''); + } + + test_inc_formalParameter_inc() async { + await assertErrorsInCode(r''' +void f(int x) { + ++x++; +} +''', [ + error(ParserErrorCode.MISSING_ASSIGNABLE_SELECTOR, 21, 2), + ]); + + final node = findNode.prefix('++x'); + assertResolvedNodeText(node, r''' +PrefixExpression + operator: ++ + operand: PostfixExpression + operand: SimpleIdentifier + token: x + staticElement: self::@function::f::@parameter::x + staticType: null + operator: ++ + readElement: self::@function::f::@parameter::x + readType: int + writeElement: self::@function::f::@parameter::x + writeType: int + staticElement: dart:core::@class::num::@method::+ + staticType: int + readElement: <null> + readType: dynamic + writeElement: <null> + writeType: dynamic + staticElement: <null> + staticType: dynamic +'''); + } + test_inc_propertyAccess_nullShorting() async { await assertNoErrorsInCode(r''' class A { @@ -389,6 +485,32 @@ staticType: T & num '''); } + + test_unresolvedIdentifier_inc() async { + await assertErrorsInCode(r''' +void f() { + x++; +} +''', [ + error(CompileTimeErrorCode.UNDEFINED_IDENTIFIER, 13, 1), + ]); + + final node = findNode.postfix('++;'); + assertResolvedNodeText(node, r''' +PostfixExpression + operand: SimpleIdentifier + token: x + staticElement: <null> + staticType: null + operator: ++ + readElement: <null> + readType: dynamic + writeElement: <null> + writeType: dynamic + staticElement: <null> + staticType: dynamic +'''); + } } @reflectiveTest
diff --git a/pkg/analyzer/test/src/dart/resolution/prefix_expression_test.dart b/pkg/analyzer/test/src/dart/resolution/prefix_expression_test.dart index 727fc31..e782ddc 100644 --- a/pkg/analyzer/test/src/dart/resolution/prefix_expression_test.dart +++ b/pkg/analyzer/test/src/dart/resolution/prefix_expression_test.dart
@@ -51,6 +51,68 @@ '''); } + test_formalParameter_inc_inc() async { + await assertErrorsInCode(r''' +void f(int x) { + ++ ++ x; +} +''', [ + error(ParserErrorCode.MISSING_ASSIGNABLE_SELECTOR, 24, 1), + ]); + + final node = findNode.prefix('++ ++ x'); + assertResolvedNodeText(node, r''' +PrefixExpression + operator: ++ + operand: PrefixExpression + operator: ++ + operand: SimpleIdentifier + token: x + staticElement: self::@function::f::@parameter::x + staticType: null + readElement: self::@function::f::@parameter::x + readType: int + writeElement: self::@function::f::@parameter::x + writeType: int + staticElement: dart:core::@class::num::@method::+ + staticType: int + readElement: <null> + readType: dynamic + writeElement: <null> + writeType: dynamic + staticElement: <null> + staticType: dynamic +'''); + } + + test_formalParameter_inc_unresolved() async { + await assertErrorsInCode(r''' +class A {} + +void f(A a) { + ++a; +} +''', [ + error(CompileTimeErrorCode.UNDEFINED_OPERATOR, 28, 2), + ]); + + final node = findNode.prefix('++a'); + assertResolvedNodeText(node, r''' +PrefixExpression + operator: ++ + operand: SimpleIdentifier + token: a + staticElement: self::@function::f::@parameter::a + staticType: null + readElement: self::@function::f::@parameter::a + readType: A + writeElement: self::@function::f::@parameter::a + writeType: A + staticElement: <null> + staticType: dynamic +'''); + } + test_minus_no_nullShorting() async { await assertErrorsInCode(r''' class A { @@ -224,6 +286,32 @@ staticType: int '''); } + + test_unresolvedIdentifier_inc() async { + await assertErrorsInCode(r''' +void f() { + ++x; +} +''', [ + error(CompileTimeErrorCode.UNDEFINED_IDENTIFIER, 15, 1), + ]); + + final node = findNode.prefix('++x'); + assertResolvedNodeText(node, r''' +PrefixExpression + operator: ++ + operand: SimpleIdentifier + token: x + staticElement: <null> + staticType: null + readElement: <null> + readType: dynamic + writeElement: <null> + writeType: dynamic + staticElement: <null> + staticType: dynamic +'''); + } } @reflectiveTest
diff --git a/pkg/analyzer/test/src/dart/resolution/prefixed_identifier_test.dart b/pkg/analyzer/test/src/dart/resolution/prefixed_identifier_test.dart index 415b7dd..f38c69f 100644 --- a/pkg/analyzer/test/src/dart/resolution/prefixed_identifier_test.dart +++ b/pkg/analyzer/test/src/dart/resolution/prefixed_identifier_test.dart
@@ -176,6 +176,188 @@ assertType(identifier, 'A?'); } + test_importPrefix_class() async { + newFile('$testPackageLibPath/a.dart', r''' +class A {} +'''); + + await assertNoErrorsInCode(''' +import 'a.dart' as prefix; + +void f() { + prefix.A; +} +'''); + + final node = findNode.prefixed('prefix.'); + assertResolvedNodeText(node, r''' +PrefixedIdentifier + prefix: SimpleIdentifier + token: prefix + staticElement: self::@prefix::prefix + staticType: null + period: . + identifier: SimpleIdentifier + token: A + staticElement: package:test/a.dart::@class::A + staticType: Type + staticElement: package:test/a.dart::@class::A + staticType: Type +'''); + } + + test_importPrefix_functionTypeAlias() async { + newFile('$testPackageLibPath/a.dart', r''' +typedef void F(); +'''); + + await assertNoErrorsInCode(''' +import 'a.dart' as prefix; + +void f() { + prefix.F; +} +'''); + + final node = findNode.prefixed('prefix.'); + assertResolvedNodeText(node, r''' +PrefixedIdentifier + prefix: SimpleIdentifier + token: prefix + staticElement: self::@prefix::prefix + staticType: null + period: . + identifier: SimpleIdentifier + token: F + staticElement: package:test/a.dart::@typeAlias::F + staticType: Type + staticElement: package:test/a.dart::@typeAlias::F + staticType: Type +'''); + } + + test_importPrefix_topLevelFunction() async { + newFile('$testPackageLibPath/a.dart', r''' +void foo() {} +'''); + + await assertNoErrorsInCode(''' +import 'a.dart' as prefix; + +void f() { + prefix.foo; +} +'''); + + final node = findNode.prefixed('prefix.'); + assertResolvedNodeText(node, r''' +PrefixedIdentifier + prefix: SimpleIdentifier + token: prefix + staticElement: self::@prefix::prefix + staticType: null + period: . + identifier: SimpleIdentifier + token: foo + staticElement: package:test/a.dart::@function::foo + staticType: void Function() + staticElement: package:test/a.dart::@function::foo + staticType: void Function() +'''); + } + + test_importPrefix_topLevelGetter() async { + newFile('$testPackageLibPath/a.dart', r''' +int get foo => 0; +'''); + + await assertNoErrorsInCode(''' +import 'a.dart' as prefix; + +void f() { + prefix.foo; +} +'''); + + final node = findNode.prefixed('prefix.'); + assertResolvedNodeText(node, r''' +PrefixedIdentifier + prefix: SimpleIdentifier + token: prefix + staticElement: self::@prefix::prefix + staticType: null + period: . + identifier: SimpleIdentifier + token: foo + staticElement: package:test/a.dart::@getter::foo + staticType: int + staticElement: package:test/a.dart::@getter::foo + staticType: int +'''); + } + + test_importPrefix_topLevelSetter() async { + newFile('$testPackageLibPath/a.dart', r''' +set foo(int _) {} +'''); + + await assertErrorsInCode(''' +import 'a.dart' as prefix; + +void f() { + prefix.foo; +} +''', [ + error(CompileTimeErrorCode.UNDEFINED_PREFIXED_NAME, 48, 3), + ]); + + final node = findNode.prefixed('prefix.'); + assertResolvedNodeText(node, r''' +PrefixedIdentifier + prefix: SimpleIdentifier + token: prefix + staticElement: self::@prefix::prefix + staticType: null + period: . + identifier: SimpleIdentifier + token: foo + staticElement: <null> + staticType: dynamic + staticElement: <null> + staticType: dynamic +'''); + } + + test_importPrefix_topLevelVariable() async { + newFile('$testPackageLibPath/a.dart', r''' +final foo = 0; +'''); + + await assertNoErrorsInCode(''' +import 'a.dart' as prefix; + +void f() { + prefix.foo; +} +'''); + + final node = findNode.prefixed('prefix.'); + assertResolvedNodeText(node, r''' +PrefixedIdentifier + prefix: SimpleIdentifier + token: prefix + staticElement: self::@prefix::prefix + staticType: null + period: . + identifier: SimpleIdentifier + token: foo + staticElement: package:test/a.dart::@getter::foo + staticType: int + staticElement: package:test/a.dart::@getter::foo + staticType: int +'''); + } + test_read_typedef_interfaceType() async { newFile('$testPackageLibPath/a.dart', r''' typedef A = List<int>;
diff --git a/pkg/analyzer/test/src/dart/resolution/property_access_test.dart b/pkg/analyzer/test/src/dart/resolution/property_access_test.dart index 4a304ae..82e9e49 100644 --- a/pkg/analyzer/test/src/dart/resolution/property_access_test.dart +++ b/pkg/analyzer/test/src/dart/resolution/property_access_test.dart
@@ -39,6 +39,178 @@ assertType(identifier, 'A?'); } + test_inClass_superQualifier_identifier_getter() async { + await assertNoErrorsInCode(''' +class A { + int get foo => 0; +} + +class B extends A { + int get foo => 0; + + void f() { + super.foo; + } +} +'''); + + final node = findNode.propertyAccess('foo;'); + assertResolvedNodeText(node, r''' +PropertyAccess + target: SuperExpression + superKeyword: super + staticType: B + operator: . + propertyName: SimpleIdentifier + token: foo + staticElement: self::@class::A::@getter::foo + staticType: int + staticType: int +'''); + } + + test_inClass_superQualifier_identifier_method() async { + await assertNoErrorsInCode(''' +class A { + void foo(int _) {} +} + +class B extends A { + void foo(int _) {} + + void f() { + super.foo; + } +} +'''); + + final node = findNode.propertyAccess('foo;'); + assertResolvedNodeText(node, r''' +PropertyAccess + target: SuperExpression + superKeyword: super + staticType: B + operator: . + propertyName: SimpleIdentifier + token: foo + staticElement: self::@class::A::@method::foo + staticType: void Function(int) + staticType: void Function(int) +'''); + } + + test_inClass_superQualifier_identifier_setter() async { + await assertErrorsInCode(''' +class A { + set foo(int _) {} +} + +class B extends A { + set foo(int _) {} + + void f() { + super.foo; + } +} +''', [ + error(CompileTimeErrorCode.UNDEFINED_SUPER_GETTER, 97, 3), + ]); + + final node = findNode.propertyAccess('foo;'); + assertResolvedNodeText(node, r''' +PropertyAccess + target: SuperExpression + superKeyword: super + staticType: B + operator: . + propertyName: SimpleIdentifier + token: foo + staticElement: <null> + staticType: dynamic + staticType: dynamic +'''); + } + + test_inClass_thisExpression_identifier_getter() async { + await assertNoErrorsInCode(''' +class A { + int get foo => 0; + + void f() { + this.foo; + } +} +'''); + + final node = findNode.propertyAccess('foo;'); + assertResolvedNodeText(node, r''' +PropertyAccess + target: ThisExpression + thisKeyword: this + staticType: A + operator: . + propertyName: SimpleIdentifier + token: foo + staticElement: self::@class::A::@getter::foo + staticType: int + staticType: int +'''); + } + + test_inClass_thisExpression_identifier_method() async { + await assertNoErrorsInCode(''' +class A { + void foo(int _) {} + + void f() { + this.foo; + } +} +'''); + + final node = findNode.propertyAccess('foo;'); + assertResolvedNodeText(node, r''' +PropertyAccess + target: ThisExpression + thisKeyword: this + staticType: A + operator: . + propertyName: SimpleIdentifier + token: foo + staticElement: self::@class::A::@method::foo + staticType: void Function(int) + staticType: void Function(int) +'''); + } + + test_inClass_thisExpression_identifier_setter() async { + await assertErrorsInCode(''' +class A { + set foo(int _) {} + + void f() { + super.foo; + } +} +''', [ + error(CompileTimeErrorCode.UNDEFINED_SUPER_GETTER, 54, 3), + ]); + + final node = findNode.propertyAccess('foo;'); + assertResolvedNodeText(node, r''' +PropertyAccess + target: SuperExpression + superKeyword: super + staticType: A + operator: . + propertyName: SimpleIdentifier + token: foo + staticElement: <null> + staticType: dynamic + staticType: dynamic +'''); + } + test_nullShorting_cascade() async { await assertNoErrorsInCode(r''' class A {
diff --git a/pkg/analyzer/test/src/dart/resolution/resolution.dart b/pkg/analyzer/test/src/dart/resolution/resolution.dart index a396c06..02d6583 100644 --- a/pkg/analyzer/test/src/dart/resolution/resolution.dart +++ b/pkg/analyzer/test/src/dart/resolution/resolution.dart
@@ -453,29 +453,6 @@ expect(node.staticType, isNull); } - /// TODO(scheglov) Remove [disableElementCheck] - void assertUnresolvedPropertyAccess( - PropertyAccess node, { - bool disableElementCheck = false, - }) { - if (!disableElementCheck) { - assertElementNull(node); - } - assertTypeNull(node); - assertUnresolvedSimpleIdentifier(node.propertyName); - } - - /// TODO(scheglov) Remove [disableElementCheck] - void assertUnresolvedSimpleIdentifier( - SimpleIdentifier node, { - bool disableElementCheck = false, - }) { - if (!disableElementCheck) { - assertElementNull(node); - } - assertTypeNull(node); - } - /// TODO(scheglov) Remove `?` from [declaration]. Matcher elementMatcher( Element? declaration, {