Skip to content
This repository was archived by the owner on Feb 22, 2018. It is now read-only.
This repository was archived by the owner on Feb 22, 2018. It is now read-only.

fix circularity issue when inferring from overrides #48

Closed
@sigmundch

Description

@sigmundch

When implementing inference on overriden methods and fields, I encountered a bug that only affects types with generics that are part of a library cycle.

The source of the problem is likely related to where in the pipeline we are running our inference. In particular, we do it right after the super classes have been resolved, and before our members are, however I'm not sure yet on why this is happening.

Here is an example flaky test that illustrates the problem. This test passes often, but sometimes fail with a null pointer exception:

 testChecker({
      '/a.dart': '''
          import 'main.dart';
        abstract class I<E> {
          A<E> m(a, String f(v, T e));
        }
      ''',
      '/main.dart': '''
          import 'a.dart';

        abstract class A<E> implements I<E> {
          const A();

          E value;
        }

        abstract class M {
          int y;
        }

        class B<E> extends A<E> implements M {
          const B();
          int get y => 0;

          m(a, f(v, T e)) {}
        }

        foo () {
          int y = /*severe:StaticTypeError*/new B<String>().m(null, null).value;
          String z = new B<String>().m(null, null).value;
        }
    '''
    }, inferFromOverrides: true);

When it fails, this is the exception we see:

Error while looking up m in I<E>:
 The null object does not have a method 'substitute2'.

NoSuchMethodError: method not found: 'substitute2'
Receiver: null
Arguments: [_List len:1, _List len:1]
#0      Object._noSuchMethod (dart:core-patch/object_patch.dart:42)
#1      Object.noSuchMethod (dart:core-patch/object_patch.dart:45)
#2      MethodMember.from (package:ddc_analyzer/src/generated/element.dart:8225:29)
#3      InterfaceTypeImpl.getMethod (package:ddc_analyzer/src/generated/element.dart:6418:24)
#4      _memberTypeGetter.f (package:ddc/src/utils.dart:150:34)
#5      searchTypeFor.search (package:ddc/src/utils.dart:105:32)
#6      searchTypeFor.search (package:ddc/src/utils.dart:118:19)
#7      searchTypeFor.search (package:ddc/src/utils.dart:114:17)
#8      searchTypeFor (package:ddc/src/utils.dart:125:16)
#9      RestrictedTypeResolverVisitor.visitMethodDeclaration (package:ddc/src/checker/resolver.dart:229:31)
#10     MethodDeclaration.accept (package:ddc_analyzer/src/generated/ast.dart:12944:63)
#11     TypeResolverVisitor.visitClassMembersInScope (package:ddc_analyzer/src/generated/resolver.dart:13952:26)
#12     ScopedVisitor.visitClassDeclaration (package:ddc_analyzer/src/generated/resolver.dart:12308:35)
#13     TypeResolverVisitor.visitClassDeclaration (package:ddc_analyzer/src/generated/resolver.dart:13900:32)
#14     ClassDeclaration.accept (package:ddc_analyzer/src/generated/ast.dart:4555:62)
#15     NodeList.accept (package:ddc_analyzer/src/generated/ast.dart:13507:26)
#16     CompilationUnit.visitChildren (package:ddc_analyzer/src/generated/ast.dart:5261:27)
#17     UnifyingAstVisitor.visitNode (package:ddc_analyzer/src/generated/ast.dart:20715:23)
#18     UnifyingAstVisitor.visitCompilationUnit (package:ddc_analyzer/src/generated/ast.dart:20555:60)
#19     CompilationUnit.accept (package:ddc_analyzer/src/generated/ast.dart:5254:61)
#20     LibraryResolver._buildTypeHierarchies (package:ddc_analyzer/src/generated/resolver.dart:8314:40)
#21     LibraryResolver.resolveLibrary (package:ddc_analyzer/src/generated/resolver.dart:7955:26)
#22     ResolveDartLibraryTask.internalPerform (package:ddc_analyzer/src/generated/engine.dart:11138:29)
#23     AnalysisTask._safelyPerform (package:ddc_analyzer/src/generated/engine.dart:6814:22)
#24     AnalysisTask.perform (package:ddc_analyzer/src/generated/engine.dart:6793:21)
#25     AnalysisContextImpl._cacheDartResolutionData (package:ddc_analyzer/src/generated/engine.dart:2901:33)
#26     AnalysisContextImpl._getDartResolutionData (package:ddc_analyzer/src/generated/engine.dart:3676:33)
#27     AnalysisContextImpl._getDartResolutionData2 (package:ddc_analyzer/src/generated/engine.dart:3708:36)
#28     AnalysisContextImpl.resolveCompilationUnit2 (package:ddc_analyzer/src/generated/engine.dart:2566:30)
#29     compile (package:ddc/devc.dart:69:61)
#30     testChecker (package:ddc/src/testing.dart:66:24)

Metadata

Metadata

Assignees

Labels

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions